@metamask-previews/perps-controller 1.2.0-preview-0b8553c95 → 1.3.0-preview-e5ed18206
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +10 -1
- package/dist/PerpsController.cjs +19 -10
- package/dist/PerpsController.cjs.map +1 -1
- package/dist/PerpsController.d.cts.map +1 -1
- package/dist/PerpsController.d.mts.map +1 -1
- package/dist/PerpsController.mjs +19 -10
- package/dist/PerpsController.mjs.map +1 -1
- package/package.json +4 -2
- package/dist/providers/MYXProvider.cjs +0 -514
- package/dist/providers/MYXProvider.cjs.map +0 -1
- package/dist/providers/MYXProvider.d.cts +0 -105
- package/dist/providers/MYXProvider.d.cts.map +0 -1
- package/dist/providers/MYXProvider.d.mts +0 -105
- package/dist/providers/MYXProvider.d.mts.map +0 -1
- package/dist/providers/MYXProvider.mjs +0 -510
- package/dist/providers/MYXProvider.mjs.map +0 -1
- package/dist/services/MYXClientService.cjs +0 -304
- package/dist/services/MYXClientService.cjs.map +0 -1
- package/dist/services/MYXClientService.d.cts +0 -81
- package/dist/services/MYXClientService.d.cts.map +0 -1
- package/dist/services/MYXClientService.d.mts +0 -81
- package/dist/services/MYXClientService.d.mts.map +0 -1
- package/dist/services/MYXClientService.mjs +0 -300
- package/dist/services/MYXClientService.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PerpsController.mjs","sourceRoot":"","sources":["../src/PerpsController.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EACL,cAAc,EAIf,kCAAkC;AAEnC,OAAO,EAAE,eAAe,EAAE,mCAAmC;AAG7D,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,aAAa;AAEpC,OAAO,EAAE,YAAY,EAAE,oCAAgC;AACvD,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EAClB,mCAA+B;AAChC,OAAO,EAAE,WAAW,EAAE,0CAAsC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,2CAAuC;AACtE,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,eAAe,EAChB,oCAAgC;AAEjC,OAAO,EAAE,iBAAiB,EAAE,8BAA0B;AACtD,OAAO,EAAE,uBAAuB,EAAE,gDAA4C;AAC9E,OAAO,EAAE,mBAAmB,EAAE,4CAAwC;AACtE,OAAO,EAAE,WAAW,EAAE,oCAAgC;AACtD,OAAO,EAAE,cAAc,EAAE,sCAAkC;AAC3D,OAAO,EAAE,eAAe,EAAE,uCAAmC;AAC7D,OAAO,EAAE,cAAc,EAAE,sCAAkC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,0CAAsC;AACnE,OAAO,EAAE,+BAA+B,EAAE,uDAAmD;AAC7F,OAAO,EAAE,iBAAiB,EAAE,yCAAqC;AACjE,OAAO,EAAE,yBAAyB,EAAE,iDAA6C;AAEjF,OAAO,EAAE,cAAc,EAAE,sCAAkC;AAC3D,8GAA8G;AAC9G,OAAO,EACL,wBAAwB,EACxB,mBAAmB,EACnB,eAAe,EACf,oBAAoB,EACpB,yBAAyB,EAE1B,0BAAgB;AAwEjB,OAAO,EAAE,qBAAqB,EAAE,iCAA6B;AAC7D,OAAO,EAAE,WAAW,EAAE,+BAA2B;AAEjD,OAAO,EAAE,IAAI,EAAE,yBAAqB;AAiBpC,0EAA0E;AAC1E,OAAO,EAAE,iBAAiB,EAAuB,8BAA0B;AAE3E;;GAEG;AACH,MAAM,CAAN,IAAY,mBAKX;AALD,WAAY,mBAAmB;IAC7B,sDAA+B,CAAA;IAC/B,oDAA6B,CAAA;IAC7B,kDAA2B,CAAA;IAC3B,wCAAiB,CAAA;AACnB,CAAC,EALW,mBAAmB,KAAnB,mBAAmB,QAK9B;AAsKD;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,8BAA8B,GAAG,GAAyB,EAAE,CAAC,CAAC;IACzE,cAAc,EAAE,aAAa;IAC7B,SAAS,EAAE,KAAK,EAAE,qBAAqB;IACvC,mBAAmB,EAAE,mBAAmB,CAAC,aAAa;IACtD,mBAAmB,EAAE,IAAI;IACzB,sBAAsB,EAAE,CAAC;IACzB,YAAY,EAAE,IAAI;IAClB,aAAa,EAAE,EAAE;IACjB,iBAAiB,EAAE,KAAK;IACxB,iBAAiB,EAAE,IAAI;IACvB,kBAAkB,EAAE,KAAK;IACzB,wBAAwB,EAAE,IAAI;IAC9B,kBAAkB,EAAE,IAAI;IACxB,kBAAkB,EAAE,EAAE;IACtB,kBAAkB,EAAE;QAClB,QAAQ,EAAE,CAAC;QACX,WAAW,EAAE,CAAC;QACd,kBAAkB,EAAE,IAAI;KACzB;IACD,eAAe,EAAE,EAAE;IACnB,SAAS,EAAE,IAAI;IACf,mBAAmB,EAAE,CAAC;IACtB,UAAU,EAAE,KAAK;IACjB,eAAe,EAAE;QACf,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,IAAI;KACd;IACD,mBAAmB,EAAE;QACnB,OAAO,EAAE,KAAK;QACd,OAAO,EAAE,KAAK;KACf;IACD,gBAAgB,EAAE;QAChB,OAAO,EAAE,EAAE;QACX,OAAO,EAAE,EAAE;KACZ;IACD,mBAAmB,EAAE;QACnB,OAAO,EAAE,EAAE;QACX,OAAO,EAAE,EAAE;KACZ;IACD,uBAAuB,EAAE;QACvB,QAAQ,EAAE,qBAAqB,CAAC,mBAAmB;QACnD,SAAS,EAAE,qBAAqB,CAAC,gBAAgB;KAClD;IACD,iBAAiB,EAAE,CAAC;IACpB,oBAAoB,EAAE,IAAI;IAC1B,gBAAgB,EAAE,IAAI;IACtB,yBAAyB,EAAE,CAAC;IAC5B,eAAe,EAAE,IAAI;IACrB,YAAY,EAAE,IAAI;IAClB,kBAAkB,EAAE,IAAI;IACxB,uBAAuB,EAAE,CAAC;IAC1B,qBAAqB,EAAE,IAAI;CAC5B,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,QAAQ,GAAwC;IACpD,YAAY,EAAE;QACZ,kBAAkB,EAAE,IAAI;QACxB,OAAO,EAAE,IAAI;QACb,sBAAsB,EAAE,KAAK;QAC7B,QAAQ,EAAE,IAAI;KACf;IACD,aAAa,EAAE;QACb,kBAAkB,EAAE,IAAI;QACxB,OAAO,EAAE,IAAI;QACb,sBAAsB,EAAE,KAAK;QAC7B,QAAQ,EAAE,IAAI;KACf;IACD,SAAS,EAAE;QACT,kBAAkB,EAAE,IAAI;QACxB,OAAO,EAAE,IAAI;QACb,sBAAsB,EAAE,KAAK;QAC7B,QAAQ,EAAE,IAAI;KACf;IACD,cAAc,EAAE;QACd,kBAAkB,EAAE,IAAI;QACxB,OAAO,EAAE,IAAI;QACb,sBAAsB,EAAE,KAAK;QAC7B,QAAQ,EAAE,IAAI;KACf;IACD,mBAAmB,EAAE;QACnB,kBAAkB,EAAE,IAAI;QACxB,OAAO,EAAE,KAAK;QACd,sBAAsB,EAAE,KAAK;QAC7B,QAAQ,EAAE,IAAI;KACf;IACD,mBAAmB,EAAE;QACnB,kBAAkB,EAAE,IAAI;QACxB,OAAO,EAAE,KAAK;QACd,sBAAsB,EAAE,KAAK;QAC7B,QAAQ,EAAE,IAAI;KACf;IACD,sBAAsB,EAAE;QACtB,kBAAkB,EAAE,IAAI;QACxB,OAAO,EAAE,KAAK;QACd,sBAAsB,EAAE,KAAK;QAC7B,QAAQ,EAAE,KAAK;KAChB;IACD,iBAAiB,EAAE;QACjB,kBAAkB,EAAE,IAAI;QACxB,OAAO,EAAE,KAAK;QACd,sBAAsB,EAAE,KAAK;QAC7B,QAAQ,EAAE,IAAI;KACf;IACD,wBAAwB,EAAE;QACxB,kBAAkB,EAAE,IAAI;QACxB,OAAO,EAAE,KAAK;QACd,sBAAsB,EAAE,KAAK;QAC7B,QAAQ,EAAE,IAAI;KACf;IACD,iBAAiB,EAAE;QACjB,kBAAkB,EAAE,IAAI;QACxB,OAAO,EAAE,KAAK;QACd,sBAAsB,EAAE,KAAK;QAC7B,QAAQ,EAAE,IAAI;KACf;IACD,kBAAkB,EAAE;QAClB,kBAAkB,EAAE,IAAI;QACxB,OAAO,EAAE,KAAK;QACd,sBAAsB,EAAE,KAAK;QAC7B,QAAQ,EAAE,IAAI;KACf;IACD,kBAAkB,EAAE;QAClB,kBAAkB,EAAE,IAAI;QACxB,OAAO,EAAE,KAAK;QACd,sBAAsB,EAAE,KAAK;QAC7B,QAAQ,EAAE,IAAI;KACf;IACD,kBAAkB,EAAE;QAClB,kBAAkB,EAAE,IAAI;QACxB,OAAO,EAAE,IAAI;QACb,sBAAsB,EAAE,KAAK;QAC7B,QAAQ,EAAE,IAAI;KACf;IACD,kBAAkB,EAAE;QAClB,kBAAkB,EAAE,IAAI;QACxB,OAAO,EAAE,IAAI;QACb,sBAAsB,EAAE,KAAK;QAC7B,QAAQ,EAAE,IAAI;KACf;IACD,eAAe,EAAE;QACf,kBAAkB,EAAE,IAAI;QACxB,OAAO,EAAE,IAAI;QACb,sBAAsB,EAAE,KAAK;QAC7B,QAAQ,EAAE,IAAI;KACf;IACD,SAAS,EAAE;QACT,kBAAkB,EAAE,KAAK;QACzB,OAAO,EAAE,KAAK;QACd,sBAAsB,EAAE,KAAK;QAC7B,QAAQ,EAAE,KAAK;KAChB;IACD,mBAAmB,EAAE;QACnB,kBAAkB,EAAE,IAAI;QACxB,OAAO,EAAE,KAAK;QACd,sBAAsB,EAAE,KAAK;QAC7B,QAAQ,EAAE,KAAK;KAChB;IACD,UAAU,EAAE;QACV,kBAAkB,EAAE,IAAI;QACxB,OAAO,EAAE,KAAK;QACd,sBAAsB,EAAE,KAAK;QAC7B,QAAQ,EAAE,IAAI;KACf;IACD,eAAe,EAAE;QACf,kBAAkB,EAAE,IAAI;QACxB,OAAO,EAAE,IAAI;QACb,sBAAsB,EAAE,KAAK;QAC7B,QAAQ,EAAE,IAAI;KACf;IACD,mBAAmB,EAAE;QACnB,kBAAkB,EAAE,IAAI;QACxB,OAAO,EAAE,IAAI;QACb,sBAAsB,EAAE,KAAK;QAC7B,QAAQ,EAAE,IAAI;KACf;IACD,gBAAgB,EAAE;QAChB,kBAAkB,EAAE,IAAI;QACxB,OAAO,EAAE,IAAI;QACb,sBAAsB,EAAE,KAAK;QAC7B,QAAQ,EAAE,IAAI;KACf;IACD,mBAAmB,EAAE;QACnB,kBAAkB,EAAE,IAAI;QACxB,OAAO,EAAE,IAAI;QACb,sBAAsB,EAAE,KAAK;QAC7B,QAAQ,EAAE,IAAI;KACf;IACD,uBAAuB,EAAE;QACvB,kBAAkB,EAAE,IAAI;QACxB,OAAO,EAAE,IAAI;QACb,sBAAsB,EAAE,KAAK;QAC7B,QAAQ,EAAE,IAAI;KACf;IACD,iBAAiB,EAAE;QACjB,kBAAkB,EAAE,IAAI;QACxB,OAAO,EAAE,IAAI;QACb,sBAAsB,EAAE,KAAK;QAC7B,QAAQ,EAAE,KAAK;KAChB;IACD,oBAAoB,EAAE;QACpB,kBAAkB,EAAE,KAAK;QACzB,OAAO,EAAE,KAAK;QACd,sBAAsB,EAAE,KAAK;QAC7B,QAAQ,EAAE,IAAI;KACf;IACD,gBAAgB,EAAE;QAChB,kBAAkB,EAAE,KAAK;QACzB,OAAO,EAAE,KAAK;QACd,sBAAsB,EAAE,KAAK;QAC7B,QAAQ,EAAE,IAAI;KACf;IACD,yBAAyB,EAAE;QACzB,kBAAkB,EAAE,KAAK;QACzB,OAAO,EAAE,KAAK;QACd,sBAAsB,EAAE,KAAK;QAC7B,QAAQ,EAAE,KAAK;KAChB;IACD,eAAe,EAAE;QACf,kBAAkB,EAAE,KAAK;QACzB,OAAO,EAAE,KAAK;QACd,sBAAsB,EAAE,KAAK;QAC7B,QAAQ,EAAE,IAAI;KACf;IACD,YAAY,EAAE;QACZ,kBAAkB,EAAE,KAAK;QACzB,OAAO,EAAE,KAAK;QACd,sBAAsB,EAAE,KAAK;QAC7B,QAAQ,EAAE,IAAI;KACf;IACD,kBAAkB,EAAE;QAClB,kBAAkB,EAAE,KAAK;QACzB,OAAO,EAAE,KAAK;QACd,sBAAsB,EAAE,KAAK;QAC7B,QAAQ,EAAE,IAAI;KACf;IACD,uBAAuB,EAAE;QACvB,kBAAkB,EAAE,KAAK;QACzB,OAAO,EAAE,KAAK;QACd,sBAAsB,EAAE,KAAK;QAC7B,QAAQ,EAAE,KAAK;KAChB;IACD,qBAAqB,EAAE;QACrB,kBAAkB,EAAE,KAAK;QACzB,OAAO,EAAE,KAAK;QACd,sBAAsB,EAAE,KAAK;QAC7B,QAAQ,EAAE,KAAK;KAChB;CACF,CAAC;AAuMF,MAAM,yBAAyB,GAAG;IAChC,YAAY;IACZ,WAAW;IACX,aAAa;IACb,cAAc;IACd,eAAe;IACf,gBAAgB;IAChB,UAAU;IACV,cAAc;IACd,eAAe;IACf,WAAW;IACX,eAAe;IACf,YAAY;IACZ,iBAAiB;IACjB,YAAY;IACZ,oBAAoB;IACpB,eAAe;IACf,YAAY;IACZ,eAAe;IACf,uBAAuB;IACvB,yBAAyB;IACzB,wBAAwB;IACxB,yBAAyB;IACzB,iCAAiC;IACjC,wBAAwB;IACxB,uBAAuB;IACvB,6BAA6B;IAC7B,4BAA4B;IAC5B,+BAA+B;IAC/B,8BAA8B;IAC9B,gCAAgC;IAChC,sBAAsB;IACtB,uBAAuB;IACvB,yBAAyB;IACzB,2BAA2B;IAC3B,4BAA4B;IAC5B,2BAA2B;CACnB,CAAC;AAEX;;;;;;;GAOG;AACH,MAAM,OAAO,eAAgB,SAAQ,cAIpC;IAyGC,YAAY,EACV,SAAS,EACT,KAAK,GAAG,EAAE,EACV,YAAY,GAAG,EAAE,EACjB,cAAc,EACd,qBAAqB,GAAG,KAAK,GACN;QACvB,KAAK,CAAC;YACJ,IAAI,EAAE,iBAAiB;YACvB,QAAQ;YACR,SAAS;YACT,KAAK,EAAE,EAAE,GAAG,8BAA8B,EAAE,EAAE,GAAG,KAAK,EAAE;SACzD,CAAC,CAAC;;QAlHK,kBAAa,GAAG,KAAK,CAAC;QAEhC,iDAA+C,IAAI,EAAC;QAEpD,4CAAoB,KAAK,EAAC;QAEhB,sBAAiB,GAAsB;YAC/C,IAAI,EAAE,EAAE;YACR,MAAM,EAAE,UAAU;SACnB,CAAC;QAEF;;;;;WAKG;QACH,oDAA4B,CAAC,EAAC;QAE9B,4EAA4E;QAC5E,+CAAsB;QAEtB,wDAAgC;QAEhC,wDAAgC;QAEhC,4CAA2C,UAAU,EAAC;QAoCtD;;;;WAIG;QACO,2BAAsB,GAAyB,IAAI,CAAC;QAE9D;;;;WAIG;QACH,8CAAkD,IAAI,EAAC;QAEvD,uDAA+C,IAAI,EAAC;QAEpD,yDAAgD,IAAI,EAAC;QAErD,4DAAmC;QAEnC,oGAAoG;QAC3F,2CAAiC;QAE1C,8DAA8D;QACrD,kDAAgC;QAEhC,qDAAsC;QAEtC,kDAAgC;QAEhC,sDAAwC;QAExC,mDAAkC;QAElC,kDAAgC;QAEhC,mEAAkE;QAElE,6DAAsD;QAmlD/D,wCAAuD,IAAI,EAAC;QAE5D,wCAAgB,KAAK,EAAC;QAEtB,gDAAwB,KAAK,EAAC;QAE9B,mDAAgD,IAAI,EAAC;QAErD,oDAAiD,IAAI,EAAC;QAEtD,6CAAqC,IAAI,EAAC;QAE1C,qDAA4C,IAAI,EAAC;QA/kD/C,uBAAA,IAAI,6CAA6B,qBAAqB,MAAA,CAAC;QAEvD,yCAAyC;QACzC,uBAAA,IAAI,4BAAY;YACd,SAAS;YACT,KAAK;YACL,YAAY;YACZ,cAAc;SACf,MAAA,CAAC;QAEF,kDAAkD;QAClD,mEAAmE;QACnE,uBAAA,IAAI,mCAAmB,IAAI,cAAc,CAAC,cAAc,CAAC,MAAA,CAAC;QAC1D,uBAAA,IAAI,sCAAsB,IAAI,iBAAiB,CAAC,cAAc,CAAC,MAAA,CAAC;QAChE,uBAAA,IAAI,mCAAmB,IAAI,cAAc,CAAC,cAAc,EAAE,SAAS,CAAC,MAAA,CAAC;QACrE,uBAAA,IAAI,uCAAuB,IAAI,kBAAkB,CAAC,cAAc,CAAC,MAAA,CAAC;QAClE,uBAAA,IAAI,oCAAoB,IAAI,eAAe,CAAC,cAAc,EAAE,SAAS,CAAC,MAAA,CAAC;QACvE,uBAAA,IAAI,mCAAmB,IAAI,cAAc,CAAC,cAAc,EAAE,SAAS,CAAC,MAAA,CAAC;QACrE,uBAAA,IAAI,oDAAoC,IAAI,+BAA+B,CACzE,cAAc,CACf,MAAA,CAAC;QACF,uBAAA,IAAI,8CAA8B,IAAI,yBAAyB,CAC7D,cAAc,EACd,SAAS,CACV,MAAA,CAAC;QAEF,2FAA2F;QAC3F,uBAAA,IAAI,gCAAgB,YAAY,CAAC,mBAAmB,IAAI,KAAK,MAAA,CAAC;QAC9D,uBAAA,IAAI,yCAAyB;YAC3B,GAAG,CAAC,YAAY,CAAC,4BAA4B,IAAI,EAAE,CAAC;SACrD,MAAA,CAAC;QACF,uBAAA,IAAI,yCAAyB;YAC3B,GAAG,CAAC,YAAY,CAAC,4BAA4B,IAAI,EAAE,CAAC;SACrD,MAAA,CAAC;QAEF,iIAAiI;QACjI,IAAI,CAAC,oBAAoB,CACvB,YAAY,CAAC,sBAAsB,IAAI,EAAE,EACzC,UAAU,CACX,CAAC;QAEF;;;;;;WAMG;QACH,IAAI,CAAC;YACH,MAAM,6BAA6B,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CACvD,sCAAsC,CACvC,CAAC;YAEF,IAAI,CAAC,qCAAqC,CAAC,6BAA6B,CAAC,CAAC;QAC5E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,iFAAiF;YACjF,oDAAoD;YACpD,iFAAiF;YACjF,uBAAA,IAAI,6DAAU,MAAd,IAAI,EACF,WAAW,CAAC,KAAK,EAAE,6BAA6B,CAAC,EACjD,uBAAA,IAAI,oEAAiB,MAArB,IAAI,EAAkB,aAAa,EAAE;gBACnC,SAAS,EAAE,wBAAwB;aACpC,CAAC,CACH,CAAC;QACJ,CAAC;QAED,yEAAyE;QACzE,oEAAoE;QACpE,6DAA6D;QAC7D,IAAI,CAAC,SAAS,CAAC,SAAS,CACtB,yCAAyC,EACzC,IAAI,CAAC,qCAAqC,CAAC,IAAI,CAAC,IAAI,CAAC,CACtD,CAAC;QAEF,IAAI,CAAC,SAAS,GAAG,IAAI,GAAG,EAAE,CAAC;QAE3B,oDAAoD;QACpD,uBAAA,IAAI,4EAAyB,MAA7B,IAAI,CAA2B,CAAC;QAEhC,IAAI,CAAC,SAAS,CAAC,4BAA4B,CACzC,IAAI,EACJ,yBAAyB,CAC1B,CAAC;IACJ,CAAC;IAwFD;;;;OAIG;IACO,qBAAqB;QAC7B,OAAO,uBAAA,IAAI,2CAAoB,KAAK,IAAI,CAAC;IAC3C,CAAC;IAkFS,oBAAoB,CAC5B,IAAc,EACd,MAA6B;QAE7B,uBAAA,IAAI,wDAAiC,CAAC,iBAAiB,CAAC;YACtD,IAAI;YACJ,MAAM;YACN,OAAO,EAAE,uBAAA,IAAI,yEAAsB,MAA1B,IAAI,EAAuB,sBAAsB,EAAE;gBAC1D,oBAAoB,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,iBAAiB;gBAClD,oBAAoB,EAAE,CACpB,OAAiB,EACjB,SAAgC,EAChC,EAAE;oBACF,IAAI,CAAC,iBAAiB,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;oBAC9D,uJAAkC,CAAC,MAAA,CAAC;gBACtC,CAAC;gBACD,kBAAkB,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE;aACpD,CAAC;SACH,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;OAOG;IACO,qCAAqC,CAC7C,gCAA6D;QAE7D,uBAAA,IAAI,wDAAiC,CAAC,kBAAkB,CAAC;YACvD,gCAAgC;YAChC,OAAO,EAAE,uBAAA,IAAI,yEAAsB,MAA1B,IAAI,EACX,uCAAuC,EACvC;gBACE,oBAAoB,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,iBAAiB;gBAClD,oBAAoB,EAAE,CACpB,IAAc,EACd,MAA6B,EAC7B,EAAE;oBACF,IAAI,CAAC,iBAAiB,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;oBAC1C,uJAAkC,CAAC,MAAA,CAAC;gBACtC,CAAC;gBACD,kBAAkB,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE;gBACnD,aAAa,EAAE,GAAG,EAAE,CAAC,CAAC;oBACpB,OAAO,EAAE,uBAAA,IAAI,oCAAa;oBAC1B,gBAAgB,EAAE,uBAAA,IAAI,6CAAsB;oBAC5C,gBAAgB,EAAE,uBAAA,IAAI,6CAAsB;oBAC5C,MAAM,EAAE,uBAAA,IAAI,yCAAkB;iBAC/B,CAAC;gBACF,aAAa,EAAE,CAAC,MAAM,EAAE,EAAE;oBACxB,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;wBACjC,uBAAA,IAAI,gCAAgB,MAAM,CAAC,OAAO,MAAA,CAAC;oBACrC,CAAC;oBACD,IAAI,MAAM,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;wBAC1C,uBAAA,IAAI,yCAAyB,CAAC,GAAG,MAAM,CAAC,gBAAgB,CAAC,MAAA,CAAC;oBAC5D,CAAC;oBACD,IAAI,MAAM,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;wBAC1C,uBAAA,IAAI,yCAAyB,CAAC,GAAG,MAAM,CAAC,gBAAgB,CAAC,MAAA,CAAC;oBAC5D,CAAC;oBACD,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;wBAChC,uBAAA,IAAI,qCAAqB,MAAM,CAAC,MAAM,MAAA,CAAC;oBACzC,CAAC;gBACH,CAAC;gBACD,0BAA0B,EAAE,GAAG,EAAE;oBAC/B,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;oBAC3D,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;wBACpB,KAAK,CAAC,iBAAiB,GAAG,UAAU,CAAC;oBACvC,CAAC,CAAC,CAAC;oBACH,OAAO,UAAU,CAAC;gBACpB,CAAC;aACF,CACF;SACF,CAAC,CAAC;IACL,CAAC;IA4ED;;;;;;OAMG;IACH,KAAK,CAAC,IAAI;QACR,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,IAAI,uBAAA,IAAI,8CAAuB,EAAE,CAAC;YAChC,OAAO,uBAAA,IAAI,8CAAuB,CAAC;QACrC,CAAC;QAED,uBAAA,IAAI,0CAA0B,uBAAA,IAAI,0EAAuB,MAA3B,IAAI,CAAyB,MAAA,CAAC;QAC5D,OAAO,uBAAA,IAAI,8CAAuB,CAAC;IACrC,CAAC;IAgRD;;;;;;;OAOG;IACH,iBAAiB;QACf,iDAAiD;QACjD,IAAI,IAAI,CAAC,yBAAyB,EAAE,EAAE,CAAC;YACrC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;gBACpB,KAAK,CAAC,SAAS,GAAG,iBAAiB,CAAC,qBAAqB,CAAC;gBAC1D,KAAK,CAAC,mBAAmB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACzC,CAAC,CAAC,CAAC;YACH,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,qBAAqB,CAAC,CAAC;QAC3D,CAAC;QAED,2BAA2B;QAC3B,IACE,IAAI,CAAC,KAAK,CAAC,mBAAmB,KAAK,mBAAmB,CAAC,WAAW;YAClE,CAAC,IAAI,CAAC,aAAa,EACnB,CAAC;YACD,MAAM,YAAY,GAChB,IAAI,CAAC,KAAK,CAAC,mBAAmB,KAAK,mBAAmB,CAAC,MAAM;gBAC3D,CAAC,CAAC,GAAG,iBAAiB,CAAC,sBAAsB,KAAK,IAAI,CAAC,KAAK,CAAC,mBAAmB,IAAI,uBAAuB,EAAE;gBAC7G,CAAC,CAAC,iBAAiB,CAAC,sBAAsB,CAAC;YAE/C,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;gBACpB,KAAK,CAAC,SAAS,GAAG,YAAY,CAAC;gBAC/B,KAAK,CAAC,mBAAmB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACzC,CAAC,CAAC,CAAC;YACH,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;QAChC,CAAC;QAED,wFAAwF;QACxF,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,CAAC;YACjC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;gBACpB,KAAK,CAAC,SAAS,GAAG,iBAAiB,CAAC,sBAAsB,CAAC;gBAC3D,KAAK,CAAC,mBAAmB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACzC,CAAC,CAAC,CAAC;YACH,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,sBAAsB,CAAC,CAAC;QAC5D,CAAC;QAED,OAAO,IAAI,CAAC,sBAAsB,CAAC;IACrC,CAAC;IAED;;;;;;OAMG;IACH,uBAAuB;QACrB,sCAAsC;QACtC,IAAI,IAAI,CAAC,yBAAyB,EAAE,EAAE,CAAC;YACrC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,iCAAiC;QACjC,IACE,IAAI,CAAC,KAAK,CAAC,mBAAmB,KAAK,mBAAmB,CAAC,WAAW;YAClE,CAAC,IAAI,CAAC,aAAa,EACnB,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,2DAA2D;QAC3D,OAAO,IAAI,CAAC,sBAAsB,IAAI,IAAI,CAAC;IAC7C,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,UAAU,CAAC,MAAmB;QAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC1C,uBAAA,IAAI,6EAA0B,MAA9B,IAAI,CAA4B,CAAC;QAEjC,OAAO,uBAAA,IAAI,uCAAgB,CAAC,UAAU,CAAC;YACrC,QAAQ;YACR,MAAM;YACN,OAAO,EAAE,uBAAA,IAAI,yEAAsB,MAA1B,IAAI,EAAuB,YAAY,EAAE;gBAChD,sBAAsB,EAAE,CAAC,MAAc,EAAE,QAAgB,EAAE,EAAE,CAC3D,IAAI,CAAC,sBAAsB,CAAC,MAAM,EAAE,QAAQ,CAAC;aAChD,CAAC;YACF,qBAAqB,EAAE,CAAC,cAAc,EAAE,EAAE,CACxC,IAAI,CAAC,qBAAqB,CAAC,cAAc,CAAC;SAC7C,CAAC,CAAC;IACL,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,SAAS,CAAC,MAAuB;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC1C,uBAAA,IAAI,6EAA0B,MAA9B,IAAI,CAA4B,CAAC;QAEjC,OAAO,uBAAA,IAAI,uCAAgB,CAAC,SAAS,CAAC;YACpC,QAAQ;YACR,MAAM;YACN,OAAO,EAAE,uBAAA,IAAI,yEAAsB,MAA1B,IAAI,EAAuB,WAAW,CAAC;SACjD,CAAC,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,WAAW,CAAC,MAAyB;QACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAE1C,OAAO,uBAAA,IAAI,uCAAgB,CAAC,WAAW,CAAC;YACtC,QAAQ;YACR,MAAM;YACN,OAAO,EAAE,uBAAA,IAAI,yEAAsB,MAA1B,IAAI,EAAuB,aAAa,CAAC;SACnD,CAAC,CAAC;IACL,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,YAAY,CAAC,MAA0B;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAE1C,OAAO,uBAAA,IAAI,uCAAgB,CAAC,YAAY,CAAC;YACvC,QAAQ;YACR,MAAM;YACN,OAAO,EAAE,uBAAA,IAAI,yEAAsB,MAA1B,IAAI,EAAuB,cAAc,EAAE;gBAClD,aAAa,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE;aAC1C,CAAC;YACF,eAAe,EAAE,CACf,SAAiC,EACjC,QAAkB,EAClB,EAAE,CAAC,uBAAA,IAAI,oEAAiB,MAArB,IAAI,EAAkB,SAAS,EAAE,QAAQ,CAAC;SAChD,CAAC,CAAC;IACL,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,aAAa,CAAC,MAA2B;QAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC1C,uBAAA,IAAI,6EAA0B,MAA9B,IAAI,CAA4B,CAAC;QAEjC,OAAO,uBAAA,IAAI,uCAAgB,CAAC,aAAa,CAAC;YACxC,QAAQ;YACR,MAAM;YACN,OAAO,EAAE,uBAAA,IAAI,yEAAsB,MAA1B,IAAI,EAAuB,eAAe,EAAE;gBACnD,YAAY,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE;aACxC,CAAC;YACF,qBAAqB,EAAE,CAAC,cAAc,EAAE,EAAE,CACxC,IAAI,CAAC,qBAAqB,CAAC,cAAc,CAAC;SAC7C,CAAC,CAAC;IACL,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,cAAc,CAClB,MAA4B;QAE5B,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC1C,uBAAA,IAAI,6EAA0B,MAA9B,IAAI,CAA4B,CAAC;QAEjC,OAAO,uBAAA,IAAI,uCAAgB,CAAC,cAAc,CAAC;YACzC,QAAQ;YACR,MAAM;YACN,OAAO,EAAE,uBAAA,IAAI,yEAAsB,MAA1B,IAAI,EAAuB,gBAAgB,EAAE;gBACpD,YAAY,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE;aACxC,CAAC;SACH,CAAC,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,kBAAkB,CACtB,MAAgC;QAEhC,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC1C,uBAAA,IAAI,6EAA0B,MAA9B,IAAI,CAA4B,CAAC;QAEjC,OAAO,uBAAA,IAAI,uCAAgB,CAAC,kBAAkB,CAAC;YAC7C,QAAQ;YACR,MAAM;YACN,OAAO,EAAE,uBAAA,IAAI,yEAAsB,MAA1B,IAAI,EAAuB,oBAAoB,CAAC;SAC1D,CAAC,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,YAAY,CAAC,MAA0B;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC1C,uBAAA,IAAI,6EAA0B,MAA9B,IAAI,CAA4B,CAAC;QAEjC,OAAO,uBAAA,IAAI,uCAAgB,CAAC,YAAY,CAAC;YACvC,QAAQ;YACR,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,OAAO,EAAE,uBAAA,IAAI,yEAAsB,MAA1B,IAAI,EAAuB,cAAc,CAAC;SACpD,CAAC,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,YAAY,CAAC,MAA0B;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC1C,uBAAA,IAAI,6EAA0B,MAA9B,IAAI,CAA4B,CAAC;QAEjC,OAAO,uBAAA,IAAI,uCAAgB,CAAC,YAAY,CAAC;YACvC,QAAQ;YACR,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,OAAO,EAAE,uBAAA,IAAI,yEAAsB,MAA1B,IAAI,EAAuB,cAAc,CAAC;SACpD,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,uBAAuB,CAC3B,SAAwC,EAAE;QAE1C,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;QAEtC,IAAI,gBAAoC,CAAC;QAEzC,IAAI,CAAC;YACH,2DAA2D;YAC3D,6DAA6D;YAE7D,mDAAmD;YACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC1C,MAAM,EACJ,WAAW,EACX,YAAY,EACZ,gBAAgB,EAAE,SAAS,GAC5B,GAAG,MAAM,uBAAA,IAAI,uCAAgB,CAAC,kBAAkB,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;YAChE,gBAAgB,GAAG,SAAS,CAAC;YAE7B,oFAAoF;YACpF,MAAM,UAAU,GAAG,qBAAqB,CACtC,IAAI,CAAC,SAAS,CAAC,IAAI,CACjB,2DAA2D,CAC5D,CACF,CAAC;YACF,MAAM,cAAc,GAAG,UAAU,EAAE,OAAO,IAAI,SAAS,CAAC;YAExD,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;gBACpB,KAAK,CAAC,iBAAiB,GAAG,IAAI,CAAC;gBAE/B,kCAAkC;gBAClC,MAAM,cAAc,GAAG;oBACrB,EAAE,EAAE,gBAAgB,IAAI,MAAM,EAAE;oBAChC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;oBACrB,MAAM,EAAE,MAAM,IAAI,GAAG,EAAE,wCAAwC;oBAC/D,KAAK,EAAE,WAAW;oBAClB,cAAc,EAAE,wCAAwC;oBACxD,OAAO,EAAE,KAAK,EAAE,6CAA6C;oBAC7D,MAAM,EAAE,SAAS;oBACjB,MAAM,EAAE,SAA8B;oBACtC,MAAM,EAAE,SAAS;oBACjB,aAAa,EAAE,SAAS,EAAE,0CAA0C;iBACrE,CAAC;gBAEF,KAAK,CAAC,eAAe,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,4BAA4B;YAC7E,CAAC,CAAC,CAAC;YAEH,MAAM,eAAe,GAAG,uBAAA,IAAI,gFAA6B,MAAjC,IAAI,EAA8B,YAAY,CAAC,CAAC;YAExE,IAAI,CAAC,eAAe,EAAE,CAAC;gBACrB,MAAM,IAAI,KAAK,CACb,qCAAqC,YAAY,iCAAiC,CACnF,CAAC;YACJ,CAAC;YAED,IAAI,MAAuB,CAAC;YAC5B,IAAI,eAA+B,CAAC;YACpC,IAAI,kBAAkB,GAA2B,IAAI,CAAC;YAEtD,MAAM,yBAAyB,GAAG;gBAChC,eAAe;gBACf,MAAM,EAAE,eAAe;gBACvB,sBAAsB,EAAE,IAAI;aAC7B,CAAC;YAEF,IAAI,UAAU,EAAE,CAAC;gBACf,qFAAqF;gBACrF,MAAM,SAAS,GAAG,MAAM,uBAAA,IAAI,sEAAmB,MAAvB,IAAI,EAAoB,WAAW,EAAE;oBAC3D,GAAG,yBAAyB;oBAC5B,IAAI,EAAE,sBAAsB;iBAC7B,CAAC,CAAC;gBACH,eAAe,GAAG,SAAS,CAAC,eAAe,CAAC;gBAC5C,iEAAiE;gBACjE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;gBAC7C,kEAAkE;gBAClE,kBAAkB,GAAG,SAAS,CAAC,MAAM,CAAC;YACxC,CAAC;iBAAM,CAAC;gBACN,6DAA6D;gBAC7D,oFAAoF;gBACpF,MAAM,YAAY,GAAG,MAAM,uBAAA,IAAI,sEAAmB,MAAvB,IAAI,EAAoB,WAAW,EAAE;oBAC9D,GAAG,yBAAyB;oBAC5B,IAAI,EAAE,cAAc;iBACrB,CAAC,CAAC;gBACH,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC;gBAC7B,eAAe,GAAG,YAAY,CAAC,eAAe,CAAC;YACjD,CAAC;YAED,kEAAkE;YAClE,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;gBACpB,KAAK,CAAC,wBAAwB,GAAG,eAAe,CAAC,EAAE,CAAC;YACtD,CAAC,CAAC,CAAC;YAEH,6EAA6E;YAC7E,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,6DAA6D;gBAC7D,sFAAsF;gBAEtF,kCAAkC;gBAClC,sFAAsF;gBACtF,0EAA0E;gBAC1E,0DAA0D;gBAE1D,+GAA+G;gBAC/G,2CAA2C;gBAC3C,MAAM;qBACH,IAAI,CAAC,CAAC,YAAY,EAAE,EAAE;oBACrB,yCAAyC;oBACzC,4DAA4D;oBAC5D,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;wBACpB,KAAK,CAAC,iBAAiB,GAAG,IAAI,CAAC;wBAC/B,KAAK,CAAC,iBAAiB,GAAG;4BACxB,OAAO,EAAE,IAAI;4BACb,MAAM,EAAE,YAAY;4BACpB,MAAM,EAAE,MAAM,IAAI,GAAG;4BACrB,KAAK,EAAE,WAAW,EAAE,6BAA6B;4BACjD,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;4BACrB,KAAK,EAAE,EAAE;yBACV,CAAC;wBAEF,oEAAoE;wBACpE,IAAI,KAAK,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;4BACrC,MAAM,eAAe,GAAG,KAAK,CAAC,eAAe,CAAC,IAAI,CAChD,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,gBAAgB,CACrC,CAAC;4BACF,IAAI,eAAe,EAAE,CAAC;gCACpB,mEAAmE;gCACnE,0DAA0D;gCAC1D,eAAe,CAAC,MAAM,GAAG,WAAgC,CAAC;gCAC1D,eAAe,CAAC,OAAO,GAAG,IAAI,CAAC;gCAC/B,eAAe,CAAC,MAAM,GAAG,YAAY,CAAC;4BACxC,CAAC;wBACH,CAAC;oBACH,CAAC,CAAC,CAAC;oBAEH,8CAA8C;oBAC9C,UAAU,CAAC,GAAG,EAAE;wBACd,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;4BACpB,KAAK,CAAC,iBAAiB,GAAG,KAAK,CAAC;4BAChC,KAAK,CAAC,wBAAwB,GAAG,IAAI,CAAC;wBACxC,CAAC,CAAC,CAAC;oBACL,CAAC,EAAE,GAAG,CAAC,CAAC;oBAER,OAAO,SAAS,CAAC;gBACnB,CAAC,CAAC;qBACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;oBACf,iDAAiD;oBACjD,MAAM,YAAY,GAAG,WAAW,CAC9B,KAAK,EACL,iCAAiC,CAClC,CAAC,OAAO,CAAC;oBACV,MAAM,aAAa,GACjB,YAAY,CAAC,QAAQ,CAAC,aAAa,CAAC;wBACpC,YAAY,CAAC,QAAQ,CAAC,eAAe,CAAC;wBACtC,YAAY,CAAC,QAAQ,CAAC,gBAAgB,CAAC;wBACvC,YAAY,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;oBAEzC,IAAI,aAAa,EAAE,CAAC;wBAClB,6CAA6C;wBAC7C,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;4BACpB,KAAK,CAAC,iBAAiB,GAAG,KAAK,CAAC;4BAChC,KAAK,CAAC,wBAAwB,GAAG,IAAI,CAAC;4BACtC,gDAAgD;4BAEhD,oCAAoC;4BACpC,MAAM,eAAe,GAAG,KAAK,CAAC,eAAe,CAAC,IAAI,CAChD,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,gBAAgB,CACrC,CAAC;4BACF,IAAI,eAAe,EAAE,CAAC;gCACpB,eAAe,CAAC,MAAM,GAAG,WAAgC,CAAC;gCAC1D,eAAe,CAAC,OAAO,GAAG,KAAK,CAAC;4BAClC,CAAC;wBACH,CAAC,CAAC,CAAC;oBACL,CAAC;yBAAM,CAAC;wBACN,2DAA2D;wBAC3D,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;4BACpB,KAAK,CAAC,iBAAiB,GAAG,KAAK,CAAC;4BAChC,KAAK,CAAC,wBAAwB,GAAG,IAAI,CAAC;4BACtC,KAAK,CAAC,iBAAiB,GAAG;gCACxB,OAAO,EAAE,KAAK;gCACd,KAAK,EAAE,YAAY;gCACnB,MAAM,EAAE,MAAM,IAAI,GAAG;gCACrB,KAAK,EAAE,WAAW,EAAE,6BAA6B;gCACjD,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;gCACrB,MAAM,EAAE,EAAE;6BACX,CAAC;4BAEF,oEAAoE;4BACpE,IAAI,KAAK,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gCACrC,MAAM,eAAe,GAAG,KAAK,CAAC,eAAe,CAAC,IAAI,CAChD,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,gBAAgB,CACrC,CAAC;gCACF,IAAI,eAAe,EAAE,CAAC;oCACpB,eAAe,CAAC,MAAM,GAAG,QAA6B,CAAC;oCACvD,eAAe,CAAC,OAAO,GAAG,KAAK,CAAC;gCAClC,CAAC;4BACH,CAAC;wBACH,CAAC,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC,CAAC,CAAC;YACP,CAAC;iBAAM,IAAI,kBAAkB,EAAE,CAAC;gBAC9B,yDAAyD;gBACzD,kBAAkB;qBACf,IAAI,CAAC,CAAC,YAAY,EAAE,EAAE;oBACrB,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;wBACpB,MAAM,eAAe,GAAG,KAAK,CAAC,eAAe,CAAC,IAAI,CAChD,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,gBAAgB,CACrC,CAAC;wBACF,IAAI,eAAe,EAAE,CAAC;4BACpB,eAAe,CAAC,MAAM,GAAG,WAAgC,CAAC;4BAC1D,eAAe,CAAC,OAAO,GAAG,IAAI,CAAC;4BAC/B,eAAe,CAAC,MAAM,GAAG,YAAY,CAAC;wBACxC,CAAC;oBACH,CAAC,CAAC,CAAC;oBACH,OAAO,SAAS,CAAC;gBACnB,CAAC,CAAC;qBACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;oBACf,MAAM,YAAY,GAAG,WAAW,CAC9B,KAAK,EACL,kCAAkC,CACnC,CAAC,OAAO,CAAC;oBACV,MAAM,cAAc,GAClB,YAAY,CAAC,QAAQ,CAAC,aAAa,CAAC;wBACpC,YAAY,CAAC,QAAQ,CAAC,eAAe,CAAC;wBACtC,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC;wBAClC,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;oBACpC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;wBACpB,MAAM,eAAe,GAAG,KAAK,CAAC,eAAe,CAAC,IAAI,CAChD,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,gBAAgB,CACrC,CAAC;wBACF,IAAI,eAAe,EAAE,CAAC;4BACpB,eAAe,CAAC,MAAM,GAAG,CACvB,cAAc,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CACnB,CAAC;4BACvB,eAAe,CAAC,OAAO,GAAG,KAAK,CAAC;wBAClC,CAAC;oBACH,CAAC,CAAC,CAAC;gBACL,CAAC,CAAC,CAAC;YACP,CAAC;YAED,OAAO;gBACL,MAAM;aACP,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,iDAAiD;YACjD,MAAM,YAAY,GAAG,WAAW,CAC9B,KAAK,EACL,iCAAiC,CAClC,CAAC,OAAO,CAAC;YACV,MAAM,aAAa,GACjB,YAAY,CAAC,QAAQ,CAAC,aAAa,CAAC;gBACpC,YAAY,CAAC,QAAQ,CAAC,eAAe,CAAC;gBACtC,YAAY,CAAC,QAAQ,CAAC,gBAAgB,CAAC;gBACvC,YAAY,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;YAEzC,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,mDAAmD;gBACnD,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;oBACpB,KAAK,CAAC,wBAAwB,GAAG,IAAI,CAAC;oBACtC,kEAAkE;oBAElE,oDAAoD;oBACpD,IAAI,gBAAgB,EAAE,CAAC;wBACrB,MAAM,OAAO,GAAG,KAAK,CAAC,eAAe,CAAC,IAAI,CACxC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,gBAAgB,CACrC,CAAC;wBACF,IAAI,OAAO,EAAE,CAAC;4BACZ,OAAO,CAAC,MAAM,GAAG,QAA6B,CAAC;4BAC/C,OAAO,CAAC,OAAO,GAAG,KAAK,CAAC;wBAC1B,CAAC;oBACH,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,gBAAgB;QACpB,OAAO,IAAI,CAAC,uBAAuB,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED;;OAEG;IACH,kBAAkB;QAChB,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;YACpB,KAAK,CAAC,iBAAiB,GAAG,IAAI,CAAC;QACjC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,mBAAmB;QACjB,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;YACpB,KAAK,CAAC,kBAAkB,GAAG,IAAI,CAAC;QAClC,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;OAOG;IACH,sBAAsB,CACpB,YAAoB,EACpB,MAA8B,EAC9B,MAAe;QAEf,IAAI,gBAAoC,CAAC;QACzC,IAAI,WAAW,GAAG,KAAK,CAAC;QACxB,IAAI,KAAK,GAAG,KAAK,CAAC;QAElB,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;YACpB,MAAM,eAAe,GAAG,KAAK,CAAC,kBAAkB,CAAC,SAAS,CACxD,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,YAAY,CACzC,CAAC;YAEF,IAAI,eAAe,IAAI,CAAC,EAAE,CAAC;gBACzB,KAAK,GAAG,IAAI,CAAC;gBACb,MAAM,OAAO,GAAG,KAAK,CAAC,kBAAkB,CAAC,eAAe,CAAC,CAAC;gBAC1D,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC;gBAClC,WAAW;oBACT,gBAAgB,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,CAAC;gBAC9D,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;gBACxB,OAAO,CAAC,OAAO,GAAG,MAAM,KAAK,WAAW,CAAC;gBACzC,IAAI,MAAM,EAAE,CAAC;oBACX,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;gBAC1B,CAAC;gBAED,sDAAsD;gBACtD,IAAI,MAAM,KAAK,WAAW,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;oBAClD,KAAK,CAAC,kBAAkB,GAAG;wBACzB,QAAQ,EAAE,CAAC;wBACX,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE;wBACvB,kBAAkB,EAAE,IAAI;qBACzB,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,WAAW,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;YAClD,uBAAA,IAAI,+DAAY,MAAhB,IAAI,CAAc,CAAC,eAAe,CAChC,mBAAmB,CAAC,qBAAqB,EACzC;gBACE,CAAC,oBAAoB,CAAC,MAAM,CAAC,EAC3B,MAAM,KAAK,WAAW;oBACpB,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC,SAAS;oBACpC,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC,MAAM;gBACrC,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EACtC,MAAM,CAAC,UAAU,CAAC,gBAAgB,CAAC;aACtC,CACF,CAAC;QACJ,CAAC;QAED,IAAI,KAAK,EAAE,CAAC;YACV,uBAAA,IAAI,6DAAU,MAAd,IAAI,EAAW,4CAA4C,EAAE;gBAC3D,YAAY;gBACZ,MAAM;gBACN,MAAM;aACP,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,wBAAwB,CACtB,QAAgB,EAChB,qBAAoC,IAAI;QAExC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;YACpB,KAAK,CAAC,kBAAkB,GAAG;gBACzB,QAAQ;gBACR,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE;gBACvB,kBAAkB;aACnB,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;OAIG;IACH,qBAAqB;QAKnB,OAAO,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC;IACvC,CAAC;IAED;;;;;;;;;;;;OAYG;IACH,KAAK,CAAC,QAAQ,CAAC,MAAsB;QACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAE1C,OAAO,uBAAA,IAAI,uCAAgB,CAAC,QAAQ,CAAC;YACnC,QAAQ;YACR,MAAM;YACN,OAAO,EAAE,uBAAA,IAAI,yEAAsB,MAA1B,IAAI,EAAuB,UAAU,CAAC;YAC/C,mBAAmB,EAAE,KAAK,IAAI,EAAE;gBAC9B,MAAM,IAAI,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC,CAAC;YAC5D,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,YAAY,CAAC,MAA2B;QAC5C,6EAA6E;QAC7E,4FAA4F;QAC5F,IAAI,MAAM,EAAE,UAAU,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;YAC7C,0EAA0E;YAC1E,0EAA0E;YAC1E,6EAA6E;YAC7E,MAAM,QAAQ,GACZ,IAAI,CAAC,sBAAsB,IAAI,uBAAA,IAAI,kFAA+B,MAAnC,IAAI,CAAiC,CAAC;YACvE,OAAO,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QACvC,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC1C,OAAO,uBAAA,IAAI,0CAAmB,CAAC,YAAY,CAAC;YAC1C,QAAQ;YACR,MAAM;YACN,OAAO,EAAE,uBAAA,IAAI,yEAAsB,MAA1B,IAAI,EAAuB,cAAc,CAAC;SACpD,CAAC,CAAC;IACL,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,aAAa,CAAC,MAA4B;QAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC1C,OAAO,uBAAA,IAAI,0CAAmB,CAAC,aAAa,CAAC;YAC3C,QAAQ;YACR,MAAM;YACN,OAAO,EAAE,uBAAA,IAAI,yEAAsB,MAA1B,IAAI,EAAuB,eAAe,CAAC;SACrD,CAAC,CAAC;IACL,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,SAAS,CAAC,MAAwB;QACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC1C,OAAO,uBAAA,IAAI,0CAAmB,CAAC,SAAS,CAAC;YACvC,QAAQ;YACR,MAAM;YACN,OAAO,EAAE,uBAAA,IAAI,yEAAsB,MAA1B,IAAI,EAAuB,WAAW,CAAC;SACjD,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,aAAa,CAAC,MAAwB;QAC1C,6EAA6E;QAC7E,IAAI,MAAM,EAAE,UAAU,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;YAC7C,MAAM,QAAQ,GACZ,IAAI,CAAC,sBAAsB,IAAI,uBAAA,IAAI,kFAA+B,MAAnC,IAAI,CAAiC,CAAC;YACvE,OAAO,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QACxC,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC1C,OAAO,uBAAA,IAAI,0CAAmB,CAAC,aAAa,CAAC;YAC3C,QAAQ;YACR,MAAM;YACN,OAAO,EAAE,uBAAA,IAAI,yEAAsB,MAA1B,IAAI,EAAuB,eAAe,CAAC;SACrD,CAAC,CAAC;IACL,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,UAAU,CAAC,MAAyB;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC1C,OAAO,uBAAA,IAAI,0CAAmB,CAAC,UAAU,CAAC;YACxC,QAAQ;YACR,MAAM;YACN,OAAO,EAAE,uBAAA,IAAI,yEAAsB,MAA1B,IAAI,EAAuB,YAAY,CAAC;SAClD,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,eAAe,CAAC,MAA8B;QAClD,6EAA6E;QAC7E,8FAA8F;QAC9F,IAAI,MAAM,EAAE,UAAU,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;YAC7C,0EAA0E;YAC1E,0EAA0E;YAC1E,MAAM,QAAQ,GACZ,IAAI,CAAC,sBAAsB,IAAI,uBAAA,IAAI,kFAA+B,MAAnC,IAAI,CAAiC,CAAC;YACvE,OAAO,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAC1C,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC1C,OAAO,uBAAA,IAAI,0CAAmB,CAAC,eAAe,CAAC;YAC7C,QAAQ;YACR,MAAM;YACN,OAAO,EAAE,uBAAA,IAAI,yEAAsB,MAA1B,IAAI,EAAuB,iBAAiB,CAAC;SACvD,CAAC,CAAC;IACL,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,sBAAsB,CAC1B,MAAqC;QAErC,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC1C,OAAO,uBAAA,IAAI,0CAAmB,CAAC,sBAAsB,CAAC;YACpD,QAAQ;YACR,MAAM;YACN,OAAO,EAAE,uBAAA,IAAI,yEAAsB,MAA1B,IAAI,EAAuB,wBAAwB,CAAC;SAC9D,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,UAAU,CAAC,MAAyB;QACxC,6EAA6E;QAC7E,uFAAuF;QACvF,IAAI,MAAM,EAAE,UAAU,EAAE,CAAC;YACvB,0EAA0E;YAC1E,0EAA0E;YAC1E,MAAM,QAAQ,GACZ,IAAI,CAAC,sBAAsB,IAAI,uBAAA,IAAI,kFAA+B,MAAnC,IAAI,CAAiC,CAAC;YACvE,OAAO,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QACrC,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC1C,OAAO,uBAAA,IAAI,0CAAmB,CAAC,UAAU,CAAC;YACxC,QAAQ;YACR,MAAM;YACN,OAAO,EAAE,uBAAA,IAAI,yEAAsB,MAA1B,IAAI,EAAuB,YAAY,CAAC;SAClD,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,uBAAuB,CAAC,MAE7B;QACC,IAAI,MAAM,EAAE,UAAU,EAAE,CAAC;YACvB,0EAA0E;YAC1E,0EAA0E;YAC1E,MAAM,QAAQ,GACZ,IAAI,CAAC,sBAAsB,IAAI,uBAAA,IAAI,kFAA+B,MAAnC,IAAI,CAAiC,CAAC;YACvE,OAAO,QAAQ,CAAC,uBAAuB,EAAE,CAAC;QAC5C,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC1C,OAAO,QAAQ,CAAC,uBAAuB,EAAE,CAAC;IAC5C,CAAC;IA8BD;;;;OAIG;IACH,sBAAsB;QACpB,IAAI,uBAAA,IAAI,qCAAc,EAAE,CAAC;YACvB,uBAAA,IAAI,6DAAU,MAAd,IAAI,EAAW,oDAAoD,CAAC,CAAC;YACrE,OAAO;QACT,CAAC;QAED,uBAAA,IAAI,6DAAU,MAAd,IAAI,EAAW,+CAA+C,CAAC,CAAC;QAEhE,4CAA4C;QAC5C,uBAAA,IAAI,sCAAsB,IAAI,CAAC,KAAK,CAAC,SAAS,MAAA,CAAC;QAC/C,uBAAA,IAAI,8CAA8B,IAAI,CAAC,KAAK,CAAC,iBAAiB,MAAA,CAAC;QAE/D,oBAAoB;QACpB,uBAAA,IAAI,6EAA0B,MAA9B,IAAI,CAA4B,CAAC,KAAK,CAAC,GAAG,EAAE;YAC1C,qBAAqB;QACvB,CAAC,CAAC,CAAC;QAEH,mBAAmB;QACnB,uBAAA,IAAI,iCAAiB,WAAW,CAAC,GAAG,EAAE;YACpC,uBAAA,IAAI,6EAA0B,MAA9B,IAAI,CAA4B,CAAC,KAAK,CAAC,GAAG,EAAE;gBAC1C,qBAAqB;YACvB,CAAC,CAAC,CAAC;QACL,CAAC,EAAE,uBAAA,EAAe,6CAAkB,CAAC,MAAA,CAAC;QAEtC,0EAA0E;QAC1E,MAAM,OAAO,GAA8C,CACzD,MAAM,EACN,OAAO,EACP,EAAE;YACF,2EAA2E;YAC3E,MAAM,iBAAiB,GAAG,OAAO,CAAC,IAAI,CACpC,CAAC,KAAK,EAAE,EAAE,CACR,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ;gBACjC,uBAAA,EAAe,gDAAqB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAC1D,CAAC;YACF,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACvB,OAAO;YACT,CAAC;YAED,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;YAC9C,MAAM,kBAAkB,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC;YAExD,MAAM,cAAc,GAAG,gBAAgB,KAAK,uBAAA,IAAI,0CAAmB,CAAC;YACpE,MAAM,WAAW,GACf,kBAAkB,KAAK,uBAAA,IAAI,kDAA2B,CAAC;YAEzD,IAAI,cAAc,IAAI,WAAW,EAAE,CAAC;gBAClC,uBAAA,IAAI,6DAAU,MAAd,IAAI,EACF,wDAAwD,EACxD;oBACE,cAAc;oBACd,WAAW;oBACX,SAAS,EAAE,gBAAgB;oBAC3B,iBAAiB,EAAE,kBAAkB;iBACtC,CACF,CAAC;gBAEF,uBAAA,IAAI,sCAAsB,gBAAgB,MAAA,CAAC;gBAC3C,uBAAA,IAAI,8CAA8B,kBAAkB,MAAA,CAAC;gBAErD,yCAAyC;gBACzC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;oBACpB,KAAK,CAAC,gBAAgB,GAAG,IAAI,CAAC;oBAC9B,KAAK,CAAC,yBAAyB,GAAG,CAAC,CAAC;oBACpC,KAAK,CAAC,eAAe,GAAG,IAAI,CAAC;oBAC7B,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;oBAC1B,KAAK,CAAC,kBAAkB,GAAG,IAAI,CAAC;oBAChC,KAAK,CAAC,uBAAuB,GAAG,CAAC,CAAC;oBAClC,KAAK,CAAC,qBAAqB,GAAG,IAAI,CAAC;gBACrC,CAAC,CAAC,CAAC;gBAEH,uBAAA,IAAI,6EAA0B,MAA9B,IAAI,CAA4B,CAAC,KAAK,CAAC,GAAG,EAAE;oBAC1C,qBAAqB;gBACvB,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC;QAEF,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,6BAA6B,EAAE,OAAO,CAAC,CAAC;QACjE,uBAAA,IAAI,4CAA4B,GAAS,EAAE;YACzC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,6BAA6B,EAAE,OAAO,CAAC,CAAC;QACrE,CAAC,MAAA,CAAC;QAEF,sDAAsD;QACtD,MAAM,oBAAoB,GAAG,GAAS,EAAE;YACtC,MAAM,UAAU,GAAG,qBAAqB,CACtC,IAAI,CAAC,SAAS,CAAC,IAAI,CACjB,2DAA2D,CAC5D,CACF,CAAC;YACF,MAAM,cAAc,GAAG,UAAU,EAAE,OAAO,IAAI,IAAI,CAAC;YAEnD,oFAAoF;YACpF,IACE,IAAI,CAAC,KAAK,CAAC,qBAAqB,KAAK,IAAI;gBACzC,cAAc,KAAK,IAAI,CAAC,KAAK,CAAC,qBAAqB,EACnD,CAAC;gBACD,uBAAA,IAAI,6DAAU,MAAd,IAAI,EACF,4DAA4D,CAC7D,CAAC;gBACF,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;oBACpB,KAAK,CAAC,eAAe,GAAG,IAAI,CAAC;oBAC7B,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;oBAC1B,KAAK,CAAC,kBAAkB,GAAG,IAAI,CAAC;oBAChC,KAAK,CAAC,uBAAuB,GAAG,CAAC,CAAC;oBAClC,KAAK,CAAC,qBAAqB,GAAG,IAAI,CAAC;gBACrC,CAAC,CAAC,CAAC;gBACH,oDAAoD;gBACpD,IAAI,cAAc,EAAE,CAAC;oBACnB,uBAAA,IAAI,2EAAwB,MAA5B,IAAI,CAA0B,CAAC,KAAK,CAAC,GAAG,EAAE;wBACxC,qBAAqB;oBACvB,CAAC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC,CAAC;QACF,IAAI,CAAC,SAAS,CAAC,SAAS,CACtB,kDAAkD,EAClD,oBAAoB,CACrB,CAAC;QACF,uBAAA,IAAI,6CAA6B,GAAS,EAAE;YAC1C,IAAI,CAAC,SAAS,CAAC,WAAW,CACxB,kDAAkD,EAClD,oBAAoB,CACrB,CAAC;QACJ,CAAC,MAAA,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,qBAAqB;QACnB,uBAAA,IAAI,6DAAU,MAAd,IAAI,EAAW,+CAA+C,CAAC,CAAC;QAChE,IAAI,uBAAA,IAAI,qCAAc,EAAE,CAAC;YACvB,aAAa,CAAC,uBAAA,IAAI,qCAAc,CAAC,CAAC;YAClC,uBAAA,IAAI,iCAAiB,IAAI,MAAA,CAAC;QAC5B,CAAC;QACD,IAAI,uBAAA,IAAI,gDAAyB,EAAE,CAAC;YAClC,uBAAA,IAAI,gDAAyB,MAA7B,IAAI,CAA2B,CAAC;YAChC,uBAAA,IAAI,4CAA4B,IAAI,MAAA,CAAC;QACvC,CAAC;QACD,IAAI,uBAAA,IAAI,iDAA0B,EAAE,CAAC;YACnC,uBAAA,IAAI,iDAA0B,MAA9B,IAAI,CAA4B,CAAC;YACjC,uBAAA,IAAI,6CAA6B,IAAI,MAAA,CAAC;QACxC,CAAC;QACD,uBAAA,IAAI,sCAAsB,IAAI,MAAA,CAAC;QAC/B,uBAAA,IAAI,8CAA8B,IAAI,MAAA,CAAC;QACvC,uBAAA,IAAI,8EAA2B,MAA/B,IAAI,CAA6B,CAAC,KAAK,CAAC,GAAG,EAAE;YAC3C,gDAAgD;QAClD,CAAC,CAAC,CAAC;IACL,CAAC;IA2MD;;;;;OAKG;IACH,KAAK,CAAC,gBAAgB,CAAC,MAA+B;QACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC1C,MAAM,OAAO,GAAG,uBAAA,IAAI,yEAAsB,MAA1B,IAAI,EAAuB,kBAAkB,CAAC,CAAC;QAC/D,OAAO,uBAAA,IAAI,0CAAmB,CAAC,gBAAgB,CAAC;YAC9C,QAAQ;YACR,MAAM;YACN,OAAO;SACR,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,sBAAsB,CAAC,OAK5B;QACC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,GAAG,GAAG,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;QAC3D,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC1C,OAAO,uBAAA,IAAI,0CAAmB,CAAC,sBAAsB,CAAC;YACpD,QAAQ;YACR,MAAM;YACN,QAAQ;YACR,KAAK;YACL,OAAO;YACP,OAAO,EAAE,uBAAA,IAAI,yEAAsB,MAA1B,IAAI,EAAuB,wBAAwB,CAAC;SAC9D,CAAC,CAAC;IACL,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,yBAAyB,CAC7B,MAA8B;QAE9B,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC1C,MAAM,OAAO,GAAG,uBAAA,IAAI,yEAAsB,MAA1B,IAAI,EAAuB,2BAA2B,CAAC,CAAC;QACxE,OAAO,uBAAA,IAAI,0CAAmB,CAAC,yBAAyB,CAAC;YACvD,QAAQ;YACR,MAAM;YACN,OAAO;SACR,CAAC,CAAC;IACL,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,0BAA0B,CAC9B,MAA+B;QAE/B,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC1C,MAAM,OAAO,GAAG,uBAAA,IAAI,yEAAsB,MAA1B,IAAI,EAAuB,4BAA4B,CAAC,CAAC;QACzE,OAAO,uBAAA,IAAI,0CAAmB,CAAC,0BAA0B,CAAC;YACxD,QAAQ;YACR,MAAM;YACN,OAAO;SACR,CAAC,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,cAAc,CAAC,KAAa;QAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC1C,MAAM,OAAO,GAAG,uBAAA,IAAI,yEAAsB,MAA1B,IAAI,EAAuB,gBAAgB,CAAC,CAAC;QAC7D,OAAO,uBAAA,IAAI,0CAAmB,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IAC9E,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,aAAa,CACjB,MAAmB;QAEnB,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC1C,MAAM,OAAO,GAAG,uBAAA,IAAI,yEAAsB,MAA1B,IAAI,EAAuB,eAAe,CAAC,CAAC;QAC5D,OAAO,uBAAA,IAAI,0CAAmB,CAAC,aAAa,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IAC9E,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,qBAAqB,CACzB,MAA2B;QAE3B,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC1C,MAAM,OAAO,GAAG,uBAAA,IAAI,yEAAsB,MAA1B,IAAI,EAAuB,uBAAuB,CAAC,CAAC;QACpE,OAAO,uBAAA,IAAI,0CAAmB,CAAC,qBAAqB,CAAC;YACnD,QAAQ;YACR,MAAM;YACN,OAAO;SACR,CAAC,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,kBAAkB,CACtB,MAAsB;QAEtB,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC1C,OAAO,uBAAA,IAAI,uCAAgB,CAAC,kBAAkB,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IACvE,CAAC;IAED;;;;OAIG;IACH,mBAAmB;QACjB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC1C,OAAO,uBAAA,IAAI,0CAAmB,CAAC,mBAAmB,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;QACnE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,uBAAA,IAAI,6DAAU,MAAd,IAAI,EACF,WAAW,CAAC,KAAK,EAAE,qCAAqC,CAAC,EACzD,uBAAA,IAAI,oEAAiB,MAArB,IAAI,EAAkB,qBAAqB,CAAC,CAC7C,CAAC;YACF,kDAAkD;YAClD,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,aAAa;QACjB,uCAAuC;QACvC,IAAI,IAAI,CAAC,yBAAyB,EAAE,EAAE,CAAC;YACrC,uBAAA,IAAI,6DAAU,MAAd,IAAI,EACF,0DAA0D,EAC1D;gBACE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CACF,CAAC;YACF,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS;gBAC/B,KAAK,EAAE,iBAAiB,CAAC,qBAAqB;aAC/C,CAAC;QACJ,CAAC;QAED,uBAAA,IAAI,qCAAqB,IAAI,MAAA,CAAC;QAE9B,mDAAmD;QACnD,MAAM,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;QAE/C,IAAI,CAAC;YACH,MAAM,uBAAA,IAAI,8EAA2B,MAA/B,IAAI,CAA6B,CAAC;YAExC,MAAM,eAAe,GAAG,iBAAiB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;YAElE,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;gBACpB,KAAK,CAAC,SAAS,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC;YACrC,CAAC,CAAC,CAAC;YAEH,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;YAEhE,uBAAA,IAAI,6DAAU,MAAd,IAAI,EAAW,2CAA2C,EAAE;gBAC1D,IAAI,EAAE,eAAe;gBACrB,EAAE,EAAE,UAAU;gBACd,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC,CAAC;YAEH,gFAAgF;YAChF,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;YAC3B,uBAAA,IAAI,0CAA0B,IAAI,MAAA,CAAC;YACnC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;YAElB,uEAAuE;YACvE,mEAAmE;YACnE,IAAI,IAAI,CAAC,KAAK,CAAC,mBAAmB,KAAK,mBAAmB,CAAC,MAAM,EAAE,CAAC;gBAClE,MAAM,IAAI,KAAK,CACb,IAAI,CAAC,KAAK,CAAC,mBAAmB;oBAC5B,sCAAsC,CACzC,CAAC;YACJ,CAAC;YAED,uBAAA,IAAI,6DAAU,MAAd,IAAI,EAAW,2CAA2C,EAAE;gBAC1D,UAAU;gBACV,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS;gBAC/B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC,CAAC;YAEH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QAC5D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,uCAAuC;YACvC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;gBACpB,KAAK,CAAC,SAAS,GAAG,iBAAiB,CAAC;YACtC,CAAC,CAAC,CAAC;YAEH,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS;gBAC/B,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,+BAA+B,CAAC,CAAC,OAAO;aACnE,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,uBAAA,IAAI,qCAAqB,KAAK,MAAA,CAAC;QACjC,CAAC;IACH,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,cAAc,CAClB,UAAmC;QAEnC,+DAA+D;QAC/D,IAAI,IAAI,CAAC,KAAK,CAAC,cAAc,KAAK,UAAU,EAAE,CAAC;YAC7C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;QACvC,CAAC;QAED,iCAAiC;QACjC,2EAA2E;QAC3E,MAAM,eAAe,GACnB,UAAU,KAAK,YAAY,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAEhE,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc;gBACrC,KAAK,EAAE,YAAY,UAAU,gBAAgB;aAC9C,CAAC;QACJ,CAAC;QAED,8BAA8B;QAC9B,IAAI,IAAI,CAAC,yBAAyB,EAAE,EAAE,CAAC;YACrC,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc;gBACrC,KAAK,EAAE,iBAAiB,CAAC,qBAAqB;aAC/C,CAAC;QACJ,CAAC;QAED,uBAAA,IAAI,qCAAqB,IAAI,MAAA,CAAC;QAE9B,kDAAkD;QAClD,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC;QAEnD,IAAI,CAAC;YACH,MAAM,uBAAA,IAAI,8EAA2B,MAA/B,IAAI,CAA6B,CAAC;YAExC,uBAAA,IAAI,6DAAU,MAAd,IAAI,EAAW,4CAA4C,EAAE;gBAC3D,IAAI,EAAE,gBAAgB;gBACtB,EAAE,EAAE,UAAU;gBACd,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC,CAAC;YAEH,mEAAmE;YACnE,oEAAoE;YACpE,8DAA8D;YAE9D,iCAAiC;YACjC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;gBACpB,KAAK,CAAC,cAAc,GAAG,UAAU,CAAC;gBAClC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;gBAC1B,KAAK,CAAC,mBAAmB,GAAG,mBAAmB,CAAC,aAAa,CAAC;YAChE,CAAC,CAAC,CAAC;YAEH,8CAA8C;YAC9C,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;YAC3B,uBAAA,IAAI,0CAA0B,IAAI,MAAA,CAAC;YACnC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;YAElB,uEAAuE;YACvE,mEAAmE;YACnE,IAAI,IAAI,CAAC,KAAK,CAAC,mBAAmB,KAAK,mBAAmB,CAAC,MAAM,EAAE,CAAC;gBAClE,MAAM,IAAI,KAAK,CACb,IAAI,CAAC,KAAK,CAAC,mBAAmB,IAAI,gCAAgC,CACnE,CAAC;YACJ,CAAC;YAED,uBAAA,IAAI,6DAAU,MAAd,IAAI,EAAW,4CAA4C,EAAE;gBAC3D,UAAU;gBACV,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC,CAAC;YAEH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;QACvC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,sCAAsC;YACtC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;gBACpB,KAAK,CAAC,cAAc,GAAG,gBAAgB,CAAC;YAC1C,CAAC,CAAC,CAAC;YAEH,uBAAA,IAAI,6DAAU,MAAd,IAAI,EACF,WAAW,CAAC,KAAK,EAAE,gCAAgC,CAAC,EACpD,uBAAA,IAAI,oEAAiB,MAArB,IAAI,EAAkB,gBAAgB,EAAE,EAAE,UAAU,EAAE,CAAC,CACxD,CAAC;YAEF,4DAA4D;YAC5D,2DAA2D;YAC3D,IAAI,CAAC;gBACH,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;gBAC3B,uBAAA,IAAI,0CAA0B,IAAI,MAAA,CAAC;gBACnC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;gBAElB,uBAAA,IAAI,6DAAU,MAAd,IAAI,EACF,0DAA0D,EAC1D;oBACE,gBAAgB;oBAChB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACpC,CACF,CAAC;YACJ,CAAC;YAAC,OAAO,WAAW,EAAE,CAAC;gBACrB,sCAAsC;gBACtC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;oBACpB,KAAK,CAAC,mBAAmB,GAAG,mBAAmB,CAAC,MAAM,CAAC;gBACzD,CAAC,CAAC,CAAC;gBACH,uBAAA,IAAI,6DAAU,MAAd,IAAI,EACF,WAAW,CAAC,WAAW,EAAE,yCAAyC,CAAC,EACnE,uBAAA,IAAI,oEAAiB,MAArB,IAAI,EAAkB,yBAAyB,EAAE;oBAC/C,gBAAgB;iBACjB,CAAC,CACH,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,UAAU,EAAE,gBAAgB;gBAC5B,KAAK,EACH,KAAK,YAAY,KAAK;oBACpB,CAAC,CAAC,KAAK,CAAC,OAAO;oBACf,CAAC,CAAC,iBAAiB,CAAC,aAAa;aACtC,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,uBAAA,IAAI,qCAAqB,KAAK,MAAA,CAAC;QACjC,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,iBAAiB;QACf,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IACtD,CAAC;IAED;;;;;OAKG;IACH,2BAA2B;QACzB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC1C,IAAI,QAAQ,CAAC,2BAA2B,EAAE,CAAC;gBACzC,OAAO,QAAQ,CAAC,2BAA2B,EAAE,CAAC;YAChD,CAAC;YACD,wDAAwD;YACxD,OAAO,wBAAwB,CAAC,YAAY,CAAC;QAC/C,CAAC;QAAC,MAAM,CAAC;YACP,gDAAgD;YAChD,OAAO,wBAAwB,CAAC,YAAY,CAAC;QAC/C,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACH,0BAA0B,CACxB,QAGS;QAET,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC1C,IAAI,QAAQ,CAAC,0BAA0B,EAAE,CAAC;gBACxC,OAAO,QAAQ,CAAC,0BAA0B,CAAC,QAAQ,CAAC,CAAC;YACvD,CAAC;YACD,6EAA6E;YAC7E,QAAQ,CAAC,IAAI,CAAC,2BAA2B,EAAE,EAAE,CAAC,CAAC,CAAC;YAChD,OAAO,GAAG,EAAE;gBACV,QAAQ;YACV,CAAC,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,oEAAoE;YACpE,QAAQ,CAAC,wBAAwB,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;YACnD,OAAO,GAAG,EAAE;gBACV,QAAQ;YACV,CAAC,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,SAAS;QACb,uBAAA,IAAI,6DAAU,MAAd,IAAI,EAAW,sCAAsC,CAAC,CAAC;QACvD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC1C,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;gBACvB,uBAAA,IAAI,6DAAU,MAAd,IAAI,EAAW,sDAAsD,CAAC,CAAC;gBACvE,MAAM,QAAQ,CAAC,SAAS,EAAE,CAAC;gBAC3B,uBAAA,IAAI,6DAAU,MAAd,IAAI,EAAW,kDAAkD,CAAC,CAAC;YACrE,CAAC;iBAAM,CAAC;gBACN,uBAAA,IAAI,6DAAU,MAAd,IAAI,EACF,yDAAyD,CAC1D,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,uBAAA,IAAI,6DAAU,MAAd,IAAI,EACF,WAAW,CAAC,KAAK,EAAE,2BAA2B,CAAC,EAC/C,uBAAA,IAAI,oEAAiB,MAArB,IAAI,EAAkB,WAAW,EAAE;gBACjC,SAAS,EAAE,qBAAqB;aACjC,CAAC,CACH,CAAC;QACJ,CAAC;IACH,CAAC;IAED,iEAAiE;IAEjE;;;;;OAKG;IACH,iBAAiB,CAAC,MAA6B;QAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAChD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,GAAG,EAAE;gBACV,kCAAkC;YACpC,CAAC,CAAC;QACJ,CAAC;QACD,IAAI,CAAC;YACH,OAAO,QAAQ,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC5C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,uBAAA,IAAI,6DAAU,MAAd,IAAI,EACF,WAAW,CAAC,KAAK,EAAE,mCAAmC,CAAC,EACvD,uBAAA,IAAI,oEAAiB,MAArB,IAAI,EAAkB,mBAAmB,EAAE;gBACzC,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC;aACnC,CAAC,CACH,CAAC;YACF,OAAO,GAAG,EAAE;gBACV,QAAQ;YACV,CAAC,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,oBAAoB,CAAC,MAAgC;QACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAChD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,GAAG,EAAE;gBACV,kCAAkC;YACpC,CAAC,CAAC;QACJ,CAAC;QACD,IAAI,CAAC;YACH,OAAO,QAAQ,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;QAC/C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,uBAAA,IAAI,6DAAU,MAAd,IAAI,EACF,WAAW,CAAC,KAAK,EAAE,sCAAsC,CAAC,EAC1D,uBAAA,IAAI,oEAAiB,MAArB,IAAI,EAAkB,sBAAsB,EAAE;gBAC5C,SAAS,EAAE,MAAM,CAAC,SAAS;aAC5B,CAAC,CACH,CAAC;YACF,OAAO,GAAG,EAAE;gBACV,QAAQ;YACV,CAAC,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,qBAAqB,CAAC,MAAiC;QACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAChD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,GAAG,EAAE;gBACV,kCAAkC;YACpC,CAAC,CAAC;QACJ,CAAC;QACD,IAAI,CAAC;YACH,OAAO,QAAQ,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;QAChD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,uBAAA,IAAI,6DAAU,MAAd,IAAI,EACF,WAAW,CAAC,KAAK,EAAE,uCAAuC,CAAC,EAC3D,uBAAA,IAAI,oEAAiB,MAArB,IAAI,EAAkB,uBAAuB,EAAE;gBAC7C,SAAS,EAAE,MAAM,CAAC,SAAS;aAC5B,CAAC,CACH,CAAC;YACF,OAAO,GAAG,EAAE;gBACV,QAAQ;YACV,CAAC,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,iBAAiB,CAAC,MAA6B;QAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAChD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,GAAG,EAAE;gBACV,kCAAkC;YACpC,CAAC,CAAC;QACJ,CAAC;QACD,IAAI,CAAC;YACH,OAAO,QAAQ,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC5C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,uBAAA,IAAI,6DAAU,MAAd,IAAI,EACF,WAAW,CAAC,KAAK,EAAE,mCAAmC,CAAC,EACvD,uBAAA,IAAI,oEAAiB,MAArB,IAAI,EAAkB,mBAAmB,EAAE;gBACzC,SAAS,EAAE,MAAM,CAAC,SAAS;aAC5B,CAAC,CACH,CAAC;YACF,OAAO,GAAG,EAAE;gBACV,QAAQ;YACV,CAAC,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;;;;OAOG;IACH,kBAAkB,CAAC,MAA8B;QAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAChD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,GAAG,EAAE;gBACV,kCAAkC;YACpC,CAAC,CAAC;QACJ,CAAC;QACD,IAAI,CAAC;YACH,MAAM,gBAAgB,GAAG,MAAM,CAAC,QAAQ,CAAC;YACzC,OAAO,QAAQ,CAAC,kBAAkB,CAAC;gBACjC,GAAG,MAAM;gBACT,QAAQ,EAAE,CAAC,OAA4B,EAAE,EAAE;oBACzC,IAAI,OAAO,EAAE,CAAC;wBACZ,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;4BACpB,KAAK,CAAC,YAAY,GAAG,OAAO,CAAC;4BAC7B,KAAK,CAAC,mBAAmB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;4BACvC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC;wBACzB,CAAC,CAAC,CAAC;oBACL,CAAC;oBACD,gBAAgB,CAAC,OAAO,CAAC,CAAC;gBAC5B,CAAC;aACF,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,uBAAA,IAAI,6DAAU,MAAd,IAAI,EACF,WAAW,CAAC,KAAK,EAAE,oCAAoC,CAAC,EACxD,uBAAA,IAAI,oEAAiB,MAArB,IAAI,EAAkB,oBAAoB,EAAE;gBAC1C,SAAS,EAAE,MAAM,CAAC,SAAS;aAC5B,CAAC,CACH,CAAC;YACF,OAAO,GAAG,EAAE;gBACV,QAAQ;YACV,CAAC,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACH,oBAAoB,CAAC,MAAgC;QACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAChD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,GAAG,EAAE;gBACV,kCAAkC;YACpC,CAAC,CAAC;QACJ,CAAC;QACD,IAAI,CAAC;YACH,OAAO,QAAQ,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;QAC/C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,uBAAA,IAAI,6DAAU,MAAd,IAAI,EACF,WAAW,CAAC,KAAK,EAAE,sCAAsC,CAAC,EAC1D,uBAAA,IAAI,oEAAiB,MAArB,IAAI,EAAkB,sBAAsB,EAAE;gBAC5C,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,MAAM,EAAE,MAAM,CAAC,MAAM;aACtB,CAAC,CACH,CAAC;YACF,OAAO,GAAG,EAAE;gBACV,QAAQ;YACV,CAAC,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,kBAAkB,CAAC,MAA8B;QAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAChD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,GAAG,EAAE;gBACV,kCAAkC;YACpC,CAAC,CAAC;QACJ,CAAC;QACD,IAAI,CAAC;YACH,OAAO,QAAQ,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAC7C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,uBAAA,IAAI,6DAAU,MAAd,IAAI,EACF,WAAW,CAAC,KAAK,EAAE,oCAAoC,CAAC,EACxD,uBAAA,IAAI,oEAAiB,MAArB,IAAI,EAAkB,oBAAoB,EAAE;gBAC1C,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ;aAC1B,CAAC,CACH,CAAC;YACF,OAAO,GAAG,EAAE;gBACV,QAAQ;YACV,CAAC,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACH,iBAAiB,CAAC,MAA6B;QAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAChD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,GAAG,EAAE;gBACV,kCAAkC;YACpC,CAAC,CAAC;QACJ,CAAC;QACD,IAAI,CAAC;YACH,OAAO,QAAQ,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC5C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,uBAAA,IAAI,6DAAU,MAAd,IAAI,EACF,WAAW,CAAC,KAAK,EAAE,mCAAmC,CAAC,EACvD,uBAAA,IAAI,oEAAiB,MAArB,IAAI,EAAkB,mBAAmB,EAAE;gBACzC,SAAS,EAAE,MAAM,CAAC,SAAS;aAC5B,CAAC,CACH,CAAC;YACF,OAAO,GAAG,EAAE;gBACV,QAAQ;YACV,CAAC,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,iBAAiB,CAAC,MAA+B;QAC/C,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC1C,QAAQ,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,uBAAA,IAAI,6DAAU,MAAd,IAAI,EACF,WAAW,CAAC,KAAK,EAAE,mCAAmC,CAAC,EACvD,uBAAA,IAAI,oEAAiB,MAArB,IAAI,EAAkB,mBAAmB,CAAC,CAC3C,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,aAAa,CACjB,MAA4B;QAE5B,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC1C,MAAM,OAAO,GAAG,uBAAA,IAAI,yEAAsB,MAA1B,IAAI,EAAuB,eAAe,CAAC,CAAC;QAC5D,OAAO,uBAAA,IAAI,0CAAmB,CAAC,aAAa,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IAC9E,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,UAAU;QACd,uBAAA,IAAI,6DAAU,MAAd,IAAI,EACF,kEAAkE,EAClE;YACE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CACF,CAAC;QAEF,2DAA2D;QAC3D,4DAA4D;QAC5D,IAAI,uBAAA,IAAI,qCAAc,EAAE,CAAC;YACvB,aAAa,CAAC,uBAAA,IAAI,qCAAc,CAAC,CAAC;YAClC,uBAAA,IAAI,iCAAiB,IAAI,MAAA,CAAC;QAC5B,CAAC;QACD,IAAI,uBAAA,IAAI,gDAAyB,EAAE,CAAC;YAClC,uBAAA,IAAI,gDAAyB,MAA7B,IAAI,CAA2B,CAAC;YAChC,uBAAA,IAAI,4CAA4B,IAAI,MAAA,CAAC;QACvC,CAAC;QACD,IAAI,uBAAA,IAAI,iDAA0B,EAAE,CAAC;YACnC,uBAAA,IAAI,iDAA0B,MAA9B,IAAI,CAA4B,CAAC;YACjC,uBAAA,IAAI,6CAA6B,IAAI,MAAA,CAAC;QACxC,CAAC;QACD,uBAAA,IAAI,sCAAsB,IAAI,MAAA,CAAC;QAC/B,uBAAA,IAAI,8CAA8B,IAAI,MAAA,CAAC;QAEvC,oDAAoD;QACpD,IAAI,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,yBAAyB,EAAE,EAAE,CAAC;YAC5D,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBAC1C,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC;YAC9B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,uBAAA,IAAI,6DAAU,MAAd,IAAI,EACF,WAAW,CAAC,KAAK,EAAE,4BAA4B,CAAC,EAChD,uBAAA,IAAI,oEAAiB,MAArB,IAAI,EAAkB,YAAY,CAAC,CACpC,CAAC;YACJ,CAAC;QACH,CAAC;QAED,6EAA6E;QAC7E,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;QAEnC,yEAAyE;QACzE,MAAM,uBAAA,IAAI,8EAA2B,MAA/B,IAAI,CAA6B,CAAC;QAExC,0DAA0D;QAC1D,qEAAqE;QACrE,iEAAiE;QACjE,sEAAsE;QAEtE,2DAA2D;QAC3D,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAC3B,uBAAA,IAAI,0CAA0B,IAAI,MAAA,CAAC;IACrC,CAAC;IAED;;OAEG;IAEH;;;;;;;;;OASG;IACH,0BAA0B;QACxB,uBAAA,IAAI,6CAA6B,KAAK,MAAA,CAAC;QAEvC,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CACtC,sCAAsC,CACvC,CAAC;YACF,IAAI,CAAC,qCAAqC,CAAC,YAAY,CAAC,CAAC;QAC3D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,uBAAA,IAAI,6DAAU,MAAd,IAAI,EACF,WAAW,CAAC,KAAK,EAAE,4CAA4C,CAAC,EAChE,uBAAA,IAAI,oEAAiB,MAArB,IAAI,EAAkB,4BAA4B,EAAE;gBAClD,SAAS,EAAE,wBAAwB;aACpC,CAAC,CACH,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,yBAAyB;QACvB,uBAAA,IAAI,6CAA6B,IAAI,MAAA,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,kBAAkB;QACtB,IAAI,uBAAA,IAAI,iDAA0B,EAAE,CAAC;YACnC,OAAO;QACT,CAAC;QAED,mEAAmE;QACnE,+DAA+D;QAC/D,qEAAqE;QACrE,qDAAqD;QACrD,MAAM,cAAc,GAAG,uBAAA,IAAI,iDAA0B,CAAC;QAEtD,IAAI,CAAC;YACH,8GAA8G;YAC9G,MAAM,UAAU,GAAG,MAAM,uBAAA,IAAI,2CAAoB,CAAC,gBAAgB,CAAC;gBACjE,cAAc,EAAE,IAAI,CAAC,iBAAiB,CAAC,IAAI;aAC5C,CAAC,CAAC;YAEH,sFAAsF;YACtF,yEAAyE;YACzE,oCAAoC;YACpC,IAAI,uBAAA,IAAI,iDAA0B,KAAK,cAAc,EAAE,CAAC;gBACtD,OAAO;YACT,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;gBACpB,KAAK,CAAC,UAAU,GAAG,UAAU,CAAC;YAChC,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,uBAAA,IAAI,6DAAU,MAAd,IAAI,EACF,WAAW,CAAC,KAAK,EAAE,oCAAoC,CAAC,EACxD,uBAAA,IAAI,oEAAiB,MAArB,IAAI,EAAkB,oBAAoB,CAAC,CAC5C,CAAC;YAEF,mDAAmD;YACnD,IAAI,uBAAA,IAAI,iDAA0B,KAAK,cAAc,EAAE,CAAC;gBACtD,+BAA+B;gBAC/B,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;oBACpB,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC;gBAC1B,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,mBAAmB,CAAC,OAAgB;QAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC1C,OAAO,uBAAA,IAAI,0CAAmB,CAAC,mBAAmB,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IAC5E,CAAC;IAED;;;;OAIG;IACH,+BAA+B;QAC7B,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;QACpE,OAAO,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;IACpD,CAAC;IAED;;;OAGG;IACH,qBAAqB;QACnB,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;QAEpE,uBAAA,IAAI,6DAAU,MAAd,IAAI,EAAW,gDAAgD,EAAE;YAC/D,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,OAAO,EAAE,cAAc;SACxB,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;YACpB,KAAK,CAAC,eAAe,CAAC,cAAc,CAAC,GAAG,KAAK,CAAC;QAChD,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;OAGG;IACH,uBAAuB;QACrB,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;QAEpE,uBAAA,IAAI,6DAAU,MAAd,IAAI,EAAW,gDAAgD,EAAE;YAC/D,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,OAAO,EAAE,cAAc;SACxB,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;YACpB,KAAK,CAAC,mBAAmB,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC;QACnD,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;OAIG;IACH,uBAAuB;QACrB,uBAAA,IAAI,6DAAU,MAAd,IAAI,EAAW,kDAAkD,EAAE;YACjE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,eAAe;SAC1C,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;YACpB,KAAK,CAAC,eAAe,GAAG;gBACtB,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,IAAI;aACd,CAAC;YACF,KAAK,CAAC,mBAAmB,GAAG;gBAC1B,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,KAAK;aACf,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;OAIG;IACH,+BAA+B;QAC7B,uBAAA,IAAI,6DAAU,MAAd,IAAI,EAAW,wDAAwD,EAAE;YACvE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;YACpB,6EAA6E;YAC7E,KAAK,CAAC,kBAAkB,GAAG,KAAK,CAAC,kBAAkB,CAAC,MAAM,CACxD,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,UAAU,CAC/D,CAAC;YAEF,iEAAiE;YACjE,KAAK,CAAC,eAAe,GAAG,KAAK,CAAC,eAAe,CAAC,MAAM,CAClD,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,UAAU,CAC/D,CAAC;YAEF,4BAA4B;YAC5B,KAAK,CAAC,kBAAkB,GAAG;gBACzB,QAAQ,EAAE,CAAC;gBACX,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE;gBACvB,kBAAkB,EAAE,IAAI;aACzB,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACH,qBAAqB,CAAC,MAAc;QAClC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;QAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;QAEjE,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC;YACtB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,uBAAA,IAAI,6DAAU,MAAd,IAAI,EAAW,yCAAyC,EAAE;YACxD,MAAM;YACN,OAAO;YACP,QAAQ,EAAE,MAAM,CAAC,QAAQ;SAC1B,CAAC,CAAC;QAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;IACvC,CAAC;IAED;;;;;OAKG;IACH,sBAAsB,CAAC,MAAc,EAAE,QAAgB;QACrD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;QAE7D,uBAAA,IAAI,6DAAU,MAAd,IAAI,EAAW,6CAA6C,EAAE;YAC5D,MAAM;YACN,OAAO;YACP,QAAQ;YACR,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;YACpB,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,OAAO,CAAC,EAAE,CAAC;gBACxC,KAAK,CAAC,mBAAmB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;YAC1C,CAAC;YAED,MAAM,cAAc,GAAG,KAAK,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACxE,KAAK,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,GAAG;gBAC3C,GAAG,cAAc;gBACjB,QAAQ;aACT,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;;;;OAaG;IACH,6BAA6B,CAC3B,MAAc,EACd,MASC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;QAE7D,uBAAA,IAAI,6DAAU,MAAd,IAAI,EAAW,qDAAqD,EAAE;YACpE,MAAM;YACN,OAAO;YACP,MAAM;YACN,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;YACpB,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,OAAO,CAAC,EAAE,CAAC;gBACxC,KAAK,CAAC,mBAAmB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;YAC1C,CAAC;YAED,MAAM,cAAc,GAAG,KAAK,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACxE,KAAK,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,GAAG;gBAC3C,GAAG,cAAc;gBACjB,aAAa,EAAE;oBACb,GAAG,MAAM;oBACT,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;iBACtB;aACF,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;;OAMG;IACH,4BAA4B,CAAC,MAAc;QAWzC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;QAC7D,MAAM,MAAM,GACV,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC;QAEnE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,iEAAiE;QACjE,MAAM,eAAe,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;QACtC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,GAAG,GAAG,MAAM,CAAC,SAAS,CAAC;QAEnC,IAAI,GAAG,GAAG,eAAe,EAAE,CAAC;YAC1B,uBAAA,IAAI,6DAAU,MAAd,IAAI,EAAW,+CAA+C,EAAE;gBAC9D,MAAM;gBACN,OAAO;gBACP,GAAG;gBACH,SAAS,EAAE,MAAM,CAAC,SAAS;aAC5B,CAAC,CAAC;YACH,uBAAuB;YACvB,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;gBACpB,IAAI,KAAK,CAAC,mBAAmB,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,aAAa,EAAE,CAAC;oBAChE,OAAO,KAAK,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC;gBAClE,CAAC;YACH,CAAC,CAAC,CAAC;YACH,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,uBAAA,IAAI,6DAAU,MAAd,IAAI,EAAW,iDAAiD,EAAE;YAChE,MAAM;YACN,OAAO;YACP,MAAM;YACN,GAAG;SACJ,CAAC,CAAC;QAEH,kCAAkC;QAClC,MAAM,EAAE,SAAS,EAAE,GAAG,sBAAsB,EAAE,GAAG,MAAM,CAAC;QACxD,OAAO,sBAAsB,CAAC;IAChC,CAAC;IAED;;;;OAIG;IACH,8BAA8B,CAAC,MAAc;QAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;QAE7D,uBAAA,IAAI,6DAAU,MAAd,IAAI,EAAW,uDAAuD,EAAE;YACtE,MAAM;YACN,OAAO;YACP,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;YACpB,IAAI,KAAK,CAAC,mBAAmB,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,aAAa,EAAE,CAAC;gBAChE,OAAO,KAAK,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC;YAClE,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACH,0BAA0B;QAIxB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,uBAAuB,CAAC;QAEhD,uDAAuD;QACvD,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,wCAAwC;YACxC,sDAAsD;YACtD,mEAAmE;YACnE,IAAI,IAAI,KAAK,kBAAkB,EAAE,CAAC;gBAChC,OAAO;oBACL,QAAQ,EAAE,aAAa;oBACvB,SAAS,EAAE,MAAM;iBAClB,CAAC;YACJ,CAAC;YACD,IAAI,IAAI,KAAK,iBAAiB,EAAE,CAAC;gBAC/B,OAAO;oBACL,QAAQ,EAAE,aAAa;oBACvB,SAAS,EAAE,KAAK;iBACjB,CAAC;YACJ,CAAC;YAED,4EAA4E;YAC5E,OAAO;gBACL,QAAQ,EAAE,IAAoB;gBAC9B,SAAS,EAAE,qBAAqB,CAAC,gBAAgB;aAClD,CAAC;QACJ,CAAC;QAED,sCAAsC;QACtC,OAAO,CACL,IAAI,IAAI;YACN,QAAQ,EAAE,qBAAqB,CAAC,mBAAmB;YACnD,SAAS,EAAE,qBAAqB,CAAC,gBAAgB;SAClD,CACF,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACH,2BAA2B,CACzB,QAAsB,EACtB,SAAwB;QAExB,uBAAA,IAAI,6DAAU,MAAd,IAAI,EAAW,mDAAmD,EAAE;YAClE,QAAQ;YACR,SAAS;YACT,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;YACpB,KAAK,CAAC,uBAAuB,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;QAC1D,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;;OAMG;IACH,uBAAuB,CAAC,KAAuC;QAC7D,IAAI,UAAU,GAAqC,IAAI,CAAC;QACxD,IACE,KAAK,KAAK,IAAI;YACd,KAAK,CAAC,WAAW,KAAK,eAAe,CAAC,4BAA4B,EAClE,CAAC;YACD,UAAU,GAAG,KAAK,CAAC;QACrB,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,oBAGd,CAAC;QACd,MAAM,oBAAoB,GACxB,OAAO,KAAK,IAAI;YAChB,OAAO,KAAK,SAAS;YACrB,OAAO,EAAE,WAAW,KAAK,eAAe,CAAC,4BAA4B;YACnE,CAAC,CAAC,eAAe;YACjB,CAAC,CAAC,CAAC,OAAO,EAAE,MAAM,IAAI,SAAS,CAAC,CAAC;QACrC,MAAM,gBAAgB,GACpB,KAAK,KAAK,IAAI;YACd,KAAK,CAAC,WAAW,KAAK,eAAe,CAAC,4BAA4B;YAChE,CAAC,CAAC,eAAe;YACjB,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,IAAI,SAAS,CAAC,CAAC;QAElC,IAAI,oBAAoB,KAAK,gBAAgB,EAAE,CAAC;YAC9C,uBAAA,IAAI,+DAAY,MAAhB,IAAI,CAAc,CAAC,eAAe,CAAC,mBAAmB,CAAC,aAAa,EAAE;gBACpE,CAAC,oBAAoB,CAAC,gBAAgB,CAAC,EACrC,iBAAiB,CAAC,gBAAgB,CAAC,sBAAsB;gBAC3D,CAAC,oBAAoB,CAAC,sBAAsB,CAAC,EAAE,oBAAoB;gBACnE,CAAC,oBAAoB,CAAC,kBAAkB,CAAC,EAAE,gBAAgB;aAC5D,CAAC,CAAC;QACL,CAAC;QAED,IAAI,QAAQ,GAAgB,IAAI,CAAC;QACjC,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;YACxB,QAAQ,GAAG;gBACT,GAAG,CAAC,UAAU,CAAC,WAAW,KAAK,SAAS,IAAI;oBAC1C,WAAW,EAAE,UAAU,CAAC,WAAW;iBACpC,CAAC;gBACF,OAAO,EAAE,UAAU,CAAC,OAAO;gBAC3B,OAAO,EAAE,UAAU,CAAC,OAAO;gBAC3B,MAAM,EAAE,UAAU,CAAC,MAAM;aACP,CAAC;QACvB,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;YACpB,KAAK,CAAC,oBAAoB,GAAG,QAAQ,CAAC;QACxC,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;OAGG;IACH,yBAAyB;QACvB,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;YACpB,KAAK,CAAC,oBAAoB,GAAG,IAAI,CAAC;QACpC,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACH,oBAAoB,CAAC,MAAc;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;QAC7D,MAAM,QAAQ,GACZ,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,iBAAiB,CAAC;QAEvE,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,uBAAA,IAAI,6DAAU,MAAd,IAAI,EAAW,gDAAgD,EAAE;gBAC/D,MAAM;gBACN,OAAO;gBACP,QAAQ;aACT,CAAC,CAAC;QACL,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;;;;OAKG;IACH,qBAAqB,CAAC,MAAc,EAAE,QAAgB;QACpD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;QAE7D,uBAAA,IAAI,6DAAU,MAAd,IAAI,EAAW,6CAA6C,EAAE;YAC5D,MAAM;YACN,OAAO;YACP,QAAQ;YACR,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;YACpB,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,OAAO,CAAC,EAAE,CAAC;gBACxC,KAAK,CAAC,mBAAmB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;YAC1C,CAAC;YAED,MAAM,cAAc,GAAG,KAAK,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACxE,KAAK,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,GAAG;gBAC3C,GAAG,cAAc;gBACjB,iBAAiB,EAAE,QAAQ;aAC5B,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACH,qBAAqB,CAAC,MAAc;QAClC,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;QACpE,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC;QACrE,MAAM,aAAa,GAAG,gBAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAExD,uBAAA,IAAI,6DAAU,MAAd,IAAI,EAAW,4CAA4C,EAAE;YAC3D,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,OAAO,EAAE,cAAc;YACvB,MAAM;YACN,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK;SACzC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;YACpB,IAAI,aAAa,EAAE,CAAC;gBAClB,wBAAwB;gBACxB,KAAK,CAAC,gBAAgB,CAAC,cAAc,CAAC,GAAG,gBAAgB,CAAC,MAAM,CAC9D,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,KAAK,MAAM,CAC1C,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,mBAAmB;gBACnB,KAAK,CAAC,gBAAgB,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,gBAAgB,EAAE,MAAM,CAAC,CAAC;YACzE,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACH,iBAAiB,CAAC,MAAc;QAC9B,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;QACpE,OAAO,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACtE,CAAC;IAED;;;;OAIG;IACH,mBAAmB;QACjB,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;QACpE,OAAO,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC;IACrD,CAAC;IAED;;;;;;;;;;;;OAYG;IACO,KAAK,CAAC,qBAAqB,CAAC,MAOrC;QACC,OAAO,uBAAA,IAAI,wCAAiB,CAAC,WAAW,CAAC;YACvC,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS;YAC/B,OAAO,EAAE,uBAAA,IAAI,yEAAsB,MAA1B,IAAI,EAAuB,uBAAuB,EAAE,EAAE,CAAC;YAChE,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,QAAQ,EAAE,MAAM,CAAC,QAAQ;SAC1B,CAAC,CAAC;IACL,CAAC;IAED;;;;OAIG;IACI,yBAAyB;QAC9B,OAAO,uBAAA,IAAI,yCAAkB,CAAC;IAChC,CAAC;;;IAx7GC,MAAM,YAAY,GAAG,GAAY,EAAE,CACjC,OAAO,UAAU,CAAC,OAAO,KAAK,WAAW;QACzC,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,6BAA6B,KAAK,MAAM,CAAC;IAEnE,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;QACjC,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CACrC,sCAAsC,CACvC,CAAC;QACF,MAAM,UAAU,GACd,WAAW,CAAC,kBAAkB,EAAE,uBAAuB,CAAC;QAE1D,IAAI,yBAAyB,CAAC,UAAU,CAAC,EAAE,CAAC;YAC1C,MAAM,SAAS,GACb,uBAAA,IAAI,gCAAS,CAAC,cAAc,CAAC,YAAY,CAAC,oBAAoB,CAC5D,UAAU,CACX,CAAC;YACJ,OAAO,SAAS,IAAI,SAAS,CAAC;QAChC,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,MAAM,CAAC;QACP,yDAAyD;QACzD,OAAO,YAAY,EAAE,CAAC;IACxB,CAAC;AACH,CAAC,iEAyJS,KAAY,EAAE,OAA4B;IAClD,uBAAA,IAAI,gCAAS,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AAC5D,CAAC,iEAQC,GAAG,IAA+D;IAElE,uBAAA,IAAI,gCAAS,CAAC,cAAc,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;AACxD,CAAC;IAUC,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;IAC9C,MAAM,kBAAkB,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,IAAI,CAAC,CAAC;IAE7D,IACE,uBAAA,IAAI,2CAAoB;QACxB,uBAAA,IAAI,oDAA6B,KAAK,gBAAgB;QACtD,uBAAA,IAAI,sDAA+B,KAAK,kBAAkB,EAC1D,CAAC;QACD,OAAO,uBAAA,IAAI,2CAAoB,CAAC;IAClC,CAAC;IAED,yDAAyD;IACzD,IAAI,uBAAA,IAAI,2CAAoB,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,uBAAA,IAAI,2CAAoB,CAAC;QACrC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;YAC3C,iBAAiB;QACnB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,uBAAA,IAAI,uCAAuB,IAAI,mBAAmB,CAAC;QACjD,SAAS,EAAE,gBAAgB;QAC3B,WAAW,EAAE,uBAAA,IAAI,oCAAa;QAC9B,gBAAgB,EAAE,uBAAA,IAAI,6CAAsB;QAC5C,gBAAgB,EAAE,uBAAA,IAAI,6CAAsB;QAC5C,oBAAoB,EAAE,uBAAA,IAAI,gCAAS,CAAC,cAAc;QAClD,SAAS,EAAE,IAAI,CAAC,SAAS;KAC1B,CAAC,MAAA,CAAC;IACH,uBAAA,IAAI,gDAAgC,gBAAgB,MAAA,CAAC;IACrD,uBAAA,IAAI,kDAAkC,kBAAkB,MAAA,CAAC;IAEzD,OAAO,uBAAA,IAAI,2CAAoB,CAAC;AAClC,CAAC;AAED;;;GAGG;AACH,KAAK;IACH,IAAI,CAAC,uBAAA,IAAI,2CAAoB,EAAE,CAAC;QAC9B,OAAO;IACT,CAAC;IACD,IAAI,CAAC;QACH,MAAM,uBAAA,IAAI,2CAAoB,CAAC,UAAU,EAAE,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,iBAAiB;IACnB,CAAC;IACD,uBAAA,IAAI,uCAAuB,IAAI,MAAA,CAAC;IAChC,uBAAA,IAAI,gDAAgC,IAAI,MAAA,CAAC;IACzC,uBAAA,IAAI,kDAAkC,IAAI,MAAA,CAAC;AAC7C,CAAC;IAiBC,OAAO,uBAAA,IAAI,gCAAS,CAAC,cAAc,CAAC,OAAO,CAAC;AAC9C,CAAC,uGAa4B,OAAe;IAC1C,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CACxB,gDAAgD,EAChD,OAAwB,CACzB,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,KAAK,6CACH,QAAgC,EAChC,OAAmC;IAKnC,4EAA4E;IAC5E,mGAAmG;IACnG,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CACxB,sCAAsC;IACtC,8DAA8D;IAC9D,QAAe;IACf,8DAA8D;IAC9D,OAAc,CACf,CAAC;AACJ,CAAC;IAQC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;QACpB,8FAA8F;QAC9F,KAAK,CAAC,kBAAkB,GAAG,KAAK,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CACjE,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAC5B,CAAC;QAEF,2FAA2F;QAC3F,KAAK,CAAC,eAAe,GAAG,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAC3D,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAC5B,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAgFD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,KAAK,2CACH,SAAiC,EACjC,QAAkB;IAElB,MAAM,cAAc,GAAa,EAAE,CAAC;IACpC,MAAM,EAAE,aAAa,EAAE,GAAG,uBAAA,IAAI,gCAAS,CAAC,cAAc,CAAC;IAEvD,mEAAmE;IACnE,oEAAoE;IACpE,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,aAAa,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YACpC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,8DAA8D;YAC9D,uBAAA,IAAI,6DAAU,MAAd,IAAI,EACF,WAAW,CAAC,KAAK,EAAE,iCAAiC,CAAC,EACrD,uBAAA,IAAI,oEAAiB,MAArB,IAAI,EAAkB,iBAAiB,EAAE;gBACvC,SAAS,EAAE,OAAO;gBAClB,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC;gBACxB,cAAc,EAAE,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC;aACzC,CAAC,CACH,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,CAAC;QACH,gDAAgD;QAChD,OAAO,MAAM,SAAS,EAAE,CAAC;IAC3B,CAAC;YAAS,CAAC;QACT,qDAAqD;QACrD,KAAK,MAAM,OAAO,IAAI,cAAc,EAAE,CAAC;YACrC,IAAI,CAAC;gBACH,aAAa,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YACvC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,+DAA+D;gBAC/D,uBAAA,IAAI,6DAAU,MAAd,IAAI,EACF,WAAW,CAAC,KAAK,EAAE,iCAAiC,CAAC,EACrD,uBAAA,IAAI,oEAAiB,MAArB,IAAI,EAAkB,iBAAiB,EAAE;oBACvC,SAAS,EAAE,QAAQ;oBACnB,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC;oBACxB,cAAc,EAAE,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC;iBACzC,CAAC,CACH,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAsBD;;GAEG;AACH,KAAK;IACH,MAAM,WAAW,GAAG,CAAC,CAAC;IACtB,MAAM,SAAS,GAAG,IAAI,CAAC;IAEvB,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;QACpB,KAAK,CAAC,mBAAmB,GAAG,mBAAmB,CAAC,YAAY,CAAC;QAC7D,KAAK,CAAC,mBAAmB,GAAG,IAAI,CAAC;QACjC,KAAK,CAAC,sBAAsB,GAAG,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,uBAAA,IAAI,6DAAU,MAAd,IAAI,EAAW,yCAAyC,EAAE;QACxD,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;QAC5D,iBAAiB,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QACpD,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC,CAAC;IAEH,IAAI,SAAS,GAAiB,IAAI,CAAC;IAEnC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;QACxD,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;gBACpB,KAAK,CAAC,sBAAsB,GAAG,OAAO,CAAC;YACzC,CAAC,CAAC,CAAC;YAEH,+DAA+D;YAC/D,MAAM,iBAAiB,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;YAC9D,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACjC,uBAAA,IAAI,6DAAU,MAAd,IAAI,EAAW,mDAAmD,EAAE;oBAClE,KAAK,EAAE,iBAAiB,CAAC,MAAM;oBAC/B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACpC,CAAC,CAAC;gBACH,MAAM,OAAO,CAAC,GAAG,CACf,iBAAiB,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC,CAC3D,CAAC;YACJ,CAAC;YACD,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;YACvB,MAAM,uBAAA,IAAI,8EAA2B,MAA/B,IAAI,CAA6B,CAAC;YAExC,MAAM,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;YAEtC,uBAAA,IAAI,6DAAU,MAAd,IAAI,EACF,6DAA6D,EAC7D;gBACE,WAAW,EAAE,uBAAA,IAAI,oCAAa;gBAC9B,oBAAoB,EAAE,uBAAA,IAAI,6CAAsB;gBAChD,oBAAoB,EAAE,uBAAA,IAAI,6CAAsB;gBAChD,gBAAgB,EAAE,uBAAA,IAAI,yCAAkB;gBACxC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS;gBAC/B,cAAc;aACf,CACF,CAAC;YAEF,0DAA0D;YAC1D,MAAM,mBAAmB,GAAG,IAAI,mBAAmB,CAAC;gBAClD,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS;gBAC/B,WAAW,EAAE,uBAAA,IAAI,oCAAa;gBAC9B,gBAAgB,EAAE,uBAAA,IAAI,6CAAsB;gBAC5C,gBAAgB,EAAE,uBAAA,IAAI,6CAAsB;gBAC5C,oBAAoB,EAAE,uBAAA,IAAI,gCAAS,CAAC,cAAc;gBAClD,SAAS,EAAE,IAAI,CAAC,SAAS;aAC1B,CAAC,CAAC;YACH,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,aAAa,EAAE,mBAAmB,CAAC,CAAC;YAEvD,oDAAoD;YACpD,MAAM,YAAY,GAAG,uBAAA,IAAI,yEAAsB,MAA1B,IAAI,CAAwB,CAAC;YAClD,IAAI,YAAY,EAAE,CAAC;gBACjB,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC;oBAClC,SAAS,EAAE,eAAe,CAAC,gBAAgB,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS;oBACnE,oBAAoB,EAAE,uBAAA,IAAI,gCAAS,CAAC,cAAc;iBACnD,CAAC,CAAC;gBACH,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;gBACvC,uBAAA,IAAI,6DAAU,MAAd,IAAI,EAAW,0CAA0C,EAAE;oBACzD,SAAS,EAAE,eAAe,CAAC,gBAAgB,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS;iBACpE,CAAC,CAAC;YACL,CAAC;YAED,gEAAgE;YAChE,qEAAqE;YACrE,IAAI,cAAc,KAAK,YAAY,EAAE,CAAC;gBACpC,8EAA8E;gBAC9E,IAAI,CAAC,sBAAsB,GAAG,IAAI,uBAAuB,CAAC;oBACxD,SAAS,EAAE,IAAI,CAAC,SAAS;oBACzB,eAAe,EAAE,aAAa;oBAC9B,cAAc,EAAE,uBAAA,IAAI,gCAAS,CAAC,cAAc;iBAC7C,CAAC,CAAC;gBACH,uBAAA,IAAI,6DAAU,MAAd,IAAI,EACF,6DAA6D,EAC7D,EAAE,mBAAmB,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,EAAE,CAC3D,CAAC;YACJ,CAAC;iBAAM,IAAI,cAAc,KAAK,aAAa,EAAE,CAAC;gBAC5C,0DAA0D;gBAC1D,IAAI,CAAC,sBAAsB,GAAG,mBAAmB,CAAC;gBAClD,uBAAA,IAAI,6DAAU,MAAd,IAAI,EACF,2CAA2C,cAAc,GAAG,CAC7D,CAAC;YACJ,CAAC;iBAAM,IAAI,cAAc,KAAK,KAAK,EAAE,CAAC;gBACpC,oBAAoB;gBACpB,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBAC9C,IAAI,WAAW,EAAE,CAAC;oBAChB,IAAI,CAAC,sBAAsB,GAAG,WAAW,CAAC;gBAC5C,CAAC;qBAAM,CAAC;oBACN,0DAA0D;oBAC1D,uBAAA,IAAI,6DAAU,MAAd,IAAI,EACF,kGAAkG,CACnG,CAAC;oBACF,IAAI,CAAC,sBAAsB,GAAG,mBAAmB,CAAC;oBAClD,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;wBACpB,KAAK,CAAC,cAAc,GAAG,aAAa,CAAC;oBACvC,CAAC,CAAC,CAAC;gBACL,CAAC;gBACD,uBAAA,IAAI,6DAAU,MAAd,IAAI,EACF,2CAA2C,IAAI,CAAC,sBAAsB,KAAK,mBAAmB,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,cAAc,GAAG,CACnI,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,wEAAwE;gBACxE,MAAM,IAAI,KAAK,CACb,yBAAyB,MAAM,CAAC,cAAc,CAAC,wEAAwE,CACxH,CAAC;YACJ,CAAC;YAED,6EAA6E;YAC7E,wEAAwE;YACxE,0EAA0E;YAC1E,wDAAwD;YAExD,yEAAyE;YACzE,MAAM,IAAI,CAAC,eAAe,CAAC,0BAA0B,CAAC,CAAC;YAEvD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;YAC1B,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;gBACpB,KAAK,CAAC,mBAAmB,GAAG,mBAAmB,CAAC,WAAW,CAAC;gBAC5D,KAAK,CAAC,mBAAmB,GAAG,IAAI,CAAC;YACnC,CAAC,CAAC,CAAC;YAEH,uBAAA,IAAI,6DAAU,MAAd,IAAI,EAAW,qDAAqD,EAAE;gBACpE,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI;gBAClC,cAAc;gBACd,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,QAAQ,EAAE,OAAO;aAClB,CAAC,CAAC;YAEH,OAAO,CAAC,6BAA6B;QACvC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,SAAS,GAAG,WAAW,CAAC,KAAK,EAAE,uCAAuC,CAAC,CAAC;YAExE,uBAAA,IAAI,6DAAU,MAAd,IAAI,EACF,SAAS,EACT,uBAAA,IAAI,oEAAiB,MAArB,IAAI,EAAkB,uBAAuB,EAAE;gBAC7C,OAAO;gBACP,WAAW;aACZ,CAAC,CACH,CAAC;YAEF,sEAAsE;YACtE,IAAI,OAAO,GAAG,WAAW,EAAE,CAAC;gBAC1B,MAAM,KAAK,GAAG,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa;gBACjE,uBAAA,IAAI,6DAAU,MAAd,IAAI,EACF,+CAA+C,KAAK,IAAI,EACxD;oBACE,OAAO;oBACP,WAAW;oBACX,KAAK,EAAE,SAAS,CAAC,OAAO;iBACzB,CACF,CAAC;gBACF,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC;YACpB,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;IAC3B,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;QACpB,KAAK,CAAC,mBAAmB,GAAG,mBAAmB,CAAC,MAAM,CAAC;QACvD,KAAK,CAAC,mBAAmB,GAAG,SAAS,EAAE,OAAO,IAAI,eAAe,CAAC;IACpE,CAAC,CAAC,CAAC;IACH,uBAAA,IAAI,0CAA0B,IAAI,MAAA,CAAC,CAAC,+BAA+B;IAEnE,uBAAA,IAAI,6DAAU,MAAd,IAAI,EAAW,wCAAwC,EAAE;QACvD,KAAK,EAAE,SAAS,EAAE,OAAO;QACzB,QAAQ,EAAE,WAAW;QACrB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC,CAAC;AACL,CAAC,+EAgBC,MAAc,EACd,KAA+B;IAE/B,OAAO;QACL,IAAI,EAAE;YACJ,OAAO,EAAE,eAAe,CAAC,WAAW;YACpC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc;YACnC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;SACtD;QACD,OAAO,EAAE;YACP,IAAI,EAAE,iBAAiB;YACvB,IAAI,EAAE;gBACJ,MAAM;gBACN,GAAG,KAAK;aACT;SACF;KACF,CAAC;AACJ,CAAC;IASC,OAAO,IAAI,CAAC,KAAwC,CAAC;AACvD,CAAC,yFAWC,MAAc,EACd,iBAA2C;IAE3C,OAAO;QACL,cAAc,EAAE;YACd,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc;YACnC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS;SAChC;QACD,YAAY,EAAE;YACZ,UAAU,EAAE,iBAAiB;YAC7B,MAAM;SACP;QACD,YAAY,EAAE;YACZ,MAAM,EAAE,CAAC,OAA8C,EAAE,EAAE;YACzD,2GAA2G;YAC3G,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;YACtB,QAAQ,EAAE,GAAyB,EAAE,CAAC,uBAAA,IAAI,uEAAoB,MAAxB,IAAI,CAAsB;SACjE;QACD,GAAG,iBAAiB;KACH,CAAC;AACtB,CAAC;IAOC,uBAAA,IAAI,uCAAgB,CAAC,yBAAyB,CAAC;QAC7C,yBAAyB,EAAE,uBAAA,IAAI,kDAA2B;KAC3D,CAAC,CAAC;AACL,CAAC;AAojCD;;GAEG;AACH,KAAK;IACH,IAAI,uBAAA,IAAI,qCAAc,EAAE,CAAC;QACvB,OAAO;IACT,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,IACE,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,yBAAyB;QAC1C,uBAAA,EAAe,2CAAgB,EAC/B,CAAC;QACD,OAAO;IACT,CAAC;IAED,uBAAA,IAAI,iCAAiB,IAAI,MAAA,CAAC;IAC1B,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC;IACzB,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IACvC,IAAI,SAES,CAAC;IAEd,IAAI,CAAC;QACH,uBAAA,IAAI,gCAAS,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC;YACxC,IAAI,EAAE,eAAe,CAAC,iBAAiB;YACvC,EAAE,EAAE,OAAO;YACX,EAAE,EAAE,oBAAoB,CAAC,SAAS;YAClC,IAAI,EAAE;gBACJ,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc;gBACnC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS;aAChC;SACF,CAAC,CAAC;QAEH,uBAAA,IAAI,6DAAU,MAAd,IAAI,EAAW,qDAAqD,CAAC,CAAC;QACtE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;QAEtE,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;YACpB,KAAK,CAAC,gBAAgB,GAAG,IAAI,CAAC;YAC9B,KAAK,CAAC,yBAAyB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,uBAAA,IAAI,6DAAU,MAAd,IAAI,EAAW,wCAAwC,EAAE;YACvD,WAAW,EAAE,IAAI,CAAC,MAAM;SACzB,CAAC,CAAC;QAEH,SAAS,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;QAExD,uBAAA,IAAI,gCAAS,CAAC,cAAc,CAAC,MAAM,CAAC,cAAc,CAChD,oBAAoB,CAAC,sBAAsB,EAC3C,WAAW,CAAC,GAAG,EAAE,GAAG,YAAY,EAChC,aAAa,CACd,CAAC;QAEF,yDAAyD;QACzD,uBAAA,IAAI,2EAAwB,MAA5B,IAAI,CAA0B,CAAC,KAAK,CAAC,GAAG,EAAE;YACxC,qBAAqB;QACvB,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,SAAS,GAAG;YACV,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,0CAA0C,CAAC;iBAClE,OAAO;SACX,CAAC;QACF,uBAAA,IAAI,6DAAU,MAAd,IAAI,EACF,WAAW,CAAC,KAAK,EAAE,0CAA0C,CAAC,EAC9D,uBAAA,IAAI,oEAAiB,MAArB,IAAI,EAAkB,0BAA0B,EAAE;YAChD,OAAO,EAAE,2BAA2B;SACrC,CAAC,CACH,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,uBAAA,IAAI,gCAAS,CAAC,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC;YAC3C,IAAI,EAAE,eAAe,CAAC,iBAAiB;YACvC,EAAE,EAAE,OAAO;YACX,IAAI,EAAE,SAAS;SAChB,CAAC,CAAC;QACH,uBAAA,IAAI,iCAAiB,KAAK,MAAA,CAAC;IAC7B,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,KAAK;IACH,IAAI,uBAAA,IAAI,6CAAsB,EAAE,CAAC;QAC/B,OAAO;IACT,CAAC;IAED,2BAA2B;IAC3B,MAAM,UAAU,GAAG,qBAAqB,CACtC,IAAI,CAAC,SAAS,CAAC,IAAI,CACjB,2DAA2D,CAC5D,CACF,CAAC;IACF,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,CAAC;QACzB,OAAO;IACT,CAAC;IAED,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,CAAC;IAEvC,8CAA8C;IAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,IACE,IAAI,CAAC,KAAK,CAAC,qBAAqB,KAAK,WAAW;QAChD,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,uBAAuB,GAAG,uBAAA,EAAe,2CAAgB,EAC1E,CAAC;QACD,OAAO;IACT,CAAC;IAED,oFAAoF;IACpF,IACE,IAAI,CAAC,2BAA2B,EAAE,KAAK,wBAAwB,CAAC,SAAS,EACzE,CAAC;QACD,uBAAA,IAAI,6DAAU,MAAd,IAAI,EACF,mEAAmE,CACpE,CAAC;QACF,OAAO;IACT,CAAC;IAED,uBAAA,IAAI,yCAAyB,IAAI,MAAA,CAAC;IAClC,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC;IACzB,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IACvC,IAAI,SAOS,CAAC;IAEd,IAAI,CAAC;QACH,uBAAA,IAAI,gCAAS,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC;YACxC,IAAI,EAAE,eAAe,CAAC,eAAe;YACrC,EAAE,EAAE,OAAO;YACX,EAAE,EAAE,oBAAoB,CAAC,SAAS;YAClC,IAAI,EAAE;gBACJ,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc;gBACnC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS;aAChC;YACD,IAAI,EAAE,EAAE,WAAW,EAAE;SACtB,CAAC,CAAC;QAEH,uBAAA,IAAI,6DAAU,MAAd,IAAI,EAAW,mDAAmD,EAAE;YAClE,WAAW;SACZ,CAAC,CAAC;QAEH,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC1D,IAAI,CAAC,YAAY,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;YACpD,IAAI,CAAC,aAAa,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;YACrD,IAAI,CAAC,eAAe,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;SACxD,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;YACpB,KAAK,CAAC,eAAe,GAAG,SAAS,CAAC;YAClC,KAAK,CAAC,YAAY,GAAG,MAAM,CAAC;YAC5B,KAAK,CAAC,kBAAkB,GAAG,YAAY,CAAC;YACxC,KAAK,CAAC,uBAAuB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC3C,KAAK,CAAC,qBAAqB,GAAG,WAAW,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,uBAAA,IAAI,6DAAU,MAAd,IAAI,EAAW,sCAAsC,EAAE;YACrD,aAAa,EAAE,SAAS,CAAC,MAAM;YAC/B,UAAU,EAAE,MAAM,CAAC,MAAM;YACzB,YAAY,EAAE,YAAY,CAAC,YAAY;SACxC,CAAC,CAAC;QAEH,SAAS,GAAG;YACV,OAAO,EAAE,IAAI;YACb,aAAa,EAAE,SAAS,CAAC,MAAM;YAC/B,UAAU,EAAE,MAAM,CAAC,MAAM;SAC1B,CAAC;QAEF,uBAAA,IAAI,gCAAS,CAAC,cAAc,CAAC,MAAM,CAAC,cAAc,CAChD,oBAAoB,CAAC,oBAAoB,EACzC,WAAW,CAAC,GAAG,EAAE,GAAG,YAAY,EAChC,aAAa,CACd,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,SAAS,GAAG;YACV,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,wCAAwC,CAAC;iBAChE,OAAO;SACX,CAAC;QACF,uBAAA,IAAI,6DAAU,MAAd,IAAI,EACF,WAAW,CAAC,KAAK,EAAE,wCAAwC,CAAC,EAC5D,uBAAA,IAAI,oEAAiB,MAArB,IAAI,EAAkB,wBAAwB,EAAE;YAC9C,OAAO,EAAE,qCAAqC;SAC/C,CAAC,CACH,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,uBAAA,IAAI,gCAAS,CAAC,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC;YAC3C,IAAI,EAAE,eAAe,CAAC,eAAe;YACrC,EAAE,EAAE,OAAO;YACX,IAAI,EAAE,SAAS;SAChB,CAAC,CAAC;QACH,uBAAA,IAAI,yCAAyB,KAAK,MAAA,CAAC;IACrC,CAAC;AACH,CAAC;AA9XD,+EAA+E;AAC/E,2DAA2D;AAC3D,+EAA+E;AAE/E,8DAA8D;AAC9C,gDAAuB,IAAI,GAAG,CAAC;QAC7C,WAAW;QACX,mBAAmB;KACpB,CAAC,EAHkC,CAGjC;AAgBa,6CAAoB,CAAC,GAAG,EAAE,GAAG,IAAI,EAAhB,CAAiB,CAAC,QAAQ;AAE3C,2CAAkB,KAAM,EAAT,CAAU,CAAC,eAAe","sourcesContent":["import {\n BaseController,\n ControllerGetStateAction,\n ControllerStateChangeEvent,\n StateMetadata,\n} from '@metamask/base-controller';\nimport type { StateChangeListener } from '@metamask/base-controller';\nimport { ORIGIN_METAMASK } from '@metamask/controller-utils';\nimport type { Messenger } from '@metamask/messenger';\nimport type { Json } from '@metamask/utils';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport { CandlePeriod } from './constants/chartConfig';\nimport {\n PERPS_EVENT_PROPERTY,\n PERPS_EVENT_VALUE,\n} from './constants/eventNames';\nimport { USDC_SYMBOL } from './constants/hyperLiquidConfig';\nimport { PerpsMeasurementName } from './constants/performanceMetrics';\nimport {\n PERPS_CONSTANTS,\n MARKET_SORTING_CONFIG,\n PROVIDER_CONFIG,\n} from './constants/perpsConfig';\nimport type { SortOptionId } from './constants/perpsConfig';\nimport { PERPS_ERROR_CODES } from './perpsErrorCodes';\nimport { AggregatedPerpsProvider } from './providers/AggregatedPerpsProvider';\nimport { HyperLiquidProvider } from './providers/HyperLiquidProvider';\nimport { MYXProvider } from './providers/MYXProvider';\nimport { AccountService } from './services/AccountService';\nimport { DataLakeService } from './services/DataLakeService';\nimport { DepositService } from './services/DepositService';\nimport { EligibilityService } from './services/EligibilityService';\nimport { FeatureFlagConfigurationService } from './services/FeatureFlagConfigurationService';\nimport { MarketDataService } from './services/MarketDataService';\nimport { RewardsIntegrationService } from './services/RewardsIntegrationService';\nimport type { ServiceContext } from './services/ServiceContext';\nimport { TradingService } from './services/TradingService';\n// PerpsStreamChannelKey removed: using string for channel keys (PerpsStreamManager.pauseChannel takes string)\nimport {\n WebSocketConnectionState,\n PerpsAnalyticsEvent,\n PerpsTraceNames,\n PerpsTraceOperations,\n isVersionGatedFeatureFlag,\n // Platform dependencies interface for core migration (bundles all platform-specific deps)\n} from './types';\nimport type {\n AccountState,\n AssetRoute,\n CancelOrderParams,\n CancelOrderResult,\n CancelOrdersParams,\n CancelOrdersResult,\n ClosePositionParams,\n ClosePositionsParams,\n ClosePositionsResult,\n DepositWithConfirmationParams,\n EditOrderParams,\n FeeCalculationParams,\n FeeCalculationResult,\n FlipPositionParams,\n Funding,\n GetAccountStateParams,\n GetAvailableDexsParams,\n GetFundingParams,\n GetMarketsParams,\n GetOrderFillsParams,\n GetOrdersParams,\n GetPositionsParams,\n PerpsProvider,\n LiquidationPriceParams,\n LiveDataConfig,\n MaintenanceMarginParams,\n MarginResult,\n MarketInfo,\n Order,\n OrderFill,\n OrderParams,\n OrderResult,\n PerpsControllerConfig,\n PerpsMarketData,\n Position,\n SubscribeAccountParams,\n SubscribeCandlesParams,\n SubscribeOICapsParams,\n SubscribeOrderBookParams,\n SubscribeOrderFillsParams,\n SubscribeOrdersParams,\n SubscribePositionsParams,\n SubscribePricesParams,\n SwitchProviderResult,\n ToggleTestnetResult,\n UpdateMarginParams,\n UpdatePositionTPSLParams,\n WithdrawParams,\n WithdrawResult,\n GetHistoricalPortfolioParams,\n HistoricalPortfolioResult,\n OrderType,\n PerpsPlatformDependencies,\n PerpsLogger,\n PerpsActiveProviderMode,\n PerpsProviderType,\n PerpsSelectedPaymentToken,\n PerpsRemoteFeatureFlagState,\n PerpsTransactionParams,\n PerpsAddTransactionOptions,\n} from './types';\nimport type {\n PerpsControllerAllowedActions,\n PerpsControllerAllowedEvents,\n} from './types/messenger';\nimport type { CandleData } from './types/perps-types';\nimport {\n LastTransactionResult,\n TransactionStatus,\n} from './types/transactionTypes';\nimport { getSelectedEvmAccount } from './utils/accountUtils';\nimport { ensureError } from './utils/errorUtils';\nimport type { SortDirection } from './utils/sortMarkets';\nimport { wait } from './utils/wait';\n\n/** Derived type for logger options from PerpsLogger interface */\ntype PerpsLoggerOptions = Parameters<PerpsLogger['error']>[1];\n// PaymentToken: minimal interface for deposit flow (replaces mobile-only AssetType)\n\n/**\n * Minimal payment token stored in PerpsController state.\n * Only required fields for identification, Perps balance detection, and analytics.\n */\nexport type SelectedPaymentTokenSnapshot = {\n description?: string;\n address: string;\n chainId: string;\n symbol?: string;\n};\n\n// Re-export error codes from separate file to avoid circular dependencies\nexport { PERPS_ERROR_CODES, type PerpsErrorCode } from './perpsErrorCodes';\n\n/**\n * Initialization state enum for state machine tracking\n */\nexport enum InitializationState {\n Uninitialized = 'uninitialized',\n Initializing = 'initializing',\n Initialized = 'initialized',\n Failed = 'failed',\n}\n\n/**\n * State shape for PerpsController\n */\nexport type PerpsControllerState = {\n // Active provider\n activeProvider: PerpsActiveProviderMode;\n isTestnet: boolean; // Dev toggle for testnet\n\n // Initialization state machine\n initializationState: InitializationState;\n initializationError: string | null;\n initializationAttempts: number;\n\n // Account data (persisted) - using HyperLiquid property names\n accountState: AccountState | null;\n\n // Perps balances per provider for portfolio display (historical data)\n perpsBalances: {\n [provider: string]: {\n totalBalance: string; // Current total account value (cash + positions) in USD\n unrealizedPnl: string; // Current P&L from open positions in USD\n accountValue1dAgo: string; // Account value 24h ago for daily change calculation in USD\n lastUpdated: number; // Timestamp of last update\n };\n };\n\n // Simple deposit state (transient, for UI feedback)\n depositInProgress: boolean;\n // Internal transaction id for the deposit transaction\n // We use this to fetch the bridge quotes and get the estimated time.\n lastDepositTransactionId: string | null;\n lastDepositResult: LastTransactionResult | null;\n\n // Simple withdrawal state (transient, for UI feedback)\n withdrawInProgress: boolean;\n lastWithdrawResult: LastTransactionResult | null;\n\n // Withdrawal request tracking (persistent, for transaction history)\n withdrawalRequests: {\n id: string;\n amount: string;\n asset: string;\n accountAddress: string; // Account that initiated this withdrawal\n txHash?: string;\n timestamp: number;\n success: boolean;\n status: TransactionStatus;\n destination?: string;\n source?: string;\n transactionId?: string;\n withdrawalId?: string;\n depositId?: string;\n }[];\n\n // Withdrawal progress tracking (persistent across navigation)\n withdrawalProgress: {\n progress: number; // 0-100\n lastUpdated: number; // timestamp\n activeWithdrawalId: string | null; // ID of the withdrawal being tracked\n };\n\n // Deposit request tracking (persistent, for transaction history)\n depositRequests: {\n id: string;\n amount: string;\n asset: string;\n accountAddress: string; // Account that initiated this deposit\n txHash?: string;\n timestamp: number;\n success: boolean;\n status: TransactionStatus;\n destination?: string;\n source?: string;\n transactionId?: string;\n withdrawalId?: string;\n depositId?: string;\n }[];\n\n // Eligibility (Geo-Blocking)\n isEligible: boolean;\n\n // Tutorial/First time user tracking (per network)\n isFirstTimeUser: {\n testnet: boolean;\n mainnet: boolean;\n };\n\n // Notification tracking\n hasPlacedFirstOrder: {\n testnet: boolean;\n mainnet: boolean;\n };\n\n // Watchlist markets tracking (per network)\n watchlistMarkets: {\n testnet: string[]; // Array of watchlist market symbols for testnet\n mainnet: string[]; // Array of watchlist market symbols for mainnet\n };\n\n // Trade configurations per market (per network)\n tradeConfigurations: {\n testnet: {\n [marketSymbol: string]: {\n leverage?: number; // Last used leverage for this market\n orderBookGrouping?: number; // Persisted price grouping for order book\n // Pending trade configuration (temporary, expires after 5 minutes)\n pendingConfig?: {\n amount?: string; // Order size in USD\n leverage?: number; // Leverage\n takeProfitPrice?: string; // Take profit price\n stopLossPrice?: string; // Stop loss price\n limitPrice?: string; // Limit price (for limit orders)\n orderType?: OrderType; // Market vs limit\n timestamp: number; // When the config was saved (for expiration check)\n };\n };\n };\n mainnet: {\n [marketSymbol: string]: {\n leverage?: number;\n orderBookGrouping?: number; // Persisted price grouping for order book\n // Pending trade configuration (temporary, expires after 5 minutes)\n pendingConfig?: {\n amount?: string; // Order size in USD\n leverage?: number; // Leverage\n takeProfitPrice?: string; // Take profit price\n stopLossPrice?: string; // Stop loss price\n limitPrice?: string; // Limit price (for limit orders)\n orderType?: OrderType; // Market vs limit\n timestamp: number; // When the config was saved (for expiration check)\n };\n };\n };\n };\n\n // Market filter preferences (network-independent) - includes both sorting and filtering options\n marketFilterPreferences: {\n optionId: SortOptionId;\n direction: SortDirection;\n };\n\n // Error handling\n lastError: string | null;\n lastUpdateTimestamp: number;\n\n // HIP-3 Configuration Version (incremented when HIP-3 remote flags change)\n // Used to trigger reconnection and cache invalidation in ConnectionManager\n hip3ConfigVersion: number;\n\n // Selected payment token for Perps order/deposit flow (null = Perps balance). Stored as Json (minimal shape: description, address, chainId).\n selectedPaymentToken: Json | null;\n\n // Cached market data from background preloading (REST snapshots, not WebSocket)\n cachedMarketData: PerpsMarketData[] | null;\n cachedMarketDataTimestamp: number;\n\n // Cached user data from background preloading (REST snapshots, not WebSocket)\n cachedPositions: Position[] | null;\n cachedOrders: Order[] | null;\n cachedAccountState: AccountState | null;\n cachedUserDataTimestamp: number;\n cachedUserDataAddress: string | null;\n};\n\n/**\n * Get default PerpsController state\n *\n * To change the active provider, modify the `activeProvider` value below:\n * - 'hyperliquid': HyperLiquid provider (default, production)\n * - 'aggregated': Multi-provider aggregation mode\n * - 'myx': MYX provider (future implementation)\n *\n * @returns The default perps controller state.\n */\nexport const getDefaultPerpsControllerState = (): PerpsControllerState => ({\n activeProvider: 'hyperliquid',\n isTestnet: false, // Default to mainnet\n initializationState: InitializationState.Uninitialized,\n initializationError: null,\n initializationAttempts: 0,\n accountState: null,\n perpsBalances: {},\n depositInProgress: false,\n lastDepositResult: null,\n withdrawInProgress: false,\n lastDepositTransactionId: null,\n lastWithdrawResult: null,\n withdrawalRequests: [],\n withdrawalProgress: {\n progress: 0,\n lastUpdated: 0,\n activeWithdrawalId: null,\n },\n depositRequests: [],\n lastError: null,\n lastUpdateTimestamp: 0,\n isEligible: false,\n isFirstTimeUser: {\n testnet: true,\n mainnet: true,\n },\n hasPlacedFirstOrder: {\n testnet: false,\n mainnet: false,\n },\n watchlistMarkets: {\n testnet: [],\n mainnet: [],\n },\n tradeConfigurations: {\n testnet: {},\n mainnet: {},\n },\n marketFilterPreferences: {\n optionId: MARKET_SORTING_CONFIG.DefaultSortOptionId,\n direction: MARKET_SORTING_CONFIG.DefaultDirection,\n },\n hip3ConfigVersion: 0,\n selectedPaymentToken: null,\n cachedMarketData: null,\n cachedMarketDataTimestamp: 0,\n cachedPositions: null,\n cachedOrders: null,\n cachedAccountState: null,\n cachedUserDataTimestamp: 0,\n cachedUserDataAddress: null,\n});\n\n/**\n * State metadata for the PerpsController\n */\nconst metadata: StateMetadata<PerpsControllerState> = {\n accountState: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n perpsBalances: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n isTestnet: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n activeProvider: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n initializationState: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n initializationError: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n initializationAttempts: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: false,\n },\n depositInProgress: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n lastDepositTransactionId: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n lastDepositResult: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n withdrawInProgress: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n lastWithdrawResult: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n withdrawalRequests: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n withdrawalProgress: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n depositRequests: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n lastError: {\n includeInStateLogs: false,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: false,\n },\n lastUpdateTimestamp: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: false,\n },\n isEligible: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n isFirstTimeUser: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n hasPlacedFirstOrder: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n watchlistMarkets: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n tradeConfigurations: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n marketFilterPreferences: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n hip3ConfigVersion: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: false,\n },\n selectedPaymentToken: {\n includeInStateLogs: false,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n cachedMarketData: {\n includeInStateLogs: false,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n cachedMarketDataTimestamp: {\n includeInStateLogs: false,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: false,\n },\n cachedPositions: {\n includeInStateLogs: false,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n cachedOrders: {\n includeInStateLogs: false,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n cachedAccountState: {\n includeInStateLogs: false,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n cachedUserDataTimestamp: {\n includeInStateLogs: false,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: false,\n },\n cachedUserDataAddress: {\n includeInStateLogs: false,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: false,\n },\n};\n\n/**\n * PerpsController events\n */\nexport type PerpsControllerEvents = ControllerStateChangeEvent<\n 'PerpsController',\n PerpsControllerState\n>;\n\n/**\n * PerpsController actions\n */\nexport type PerpsControllerActions =\n | ControllerGetStateAction<'PerpsController', PerpsControllerState>\n | {\n type: 'PerpsController:placeOrder';\n handler: PerpsController['placeOrder'];\n }\n | {\n type: 'PerpsController:editOrder';\n handler: PerpsController['editOrder'];\n }\n | {\n type: 'PerpsController:cancelOrder';\n handler: PerpsController['cancelOrder'];\n }\n | {\n type: 'PerpsController:cancelOrders';\n handler: PerpsController['cancelOrders'];\n }\n | {\n type: 'PerpsController:closePosition';\n handler: PerpsController['closePosition'];\n }\n | {\n type: 'PerpsController:closePositions';\n handler: PerpsController['closePositions'];\n }\n | {\n type: 'PerpsController:withdraw';\n handler: PerpsController['withdraw'];\n }\n | {\n type: 'PerpsController:getPositions';\n handler: PerpsController['getPositions'];\n }\n | {\n type: 'PerpsController:getOrderFills';\n handler: PerpsController['getOrderFills'];\n }\n | {\n type: 'PerpsController:getOrders';\n handler: PerpsController['getOrders'];\n }\n | {\n type: 'PerpsController:getOpenOrders';\n handler: PerpsController['getOpenOrders'];\n }\n | {\n type: 'PerpsController:getFunding';\n handler: PerpsController['getFunding'];\n }\n | {\n type: 'PerpsController:getAccountState';\n handler: PerpsController['getAccountState'];\n }\n | {\n type: 'PerpsController:getMarkets';\n handler: PerpsController['getMarkets'];\n }\n | {\n type: 'PerpsController:refreshEligibility';\n handler: PerpsController['refreshEligibility'];\n }\n | {\n type: 'PerpsController:toggleTestnet';\n handler: PerpsController['toggleTestnet'];\n }\n | {\n type: 'PerpsController:disconnect';\n handler: PerpsController['disconnect'];\n }\n | {\n type: 'PerpsController:calculateFees';\n handler: PerpsController['calculateFees'];\n }\n | {\n type: 'PerpsController:markTutorialCompleted';\n handler: PerpsController['markTutorialCompleted'];\n }\n | {\n type: 'PerpsController:markFirstOrderCompleted';\n handler: PerpsController['markFirstOrderCompleted'];\n }\n | {\n type: 'PerpsController:getHistoricalPortfolio';\n handler: PerpsController['getHistoricalPortfolio'];\n }\n | {\n type: 'PerpsController:resetFirstTimeUserState';\n handler: PerpsController['resetFirstTimeUserState'];\n }\n | {\n type: 'PerpsController:clearPendingTransactionRequests';\n handler: PerpsController['clearPendingTransactionRequests'];\n }\n | {\n type: 'PerpsController:saveTradeConfiguration';\n handler: PerpsController['saveTradeConfiguration'];\n }\n | {\n type: 'PerpsController:getTradeConfiguration';\n handler: PerpsController['getTradeConfiguration'];\n }\n | {\n type: 'PerpsController:saveMarketFilterPreferences';\n handler: PerpsController['saveMarketFilterPreferences'];\n }\n | {\n type: 'PerpsController:getMarketFilterPreferences';\n handler: PerpsController['getMarketFilterPreferences'];\n }\n | {\n type: 'PerpsController:savePendingTradeConfiguration';\n handler: PerpsController['savePendingTradeConfiguration'];\n }\n | {\n type: 'PerpsController:getPendingTradeConfiguration';\n handler: PerpsController['getPendingTradeConfiguration'];\n }\n | {\n type: 'PerpsController:clearPendingTradeConfiguration';\n handler: PerpsController['clearPendingTradeConfiguration'];\n }\n | {\n type: 'PerpsController:getOrderBookGrouping';\n handler: PerpsController['getOrderBookGrouping'];\n }\n | {\n type: 'PerpsController:saveOrderBookGrouping';\n handler: PerpsController['saveOrderBookGrouping'];\n }\n | {\n type: 'PerpsController:setSelectedPaymentToken';\n handler: PerpsController['setSelectedPaymentToken'];\n }\n | {\n type: 'PerpsController:resetSelectedPaymentToken';\n handler: PerpsController['resetSelectedPaymentToken'];\n }\n | {\n type: 'PerpsController:startEligibilityMonitoring';\n handler: PerpsController['startEligibilityMonitoring'];\n }\n | {\n type: 'PerpsController:stopEligibilityMonitoring';\n handler: PerpsController['stopEligibilityMonitoring'];\n };\n\n/**\n * PerpsController messenger constraints.\n * Includes both PerpsController's own actions/events and\n * allowed actions/events from external controllers.\n */\nexport type PerpsControllerMessenger = Messenger<\n 'PerpsController',\n PerpsControllerActions | PerpsControllerAllowedActions,\n PerpsControllerEvents | PerpsControllerAllowedEvents\n>;\n\n/**\n * PerpsController options\n */\nexport type PerpsControllerOptions = {\n messenger: PerpsControllerMessenger;\n state?: Partial<PerpsControllerState>;\n clientConfig?: PerpsControllerConfig;\n /**\n * Platform-specific dependencies (required)\n * Provides logging, metrics, tracing, stream management, and rewards.\n * Cross-controller communication uses the messenger pattern.\n * Must be provided by the platform (mobile/extension) at instantiation time.\n */\n infrastructure: PerpsPlatformDependencies;\n /**\n * When true, defers geo-blocking eligibility checks until\n * {@link PerpsController.startEligibilityMonitoring} is called.\n * Use this during wallet onboarding to prevent the geolocation fetch\n * from firing before onboarding is complete.\n */\n deferEligibilityCheck?: boolean;\n};\n\ntype BlockedRegionList = {\n list: string[];\n source: 'remote' | 'fallback';\n};\n\nconst MESSENGER_EXPOSED_METHODS = [\n 'placeOrder',\n 'editOrder',\n 'cancelOrder',\n 'cancelOrders',\n 'closePosition',\n 'closePositions',\n 'withdraw',\n 'getPositions',\n 'getOrderFills',\n 'getOrders',\n 'getOpenOrders',\n 'getFunding',\n 'getAccountState',\n 'getMarkets',\n 'refreshEligibility',\n 'toggleTestnet',\n 'disconnect',\n 'calculateFees',\n 'markTutorialCompleted',\n 'markFirstOrderCompleted',\n 'getHistoricalPortfolio',\n 'resetFirstTimeUserState',\n 'clearPendingTransactionRequests',\n 'saveTradeConfiguration',\n 'getTradeConfiguration',\n 'saveMarketFilterPreferences',\n 'getMarketFilterPreferences',\n 'savePendingTradeConfiguration',\n 'getPendingTradeConfiguration',\n 'clearPendingTradeConfiguration',\n 'getOrderBookGrouping',\n 'saveOrderBookGrouping',\n 'setSelectedPaymentToken',\n 'resetSelectedPaymentToken',\n 'startEligibilityMonitoring',\n 'stopEligibilityMonitoring',\n] as const;\n\n/**\n * PerpsController - Protocol-agnostic perpetuals trading controller\n *\n * Provides a unified interface for perpetual futures trading across multiple protocols.\n * Features dual data flow architecture:\n * - Trading actions use Redux for persistence and optimistic updates\n * - Live data uses direct callbacks for maximum performance\n */\nexport class PerpsController extends BaseController<\n 'PerpsController',\n PerpsControllerState,\n PerpsControllerMessenger\n> {\n protected providers: Map<PerpsProviderType, PerpsProvider>;\n\n protected isInitialized = false;\n\n #initializationPromise: Promise<void> | null = null;\n\n #isReinitializing = false;\n\n protected blockedRegionList: BlockedRegionList = {\n list: [],\n source: 'fallback',\n };\n\n /**\n * Version counter for blocked region list.\n * Used to prevent race conditions where stale eligibility checks\n * (started with fallback config) overwrite results from newer checks\n * (started with remote config).\n */\n #blockedRegionListVersion = 0;\n\n // Store HIP-3 configuration (mutable for runtime updates from remote flags)\n #hip3Enabled: boolean;\n\n #hip3AllowlistMarkets: string[];\n\n #hip3BlocklistMarkets: string[];\n\n #hip3ConfigSource: 'remote' | 'fallback' = 'fallback';\n\n /**\n * Check if MYX provider is enabled via feature flag\n * Uses same pattern as other feature flags in FeatureFlagConfigurationService\n *\n * @returns True if the condition is met.\n */\n #isMYXProviderEnabled(): boolean {\n const getLocalFlag = (): boolean =>\n typeof globalThis.process !== 'undefined' &&\n globalThis.process.env?.MM_PERPS_MYX_PROVIDER_ENABLED === 'true';\n\n try {\n const localFlag = getLocalFlag();\n const remoteState = this.messenger.call(\n 'RemoteFeatureFlagController:getState',\n );\n const remoteFlag =\n remoteState.remoteFeatureFlags?.perpsMyxProviderEnabled;\n\n if (isVersionGatedFeatureFlag(remoteFlag)) {\n const validated =\n this.#options.infrastructure.featureFlags.validateVersionGated(\n remoteFlag,\n );\n return validated ?? localFlag;\n }\n\n return localFlag;\n } catch {\n // If RemoteFeatureFlagController not ready, use fallback\n return getLocalFlag();\n }\n }\n\n /**\n * Active provider instance for routing operations.\n * When activeProvider is 'hyperliquid' or 'myx': points to specific provider directly\n * When activeProvider is 'aggregated': points to AggregatedPerpsProvider wrapper\n */\n protected activeProviderInstance: PerpsProvider | null = null;\n\n /**\n * Cached standalone provider for pre-initialization discovery queries.\n * Avoids creating a new HyperLiquidProvider (and potentially leaking WebSocket\n * connections) on every standalone call from the preload cycle.\n */\n #standaloneProvider: HyperLiquidProvider | null = null;\n\n #standaloneProviderIsTestnet: boolean | null = null;\n\n #standaloneProviderHip3Version: number | null = null;\n\n #eligibilityCheckDeferred: boolean;\n\n // Store options for dependency injection (allows core package to inject platform-specific services)\n readonly #options: PerpsControllerOptions;\n\n // Service instances (instantiated with platform dependencies)\n readonly #tradingService: TradingService;\n\n readonly #marketDataService: MarketDataService;\n\n readonly #accountService: AccountService;\n\n readonly #eligibilityService: EligibilityService;\n\n readonly #dataLakeService: DataLakeService;\n\n readonly #depositService: DepositService;\n\n readonly #featureFlagConfigurationService: FeatureFlagConfigurationService;\n\n readonly #rewardsIntegrationService: RewardsIntegrationService;\n\n constructor({\n messenger,\n state = {},\n clientConfig = {},\n infrastructure,\n deferEligibilityCheck = false,\n }: PerpsControllerOptions) {\n super({\n name: 'PerpsController',\n metadata,\n messenger,\n state: { ...getDefaultPerpsControllerState(), ...state },\n });\n\n this.#eligibilityCheckDeferred = deferEligibilityCheck;\n\n // Store options for dependency injection\n this.#options = {\n messenger,\n state,\n clientConfig,\n infrastructure,\n };\n\n // Instantiate services with platform dependencies\n // Services that need cross-controller access receive the messenger\n this.#tradingService = new TradingService(infrastructure);\n this.#marketDataService = new MarketDataService(infrastructure);\n this.#accountService = new AccountService(infrastructure, messenger);\n this.#eligibilityService = new EligibilityService(infrastructure);\n this.#dataLakeService = new DataLakeService(infrastructure, messenger);\n this.#depositService = new DepositService(infrastructure, messenger);\n this.#featureFlagConfigurationService = new FeatureFlagConfigurationService(\n infrastructure,\n );\n this.#rewardsIntegrationService = new RewardsIntegrationService(\n infrastructure,\n messenger,\n );\n\n // Set HIP-3 fallback configuration from client (will be updated if remote flags available)\n this.#hip3Enabled = clientConfig.fallbackHip3Enabled ?? false;\n this.#hip3AllowlistMarkets = [\n ...(clientConfig.fallbackHip3AllowlistMarkets ?? []),\n ];\n this.#hip3BlocklistMarkets = [\n ...(clientConfig.fallbackHip3BlocklistMarkets ?? []),\n ];\n\n // Immediately set the fallback region list since RemoteFeatureFlagController is empty by default and takes a moment to populate.\n this.setBlockedRegionList(\n clientConfig.fallbackBlockedRegions ?? [],\n 'fallback',\n );\n\n /**\n * Immediately read current state to catch any flags already loaded\n * This is necessary to avoid race conditions where the RemoteFeatureFlagController fetches flags\n * before the PerpsController initializes its RemoteFeatureFlagController subscription.\n *\n * We still subscribe in case the RemoteFeatureFlagController is not yet populated and updates later.\n */\n try {\n const currentRemoteFeatureFlagState = this.messenger.call(\n 'RemoteFeatureFlagController:getState',\n );\n\n this.refreshEligibilityOnFeatureFlagChange(currentRemoteFeatureFlagState);\n } catch (error) {\n // If we can't read the remote feature flags at construction time, we'll rely on:\n // 1. The fallback blocked regions already set above\n // 2. The subscription to catch updates when RemoteFeatureFlagController is ready\n this.#logError(\n ensureError(error, 'PerpsController.constructor'),\n this.#getErrorContext('constructor', {\n operation: 'readRemoteFeatureFlags',\n }),\n );\n }\n\n // Subscribe for the full controller lifetime — intentionally not stored;\n // geo-blocking and HIP-3 flag propagation must remain active across\n // disconnect → reconnect cycles and must never be torn down.\n this.messenger.subscribe(\n 'RemoteFeatureFlagController:stateChange',\n this.refreshEligibilityOnFeatureFlagChange.bind(this),\n );\n\n this.providers = new Map();\n\n // Migrate old persisted data without accountAddress\n this.#migrateRequestsIfNeeded();\n\n this.messenger.registerMethodActionHandlers(\n this,\n MESSENGER_EXPOSED_METHODS,\n );\n }\n\n // ============================================================================\n // Infrastructure Access Methods\n // These methods provide access to platform-specific infrastructure via dependency injection.\n // Infrastructure is required and must be provided at instantiation time.\n // ============================================================================\n\n /**\n * Log an error using injected infrastructure logger\n *\n * @param error - The error that occurred.\n * @param options - The configuration options.\n */\n #logError(error: Error, options?: PerpsLoggerOptions): void {\n this.#options.infrastructure.logger.error(error, options);\n }\n\n /**\n * Log debug message using injected infrastructure debugLogger\n *\n * @param args - The function arguments.\n */\n #debugLog(\n ...args: (string | number | boolean | object | null | undefined)[]\n ): void {\n this.#options.infrastructure.debugLogger.log(...args);\n }\n\n /**\n * Returns a cached standalone HyperLiquidProvider for pre-initialization\n * discovery queries. Creates a new instance on first call or when the\n * isTestnet / hip3ConfigVersion has changed since the last creation.\n *\n * @returns A HyperLiquidProvider suitable for standalone REST calls.\n */\n #getOrCreateStandaloneProvider(): HyperLiquidProvider {\n const currentIsTestnet = this.state.isTestnet;\n const currentHip3Version = this.state.hip3ConfigVersion ?? 0;\n\n if (\n this.#standaloneProvider &&\n this.#standaloneProviderIsTestnet === currentIsTestnet &&\n this.#standaloneProviderHip3Version === currentHip3Version\n ) {\n return this.#standaloneProvider;\n }\n\n // Stale or missing — tear down old one (fire-and-forget)\n if (this.#standaloneProvider) {\n const old = this.#standaloneProvider;\n Promise.resolve(old.disconnect()).catch(() => {\n /* best-effort */\n });\n }\n\n this.#standaloneProvider = new HyperLiquidProvider({\n isTestnet: currentIsTestnet,\n hip3Enabled: this.#hip3Enabled,\n allowlistMarkets: this.#hip3AllowlistMarkets,\n blocklistMarkets: this.#hip3BlocklistMarkets,\n platformDependencies: this.#options.infrastructure,\n messenger: this.messenger,\n });\n this.#standaloneProviderIsTestnet = currentIsTestnet;\n this.#standaloneProviderHip3Version = currentHip3Version;\n\n return this.#standaloneProvider;\n }\n\n /**\n * Disconnect and discard the cached standalone provider (if any).\n * Best-effort — errors are silently caught.\n */\n async #cleanupStandaloneProvider(): Promise<void> {\n if (!this.#standaloneProvider) {\n return;\n }\n try {\n await this.#standaloneProvider.disconnect();\n } catch {\n /* best-effort */\n }\n this.#standaloneProvider = null;\n this.#standaloneProviderIsTestnet = null;\n this.#standaloneProviderHip3Version = null;\n }\n\n /**\n * Test-observable accessor for whether a standalone provider is cached.\n *\n * @returns True if a standalone provider instance exists.\n */\n protected hasStandaloneProvider(): boolean {\n return this.#standaloneProvider !== null;\n }\n\n /**\n * Get metrics instance from platform dependencies\n *\n * @returns The platform metrics instance.\n */\n #getMetrics(): PerpsPlatformDependencies['metrics'] {\n return this.#options.infrastructure.metrics;\n }\n\n // ============================================================================\n // Messenger-based Controller Access\n // These methods use the messenger pattern for inter-controller communication\n // ============================================================================\n\n /**\n * Find network client ID for a given chain via messenger\n *\n * @param chainId - The chain identifier.\n * @returns The resulting string value.\n */\n #findNetworkClientIdForChain(chainId: string): string | undefined {\n return this.messenger.call(\n 'NetworkController:findNetworkClientIdByChainId',\n chainId as `0x${string}`,\n );\n }\n\n /**\n * Submit a transaction via messenger (shows confirmation screen)\n *\n * @param txParams - The transaction parameters.\n * @param txParams.from - The sender address.\n * @param txParams.to - The recipient address.\n * @param txParams.value - The transaction value.\n * @param txParams.data - The transaction data payload.\n * @param txParams.gas - The gas limit.\n * @param options - The configuration options.\n * @param options.networkClientId - The network client identifier.\n * @param options.origin - The transaction origin.\n * @param options.type - The transaction type.\n * @param options.skipInitialGasEstimate - Whether to skip initial gas estimation.\n * @returns The transaction result containing a hash promise and transaction metadata.\n */\n async #submitTransaction(\n txParams: PerpsTransactionParams,\n options: PerpsAddTransactionOptions,\n ): Promise<{\n result: Promise<string>;\n transactionMeta: { id: string; hash?: string };\n }> {\n // Cast needed: PerpsController uses loose string types for txParams/options\n // while TransactionController uses strict branded types (TransactionParams, AddTransactionOptions)\n return this.messenger.call(\n 'TransactionController:addTransaction',\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n txParams as any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n options as any,\n );\n }\n\n /**\n * Clean up old withdrawal/deposit requests that don't have accountAddress\n * These are from before the accountAddress field was added and can't be displayed\n * in the UI (which filters by account), so we discard them\n */\n #migrateRequestsIfNeeded(): void {\n this.update((state) => {\n // Remove withdrawal requests without accountAddress - they can't be attributed to any account\n state.withdrawalRequests = state.withdrawalRequests.filter((req) =>\n Boolean(req.accountAddress),\n );\n\n // Remove deposit requests without accountAddress - they can't be attributed to any account\n state.depositRequests = state.depositRequests.filter((req) =>\n Boolean(req.accountAddress),\n );\n });\n }\n\n protected setBlockedRegionList(\n list: string[],\n source: 'remote' | 'fallback',\n ): void {\n this.#featureFlagConfigurationService.setBlockedRegions({\n list,\n source,\n context: this.#createServiceContext('setBlockedRegionList', {\n getBlockedRegionList: () => this.blockedRegionList,\n setBlockedRegionList: (\n newList: string[],\n newSource: 'remote' | 'fallback',\n ) => {\n this.blockedRegionList = { list: newList, source: newSource };\n this.#blockedRegionListVersion += 1;\n },\n refreshEligibility: () => this.refreshEligibility(),\n }),\n });\n }\n\n /**\n * Respond to RemoteFeatureFlagController state changes\n * Refreshes user eligibility based on geo-blocked regions defined in remote feature flag.\n * Uses fallback configuration when remote feature flag is undefined.\n * Note: Initial eligibility is set in the constructor if fallback regions are provided.\n *\n * @param remoteFeatureFlagControllerState - State from RemoteFeatureFlagController.\n */\n protected refreshEligibilityOnFeatureFlagChange(\n remoteFeatureFlagControllerState: PerpsRemoteFeatureFlagState,\n ): void {\n this.#featureFlagConfigurationService.refreshEligibility({\n remoteFeatureFlagControllerState,\n context: this.#createServiceContext(\n 'refreshEligibilityOnFeatureFlagChange',\n {\n getBlockedRegionList: () => this.blockedRegionList,\n setBlockedRegionList: (\n list: string[],\n source: 'remote' | 'fallback',\n ) => {\n this.blockedRegionList = { list, source };\n this.#blockedRegionListVersion += 1;\n },\n refreshEligibility: () => this.refreshEligibility(),\n getHip3Config: () => ({\n enabled: this.#hip3Enabled,\n allowlistMarkets: this.#hip3AllowlistMarkets,\n blocklistMarkets: this.#hip3BlocklistMarkets,\n source: this.#hip3ConfigSource,\n }),\n setHip3Config: (config) => {\n if (config.enabled !== undefined) {\n this.#hip3Enabled = config.enabled;\n }\n if (config.allowlistMarkets !== undefined) {\n this.#hip3AllowlistMarkets = [...config.allowlistMarkets];\n }\n if (config.blocklistMarkets !== undefined) {\n this.#hip3BlocklistMarkets = [...config.blocklistMarkets];\n }\n if (config.source !== undefined) {\n this.#hip3ConfigSource = config.source;\n }\n },\n incrementHip3ConfigVersion: () => {\n const newVersion = (this.state.hip3ConfigVersion || 0) + 1;\n this.update((state) => {\n state.hip3ConfigVersion = newVersion;\n });\n return newVersion;\n },\n },\n ),\n });\n }\n\n /**\n * Execute an operation while temporarily pausing specified stream channels\n * to prevent WebSocket updates from triggering UI re-renders during operations.\n *\n * WebSocket connections remain alive but updates are not emitted to subscribers.\n * This prevents race conditions where UI re-renders fetch stale data during operations.\n *\n * @param operation - The async operation to execute\n * @param channels - Array of stream channel names to pause\n * @returns The result of the operation\n * @example\n * ```typescript\n * // Cancel orders without stream interference\n * await this.#withStreamPause(\n * async () => this.provider.cancelOrders({ cancelAll: true }),\n * ['orders']\n * );\n *\n * // Close positions and pause multiple streams\n * await this.#withStreamPause(\n * async () => this.provider.closePositions(positions),\n * ['positions', 'account', 'orders']\n * );\n * ```\n */\n async #withStreamPause<TResult>(\n operation: () => Promise<TResult>,\n channels: string[],\n ): Promise<TResult> {\n const pausedChannels: string[] = [];\n const { streamManager } = this.#options.infrastructure;\n\n // Pause emission on specified channels (WebSocket stays connected)\n // Track which channels successfully paused to ensure proper cleanup\n for (const channel of channels) {\n try {\n streamManager.pauseChannel(channel);\n pausedChannels.push(channel);\n } catch (error) {\n // Log error to Sentry but continue pausing remaining channels\n this.#logError(\n ensureError(error, 'PerpsController.withStreamPause'),\n this.#getErrorContext('withStreamPause', {\n operation: 'pause',\n channel: String(channel),\n pausedChannels: pausedChannels.join(','),\n }),\n );\n }\n }\n\n try {\n // Execute operation without stream interference\n return await operation();\n } finally {\n // Resume only channels that were successfully paused\n for (const channel of pausedChannels) {\n try {\n streamManager.resumeChannel(channel);\n } catch (error) {\n // Log error to Sentry but continue resuming remaining channels\n this.#logError(\n ensureError(error, 'PerpsController.withStreamPause'),\n this.#getErrorContext('withStreamPause', {\n operation: 'resume',\n channel: String(channel),\n pausedChannels: pausedChannels.join(','),\n }),\n );\n }\n }\n }\n }\n\n /**\n * Initialize the PerpsController providers\n * Must be called before using any other methods\n * Prevents double initialization with promise caching\n *\n * @returns A promise that resolves when the operation completes.\n */\n async init(): Promise<void> {\n if (this.isInitialized) {\n return undefined;\n }\n\n if (this.#initializationPromise) {\n return this.#initializationPromise;\n }\n\n this.#initializationPromise = this.#performInitialization();\n return this.#initializationPromise;\n }\n\n /**\n * Actual initialization implementation with retry logic\n */\n async #performInitialization(): Promise<void> {\n const maxAttempts = 3;\n const baseDelay = 1000;\n\n this.update((state) => {\n state.initializationState = InitializationState.Initializing;\n state.initializationError = null;\n state.initializationAttempts = 0;\n });\n\n this.#debugLog('PerpsController: Initializing providers', {\n currentNetwork: this.state.isTestnet ? 'testnet' : 'mainnet',\n existingProviders: Array.from(this.providers.keys()),\n timestamp: new Date().toISOString(),\n });\n\n let lastError: Error | null = null;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n this.update((state) => {\n state.initializationAttempts = attempt;\n });\n\n // Disconnect existing providers to close WebSocket connections\n const existingProviders = Array.from(this.providers.values());\n if (existingProviders.length > 0) {\n this.#debugLog('PerpsController: Disconnecting existing providers', {\n count: existingProviders.length,\n timestamp: new Date().toISOString(),\n });\n await Promise.all(\n existingProviders.map((provider) => provider.disconnect()),\n );\n }\n this.providers.clear();\n await this.#cleanupStandaloneProvider();\n\n const { activeProvider } = this.state;\n\n this.#debugLog(\n 'PerpsController: Creating provider with HIP-3 configuration',\n {\n hip3Enabled: this.#hip3Enabled,\n hip3AllowlistMarkets: this.#hip3AllowlistMarkets,\n hip3BlocklistMarkets: this.#hip3BlocklistMarkets,\n hip3ConfigSource: this.#hip3ConfigSource,\n isTestnet: this.state.isTestnet,\n activeProvider,\n },\n );\n\n // Always create HyperLiquid provider as the base provider\n const hyperLiquidProvider = new HyperLiquidProvider({\n isTestnet: this.state.isTestnet,\n hip3Enabled: this.#hip3Enabled,\n allowlistMarkets: this.#hip3AllowlistMarkets,\n blocklistMarkets: this.#hip3BlocklistMarkets,\n platformDependencies: this.#options.infrastructure,\n messenger: this.messenger,\n });\n this.providers.set('hyperliquid', hyperLiquidProvider);\n\n // Register MYX provider if enabled via feature flag\n const isMYXEnabled = this.#isMYXProviderEnabled();\n if (isMYXEnabled) {\n const myxProvider = new MYXProvider({\n isTestnet: PROVIDER_CONFIG.MYX_TESTNET_ONLY || this.state.isTestnet,\n platformDependencies: this.#options.infrastructure,\n });\n this.providers.set('myx', myxProvider);\n this.#debugLog('PerpsController: MYX provider registered', {\n isTestnet: PROVIDER_CONFIG.MYX_TESTNET_ONLY || this.state.isTestnet,\n });\n }\n\n // Set up active provider based on activeProvider value in state\n // 'aggregated' is treated as just another provider that wraps others\n if (activeProvider === 'aggregated') {\n // Aggregated mode: wrap in AggregatedPerpsProvider for multi-provider support\n this.activeProviderInstance = new AggregatedPerpsProvider({\n providers: this.providers,\n defaultProvider: 'hyperliquid',\n infrastructure: this.#options.infrastructure,\n });\n this.#debugLog(\n 'PerpsController: Using aggregated provider (multi-provider)',\n { registeredProviders: Array.from(this.providers.keys()) },\n );\n } else if (activeProvider === 'hyperliquid') {\n // Direct provider mode: use HyperLiquid provider directly\n this.activeProviderInstance = hyperLiquidProvider;\n this.#debugLog(\n `PerpsController: Using direct provider (${activeProvider})`,\n );\n } else if (activeProvider === 'myx') {\n // MYX provider mode\n const myxProvider = this.providers.get('myx');\n if (myxProvider) {\n this.activeProviderInstance = myxProvider;\n } else {\n // MYX feature flag is disabled — fall back to HyperLiquid\n this.#debugLog(\n 'PerpsController: MYX provider not available (feature flag disabled), falling back to hyperliquid',\n );\n this.activeProviderInstance = hyperLiquidProvider;\n this.update((state) => {\n state.activeProvider = 'hyperliquid';\n });\n }\n this.#debugLog(\n `PerpsController: Using direct provider (${this.activeProviderInstance === hyperLiquidProvider ? 'hyperliquid' : activeProvider})`,\n );\n } else {\n // Unsupported provider - throw error to prevent silent misconfiguration\n throw new Error(\n `Unsupported provider: ${String(activeProvider)}. Currently only 'hyperliquid', 'myx', and 'aggregated' are supported.`,\n );\n }\n\n // Future providers can be added here with their own authentication patterns:\n // - Some might use API keys: new BinanceProvider({ apiKey, apiSecret })\n // - Some might use different wallet patterns: new GMXProvider({ signer })\n // - Some might not need auth at all: new DydxProvider()\n\n // Wait for WebSocket transport to be ready before marking as initialized\n await wait(PERPS_CONSTANTS.ReconnectionCleanupDelayMs);\n\n this.isInitialized = true;\n this.update((state) => {\n state.initializationState = InitializationState.Initialized;\n state.initializationError = null;\n });\n\n this.#debugLog('PerpsController: Providers initialized successfully', {\n providerCount: this.providers.size,\n activeProvider,\n timestamp: new Date().toISOString(),\n attempts: attempt,\n });\n\n return; // Exit retry loop on success\n } catch (error) {\n lastError = ensureError(error, 'PerpsController.performInitialization');\n\n this.#logError(\n lastError,\n this.#getErrorContext('performInitialization', {\n attempt,\n maxAttempts,\n }),\n );\n\n // If not the last attempt, wait before retrying (exponential backoff)\n if (attempt < maxAttempts) {\n const delay = baseDelay * Math.pow(2, attempt - 1); // 1s, 2s, 4s\n this.#debugLog(\n `PerpsController: Retrying initialization in ${delay}ms`,\n {\n attempt,\n maxAttempts,\n error: lastError.message,\n },\n );\n await wait(delay);\n }\n }\n }\n\n this.isInitialized = false;\n this.update((state) => {\n state.initializationState = InitializationState.Failed;\n state.initializationError = lastError?.message ?? 'Unknown error';\n });\n this.#initializationPromise = null; // Clear promise to allow retry\n\n this.#debugLog('PerpsController: Initialization failed', {\n error: lastError?.message,\n attempts: maxAttempts,\n timestamp: new Date().toISOString(),\n });\n }\n\n /**\n * Generate standard error context for Logger.error calls with searchable tags and context.\n * Enables Sentry dashboard filtering by feature, provider, and network.\n *\n * @param method - The method name where the error occurred\n * @param extra - Optional additional context fields (becomes searchable context data)\n * @returns PerpsLoggerOptions with tags (searchable) and context (searchable)\n * @private\n * @example\n * this.#logError(error, this.#getErrorContext('placeOrder', { symbol: 'BTC', operation: 'validate' }));\n * // Creates searchable tags: feature:perps, provider:hyperliquid, network:mainnet\n * // Creates searchable context: perps_controller.method:placeOrder, perps_controller.symbol:BTC, perps_controller.operation:validate\n */\n #getErrorContext(\n method: string,\n extra?: Record<string, unknown>,\n ): PerpsLoggerOptions {\n return {\n tags: {\n feature: PERPS_CONSTANTS.FeatureName,\n provider: this.state.activeProvider,\n network: this.state.isTestnet ? 'testnet' : 'mainnet',\n },\n context: {\n name: 'PerpsController',\n data: {\n method,\n ...extra,\n },\n },\n };\n }\n\n /**\n * Returns current controller state as PerpsControllerState.\n * Used by createServiceContext to avoid deep type instantiation when building stateManager.\n *\n * @returns The current controller state cast to PerpsControllerState.\n */\n #getControllerState(): PerpsControllerState {\n return this.state as unknown as PerpsControllerState;\n }\n\n /**\n * Create a ServiceContext for dependency injection into services\n * Provides all orchestration dependencies (tracing, analytics, state management)\n *\n * @param method - Method name for error context\n * @param additionalContext - Optional additional context (e.g., rewardsController, streamManager)\n * @returns ServiceContext with all required dependencies\n */\n #createServiceContext(\n method: string,\n additionalContext?: Partial<ServiceContext>,\n ): ServiceContext {\n return {\n tracingContext: {\n provider: this.state.activeProvider,\n isTestnet: this.state.isTestnet,\n },\n errorContext: {\n controller: 'PerpsController',\n method,\n },\n stateManager: {\n update: (updater: (state: PerpsControllerState) => void) =>\n // @ts-expect-error TS2589 - excessively deep instantiation when inferring stateManager from BaseController\n this.update(updater),\n getState: (): PerpsControllerState => this.#getControllerState(),\n },\n ...additionalContext,\n } as ServiceContext;\n }\n\n /**\n * Ensure TradingService has controller dependencies set.\n * RewardsIntegrationService uses messenger internally for controller access.\n */\n #ensureTradingServiceDeps(): void {\n this.#tradingService.setControllerDependencies({\n rewardsIntegrationService: this.#rewardsIntegrationService,\n });\n }\n\n /**\n * Get the currently active provider.\n * In aggregated mode, returns AggregatedPerpsProvider which routes to underlying providers.\n * In single provider mode, returns HyperLiquidProvider directly.\n *\n * @returns The active provider (aggregated wrapper or direct provider based on mode)\n * @throws Error if provider is not initialized or reinitializing\n */\n getActiveProvider(): PerpsProvider {\n // Check if we're in the middle of reinitializing\n if (this.isCurrentlyReinitializing()) {\n this.update((state) => {\n state.lastError = PERPS_ERROR_CODES.CLIENT_REINITIALIZING;\n state.lastUpdateTimestamp = Date.now();\n });\n throw new Error(PERPS_ERROR_CODES.CLIENT_REINITIALIZING);\n }\n\n // Check if not initialized\n if (\n this.state.initializationState !== InitializationState.Initialized ||\n !this.isInitialized\n ) {\n const errorMessage =\n this.state.initializationState === InitializationState.Failed\n ? `${PERPS_ERROR_CODES.CLIENT_NOT_INITIALIZED}: ${this.state.initializationError ?? 'Initialization failed'}`\n : PERPS_ERROR_CODES.CLIENT_NOT_INITIALIZED;\n\n this.update((state) => {\n state.lastError = errorMessage;\n state.lastUpdateTimestamp = Date.now();\n });\n throw new Error(errorMessage);\n }\n\n // Return the active provider instance (set during initialization based on providerMode)\n if (!this.activeProviderInstance) {\n this.update((state) => {\n state.lastError = PERPS_ERROR_CODES.PROVIDER_NOT_AVAILABLE;\n state.lastUpdateTimestamp = Date.now();\n });\n throw new Error(PERPS_ERROR_CODES.PROVIDER_NOT_AVAILABLE);\n }\n\n return this.activeProviderInstance;\n }\n\n /**\n * Get the currently active provider, returning null if not available\n * Use this method when the caller can gracefully handle a missing provider\n * (e.g., UI components during initialization or reconnection)\n *\n * @returns The active provider, or null if not initialized/reinitializing\n */\n getActiveProviderOrNull(): PerpsProvider | null {\n // Return null during reinitialization\n if (this.isCurrentlyReinitializing()) {\n return null;\n }\n\n // Return null if not initialized\n if (\n this.state.initializationState !== InitializationState.Initialized ||\n !this.isInitialized\n ) {\n return null;\n }\n\n // Return the active provider instance or null if not found\n return this.activeProviderInstance ?? null;\n }\n\n /**\n * Place a new order\n * Thin delegation to TradingService\n *\n * @param params - The operation parameters.\n * @returns The order result with order ID and status.\n */\n async placeOrder(params: OrderParams): Promise<OrderResult> {\n const provider = this.getActiveProvider();\n this.#ensureTradingServiceDeps();\n\n return this.#tradingService.placeOrder({\n provider,\n params,\n context: this.#createServiceContext('placeOrder', {\n saveTradeConfiguration: (symbol: string, leverage: number) =>\n this.saveTradeConfiguration(symbol, leverage),\n }),\n reportOrderToDataLake: (dataLakeParams) =>\n this.reportOrderToDataLake(dataLakeParams),\n });\n }\n\n /**\n * Edit an existing order\n * Thin delegation to TradingService\n *\n * @param params - The operation parameters.\n * @returns The updated order result with order ID and status.\n */\n async editOrder(params: EditOrderParams): Promise<OrderResult> {\n const provider = this.getActiveProvider();\n this.#ensureTradingServiceDeps();\n\n return this.#tradingService.editOrder({\n provider,\n params,\n context: this.#createServiceContext('editOrder'),\n });\n }\n\n /**\n * Cancel an existing order\n *\n * @param params - The operation parameters.\n * @returns The cancellation result with status.\n */\n async cancelOrder(params: CancelOrderParams): Promise<CancelOrderResult> {\n const provider = this.getActiveProvider();\n\n return this.#tradingService.cancelOrder({\n provider,\n params,\n context: this.#createServiceContext('cancelOrder'),\n });\n }\n\n /**\n * Cancel multiple orders in parallel\n * Batch version of cancelOrder() that cancels multiple orders simultaneously\n *\n * @param params - The operation parameters.\n * @returns The batch cancellation results for each order.\n */\n async cancelOrders(params: CancelOrdersParams): Promise<CancelOrdersResult> {\n const provider = this.getActiveProvider();\n\n return this.#tradingService.cancelOrders({\n provider,\n params,\n context: this.#createServiceContext('cancelOrders', {\n getOpenOrders: () => this.getOpenOrders(),\n }),\n withStreamPause: <TResult>(\n operation: () => Promise<TResult>,\n channels: string[],\n ) => this.#withStreamPause(operation, channels),\n });\n }\n\n /**\n * Close a position (partial or full)\n * Thin delegation to TradingService\n *\n * @param params - The operation parameters.\n * @returns The order result from the close position request.\n */\n async closePosition(params: ClosePositionParams): Promise<OrderResult> {\n const provider = this.getActiveProvider();\n this.#ensureTradingServiceDeps();\n\n return this.#tradingService.closePosition({\n provider,\n params,\n context: this.#createServiceContext('closePosition', {\n getPositions: () => this.getPositions(),\n }),\n reportOrderToDataLake: (dataLakeParams) =>\n this.reportOrderToDataLake(dataLakeParams),\n });\n }\n\n /**\n * Close multiple positions in parallel\n * Batch version of closePosition() that closes multiple positions simultaneously\n *\n * @param params - The operation parameters.\n * @returns The batch close results for each position.\n */\n async closePositions(\n params: ClosePositionsParams,\n ): Promise<ClosePositionsResult> {\n const provider = this.getActiveProvider();\n this.#ensureTradingServiceDeps();\n\n return this.#tradingService.closePositions({\n provider,\n params,\n context: this.#createServiceContext('closePositions', {\n getPositions: () => this.getPositions(),\n }),\n });\n }\n\n /**\n * Update TP/SL for an existing position\n *\n * @param params - The operation parameters.\n * @returns The order result from the TP/SL update.\n */\n async updatePositionTPSL(\n params: UpdatePositionTPSLParams,\n ): Promise<OrderResult> {\n const provider = this.getActiveProvider();\n this.#ensureTradingServiceDeps();\n\n return this.#tradingService.updatePositionTPSL({\n provider,\n params,\n context: this.#createServiceContext('updatePositionTPSL'),\n });\n }\n\n /**\n * Update margin for an existing position (add or remove)\n *\n * @param params - The operation parameters.\n * @returns The margin update result.\n */\n async updateMargin(params: UpdateMarginParams): Promise<MarginResult> {\n const provider = this.getActiveProvider();\n this.#ensureTradingServiceDeps();\n\n return this.#tradingService.updateMargin({\n provider,\n symbol: params.symbol,\n amount: params.amount,\n context: this.#createServiceContext('updateMargin'),\n });\n }\n\n /**\n * Flip position (reverse direction while keeping size and leverage)\n *\n * @param params - The operation parameters.\n * @returns The order result from the position flip.\n */\n async flipPosition(params: FlipPositionParams): Promise<OrderResult> {\n const provider = this.getActiveProvider();\n this.#ensureTradingServiceDeps();\n\n return this.#tradingService.flipPosition({\n provider,\n position: params.position,\n context: this.#createServiceContext('flipPosition'),\n });\n }\n\n /**\n * Simplified deposit method that prepares transaction for confirmation screen\n * No complex state tracking - just sets a loading flag\n *\n * @param params - Parameters for the deposit flow\n * @param params.amount - Optional deposit amount\n * @param params.placeOrder - If true, uses addTransaction instead of submit to avoid navigation\n * @returns An object containing a promise that resolves to the transaction hash.\n */\n async depositWithConfirmation(\n params: DepositWithConfirmationParams = {},\n ): Promise<{ result: Promise<string> }> {\n const { amount, placeOrder } = params;\n\n let currentDepositId: string | undefined;\n\n try {\n // Clear any stale results when starting a new deposit flow\n // Don't set depositInProgress yet - wait until user confirms\n\n // Prepare deposit transaction using DepositService\n const provider = this.getActiveProvider();\n const {\n transaction,\n assetChainId,\n currentDepositId: depositId,\n } = await this.#depositService.prepareTransaction({ provider });\n currentDepositId = depositId;\n\n // Get current account address via messenger (outside of update() for proper typing)\n const evmAccount = getSelectedEvmAccount(\n this.messenger.call(\n 'AccountTreeController:getAccountsFromSelectedAccountGroup',\n ),\n );\n const accountAddress = evmAccount?.address ?? 'unknown';\n\n this.update((state) => {\n state.lastDepositResult = null;\n\n // Add deposit request to tracking\n const depositRequest = {\n id: currentDepositId ?? uuidv4(),\n timestamp: Date.now(),\n amount: amount ?? '0', // Use provided amount or default to '0'\n asset: USDC_SYMBOL,\n accountAddress, // Track which account initiated deposit\n success: false, // Will be updated when transaction completes\n txHash: undefined,\n status: 'pending' as TransactionStatus,\n source: undefined,\n transactionId: undefined, // Will be set to depositId when available\n };\n\n state.depositRequests.unshift(depositRequest); // Add to beginning of array\n });\n\n const networkClientId = this.#findNetworkClientIdForChain(assetChainId);\n\n if (!networkClientId) {\n throw new Error(\n `No network client found for chain ${assetChainId}. Please add the network first.`,\n );\n }\n\n let result: Promise<string>;\n let transactionMeta: { id: string };\n let depositOrderResult: Promise<string> | null = null;\n\n const defaultTransactionOptions = {\n networkClientId,\n origin: ORIGIN_METAMASK,\n skipInitialGasEstimate: true,\n };\n\n if (placeOrder) {\n // Use addTransaction to create transaction without navigating to confirmation screen\n const addResult = await this.#submitTransaction(transaction, {\n ...defaultTransactionOptions,\n type: 'perpsDepositAndOrder',\n });\n transactionMeta = addResult.transactionMeta;\n // Return transaction ID immediately (fire-and-forget for caller)\n result = Promise.resolve(transactionMeta.id);\n // Track deposit request lifecycle via the real transaction result\n depositOrderResult = addResult.result;\n } else {\n // submit shows the confirmation screen and returns a promise\n // The promise will resolve when transaction completes or reject if cancelled/failed\n const submitResult = await this.#submitTransaction(transaction, {\n ...defaultTransactionOptions,\n type: 'perpsDeposit',\n });\n result = submitResult.result;\n transactionMeta = submitResult.transactionMeta;\n }\n\n // Store the transaction ID and try to get amount from transaction\n this.update((state) => {\n state.lastDepositTransactionId = transactionMeta.id;\n });\n\n // Track the transaction lifecycle only when using submit (deposit-only flow)\n if (!placeOrder) {\n // At this point, the confirmation modal is shown to the user\n // The result promise will resolve/reject based on user action and transaction outcome\n\n // Track the transaction lifecycle\n // The result promise will resolve/reject based on user action and transaction outcome\n // Note: We intentionally don't set depositInProgress immediately to avoid\n // showing toasts before the user confirms the transaction\n\n // TODO: @abretonc7s Find a better way to trigger our custom toast notification then having to toggle the state\n // How to replace the system notifications?\n result\n .then((actualTxHash) => {\n // Transaction was successfully completed\n // Set depositInProgress to true temporarily to show success\n this.update((state) => {\n state.depositInProgress = true;\n state.lastDepositResult = {\n success: true,\n txHash: actualTxHash,\n amount: amount ?? '0',\n asset: USDC_SYMBOL, // Default asset for deposits\n timestamp: Date.now(),\n error: '',\n };\n\n // Update the deposit request by request ID to avoid race conditions\n if (state.depositRequests.length > 0) {\n const requestToUpdate = state.depositRequests.find(\n (req) => req.id === currentDepositId,\n );\n if (requestToUpdate) {\n // For deposits, we have a txHash immediately, so mark as completed\n // (the transaction hash means the deposit was successful)\n requestToUpdate.status = 'completed' as TransactionStatus;\n requestToUpdate.success = true;\n requestToUpdate.txHash = actualTxHash;\n }\n }\n });\n\n // Clear depositInProgress after a short delay\n setTimeout(() => {\n this.update((state) => {\n state.depositInProgress = false;\n state.lastDepositTransactionId = null;\n });\n }, 100);\n\n return undefined;\n })\n .catch((error) => {\n // Check if user denied/cancelled the transaction\n const errorMessage = ensureError(\n error,\n 'PerpsController.initiateDeposit',\n ).message;\n const userCancelled =\n errorMessage.includes('User denied') ||\n errorMessage.includes('User rejected') ||\n errorMessage.includes('User cancelled') ||\n errorMessage.includes('User canceled');\n\n if (userCancelled) {\n // User cancelled - clear any state, no toast\n this.update((state) => {\n state.depositInProgress = false;\n state.lastDepositTransactionId = null;\n // Don't set lastDepositResult - no toast needed\n\n // Mark deposit request as cancelled\n const requestToUpdate = state.depositRequests.find(\n (req) => req.id === currentDepositId,\n );\n if (requestToUpdate) {\n requestToUpdate.status = 'cancelled' as TransactionStatus;\n requestToUpdate.success = false;\n }\n });\n } else {\n // Transaction failed after confirmation - show error toast\n this.update((state) => {\n state.depositInProgress = false;\n state.lastDepositTransactionId = null;\n state.lastDepositResult = {\n success: false,\n error: errorMessage,\n amount: amount ?? '0',\n asset: USDC_SYMBOL, // Default asset for deposits\n timestamp: Date.now(),\n txHash: '',\n };\n\n // Update the deposit request by request ID to avoid race conditions\n if (state.depositRequests.length > 0) {\n const requestToUpdate = state.depositRequests.find(\n (req) => req.id === currentDepositId,\n );\n if (requestToUpdate) {\n requestToUpdate.status = 'failed' as TransactionStatus;\n requestToUpdate.success = false;\n }\n }\n });\n }\n });\n } else if (depositOrderResult) {\n // Track deposit request lifecycle for deposit+order flow\n depositOrderResult\n .then((actualTxHash) => {\n this.update((state) => {\n const requestToUpdate = state.depositRequests.find(\n (req) => req.id === currentDepositId,\n );\n if (requestToUpdate) {\n requestToUpdate.status = 'completed' as TransactionStatus;\n requestToUpdate.success = true;\n requestToUpdate.txHash = actualTxHash;\n }\n });\n return undefined;\n })\n .catch((error) => {\n const errorMessage = ensureError(\n error,\n 'PerpsController.depositWithOrder',\n ).message;\n const isCancellation =\n errorMessage.includes('User denied') ||\n errorMessage.includes('User rejected') ||\n errorMessage.includes('cancelled') ||\n errorMessage.includes('canceled');\n this.update((state) => {\n const requestToUpdate = state.depositRequests.find(\n (req) => req.id === currentDepositId,\n );\n if (requestToUpdate) {\n requestToUpdate.status = (\n isCancellation ? 'cancelled' : 'failed'\n ) as TransactionStatus;\n requestToUpdate.success = false;\n }\n });\n });\n }\n\n return {\n result,\n };\n } catch (error) {\n // Check if user denied/cancelled the transaction\n const errorMessage = ensureError(\n error,\n 'PerpsController.initiateDeposit',\n ).message;\n const userCancelled =\n errorMessage.includes('User denied') ||\n errorMessage.includes('User rejected') ||\n errorMessage.includes('User cancelled') ||\n errorMessage.includes('User canceled');\n\n if (!userCancelled) {\n // Only track actual errors, not user cancellations\n this.update((state) => {\n state.lastDepositTransactionId = null;\n // Note: lastDepositResult is already set in the catch block above\n\n // Mark deposit request as failed if one was created\n if (currentDepositId) {\n const request = state.depositRequests.find(\n (req) => req.id === currentDepositId,\n );\n if (request) {\n request.status = 'failed' as TransactionStatus;\n request.success = false;\n }\n }\n });\n }\n throw error;\n }\n }\n\n /**\n * Same as depositWithConfirmation - prepares transaction for confirmation screen.\n *\n * @returns A promise that resolves to the string result.\n */\n async depositWithOrder(): Promise<{ result: Promise<string> }> {\n return this.depositWithConfirmation({ placeOrder: true });\n }\n\n /**\n * Clear the last deposit result after it has been shown to the user\n */\n clearDepositResult(): void {\n this.update((state) => {\n state.lastDepositResult = null;\n });\n }\n\n clearWithdrawResult(): void {\n this.update((state) => {\n state.lastWithdrawResult = null;\n });\n }\n\n /**\n * Update withdrawal request status when it completes\n * This is called when a withdrawal is matched with a completed withdrawal from the API\n *\n * @param withdrawalId - The withdrawal transaction ID.\n * @param status - The current status.\n * @param txHash - The transaction hash.\n */\n updateWithdrawalStatus(\n withdrawalId: string,\n status: 'completed' | 'failed',\n txHash?: string,\n ): void {\n let withdrawalAmount: string | undefined;\n let shouldTrack = false;\n let found = false;\n\n this.update((state) => {\n const withdrawalIndex = state.withdrawalRequests.findIndex(\n (request) => request.id === withdrawalId,\n );\n\n if (withdrawalIndex >= 0) {\n found = true;\n const request = state.withdrawalRequests[withdrawalIndex];\n withdrawalAmount = request.amount;\n shouldTrack =\n withdrawalAmount !== undefined && request.status !== status;\n request.status = status;\n request.success = status === 'completed';\n if (txHash) {\n request.txHash = txHash;\n }\n\n // Clear withdrawal progress when withdrawal completes\n if (status === 'completed' || status === 'failed') {\n state.withdrawalProgress = {\n progress: 0,\n lastUpdated: Date.now(),\n activeWithdrawalId: null,\n };\n }\n }\n });\n\n if (shouldTrack && withdrawalAmount !== undefined) {\n this.#getMetrics().trackPerpsEvent(\n PerpsAnalyticsEvent.WithdrawalTransaction,\n {\n [PERPS_EVENT_PROPERTY.STATUS]:\n status === 'completed'\n ? PERPS_EVENT_VALUE.STATUS.COMPLETED\n : PERPS_EVENT_VALUE.STATUS.FAILED,\n [PERPS_EVENT_PROPERTY.WITHDRAWAL_AMOUNT]:\n Number.parseFloat(withdrawalAmount),\n },\n );\n }\n\n if (found) {\n this.#debugLog('PerpsController: Updated withdrawal status', {\n withdrawalId,\n status,\n txHash,\n });\n }\n }\n\n /**\n * Update withdrawal progress (persistent across navigation)\n *\n * @param progress - The progress indicator.\n * @param activeWithdrawalId - The active withdrawal ID.\n */\n updateWithdrawalProgress(\n progress: number,\n activeWithdrawalId: string | null = null,\n ): void {\n this.update((state) => {\n state.withdrawalProgress = {\n progress,\n lastUpdated: Date.now(),\n activeWithdrawalId,\n };\n });\n }\n\n /**\n * Get current withdrawal progress\n *\n * @returns The withdrawal progress, last update timestamp, and active withdrawal ID.\n */\n getWithdrawalProgress(): {\n progress: number;\n lastUpdated: number;\n activeWithdrawalId: string | null;\n } {\n return this.state.withdrawalProgress;\n }\n\n /**\n * Withdraw funds from trading account\n *\n * The withdrawal process varies by provider and may involve:\n * - Direct on-chain transfers\n * - Bridge operations\n * - Multi-step validation processes\n *\n * Check the specific provider documentation for detailed withdrawal flows.\n *\n * @param params Withdrawal parameters\n * @returns WithdrawResult with withdrawal ID and tracking info\n */\n async withdraw(params: WithdrawParams): Promise<WithdrawResult> {\n const provider = this.getActiveProvider();\n\n return this.#accountService.withdraw({\n provider,\n params,\n context: this.#createServiceContext('withdraw'),\n refreshAccountState: async () => {\n await this.getAccountState({ source: 'post_withdrawal' });\n },\n });\n }\n\n /**\n * Get current positions\n * Thin delegation to MarketDataService\n *\n * For standalone mode, bypasses getActiveProvider() to allow position queries\n * without full perps initialization (e.g., for showing positions on token details page)\n *\n * @param params - The operation parameters.\n * @returns Array of open positions for the active provider.\n */\n async getPositions(params?: GetPositionsParams): Promise<Position[]> {\n // For standalone mode, access provider directly without initialization check\n // This allows discovery use cases (checking if user has positions) without full perps setup\n if (params?.standalone && params.userAddress) {\n // Use activeProviderInstance if available (respects provider abstraction)\n // Fallback to cached standalone provider for pre-initialization discovery\n // TODO: When adding new providers (MYX), consider a provider factory pattern\n const provider =\n this.activeProviderInstance ?? this.#getOrCreateStandaloneProvider();\n return provider.getPositions(params);\n }\n\n const provider = this.getActiveProvider();\n return this.#marketDataService.getPositions({\n provider,\n params,\n context: this.#createServiceContext('getPositions'),\n });\n }\n\n /**\n * Get historical user fills (trade executions)\n * Thin delegation to MarketDataService\n *\n * @param params - The operation parameters.\n * @returns Array of historical trade executions (fills).\n */\n async getOrderFills(params?: GetOrderFillsParams): Promise<OrderFill[]> {\n const provider = this.getActiveProvider();\n return this.#marketDataService.getOrderFills({\n provider,\n params,\n context: this.#createServiceContext('getOrderFills'),\n });\n }\n\n /**\n * Get historical user orders (order lifecycle)\n * Thin delegation to MarketDataService\n *\n * @param params - The operation parameters.\n * @returns Array of historical orders.\n */\n async getOrders(params?: GetOrdersParams): Promise<Order[]> {\n const provider = this.getActiveProvider();\n return this.#marketDataService.getOrders({\n provider,\n params,\n context: this.#createServiceContext('getOrders'),\n });\n }\n\n /**\n * Get currently open orders (real-time status)\n * Thin delegation to MarketDataService\n *\n * For standalone mode, bypasses getActiveProvider() to allow open order queries\n * without full perps initialization (e.g., for background preloading)\n *\n * @param params - The operation parameters.\n * @returns A promise that resolves to the result.\n */\n async getOpenOrders(params?: GetOrdersParams): Promise<Order[]> {\n // For standalone mode, access provider directly without initialization check\n if (params?.standalone && params.userAddress) {\n const provider =\n this.activeProviderInstance ?? this.#getOrCreateStandaloneProvider();\n return provider.getOpenOrders(params);\n }\n\n const provider = this.getActiveProvider();\n return this.#marketDataService.getOpenOrders({\n provider,\n params,\n context: this.#createServiceContext('getOpenOrders'),\n });\n }\n\n /**\n * Get historical user funding history (funding payments)\n * Thin delegation to MarketDataService\n *\n * @param params - The operation parameters.\n * @returns Array of historical funding payments.\n */\n async getFunding(params?: GetFundingParams): Promise<Funding[]> {\n const provider = this.getActiveProvider();\n return this.#marketDataService.getFunding({\n provider,\n params,\n context: this.#createServiceContext('getFunding'),\n });\n }\n\n /**\n * Get account state (balances, etc.)\n * Thin delegation to MarketDataService\n *\n * For standalone mode, bypasses getActiveProvider() to allow account state queries\n * without full perps initialization (e.g., for checking if user has perps funds)\n *\n * @param params - The operation parameters.\n * @returns A promise that resolves to the result.\n */\n async getAccountState(params?: GetAccountStateParams): Promise<AccountState> {\n // For standalone mode, access provider directly without initialization check\n // This allows discovery use cases (checking if user has perps funds) without full perps setup\n if (params?.standalone && params.userAddress) {\n // Use activeProviderInstance if available (respects provider abstraction)\n // Fallback to cached standalone provider for pre-initialization discovery\n const provider =\n this.activeProviderInstance ?? this.#getOrCreateStandaloneProvider();\n return provider.getAccountState(params);\n }\n\n const provider = this.getActiveProvider();\n return this.#marketDataService.getAccountState({\n provider,\n params,\n context: this.#createServiceContext('getAccountState'),\n });\n }\n\n /**\n * Get historical portfolio data\n * Thin delegation to MarketDataService\n *\n * @param params - The operation parameters.\n * @returns The historical portfolio data points.\n */\n async getHistoricalPortfolio(\n params?: GetHistoricalPortfolioParams,\n ): Promise<HistoricalPortfolioResult> {\n const provider = this.getActiveProvider();\n return this.#marketDataService.getHistoricalPortfolio({\n provider,\n params,\n context: this.#createServiceContext('getHistoricalPortfolio'),\n });\n }\n\n /**\n * Get available markets with optional filtering\n * Thin delegation to MarketDataService\n *\n * For standalone mode, bypasses getActiveProvider() to allow market discovery\n * without full perps initialization (e.g., for discovery banners on spot screens)\n *\n * @param params - The operation parameters.\n * @returns Array of available markets matching the filter criteria.\n */\n async getMarkets(params?: GetMarketsParams): Promise<MarketInfo[]> {\n // For standalone mode, access provider directly without initialization check\n // This allows discovery use cases (checking if market exists) without full perps setup\n if (params?.standalone) {\n // Use activeProviderInstance if available (respects provider abstraction)\n // Fallback to cached standalone provider for pre-initialization discovery\n const provider =\n this.activeProviderInstance ?? this.#getOrCreateStandaloneProvider();\n return provider.getMarkets(params);\n }\n\n const provider = this.getActiveProvider();\n return this.#marketDataService.getMarkets({\n provider,\n params,\n context: this.#createServiceContext('getMarkets'),\n });\n }\n\n /**\n * Get market data with prices (includes price, volume, 24h change)\n *\n * For standalone mode, bypasses getActiveProvider() to allow market data queries\n * without full perps initialization (e.g., for background preloading on app start)\n *\n * @param params - The operation parameters.\n * @param params.standalone - Whether to use standalone mode.\n * @returns A promise that resolves to the market data.\n */\n async getMarketDataWithPrices(params?: {\n standalone?: boolean;\n }): Promise<PerpsMarketData[]> {\n if (params?.standalone) {\n // Use activeProviderInstance if available (respects provider abstraction)\n // Fallback to cached standalone provider for pre-initialization discovery\n const provider =\n this.activeProviderInstance ?? this.#getOrCreateStandaloneProvider();\n return provider.getMarketDataWithPrices();\n }\n\n const provider = this.getActiveProvider();\n return provider.getMarketDataWithPrices();\n }\n\n // ============================================================================\n // Market Data Preload (client-agnostic background caching)\n // ============================================================================\n\n /** State paths that the preload stateChange handler reads. */\n static readonly #preloadWatchedPaths = new Set([\n 'isTestnet',\n 'hip3ConfigVersion',\n ]);\n\n #preloadTimer: ReturnType<typeof setInterval> | null = null;\n\n #isPreloading = false;\n\n #isPreloadingUserData = false;\n\n #preloadStateUnsubscribe: (() => void) | null = null;\n\n #accountChangeUnsubscribe: (() => void) | null = null;\n\n #previousIsTestnet: boolean | null = null;\n\n #previousHip3ConfigVersion: number | null = null;\n\n static readonly #preloadRefreshMs = 5 * 60 * 1000; // 5 min\n\n static readonly #preloadGuardMs = 30_000; // 30s debounce\n\n /**\n * Start background market data preloading.\n * Fetches market data immediately and refreshes every 5 minutes.\n * Watches for isTestnet and hip3ConfigVersion changes to re-preload.\n */\n startMarketDataPreload(): void {\n if (this.#preloadTimer) {\n this.#debugLog('PerpsController: Preload already started, skipping');\n return;\n }\n\n this.#debugLog('PerpsController: Starting market data preload');\n\n // Track current values for change detection\n this.#previousIsTestnet = this.state.isTestnet;\n this.#previousHip3ConfigVersion = this.state.hip3ConfigVersion;\n\n // Immediate preload\n this.#performMarketDataPreload().catch(() => {\n /* fire-and-forget */\n });\n\n // Periodic refresh\n this.#preloadTimer = setInterval(() => {\n this.#performMarketDataPreload().catch(() => {\n /* fire-and-forget */\n });\n }, PerpsController.#preloadRefreshMs);\n\n // Watch for isTestnet / hip3ConfigVersion / cachedUserDataAddress changes\n const handler: StateChangeListener<PerpsControllerState> = (\n _state,\n patches,\n ) => {\n // Early-return when no watched field changed (skips ~46 unrelated updates)\n const hasRelevantChange = patches.some(\n (patch) =>\n typeof patch.path[0] === 'string' &&\n PerpsController.#preloadWatchedPaths.has(patch.path[0]),\n );\n if (!hasRelevantChange) {\n return;\n }\n\n const currentIsTestnet = this.state.isTestnet;\n const currentHip3Version = this.state.hip3ConfigVersion;\n\n const testnetChanged = currentIsTestnet !== this.#previousIsTestnet;\n const hip3Changed =\n currentHip3Version !== this.#previousHip3ConfigVersion;\n\n if (testnetChanged || hip3Changed) {\n this.#debugLog(\n 'PerpsController: Network/config changed, re-preloading',\n {\n testnetChanged,\n hip3Changed,\n isTestnet: currentIsTestnet,\n hip3ConfigVersion: currentHip3Version,\n },\n );\n\n this.#previousIsTestnet = currentIsTestnet;\n this.#previousHip3ConfigVersion = currentHip3Version;\n\n // Clear stale cache (market + user data)\n this.update((state) => {\n state.cachedMarketData = null;\n state.cachedMarketDataTimestamp = 0;\n state.cachedPositions = null;\n state.cachedOrders = null;\n state.cachedAccountState = null;\n state.cachedUserDataTimestamp = 0;\n state.cachedUserDataAddress = null;\n });\n\n this.#performMarketDataPreload().catch(() => {\n /* fire-and-forget */\n });\n }\n };\n\n this.messenger.subscribe('PerpsController:stateChange', handler);\n this.#preloadStateUnsubscribe = (): void => {\n this.messenger.unsubscribe('PerpsController:stateChange', handler);\n };\n\n // Watch for account changes via AccountTreeController\n const accountChangeHandler = (): void => {\n const evmAccount = getSelectedEvmAccount(\n this.messenger.call(\n 'AccountTreeController:getAccountsFromSelectedAccountGroup',\n ),\n );\n const currentAddress = evmAccount?.address ?? null;\n\n // If there's cached data from a different account (or no EVM account now), clear it\n if (\n this.state.cachedUserDataAddress !== null &&\n currentAddress !== this.state.cachedUserDataAddress\n ) {\n this.#debugLog(\n 'PerpsController: Account changed, clearing user data cache',\n );\n this.update((state) => {\n state.cachedPositions = null;\n state.cachedOrders = null;\n state.cachedAccountState = null;\n state.cachedUserDataTimestamp = 0;\n state.cachedUserDataAddress = null;\n });\n // Only preload if the new account is an EVM account\n if (currentAddress) {\n this.#performUserDataPreload().catch(() => {\n /* fire-and-forget */\n });\n }\n }\n };\n this.messenger.subscribe(\n 'AccountTreeController:selectedAccountGroupChange',\n accountChangeHandler,\n );\n this.#accountChangeUnsubscribe = (): void => {\n this.messenger.unsubscribe(\n 'AccountTreeController:selectedAccountGroupChange',\n accountChangeHandler,\n );\n };\n }\n\n /**\n * Stop background market data preloading.\n */\n stopMarketDataPreload(): void {\n this.#debugLog('PerpsController: Stopping market data preload');\n if (this.#preloadTimer) {\n clearInterval(this.#preloadTimer);\n this.#preloadTimer = null;\n }\n if (this.#preloadStateUnsubscribe) {\n this.#preloadStateUnsubscribe();\n this.#preloadStateUnsubscribe = null;\n }\n if (this.#accountChangeUnsubscribe) {\n this.#accountChangeUnsubscribe();\n this.#accountChangeUnsubscribe = null;\n }\n this.#previousIsTestnet = null;\n this.#previousHip3ConfigVersion = null;\n this.#cleanupStandaloneProvider().catch(() => {\n /* fire-and-forget to preserve sync signature */\n });\n }\n\n /**\n * Perform a single market data preload (best-effort, no throw).\n */\n async #performMarketDataPreload(): Promise<void> {\n if (this.#isPreloading) {\n return;\n }\n\n const now = Date.now();\n if (\n now - this.state.cachedMarketDataTimestamp <\n PerpsController.#preloadGuardMs\n ) {\n return;\n }\n\n this.#isPreloading = true;\n const traceId = uuidv4();\n const preloadStart = performance.now();\n let traceData:\n | { success: boolean; marketCount?: number; error?: string }\n | undefined;\n\n try {\n this.#options.infrastructure.tracer.trace({\n name: PerpsTraceNames.MarketDataPreload,\n id: traceId,\n op: PerpsTraceOperations.Operation,\n tags: {\n provider: this.state.activeProvider,\n isTestnet: this.state.isTestnet,\n },\n });\n\n this.#debugLog('PerpsController: Fetching market data in background');\n const data = await this.getMarketDataWithPrices({ standalone: true });\n\n this.update((state) => {\n state.cachedMarketData = data;\n state.cachedMarketDataTimestamp = Date.now();\n });\n\n this.#debugLog('PerpsController: Market data preloaded', {\n marketCount: data.length,\n });\n\n traceData = { success: true, marketCount: data.length };\n\n this.#options.infrastructure.tracer.setMeasurement(\n PerpsMeasurementName.PerpsMarketDataPreload,\n performance.now() - preloadStart,\n 'millisecond',\n );\n\n // Also preload user data (fire-and-forget, non-blocking)\n this.#performUserDataPreload().catch(() => {\n /* fire-and-forget */\n });\n } catch (error) {\n traceData = {\n success: false,\n error: ensureError(error, 'PerpsController.performMarketDataPreload')\n .message,\n };\n this.#logError(\n ensureError(error, 'PerpsController.performMarketDataPreload'),\n this.#getErrorContext('performMarketDataPreload', {\n message: 'Background preload failed',\n }),\n );\n } finally {\n this.#options.infrastructure.tracer.endTrace({\n name: PerpsTraceNames.MarketDataPreload,\n id: traceId,\n data: traceData,\n });\n this.#isPreloading = false;\n }\n }\n\n /**\n * Perform a single user data preload (best-effort, no throw).\n * Fetches positions, open orders, and account state via lightweight REST calls.\n */\n async #performUserDataPreload(): Promise<void> {\n if (this.#isPreloadingUserData) {\n return;\n }\n\n // Get current user address\n const evmAccount = getSelectedEvmAccount(\n this.messenger.call(\n 'AccountTreeController:getAccountsFromSelectedAccountGroup',\n ),\n );\n if (!evmAccount?.address) {\n return;\n }\n\n const userAddress = evmAccount.address;\n\n // Skip if cache is fresh and for same account\n const now = Date.now();\n if (\n this.state.cachedUserDataAddress === userAddress &&\n now - this.state.cachedUserDataTimestamp < PerpsController.#preloadGuardMs\n ) {\n return;\n }\n\n // Skip standalone REST polling when WebSocket is connected — live data is streaming\n if (\n this.getWebSocketConnectionState() === WebSocketConnectionState.Connected\n ) {\n this.#debugLog(\n 'PerpsController: Skipping user data preload — WebSocket connected',\n );\n return;\n }\n\n this.#isPreloadingUserData = true;\n const traceId = uuidv4();\n const preloadStart = performance.now();\n let traceData:\n | {\n success: boolean;\n positionCount?: number;\n orderCount?: number;\n error?: string;\n }\n | undefined;\n\n try {\n this.#options.infrastructure.tracer.trace({\n name: PerpsTraceNames.UserDataPreload,\n id: traceId,\n op: PerpsTraceOperations.Operation,\n tags: {\n provider: this.state.activeProvider,\n isTestnet: this.state.isTestnet,\n },\n data: { userAddress },\n });\n\n this.#debugLog('PerpsController: Fetching user data in background', {\n userAddress,\n });\n\n const [positions, orders, accountState] = await Promise.all([\n this.getPositions({ standalone: true, userAddress }),\n this.getOpenOrders({ standalone: true, userAddress }),\n this.getAccountState({ standalone: true, userAddress }),\n ]);\n\n this.update((state) => {\n state.cachedPositions = positions;\n state.cachedOrders = orders;\n state.cachedAccountState = accountState;\n state.cachedUserDataTimestamp = Date.now();\n state.cachedUserDataAddress = userAddress;\n });\n\n this.#debugLog('PerpsController: User data preloaded', {\n positionCount: positions.length,\n orderCount: orders.length,\n totalBalance: accountState.totalBalance,\n });\n\n traceData = {\n success: true,\n positionCount: positions.length,\n orderCount: orders.length,\n };\n\n this.#options.infrastructure.tracer.setMeasurement(\n PerpsMeasurementName.PerpsUserDataPreload,\n performance.now() - preloadStart,\n 'millisecond',\n );\n } catch (error) {\n traceData = {\n success: false,\n error: ensureError(error, 'PerpsController.performUserDataPreload')\n .message,\n };\n this.#logError(\n ensureError(error, 'PerpsController.performUserDataPreload'),\n this.#getErrorContext('performUserDataPreload', {\n message: 'Background user data preload failed',\n }),\n );\n } finally {\n this.#options.infrastructure.tracer.endTrace({\n name: PerpsTraceNames.UserDataPreload,\n id: traceId,\n data: traceData,\n });\n this.#isPreloadingUserData = false;\n }\n }\n\n /**\n * Get list of available HIP-3 builder-deployed DEXs\n *\n * @param params - Optional parameters for filtering\n * @returns Array of DEX names\n */\n async getAvailableDexs(params?: GetAvailableDexsParams): Promise<string[]> {\n const provider = this.getActiveProvider();\n const context = this.#createServiceContext('getAvailableDexs');\n return this.#marketDataService.getAvailableDexs({\n provider,\n params,\n context,\n });\n }\n\n /**\n * Fetch historical candle data\n * Thin delegation to MarketDataService\n *\n * @param options - The configuration options.\n * @param options.symbol - The trading pair symbol.\n * @param options.interval - The candle interval period.\n * @param options.limit - Maximum number of items to fetch.\n * @param options.endTime - End timestamp in milliseconds.\n * @returns The historical candle data for the requested symbol and interval.\n */\n async fetchHistoricalCandles(options: {\n symbol: string;\n interval: CandlePeriod;\n limit?: number;\n endTime?: number;\n }): Promise<CandleData> {\n const { symbol, interval, limit = 100, endTime } = options;\n const provider = this.getActiveProvider();\n return this.#marketDataService.fetchHistoricalCandles({\n provider,\n symbol,\n interval,\n limit,\n endTime,\n context: this.#createServiceContext('fetchHistoricalCandles'),\n });\n }\n\n /**\n * Calculate liquidation price for a position\n * Uses provider-specific formulas based on protocol rules\n *\n * @param params - The operation parameters.\n * @returns A promise that resolves to the string result.\n */\n async calculateLiquidationPrice(\n params: LiquidationPriceParams,\n ): Promise<string> {\n const provider = this.getActiveProvider();\n const context = this.#createServiceContext('calculateLiquidationPrice');\n return this.#marketDataService.calculateLiquidationPrice({\n provider,\n params,\n context,\n });\n }\n\n /**\n * Calculate maintenance margin for a specific asset\n * Returns a percentage (e.g., 0.0125 for 1.25%)\n *\n * @param params - The operation parameters.\n * @returns A promise that resolves to the numeric result.\n */\n async calculateMaintenanceMargin(\n params: MaintenanceMarginParams,\n ): Promise<number> {\n const provider = this.getActiveProvider();\n const context = this.#createServiceContext('calculateMaintenanceMargin');\n return this.#marketDataService.calculateMaintenanceMargin({\n provider,\n params,\n context,\n });\n }\n\n /**\n * Get maximum leverage allowed for an asset\n *\n * @param asset - The asset identifier.\n * @returns A promise that resolves to the numeric result.\n */\n async getMaxLeverage(asset: string): Promise<number> {\n const provider = this.getActiveProvider();\n const context = this.#createServiceContext('getMaxLeverage');\n return this.#marketDataService.getMaxLeverage({ provider, asset, context });\n }\n\n /**\n * Validate order parameters according to protocol-specific rules\n *\n * @param params - The operation parameters.\n * @returns True if the condition is met.\n */\n async validateOrder(\n params: OrderParams,\n ): Promise<{ isValid: boolean; error?: string }> {\n const provider = this.getActiveProvider();\n const context = this.#createServiceContext('validateOrder');\n return this.#marketDataService.validateOrder({ provider, params, context });\n }\n\n /**\n * Validate close position parameters according to protocol-specific rules\n *\n * @param params - The operation parameters.\n * @returns A promise that resolves to the result.\n */\n async validateClosePosition(\n params: ClosePositionParams,\n ): Promise<{ isValid: boolean; error?: string }> {\n const provider = this.getActiveProvider();\n const context = this.#createServiceContext('validateClosePosition');\n return this.#marketDataService.validateClosePosition({\n provider,\n params,\n context,\n });\n }\n\n /**\n * Validate withdrawal parameters according to protocol-specific rules\n *\n * @param params - The operation parameters.\n * @returns True if the condition is met.\n */\n async validateWithdrawal(\n params: WithdrawParams,\n ): Promise<{ isValid: boolean; error?: string }> {\n const provider = this.getActiveProvider();\n return this.#accountService.validateWithdrawal({ provider, params });\n }\n\n /**\n * Get supported withdrawal routes - returns complete asset and routing information\n *\n * @returns Array of supported asset routes for withdrawals.\n */\n getWithdrawalRoutes(): AssetRoute[] {\n try {\n const provider = this.getActiveProvider();\n return this.#marketDataService.getWithdrawalRoutes({ provider });\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.getWithdrawalRoutes'),\n this.#getErrorContext('getWithdrawalRoutes'),\n );\n // Return empty array if provider is not available\n return [];\n }\n }\n\n /**\n * Toggle between testnet and mainnet\n *\n * @returns The toggle result with success status and current network mode.\n */\n async toggleTestnet(): Promise<ToggleTestnetResult> {\n // Prevent concurrent reinitializations\n if (this.isCurrentlyReinitializing()) {\n this.#debugLog(\n 'PerpsController: Already reinitializing, skipping toggle',\n {\n timestamp: new Date().toISOString(),\n },\n );\n return {\n success: false,\n isTestnet: this.state.isTestnet,\n error: PERPS_ERROR_CODES.CLIENT_REINITIALIZING,\n };\n }\n\n this.#isReinitializing = true;\n\n // Store previous isTestnet for rollback on failure\n const previousIsTestnet = this.state.isTestnet;\n\n try {\n await this.#cleanupStandaloneProvider();\n\n const previousNetwork = previousIsTestnet ? 'testnet' : 'mainnet';\n\n this.update((state) => {\n state.isTestnet = !state.isTestnet;\n });\n\n const newNetwork = this.state.isTestnet ? 'testnet' : 'mainnet';\n\n this.#debugLog('PerpsController: Network toggle initiated', {\n from: previousNetwork,\n to: newNetwork,\n timestamp: new Date().toISOString(),\n });\n\n // Reset initialization state and reinitialize provider with new testnet setting\n this.isInitialized = false;\n this.#initializationPromise = null;\n await this.init();\n\n // Check if initialization actually succeeded — performInitialization()\n // does not throw on failure, it sets state to Failed and resolves.\n if (this.state.initializationState === InitializationState.Failed) {\n throw new Error(\n this.state.initializationError ??\n 'Network toggle initialization failed',\n );\n }\n\n this.#debugLog('PerpsController: Network toggle completed', {\n newNetwork,\n isTestnet: this.state.isTestnet,\n timestamp: new Date().toISOString(),\n });\n\n return { success: true, isTestnet: this.state.isTestnet };\n } catch (error) {\n // Rollback isTestnet to previous value\n this.update((state) => {\n state.isTestnet = previousIsTestnet;\n });\n\n return {\n success: false,\n isTestnet: this.state.isTestnet,\n error: ensureError(error, 'PerpsController.toggleTestnet').message,\n };\n } finally {\n this.#isReinitializing = false;\n }\n }\n\n /**\n * Switch to a different provider\n * Uses a full reinit approach: disconnect() → update state → init()\n * This ensures complete state reset including WebSocket connections and caches.\n *\n * @param providerId - The provider identifier.\n * @returns The switch result with success status and active provider.\n */\n async switchProvider(\n providerId: PerpsActiveProviderMode,\n ): Promise<SwitchProviderResult> {\n // No-op if already on this provider (regardless of init state)\n if (this.state.activeProvider === providerId) {\n return { success: true, providerId };\n }\n\n // Validate provider is available\n // 'aggregated' is always valid, individual providers must exist in the map\n const isValidProvider =\n providerId === 'aggregated' || this.providers.has(providerId);\n\n if (!isValidProvider) {\n return {\n success: false,\n providerId: this.state.activeProvider,\n error: `Provider ${providerId} not available`,\n };\n }\n\n // Prevent concurrent switches\n if (this.isCurrentlyReinitializing()) {\n return {\n success: false,\n providerId: this.state.activeProvider,\n error: PERPS_ERROR_CODES.CLIENT_REINITIALIZING,\n };\n }\n\n this.#isReinitializing = true;\n\n // Store previous provider for rollback on failure\n const previousProvider = this.state.activeProvider;\n\n try {\n await this.#cleanupStandaloneProvider();\n\n this.#debugLog('PerpsController: Provider switch initiated', {\n from: previousProvider,\n to: providerId,\n timestamp: new Date().toISOString(),\n });\n\n // Provider disconnect is handled by performInitialization() during\n // reinitialization. The disconnect() method skips provider teardown\n // when isReinitializing is true to prevent double-disconnect.\n\n // Update state with new provider\n this.update((state) => {\n state.activeProvider = providerId;\n state.accountState = null;\n state.initializationState = InitializationState.Uninitialized;\n });\n\n // Reset initialization state and reinitialize\n this.isInitialized = false;\n this.#initializationPromise = null;\n await this.init();\n\n // Check if initialization actually succeeded — performInitialization()\n // does not throw on failure, it sets state to Failed and resolves.\n if (this.state.initializationState === InitializationState.Failed) {\n throw new Error(\n this.state.initializationError ?? 'Provider initialization failed',\n );\n }\n\n this.#debugLog('PerpsController: Provider switch completed', {\n providerId,\n timestamp: new Date().toISOString(),\n });\n\n return { success: true, providerId };\n } catch (error) {\n // Rollback state to previous provider\n this.update((state) => {\n state.activeProvider = previousProvider;\n });\n\n this.#logError(\n ensureError(error, 'PerpsController.switchProvider'),\n this.#getErrorContext('switchProvider', { providerId }),\n );\n\n // Attempt to reinitialize the previous provider via init(),\n // which handles all provider modes including 'aggregated'.\n try {\n this.isInitialized = false;\n this.#initializationPromise = null;\n await this.init();\n\n this.#debugLog(\n 'PerpsController: Rollback to previous provider succeeded',\n {\n previousProvider,\n timestamp: new Date().toISOString(),\n },\n );\n } catch (reinitError) {\n // Reinit also failed — mark as failed\n this.update((state) => {\n state.initializationState = InitializationState.Failed;\n });\n this.#logError(\n ensureError(reinitError, 'PerpsController.switchProvider.rollback'),\n this.#getErrorContext('switchProvider.rollback', {\n previousProvider,\n }),\n );\n }\n\n return {\n success: false,\n providerId: previousProvider,\n error:\n error instanceof Error\n ? error.message\n : PERPS_ERROR_CODES.UNKNOWN_ERROR,\n };\n } finally {\n this.#isReinitializing = false;\n }\n }\n\n /**\n * Get current network (mainnet/testnet)\n *\n * @returns Either 'mainnet' or 'testnet' based on the current configuration.\n */\n getCurrentNetwork(): 'mainnet' | 'testnet' {\n return this.state.isTestnet ? 'testnet' : 'mainnet';\n }\n\n /**\n * Get the current WebSocket connection state from the active provider.\n * Used by the UI to monitor connection health and show notifications.\n *\n * @returns The current WebSocket connection state, or DISCONNECTED if not supported\n */\n getWebSocketConnectionState(): WebSocketConnectionState {\n try {\n const provider = this.getActiveProvider();\n if (provider.getWebSocketConnectionState) {\n return provider.getWebSocketConnectionState();\n }\n // Fallback for providers that don't support this method\n return WebSocketConnectionState.Disconnected;\n } catch {\n // If no provider is active, return disconnected\n return WebSocketConnectionState.Disconnected;\n }\n }\n\n /**\n * Subscribe to WebSocket connection state changes from the active provider.\n * The listener will be called immediately with the current state and whenever the state changes.\n *\n * @param listener - Callback function that receives the new connection state and reconnection attempt\n * @returns Unsubscribe function to remove the listener, or no-op if not supported\n */\n subscribeToConnectionState(\n listener: (\n state: WebSocketConnectionState,\n reconnectionAttempt: number,\n ) => void,\n ): () => void {\n try {\n const provider = this.getActiveProvider();\n if (provider.subscribeToConnectionState) {\n return provider.subscribeToConnectionState(listener);\n }\n // Fallback: immediately call with current state and return no-op unsubscribe\n listener(this.getWebSocketConnectionState(), 0);\n return () => {\n // No-op\n };\n } catch {\n // If no provider is active, call with disconnected and return no-op\n listener(WebSocketConnectionState.Disconnected, 0);\n return () => {\n // No-op\n };\n }\n }\n\n /**\n * Manually trigger a WebSocket reconnection attempt.\n * Used by the UI retry button when connection is lost.\n */\n async reconnect(): Promise<void> {\n this.#debugLog('[PerpsController] reconnect() called');\n try {\n const provider = this.getActiveProvider();\n if (provider.reconnect) {\n this.#debugLog('[PerpsController] Delegating to provider.reconnect()');\n await provider.reconnect();\n this.#debugLog('[PerpsController] provider.reconnect() completed');\n } else {\n this.#debugLog(\n '[PerpsController] Provider does not support reconnect()',\n );\n }\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.reconnect'),\n this.#getErrorContext('reconnect', {\n operation: 'websocket_reconnect',\n }),\n );\n }\n }\n\n // Live data delegation (NO Redux) - delegates to active provider\n\n /**\n * Subscribe to live price updates\n *\n * @param params - The operation parameters.\n * @returns A cleanup function to remove the subscription.\n */\n subscribeToPrices(params: SubscribePricesParams): () => void {\n const provider = this.getActiveProviderOrNull();\n if (!provider) {\n return () => {\n // No-op: Provider not initialized\n };\n }\n try {\n return provider.subscribeToPrices(params);\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.subscribeToPrices'),\n this.#getErrorContext('subscribeToPrices', {\n symbols: params.symbols?.join(','),\n }),\n );\n return () => {\n // No-op\n };\n }\n }\n\n /**\n * Subscribe to live position updates\n *\n * @param params - The operation parameters.\n * @returns A cleanup function to remove the subscription.\n */\n subscribeToPositions(params: SubscribePositionsParams): () => void {\n const provider = this.getActiveProviderOrNull();\n if (!provider) {\n return () => {\n // No-op: Provider not initialized\n };\n }\n try {\n return provider.subscribeToPositions(params);\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.subscribeToPositions'),\n this.#getErrorContext('subscribeToPositions', {\n accountId: params.accountId,\n }),\n );\n return () => {\n // No-op\n };\n }\n }\n\n /**\n * Subscribe to live order fill updates\n *\n * @param params - The operation parameters.\n * @returns A cleanup function to remove the subscription.\n */\n subscribeToOrderFills(params: SubscribeOrderFillsParams): () => void {\n const provider = this.getActiveProviderOrNull();\n if (!provider) {\n return () => {\n // No-op: Provider not initialized\n };\n }\n try {\n return provider.subscribeToOrderFills(params);\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.subscribeToOrderFills'),\n this.#getErrorContext('subscribeToOrderFills', {\n accountId: params.accountId,\n }),\n );\n return () => {\n // No-op\n };\n }\n }\n\n /**\n * Subscribe to live order updates\n *\n * @param params - The operation parameters.\n * @returns A cleanup function to remove the subscription.\n */\n subscribeToOrders(params: SubscribeOrdersParams): () => void {\n const provider = this.getActiveProviderOrNull();\n if (!provider) {\n return () => {\n // No-op: Provider not initialized\n };\n }\n try {\n return provider.subscribeToOrders(params);\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.subscribeToOrders'),\n this.#getErrorContext('subscribeToOrders', {\n accountId: params.accountId,\n }),\n );\n return () => {\n // No-op\n };\n }\n }\n\n /**\n * Subscribe to live account updates.\n * Updates controller state (Redux) when new account data arrives so consumers\n * like usePerpsBalanceTokenFilter (PayWithModal) see the latest balance.\n *\n * @param params - The operation parameters.\n * @returns A cleanup function to remove the subscription.\n */\n subscribeToAccount(params: SubscribeAccountParams): () => void {\n const provider = this.getActiveProviderOrNull();\n if (!provider) {\n return () => {\n // No-op: Provider not initialized\n };\n }\n try {\n const originalCallback = params.callback;\n return provider.subscribeToAccount({\n ...params,\n callback: (account: AccountState | null) => {\n if (account) {\n this.update((state) => {\n state.accountState = account;\n state.lastUpdateTimestamp = Date.now();\n state.lastError = null;\n });\n }\n originalCallback(account);\n },\n });\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.subscribeToAccount'),\n this.#getErrorContext('subscribeToAccount', {\n accountId: params.accountId,\n }),\n );\n return () => {\n // No-op\n };\n }\n }\n\n /**\n * Subscribe to full order book updates with multiple depth levels\n * Creates a dedicated L2Book subscription for real-time order book data\n *\n * @param params - The operation parameters.\n * @returns A cleanup function to remove the subscription.\n */\n subscribeToOrderBook(params: SubscribeOrderBookParams): () => void {\n const provider = this.getActiveProviderOrNull();\n if (!provider) {\n return () => {\n // No-op: Provider not initialized\n };\n }\n try {\n return provider.subscribeToOrderBook(params);\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.subscribeToOrderBook'),\n this.#getErrorContext('subscribeToOrderBook', {\n symbol: params.symbol,\n levels: params.levels,\n }),\n );\n return () => {\n // No-op\n };\n }\n }\n\n /**\n * Subscribe to live candle updates\n *\n * @param params - The operation parameters.\n * @returns A cleanup function to remove the subscription.\n */\n subscribeToCandles(params: SubscribeCandlesParams): () => void {\n const provider = this.getActiveProviderOrNull();\n if (!provider) {\n return () => {\n // No-op: Provider not initialized\n };\n }\n try {\n return provider.subscribeToCandles(params);\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.subscribeToCandles'),\n this.#getErrorContext('subscribeToCandles', {\n symbol: params.symbol,\n interval: params.interval,\n duration: params.duration,\n }),\n );\n return () => {\n // No-op\n };\n }\n }\n\n /**\n * Subscribe to open interest cap updates\n * Zero additional network overhead - data comes from existing webData3 subscription\n *\n * @param params - The operation parameters.\n * @returns A cleanup function to remove the subscription.\n */\n subscribeToOICaps(params: SubscribeOICapsParams): () => void {\n const provider = this.getActiveProviderOrNull();\n if (!provider) {\n return () => {\n // No-op: Provider not initialized\n };\n }\n try {\n return provider.subscribeToOICaps(params);\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.subscribeToOICaps'),\n this.#getErrorContext('subscribeToOICaps', {\n accountId: params.accountId,\n }),\n );\n return () => {\n // No-op\n };\n }\n }\n\n /**\n * Configure live data throttling\n *\n * @param config - The configuration object.\n */\n setLiveDataConfig(config: Partial<LiveDataConfig>): void {\n try {\n const provider = this.getActiveProvider();\n provider.setLiveDataConfig(config);\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.setLiveDataConfig'),\n this.#getErrorContext('setLiveDataConfig'),\n );\n }\n }\n\n /**\n * Calculate trading fees for the active provider\n * Each provider implements its own fee structure\n *\n * @param params - The operation parameters.\n * @returns The fee calculation result for the trade.\n */\n async calculateFees(\n params: FeeCalculationParams,\n ): Promise<FeeCalculationResult> {\n const provider = this.getActiveProvider();\n const context = this.#createServiceContext('calculateFees');\n return this.#marketDataService.calculateFees({ provider, params, context });\n }\n\n /**\n * Disconnect provider and cleanup subscriptions\n * Call this when navigating away from Perps screens to prevent battery drain\n */\n async disconnect(): Promise<void> {\n this.#debugLog(\n 'PerpsController: Disconnecting provider to cleanup subscriptions',\n {\n timestamp: new Date().toISOString(),\n },\n );\n\n // Stop preload interval and messenger subscriptions first,\n // so no background work fires while we tear down providers.\n if (this.#preloadTimer) {\n clearInterval(this.#preloadTimer);\n this.#preloadTimer = null;\n }\n if (this.#preloadStateUnsubscribe) {\n this.#preloadStateUnsubscribe();\n this.#preloadStateUnsubscribe = null;\n }\n if (this.#accountChangeUnsubscribe) {\n this.#accountChangeUnsubscribe();\n this.#accountChangeUnsubscribe = null;\n }\n this.#previousIsTestnet = null;\n this.#previousHip3ConfigVersion = null;\n\n // Only disconnect the provider if we're initialized\n if (this.isInitialized && !this.isCurrentlyReinitializing()) {\n try {\n const provider = this.getActiveProvider();\n await provider.disconnect();\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.disconnect'),\n this.#getErrorContext('disconnect'),\n );\n }\n }\n\n // Clear stale reference so standalone reads don't route through old provider\n this.activeProviderInstance = null;\n\n // Cleanup cached standalone provider (if any) — awaited to prevent races\n await this.#cleanupStandaloneProvider();\n\n // Note: Feature-flag subscription is NOT cleaned up here.\n // It is a controller-lifetime concern (set once in the constructor),\n // not a session-lifetime concern. Unsubscribing here would break\n // geo-blocking / HIP-3 flag propagation after disconnect → reconnect.\n\n // Reset initialization state to ensure proper reconnection\n this.isInitialized = false;\n this.#initializationPromise = null;\n }\n\n /**\n * Eligibility (Geo-Blocking)\n */\n\n /**\n * Activates geo-blocking eligibility monitoring.\n * Call this after onboarding is complete when the controller was constructed\n * with `deferEligibilityCheck: true`.\n *\n * Reads the current RemoteFeatureFlagController state, performs the initial\n * eligibility check, and unblocks the existing stateChange subscription so\n * future feature-flag updates flow through normally.\n * Safe to call multiple times; subsequent calls simply re-check eligibility.\n */\n startEligibilityMonitoring(): void {\n this.#eligibilityCheckDeferred = false;\n\n try {\n const currentState = this.messenger.call(\n 'RemoteFeatureFlagController:getState',\n );\n this.refreshEligibilityOnFeatureFlagChange(currentState);\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.startEligibilityMonitoring'),\n this.#getErrorContext('startEligibilityMonitoring', {\n operation: 'readRemoteFeatureFlags',\n }),\n );\n }\n }\n\n /**\n * Stops geo-blocking eligibility monitoring.\n * Call this when the user disables basic functionality (e.g. useExternalServices becomes false).\n * Prevents geolocation calls until startEligibilityMonitoring() is called again.\n * Safe to call multiple times.\n */\n stopEligibilityMonitoring(): void {\n this.#eligibilityCheckDeferred = true;\n }\n\n /**\n * Refresh eligibility status\n */\n async refreshEligibility(): Promise<void> {\n if (this.#eligibilityCheckDeferred) {\n return;\n }\n\n // Capture the current version before starting the async operation.\n // This prevents race conditions where stale eligibility checks\n // (started with fallback config) overwrite results from newer checks\n // (started with remote config after it was fetched).\n const versionAtStart = this.#blockedRegionListVersion;\n\n try {\n // TODO: It would be good to have this location before we call this async function to avoid the race condition\n const isEligible = await this.#eligibilityService.checkEligibility({\n blockedRegions: this.blockedRegionList.list,\n });\n\n // Only update state if the blocked region list hasn't changed while we were awaiting.\n // This prevents stale fallback-based eligibility checks from overwriting\n // results from remote-based checks.\n if (this.#blockedRegionListVersion !== versionAtStart) {\n return;\n }\n\n this.update((state) => {\n state.isEligible = isEligible;\n });\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.refreshEligibility'),\n this.#getErrorContext('refreshEligibility'),\n );\n\n // Only update on error if version is still current\n if (this.#blockedRegionListVersion === versionAtStart) {\n // Default to eligible on error\n this.update((state) => {\n state.isEligible = true;\n });\n }\n }\n }\n\n /**\n * Get block explorer URL for an address or just the base URL\n *\n * @param address - Optional address to append to the base URL\n * @returns Block explorer URL\n */\n getBlockExplorerUrl(address?: string): string {\n const provider = this.getActiveProvider();\n return this.#marketDataService.getBlockExplorerUrl({ provider, address });\n }\n\n /**\n * Check if user is first-time for the current network\n *\n * @returns True if the condition is met.\n */\n isFirstTimeUserOnCurrentNetwork(): boolean {\n const currentNetwork = this.state.isTestnet ? 'testnet' : 'mainnet';\n return this.state.isFirstTimeUser[currentNetwork];\n }\n\n /**\n * Mark that the user has completed the tutorial/onboarding\n * This prevents the tutorial from showing again\n */\n markTutorialCompleted(): void {\n const currentNetwork = this.state.isTestnet ? 'testnet' : 'mainnet';\n\n this.#debugLog('PerpsController: Marking tutorial as completed', {\n timestamp: new Date().toISOString(),\n network: currentNetwork,\n });\n\n this.update((state) => {\n state.isFirstTimeUser[currentNetwork] = false;\n });\n }\n\n /*\n * Mark that user has placed their first successful order\n * This prevents the notification tooltip from showing again\n */\n markFirstOrderCompleted(): void {\n const currentNetwork = this.state.isTestnet ? 'testnet' : 'mainnet';\n\n this.#debugLog('PerpsController: Marking first order completed', {\n timestamp: new Date().toISOString(),\n network: currentNetwork,\n });\n\n this.update((state) => {\n state.hasPlacedFirstOrder[currentNetwork] = true;\n });\n }\n\n /**\n * Reset first-time user state for both networks\n * This is useful for testing the tutorial flow\n * Called by Reset Account feature in settings\n */\n resetFirstTimeUserState(): void {\n this.#debugLog('PerpsController: Resetting first-time user state', {\n timestamp: new Date().toISOString(),\n previousState: this.state.isFirstTimeUser,\n });\n\n this.update((state) => {\n state.isFirstTimeUser = {\n testnet: true,\n mainnet: true,\n };\n state.hasPlacedFirstOrder = {\n testnet: false,\n mainnet: false,\n };\n });\n }\n\n /**\n * Clear pending/bridging withdrawal and deposit requests\n * This is useful when users want to clear stuck pending indicators\n * Called by Reset Account feature in settings\n */\n clearPendingTransactionRequests(): void {\n this.#debugLog('PerpsController: Clearing pending transaction requests', {\n timestamp: new Date().toISOString(),\n });\n\n this.update((state) => {\n // Filter out pending/bridging withdrawals, keep completed/failed for history\n state.withdrawalRequests = state.withdrawalRequests.filter(\n (req) => req.status !== 'pending' && req.status !== 'bridging',\n );\n\n // Filter out pending deposits, keep completed/failed for history\n state.depositRequests = state.depositRequests.filter(\n (req) => req.status !== 'pending' && req.status !== 'bridging',\n );\n\n // Reset withdrawal progress\n state.withdrawalProgress = {\n progress: 0,\n lastUpdated: Date.now(),\n activeWithdrawalId: null,\n };\n });\n }\n\n /**\n * Get saved trade configuration for a market\n *\n * @param symbol - The trading pair symbol.\n * @returns The resulting string value.\n */\n getTradeConfiguration(symbol: string): { leverage?: number } | undefined {\n const network = this.state.isTestnet ? 'testnet' : 'mainnet';\n const config = this.state.tradeConfigurations[network]?.[symbol];\n\n if (!config?.leverage) {\n return undefined;\n }\n\n this.#debugLog('PerpsController: Retrieved trade config', {\n symbol,\n network,\n leverage: config.leverage,\n });\n\n return { leverage: config.leverage };\n }\n\n /**\n * Save trade configuration for a market\n *\n * @param symbol - Market symbol\n * @param leverage - Leverage value\n */\n saveTradeConfiguration(symbol: string, leverage: number): void {\n const network = this.state.isTestnet ? 'testnet' : 'mainnet';\n\n this.#debugLog('PerpsController: Saving trade configuration', {\n symbol,\n network,\n leverage,\n timestamp: new Date().toISOString(),\n });\n\n this.update((state) => {\n if (!state.tradeConfigurations[network]) {\n state.tradeConfigurations[network] = {};\n }\n\n const existingConfig = state.tradeConfigurations[network][symbol] || {};\n state.tradeConfigurations[network][symbol] = {\n ...existingConfig,\n leverage,\n };\n });\n }\n\n /**\n * Save pending trade configuration for a market\n * This is a temporary configuration that expires after 5 minutes\n *\n * @param symbol - Market symbol\n * @param config - Pending trade configuration (includes optional selected payment token from Pay row)\n * @param config.amount - The amount value.\n * @param config.leverage - The leverage multiplier.\n * @param config.takeProfitPrice - The take profit price.\n * @param config.stopLossPrice - The stop loss price.\n * @param config.limitPrice - The limit price.\n * @param config.orderType - The order type.\n * @param config.selectedPaymentToken - The selected payment token.\n */\n savePendingTradeConfiguration(\n symbol: string,\n config: {\n amount?: string;\n leverage?: number;\n takeProfitPrice?: string;\n stopLossPrice?: string;\n limitPrice?: string;\n orderType?: OrderType;\n /** When user used pay-with-token in PerpsPayRow: minimal token shape to restore selection */\n selectedPaymentToken?: PerpsSelectedPaymentToken | null;\n },\n ): void {\n const network = this.state.isTestnet ? 'testnet' : 'mainnet';\n\n this.#debugLog('PerpsController: Saving pending trade configuration', {\n symbol,\n network,\n config,\n timestamp: new Date().toISOString(),\n });\n\n this.update((state) => {\n if (!state.tradeConfigurations[network]) {\n state.tradeConfigurations[network] = {};\n }\n\n const existingConfig = state.tradeConfigurations[network][symbol] || {};\n state.tradeConfigurations[network][symbol] = {\n ...existingConfig,\n pendingConfig: {\n ...config,\n timestamp: Date.now(),\n },\n };\n });\n }\n\n /**\n * Get pending trade configuration for a market\n * Returns undefined if config doesn't exist or has expired (more than 5 minutes old)\n *\n * @param symbol - Market symbol\n * @returns Pending trade configuration or undefined\n */\n getPendingTradeConfiguration(symbol: string):\n | {\n amount?: string;\n leverage?: number;\n takeProfitPrice?: string;\n stopLossPrice?: string;\n limitPrice?: string;\n orderType?: OrderType;\n selectedPaymentToken?: PerpsSelectedPaymentToken | null;\n }\n | undefined {\n const network = this.state.isTestnet ? 'testnet' : 'mainnet';\n const config =\n this.state.tradeConfigurations[network]?.[symbol]?.pendingConfig;\n\n if (!config) {\n return undefined;\n }\n\n // Check if config has expired (5 minutes = 300,000 milliseconds)\n const FIVE_MINUTES_MS = 5 * 60 * 1000;\n const now = Date.now();\n const age = now - config.timestamp;\n\n if (age > FIVE_MINUTES_MS) {\n this.#debugLog('PerpsController: Pending trade config expired', {\n symbol,\n network,\n age,\n timestamp: config.timestamp,\n });\n // Clear expired config\n this.update((state) => {\n if (state.tradeConfigurations[network]?.[symbol]?.pendingConfig) {\n delete state.tradeConfigurations[network][symbol].pendingConfig;\n }\n });\n return undefined;\n }\n\n this.#debugLog('PerpsController: Retrieved pending trade config', {\n symbol,\n network,\n config,\n age,\n });\n\n // Return config without timestamp\n const { timestamp, ...configWithoutTimestamp } = config;\n return configWithoutTimestamp;\n }\n\n /**\n * Clear pending trade configuration for a market\n *\n * @param symbol - Market symbol\n */\n clearPendingTradeConfiguration(symbol: string): void {\n const network = this.state.isTestnet ? 'testnet' : 'mainnet';\n\n this.#debugLog('PerpsController: Clearing pending trade configuration', {\n symbol,\n network,\n timestamp: new Date().toISOString(),\n });\n\n this.update((state) => {\n if (state.tradeConfigurations[network]?.[symbol]?.pendingConfig) {\n delete state.tradeConfigurations[network][symbol].pendingConfig;\n }\n });\n }\n\n /**\n * Get saved market filter preferences\n * Handles backward compatibility with legacy string format\n *\n * @returns The saved sort option ID and direction.\n */\n getMarketFilterPreferences(): {\n optionId: SortOptionId;\n direction: SortDirection;\n } {\n const pref = this.state.marketFilterPreferences;\n\n // Handle legacy string format (backward compatibility)\n if (typeof pref === 'string') {\n // Map legacy compound IDs to new format\n // Old format: 'priceChange-desc' or 'priceChange-asc'\n // New format: { optionId: 'priceChange', direction: 'desc'/'asc' }\n if (pref === 'priceChange-desc') {\n return {\n optionId: 'priceChange',\n direction: 'desc',\n };\n }\n if (pref === 'priceChange-asc') {\n return {\n optionId: 'priceChange',\n direction: 'asc',\n };\n }\n\n // Handle other simple legacy strings (e.g., 'volume', 'openInterest', etc.)\n return {\n optionId: pref as SortOptionId,\n direction: MARKET_SORTING_CONFIG.DefaultDirection,\n };\n }\n\n // Return new object format or default\n return (\n pref ?? {\n optionId: MARKET_SORTING_CONFIG.DefaultSortOptionId,\n direction: MARKET_SORTING_CONFIG.DefaultDirection,\n }\n );\n }\n\n /**\n * Save market filter preferences\n *\n * @param optionId - Sort/filter option ID\n * @param direction - Sort direction ('asc' or 'desc')\n */\n saveMarketFilterPreferences(\n optionId: SortOptionId,\n direction: SortDirection,\n ): void {\n this.#debugLog('PerpsController: Saving market filter preferences', {\n optionId,\n direction,\n timestamp: new Date().toISOString(),\n });\n\n this.update((state) => {\n state.marketFilterPreferences = { optionId, direction };\n });\n }\n\n /**\n * Set the selected payment token for the Perps order/deposit flow.\n * Pass null or a token with description PERPS_CONSTANTS.PerpsBalanceTokenDescription to select Perps balance.\n * Only required fields (address, chainId) are stored in state; description and symbol are optional.\n *\n * @param token - The token identifier.\n */\n setSelectedPaymentToken(token: PerpsSelectedPaymentToken | null): void {\n let normalized: PerpsSelectedPaymentToken | null = null;\n if (\n token !== null &&\n token.description !== PERPS_CONSTANTS.PerpsBalanceTokenDescription\n ) {\n normalized = token;\n }\n\n const current = this.state.selectedPaymentToken as\n | SelectedPaymentTokenSnapshot\n | null\n | undefined;\n const initialPaymentMethod =\n current === null ||\n current === undefined ||\n current?.description === PERPS_CONSTANTS.PerpsBalanceTokenDescription\n ? 'perps_balance'\n : (current?.symbol ?? 'unknown');\n const newPaymentMethod =\n token === null ||\n token.description === PERPS_CONSTANTS.PerpsBalanceTokenDescription\n ? 'perps_balance'\n : (token.symbol ?? 'unknown');\n\n if (initialPaymentMethod !== newPaymentMethod) {\n this.#getMetrics().trackPerpsEvent(PerpsAnalyticsEvent.UiInteraction, {\n [PERPS_EVENT_PROPERTY.INTERACTION_TYPE]:\n PERPS_EVENT_VALUE.INTERACTION_TYPE.PAYMENT_METHOD_CHANGED,\n [PERPS_EVENT_PROPERTY.INITIAL_PAYMENT_METHOD]: initialPaymentMethod,\n [PERPS_EVENT_PROPERTY.NEW_PAYMENT_METHOD]: newPaymentMethod,\n });\n }\n\n let snapshot: Json | null = null;\n if (normalized !== null) {\n snapshot = {\n ...(normalized.description !== undefined && {\n description: normalized.description,\n }),\n address: normalized.address,\n chainId: normalized.chainId,\n symbol: normalized.symbol,\n } as unknown as Json;\n }\n\n this.update((state) => {\n state.selectedPaymentToken = snapshot;\n });\n }\n\n /**\n * Reset the selected payment token to Perps balance (null).\n * Call when leaving the Perps order view so the next visit defaults to Perps balance.\n */\n resetSelectedPaymentToken(): void {\n this.update((state) => {\n state.selectedPaymentToken = null;\n });\n }\n\n /**\n * Get saved order book grouping for a market\n *\n * @param symbol - Market symbol\n * @returns The saved grouping value or undefined if not set\n */\n getOrderBookGrouping(symbol: string): number | undefined {\n const network = this.state.isTestnet ? 'testnet' : 'mainnet';\n const grouping =\n this.state.tradeConfigurations[network]?.[symbol]?.orderBookGrouping;\n\n if (grouping !== undefined) {\n this.#debugLog('PerpsController: Retrieved order book grouping', {\n symbol,\n network,\n grouping,\n });\n }\n\n return grouping;\n }\n\n /**\n * Save order book grouping for a market\n *\n * @param symbol - Market symbol\n * @param grouping - Price grouping value\n */\n saveOrderBookGrouping(symbol: string, grouping: number): void {\n const network = this.state.isTestnet ? 'testnet' : 'mainnet';\n\n this.#debugLog('PerpsController: Saving order book grouping', {\n symbol,\n network,\n grouping,\n timestamp: new Date().toISOString(),\n });\n\n this.update((state) => {\n if (!state.tradeConfigurations[network]) {\n state.tradeConfigurations[network] = {};\n }\n\n const existingConfig = state.tradeConfigurations[network][symbol] || {};\n state.tradeConfigurations[network][symbol] = {\n ...existingConfig,\n orderBookGrouping: grouping,\n };\n });\n }\n\n /**\n * Toggle watchlist status for a market\n * Watchlist markets are stored per network (testnet/mainnet)\n *\n * @param symbol - The trading pair symbol.\n */\n toggleWatchlistMarket(symbol: string): void {\n const currentNetwork = this.state.isTestnet ? 'testnet' : 'mainnet';\n const currentWatchlist = this.state.watchlistMarkets[currentNetwork];\n const isWatchlisted = currentWatchlist.includes(symbol);\n\n this.#debugLog('PerpsController: Toggling watchlist market', {\n timestamp: new Date().toISOString(),\n network: currentNetwork,\n symbol,\n action: isWatchlisted ? 'remove' : 'add',\n });\n\n this.update((state) => {\n if (isWatchlisted) {\n // Remove from watchlist\n state.watchlistMarkets[currentNetwork] = currentWatchlist.filter(\n (marketSymbol) => marketSymbol !== symbol,\n );\n } else {\n // Add to watchlist\n state.watchlistMarkets[currentNetwork] = [...currentWatchlist, symbol];\n }\n });\n }\n\n /**\n * Check if a market is in the watchlist on the current network\n *\n * @param symbol - The trading pair symbol.\n * @returns True if the condition is met.\n */\n isWatchlistMarket(symbol: string): boolean {\n const currentNetwork = this.state.isTestnet ? 'testnet' : 'mainnet';\n return this.state.watchlistMarkets[currentNetwork].includes(symbol);\n }\n\n /**\n * Get all watchlist markets for the current network\n *\n * @returns The resulting string value.\n */\n getWatchlistMarkets(): string[] {\n const currentNetwork = this.state.isTestnet ? 'testnet' : 'mainnet';\n return this.state.watchlistMarkets[currentNetwork];\n }\n\n /**\n * Report order events to data lake API with retry (non-blocking)\n * Thin delegation to DataLakeService\n *\n * @param params - The operation parameters.\n * @param params.action - The order action.\n * @param params.symbol - The trading pair symbol.\n * @param params.slPrice - The stop loss price.\n * @param params.tpPrice - The take profit price.\n * @param params.retryCount - Internal retry counter.\n * @param params._traceId - Internal trace ID.\n * @returns Whether the report was sent successfully, with an optional error message.\n */\n protected async reportOrderToDataLake(params: {\n action: 'open' | 'close';\n symbol: string;\n slPrice?: number;\n tpPrice?: number;\n retryCount?: number;\n _traceId?: string;\n }): Promise<{ success: boolean; error?: string }> {\n return this.#dataLakeService.reportOrder({\n action: params.action,\n symbol: params.symbol,\n slPrice: params.slPrice,\n tpPrice: params.tpPrice,\n isTestnet: this.state.isTestnet,\n context: this.#createServiceContext('reportOrderToDataLake', {}),\n retryCount: params.retryCount,\n _traceId: params._traceId,\n });\n }\n\n /**\n * Check if the controller is currently reinitializing\n *\n * @returns true if providers are being reinitialized\n */\n public isCurrentlyReinitializing(): boolean {\n return this.#isReinitializing;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"PerpsController.mjs","sourceRoot":"","sources":["../src/PerpsController.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n BaseController,\n ControllerGetStateAction,\n ControllerStateChangeEvent,\n StateMetadata,\n} from '@metamask/base-controller';\nimport type { StateChangeListener } from '@metamask/base-controller';\nimport { ORIGIN_METAMASK } from '@metamask/controller-utils';\nimport type { Messenger } from '@metamask/messenger';\nimport type { Json } from '@metamask/utils';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport { CandlePeriod } from './constants/chartConfig';\nimport {\n PERPS_EVENT_PROPERTY,\n PERPS_EVENT_VALUE,\n} from './constants/eventNames';\nimport { USDC_SYMBOL } from './constants/hyperLiquidConfig';\nimport { PerpsMeasurementName } from './constants/performanceMetrics';\nimport {\n PERPS_CONSTANTS,\n MARKET_SORTING_CONFIG,\n PROVIDER_CONFIG,\n} from './constants/perpsConfig';\nimport type { SortOptionId } from './constants/perpsConfig';\nimport { PERPS_ERROR_CODES } from './perpsErrorCodes';\nimport { AggregatedPerpsProvider } from './providers/AggregatedPerpsProvider';\nimport { HyperLiquidProvider } from './providers/HyperLiquidProvider';\nimport { AccountService } from './services/AccountService';\nimport { DataLakeService } from './services/DataLakeService';\nimport { DepositService } from './services/DepositService';\nimport { EligibilityService } from './services/EligibilityService';\nimport { FeatureFlagConfigurationService } from './services/FeatureFlagConfigurationService';\nimport { MarketDataService } from './services/MarketDataService';\nimport { RewardsIntegrationService } from './services/RewardsIntegrationService';\nimport type { ServiceContext } from './services/ServiceContext';\nimport { TradingService } from './services/TradingService';\n// PerpsStreamChannelKey removed: using string for channel keys (PerpsStreamManager.pauseChannel takes string)\nimport {\n WebSocketConnectionState,\n PerpsAnalyticsEvent,\n PerpsTraceNames,\n PerpsTraceOperations,\n isVersionGatedFeatureFlag,\n // Platform dependencies interface for core migration (bundles all platform-specific deps)\n} from './types';\nimport type {\n AccountState,\n AssetRoute,\n CancelOrderParams,\n CancelOrderResult,\n CancelOrdersParams,\n CancelOrdersResult,\n ClosePositionParams,\n ClosePositionsParams,\n ClosePositionsResult,\n DepositWithConfirmationParams,\n EditOrderParams,\n FeeCalculationParams,\n FeeCalculationResult,\n FlipPositionParams,\n Funding,\n GetAccountStateParams,\n GetAvailableDexsParams,\n GetFundingParams,\n GetMarketsParams,\n GetOrderFillsParams,\n GetOrdersParams,\n GetPositionsParams,\n PerpsProvider,\n LiquidationPriceParams,\n LiveDataConfig,\n MaintenanceMarginParams,\n MarginResult,\n MarketInfo,\n Order,\n OrderFill,\n OrderParams,\n OrderResult,\n PerpsControllerConfig,\n PerpsMarketData,\n Position,\n SubscribeAccountParams,\n SubscribeCandlesParams,\n SubscribeOICapsParams,\n SubscribeOrderBookParams,\n SubscribeOrderFillsParams,\n SubscribeOrdersParams,\n SubscribePositionsParams,\n SubscribePricesParams,\n SwitchProviderResult,\n ToggleTestnetResult,\n UpdateMarginParams,\n UpdatePositionTPSLParams,\n WithdrawParams,\n WithdrawResult,\n GetHistoricalPortfolioParams,\n HistoricalPortfolioResult,\n OrderType,\n PerpsPlatformDependencies,\n PerpsLogger,\n PerpsActiveProviderMode,\n PerpsProviderType,\n PerpsSelectedPaymentToken,\n PerpsRemoteFeatureFlagState,\n PerpsTransactionParams,\n PerpsAddTransactionOptions,\n} from './types';\nimport type {\n PerpsControllerAllowedActions,\n PerpsControllerAllowedEvents,\n} from './types/messenger';\nimport type { CandleData } from './types/perps-types';\nimport {\n LastTransactionResult,\n TransactionStatus,\n} from './types/transactionTypes';\nimport { getSelectedEvmAccount } from './utils/accountUtils';\nimport { ensureError } from './utils/errorUtils';\nimport type { SortDirection } from './utils/sortMarkets';\nimport { wait } from './utils/wait';\n\n/** Derived type for logger options from PerpsLogger interface */\ntype PerpsLoggerOptions = Parameters<PerpsLogger['error']>[1];\n// PaymentToken: minimal interface for deposit flow (replaces mobile-only AssetType)\n\n/**\n * Minimal payment token stored in PerpsController state.\n * Only required fields for identification, Perps balance detection, and analytics.\n */\nexport type SelectedPaymentTokenSnapshot = {\n description?: string;\n address: string;\n chainId: string;\n symbol?: string;\n};\n\n// Re-export error codes from separate file to avoid circular dependencies\nexport { PERPS_ERROR_CODES, type PerpsErrorCode } from './perpsErrorCodes';\n\n/**\n * Initialization state enum for state machine tracking\n */\nexport enum InitializationState {\n Uninitialized = 'uninitialized',\n Initializing = 'initializing',\n Initialized = 'initialized',\n Failed = 'failed',\n}\n\n/**\n * State shape for PerpsController\n */\nexport type PerpsControllerState = {\n // Active provider\n activeProvider: PerpsActiveProviderMode;\n isTestnet: boolean; // Dev toggle for testnet\n\n // Initialization state machine\n initializationState: InitializationState;\n initializationError: string | null;\n initializationAttempts: number;\n\n // Account data (persisted) - using HyperLiquid property names\n accountState: AccountState | null;\n\n // Perps balances per provider for portfolio display (historical data)\n perpsBalances: {\n [provider: string]: {\n totalBalance: string; // Current total account value (cash + positions) in USD\n unrealizedPnl: string; // Current P&L from open positions in USD\n accountValue1dAgo: string; // Account value 24h ago for daily change calculation in USD\n lastUpdated: number; // Timestamp of last update\n };\n };\n\n // Simple deposit state (transient, for UI feedback)\n depositInProgress: boolean;\n // Internal transaction id for the deposit transaction\n // We use this to fetch the bridge quotes and get the estimated time.\n lastDepositTransactionId: string | null;\n lastDepositResult: LastTransactionResult | null;\n\n // Simple withdrawal state (transient, for UI feedback)\n withdrawInProgress: boolean;\n lastWithdrawResult: LastTransactionResult | null;\n\n // Withdrawal request tracking (persistent, for transaction history)\n withdrawalRequests: {\n id: string;\n amount: string;\n asset: string;\n accountAddress: string; // Account that initiated this withdrawal\n txHash?: string;\n timestamp: number;\n success: boolean;\n status: TransactionStatus;\n destination?: string;\n source?: string;\n transactionId?: string;\n withdrawalId?: string;\n depositId?: string;\n }[];\n\n // Withdrawal progress tracking (persistent across navigation)\n withdrawalProgress: {\n progress: number; // 0-100\n lastUpdated: number; // timestamp\n activeWithdrawalId: string | null; // ID of the withdrawal being tracked\n };\n\n // Deposit request tracking (persistent, for transaction history)\n depositRequests: {\n id: string;\n amount: string;\n asset: string;\n accountAddress: string; // Account that initiated this deposit\n txHash?: string;\n timestamp: number;\n success: boolean;\n status: TransactionStatus;\n destination?: string;\n source?: string;\n transactionId?: string;\n withdrawalId?: string;\n depositId?: string;\n }[];\n\n // Eligibility (Geo-Blocking)\n isEligible: boolean;\n\n // Tutorial/First time user tracking (per network)\n isFirstTimeUser: {\n testnet: boolean;\n mainnet: boolean;\n };\n\n // Notification tracking\n hasPlacedFirstOrder: {\n testnet: boolean;\n mainnet: boolean;\n };\n\n // Watchlist markets tracking (per network)\n watchlistMarkets: {\n testnet: string[]; // Array of watchlist market symbols for testnet\n mainnet: string[]; // Array of watchlist market symbols for mainnet\n };\n\n // Trade configurations per market (per network)\n tradeConfigurations: {\n testnet: {\n [marketSymbol: string]: {\n leverage?: number; // Last used leverage for this market\n orderBookGrouping?: number; // Persisted price grouping for order book\n // Pending trade configuration (temporary, expires after 5 minutes)\n pendingConfig?: {\n amount?: string; // Order size in USD\n leverage?: number; // Leverage\n takeProfitPrice?: string; // Take profit price\n stopLossPrice?: string; // Stop loss price\n limitPrice?: string; // Limit price (for limit orders)\n orderType?: OrderType; // Market vs limit\n timestamp: number; // When the config was saved (for expiration check)\n };\n };\n };\n mainnet: {\n [marketSymbol: string]: {\n leverage?: number;\n orderBookGrouping?: number; // Persisted price grouping for order book\n // Pending trade configuration (temporary, expires after 5 minutes)\n pendingConfig?: {\n amount?: string; // Order size in USD\n leverage?: number; // Leverage\n takeProfitPrice?: string; // Take profit price\n stopLossPrice?: string; // Stop loss price\n limitPrice?: string; // Limit price (for limit orders)\n orderType?: OrderType; // Market vs limit\n timestamp: number; // When the config was saved (for expiration check)\n };\n };\n };\n };\n\n // Market filter preferences (network-independent) - includes both sorting and filtering options\n marketFilterPreferences: {\n optionId: SortOptionId;\n direction: SortDirection;\n };\n\n // Error handling\n lastError: string | null;\n lastUpdateTimestamp: number;\n\n // HIP-3 Configuration Version (incremented when HIP-3 remote flags change)\n // Used to trigger reconnection and cache invalidation in ConnectionManager\n hip3ConfigVersion: number;\n\n // Selected payment token for Perps order/deposit flow (null = Perps balance). Stored as Json (minimal shape: description, address, chainId).\n selectedPaymentToken: Json | null;\n\n // Cached market data from background preloading (REST snapshots, not WebSocket)\n cachedMarketData: PerpsMarketData[] | null;\n cachedMarketDataTimestamp: number;\n\n // Cached user data from background preloading (REST snapshots, not WebSocket)\n cachedPositions: Position[] | null;\n cachedOrders: Order[] | null;\n cachedAccountState: AccountState | null;\n cachedUserDataTimestamp: number;\n cachedUserDataAddress: string | null;\n};\n\n/**\n * Get default PerpsController state\n *\n * To change the active provider, modify the `activeProvider` value below:\n * - 'hyperliquid': HyperLiquid provider (default, production)\n * - 'aggregated': Multi-provider aggregation mode\n * - 'myx': MYX provider (future implementation)\n *\n * @returns The default perps controller state.\n */\nexport const getDefaultPerpsControllerState = (): PerpsControllerState => ({\n activeProvider: 'hyperliquid',\n isTestnet: false, // Default to mainnet\n initializationState: InitializationState.Uninitialized,\n initializationError: null,\n initializationAttempts: 0,\n accountState: null,\n perpsBalances: {},\n depositInProgress: false,\n lastDepositResult: null,\n withdrawInProgress: false,\n lastDepositTransactionId: null,\n lastWithdrawResult: null,\n withdrawalRequests: [],\n withdrawalProgress: {\n progress: 0,\n lastUpdated: 0,\n activeWithdrawalId: null,\n },\n depositRequests: [],\n lastError: null,\n lastUpdateTimestamp: 0,\n isEligible: false,\n isFirstTimeUser: {\n testnet: true,\n mainnet: true,\n },\n hasPlacedFirstOrder: {\n testnet: false,\n mainnet: false,\n },\n watchlistMarkets: {\n testnet: [],\n mainnet: [],\n },\n tradeConfigurations: {\n testnet: {},\n mainnet: {},\n },\n marketFilterPreferences: {\n optionId: MARKET_SORTING_CONFIG.DefaultSortOptionId,\n direction: MARKET_SORTING_CONFIG.DefaultDirection,\n },\n hip3ConfigVersion: 0,\n selectedPaymentToken: null,\n cachedMarketData: null,\n cachedMarketDataTimestamp: 0,\n cachedPositions: null,\n cachedOrders: null,\n cachedAccountState: null,\n cachedUserDataTimestamp: 0,\n cachedUserDataAddress: null,\n});\n\n/**\n * State metadata for the PerpsController\n */\nconst metadata: StateMetadata<PerpsControllerState> = {\n accountState: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n perpsBalances: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n isTestnet: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n activeProvider: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n initializationState: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n initializationError: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n initializationAttempts: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: false,\n },\n depositInProgress: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n lastDepositTransactionId: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n lastDepositResult: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n withdrawInProgress: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n lastWithdrawResult: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n withdrawalRequests: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n withdrawalProgress: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n depositRequests: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n lastError: {\n includeInStateLogs: false,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: false,\n },\n lastUpdateTimestamp: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: false,\n },\n isEligible: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n isFirstTimeUser: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n hasPlacedFirstOrder: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n watchlistMarkets: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n tradeConfigurations: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n marketFilterPreferences: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n hip3ConfigVersion: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: false,\n },\n selectedPaymentToken: {\n includeInStateLogs: false,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n cachedMarketData: {\n includeInStateLogs: false,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n cachedMarketDataTimestamp: {\n includeInStateLogs: false,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: false,\n },\n cachedPositions: {\n includeInStateLogs: false,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n cachedOrders: {\n includeInStateLogs: false,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n cachedAccountState: {\n includeInStateLogs: false,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n cachedUserDataTimestamp: {\n includeInStateLogs: false,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: false,\n },\n cachedUserDataAddress: {\n includeInStateLogs: false,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: false,\n },\n};\n\n/**\n * PerpsController events\n */\nexport type PerpsControllerEvents = ControllerStateChangeEvent<\n 'PerpsController',\n PerpsControllerState\n>;\n\n/**\n * PerpsController actions\n */\nexport type PerpsControllerActions =\n | ControllerGetStateAction<'PerpsController', PerpsControllerState>\n | {\n type: 'PerpsController:placeOrder';\n handler: PerpsController['placeOrder'];\n }\n | {\n type: 'PerpsController:editOrder';\n handler: PerpsController['editOrder'];\n }\n | {\n type: 'PerpsController:cancelOrder';\n handler: PerpsController['cancelOrder'];\n }\n | {\n type: 'PerpsController:cancelOrders';\n handler: PerpsController['cancelOrders'];\n }\n | {\n type: 'PerpsController:closePosition';\n handler: PerpsController['closePosition'];\n }\n | {\n type: 'PerpsController:closePositions';\n handler: PerpsController['closePositions'];\n }\n | {\n type: 'PerpsController:withdraw';\n handler: PerpsController['withdraw'];\n }\n | {\n type: 'PerpsController:getPositions';\n handler: PerpsController['getPositions'];\n }\n | {\n type: 'PerpsController:getOrderFills';\n handler: PerpsController['getOrderFills'];\n }\n | {\n type: 'PerpsController:getOrders';\n handler: PerpsController['getOrders'];\n }\n | {\n type: 'PerpsController:getOpenOrders';\n handler: PerpsController['getOpenOrders'];\n }\n | {\n type: 'PerpsController:getFunding';\n handler: PerpsController['getFunding'];\n }\n | {\n type: 'PerpsController:getAccountState';\n handler: PerpsController['getAccountState'];\n }\n | {\n type: 'PerpsController:getMarkets';\n handler: PerpsController['getMarkets'];\n }\n | {\n type: 'PerpsController:refreshEligibility';\n handler: PerpsController['refreshEligibility'];\n }\n | {\n type: 'PerpsController:toggleTestnet';\n handler: PerpsController['toggleTestnet'];\n }\n | {\n type: 'PerpsController:disconnect';\n handler: PerpsController['disconnect'];\n }\n | {\n type: 'PerpsController:calculateFees';\n handler: PerpsController['calculateFees'];\n }\n | {\n type: 'PerpsController:markTutorialCompleted';\n handler: PerpsController['markTutorialCompleted'];\n }\n | {\n type: 'PerpsController:markFirstOrderCompleted';\n handler: PerpsController['markFirstOrderCompleted'];\n }\n | {\n type: 'PerpsController:getHistoricalPortfolio';\n handler: PerpsController['getHistoricalPortfolio'];\n }\n | {\n type: 'PerpsController:resetFirstTimeUserState';\n handler: PerpsController['resetFirstTimeUserState'];\n }\n | {\n type: 'PerpsController:clearPendingTransactionRequests';\n handler: PerpsController['clearPendingTransactionRequests'];\n }\n | {\n type: 'PerpsController:saveTradeConfiguration';\n handler: PerpsController['saveTradeConfiguration'];\n }\n | {\n type: 'PerpsController:getTradeConfiguration';\n handler: PerpsController['getTradeConfiguration'];\n }\n | {\n type: 'PerpsController:saveMarketFilterPreferences';\n handler: PerpsController['saveMarketFilterPreferences'];\n }\n | {\n type: 'PerpsController:getMarketFilterPreferences';\n handler: PerpsController['getMarketFilterPreferences'];\n }\n | {\n type: 'PerpsController:savePendingTradeConfiguration';\n handler: PerpsController['savePendingTradeConfiguration'];\n }\n | {\n type: 'PerpsController:getPendingTradeConfiguration';\n handler: PerpsController['getPendingTradeConfiguration'];\n }\n | {\n type: 'PerpsController:clearPendingTradeConfiguration';\n handler: PerpsController['clearPendingTradeConfiguration'];\n }\n | {\n type: 'PerpsController:getOrderBookGrouping';\n handler: PerpsController['getOrderBookGrouping'];\n }\n | {\n type: 'PerpsController:saveOrderBookGrouping';\n handler: PerpsController['saveOrderBookGrouping'];\n }\n | {\n type: 'PerpsController:setSelectedPaymentToken';\n handler: PerpsController['setSelectedPaymentToken'];\n }\n | {\n type: 'PerpsController:resetSelectedPaymentToken';\n handler: PerpsController['resetSelectedPaymentToken'];\n }\n | {\n type: 'PerpsController:startEligibilityMonitoring';\n handler: PerpsController['startEligibilityMonitoring'];\n }\n | {\n type: 'PerpsController:stopEligibilityMonitoring';\n handler: PerpsController['stopEligibilityMonitoring'];\n };\n\n/**\n * PerpsController messenger constraints.\n * Includes both PerpsController's own actions/events and\n * allowed actions/events from external controllers.\n */\nexport type PerpsControllerMessenger = Messenger<\n 'PerpsController',\n PerpsControllerActions | PerpsControllerAllowedActions,\n PerpsControllerEvents | PerpsControllerAllowedEvents\n>;\n\n/**\n * PerpsController options\n */\nexport type PerpsControllerOptions = {\n messenger: PerpsControllerMessenger;\n state?: Partial<PerpsControllerState>;\n clientConfig?: PerpsControllerConfig;\n /**\n * Platform-specific dependencies (required)\n * Provides logging, metrics, tracing, stream management, and rewards.\n * Cross-controller communication uses the messenger pattern.\n * Must be provided by the platform (mobile/extension) at instantiation time.\n */\n infrastructure: PerpsPlatformDependencies;\n /**\n * When true, defers geo-blocking eligibility checks until\n * {@link PerpsController.startEligibilityMonitoring} is called.\n * Use this during wallet onboarding to prevent the geolocation fetch\n * from firing before onboarding is complete.\n */\n deferEligibilityCheck?: boolean;\n};\n\ntype BlockedRegionList = {\n list: string[];\n source: 'remote' | 'fallback';\n};\n\nconst MESSENGER_EXPOSED_METHODS = [\n 'placeOrder',\n 'editOrder',\n 'cancelOrder',\n 'cancelOrders',\n 'closePosition',\n 'closePositions',\n 'withdraw',\n 'getPositions',\n 'getOrderFills',\n 'getOrders',\n 'getOpenOrders',\n 'getFunding',\n 'getAccountState',\n 'getMarkets',\n 'refreshEligibility',\n 'toggleTestnet',\n 'disconnect',\n 'calculateFees',\n 'markTutorialCompleted',\n 'markFirstOrderCompleted',\n 'getHistoricalPortfolio',\n 'resetFirstTimeUserState',\n 'clearPendingTransactionRequests',\n 'saveTradeConfiguration',\n 'getTradeConfiguration',\n 'saveMarketFilterPreferences',\n 'getMarketFilterPreferences',\n 'savePendingTradeConfiguration',\n 'getPendingTradeConfiguration',\n 'clearPendingTradeConfiguration',\n 'getOrderBookGrouping',\n 'saveOrderBookGrouping',\n 'setSelectedPaymentToken',\n 'resetSelectedPaymentToken',\n 'startEligibilityMonitoring',\n 'stopEligibilityMonitoring',\n] as const;\n\n/**\n * PerpsController - Protocol-agnostic perpetuals trading controller\n *\n * Provides a unified interface for perpetual futures trading across multiple protocols.\n * Features dual data flow architecture:\n * - Trading actions use Redux for persistence and optimistic updates\n * - Live data uses direct callbacks for maximum performance\n */\nexport class PerpsController extends BaseController<\n 'PerpsController',\n PerpsControllerState,\n PerpsControllerMessenger\n> {\n protected providers: Map<PerpsProviderType, PerpsProvider>;\n\n protected isInitialized = false;\n\n #initializationPromise: Promise<void> | null = null;\n\n #isReinitializing = false;\n\n protected blockedRegionList: BlockedRegionList = {\n list: [],\n source: 'fallback',\n };\n\n /**\n * Version counter for blocked region list.\n * Used to prevent race conditions where stale eligibility checks\n * (started with fallback config) overwrite results from newer checks\n * (started with remote config).\n */\n #blockedRegionListVersion = 0;\n\n // Store HIP-3 configuration (mutable for runtime updates from remote flags)\n #hip3Enabled: boolean;\n\n #hip3AllowlistMarkets: string[];\n\n #hip3BlocklistMarkets: string[];\n\n #hip3ConfigSource: 'remote' | 'fallback' = 'fallback';\n\n /**\n * Check if MYX provider is enabled via feature flag\n * Uses same pattern as other feature flags in FeatureFlagConfigurationService\n *\n * @returns True if the condition is met.\n */\n #isMYXProviderEnabled(): boolean {\n const getLocalFlag = (): boolean =>\n typeof globalThis.process !== 'undefined' &&\n globalThis.process.env?.MM_PERPS_MYX_PROVIDER_ENABLED === 'true';\n\n try {\n const localFlag = getLocalFlag();\n const remoteState = this.messenger.call(\n 'RemoteFeatureFlagController:getState',\n );\n const remoteFlag =\n remoteState.remoteFeatureFlags?.perpsMyxProviderEnabled;\n\n if (isVersionGatedFeatureFlag(remoteFlag)) {\n const validated =\n this.#options.infrastructure.featureFlags.validateVersionGated(\n remoteFlag,\n );\n return validated ?? localFlag;\n }\n\n return localFlag;\n } catch {\n // If RemoteFeatureFlagController not ready, use fallback\n return getLocalFlag();\n }\n }\n\n /**\n * Active provider instance for routing operations.\n * When activeProvider is 'hyperliquid' or 'myx': points to specific provider directly\n * When activeProvider is 'aggregated': points to AggregatedPerpsProvider wrapper\n */\n protected activeProviderInstance: PerpsProvider | null = null;\n\n /**\n * Cached standalone provider for pre-initialization discovery queries.\n * Avoids creating a new HyperLiquidProvider (and potentially leaking WebSocket\n * connections) on every standalone call from the preload cycle.\n */\n #standaloneProvider: HyperLiquidProvider | null = null;\n\n #standaloneProviderIsTestnet: boolean | null = null;\n\n #standaloneProviderHip3Version: number | null = null;\n\n #eligibilityCheckDeferred: boolean;\n\n // Store options for dependency injection (allows core package to inject platform-specific services)\n readonly #options: PerpsControllerOptions;\n\n // Service instances (instantiated with platform dependencies)\n readonly #tradingService: TradingService;\n\n readonly #marketDataService: MarketDataService;\n\n readonly #accountService: AccountService;\n\n readonly #eligibilityService: EligibilityService;\n\n readonly #dataLakeService: DataLakeService;\n\n readonly #depositService: DepositService;\n\n readonly #featureFlagConfigurationService: FeatureFlagConfigurationService;\n\n readonly #rewardsIntegrationService: RewardsIntegrationService;\n\n constructor({\n messenger,\n state = {},\n clientConfig = {},\n infrastructure,\n deferEligibilityCheck = false,\n }: PerpsControllerOptions) {\n super({\n name: 'PerpsController',\n metadata,\n messenger,\n state: { ...getDefaultPerpsControllerState(), ...state },\n });\n\n this.#eligibilityCheckDeferred = deferEligibilityCheck;\n\n // Store options for dependency injection\n this.#options = {\n messenger,\n state,\n clientConfig,\n infrastructure,\n };\n\n // Instantiate services with platform dependencies\n // Services that need cross-controller access receive the messenger\n this.#tradingService = new TradingService(infrastructure);\n this.#marketDataService = new MarketDataService(infrastructure);\n this.#accountService = new AccountService(infrastructure, messenger);\n this.#eligibilityService = new EligibilityService(infrastructure);\n this.#dataLakeService = new DataLakeService(infrastructure, messenger);\n this.#depositService = new DepositService(infrastructure, messenger);\n this.#featureFlagConfigurationService = new FeatureFlagConfigurationService(\n infrastructure,\n );\n this.#rewardsIntegrationService = new RewardsIntegrationService(\n infrastructure,\n messenger,\n );\n\n // Set HIP-3 fallback configuration from client (will be updated if remote flags available)\n this.#hip3Enabled = clientConfig.fallbackHip3Enabled ?? false;\n this.#hip3AllowlistMarkets = [\n ...(clientConfig.fallbackHip3AllowlistMarkets ?? []),\n ];\n this.#hip3BlocklistMarkets = [\n ...(clientConfig.fallbackHip3BlocklistMarkets ?? []),\n ];\n\n // Immediately set the fallback region list since RemoteFeatureFlagController is empty by default and takes a moment to populate.\n this.setBlockedRegionList(\n clientConfig.fallbackBlockedRegions ?? [],\n 'fallback',\n );\n\n /**\n * Immediately read current state to catch any flags already loaded\n * This is necessary to avoid race conditions where the RemoteFeatureFlagController fetches flags\n * before the PerpsController initializes its RemoteFeatureFlagController subscription.\n *\n * We still subscribe in case the RemoteFeatureFlagController is not yet populated and updates later.\n */\n try {\n const currentRemoteFeatureFlagState = this.messenger.call(\n 'RemoteFeatureFlagController:getState',\n );\n\n this.refreshEligibilityOnFeatureFlagChange(currentRemoteFeatureFlagState);\n } catch (error) {\n // If we can't read the remote feature flags at construction time, we'll rely on:\n // 1. The fallback blocked regions already set above\n // 2. The subscription to catch updates when RemoteFeatureFlagController is ready\n this.#logError(\n ensureError(error, 'PerpsController.constructor'),\n this.#getErrorContext('constructor', {\n operation: 'readRemoteFeatureFlags',\n }),\n );\n }\n\n // Subscribe for the full controller lifetime — intentionally not stored;\n // geo-blocking and HIP-3 flag propagation must remain active across\n // disconnect → reconnect cycles and must never be torn down.\n this.messenger.subscribe(\n 'RemoteFeatureFlagController:stateChange',\n this.refreshEligibilityOnFeatureFlagChange.bind(this),\n );\n\n this.providers = new Map();\n\n // Migrate old persisted data without accountAddress\n this.#migrateRequestsIfNeeded();\n\n this.messenger.registerMethodActionHandlers(\n this,\n MESSENGER_EXPOSED_METHODS,\n );\n }\n\n // ============================================================================\n // Infrastructure Access Methods\n // These methods provide access to platform-specific infrastructure via dependency injection.\n // Infrastructure is required and must be provided at instantiation time.\n // ============================================================================\n\n /**\n * Log an error using injected infrastructure logger\n *\n * @param error - The error that occurred.\n * @param options - The configuration options.\n */\n #logError(error: Error, options?: PerpsLoggerOptions): void {\n this.#options.infrastructure.logger.error(error, options);\n }\n\n /**\n * Log debug message using injected infrastructure debugLogger\n *\n * @param args - The function arguments.\n */\n #debugLog(\n ...args: (string | number | boolean | object | null | undefined)[]\n ): void {\n this.#options.infrastructure.debugLogger.log(...args);\n }\n\n /**\n * Returns a cached standalone HyperLiquidProvider for pre-initialization\n * discovery queries. Creates a new instance on first call or when the\n * isTestnet / hip3ConfigVersion has changed since the last creation.\n *\n * @returns A HyperLiquidProvider suitable for standalone REST calls.\n */\n #getOrCreateStandaloneProvider(): HyperLiquidProvider {\n const currentIsTestnet = this.state.isTestnet;\n const currentHip3Version = this.state.hip3ConfigVersion ?? 0;\n\n if (\n this.#standaloneProvider &&\n this.#standaloneProviderIsTestnet === currentIsTestnet &&\n this.#standaloneProviderHip3Version === currentHip3Version\n ) {\n return this.#standaloneProvider;\n }\n\n // Stale or missing — tear down old one (fire-and-forget)\n if (this.#standaloneProvider) {\n const old = this.#standaloneProvider;\n Promise.resolve(old.disconnect()).catch(() => {\n /* best-effort */\n });\n }\n\n this.#standaloneProvider = new HyperLiquidProvider({\n isTestnet: currentIsTestnet,\n hip3Enabled: this.#hip3Enabled,\n allowlistMarkets: this.#hip3AllowlistMarkets,\n blocklistMarkets: this.#hip3BlocklistMarkets,\n platformDependencies: this.#options.infrastructure,\n messenger: this.messenger,\n });\n this.#standaloneProviderIsTestnet = currentIsTestnet;\n this.#standaloneProviderHip3Version = currentHip3Version;\n\n return this.#standaloneProvider;\n }\n\n /**\n * Disconnect and discard the cached standalone provider (if any).\n * Best-effort — errors are silently caught.\n */\n async #cleanupStandaloneProvider(): Promise<void> {\n if (!this.#standaloneProvider) {\n return;\n }\n try {\n await this.#standaloneProvider.disconnect();\n } catch {\n /* best-effort */\n }\n this.#standaloneProvider = null;\n this.#standaloneProviderIsTestnet = null;\n this.#standaloneProviderHip3Version = null;\n }\n\n /**\n * Test-observable accessor for whether a standalone provider is cached.\n *\n * @returns True if a standalone provider instance exists.\n */\n protected hasStandaloneProvider(): boolean {\n return this.#standaloneProvider !== null;\n }\n\n /**\n * Get metrics instance from platform dependencies\n *\n * @returns The platform metrics instance.\n */\n #getMetrics(): PerpsPlatformDependencies['metrics'] {\n return this.#options.infrastructure.metrics;\n }\n\n // ============================================================================\n // Messenger-based Controller Access\n // These methods use the messenger pattern for inter-controller communication\n // ============================================================================\n\n /**\n * Find network client ID for a given chain via messenger\n *\n * @param chainId - The chain identifier.\n * @returns The resulting string value.\n */\n #findNetworkClientIdForChain(chainId: string): string | undefined {\n return this.messenger.call(\n 'NetworkController:findNetworkClientIdByChainId',\n chainId as `0x${string}`,\n );\n }\n\n /**\n * Submit a transaction via messenger (shows confirmation screen)\n *\n * @param txParams - The transaction parameters.\n * @param txParams.from - The sender address.\n * @param txParams.to - The recipient address.\n * @param txParams.value - The transaction value.\n * @param txParams.data - The transaction data payload.\n * @param txParams.gas - The gas limit.\n * @param options - The configuration options.\n * @param options.networkClientId - The network client identifier.\n * @param options.origin - The transaction origin.\n * @param options.type - The transaction type.\n * @param options.skipInitialGasEstimate - Whether to skip initial gas estimation.\n * @returns The transaction result containing a hash promise and transaction metadata.\n */\n async #submitTransaction(\n txParams: PerpsTransactionParams,\n options: PerpsAddTransactionOptions,\n ): Promise<{\n result: Promise<string>;\n transactionMeta: { id: string; hash?: string };\n }> {\n // Cast needed: PerpsController uses loose string types for txParams/options\n // while TransactionController uses strict branded types (TransactionParams, AddTransactionOptions)\n return this.messenger.call(\n 'TransactionController:addTransaction',\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n txParams as any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n options as any,\n );\n }\n\n /**\n * Clean up old withdrawal/deposit requests that don't have accountAddress\n * These are from before the accountAddress field was added and can't be displayed\n * in the UI (which filters by account), so we discard them\n */\n #migrateRequestsIfNeeded(): void {\n this.update((state) => {\n // Remove withdrawal requests without accountAddress - they can't be attributed to any account\n state.withdrawalRequests = state.withdrawalRequests.filter((req) =>\n Boolean(req.accountAddress),\n );\n\n // Remove deposit requests without accountAddress - they can't be attributed to any account\n state.depositRequests = state.depositRequests.filter((req) =>\n Boolean(req.accountAddress),\n );\n });\n }\n\n protected setBlockedRegionList(\n list: string[],\n source: 'remote' | 'fallback',\n ): void {\n this.#featureFlagConfigurationService.setBlockedRegions({\n list,\n source,\n context: this.#createServiceContext('setBlockedRegionList', {\n getBlockedRegionList: () => this.blockedRegionList,\n setBlockedRegionList: (\n newList: string[],\n newSource: 'remote' | 'fallback',\n ) => {\n this.blockedRegionList = { list: newList, source: newSource };\n this.#blockedRegionListVersion += 1;\n },\n refreshEligibility: () => this.refreshEligibility(),\n }),\n });\n }\n\n /**\n * Respond to RemoteFeatureFlagController state changes\n * Refreshes user eligibility based on geo-blocked regions defined in remote feature flag.\n * Uses fallback configuration when remote feature flag is undefined.\n * Note: Initial eligibility is set in the constructor if fallback regions are provided.\n *\n * @param remoteFeatureFlagControllerState - State from RemoteFeatureFlagController.\n */\n protected refreshEligibilityOnFeatureFlagChange(\n remoteFeatureFlagControllerState: PerpsRemoteFeatureFlagState,\n ): void {\n this.#featureFlagConfigurationService.refreshEligibility({\n remoteFeatureFlagControllerState,\n context: this.#createServiceContext(\n 'refreshEligibilityOnFeatureFlagChange',\n {\n getBlockedRegionList: () => this.blockedRegionList,\n setBlockedRegionList: (\n list: string[],\n source: 'remote' | 'fallback',\n ) => {\n this.blockedRegionList = { list, source };\n this.#blockedRegionListVersion += 1;\n },\n refreshEligibility: () => this.refreshEligibility(),\n getHip3Config: () => ({\n enabled: this.#hip3Enabled,\n allowlistMarkets: this.#hip3AllowlistMarkets,\n blocklistMarkets: this.#hip3BlocklistMarkets,\n source: this.#hip3ConfigSource,\n }),\n setHip3Config: (config) => {\n if (config.enabled !== undefined) {\n this.#hip3Enabled = config.enabled;\n }\n if (config.allowlistMarkets !== undefined) {\n this.#hip3AllowlistMarkets = [...config.allowlistMarkets];\n }\n if (config.blocklistMarkets !== undefined) {\n this.#hip3BlocklistMarkets = [...config.blocklistMarkets];\n }\n if (config.source !== undefined) {\n this.#hip3ConfigSource = config.source;\n }\n },\n incrementHip3ConfigVersion: () => {\n const newVersion = (this.state.hip3ConfigVersion || 0) + 1;\n this.update((state) => {\n state.hip3ConfigVersion = newVersion;\n });\n return newVersion;\n },\n },\n ),\n });\n }\n\n /**\n * Execute an operation while temporarily pausing specified stream channels\n * to prevent WebSocket updates from triggering UI re-renders during operations.\n *\n * WebSocket connections remain alive but updates are not emitted to subscribers.\n * This prevents race conditions where UI re-renders fetch stale data during operations.\n *\n * @param operation - The async operation to execute\n * @param channels - Array of stream channel names to pause\n * @returns The result of the operation\n * @example\n * ```typescript\n * // Cancel orders without stream interference\n * await this.#withStreamPause(\n * async () => this.provider.cancelOrders({ cancelAll: true }),\n * ['orders']\n * );\n *\n * // Close positions and pause multiple streams\n * await this.#withStreamPause(\n * async () => this.provider.closePositions(positions),\n * ['positions', 'account', 'orders']\n * );\n * ```\n */\n async #withStreamPause<TResult>(\n operation: () => Promise<TResult>,\n channels: string[],\n ): Promise<TResult> {\n const pausedChannels: string[] = [];\n const { streamManager } = this.#options.infrastructure;\n\n // Pause emission on specified channels (WebSocket stays connected)\n // Track which channels successfully paused to ensure proper cleanup\n for (const channel of channels) {\n try {\n streamManager.pauseChannel(channel);\n pausedChannels.push(channel);\n } catch (error) {\n // Log error to Sentry but continue pausing remaining channels\n this.#logError(\n ensureError(error, 'PerpsController.withStreamPause'),\n this.#getErrorContext('withStreamPause', {\n operation: 'pause',\n channel: String(channel),\n pausedChannels: pausedChannels.join(','),\n }),\n );\n }\n }\n\n try {\n // Execute operation without stream interference\n return await operation();\n } finally {\n // Resume only channels that were successfully paused\n for (const channel of pausedChannels) {\n try {\n streamManager.resumeChannel(channel);\n } catch (error) {\n // Log error to Sentry but continue resuming remaining channels\n this.#logError(\n ensureError(error, 'PerpsController.withStreamPause'),\n this.#getErrorContext('withStreamPause', {\n operation: 'resume',\n channel: String(channel),\n pausedChannels: pausedChannels.join(','),\n }),\n );\n }\n }\n }\n }\n\n /**\n * Initialize the PerpsController providers\n * Must be called before using any other methods\n * Prevents double initialization with promise caching\n *\n * @returns A promise that resolves when the operation completes.\n */\n async init(): Promise<void> {\n if (this.isInitialized) {\n return undefined;\n }\n\n if (this.#initializationPromise) {\n return this.#initializationPromise;\n }\n\n this.#initializationPromise = this.#performInitialization();\n return this.#initializationPromise;\n }\n\n /**\n * Actual initialization implementation with retry logic\n */\n async #performInitialization(): Promise<void> {\n const maxAttempts = 3;\n const baseDelay = 1000;\n\n this.update((state) => {\n state.initializationState = InitializationState.Initializing;\n state.initializationError = null;\n state.initializationAttempts = 0;\n });\n\n this.#debugLog('PerpsController: Initializing providers', {\n currentNetwork: this.state.isTestnet ? 'testnet' : 'mainnet',\n existingProviders: Array.from(this.providers.keys()),\n timestamp: new Date().toISOString(),\n });\n\n let lastError: Error | null = null;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n this.update((state) => {\n state.initializationAttempts = attempt;\n });\n\n // Disconnect existing providers to close WebSocket connections\n const existingProviders = Array.from(this.providers.values());\n if (existingProviders.length > 0) {\n this.#debugLog('PerpsController: Disconnecting existing providers', {\n count: existingProviders.length,\n timestamp: new Date().toISOString(),\n });\n await Promise.all(\n existingProviders.map((provider) => provider.disconnect()),\n );\n }\n this.providers.clear();\n await this.#cleanupStandaloneProvider();\n\n const { activeProvider } = this.state;\n\n this.#debugLog(\n 'PerpsController: Creating provider with HIP-3 configuration',\n {\n hip3Enabled: this.#hip3Enabled,\n hip3AllowlistMarkets: this.#hip3AllowlistMarkets,\n hip3BlocklistMarkets: this.#hip3BlocklistMarkets,\n hip3ConfigSource: this.#hip3ConfigSource,\n isTestnet: this.state.isTestnet,\n activeProvider,\n },\n );\n\n // Always create HyperLiquid provider as the base provider\n const hyperLiquidProvider = new HyperLiquidProvider({\n isTestnet: this.state.isTestnet,\n hip3Enabled: this.#hip3Enabled,\n allowlistMarkets: this.#hip3AllowlistMarkets,\n blocklistMarkets: this.#hip3BlocklistMarkets,\n platformDependencies: this.#options.infrastructure,\n messenger: this.messenger,\n });\n this.providers.set('hyperliquid', hyperLiquidProvider);\n\n // Register MYX provider if enabled via feature flag.\n // Uses dynamic import so @myx-trade/sdk is excluded from the bundle\n // unless MM_PERPS_MYX_PROVIDER_ENABLED=true is set at build time.\n // Wrapped in try/catch so a missing module (stripped at build time)\n // only skips MYX registration instead of aborting initialization.\n const isMYXEnabled = this.#isMYXProviderEnabled();\n if (isMYXEnabled) {\n try {\n const { MYXProvider } = await import('./providers/MYXProvider.js');\n const myxProvider = new MYXProvider({\n isTestnet:\n PROVIDER_CONFIG.MYX_TESTNET_ONLY || this.state.isTestnet,\n platformDependencies: this.#options.infrastructure,\n });\n this.providers.set('myx', myxProvider);\n this.#debugLog('PerpsController: MYX provider registered', {\n isTestnet:\n PROVIDER_CONFIG.MYX_TESTNET_ONLY || this.state.isTestnet,\n });\n } catch {\n this.#debugLog(\n 'PerpsController: MYX provider module not available (stripped from build), skipping registration',\n );\n }\n }\n\n // Set up active provider based on activeProvider value in state\n // 'aggregated' is treated as just another provider that wraps others\n if (activeProvider === 'aggregated') {\n // Aggregated mode: wrap in AggregatedPerpsProvider for multi-provider support\n this.activeProviderInstance = new AggregatedPerpsProvider({\n providers: this.providers,\n defaultProvider: 'hyperliquid',\n infrastructure: this.#options.infrastructure,\n });\n this.#debugLog(\n 'PerpsController: Using aggregated provider (multi-provider)',\n { registeredProviders: Array.from(this.providers.keys()) },\n );\n } else if (activeProvider === 'hyperliquid') {\n // Direct provider mode: use HyperLiquid provider directly\n this.activeProviderInstance = hyperLiquidProvider;\n this.#debugLog(\n `PerpsController: Using direct provider (${activeProvider})`,\n );\n } else if (activeProvider === 'myx') {\n // MYX provider mode\n const myxProvider = this.providers.get('myx');\n if (myxProvider) {\n this.activeProviderInstance = myxProvider;\n } else {\n // MYX feature flag is disabled — fall back to HyperLiquid\n this.#debugLog(\n 'PerpsController: MYX provider not available (feature flag disabled), falling back to hyperliquid',\n );\n this.activeProviderInstance = hyperLiquidProvider;\n this.update((state) => {\n state.activeProvider = 'hyperliquid';\n });\n }\n this.#debugLog(\n `PerpsController: Using direct provider (${this.activeProviderInstance === hyperLiquidProvider ? 'hyperliquid' : activeProvider})`,\n );\n } else {\n // Unsupported provider - throw error to prevent silent misconfiguration\n throw new Error(\n `Unsupported provider: ${String(activeProvider)}. Currently only 'hyperliquid', 'myx', and 'aggregated' are supported.`,\n );\n }\n\n // Future providers can be added here with their own authentication patterns:\n // - Some might use API keys: new BinanceProvider({ apiKey, apiSecret })\n // - Some might use different wallet patterns: new GMXProvider({ signer })\n // - Some might not need auth at all: new DydxProvider()\n\n // Wait for WebSocket transport to be ready before marking as initialized\n await wait(PERPS_CONSTANTS.ReconnectionCleanupDelayMs);\n\n this.isInitialized = true;\n this.update((state) => {\n state.initializationState = InitializationState.Initialized;\n state.initializationError = null;\n });\n\n this.#debugLog('PerpsController: Providers initialized successfully', {\n providerCount: this.providers.size,\n activeProvider,\n timestamp: new Date().toISOString(),\n attempts: attempt,\n });\n\n return; // Exit retry loop on success\n } catch (error) {\n lastError = ensureError(error, 'PerpsController.performInitialization');\n\n this.#logError(\n lastError,\n this.#getErrorContext('performInitialization', {\n attempt,\n maxAttempts,\n }),\n );\n\n // If not the last attempt, wait before retrying (exponential backoff)\n if (attempt < maxAttempts) {\n const delay = baseDelay * Math.pow(2, attempt - 1); // 1s, 2s, 4s\n this.#debugLog(\n `PerpsController: Retrying initialization in ${delay}ms`,\n {\n attempt,\n maxAttempts,\n error: lastError.message,\n },\n );\n await wait(delay);\n }\n }\n }\n\n this.isInitialized = false;\n this.update((state) => {\n state.initializationState = InitializationState.Failed;\n state.initializationError = lastError?.message ?? 'Unknown error';\n });\n this.#initializationPromise = null; // Clear promise to allow retry\n\n this.#debugLog('PerpsController: Initialization failed', {\n error: lastError?.message,\n attempts: maxAttempts,\n timestamp: new Date().toISOString(),\n });\n }\n\n /**\n * Generate standard error context for Logger.error calls with searchable tags and context.\n * Enables Sentry dashboard filtering by feature, provider, and network.\n *\n * @param method - The method name where the error occurred\n * @param extra - Optional additional context fields (becomes searchable context data)\n * @returns PerpsLoggerOptions with tags (searchable) and context (searchable)\n * @private\n * @example\n * this.#logError(error, this.#getErrorContext('placeOrder', { symbol: 'BTC', operation: 'validate' }));\n * // Creates searchable tags: feature:perps, provider:hyperliquid, network:mainnet\n * // Creates searchable context: perps_controller.method:placeOrder, perps_controller.symbol:BTC, perps_controller.operation:validate\n */\n #getErrorContext(\n method: string,\n extra?: Record<string, unknown>,\n ): PerpsLoggerOptions {\n return {\n tags: {\n feature: PERPS_CONSTANTS.FeatureName,\n provider: this.state.activeProvider,\n network: this.state.isTestnet ? 'testnet' : 'mainnet',\n },\n context: {\n name: 'PerpsController',\n data: {\n method,\n ...extra,\n },\n },\n };\n }\n\n /**\n * Returns current controller state as PerpsControllerState.\n * Used by createServiceContext to avoid deep type instantiation when building stateManager.\n *\n * @returns The current controller state cast to PerpsControllerState.\n */\n #getControllerState(): PerpsControllerState {\n return this.state as unknown as PerpsControllerState;\n }\n\n /**\n * Create a ServiceContext for dependency injection into services\n * Provides all orchestration dependencies (tracing, analytics, state management)\n *\n * @param method - Method name for error context\n * @param additionalContext - Optional additional context (e.g., rewardsController, streamManager)\n * @returns ServiceContext with all required dependencies\n */\n #createServiceContext(\n method: string,\n additionalContext?: Partial<ServiceContext>,\n ): ServiceContext {\n return {\n tracingContext: {\n provider: this.state.activeProvider,\n isTestnet: this.state.isTestnet,\n },\n errorContext: {\n controller: 'PerpsController',\n method,\n },\n stateManager: {\n update: (updater: (state: PerpsControllerState) => void) =>\n // @ts-expect-error TS2589 - excessively deep instantiation when inferring stateManager from BaseController\n this.update(updater),\n getState: (): PerpsControllerState => this.#getControllerState(),\n },\n ...additionalContext,\n } as ServiceContext;\n }\n\n /**\n * Ensure TradingService has controller dependencies set.\n * RewardsIntegrationService uses messenger internally for controller access.\n */\n #ensureTradingServiceDeps(): void {\n this.#tradingService.setControllerDependencies({\n rewardsIntegrationService: this.#rewardsIntegrationService,\n });\n }\n\n /**\n * Get the currently active provider.\n * In aggregated mode, returns AggregatedPerpsProvider which routes to underlying providers.\n * In single provider mode, returns HyperLiquidProvider directly.\n *\n * @returns The active provider (aggregated wrapper or direct provider based on mode)\n * @throws Error if provider is not initialized or reinitializing\n */\n getActiveProvider(): PerpsProvider {\n // Check if we're in the middle of reinitializing\n if (this.isCurrentlyReinitializing()) {\n this.update((state) => {\n state.lastError = PERPS_ERROR_CODES.CLIENT_REINITIALIZING;\n state.lastUpdateTimestamp = Date.now();\n });\n throw new Error(PERPS_ERROR_CODES.CLIENT_REINITIALIZING);\n }\n\n // Check if not initialized\n if (\n this.state.initializationState !== InitializationState.Initialized ||\n !this.isInitialized\n ) {\n const errorMessage =\n this.state.initializationState === InitializationState.Failed\n ? `${PERPS_ERROR_CODES.CLIENT_NOT_INITIALIZED}: ${this.state.initializationError ?? 'Initialization failed'}`\n : PERPS_ERROR_CODES.CLIENT_NOT_INITIALIZED;\n\n this.update((state) => {\n state.lastError = errorMessage;\n state.lastUpdateTimestamp = Date.now();\n });\n throw new Error(errorMessage);\n }\n\n // Return the active provider instance (set during initialization based on providerMode)\n if (!this.activeProviderInstance) {\n this.update((state) => {\n state.lastError = PERPS_ERROR_CODES.PROVIDER_NOT_AVAILABLE;\n state.lastUpdateTimestamp = Date.now();\n });\n throw new Error(PERPS_ERROR_CODES.PROVIDER_NOT_AVAILABLE);\n }\n\n return this.activeProviderInstance;\n }\n\n /**\n * Get the currently active provider, returning null if not available\n * Use this method when the caller can gracefully handle a missing provider\n * (e.g., UI components during initialization or reconnection)\n *\n * @returns The active provider, or null if not initialized/reinitializing\n */\n getActiveProviderOrNull(): PerpsProvider | null {\n // Return null during reinitialization\n if (this.isCurrentlyReinitializing()) {\n return null;\n }\n\n // Return null if not initialized\n if (\n this.state.initializationState !== InitializationState.Initialized ||\n !this.isInitialized\n ) {\n return null;\n }\n\n // Return the active provider instance or null if not found\n return this.activeProviderInstance ?? null;\n }\n\n /**\n * Place a new order\n * Thin delegation to TradingService\n *\n * @param params - The operation parameters.\n * @returns The order result with order ID and status.\n */\n async placeOrder(params: OrderParams): Promise<OrderResult> {\n const provider = this.getActiveProvider();\n this.#ensureTradingServiceDeps();\n\n return this.#tradingService.placeOrder({\n provider,\n params,\n context: this.#createServiceContext('placeOrder', {\n saveTradeConfiguration: (symbol: string, leverage: number) =>\n this.saveTradeConfiguration(symbol, leverage),\n }),\n reportOrderToDataLake: (dataLakeParams) =>\n this.reportOrderToDataLake(dataLakeParams),\n });\n }\n\n /**\n * Edit an existing order\n * Thin delegation to TradingService\n *\n * @param params - The operation parameters.\n * @returns The updated order result with order ID and status.\n */\n async editOrder(params: EditOrderParams): Promise<OrderResult> {\n const provider = this.getActiveProvider();\n this.#ensureTradingServiceDeps();\n\n return this.#tradingService.editOrder({\n provider,\n params,\n context: this.#createServiceContext('editOrder'),\n });\n }\n\n /**\n * Cancel an existing order\n *\n * @param params - The operation parameters.\n * @returns The cancellation result with status.\n */\n async cancelOrder(params: CancelOrderParams): Promise<CancelOrderResult> {\n const provider = this.getActiveProvider();\n\n return this.#tradingService.cancelOrder({\n provider,\n params,\n context: this.#createServiceContext('cancelOrder'),\n });\n }\n\n /**\n * Cancel multiple orders in parallel\n * Batch version of cancelOrder() that cancels multiple orders simultaneously\n *\n * @param params - The operation parameters.\n * @returns The batch cancellation results for each order.\n */\n async cancelOrders(params: CancelOrdersParams): Promise<CancelOrdersResult> {\n const provider = this.getActiveProvider();\n\n return this.#tradingService.cancelOrders({\n provider,\n params,\n context: this.#createServiceContext('cancelOrders', {\n getOpenOrders: () => this.getOpenOrders(),\n }),\n withStreamPause: <TResult>(\n operation: () => Promise<TResult>,\n channels: string[],\n ) => this.#withStreamPause(operation, channels),\n });\n }\n\n /**\n * Close a position (partial or full)\n * Thin delegation to TradingService\n *\n * @param params - The operation parameters.\n * @returns The order result from the close position request.\n */\n async closePosition(params: ClosePositionParams): Promise<OrderResult> {\n const provider = this.getActiveProvider();\n this.#ensureTradingServiceDeps();\n\n return this.#tradingService.closePosition({\n provider,\n params,\n context: this.#createServiceContext('closePosition', {\n getPositions: () => this.getPositions(),\n }),\n reportOrderToDataLake: (dataLakeParams) =>\n this.reportOrderToDataLake(dataLakeParams),\n });\n }\n\n /**\n * Close multiple positions in parallel\n * Batch version of closePosition() that closes multiple positions simultaneously\n *\n * @param params - The operation parameters.\n * @returns The batch close results for each position.\n */\n async closePositions(\n params: ClosePositionsParams,\n ): Promise<ClosePositionsResult> {\n const provider = this.getActiveProvider();\n this.#ensureTradingServiceDeps();\n\n return this.#tradingService.closePositions({\n provider,\n params,\n context: this.#createServiceContext('closePositions', {\n getPositions: () => this.getPositions(),\n }),\n });\n }\n\n /**\n * Update TP/SL for an existing position\n *\n * @param params - The operation parameters.\n * @returns The order result from the TP/SL update.\n */\n async updatePositionTPSL(\n params: UpdatePositionTPSLParams,\n ): Promise<OrderResult> {\n const provider = this.getActiveProvider();\n this.#ensureTradingServiceDeps();\n\n return this.#tradingService.updatePositionTPSL({\n provider,\n params,\n context: this.#createServiceContext('updatePositionTPSL'),\n });\n }\n\n /**\n * Update margin for an existing position (add or remove)\n *\n * @param params - The operation parameters.\n * @returns The margin update result.\n */\n async updateMargin(params: UpdateMarginParams): Promise<MarginResult> {\n const provider = this.getActiveProvider();\n this.#ensureTradingServiceDeps();\n\n return this.#tradingService.updateMargin({\n provider,\n symbol: params.symbol,\n amount: params.amount,\n context: this.#createServiceContext('updateMargin'),\n });\n }\n\n /**\n * Flip position (reverse direction while keeping size and leverage)\n *\n * @param params - The operation parameters.\n * @returns The order result from the position flip.\n */\n async flipPosition(params: FlipPositionParams): Promise<OrderResult> {\n const provider = this.getActiveProvider();\n this.#ensureTradingServiceDeps();\n\n return this.#tradingService.flipPosition({\n provider,\n position: params.position,\n context: this.#createServiceContext('flipPosition'),\n });\n }\n\n /**\n * Simplified deposit method that prepares transaction for confirmation screen\n * No complex state tracking - just sets a loading flag\n *\n * @param params - Parameters for the deposit flow\n * @param params.amount - Optional deposit amount\n * @param params.placeOrder - If true, uses addTransaction instead of submit to avoid navigation\n * @returns An object containing a promise that resolves to the transaction hash.\n */\n async depositWithConfirmation(\n params: DepositWithConfirmationParams = {},\n ): Promise<{ result: Promise<string> }> {\n const { amount, placeOrder } = params;\n\n let currentDepositId: string | undefined;\n\n try {\n // Clear any stale results when starting a new deposit flow\n // Don't set depositInProgress yet - wait until user confirms\n\n // Prepare deposit transaction using DepositService\n const provider = this.getActiveProvider();\n const {\n transaction,\n assetChainId,\n currentDepositId: depositId,\n } = await this.#depositService.prepareTransaction({ provider });\n currentDepositId = depositId;\n\n // Get current account address via messenger (outside of update() for proper typing)\n const evmAccount = getSelectedEvmAccount(\n this.messenger.call(\n 'AccountTreeController:getAccountsFromSelectedAccountGroup',\n ),\n );\n const accountAddress = evmAccount?.address ?? 'unknown';\n\n this.update((state) => {\n state.lastDepositResult = null;\n\n // Add deposit request to tracking\n const depositRequest = {\n id: currentDepositId ?? uuidv4(),\n timestamp: Date.now(),\n amount: amount ?? '0', // Use provided amount or default to '0'\n asset: USDC_SYMBOL,\n accountAddress, // Track which account initiated deposit\n success: false, // Will be updated when transaction completes\n txHash: undefined,\n status: 'pending' as TransactionStatus,\n source: undefined,\n transactionId: undefined, // Will be set to depositId when available\n };\n\n state.depositRequests.unshift(depositRequest); // Add to beginning of array\n });\n\n const networkClientId = this.#findNetworkClientIdForChain(assetChainId);\n\n if (!networkClientId) {\n throw new Error(\n `No network client found for chain ${assetChainId}. Please add the network first.`,\n );\n }\n\n let result: Promise<string>;\n let transactionMeta: { id: string };\n let depositOrderResult: Promise<string> | null = null;\n\n const defaultTransactionOptions = {\n networkClientId,\n origin: ORIGIN_METAMASK,\n skipInitialGasEstimate: true,\n };\n\n if (placeOrder) {\n // Use addTransaction to create transaction without navigating to confirmation screen\n const addResult = await this.#submitTransaction(transaction, {\n ...defaultTransactionOptions,\n type: 'perpsDepositAndOrder',\n });\n transactionMeta = addResult.transactionMeta;\n // Return transaction ID immediately (fire-and-forget for caller)\n result = Promise.resolve(transactionMeta.id);\n // Track deposit request lifecycle via the real transaction result\n depositOrderResult = addResult.result;\n } else {\n // submit shows the confirmation screen and returns a promise\n // The promise will resolve when transaction completes or reject if cancelled/failed\n const submitResult = await this.#submitTransaction(transaction, {\n ...defaultTransactionOptions,\n type: 'perpsDeposit',\n });\n result = submitResult.result;\n transactionMeta = submitResult.transactionMeta;\n }\n\n // Store the transaction ID and try to get amount from transaction\n this.update((state) => {\n state.lastDepositTransactionId = transactionMeta.id;\n });\n\n // Track the transaction lifecycle only when using submit (deposit-only flow)\n if (!placeOrder) {\n // At this point, the confirmation modal is shown to the user\n // The result promise will resolve/reject based on user action and transaction outcome\n\n // Track the transaction lifecycle\n // The result promise will resolve/reject based on user action and transaction outcome\n // Note: We intentionally don't set depositInProgress immediately to avoid\n // showing toasts before the user confirms the transaction\n\n // TODO: @abretonc7s Find a better way to trigger our custom toast notification then having to toggle the state\n // How to replace the system notifications?\n result\n .then((actualTxHash) => {\n // Transaction was successfully completed\n // Set depositInProgress to true temporarily to show success\n this.update((state) => {\n state.depositInProgress = true;\n state.lastDepositResult = {\n success: true,\n txHash: actualTxHash,\n amount: amount ?? '0',\n asset: USDC_SYMBOL, // Default asset for deposits\n timestamp: Date.now(),\n error: '',\n };\n\n // Update the deposit request by request ID to avoid race conditions\n if (state.depositRequests.length > 0) {\n const requestToUpdate = state.depositRequests.find(\n (req) => req.id === currentDepositId,\n );\n if (requestToUpdate) {\n // For deposits, we have a txHash immediately, so mark as completed\n // (the transaction hash means the deposit was successful)\n requestToUpdate.status = 'completed' as TransactionStatus;\n requestToUpdate.success = true;\n requestToUpdate.txHash = actualTxHash;\n }\n }\n });\n\n // Clear depositInProgress after a short delay\n setTimeout(() => {\n this.update((state) => {\n state.depositInProgress = false;\n state.lastDepositTransactionId = null;\n });\n }, 100);\n\n return undefined;\n })\n .catch((error) => {\n // Check if user denied/cancelled the transaction\n const errorMessage = ensureError(\n error,\n 'PerpsController.initiateDeposit',\n ).message;\n const userCancelled =\n errorMessage.includes('User denied') ||\n errorMessage.includes('User rejected') ||\n errorMessage.includes('User cancelled') ||\n errorMessage.includes('User canceled');\n\n if (userCancelled) {\n // User cancelled - clear any state, no toast\n this.update((state) => {\n state.depositInProgress = false;\n state.lastDepositTransactionId = null;\n // Don't set lastDepositResult - no toast needed\n\n // Mark deposit request as cancelled\n const requestToUpdate = state.depositRequests.find(\n (req) => req.id === currentDepositId,\n );\n if (requestToUpdate) {\n requestToUpdate.status = 'cancelled' as TransactionStatus;\n requestToUpdate.success = false;\n }\n });\n } else {\n // Transaction failed after confirmation - show error toast\n this.update((state) => {\n state.depositInProgress = false;\n state.lastDepositTransactionId = null;\n state.lastDepositResult = {\n success: false,\n error: errorMessage,\n amount: amount ?? '0',\n asset: USDC_SYMBOL, // Default asset for deposits\n timestamp: Date.now(),\n txHash: '',\n };\n\n // Update the deposit request by request ID to avoid race conditions\n if (state.depositRequests.length > 0) {\n const requestToUpdate = state.depositRequests.find(\n (req) => req.id === currentDepositId,\n );\n if (requestToUpdate) {\n requestToUpdate.status = 'failed' as TransactionStatus;\n requestToUpdate.success = false;\n }\n }\n });\n }\n });\n } else if (depositOrderResult) {\n // Track deposit request lifecycle for deposit+order flow\n depositOrderResult\n .then((actualTxHash) => {\n this.update((state) => {\n const requestToUpdate = state.depositRequests.find(\n (req) => req.id === currentDepositId,\n );\n if (requestToUpdate) {\n requestToUpdate.status = 'completed' as TransactionStatus;\n requestToUpdate.success = true;\n requestToUpdate.txHash = actualTxHash;\n }\n });\n return undefined;\n })\n .catch((error) => {\n const errorMessage = ensureError(\n error,\n 'PerpsController.depositWithOrder',\n ).message;\n const isCancellation =\n errorMessage.includes('User denied') ||\n errorMessage.includes('User rejected') ||\n errorMessage.includes('cancelled') ||\n errorMessage.includes('canceled');\n this.update((state) => {\n const requestToUpdate = state.depositRequests.find(\n (req) => req.id === currentDepositId,\n );\n if (requestToUpdate) {\n requestToUpdate.status = (\n isCancellation ? 'cancelled' : 'failed'\n ) as TransactionStatus;\n requestToUpdate.success = false;\n }\n });\n });\n }\n\n return {\n result,\n };\n } catch (error) {\n // Check if user denied/cancelled the transaction\n const errorMessage = ensureError(\n error,\n 'PerpsController.initiateDeposit',\n ).message;\n const userCancelled =\n errorMessage.includes('User denied') ||\n errorMessage.includes('User rejected') ||\n errorMessage.includes('User cancelled') ||\n errorMessage.includes('User canceled');\n\n if (!userCancelled) {\n // Only track actual errors, not user cancellations\n this.update((state) => {\n state.lastDepositTransactionId = null;\n // Note: lastDepositResult is already set in the catch block above\n\n // Mark deposit request as failed if one was created\n if (currentDepositId) {\n const request = state.depositRequests.find(\n (req) => req.id === currentDepositId,\n );\n if (request) {\n request.status = 'failed' as TransactionStatus;\n request.success = false;\n }\n }\n });\n }\n throw error;\n }\n }\n\n /**\n * Same as depositWithConfirmation - prepares transaction for confirmation screen.\n *\n * @returns A promise that resolves to the string result.\n */\n async depositWithOrder(): Promise<{ result: Promise<string> }> {\n return this.depositWithConfirmation({ placeOrder: true });\n }\n\n /**\n * Clear the last deposit result after it has been shown to the user\n */\n clearDepositResult(): void {\n this.update((state) => {\n state.lastDepositResult = null;\n });\n }\n\n clearWithdrawResult(): void {\n this.update((state) => {\n state.lastWithdrawResult = null;\n });\n }\n\n /**\n * Update withdrawal request status when it completes\n * This is called when a withdrawal is matched with a completed withdrawal from the API\n *\n * @param withdrawalId - The withdrawal transaction ID.\n * @param status - The current status.\n * @param txHash - The transaction hash.\n */\n updateWithdrawalStatus(\n withdrawalId: string,\n status: 'completed' | 'failed',\n txHash?: string,\n ): void {\n let withdrawalAmount: string | undefined;\n let shouldTrack = false;\n let found = false;\n\n this.update((state) => {\n const withdrawalIndex = state.withdrawalRequests.findIndex(\n (request) => request.id === withdrawalId,\n );\n\n if (withdrawalIndex >= 0) {\n found = true;\n const request = state.withdrawalRequests[withdrawalIndex];\n withdrawalAmount = request.amount;\n shouldTrack =\n withdrawalAmount !== undefined && request.status !== status;\n request.status = status;\n request.success = status === 'completed';\n if (txHash) {\n request.txHash = txHash;\n }\n\n // Clear withdrawal progress when withdrawal completes\n if (status === 'completed' || status === 'failed') {\n state.withdrawalProgress = {\n progress: 0,\n lastUpdated: Date.now(),\n activeWithdrawalId: null,\n };\n }\n }\n });\n\n if (shouldTrack && withdrawalAmount !== undefined) {\n this.#getMetrics().trackPerpsEvent(\n PerpsAnalyticsEvent.WithdrawalTransaction,\n {\n [PERPS_EVENT_PROPERTY.STATUS]:\n status === 'completed'\n ? PERPS_EVENT_VALUE.STATUS.COMPLETED\n : PERPS_EVENT_VALUE.STATUS.FAILED,\n [PERPS_EVENT_PROPERTY.WITHDRAWAL_AMOUNT]:\n Number.parseFloat(withdrawalAmount),\n },\n );\n }\n\n if (found) {\n this.#debugLog('PerpsController: Updated withdrawal status', {\n withdrawalId,\n status,\n txHash,\n });\n }\n }\n\n /**\n * Update withdrawal progress (persistent across navigation)\n *\n * @param progress - The progress indicator.\n * @param activeWithdrawalId - The active withdrawal ID.\n */\n updateWithdrawalProgress(\n progress: number,\n activeWithdrawalId: string | null = null,\n ): void {\n this.update((state) => {\n state.withdrawalProgress = {\n progress,\n lastUpdated: Date.now(),\n activeWithdrawalId,\n };\n });\n }\n\n /**\n * Get current withdrawal progress\n *\n * @returns The withdrawal progress, last update timestamp, and active withdrawal ID.\n */\n getWithdrawalProgress(): {\n progress: number;\n lastUpdated: number;\n activeWithdrawalId: string | null;\n } {\n return this.state.withdrawalProgress;\n }\n\n /**\n * Withdraw funds from trading account\n *\n * The withdrawal process varies by provider and may involve:\n * - Direct on-chain transfers\n * - Bridge operations\n * - Multi-step validation processes\n *\n * Check the specific provider documentation for detailed withdrawal flows.\n *\n * @param params Withdrawal parameters\n * @returns WithdrawResult with withdrawal ID and tracking info\n */\n async withdraw(params: WithdrawParams): Promise<WithdrawResult> {\n const provider = this.getActiveProvider();\n\n return this.#accountService.withdraw({\n provider,\n params,\n context: this.#createServiceContext('withdraw'),\n refreshAccountState: async () => {\n await this.getAccountState({ source: 'post_withdrawal' });\n },\n });\n }\n\n /**\n * Get current positions\n * Thin delegation to MarketDataService\n *\n * For standalone mode, bypasses getActiveProvider() to allow position queries\n * without full perps initialization (e.g., for showing positions on token details page)\n *\n * @param params - The operation parameters.\n * @returns Array of open positions for the active provider.\n */\n async getPositions(params?: GetPositionsParams): Promise<Position[]> {\n // For standalone mode, access provider directly without initialization check\n // This allows discovery use cases (checking if user has positions) without full perps setup\n if (params?.standalone && params.userAddress) {\n // Use activeProviderInstance if available (respects provider abstraction)\n // Fallback to cached standalone provider for pre-initialization discovery\n // TODO: When adding new providers (MYX), consider a provider factory pattern\n const provider =\n this.activeProviderInstance ?? this.#getOrCreateStandaloneProvider();\n return provider.getPositions(params);\n }\n\n const provider = this.getActiveProvider();\n return this.#marketDataService.getPositions({\n provider,\n params,\n context: this.#createServiceContext('getPositions'),\n });\n }\n\n /**\n * Get historical user fills (trade executions)\n * Thin delegation to MarketDataService\n *\n * @param params - The operation parameters.\n * @returns Array of historical trade executions (fills).\n */\n async getOrderFills(params?: GetOrderFillsParams): Promise<OrderFill[]> {\n const provider = this.getActiveProvider();\n return this.#marketDataService.getOrderFills({\n provider,\n params,\n context: this.#createServiceContext('getOrderFills'),\n });\n }\n\n /**\n * Get historical user orders (order lifecycle)\n * Thin delegation to MarketDataService\n *\n * @param params - The operation parameters.\n * @returns Array of historical orders.\n */\n async getOrders(params?: GetOrdersParams): Promise<Order[]> {\n const provider = this.getActiveProvider();\n return this.#marketDataService.getOrders({\n provider,\n params,\n context: this.#createServiceContext('getOrders'),\n });\n }\n\n /**\n * Get currently open orders (real-time status)\n * Thin delegation to MarketDataService\n *\n * For standalone mode, bypasses getActiveProvider() to allow open order queries\n * without full perps initialization (e.g., for background preloading)\n *\n * @param params - The operation parameters.\n * @returns A promise that resolves to the result.\n */\n async getOpenOrders(params?: GetOrdersParams): Promise<Order[]> {\n // For standalone mode, access provider directly without initialization check\n if (params?.standalone && params.userAddress) {\n const provider =\n this.activeProviderInstance ?? this.#getOrCreateStandaloneProvider();\n return provider.getOpenOrders(params);\n }\n\n const provider = this.getActiveProvider();\n return this.#marketDataService.getOpenOrders({\n provider,\n params,\n context: this.#createServiceContext('getOpenOrders'),\n });\n }\n\n /**\n * Get historical user funding history (funding payments)\n * Thin delegation to MarketDataService\n *\n * @param params - The operation parameters.\n * @returns Array of historical funding payments.\n */\n async getFunding(params?: GetFundingParams): Promise<Funding[]> {\n const provider = this.getActiveProvider();\n return this.#marketDataService.getFunding({\n provider,\n params,\n context: this.#createServiceContext('getFunding'),\n });\n }\n\n /**\n * Get account state (balances, etc.)\n * Thin delegation to MarketDataService\n *\n * For standalone mode, bypasses getActiveProvider() to allow account state queries\n * without full perps initialization (e.g., for checking if user has perps funds)\n *\n * @param params - The operation parameters.\n * @returns A promise that resolves to the result.\n */\n async getAccountState(params?: GetAccountStateParams): Promise<AccountState> {\n // For standalone mode, access provider directly without initialization check\n // This allows discovery use cases (checking if user has perps funds) without full perps setup\n if (params?.standalone && params.userAddress) {\n // Use activeProviderInstance if available (respects provider abstraction)\n // Fallback to cached standalone provider for pre-initialization discovery\n const provider =\n this.activeProviderInstance ?? this.#getOrCreateStandaloneProvider();\n return provider.getAccountState(params);\n }\n\n const provider = this.getActiveProvider();\n return this.#marketDataService.getAccountState({\n provider,\n params,\n context: this.#createServiceContext('getAccountState'),\n });\n }\n\n /**\n * Get historical portfolio data\n * Thin delegation to MarketDataService\n *\n * @param params - The operation parameters.\n * @returns The historical portfolio data points.\n */\n async getHistoricalPortfolio(\n params?: GetHistoricalPortfolioParams,\n ): Promise<HistoricalPortfolioResult> {\n const provider = this.getActiveProvider();\n return this.#marketDataService.getHistoricalPortfolio({\n provider,\n params,\n context: this.#createServiceContext('getHistoricalPortfolio'),\n });\n }\n\n /**\n * Get available markets with optional filtering\n * Thin delegation to MarketDataService\n *\n * For standalone mode, bypasses getActiveProvider() to allow market discovery\n * without full perps initialization (e.g., for discovery banners on spot screens)\n *\n * @param params - The operation parameters.\n * @returns Array of available markets matching the filter criteria.\n */\n async getMarkets(params?: GetMarketsParams): Promise<MarketInfo[]> {\n // For standalone mode, access provider directly without initialization check\n // This allows discovery use cases (checking if market exists) without full perps setup\n if (params?.standalone) {\n // Use activeProviderInstance if available (respects provider abstraction)\n // Fallback to cached standalone provider for pre-initialization discovery\n const provider =\n this.activeProviderInstance ?? this.#getOrCreateStandaloneProvider();\n return provider.getMarkets(params);\n }\n\n const provider = this.getActiveProvider();\n return this.#marketDataService.getMarkets({\n provider,\n params,\n context: this.#createServiceContext('getMarkets'),\n });\n }\n\n /**\n * Get market data with prices (includes price, volume, 24h change)\n *\n * For standalone mode, bypasses getActiveProvider() to allow market data queries\n * without full perps initialization (e.g., for background preloading on app start)\n *\n * @param params - The operation parameters.\n * @param params.standalone - Whether to use standalone mode.\n * @returns A promise that resolves to the market data.\n */\n async getMarketDataWithPrices(params?: {\n standalone?: boolean;\n }): Promise<PerpsMarketData[]> {\n if (params?.standalone) {\n // Use activeProviderInstance if available (respects provider abstraction)\n // Fallback to cached standalone provider for pre-initialization discovery\n const provider =\n this.activeProviderInstance ?? this.#getOrCreateStandaloneProvider();\n return provider.getMarketDataWithPrices();\n }\n\n const provider = this.getActiveProvider();\n return provider.getMarketDataWithPrices();\n }\n\n // ============================================================================\n // Market Data Preload (client-agnostic background caching)\n // ============================================================================\n\n /** State paths that the preload stateChange handler reads. */\n static readonly #preloadWatchedPaths = new Set([\n 'isTestnet',\n 'hip3ConfigVersion',\n ]);\n\n #preloadTimer: ReturnType<typeof setInterval> | null = null;\n\n #isPreloading = false;\n\n #isPreloadingUserData = false;\n\n #preloadStateUnsubscribe: (() => void) | null = null;\n\n #accountChangeUnsubscribe: (() => void) | null = null;\n\n #previousIsTestnet: boolean | null = null;\n\n #previousHip3ConfigVersion: number | null = null;\n\n static readonly #preloadRefreshMs = 5 * 60 * 1000; // 5 min\n\n static readonly #preloadGuardMs = 30_000; // 30s debounce\n\n /**\n * Start background market data preloading.\n * Fetches market data immediately and refreshes every 5 minutes.\n * Watches for isTestnet and hip3ConfigVersion changes to re-preload.\n */\n startMarketDataPreload(): void {\n if (this.#preloadTimer) {\n this.#debugLog('PerpsController: Preload already started, skipping');\n return;\n }\n\n this.#debugLog('PerpsController: Starting market data preload');\n\n // Track current values for change detection\n this.#previousIsTestnet = this.state.isTestnet;\n this.#previousHip3ConfigVersion = this.state.hip3ConfigVersion;\n\n // Immediate preload\n this.#performMarketDataPreload().catch(() => {\n /* fire-and-forget */\n });\n\n // Periodic refresh\n this.#preloadTimer = setInterval(() => {\n this.#performMarketDataPreload().catch(() => {\n /* fire-and-forget */\n });\n }, PerpsController.#preloadRefreshMs);\n\n // Watch for isTestnet / hip3ConfigVersion / cachedUserDataAddress changes\n const handler: StateChangeListener<PerpsControllerState> = (\n _state,\n patches,\n ) => {\n // Early-return when no watched field changed (skips ~46 unrelated updates)\n const hasRelevantChange = patches.some(\n (patch) =>\n typeof patch.path[0] === 'string' &&\n PerpsController.#preloadWatchedPaths.has(patch.path[0]),\n );\n if (!hasRelevantChange) {\n return;\n }\n\n const currentIsTestnet = this.state.isTestnet;\n const currentHip3Version = this.state.hip3ConfigVersion;\n\n const testnetChanged = currentIsTestnet !== this.#previousIsTestnet;\n const hip3Changed =\n currentHip3Version !== this.#previousHip3ConfigVersion;\n\n if (testnetChanged || hip3Changed) {\n this.#debugLog(\n 'PerpsController: Network/config changed, re-preloading',\n {\n testnetChanged,\n hip3Changed,\n isTestnet: currentIsTestnet,\n hip3ConfigVersion: currentHip3Version,\n },\n );\n\n this.#previousIsTestnet = currentIsTestnet;\n this.#previousHip3ConfigVersion = currentHip3Version;\n\n // Clear stale cache (market + user data)\n this.update((state) => {\n state.cachedMarketData = null;\n state.cachedMarketDataTimestamp = 0;\n state.cachedPositions = null;\n state.cachedOrders = null;\n state.cachedAccountState = null;\n state.cachedUserDataTimestamp = 0;\n state.cachedUserDataAddress = null;\n });\n\n this.#performMarketDataPreload().catch(() => {\n /* fire-and-forget */\n });\n }\n };\n\n this.messenger.subscribe('PerpsController:stateChange', handler);\n this.#preloadStateUnsubscribe = (): void => {\n this.messenger.unsubscribe('PerpsController:stateChange', handler);\n };\n\n // Watch for account changes via AccountTreeController\n const accountChangeHandler = (): void => {\n const evmAccount = getSelectedEvmAccount(\n this.messenger.call(\n 'AccountTreeController:getAccountsFromSelectedAccountGroup',\n ),\n );\n const currentAddress = evmAccount?.address ?? null;\n\n // If there's cached data from a different account (or no EVM account now), clear it\n if (\n this.state.cachedUserDataAddress !== null &&\n currentAddress !== this.state.cachedUserDataAddress\n ) {\n this.#debugLog(\n 'PerpsController: Account changed, clearing user data cache',\n );\n this.update((state) => {\n state.cachedPositions = null;\n state.cachedOrders = null;\n state.cachedAccountState = null;\n state.cachedUserDataTimestamp = 0;\n state.cachedUserDataAddress = null;\n });\n // Only preload if the new account is an EVM account\n if (currentAddress) {\n this.#performUserDataPreload().catch(() => {\n /* fire-and-forget */\n });\n }\n }\n };\n this.messenger.subscribe(\n 'AccountTreeController:selectedAccountGroupChange',\n accountChangeHandler,\n );\n this.#accountChangeUnsubscribe = (): void => {\n this.messenger.unsubscribe(\n 'AccountTreeController:selectedAccountGroupChange',\n accountChangeHandler,\n );\n };\n }\n\n /**\n * Stop background market data preloading.\n */\n stopMarketDataPreload(): void {\n this.#debugLog('PerpsController: Stopping market data preload');\n if (this.#preloadTimer) {\n clearInterval(this.#preloadTimer);\n this.#preloadTimer = null;\n }\n if (this.#preloadStateUnsubscribe) {\n this.#preloadStateUnsubscribe();\n this.#preloadStateUnsubscribe = null;\n }\n if (this.#accountChangeUnsubscribe) {\n this.#accountChangeUnsubscribe();\n this.#accountChangeUnsubscribe = null;\n }\n this.#previousIsTestnet = null;\n this.#previousHip3ConfigVersion = null;\n this.#cleanupStandaloneProvider().catch(() => {\n /* fire-and-forget to preserve sync signature */\n });\n }\n\n /**\n * Perform a single market data preload (best-effort, no throw).\n */\n async #performMarketDataPreload(): Promise<void> {\n if (this.#isPreloading) {\n return;\n }\n\n const now = Date.now();\n if (\n now - this.state.cachedMarketDataTimestamp <\n PerpsController.#preloadGuardMs\n ) {\n return;\n }\n\n this.#isPreloading = true;\n const traceId = uuidv4();\n const preloadStart = performance.now();\n let traceData:\n | { success: boolean; marketCount?: number; error?: string }\n | undefined;\n\n try {\n this.#options.infrastructure.tracer.trace({\n name: PerpsTraceNames.MarketDataPreload,\n id: traceId,\n op: PerpsTraceOperations.Operation,\n tags: {\n provider: this.state.activeProvider,\n isTestnet: this.state.isTestnet,\n },\n });\n\n this.#debugLog('PerpsController: Fetching market data in background');\n const data = await this.getMarketDataWithPrices({ standalone: true });\n\n this.update((state) => {\n state.cachedMarketData = data;\n state.cachedMarketDataTimestamp = Date.now();\n });\n\n this.#debugLog('PerpsController: Market data preloaded', {\n marketCount: data.length,\n });\n\n traceData = { success: true, marketCount: data.length };\n\n this.#options.infrastructure.tracer.setMeasurement(\n PerpsMeasurementName.PerpsMarketDataPreload,\n performance.now() - preloadStart,\n 'millisecond',\n );\n\n // Also preload user data (fire-and-forget, non-blocking)\n this.#performUserDataPreload().catch(() => {\n /* fire-and-forget */\n });\n } catch (error) {\n traceData = {\n success: false,\n error: ensureError(error, 'PerpsController.performMarketDataPreload')\n .message,\n };\n this.#logError(\n ensureError(error, 'PerpsController.performMarketDataPreload'),\n this.#getErrorContext('performMarketDataPreload', {\n message: 'Background preload failed',\n }),\n );\n } finally {\n this.#options.infrastructure.tracer.endTrace({\n name: PerpsTraceNames.MarketDataPreload,\n id: traceId,\n data: traceData,\n });\n this.#isPreloading = false;\n }\n }\n\n /**\n * Perform a single user data preload (best-effort, no throw).\n * Fetches positions, open orders, and account state via lightweight REST calls.\n */\n async #performUserDataPreload(): Promise<void> {\n if (this.#isPreloadingUserData) {\n return;\n }\n\n // Get current user address\n const evmAccount = getSelectedEvmAccount(\n this.messenger.call(\n 'AccountTreeController:getAccountsFromSelectedAccountGroup',\n ),\n );\n if (!evmAccount?.address) {\n return;\n }\n\n const userAddress = evmAccount.address;\n\n // Skip if cache is fresh and for same account\n const now = Date.now();\n if (\n this.state.cachedUserDataAddress === userAddress &&\n now - this.state.cachedUserDataTimestamp < PerpsController.#preloadGuardMs\n ) {\n return;\n }\n\n // Skip standalone REST polling when WebSocket is connected — live data is streaming\n if (\n this.getWebSocketConnectionState() === WebSocketConnectionState.Connected\n ) {\n this.#debugLog(\n 'PerpsController: Skipping user data preload — WebSocket connected',\n );\n return;\n }\n\n this.#isPreloadingUserData = true;\n const traceId = uuidv4();\n const preloadStart = performance.now();\n let traceData:\n | {\n success: boolean;\n positionCount?: number;\n orderCount?: number;\n error?: string;\n }\n | undefined;\n\n try {\n this.#options.infrastructure.tracer.trace({\n name: PerpsTraceNames.UserDataPreload,\n id: traceId,\n op: PerpsTraceOperations.Operation,\n tags: {\n provider: this.state.activeProvider,\n isTestnet: this.state.isTestnet,\n },\n data: { userAddress },\n });\n\n this.#debugLog('PerpsController: Fetching user data in background', {\n userAddress,\n });\n\n const [positions, orders, accountState] = await Promise.all([\n this.getPositions({ standalone: true, userAddress }),\n this.getOpenOrders({ standalone: true, userAddress }),\n this.getAccountState({ standalone: true, userAddress }),\n ]);\n\n this.update((state) => {\n state.cachedPositions = positions;\n state.cachedOrders = orders;\n state.cachedAccountState = accountState;\n state.cachedUserDataTimestamp = Date.now();\n state.cachedUserDataAddress = userAddress;\n });\n\n this.#debugLog('PerpsController: User data preloaded', {\n positionCount: positions.length,\n orderCount: orders.length,\n totalBalance: accountState.totalBalance,\n });\n\n traceData = {\n success: true,\n positionCount: positions.length,\n orderCount: orders.length,\n };\n\n this.#options.infrastructure.tracer.setMeasurement(\n PerpsMeasurementName.PerpsUserDataPreload,\n performance.now() - preloadStart,\n 'millisecond',\n );\n } catch (error) {\n traceData = {\n success: false,\n error: ensureError(error, 'PerpsController.performUserDataPreload')\n .message,\n };\n this.#logError(\n ensureError(error, 'PerpsController.performUserDataPreload'),\n this.#getErrorContext('performUserDataPreload', {\n message: 'Background user data preload failed',\n }),\n );\n } finally {\n this.#options.infrastructure.tracer.endTrace({\n name: PerpsTraceNames.UserDataPreload,\n id: traceId,\n data: traceData,\n });\n this.#isPreloadingUserData = false;\n }\n }\n\n /**\n * Get list of available HIP-3 builder-deployed DEXs\n *\n * @param params - Optional parameters for filtering\n * @returns Array of DEX names\n */\n async getAvailableDexs(params?: GetAvailableDexsParams): Promise<string[]> {\n const provider = this.getActiveProvider();\n const context = this.#createServiceContext('getAvailableDexs');\n return this.#marketDataService.getAvailableDexs({\n provider,\n params,\n context,\n });\n }\n\n /**\n * Fetch historical candle data\n * Thin delegation to MarketDataService\n *\n * @param options - The configuration options.\n * @param options.symbol - The trading pair symbol.\n * @param options.interval - The candle interval period.\n * @param options.limit - Maximum number of items to fetch.\n * @param options.endTime - End timestamp in milliseconds.\n * @returns The historical candle data for the requested symbol and interval.\n */\n async fetchHistoricalCandles(options: {\n symbol: string;\n interval: CandlePeriod;\n limit?: number;\n endTime?: number;\n }): Promise<CandleData> {\n const { symbol, interval, limit = 100, endTime } = options;\n const provider = this.getActiveProvider();\n return this.#marketDataService.fetchHistoricalCandles({\n provider,\n symbol,\n interval,\n limit,\n endTime,\n context: this.#createServiceContext('fetchHistoricalCandles'),\n });\n }\n\n /**\n * Calculate liquidation price for a position\n * Uses provider-specific formulas based on protocol rules\n *\n * @param params - The operation parameters.\n * @returns A promise that resolves to the string result.\n */\n async calculateLiquidationPrice(\n params: LiquidationPriceParams,\n ): Promise<string> {\n const provider = this.getActiveProvider();\n const context = this.#createServiceContext('calculateLiquidationPrice');\n return this.#marketDataService.calculateLiquidationPrice({\n provider,\n params,\n context,\n });\n }\n\n /**\n * Calculate maintenance margin for a specific asset\n * Returns a percentage (e.g., 0.0125 for 1.25%)\n *\n * @param params - The operation parameters.\n * @returns A promise that resolves to the numeric result.\n */\n async calculateMaintenanceMargin(\n params: MaintenanceMarginParams,\n ): Promise<number> {\n const provider = this.getActiveProvider();\n const context = this.#createServiceContext('calculateMaintenanceMargin');\n return this.#marketDataService.calculateMaintenanceMargin({\n provider,\n params,\n context,\n });\n }\n\n /**\n * Get maximum leverage allowed for an asset\n *\n * @param asset - The asset identifier.\n * @returns A promise that resolves to the numeric result.\n */\n async getMaxLeverage(asset: string): Promise<number> {\n const provider = this.getActiveProvider();\n const context = this.#createServiceContext('getMaxLeverage');\n return this.#marketDataService.getMaxLeverage({ provider, asset, context });\n }\n\n /**\n * Validate order parameters according to protocol-specific rules\n *\n * @param params - The operation parameters.\n * @returns True if the condition is met.\n */\n async validateOrder(\n params: OrderParams,\n ): Promise<{ isValid: boolean; error?: string }> {\n const provider = this.getActiveProvider();\n const context = this.#createServiceContext('validateOrder');\n return this.#marketDataService.validateOrder({ provider, params, context });\n }\n\n /**\n * Validate close position parameters according to protocol-specific rules\n *\n * @param params - The operation parameters.\n * @returns A promise that resolves to the result.\n */\n async validateClosePosition(\n params: ClosePositionParams,\n ): Promise<{ isValid: boolean; error?: string }> {\n const provider = this.getActiveProvider();\n const context = this.#createServiceContext('validateClosePosition');\n return this.#marketDataService.validateClosePosition({\n provider,\n params,\n context,\n });\n }\n\n /**\n * Validate withdrawal parameters according to protocol-specific rules\n *\n * @param params - The operation parameters.\n * @returns True if the condition is met.\n */\n async validateWithdrawal(\n params: WithdrawParams,\n ): Promise<{ isValid: boolean; error?: string }> {\n const provider = this.getActiveProvider();\n return this.#accountService.validateWithdrawal({ provider, params });\n }\n\n /**\n * Get supported withdrawal routes - returns complete asset and routing information\n *\n * @returns Array of supported asset routes for withdrawals.\n */\n getWithdrawalRoutes(): AssetRoute[] {\n try {\n const provider = this.getActiveProvider();\n return this.#marketDataService.getWithdrawalRoutes({ provider });\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.getWithdrawalRoutes'),\n this.#getErrorContext('getWithdrawalRoutes'),\n );\n // Return empty array if provider is not available\n return [];\n }\n }\n\n /**\n * Toggle between testnet and mainnet\n *\n * @returns The toggle result with success status and current network mode.\n */\n async toggleTestnet(): Promise<ToggleTestnetResult> {\n // Prevent concurrent reinitializations\n if (this.isCurrentlyReinitializing()) {\n this.#debugLog(\n 'PerpsController: Already reinitializing, skipping toggle',\n {\n timestamp: new Date().toISOString(),\n },\n );\n return {\n success: false,\n isTestnet: this.state.isTestnet,\n error: PERPS_ERROR_CODES.CLIENT_REINITIALIZING,\n };\n }\n\n this.#isReinitializing = true;\n\n // Store previous isTestnet for rollback on failure\n const previousIsTestnet = this.state.isTestnet;\n\n try {\n await this.#cleanupStandaloneProvider();\n\n const previousNetwork = previousIsTestnet ? 'testnet' : 'mainnet';\n\n this.update((state) => {\n state.isTestnet = !state.isTestnet;\n });\n\n const newNetwork = this.state.isTestnet ? 'testnet' : 'mainnet';\n\n this.#debugLog('PerpsController: Network toggle initiated', {\n from: previousNetwork,\n to: newNetwork,\n timestamp: new Date().toISOString(),\n });\n\n // Reset initialization state and reinitialize provider with new testnet setting\n this.isInitialized = false;\n this.#initializationPromise = null;\n await this.init();\n\n // Check if initialization actually succeeded — performInitialization()\n // does not throw on failure, it sets state to Failed and resolves.\n if (this.state.initializationState === InitializationState.Failed) {\n throw new Error(\n this.state.initializationError ??\n 'Network toggle initialization failed',\n );\n }\n\n this.#debugLog('PerpsController: Network toggle completed', {\n newNetwork,\n isTestnet: this.state.isTestnet,\n timestamp: new Date().toISOString(),\n });\n\n return { success: true, isTestnet: this.state.isTestnet };\n } catch (error) {\n // Rollback isTestnet to previous value\n this.update((state) => {\n state.isTestnet = previousIsTestnet;\n });\n\n return {\n success: false,\n isTestnet: this.state.isTestnet,\n error: ensureError(error, 'PerpsController.toggleTestnet').message,\n };\n } finally {\n this.#isReinitializing = false;\n }\n }\n\n /**\n * Switch to a different provider\n * Uses a full reinit approach: disconnect() → update state → init()\n * This ensures complete state reset including WebSocket connections and caches.\n *\n * @param providerId - The provider identifier.\n * @returns The switch result with success status and active provider.\n */\n async switchProvider(\n providerId: PerpsActiveProviderMode,\n ): Promise<SwitchProviderResult> {\n // No-op if already on this provider (regardless of init state)\n if (this.state.activeProvider === providerId) {\n return { success: true, providerId };\n }\n\n // Validate provider is available\n // 'aggregated' is always valid, individual providers must exist in the map\n const isValidProvider =\n providerId === 'aggregated' || this.providers.has(providerId);\n\n if (!isValidProvider) {\n return {\n success: false,\n providerId: this.state.activeProvider,\n error: `Provider ${providerId} not available`,\n };\n }\n\n // Prevent concurrent switches\n if (this.isCurrentlyReinitializing()) {\n return {\n success: false,\n providerId: this.state.activeProvider,\n error: PERPS_ERROR_CODES.CLIENT_REINITIALIZING,\n };\n }\n\n this.#isReinitializing = true;\n\n // Store previous provider for rollback on failure\n const previousProvider = this.state.activeProvider;\n\n try {\n await this.#cleanupStandaloneProvider();\n\n this.#debugLog('PerpsController: Provider switch initiated', {\n from: previousProvider,\n to: providerId,\n timestamp: new Date().toISOString(),\n });\n\n // Provider disconnect is handled by performInitialization() during\n // reinitialization. The disconnect() method skips provider teardown\n // when isReinitializing is true to prevent double-disconnect.\n\n // Update state with new provider\n this.update((state) => {\n state.activeProvider = providerId;\n state.accountState = null;\n state.initializationState = InitializationState.Uninitialized;\n });\n\n // Reset initialization state and reinitialize\n this.isInitialized = false;\n this.#initializationPromise = null;\n await this.init();\n\n // Check if initialization actually succeeded — performInitialization()\n // does not throw on failure, it sets state to Failed and resolves.\n if (this.state.initializationState === InitializationState.Failed) {\n throw new Error(\n this.state.initializationError ?? 'Provider initialization failed',\n );\n }\n\n this.#debugLog('PerpsController: Provider switch completed', {\n providerId,\n timestamp: new Date().toISOString(),\n });\n\n return { success: true, providerId };\n } catch (error) {\n // Rollback state to previous provider\n this.update((state) => {\n state.activeProvider = previousProvider;\n });\n\n this.#logError(\n ensureError(error, 'PerpsController.switchProvider'),\n this.#getErrorContext('switchProvider', { providerId }),\n );\n\n // Attempt to reinitialize the previous provider via init(),\n // which handles all provider modes including 'aggregated'.\n try {\n this.isInitialized = false;\n this.#initializationPromise = null;\n await this.init();\n\n this.#debugLog(\n 'PerpsController: Rollback to previous provider succeeded',\n {\n previousProvider,\n timestamp: new Date().toISOString(),\n },\n );\n } catch (reinitError) {\n // Reinit also failed — mark as failed\n this.update((state) => {\n state.initializationState = InitializationState.Failed;\n });\n this.#logError(\n ensureError(reinitError, 'PerpsController.switchProvider.rollback'),\n this.#getErrorContext('switchProvider.rollback', {\n previousProvider,\n }),\n );\n }\n\n return {\n success: false,\n providerId: previousProvider,\n error:\n error instanceof Error\n ? error.message\n : PERPS_ERROR_CODES.UNKNOWN_ERROR,\n };\n } finally {\n this.#isReinitializing = false;\n }\n }\n\n /**\n * Get current network (mainnet/testnet)\n *\n * @returns Either 'mainnet' or 'testnet' based on the current configuration.\n */\n getCurrentNetwork(): 'mainnet' | 'testnet' {\n return this.state.isTestnet ? 'testnet' : 'mainnet';\n }\n\n /**\n * Get the current WebSocket connection state from the active provider.\n * Used by the UI to monitor connection health and show notifications.\n *\n * @returns The current WebSocket connection state, or DISCONNECTED if not supported\n */\n getWebSocketConnectionState(): WebSocketConnectionState {\n try {\n const provider = this.getActiveProvider();\n if (provider.getWebSocketConnectionState) {\n return provider.getWebSocketConnectionState();\n }\n // Fallback for providers that don't support this method\n return WebSocketConnectionState.Disconnected;\n } catch {\n // If no provider is active, return disconnected\n return WebSocketConnectionState.Disconnected;\n }\n }\n\n /**\n * Subscribe to WebSocket connection state changes from the active provider.\n * The listener will be called immediately with the current state and whenever the state changes.\n *\n * @param listener - Callback function that receives the new connection state and reconnection attempt\n * @returns Unsubscribe function to remove the listener, or no-op if not supported\n */\n subscribeToConnectionState(\n listener: (\n state: WebSocketConnectionState,\n reconnectionAttempt: number,\n ) => void,\n ): () => void {\n try {\n const provider = this.getActiveProvider();\n if (provider.subscribeToConnectionState) {\n return provider.subscribeToConnectionState(listener);\n }\n // Fallback: immediately call with current state and return no-op unsubscribe\n listener(this.getWebSocketConnectionState(), 0);\n return () => {\n // No-op\n };\n } catch {\n // If no provider is active, call with disconnected and return no-op\n listener(WebSocketConnectionState.Disconnected, 0);\n return () => {\n // No-op\n };\n }\n }\n\n /**\n * Manually trigger a WebSocket reconnection attempt.\n * Used by the UI retry button when connection is lost.\n */\n async reconnect(): Promise<void> {\n this.#debugLog('[PerpsController] reconnect() called');\n try {\n const provider = this.getActiveProvider();\n if (provider.reconnect) {\n this.#debugLog('[PerpsController] Delegating to provider.reconnect()');\n await provider.reconnect();\n this.#debugLog('[PerpsController] provider.reconnect() completed');\n } else {\n this.#debugLog(\n '[PerpsController] Provider does not support reconnect()',\n );\n }\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.reconnect'),\n this.#getErrorContext('reconnect', {\n operation: 'websocket_reconnect',\n }),\n );\n }\n }\n\n // Live data delegation (NO Redux) - delegates to active provider\n\n /**\n * Subscribe to live price updates\n *\n * @param params - The operation parameters.\n * @returns A cleanup function to remove the subscription.\n */\n subscribeToPrices(params: SubscribePricesParams): () => void {\n const provider = this.getActiveProviderOrNull();\n if (!provider) {\n return () => {\n // No-op: Provider not initialized\n };\n }\n try {\n return provider.subscribeToPrices(params);\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.subscribeToPrices'),\n this.#getErrorContext('subscribeToPrices', {\n symbols: params.symbols?.join(','),\n }),\n );\n return () => {\n // No-op\n };\n }\n }\n\n /**\n * Subscribe to live position updates\n *\n * @param params - The operation parameters.\n * @returns A cleanup function to remove the subscription.\n */\n subscribeToPositions(params: SubscribePositionsParams): () => void {\n const provider = this.getActiveProviderOrNull();\n if (!provider) {\n return () => {\n // No-op: Provider not initialized\n };\n }\n try {\n return provider.subscribeToPositions(params);\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.subscribeToPositions'),\n this.#getErrorContext('subscribeToPositions', {\n accountId: params.accountId,\n }),\n );\n return () => {\n // No-op\n };\n }\n }\n\n /**\n * Subscribe to live order fill updates\n *\n * @param params - The operation parameters.\n * @returns A cleanup function to remove the subscription.\n */\n subscribeToOrderFills(params: SubscribeOrderFillsParams): () => void {\n const provider = this.getActiveProviderOrNull();\n if (!provider) {\n return () => {\n // No-op: Provider not initialized\n };\n }\n try {\n return provider.subscribeToOrderFills(params);\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.subscribeToOrderFills'),\n this.#getErrorContext('subscribeToOrderFills', {\n accountId: params.accountId,\n }),\n );\n return () => {\n // No-op\n };\n }\n }\n\n /**\n * Subscribe to live order updates\n *\n * @param params - The operation parameters.\n * @returns A cleanup function to remove the subscription.\n */\n subscribeToOrders(params: SubscribeOrdersParams): () => void {\n const provider = this.getActiveProviderOrNull();\n if (!provider) {\n return () => {\n // No-op: Provider not initialized\n };\n }\n try {\n return provider.subscribeToOrders(params);\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.subscribeToOrders'),\n this.#getErrorContext('subscribeToOrders', {\n accountId: params.accountId,\n }),\n );\n return () => {\n // No-op\n };\n }\n }\n\n /**\n * Subscribe to live account updates.\n * Updates controller state (Redux) when new account data arrives so consumers\n * like usePerpsBalanceTokenFilter (PayWithModal) see the latest balance.\n *\n * @param params - The operation parameters.\n * @returns A cleanup function to remove the subscription.\n */\n subscribeToAccount(params: SubscribeAccountParams): () => void {\n const provider = this.getActiveProviderOrNull();\n if (!provider) {\n return () => {\n // No-op: Provider not initialized\n };\n }\n try {\n const originalCallback = params.callback;\n return provider.subscribeToAccount({\n ...params,\n callback: (account: AccountState | null) => {\n if (account) {\n this.update((state) => {\n state.accountState = account;\n state.lastUpdateTimestamp = Date.now();\n state.lastError = null;\n });\n }\n originalCallback(account);\n },\n });\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.subscribeToAccount'),\n this.#getErrorContext('subscribeToAccount', {\n accountId: params.accountId,\n }),\n );\n return () => {\n // No-op\n };\n }\n }\n\n /**\n * Subscribe to full order book updates with multiple depth levels\n * Creates a dedicated L2Book subscription for real-time order book data\n *\n * @param params - The operation parameters.\n * @returns A cleanup function to remove the subscription.\n */\n subscribeToOrderBook(params: SubscribeOrderBookParams): () => void {\n const provider = this.getActiveProviderOrNull();\n if (!provider) {\n return () => {\n // No-op: Provider not initialized\n };\n }\n try {\n return provider.subscribeToOrderBook(params);\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.subscribeToOrderBook'),\n this.#getErrorContext('subscribeToOrderBook', {\n symbol: params.symbol,\n levels: params.levels,\n }),\n );\n return () => {\n // No-op\n };\n }\n }\n\n /**\n * Subscribe to live candle updates\n *\n * @param params - The operation parameters.\n * @returns A cleanup function to remove the subscription.\n */\n subscribeToCandles(params: SubscribeCandlesParams): () => void {\n const provider = this.getActiveProviderOrNull();\n if (!provider) {\n return () => {\n // No-op: Provider not initialized\n };\n }\n try {\n return provider.subscribeToCandles(params);\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.subscribeToCandles'),\n this.#getErrorContext('subscribeToCandles', {\n symbol: params.symbol,\n interval: params.interval,\n duration: params.duration,\n }),\n );\n return () => {\n // No-op\n };\n }\n }\n\n /**\n * Subscribe to open interest cap updates\n * Zero additional network overhead - data comes from existing webData3 subscription\n *\n * @param params - The operation parameters.\n * @returns A cleanup function to remove the subscription.\n */\n subscribeToOICaps(params: SubscribeOICapsParams): () => void {\n const provider = this.getActiveProviderOrNull();\n if (!provider) {\n return () => {\n // No-op: Provider not initialized\n };\n }\n try {\n return provider.subscribeToOICaps(params);\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.subscribeToOICaps'),\n this.#getErrorContext('subscribeToOICaps', {\n accountId: params.accountId,\n }),\n );\n return () => {\n // No-op\n };\n }\n }\n\n /**\n * Configure live data throttling\n *\n * @param config - The configuration object.\n */\n setLiveDataConfig(config: Partial<LiveDataConfig>): void {\n try {\n const provider = this.getActiveProvider();\n provider.setLiveDataConfig(config);\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.setLiveDataConfig'),\n this.#getErrorContext('setLiveDataConfig'),\n );\n }\n }\n\n /**\n * Calculate trading fees for the active provider\n * Each provider implements its own fee structure\n *\n * @param params - The operation parameters.\n * @returns The fee calculation result for the trade.\n */\n async calculateFees(\n params: FeeCalculationParams,\n ): Promise<FeeCalculationResult> {\n const provider = this.getActiveProvider();\n const context = this.#createServiceContext('calculateFees');\n return this.#marketDataService.calculateFees({ provider, params, context });\n }\n\n /**\n * Disconnect provider and cleanup subscriptions\n * Call this when navigating away from Perps screens to prevent battery drain\n */\n async disconnect(): Promise<void> {\n this.#debugLog(\n 'PerpsController: Disconnecting provider to cleanup subscriptions',\n {\n timestamp: new Date().toISOString(),\n },\n );\n\n // Stop preload interval and messenger subscriptions first,\n // so no background work fires while we tear down providers.\n if (this.#preloadTimer) {\n clearInterval(this.#preloadTimer);\n this.#preloadTimer = null;\n }\n if (this.#preloadStateUnsubscribe) {\n this.#preloadStateUnsubscribe();\n this.#preloadStateUnsubscribe = null;\n }\n if (this.#accountChangeUnsubscribe) {\n this.#accountChangeUnsubscribe();\n this.#accountChangeUnsubscribe = null;\n }\n this.#previousIsTestnet = null;\n this.#previousHip3ConfigVersion = null;\n\n // Only disconnect the provider if we're initialized\n if (this.isInitialized && !this.isCurrentlyReinitializing()) {\n try {\n const provider = this.getActiveProvider();\n await provider.disconnect();\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.disconnect'),\n this.#getErrorContext('disconnect'),\n );\n }\n }\n\n // Clear stale reference so standalone reads don't route through old provider\n this.activeProviderInstance = null;\n\n // Cleanup cached standalone provider (if any) — awaited to prevent races\n await this.#cleanupStandaloneProvider();\n\n // Note: Feature-flag subscription is NOT cleaned up here.\n // It is a controller-lifetime concern (set once in the constructor),\n // not a session-lifetime concern. Unsubscribing here would break\n // geo-blocking / HIP-3 flag propagation after disconnect → reconnect.\n\n // Reset initialization state to ensure proper reconnection\n this.isInitialized = false;\n this.#initializationPromise = null;\n }\n\n /**\n * Eligibility (Geo-Blocking)\n */\n\n /**\n * Activates geo-blocking eligibility monitoring.\n * Call this after onboarding is complete when the controller was constructed\n * with `deferEligibilityCheck: true`.\n *\n * Reads the current RemoteFeatureFlagController state, performs the initial\n * eligibility check, and unblocks the existing stateChange subscription so\n * future feature-flag updates flow through normally.\n * Safe to call multiple times; subsequent calls simply re-check eligibility.\n */\n startEligibilityMonitoring(): void {\n this.#eligibilityCheckDeferred = false;\n\n try {\n const currentState = this.messenger.call(\n 'RemoteFeatureFlagController:getState',\n );\n this.refreshEligibilityOnFeatureFlagChange(currentState);\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.startEligibilityMonitoring'),\n this.#getErrorContext('startEligibilityMonitoring', {\n operation: 'readRemoteFeatureFlags',\n }),\n );\n }\n }\n\n /**\n * Stops geo-blocking eligibility monitoring.\n * Call this when the user disables basic functionality (e.g. useExternalServices becomes false).\n * Prevents geolocation calls until startEligibilityMonitoring() is called again.\n * Safe to call multiple times.\n */\n stopEligibilityMonitoring(): void {\n this.#eligibilityCheckDeferred = true;\n }\n\n /**\n * Refresh eligibility status\n */\n async refreshEligibility(): Promise<void> {\n if (this.#eligibilityCheckDeferred) {\n return;\n }\n\n // Capture the current version before starting the async operation.\n // This prevents race conditions where stale eligibility checks\n // (started with fallback config) overwrite results from newer checks\n // (started with remote config after it was fetched).\n const versionAtStart = this.#blockedRegionListVersion;\n\n try {\n // TODO: It would be good to have this location before we call this async function to avoid the race condition\n const isEligible = await this.#eligibilityService.checkEligibility({\n blockedRegions: this.blockedRegionList.list,\n });\n\n // Only update state if the blocked region list hasn't changed while we were awaiting.\n // This prevents stale fallback-based eligibility checks from overwriting\n // results from remote-based checks.\n if (this.#blockedRegionListVersion !== versionAtStart) {\n return;\n }\n\n this.update((state) => {\n state.isEligible = isEligible;\n });\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.refreshEligibility'),\n this.#getErrorContext('refreshEligibility'),\n );\n\n // Only update on error if version is still current\n if (this.#blockedRegionListVersion === versionAtStart) {\n // Default to eligible on error\n this.update((state) => {\n state.isEligible = true;\n });\n }\n }\n }\n\n /**\n * Get block explorer URL for an address or just the base URL\n *\n * @param address - Optional address to append to the base URL\n * @returns Block explorer URL\n */\n getBlockExplorerUrl(address?: string): string {\n const provider = this.getActiveProvider();\n return this.#marketDataService.getBlockExplorerUrl({ provider, address });\n }\n\n /**\n * Check if user is first-time for the current network\n *\n * @returns True if the condition is met.\n */\n isFirstTimeUserOnCurrentNetwork(): boolean {\n const currentNetwork = this.state.isTestnet ? 'testnet' : 'mainnet';\n return this.state.isFirstTimeUser[currentNetwork];\n }\n\n /**\n * Mark that the user has completed the tutorial/onboarding\n * This prevents the tutorial from showing again\n */\n markTutorialCompleted(): void {\n const currentNetwork = this.state.isTestnet ? 'testnet' : 'mainnet';\n\n this.#debugLog('PerpsController: Marking tutorial as completed', {\n timestamp: new Date().toISOString(),\n network: currentNetwork,\n });\n\n this.update((state) => {\n state.isFirstTimeUser[currentNetwork] = false;\n });\n }\n\n /*\n * Mark that user has placed their first successful order\n * This prevents the notification tooltip from showing again\n */\n markFirstOrderCompleted(): void {\n const currentNetwork = this.state.isTestnet ? 'testnet' : 'mainnet';\n\n this.#debugLog('PerpsController: Marking first order completed', {\n timestamp: new Date().toISOString(),\n network: currentNetwork,\n });\n\n this.update((state) => {\n state.hasPlacedFirstOrder[currentNetwork] = true;\n });\n }\n\n /**\n * Reset first-time user state for both networks\n * This is useful for testing the tutorial flow\n * Called by Reset Account feature in settings\n */\n resetFirstTimeUserState(): void {\n this.#debugLog('PerpsController: Resetting first-time user state', {\n timestamp: new Date().toISOString(),\n previousState: this.state.isFirstTimeUser,\n });\n\n this.update((state) => {\n state.isFirstTimeUser = {\n testnet: true,\n mainnet: true,\n };\n state.hasPlacedFirstOrder = {\n testnet: false,\n mainnet: false,\n };\n });\n }\n\n /**\n * Clear pending/bridging withdrawal and deposit requests\n * This is useful when users want to clear stuck pending indicators\n * Called by Reset Account feature in settings\n */\n clearPendingTransactionRequests(): void {\n this.#debugLog('PerpsController: Clearing pending transaction requests', {\n timestamp: new Date().toISOString(),\n });\n\n this.update((state) => {\n // Filter out pending/bridging withdrawals, keep completed/failed for history\n state.withdrawalRequests = state.withdrawalRequests.filter(\n (req) => req.status !== 'pending' && req.status !== 'bridging',\n );\n\n // Filter out pending deposits, keep completed/failed for history\n state.depositRequests = state.depositRequests.filter(\n (req) => req.status !== 'pending' && req.status !== 'bridging',\n );\n\n // Reset withdrawal progress\n state.withdrawalProgress = {\n progress: 0,\n lastUpdated: Date.now(),\n activeWithdrawalId: null,\n };\n });\n }\n\n /**\n * Get saved trade configuration for a market\n *\n * @param symbol - The trading pair symbol.\n * @returns The resulting string value.\n */\n getTradeConfiguration(symbol: string): { leverage?: number } | undefined {\n const network = this.state.isTestnet ? 'testnet' : 'mainnet';\n const config = this.state.tradeConfigurations[network]?.[symbol];\n\n if (!config?.leverage) {\n return undefined;\n }\n\n this.#debugLog('PerpsController: Retrieved trade config', {\n symbol,\n network,\n leverage: config.leverage,\n });\n\n return { leverage: config.leverage };\n }\n\n /**\n * Save trade configuration for a market\n *\n * @param symbol - Market symbol\n * @param leverage - Leverage value\n */\n saveTradeConfiguration(symbol: string, leverage: number): void {\n const network = this.state.isTestnet ? 'testnet' : 'mainnet';\n\n this.#debugLog('PerpsController: Saving trade configuration', {\n symbol,\n network,\n leverage,\n timestamp: new Date().toISOString(),\n });\n\n this.update((state) => {\n if (!state.tradeConfigurations[network]) {\n state.tradeConfigurations[network] = {};\n }\n\n const existingConfig = state.tradeConfigurations[network][symbol] || {};\n state.tradeConfigurations[network][symbol] = {\n ...existingConfig,\n leverage,\n };\n });\n }\n\n /**\n * Save pending trade configuration for a market\n * This is a temporary configuration that expires after 5 minutes\n *\n * @param symbol - Market symbol\n * @param config - Pending trade configuration (includes optional selected payment token from Pay row)\n * @param config.amount - The amount value.\n * @param config.leverage - The leverage multiplier.\n * @param config.takeProfitPrice - The take profit price.\n * @param config.stopLossPrice - The stop loss price.\n * @param config.limitPrice - The limit price.\n * @param config.orderType - The order type.\n * @param config.selectedPaymentToken - The selected payment token.\n */\n savePendingTradeConfiguration(\n symbol: string,\n config: {\n amount?: string;\n leverage?: number;\n takeProfitPrice?: string;\n stopLossPrice?: string;\n limitPrice?: string;\n orderType?: OrderType;\n /** When user used pay-with-token in PerpsPayRow: minimal token shape to restore selection */\n selectedPaymentToken?: PerpsSelectedPaymentToken | null;\n },\n ): void {\n const network = this.state.isTestnet ? 'testnet' : 'mainnet';\n\n this.#debugLog('PerpsController: Saving pending trade configuration', {\n symbol,\n network,\n config,\n timestamp: new Date().toISOString(),\n });\n\n this.update((state) => {\n if (!state.tradeConfigurations[network]) {\n state.tradeConfigurations[network] = {};\n }\n\n const existingConfig = state.tradeConfigurations[network][symbol] || {};\n state.tradeConfigurations[network][symbol] = {\n ...existingConfig,\n pendingConfig: {\n ...config,\n timestamp: Date.now(),\n },\n };\n });\n }\n\n /**\n * Get pending trade configuration for a market\n * Returns undefined if config doesn't exist or has expired (more than 5 minutes old)\n *\n * @param symbol - Market symbol\n * @returns Pending trade configuration or undefined\n */\n getPendingTradeConfiguration(symbol: string):\n | {\n amount?: string;\n leverage?: number;\n takeProfitPrice?: string;\n stopLossPrice?: string;\n limitPrice?: string;\n orderType?: OrderType;\n selectedPaymentToken?: PerpsSelectedPaymentToken | null;\n }\n | undefined {\n const network = this.state.isTestnet ? 'testnet' : 'mainnet';\n const config =\n this.state.tradeConfigurations[network]?.[symbol]?.pendingConfig;\n\n if (!config) {\n return undefined;\n }\n\n // Check if config has expired (5 minutes = 300,000 milliseconds)\n const FIVE_MINUTES_MS = 5 * 60 * 1000;\n const now = Date.now();\n const age = now - config.timestamp;\n\n if (age > FIVE_MINUTES_MS) {\n this.#debugLog('PerpsController: Pending trade config expired', {\n symbol,\n network,\n age,\n timestamp: config.timestamp,\n });\n // Clear expired config\n this.update((state) => {\n if (state.tradeConfigurations[network]?.[symbol]?.pendingConfig) {\n delete state.tradeConfigurations[network][symbol].pendingConfig;\n }\n });\n return undefined;\n }\n\n this.#debugLog('PerpsController: Retrieved pending trade config', {\n symbol,\n network,\n config,\n age,\n });\n\n // Return config without timestamp\n const { timestamp, ...configWithoutTimestamp } = config;\n return configWithoutTimestamp;\n }\n\n /**\n * Clear pending trade configuration for a market\n *\n * @param symbol - Market symbol\n */\n clearPendingTradeConfiguration(symbol: string): void {\n const network = this.state.isTestnet ? 'testnet' : 'mainnet';\n\n this.#debugLog('PerpsController: Clearing pending trade configuration', {\n symbol,\n network,\n timestamp: new Date().toISOString(),\n });\n\n this.update((state) => {\n if (state.tradeConfigurations[network]?.[symbol]?.pendingConfig) {\n delete state.tradeConfigurations[network][symbol].pendingConfig;\n }\n });\n }\n\n /**\n * Get saved market filter preferences\n * Handles backward compatibility with legacy string format\n *\n * @returns The saved sort option ID and direction.\n */\n getMarketFilterPreferences(): {\n optionId: SortOptionId;\n direction: SortDirection;\n } {\n const pref = this.state.marketFilterPreferences;\n\n // Handle legacy string format (backward compatibility)\n if (typeof pref === 'string') {\n // Map legacy compound IDs to new format\n // Old format: 'priceChange-desc' or 'priceChange-asc'\n // New format: { optionId: 'priceChange', direction: 'desc'/'asc' }\n if (pref === 'priceChange-desc') {\n return {\n optionId: 'priceChange',\n direction: 'desc',\n };\n }\n if (pref === 'priceChange-asc') {\n return {\n optionId: 'priceChange',\n direction: 'asc',\n };\n }\n\n // Handle other simple legacy strings (e.g., 'volume', 'openInterest', etc.)\n return {\n optionId: pref as SortOptionId,\n direction: MARKET_SORTING_CONFIG.DefaultDirection,\n };\n }\n\n // Return new object format or default\n return (\n pref ?? {\n optionId: MARKET_SORTING_CONFIG.DefaultSortOptionId,\n direction: MARKET_SORTING_CONFIG.DefaultDirection,\n }\n );\n }\n\n /**\n * Save market filter preferences\n *\n * @param optionId - Sort/filter option ID\n * @param direction - Sort direction ('asc' or 'desc')\n */\n saveMarketFilterPreferences(\n optionId: SortOptionId,\n direction: SortDirection,\n ): void {\n this.#debugLog('PerpsController: Saving market filter preferences', {\n optionId,\n direction,\n timestamp: new Date().toISOString(),\n });\n\n this.update((state) => {\n state.marketFilterPreferences = { optionId, direction };\n });\n }\n\n /**\n * Set the selected payment token for the Perps order/deposit flow.\n * Pass null or a token with description PERPS_CONSTANTS.PerpsBalanceTokenDescription to select Perps balance.\n * Only required fields (address, chainId) are stored in state; description and symbol are optional.\n *\n * @param token - The token identifier.\n */\n setSelectedPaymentToken(token: PerpsSelectedPaymentToken | null): void {\n let normalized: PerpsSelectedPaymentToken | null = null;\n if (\n token !== null &&\n token.description !== PERPS_CONSTANTS.PerpsBalanceTokenDescription\n ) {\n normalized = token;\n }\n\n const current = this.state.selectedPaymentToken as\n | SelectedPaymentTokenSnapshot\n | null\n | undefined;\n const initialPaymentMethod =\n current === null ||\n current === undefined ||\n current?.description === PERPS_CONSTANTS.PerpsBalanceTokenDescription\n ? 'perps_balance'\n : (current?.symbol ?? 'unknown');\n const newPaymentMethod =\n token === null ||\n token.description === PERPS_CONSTANTS.PerpsBalanceTokenDescription\n ? 'perps_balance'\n : (token.symbol ?? 'unknown');\n\n if (initialPaymentMethod !== newPaymentMethod) {\n this.#getMetrics().trackPerpsEvent(PerpsAnalyticsEvent.UiInteraction, {\n [PERPS_EVENT_PROPERTY.INTERACTION_TYPE]:\n PERPS_EVENT_VALUE.INTERACTION_TYPE.PAYMENT_METHOD_CHANGED,\n [PERPS_EVENT_PROPERTY.INITIAL_PAYMENT_METHOD]: initialPaymentMethod,\n [PERPS_EVENT_PROPERTY.NEW_PAYMENT_METHOD]: newPaymentMethod,\n });\n }\n\n let snapshot: Json | null = null;\n if (normalized !== null) {\n snapshot = {\n ...(normalized.description !== undefined && {\n description: normalized.description,\n }),\n address: normalized.address,\n chainId: normalized.chainId,\n symbol: normalized.symbol,\n } as unknown as Json;\n }\n\n this.update((state) => {\n state.selectedPaymentToken = snapshot;\n });\n }\n\n /**\n * Reset the selected payment token to Perps balance (null).\n * Call when leaving the Perps order view so the next visit defaults to Perps balance.\n */\n resetSelectedPaymentToken(): void {\n this.update((state) => {\n state.selectedPaymentToken = null;\n });\n }\n\n /**\n * Get saved order book grouping for a market\n *\n * @param symbol - Market symbol\n * @returns The saved grouping value or undefined if not set\n */\n getOrderBookGrouping(symbol: string): number | undefined {\n const network = this.state.isTestnet ? 'testnet' : 'mainnet';\n const grouping =\n this.state.tradeConfigurations[network]?.[symbol]?.orderBookGrouping;\n\n if (grouping !== undefined) {\n this.#debugLog('PerpsController: Retrieved order book grouping', {\n symbol,\n network,\n grouping,\n });\n }\n\n return grouping;\n }\n\n /**\n * Save order book grouping for a market\n *\n * @param symbol - Market symbol\n * @param grouping - Price grouping value\n */\n saveOrderBookGrouping(symbol: string, grouping: number): void {\n const network = this.state.isTestnet ? 'testnet' : 'mainnet';\n\n this.#debugLog('PerpsController: Saving order book grouping', {\n symbol,\n network,\n grouping,\n timestamp: new Date().toISOString(),\n });\n\n this.update((state) => {\n if (!state.tradeConfigurations[network]) {\n state.tradeConfigurations[network] = {};\n }\n\n const existingConfig = state.tradeConfigurations[network][symbol] || {};\n state.tradeConfigurations[network][symbol] = {\n ...existingConfig,\n orderBookGrouping: grouping,\n };\n });\n }\n\n /**\n * Toggle watchlist status for a market\n * Watchlist markets are stored per network (testnet/mainnet)\n *\n * @param symbol - The trading pair symbol.\n */\n toggleWatchlistMarket(symbol: string): void {\n const currentNetwork = this.state.isTestnet ? 'testnet' : 'mainnet';\n const currentWatchlist = this.state.watchlistMarkets[currentNetwork];\n const isWatchlisted = currentWatchlist.includes(symbol);\n\n this.#debugLog('PerpsController: Toggling watchlist market', {\n timestamp: new Date().toISOString(),\n network: currentNetwork,\n symbol,\n action: isWatchlisted ? 'remove' : 'add',\n });\n\n this.update((state) => {\n if (isWatchlisted) {\n // Remove from watchlist\n state.watchlistMarkets[currentNetwork] = currentWatchlist.filter(\n (marketSymbol) => marketSymbol !== symbol,\n );\n } else {\n // Add to watchlist\n state.watchlistMarkets[currentNetwork] = [...currentWatchlist, symbol];\n }\n });\n }\n\n /**\n * Check if a market is in the watchlist on the current network\n *\n * @param symbol - The trading pair symbol.\n * @returns True if the condition is met.\n */\n isWatchlistMarket(symbol: string): boolean {\n const currentNetwork = this.state.isTestnet ? 'testnet' : 'mainnet';\n return this.state.watchlistMarkets[currentNetwork].includes(symbol);\n }\n\n /**\n * Get all watchlist markets for the current network\n *\n * @returns The resulting string value.\n */\n getWatchlistMarkets(): string[] {\n const currentNetwork = this.state.isTestnet ? 'testnet' : 'mainnet';\n return this.state.watchlistMarkets[currentNetwork];\n }\n\n /**\n * Report order events to data lake API with retry (non-blocking)\n * Thin delegation to DataLakeService\n *\n * @param params - The operation parameters.\n * @param params.action - The order action.\n * @param params.symbol - The trading pair symbol.\n * @param params.slPrice - The stop loss price.\n * @param params.tpPrice - The take profit price.\n * @param params.retryCount - Internal retry counter.\n * @param params._traceId - Internal trace ID.\n * @returns Whether the report was sent successfully, with an optional error message.\n */\n protected async reportOrderToDataLake(params: {\n action: 'open' | 'close';\n symbol: string;\n slPrice?: number;\n tpPrice?: number;\n retryCount?: number;\n _traceId?: string;\n }): Promise<{ success: boolean; error?: string }> {\n return this.#dataLakeService.reportOrder({\n action: params.action,\n symbol: params.symbol,\n slPrice: params.slPrice,\n tpPrice: params.tpPrice,\n isTestnet: this.state.isTestnet,\n context: this.#createServiceContext('reportOrderToDataLake', {}),\n retryCount: params.retryCount,\n _traceId: params._traceId,\n });\n }\n\n /**\n * Check if the controller is currently reinitializing\n *\n * @returns true if providers are being reinitialized\n */\n public isCurrentlyReinitializing(): boolean {\n return this.#isReinitializing;\n }\n}\n"]}
|