@gravity-rail/cli 0.7.0 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/lib/cli-client-context.ts","../src/lib/local-files.ts","../src/lib/trusted-dirs.ts","../src/lib/cli-hitl.ts","../src/lib/concierge-agui-loop.ts","../src/lib/realtime-client.ts","../src/lib/chat-tui.ts","../src/lib/audio.ts","../src/lib/chat-session.ts","../src/commands/concierge.ts"],"names":["path","fs","readline","readline3","EventEmitter","readline4"],"mappings":";;;;;;;;;;;AAaO,SAAS,2BAAA,GAA0D;AACvE,EAAA,MAAM,KAAA,GAAQ,QAAQ,GAAA,CAAI,KAAA,GAAQA,MAAK,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA,GAAI,MAAA;AACrE,EAAA,OAAO;AAAA,IACJ,aAAA,EAAe,KAAA;AAAA,IACf,OAAA,EAAS,MAAA;AAAA,IACT,UAAA,EAAY;AAAA,MACT,KAAA;AAAA,MACA,IAAI,OAAA,CAAQ,QAAA;AAAA,MACZ,WAAA,EAAaA,KAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,KAAK;AAAA;AAC3C,GACH;AACH;ACjBA,IAAM,sBAAA,GAAyB,GAAA;AAC/B,IAAM,uBAAA,GAA0B,GAAA;AAiBhC,SAAS,eAAA,CAAgB,MAAc,YAAA,EAAqC;AACzE,EAAA,MAAM,YAAA,GAAeA,KAAAA,CAAK,OAAA,CAAQ,IAAI,CAAA;AACtC,EAAA,MAAM,MAAA,GAASA,KAAAA,CAAK,OAAA,CAAQ,YAAA,EAAc,gBAAgB,GAAG,CAAA;AAC7D,EAAA,IAAI,MAAA,KAAW,gBAAgB,CAAC,MAAA,CAAO,WAAW,YAAA,GAAeA,KAAAA,CAAK,GAAG,CAAA,EAAG;AACzE,IAAA,OAAO,IAAA;AAAA,EACV;AAMA,EAAA,IAAI,MAAA,GAAS,YAAA;AACb,EAAA,MAAM,IAAA,GAAOA,KAAAA,CAAK,QAAA,CAAS,YAAA,EAAc,MAAM,CAAA;AAC/C,EAAA,IAAI,IAAA,IAAQ,SAAS,GAAA,EAAK;AACvB,IAAA,KAAA,MAAW,OAAA,IAAW,IAAA,CAAK,KAAA,CAAMA,KAAAA,CAAK,GAAG,CAAA,EAAG;AACzC,MAAA,MAAA,GAASA,KAAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,OAAO,CAAA;AAClC,MAAA,IAAI;AACD,QAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,SAAA,CAAU,MAAM,CAAA;AACjC,QAAA,IAAI,KAAA,CAAM,gBAAe,EAAG;AACzB,UAAA,OAAO,IAAA;AAAA,QACV;AAAA,MACH,CAAA,CAAA,MAAQ;AAGL,QAAA;AAAA,MACH;AAAA,IACH;AAAA,EACH;AACA,EAAA,OAAO,MAAA;AACV;AAEO,SAAS,yBAAA,CACb,IAAA,EACA,SAAA,EACA,IAAA,EACmB;AACnB,EAAA,MAAM,IAAA,GAAO,eAAA,CAAgB,IAAA,EAAM,SAAA,CAAU,IAAI,CAAA;AACjD,EAAA,IAAI,CAAC,IAAA,EAAM;AACR,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,gCAAA,EAAiC;AAAA,EAC/D;AAEA,EAAA,IAAI;AACD,IAAA,QAAQ,UAAU,MAAA;AAAQ,MACvB,KAAK,WAAA,EAAa;AACf,QAAA,IAAI,CAAC,EAAA,CAAG,UAAA,CAAW,IAAI,CAAA,EAAG;AACvB,UAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,gBAAA,EAAiB;AAAA,QAC/C;AACA,QAAA,MAAM,IAAA,GAAO,EAAA,CAAG,SAAA,CAAU,IAAI,CAAA;AAC9B,QAAA,IAAI,IAAA,CAAK,gBAAe,EAAG;AACxB,UAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,gCAAA,EAAiC;AAAA,QAC/D;AACA,QAAA,IAAI,CAAC,IAAA,CAAK,MAAA,EAAO,EAAG;AACjB,UAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,YAAA,EAAa;AAAA,QAC3C;AACA,QAAA,MAAM,YAAY,MAAA,CAAO,QAAA,CAAS,SAAA,CAAU,SAAS,IAChD,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAI,MAAA,CAAO,SAAA,CAAU,SAAS,CAAA,EAAG,uBAAuB,CAAC,CAAA,GAC1E,sBAAA;AACL,QAAA,IAAI,IAAA,CAAK,OAAO,SAAA,EAAW;AACxB,UAAA,MAAM,MAAM,EAAA,CAAG,YAAA,CAAa,MAAM,EAAE,QAAA,EAAU,QAAQ,CAAA;AACtD,UAAA,OAAO;AAAA,YACJ,EAAA,EAAI,IAAA;AAAA,YACJ,OAAA,EAAS,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,SAAS,CAAA,GAAI;;AAAA,cAAA,EAAqB,SAAS,CAAA,OAAA;AAAA,WACpE;AAAA,QACH;AACA,QAAA,OAAO,EAAE,IAAI,IAAA,EAAM,OAAA,EAAS,GAAG,YAAA,CAAa,IAAA,EAAM,MAAM,CAAA,EAAE;AAAA,MAC7D;AAAA,MACA,KAAK,UAAA,EAAY;AACd,QAAA,IAAI,CAAC,EAAA,CAAG,UAAA,CAAW,IAAI,CAAA,EAAG;AACvB,UAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,qBAAA,EAAsB;AAAA,QACpD;AACA,QAAA,MAAM,UAAU,EAAA,CAAG,WAAA,CAAY,MAAM,EAAE,aAAA,EAAe,MAAM,CAAA;AAC5D,QAAA,MAAM,QAAQ,OAAA,CACV,KAAA,CAAM,CAAA,EAAG,GAAG,EACZ,GAAA,CAAI,CAAC,CAAA,KAAO,CAAA,CAAE,aAAY,GAAI,CAAA,EAAG,EAAE,IAAI,CAAA,CAAA,CAAA,GAAM,EAAE,IAAK,CAAA;AACxD,QAAA,IAAI,OAAA,CAAQ,SAAS,GAAA,EAAK;AACvB,UAAA,KAAA,CAAM,IAAA,CAAK,CAAA,QAAA,EAAW,OAAA,CAAQ,MAAA,GAAS,GAAG,CAAA,KAAA,CAAO,CAAA;AAAA,QACpD;AACA,QAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,SAAS,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,EAAE;AAAA,MAChD;AAAA,MACA,KAAK,YAAA,EAAc;AAChB,QAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AACnB,UAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,8BAAA,EAA+B;AAAA,QAC7D;AACA,QAAA,IAAI,SAAA,CAAU,YAAY,KAAA,CAAA,EAAW;AAClC,UAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,gCAAA,EAAiC;AAAA,QAC/D;AACA,QAAA,EAAA,CAAG,SAAA,CAAUA,MAAK,OAAA,CAAQ,IAAI,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AACpD,QAAA,EAAA,CAAG,aAAA,CAAc,IAAA,EAAM,SAAA,CAAU,OAAA,EAAS,MAAM,CAAA;AAChD,QAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,OAAA,EAAS,SAAA,EAAU;AAAA,MACzC;AAAA,MACA;AACG,QAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,OAAO,CAAA,gBAAA,EAAmB,SAAA,CAAU,MAAM,CAAA,CAAA,EAAG;AAAA;AACvE,EACH,SAAS,CAAA,EAAG;AACT,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,sBAAA,CAAuB,CAAC,CAAA,EAAE;AAAA,EACxD;AACH;AAEA,SAAS,uBAAuB,CAAA,EAAoB;AACjD,EAAA,IAAI,CAAA,IAAK,OAAO,CAAA,KAAM,QAAA,IAAY,UAAU,CAAA,EAAG;AAC5C,IAAA,MAAM,OAAQ,CAAA,CAA4B,IAAA;AAC1C,IAAA,IAAI,IAAA,KAAS,UAAU,OAAO,6BAAA;AAC9B,IAAA,IAAI,IAAA,KAAS,QAAA,IAAY,IAAA,KAAS,OAAA,EAAS,OAAO,mBAAA;AAClD,IAAA,IAAI,IAAA,KAAS,UAAU,OAAO,YAAA;AAC9B,IAAA,IAAI,IAAA,KAAS,WAAW,OAAO,iBAAA;AAAA,EAClC;AACA,EAAA,OAAO,6BAAA;AACV;AAEO,SAAS,wBAAwB,KAAA,EAAgD;AACrF,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,MAAM,OAAO,KAAA;AACxD,EAAA,MAAM,CAAA,GAAI,KAAA;AACV,EAAA,OAAO,CAAA,CAAE,SAAS,gBAAA,IAAoB,OAAO,EAAE,MAAA,KAAW,QAAA,IAAY,OAAO,CAAA,CAAE,IAAA,KAAS,QAAA;AAC3F;AChHA,IAAM,aAAA,GAAgB,CAAA;AAEtB,SAAS,SAAA,GAAoB;AAC1B,EAAA,MAAM,IAAA,GACH,QAAQ,GAAA,CAAI,eAAA,KACX,QAAQ,QAAA,KAAa,OAAA,GACjBA,KAAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,WAAW,EAAA,CAAG,OAAA,EAAQ,EAAG,aAAa,CAAA,GAC5DA,KAAAA,CAAK,KAAK,EAAA,CAAG,OAAA,EAAQ,EAAG,SAAA,EAAW,aAAa,CAAA,CAAA;AACxD,EAAA,OAAOA,KAAAA,CAAK,IAAA,CAAK,IAAA,EAAM,mBAAmB,CAAA;AAC7C;AAEO,SAAS,oBAAA,GAAyC;AACtD,EAAA,MAAM,OAAO,SAAA,EAAU;AACvB,EAAA,IAAI;AACD,IAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAMC,GAAG,YAAA,CAAa,IAAA,EAAM,MAAM,CAAC,CAAA;AACpD,IAAA,IAAI,KAAK,OAAA,KAAY,aAAA,IAAiB,MAAM,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA,EAAG;AAC9D,MAAA,OAAO,EAAE,OAAA,EAAS,aAAA,EAAe,MAAA,EAAQ,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAMD,KAAAA,CAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAE;AAAA,IACnF;AAAA,EACH,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,EAAE,OAAA,EAAS,aAAA,EAAe,MAAA,EAAQ,EAAC,EAAE;AAC/C;AAEA,SAAS,qBAAqB,KAAA,EAA+B;AAC1D,EAAA,MAAM,OAAO,SAAA,EAAU;AACvB,EAAA,MAAM,GAAA,GAAMA,KAAAA,CAAK,OAAA,CAAQ,IAAI,CAAA;AAC7B,EAAAC,EAAAA,CAAG,UAAU,GAAA,EAAK,EAAE,WAAW,IAAA,EAAM,IAAA,EAAM,KAAO,CAAA;AAClD,EAAAA,EAAAA,CAAG,aAAA,CAAc,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,IAAA,EAAM,CAAC,CAAA,GAAI,IAAA,EAAM,EAAE,IAAA,EAAM,KAAO,CAAA;AAChF;AAEO,SAAS,kBAAA,CAAmB,SAAiB,IAAA,EAA4C;AAC7F,EAAA,IAAI,IAAA,EAAM,cAAc,OAAO,IAAA;AAC/B,EAAA,MAAM,QAAA,GAAWD,KAAAA,CAAK,OAAA,CAAQ,OAAO,CAAA;AACrC,EAAA,MAAM,QAAQ,oBAAA,EAAqB;AACnC,EAAA,OAAO,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,QAAQ,CAAA;AACxC;AAEA,eAAe,uBAAuB,OAAA,EAAkD;AACrF,EAAA,MAAM,EAAA,GAAKE,iBAAA,CAAS,eAAA,CAAgB,EAAE,KAAA,EAAO,QAAQ,KAAA,EAAO,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAQ,CAAA;AACpF,EAAA,MAAM,QAAA,GAAW,CAAC,CAAA,KAAc,IAAI,OAAA,CAAgB,CAAC,OAAA,KAAY,EAAA,CAAG,QAAA,CAAS,CAAA,EAAG,OAAO,CAAC,CAAA;AAExF,EAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,IACZ;AAAA;AAAA,EAAA,EAAwC,OAAO;;AAAA;AAAA;AAAA;AAAA;;AAAA,4BAAA;AAAA,GAMlD;AACA,EAAA,MAAM,UAAU,MAAM,QAAA,CAAS,EAAE,CAAA,EAAG,MAAK,IAAK,GAAA;AAC9C,EAAA,EAAA,CAAG,KAAA,EAAM;AAET,EAAA,IAAI,MAAA,KAAW,KAAK,OAAO,MAAA;AAC3B,EAAA,IAAI,MAAA,KAAW,KAAK,OAAO,QAAA;AAC3B,EAAA,OAAO,QAAA;AACV;AAEA,IAAM,cAAA,uBAAqB,GAAA,EAAY;AAevC,eAAsB,sBACnB,IAAA,EAC8B;AAC9B,EAAA,MAAM,GAAA,GAAMF,MAAK,OAAA,CAAQ,IAAA,CAAK,YAAY,IAAA,CAAK,GAAA,IAAO,OAAA,CAAQ,GAAA,EAAK,CAAA;AAEnE,EAAA,IAAI,kBAAA,CAAmB,KAAK,EAAE,YAAA,EAAc,KAAK,QAAA,EAAU,GAAG,OAAO,SAAA;AACrE,EAAA,IAAI,cAAA,CAAe,GAAA,CAAI,GAAG,CAAA,EAAG,OAAO,SAAA;AAGpC,EAAA,IAAI,KAAK,QAAA,IAAYA,KAAAA,CAAK,QAAQ,IAAA,CAAK,QAAQ,MAAM,GAAA,EAAK;AACvD,IAAA,cAAA,CAAe,IAAI,GAAG,CAAA;AACtB,IAAA,OAAO,SAAA;AAAA,EACV;AAEA,EAAA,IAAI,KAAK,QAAA,EAAU;AAChB,IAAA,cAAA,CAAe,IAAI,GAAG,CAAA;AACtB,IAAA,OAAO,SAAA;AAAA,EACV;AAEA,EAAA,IAAI,CAAC,OAAA,CAAQ,KAAA,CAAM,KAAA,IAAS,KAAK,cAAA,EAAgB;AAC9C,IAAA,OAAO,QAAA;AAAA,EACV;AAEA,EAAA,MAAM,QAAA,GAAW,MAAM,sBAAA,CAAuB,GAAG,CAAA;AACjD,EAAA,IAAI,aAAa,QAAA,EAAU;AACxB,IAAA,OAAO,QAAA;AAAA,EACV;AACA,EAAA,IAAI,aAAa,QAAA,EAAU;AACxB,IAAA,MAAM,QAAQ,oBAAA,EAAqB;AACnC,IAAA,IAAI,CAAC,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,GAAG,CAAA,EAAG;AAC9B,MAAA,KAAA,CAAM,MAAA,CAAO,KAAK,GAAG,CAAA;AACrB,MAAA,oBAAA,CAAqB,KAAK,CAAA;AAAA,IAC7B;AAAA,EACH;AACA,EAAA,cAAA,CAAe,IAAI,GAAG,CAAA;AACtB,EAAA,OAAO,SAAA;AACV;;;ACpHO,SAAS,yBAAyB,KAAA,EAAgD;AACtF,EAAA,MAAM,OAAO,MAAA,CAAO,KAAA,CAAM,IAAA,IAAQ,EAAE,EAAE,WAAA,EAAY;AAClD,EAAA,IAAI,IAAA,KAAS,QAAA,IAAY,KAAA,CAAM,IAAA,KAAS,qBAAA,EAAuB;AAC5D,IAAA,OAAO,KAAA,CAAM,KAAA;AAAA,EAChB;AACA,EAAA,IAAI,KAAA,CAAM,SAAS,qBAAA,EAAuB;AACvC,IAAA,OAAO,KAAA,CAAM,KAAA;AAAA,EAChB;AACA,EAAA,OAAO,IAAA;AACV;AAEA,eAAsB,sBAAA,CACnB,OACA,IAAA,EAQkC;AAClC,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,UAAU,OAAO,IAAA;AAChD,EAAA,MAAM,OAAA,GAAU,KAAA;AAEhB,EAAA,IAAI,uBAAA,CAAwB,OAAO,CAAA,EAAG;AACnC,IAAA,MAAM,SAAA,GAAY,OAAA;AAClB,IAAA,IAAI,OAAO,OAAA,CAAQ,YAAA,KAAiB,QAAA,EAAU;AAC3C,MAAA,SAAA,CAAU,eAAe,OAAA,CAAQ,YAAA;AAAA,IACpC;AACA,IAAA,OAAO,kBAAA,CAAmB,WAAW,IAAI,CAAA;AAAA,EAC5C;AAEA,EAAA,IAAI,OAAA,CAAQ,SAAS,gBAAA,EAAkB;AACpC,IAAA,OAAO,4BAA4B,OAAO,CAAA;AAAA,EAC7C;AAEA,EAAA,OAAO,IAAA;AACV;AAEA,eAAe,kBAAA,CACZ,WACA,IAAA,EAM2B;AAC3B,EAAA,MAAM,KAAA,GAAQ,MAAM,qBAAA,CAAsB;AAAA,IACvC,GAAA,EAAK,QAAQ,GAAA,EAAI;AAAA,IACjB,UAAU,IAAA,CAAK,QAAA;AAAA,IACf,UAAU,IAAA,CAAK,QAAA;AAAA;AAAA,IAEf,cAAA,EAAgB,IAAA,CAAK,cAAA,IAAkB,OAAA,CAAQ,MAAM,KAAA,KAAU;AAAA,GACjE,CAAA;AACD,EAAA,IAAI,UAAU,SAAA,EAAW;AACtB,IAAA,OAAO;AAAA,MACJ,WAAA,EAAa,KAAK,SAAA,CAAU;AAAA,QACzB,EAAA,EAAI,KAAA;AAAA,QACJ,KAAA,EAAO;AAAA,OACT,CAAA;AAAA,MACD,mBAAmB,SAAA,CAAU;AAAA,KAChC;AAAA,EACH;AAEA,EAAA,OAAA,CAAQ,OAAO,KAAA,CAAM;AAAA,OAAA,EAAY,SAAA,CAAU,MAAM,CAAA,EAAA,EAAK,SAAA,CAAU,IAAI;AAAA,CAAI,CAAA;AACxE,EAAA,MAAM,MAAA,GAAS,yBAAA,CAA0B,OAAA,CAAQ,GAAA,IAAO,SAAA,EAAW;AAAA,IAChE,YAAY,IAAA,CAAK;AAAA,GACnB,CAAA;AACD,EAAA,OAAO;AAAA,IACJ,WAAA,EAAa,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AAAA,IAClC,mBAAmB,SAAA,CAAU;AAAA,GAChC;AACH;AAEA,eAAe,4BACZ,OAAA,EACkC;AAClC,EAAA,MAAM,MAAA,GACF,OAAO,OAAA,CAAQ,WAAA,KAAgB,QAAA,IAAY,OAAA,CAAQ,WAAA,IACnD,OAAO,OAAA,CAAQ,WAAA,KAAgB,QAAA,IAAY,OAAA,CAAQ,WAAA,IACpD,kBAAA;AACH,EAAA,MAAM,SAAS,OAAO,OAAA,CAAQ,aAAA,KAAkB,QAAA,GAAW,QAAQ,aAAA,GAAgB,EAAA;AACnF,EAAA,OAAA,CAAQ,OAAO,KAAA,CAAM;AAAA,EAAK,MAAM;AAAA,CAAI,CAAA;AACpC,EAAA,IAAI,MAAA,EAAQ;AACT,IAAA,OAAA,CAAQ,OAAO,KAAA,CAAM,CAAA,EAAG,OAAO,KAAA,CAAM,CAAA,EAAG,GAAI,CAAC;AAAA,CAAI,CAAA;AAAA,EACpD;AACA,EAAA,IAAI,CAAC,OAAA,CAAQ,KAAA,CAAM,KAAA,EAAO;AACvB,IAAA,OAAO;AAAA,MACJ,WAAA,EAAa,EAAA;AAAA,MACb,mBACG,OAAO,OAAA,CAAQ,YAAA,KAAiB,QAAA,GAAW,QAAQ,YAAA,GAAe;AAAA,KACxE;AAAA,EACH;AACA,EAAA,MAAM,EAAA,GAAKE,iBAAAA,CAAS,eAAA,CAAgB,EAAE,KAAA,EAAO,QAAQ,KAAA,EAAO,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAQ,CAAA;AACpF,EAAA,MAAM,MAAA,GAAS,MAAM,IAAI,OAAA,CAAgB,CAAC,OAAA,KAAY;AACnD,IAAA,EAAA,CAAG,QAAA,CAAS,yBAAyB,OAAO,CAAA;AAAA,EAC/C,CAAC,CAAA;AACD,EAAA,EAAA,CAAG,KAAA,EAAM;AACT,EAAA,OAAO;AAAA,IACJ,WAAA,EAAa,OAAO,IAAA,EAAK;AAAA,IACzB,mBACG,OAAO,OAAA,CAAQ,YAAA,KAAiB,QAAA,GAAW,QAAQ,YAAA,GAAe;AAAA,GACxE;AACH;;;AC/GA,IAAM,eAAA,GAAkB,EAAA;AAExB,eAAsB,oBAAA,CACnB,MAAA,EACA,eAAA,EACA,OAAA,EACA,IAAA,EAQuD;AACvD,EAAA,IAAI,UAAA,GAAa,EAAA;AACjB,EAAA,IAAI,YAAA,GAAe,KAAA;AACnB,EAAA,IAAI,MAAA;AAEJ,EAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ,eAAA,EAAiB,KAAA,EAAA,EAAS;AACnD,IAAA,IAAI,WAAA,GAAuB,IAAA;AAE3B,IAAA,MAAM,MAAA,CAAO,aAAA;AAAA,MACV,MAAA,GACK;AAAA,QACG,UAAU,EAAC;AAAA,QACX,aAAa,MAAA,CAAO,WAAA;AAAA,QACpB,mBAAmB,MAAA,CAAO;AAAA,OAC7B,GACA,EAAE,QAAA,EAAU,eAAA,EAAgB;AAAA,MACjC,CAAC,KAAA,KAAU;AACR,QAAA,OAAA,CAAQ,KAAK,CAAA;AACb,QAAA,MAAM,KAAA,GAAQ,aAAa,KAAK,CAAA;AAChC,QAAA,IAAI,OAAO,UAAA,IAAc,KAAA;AACzB,QAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,EAAM,WAAA,EAAY,IAAK,EAAA;AAC1C,QAAA,IAAI,IAAA,KAAS,mBAAmB,YAAA,GAAe,IAAA;AAC/C,QAAA,MAAM,QAAA,GAAW,gBAAgB,KAAK,CAAA;AACtC,QAAA,IAAI,QAAA,EAAU,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,kBAAkB,QAAQ,CAAA;AAAA,CAAW,CAAA;AACxE,QAAA,MAAM,IAAA,GAAO,yBAAyB,KAAgC,CAAA;AACtE,QAAA,IAAI,MAAM,WAAA,GAAc,IAAA;AAAA,MAC3B,CAAA;AAAA,MACA,EAAE,WAAA,EAAa,IAAA,CAAK,WAAA;AAAY,KACnC;AAEA,IAAA,IAAI,CAAC,WAAA,EAAa;AACf,MAAA;AAAA,IACH;AAEA,IAAA,MAAM,IAAA,GAAO,MAAM,sBAAA,CAAuB,WAAA,EAAa;AAAA,MACpD,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,gBAAgB,IAAA,CAAK;AAAA,KACvB,CAAA;AACD,IAAA,IAAI,CAAC,IAAA,EAAM;AACR,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,QACZ;AAAA,OACH;AACA,MAAA;AAAA,IACH;AACA,IAAA,MAAA,GAAS,IAAA;AACT,IAAA,UAAA,GAAa,EAAA;AAAA,EAChB;AAEA,EAAA,OAAO,EAAE,YAAY,YAAA,EAAa;AACrC;ACzBO,IAAM,cAAA,GAAN,cAA6B,YAAA,CAAa;AAAA,EACtC,EAAA,GAAuB,IAAA;AAAA,EACvB,SAAA,GAAY,KAAA;AAAA,EACZ,OAAA;AAAA,EAER,YAAY,OAAA,EAAgC;AACzC,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,OAAA,GAAU;AAAA,MACZ,OAAA,EAAS,QAAA;AAAA,MACT,KAAA,EAAO,KAAA;AAAA,MACP,GAAG;AAAA,KACN;AAAA,EACH;AAAA;AAAA,EAGA,OAAA,GAAyB;AACtB,IAAA,IAAI,OAAO,UAAA,CAAW,SAAA,KAAc,WAAA,EAAa;AAC9C,MAAA,OAAO,OAAA,CAAQ,MAAA;AAAA,QACZ,IAAI,MAAM,qEAAqE;AAAA,OAClF;AAAA,IACH;AAEA,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACrC,MAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,MAAA,IAAI,IAAA,CAAK,QAAQ,OAAA,EAAS;AACvB,QAAA,MAAA,CAAO,MAAA,CAAO,KAAA,EAAO,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA;AAAA,MAC5C;AACA,MAAA,MAAM,GAAA,GAAM,MAAA,CAAO,QAAA,EAAS,GACvB,GAAG,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA,CAAA,EAAI,MAAA,CAAO,QAAA,EAAU,CAAA,CAAA,GACxC,KAAK,OAAA,CAAQ,GAAA;AAElB,MAAA,IAAI,IAAA,CAAK,QAAQ,KAAA,EAAO;AACrB,QAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,sBAAA,EAAyB,GAAG;AAAA,CAAI,CAAA;AAAA,MACxD;AAEA,MAAA,IAAA,CAAK,EAAA,GAAK,IAAI,SAAA,CAAU,GAAG,CAAA;AAE3B,MAAA,IAAA,CAAK,EAAA,CAAG,OAAA,GAAU,CAAC,KAAA,KAAiB;AACjC,QAAA,MAAM,GAAA,GAAM,KAAA,YAAiB,UAAA,GAAa,KAAA,CAAM,OAAA,GAAU,6BAAA;AAC1D,QAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AAClB,UAAA,MAAA,CAAO,IAAI,KAAA,CAAM,GAAG,CAAC,CAAA;AAAA,QACxB,CAAA,MAAO;AACJ,UAAA,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,IAAI,KAAA,CAAM,GAAG,CAAC,CAAA;AAAA,QACpC;AAAA,MACH,CAAA;AAEA,MAAA,IAAA,CAAK,EAAA,CAAG,OAAA,GAAU,CAAC,KAAA,KAAsB;AACtC,QAAA,MAAM,SAAS,KAAA,CAAM,IAAA,KAAS,IAAA,GAAO,iBAAA,GAAoB,MAAM,MAAA,IAAU,QAAA;AACzE,QAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AACjB,QAAA,IAAA,CAAK,KAAK,QAAA,EAAU,EAAE,QAAQ,IAAA,EAAM,KAAA,CAAM,MAAM,CAAA;AAAA,MACnD,CAAA;AAEA,MAAA,IAAA,CAAK,EAAA,CAAG,SAAA,GAAY,CAAC,KAAA,KAAwB;AAC1C,QAAA,IAAI;AACD,UAAA,MAAM,IAAA,GAAO,OAAO,KAAA,CAAM,IAAA,KAAS,WAAW,KAAA,CAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,QAAA,EAAS;AAC/E,UAAA,MAAM,MAAA,GAA6B,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAClD,UAAA,IAAA,CAAK,IAAA,CAAK,WAAW,MAAM,CAAA;AAC3B,UAAA,IAAA,CAAK,YAAY,MAAM,CAAA;AAAA,QAC1B,CAAA,CAAA,MAAQ;AACL,UAAA,IAAI,IAAA,CAAK,QAAQ,KAAA,EAAO;AACrB,YAAA,OAAA,CAAQ,OAAO,KAAA,CAAM,CAAA;AAAA,CAAmC,CAAA;AAAA,UAC3D;AAAA,QACH;AAAA,MACH,CAAA;AAEA,MAAA,IAAA,CAAK,EAAA,CAAG,SAAS,MAAM;AACpB,QAAA,IAAI,IAAA,CAAK,QAAQ,KAAA,EAAO;AACrB,UAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,8CAA8C,CAAA;AAAA,QACtE;AACA,QAAA,IAAA,CAAK,WAAW,aAAA,EAAe;AAAA,UAC5B,KAAA,EAAO,KAAK,OAAA,CAAQ,KAAA;AAAA,UACpB,OAAA,EAAS,KAAK,OAAA,CAAQ,MAAA;AAAA,UACtB,GAAA,EAAK,KAAK,OAAA,CAAQ;AAAA,SACpB,CAAA;AAAA,MACJ,CAAA;AAGA,MAAA,MAAM,OAAA,GAAU,WAAW,MAAM;AAC9B,QAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AAClB,UAAA,IAAA,CAAK,KAAA,EAAM;AACX,UAAA,MAAA,CAAO,IAAI,KAAA,CAAM,mDAAmD,CAAC,CAAA;AAAA,QACxE;AAAA,MACH,GAAG,GAAK,CAAA;AAER,MAAA,IAAA,CAAK,IAAA,CAAK,aAAa,MAAM;AAC1B,QAAA,YAAA,CAAa,OAAO,CAAA;AACpB,QAAA,OAAA,EAAQ;AAAA,MACX,CAAC,CAAA;AAED,MAAA,IAAA,CAAK,IAAA,CAAK,SAAS,MAAM;AACtB,QAAA,YAAA,CAAa,OAAO,CAAA;AAAA,MACvB,CAAC,CAAA;AAAA,IACJ,CAAC,CAAA;AAAA,EACJ;AAAA,EAEQ,YAAY,KAAA,EAAiC;AAClD,IAAA,QAAQ,MAAM,IAAA;AAAM,MACjB,KAAK,QAAA;AACF,QAAA,IAAA,CAAK,iBAAA,CAAkB,KAAA,CAAM,IAAA,IAAQ,EAAA,EAAI,MAAM,KAAK,CAAA;AACpD,QAAA;AAAA,MAEH,KAAK,oBAAA;AACF,QAAA,IAAA,CAAK,KAAK,YAAA,EAAc,EAAE,WAAW,KAAA,CAAM,SAAA,IAAa,IAAI,CAAA;AAC5D,QAAA;AAAA,MACH,KAAK,sBAAA;AACF,QAAA,IAAA,CAAK,KAAK,YAAA,EAAc;AAAA,UACrB,SAAA,EAAW,MAAM,SAAA,IAAa,EAAA;AAAA,UAC9B,KAAA,EAAO,MAAM,KAAA,IAAS;AAAA,SACxB,CAAA;AACD,QAAA;AAAA,MACH,KAAK,kBAAA;AACF,QAAA,IAAA,CAAK,KAAK,UAAA,EAAY,EAAE,WAAW,KAAA,CAAM,SAAA,IAAa,IAAI,CAAA;AAC1D,QAAA;AAAA,MAEH,KAAK,iBAAA;AACF,QAAA,IAAA,CAAK,KAAK,iBAAA,EAAmB;AAAA,UAC1B,UAAA,EAAY,MAAM,UAAA,IAAc,EAAA;AAAA,UAChC,YAAA,EAAc,MAAM,YAAA,IAAgB;AAAA,SACtC,CAAA;AACD,QAAA;AAAA,MACH,KAAK,gBAAA;AACF,QAAA,IAAA,CAAK,KAAK,gBAAA,EAAkB;AAAA,UACzB,UAAA,EAAY,MAAM,UAAA,IAAc,EAAA;AAAA,UAChC,KAAA,EAAO,MAAM,KAAA,IAAS;AAAA,SACxB,CAAA;AACD,QAAA;AAAA,MACH,KAAK,eAAA;AACF,QAAA,IAAA,CAAK,KAAK,eAAA,EAAiB,EAAE,YAAY,KAAA,CAAM,UAAA,IAAc,IAAI,CAAA;AACjE,QAAA;AAAA,MACH,KAAK,kBAAA;AACF,QAAA,IAAA,CAAK,KAAK,kBAAA,EAAoB;AAAA,UAC3B,UAAA,EAAY,MAAM,UAAA,IAAc,EAAA;AAAA,UAChC,QAAQ,KAAA,CAAM;AAAA,SAChB,CAAA;AACD,QAAA;AAAA,MAEH,KAAK,aAAA;AACF,QAAA,IAAA,CAAK,KAAK,aAAA,EAAe,EAAE,KAAA,EAAO,KAAA,CAAM,OAAO,CAAA;AAC/C,QAAA;AAAA,MACH,KAAK,cAAA;AACF,QAAA,IAAA,CAAK,KAAK,cAAA,EAAgB,EAAE,KAAA,EAAO,KAAA,CAAM,OAAO,CAAA;AAChD,QAAA;AAAA,MACH,KAAK,WAAA;AACF,QAAA,IAAA,CAAK,KAAK,WAAA,EAAa;AAAA,UACpB,OAAA,EAAS,MAAM,OAAA,IAAW,eAAA;AAAA,UAC1B,MAAM,KAAA,CAAM;AAAA,SACd,CAAA;AACD,QAAA;AAAA,MAEH;AACG,QAAA,IAAI,IAAA,CAAK,QAAQ,KAAA,EAAO;AACrB,UAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,4BAAA,EAA+B,KAAA,CAAM,IAAI;AAAA,CAAI,CAAA;AAAA,QACrE;AAAA;AACN,EACH;AAAA,EAEQ,iBAAA,CAAkB,MAAc,KAAA,EAAkB;AACvD,IAAA,QAAQ,IAAA;AAAM,MACX,KAAK,qBAAA;AACF,QAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,QAAA,IAAA,CAAK,KAAK,WAAA,EAAa;AAAA,UACpB,QAAQ,KAAA,EAAO,OAAA;AAAA,UACf,UAAU,KAAA,EAAO,SAAA;AAAA,UACjB,aAAa,KAAA,EAAO;AAAA,SACtB,CAAA;AACD,QAAA;AAAA,MAEH,KAAK,aAAA;AACF,QAAA,IAAI,OAAO,IAAA,EAAM;AACd,UAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,MAAM,QAAQ,CAAA;AAC9C,UAAA,IAAA,CAAK,KAAK,OAAA,EAAS,EAAE,OAAO,SAAA,EAAW,KAAA,CAAM,YAAY,CAAA;AAAA,QAC5D;AACA,QAAA;AAAA,MAEH,KAAK,mBAAA;AACF,QAAA,IAAA,CAAK,KAAK,aAAA,EAAe,EAAE,SAAA,EAAW,KAAA,EAAO,YAAY,CAAA;AACzD,QAAA;AAAA,MACH,KAAK,iBAAA;AACF,QAAA,IAAA,CAAK,KAAK,WAAA,EAAa,EAAE,SAAA,EAAW,KAAA,EAAO,YAAY,CAAA;AACvD,QAAA;AAAA,MAEH,KAAK,iBAAA;AACF,QAAA,IAAA,CAAK,KAAK,WAAA,EAAa,EAAE,SAAA,EAAW,KAAA,EAAO,YAAY,CAAA;AACvD,QAAA;AAAA,MAEH,KAAK,wBAAA;AACF,QAAA,IAAI,KAAA,EAAO;AACR,UAAA,IAAA,CAAK,IAAA,CAAK,oBAAoB,KAAK,CAAA;AAAA,QACtC;AACA,QAAA;AAAA,MAEH,KAAK,qBAAA;AACF,QAAA,IAAI,KAAA,EAAO;AACR,UAAA,IAAA,CAAK,IAAA,CAAK,iBAAiB,EAAE,IAAA,EAAM,MAAM,IAAA,EAAM,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,CAAA;AAAA,QACpE;AACA,QAAA;AAAA,MAEH,KAAK,gBAAA;AACF,QAAA,IAAI,KAAA,EAAO;AACR,UAAA,IAAA,CAAK,KAAK,UAAA,EAAY;AAAA,YACnB,WAAW,KAAA,CAAM,UAAA;AAAA,YACjB,SAAS,KAAA,CAAM,OAAA;AAAA,YACf,iBAAiB,KAAA,CAAM,gBAAA;AAAA,YACvB,gBAAA,EAAkB,MAAM,iBAAA,IAAqB,UAAA;AAAA,YAC7C,eAAe,KAAA,CAAM;AAAA,WACvB,CAAA;AAAA,QACJ;AACA,QAAA;AAAA,MAEH,KAAK,iBAAA;AAAA,MACL,KAAK,gBAAA;AAAA,MACL,KAAK,kBAAA;AACF,QAAA;AAAA,MAEH;AACG,QAAA,IAAI,IAAA,CAAK,QAAQ,KAAA,EAAO;AACrB,UAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,8BAAA,EAAiC,IAAI;AAAA,CAAI,CAAA;AAAA,QACjE;AAAA;AACN,EACH;AAAA,EAEQ,UAAA,CAAW,MAAc,KAAA,EAAmB;AACjD,IAAA,IAAI,CAAC,IAAA,CAAK,EAAA,IAAM,KAAK,EAAA,CAAG,UAAA,KAAe,UAAU,IAAA,EAAM;AACpD,MAAA;AAAA,IACH;AACA,IAAA,MAAM,KAAA,GAA4B,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAK;AACzD,IAAA,IAAI,UAAU,MAAA,EAAW;AACtB,MAAA,KAAA,CAAM,KAAA,GAAQ,KAAA;AAAA,IACjB;AACA,IAAA,IAAA,CAAK,IAAA,CAAK,WAAW,KAAK,CAAA;AAC1B,IAAA,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,EACrC;AAAA;AAAA,EAGA,UAAU,KAAA,EAAqB;AAC5B,IAAA,IAAA,CAAK,WAAW,aAAA,EAAe;AAAA,MAC5B,IAAA,EAAM,KAAA,CAAM,QAAA,CAAS,QAAQ,CAAA;AAAA,MAC7B,MAAA,EAAQ,OAAA;AAAA,MACR,WAAA,EAAa;AAAA,KACf,CAAA;AAAA,EACJ;AAAA;AAAA,EAGA,eAAe,SAAA,EAAyB;AACrC,IAAA,IAAA,CAAK,UAAA,CAAW,mBAAA,EAAqB,EAAE,UAAA,EAAY,WAAW,CAAA;AAAA,EACjE;AAAA;AAAA,EAGA,YAAA,GAAqB;AAClB,IAAA,IAAA,CAAK,WAAW,iBAAiB,CAAA;AAAA,EACpC;AAAA;AAAA,EAGA,gBAAgB,OAAA,EAAuB;AACpC,IAAA,IAAA,CAAK,WAAW,oBAAA,EAAsB;AAAA,MACnC,OAAA,EAAS,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA;AAAQ,KACnC,CAAA;AAAA,EACJ;AAAA;AAAA,EAGA,aAAA,CAAc,YAAoB,SAAA,EAA0B;AACzD,IAAA,IAAA,CAAK,WAAW,iBAAA,EAAmB;AAAA,MAChC,YAAA,EAAc,UAAA;AAAA,MACd,UAAA,EAAY;AAAA,KACd,CAAA;AAAA,EACJ;AAAA;AAAA,EAGA,WAAA,GAAuB;AACpB,IAAA,OAAO,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,EAAA,EAAI,eAAe,SAAA,CAAU,IAAA;AAAA,EAC9D;AAAA;AAAA,EAGA,KAAA,GAAc;AACX,IAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AACjB,IAAA,IAAI,KAAK,EAAA,EAAI;AACV,MAAA,IAAA,CAAK,GAAG,KAAA,EAAM;AACd,MAAA,IAAA,CAAK,EAAA,GAAK,IAAA;AAAA,IACb;AAAA,EACH;AACH,CAAA;ACpQA,SAAS,WAAW,IAAA,EAAsC;AACvD,EAAA,OAAO,MAAA,IAAU,IAAA,IAAS,IAAA,CAAsB,IAAA,KAAS,WAAA;AAC5D;AAEA,SAAS,aAAa,IAAA,EAAwC;AAC3D,EAAA,OAAO,MAAA,IAAU,IAAA,IAAS,IAAA,CAAwB,IAAA,KAAS,aAAA;AAC9D;AAGA,SAAS,kBAAA,CAAmB,QAAgB,aAAA,EAAgC;AACzE,EAAA,MAAM,OAAA,GAAU,gBAAgB,CAAA,IAAA,EAAA,CAAQ,aAAA,GAAgB,KAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA,GAAM,EAAA;AAC9E,EAAA,QAAQ,MAAA;AAAQ,IACb,KAAK,UAAA;AACF,MAAA,OAAO,0BAA0B,OAAO,CAAA,CAAA;AAAA,IAC3C,KAAK,kBAAA;AACF,MAAA,OAAO,cAAc,OAAO,CAAA,CAAA;AAAA,IAC/B,KAAK,aAAA;AACF,MAAA,OAAO,oBAAoB,OAAO,CAAA,CAAA;AAAA,IACrC,KAAK,OAAA;AACF,MAAA,OAAO,QAAQ,OAAO,CAAA,CAAA;AAAA,IACzB;AACG,MAAA,OAAO,cAAc,OAAO,CAAA,CAAA;AAAA;AAErC;AAGA,SAAS,eAAA,CACN,SACA,eAAA,EACc;AACd,EAAA,IAAI,CAAC,OAAA,IAAW,CAAC,eAAA,EAAiB,OAAO,IAAA;AACzC,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,OAAA,CAAQ,eAAA,EAAiB,EAAE,CAAA;AACpD,EAAA,IAAI,eAAA,CAAgB,UAAA,CAAW,QAAQ,CAAA,EAAG;AACvC,IAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,KAAA,CAAM,QAAA,CAAS,MAAM,CAAA;AACnD,IAAA,OAAO,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,KAAA,GAAQ,IAAA;AAAA,EACrC;AACA,EAAA,OAAO,eAAA,KAAoB,UAAU,eAAA,GAAkB,IAAA;AAC1D;AAaA,IAAM,GAAA,GAAM,OAAA;AACZ,IAAM,WAAA,GAAc,GAAG,GAAG,CAAA,IAAA,CAAA;AAC1B,IAAM,WAAA,GAAc,GAAG,GAAG,CAAA,IAAA,CAAA;AAC1B,IAAM,aAAA,GAAgB,GAAG,GAAG,CAAA,MAAA,CAAA;AAC5B,IAAM,cAAA,GAAiB,GAAG,GAAG,CAAA,MAAA,CAAA;AAC7B,IAAM,SAAA,GAAY,GAAG,GAAG,CAAA,CAAA,CAAA;AACxB,IAAM,KAAA,GAAQ,GAAG,GAAG,CAAA,EAAA,CAAA;AACpB,IAAM,QAAA,GAAW,CAAA,EAAG,GAAG,CAAA,MAAA,EAAS,GAAG,CAAA,MAAA,CAAA;AACnC,IAAM,SAAA,GAAY,CAAA,EAAG,GAAG,CAAA,MAAA,EAAS,GAAG,CAAA,MAAA,CAAA;AAEpC,IAAM,IAAA,GAAO,GAAG,GAAG,CAAA,GAAA,CAAA;AACnB,IAAM,KAAA,GAAQ,GAAG,GAAG,CAAA,GAAA,CAAA;AACpB,IAAM,IAAA,GAAO,GAAG,GAAG,CAAA,GAAA,CAAA;AACnB,IAAM,MAAA,GAAS,GAAG,GAAG,CAAA,GAAA,CAAA;AACrB,IAAM,MAAA,GAAS,GAAG,GAAG,CAAA,SAAA,CAAA;AACrB,IAAM,UAAA,GAAa,GAAG,GAAG,CAAA,SAAA,CAAA;AACzB,IAAM,GAAA,GAAM,GAAG,GAAG,CAAA,EAAA,CAAA;AAClB,IAAM,eAAA,GAAkB,GAAG,GAAG,CAAA,OAAA,CAAA;AAE9B,SAAS,MAAA,CAAO,KAAa,GAAA,EAAqB;AAC/C,EAAA,OAAO,CAAA,EAAG,GAAG,CAAA,EAAG,GAAG,IAAI,GAAG,CAAA,CAAA,CAAA;AAC7B;AAIO,IAAM,UAAN,MAAc;AAAA,EACV,QAAoB,EAAC;AAAA,EACrB,WAAA,GAAc,EAAA;AAAA,EACd,WAAA,GAAc,KAAA;AAAA,EACd,aAAA,GAAgB,EAAA;AAAA,EAChB,YAAA,GAAe,CAAA;AAAA,EACf,aAAA,GAAgB,KAAA;AAAA,EAChB,IAAA,GAAO,EAAA;AAAA,EACP,IAAA,GAAO,EAAA;AAAA,EACP,OAAA,GAAU,KAAA;AAAA,EACV,WAAA,GAAoD,IAAA;AAAA,EACpD,iBAAA,GAAqC,IAAA;AAAA,EACrC,eAAA,GAAmC,IAAA;AAAA,EACnC,OAAA;AAAA;AAAA,EAGA,eAA6B,EAAC;AAAA,EAC9B,iBAAA,GAAoB,KAAA;AAAA,EACpB,cAAA,GAAqC,IAAA;AAAA;AAAA,EAGrC,MAAA,GAAS,EAAA;AAAA,EACT,QAAA,GAAiD,IAAA;AAAA,EAEzD,YAAY,OAAA,EAAyB;AAClC,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,iBAAA,GAAoB,CAAC,CAAC,OAAA,CAAQ,KAAA;AAAA,EACtC;AAAA;AAAA,EAGA,IAAY,YAAA,GAAwB;AACjC,IAAA,OAAO,IAAA,CAAK,iBAAA;AAAA,EACf;AAAA;AAAA,EAIA,KAAA,GAAc;AACX,IAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,aAAA,GAAgB,QAAQ,CAAA;AAC7C,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,EAAA,EAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAA,GAAO,CAAC,CAAC,CAAA,CAAA,CAAG,CAAA;AAG7D,IAAA,OAAA,CAAQ,KAAA,CAAM,YAAY,MAAM,CAAA;AAChC,IAAA,IAAI,QAAQ,KAAA,CAAM,KAAA,EAAO,OAAA,CAAQ,KAAA,CAAM,WAAW,IAAI,CAAA;AACtD,IAAA,OAAA,CAAQ,KAAA,CAAM,EAAA,CAAG,MAAA,EAAQ,IAAA,CAAK,MAAM,CAAA;AACpC,IAAA,OAAA,CAAQ,MAAM,MAAA,EAAO;AAErB,IAAA,OAAA,CAAQ,MAAA,CAAO,EAAA,CAAG,QAAA,EAAU,IAAA,CAAK,QAAQ,CAAA;AACzC,IAAA,OAAA,CAAQ,EAAA,CAAG,MAAA,EAAQ,IAAA,CAAK,eAAe,CAAA;AAGvC,IAAA,IAAI,KAAK,OAAA,CAAQ,KAAA,IAAS,IAAA,CAAK,OAAA,CAAQ,QAAQ,MAAA,EAAQ;AACpD,MAAA,IAAA,CAAK,iBAAiB,iBAAA,CAAkB,2BAAA,EAA6B,EAAE,KAAA,EAAO,KAAK,CAAA;AACnF,MAAA,IAAA,CAAK,eAAe,KAAA,CAAM;AAAA,YAAA,EAAA,iBAAiB,IAAI,IAAA,EAAK,EAAE,WAAA,EAAa,CAAA;AAAA,CAAQ,CAAA;AAAA,IAC9E;AAEA,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EACf;AAAA,EAEA,IAAA,GAAa;AACV,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACnB,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AACf,IAAA,IAAI,KAAK,WAAA,EAAa;AACnB,MAAA,YAAA,CAAa,KAAK,WAAW,CAAA;AAC7B,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,IACtB;AACA,IAAA,IAAA,CAAK,QAAA,EAAS;AACd,IAAA,IAAI,KAAK,cAAA,EAAgB;AACtB,MAAA,IAAA,CAAK,eAAe,GAAA,EAAI;AACxB,MAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AAAA,IACzB;AACA,IAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,IAAA,OAAA,CAAQ,MAAA,CAAO,cAAA,CAAe,QAAA,EAAU,IAAA,CAAK,QAAQ,CAAA;AACrD,IAAA,OAAA,CAAQ,KAAA,CAAM,cAAA,CAAe,MAAA,EAAQ,IAAA,CAAK,MAAM,CAAA;AAChD,IAAA,IAAI,QAAQ,KAAA,CAAM,KAAA,EAAO,OAAA,CAAQ,KAAA,CAAM,WAAW,KAAK,CAAA;AACvD,IAAA,OAAA,CAAQ,MAAM,KAAA,EAAM;AACpB,IAAA,OAAA,CAAQ,cAAA,CAAe,MAAA,EAAQ,IAAA,CAAK,eAAe,CAAA;AAAA,EACtD;AAAA;AAAA,EAIA,YAAY,KAAA,EAAyB;AAClC,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAU,UAAA,CAAW,IAAI,CAAA,GAAI,IAAA,GAAO,IAAA,CAAK,OAAA,EAAS,IAAA,EAAO,CAAA;AACpF,IAAA,IAAA,CAAK,KAAA,EAAM;AAAA,EACd;AAAA,EAEA,WAAA,GAAoB;AACjB,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,IAAA,IAAA,CAAK,aAAA,GAAgB,EAAA;AACrB,IAAA,IAAA,CAAK,YAAA,GAAe,CAAA;AACpB,IAAA,IAAA,CAAK,KAAA,EAAM;AAAA,EACd;AAAA,EAEA,YAAY,KAAA,EAAqB;AAC9B,IAAA,IAAA,CAAK,aAAA,IAAiB,KAAA;AACtB,IAAA,IAAA,CAAK,KAAA,EAAM;AAAA,EACd;AAAA,EAEA,SAAA,GAAkB;AACf,IAAA,IAAI,IAAA,CAAK,aAAA,CAAc,IAAA,EAAK,EAAG;AAC5B,MAAA,IAAA,CAAK,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,aAAa,OAAA,EAAS,IAAA,CAAK,eAAe,CAAA;AAAA,IACrE;AACA,IAAA,IAAA,CAAK,WAAA,GAAc,KAAA;AACnB,IAAA,IAAA,CAAK,aAAA,GAAgB,EAAA;AACrB,IAAA,IAAA,CAAK,KAAA,EAAM;AAAA,EACd;AAAA,EAEA,aAAA,CAAc,IAAY,IAAA,EAAoB;AAC3C,IAAA,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,WAAA,EAAa,EAAA,EAAI,IAAA,EAAM,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,KAAA,EAAO,CAAA;AACtE,IAAA,IAAA,CAAK,KAAA,EAAM;AAAA,EACd;AAAA,EAEA,YAAA,CAAa,IAAY,KAAA,EAAqB;AAC3C,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,YAAA,CAAa,EAAE,CAAA;AAC/B,IAAA,IAAI,EAAA,EAAI;AACL,MAAA,EAAA,CAAG,IAAA,IAAQ,KAAA;AACX,MAAA,IAAA,CAAK,KAAA,EAAM;AAAA,IACd;AAAA,EACH;AAAA,EAEA,YAAY,EAAA,EAAkB;AAC3B,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,YAAA,CAAa,EAAE,CAAA;AAC/B,IAAA,IAAI,EAAA,EAAI;AACL,MAAA,EAAA,CAAG,IAAA,GAAO,IAAA;AACV,MAAA,IAAA,CAAK,KAAA,EAAM;AAAA,IACd;AAAA,EACH;AAAA;AAAA,EAGA,iBAAiB,IAAA,EAAoB;AAClC,IAAA,IAAA,CAAK,MAAM,IAAA,CAAK,EAAE,MAAM,MAAA,EAAQ,OAAA,EAAS,MAAM,CAAA;AAC/C,IAAA,IAAA,CAAK,YAAA,GAAe,CAAA;AACpB,IAAA,IAAA,CAAK,KAAA,EAAM;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,iBAAA,CACG,OAAA,EACA,eAAA,EACA,MAAA,EACA,aAAA,EACK;AAEL,IAAA,IAAI,KAAK,WAAA,EAAa;AACnB,MAAA,IAAA,CAAK,WAAA,GAAc,KAAA;AACnB,MAAA,IAAA,CAAK,aAAA,GAAgB,EAAA;AAAA,IACxB;AAGA,IAAA,KAAA,IAAS,IAAI,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC9C,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AACzB,MAAA,IAAI,MAAA,IAAU,IAAA,IAAQ,IAAA,CAAK,IAAA,KAAS,WAAA,EAAa;AAC9C,QAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,QAAA,IAAA,CAAK,gBAAA,GAAmB,MAAA;AACxB,QAAA,IAAA,CAAK,aAAA,GAAgB,aAAA;AACrB,QAAA,IAAA,CAAK,eAAA,GAAkB,eAAA;AACvB,QAAA,IAAA,CAAK,KAAA,EAAM;AACX,QAAA;AAAA,MACH;AAAA,IACH;AAGA,IAAA,IAAA,CAAK,MAAM,IAAA,CAAK;AAAA,MACb,IAAA,EAAM,WAAA;AAAA,MACN,OAAA;AAAA,MACA,gBAAA,EAAkB,MAAA;AAAA,MAClB,aAAA;AAAA,MACA;AAAA,KACF,CAAA;AACD,IAAA,IAAA,CAAK,KAAA,EAAM;AAAA,EACd;AAAA,EAEA,cAAA,CAAe,UAAA,EAAoB,QAAA,EAAkB,OAAA,EAAuB;AACzE,IAAA,IAAA,CAAK,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,eAAe,UAAA,EAAY,QAAA,EAAU,SAAS,CAAA;AACtE,IAAA,IAAA,CAAK,KAAA,EAAM;AAAA,EACd;AAAA;AAAA,EAGA,iBAAiB,UAAA,EAA4B;AAC1C,IAAA,KAAA,IAAS,IAAI,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC9C,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AACzB,MAAA,IAAI,WAAW,IAAI,CAAA,IAAK,KAAK,EAAA,KAAO,UAAA,SAAmB,IAAA,CAAK,IAAA;AAAA,IAC/D;AACA,IAAA,OAAO,MAAA;AAAA,EACV;AAAA,EAEA,UAAU,GAAA,EAAmB;AAC1B,IAAA,IAAA,CAAK,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,UAAU,OAAA,EAAS,CAAA,OAAA,EAAU,GAAG,CAAA,CAAA,EAAI,CAAA;AAC5D,IAAA,IAAA,CAAK,KAAA,EAAM;AAAA,EACd;AAAA;AAAA;AAAA,EAKA,QAAA,CAAS,WAAyB,GAAA,EAAgB;AAC/C,IAAA,MAAM,QAAA,GAAW,YAAY,GAAG,CAAA;AAChC,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,IAAA,MAAM,KAAK,CAAA,EAAG,IAAA,CAAK,IAAI,QAAA,EAAU,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,GAAA,CAAI,UAAA,EAAY,CAAC,CAAA,CAAA,EAAI,KAAK,GAAA,CAAI,UAAA,EAAY,CAAC,CAAA,CAAA;AAGtF,IAAA,IAAI,KAAK,cAAA,EAAgB;AACtB,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,EAAE,EAAA,EAAI,GAAA,CAAI,WAAA,EAAY,EAAG,GAAA,EAAK,SAAA,EAAW,GAAG,QAAA,EAAU,CAAA;AACrF,MAAA,IAAA,CAAK,cAAA,CAAe,KAAA,CAAM,OAAA,GAAU,IAAI,CAAA;AAAA,IAC3C;AAGA,IAAA,MAAM,OAAA,GAAU,iBAAA,CAAkB,SAAA,EAAW,QAAQ,CAAA;AACrD,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI;AACD,MAAA,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,QAAA,EAAU,IAAA,EAAM,CAAC,CAAA;AAAA,IAC5C,CAAA,CAAA,MAAQ;AACL,MAAA,MAAA,GAAS,OAAO,QAAQ,CAAA;AAAA,IAC3B;AACA,IAAA,IAAA,CAAK,aAAa,IAAA,CAAK,EAAE,WAAW,OAAA,EAAS,MAAA,EAAQ,IAAI,CAAA;AAEzD,IAAA,IAAI,IAAA,CAAK,YAAA,CAAa,MAAA,GAAS,GAAA,EAAK;AACjC,MAAA,IAAA,CAAK,YAAA,GAAe,IAAA,CAAK,YAAA,CAAa,KAAA,CAAM,IAAI,CAAA;AAAA,IACnD;AACA,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,IAAA,IAAA,CAAK,KAAA,EAAM;AAAA,EACd;AAAA;AAAA,EAIQ,aAAa,EAAA,EAAsC;AACxD,IAAA,KAAA,IAAS,IAAI,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC9C,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AACzB,MAAA,IAAI,WAAW,IAAI,CAAA,IAAK,IAAA,CAAK,EAAA,KAAO,IAAI,OAAO,IAAA;AAAA,IAClD;AACA,IAAA,OAAO,MAAA;AAAA,EACV;AAAA,EAEQ,KAAA,GAAc;AACnB,IAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AACzB,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,IAAA,IAAA,CAAK,cAAA,EAAe;AAAA,EACvB;AAAA,EAEQ,kBAAkB,MAAY;AACnC,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,SAAS,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,cAAc,CAAA,EAAG,WAAW,CAAA,CAAE,CAAA;AAAA,EAC5E,CAAA;AAAA,EAEQ,gBAAA,GAAyB;AAC9B,IAAA,IAAA,CAAK,IAAA,GAAO,OAAA,CAAQ,MAAA,CAAO,IAAA,IAAQ,EAAA;AACnC,IAAA,IAAA,CAAK,IAAA,GAAO,OAAA,CAAQ,MAAA,CAAO,OAAA,IAAW,EAAA;AAAA,EACzC;AAAA;AAAA,EAGQ,SAAA,GAAoB;AACzB,IAAA,IAAI,CAAC,IAAA,CAAK,YAAA,EAAc,OAAO,IAAA,CAAK,IAAA;AAEpC,IAAA,OAAO,IAAA,CAAK,IAAI,EAAA,EAAI,IAAA,CAAK,MAAM,IAAA,CAAK,IAAA,GAAO,GAAG,CAAA,GAAI,CAAC,CAAA;AAAA,EACtD;AAAA;AAAA,EAGQ,UAAA,GAAqB;AAC1B,IAAA,IAAI,CAAC,IAAA,CAAK,YAAA,EAAc,OAAO,CAAA;AAC/B,IAAA,OAAO,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,SAAA,EAAU,GAAI,CAAA;AAAA,EACzC;AAAA,EAEQ,YAAA,GAAuB;AAC5B,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,EACnC;AAAA,EAEQ,QAAA,GAAmB;AACxB,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,EACnC;AAAA;AAAA,EAIQ,SAAS,KAAA,EAAqB;AACnC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,eAAA,EAAgB,CAAE,MAAA;AACrC,IAAA,MAAM,MAAM,IAAA,CAAK,GAAA,CAAI,GAAG,KAAA,GAAQ,IAAA,CAAK,cAAc,CAAA;AACnD,IAAA,IAAA,CAAK,eAAe,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,eAAe,KAAK,CAAA;AAC3D,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EACf;AAAA,EAEQ,WAAW,KAAA,EAAqB;AACrC,IAAA,IAAA,CAAK,eAAe,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,eAAe,KAAK,CAAA;AACzD,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EACf;AAAA,EAEQ,WAAA,GAAoB;AACzB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,eAAA,EAAgB,CAAE,MAAA;AACrC,IAAA,IAAA,CAAK,eAAe,IAAA,CAAK,GAAA,CAAI,GAAG,KAAA,GAAQ,IAAA,CAAK,cAAc,CAAA;AAC3D,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EACf;AAAA,EAEQ,cAAA,GAAuB;AAC5B,IAAA,IAAA,CAAK,YAAA,GAAe,CAAA;AACpB,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,MAAA,GAAS,CAAC,IAAA,KAAuB;AACtC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACnC,MAAA,MAAM,EAAA,GAAK,KAAK,CAAC,CAAA;AAGjB,MAAA,IAAI,KAAK,MAAA,EAAQ;AACd,QAAA,IAAA,CAAK,MAAA,IAAU,EAAA;AAEf,QAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG;AAC3B,UAAA,IAAI,OAAO,GAAA,EAAK;AAEb,YAAA,IAAA,CAAK,QAAA,EAAS;AAAA,UACjB;AACA,UAAA;AAAA,QACH;AAGA,QAAA,IAAI,WAAA,CAAY,IAAA,CAAK,EAAE,CAAA,EAAG;AACvB,UAAA,IAAA,CAAK,UAAU,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,EAAG,EAAE,GAAG,EAAE,CAAA;AAC3C,UAAA,IAAA,CAAK,QAAA,EAAS;AAAA,QACjB,CAAA,MAAA,IAAW,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,EAAA,EAAI;AACjC,UAAA,IAAA,CAAK,QAAA,EAAS;AAAA,QACjB;AACA,QAAA;AAAA,MACH;AAGA,MAAA,IAAI,OAAO,MAAA,EAAQ;AAChB,QAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,QAAA,IAAA,CAAK,QAAA,GAAW,WAAW,MAAM;AAE9B,UAAA,IAAA,CAAK,MAAA,GAAS,EAAA;AACd,UAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAAA,QACnB,GAAG,GAAG,CAAA;AACN,QAAA;AAAA,MACH;AAGA,MAAA,IAAA,CAAK,WAAW,EAAE,CAAA;AAAA,IACrB;AAAA,EACH,CAAA;AAAA,EAEQ,QAAA,GAAiB;AACtB,IAAA,IAAA,CAAK,MAAA,GAAS,EAAA;AACd,IAAA,IAAI,KAAK,QAAA,EAAU;AAChB,MAAA,YAAA,CAAa,KAAK,QAAQ,CAAA;AAC1B,MAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAAA,IACnB;AAAA,EACH;AAAA;AAAA,EAGQ,SAAA,CAAU,QAAgB,IAAA,EAAoB;AAEnD,IAAA,IAAI,OAAO,UAAA,CAAW,GAAG,MAAM,IAAA,KAAS,GAAA,IAAO,SAAS,GAAA,CAAA,EAAM;AAC3D,MAAA,IAAI,SAAS,GAAA,EAAK;AAClB,MAAA,MAAM,QAAQ,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA,CAAE,MAAM,GAAG,CAAA;AACvC,MAAA,IAAI,KAAA,CAAM,UAAU,CAAA,EAAG;AACpB,QAAA,MAAM,MAAA,GAAS,QAAA,CAAS,KAAA,CAAM,CAAC,GAAI,EAAE,CAAA;AACrC,QAAA,IAAI,MAAA,KAAW,EAAA,EAAI,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA;AAAA,aAAA,IACzB,MAAA,KAAW,EAAA,EAAI,IAAA,CAAK,UAAA,CAAW,CAAC,CAAA;AAAA,MAC5C;AACA,MAAA;AAAA,IACH;AAGA,IAAA,IAAI,CAAC,MAAA,EAAQ;AACV,MAAA,IAAI,SAAS,GAAA,EAAK;AACf,QAAA,IAAA,CAAK,SAAS,CAAC,CAAA;AACf,QAAA;AAAA,MACH;AACA,MAAA,IAAI,SAAS,GAAA,EAAK;AACf,QAAA,IAAA,CAAK,WAAW,CAAC,CAAA;AACjB,QAAA;AAAA,MACH;AAEA,MAAA,IAAI,SAAS,GAAA,EAAK;AACf,QAAA,IAAA,CAAK,WAAA,EAAY;AACjB,QAAA;AAAA,MACH;AACA,MAAA,IAAI,SAAS,GAAA,EAAK;AACf,QAAA,IAAA,CAAK,cAAA,EAAe;AACpB,QAAA;AAAA,MACH;AAAA,IACH;AAGA,IAAA,IAAI,SAAS,GAAA,EAAK;AACf,MAAA,IAAI,WAAW,GAAA,EAAK;AACjB,QAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,QAAA,EAAU,CAAA;AAC7B,QAAA;AAAA,MACH;AACA,MAAA,IAAI,WAAW,GAAA,EAAK;AACjB,QAAA,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,QAAA,EAAU,CAAA;AAC/B,QAAA;AAAA,MACH;AACA,MAAA,IAAI,WAAW,GAAA,EAAK;AACjB,QAAA,IAAA,CAAK,WAAA,EAAY;AACjB,QAAA;AAAA,MACH;AACA,MAAA,IAAI,WAAW,GAAA,EAAK;AACjB,QAAA,IAAA,CAAK,cAAA,EAAe;AACpB,QAAA;AAAA,MACH;AAAA,IACH;AAAA,EACH;AAAA;AAAA,EAGQ,WAAW,EAAA,EAAkB;AAClC,IAAA,MAAM,IAAA,GAAO,EAAA,CAAG,UAAA,CAAW,CAAC,CAAA;AAG5B,IAAA,IAAI,SAAS,CAAA,EAAM;AAChB,MAAA,IAAA,CAAK,IAAA,EAAK;AACV,MAAA,IAAA,CAAK,QAAQ,MAAA,EAAO;AACpB,MAAA;AAAA,IACH;AAGA,IAAA,IAAI,SAAS,CAAA,EAAM;AAChB,MAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,QAAA,EAAU,CAAA;AAC7B,MAAA;AAAA,IACH;AAGA,IAAA,IAAI,SAAS,CAAA,EAAM;AAChB,MAAA,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,QAAA,EAAU,CAAA;AAC/B,MAAA;AAAA,IACH;AAGA,IAAA,IAAI,SAAS,CAAA,EAAM;AAChB,MAAA,IAAA,CAAK,iBAAA,GAAoB,CAAC,IAAA,CAAK,iBAAA;AAC/B,MAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AACzB,MAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,MAAA,IAAA,CAAK,MAAA,EAAO;AACZ,MAAA;AAAA,IACH;AAGA,IAAA,IAAI,SAAS,EAAA,EAAM;AAChB,MAAA,IAAA,CAAK,aAAA,GAAgB,CAAC,IAAA,CAAK,aAAA;AAC3B,MAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AACzB,MAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,MAAA,IAAA,CAAK,MAAA,EAAO;AACZ,MAAA;AAAA,IACH;AAGA,IAAA,IAAI,SAAS,EAAA,EAAM;AAChB,MAAA,IAAA,CAAK,WAAA,EAAY;AACjB,MAAA;AAAA,IACH;AAGA,IAAA,IAAI,IAAA,KAAS,GAAA,IAAQ,IAAA,KAAS,CAAA,EAAM;AACjC,MAAA,IAAI,IAAA,CAAK,WAAA,CAAY,MAAA,GAAS,CAAA,EAAG;AAC9B,QAAA,IAAA,CAAK,WAAA,GAAc,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM,GAAG,EAAE,CAAA;AAC/C,QAAA,IAAA,CAAK,eAAA,EAAgB;AAAA,MACxB;AACA,MAAA;AAAA,IACH;AAGA,IAAA,IAAI,OAAO,EAAA,EAAM;AAGjB,IAAA,IAAA,CAAK,WAAA,IAAe,EAAA;AACpB,IAAA,IAAA,CAAK,eAAA,EAAgB;AAAA,EACxB;AAAA,EAEQ,WAAA,GAAoB;AACzB,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,WAAA,CAAY,IAAA,EAAK;AACnC,IAAA,IAAA,CAAK,WAAA,GAAc,EAAA;AACnB,IAAA,IAAI,CAAC,IAAA,EAAM;AACR,MAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,MAAA;AAAA,IACH;AACA,IAAA,IAAI,KAAK,WAAA,EAAY,KAAM,UAAU,IAAA,CAAK,WAAA,OAAkB,MAAA,EAAQ;AACjE,MAAA,IAAA,CAAK,IAAA,EAAK;AACV,MAAA,IAAA,CAAK,QAAQ,MAAA,EAAO;AACpB,MAAA;AAAA,IACH;AACA,IAAA,IAAA,CAAK,MAAM,IAAA,CAAK,EAAE,MAAM,MAAA,EAAQ,OAAA,EAAS,MAAM,CAAA;AAC/C,IAAA,IAAA,CAAK,YAAA,GAAe,CAAA;AACpB,IAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AACzB,IAAA,IAAA,CAAK,MAAA,EAAO;AACZ,IAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,IAAI,CAAA;AAAA,EAC3B;AAAA;AAAA,EAIQ,WAAW,MAAY;AAC5B,IAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,EAAA,EAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAA,GAAO,CAAC,CAAC,CAAA,CAAA,CAAG,CAAA;AAC7D,IAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AACzB,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EACf,CAAA;AAAA;AAAA,EAIQ,cAAA,GAAuB;AAC5B,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,WAAA,EAAa;AACvC,IAAA,IAAA,CAAK,WAAA,GAAc,WAAW,MAAM;AACjC,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,MAAA,IAAA,CAAK,MAAA,EAAO;AAAA,IACf,GAAG,EAAE,CAAA;AAAA,EACR;AAAA,EAEQ,eAAA,GAA4B;AACjC,IAAA,IAAI,CAAC,KAAK,iBAAA,EAAmB;AAC1B,MAAA,IAAA,CAAK,iBAAA,GAAoB,KAAK,iBAAA,EAAkB;AAAA,IACnD;AACA,IAAA,OAAO,IAAA,CAAK,iBAAA;AAAA,EACf;AAAA,EAEQ,aAAA,GAA0B;AAC/B,IAAA,IAAI,CAAC,KAAK,eAAA,EAAiB;AACxB,MAAA,IAAA,CAAK,eAAA,GAAkB,KAAK,eAAA,EAAgB;AAAA,IAC/C;AACA,IAAA,OAAO,IAAA,CAAK,eAAA;AAAA,EACf;AAAA,EAEQ,MAAA,GAAe;AACpB,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACnB,IAAA,IAAA,CAAK,gBAAA,EAAiB;AAEtB,IAAA,MAAM,EAAA,GAAK,KAAK,YAAA,EAAa;AAC7B,IAAA,MAAM,YAAA,GAAe,KAAK,eAAA,EAAgB;AAC1C,IAAA,MAAM,QAAQ,YAAA,CAAa,MAAA;AAG3B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,QAAQ,EAAE,CAAA;AACrC,IAAA,IAAI,IAAA,CAAK,YAAA,GAAe,MAAA,EAAQ,IAAA,CAAK,YAAA,GAAe,MAAA;AAGpD,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI,SAAS,EAAA,EAAI;AACd,MAAA,OAAA,GAAU,CAAC,GAAG,IAAI,KAAA,CAAc,EAAA,GAAK,KAAK,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA,EAAG,GAAG,YAAY,CAAA;AAAA,IACxE,CAAA,MAAO;AACJ,MAAA,MAAM,GAAA,GAAM,QAAQ,IAAA,CAAK,YAAA;AACzB,MAAA,MAAM,QAAQ,GAAA,GAAM,EAAA;AACpB,MAAA,OAAA,GAAU,YAAA,CAAa,KAAA,CAAM,KAAA,EAAO,GAAG,CAAA;AAAA,IAC1C;AAEA,IAAA,MAAM,GAAA,GAAgB,CAAC,WAAW,CAAA;AAElC,IAAA,IAAI,KAAK,YAAA,EAAc;AACpB,MAAA,IAAA,CAAK,iBAAA,CAAkB,GAAA,EAAK,OAAA,EAAS,EAAE,CAAA;AAAA,IAC1C,CAAA,MAAO;AACJ,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,EAAK;AAC1B,QAAA,GAAA,CAAI,IAAA,CAAK,MAAA,CAAO,CAAA,GAAI,CAAA,EAAG,CAAC,GAAG,OAAA,CAAQ,CAAC,CAAA,IAAK,EAAA,EAAI,SAAS,CAAA;AAAA,MACzD;AAAA,IACH;AAGA,IAAA,GAAA,CAAI,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,IAAA,GAAO,CAAA,EAAG,CAAC,CAAA,EAAG,IAAA,CAAK,cAAA,EAAe,EAAG,SAAS,CAAA;AAGnE,IAAA,GAAA,CAAI,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA,EAAG,IAAI,CAAA,IAAA,EAAO,KAAK,CAAA,CAAA,EAAI,IAAA,CAAK,WAAW,CAAA,EAAG,SAAS,CAAA,CAAE,CAAA;AAEpF,IAAA,GAAA,CAAI,KAAK,WAAW,CAAA;AACpB,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,EACpC;AAAA,EAEQ,iBAAA,CAAkB,GAAA,EAAe,WAAA,EAAuB,EAAA,EAAkB;AAC/E,IAAA,MAAM,EAAA,GAAK,KAAK,SAAA,EAAU;AAC1B,IAAA,MAAM,EAAA,GAAK,KAAK,UAAA,EAAW;AAC3B,IAAA,MAAM,SAAS,EAAA,GAAK,CAAA;AAGpB,IAAA,MAAM,UAAA,GAAa,KAAK,aAAA,EAAc;AACtC,IAAA,MAAM,aAAa,UAAA,CAAW,MAAA;AAC9B,IAAA,IAAI,YAAA;AACJ,IAAA,IAAI,cAAc,EAAA,EAAI;AACnB,MAAA,YAAA,GAAe,CAAC,GAAG,IAAI,KAAA,CAAc,EAAA,GAAK,UAAU,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA,EAAG,GAAG,UAAU,CAAA;AAAA,IAChF,CAAA,MAAO;AACJ,MAAA,YAAA,GAAe,UAAA,CAAW,KAAA,CAAM,UAAA,GAAa,EAAE,CAAA;AAAA,IAClD;AAEA,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,EAAK;AAC1B,MAAA,MAAM,WAAW,YAAA,CAAa,WAAA,CAAY,CAAC,CAAA,IAAK,IAAI,EAAE,CAAA;AACtD,MAAA,MAAM,YAAY,YAAA,CAAa,YAAA,CAAa,CAAC,CAAA,IAAK,IAAI,EAAE,CAAA;AACxD,MAAA,GAAA,CAAI,IAAA;AAAA,QACD,MAAA,CAAO,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA;AAAA,QACf,QAAA;AAAA,QACA,SAAA;AAAA;AAAA,QACA,MAAA,CAAO,CAAA,GAAI,CAAA,EAAG,MAAM,CAAA;AAAA,QACpB,CAAA,EAAG,GAAG,CAAA,MAAA,EAAS,KAAK,CAAA,CAAA;AAAA,QACpB;AAAA,OACH;AAEA,MAAA,GAAA,CAAI,KAAK,SAAS,CAAA;AAAA,IACrB;AAAA,EACH;AAAA,EAEQ,eAAA,GAAwB;AAC7B,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACZ,CAAA,EAAG,MAAA,CAAO,IAAA,CAAK,IAAA,EAAM,CAAC,CAAC,CAAA,EAAG,IAAI,CAAA,IAAA,EAAO,KAAK,CAAA,CAAA,EAAI,IAAA,CAAK,WAAW,GAAG,SAAS,CAAA;AAAA,KAC7E;AAAA,EACH;AAAA;AAAA,EAIQ,cAAA,GAAyB;AAC9B,IAAA,MAAM,QAAkB,EAAC;AAEzB,IAAA,IAAI,IAAA,CAAK,eAAe,CAAA,EAAG;AACxB,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,MAAA,EAAS,IAAA,CAAK,YAAY,CAAA,CAAE,CAAA;AAAA,IAC1C;AAEA,IAAA,MAAM,UAAA,GACH,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,UAAA,CAAW,CAAC,CAAA,IAAK,YAAA,CAAa,CAAC,CAAC,CAAA,IAAK,KAAK,OAAA,CAAQ,KAAA;AAC5E,IAAA,IAAI,UAAA,EAAY;AACb,MAAA,KAAA,CAAM,KAAK,CAAA,GAAA,EAAM,IAAA,CAAK,aAAA,GAAgB,UAAA,GAAa,SAAS,CAAA,CAAE,CAAA;AAAA,IACjE;AAEA,IAAA,IAAI,IAAA,CAAK,QAAQ,KAAA,EAAO;AACrB,MAAA,KAAA,CAAM,KAAK,CAAA,GAAA,EAAM,IAAA,CAAK,iBAAA,GAAoB,MAAA,GAAS,MAAM,CAAA,MAAA,CAAQ,CAAA;AAAA,IACpE;AAEA,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,MAAM,EAAE,CAAA;AAExC,IAAA,IAAI,CAAC,MAAM,MAAA,EAAQ;AAChB,MAAA,OAAO,CAAA,EAAG,IAAI,CAAA,EAAG,QAAA,CAAS,OAAO,SAAS,CAAC,GAAG,KAAK,CAAA,CAAA;AAAA,IACtD;AAEA,IAAA,MAAM,OAAA,GAAU,CAAA,CAAA,EAAI,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA;AACpC,IAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,SAAA,GAAY,QAAQ,MAAM,CAAA;AACrD,IAAA,MAAM,IAAA,GAAO,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,MAAA,GAAS,CAAC,CAAC,CAAA;AAC/C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,SAAS,IAAI,CAAA;AACvC,IAAA,OAAO,CAAA,EAAG,IAAI,CAAA,EAAG,QAAA,CAAS,OAAO,IAAI,CAAC,CAAA,EAAG,OAAO,GAAG,QAAA,CAAS,MAAA,CAAO,KAAK,CAAC,GAAG,KAAK,CAAA,CAAA;AAAA,EACpF;AAAA;AAAA,EAIQ,iBAAA,GAA8B;AACnC,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,MAAM,CAAA,GAAI,KAAK,SAAA,EAAU;AAEzB,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,KAAA,EAAO;AAC5B,MAAA,IAAI,UAAA,CAAW,IAAI,CAAA,EAAG;AACnB,QAAA,IAAA,CAAK,mBAAA,CAAoB,KAAA,EAAO,IAAA,EAAM,CAAC,CAAA;AAAA,MAC1C,CAAA,MAAA,IAAW,YAAA,CAAa,IAAI,CAAA,EAAG;AAC5B,QAAA,IAAA,CAAK,qBAAA,CAAsB,KAAA,EAAO,IAAA,EAAM,CAAC,CAAA;AAAA,MAC5C,CAAA,MAAO;AACJ,QAAA,IAAA,CAAK,kBAAA,CAAmB,KAAA,EAAO,IAAA,EAAM,CAAC,CAAA;AAAA,MACzC;AACA,MAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,IAChB;AAEA,IAAA,IAAI,KAAK,WAAA,EAAa;AACnB,MAAA,IAAA,CAAK,iBAAA,CAAkB,OAAO,CAAC,CAAA;AAAA,IAClC;AAEA,IAAA,OAAO,KAAA;AAAA,EACV;AAAA,EAEQ,mBAAA,CAAoB,KAAA,EAAiB,EAAA,EAAkB,KAAA,EAAqB;AACjF,IAAA,MAAM,MAAA,GAAS,EAAA,CAAG,IAAA,GAAO,QAAA,GAAW,SAAA;AACpC,IAAA,MAAM,OAAA,GAAU,CAAA,EAAA,EAAK,IAAI,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,EAAA,CAAG,IAAI,CAAA,EAAG,EAAA,CAAG,IAAA,GAAO,EAAA,GAAK,KAAK,GAAG,KAAK,CAAA,CAAA;AAE5E,IAAA,IAAI,CAAC,KAAK,aAAA,EAAe;AACtB,MAAA,KAAA,CAAM,KAAK,OAAO,CAAA;AAClB,MAAA;AAAA,IACH;AAEA,IAAA,KAAA,CAAM,KAAK,OAAO,CAAA;AAClB,IAAA,IAAI,GAAG,IAAA,EAAM;AACV,MAAA,IAAI,YAAY,EAAA,CAAG,IAAA;AACnB,MAAA,IAAI;AACD,QAAA,SAAA,GAAY,IAAA,CAAK,UAAU,IAAA,CAAK,KAAA,CAAM,GAAG,IAAI,CAAA,EAAG,MAAM,CAAC,CAAA;AAAA,MAC1D,CAAA,CAAA,MAAQ;AAAA,MAER;AACA,MAAA,MAAM,MAAA,GAAS,MAAA;AACf,MAAA,KAAA,MAAW,OAAA,IAAW,SAAA,CAAU,KAAA,CAAM,IAAI,CAAA,EAAG;AAC1C,QAAA,KAAA,MAAW,MAAM,IAAA,CAAK,QAAA,CAAS,SAAS,KAAA,GAAQ,MAAA,CAAO,MAAM,CAAA,EAAG;AAC7D,UAAA,KAAA,CAAM,IAAA,CAAK,GAAG,MAAM,CAAA,EAAG,IAAI,CAAA,EAAG,EAAE,CAAA,EAAG,KAAK,CAAA,CAAE,CAAA;AAAA,QAC7C;AAAA,MACH;AAAA,IACH;AAAA,EACH;AAAA,EAEQ,qBAAA,CAAsB,KAAA,EAAiB,EAAA,EAAoB,KAAA,EAAqB;AACrF,IAAA,IAAI,CAAC,KAAK,aAAA,EAAe;AAEtB,MAAA,MAAM,SAAS,KAAA,GAAQ,EAAA;AACvB,MAAA,MAAM,OAAA,GAAU,GAAG,OAAA,CAAQ,OAAA,CAAQ,OAAO,GAAG,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,MAAM,CAAA;AAC9D,MAAA,MAAM,YAAY,OAAA,CAAQ,MAAA,GAAS,EAAA,CAAG,OAAA,CAAQ,SAAS,KAAA,GAAQ,EAAA;AAC/D,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,IAAA,EAAO,IAAI,CAAA,OAAA,EAAU,EAAA,CAAG,QAAQ,CAAA,EAAA,EAAK,OAAO,CAAA,EAAG,SAAS,CAAA,EAAG,KAAK,CAAA,CAAE,CAAA;AAC7E,MAAA;AAAA,IACH;AAEA,IAAA,KAAA,CAAM,IAAA,CAAK,OAAO,IAAI,CAAA,OAAA,EAAU,GAAG,QAAQ,CAAA,QAAA,EAAW,KAAK,CAAA,CAAE,CAAA;AAC7D,IAAA,IAAI,YAAY,EAAA,CAAG,OAAA;AACnB,IAAA,IAAI;AACD,MAAA,SAAA,GAAY,IAAA,CAAK,UAAU,IAAA,CAAK,KAAA,CAAM,GAAG,OAAO,CAAA,EAAG,MAAM,CAAC,CAAA;AAAA,IAC7D,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,MAAM,MAAA,GAAS,QAAA;AACf,IAAA,KAAA,MAAW,UAAA,IAAc,SAAA,CAAU,KAAA,CAAM,IAAI,CAAA,EAAG;AAC7C,MAAA,KAAA,MAAW,MAAM,IAAA,CAAK,QAAA,CAAS,YAAY,KAAA,GAAQ,MAAA,CAAO,MAAM,CAAA,EAAG;AAChE,QAAA,KAAA,CAAM,IAAA,CAAK,GAAG,MAAM,CAAA,EAAG,IAAI,CAAA,EAAG,EAAE,CAAA,EAAG,KAAK,CAAA,CAAE,CAAA;AAAA,MAC7C;AAAA,IACH;AAAA,EACH;AAAA,EAEQ,kBAAA,CAAmB,KAAA,EAAiB,GAAA,EAAkB,KAAA,EAAqB;AAChF,IAAA,IAAI,GAAA,CAAI,SAAS,QAAA,EAAU;AACxB,MAAA,KAAA,MAAW,IAAA,IAAQ,GAAA,CAAI,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA,EAAG;AACzC,QAAA,KAAA,MAAW,MAAM,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,KAAA,GAAQ,CAAC,CAAA,EAAG;AAC9C,UAAA,KAAA,CAAM,KAAK,CAAA,EAAA,EAAK,IAAI,GAAG,EAAE,CAAA,EAAG,KAAK,CAAA,CAAE,CAAA;AAAA,QACtC;AAAA,MACH;AACA,MAAA;AAAA,IACH;AAEA,IAAA,MAAM,MAAA,GAAS,IAAI,IAAA,KAAS,MAAA;AAC5B,IAAA,MAAM,KAAA,GAAQ,MAAA,GAAS,CAAA,EAAG,IAAI,CAAA,IAAA,EAAO,KAAK,CAAA,CAAA,CAAA,GAAM,CAAA,EAAG,KAAK,CAAA,UAAA,EAAa,KAAK,CAAA,CAAA,CAAA;AAC1E,IAAA,MAAM,UAAA,GAAa,SAAS,CAAA,GAAI,EAAA;AAChC,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,MAAA,CAAO,UAAU,CAAA;AACpC,IAAA,IAAI,KAAA,GAAQ,IAAA;AAGZ,IAAA,MAAM,cAAA,GAAiB,IAAI,gBAAA,GACtB,GAAA,CAAI,QAAQ,OAAA,CAAQ,eAAA,EAAiB,EAAE,CAAA,GACvC,GAAA,CAAI,OAAA;AAET,IAAA,KAAA,MAAW,IAAA,IAAQ,cAAA,CAAe,KAAA,CAAM,IAAI,CAAA,EAAG;AAC5C,MAAA,KAAA,MAAW,MAAM,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,KAAA,GAAQ,UAAU,CAAA,EAAG;AACvD,QAAA,KAAA,CAAM,IAAA,CAAK,KAAA,GAAQ,KAAA,GAAQ,EAAA,GAAK,SAAS,EAAE,CAAA;AAC3C,QAAA,KAAA,GAAQ,KAAA;AAAA,MACX;AAAA,IACH;AAGA,IAAA,IAAI,IAAI,gBAAA,EAAkB;AACvB,MAAA,MAAM,WAAA,GAAc,kBAAA,CAAmB,GAAA,CAAI,gBAAA,EAAkB,IAAI,aAAa,CAAA;AAC9E,MAAA,KAAA,CAAM,IAAA,CAAK,GAAG,MAAM,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE,CAAA;AAGvD,MAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,GAAA,CAAI,OAAA,EAAS,IAAI,eAAe,CAAA;AAC9D,MAAA,IAAI,KAAA,EAAO;AACR,QAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA,EAAG;AACnC,UAAA,KAAA,MAAW,MAAM,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,KAAA,GAAQ,UAAU,CAAA,EAAG;AACvD,YAAA,KAAA,CAAM,IAAA,CAAK,GAAG,MAAM,CAAA,EAAG,eAAe,CAAA,EAAG,EAAE,CAAA,EAAG,KAAK,CAAA,CAAE,CAAA;AAAA,UACxD;AAAA,QACH;AAAA,MACH;AAAA,IACH;AAAA,EACH;AAAA,EAEQ,iBAAA,CAAkB,OAAiB,KAAA,EAAqB;AAC7D,IAAA,MAAM,KAAA,GAAQ,CAAA,EAAG,KAAK,CAAA,UAAA,EAAa,KAAK,CAAA,CAAA,CAAA;AACxC,IAAA,MAAM,UAAA,GAAa,EAAA;AACnB,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,MAAA,CAAO,UAAU,CAAA;AAEpC,IAAA,IAAI,CAAC,KAAK,aAAA,EAAe;AACtB,MAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAChB,MAAA;AAAA,IACH;AAEA,IAAA,IAAI,KAAA,GAAQ,IAAA;AACZ,IAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,aAAA,CAAc,KAAA,CAAM,IAAI,CAAA,EAAG;AAChD,MAAA,KAAA,MAAW,MAAM,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,KAAA,GAAQ,UAAU,CAAA,EAAG;AACvD,QAAA,KAAA,CAAM,IAAA,CAAK,KAAA,GAAQ,KAAA,GAAQ,EAAA,GAAK,SAAS,EAAE,CAAA;AAC3C,QAAA,KAAA,GAAQ,KAAA;AAAA,MACX;AAAA,IACH;AAAA,EACH;AAAA;AAAA,EAIQ,eAAA,GAA4B;AACjC,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,MAAM,EAAA,GAAK,KAAK,UAAA,EAAW;AAC3B,IAAA,IAAI,EAAA,IAAM,GAAG,OAAO,KAAA;AAEpB,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,YAAA,EAAc;AACpC,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,SAAA,KAAc,IAAA,GAAO,MAAA,GAAS,UAAA;AAClD,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,SAAA,KAAc,IAAA,GAAO,QAAA,GAAW,QAAA;AACpD,MAAA,MAAM,MAAA,GAAS,CAAA,EAAG,GAAG,CAAA,EAAG,KAAA,CAAM,EAAE,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,KAAK,CAAA,EAAG,KAAK,GAAG,KAAK,CAAA,CAAA,CAAA;AACjE,MAAA,MAAM,WAAA,GAAc,KAAA,CAAM,EAAA,CAAG,MAAA,GAAS,CAAA;AAEtC,MAAA,IAAI,CAAC,KAAK,aAAA,EAAe;AAEtB,QAAA,MAAM,aAAa,EAAA,GAAK,WAAA;AACxB,QAAA,MAAM,WAAA,GAAc,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,GAAG,UAAU,CAAA;AACrD,QAAA,KAAA,CAAM,IAAA,CAAK,GAAG,MAAM,CAAA,EAAG,KAAK,CAAA,EAAG,WAAW,CAAA,EAAG,KAAK,CAAA,CAAE,CAAA;AAAA,MACvD,CAAA,MAAO;AAEJ,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,EAAG,KAAK,GAAG,KAAA,CAAM,OAAO,CAAA,EAAG,KAAK,CAAA,CAAE,CAAA;AACtD,QAAA,MAAM,MAAA,GAAS,GAAA,CAAI,MAAA,CAAO,WAAW,CAAA;AACrC,QAAA,KAAA,MAAW,UAAA,IAAc,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,EAAG;AAChD,UAAA,KAAA,MAAW,MAAM,IAAA,CAAK,QAAA,CAAS,UAAA,EAAY,EAAA,GAAK,WAAW,CAAA,EAAG;AAC3D,YAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,EAAG,KAAK,CAAA,EAAG,GAAG,CAAA,EAAG,EAAE,CAAA,EAAG,KAAK,CAAA,CAAE,CAAA;AAAA,UACpD;AAAA,QACH;AACA,QAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,MAChB;AAAA,IACH;AAEA,IAAA,OAAO,KAAA;AAAA,EACV;AAAA;AAAA,EAIQ,QAAA,CAAS,MAAc,QAAA,EAA4B;AACxD,IAAA,IAAI,QAAA,IAAY,GAAG,QAAA,GAAW,CAAA;AAC9B,IAAA,IAAI,CAAC,IAAA,EAAM,OAAO,CAAC,EAAE,CAAA;AACrB,IAAA,IAAI,IAAA,CAAK,MAAA,IAAU,QAAA,EAAU,OAAO,CAAC,IAAI,CAAA;AAEzC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC5B,IAAA,MAAM,SAAmB,EAAC;AAC1B,IAAA,IAAI,OAAA,GAAU,EAAA;AAEd,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACvB,MAAA,IAAI,CAAC,OAAA,EAAS;AACX,QAAA,OAAA,GAAU,IAAA;AAAA,MACb,WAAW,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,IAAA,CAAK,UAAU,QAAA,EAAU;AACtD,QAAA,OAAA,IAAW,GAAA,GAAM,IAAA;AAAA,MACpB,CAAA,MAAO;AACJ,QAAA,MAAA,CAAO,KAAK,OAAO,CAAA;AACnB,QAAA,OAAA,GAAU,IAAA;AAAA,MACb;AAAA,IACH;AACA,IAAA,IAAI,OAAA,EAAS,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA;AAEhC,IAAA,OAAO,MAAA,CAAO,MAAA,GAAS,MAAA,GAAS,CAAC,EAAE,CAAA;AAAA,EACtC;AACH,CAAA;AAIA,SAAS,KAAK,CAAA,EAAmB;AAC9B,EAAA,OAAO,IAAI,EAAA,GAAK,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,GAAK,OAAO,CAAC,CAAA;AACrC;AAGA,SAAS,YAAA,CAAa,GAAW,OAAA,EAAyB;AACvD,EAAA,IAAI,OAAA,IAAW,GAAG,OAAO,EAAA;AACzB,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,OAAO,CAAA,GAAI,CAAA,CAAE,MAAA,IAAU,OAAA,GAAU,OAAA,EAAS;AACvC,IAAA,IAAI,CAAA,CAAE,CAAC,CAAA,KAAM,MAAA,EAAQ;AAElB,MAAA,MAAM,GAAA,GAAM,CAAA,CAAE,OAAA,CAAQ,GAAA,EAAK,CAAC,CAAA;AAC5B,MAAA,IAAI,QAAQ,EAAA,EAAI;AACb,QAAA,CAAA,GAAI,GAAA,GAAM,CAAA;AAAA,MACb,CAAA,MAAO;AACJ,QAAA,CAAA,EAAA;AAAA,MACH;AAAA,IACH,CAAA,MAAO;AACJ,MAAA,OAAA,EAAA;AACA,MAAA,CAAA,EAAA;AAAA,IACH;AAAA,EACH;AAEA,EAAA,OAAO,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,GAAI,KAAA;AAC1B;AAGA,SAAS,YAAY,GAAA,EAAe;AACjC,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,UAAU,OAAO,GAAA;AAC5C,EAAA,MAAM,KAAA,GAAQ,EAAE,GAAG,GAAA,EAAI;AAEvB,EAAA,IAAI,KAAA,CAAM,SAAS,QAAA,IAAY,KAAA,CAAM,SAAS,OAAO,KAAA,CAAM,UAAU,QAAA,EAAU;AAC5E,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,IAAQ,EAAA;AAC3B,IAAA,IAAI,IAAA,KAAS,aAAA,IAAiB,KAAA,CAAM,KAAA,CAAM,IAAA,EAAM;AAC7C,MAAA,KAAA,CAAM,QAAQ,EAAE,GAAG,KAAA,CAAM,KAAA,EAAO,MAAM,SAAA,EAAU;AAAA,IACnD;AAAA,EACH;AACA,EAAA,OAAO,KAAA;AACV;AAGA,SAAS,iBAAA,CAAkB,YAA0B,GAAA,EAAkB;AACpE,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,QAAQ,QAAA,EAAU,OAAO,OAAO,GAAG,CAAA;AAEtD,EAAA,IAAI,GAAA,CAAI,SAAS,QAAA,EAAU;AACxB,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,IAAQ,GAAA;AAEzB,IAAA,IAAI,IAAA,KAAS,eAAe,OAAO,IAAA;AAEnC,IAAA,IAAI,GAAA,CAAI,KAAA,IAAS,OAAO,GAAA,CAAI,UAAU,QAAA,EAAU;AAC7C,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA;AAClC,MAAA,IAAI,IAAA,CAAK,UAAU,CAAA,EAAG;AACnB,QAAA,OAAO,GAAG,IAAI,CAAA,EAAA,EAAK,IAAA,CAAK,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,MACrC;AACA,MAAA,OAAO,CAAA,EAAG,IAAI,CAAA,EAAA,EAAK,IAAA,CAAK,MAAM,CAAA,MAAA,CAAA;AAAA,IACjC;AACA,IAAA,OAAO,IAAA;AAAA,EACV;AAGA,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,IAAQ,GAAA;AACzB,EAAA,IAAI,IAAI,KAAA,EAAO;AACZ,IAAA,MAAM,OAAA,GAAU,GAAA,CAAI,KAAA,CAAM,MAAA,GAAS,EAAA,GAAK,GAAA,CAAI,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,KAAA,GAAQ,GAAA,CAAI,KAAA;AAC7E,IAAA,OAAO,CAAA,EAAG,IAAI,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA,CAAA;AAAA,EAC7B;AACA,EAAA,IAAI,IAAI,YAAA,EAAc;AACnB,IAAA,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,GAAA,CAAI,YAAY,CAAA,CAAA;AAAA,EACrC;AACA,EAAA,OAAO,IAAA;AACV;ACphCA,IAAM,WAAA,GAAc,IAAA;AAEpB,IAAM,eAAA,GAAkB,IAAA;AASjB,SAAS,iBAAA,GAA6B;AAC1C,EAAA,IAAI;AACD,IAAA,QAAA,CAAS,WAAA,EAAa,EAAE,KAAA,EAAO,MAAA,EAAQ,CAAA;AACvC,IAAA,OAAO,IAAA;AAAA,EACV,CAAA,CAAA,MAAQ;AACL,IAAA,OAAO,KAAA;AAAA,EACV;AACH;AAGA,eAAsB,gBAAA,GAA2C;AAC9D,EAAA,OAAO,YAAY,KAAK,CAAA;AAC3B;AAGA,eAAsB,iBAAA,GAA4C;AAC/D,EAAA,OAAO,YAAY,MAAM,CAAA;AAC5B;AAEA,SAAS,YAAY,OAAA,EAAyC;AAC3D,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC7B,IAAA,IAAI;AAED,MAAA,MAAM,IAAA,GAAO,SAAA,CAAU,OAAA,EAAS,CAAC,gBAAgB,CAAA,EAAG;AAAA,QACjD,QAAA,EAAU,OAAA;AAAA,QACV,KAAA,EAAO,CAAC,QAAA,EAAU,MAAA,EAAQ,MAAM,CAAA;AAAA,QAChC,OAAA,EAAS;AAAA,OACX,CAAA;AAED,MAAA,MAAM,MAAA,GAAA,CAAU,IAAA,CAAK,MAAA,IAAU,EAAA,KAAO,KAAK,MAAA,IAAU,EAAA,CAAA;AAErD,MAAA,MAAM,UAAyB,EAAC;AAChC,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAC/B,MAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AAGvB,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,+CAA+C,CAAA;AACxE,QAAA,IAAI,SAAS,KAAA,CAAM,CAAC,CAAA,IAAK,KAAA,CAAM,CAAC,CAAA,EAAG;AAChC,UAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,YACV,EAAA,EAAI,MAAM,CAAC,CAAA;AAAA,YACX,IAAA,EAAM,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,EAAK;AAAA,YACpB,SAAA,EAAW,QAAQ,MAAA,KAAW;AAAA;AAAA,WAChC,CAAA;AAAA,QACJ;AAAA,MACH;AAGA,MAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACvB,QAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,EAAA,EAAI,SAAA,EAAW,MAAM,gBAAA,EAAkB,SAAA,EAAW,MAAM,CAAA;AAAA,MAC1E;AAEA,MAAA,OAAA,CAAQ,OAAO,CAAA;AAAA,IAClB,CAAA,CAAA,MAAQ;AAEL,MAAA,OAAA,CAAQ,CAAC,EAAE,EAAA,EAAI,SAAA,EAAW,MAAM,gBAAA,EAAkB,SAAA,EAAW,IAAA,EAAM,CAAC,CAAA;AAAA,IACvE;AAAA,EACH,CAAC,CAAA;AACJ;AAGA,eAAsB,YAAA,CAAa,SAAwB,KAAA,EAAqC;AAC7F,EAAA,IAAI,OAAA,CAAQ,UAAU,CAAA,EAAG;AACtB,IAAA,OAAO,QAAQ,CAAC,CAAA;AAAA,EACnB;AAEA,EAAA,MAAM,KAAcC,QAAA,CAAA,eAAA,CAAgB;AAAA,IACjC,OAAO,OAAA,CAAQ,KAAA;AAAA,IACf,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,QAAA,EAAU;AAAA,GACZ,CAAA;AAED,EAAA,OAAA,CAAQ,OAAO,KAAA,CAAM;AAAA,EAAA,EAAO,KAAK,CAAA;AAAA,CAAK,CAAA;AACtC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACtC,IAAA,MAAM,GAAA,GAAM,QAAQ,CAAC,CAAA;AACrB,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,SAAA,GAAY,YAAA,GAAe,EAAA;AAC9C,IAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA,IAAA,EAAO,CAAA,GAAI,CAAC,CAAA,EAAA,EAAK,GAAA,CAAI,IAAI,CAAA,EAAG,MAAM;AAAA,CAAI,CAAA;AAAA,EAC9D;AAEA,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC7B,IAAA,MAAM,aAAa,OAAA,CAAQ,SAAA,CAAU,CAAC,CAAA,KAAM,EAAE,SAAS,CAAA;AACvD,IAAA,MAAM,UAAA,GAAa,UAAA,IAAc,CAAA,GAAI,UAAA,GAAa,CAAA,GAAI,CAAA;AAEtD,IAAA,EAAA,CAAG,QAAA,CAAS,CAAA,UAAA,EAAa,UAAU,CAAA,GAAA,CAAA,EAAO,CAAC,MAAA,KAAW;AACnD,MAAA,EAAA,CAAG,KAAA,EAAM;AACT,MAAA,MAAM,GAAA,GAAM,OAAO,IAAA,EAAK,GAAI,SAAS,MAAA,CAAO,IAAA,EAAK,EAAG,EAAE,CAAA,GAAI,UAAA;AAC1D,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG,GAAA,GAAM,CAAC,CAAC,CAAA;AAC7D,MAAA,OAAA,CAAQ,OAAA,CAAQ,GAAG,CAAE,CAAA;AAAA,IACxB,CAAC,CAAA;AAAA,EACJ,CAAC,CAAA;AACJ;AAMO,IAAM,aAAN,MAAiB;AAAA,EACb,OAAA,GAA+B,IAAA;AAAA,EAC/B,MAAA;AAAA,EACA,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA;AAAA,EAE/B,YAAY,MAAA,EAAiC;AAC1C,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EACjB;AAAA;AAAA,EAGA,MAAM,QAAA,EAAyB;AAC5B,IAAA,MAAM,IAAA,GAAO;AAAA,MACV,IAAA;AAAA;AAAA,MACA,IAAA;AAAA,MACA,KAAA;AAAA;AAAA,MACA,IAAA;AAAA,MACA,OAAO,WAAW,CAAA;AAAA,MAClB,IAAA;AAAA,MACA,gBAAA;AAAA,MACA,IAAA;AAAA,MACA,IAAA;AAAA;AAAA,MACA,IAAA;AAAA,MACA,GAAA;AAAA;AAAA,MACA,IAAA;AAAA;AAAA,MACA;AAAA;AAAA,KACH;AAEA,IAAA,MAAM,GAAA,GAAM,EAAE,GAAG,OAAA,CAAQ,GAAA,EAAI;AAC7B,IAAA,IAAI,QAAA,IAAY,aAAa,SAAA,EAAW;AACrC,MAAA,GAAA,CAAI,QAAA,GAAW,QAAA;AAAA,IAClB;AAEA,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA,CAAM,KAAA,EAAO,IAAA,EAAM;AAAA,MAC/B,GAAA;AAAA,MACA,KAAA,EAAO,CAAC,QAAA,EAAU,MAAA,EAAQ,MAAM;AAAA,KAClC,CAAA;AAED,IAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,EAAA,CAAG,MAAA,EAAQ,CAAC,IAAA,KAAiB;AAE/C,MAAA,IAAA,CAAK,SAAS,MAAA,CAAO,MAAA,CAAO,CAAC,IAAA,CAAK,MAAA,EAAQ,IAAI,CAAC,CAAA;AAC/C,MAAA,OAAO,IAAA,CAAK,MAAA,CAAO,MAAA,IAAU,eAAA,EAAiB;AAC3C,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,GAAG,eAAe,CAAA;AACrD,QAAA,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,eAAe,CAAA;AAClD,QAAA,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,MACjC;AAAA,IACH,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,EAAA,CAAG,MAAA,EAAQ,CAAC,IAAA,KAAiB;AAE/C,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,EAAS,CAAE,IAAA,EAAK;AACjC,MAAA,IAAI,GAAA,IAAO,CAAC,GAAA,CAAI,QAAA,CAAS,MAAM,CAAA,EAAG;AAC/B,QAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,MAAA,EAAS,GAAG;AAAA,CAAI,CAAA;AAAA,MACxC;AAAA,IACH,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,OAAA,CAAQ,EAAA,CAAG,OAAA,EAAS,CAAC,GAAA,KAAQ;AAC/B,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,qBAAA,EAAwB,GAAA,CAAI,OAAO;AAAA,CAAI,CAAA;AAAA,IAC/D,CAAC,CAAA;AAAA,EACJ;AAAA;AAAA,EAGA,IAAA,GAAa;AACV,IAAA,IAAI,KAAK,OAAA,EAAS;AACf,MAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,SAAS,CAAA;AAC3B,MAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AAAA,IAClB;AACA,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA;AAAA,EAC/B;AACH,CAAA;AAcO,IAAM,WAAA,GAAN,cAA0BC,YAAAA,CAAa;AAAA,EACnC,OAAA,GAA+B,IAAA;AAAA,EAC/B,QAAA;AAAA;AAAA;AAAA,EAIA,SAAA,GAAY,KAAA;AAAA;AAAA,EAGZ,gBAA0B,EAAC;AAAA,EAC3B,YAAA,GAAe,CAAA;AAAA;AAAA,EAGf,QAAiD,EAAC;AAAA;AAAA,EAGlD,gBAAA;AAAA,EACA,iBAAA,GAAoB,CAAA;AAAA;AAAA,EACpB,YAAA,GAAe,CAAA;AAAA;AAAA,EAEvB,YAAY,QAAA,EAAmB;AAC5B,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAAA,EACnB;AAAA;AAAA,EAGA,IAAI,SAAA,GAAqB;AACtB,IAAA,OAAO,IAAA,CAAK,OAAA,KAAY,IAAA,IAAQ,IAAA,CAAK,MAAM,MAAA,GAAS,CAAA;AAAA,EACvD;AAAA;AAAA,EAGA,IAAI,gBAAA,GAAuC;AACxC,IAAA,OAAO,IAAA,CAAK,gBAAA;AAAA,EACf;AAAA;AAAA,EAGA,IAAY,iBAAA,GAA4B;AAErC,IAAA,OAAQ,IAAA,CAAK,YAAA,IAAgB,WAAA,GAAc,CAAA,CAAA,GAAM,GAAA;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,iBAAA,GAAmC;AAChC,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,iBAAA,KAAsB,GAAG,OAAO,IAAA;AAC1D,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,EAAI,GAAI,IAAA,CAAK,iBAAA;AAClC,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,IAAA,CAAK,iBAAiB,CAAA;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,KAAA,EAAqB;AACxB,IAAA,IAAI,IAAA,CAAK,OAAA,IAAW,CAAC,IAAA,CAAK,SAAA,EAAW;AAElC,MAAA,IAAA,CAAK,aAAA,CAAc,KAAK,KAAK,CAAA;AAC7B,MAAA,IAAA,CAAK,gBAAgB,KAAA,CAAM,MAAA;AAC3B,MAAA;AAAA,IACH;AAEA,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AAChB,MAAA,IAAA,CAAK,eAAA,EAAgB;AAAA,IACxB;AAEA,IAAA,IAAA,CAAK,OAAA,CAAS,KAAA,CAAO,KAAA,CAAM,KAAK,CAAA;AAChC,IAAA,IAAA,CAAK,gBAAgB,KAAA,CAAM,MAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAY,SAAA,EAA0B;AACnC,IAAA,IAAI,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,OAAA,EAAS;AACjC,MAAA,IAAA,CAAK,gBAAA,GAAmB,SAAA;AACxB,MAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AACjB,MAAA,IAAA,CAAK,OAAA,CAAQ,MAAO,GAAA,EAAI;AAAA,IAC3B,CAAA,MAAA,IAAW,IAAA,CAAK,aAAA,CAAc,MAAA,GAAS,CAAA,EAAG;AACvC,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,aAAa,CAAA;AAC9C,MAAA,IAAA,CAAK,gBAAgB,EAAC;AACtB,MAAA,IAAA,CAAK,YAAA,GAAe,CAAA;AACpB,MAAA,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,EAAE,KAAA,EAAO,WAAW,CAAA;AAAA,IACvC;AAAA,EACH;AAAA;AAAA,EAGA,IAAA,GAAa;AACV,IAAA,IAAA,CAAK,gBAAgB,EAAC;AACtB,IAAA,IAAA,CAAK,YAAA,GAAe,CAAA;AACpB,IAAA,IAAA,CAAK,QAAQ,EAAC;AACd,IAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AAEjB,IAAA,MAAM,UAAA,GAAa,KAAK,OAAA,KAAY,IAAA;AACpC,IAAA,IAAI,KAAK,OAAA,EAAS;AACf,MAAA,IAAI;AACD,QAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,OAAA,EAAQ;AAC5B,QAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,SAAS,CAAA;AAAA,MAC9B,CAAA,CAAA,MAAQ;AAAA,MAER;AACA,MAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AAAA,IAClB;AACA,IAAA,IAAA,CAAK,gBAAA,GAAmB,MAAA;AACxB,IAAA,IAAA,CAAK,iBAAA,GAAoB,CAAA;AACzB,IAAA,IAAA,CAAK,YAAA,GAAe,CAAA;AACpB,IAAA,IAAI,UAAA,EAAY;AACb,MAAA,IAAA,CAAK,KAAK,MAAM,CAAA;AAAA,IACnB;AAAA,EACH;AAAA;AAAA,EAGQ,eAAA,GAAwB;AAC7B,IAAA,IAAA,CAAK,YAAA,GAAe,CAAA;AACpB,IAAA,IAAA,CAAK,gBAAA,GAAmB,MAAA;AAExB,IAAA,MAAM,IAAA,GAAO;AAAA,MACV,IAAA;AAAA;AAAA,MACA,IAAA;AAAA,MACA,KAAA;AAAA,MACA,IAAA;AAAA,MACA,OAAO,WAAW,CAAA;AAAA,MAClB,IAAA;AAAA,MACA,gBAAA;AAAA,MACA,IAAA;AAAA,MACA,IAAA;AAAA,MACA,IAAA;AAAA,MACA,GAAA;AAAA,MACA,IAAA;AAAA;AAAA,MACA;AAAA;AAAA,KACH;AAEA,IAAA,MAAM,GAAA,GAAM,EAAE,GAAG,OAAA,CAAQ,GAAA,EAAI;AAC7B,IAAA,IAAI,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,QAAA,KAAa,SAAA,EAAW;AAC/C,MAAA,GAAA,CAAI,WAAW,IAAA,CAAK,QAAA;AAAA,IACvB;AAEA,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,MAAA,EAAQ,IAAA,EAAM;AAAA,MAC9B,GAAA;AAAA,MACA,KAAA,EAAO,CAAC,MAAA,EAAQ,MAAA,EAAQ,MAAM;AAAA,KAChC,CAAA;AAED,IAAA,IAAA,CAAK,EAAA,CAAG,OAAA,EAAS,CAAC,GAAA,KAAQ;AACvB,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,wBAAA,EAA2B,GAAA,CAAI,OAAO;AAAA,CAAI,CAAA;AAAA,IAClE,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,EAAA,CAAG,MAAA,EAAQ,CAAC,IAAA,EAAM,OAAA,KAAY;AAEhC,MAAA,IAAI,IAAA,KAAS,IAAA,IAAQ,IAAA,KAAS,CAAA,IAAK,SAAS,GAAA,EAAK;AAC9C,QAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,8BAAA,EAAiC,IAAI;AAAA,CAAI,CAAA;AAAA,MACjE;AACA,MAAA,IAAI,IAAA,CAAK,YAAY,IAAA,EAAM;AACxB,QAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,QAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AACjB,QAAA,IAAI,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AACxB,UAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,KAAA,EAAM;AAC9B,UAAA,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,SAAS,CAAA;AAAA,QAC7C,CAAA,MAAO;AACJ,UAAA,IAAA,CAAK,KAAK,MAAM,CAAA;AAAA,QACnB;AAAA,MACH;AAAA,IACH,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,MAAA,EAAQ,EAAA,CAAG,MAAA,EAAQ,CAAC,IAAA,KAAiB;AACvC,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,EAAS,CAAE,IAAA,EAAK;AACjC,MAAA,IAAI,GAAA,EAAK;AACN,QAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,aAAA,EAAgB,GAAG;AAAA,CAAI,CAAA;AAAA,MAC/C;AAAA,IACH,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,QAAQ,MAAA,EAAO;AAEpB,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,IAAA,IAAA,CAAK,iBAAA,GAAoB,KAAK,GAAA,EAAI;AAClC,IAAA,IAAA,CAAK,KAAK,SAAS,CAAA;AAAA,EACtB;AAAA;AAAA,EAGQ,UAAA,CAAW,OAAe,SAAA,EAA0B;AACzD,IAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,IAAA,IAAA,CAAK,gBAAA,GAAmB,SAAA;AACxB,IAAA,IAAA,CAAK,OAAA,CAAS,KAAA,CAAO,KAAA,CAAM,KAAK,CAAA;AAChC,IAAA,IAAA,CAAK,eAAe,KAAA,CAAM,MAAA;AAC1B,IAAA,IAAA,CAAK,OAAA,CAAS,MAAO,GAAA,EAAI;AACzB,IAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AAAA,EACpB;AACH,CAAA;;;AC9UA,eAAsB,cAAA,CACnB,SACA,IAAA,EACc;AACd,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAC,IAAA,CAAK,KAAA;AACrB,EAAA,MAAM,OAAA,GAAU,CAAC,CAAC,IAAA,CAAK,KAAA;AACvB,EAAA,MAAM,UAAA,GAAa,CAAC,CAAC,IAAA,CAAK,QAAA,IAAY,OAAA;AACtC,EAAA,MAAM,UAAU,OAAO,IAAA,CAAK,OAAA,KAAY,QAAA,GAAW,KAAK,OAAA,GAAU,MAAA;AAClE,EAAA,MAAM,WAAA,GAAc,CAAC,CAAC,IAAA,CAAK,cAAc,CAAA;AAEzC,EAAA,IAAI,IAAA,CAAK,cAAc,CAAA,EAAG;AACvB,IAAA,MAAM,gBAAA,EAAiB;AACvB,IAAA;AAAA,EACH;AAEA,EAAA,IAAI,CAAC,OAAA,IAAW,CAAC,OAAA,CAAQ,MAAM,KAAA,EAAO;AACnC,IAAA,MAAM,IAAI,QAAA;AAAA,MACP;AAAA,KACH;AAAA,EACH;AAEA,EAAA,MAAM,UAAA,GAAa,CAAC,CAAC,IAAA,CAAK,aAAa,CAAA,IAAK,CAAC,CAAC,OAAA,CAAQ,UAAA;AACtD,EAAA,IAAI,OAAA,EAAS;AACV,IAAA,MAAM,qBAAA,CAAsB,OAAA,EAAS,OAAA,EAAS,KAAA,EAAO,aAAa,UAAU,CAAA;AAAA,EAC/E,WAAW,OAAA,EAAS;AACjB,IAAA,MAAM,iBAAiB,OAAA,EAAS,OAAA,CAAQ,IAAI,CAAA,EAAG,MAAM,KAAK,CAAA;AAAA,EAC7D,WAAW,UAAA,EAAY;AACpB,IAAA,MAAM,mBAAA,CAAoB,OAAA,EAAS,OAAA,CAAQ,IAAI,GAAG,KAAK,CAAA;AAAA,EAC1D,CAAA,MAAO;AACJ,IAAA,MAAM,sBAAA,CAAuB,OAAA,EAAS,KAAA,EAAO,WAAA,EAAa,UAAU,CAAA;AAAA,EACvE;AACH;AAEO,SAAS,QAAQ,IAAA,EAAgD;AACrE,EAAA,OAAQ,OAAO,IAAA,CAAK,GAAA,KAAQ,QAAA,GAAW,KAAK,GAAA,GAAM,QAAA;AACrD;AAIA,eAAe,sBACZ,OAAA,EACA,OAAA,EACA,OACA,WAAA,GAAuB,KAAA,EACvB,aAAsB,KAAA,EACR;AACd,EAAA,MAAM,UAAA,GAAa,IAAI,UAAA,CAAW;AAAA,IAC/B,OAAA,EAAS,OAAA,CAAQ,GAAA,CAAI,SAAA,CAAU,MAAA;AAAA,IAC/B,eAAe,OAAA,CAAQ,aAAA;AAAA,IACvB,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,aAAa,OAAA,CAAQ,eAAA;AAAA,IACrB,WAAA,EAAa,QAAQ,GAAA,CAAI,WAAA;AAAA,IACzB,KAAA;AAAA,IACA,OAAO,OAAA,CAAQ,KAAA;AAAA,IACf,YAAY,OAAA,CAAQ;AAAA,GACtB,CAAA;AAMD,EAAA,MAAM,OAAA,GAAU,CAAC,KAAA,KAA4C;AAC1D,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,EAAM,WAAA,EAAY,IAAK,EAAA;AAC1C,IAAA,IAAI,SAAS,iBAAA,EAAmB;AAC7B,MAAA,MAAM,IAAA,GACF,KAAA,CAA8B,YAAA,IAC9B,KAAA,CAA8B,IAAA,IAC/B,EAAA;AACH,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,GAAA,EAAM,IAAI,CAAA;AAAA,CAAK,CAAA;AAAA,IACvC;AAAA,EACH,CAAA;AAEA,EAAA,MAAM,EAAE,UAAA,EAAY,YAAA,EAAa,GAAI,MAAM,oBAAA;AAAA,IACxC,UAAA;AAAA,IACA,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,SAAS,CAAA;AAAA,IACnC,OAAA;AAAA,IACA;AAAA,MACG,WAAA;AAAA,MACA,UAAA,EAAY,UAAA,IAAc,CAAC,CAAC,OAAA,CAAQ,UAAA;AAAA,MAEpC,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,cAAA,EAAgB;AAAA;AACnB,GACH;AAGA,EAAA,IAAI,UAAA,EAAY;AACb,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,0BAAA,EAA6B,UAAU;AAAA,CAAI,CAAA;AAChE,IAAA;AAAA,EACH;AAGA,EAAA,IAAI,YAAA,EAAc;AACf,IAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,iCAAiC,CAAA;AACtD,IAAA,MAAM,SAAA,GAAY,IAAA;AAClB,IAAA,MAAM,cAAA,GAAiB,GAAA;AACvB,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,IAAI,SAAA,GAAY,EAAA;AAEhB,IAAA,OAAO,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA,GAAY,SAAA,EAAW;AACxC,MAAA,MAAM,IAAI,OAAA,CAAQ,CAAC,MAAM,UAAA,CAAW,CAAA,EAAG,cAAc,CAAC,CAAA;AACtD,MAAA,IAAI;AACD,QAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,YAAA,EAAa;AAExC,QAAA,KAAA,IAAS,IAAI,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACxC,UAAA,MAAM,CAAA,GAAI,KAAK,CAAC,CAAA;AAChB,UAAA,IAAI,CAAA,CAAE,SAAS,WAAA,IAAe,CAAA,CAAE,WAAW,CAAC,CAAA,CAAE,YAAY,MAAA,EAAQ;AAC/D,YAAA,SAAA,GAAY,CAAA,CAAE,OAAA;AACd,YAAA;AAAA,UACH;AAAA,QACH;AACA,QAAA,IAAI,SAAA,EAAW;AAAA,MAClB,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACH;AAEA,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,0BAAA,EAA6B,SAAA,IAAa,oBAAoB;AAAA,CAAI,CAAA;AAAA,EAC1F,CAAA,MAAO;AACJ,IAAA,OAAA,CAAQ,OAAO,KAAA,CAAM,CAAA;AAAA,CAA2C,CAAA;AAAA,EACnE;AACH;AAIA,eAAe,sBAAA,CACZ,OAAA,EACA,KAAA,EACA,WAAA,EACA,UAAA,EACc;AACd,EAAA,MAAM,UAAA,GAAa,IAAI,UAAA,CAAW;AAAA,IAC/B,OAAA,EAAS,OAAA,CAAQ,GAAA,CAAI,SAAA,CAAU,MAAA;AAAA,IAC/B,eAAe,OAAA,CAAQ,aAAA;AAAA,IACvB,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,aAAa,OAAA,CAAQ,eAAA;AAAA,IACrB,WAAA,EAAa,QAAQ,GAAA,CAAI,WAAA;AAAA,IACzB,KAAA;AAAA,IACA,OAAO,OAAA,CAAQ,KAAA;AAAA,IACf,YAAY,OAAA,CAAQ;AAAA,GACtB,CAAA;AAED,EAAA,WAAA,EAAY;AACZ,EAAA,OAAA,CAAQ,GAAA,CAAI,GAAA,CAAI,MAAA,CAAO,EAAE,CAAC,CAAA;AAC1B,EAAA,OAAA,CAAQ,GAAA,CAAI,QAAQ,KAAK,CAAA;AACzB,EAAA,OAAA,CAAQ,GAAA,CAAI,GAAA,CAAI,MAAA,CAAO,EAAE,CAAC,CAAA;AAC1B,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,MAAA,EAAS,OAAA,CAAQ,SAAS,CAAA,CAAE,CAAA;AACxC,EAAA,OAAA,CAAQ,IAAI,mEAAmE,CAAA;AAC/E,EAAA,OAAA,CAAQ,GAAA,CAAI,GAAA,CAAI,MAAA,CAAO,EAAE,CAAC,CAAA;AAC1B,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAEd,EAAA,MAAM,gBAAA,GAAmB,MAAM,OAAA,CAAQ,YAAA,EAAa;AACpD,EAAA,IAAI,gBAAA,CAAiB,SAAS,CAAA,EAAG;AAC9B,IAAA,OAAA,CAAQ,IAAI,4CAA4C,CAAA;AACxD,IAAA,KAAA,MAAW,GAAA,IAAO,gBAAA,CAAiB,KAAA,CAAM,GAAG,CAAA,EAAG;AAC5C,MAAA,MAAM,OAAO,OAAO,GAAA,CAAI,OAAA,KAAY,QAAA,GAAW,IAAI,OAAA,GAAU,EAAA;AAC7D,MAAA,IAAI,IAAA,IAAQ,IAAA,CAAK,IAAA,EAAK,EAAG;AACtB,QAAA,YAAA,CAAa,IAAA,EAAM,IAAI,IAAuC,CAAA;AAAA,MACjE;AAAA,IACH;AACA,IAAA,OAAA,CAAQ,IAAI,yCAAyC,CAAA;AAAA,EACxD;AAEA,EAAA,MAAM,uBAA0C,EAAC;AACjD,EAAA,KAAA,MAAW,GAAA,IAAO,gBAAA,CAAiB,KAAA,CAAM,GAAG,CAAA,EAAG;AAC5C,IAAA,MAAM,OAAO,OAAO,GAAA,CAAI,OAAA,KAAY,QAAA,GAAW,IAAI,OAAA,GAAU,EAAA;AAC7D,IAAA,IAAI,IAAA,IAAQ,KAAK,IAAA,EAAK,KAAM,IAAI,IAAA,KAAS,MAAA,IAAU,GAAA,CAAI,IAAA,KAAS,WAAA,CAAA,EAAc;AAC3E,MAAA,oBAAA,CAAqB,KAAK,EAAE,IAAA,EAAM,IAAI,IAAA,EAAM,OAAA,EAAS,MAAM,CAAA;AAAA,IAC9D;AAAA,EACH;AAEA,EAAA,MAAM,EAAA,GAAcC,yBAAgB,EAAE,KAAA,EAAO,QAAQ,KAAA,EAAO,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAQ,CAAA;AAEpF,EAAA,OAAO,IAAI,OAAA,CAAc,CAAC,OAAA,KAAY;AACnC,IAAA,MAAM,SAAS,MAAY;AACxB,MAAA,EAAA,CAAG,QAAA,CAAS,sBAAA,EAAwB,OAAO,KAAA,KAAU;AAClD,QAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAC3B,QAAA,IAAI,CAAC,OAAA,EAAS;AACX,UAAA,MAAA,EAAO;AACP,UAAA;AAAA,QACH;AACA,QAAA,IAAI,QAAQ,WAAA,EAAY,KAAM,UAAU,OAAA,CAAQ,WAAA,OAAkB,MAAA,EAAQ;AACvE,UAAA,OAAA,CAAQ,IAAI,YAAY,CAAA;AACxB,UAAA,EAAA,CAAG,KAAA,EAAM;AACT,UAAA;AAAA,QACH;AAEA,QAAA,oBAAA,CAAqB,KAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,SAAS,CAAA;AAC5D,QAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,8BAA8B,CAAA;AACnD,QAAA,IAAI,gBAAA,GAAmB,EAAA;AAEvB,QAAA,IAAI;AACD,UAAA,MAAM,EAAE,UAAA,EAAW,GAAI,MAAM,oBAAA;AAAA,YAC1B,UAAA;AAAA,YACA,oBAAA;AAAA,YACA,CAAC,KAAA,KAAU;AACR,cAAA,MAAM,KAAA,GAAQ,aAAa,KAAK,CAAA;AAChC,cAAA,IAAI,KAAA,EAAO;AACR,gBAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,KAAK,CAAA;AAC1B,gBAAA,gBAAA,IAAoB,KAAA;AAAA,cACvB;AACA,cAAA,MAAM,QAAA,GAAW,gBAAgB,KAAK,CAAA;AACtC,cAAA,IAAI,QAAA,UAAkB,GAAA,CAAI;AAAA,eAAA,EAAoB,QAAQ,CAAA,OAAA,CAAS,CAAA;AAAA,YAClE,CAAA;AAAA,YACA;AAAA,cACG,WAAA;AAAA,cACA,UAAA,EAAY,UAAA,IAAc,CAAC,CAAC,OAAA,CAAQ,UAAA;AAAA,cACpC,KAAA;AAAA,cACA,UAAU,OAAA,CAAQ,QAAA;AAAA,cAClB,UAAU,OAAA,CAAQ;AAAA;AACrB,WACH;AACA,UAAA,IAAI,UAAA,IAAc,CAAC,gBAAA,EAAkB;AAClC,YAAA,gBAAA,GAAmB,UAAA;AACnB,YAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,UAAU,CAAA;AAAA,UAClC;AACA,UAAA,IAAI,gBAAA,EAAkB;AACnB,YAAA,oBAAA,CAAqB,KAAK,EAAE,IAAA,EAAM,WAAA,EAAa,OAAA,EAAS,kBAAkB,CAAA;AAAA,UAC7E;AACA,UAAA,OAAA,CAAQ,IAAI,IAAI,CAAA;AAAA,QACnB,SAAS,KAAA,EAAO;AACb,UAAA,OAAA,CAAQ,GAAA;AAAA,YACL;AAAA,eAAA,EAAoB,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,KAAK,CAAA;AAAA;AAAA,WACrE;AAAA,QACH;AAEA,QAAA,MAAA,EAAO;AAAA,MACV,CAAC,CAAA;AAAA,IACJ,CAAA;AAEA,IAAA,EAAA,CAAG,EAAA,CAAG,SAAS,MAAM;AAClB,MAAA,OAAA,CAAQ,IAAI,YAAY,CAAA;AACxB,MAAA,OAAA,EAAQ;AAAA,IACX,CAAC,CAAA;AACD,IAAA,MAAA,EAAO;AAAA,EACV,CAAC,CAAA;AACJ;AAIO,SAAS,aAAa,QAAA,EAA6B;AACvD,EAAA,MAAM,UAAsB,EAAC;AAC7B,EAAA,KAAA,MAAW,GAAA,IAAO,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,EAAG;AACpC,IAAA,MAAM,OAAO,OAAO,GAAA,CAAI,OAAA,KAAY,QAAA,GAAW,IAAI,OAAA,GAAU,EAAA;AAC7D,IAAA,IAAI,GAAA,CAAI,IAAA,KAAS,MAAA,IAAU,GAAA,CAAI,SAAS,WAAA,EAAa;AAClD,MAAA,IAAI,IAAA,CAAK,MAAK,EAAG;AACd,QAAA,OAAA,CAAQ,KAAK,EAAE,IAAA,EAAM,IAAI,IAAA,EAAM,OAAA,EAAS,MAAM,CAAA;AAAA,MACjD;AACA,MAAA,IAAI,GAAA,CAAI,IAAA,KAAS,WAAA,IAAe,GAAA,CAAI,UAAA,EAAY;AAC7C,QAAA,KAAA,MAAW,EAAA,IAAM,IAAI,UAAA,EAAY;AAC9B,UAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,YACV,IAAA,EAAM,WAAA;AAAA,YACN,IAAI,EAAA,CAAG,EAAA;AAAA,YACP,IAAA,EAAM,GAAG,QAAA,CAAS,IAAA;AAAA,YAClB,IAAA,EAAM,EAAA,CAAG,QAAA,CAAS,SAAA,IAAa,EAAA;AAAA,YAC/B,IAAA,EAAM;AAAA,WACR,CAAA;AAAA,QACJ;AAAA,MACH;AAAA,IACH,CAAA,MAAA,IAAW,GAAA,CAAI,IAAA,KAAS,MAAA,EAAQ;AAC7B,MAAA,MAAM,QAAA,GAAY,IAAY,IAAA,IAAQ,MAAA;AACtC,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACV,IAAA,EAAM,aAAA;AAAA,QACN,UAAA,EAAa,IAAY,YAAA,IAAgB,EAAA;AAAA,QACzC,QAAA;AAAA,QACA,OAAA,EAAS;AAAA,OACX,CAAA;AAAA,IACJ;AAAA,EACH;AACA,EAAA,OAAO,OAAA;AACV;AAEO,SAAS,kBAAA,CAAmB,QAAwB,GAAA,EAAoB;AAC5E,EAAA,MAAA,CAAO,EAAA,CAAG,YAAA,EAAc,MAAM,GAAA,CAAI,aAAa,CAAA;AAC/C,EAAA,MAAA,CAAO,EAAA,CAAG,cAAc,CAAC,IAAA,KAAc,IAAI,WAAA,CAAY,IAAA,CAAK,KAAK,CAAC,CAAA;AAClE,EAAA,MAAA,CAAO,EAAA,CAAG,UAAA,EAAY,MAAM,GAAA,CAAI,WAAW,CAAA;AAE3C,EAAA,MAAA,CAAO,EAAA,CAAG,iBAAA,EAAmB,CAAC,IAAA,KAAc;AACzC,IAAA,GAAA,CAAI,aAAA,CAAc,IAAA,CAAK,UAAA,EAAY,IAAA,CAAK,YAAY,CAAA;AAAA,EACvD,CAAC,CAAA;AACD,EAAA,MAAA,CAAO,EAAA,CAAG,gBAAA,EAAkB,CAAC,IAAA,KAAc;AACxC,IAAA,GAAA,CAAI,YAAA,CAAa,IAAA,CAAK,UAAA,EAAY,IAAA,CAAK,KAAK,CAAA;AAAA,EAC/C,CAAC,CAAA;AACD,EAAA,MAAA,CAAO,EAAA,CAAG,eAAA,EAAiB,CAAC,IAAA,KAAc;AACvC,IAAA,GAAA,CAAI,WAAA,CAAY,KAAK,UAAU,CAAA;AAAA,EAClC,CAAC,CAAA;AACD,EAAA,MAAA,CAAO,EAAA,CAAG,kBAAA,EAAoB,CAAC,IAAA,KAAc;AAC1C,IAAA,MAAM,QAAA,GAAW,GAAA,CAAI,gBAAA,CAAiB,IAAA,CAAK,UAAU,CAAA;AACrD,IAAA,MAAM,OAAA,GAAU,OAAO,IAAA,CAAK,MAAA,KAAW,QAAA,GAAW,KAAK,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,MAAM,CAAA;AAC1F,IAAA,GAAA,CAAI,cAAA,CAAe,IAAA,CAAK,UAAA,EAAY,QAAA,EAAU,OAAO,CAAA;AAAA,EACxD,CAAC,CAAA;AAED,EAAA,MAAA,CAAO,EAAA,CAAG,WAAA,EAAa,CAAC,IAAA,KAAc;AACnC,IAAA,GAAA,CAAI,SAAA,CAAU,KAAK,OAAO,CAAA;AAAA,EAC7B,CAAC,CAAA;AAED,EAAA,MAAA,CAAO,EAAA,CAAG,OAAA,EAAS,CAAC,GAAA,KAAe;AAChC,IAAA,GAAA,CAAI,SAAA,CAAU,CAAA,YAAA,EAAe,GAAA,CAAI,OAAO,CAAA,CAAE,CAAA;AAAA,EAC7C,CAAC,CAAA;AAED,EAAA,MAAA,CAAO,EAAA,CAAG,WAAW,CAAC,GAAA,KAAa,IAAI,QAAA,CAAS,IAAA,EAAM,GAAG,CAAC,CAAA;AAC1D,EAAA,MAAA,CAAO,EAAA,CAAG,WAAW,CAAC,GAAA,KAAa,IAAI,QAAA,CAAS,KAAA,EAAO,GAAG,CAAC,CAAA;AAC9D;AAIA,eAAe,mBAAA,CACZ,OAAA,EACA,GAAA,EACA,KAAA,EACc;AACd,EAAA,MAAM,MAAA,GAAS,IAAI,cAAA,CAAe;AAAA,IAC/B,KAAK,OAAA,CAAQ,KAAA;AAAA,IACb,KAAA,EAAO,QAAQ,GAAA,CAAI,WAAA;AAAA,IACnB,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,OAAA,EAAS,GAAA;AAAA,IACT;AAAA,GACF,CAAA;AAED,EAAA,OAAA,CAAQ,OAAO,KAAA,CAAM,CAAA,cAAA,EAAiB,OAAA,CAAQ,KAAA,CAAM,aAAa,CAAA;AAAA,CAAO,CAAA;AAExE,EAAA,IAAI;AACD,IAAA,MAAM,OAAO,OAAA,EAAQ;AAAA,EACxB,SAAS,GAAA,EAAK;AACX,IAAA,MAAM,IAAI,SAAS,CAAA,mBAAA,EAAsB,GAAA,YAAe,QAAQ,GAAA,CAAI,OAAA,GAAU,GAAG,CAAA,CAAE,CAAA;AAAA,EACtF;AAEA,EAAA,MAAM,gBAAA,GAAmB,MAAM,OAAA,CAAQ,YAAA,EAAa;AACpD,EAAA,MAAM,OAAA,GAAU,aAAa,gBAAgB,CAAA;AAE7C,EAAA,MAAM,GAAA,GAAM,IAAI,OAAA,CAAQ;AAAA,IACrB,MAAA,EAAQ,CAAC,IAAA,KAAS;AACf,MAAA,MAAA,CAAO,gBAAgB,IAAI,CAAA;AAAA,IAC9B,CAAA;AAAA,IACA,QAAQ,MAAM;AACX,MAAA,MAAA,CAAO,KAAA,EAAM;AAAA,IAChB,CAAA;AAAA,IACA,KAAA;AAAA,IACA,GAAA,EAAK,QAAQ,GAAA,CAAI;AAAA,GACnB,CAAA;AAED,EAAA,kBAAA,CAAmB,QAAQ,GAAG,CAAA;AAE9B,EAAA,MAAA,CAAO,EAAA,CAAG,UAAU,MAAM;AACvB,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,OAAA,CAAQ,IAAI,eAAe,CAAA;AAAA,EAC9B,CAAC,CAAA;AAED,EAAA,GAAA,CAAI,YAAY,OAAO,CAAA;AACvB,EAAA,GAAA,CAAI,KAAA,EAAM;AAEV,EAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,KAAY;AAClC,IAAA,MAAA,CAAO,IAAA,CAAK,UAAU,OAAO,CAAA;AAAA,EAChC,CAAC,CAAA;AACJ;AAIA,eAAe,gBAAA,CACZ,OAAA,EACA,GAAA,EACA,IAAA,EACA,KAAA,EACc;AACd,EAAA,IAAI,CAAC,mBAAkB,EAAG;AACvB,IAAA,MAAM,IAAI,QAAA;AAAA,MACP;AAAA,KAIH;AAAA,EACH;AAEA,EAAA,MAAM,eAAA,GACH,OAAO,IAAA,CAAK,cAAc,MAAM,QAAA,GAAW,IAAA,CAAK,cAAc,CAAA,GAAI,MAAA;AACrE,EAAA,MAAM,gBAAA,GACH,OAAO,IAAA,CAAK,eAAe,MAAM,QAAA,GAAW,IAAA,CAAK,eAAe,CAAA,GAAI,MAAA;AAEvE,EAAA,IAAI,aAAA;AACJ,EAAA,IAAI,cAAA;AAEJ,EAAA,IAAI,CAAC,eAAA,IAAmB,CAAC,gBAAA,EAAkB;AACxC,IAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,qBAAqB,CAAA;AAAA,EAC7C;AAEA,EAAA,IAAI,eAAA,EAAiB;AAClB,IAAA,aAAA,GAAgB,eAAA;AAAA,EACnB,CAAA,MAAO;AACJ,IAAA,MAAM,YAAA,GAAe,MAAM,gBAAA,EAAiB;AAC5C,IAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,YAAA,EAAc,oBAAoB,CAAA;AACtE,IAAA,aAAA,GAAgB,QAAA,CAAS,EAAA;AAAA,EAC5B;AAEA,EAAA,IAAI,gBAAA,EAAkB;AACnB,IAAA,cAAA,GAAiB,gBAAA;AAAA,EACpB,CAAA,MAAO;AACJ,IAAA,MAAM,aAAA,GAAgB,MAAM,iBAAA,EAAkB;AAC9C,IAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,aAAA,EAAe,kBAAkB,CAAA;AACrE,IAAA,cAAA,GAAiB,QAAA,CAAS,EAAA;AAAA,EAC7B;AAEA,EAAA,MAAM,MAAA,GAAS,IAAI,cAAA,CAAe;AAAA,IAC/B,KAAK,OAAA,CAAQ,KAAA;AAAA,IACb,KAAA,EAAO,QAAQ,GAAA,CAAI,WAAA;AAAA,IACnB,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,OAAA,EAAS,GAAA;AAAA,IACT;AAAA,GACF,CAAA;AAED,EAAA,OAAA,CAAQ,OAAO,KAAA,CAAM;AAAA,cAAA,EAAmB,OAAA,CAAQ,KAAA,CAAM,WAAA,EAAa,CAAA;AAAA,CAAO,CAAA;AAE1E,EAAA,IAAI;AACD,IAAA,MAAM,OAAO,OAAA,EAAQ;AAAA,EACxB,SAAS,GAAA,EAAK;AACX,IAAA,MAAM,IAAI,SAAS,CAAA,mBAAA,EAAsB,GAAA,YAAe,QAAQ,GAAA,CAAI,OAAA,GAAU,GAAG,CAAA,CAAE,CAAA;AAAA,EACtF;AAEA,EAAA,MAAM,gBAAA,GAAmB,MAAM,OAAA,CAAQ,YAAA,EAAa;AACpD,EAAA,MAAM,OAAA,GAAU,aAAa,gBAAgB,CAAA;AAE7C,EAAA,MAAM,GAAA,GAAM,IAAI,UAAA,CAAW,CAAC,KAAA,KAAU;AACnC,IAAA,IAAI,CAAC,MAAA,CAAO,WAAA,EAAY,EAAG;AAC3B,IAAA,MAAA,CAAO,UAAU,KAAK,CAAA;AAAA,EACzB,CAAC,CAAA;AACD,EAAA,MAAM,MAAA,GAAS,IAAI,WAAA,CAAY,cAAc,CAAA;AAE7C,EAAA,SAAS,OAAA,GAAgB;AACtB,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,MAAA,CAAO,IAAA,EAAK;AACZ,IAAA,MAAA,CAAO,KAAA,EAAM;AAAA,EAChB;AAEA,EAAA,MAAM,GAAA,GAAM,IAAI,OAAA,CAAQ;AAAA,IACrB,MAAA,EAAQ,CAAC,IAAA,KAAS;AACf,MAAA,MAAA,CAAO,gBAAgB,IAAI,CAAA;AAAA,IAC9B,CAAA;AAAA,IACA,QAAQ,MAAM;AACX,MAAA,OAAA,EAAQ;AAAA,IACX,CAAA;AAAA,IACA,KAAA;AAAA,IACA,GAAA,EAAK,QAAQ,GAAA,CAAI;AAAA,GACnB,CAAA;AAED,EAAA,kBAAA,CAAmB,QAAQ,GAAG,CAAA;AAE9B,EAAA,MAAA,CAAO,EAAA,CAAG,OAAA,EAAS,CAAC,IAAA,KAAc;AAC/B,IAAA,MAAA,CAAO,KAAA,CAAM,KAAK,KAAK,CAAA;AAAA,EAC1B,CAAC,CAAA;AAED,EAAA,MAAA,CAAO,EAAA,CAAG,WAAA,EAAa,CAAC,IAAA,KAAc;AACnC,IAAA,MAAA,CAAO,WAAA,CAAY,MAAM,SAAS,CAAA;AAAA,EACrC,CAAC,CAAA;AAED,EAAA,MAAA,CAAO,EAAA,CAAG,aAAa,MAAM;AAC1B,IAAA,MAAM,UAAA,GAAa,OAAO,iBAAA,EAAkB;AAC5C,IAAA,MAAM,YAAY,MAAA,CAAO,gBAAA;AAEzB,IAAA,IAAI,UAAA,KAAe,IAAA,IAAQ,UAAA,GAAa,CAAA,IAAK,OAAO,SAAA,EAAW;AAC5D,MAAA,MAAA,CAAO,aAAA,CAAc,YAAY,SAAS,CAAA;AAC1C,MAAA,MAAA,CAAO,IAAA,EAAK;AAEZ,MAAA,IAAI,KAAA,EAAO;AACR,QAAA,GAAA,CAAI,SAAS,IAAA,EAAM;AAAA,UAChB,IAAA,EAAM,QAAA;AAAA,UACN,IAAA,EAAM,iBAAA;AAAA,UACN,OAAO,EAAE,MAAA,EAAQ,QAAA,EAAU,UAAA,EAAY,YAAY,SAAA;AAAU,SAC/D,CAAA;AAAA,MACJ;AAAA,IACH,WAAW,KAAA,EAAO;AACf,MAAA,GAAA,CAAI,SAAS,IAAA,EAAM;AAAA,QAChB,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,iBAAA;AAAA,QACN,OAAO,EAAE,MAAA,EAAQ,SAAA,EAAW,UAAA,EAAY,OAAO,SAAA;AAAU,OAC3D,CAAA;AAAA,IACJ;AAAA,EACH,CAAC,CAAA;AAED,EAAA,MAAA,CAAO,EAAA,CAAG,UAAA,EAAY,CAAC,IAAA,KAAc;AAClC,IAAA,MAAA,CAAO,IAAA,EAAK;AACZ,IAAA,GAAA,CAAI,iBAAA;AAAA,MACD,KAAK,OAAA,IAAW,EAAA;AAAA,MAChB,IAAA,CAAK,eAAA;AAAA,MACL,KAAK,gBAAA,IAAoB,UAAA;AAAA,MACzB,IAAA,CAAK;AAAA,KACR;AAAA,EACH,CAAC,CAAA;AAED,EAAA,MAAA,CAAO,EAAA,CAAG,kBAAA,EAAoB,CAAC,IAAA,KAAc;AAC1C,IAAA,IAAI,IAAA,CAAK,IAAA,KAAS,MAAA,IAAU,IAAA,CAAK,OAAA,EAAS;AACvC,MAAA,GAAA,CAAI,gBAAA,CAAiB,KAAK,OAAO,CAAA;AAAA,IACpC;AAAA,EACH,CAAC,CAAA;AAED,EAAA,MAAA,CAAO,EAAA,CAAG,UAAU,MAAM;AACvB,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,OAAA,EAAQ;AACR,IAAA,OAAA,CAAQ,IAAI,eAAe,CAAA;AAAA,EAC9B,CAAC,CAAA;AAED,EAAA,GAAA,CAAI,YAAY,OAAO,CAAA;AACvB,EAAA,GAAA,CAAI,KAAA,EAAM;AAEV,EAAA,GAAA,CAAI,MAAM,aAAa,CAAA;AAEvB,EAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,KAAY;AAClC,IAAA,MAAA,CAAO,IAAA,CAAK,UAAU,OAAO,CAAA;AAAA,EAChC,CAAC,CAAA;AACJ;AAIA,eAAsB,gBAAA,GAAkC;AACrD,EAAA,IAAI,CAAC,mBAAkB,EAAG;AACvB,IAAA,MAAM,IAAI,QAAA;AAAA,MACP;AAAA,KAIH;AAAA,EACH;AAEA,EAAA,MAAM,MAAA,GAAS,MAAM,gBAAA,EAAiB;AACtC,EAAA,MAAM,OAAA,GAAU,MAAM,iBAAA,EAAkB;AAExC,EAAA,OAAA,CAAQ,IAAI,6BAA6B,CAAA;AACzC,EAAA,KAAA,MAAW,OAAO,MAAA,EAAQ;AACvB,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,SAAA,GAAY,YAAA,GAAe,EAAA;AAC9C,IAAA,OAAA,CAAQ,GAAA,CAAI,KAAK,GAAA,CAAI,EAAE,KAAK,GAAA,CAAI,IAAI,CAAA,EAAG,MAAM,CAAA,CAAE,CAAA;AAAA,EAClD;AAEA,EAAA,OAAA,CAAQ,IAAI,6BAA6B,CAAA;AACzC,EAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACxB,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,SAAA,GAAY,YAAA,GAAe,EAAA;AAC9C,IAAA,OAAA,CAAQ,GAAA,CAAI,KAAK,GAAA,CAAI,EAAE,KAAK,GAAA,CAAI,IAAI,CAAA,EAAG,MAAM,CAAA,CAAE,CAAA;AAAA,EAClD;AACH;;;AC3jBA,eAAsB,yBAAyB,IAAA,EAA4C;AACxF,EAAA,MAAM,GAAA,GAAM,WAAA,CAAY,IAAA,CAAK,GAAG,CAAA;AAChC,EAAA,MAAM,EAAE,MAAK,GAAI,IAAA;AAEjB,EAAA,IAAI,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,GAAA,EAAK;AACxB,IAAA,MAAM,IAAI,SAAS,yCAAyC,CAAA;AAAA,EAC/D;AACA,EAAA,IAAI,KAAK,IAAA,EAAM;AACZ,IAAA,MAAM,MAAA,GAAS,MAAM,sBAAA,CAAuB,GAAG,CAAA;AAC/C,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACZ,CAAA,gCAAA,EAAmC,MAAA,CAAO,OAAO,CAAA,WAAA,EAAc,OAAO,SAAS;AAAA;AAAA,KAClF;AACA,IAAA;AAAA,EACH;AACA,EAAA,IAAI,KAAK,GAAA,EAAK;AACX,IAAA,MAAM,MAAA,GAAS,MAAM,qBAAA,CAAsB,GAAG,CAAA;AAC9C,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACZ,CAAA,kCAAA,EAAqC,MAAA,CAAO,UAAU,CAAA,gBAAA,EAAmB,OAAO,cAAc;AAAA;AAAA,KACjG;AACA,IAAA;AAAA,EACH;AAEA,EAAA,MAAM,IAAI,QAAA;AAAA,IACP;AAAA,GACH;AACH;AAEA,eAAsB,iBAAiB,IAAA,EAA4C;AAChF,EAAA,MAAM,GAAA,GAAM,WAAA,CAAY,IAAA,CAAK,GAAG,CAAA;AAChC,EAAA,MAAM,EAAE,MAAK,GAAI,IAAA;AAEjB,EAAA,IAAI,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,GAAA,EAAK;AACxB,IAAA,IAAI,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,GAAA,EAAK;AACxB,MAAA,MAAM,IAAI,SAAS,yCAAyC,CAAA;AAAA,IAC/D;AACA,IAAA,IAAI,IAAA,CAAK,KAAA,IAAS,IAAA,CAAK,QAAA,EAAU;AAC9B,MAAA,MAAM,IAAI,SAAS,4DAA4D,CAAA;AAAA,IAClF;AACA,IAAA,MAAM,yBAAyB,IAAI,CAAA;AACnC,IAAA;AAAA,EACH;AAEA,EAAA,MAAM,SAAA,GAAY,OAAO,IAAA,CAAK,SAAS,MAAM,QAAA,GAAW,IAAA,CAAK,SAAS,CAAA,GAAI,MAAA;AAC1E,EAAA,MAAM,UAAU,OAAO,IAAA,CAAK,OAAA,KAAY,QAAA,GAAW,KAAK,OAAA,GAAU,MAAA;AAElE,EAAA,MAAM,OAAO,MAAM,wBAAA,CAAyB,KAAK,SAAA,EAAW,CAAC,CAAC,OAAO,CAAA;AACrE,EAAA,MAAM,OAAA,GAAU,qBAAA,CAAsB,GAAA,EAAK,IAAA,EAAM,IAAI,CAAA;AACrD,EAAA,MAAM,cAAA,CAAe,SAAS,IAAI,CAAA;AACrC;AAEA,SAAS,qBAAA,CACN,GAAA,EACA,IAAA,EACA,IAAA,EACY;AACZ,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,SAAA,CAAU,MAAA,CAAO,OAAA,CAAQ,WAAW,MAAM,CAAA,CAAE,OAAA,CAAQ,QAAA,EAAU,KAAK,CAAA;AACtF,EAAA,OAAO;AAAA,IACJ,GAAA;AAAA,IACA,aAAA,EAAe,EAAA;AAAA,IACf,QAAQ,IAAA,CAAK,EAAA;AAAA,IACb,UAAU,IAAA,CAAK,IAAA;AAAA,IACf,SAAA,EAAW,IAAA,CAAK,KAAA,IAAS,IAAA,CAAK,IAAA;AAAA,IAC9B,iBAAiB,CAAA,EAAG,GAAA,CAAI,UAAU,MAAM,CAAA,wBAAA,EAA2B,KAAK,EAAE,CAAA,UAAA,CAAA;AAAA,IAC1E,KAAA,EAAO,GAAG,MAAM,CAAA,iCAAA,CAAA;AAAA,IAChB,YAAA,EAAc,MAAM,wBAAA,CAAyB,GAAA,EAAK,IAAA,CAAK,EAAE,CAAA,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA;AAAA,IACzE,KAAA,EAAO,WAAA;AAAA,IACP,KAAA,EAAO,MAAA;AAAA;AAAA,IACP,YAAY,2BAAA,EAA4B;AAAA,IACxC,UAAA,EAAY,IAAA;AAAA,IACZ,QAAA,EAAU,CAAC,CAAC,IAAA,CAAK,WAAW,CAAA;AAAA,IAC5B,QAAA,EAAU,OAAO,IAAA,CAAK,WAAW,MAAM,QAAA,GAAW,IAAA,CAAK,WAAW,CAAA,GAAI;AAAA,GACzE;AACH;AAEA,eAAe,wBAAA,CACZ,GAAA,EACA,SAAA,EACA,aAAA,EACuB;AACvB,EAAA,IAAI,SAAA,EAAW;AACZ,IAAA,MAAM,EAAA,GAAK,OAAO,SAAS,CAAA;AAC3B,IAAA,IAAI,MAAM,EAAE,CAAA,EAAG,MAAM,IAAI,SAAS,4BAA4B,CAAA;AAC9D,IAAA,OAAO,gBAAA,CAAiB,KAAK,EAAE,CAAA;AAAA,EAClC;AAEA,EAAA,IAAI,aAAA,EAAe;AAChB,IAAA,MAAM,IAAA,GAAO,MAAM,mBAAA,CAAoB,GAAG,CAAA;AAC1C,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,wBAAA,EAA2B,IAAA,CAAK,EAAE;AAAA,CAAI,CAAA;AAC3D,IAAA,OAAO,IAAA;AAAA,EACV;AAEA,EAAA,MAAM,KAAA,GAAQ,MAAM,kBAAA,CAAmB,GAAG,CAAA;AAE1C,EAAA,MAAM,EAAE,IAAA,EAAM,YAAA,EAAc,OAAM,GAAI,MAAM,eAAe,KAAA,EAAO;AAAA,IAC/D,KAAA,EAAO,6CAAA;AAAA,IACP,OAAA,EAAS,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,IAAS,CAAA,KAAA,EAAQ,CAAA,CAAE,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,GAAA,CAAA;AAAA,IACrD,QAAA,EAAU,CAAC,CAAA,KAAM,eAAA,CAAgB,EAAE,SAAS,CAAA;AAAA,IAC5C,YAAA,EAAc,8BAAA;AAAA,IACd,QAAA,EAAU,IAAA;AAAA,IACV,QAAA,EAAU;AAAA,GACZ,CAAA;AAED,EAAA,IAAI,CAAC,YAAA,IAAgB,CAAC,KAAA,EAAO;AAC1B,IAAA,MAAM,IAAI,SAAS,mBAAmB,CAAA;AAAA,EACzC;AAEA,EAAA,IAAI,KAAA,EAAO;AACR,IAAA,MAAM,IAAA,GAAO,MAAM,mBAAA,CAAoB,GAAG,CAAA;AAC1C,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,wBAAA,EAA2B,IAAA,CAAK,EAAE;AAAA,CAAI,CAAA;AAC3D,IAAA,OAAO,IAAA;AAAA,EACV;AACA,EAAA,OAAO,YAAA;AACV","file":"chunk-QVG4L6BE.js","sourcesContent":["import path from 'path';\n\nexport interface ConciergeAppContextPayload {\n clientSurface: 'cli';\n cliContext: {\n shell?: string;\n os: string;\n cwdBasename: string;\n };\n channel: 'text';\n}\n\n/** Build ConciergeAppContext for AG-UI requests from the CLI. */\nexport function buildCliConciergeAppContext(): ConciergeAppContextPayload {\n const shell = process.env.SHELL ? path.basename(process.env.SHELL) : undefined;\n return {\n clientSurface: 'cli',\n channel: 'text',\n cliContext: {\n shell,\n os: process.platform,\n cwdBasename: path.basename(process.cwd()),\n },\n };\n}\n","/**\n * Sandboxed local filesystem operations for CLI-executed concierge tools.\n */\n\nimport fs from 'fs';\nimport path from 'path';\n\nconst DEFAULT_MAX_READ_BYTES = 50_000;\nconst ABSOLUTE_MAX_READ_BYTES = 1_000_000;\n\nexport interface CliLocalFileInterrupt {\n type: 'cli_local_file';\n action: 'read_file' | 'list_dir' | 'write_file';\n path: string;\n content?: string;\n max_bytes?: number;\n interrupt_id?: string;\n}\n\nexport interface CliLocalFileResult {\n ok: boolean;\n content?: string;\n error?: string;\n}\n\nfunction resolveSafePath(root: string, relativePath: string): string | null {\n const rootResolved = path.resolve(root);\n const target = path.resolve(rootResolved, relativePath || '.');\n if (target !== rootResolved && !target.startsWith(rootResolved + path.sep)) {\n return null;\n }\n // Reject any component along the path that is a symlink — `path.resolve`\n // does not follow symlinks but `fs.statSync`/`readFileSync` do, so a\n // symlink inside the trusted dir could otherwise read or write a file\n // outside of it. ``lstatSync`` reports the link itself and never the\n // target.\n let cursor = rootResolved;\n const rest = path.relative(rootResolved, target);\n if (rest && rest !== '.') {\n for (const segment of rest.split(path.sep)) {\n cursor = path.join(cursor, segment);\n try {\n const lstat = fs.lstatSync(cursor);\n if (lstat.isSymbolicLink()) {\n return null;\n }\n } catch {\n // Missing path components are fine — the caller decides what to do\n // with a non-existent target.\n break;\n }\n }\n }\n return target;\n}\n\nexport function executeCliLocalFileAction(\n root: string,\n interrupt: CliLocalFileInterrupt,\n opts: { allowWrite: boolean }\n): CliLocalFileResult {\n const safe = resolveSafePath(root, interrupt.path);\n if (!safe) {\n return { ok: false, error: 'Path escapes trusted directory' };\n }\n\n try {\n switch (interrupt.action) {\n case 'read_file': {\n if (!fs.existsSync(safe)) {\n return { ok: false, error: 'File not found' };\n }\n const stat = fs.lstatSync(safe);\n if (stat.isSymbolicLink()) {\n return { ok: false, error: 'Path escapes trusted directory' };\n }\n if (!stat.isFile()) {\n return { ok: false, error: 'Not a file' };\n }\n const requested = Number.isFinite(interrupt.max_bytes)\n ? Math.max(1, Math.min(Number(interrupt.max_bytes), ABSOLUTE_MAX_READ_BYTES))\n : DEFAULT_MAX_READ_BYTES;\n if (stat.size > requested) {\n const buf = fs.readFileSync(safe, { encoding: 'utf8' });\n return {\n ok: true,\n content: buf.slice(0, requested) + `\\n\\n[truncated at ${requested} bytes]`,\n };\n }\n return { ok: true, content: fs.readFileSync(safe, 'utf8') };\n }\n case 'list_dir': {\n if (!fs.existsSync(safe)) {\n return { ok: false, error: 'Directory not found' };\n }\n const entries = fs.readdirSync(safe, { withFileTypes: true });\n const lines = entries\n .slice(0, 200)\n .map((e) => (e.isDirectory() ? `${e.name}/` : e.name));\n if (entries.length > 200) {\n lines.push(`... and ${entries.length - 200} more`);\n }\n return { ok: true, content: lines.join('\\n') };\n }\n case 'write_file': {\n if (!opts.allowWrite) {\n return { ok: false, error: 'Write requires --allow-write' };\n }\n if (interrupt.content === undefined) {\n return { ok: false, error: 'Missing content for write_file' };\n }\n fs.mkdirSync(path.dirname(safe), { recursive: true });\n fs.writeFileSync(safe, interrupt.content, 'utf8');\n return { ok: true, content: 'written' };\n }\n default:\n return { ok: false, error: `Unknown action: ${interrupt.action}` };\n }\n } catch (e) {\n return { ok: false, error: sanitizeLocalFileError(e) };\n }\n}\n\nfunction sanitizeLocalFileError(e: unknown): string {\n if (e && typeof e === 'object' && 'code' in e) {\n const code = (e as NodeJS.ErrnoException).code;\n if (code === 'ENOENT') return 'File or directory not found';\n if (code === 'EACCES' || code === 'EPERM') return 'Permission denied';\n if (code === 'EISDIR') return 'Not a file';\n if (code === 'ENOTDIR') return 'Not a directory';\n }\n return 'Local file operation failed';\n}\n\nexport function isCliLocalFileInterrupt(value: unknown): value is CliLocalFileInterrupt {\n if (typeof value !== 'object' || value === null) return false;\n const v = value as Record<string, unknown>;\n return v.type === 'cli_local_file' && typeof v.action === 'string' && typeof v.path === 'string';\n}\n","/**\n * Directory-trust store for CLI file-capable surfaces.\n *\n * Separates input trust from --allow-write (output mutations). Trust is\n * path-keyed (VS Code workspace-trust model): a grant applies to the directory\n * path, not to individual file contents — new files dropped into a trusted path\n * are readable without re-prompting.\n *\n * See docs/public/cli-get-started.md and gr-feedback trust-directory spec.\n */\n\nimport fs from 'fs';\nimport os from 'os';\nimport path from 'path';\nimport readline from 'readline';\n\nexport type DirectoryTrustDecision = 'once' | 'always' | 'denied';\n\nexport type DirectoryTrustStatus = 'trusted' | 'denied';\n\nexport interface TrustedDirsStore {\n version: 1;\n /** Absolute paths the user chose \"trust always\" for. */\n always: string[];\n}\n\nconst STORE_VERSION = 1 as const;\n\nfunction storePath(): string {\n const base =\n process.env.XDG_CONFIG_HOME ??\n (process.platform === 'win32'\n ? path.join(process.env.APPDATA ?? os.homedir(), 'gravityrail')\n : path.join(os.homedir(), '.config', 'gravityrail'));\n return path.join(base, 'trusted-dirs.json');\n}\n\nexport function loadTrustedDirsStore(): TrustedDirsStore {\n const file = storePath();\n try {\n const raw = JSON.parse(fs.readFileSync(file, 'utf8')) as TrustedDirsStore;\n if (raw?.version === STORE_VERSION && Array.isArray(raw.always)) {\n return { version: STORE_VERSION, always: raw.always.map((p) => path.resolve(p)) };\n }\n } catch {\n // Missing or corrupt — treat as empty.\n }\n return { version: STORE_VERSION, always: [] };\n}\n\nfunction saveTrustedDirsStore(store: TrustedDirsStore): void {\n const file = storePath();\n const dir = path.dirname(file);\n fs.mkdirSync(dir, { recursive: true, mode: 0o700 });\n fs.writeFileSync(file, JSON.stringify(store, null, 2) + '\\n', { mode: 0o600 });\n}\n\nexport function isDirectoryTrusted(dirPath: string, opts?: { trustCwdFlag?: boolean }): boolean {\n if (opts?.trustCwdFlag) return true;\n const resolved = path.resolve(dirPath);\n const store = loadTrustedDirsStore();\n return store.always.includes(resolved);\n}\n\nasync function promptTrustInteractive(dirPath: string): Promise<DirectoryTrustDecision> {\n const rl = readline.createInterface({ input: process.stdin, output: process.stderr });\n const question = (q: string) => new Promise<string>((resolve) => rl.question(q, resolve));\n\n process.stderr.write(\n `\\nGravity Rail may read files in:\\n ${dirPath}\\n\\n` +\n `File contents can influence the assistant. Do you trust the files in this directory?\\n` +\n ` [1] Trust once (this session)\\n` +\n ` [2] Trust always (remember for this path)\\n` +\n ` [3] No — do not read local files\\n\\n` +\n `Choice [1/2/3] (default 3): `\n );\n const answer = (await question('')).trim() || '3';\n rl.close();\n\n if (answer === '1') return 'once';\n if (answer === '2') return 'always';\n return 'denied';\n}\n\nconst sessionTrusted = new Set<string>();\n\nexport interface DirectoryTrustOptions {\n cwd?: string;\n /** Explicit grant for CI/headless — trust files in this absolute path. */\n trustDir?: string;\n /** Explicit grant — trust process.cwd(). */\n trustCwd?: boolean;\n nonInteractive?: boolean;\n}\n\n/**\n * Resolve directory trust before local file tools run. Does not throw — callers\n * return a tool error to the model when status is `denied`.\n */\nexport async function resolveDirectoryTrust(\n opts: DirectoryTrustOptions\n): Promise<DirectoryTrustStatus> {\n const dir = path.resolve(opts.trustDir ?? opts.cwd ?? process.cwd());\n\n if (isDirectoryTrusted(dir, { trustCwdFlag: opts.trustCwd })) return 'trusted';\n if (sessionTrusted.has(dir)) return 'trusted';\n\n // --trust-dir <path> grants trust for that path (headless escape hatch).\n if (opts.trustDir && path.resolve(opts.trustDir) === dir) {\n sessionTrusted.add(dir);\n return 'trusted';\n }\n\n if (opts.trustCwd) {\n sessionTrusted.add(dir);\n return 'trusted';\n }\n\n if (!process.stdin.isTTY || opts.nonInteractive) {\n return 'denied';\n }\n\n const decision = await promptTrustInteractive(dir);\n if (decision === 'denied') {\n return 'denied';\n }\n if (decision === 'always') {\n const store = loadTrustedDirsStore();\n if (!store.always.includes(dir)) {\n store.always.push(dir);\n saveTrustedDirsStore(store);\n }\n }\n sessionTrusted.add(dir);\n return 'trusted';\n}\n\n/** @deprecated Use resolveDirectoryTrust — kept for tests migrating off session-start gates. */\nexport async function requireDirectoryTrust(opts: DirectoryTrustOptions): Promise<void> {\n const { CLIError } = await import('./errors');\n const dir = path.resolve(opts.trustDir ?? opts.cwd ?? process.cwd());\n const status = await resolveDirectoryTrust(opts);\n if (status === 'trusted') return;\n\n throw new CLIError(\n `Directory not trusted: ${dir}\\n\\n` +\n `Re-run with --trust-cwd (or --trust-dir <path>) after reviewing files in that directory, ` +\n `or run interactively to approve trust when a local file tool is first used.`\n );\n}\n","/**\n * Handle concierge HITL interrupts in the CLI (local file ops, etc.).\n */\n\nimport readline from 'readline';\nimport {\n executeCliLocalFileAction,\n isCliLocalFileInterrupt,\n type CliLocalFileInterrupt,\n} from './local-files';\nimport { resolveDirectoryTrust } from './trusted-dirs';\n\nexport type { CliLocalFileInterrupt };\n\nexport interface HitlResumePayload {\n resumeValue: string;\n resumeInterruptId?: string;\n}\n\nexport function extractHumanInputRequest(event: Record<string, unknown>): unknown | null {\n const type = String(event.type ?? '').toUpperCase();\n if (type === 'CUSTOM' && event.name === 'human_input_request') {\n return event.value;\n }\n if (event.name === 'human_input_request') {\n return event.value;\n }\n return null;\n}\n\nexport async function handleCliHitlInterrupt(\n value: unknown,\n opts: {\n allowWrite: boolean;\n autoApprove: boolean;\n trustCwd?: boolean;\n trustDir?: string;\n /** When true, skip the trust prompt and fail if the directory is untrusted. */\n nonInteractive?: boolean;\n }\n): Promise<HitlResumePayload | null> {\n if (!value || typeof value !== 'object') return null;\n const payload = value as Record<string, unknown>;\n\n if (isCliLocalFileInterrupt(payload)) {\n const interrupt = payload as CliLocalFileInterrupt;\n if (typeof payload.interrupt_id === 'string') {\n interrupt.interrupt_id = payload.interrupt_id;\n }\n return handleCliLocalFile(interrupt, opts);\n }\n\n if (payload.type === 'present_choice') {\n return handlePresentChoiceTerminal(payload);\n }\n\n return null;\n}\n\nasync function handleCliLocalFile(\n interrupt: CliLocalFileInterrupt,\n opts: {\n allowWrite: boolean;\n trustCwd?: boolean;\n trustDir?: string;\n nonInteractive?: boolean;\n }\n): Promise<HitlResumePayload> {\n const trust = await resolveDirectoryTrust({\n cwd: process.cwd(),\n trustCwd: opts.trustCwd,\n trustDir: opts.trustDir,\n // Interactive sessions: prompt on first local-file use (review feedback).\n nonInteractive: opts.nonInteractive ?? process.stdin.isTTY !== true,\n });\n if (trust !== 'trusted') {\n return {\n resumeValue: JSON.stringify({\n ok: false,\n error: 'Directory not trusted for local file access. Re-run with --trust-cwd or --trust-dir <path>, or approve trust interactively when prompted.',\n }),\n resumeInterruptId: interrupt.interrupt_id,\n };\n }\n\n process.stderr.write(`\\n[local ${interrupt.action}] ${interrupt.path}\\n`);\n const result = executeCliLocalFileAction(process.cwd(), interrupt, {\n allowWrite: opts.allowWrite,\n });\n return {\n resumeValue: JSON.stringify(result),\n resumeInterruptId: interrupt.interrupt_id,\n };\n}\n\nasync function handlePresentChoiceTerminal(\n payload: Record<string, unknown>\n): Promise<HitlResumePayload | null> {\n const prompt =\n (typeof payload.user_prompt === 'string' && payload.user_prompt) ||\n (typeof payload.description === 'string' && payload.description) ||\n 'Choose an option';\n const markup = typeof payload.openui_markup === 'string' ? payload.openui_markup : '';\n process.stderr.write(`\\n${prompt}\\n`);\n if (markup) {\n process.stderr.write(`${markup.slice(0, 2000)}\\n`);\n }\n if (!process.stdin.isTTY) {\n return {\n resumeValue: '',\n resumeInterruptId:\n typeof payload.interrupt_id === 'string' ? payload.interrupt_id : undefined,\n };\n }\n const rl = readline.createInterface({ input: process.stdin, output: process.stderr });\n const answer = await new Promise<string>((resolve) => {\n rl.question('Your choice (value): ', resolve);\n });\n rl.close();\n return {\n resumeValue: answer.trim(),\n resumeInterruptId:\n typeof payload.interrupt_id === 'string' ? payload.interrupt_id : undefined,\n };\n}\n","/**\n * Concierge AG-UI turn loop with HITL resume (local files, present_choice).\n */\n\nimport {\n AGUIClient,\n getErrorMessage,\n getTextDelta,\n type AGUIEvent,\n type ChatMessage as AGUIChatMessage,\n} from '../cli-utils/agui';\nimport { extractHumanInputRequest, handleCliHitlInterrupt } from './cli-hitl';\n\nconst MAX_HITL_ROUNDS = 25;\n\nexport async function runConciergeAguiLoop(\n client: AGUIClient,\n initialMessages: AGUIChatMessage[],\n onEvent: (event: AGUIEvent) => void,\n opts: {\n autoApprove: boolean;\n allowWrite: boolean;\n debug?: boolean;\n trustCwd?: boolean;\n trustDir?: string;\n nonInteractive?: boolean;\n }\n): Promise<{ streamText: string; hasToolCalls: boolean }> {\n let streamText = '';\n let hasToolCalls = false;\n let resume: { resumeValue: string; resumeInterruptId?: string } | undefined;\n\n for (let round = 0; round < MAX_HITL_ROUNDS; round++) {\n let hitlPayload: unknown = null;\n\n await client.streamRequest(\n resume\n ? {\n messages: [],\n resumeValue: resume.resumeValue,\n resumeInterruptId: resume.resumeInterruptId,\n }\n : { messages: initialMessages },\n (event) => {\n onEvent(event);\n const delta = getTextDelta(event);\n if (delta) streamText += delta;\n const type = event.type?.toLowerCase() ?? '';\n if (type === 'tool_call_start') hasToolCalls = true;\n const errorMsg = getErrorMessage(event);\n if (errorMsg) process.stderr.write(`\\x1B[31mError: ${errorMsg}\\x1B[0m\\n`);\n const hitl = extractHumanInputRequest(event as Record<string, unknown>);\n if (hitl) hitlPayload = hitl;\n },\n { autoApprove: opts.autoApprove }\n );\n\n if (!hitlPayload) {\n break;\n }\n\n const next = await handleCliHitlInterrupt(hitlPayload, {\n allowWrite: opts.allowWrite,\n autoApprove: opts.autoApprove,\n trustCwd: opts.trustCwd,\n trustDir: opts.trustDir,\n nonInteractive: opts.nonInteractive,\n });\n if (!next) {\n process.stderr.write(\n ' [HITL] Unsupported interrupt in CLI — open app.gravityrail.com/setup to continue.\\n'\n );\n break;\n }\n resume = next;\n streamText = '';\n }\n\n return { streamText, hasToolCalls };\n}\n","/**\n * WebSocket-based AG-UI Realtime Client for CLI\n *\n * Handles the AG-UI protocol over WebSocket for realtime voice and text\n * interactions with the Workspace Manager. Adapted from the browser\n * implementation in src/components/voice/ws-unified.ts.\n *\n * Uses the native WebSocket global (Node.js 22+).\n */\n\nimport { EventEmitter } from 'events';\n\n// AG-UI event format over WebSocket\ninterface AGUIWebSocketEvent {\n type: string;\n name?: string;\n value?: any;\n messageId?: string;\n delta?: string;\n role?: string;\n message?: string;\n code?: string;\n toolCallId?: string;\n toolCallName?: string;\n [key: string]: any;\n}\n\nexport interface RealtimeClientOptions {\n /** WebSocket URL (wss://...) */\n url: string;\n /** JWT access token for authentication */\n token: string;\n /** Chat ID to connect to (null to create a new chat) */\n chatId: number | null;\n /** VAD mode: 'server' (default) or 'client' */\n vadMode?: 'client' | 'server';\n /** Enable debug logging */\n debug?: boolean;\n}\n\n/**\n * Realtime WebSocket client for AG-UI protocol.\n *\n * Events:\n * - connected: Login success with chat/member/assistant IDs\n * - audio: Received audio PCM16 buffer\n * - text_start/text_delta/text_end: Streaming text message\n * - transcription: User speech transcription\n * - response_message: Full message object\n * - tool_call_start/tool_call_args/tool_call_end: Tool calls\n * - run_error: Run error from server\n * - error: Connection/protocol error\n * - closed: WebSocket closed\n */\nexport class RealtimeClient extends EventEmitter {\n private ws: WebSocket | null = null;\n private connected = false;\n private options: Required<RealtimeClientOptions>;\n\n constructor(options: RealtimeClientOptions) {\n super();\n this.options = {\n vadMode: 'server',\n debug: false,\n ...options,\n };\n }\n\n /** Connect to the realtime WebSocket endpoint */\n connect(): Promise<void> {\n if (typeof globalThis.WebSocket === 'undefined') {\n return Promise.reject(\n new Error('WebSocket not available. Node.js 22+ is required for realtime mode.')\n );\n }\n\n return new Promise((resolve, reject) => {\n const params = new URLSearchParams();\n if (this.options.vadMode) {\n params.append('vad', this.options.vadMode);\n }\n const url = params.toString()\n ? `${this.options.url}?${params.toString()}`\n : this.options.url;\n\n if (this.options.debug) {\n process.stderr.write(`[debug] Connecting to ${url}\\n`);\n }\n\n this.ws = new WebSocket(url);\n\n this.ws.onerror = (event: Event) => {\n const msg = event instanceof ErrorEvent ? event.message : 'WebSocket connection failed';\n if (!this.connected) {\n reject(new Error(msg));\n } else {\n this.emit('error', new Error(msg));\n }\n };\n\n this.ws.onclose = (event: CloseEvent) => {\n const reason = event.code === 1006 ? 'Connection lost' : event.reason || 'Closed';\n this.connected = false;\n this.emit('closed', { reason, code: event.code });\n };\n\n this.ws.onmessage = (event: MessageEvent) => {\n try {\n const data = typeof event.data === 'string' ? event.data : event.data.toString();\n const parsed: AGUIWebSocketEvent = JSON.parse(data);\n this.emit('ws_recv', parsed);\n this.handleEvent(parsed);\n } catch {\n if (this.options.debug) {\n process.stderr.write(`[debug] Failed to parse message\\n`);\n }\n }\n };\n\n this.ws.onopen = () => {\n if (this.options.debug) {\n process.stderr.write('[debug] WebSocket connected, sending login\\n');\n }\n this.sendCustom('voice.login', {\n token: this.options.token,\n chat_id: this.options.chatId,\n vad: this.options.vadMode,\n });\n };\n\n // Wait for login_success or timeout\n const timeout = setTimeout(() => {\n if (!this.connected) {\n this.close();\n reject(new Error('Connection timeout - no login response within 10s'));\n }\n }, 10000);\n\n this.once('connected', () => {\n clearTimeout(timeout);\n resolve();\n });\n\n this.once('error', () => {\n clearTimeout(timeout);\n });\n });\n }\n\n private handleEvent(event: AGUIWebSocketEvent): void {\n switch (event.type) {\n case 'CUSTOM':\n this.handleCustomEvent(event.name || '', event.value);\n break;\n\n case 'TEXT_MESSAGE_START':\n this.emit('text_start', { messageId: event.messageId || '' });\n break;\n case 'TEXT_MESSAGE_CONTENT':\n this.emit('text_delta', {\n messageId: event.messageId || '',\n delta: event.delta || '',\n });\n break;\n case 'TEXT_MESSAGE_END':\n this.emit('text_end', { messageId: event.messageId || '' });\n break;\n\n case 'TOOL_CALL_START':\n this.emit('tool_call_start', {\n toolCallId: event.toolCallId || '',\n toolCallName: event.toolCallName || '',\n });\n break;\n case 'TOOL_CALL_ARGS':\n this.emit('tool_call_args', {\n toolCallId: event.toolCallId || '',\n delta: event.delta || '',\n });\n break;\n case 'TOOL_CALL_END':\n this.emit('tool_call_end', { toolCallId: event.toolCallId || '' });\n break;\n case 'TOOL_CALL_RESULT':\n this.emit('tool_call_result', {\n toolCallId: event.toolCallId || '',\n result: event.result,\n });\n break;\n\n case 'RUN_STARTED':\n this.emit('run_started', { runId: event.runId });\n break;\n case 'RUN_FINISHED':\n this.emit('run_finished', { runId: event.runId });\n break;\n case 'RUN_ERROR':\n this.emit('run_error', {\n message: event.message || 'Unknown error',\n code: event.code,\n });\n break;\n\n default:\n if (this.options.debug) {\n process.stderr.write(`[debug] Unknown event type: ${event.type}\\n`);\n }\n }\n }\n\n private handleCustomEvent(name: string, value: any): void {\n switch (name) {\n case 'voice.login_success':\n this.connected = true;\n this.emit('connected', {\n chatId: value?.chat_id,\n memberId: value?.member_id,\n assistantId: value?.assistant_id,\n });\n break;\n\n case 'voice.audio':\n if (value?.data) {\n const pcm16 = Buffer.from(value.data, 'base64');\n this.emit('audio', { pcm16, messageId: value.message_id });\n }\n break;\n\n case 'voice.audio_begin':\n this.emit('audio_begin', { messageId: value?.message_id });\n break;\n case 'voice.audio_end':\n this.emit('audio_end', { messageId: value?.message_id });\n break;\n\n case 'voice.interrupt':\n this.emit('interrupt', { messageId: value?.message_id });\n break;\n\n case 'voice.response_message':\n if (value) {\n this.emit('response_message', value);\n }\n break;\n\n case 'voice.transcription':\n if (value) {\n this.emit('transcription', { text: value.text, role: value.role });\n }\n break;\n\n case 'voice.truncate':\n if (value) {\n this.emit('truncate', {\n messageId: value.message_id,\n content: value.content,\n originalContent: value.original_content,\n truncationReason: value.truncation_reason || 'barge_in',\n truncatedAtMs: value.audio_end_ms,\n });\n }\n break;\n\n case 'app.data_update':\n case 'app.navigation':\n case 'app.notification':\n break;\n\n default:\n if (this.options.debug) {\n process.stderr.write(`[debug] Unknown CUSTOM event: ${name}\\n`);\n }\n }\n }\n\n private sendCustom(name: string, value?: any): void {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n return;\n }\n const event: AGUIWebSocketEvent = { type: 'CUSTOM', name };\n if (value !== undefined) {\n event.value = value;\n }\n this.emit('ws_send', event);\n this.ws.send(JSON.stringify(event));\n }\n\n /** Send raw PCM16 audio data (will be base64-encoded) */\n sendAudio(pcm16: Buffer): void {\n this.sendCustom('voice.audio', {\n data: pcm16.toString('base64'),\n format: 'pcm16',\n sample_rate: 24000,\n });\n }\n\n /** Signal the start of an audio utterance */\n sendAudioBegin(messageId: string): void {\n this.sendCustom('voice.audio_begin', { message_id: messageId });\n }\n\n /** Signal the end of an audio utterance */\n sendAudioEnd(): void {\n this.sendCustom('voice.audio_end');\n }\n\n /** Send a text message (triggers AI inference) */\n sendTextMessage(content: string): void {\n this.sendCustom('voice.user_message', {\n message: { role: 'user', content },\n });\n }\n\n /** Send interrupt signal with playback position */\n sendInterrupt(audioEndMs: number, messageId?: string): void {\n this.sendCustom('voice.interrupt', {\n audio_end_ms: audioEndMs,\n message_id: messageId,\n });\n }\n\n /** Check if the client is connected */\n isConnected(): boolean {\n return this.connected && this.ws?.readyState === WebSocket.OPEN;\n }\n\n /** Close the connection */\n close(): void {\n this.connected = false;\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n }\n}\n","/**\n * Chat TUI — terminal chat interface using ANSI escape codes.\n *\n * Layout (normal):\n * Rows 1..R-2: Message area (full width)\n * Row R-1: Separator + hints\n * Row R: Input (\"You: ...\")\n *\n * Layout (debug):\n * Rows 1..R-2: Chat (left) │ Debug log (right)\n * Row R-1: Separator + hints\n * Row R: Input (\"You: ...\")\n *\n * Keyboard:\n * Up/Down Scroll 1 line\n * Page Up/Down Scroll 1 page\n * Ctrl+B Page up (less-style)\n * Ctrl+F Page down (less-style)\n * Home/End Top / bottom\n * Ctrl+O Toggle detail expansion (tool calls + debug messages)\n * Ctrl+D Toggle debug panel (when --debug)\n * Ctrl+C / exit Quit\n *\n * Mouse:\n * Scroll wheel Scroll 3 lines\n *\n * Zero external dependencies — only Node.js built-ins.\n */\n\nimport { createWriteStream, type WriteStream } from 'fs';\n\n// ─── Public types ─────────────────────────────────────────────────────────────\n\nexport interface ChatMessage {\n role: 'user' | 'assistant' | 'system';\n content: string;\n /** Reason the message was truncated (voice interruption) */\n truncationReason?: string;\n /** Ms offset where truncation occurred */\n truncatedAtMs?: number;\n /** The full original content before truncation */\n originalContent?: string;\n}\n\nexport interface ChatTUIOptions {\n /** Called when the user sends a message */\n onSend: (text: string) => void;\n /** Called when the user exits (Ctrl+C, 'exit', 'quit') */\n onExit: () => void;\n /** Enable debug panel showing WebSocket traffic */\n debug?: boolean;\n /** Environment name (e.g. 'dev', 'staging', 'prod') — controls debug log file creation */\n env?: string;\n}\n\n// ─── Item types ───────────────────────────────────────────────────────────────\n\nexport interface ToolCallItem {\n kind: 'tool_call';\n id: string;\n name: string;\n args: string;\n done: boolean;\n}\n\nexport interface ToolResultItem {\n kind: 'tool_result';\n toolCallId: string;\n toolName: string;\n content: string;\n}\n\nexport type ChatItem = ChatMessage | ToolCallItem | ToolResultItem;\n\nfunction isToolCall(item: ChatItem): item is ToolCallItem {\n return 'kind' in item && (item as ToolCallItem).kind === 'tool_call';\n}\n\nfunction isToolResult(item: ChatItem): item is ToolResultItem {\n return 'kind' in item && (item as ToolResultItem).kind === 'tool_result';\n}\n\n/** Friendly label for truncation reason */\nfunction getTruncationLabel(reason: string, truncatedAtMs?: number): string {\n const timeStr = truncatedAtMs ? ` at ${(truncatedAtMs / 1000).toFixed(1)}s` : '';\n switch (reason) {\n case 'barge_in':\n return `interrupted: user spoke${timeStr}`;\n case 'client_interrupt':\n return `interrupted${timeStr}`;\n case 'user_cancel':\n return `cancelled by user${timeStr}`;\n case 'error':\n return `error${timeStr}`;\n default:\n return `interrupted${timeStr}`;\n }\n}\n\n/** Extract the unspoken portion of a truncated message */\nfunction getExtraContent(\n content: string | undefined,\n originalContent: string | undefined\n): string | null {\n if (!content || !originalContent) return null;\n const stripped = content.replace(/—interrupted$/, '');\n if (originalContent.startsWith(stripped)) {\n const extra = originalContent.slice(stripped.length);\n return extra.length > 0 ? extra : null;\n }\n return originalContent !== content ? originalContent : null;\n}\n\n// ─── Debug log entry ──────────────────────────────────────────────────────────\n\ninterface DebugEntry {\n direction: 'in' | 'out';\n summary: string; // one-line summary (always shown)\n detail: string; // full JSON (shown when expanded)\n ts: string; // HH:MM:SS\n}\n\n// ─── ANSI helpers ─────────────────────────────────────────────────────────────\n\nconst CSI = '\\x1B[';\nconst HIDE_CURSOR = `${CSI}?25l`;\nconst SHOW_CURSOR = `${CSI}?25h`;\nconst ALT_SCREEN_ON = `${CSI}?1049h`;\nconst ALT_SCREEN_OFF = `${CSI}?1049l`;\nconst CLEAR_EOL = `${CSI}K`;\nconst RESET = `${CSI}0m`;\nconst MOUSE_ON = `${CSI}?1000h${CSI}?1006h`; // Button events + SGR extended\nconst MOUSE_OFF = `${CSI}?1000l${CSI}?1006l`;\n\nconst BLUE = `${CSI}34m`;\nconst GREEN = `${CSI}32m`;\nconst GRAY = `${CSI}90m`;\nconst YELLOW = `${CSI}33m`;\nconst ORANGE = `${CSI}38;5;208m`; // 256-color orange — inbound\nconst LIGHT_BLUE = `${CSI}38;5;117m`; // 256-color light blue — outbound\nconst DIM = `${CSI}2m`;\nconst DIM_ITALIC_GRAY = `${CSI}2;3;90m`; // dim + italic + gray\n\nfunction moveTo(row: number, col: number): string {\n return `${CSI}${row};${col}H`;\n}\n\n// ─── ChatTUI ──────────────────────────────────────────────────────────────────\n\nexport class ChatTUI {\n private items: ChatItem[] = [];\n private inputBuffer = '';\n private isStreaming = false;\n private streamContent = '';\n private scrollOffset = 0;\n private expandDetails = false;\n private rows = 24;\n private cols = 80;\n private started = false;\n private renderTimer: ReturnType<typeof setTimeout> | null = null;\n private displayLinesCache: string[] | null = null;\n private debugLinesCache: string[] | null = null;\n private options: ChatTUIOptions;\n\n // Debug panel state\n private debugEntries: DebugEntry[] = [];\n private debugPanelVisible = false;\n private debugLogStream: WriteStream | null = null;\n\n // Escape sequence accumulator for raw stdin parsing\n private escBuf = '';\n private escTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(options: ChatTUIOptions) {\n this.options = options;\n this.debugPanelVisible = !!options.debug;\n }\n\n /** Whether the debug panel is currently being rendered */\n private get debugVisible(): boolean {\n return this.debugPanelVisible;\n }\n\n // ─── Lifecycle ──────────────────────────────────────────────────────\n\n start(): void {\n this.updateDimensions();\n process.stdout.write(ALT_SCREEN_ON + MOUSE_ON);\n process.stdout.write(`${CSI}1;${Math.max(1, this.rows - 2)}r`);\n\n // Raw mode + direct data handler (not readline — we parse escape seqs ourselves)\n process.stdin.setEncoding('utf8');\n if (process.stdin.isTTY) process.stdin.setRawMode(true);\n process.stdin.on('data', this.onData);\n process.stdin.resume();\n\n process.stdout.on('resize', this.onResize);\n process.on('exit', this.restoreTerminal);\n\n // Debug log file — only write to disk in dev/staging (never in prod to avoid PHI on disk)\n if (this.options.debug && this.options.env !== 'prod') {\n this.debugLogStream = createWriteStream('gr-cli-realtime-debug.log', { flags: 'a' });\n this.debugLogStream.write(`\\n--- session ${new Date().toISOString()} ---\\n`);\n }\n\n this.started = true;\n this.render();\n }\n\n stop(): void {\n if (!this.started) return;\n this.started = false;\n if (this.renderTimer) {\n clearTimeout(this.renderTimer);\n this.renderTimer = null;\n }\n this.clearEsc();\n if (this.debugLogStream) {\n this.debugLogStream.end();\n this.debugLogStream = null;\n }\n this.restoreTerminal();\n process.stdout.removeListener('resize', this.onResize);\n process.stdin.removeListener('data', this.onData);\n if (process.stdin.isTTY) process.stdin.setRawMode(false);\n process.stdin.pause();\n process.removeListener('exit', this.restoreTerminal);\n }\n\n // ─── Chat state ────────────────────────────────────────────────────\n\n loadHistory(items: ChatItem[]): void {\n this.items = items.filter((item) => (isToolCall(item) ? true : item.content?.trim()));\n this.dirty();\n }\n\n streamStart(): void {\n this.isStreaming = true;\n this.streamContent = '';\n this.scrollOffset = 0;\n this.dirty();\n }\n\n streamDelta(delta: string): void {\n this.streamContent += delta;\n this.dirty();\n }\n\n streamEnd(): void {\n if (this.streamContent.trim()) {\n this.items.push({ role: 'assistant', content: this.streamContent });\n }\n this.isStreaming = false;\n this.streamContent = '';\n this.dirty();\n }\n\n toolCallStart(id: string, name: string): void {\n this.items.push({ kind: 'tool_call', id, name, args: '', done: false });\n this.dirty();\n }\n\n toolCallArgs(id: string, delta: string): void {\n const tc = this.findToolCall(id);\n if (tc) {\n tc.args += delta;\n this.dirty();\n }\n }\n\n toolCallEnd(id: string): void {\n const tc = this.findToolCall(id);\n if (tc) {\n tc.done = true;\n this.dirty();\n }\n }\n\n /** Add a transcription of the user's spoken words (voice mode) */\n addTranscription(text: string): void {\n this.items.push({ role: 'user', content: text });\n this.scrollOffset = 0;\n this.dirty();\n }\n\n /**\n * Truncate the most recent assistant message (voice interruption).\n * Replaces its content with the spoken portion and stores the original.\n */\n truncateAssistant(\n content: string,\n originalContent: string | undefined,\n reason: string,\n truncatedAtMs?: number\n ): void {\n // If currently streaming, commit the stream first\n if (this.isStreaming) {\n this.isStreaming = false;\n this.streamContent = '';\n }\n\n // Find the last assistant message and update it\n for (let i = this.items.length - 1; i >= 0; i--) {\n const item = this.items[i]!;\n if ('role' in item && item.role === 'assistant') {\n item.content = content;\n item.truncationReason = reason;\n item.truncatedAtMs = truncatedAtMs;\n item.originalContent = originalContent;\n this.dirty();\n return;\n }\n }\n\n // No existing assistant message — push the truncated content\n this.items.push({\n role: 'assistant',\n content,\n truncationReason: reason,\n truncatedAtMs: truncatedAtMs,\n originalContent,\n });\n this.dirty();\n }\n\n toolCallResult(toolCallId: string, toolName: string, content: string): void {\n this.items.push({ kind: 'tool_result', toolCallId, toolName, content });\n this.dirty();\n }\n\n /** Find the tool name for a given tool call ID */\n findToolCallName(toolCallId: string): string {\n for (let i = this.items.length - 1; i >= 0; i--) {\n const item = this.items[i]!;\n if (isToolCall(item) && item.id === toolCallId) return item.name;\n }\n return 'tool';\n }\n\n showError(msg: string): void {\n this.items.push({ role: 'system', content: `Error: ${msg}` });\n this.dirty();\n }\n\n // ─── Debug panel ──────────────────────────────────────────────────\n\n /** Log a WebSocket message to the debug panel and (optionally) log file */\n logDebug(direction: 'in' | 'out', raw: any): void {\n const redacted = redactAudio(raw);\n const now = new Date();\n const ts = `${pad2(now.getHours())}:${pad2(now.getMinutes())}:${pad2(now.getSeconds())}`;\n\n // Write to log file (JSON lines, with full redacted payload)\n if (this.debugLogStream) {\n const logLine = JSON.stringify({ ts: now.toISOString(), dir: direction, ...redacted });\n this.debugLogStream.write(logLine + '\\n');\n }\n\n // Add to in-memory debug panel\n const summary = buildDebugSummary(direction, redacted);\n let detail: string;\n try {\n detail = JSON.stringify(redacted, null, 2);\n } catch {\n detail = String(redacted);\n }\n this.debugEntries.push({ direction, summary, detail, ts });\n // Cap at 500 entries to prevent memory growth\n if (this.debugEntries.length > 500) {\n this.debugEntries = this.debugEntries.slice(-300);\n }\n this.debugLinesCache = null;\n this.dirty();\n }\n\n // ─── Private helpers ──────────────────────────────────────────────\n\n private findToolCall(id: string): ToolCallItem | undefined {\n for (let i = this.items.length - 1; i >= 0; i--) {\n const item = this.items[i]!;\n if (isToolCall(item) && item.id === id) return item;\n }\n return undefined;\n }\n\n private dirty(): void {\n this.displayLinesCache = null;\n this.debugLinesCache = null;\n this.scheduleRender();\n }\n\n private restoreTerminal = (): void => {\n process.stdout.write(`${MOUSE_OFF}${CSI}r${ALT_SCREEN_OFF}${SHOW_CURSOR}`);\n };\n\n private updateDimensions(): void {\n this.rows = process.stdout.rows || 24;\n this.cols = process.stdout.columns || 80;\n }\n\n /** Width of the chat (left) panel */\n private chatWidth(): number {\n if (!this.debugVisible) return this.cols;\n // 60% for chat, 40% for debug, with 1 col for divider\n return Math.max(30, Math.floor(this.cols * 0.6) - 1);\n }\n\n /** Width of the debug (right) panel */\n private debugWidth(): number {\n if (!this.debugVisible) return 0;\n return this.cols - this.chatWidth() - 1; // -1 for divider\n }\n\n private scrollHeight(): number {\n return Math.max(1, this.rows - 2);\n }\n\n private pageSize(): number {\n return Math.max(1, this.rows - 4);\n }\n\n // ─── Scroll ───────────────────────────────────────────────────────\n\n private scrollUp(lines: number): void {\n const total = this.getDisplayLines().length;\n const max = Math.max(0, total - this.scrollHeight());\n this.scrollOffset = Math.min(max, this.scrollOffset + lines);\n this.render();\n }\n\n private scrollDown(lines: number): void {\n this.scrollOffset = Math.max(0, this.scrollOffset - lines);\n this.render();\n }\n\n private scrollToTop(): void {\n const total = this.getDisplayLines().length;\n this.scrollOffset = Math.max(0, total - this.scrollHeight());\n this.render();\n }\n\n private scrollToBottom(): void {\n this.scrollOffset = 0;\n this.render();\n }\n\n // ─── Raw stdin parsing ────────────────────────────────────────────\n //\n // We parse stdin directly instead of using readline.emitKeypressEvents\n // because readline doesn't understand SGR mouse sequences and leaks\n // their contents into keypress events as regular characters.\n\n private onData = (data: string): void => {\n for (let i = 0; i < data.length; i++) {\n const ch = data[i]!;\n\n // Accumulating an escape sequence\n if (this.escBuf) {\n this.escBuf += ch;\n\n if (this.escBuf.length === 2) {\n if (ch !== '[') {\n // Not a CSI sequence (Alt+key etc.) — discard\n this.clearEsc();\n }\n continue;\n }\n\n // \\x1B[... — wait for a terminating character (letter or ~)\n if (/[A-Za-z~]/.test(ch)) {\n this.handleCSI(this.escBuf.slice(2, -1), ch);\n this.clearEsc();\n } else if (this.escBuf.length > 32) {\n this.clearEsc(); // safety bail\n }\n continue;\n }\n\n // Start of escape sequence\n if (ch === '\\x1B') {\n this.escBuf = '\\x1B';\n this.escTimer = setTimeout(() => {\n // Bare ESC with no follow-up — ignore\n this.escBuf = '';\n this.escTimer = null;\n }, 100);\n continue;\n }\n\n // Regular byte\n this.handleByte(ch);\n }\n };\n\n private clearEsc(): void {\n this.escBuf = '';\n if (this.escTimer) {\n clearTimeout(this.escTimer);\n this.escTimer = null;\n }\n }\n\n /** Handle a parsed CSI sequence: params is everything between \\x1B[ and the final char */\n private handleCSI(params: string, code: string): void {\n // Mouse SGR: \\x1B[<button;col;rowM (press) or m (release)\n if (params.startsWith('<') && (code === 'M' || code === 'm')) {\n if (code === 'm') return; // ignore button release\n const parts = params.slice(1).split(';');\n if (parts.length >= 1) {\n const button = parseInt(parts[0]!, 10);\n if (button === 64) this.scrollUp(3);\n else if (button === 65) this.scrollDown(3);\n }\n return;\n }\n\n // Arrow keys (no params)\n if (!params) {\n if (code === 'A') {\n this.scrollUp(1);\n return;\n }\n if (code === 'B') {\n this.scrollDown(1);\n return;\n }\n // Home/End (xterm-style)\n if (code === 'H') {\n this.scrollToTop();\n return;\n }\n if (code === 'F') {\n this.scrollToBottom();\n return;\n }\n }\n\n // Tilde sequences: Page Up (5~), Page Down (6~), Home (1~), End (4~)\n if (code === '~') {\n if (params === '5') {\n this.scrollUp(this.pageSize());\n return;\n }\n if (params === '6') {\n this.scrollDown(this.pageSize());\n return;\n }\n if (params === '1') {\n this.scrollToTop();\n return;\n }\n if (params === '4') {\n this.scrollToBottom();\n return;\n }\n }\n }\n\n /** Handle a single non-escape byte */\n private handleByte(ch: string): void {\n const code = ch.charCodeAt(0);\n\n // Ctrl+C → exit\n if (code === 0x03) {\n this.stop();\n this.options.onExit();\n return;\n }\n\n // Ctrl+B → page up (less-style)\n if (code === 0x02) {\n this.scrollUp(this.pageSize());\n return;\n }\n\n // Ctrl+F → page down (less-style)\n if (code === 0x06) {\n this.scrollDown(this.pageSize());\n return;\n }\n\n // Ctrl+D → toggle debug panel visibility (always available)\n if (code === 0x04) {\n this.debugPanelVisible = !this.debugPanelVisible;\n this.displayLinesCache = null;\n this.debugLinesCache = null;\n this.render();\n return;\n }\n\n // Ctrl+O → toggle detail expansion (tool calls + debug messages)\n if (code === 0x0f) {\n this.expandDetails = !this.expandDetails;\n this.displayLinesCache = null;\n this.debugLinesCache = null;\n this.render();\n return;\n }\n\n // Enter\n if (code === 0x0d) {\n this.handleEnter();\n return;\n }\n\n // Backspace (0x7F on most terminals, 0x08 on some)\n if (code === 0x7f || code === 0x08) {\n if (this.inputBuffer.length > 0) {\n this.inputBuffer = this.inputBuffer.slice(0, -1);\n this.renderInputLine();\n }\n return;\n }\n\n // Ignore other control characters\n if (code < 0x20) return;\n\n // Printable character → add to input\n this.inputBuffer += ch;\n this.renderInputLine();\n }\n\n private handleEnter(): void {\n const text = this.inputBuffer.trim();\n this.inputBuffer = '';\n if (!text) {\n this.renderInputLine();\n return;\n }\n if (text.toLowerCase() === 'exit' || text.toLowerCase() === 'quit') {\n this.stop();\n this.options.onExit();\n return;\n }\n this.items.push({ role: 'user', content: text });\n this.scrollOffset = 0;\n this.displayLinesCache = null;\n this.render();\n this.options.onSend(text);\n }\n\n // ─── Events ───────────────────────────────────────────────────────\n\n private onResize = (): void => {\n this.updateDimensions();\n process.stdout.write(`${CSI}1;${Math.max(1, this.rows - 2)}r`);\n this.displayLinesCache = null;\n this.debugLinesCache = null;\n this.render();\n };\n\n // ─── Rendering ────────────────────────────────────────────────────\n\n private scheduleRender(): void {\n if (!this.started || this.renderTimer) return;\n this.renderTimer = setTimeout(() => {\n this.renderTimer = null;\n this.render();\n }, 30);\n }\n\n private getDisplayLines(): string[] {\n if (!this.displayLinesCache) {\n this.displayLinesCache = this.buildDisplayLines();\n }\n return this.displayLinesCache;\n }\n\n private getDebugLines(): string[] {\n if (!this.debugLinesCache) {\n this.debugLinesCache = this.buildDebugLines();\n }\n return this.debugLinesCache;\n }\n\n private render(): void {\n if (!this.started) return;\n this.updateDimensions();\n\n const sh = this.scrollHeight();\n const displayLines = this.getDisplayLines();\n const total = displayLines.length;\n\n // Clamp scroll offset\n const maxOff = Math.max(0, total - sh);\n if (this.scrollOffset > maxOff) this.scrollOffset = maxOff;\n\n // Select visible slice for chat\n let visible: string[];\n if (total <= sh) {\n visible = [...new Array<string>(sh - total).fill(''), ...displayLines];\n } else {\n const end = total - this.scrollOffset;\n const start = end - sh;\n visible = displayLines.slice(start, end);\n }\n\n const buf: string[] = [HIDE_CURSOR];\n\n if (this.debugVisible) {\n this.renderSplitScreen(buf, visible, sh);\n } else {\n for (let i = 0; i < sh; i++) {\n buf.push(moveTo(i + 1, 1), visible[i] || '', CLEAR_EOL);\n }\n }\n\n // Separator with hints (row R-1)\n buf.push(moveTo(this.rows - 1, 1), this.buildSeparator(), CLEAR_EOL);\n\n // Input (row R)\n buf.push(moveTo(this.rows, 1), `${BLUE}You:${RESET} ${this.inputBuffer}${CLEAR_EOL}`);\n\n buf.push(SHOW_CURSOR);\n process.stdout.write(buf.join(''));\n }\n\n private renderSplitScreen(buf: string[], chatVisible: string[], sh: number): void {\n const cw = this.chatWidth();\n const dw = this.debugWidth();\n const divCol = cw + 1;\n\n // Debug panel: auto-scroll to bottom (always show latest)\n const debugLines = this.getDebugLines();\n const debugTotal = debugLines.length;\n let debugVisible: string[];\n if (debugTotal <= sh) {\n debugVisible = [...new Array<string>(sh - debugTotal).fill(''), ...debugLines];\n } else {\n debugVisible = debugLines.slice(debugTotal - sh);\n }\n\n for (let i = 0; i < sh; i++) {\n const chatLine = truncateAnsi(chatVisible[i] || '', cw);\n const debugLine = truncateAnsi(debugVisible[i] || '', dw);\n buf.push(\n moveTo(i + 1, 1),\n chatLine,\n CLEAR_EOL, // clear to end handles rest, but we need to position divider\n moveTo(i + 1, divCol),\n `${DIM}\\u2502${RESET}`,\n debugLine\n );\n // Clear remainder of the debug area\n buf.push(CLEAR_EOL);\n }\n }\n\n private renderInputLine(): void {\n process.stdout.write(\n `${moveTo(this.rows, 1)}${BLUE}You:${RESET} ${this.inputBuffer}${CLEAR_EOL}`\n );\n }\n\n // ─── Separator ────────────────────────────────────────────────────\n\n private buildSeparator(): string {\n const hints: string[] = [];\n\n if (this.scrollOffset > 0) {\n hints.push(`\\u2191${this.scrollOffset}`);\n }\n\n const hasDetails =\n this.items.some((i) => isToolCall(i) || isToolResult(i)) || this.options.debug;\n if (hasDetails) {\n hints.push(`^O ${this.expandDetails ? 'collapse' : 'details'}`);\n }\n\n if (this.options.debug) {\n hints.push(`^D ${this.debugPanelVisible ? 'hide' : 'show'} debug`);\n }\n\n const lineWidth = Math.min(this.cols, 60);\n\n if (!hints.length) {\n return `${GRAY}${'\\u2500'.repeat(lineWidth)}${RESET}`;\n }\n\n const hintStr = ` ${hints.join(' ')} `;\n const dashes = Math.max(0, lineWidth - hintStr.length);\n const left = Math.max(2, Math.floor(dashes / 2));\n const right = Math.max(2, dashes - left);\n return `${GRAY}${'\\u2500'.repeat(left)}${hintStr}${'\\u2500'.repeat(right)}${RESET}`;\n }\n\n // ─── Chat display line building ───────────────────────────────────\n\n private buildDisplayLines(): string[] {\n const lines: string[] = [];\n const w = this.chatWidth();\n\n for (const item of this.items) {\n if (isToolCall(item)) {\n this.appendToolCallLines(lines, item, w);\n } else if (isToolResult(item)) {\n this.appendToolResultLines(lines, item, w);\n } else {\n this.appendMessageLines(lines, item, w);\n }\n lines.push('');\n }\n\n if (this.isStreaming) {\n this.appendStreamLines(lines, w);\n }\n\n return lines;\n }\n\n private appendToolCallLines(lines: string[], tc: ToolCallItem, width: number): void {\n const status = tc.done ? 'Called' : 'Calling';\n const summary = ` ${GRAY}${status} ${tc.name}${tc.done ? '' : '...'}${RESET}`;\n\n if (!this.expandDetails) {\n lines.push(summary);\n return;\n }\n\n lines.push(summary);\n if (tc.args) {\n let formatted = tc.args;\n try {\n formatted = JSON.stringify(JSON.parse(tc.args), null, 2);\n } catch {\n // use raw\n }\n const indent = ' ';\n for (const argLine of formatted.split('\\n')) {\n for (const wl of this.wrapText(argLine, width - indent.length)) {\n lines.push(`${indent}${GRAY}${wl}${RESET}`);\n }\n }\n }\n }\n\n private appendToolResultLines(lines: string[], tr: ToolResultItem, width: number): void {\n if (!this.expandDetails) {\n // Collapsed: show truncated one-liner\n const maxLen = width - 10;\n const preview = tr.content.replace(/\\n/g, ' ').slice(0, maxLen);\n const truncated = preview.length < tr.content.length ? '...' : '';\n lines.push(` ${GRAY}\\u2192 ${tr.toolName}: ${preview}${truncated}${RESET}`);\n return;\n }\n\n lines.push(` ${GRAY}\\u2192 ${tr.toolName} result:${RESET}`);\n let formatted = tr.content;\n try {\n formatted = JSON.stringify(JSON.parse(tr.content), null, 2);\n } catch {\n // use raw\n }\n const indent = ' ';\n for (const resultLine of formatted.split('\\n')) {\n for (const wl of this.wrapText(resultLine, width - indent.length)) {\n lines.push(`${indent}${GRAY}${wl}${RESET}`);\n }\n }\n }\n\n private appendMessageLines(lines: string[], msg: ChatMessage, width: number): void {\n if (msg.role === 'system') {\n for (const para of msg.content.split('\\n')) {\n for (const wl of this.wrapText(para, width - 2)) {\n lines.push(` ${GRAY}${wl}${RESET}`);\n }\n }\n return;\n }\n\n const isUser = msg.role === 'user';\n const label = isUser ? `${BLUE}You:${RESET} ` : `${GREEN}Assistant:${RESET} `;\n const labelWidth = isUser ? 5 : 12;\n const indent = ' '.repeat(labelWidth);\n let first = true;\n\n // Strip the \"—interrupted\" suffix from content for display\n const displayContent = msg.truncationReason\n ? msg.content.replace(/—interrupted$/, '')\n : msg.content;\n\n for (const para of displayContent.split('\\n')) {\n for (const wl of this.wrapText(para, width - labelWidth)) {\n lines.push(first ? label + wl : indent + wl);\n first = false;\n }\n }\n\n // Truncation indicator\n if (msg.truncationReason) {\n const reasonLabel = getTruncationLabel(msg.truncationReason, msg.truncatedAtMs);\n lines.push(`${indent}${YELLOW}[${reasonLabel}]${RESET}`);\n\n // Show unspoken text in dim italic gray\n const extra = getExtraContent(msg.content, msg.originalContent);\n if (extra) {\n for (const para of extra.split('\\n')) {\n for (const wl of this.wrapText(para, width - labelWidth)) {\n lines.push(`${indent}${DIM_ITALIC_GRAY}${wl}${RESET}`);\n }\n }\n }\n }\n }\n\n private appendStreamLines(lines: string[], width: number): void {\n const label = `${GREEN}Assistant:${RESET} `;\n const labelWidth = 12;\n const indent = ' '.repeat(labelWidth);\n\n if (!this.streamContent) {\n lines.push(label);\n return;\n }\n\n let first = true;\n for (const para of this.streamContent.split('\\n')) {\n for (const wl of this.wrapText(para, width - labelWidth)) {\n lines.push(first ? label + wl : indent + wl);\n first = false;\n }\n }\n }\n\n // ─── Debug display line building ──────────────────────────────────\n\n private buildDebugLines(): string[] {\n const lines: string[] = [];\n const dw = this.debugWidth();\n if (dw <= 0) return lines;\n\n for (const entry of this.debugEntries) {\n const color = entry.direction === 'in' ? ORANGE : LIGHT_BLUE;\n const arrow = entry.direction === 'in' ? '\\u25bc' : '\\u25b2'; // ▼ in, ▲ out\n const prefix = `${DIM}${entry.ts}${RESET} ${color}${arrow}${RESET} `;\n const prefixWidth = entry.ts.length + 3; // \"HH:MM:SS ▼ \"\n\n if (!this.expandDetails) {\n // Collapsed: single summary line, truncated\n const maxSummary = dw - prefixWidth;\n const summaryText = entry.summary.slice(0, maxSummary);\n lines.push(`${prefix}${color}${summaryText}${RESET}`);\n } else {\n // Expanded: summary + full detail\n lines.push(`${prefix}${color}${entry.summary}${RESET}`);\n const indent = ' '.repeat(prefixWidth);\n for (const detailLine of entry.detail.split('\\n')) {\n for (const wl of this.wrapText(detailLine, dw - prefixWidth)) {\n lines.push(`${indent}${color}${DIM}${wl}${RESET}`);\n }\n }\n lines.push(''); // blank line between expanded entries\n }\n }\n\n return lines;\n }\n\n // ─── Text utilities ───────────────────────────────────────────────\n\n private wrapText(text: string, maxWidth: number): string[] {\n if (maxWidth <= 0) maxWidth = 1;\n if (!text) return [''];\n if (text.length <= maxWidth) return [text];\n\n const words = text.split(' ');\n const result: string[] = [];\n let current = '';\n\n for (const word of words) {\n if (!current) {\n current = word;\n } else if (current.length + 1 + word.length <= maxWidth) {\n current += ' ' + word;\n } else {\n result.push(current);\n current = word;\n }\n }\n if (current) result.push(current);\n\n return result.length ? result : [''];\n }\n}\n\n// ─── Module-level helpers ─────────────────────────────────────────────────────\n\nfunction pad2(n: number): string {\n return n < 10 ? `0${n}` : String(n);\n}\n\n/** Truncate a string (which may contain ANSI codes) to fit in maxCols visible characters */\nfunction truncateAnsi(s: string, maxCols: number): string {\n if (maxCols <= 0) return '';\n let visible = 0;\n let i = 0;\n while (i < s.length && visible < maxCols) {\n if (s[i] === '\\x1B') {\n // Skip ANSI sequence\n const end = s.indexOf('m', i);\n if (end !== -1) {\n i = end + 1;\n } else {\n i++;\n }\n } else {\n visible++;\n i++;\n }\n }\n // Append RESET to close any open ANSI sequences\n return s.slice(0, i) + RESET;\n}\n\n/** Redact audio PCM buffers from WebSocket messages for debug display (does not redact text content) */\nfunction redactAudio(msg: any): any {\n if (!msg || typeof msg !== 'object') return msg;\n const clone = { ...msg };\n // Redact voice.audio CUSTOM events\n if (clone.type === 'CUSTOM' && clone.value && typeof clone.value === 'object') {\n const name = clone.name || '';\n if (name === 'voice.audio' && clone.value.data) {\n clone.value = { ...clone.value, data: '[audio]' };\n }\n }\n return clone;\n}\n\n/** Build a one-line summary of a WebSocket message for the collapsed debug view */\nfunction buildDebugSummary(_direction: 'in' | 'out', msg: any): string {\n if (!msg || typeof msg !== 'object') return String(msg);\n\n if (msg.type === 'CUSTOM') {\n const name = msg.name || '?';\n // For audio, just show the event name\n if (name === 'voice.audio') return name;\n // For other CUSTOM events, show name + compact value hint\n if (msg.value && typeof msg.value === 'object') {\n const keys = Object.keys(msg.value);\n if (keys.length <= 3) {\n return `${name} {${keys.join(', ')}}`;\n }\n return `${name} {${keys.length} keys}`;\n }\n return name;\n }\n\n // Standard AG-UI events: TEXT_MESSAGE_CONTENT, TOOL_CALL_START, etc.\n const type = msg.type || '?';\n if (msg.delta) {\n const preview = msg.delta.length > 30 ? msg.delta.slice(0, 30) + '...' : msg.delta;\n return `${type} \"${preview}\"`;\n }\n if (msg.toolCallName) {\n return `${type} ${msg.toolCallName}`;\n }\n return type;\n}\n","/**\n * Audio I/O for CLI using SoX (Sound eXchange)\n *\n * Uses the `rec` command for microphone capture and `play` for audio playback.\n * SoX is cross-platform and available via:\n * macOS: brew install sox\n * Linux: apt install sox\n * Windows: choco install sox\n */\n\nimport { spawn, execSync, spawnSync, type ChildProcess } from 'child_process';\nimport { EventEmitter } from 'events';\nimport * as readline from 'readline';\n\nconst SAMPLE_RATE = 24000;\n// 100ms of PCM16 audio at 24kHz mono = 4800 bytes\nconst MIC_CHUNK_BYTES = 4800;\n\nexport interface AudioDevice {\n id: string;\n name: string;\n isDefault: boolean;\n}\n\n/** Check if SoX is installed and available */\nexport function checkSoxAvailable(): boolean {\n try {\n execSync('which sox', { stdio: 'pipe' });\n return true;\n } catch {\n return false;\n }\n}\n\n/** List audio input devices via SoX */\nexport async function listInputDevices(): Promise<AudioDevice[]> {\n return listDevices('rec');\n}\n\n/** List audio output devices via SoX */\nexport async function listOutputDevices(): Promise<AudioDevice[]> {\n return listDevices('play');\n}\n\nfunction listDevices(command: string): Promise<AudioDevice[]> {\n return new Promise((resolve) => {\n try {\n // spawnSync avoids shell interpolation — command and args are always separate\n const proc = spawnSync(command, ['--list-devices'], {\n encoding: 'utf-8',\n stdio: ['ignore', 'pipe', 'pipe'],\n timeout: 5000,\n });\n // SoX outputs device list to stderr; combine both streams to be safe\n const output = (proc.stdout ?? '') + (proc.stderr ?? '');\n\n const devices: AudioDevice[] = [];\n const lines = output.split('\\n');\n for (const line of lines) {\n // Parse lines like: \" Input Device 0 : Built-in Microphone\"\n // or \" Output Device 0 : Built-in Output\"\n const match = line.match(/(?:Input|Output)\\s+Device\\s+(\\d+)\\s*:\\s*(.+)/i);\n if (match && match[1] && match[2]) {\n devices.push({\n id: match[1],\n name: match[2].trim(),\n isDefault: devices.length === 0, // First device is typically the default\n });\n }\n }\n\n // If SoX didn't give us devices, return a default entry\n if (devices.length === 0) {\n devices.push({ id: 'default', name: 'System Default', isDefault: true });\n }\n\n resolve(devices);\n } catch {\n // Fallback to system default\n resolve([{ id: 'default', name: 'System Default', isDefault: true }]);\n }\n });\n}\n\n/** Interactively select an audio device */\nexport async function selectDevice(devices: AudioDevice[], label: string): Promise<AudioDevice> {\n if (devices.length <= 1) {\n return devices[0]!;\n }\n\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stderr,\n terminal: true,\n });\n\n process.stderr.write(`\\n ${label}:\\n`);\n for (let i = 0; i < devices.length; i++) {\n const dev = devices[i]!;\n const marker = dev.isDefault ? ' (default)' : '';\n process.stderr.write(` ${i + 1}. ${dev.name}${marker}\\n`);\n }\n\n return new Promise((resolve) => {\n const defaultIdx = devices.findIndex((d) => d.isDefault);\n const defaultNum = defaultIdx >= 0 ? defaultIdx + 1 : 1;\n\n rl.question(` Select [${defaultNum}]: `, (answer) => {\n rl.close();\n const num = answer.trim() ? parseInt(answer.trim(), 10) : defaultNum;\n const idx = Math.max(0, Math.min(devices.length - 1, num - 1));\n resolve(devices[idx]!);\n });\n });\n}\n\n/**\n * Microphone capture via SoX `rec`.\n * Streams raw PCM16 signed 16-bit LE mono audio at 24kHz.\n */\nexport class MicCapture {\n private process: ChildProcess | null = null;\n private onData: (pcm16: Buffer) => void;\n private buffer = Buffer.alloc(0);\n\n constructor(onData: (pcm16: Buffer) => void) {\n this.onData = onData;\n }\n\n /** Start recording from the microphone */\n start(deviceId?: string): void {\n const args = [\n '-q', // quiet\n '-t',\n 'raw', // raw PCM output\n '-r',\n String(SAMPLE_RATE),\n '-e',\n 'signed-integer',\n '-b',\n '16', // 16-bit\n '-c',\n '1', // mono\n '-L', // little-endian\n '-', // stdout\n ];\n\n const env = { ...process.env };\n if (deviceId && deviceId !== 'default') {\n env.AUDIODEV = deviceId;\n }\n\n this.process = spawn('rec', args, {\n env,\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n\n this.process.stdout?.on('data', (data: Buffer) => {\n // Accumulate data and emit in consistent chunk sizes\n this.buffer = Buffer.concat([this.buffer, data]);\n while (this.buffer.length >= MIC_CHUNK_BYTES) {\n const chunk = this.buffer.subarray(0, MIC_CHUNK_BYTES);\n this.buffer = this.buffer.subarray(MIC_CHUNK_BYTES);\n this.onData(Buffer.from(chunk));\n }\n });\n\n this.process.stderr?.on('data', (data: Buffer) => {\n // SoX outputs warnings/errors to stderr - ignore unless debugging\n const msg = data.toString().trim();\n if (msg && !msg.includes('WARN')) {\n process.stderr.write(`[mic] ${msg}\\n`);\n }\n });\n\n this.process.on('error', (err) => {\n process.stderr.write(`[mic] Process error: ${err.message}\\n`);\n });\n }\n\n /** Stop recording */\n stop(): void {\n if (this.process) {\n this.process.kill('SIGTERM');\n this.process = null;\n }\n this.buffer = Buffer.alloc(0);\n }\n}\n\n/**\n * Audio playback via SoX `play`.\n * Accepts raw PCM16 signed 16-bit LE mono audio at 24kHz.\n *\n * Streams audio to SoX's stdin so playback begins immediately on the first\n * chunk — no waiting for the full response. Queues back-to-back responses\n * so a second response never kills the first mid-playback.\n *\n * Events:\n * - 'playing': SoX process spawned for a response\n * - 'done': All queued responses finished (or playback was stopped)\n */\nexport class AudioPlayer extends EventEmitter {\n private process: ChildProcess | null = null;\n private deviceId?: string;\n\n // When true, we own the SoX process's stdin and are actively streaming to it.\n // When false with a process, the stdin has been closed and SoX is draining.\n private streaming = false;\n\n // Buffer chunks when another response is already playing\n private pendingChunks: Buffer[] = [];\n private pendingBytes = 0;\n\n // Queue of complete response buffers waiting to play\n private queue: { audio: Buffer; messageId?: string }[] = [];\n\n // Playback position tracking for barge-in\n private currentMessageId?: string;\n private playbackStartTime = 0; // Date.now() when SoX started\n private bytesWritten = 0; // total bytes piped to SoX for duration estimation\n\n constructor(deviceId?: string) {\n super();\n this.deviceId = deviceId;\n }\n\n /** Check if audio is currently playing or queued */\n get isPlaying(): boolean {\n return this.process !== null || this.queue.length > 0;\n }\n\n /** Get the message ID of the currently playing audio */\n get playingMessageId(): string | undefined {\n return this.currentMessageId;\n }\n\n /** Duration of audio written so far in ms */\n private get currentDurationMs(): number {\n // PCM16 mono 24kHz = 48000 bytes/sec\n return (this.bytesWritten / (SAMPLE_RATE * 2)) * 1000;\n }\n\n /**\n * Estimate current playback position in milliseconds.\n * Uses wall-clock time since SoX started playing.\n */\n getPlaybackTimeMs(): number | null {\n if (!this.process || this.playbackStartTime === 0) return null;\n const elapsed = Date.now() - this.playbackStartTime;\n return Math.min(elapsed, this.currentDurationMs);\n }\n\n /**\n * Stream PCM16 audio data for playback.\n * On the first chunk, spawns SoX and begins playback immediately.\n */\n write(pcm16: Buffer): void {\n if (this.process && !this.streaming) {\n // A previous response is still playing/draining — buffer for later\n this.pendingChunks.push(pcm16);\n this.pendingBytes += pcm16.length;\n return;\n }\n\n if (!this.process) {\n this.spawnSoxProcess();\n }\n\n this.process!.stdin!.write(pcm16);\n this.bytesWritten += pcm16.length;\n }\n\n /**\n * End the current audio response.\n * If streaming, closes stdin to let SoX finish playing.\n * If buffering behind another response, adds to the queue.\n */\n endResponse(messageId?: string): void {\n if (this.streaming && this.process) {\n this.currentMessageId = messageId;\n this.streaming = false;\n this.process.stdin!.end();\n } else if (this.pendingChunks.length > 0) {\n const audio = Buffer.concat(this.pendingChunks);\n this.pendingChunks = [];\n this.pendingBytes = 0;\n this.queue.push({ audio, messageId });\n }\n }\n\n /** Stop current playback, discard all queued audio */\n stop(): void {\n this.pendingChunks = [];\n this.pendingBytes = 0;\n this.queue = [];\n this.streaming = false;\n\n const wasPlaying = this.process !== null;\n if (this.process) {\n try {\n this.process.stdin?.destroy();\n this.process.kill('SIGTERM');\n } catch {\n // Ignore\n }\n this.process = null;\n }\n this.currentMessageId = undefined;\n this.playbackStartTime = 0;\n this.bytesWritten = 0;\n if (wasPlaying) {\n this.emit('done');\n }\n }\n\n /** Spawn a SoX `play` process reading raw PCM from stdin */\n private spawnSoxProcess(): void {\n this.bytesWritten = 0;\n this.currentMessageId = undefined;\n\n const args = [\n '-q', // quiet\n '-t',\n 'raw',\n '-r',\n String(SAMPLE_RATE),\n '-e',\n 'signed-integer',\n '-b',\n '16',\n '-c',\n '1',\n '-L', // little-endian\n '-', // read from stdin\n ];\n\n const env = { ...process.env };\n if (this.deviceId && this.deviceId !== 'default') {\n env.AUDIODEV = this.deviceId;\n }\n\n const proc = spawn('play', args, {\n env,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n proc.on('error', (err) => {\n process.stderr.write(`[player] Process error: ${err.message}\\n`);\n });\n\n proc.on('exit', (code, _signal) => {\n // 143 = SIGTERM (normal stop/interrupt)\n if (code !== null && code !== 0 && code !== 143) {\n process.stderr.write(`[player] SoX exited with code ${code}\\n`);\n }\n if (this.process === proc) {\n this.process = null;\n this.streaming = false;\n if (this.queue.length > 0) {\n const next = this.queue.shift()!;\n this.playQueued(next.audio, next.messageId);\n } else {\n this.emit('done');\n }\n }\n });\n\n proc.stderr?.on('data', (data: Buffer) => {\n const msg = data.toString().trim();\n if (msg) {\n process.stderr.write(`[player:sox] ${msg}\\n`);\n }\n });\n\n proc.stdout?.resume();\n\n this.process = proc;\n this.streaming = true;\n this.playbackStartTime = Date.now();\n this.emit('playing');\n }\n\n /** Play a complete pre-buffered response (from the queue) */\n private playQueued(audio: Buffer, messageId?: string): void {\n this.spawnSoxProcess();\n this.currentMessageId = messageId;\n this.process!.stdin!.write(audio);\n this.bytesWritten = audio.length;\n this.process!.stdin!.end();\n this.streaming = false;\n }\n}\n","/**\n * Shared chat session infrastructure.\n *\n * Defines the ChatSession abstraction consumed by all chat modes (text, realtime, voice).\n * Entry points (manage, chat, concierge) construct a ChatSession and pass it here.\n */\n\nimport {\n AGUIClient,\n clearScreen,\n getErrorMessage,\n getTextDelta,\n printMessage,\n type AGUIChatMessage,\n} from '../cli-utils';\nimport type { ConciergeAppContextPayload } from './cli-client-context';\nimport { runConciergeAguiLoop } from './concierge-agui-loop';\nimport * as readline from 'readline';\nimport { CLIError } from './errors';\nimport type { AuthenticatedContext } from './context';\nimport { RealtimeClient } from './realtime-client';\nimport { ChatTUI, type ChatItem } from './chat-tui';\nimport {\n checkSoxAvailable,\n listInputDevices,\n listOutputDevices,\n selectDevice,\n MicCapture,\n AudioPlayer,\n} from './audio';\n\n// ─── ChatSession abstraction ─────────────────────────────────────────────────\n\n/** Everything a chat mode needs — constructed differently per entry point. */\nexport interface ChatSession {\n ctx: AuthenticatedContext;\n workspaceUuid: string;\n chatId: number;\n chatUuid: string;\n chatTitle: string;\n aguiEndpointUrl: string;\n wsUrl: string;\n loadMessages: () => Promise<any[]>;\n /** Display label: \"Workspace Manager\", \"Concierge\", etc. */\n label: string;\n /** AGUI request model field. Undefined = omit from body. */\n model?: string;\n /** Concierge client context (CLI surface, etc.). */\n appContext?: ConciergeAppContextPayload;\n /** Whether --allow-write was passed (local file writes). */\n allowWrite?: boolean;\n /** Directory-trust flags for lazy local-file HITL. */\n trustCwd?: boolean;\n trustDir?: string;\n}\n\n// ─── Mode dispatcher ─────────────────────────────────────────────────────────\n\nexport async function runChatSession(\n session: ChatSession,\n args: Record<string, any>\n): Promise<void> {\n const debug = !!args.debug;\n const isVoice = !!args.voice;\n const isRealtime = !!args.realtime || isVoice;\n const message = typeof args.message === 'string' ? args.message : undefined;\n const autoApprove = !!args['auto-approve'];\n\n if (args['list-devices']) {\n await listAudioDevices();\n return;\n }\n\n if (!message && !process.stdin.isTTY) {\n throw new CLIError(\n 'Interactive mode requires a TTY. Use --message for non-interactive mode.'\n );\n }\n\n const allowWrite = !!args['allow-write'] || !!session.allowWrite;\n if (message) {\n await singleTurnChatSession(session, message, debug, autoApprove, allowWrite);\n } else if (isVoice) {\n await voiceChatSession(session, vadMode(args), args, debug);\n } else if (isRealtime) {\n await realtimeChatSession(session, vadMode(args), debug);\n } else {\n await interactiveChatSession(session, debug, autoApprove, allowWrite);\n }\n}\n\nexport function vadMode(args: Record<string, any>): 'client' | 'server' {\n return (typeof args.vad === 'string' ? args.vad : 'server') as 'client' | 'server';\n}\n\n// ─── Single-turn text mode (SSE) ────────────────────────────────────────────\n\nasync function singleTurnChatSession(\n session: ChatSession,\n message: string,\n debug: boolean,\n autoApprove: boolean = false,\n allowWrite: boolean = false\n): Promise<void> {\n const aguiClient = new AGUIClient({\n baseUrl: session.ctx.envConfig.apiUrl,\n workspaceUuid: session.workspaceUuid,\n chatId: session.chatId,\n endpointUrl: session.aguiEndpointUrl,\n accessToken: session.ctx.accessToken,\n debug,\n model: session.model,\n appContext: session.appContext,\n });\n\n // Stream all SSE events. The AGUI stream includes tool calls, tool\n // results, and text content across all inference turns. We accumulate\n // text and show tool call progress, then poll for final text if the\n // stream ended mid-turn (e.g. after tool calls with no final text).\n const onEvent = (event: { type?: string; name?: string }) => {\n const type = event.type?.toLowerCase() ?? '';\n if (type === 'tool_call_start') {\n const name =\n (event as Record<string, any>).toolCallName ??\n (event as Record<string, any>).name ??\n '';\n process.stderr.write(` [${name}]\\n`);\n }\n };\n\n const { streamText, hasToolCalls } = await runConciergeAguiLoop(\n aguiClient,\n [{ role: 'user', content: message }],\n onEvent,\n {\n autoApprove,\n allowWrite: allowWrite || !!session.allowWrite,\n debug,\n trustCwd: session.trustCwd,\n trustDir: session.trustDir,\n nonInteractive: true,\n }\n );\n\n // If we got text from the stream, print it\n if (streamText) {\n process.stdout.write(`\\x1B[32mAssistant:\\x1B[0m ${streamText}\\n`);\n return;\n }\n\n // No text in stream (tool calls only) — poll for the final response\n if (hasToolCalls) {\n process.stderr.write(' (waiting for completion...)\\n');\n const maxWaitMs = 180_000;\n const pollIntervalMs = 2000;\n const startTime = Date.now();\n let finalText = '';\n\n while (Date.now() - startTime < maxWaitMs) {\n await new Promise((r) => setTimeout(r, pollIntervalMs));\n try {\n const msgs = await session.loadMessages();\n // Find the last assistant message with actual text\n for (let i = msgs.length - 1; i >= 0; i--) {\n const m = msgs[i];\n if (m.role === 'assistant' && m.content && !m.tool_calls?.length) {\n finalText = m.content;\n break;\n }\n }\n if (finalText) break;\n } catch {\n // keep polling\n }\n }\n\n process.stdout.write(`\\x1B[32mAssistant:\\x1B[0m ${finalText || '(no text response)'}\\n`);\n } else {\n process.stdout.write(`\\x1B[32mAssistant:\\x1B[0m (no response)\\n`);\n }\n}\n\n// ─── Interactive text mode (SSE) ─────────────────────────────────────────────\n\nasync function interactiveChatSession(\n session: ChatSession,\n debug: boolean,\n autoApprove: boolean,\n allowWrite: boolean\n): Promise<void> {\n const aguiClient = new AGUIClient({\n baseUrl: session.ctx.envConfig.apiUrl,\n workspaceUuid: session.workspaceUuid,\n chatId: session.chatId,\n endpointUrl: session.aguiEndpointUrl,\n accessToken: session.ctx.accessToken,\n debug,\n model: session.model,\n appContext: session.appContext,\n });\n\n clearScreen();\n console.log('='.repeat(60));\n console.log(session.label);\n console.log('='.repeat(60));\n console.log(`Chat: ${session.chatTitle}`);\n console.log(\"Type your message and press Enter. Type 'exit' or Ctrl+C to quit.\");\n console.log('='.repeat(60));\n console.log('');\n\n const existingMessages = await session.loadMessages();\n if (existingMessages.length > 0) {\n console.log('\\x1B[90m--- Previous messages ---\\x1B[0m\\n');\n for (const msg of existingMessages.slice(-10)) {\n const text = typeof msg.content === 'string' ? msg.content : '';\n if (text && text.trim()) {\n printMessage(text, msg.role as 'user' | 'assistant' | 'system');\n }\n }\n console.log('\\x1B[90m--- End of history ---\\x1B[0m\\n');\n }\n\n const conversationMessages: AGUIChatMessage[] = [];\n for (const msg of existingMessages.slice(-10)) {\n const text = typeof msg.content === 'string' ? msg.content : '';\n if (text && text.trim() && (msg.role === 'user' || msg.role === 'assistant')) {\n conversationMessages.push({ role: msg.role, content: text });\n }\n }\n\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n\n return new Promise<void>((resolve) => {\n const prompt = (): void => {\n rl.question('\\x1B[34mYou:\\x1B[0m ', async (input) => {\n const trimmed = input.trim();\n if (!trimmed) {\n prompt();\n return;\n }\n if (trimmed.toLowerCase() === 'exit' || trimmed.toLowerCase() === 'quit') {\n console.log('\\nGoodbye!');\n rl.close();\n return;\n }\n\n conversationMessages.push({ role: 'user', content: trimmed });\n process.stdout.write('\\n\\x1B[32mAssistant:\\x1B[0m ');\n let assistantContent = '';\n\n try {\n const { streamText } = await runConciergeAguiLoop(\n aguiClient,\n conversationMessages,\n (event) => {\n const delta = getTextDelta(event);\n if (delta) {\n process.stdout.write(delta);\n assistantContent += delta;\n }\n const errorMsg = getErrorMessage(event);\n if (errorMsg) console.log(`\\n\\x1B[31mError: ${errorMsg}\\x1B[0m`);\n },\n {\n autoApprove,\n allowWrite: allowWrite || !!session.allowWrite,\n debug,\n trustCwd: session.trustCwd,\n trustDir: session.trustDir,\n }\n );\n if (streamText && !assistantContent) {\n assistantContent = streamText;\n process.stdout.write(streamText);\n }\n if (assistantContent) {\n conversationMessages.push({ role: 'assistant', content: assistantContent });\n }\n console.log('\\n');\n } catch (error) {\n console.log(\n `\\n\\x1B[31mError: ${error instanceof Error ? error.message : error}\\x1B[0m\\n`\n );\n }\n\n prompt();\n });\n };\n\n rl.on('close', () => {\n console.log('\\nGoodbye!');\n resolve();\n });\n prompt();\n });\n}\n\n// ─── Shared helpers for realtime modes ───────────────────────────────────────\n\nexport function buildHistory(messages: any[]): ChatItem[] {\n const history: ChatItem[] = [];\n for (const msg of messages.slice(-30)) {\n const text = typeof msg.content === 'string' ? msg.content : '';\n if (msg.role === 'user' || msg.role === 'assistant') {\n if (text.trim()) {\n history.push({ role: msg.role, content: text });\n }\n if (msg.role === 'assistant' && msg.tool_calls) {\n for (const tc of msg.tool_calls) {\n history.push({\n kind: 'tool_call',\n id: tc.id,\n name: tc.function.name,\n args: tc.function.arguments || '',\n done: true,\n });\n }\n }\n } else if (msg.role === 'tool') {\n const toolName = (msg as any).name || 'tool';\n history.push({\n kind: 'tool_result',\n toolCallId: (msg as any).tool_call_id || '',\n toolName,\n content: text,\n });\n }\n }\n return history;\n}\n\nexport function wireRealtimeEvents(client: RealtimeClient, tui: ChatTUI): void {\n client.on('text_start', () => tui.streamStart());\n client.on('text_delta', (data: any) => tui.streamDelta(data.delta));\n client.on('text_end', () => tui.streamEnd());\n\n client.on('tool_call_start', (data: any) => {\n tui.toolCallStart(data.toolCallId, data.toolCallName);\n });\n client.on('tool_call_args', (data: any) => {\n tui.toolCallArgs(data.toolCallId, data.delta);\n });\n client.on('tool_call_end', (data: any) => {\n tui.toolCallEnd(data.toolCallId);\n });\n client.on('tool_call_result', (data: any) => {\n const toolName = tui.findToolCallName(data.toolCallId);\n const content = typeof data.result === 'string' ? data.result : JSON.stringify(data.result);\n tui.toolCallResult(data.toolCallId, toolName, content);\n });\n\n client.on('run_error', (data: any) => {\n tui.showError(data.message);\n });\n\n client.on('error', (err: Error) => {\n tui.showError(`Connection: ${err.message}`);\n });\n\n client.on('ws_recv', (msg: any) => tui.logDebug('in', msg));\n client.on('ws_send', (msg: any) => tui.logDebug('out', msg));\n}\n\n// ─── Realtime text mode (WebSocket + TUI) ────────────────────────────────────\n\nasync function realtimeChatSession(\n session: ChatSession,\n vad: 'client' | 'server',\n debug: boolean\n): Promise<void> {\n const client = new RealtimeClient({\n url: session.wsUrl,\n token: session.ctx.accessToken,\n chatId: session.chatId,\n vadMode: vad,\n debug,\n });\n\n process.stderr.write(`Connecting to ${session.label.toLowerCase()}...\\n`);\n\n try {\n await client.connect();\n } catch (err) {\n throw new CLIError(`Failed to connect: ${err instanceof Error ? err.message : err}`);\n }\n\n const existingMessages = await session.loadMessages();\n const history = buildHistory(existingMessages);\n\n const tui = new ChatTUI({\n onSend: (text) => {\n client.sendTextMessage(text);\n },\n onExit: () => {\n client.close();\n },\n debug,\n env: session.ctx.env,\n });\n\n wireRealtimeEvents(client, tui);\n\n client.on('closed', () => {\n tui.stop();\n console.log('Disconnected.');\n });\n\n tui.loadHistory(history);\n tui.start();\n\n await new Promise<void>((resolve) => {\n client.once('closed', resolve);\n });\n}\n\n// ─── Voice mode (WebSocket + mic + speaker + TUI) ────────────────────────────\n\nasync function voiceChatSession(\n session: ChatSession,\n vad: 'client' | 'server',\n args: Record<string, string | boolean | undefined>,\n debug: boolean\n): Promise<void> {\n if (!checkSoxAvailable()) {\n throw new CLIError(\n 'Voice mode requires SoX. Install it:\\n' +\n ' macOS: brew install sox\\n' +\n ' Linux: apt install sox\\n' +\n ' Windows: choco install sox'\n );\n }\n\n const inputDeviceName =\n typeof args['input-device'] === 'string' ? args['input-device'] : undefined;\n const outputDeviceName =\n typeof args['output-device'] === 'string' ? args['output-device'] : undefined;\n\n let inputDeviceId: string | undefined;\n let outputDeviceId: string | undefined;\n\n if (!inputDeviceName || !outputDeviceName) {\n process.stderr.write('\\n Audio Devices\\n');\n }\n\n if (inputDeviceName) {\n inputDeviceId = inputDeviceName;\n } else {\n const inputDevices = await listInputDevices();\n const selected = await selectDevice(inputDevices, 'Input (microphone)');\n inputDeviceId = selected.id;\n }\n\n if (outputDeviceName) {\n outputDeviceId = outputDeviceName;\n } else {\n const outputDevices = await listOutputDevices();\n const selected = await selectDevice(outputDevices, 'Output (speaker)');\n outputDeviceId = selected.id;\n }\n\n const client = new RealtimeClient({\n url: session.wsUrl,\n token: session.ctx.accessToken,\n chatId: session.chatId,\n vadMode: vad,\n debug,\n });\n\n process.stderr.write(`\\nConnecting to ${session.label.toLowerCase()}...\\n`);\n\n try {\n await client.connect();\n } catch (err) {\n throw new CLIError(`Failed to connect: ${err instanceof Error ? err.message : err}`);\n }\n\n const existingMessages = await session.loadMessages();\n const history = buildHistory(existingMessages);\n\n const mic = new MicCapture((pcm16) => {\n if (!client.isConnected()) return;\n client.sendAudio(pcm16);\n });\n const player = new AudioPlayer(outputDeviceId);\n\n function cleanup(): void {\n mic.stop();\n player.stop();\n client.close();\n }\n\n const tui = new ChatTUI({\n onSend: (text) => {\n client.sendTextMessage(text);\n },\n onExit: () => {\n cleanup();\n },\n debug,\n env: session.ctx.env,\n });\n\n wireRealtimeEvents(client, tui);\n\n client.on('audio', (data: any) => {\n player.write(data.pcm16);\n });\n\n client.on('audio_end', (data: any) => {\n player.endResponse(data?.messageId);\n });\n\n client.on('interrupt', () => {\n const playbackMs = player.getPlaybackTimeMs();\n const messageId = player.playingMessageId;\n\n if (playbackMs !== null && playbackMs > 0 && player.isPlaying) {\n client.sendInterrupt(playbackMs, messageId);\n player.stop();\n\n if (debug) {\n tui.logDebug('in', {\n type: 'CUSTOM',\n name: 'voice.interrupt',\n value: { action: 'echoed', audioEndMs: playbackMs, messageId },\n });\n }\n } else if (debug) {\n tui.logDebug('in', {\n type: 'CUSTOM',\n name: 'voice.interrupt',\n value: { action: 'ignored', wasPlaying: player.isPlaying },\n });\n }\n });\n\n client.on('truncate', (data: any) => {\n player.stop();\n tui.truncateAssistant(\n data.content ?? '',\n data.originalContent,\n data.truncationReason ?? 'barge_in',\n data.truncatedAtMs\n );\n });\n\n client.on('response_message', (data: any) => {\n if (data.role === 'user' && data.content) {\n tui.addTranscription(data.content);\n }\n });\n\n client.on('closed', () => {\n tui.stop();\n cleanup();\n console.log('Disconnected.');\n });\n\n tui.loadHistory(history);\n tui.start();\n\n mic.start(inputDeviceId);\n\n await new Promise<void>((resolve) => {\n client.once('closed', resolve);\n });\n}\n\n// ─── Device listing ──────────────────────────────────────────────────────────\n\nexport async function listAudioDevices(): Promise<void> {\n if (!checkSoxAvailable()) {\n throw new CLIError(\n 'Device listing requires SoX. Install it:\\n' +\n ' macOS: brew install sox\\n' +\n ' Linux: apt install sox\\n' +\n ' Windows: choco install sox'\n );\n }\n\n const inputs = await listInputDevices();\n const outputs = await listOutputDevices();\n\n console.log('Input devices (microphone):');\n for (const dev of inputs) {\n const marker = dev.isDefault ? ' (default)' : '';\n console.log(` ${dev.id}: ${dev.name}${marker}`);\n }\n\n console.log('\\nOutput devices (speaker):');\n for (const dev of outputs) {\n const marker = dev.isDefault ? ' (default)' : '';\n console.log(` ${dev.id}: ${dev.name}${marker}`);\n }\n}\n","/**\n * Concierge chat command — interactive chat with the global concierge agent.\n *\n * Supports the same modes as workspace manager chat (text, realtime, voice)\n * but without requiring a workspace.\n */\n\nimport { formatTimestamp, selectFromList } from '../cli-utils';\nimport {\n createConciergeChat,\n getConciergeChat,\n getConciergeChatMessages,\n listConciergeChats,\n originateConciergeCall,\n originateConciergeSms,\n type ConciergeChat,\n} from '../lib/concierge-api';\nimport { requireAuth, type AuthenticatedContext } from '../lib/context';\nimport { CLIError } from '../lib/errors';\nimport type { CommandHandlerContext } from '../lib/types';\nimport { buildCliConciergeAppContext } from '../lib/cli-client-context';\nimport { runChatSession, type ChatSession } from '../lib/chat-session';\n\nexport async function conciergeOutboundCommand(hctx: CommandHandlerContext): Promise<void> {\n const ctx = requireAuth(hctx.ctx);\n const { args } = hctx;\n\n if (args.call && args.sms) {\n throw new CLIError('--call and --sms are mutually exclusive');\n }\n if (args.call) {\n const result = await originateConciergeCall(ctx);\n process.stderr.write(\n `Concierge call started. callSid=${result.callSid} startedAt=${result.startedAt}\\n`\n );\n return;\n }\n if (args.sms) {\n const result = await originateConciergeSms(ctx);\n process.stderr.write(\n `Concierge SMS started. messageSid=${result.messageSid} conversationId=${result.conversationId}\\n`\n );\n return;\n }\n\n throw new CLIError(\n 'Use `gr concierge chat --call`, `gr concierge chat --sms`, or `gr concierge chat` for interactive mode.'\n );\n}\n\nexport async function conciergeCommand(hctx: CommandHandlerContext): Promise<void> {\n const ctx = requireAuth(hctx.ctx);\n const { args } = hctx;\n\n if (args.call || args.sms) {\n if (args.call && args.sms) {\n throw new CLIError('--call and --sms are mutually exclusive');\n }\n if (args.voice || args.realtime) {\n throw new CLIError('--call/--sms cannot be combined with --voice or --realtime');\n }\n await conciergeOutboundCommand(hctx);\n return;\n }\n\n const chatIdArg = typeof args['chat-id'] === 'string' ? args['chat-id'] : undefined;\n const message = typeof args.message === 'string' ? args.message : undefined;\n\n const chat = await getOrCreateConciergeChat(ctx, chatIdArg, !!message);\n const session = buildConciergeSession(ctx, chat, args);\n await runChatSession(session, args);\n}\n\nfunction buildConciergeSession(\n ctx: AuthenticatedContext,\n chat: ConciergeChat,\n args: Record<string, unknown>\n): ChatSession {\n const wsBase = ctx.envConfig.apiUrl.replace(/^https:/, 'wss:').replace(/^http:/, 'ws:');\n return {\n ctx,\n workspaceUuid: '',\n chatId: chat.id,\n chatUuid: chat.uuid,\n chatTitle: chat.title || chat.uuid,\n aguiEndpointUrl: `${ctx.envConfig.apiUrl}/api/v2/concierge/chats/${chat.id}/chat/agui`,\n wsUrl: `${wsBase}/api/v2/concierge/voice/stream-ws`,\n loadMessages: () => getConciergeChatMessages(ctx, chat.id).catch(() => []),\n label: 'Concierge',\n model: undefined, // concierge doesn't send model field\n appContext: buildCliConciergeAppContext(),\n allowWrite: true,\n trustCwd: !!args['trust-cwd'],\n trustDir: typeof args['trust-dir'] === 'string' ? args['trust-dir'] : undefined,\n };\n}\n\nasync function getOrCreateConciergeChat(\n ctx: AuthenticatedContext,\n chatIdArg: string | undefined,\n skipSelection: boolean\n): Promise<ConciergeChat> {\n if (chatIdArg) {\n const id = Number(chatIdArg);\n if (isNaN(id)) throw new CLIError('--chat-id must be a number');\n return getConciergeChat(ctx, id);\n }\n\n if (skipSelection) {\n const chat = await createConciergeChat(ctx);\n process.stderr.write(`Created concierge chat #${chat.id}\\n`);\n return chat;\n }\n\n const chats = await listConciergeChats(ctx);\n\n const { item: selectedChat, isNew } = await selectFromList(chats, {\n title: 'Select a concierge chat or create a new one',\n labelFn: (c) => c.title || `Chat ${c.uuid.slice(0, 8)}...`,\n detailFn: (c) => formatTimestamp(c.updatedAt),\n emptyMessage: 'No existing concierge chats.',\n allowNew: true,\n newLabel: '+ Start new chat',\n });\n\n if (!selectedChat && !isNew) {\n throw new CLIError('No chat selected.');\n }\n\n if (isNew) {\n const chat = await createConciergeChat(ctx);\n process.stderr.write(`Created concierge chat #${chat.id}\\n`);\n return chat;\n }\n return selectedChat!;\n}\n"]}
@@ -1,47 +0,0 @@
1
- #!/usr/bin/env node
2
- // src/lib/errors.ts
3
- var CLIError = class extends Error {
4
- constructor(message, exitCode = 1) {
5
- super(message);
6
- this.exitCode = exitCode;
7
- this.name = "CLIError";
8
- }
9
- };
10
- var AuthRequiredError = class extends CLIError {
11
- constructor(message = "Not authenticated. Run `gr login` or set GRAVITY_RAIL_API_KEY.") {
12
- super(message, 2);
13
- this.name = "AuthRequiredError";
14
- }
15
- };
16
- function handleError(err) {
17
- if (err instanceof CLIError) {
18
- process.stderr.write(`Error: ${err.message}
19
- `);
20
- process.exit(err.exitCode);
21
- }
22
- if (err instanceof Error) {
23
- process.stderr.write(`Error: ${err.message}
24
- `);
25
- if ("errors" in err && Array.isArray(err.errors)) {
26
- for (const e of err.errors) {
27
- process.stderr.write(` - ${e}
28
- `);
29
- }
30
- }
31
- if ("statusCode" in err && err.statusCode === 401) {
32
- process.stderr.write(
33
- `
34
- Hint: Run "gr login" to authenticate, or set GRAVITY_RAIL_API_KEY for non-interactive use.
35
- `
36
- );
37
- }
38
- process.exit(1);
39
- }
40
- process.stderr.write(`Error: ${String(err)}
41
- `);
42
- process.exit(1);
43
- }
44
-
45
- export { AuthRequiredError, CLIError, handleError };
46
- //# sourceMappingURL=chunk-XRBVAFCB.js.map
47
- //# sourceMappingURL=chunk-XRBVAFCB.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/lib/errors.ts"],"names":[],"mappings":";;AAAO,IAAM,QAAA,GAAN,cAAuB,KAAA,CAAM;AAAA,EACjC,WAAA,CACG,OAAA,EACO,QAAA,GAAmB,CAAA,EAC3B;AACC,IAAA,KAAA,CAAM,OAAO,CAAA;AAFN,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAGP,IAAA,IAAA,CAAK,IAAA,GAAO,UAAA;AAAA,EACf;AACH;AAEO,IAAM,iBAAA,GAAN,cAAgC,QAAA,CAAS;AAAA,EAC7C,WAAA,CAAY,UAAU,gEAAA,EAAkE;AACrF,IAAA,KAAA,CAAM,SAAS,CAAC,CAAA;AAChB,IAAA,IAAA,CAAK,IAAA,GAAO,mBAAA;AAAA,EACf;AACH;AAEO,SAAS,YAAY,GAAA,EAAqB;AAC9C,EAAA,IAAI,eAAe,QAAA,EAAU;AAC1B,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,OAAA,EAAU,GAAA,CAAI,OAAO;AAAA,CAAI,CAAA;AAC9C,IAAA,OAAA,CAAQ,IAAA,CAAK,IAAI,QAAQ,CAAA;AAAA,EAC5B;AAEA,EAAA,IAAI,eAAe,KAAA,EAAO;AACvB,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,OAAA,EAAU,GAAA,CAAI,OAAO;AAAA,CAAI,CAAA;AAC9C,IAAA,IAAI,YAAY,GAAA,IAAO,KAAA,CAAM,OAAA,CAAS,GAAA,CAAY,MAAM,CAAA,EAAG;AACxD,MAAA,KAAA,MAAW,CAAA,IAAM,IAAY,MAAA,EAAQ;AAClC,QAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,IAAA,EAAO,CAAC;AAAA,CAAI,CAAA;AAAA,MACpC;AAAA,IACH;AACA,IAAA,IAAI,YAAA,IAAgB,GAAA,IAAQ,GAAA,CAAY,UAAA,KAAe,GAAA,EAAK;AACzD,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,QACZ;AAAA;AAAA;AAAA,OACH;AAAA,IACH;AACA,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EACjB;AAEA,EAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,OAAA,EAAU,MAAA,CAAO,GAAG,CAAC;AAAA,CAAI,CAAA;AAC9C,EAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AACjB","file":"chunk-XRBVAFCB.js","sourcesContent":["export class CLIError extends Error {\n constructor(\n message: string,\n public exitCode: number = 1\n ) {\n super(message);\n this.name = 'CLIError';\n }\n}\n\nexport class AuthRequiredError extends CLIError {\n constructor(message = 'Not authenticated. Run `gr login` or set GRAVITY_RAIL_API_KEY.') {\n super(message, 2);\n this.name = 'AuthRequiredError';\n }\n}\n\nexport function handleError(err: unknown): never {\n if (err instanceof CLIError) {\n process.stderr.write(`Error: ${err.message}\\n`);\n process.exit(err.exitCode);\n }\n\n if (err instanceof Error) {\n process.stderr.write(`Error: ${err.message}\\n`);\n if ('errors' in err && Array.isArray((err as any).errors)) {\n for (const e of (err as any).errors) {\n process.stderr.write(` - ${e}\\n`);\n }\n }\n if ('statusCode' in err && (err as any).statusCode === 401) {\n process.stderr.write(\n `\\nHint: Run \"gr login\" to authenticate, or set GRAVITY_RAIL_API_KEY for non-interactive use.\\n`\n );\n }\n process.exit(1);\n }\n\n process.stderr.write(`Error: ${String(err)}\\n`);\n process.exit(1);\n}\n"]}
@@ -1,6 +0,0 @@
1
- #!/usr/bin/env node
2
- export { conciergeCommand, conciergeOutboundCommand } from './chunk-QVG4L6BE.js';
3
- import './chunk-3EO4COHB.js';
4
- import './chunk-XRBVAFCB.js';
5
- //# sourceMappingURL=concierge-ZOG7YFWQ.js.map
6
- //# sourceMappingURL=concierge-ZOG7YFWQ.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"concierge-ZOG7YFWQ.js"}
@@ -1,4 +0,0 @@
1
- #!/usr/bin/env node
2
- export { AuthRequiredError, CLIError, handleError } from './chunk-XRBVAFCB.js';
3
- //# sourceMappingURL=errors-DJILV5RW.js.map
4
- //# sourceMappingURL=errors-DJILV5RW.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"errors-DJILV5RW.js"}