@one_deploy/sdk 1.2.0 → 1.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{ForexPoolDataGenerator--__twRwl.d.mts → ForexPoolDataGenerator-JxTPpJPz.d.mts} +1 -1
- package/dist/{ForexPoolDataGenerator-eUgwsU_B.d.ts → ForexPoolDataGenerator-qwWv6sCE.d.ts} +1 -1
- package/dist/{OneForexTradeHistory-TlKxjbFF.d.ts → OneForexTradeHistory-BE4rJH5t.d.ts} +1 -1
- package/dist/{OneForexTradeHistory-iDySMcw0.d.mts → OneForexTradeHistory-DbuHXRy0.d.mts} +1 -1
- package/dist/components/index.d.mts +2 -2
- package/dist/components/index.d.ts +2 -2
- package/dist/config/index.d.mts +1 -1
- package/dist/config/index.d.ts +1 -1
- package/dist/{console-BfTMA7ah.d.mts → console-Dvf-N9Gr.d.mts} +7 -0
- package/dist/{console-BfTMA7ah.d.ts → console-Dvf-N9Gr.d.ts} +7 -0
- package/dist/hooks/index.d.mts +2 -2
- package/dist/hooks/index.d.ts +2 -2
- package/dist/hooks/index.js +399 -38
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/index.mjs +399 -38
- package/dist/hooks/index.mjs.map +1 -1
- package/dist/index.d.mts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js +399 -38
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +399 -38
- package/dist/index.mjs.map +1 -1
- package/dist/providers/index.d.mts +1 -1
- package/dist/providers/index.d.ts +1 -1
- package/dist/react-native.d.mts +4 -4
- package/dist/react-native.d.ts +4 -4
- package/dist/react-native.js +239 -36
- package/dist/react-native.js.map +1 -1
- package/dist/react-native.mjs +239 -36
- package/dist/react-native.mjs.map +1 -1
- package/dist/services/index.d.mts +2 -2
- package/dist/services/index.d.ts +2 -2
- package/dist/services/index.js +239 -36
- package/dist/services/index.js.map +1 -1
- package/dist/services/index.mjs +239 -36
- package/dist/services/index.mjs.map +1 -1
- package/dist/types/index.d.mts +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/{useForexTrading-ZgW_G40Q.d.ts → useForexTrading-CA2DPQVf.d.ts} +1 -1
- package/dist/{useForexTrading-BleeSor8.d.mts → useForexTrading-I7nIQyog.d.mts} +1 -1
- package/package.json +1 -1
- package/src/services/forex/BotSimulationEngine.ts +463 -35
- package/src/services/forex/index.ts +12 -1
package/dist/hooks/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/types/forex.ts","../../src/services/forex/ForexPoolDataGenerator.ts","../../src/services/forex/ForexSimulationEngine.ts","../../src/services/forex/BotSimulationEngine.ts","../../src/config/index.ts","../../src/services/engine.ts","../../src/hooks/useWalletBalance.ts","../../src/hooks/useTokenPrice.ts","../../src/hooks/useAITrading.ts","../../src/hooks/useForexTrading.ts","../../src/hooks/useBotSimulation.ts","../../src/hooks/useAIPositions.ts","../../src/hooks/useAIDecisions.ts","../../src/types/console.ts","../../src/hooks/useAIRiskStatus.ts","../../src/hooks/useAIQuantConsole.ts","../../src/hooks/useTradingConsole.ts"],"names":["genId","rand","randInt","pick","ForexPoolDataGenerator","idCounter","config","useState","useRef","useCallback","useEffect","useMemo","inv","forexSimulationEngine","botSimulationEngine"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAA,aAAA,GAAA,EAAA;AAAA,QAAA,CAAA,aAAA,EAAA;AAAA,EAAA,WAAA,EAAA,MAAA,WAAA;AAAA,EAAA,mBAAA,EAAA,MAAA,mBAAA;AAAA,EAAA,oBAAA,EAAA,MAAA,oBAAA;AAAA,EAAA,mBAAA,EAAA,MAAA,mBAAA;AAAA,EAAA,mBAAA,EAAA,MAAA,mBAAA;AAAA,EAAA,uBAAA,EAAA,MAAA,uBAAA;AAAA,EAAA,sBAAA,EAAA,MAAA,sBAAA;AAAA,EAAA,mBAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAYO,SAAS,uBAAuB,MAAA,EAMrC;AACA,EAAA,MAAM,iBAAA,GAAoB,SAAS,mBAAA,CAAoB,YAAA;AACvD,EAAA,MAAM,cAAA,GAAiB,SAAS,mBAAA,CAAoB,cAAA;AACpD,EAAA,OAAO;AAAA,IACL,cAAA;AAAA,IACA,iBAAA;AAAA,IACA,UAAU,iBAAA,GAAoB,GAAA;AAAA,IAC9B,SAAS,iBAAA,GAAoB,GAAA;AAAA,IAC7B,WAAW,iBAAA,GAAoB;AAAA,GACjC;AACF;AAwOO,SAAS,uBAAA,CACd,aACA,WAAA,EACiE;AACjE,EAAA,MAAM,SAAA,GAAY,cAAc,WAAA,CAAY,OAAA;AAC5C,EAAA,MAAM,gBAAgB,WAAA,GAAc,SAAA;AACpC,EAAA,MAAM,SAAA,GAAY,gBAAgB,WAAA,CAAY,cAAA;AAC9C,EAAA,OAAO,EAAE,SAAA,EAAW,aAAA,EAAe,SAAA,EAAU;AAC/C;AAEO,SAAS,mBAAA,CACd,MAAA,EACA,SAAA,EACA,KAAA,GAAoB,WAAA,EAC8D;AAClF,EAAA,MAAM,WAAA,GAAc,oBAAoB,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,IAAA,KAAS,SAAS,CAAA,IAAK,mBAAA,CAAoB,CAAC,CAAA;AAChG,EAAA,MAAM,gBAAiB,KAAA,CAAM,WAAA,GAAc,KAAA,CAAM,WAAA,IAAe,IAAK,GAAA,GAAM,GAAA;AAC3E,EAAA,MAAM,SAAA,GAAY,eAAe,GAAA,GAAM,GAAA;AACvC,EAAA,MAAM,WAAA,GAAc,SAAS,SAAA,GAAY,SAAA;AACzC,EAAA,MAAM,EAAE,SAAA,EAAW,SAAA,EAAU,GAAI,uBAAA,CAAwB,aAAa,WAAW,CAAA;AACjF,EAAA,OAAO,EAAE,WAAA,EAAa,SAAA,EAAW,SAAA,EAAW,SAAA,EAAU;AACxD;AAzRA,IAOa,mBAAA,EAgCA,mBAAA,EAsBA,oBAAA,EAgCA,mBAAA,EAuJA,WAAA;AApPb,IAAA,UAAA,GAAA,KAAA,CAAA;AAAA,EAAA,oBAAA,GAAA;AAOO,IAAM,mBAAA,GAAsB;AAAA,MACjC,YAAA,EAAc,GAAA;AAAA,MACd,cAAA,EAAgB;AAAA,KAClB;AA6BO,IAAM,mBAAA,GAA0C;AAAA,MACrD,EAAE,MAAM,EAAA,EAAK,OAAA,EAAS,KAAM,cAAA,EAAgB,GAAA,EAAM,OAAO,KAAA,EAAM;AAAA,MAC/D,EAAE,MAAM,EAAA,EAAK,OAAA,EAAS,MAAM,cAAA,EAAgB,GAAA,EAAM,OAAO,KAAA,EAAM;AAAA,MAC/D,EAAE,MAAM,EAAA,EAAK,OAAA,EAAS,MAAM,cAAA,EAAgB,IAAA,EAAM,OAAO,KAAA,EAAM;AAAA,MAC/D,EAAE,MAAM,GAAA,EAAK,OAAA,EAAS,MAAM,cAAA,EAAgB,IAAA,EAAM,OAAO,MAAA,EAAO;AAAA,MAChE,EAAE,MAAM,GAAA,EAAK,OAAA,EAAS,MAAM,cAAA,EAAgB,GAAA,EAAM,OAAO,MAAA;AAAO,KAClE;AAgBO,IAAM,oBAAA,GAA4C;AAAA,MACvD,EAAE,EAAA,EAAI,WAAA,EAAa,MAAM,MAAA,EAAQ,KAAA,EAAO,QAAQ,MAAA,EAAQ,WAAA,EAAa,IAAA,EAAM,oBAAA,EAAsB,MAAM,MAAA,EAAQ,SAAA,EAAW,OAAQ,OAAA,EAAS,IAAA,EAAQ,YAAY,GAAA,EAAI;AAAA,MACnK,EAAE,EAAA,EAAI,WAAA,EAAa,MAAM,MAAA,EAAQ,KAAA,EAAO,QAAQ,MAAA,EAAQ,WAAA,EAAa,IAAA,EAAM,oBAAA,EAAsB,MAAM,eAAA,EAAiB,SAAA,EAAW,OAAQ,OAAA,EAAS,IAAA,EAAQ,YAAY,GAAA,EAAI;AAAA,MAC5K,EAAE,EAAA,EAAI,WAAA,EAAa,MAAM,MAAA,EAAQ,KAAA,EAAO,QAAQ,MAAA,EAAQ,WAAA,EAAa,IAAA,EAAM,oBAAA,EAAsB,MAAM,cAAA,EAAgB,SAAA,EAAW,OAAQ,OAAA,EAAS,IAAA,EAAM,YAAY,CAAA,EAAI;AAAA,MACzK,EAAE,EAAA,EAAI,WAAA,EAAa,MAAM,MAAA,EAAQ,KAAA,EAAO,QAAQ,MAAA,EAAQ,WAAA,EAAa,IAAA,EAAM,oBAAA,EAAsB,MAAM,mBAAA,EAAqB,SAAA,EAAW,OAAQ,OAAA,EAAS,IAAA,EAAQ,YAAY,GAAA,EAAI;AAAA,MAChL,EAAE,EAAA,EAAI,WAAA,EAAa,MAAM,MAAA,EAAQ,KAAA,EAAO,QAAQ,MAAA,EAAQ,WAAA,EAAa,IAAA,EAAM,oBAAA,EAAsB,MAAM,iBAAA,EAAmB,SAAA,EAAW,OAAQ,OAAA,EAAS,IAAA,EAAQ,YAAY,GAAA,EAAI;AAAA,MAC9K,EAAE,EAAA,EAAI,WAAA,EAAa,MAAM,MAAA,EAAQ,KAAA,EAAO,QAAQ,MAAA,EAAQ,WAAA,EAAa,IAAA,EAAM,oBAAA,EAAsB,MAAM,aAAA,EAAe,SAAA,EAAW,OAAQ,OAAA,EAAS,IAAA,EAAQ,YAAY,GAAA;AAAI,KAC5K;AAyBO,IAAM,mBAAA,GAAmC;AAAA,MAC9C,EAAE,EAAA,EAAI,UAAA,EAAa,OAAA,EAAS,uBAAwB,cAAA,EAAgB,0BAAA,EAA6B,UAAA,EAAY,GAAA,EAAM,WAAW,KAAA,EAAU,WAAA,EAAa,IAAA,EAAM,KAAA,EAAO,WAAW,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,UAAA,EAAY,KAAA,EAAQ,UAAA,EAAY,EAAA,EAAI,cAAc,KAAA,EAAO,aAAA,EAAe,KAAA,EAAU,gBAAA,EAAkB,OAAU,iBAAA,EAAmB,KAAA,EAAS,WAAA,EAAa,IAAA,CAAK,KAAI,EAAE;AAAA,MAC1W,EAAE,EAAA,EAAI,SAAA,EAAa,OAAA,EAAS,sBAAwB,cAAA,EAAgB,yBAAA,EAA6B,UAAA,EAAY,GAAA,EAAM,WAAW,IAAA,EAAU,WAAA,EAAa,IAAA,EAAM,KAAA,EAAO,WAAW,KAAA,EAAO,GAAA,EAAK,MAAA,EAAQ,GAAA,EAAK,UAAA,EAAY,IAAA,EAAO,UAAA,EAAY,EAAA,EAAI,cAAc,IAAA,EAAM,aAAA,EAAe,KAAA,EAAU,gBAAA,EAAkB,MAAU,iBAAA,EAAmB,IAAA,EAAQ,WAAA,EAAa,IAAA,CAAK,KAAI,EAAE;AAAA,MACrW,EAAE,EAAA,EAAI,WAAA,EAAa,OAAA,EAAS,wBAAwB,cAAA,EAAgB,2BAAA,EAA6B,UAAA,EAAY,GAAA,EAAM,WAAW,GAAA,EAAU,WAAA,EAAa,IAAA,EAAM,KAAA,EAAO,WAAW,KAAA,EAAO,GAAA,EAAK,MAAA,EAAQ,GAAA,EAAK,UAAA,EAAY,IAAA,EAAO,UAAA,EAAY,EAAA,EAAI,cAAc,IAAA,EAAM,aAAA,EAAe,KAAA,EAAU,gBAAA,EAAkB,OAAU,iBAAA,EAAmB,IAAA,EAAQ,WAAA,EAAa,IAAA,CAAK,KAAI;AAAE,KACvW;AAmJO,IAAM,WAAA,GAA0B;AAAA,MACrC,EAAA,EAAI,aAAA;AAAA,MACJ,OAAA,EAAS,kBAAA;AAAA,MACT,cAAA,EAAgB,yBAAA;AAAA,MAChB,IAAA,EAAM,WAAA;AAAA,MACN,KAAA,EAAO,SAAA;AAAA,MACP,cAAA,EAAgB,oBAAA,CAAqB,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,EAAE,CAAA;AAAA,MAClD,WAAA,EAAa,IAAA;AAAA,MACb,WAAA,EAAa,IAAA;AAAA,MACb,YAAA,EAAc,IAAA;AAAA,MACd,UAAA,EAAY,IAAA;AAAA,MACZ,OAAA,EAAS;AAAA,KACX;AAAA,EAAA;AAAA,CAAA,CAAA;;;AChQA,IAAA,8BAAA,GAAA,EAAA;AAAA,QAAA,CAAA,8BAAA,EAAA;AAAA,EAAA,sBAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAcA,SAAS,IAAA,CAAK,KAAa,GAAA,EAAqB;AAC9C,EAAA,OAAO,GAAA,GAAM,IAAA,CAAK,MAAA,EAAO,IAAK,GAAA,GAAM,GAAA,CAAA;AACtC;AAEA,SAAS,OAAA,CAAQ,KAAa,GAAA,EAAqB;AACjD,EAAA,OAAO,KAAK,KAAA,CAAM,IAAA,CAAK,GAAA,EAAK,GAAA,GAAM,CAAC,CAAC,CAAA;AACtC;AAEA,SAAS,KAAQ,GAAA,EAAa;AAC5B,EAAA,OAAO,GAAA,CAAI,KAAK,KAAA,CAAM,IAAA,CAAK,QAAO,GAAI,GAAA,CAAI,MAAM,CAAC,CAAA;AACnD;AAEA,SAAS,SAAA,GAAoB;AAC3B,EAAA,MAAM,KAAA,GAAQ,kBAAA;AACd,EAAA,IAAI,IAAA,GAAO,IAAA;AACX,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,EAAK,IAAA,IAAQ,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAA,EAAO,GAAI,EAAE,CAAC,CAAA;AACzE,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,WAAW,CAAA,EAAiB;AACnC,EAAA,OAAO,EAAE,WAAA,EAAY,CAAE,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AACrC;AAGA,SAAS,MAAM,MAAA,EAAwB;AACrC,EAAA,OAAO,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,IAAA,CAAK,KAAI,CAAE,QAAA,CAAS,EAAE,CAAC,CAAA,CAAA,EAAA,CAAK,EAAE,UAAA,EAAY,QAAA,CAAS,EAAE,CAAC,CAAA,CAAA;AAC5E;AAxCA,IAqCI,UAAA,EAmBE,WAAA,EAsCA,2BAAA,EAsbF,SAAA,EAES,sBAAA;AAthBb,IAAA,2BAAA,GAAA,KAAA,CAAA;AAAA,EAAA,8CAAA,GAAA;AAUA,IAAA,UAAA,EAAA;AA2BA,IAAI,UAAA,GAAa,CAAA;AAmBjB,IAAM,WAAA,GAAiD;AAAA,MACrD,QAAA,EAAU;AAAA,QACR,eAAA,EAAiB,KAAA;AAAA,QACjB,YAAA,EAAc,KAAA;AAAA,QACd,cAAA,EAAgB,GAAA;AAAA,QAChB,cAAA,EAAgB,IAAA;AAAA,QAChB,cAAA,EAAgB,CAAC,EAAA,EAAI,EAAE,CAAA;AAAA,QACvB,iBAAA,EAAmB,CAAC,CAAA,EAAG,EAAE,CAAA;AAAA,QACzB,gBAAA,EAAkB,CAAA;AAAA,QAClB,cAAA,EAAgB,IAAA;AAAA,QAChB,iBAAA,EAAmB;AAAA,OACrB;AAAA,MACA,OAAA,EAAS;AAAA,QACP,eAAA,EAAiB,KAAA;AAAA,QACjB,YAAA,EAAc,IAAA;AAAA,QACd,cAAA,EAAgB,IAAA;AAAA,QAChB,cAAA,EAAgB,IAAA;AAAA,QAChB,cAAA,EAAgB,CAAC,CAAA,EAAG,EAAE,CAAA;AAAA,QACtB,iBAAA,EAAmB,CAAC,CAAA,EAAG,CAAC,CAAA;AAAA,QACxB,gBAAA,EAAkB,CAAA;AAAA,QAClB,cAAA,EAAgB,IAAA;AAAA,QAChB,iBAAA,EAAmB;AAAA,OACrB;AAAA,MACA,SAAA,EAAW;AAAA,QACT,eAAA,EAAiB,KAAA;AAAA,QACjB,YAAA,EAAc,IAAA;AAAA,QACd,cAAA,EAAgB,GAAA;AAAA,QAChB,cAAA,EAAgB,GAAA;AAAA,QAChB,cAAA,EAAgB,CAAC,CAAA,EAAG,EAAE,CAAA;AAAA,QACtB,iBAAA,EAAmB,CAAC,CAAA,EAAG,CAAC,CAAA;AAAA,QACxB,gBAAA,EAAkB,CAAA;AAAA,QAClB,cAAA,EAAgB,IAAA;AAAA,QAChB,iBAAA,EAAmB;AAAA;AACrB,KACF;AAIA,IAAM,8BAAN,MAAkC;AAAA,MAAlC,WAAA,GAAA;AACE,QAAA,IAAA,CAAQ,aAAA,GAAwE,IAAA;AAChF,QAAA,IAAA,CAAQ,gBAAA,GAAkD,IAAA;AAC1D,QAAA,IAAA,CAAQ,eAAA,GAAkB,KAAA;AAAA,MAAA;AAAA;AAAA,MAI1B,oBAAA,GAAwE;AACtE,QAAA,IAAI,IAAA,CAAK,aAAA,EAAe,OAAO,IAAA,CAAK,aAAA;AAEpC,QAAA,MAAM,MAAA,GAA0D;AAAA,UAC9D,UAAU,EAAC;AAAA,UACX,SAAS,EAAC;AAAA,UACV,WAAW;AAAC,SACd;AAEA,QAAA,KAAA,MAAW,QAAQ,mBAAA,EAAqB;AACtC,UAAA,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA,GAAI,IAAA,CAAK,sBAAsB,IAAA,CAAK,EAAA,EAAI,KAAK,SAAS,CAAA;AAAA,QACtE;AAEA,QAAA,IAAA,CAAK,aAAA,GAAgB,MAAA;AACrB,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,MAEA,uBAAA,GAAkD;AAChD,QAAA,IAAI,IAAA,CAAK,gBAAA,EAAkB,OAAO,IAAA,CAAK,gBAAA;AAEvC,QAAA,MAAM,QAAgC,EAAC;AAEvC,QAAA,KAAA,MAAW,QAAQ,mBAAA,EAAqB;AACtC,UAAA,MAAM,SAAA,GAAY,IAAA,CAAK,aAAA,GAAgB,IAAA,CAAK,EAAE,CAAA,IAAK,IAAA,CAAK,qBAAA,CAAsB,IAAA,CAAK,EAAA,EAAI,IAAA,CAAK,SAAS,CAAA;AACrG,UAAA,MAAM,GAAA,GAAM,IAAA,CAAK,wBAAA,CAAyB,IAAA,CAAK,IAAI,SAAS,CAAA;AAC5D,UAAA,KAAA,CAAM,IAAA,CAAK,GAAG,GAAG,CAAA;AAAA,QACnB;AAGA,QAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,EAAK;AAC3B,UAAA,MAAM,GAAA,GAAM,IAAI,IAAA,CAAK,GAAG,CAAA;AACxB,UAAA,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,OAAA,EAAQ,IAAK,KAAK,CAAA,CAAE,CAAA;AACpC,UAAA,MAAM,SAAA,GAAY,IAAI,MAAA,EAAO;AAG7B,UAAA,IAAI,SAAA,KAAc,KAAK,SAAA,KAAc,CAAA,IAAM,cAAc,CAAA,IAAK,IAAA,CAAK,MAAA,EAAO,GAAI,GAAA,EAAM;AAClF,YAAA,MAAM,WAAW,IAAA,CAAK,CAAC,UAAA,EAAY,SAAA,EAAW,WAAW,CAAoB,CAAA;AAC7E,YAAA,MAAM,SAAA,GAAa,CAAC,UAAA,EAAY,SAAA,EAAW,WAAW,CAAA,CAAsB,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,KAAM,QAAQ,CAAA;AACtG,YAAA,MAAM,MAAA,GAAS,KAAK,SAAS,CAAA;AAC7B,YAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,EAAO,GAAM,CAAA;AACjC,YAAA,MAAM,KAAK,GAAA,CAAI,OAAA,KAAY,OAAA,CAAQ,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA;AAE7C,YAAA,KAAA,CAAM,IAAA,CAAK;AAAA,cACT,EAAA,EAAI,MAAM,KAAK,CAAA;AAAA,cACf,MAAA,EAAQ,QAAA;AAAA,cACR,IAAA,EAAM,qBAAA;AAAA,cACN,QAAQ,CAAC,MAAA;AAAA,cACT,aAAA,EAAe,CAAA;AAAA,cACf,YAAA,EAAc,CAAA;AAAA,cACd,QAAQ,SAAA,EAAU;AAAA,cAClB,aAAa,IAAA,CAAK,eAAA,GAAkB,IAAI,IAAA,GAAO,OAAA,CAAQ,GAAG,GAAG,CAAA;AAAA,cAC7D,SAAA,EAAW,EAAA;AAAA,cACX,WAAA,EAAa,eAAe,MAAM,CAAA,KAAA;AAAA,aACnC,CAAA;AAED,YAAA,KAAA,CAAM,IAAA,CAAK;AAAA,cACT,EAAA,EAAI,MAAM,KAAK,CAAA;AAAA,cACf,MAAA,EAAQ,MAAA;AAAA,cACR,IAAA,EAAM,qBAAA;AAAA,cACN,MAAA;AAAA,cACA,aAAA,EAAe,CAAA;AAAA,cACf,YAAA,EAAc,CAAA;AAAA,cACd,QAAQ,SAAA,EAAU;AAAA,cAClB,aAAa,IAAA,CAAK,eAAA,GAAkB,IAAI,IAAA,GAAO,OAAA,CAAQ,KAAK,GAAG,CAAA;AAAA,cAC/D,WAAW,EAAA,GAAK,GAAA;AAAA,cAChB,WAAA,EAAa,iBAAiB,QAAQ,CAAA,KAAA;AAAA,aACvC,CAAA;AAAA,UACH;AAGA,UAAA,IAAI,SAAA,KAAc,CAAA,IAAK,IAAA,CAAK,MAAA,KAAW,IAAA,EAAM;AAC3C,YAAA,MAAM,IAAA,GAAO,KAAK,mBAAmB,CAAA;AACrC,YAAA,MAAM,YAAA,GAAe,IAAA,CAAK,GAAA,EAAO,GAAM,CAAA;AACvC,YAAA,MAAM,KAAK,GAAA,CAAI,OAAA,KAAY,OAAA,CAAQ,CAAA,EAAG,CAAC,CAAA,GAAI,IAAA;AAC3C,YAAA,KAAA,CAAM,IAAA,CAAK;AAAA,cACT,EAAA,EAAI,MAAM,KAAK,CAAA;AAAA,cACf,QAAQ,IAAA,CAAK,EAAA;AAAA,cACb,IAAA,EAAM,mBAAA;AAAA,cACN,QAAQ,IAAA,CAAK,MAAA,EAAO,GAAI,GAAA,GAAM,eAAe,CAAC,YAAA;AAAA,cAC9C,aAAA,EAAe,CAAA;AAAA,cACf,YAAA,EAAc,CAAA;AAAA,cACd,QAAQ,SAAA,EAAU;AAAA,cAClB,aAAa,IAAA,CAAK,eAAA,GAAkB,IAAI,IAAA,GAAO,OAAA,CAAQ,KAAK,GAAG,CAAA;AAAA,cAC/D,SAAA,EAAW,EAAA;AAAA,cACX,WAAA,EAAa;AAAA,aACd,CAAA;AAAA,UACH;AAAA,QACF;AAGA,QAAA,KAAA,CAAM,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,SAAA,GAAY,EAAE,SAAS,CAAA;AAG9C,QAAA,MAAM,cAAA,GAAgD;AAAA,UACpD,QAAA,EAAU,mBAAA,CAAoB,CAAC,CAAA,CAAE,SAAA,GAAY,IAAA;AAAA,UAC7C,OAAA,EAAS,mBAAA,CAAoB,CAAC,CAAA,CAAE,SAAA,GAAY,IAAA;AAAA,UAC5C,SAAA,EAAW,mBAAA,CAAoB,CAAC,CAAA,CAAE,SAAA,GAAY;AAAA,SAChD;AAEA,QAAA,KAAA,MAAW,MAAM,KAAA,EAAO;AACtB,UAAA,EAAA,CAAG,aAAA,GAAgB,cAAA,CAAe,EAAA,CAAG,MAAM,CAAA;AAC3C,UAAA,cAAA,CAAe,EAAA,CAAG,MAAM,CAAA,IAAK,EAAA,CAAG,MAAA;AAChC,UAAA,EAAA,CAAG,YAAA,GAAe,cAAA,CAAe,EAAA,CAAG,MAAM,CAAA;AAAA,QAC5C;AAEA,QAAA,IAAA,CAAK,gBAAA,GAAmB,KAAA;AACxB,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,MAEA,oBAAA,CACE,gBAAA,EACA,SAAA,EACA,aAAA,EACoB;AACpB,QAAA,MAAM,SAA6B,EAAC;AACpC,QAAA,MAAM,KAAA,GAAQ,IAAI,IAAA,CAAK,SAAS,CAAA;AAChC,QAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAA,CAAK,IAAA,CAAA,CAAM,GAAA,CAAI,OAAA,EAAQ,GAAI,KAAA,CAAM,OAAA,EAAQ,IAAK,KAAQ,CAAC,CAAA;AACrF,QAAA,IAAI,aAAA,GAAgB,CAAA;AACpB,QAAA,IAAI,QAAA,GAAW,IAAA,CAAK,eAAA,GAAkB,OAAA,CAAQ,GAAG,GAAI,CAAA;AAErD,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,EAAU,CAAA,EAAA,EAAK;AACjC,UAAA,MAAM,GAAA,GAAM,IAAI,IAAA,CAAK,KAAK,CAAA;AAC1B,UAAA,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,OAAA,EAAQ,GAAI,CAAC,CAAA;AAC7B,UAAA,MAAM,SAAA,GAAY,IAAI,MAAA,EAAO;AAG7B,UAAA,MAAM,SAAA,GAAa,SAAA,KAAc,CAAA,IAAK,SAAA,KAAc,CAAA,GAAK,OAAA,CAAQ,CAAA,EAAG,CAAC,CAAA,GAAI,OAAA,CAAQ,CAAA,EAAG,CAAC,CAAA;AAErF,UAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,SAAA,EAAW,CAAA,EAAA,EAAK;AAClC,YAAA,MAAM,IAAA,GAAO,oBAAA,CAAqB,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,EAAA,KAAO,IAAA,CAAK,aAAa,CAAC,CAAA,IAAK,IAAA,CAAK,oBAAoB,CAAA;AACtG,YAAA,MAAM,IAAA,GAAuB,IAAA,CAAK,MAAA,EAAO,GAAI,MAAM,KAAA,GAAQ,MAAA;AAC3D,YAAA,MAAM,IAAA,GAAO,WAAW,IAAA,CAAK,GAAA,EAAK,GAAG,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAA;AACjD,YAAA,MAAM,WAAW,IAAA,CAAK,SAAA,IAAa,CAAA,GAAI,IAAA,CAAK,OAAQ,IAAK,CAAA,CAAA;AACzD,YAAA,MAAM,WAAA,GAAc,IAAA,CAAK,GAAA,EAAK,CAAG,IAAI,IAAA,CAAK,OAAA;AAC1C,YAAA,MAAM,UAAA,GAAa,IAAA,KAAS,KAAA,GAAQ,QAAA,GAAW,cAAc,QAAA,GAAW,WAAA;AAGxE,YAAA,MAAM,OAAA,GAAU,IAAA,CAAK,MAAA,EAAO,GAAI,IAAA;AAChC,YAAA,IAAI,CAAC,OAAA,EAAS;AAEd,YAAA,MAAM,UAAA,GAAa,UAAA,IAAc,CAAA,GAAI,IAAA,CAAK,OAAU,IAAO,CAAA,CAAA;AAC3D,YAAA,MAAM,WAAA,GAAc,UAAA,IAAc,CAAA,GAAI,IAAA,CAAK,OAAU,IAAO,CAAA,CAAA;AAC5D,YAAA,MAAM,QAAS,WAAA,GAAc,QAAA,IAAY,KAAK,OAAA,IAAY,IAAA,KAAS,QAAQ,CAAA,GAAI,EAAA,CAAA;AAC/E,YAAA,MAAM,GAAA,GAAM,IAAA,GAAO,IAAA,CAAK,OAAA,GAAU,IAAA,GAAO,GAAA;AAGzC,YAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,EAAO,GAAK,YAAY,OAAA,GAAU,GAAA;AACrD,YAAA,MAAM,QAAA,GAAW,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,GAAI,CAAC,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,GAAI,IAAA,CAAK,KAAK,GAAG,CAAA;AACvE,YAAA,aAAA,IAAiB,QAAA;AAEjB,YAAA,MAAM,cAAc,IAAA,CAAK,GAAA,CAAI,QAAQ,CAAA,GAAI,IAAA,CAAK,MAAO,IAAK,CAAA;AAC1D,YAAA,MAAM,cAAc,IAAA,CAAK,GAAA,CAAI,QAAQ,CAAA,GAAI,IAAA,CAAK,MAAQ,IAAK,CAAA;AAC3D,YAAA,MAAM,mBAAmB,IAAA,CAAK,GAAA,CAAI,QAAQ,CAAA,GAAI,IAAA,CAAK,MAAQ,IAAK,CAAA;AAEhE,YAAA,QAAA,IAAY,OAAA,CAAQ,GAAG,EAAE,CAAA;AACzB,YAAA,MAAM,SAAA,GAAY,GAAA,CAAI,OAAA,EAAQ,GAAI,OAAA,CAAQ,CAAA,EAAG,EAAE,CAAA,GAAI,IAAA,GAAU,OAAA,CAAQ,CAAA,EAAG,IAAO,CAAA;AAE/E,YAAA,MAAA,CAAO,IAAA,CAAK;AAAA,cACV,EAAA,EAAI,MAAM,KAAK,CAAA;AAAA,cACf,SAAA;AAAA,cACA,QAAQ,IAAA,CAAK,EAAA;AAAA,cACb,YAAY,IAAA,CAAK,MAAA;AAAA,cACjB,IAAA;AAAA,cACA,QAAA;AAAA,cACA,UAAA;AAAA,cACA,UAAA;AAAA,cACA,WAAA;AAAA,cACA,IAAA;AAAA,cACA,IAAA,EAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,GAAI,CAAC,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,GAAI,IAAA,CAAK,KAAK,GAAG,CAAA;AAAA,cAC9D,GAAA,EAAK,QAAA;AAAA,cACL,MAAA,EAAQ,SAAA;AAAA,cACR,UAAA,EAAY,IAAA;AAAA,cACZ,WAAA;AAAA,cACA,WAAA;AAAA,cACA,gBAAA;AAAA,cACA,QAAQ,SAAA,EAAU;AAAA,cAClB,WAAA,EAAa,QAAA;AAAA,cACb,UAAU,CAAA,GAAI,CAAA;AAAA,cACd;AAAA,aACD,CAAA;AAAA,UACH;AAAA,QACF;AAEA,QAAA,MAAA,CAAO,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,SAAA,GAAY,EAAE,SAAS,CAAA;AAC/C,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,MAEA,uBAAA,CACE,MAAA,EACA,IAAA,EACA,UAAA,EACsB;AACtB,QAAA,MAAM,MAAA,GAAS,YAAY,MAAM,CAAA;AACjC,QAAA,IAAI,MAAA;AAEJ,QAAA,QAAQ,IAAA;AAAM,UACZ,KAAK,SAAA;AACH,YAAA,MAAA,GAAS,cAAc,IAAA,CAAK,MAAA,CAAO,iBAAiB,GAAA,EAAK,MAAA,CAAO,iBAAiB,GAAG,CAAA;AACpF,YAAA;AAAA,UACF,KAAK,YAAA;AACH,YAAA,MAAA,GAAS,EAAE,cAAc,IAAA,CAAK,MAAA,CAAO,oBAAoB,GAAA,EAAK,MAAA,CAAO,oBAAoB,GAAG,CAAA,CAAA;AAC5F,YAAA;AAAA,UACF,KAAK,qBAAA;AACH,YAAA,MAAA,GAAS,UAAA,IAAc,IAAA,CAAK,GAAA,EAAK,GAAI,CAAA;AACrC,YAAA;AAAA,UACF,KAAK,gBAAA;AACH,YAAA,MAAA,GAAS,UAAA,IAAc,IAAA,CAAK,GAAA,EAAK,GAAI,CAAA;AACrC,YAAA;AAAA,UACF,KAAK,iBAAA;AACH,YAAA,MAAA,GAAS,EAAE,UAAA,IAAc,IAAA,CAAK,GAAA,EAAK,GAAI,CAAA,CAAA;AACvC,YAAA;AAAA,UACF;AACE,YAAA,MAAA,GAAS,UAAA,IAAc,IAAA,CAAK,IAAA,EAAO,GAAI,CAAA;AAAA;AAG3C,QAAA,MAAM,OAAO,mBAAA,CAAoB,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,MAAM,CAAA;AAC1D,QAAA,MAAM,gBAAgB,IAAA,CAAK,SAAA;AAE3B,QAAA,OAAO;AAAA,UACL,EAAA,EAAI,MAAM,KAAK,CAAA;AAAA,UACf,MAAA;AAAA,UACA,IAAA;AAAA,UACA,MAAA;AAAA,UACA,aAAA;AAAA,UACA,cAAc,aAAA,GAAgB,MAAA;AAAA,UAC9B,QAAQ,SAAA,EAAU;AAAA,UAClB,WAAA,EAAa,KAAK,eAAA,GAAkB,IAAA,CAAK,MAAM,IAAA,CAAK,GAAA,KAAQ,IAAK,CAAA;AAAA,UACjE,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,UACpB,WAAA,EAAa,KAAK,gBAAA,CAAiB,IAAA,EAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,MAAM,CAAC;AAAA,SACnE;AAAA,MACF;AAAA;AAAA,MAIQ,qBAAA,CACN,QACA,WAAA,EAC0B;AAC1B,QAAA,MAAM,MAAA,GAAS,YAAY,MAAM,CAAA;AACjC,QAAA,MAAM,YAAsC,EAAC;AAC7C,QAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AAGrB,QAAA,IAAI,OAAA,GAAU,WAAA,GAAc,IAAA,CAAK,IAAA,EAAM,IAAI,CAAA;AAC3C,QAAA,IAAI,aAAA,GAAgB,CAAA;AAEpB,QAAA,KAAA,IAAS,CAAA,GAAI,EAAA,EAAI,CAAA,IAAK,CAAA,EAAG,CAAA,EAAA,EAAK;AAC5B,UAAA,MAAM,GAAA,GAAM,IAAI,IAAA,CAAK,GAAG,CAAA;AACxB,UAAA,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,OAAA,EAAQ,GAAI,CAAC,CAAA;AAC7B,UAAA,MAAM,SAAA,GAAY,IAAI,MAAA,EAAO;AAC7B,UAAA,MAAM,SAAA,GAAY,SAAA,KAAc,CAAA,IAAK,SAAA,KAAc,CAAA;AAEnD,UAAA,MAAM,WAAA,GAAc,OAAA;AAGpB,UAAA,MAAM,kBAAA,GAAqB,YAAY,GAAA,GAAM,CAAA;AAG7C,UAAA,MAAM,UAAA,GAAa,CAAC,SAAA,IAAa,IAAA,CAAK,QAAO,GAAI,GAAA;AACjD,UAAA,IAAI,WAAA;AACJ,UAAA,IAAI,UAAA,EAAY;AACd,YAAA,WAAA,GAAc,CAAC,IAAA,CAAK,IAAA,EAAQ,MAAA,CAAO,eAAe,CAAC,CAAA;AAAA,UACrD,CAAA,MAAO;AACL,YAAA,WAAA,GAAc,IAAA,CAAK,cAAA,CAAe,MAAA,CAAO,eAAA,EAAiB,OAAO,YAAY,CAAA;AAAA,UAC/E;AACA,UAAA,WAAA,IAAe,kBAAA;AAEf,UAAA,MAAM,WAAW,OAAA,GAAU,WAAA;AAC3B,UAAA,aAAA,IAAiB,QAAA;AAGjB,UAAA,MAAM,YAAA,GAAe,YACjB,OAAA,CAAQ,CAAA,EAAG,KAAK,IAAA,CAAK,MAAA,CAAO,eAAe,CAAC,CAAA,GAAI,GAAG,CAAC,CAAA,GACpD,QAAQ,MAAA,CAAO,cAAA,CAAe,CAAC,CAAA,EAAG,MAAA,CAAO,cAAA,CAAe,CAAC,CAAC,CAAA;AAC9D,UAAA,MAAM,eAAA,GAAkB,YACpB,OAAA,CAAQ,CAAA,EAAG,KAAK,IAAA,CAAK,MAAA,CAAO,kBAAkB,CAAC,CAAA,GAAI,GAAG,CAAC,CAAA,GACvD,QAAQ,MAAA,CAAO,iBAAA,CAAkB,CAAC,CAAA,EAAG,MAAA,CAAO,iBAAA,CAAkB,CAAC,CAAC,CAAA;AAEpE,UAAA,MAAM,WAAW,YAAA,GAAe,MAAA,CAAO,iBAAiB,IAAA,CAAK,GAAA,EAAK,GAAG,CAAA,GAAI,kBAAA;AACzE,UAAA,MAAM,cAAc,eAAA,GAAkB,MAAA,CAAO,oBAAoB,IAAA,CAAK,GAAA,EAAK,GAAG,CAAA,GAAI,kBAAA;AAClF,UAAA,MAAM,UAAU,QAAA,GAAW,WAAA;AAE3B,UAAA,OAAA,IAAW,QAAA,GAAW,OAAA;AAEtB,UAAA,MAAM,UAAU,YAAA,GAAe,eAAA,GAAkB,KAAK,KAAA,CAAM,MAAA,CAAO,mBAAmB,kBAAkB,CAAA;AACxG,UAAA,MAAM,WAAA,GAAc,IAAA,CAAK,MAAA,CAAO,cAAA,EAAgB,OAAO,cAAc,CAAA;AACrE,UAAA,MAAM,cAAc,IAAA,CAAK,KAAA,CAAM,KAAK,EAAA,EAAI,GAAG,IAAI,kBAAkB,CAAA;AAEjE,UAAA,SAAA,CAAU,IAAA,CAAK;AAAA,YACb,MAAA;AAAA,YACA,IAAA,EAAM,WAAW,GAAG,CAAA;AAAA,YACpB,WAAA;AAAA,YACA,YAAA,EAAc,OAAA;AAAA,YACd,QAAA;AAAA,YACA,WAAA;AAAA,YACA,OAAA;AAAA,YACA,QAAA;AAAA,YACA,WAAA;AAAA,YACA,aAAA;AAAA,YACA,WAAA;AAAA,YACA,OAAA;AAAA,YACA;AAAA,WACD,CAAA;AAAA,QACH;AAEA,QAAA,OAAO,SAAA;AAAA,MACT;AAAA,MAEQ,wBAAA,CACN,QACA,SAAA,EACwB;AACxB,QAAA,MAAM,MAAA,GAAS,YAAY,MAAM,CAAA;AACjC,QAAA,MAAM,eAAuC,EAAC;AAE9C,QAAA,KAAA,MAAW,QAAQ,SAAA,EAAW;AAC5B,UAAA,MAAM,GAAA,GAAM,IAAI,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA;AAC9B,UAAA,MAAM,SAAA,GAAY,IAAI,MAAA,EAAO;AAC7B,UAAA,MAAM,SAAA,GAAY,SAAA,KAAc,CAAA,IAAK,SAAA,KAAc,CAAA;AACnD,UAAA,MAAM,IAAA,GAAO,YAAY,GAAA,GAAM,CAAA;AAE/B,UAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,cAAA,CAAe,CAAC,CAAA,EAAG,MAAA,CAAO,cAAA,CAAe,CAAC,CAAC,IAAI,IAAI,CAAA;AAClG,UAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,iBAAA,CAAkB,CAAC,CAAA,EAAG,MAAA,CAAO,iBAAA,CAAkB,CAAC,CAAC,IAAI,IAAI,CAAA;AAC3G,UAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,mBAAmB,IAAI,CAAA;AAG7D,UAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,YAAA,EAAc,CAAA,EAAA,EAAK;AACrC,YAAA,MAAM,SAAS,IAAA,CAAK,MAAA,CAAO,iBAAiB,GAAA,EAAK,MAAA,CAAO,iBAAiB,CAAG,CAAA;AAC5E,YAAA,MAAM,EAAA,GAAK,GAAA,CAAI,OAAA,EAAQ,GAAI,OAAA,CAAQ,CAAA,EAAG,EAAE,CAAA,GAAI,IAAA,GAAU,OAAA,CAAQ,CAAA,EAAG,IAAO,CAAA;AACxE,YAAA,YAAA,CAAa,IAAA,CAAK;AAAA,cAChB,EAAA,EAAI,MAAM,KAAK,CAAA;AAAA,cACf,MAAA;AAAA,cACA,IAAA,EAAM,SAAA;AAAA,cACN,MAAA;AAAA,cACA,aAAA,EAAe,CAAA;AAAA,cACf,YAAA,EAAc,CAAA;AAAA,cACd,QAAQ,SAAA,EAAU;AAAA,cAClB,WAAA,EAAa,IAAA,CAAK,eAAA,GAAkB,IAAA,CAAK,KAAA,CAAM,KAAK,IAAK,CAAA,GAAI,OAAA,CAAQ,CAAA,EAAG,EAAE,CAAA;AAAA,cAC1E,SAAA,EAAW,EAAA;AAAA,cACX,WAAA,EAAa,cAAc,MAAM,CAAA,KAAA;AAAA,aAClC,CAAA;AAAA,UACH;AAGA,UAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,eAAA,EAAiB,CAAA,EAAA,EAAK;AACxC,YAAA,MAAM,SAAS,IAAA,CAAK,MAAA,CAAO,oBAAoB,GAAA,EAAK,MAAA,CAAO,oBAAoB,CAAG,CAAA;AAClF,YAAA,MAAM,EAAA,GAAK,GAAA,CAAI,OAAA,EAAQ,GAAI,OAAA,CAAQ,CAAA,EAAG,EAAE,CAAA,GAAI,IAAA,GAAU,OAAA,CAAQ,CAAA,EAAG,IAAO,CAAA;AACxE,YAAA,YAAA,CAAa,IAAA,CAAK;AAAA,cAChB,EAAA,EAAI,MAAM,KAAK,CAAA;AAAA,cACf,MAAA;AAAA,cACA,IAAA,EAAM,YAAA;AAAA,cACN,QAAQ,CAAC,MAAA;AAAA,cACT,aAAA,EAAe,CAAA;AAAA,cACf,YAAA,EAAc,CAAA;AAAA,cACd,QAAQ,SAAA,EAAU;AAAA,cAClB,WAAA,EAAa,IAAA,CAAK,eAAA,GAAkB,IAAA,CAAK,KAAA,CAAM,KAAK,IAAK,CAAA,GAAI,OAAA,CAAQ,CAAA,EAAG,EAAE,CAAA;AAAA,cAC1E,SAAA,EAAW,EAAA;AAAA,cACX,WAAA,EAAa,mBAAmB,MAAM,CAAA,KAAA;AAAA,aACvC,CAAA;AAAA,UACH;AAGA,UAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,WAAA,EAAa,CAAA,EAAA,EAAK;AACpC,YAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,EAAK,GAAI,CAAA;AAC7B,YAAA,MAAM,EAAA,GAAK,GAAA,CAAI,OAAA,EAAQ,GAAI,OAAA,CAAQ,CAAA,EAAG,EAAE,CAAA,GAAI,IAAA,GAAU,OAAA,CAAQ,CAAA,EAAG,IAAO,CAAA;AACxE,YAAA,YAAA,CAAa,IAAA,CAAK;AAAA,cAChB,EAAA,EAAI,MAAM,KAAK,CAAA;AAAA,cACf,MAAA;AAAA,cACA,IAAA,EAAM,qBAAA;AAAA,cACN,MAAA;AAAA,cACA,aAAA,EAAe,CAAA;AAAA,cACf,YAAA,EAAc,CAAA;AAAA,cACd,QAAQ,SAAA,EAAU;AAAA,cAClB,WAAA,EAAa,IAAA,CAAK,eAAA,GAAkB,IAAA,CAAK,KAAA,CAAM,KAAK,IAAK,CAAA,GAAI,OAAA,CAAQ,CAAA,EAAG,EAAE,CAAA;AAAA,cAC1E,SAAA,EAAW,EAAA;AAAA,cACX,WAAA,EAAa,4BAA4B,MAAM,CAAA,KAAA;AAAA,aAChD,CAAA;AAAA,UACH;AAGA,UAAA,IAAI,CAAC,SAAA,EAAW;AACd,YAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,CAAA,EAAG,CAAC,CAAA;AAC7B,YAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,EAAU,CAAA,EAAA,EAAK;AACjC,cAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,EAAK,GAAI,CAAA;AAC7B,cAAA,MAAM,KAAK,GAAA,CAAI,OAAA,KAAY,OAAA,CAAQ,CAAA,EAAG,EAAE,CAAA,GAAI,IAAA;AAC5C,cAAA,YAAA,CAAa,IAAA,CAAK;AAAA,gBAChB,EAAA,EAAI,MAAM,KAAK,CAAA;AAAA,gBACf,MAAA;AAAA,gBACA,IAAA,EAAM,gBAAA;AAAA,gBACN,MAAA;AAAA,gBACA,aAAA,EAAe,CAAA;AAAA,gBACf,YAAA,EAAc,CAAA;AAAA,gBACd,QAAQ,SAAA,EAAU;AAAA,gBAClB,WAAA,EAAa,IAAA,CAAK,eAAA,GAAkB,IAAA,CAAK,KAAA,CAAM,KAAK,IAAK,CAAA,GAAI,OAAA,CAAQ,CAAA,EAAG,EAAE,CAAA;AAAA,gBAC1E,SAAA,EAAW,EAAA;AAAA,gBACX,WAAA,EAAa,sBAAsB,MAAM,CAAA,KAAA;AAAA,eAC1C,CAAA;AAAA,YACH;AAAA,UACF;AAAA,QACF;AAEA,QAAA,OAAO,YAAA;AAAA,MACT;AAAA,MAEQ,cAAA,CAAe,MAAc,MAAA,EAAwB;AAC3D,QAAA,IAAI,CAAA,GAAI,GAAG,CAAA,GAAI,CAAA;AACf,QAAA,OAAO,CAAA,KAAM,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAA,EAAO;AAChC,QAAA,OAAO,CAAA,KAAM,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAA,EAAO;AAChC,QAAA,MAAM,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,EAAA,GAAO,KAAK,GAAA,CAAI,CAAC,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,GAAM,IAAA,CAAK,KAAK,CAAC,CAAA;AACpE,QAAA,OAAO,OAAO,CAAA,GAAI,MAAA;AAAA,MACpB;AAAA,MAEQ,gBAAA,CAAiB,IAAA,EAAgC,MAAA,EAAuB,MAAA,EAAwB;AACtG,QAAA,MAAM,GAAA,GAAM,IAAI,MAAA,CAAO,cAAA,CAAe,QAAW,EAAE,qBAAA,EAAuB,CAAA,EAAG,CAAC,CAAA,CAAA;AAC9E,QAAA,QAAQ,IAAA;AAAM,UACZ,KAAK,SAAA;AAAW,YAAA,OAAO,CAAA,QAAA,EAAW,GAAG,CAAA,IAAA,EAAO,MAAM,CAAA,KAAA,CAAA;AAAA,UAClD,KAAK,YAAA;AAAc,YAAA,OAAO,CAAA,WAAA,EAAc,GAAG,CAAA,MAAA,EAAS,MAAM,CAAA,KAAA,CAAA;AAAA,UAC1D,KAAK,qBAAA;AAAuB,YAAA,OAAO,CAAA,oBAAA,EAAuB,GAAG,CAAA,MAAA,EAAS,MAAM,CAAA,CAAA;AAAA,UAC5E,KAAK,iBAAA;AAAmB,YAAA,OAAO,CAAA,cAAA,EAAiB,GAAG,CAAA,IAAA,EAAO,MAAM,CAAA,KAAA,CAAA;AAAA,UAChE,KAAK,qBAAA;AAAuB,YAAA,OAAO,uBAAuB,GAAG,CAAA,CAAA;AAAA,UAC7D,KAAK,gBAAA;AAAkB,YAAA,OAAO,CAAA,cAAA,EAAiB,GAAG,CAAA,IAAA,EAAO,MAAM,CAAA,CAAA;AAAA,UAC/D,KAAK,mBAAA;AAAqB,YAAA,OAAO,CAAA,kBAAA,EAAqB,GAAG,CAAA,IAAA,EAAO,MAAM,CAAA,CAAA;AAAA,UACtE;AAAS,YAAA,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA;AAAA;AAChC,MACF;AAAA,KACF;AAIA,IAAI,SAAA,GAAgD,IAAA;AAE7C,IAAM,sBAAA,GAAyB;AAAA,MACpC,WAAA,GAA2C;AACzC,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,SAAA,GAAY,IAAI,2BAAA,EAA4B;AAAA,QAC9C;AACA,QAAA,OAAO,SAAA;AAAA,MACT;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC7hBA,IAAA,6BAAA,GAAA,EAAA;AAAA,QAAA,CAAA,6BAAA,EAAA;AAAA,EAAA,qBAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AA6BA,SAASA,MAAAA,GAAgB;AACvB,EAAA,OAAO,SAAS,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,EAAE,SAAS,CAAA,CAAA;AAC3C;AAEA,SAAS,OAAA,GAAkB;AACzB,EAAA,OAAO,OAAO,IAAA,CAAK,GAAA,EAAI,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,WAAA,EAAa,CAAA,CAAA,EAAA,CAAK,EAAE,SAAA,EAAW,QAAA,CAAS,EAAE,CAAA,CAAE,aAAa,CAAA,CAAA;AACjG;AAEA,SAASC,KAAAA,CAAK,KAAa,GAAA,EAAqB;AAC9C,EAAA,OAAO,GAAA,GAAM,IAAA,CAAK,MAAA,EAAO,IAAK,GAAA,GAAM,GAAA,CAAA;AACtC;AAEA,SAASC,QAAAA,CAAQ,KAAa,GAAA,EAAqB;AACjD,EAAA,OAAO,KAAK,KAAA,CAAMD,KAAAA,CAAK,GAAA,EAAK,GAAA,GAAM,CAAC,CAAC,CAAA;AACtC;AAEA,SAASE,MAAQ,GAAA,EAAa;AAC5B,EAAA,OAAO,GAAA,CAAI,KAAK,KAAA,CAAM,IAAA,CAAK,QAAO,GAAI,GAAA,CAAI,MAAM,CAAC,CAAA;AACnD;AAEA,SAAS,UAAA,CAAW,OAAe,IAAA,EAAiC;AAClE,EAAA,IAAI,KAAK,OAAA,IAAW,IAAA,EAAM,OAAO,KAAA,CAAM,QAAQ,CAAC,CAAA;AAChD,EAAA,OAAO,KAAA,CAAM,QAAQ,CAAC,CAAA;AACxB;AApDA,IA4BI,SAAA,EA4BE,SAiBA,qBAAA,EAuZO,qBAAA;AAheb,IAAA,0BAAA,GAAA,KAAA,CAAA;AAAA,EAAA,6CAAA,GAAA;AAWA,IAAA,UAAA,EAAA;AAiBA,IAAI,SAAA,GAAY,CAAA;AA4BhB,IAAM,OAAA,GAAU;AAAA,MACd,2DAAA;AAAA,MACA,wDAAA;AAAA,MACA,uDAAA;AAAA,MACA,6CAAA;AAAA,MACA,0CAAA;AAAA,MACA,oDAAA;AAAA,MACA,oDAAA;AAAA,MACA,4DAAA;AAAA,MACA,gEAAA;AAAA,MACA,mDAAA;AAAA,MACA,kDAAA;AAAA,MACA;AAAA,KACF;AAIA,IAAM,wBAAN,MAA4B;AAAA,MAY1B,WAAA,GAAc;AAXd,QAAA,IAAA,CAAQ,YAA2B,EAAC;AACpC,QAAA,IAAA,CAAQ,kBAAoC,EAAC;AAC7C,QAAA,IAAA,CAAQ,UAAA,GAAmD,IAAA;AAC3D,QAAA,IAAA,CAAQ,UAAA,uBAAyC,GAAA,EAAI;AACrD,QAAA,IAAA,CAAQ,OAAA,GAAU,KAAA;AAClB,QAAA,IAAA,CAAQ,gBAAiC,EAAC;AAC1C,QAAA,IAAA,CAAQ,QAAA,GAAW,CAAA;AACnB,QAAA,IAAA,CAAQ,WAAA,GAAc,CAAA;AACtB,QAAA,IAAA,CAAQ,SAAA,GAAY,CAAA;AACpB,QAAA,IAAA,CAAQ,SAAA,GAAY,CAAA;AAGlB,QAAA,KAAA,MAAW,QAAQ,oBAAA,EAAsB;AACvC,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,GAAYF,KAAAA,CAAK,OAAQ,IAAK,CAAA;AAClD,UAAA,MAAM,KAAA,GAAQ,KAAK,SAAA,GAAY,MAAA;AAC/B,UAAA,MAAM,UAAA,GAAa,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,OAAA,GAAU,CAAA;AACpD,UAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI;AAAA,YAC3B,IAAA;AAAA,YACA,YAAA,EAAc,KAAA;AAAA,YACd,UAAU,KAAA,GAAQ,UAAA;AAAA,YAClB,UAAU,KAAA,GAAQ,UAAA;AAAA,YAClB,YAAY,IAAA,CAAK;AAAA,WAClB,CAAA;AAAA,QACH;AAAA,MACF;AAAA;AAAA,MAIA,KAAA,GAAc;AACZ,QAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,QAAA,IAAA,CAAK,aAAA,EAAc;AAAA,MACrB;AAAA,MAEA,IAAA,GAAa;AACX,QAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AACf,QAAA,IAAI,KAAK,UAAA,EAAY;AACnB,UAAA,YAAA,CAAa,KAAK,UAAU,CAAA;AAC5B,UAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAAA,QACpB;AAAA,MACF;AAAA,MAEA,MAAM,QAAA,EAAmC;AACvC,QAAA,IAAA,CAAK,SAAA,CAAU,KAAK,QAAQ,CAAA;AAC5B,QAAA,OAAO,MAAM;AACX,UAAA,IAAA,CAAK,YAAY,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,CAAA,CAAA,KAAK,MAAM,QAAQ,CAAA;AAAA,QAC5D,CAAA;AAAA,MACF;AAAA,MAEA,kBAAkB,QAAA,EAAsC;AACtD,QAAA,IAAA,CAAK,eAAA,CAAgB,KAAK,QAAQ,CAAA;AAClC,QAAA,OAAO,MAAM;AACX,UAAA,IAAA,CAAK,kBAAkB,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,CAAA,CAAA,KAAK,MAAM,QAAQ,CAAA;AAAA,QACxE,CAAA;AAAA,MACF;AAAA,MAEA,SAAA,GAAqB;AACnB,QAAA,OAAO,IAAA,CAAK,OAAA;AAAA,MACd;AAAA,MAEA,QAAA,GAA+G;AAC7G,QAAA,OAAO;AAAA,UACL,UAAU,IAAA,CAAK,QAAA;AAAA,UACf,aAAa,IAAA,CAAK,WAAA;AAAA,UAClB,WAAW,IAAA,CAAK,SAAA;AAAA,UAChB,WAAW,IAAA,CAAK,SAAA;AAAA,UAChB,SAAA,EAAW,KAAK,aAAA,CAAc;AAAA,SAChC;AAAA,MACF;AAAA,MAEA,aAAA,GAAwC;AACtC,QAAA,OAAO,IAAA,CAAK,UAAA;AAAA,MACd;AAAA,MAEA,gBAAA,GAAyB;AACvB,QAAA,MAAM,YAAA,GAAsD;AAAA,UAC1D,EAAE,GAAA,EAAK,wCAAA,EAA0C,KAAA,EAAO,CAAA,EAAE;AAAA,UAC1D,EAAE,GAAA,EAAK,8CAAA,EAAgD,KAAA,EAAO,GAAA,EAAI;AAAA,UAClE,EAAE,GAAA,EAAK,iDAAA,EAAmD,KAAA,EAAO,IAAA,EAAK;AAAA,UACtE,EAAE,GAAA,EAAK,sCAAA,EAAwC,KAAA,EAAO,GAAA,EAAK;AAAA,UAC3D,EAAE,GAAA,EAAK,wCAAA,EAA0C,KAAA,EAAO,IAAA,EAAK;AAAA,UAC7D,EAAE,GAAA,EAAK,sCAAA,EAAwC,KAAA,EAAO,IAAA,EAAK;AAAA,UAC3D,EAAE,GAAA,EAAK,wCAAA,EAA0C,KAAA,EAAO,GAAA,EAAK;AAAA,UAC7D,EAAE,GAAA,EAAK,mDAAA,EAAqD,KAAA,EAAO,IAAA,EAAK;AAAA,UACxE,EAAE,GAAA,EAAK,oDAAA,EAAsD,KAAA,EAAO,GAAA;AAAK,SAC3E;AAEA,QAAA,KAAA,MAAW,EAAE,GAAA,EAAK,KAAA,EAAM,IAAK,YAAA,EAAc;AACzC,UAAA,UAAA,CAAW,MAAM;AACf,YAAA,IAAA,CAAK,IAAA,CAAK;AAAA,cACR,IAAID,MAAAA,EAAM;AAAA,cACV,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,cACpB,IAAA,EAAM,QAAA;AAAA,cACN,OAAA,EAAS,GAAA;AAAA,cACT,UAAA,EAAY;AAAA,aACb,CAAA;AAAA,UACH,GAAG,KAAK,CAAA;AAAA,QACV;AAAA,MACF;AAAA,MAEA,OAAA,GAAgB;AACd,QAAA,IAAA,CAAK,IAAA,EAAK;AACV,QAAA,IAAA,CAAK,YAAY,EAAC;AAClB,QAAA,IAAA,CAAK,kBAAkB,EAAC;AACxB,QAAA,IAAA,CAAK,WAAW,KAAA,EAAM;AACtB,QAAA,IAAA,CAAK,gBAAgB,EAAC;AAAA,MACxB;AAAA;AAAA,MAIQ,KAAK,KAAA,EAA4B;AACvC,QAAA,KAAA,MAAW,QAAA,IAAY,KAAK,SAAA,EAAW;AACrC,UAAA,QAAA,CAAS,KAAK,CAAA;AAAA,QAChB;AAAA,MACF;AAAA,MAEQ,WAAW,EAAA,EAAgC;AACjD,QAAA,KAAA,MAAW,QAAA,IAAY,KAAK,eAAA,EAAiB;AAC3C,UAAA,QAAA,CAAS,EAAE,CAAA;AAAA,QACb;AAAA,MACF;AAAA,MAEQ,uBAAA,CACN,MACA,IAAA,EACM;AACN,QAAA,IAAI;AACF,UAAA,MAAM,EAAE,sBAAA,EAAAI,uBAAAA,EAAuB,IAAI,2BAAA,EAAA,EAAA,YAAA,CAAA,8BAAA,CAAA,CAAA;AACnC,UAAA,MAAM,SAAA,GAAYA,wBAAuB,WAAA,EAAY;AAErD,UAAA,IAAI,IAAA,KAAS,QAAA,IAAY,IAAA,CAAK,GAAA,KAAQ,KAAA,CAAA,EAAW;AAC/C,YAAA,MAAM,EAAA,GAAK,SAAA,CAAU,uBAAA,CAAwB,UAAA,EAAY,gBAAA,EAAkB,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAG,CAAA,GAAIH,KAAAA,CAAK,IAAA,EAAO,IAAK,CAAC,CAAA;AAClH,YAAA,IAAA,CAAK,WAAW,EAAE,CAAA;AAAA,UACpB,CAAA,MAAA,IAAW,SAAS,OAAA,EAAS;AAC3B,YAAA,MAAM,EAAA,GAAK,UAAU,uBAAA,CAAwB,SAAA,EAAW,KAAK,GAAA,IAAO,IAAA,CAAK,MAAM,CAAA,GAAI,iBAAA,GAAoB,uBAAuB,IAAA,CAAK,GAAA,CAAI,KAAK,IAAA,IAAQ,CAAC,IAAIA,KAAAA,CAAK,EAAA,EAAI,GAAG,CAAC,CAAA;AACtK,YAAA,IAAA,CAAK,WAAW,EAAE,CAAA;AAAA,UACpB,CAAA,MAAA,IAAW,SAAS,OAAA,EAAS;AAC3B,YAAA,MAAM,EAAA,GAAK,SAAA,CAAU,uBAAA,CAAwB,UAAA,EAAY,qBAAA,EAAA,CAAwB,IAAA,CAAK,MAAA,IAAU,GAAA,IAAUA,KAAAA,CAAK,IAAA,EAAQ,IAAM,CAAC,CAAA;AAC9H,YAAA,IAAA,CAAK,WAAW,EAAE,CAAA;AAAA,UACpB;AAAA,QACF,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAAA,MAEQ,aAAA,GAAsB;AAC5B,QAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACnB,QAAA,MAAM,QAAA,GAAWA,KAAAA,CAAK,GAAA,EAAM,IAAK,CAAA;AACjC,QAAA,IAAA,CAAK,UAAA,GAAa,WAAW,MAAM;AACjC,UAAA,IAAI,KAAK,OAAA,EAAS;AAChB,YAAA,IAAA,CAAK,aAAA,EAAc;AACnB,YAAA,IAAA,CAAK,aAAA,EAAc;AAAA,UACrB;AAAA,QACF,GAAG,QAAQ,CAAA;AAAA,MACb;AAAA,MAEQ,cAAc,MAAA,EAAwB;AAC5C,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,MAAM,CAAA;AACxC,QAAA,IAAI,CAAC,OAAO,OAAO,CAAA;AACnB,QAAA,MAAM,aAAa,KAAA,CAAM,IAAA,CAAK,GAAG,QAAA,CAAS,MAAM,IAAI,IAAA,GAAS,IAAA;AAC7D,QAAA,MAAM,KAAA,GAAQA,KAAAA,CAAK,CAAC,UAAA,EAAY,UAAU,CAAA;AAC1C,QAAA,MAAM,QAAA,GAAW,KAAA,CAAM,YAAA,IAAgB,CAAA,GAAI,KAAA,CAAA;AAC3C,QAAA,MAAM,UAAA,GAAA,CAAc,KAAA,CAAM,IAAA,CAAK,UAAA,GAAaA,KAAAA,CAAK,MAAM,GAAG,CAAA,IAAK,KAAA,CAAM,IAAA,CAAK,OAAA,GAAU,CAAA;AACpF,QAAA,KAAA,CAAM,YAAA,GAAe,QAAA;AACrB,QAAA,KAAA,CAAM,WAAW,QAAA,GAAW,UAAA;AAC5B,QAAA,KAAA,CAAM,WAAW,QAAA,GAAW,UAAA;AAC5B,QAAA,KAAA,CAAM,UAAA,GAAa,UAAA,GAAa,CAAA,GAAI,KAAA,CAAM,IAAA,CAAK,OAAA;AAC/C,QAAA,OAAO,QAAA;AAAA,MACT;AAAA,MAEQ,aAAA,GAAsB;AAC5B,QAAA,MAAM,SAAA,GAAYE,MAAK,KAAA,CAAM,IAAA,CAAK,KAAK,UAAA,CAAW,MAAA,EAAQ,CAAC,CAAA;AAC3D,QAAA,MAAM,OAAO,SAAA,CAAU,IAAA;AACvB,QAAA,MAAM,UAAoF,EAAC;AAC3F,QAAA,IAAI,KAAA,GAAQ,CAAA;AAGZ,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,aAAA,CAAc,IAAA,CAAK,EAAE,CAAA;AAGxC,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,EAAO,GAAI,MAAM,KAAA,GAAQ,MAAA;AAC3C,QAAA,MAAM,IAAA,GAAO,WAAYF,KAAAA,CAAK,GAAA,EAAK,GAAG,CAAA,CAAG,OAAA,CAAQ,CAAC,CAAC,CAAA;AACnD,QAAA,MAAM,WAAW,IAAA,GAAO,GAAA;AACxB,QAAA,MAAM,QAAQ,OAAA,EAAQ;AAEtB,QAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,UACX,KAAA,EAAO;AAAA,YACL,IAAA,EAAM,KAAA;AAAA,YACN,OAAA,EAAS,OAAO,KAAK,CAAA,GAAA,EAAM,KAAK,MAAM,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,QAAA,EAAA,CAAY,QAAA,GAAW,GAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,UAAA,EAAa,UAAA,CAAW,KAAA,EAAO,IAAI,CAAC,CAAA,CAAA;AAAA,YAC5I,IAAA,EAAM,EAAE,KAAA,EAAO,IAAA,EAAM,KAAK,EAAA,EAAI,IAAA,EAAM,MAAM,KAAA,EAAM;AAAA,YAChD,UAAA,EAAY,QAAA;AAAA,YACZ,QAAQ,IAAA,CAAK;AAAA,WACf;AAAA,UACA;AAAA,SACD,CAAA;AACD,QAAA,KAAA,IAASA,KAAAA,CAAK,KAAK,GAAG,CAAA;AAGtB,QAAA,MAAM,WAAA,GAAcA,KAAAA,CAAK,GAAA,EAAK,CAAG,IAAI,IAAA,CAAK,OAAA;AAC1C,QAAA,MAAM,UAAA,GAAa,IAAA,KAAS,KAAA,GACxB,KAAA,GAAQ,cACR,KAAA,GAAQ,WAAA;AACZ,QAAA,MAAM,YAAY,IAAA,CAAK,GAAA,CAAI,UAAA,GAAa,KAAK,IAAI,IAAA,CAAK,OAAA;AAEtD,QAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,UACX,KAAA,EAAO;AAAA,YACL,IAAA,EAAM,OAAA;AAAA,YACN,OAAA,EAAS,CAAA,MAAA,EAAS,KAAK,CAAA,GAAA,EAAM,KAAK,MAAM,CAAA,GAAA,EAAM,UAAA,CAAW,UAAA,EAAY,IAAI,CAAC,CAAA,WAAA,EAAc,SAAA,CAAU,OAAA,CAAQ,CAAC,CAAC,CAAA,iBAAA,CAAA;AAAA,YAC5G,IAAA,EAAM,EAAE,KAAA,EAAO,UAAA,EAAY,QAAQ,SAAA,EAAU;AAAA,YAC7C,UAAA,EAAY,QAAA;AAAA,YACZ,QAAQ,IAAA,CAAK;AAAA,WACf;AAAA,UACA;AAAA,SACD,CAAA;AACD,QAAA,KAAA,IAASA,KAAAA,CAAK,KAAK,GAAI,CAAA;AAGvB,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,MAAA,EAAO,GAAI,IAAA;AAChC,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,MAAM,UAAA,GAAa,UAAA,IAAc,CAAA,GAAIA,KAAAA,CAAK,OAAU,IAAO,CAAA,CAAA;AAC3D,UAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,YACX,KAAA,EAAO;AAAA,cACL,IAAA,EAAM,OAAA;AAAA,cACN,OAAA,EAAS,SAAS,KAAK,CAAA,GAAA,EAAM,KAAK,MAAM,CAAA,CAAA,EAAI,IAAI,CAAA,GAAA,EAAM,UAAA,CAAW,UAAA,EAAY,IAAI,CAAC,CAAA,GAAA,EAAM,KAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,yBAAA,EAA4BC,QAAAA,CAAQ,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAAA,cAChJ,IAAA,EAAM,EAAE,KAAA,EAAO,UAAA,EAAY,YAAA,EAAc,MAAMA,QAAAA,CAAQ,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,EAAG;AAAA,cAC/D,UAAA,EAAY,MAAA;AAAA,cACZ,QAAQ,IAAA,CAAK;AAAA,aACf;AAAA,YACA;AAAA,WACD,CAAA;AACD,UAAA,KAAA,IAASD,KAAAA,CAAK,KAAM,IAAI,CAAA;AAGxB,UAAA,MAAM,WAAA,GAAc,UAAA,IAAc,CAAA,GAAIA,KAAAA,CAAK,OAAU,IAAO,CAAA,CAAA;AAC5D,UAAA,MAAM,QAAS,WAAA,GAAc,KAAA,IAAS,KAAK,OAAA,IAAY,IAAA,KAAS,QAAQ,CAAA,GAAI,EAAA,CAAA;AAC5E,UAAA,MAAM,GAAA,GAAM,IAAA,GAAO,IAAA,CAAK,OAAA,GAAU,IAAA,GAAO,GAAA;AAEzC,UAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,YACX,KAAA,EAAO;AAAA,cACL,IAAA,EAAM,QAAA;AAAA,cACN,OAAA,EAAS,CAAA,OAAA,EAAU,KAAK,CAAA,mBAAA,EAAsB,IAAA,CAAK,MAAM,CAAA,GAAA,EAAM,UAAA,CAAW,WAAA,EAAa,IAAI,CAAC,CAAA,QAAA,EAAW,QAAQ,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,EAAG,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,QAAA,EAAW,GAAA,IAAO,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,EAAG,GAAA,CAAI,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAAA,cAC5L,MAAM,EAAE,KAAA,EAAO,aAAa,IAAA,EAAM,GAAA,EAAK,KAAK,IAAA,EAAK;AAAA,cACjD,UAAA,EAAY,MAAA;AAAA,cACZ,QAAQ,IAAA,CAAK;AAAA,aACf;AAAA,YACA;AAAA,WACD,CAAA;AACD,UAAA,KAAA,IAASA,KAAAA,CAAK,KAAK,GAAG,CAAA;AAGtB,UAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,YACX,KAAA,EAAO;AAAA,cACL,IAAA,EAAM,KAAA;AAAA,cACN,OAAA,EAAS,CAAA,IAAA,EAAO,KAAK,CAAA,6DAAA,EAAgE,QAAA,CAAS,cAAA,EAAgB,CAAA,YAAA,EAAeC,QAAAA,CAAQ,EAAA,EAAI,EAAE,CAAC,CAAA,CAAA;AAAA,cAC5I,IAAA,EAAM,EAAE,KAAA,EAAO,OAAA,EAAS,MAAM,MAAA,EAAQA,QAAAA,CAAQ,EAAA,EAAI,EAAE,CAAA,EAAE;AAAA,cACtD,UAAA,EAAY,QAAA;AAAA,cACZ,QAAQ,IAAA,CAAK;AAAA,aACf;AAAA,YACA;AAAA,WACD,CAAA;AAGD,UAAA,IAAA,CAAK,uBAAA,CAAwB,QAAA,EAAU,EAAE,GAAA,EAAK,CAAA;AAG9C,UAAA,IAAA,CAAK,WAAA,EAAA;AACL,UAAA,IAAA,CAAK,QAAA,IAAY,GAAA;AACjB,UAAA,IAAA,CAAK,SAAA,IAAa,IAAA;AAClB,UAAA,IAAA,CAAK,SAAA,IAAa,IAAA;AAGlB,UAAA,IAAI,IAAA,CAAK,MAAA,EAAO,GAAI,GAAA,EAAK;AACvB,YAAA,IAAA,CAAK,cAAc,IAAA,CAAK;AAAA,cACtB,EAAA,EAAI,KAAA;AAAA,cACJ,QAAQ,IAAA,CAAK,EAAA;AAAA,cACb,IAAA;AAAA,cACA,IAAA;AAAA,cACA,IAAA;AAAA,cACA,UAAA,EAAY,UAAA;AAAA,cACZ,YAAA,EAAc,WAAA;AAAA,cACd,GAAA;AAAA,cACA,QAAA,EAAU,KAAK,GAAA;AAAI,aACpB,CAAA;AACD,YAAA,IAAI,IAAA,CAAK,aAAA,CAAc,MAAA,GAAS,CAAA,EAAG;AACjC,cAAA,IAAA,CAAK,cAAc,KAAA,EAAM;AAAA,YAC3B;AAAA,UACF;AAAA,QACF,CAAA,MAAO;AACL,UAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,YACX,KAAA,EAAO;AAAA,cACL,IAAA,EAAM,OAAA;AAAA,cACN,OAAA,EAAS,CAAA,aAAA,EAAgB,KAAK,CAAA,GAAA,EAAM,KAAK,MAAM,CAAA,oDAAA,CAAA;AAAA,cAC/C,IAAA,EAAM,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAM;AAAA,cAC9B,UAAA,EAAY,KAAA;AAAA,cACZ,QAAQ,IAAA,CAAK;AAAA,aACf;AAAA,YACA;AAAA,WACD,CAAA;AAAA,QACH;AAGA,QAAA,IAAI,IAAA,CAAK,MAAA,EAAO,GAAI,GAAA,EAAK;AACvB,UAAA,KAAA,IAASD,KAAAA,CAAK,KAAK,GAAG,CAAA;AACtB,UAAA,MAAM,SAAA,GAAYE,MAAK,oBAAoB,CAAA;AAC3C,UAAA,MAAM,SAAA,GAAY,WAAWF,KAAAA,CAAK,GAAA,EAAK,CAAG,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAA;AACtD,UAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,MAAA,EAAO,GAAI,MAAM,MAAA,GAAS,OAAA;AACtD,UAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,YACX,KAAA,EAAO;AAAA,cACL,IAAA,EAAM,OAAA;AAAA,cACN,SAAS,CAAA,QAAA,EAAW,SAAA,CAAU,MAAM,CAAA,CAAA,EAAI,cAAc,IAAI,SAAA,CAAU,OAAA,CAAQ,CAAC,CAAC,iDAAiDA,KAAAA,CAAK,CAAA,EAAG,EAAE,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAAA,cACrJ,IAAA,EAAM,EAAE,IAAA,EAAM,SAAA,CAAU,IAAI,SAAA,EAAW,cAAA,EAAgB,MAAM,SAAA,EAAU;AAAA,cACvE,UAAA,EAAY;AAAA,aACd;AAAA,YACA;AAAA,WACD,CAAA;AACD,UAAA,IAAA,CAAK,uBAAA,CAAwB,OAAA,EAAS,EAAE,IAAA,EAAM,WAAW,CAAA;AAAA,QAC3D;AAGA,QAAA,IAAI,IAAA,CAAK,MAAA,EAAO,GAAI,IAAA,EAAM;AACxB,UAAA,KAAA,IAASA,KAAAA,CAAK,KAAK,GAAG,CAAA;AACtB,UAAA,MAAM,WAAA,GAAcC,QAAAA,CAAQ,GAAA,EAAO,GAAM,CAAA;AACzC,UAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,YACX,KAAA,EAAO;AAAA,cACL,IAAA,EAAM,OAAA;AAAA,cACN,SAAS,CAAA,0CAAA,EAAA,CAA8C,WAAA,GAAc,KAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,mBAAA,EAAsBA,QAAAA,CAAQ,GAAG,CAAC,CAAC,iBAAiBD,KAAAA,CAAK,EAAA,EAAI,EAAE,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAAA,cAChK,IAAA,EAAM,EAAE,MAAA,EAAQ,WAAA,EAAa,cAAcC,QAAAA,CAAQ,CAAA,EAAG,CAAC,CAAA,EAAE;AAAA,cACzD,UAAA,EAAY;AAAA,aACd;AAAA,YACA;AAAA,WACD,CAAA;AACD,UAAA,IAAA,CAAK,uBAAA,CAAwB,OAAA,EAAS,EAAE,MAAA,EAAQ,aAAa,CAAA;AAAA,QAC/D;AAGA,QAAA,IAAI,KAAK,aAAA,CAAc,MAAA,GAAS,KAAK,IAAA,CAAK,MAAA,KAAW,IAAA,EAAM;AACzD,UAAA,KAAA,IAASD,KAAAA,CAAK,KAAK,GAAG,CAAA;AACtB,UAAA,MAAM,UAAA,GAAa,KAAK,aAAA,CAAc,KAAA,CAAM,GAAG,CAAC,CAAA,CAAE,IAAI,CAAA,GAAA,KAAO;AAC3D,YAAA,MAAM,MAAA,GAAS,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,IAAI,MAAM,CAAA;AAC7C,YAAA,IAAI,MAAA,EAAQ;AACV,cAAA,GAAA,CAAI,eAAe,MAAA,CAAO,YAAA;AAC1B,cAAA,GAAA,CAAI,IAAA,GAAA,CAAS,GAAA,CAAI,YAAA,GAAe,GAAA,CAAI,UAAA,IAAc,MAAA,CAAO,IAAA,CAAK,OAAA,IAAY,GAAA,CAAI,IAAA,KAAS,KAAA,GAAQ,CAAA,GAAI,EAAA,CAAA;AACnG,cAAA,GAAA,CAAI,MAAM,GAAA,CAAI,IAAA,GAAO,OAAO,IAAA,CAAK,OAAA,GAAU,IAAI,IAAA,GAAO,GAAA;AAAA,YACxD;AACA,YAAA,OAAO,CAAA,EAAG,QAAQ,IAAA,CAAK,MAAA,IAAU,IAAI,MAAM,CAAA,CAAA,EAAI,IAAI,IAAI,CAAA,EAAA,EAAK,IAAI,IAAA,IAAQ,CAAA,GAAI,MAAM,EAAE,CAAA,EAAG,IAAI,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,KAAA,CAAA;AAAA,UAC5G,CAAC,CAAA;AACD,UAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,YACX,KAAA,EAAO;AAAA,cACL,IAAA,EAAM,UAAA;AAAA,cACN,OAAA,EAAS,cAAc,UAAA,CAAW,IAAA,CAAK,KAAK,CAAC,CAAA,SAAA,EAAY,IAAA,CAAK,aAAA,CAAc,MAAM,CAAA,CAAA;AAAA,cAClF,IAAA,EAAM,EAAE,SAAA,EAAW,IAAA,CAAK,cAAc,MAAA,EAAO;AAAA,cAC7C,UAAA,EAAY;AAAA,aACd;AAAA,YACA;AAAA,WACD,CAAA;AAGD,UAAA,IAAI,KAAK,aAAA,CAAc,MAAA,GAAS,KAAK,IAAA,CAAK,MAAA,KAAW,GAAA,EAAK;AACxD,YAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,KAAA,EAAM;AACxC,YAAA,IAAA,CAAK,QAAA,IAAY,MAAA,CAAO,GAAA,GAAMA,KAAAA,CAAK,MAAM,IAAI,CAAA;AAAA,UAC/C;AAAA,QACF;AAGA,QAAA,IAAI,IAAA,CAAK,MAAA,EAAO,GAAI,GAAA,EAAK;AACvB,UAAA,KAAA,IAASA,KAAAA,CAAK,KAAK,GAAG,CAAA;AACtB,UAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,YACX,KAAA,EAAO;AAAA,cACL,IAAA,EAAM,KAAA;AAAA,cACN,OAAA,EAAS,CAAA,gBAAA,EAAmB,IAAA,CAAK,QAAA,IAAY,IAAI,GAAA,GAAM,EAAE,CAAA,EAAG,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAC,cAAc,IAAA,CAAK,WAAW,CAAA,SAAA,EAAY,IAAA,CAAK,SAAA,IAAa,CAAA,GAAI,GAAA,GAAM,EAAE,GAAG,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,CAAC,CAAC,CAAA,SAAA,EAAY,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA;AAAA,cAC7N,IAAA,EAAM,EAAE,QAAA,EAAU,IAAA,CAAK,QAAA,EAAU,aAAa,IAAA,CAAK,WAAA,EAAa,SAAA,EAAW,IAAA,CAAK,SAAA,EAAU;AAAA,cAC1F,UAAA,EAAY;AAAA,aACd;AAAA,YACA;AAAA,WACD,CAAA;AAAA,QACH;AAGA,QAAA,IAAI,IAAA,CAAK,MAAA,EAAO,GAAI,GAAA,EAAK;AACvB,UAAA,KAAA,IAASA,KAAAA,CAAK,KAAK,GAAG,CAAA;AACtB,UAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,YACX,KAAA,EAAO;AAAA,cACL,IAAA,EAAM,QAAA;AAAA,cACN,OAAA,EAAS,CAAA,SAAA,EAAYE,KAAAA,CAAK,OAAO,CAAC,CAAA,CAAA;AAAA,cAClC,UAAA,EAAY;AAAA,aACd;AAAA,YACA;AAAA,WACD,CAAA;AAAA,QACH;AAGA,QAAA,KAAA,MAAW,EAAE,KAAA,EAAO,KAAA,EAAO,CAAA,MAAO,OAAA,EAAS;AACzC,UAAA,UAAA,CAAW,MAAM;AACf,YAAA,IAAI,KAAK,OAAA,EAAS;AAChB,cAAA,IAAA,CAAK,IAAA,CAAK;AAAA,gBACR,GAAG,KAAA;AAAA,gBACH,IAAIH,MAAAA,EAAM;AAAA,gBACV,SAAA,EAAW,KAAK,GAAA;AAAI,eACrB,CAAA;AAAA,YACH;AAAA,UACF,GAAG,CAAC,CAAA;AAAA,QACN;AAAA,MACF;AAAA,KACF;AAIO,IAAM,qBAAA,GAAwB,IAAI,qBAAA,EAAsB;AAAA,EAAA;AAAA,CAAA,CAAA;;;AChe/D,IAAA,2BAAA,GAAA,EAAA;AAAA,QAAA,CAAA,2BAAA,EAAA;AAAA,EAAA,sBAAA,EAAA,MAAA,sBAAA;AAAA,EAAA,mBAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AA0MA,SAASA,MAAAA,GAAgB;AACvB,EAAA,OAAO,OAAO,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,EAAEK,UAAS,CAAA,CAAA;AACzC;AAEA,SAASJ,KAAAA,CAAK,KAAa,GAAA,EAAqB;AAC9C,EAAA,OAAO,GAAA,GAAM,IAAA,CAAK,MAAA,EAAO,IAAK,GAAA,GAAM,GAAA,CAAA;AACtC;AAEA,SAASC,QAAAA,CAAQ,KAAa,GAAA,EAAqB;AACjD,EAAA,OAAO,KAAK,KAAA,CAAMD,KAAAA,CAAK,GAAA,EAAK,GAAA,GAAM,CAAC,CAAC,CAAA;AACtC;AAEA,SAASE,MAAQ,GAAA,EAAa;AAC5B,EAAA,OAAO,GAAA,CAAI,KAAK,KAAA,CAAM,IAAA,CAAK,QAAO,GAAI,GAAA,CAAI,MAAM,CAAC,CAAA;AACnD;AAEA,SAAS,KAAA,CAAM,GAAA,EAAa,GAAA,EAAa,GAAA,EAAqB;AAC5D,EAAA,OAAO,KAAK,GAAA,CAAI,GAAA,EAAK,KAAK,GAAA,CAAI,GAAA,EAAK,GAAG,CAAC,CAAA;AACzC;AAEA,SAAS,YAAY,KAAA,EAAuB;AAC1C,EAAA,IAAI,KAAA,IAAS,GAAA,EAAM,OAAO,KAAA,CAAM,QAAQ,CAAC,CAAA;AACzC,EAAA,IAAI,KAAA,IAAS,CAAA,EAAG,OAAO,KAAA,CAAM,QAAQ,CAAC,CAAA;AACtC,EAAA,OAAO,KAAA,CAAM,QAAQ,CAAC,CAAA;AACxB;AAlOA,IAwFa,sBAAA,EAwDP,WAAA,EA2BA,UAAA,EAaA,cAAA,EAiBFE,YA6BE,mBAAA,EAiuBO,mBAAA;AAv8Bb,IAAA,wBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,2CAAA,GAAA;AAwFO,IAAM,sBAAA,GAAgD;AAAA,MAC3D;AAAA,QACE,EAAA,EAAI,aAAA;AAAA,QACJ,IAAA,EAAM,gBAAA;AAAA,QACN,SAAA,EAAW,KAAA;AAAA,QACX,KAAA,EAAO,SAAA;AAAA,QACP,eAAA,EAAiB,IAAA;AAAA;AAAA,QACjB,eAAA,EAAiB,GAAA;AAAA,QACjB,cAAA,EAAgB,GAAA;AAAA,QAChB,eAAA,EAAiB,EAAA;AAAA,QACjB,eAAA,EAAiB,EAAA;AAAA,QACjB,WAAA,EAAa,CAAA;AAAA,QACb,WAAA,EAAa,EAAA;AAAA,QACb,iBAAA,EAAmB,CAAC,KAAA,EAAO,MAAM,CAAA;AAAA,QACjC,aAAA,EAAe,QAAA;AAAA,QACf,cAAA,EAAgB,CAAC,UAAA,EAAY,UAAA,EAAY,UAAU,CAAA;AAAA,QACnD,OAAA,EAAS;AAAA,OACX;AAAA,MACA;AAAA,QACE,EAAA,EAAI,iBAAA;AAAA,QACJ,IAAA,EAAM,qBAAA;AAAA,QACN,SAAA,EAAW,KAAA;AAAA,QACX,KAAA,EAAO,SAAA;AAAA,QACP,eAAA,EAAiB,IAAA;AAAA;AAAA,QACjB,eAAA,EAAiB,IAAA;AAAA,QACjB,cAAA,EAAgB,IAAA;AAAA,QAChB,eAAA,EAAiB,EAAA;AAAA,QACjB,eAAA,EAAiB,EAAA;AAAA,QACjB,WAAA,EAAa,CAAA;AAAA,QACb,WAAA,EAAa,CAAA;AAAA,QACb,iBAAA,EAAmB,CAAC,WAAA,EAAa,QAAQ,CAAA;AAAA,QACzC,aAAA,EAAe,KAAA;AAAA,QACf,cAAA,EAAgB,CAAC,UAAA,EAAY,UAAU,CAAA;AAAA,QACvC,OAAA,EAAS;AAAA,OACX;AAAA,MACA;AAAA,QACE,EAAA,EAAI,eAAA;AAAA,QACJ,IAAA,EAAM,qBAAA;AAAA,QACN,SAAA,EAAW,KAAA;AAAA,QACX,KAAA,EAAO,SAAA;AAAA,QACP,eAAA,EAAiB,IAAA;AAAA;AAAA,QACjB,eAAA,EAAiB,GAAA;AAAA,QACjB,cAAA,EAAgB,GAAA;AAAA,QAChB,eAAA,EAAiB,EAAA;AAAA,QACjB,eAAA,EAAiB,EAAA;AAAA,QACjB,WAAA,EAAa,CAAA;AAAA,QACb,WAAA,EAAa,EAAA;AAAA,QACb,iBAAA,EAAmB,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAO,QAAQ,CAAA;AAAA,QAClD,aAAA,EAAe,MAAA;AAAA,QACf,gBAAgB,CAAC,UAAA,EAAY,UAAA,EAAY,UAAA,EAAY,aAAa,WAAW,CAAA;AAAA,QAC7E,OAAA,EAAS;AAAA;AACX,KACF;AAIA,IAAM,WAAA,GAAsC;AAAA,MAC1C,UAAA,EAAY,KAAA;AAAA,MACZ,UAAA,EAAY,IAAA;AAAA,MACZ,UAAA,EAAY,GAAA;AAAA,MACZ,UAAA,EAAY,GAAA;AAAA,MACZ,UAAA,EAAY,IAAA;AAAA,MACZ,WAAA,EAAa,KAAA;AAAA,MACb,UAAA,EAAY,IAAA;AAAA,MACZ,WAAA,EAAa,IAAA;AAAA,MACb,UAAA,EAAY,IAAA;AAAA,MACZ,YAAA,EAAc,IAAA;AAAA,MACd,WAAA,EAAa,IAAA;AAAA,MACb,UAAA,EAAY,GAAA;AAAA,MACZ,WAAA,EAAa,EAAA;AAAA,MACb,SAAA,EAAW,IAAA;AAAA,MACX,UAAA,EAAY,GAAA;AAAA,MACZ,UAAA,EAAY,IAAA;AAAA,MACZ,UAAA,EAAY,IAAA;AAAA,MACZ,UAAA,EAAY,IAAA;AAAA,MACZ,UAAA,EAAY,GAAA;AAAA,MACZ,WAAA,EAAa,GAAA;AAAA,MACb,UAAA,EAAY,GAAA;AAAA,MACZ,UAAA,EAAY,EAAA;AAAA,MACZ,WAAA,EAAa,GAAA;AAAA,MACb,UAAA,EAAY;AAAA,KACd;AAEA,IAAM,UAAA,GAAgF;AAAA,MACpF,UAAU,EAAE,IAAA,EAAM,YAAY,SAAA,EAAW,KAAA,EAAO,MAAM,QAAA,EAAI;AAAA,MAC1D,UAAU,EAAE,IAAA,EAAM,YAAY,SAAA,EAAW,KAAA,EAAO,MAAM,QAAA,EAAI;AAAA,MAC1D,KAAK,EAAE,IAAA,EAAM,OAAO,SAAA,EAAW,KAAA,EAAO,MAAM,QAAA,EAAI;AAAA,MAChD,MAAM,EAAE,IAAA,EAAM,QAAQ,SAAA,EAAW,MAAA,EAAQ,MAAM,QAAA,EAAI;AAAA,MACnD,SAAS,EAAE,IAAA,EAAM,WAAW,SAAA,EAAW,MAAA,EAAQ,MAAM,QAAA,EAAI;AAAA,MACzD,UAAU,EAAE,IAAA,EAAM,YAAY,SAAA,EAAW,IAAA,EAAM,MAAM,QAAA,EAAI;AAAA,MACzD,WAAW,EAAE,IAAA,EAAM,aAAa,SAAA,EAAW,MAAA,EAAQ,MAAM,QAAA,EAAI;AAAA,MAC7D,OAAO,EAAE,IAAA,EAAM,SAAS,SAAA,EAAW,OAAA,EAAS,MAAM,QAAA,EAAI;AAAA,MACtD,QAAQ,EAAE,IAAA,EAAM,UAAU,SAAA,EAAW,IAAA,EAAM,MAAM,QAAA,EAAI;AAAA,MACrD,QAAQ,EAAE,IAAA,EAAM,UAAU,SAAA,EAAW,MAAA,EAAQ,MAAM,QAAA;AAAI,KACzD;AAEA,IAAM,cAAA,GAAiB;AAAA,MACrB,mEAAA;AAAA,MACA,8DAAA;AAAA,MACA,wDAAA;AAAA,MACA,0DAAA;AAAA,MACA,yDAAA;AAAA,MACA,gEAAA;AAAA,MACA,4DAAA;AAAA,MACA,kDAAA;AAAA,MACA,0DAAA;AAAA,MACA,qDAAA;AAAA,MACA,kDAAA;AAAA,MACA;AAAA,KACF;AAIA,IAAIA,UAAAA,GAAY,CAAA;AA6BhB,IAAM,sBAAN,MAA0B;AAAA,MAUxB,WAAA,GAAc;AATd,QAAA,IAAA,CAAQ,YAA2B,EAAC;AACpC,QAAA,IAAA,CAAQ,SAAA,uBAA4D,GAAA,EAAI;AACxE,QAAA,IAAA,CAAQ,SAAA,uBAAuC,GAAA,EAAI;AACnD,QAAA,IAAA,CAAQ,UAAA,uBAAsC,GAAA,EAAI;AAClD,QAAA,IAAA,CAAQ,cAAA,uBAAqD,GAAA,EAAI;AACjE,QAAA,IAAA,CAAQ,OAAA,GAAU,KAAA;AAClB,QAAA,IAAA,CAAQ,YAAsB,EAAC;AAC/B,QAAA,IAAA,CAAQ,aAAuB,EAAC;AAI9B,QAAA,KAAA,MAAW,CAAC,IAAA,EAAM,IAAI,KAAK,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA,EAAG;AACtD,UAAA,IAAA,CAAK,UAAA,CAAW,IAAI,IAAA,EAAM,IAAA,IAAQ,IAAIJ,KAAAA,CAAK,KAAA,EAAO,IAAI,CAAA,CAAE,CAAA;AAAA,QAC1D;AAAA,MACF;AAAA;AAAA,MAIA,aAAA,GAAuC;AACrC,QAAA,OAAO,sBAAA;AAAA,MACT;AAAA,MAEA,KAAA,CAAM,WAAA,EAAwB,SAAA,EAAsB,UAAA,EAA6B;AAC/E,QAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AAEf,QAAA,IAAA,CAAK,aAAa,SAAA,IAAa,IAC5B,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,QAAA,CAAS,GAAG,CAAA,GAAI,CAAA,GAAI,GAAG,CAAC,CAAA,KAAA,CAAO,EAC1C,MAAA,CAAO,CAAA,CAAA,KAAK,KAAK,WAAW,CAAA;AAC/B,QAAA,IAAA,CAAK,cAAc,UAAA,IAAc,IAAI,MAAA,CAAO,CAAA,CAAA,KAAK,KAAK,UAAU,CAAA;AAChE,QAAA,MAAM,UAAA,GAAa,WAAA,GACf,sBAAA,CAAuB,MAAA,CAAO,CAAA,CAAA,KAAK,YAAY,QAAA,CAAS,CAAA,CAAE,EAAE,CAAC,CAAA,GAC7D,sBAAA;AAEJ,QAAA,KAAA,MAAW,YAAY,UAAA,EAAY;AACjC,UAAA,IAAA,CAAK,aAAa,QAAQ,CAAA;AAC1B,UAAA,IAAA,CAAK,cAAc,QAAQ,CAAA;AAAA,QAC7B;AAAA,MACF;AAAA,MAEA,KAAK,WAAA,EAA8B;AACjC,QAAA,MAAM,MAAM,WAAA,IAAe,KAAA,CAAM,KAAK,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AAC3D,QAAA,KAAA,MAAW,MAAM,GAAA,EAAK;AACpB,UAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,EAAE,CAAA;AACnC,UAAA,IAAI,KAAA,EAAO;AACT,YAAA,YAAA,CAAa,KAAK,CAAA;AAClB,YAAA,IAAA,CAAK,SAAA,CAAU,OAAO,EAAE,CAAA;AAAA,UAC1B;AAAA,QACF;AACA,QAAA,IAAI,CAAC,WAAA,EAAa;AAChB,UAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AAAA,QACjB;AAAA,MACF;AAAA,MAEA,MAAM,QAAA,EAAmC;AACvC,QAAA,IAAA,CAAK,SAAA,CAAU,KAAK,QAAQ,CAAA;AAC5B,QAAA,OAAO,MAAM;AACX,UAAA,IAAA,CAAK,YAAY,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,CAAA,CAAA,KAAK,MAAM,QAAQ,CAAA;AAAA,QAC5D,CAAA;AAAA,MACF;AAAA,MAEA,YAAY,UAAA,EAA0C;AACpD,QAAA,OAAO,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,UAAU,CAAA;AAAA,MACtC;AAAA,MAEA,eAAA,GAAyC;AACvC,QAAA,OAAO,IAAA,CAAK,SAAA;AAAA,MACd;AAAA,MAEA,SAAA,GAAqB;AACnB,QAAA,OAAO,IAAA,CAAK,OAAA;AAAA,MACd;AAAA,MAEA,gBAAA,GAAyB;AACvB,QAAA,MAAM,YAAA,GAAsD;AAAA,UAC1D,EAAE,GAAA,EAAK,2CAAA,EAA6C,KAAA,EAAO,CAAA,EAAE;AAAA,UAC7D,EAAE,GAAA,EAAK,8BAAA,EAAgC,KAAA,EAAO,GAAA,EAAI;AAAA,UAClD,EAAE,GAAA,EAAK,6CAAA,EAA+C,KAAA,EAAO,IAAA,EAAK;AAAA,UAClE,EAAE,GAAA,EAAK,8DAAA,EAAgE,KAAA,EAAO,GAAA,EAAK;AAAA,UACnF,EAAE,GAAA,EAAK,6EAAA,EAA+E,KAAA,EAAO,IAAA,EAAK;AAAA,UAClG,EAAE,GAAA,EAAK,wDAAA,EAA0D,KAAA,EAAO,IAAA,EAAK;AAAA,UAC7E,EAAE,GAAA,EAAK,mCAAA,EAAqC,KAAA,EAAO,IAAA,EAAK;AAAA,UACxD,EAAE,GAAA,EAAK,qDAAA,EAAuD,KAAA,EAAO,GAAA;AAAK,SAC5E;AAEA,QAAA,KAAA,MAAW,EAAE,GAAA,EAAK,KAAA,EAAM,IAAK,YAAA,EAAc;AACzC,UAAA,UAAA,CAAW,MAAM;AACf,YAAA,IAAA,CAAK,IAAA,CAAK;AAAA,cACR,IAAID,MAAAA,EAAM;AAAA,cACV,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,cACpB,UAAA,EAAY,QAAA;AAAA,cACZ,YAAA,EAAc,QAAA;AAAA,cACd,IAAA,EAAM,QAAA;AAAA,cACN,OAAA,EAAS,GAAA;AAAA,cACT,UAAA,EAAY;AAAA,aACb,CAAA;AAAA,UACH,GAAG,KAAK,CAAA;AAAA,QACV;AAAA,MACF;AAAA,MAEA,OAAA,GAAgB;AACd,QAAA,IAAA,CAAK,IAAA,EAAK;AACV,QAAA,IAAA,CAAK,YAAY,EAAC;AAClB,QAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AACrB,QAAA,IAAA,CAAK,WAAW,KAAA,EAAM;AACtB,QAAA,IAAA,CAAK,eAAe,KAAA,EAAM;AAC1B,QAAA,IAAA,CAAK,YAAY,EAAC;AAClB,QAAA,IAAA,CAAK,aAAa,EAAC;AAAA,MACrB;AAAA;AAAA,MAIQ,KAAK,KAAA,EAA0B;AACrC,QAAA,KAAA,MAAW,QAAA,IAAY,KAAK,SAAA,EAAW;AACrC,UAAA,QAAA,CAAS,KAAK,CAAA;AAAA,QAChB;AAAA,MACF;AAAA,MAEQ,eAAe,QAAA,EAAyC;AAC9D,QAAA,OAAO,KAAK,SAAA,CAAU,MAAA,GAAS,CAAA,GAAI,IAAA,CAAK,YAAY,QAAA,CAAS,cAAA;AAAA,MAC/D;AAAA,MAEQ,cAAA,GAAyB;AAC/B,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,UAAA,CAAW,MAAA,GAAS,CAAA,GACpC,KAAK,UAAA,GACL,CAAC,UAAA,EAAY,UAAA,EAAY,KAAK,CAAA;AAClC,QAAA,OAAOG,MAAK,MAAM,CAAA;AAAA,MACpB;AAAA,MAEQ,cAAc,OAAA,EAAyB;AAC7C,QAAA,MAAM,IAAA,GAAO,WAAW,OAAO,CAAA;AAC/B,QAAA,OAAO,IAAA,GAAO,KAAK,SAAA,GAAY,OAAA;AAAA,MACjC;AAAA,MAEQ,aAAa,QAAA,EAAqC;AACxD,QAAA,MAAM,WAAA,GAAc,IAAA,CAAK,cAAA,CAAe,QAAQ,CAAA;AAChD,QAAA,MAAM,IAAA,GAAOA,MAAK,WAAW,CAAA;AAC7B,QAAA,MAAM,KAAA,GAAQ,KAAK,UAAA,CAAW,GAAA,CAAI,IAAI,CAAA,IAAK,WAAA,CAAY,IAAI,CAAA,IAAK,GAAA;AAChE,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,kBAAA,CAAmB,QAAA,EAAU,KAAK,CAAA;AAC1D,QAAA,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,QAAA,CAAS,EAAA,EAAI,UAAU,CAAA;AAE/C,QAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,QAAA,CAAS,EAAA,EAAI;AAAA,UAC9B,YAAY,QAAA,CAAS,EAAA;AAAA,UACrB,cAAc,QAAA,CAAS,IAAA;AAAA,UACvB,SAAA,EAAW,IAAA;AAAA,UACX,WAAA,EAAa,IAAA;AAAA,UACb,YAAA,EAAc,KAAA;AAAA,UACd,UAAA;AAAA,UACA,eAAe,EAAC;AAAA,UAChB,QAAA,EAAUF,KAAAA,CAAK,GAAA,EAAK,GAAG,CAAA;AAAA,UACvB,WAAA,EAAaC,QAAAA,CAAQ,CAAA,EAAG,EAAE,CAAA;AAAA,UAC1B,OAAA,EAASD,KAAAA,CAAK,IAAA,EAAM,IAAI,CAAA;AAAA,UACxB,UAAA,EAAY,MAAA;AAAA,UACZ,oBAAA,EAAsB;AAAA,SACvB,CAAA;AAAA,MACH;AAAA,MAEQ,cAAc,QAAA,EAAqC;AACzD,QAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACnB,QAAA,MAAM,QAAA,GAAWA,KAAAA,CAAK,QAAA,CAAS,eAAA,EAAiB,SAAS,eAAe,CAAA;AACxE,QAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,UAAA,IAAI,KAAK,OAAA,EAAS;AAChB,YAAA,IAAA,CAAK,YAAY,QAAQ,CAAA;AACzB,YAAA,IAAA,CAAK,cAAc,QAAQ,CAAA;AAAA,UAC7B;AAAA,QACF,GAAG,QAAQ,CAAA;AACX,QAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,QAAA,CAAS,EAAA,EAAI,KAAK,CAAA;AAAA,MACvC;AAAA,MAEA,MAAc,YAAY,QAAA,EAA8C;AACtE,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,SAAS,EAAE,CAAA;AAC5C,QAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,QAAA,MAAM,WAAA,GAAc,IAAA,CAAK,cAAA,CAAe,QAAQ,CAAA;AAChD,QAAA,MAAM,IAAA,GAAOE,MAAK,WAAW,CAAA;AAC7B,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,aAAA,CAAc,IAAI,CAAA;AACrC,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,kBAAA,CAAmB,QAAA,EAAU,KAAK,CAAA;AAC1D,QAAA,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,QAAA,CAAS,EAAA,EAAI,UAAU,CAAA;AAE/C,QAAA,KAAA,CAAM,WAAA,GAAc,IAAA;AACpB,QAAA,KAAA,CAAM,YAAA,GAAe,KAAA;AACrB,QAAA,KAAA,CAAM,UAAA,GAAa,UAAA;AAEnB,QAAA,MAAM,UAAkF,EAAC;AACzF,QAAA,IAAI,KAAA,GAAQ,CAAA;AAGZ,QAAA,MAAM,KAAA,GAAQ,KAAK,cAAA,EAAe;AAClC,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,aAAA,CAAc,KAAK,CAAA;AAC3C,QAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,UACX,KAAA,EAAO;AAAA,YACL,YAAY,QAAA,CAAS,EAAA;AAAA,YACrB,cAAc,QAAA,CAAS,SAAA;AAAA,YACvB,IAAA,EAAM,MAAA;AAAA,YACN,OAAA,EAAS,YAAY,IAAI,CAAA,IAAA,EAAO,UAAU,CAAA,WAAA,EAAc,WAAA,CAAY,KAAK,CAAC,CAAA,CAAA;AAAA,YAC1E,IAAA,EAAM,EAAE,IAAA,EAAM,KAAA,EAAO,UAAA,EAAW;AAAA,YAChC,UAAA,EAAY;AAAA,WACd;AAAA,UACA;AAAA,SACD,CAAA;AACD,QAAA,KAAA,IAASF,KAAAA,CAAK,KAAK,IAAI,CAAA;AAGvB,QAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,uBAAA,CAAwB,QAAA,EAAU,MAAM,KAAK,CAAA;AAC3E,QAAA,KAAA,MAAW,YAAY,gBAAA,EAAkB;AACvC,UAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,YACX,KAAA,EAAO;AAAA,cACL,YAAY,QAAA,CAAS,EAAA;AAAA,cACrB,cAAc,QAAA,CAAS,SAAA;AAAA,cACvB,IAAA,EAAM,UAAA;AAAA,cACN,OAAA,EAAS,QAAA;AAAA,cACT,UAAA,EAAY;AAAA,aACd;AAAA,YACA;AAAA,WACD,CAAA;AACD,UAAA,KAAA,IAASA,KAAAA,CAAK,KAAK,IAAI,CAAA;AAAA,QACzB;AAGA,QAAA,MAAM,iBAAiB,EAAC;AACxB,QAAA,IAAI,QAAA,CAAS,kBAAkB,QAAA,CAAS,KAAK,KAAK,QAAA,CAAS,iBAAA,CAAkB,QAAA,CAAS,MAAM,CAAA,EAAG;AAC7F,UAAA,cAAA,CAAe,KAAK,CAAA,KAAA,EAAQ,UAAA,CAAW,IAAI,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAE,CAAA;AAAA,QACzD;AACA,QAAA,IAAI,QAAA,CAAS,kBAAkB,QAAA,CAAS,MAAM,KAAK,QAAA,CAAS,iBAAA,CAAkB,QAAA,CAAS,KAAK,CAAA,EAAG;AAC7F,UAAA,cAAA,CAAe,IAAA,CAAK,CAAA,MAAA,EAAS,UAAA,CAAW,IAAA,CAAK,YAAY,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,EAAG,WAAW,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAE,CAAA;AAAA,QAChH;AACA,QAAA,IAAI,QAAA,CAAS,iBAAA,CAAkB,QAAA,CAAS,KAAK,CAAA,EAAG;AAC9C,UAAA,cAAA,CAAe,IAAA,CAAK,CAAA,KAAA,EAAQ,UAAA,CAAW,GAAA,CAAI,MAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,EAAI,WAAW,GAAA,CAAI,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAE,CAAA;AAC/F,UAAA,IAAI,UAAA,CAAW,GAAA,CAAI,SAAA,KAAc,MAAA,EAAQ;AACvC,YAAA,cAAA,CAAe,KAAK,CAAA,CAAA,EAAI,UAAA,CAAW,IAAI,SAAA,CAAU,WAAA,EAAa,CAAA,OAAA,CAAS,CAAA;AAAA,UACzE;AAAA,QACF;AACA,QAAA,IAAI,QAAA,CAAS,iBAAA,CAAkB,QAAA,CAAS,WAAW,CAAA,EAAG;AACpD,UAAA,cAAA,CAAe,IAAA,CAAK,CAAA,IAAA,EAAO,UAAA,CAAW,SAAA,CAAU,SAAS,OAAA,CAAQ,CAAC,CAAC,CAAA,QAAA,EAAW,WAAW,SAAA,CAAU,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAE,CAAA;AAAA,QACvH;AACA,QAAA,IAAI,QAAA,CAAS,iBAAA,CAAkB,QAAA,CAAS,QAAQ,CAAA,EAAG;AACjD,UAAA,cAAA,CAAe,IAAA,CAAK,QAAQ,UAAA,CAAW,MAAA,CAAO,MAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,KAAA,CAAO,CAAA;AAAA,QACvE;AAEA,QAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,UACX,KAAA,EAAO;AAAA,YACL,YAAY,QAAA,CAAS,EAAA;AAAA,YACrB,cAAc,QAAA,CAAS,SAAA;AAAA,YACvB,IAAA,EAAM,WAAA;AAAA,YACN,OAAA,EAAS,cAAA,CAAe,IAAA,CAAK,KAAK,CAAA;AAAA,YAClC,IAAA,EAAM,EAAE,UAAA,EAAW;AAAA,YACnB,UAAA,EAAY;AAAA,WACd;AAAA,UACA;AAAA,SACD,CAAA;AACD,QAAA,KAAA,IAASA,KAAAA,CAAK,KAAK,IAAI,CAAA;AAGvB,QAAA,IAAI,IAAA,CAAK,MAAA,EAAO,GAAI,IAAA,EAAM;AACxB,UAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,EAAO,GAAI,MAAM,SAAA,GAAY,SAAA;AACpD,UAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,YACX,KAAA,EAAO;AAAA,cACL,YAAY,QAAA,CAAS,EAAA;AAAA,cACrB,cAAc,QAAA,CAAS,SAAA;AAAA,cACvB,IAAA,EAAM,MAAA;AAAA,cACN,SAAS,CAAA,CAAA,EAAI,SAAS,CAAA,EAAA,EAAKE,KAAAA,CAAK,cAAc,CAAC,CAAA,CAAA;AAAA,cAC/C,UAAA,EAAY;AAAA,aACd;AAAA,YACA;AAAA,WACD,CAAA;AACD,UAAA,KAAA,IAASF,KAAAA,CAAK,KAAM,IAAI,CAAA;AAAA,QAC1B;AAGA,QAAA,IAAI,IAAA,CAAK,MAAA,EAAO,GAAI,GAAA,EAAK;AACvB,UAAA,MAAM,QAAA,GAAW,IAAA,CAAK,gBAAA,CAAiB,QAAA,EAAU,YAAY,IAAI,CAAA;AACjE,UAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,YACX,KAAA,EAAO;AAAA,cACL,YAAY,QAAA,CAAS,EAAA;AAAA,cACrB,cAAc,QAAA,CAAS,SAAA;AAAA,cACvB,IAAA,EAAM,UAAA;AAAA,cACN,OAAA,EAAS,QAAA;AAAA,cACT,UAAA,EAAY;AAAA,aACd;AAAA,YACA;AAAA,WACD,CAAA;AACD,UAAA,KAAA,IAASA,KAAAA,CAAK,KAAM,GAAI,CAAA;AAAA,QAC1B;AAGA,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,cAAA,CAAe,QAAA,EAAU,UAAU,CAAA;AACvD,QAAA,KAAA,CAAM,aAAa,MAAA,CAAO,SAAA;AAC1B,QAAA,KAAA,CAAM,uBAAuB,MAAA,CAAO,UAAA;AAEpC,QAAA,IAAI,MAAA,CAAO,cAAc,MAAA,EAAQ;AAE/B,UAAA,MAAM,kBAAkB,IAAA,CAAK,uBAAA,CAAwB,QAAA,EAAU,MAAA,EAAQ,YAAY,IAAI,CAAA;AACvF,UAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,YACX,KAAA,EAAO;AAAA,cACL,YAAY,QAAA,CAAS,EAAA;AAAA,cACrB,cAAc,QAAA,CAAS,SAAA;AAAA,cACvB,IAAA,EAAM,UAAA;AAAA,cACN,OAAA,EAAS,eAAA;AAAA,cACT,IAAA,EAAM;AAAA,gBACJ,UAAU,QAAA,CAAS,IAAA;AAAA,gBACnB,eAAe,QAAA,CAAS,aAAA;AAAA,gBACxB,mBAAmB,QAAA,CAAS,iBAAA;AAAA,gBAC5B,QAAQ,MAAA,CAAO,SAAA;AAAA,gBACf,YAAY,MAAA,CAAO;AAAA,eACrB;AAAA,cACA,UAAA,EAAY;AAAA,aACd;AAAA,YACA;AAAA,WACD,CAAA;AACD,UAAA,KAAA,IAASA,KAAAA,CAAK,MAAM,IAAI,CAAA;AAGxB,UAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,YACX,KAAA,EAAO;AAAA,cACL,YAAY,QAAA,CAAS,EAAA;AAAA,cACrB,cAAc,QAAA,CAAS,SAAA;AAAA,cACvB,IAAA,EAAM,QAAA;AAAA,cACN,OAAA,EAAS,CAAA,EAAG,MAAA,CAAO,SAAS,CAAA,+BAAA,EAAA,CAAmC,MAAA,CAAO,UAAA,GAAa,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,IAAA,EAAO,OAAO,MAAM,CAAA,CAAA;AAAA,cACtH,IAAA,EAAM,EAAE,MAAA,EAAO;AAAA,cACf,UAAA,EAAY;AAAA,aACd;AAAA,YACA;AAAA,WACD,CAAA;AACD,UAAA,KAAA,IAASA,KAAAA,CAAK,MAAM,GAAI,CAAA;AAGxB,UAAA,MAAM,QAAA,GAAW,IAAA,CAAK,iBAAA,CAAkB,QAAA,EAAU,QAAQ,KAAK,CAAA;AAC/D,UAAA,IAAI,SAAS,OAAA,EAAS;AACpB,YAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,cACX,KAAA,EAAO;AAAA,gBACL,YAAY,QAAA,CAAS,EAAA;AAAA,gBACrB,cAAc,QAAA,CAAS,SAAA;AAAA,gBACvB,IAAA,EAAM,UAAA;AAAA,gBACN,SAAS,CAAA,QAAA,EAAW,MAAA,CAAO,SAAS,CAAA,SAAA,EAAY,QAAA,CAAS,aAAa,OAAA,CAAQ,CAAC,CAAC,CAAA,cAAA,EAAiB,SAAS,QAAQ,CAAA,mBAAA,EAAsB,SAAS,UAAA,CAAW,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA;AAAA,gBACtK,IAAA,EAAM;AAAA,kBACJ,cAAc,QAAA,CAAS,IAAA;AAAA,kBACvB,YAAY,QAAA,CAAS,EAAA;AAAA,kBACrB,eAAe,QAAA,CAAS,aAAA;AAAA,kBACxB,cAAc,MAAA,CAAO,MAAA;AAAA,kBACrB,YAAY,MAAA,CAAO;AAAA,iBACrB;AAAA,gBACA,UAAA,EAAY;AAAA,eACd;AAAA,cACA;AAAA,aACD,CAAA;AACD,YAAA,KAAA,IAASA,KAAAA,CAAK,KAAM,IAAI,CAAA;AAGxB,YAAA,MAAM,OAAA,GAAU,OAAO,IAAA,CAAK,GAAA,GAAM,QAAA,CAAS,EAAE,CAAA,CAAE,WAAA,EAAa,CAAA,CAAA;AAC5D,YAAA,MAAM,UAAA,GAAa,MAAA,CAAO,SAAA,KAAc,MAAA,GACpC,SAAS,CAAA,GAAIA,KAAAA,CAAK,IAAA,EAAQ,IAAM,CAAA,CAAA,GAChC,KAAA,IAAS,CAAA,GAAIA,KAAAA,CAAK,MAAQ,IAAM,CAAA,CAAA;AAEpC,YAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,cACX,KAAA,EAAO;AAAA,gBACL,YAAY,QAAA,CAAS,EAAA;AAAA,gBACrB,cAAc,QAAA,CAAS,SAAA;AAAA,gBACvB,IAAA,EAAM,OAAA;AAAA,gBACN,OAAA,EAAS,CAAA,WAAA,EAAc,MAAA,CAAO,SAAS,CAAA,SAAA,EAAY,IAAI,CAAA,IAAA,EAAO,WAAA,CAAY,UAAU,CAAC,CAAA,IAAA,EAAO,UAAU,UAAU,OAAO,CAAA,CAAA;AAAA,gBACvH,IAAA,EAAM;AAAA,kBACJ,OAAA;AAAA,kBACA,IAAA;AAAA,kBACA,MAAM,MAAA,CAAO,SAAA;AAAA,kBACb,KAAA,EAAO,UAAA;AAAA,kBACP,UAAU,QAAA,CAAS,QAAA;AAAA,kBACnB,KAAA;AAAA,kBACA,UAAA;AAAA,kBACA,cAAc,QAAA,CAAS,IAAA;AAAA,kBACvB,eAAA;AAAA,kBACA,cAAc,MAAA,CAAO;AAAA,iBACvB;AAAA,gBACA,UAAA,EAAY;AAAA,eACd;AAAA,cACA;AAAA,aACD,CAAA;AACD,YAAA,KAAA,IAASA,KAAAA,CAAK,KAAM,GAAI,CAAA;AAGxB,YAAA,MAAM,SAAA,GAAY,UAAA,IAAc,CAAA,GAAIA,KAAAA,CAAK,OAAS,IAAM,CAAA,CAAA;AACxD,YAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAI,SAAA,GAAY,UAAU,IAAI,UAAA,GAAa,GAAA;AACjE,YAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,cACX,KAAA,EAAO;AAAA,gBACL,YAAY,QAAA,CAAS,EAAA;AAAA,gBACrB,cAAc,QAAA,CAAS,SAAA;AAAA,gBACvB,IAAA,EAAM,QAAA;AAAA,gBACN,SAAS,CAAA,eAAA,EAAkB,IAAI,IAAI,MAAA,CAAO,SAAS,OAAO,WAAA,CAAY,SAAS,CAAC,CAAA,IAAA,EAAO,UAAU,CAAA,aAAA,EAAgB,QAAA,CAAS,QAAQ,CAAC,CAAC,WAAW,OAAO,CAAA,CAAA;AAAA,gBACtJ,IAAA,EAAM;AAAA,kBACJ,OAAA;AAAA,kBACA,SAAA;AAAA,kBACA,QAAA;AAAA,kBACA,KAAA;AAAA,kBACA,UAAA;AAAA,kBACA,cAAc,QAAA,CAAS,IAAA;AAAA,kBACvB,YAAY,QAAA,CAAS;AAAA,iBACvB;AAAA,gBACA,UAAA,EAAY;AAAA,eACd;AAAA,cACA;AAAA,aACD,CAAA;AAGD,YAAA,MAAM,QAAA,GAAyB;AAAA,cAC7B,EAAA,EAAI,OAAA;AAAA,cACJ,IAAA;AAAA,cACA,MAAM,MAAA,CAAO,SAAA;AAAA,cACb,UAAA,EAAY,SAAA;AAAA,cACZ,YAAA,EAAc,KAAA;AAAA,cACd,MAAM,QAAA,CAAS,YAAA;AAAA,cACf,UAAU,QAAA,CAAS,QAAA;AAAA,cACnB,GAAA,EAAK,CAAA;AAAA,cACL,UAAA,EAAY;AAAA,aACd;AACA,YAAA,KAAA,CAAM,aAAA,GAAgB,CAAC,GAAG,KAAA,CAAM,cAAc,KAAA,CAAM,EAAE,GAAG,QAAQ,CAAA;AACjE,YAAA,KAAA,CAAM,WAAA,EAAA;AAAA,UACR,CAAA,MAAO;AACL,YAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,cACX,KAAA,EAAO;AAAA,gBACL,YAAY,QAAA,CAAS,EAAA;AAAA,gBACrB,cAAc,QAAA,CAAS,SAAA;AAAA,gBACvB,IAAA,EAAM,UAAA;AAAA,gBACN,OAAA,EAAS,CAAA,OAAA,EAAU,QAAA,CAAS,MAAM,CAAA,CAAA;AAAA,gBAClC,UAAA,EAAY;AAAA,eACd;AAAA,cACA;AAAA,aACD,CAAA;AAAA,UACH;AAAA,QACF;AAGA,QAAA,IAAI,MAAM,aAAA,CAAc,MAAA,GAAS,KAAK,IAAA,CAAK,MAAA,KAAW,GAAA,EAAK;AACzD,UAAA,KAAA,IAASA,KAAAA,CAAK,MAAM,IAAI,CAAA;AACxB,UAAA,IAAI,gBAAA,GAAmB,CAAA;AACvB,UAAA,MAAM,WAAqB,EAAC;AAE5B,UAAA,KAAA,MAAW,GAAA,IAAO,MAAM,aAAA,EAAe;AACrC,YAAA,GAAA,CAAI,YAAA,GAAe,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,IAAI,CAAA;AAC9C,YAAA,MAAM,SAAA,GAAY,GAAA,CAAI,IAAA,KAAS,MAAA,GAAA,CAC1B,IAAI,YAAA,GAAe,GAAA,CAAI,UAAA,IAAc,GAAA,CAAI,UAAA,GAAA,CACzC,GAAA,CAAI,UAAA,GAAa,GAAA,CAAI,gBAAgB,GAAA,CAAI,UAAA;AAC9C,YAAA,GAAA,CAAI,UAAA,GAAa,SAAA,GAAY,GAAA,CAAI,QAAA,GAAW,GAAA;AAC5C,YAAA,GAAA,CAAI,GAAA,GAAM,SAAA,GAAY,GAAA,CAAI,QAAA,GAAW,GAAA,CAAI,IAAA;AACzC,YAAA,gBAAA,IAAoB,GAAA,CAAI,GAAA;AACxB,YAAA,QAAA,CAAS,KAAK,CAAA,EAAG,GAAA,CAAI,IAAI,CAAA,CAAA,EAAI,GAAA,CAAI,IAAI,CAAA,EAAA,EAAK,GAAA,CAAI,cAAc,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,EAAG,GAAA,CAAI,WAAW,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,UACzG;AAEA,UAAA,KAAA,CAAM,QAAA,IAAY,gBAAA,GAAmBA,KAAAA,CAAK,IAAA,EAAM,IAAI,CAAA;AAGpD,UAAA,IAAI,MAAM,aAAA,CAAc,MAAA,GAAS,KAAK,IAAA,CAAK,MAAA,KAAW,GAAA,EAAK;AACzD,YAAA,MAAM,MAAA,GAAS,KAAA,CAAM,aAAA,CAAc,KAAA,EAAM;AACzC,YAAA,MAAM,WAAW,MAAA,CAAO,UAAA;AACxB,YAAA,IAAI,WAAW,CAAA,EAAG;AAChB,cAAA,KAAA,CAAM,OAAA,GAAU,KAAA,CAAM,OAAA,GAAU,IAAA,GAAO,IAAA;AAAA,YACzC,CAAA,MAAO;AACL,cAAA,KAAA,CAAM,OAAA,GAAU,MAAM,OAAA,GAAU,IAAA;AAAA,YAClC;AACA,YAAA,KAAA,CAAM,OAAA,GAAU,KAAA,CAAM,KAAA,CAAM,OAAA,EAAS,MAAM,IAAI,CAAA;AAC/C,YAAA,QAAA,CAAS,IAAA,CAAK,CAAA,OAAA,EAAU,MAAA,CAAO,IAAI,KAAK,QAAA,IAAY,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,EAAG,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,UAC3F;AAEA,UAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,YACX,KAAA,EAAO;AAAA,cACL,YAAY,QAAA,CAAS,EAAA;AAAA,cACrB,cAAc,QAAA,CAAS,SAAA;AAAA,cACvB,IAAA,EAAM,KAAA;AAAA,cACN,OAAA,EAAS,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA;AAAA,cAC5B,IAAA,EAAM,EAAE,QAAA,EAAU,KAAA,CAAM,UAAU,SAAA,EAAW,KAAA,CAAM,cAAc,MAAA,EAAO;AAAA,cACxE,UAAA,EAAY;AAAA,aACd;AAAA,YACA;AAAA,WACD,CAAA;AAAA,QACH;AAGA,QAAA,IAAI,IAAA,CAAK,MAAA,EAAO,GAAI,GAAA,EAAK;AACvB,UAAA,KAAA,IAASA,KAAAA,CAAK,KAAM,GAAI,CAAA;AACxB,UAAA,MAAM,QAAA,GAAW,KAAA,CAAM,aAAA,CAAc,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,IAAA,GAAO,CAAA,CAAE,QAAA,EAAU,CAAC,CAAA;AACpF,UAAA,MAAM,WAAA,GAAcA,KAAAA,CAAK,CAAA,EAAG,EAAE,CAAA;AAC9B,UAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,YACX,KAAA,EAAO;AAAA,cACL,YAAY,QAAA,CAAS,EAAA;AAAA,cACrB,cAAc,QAAA,CAAS,SAAA;AAAA,cACvB,IAAA,EAAM,MAAA;AAAA,cACN,OAAA,EAAS,uBAAuB,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAC,CAAA,kBAAA,EAAqB,YAAY,OAAA,CAAQ,CAAC,CAAC,CAAA,oBAAA,EAAuB,KAAA,CAAM,cAAc,MAAM,CAAA,aAAA,EAAA,CAAiB,MAAM,OAAA,GAAU,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAAA,cAC/L,UAAA,EAAY,QAAA,GAAW,EAAA,GAAK,MAAA,GAAS;AAAA,aACvC;AAAA,YACA;AAAA,WACD,CAAA;AAAA,QACH;AAGA,QAAA,KAAA,MAAW,EAAE,KAAA,EAAO,KAAA,EAAO,CAAA,MAAO,OAAA,EAAS;AACzC,UAAA,UAAA,CAAW,MAAM;AACf,YAAA,IAAI,KAAK,OAAA,EAAS;AAChB,cAAA,IAAA,CAAK,IAAA,CAAK;AAAA,gBACR,GAAG,KAAA;AAAA,gBACH,IAAID,MAAAA,EAAM;AAAA,gBACV,SAAA,EAAW,KAAK,GAAA;AAAI,eACrB,CAAA;AAAA,YACH;AAAA,UACF,GAAG,CAAC,CAAA;AAAA,QACN;AAAA,MACF;AAAA,MAEQ,cAAc,IAAA,EAAsB;AAC1C,QAAA,MAAM,OAAA,GAAU,KAAK,UAAA,CAAW,GAAA,CAAI,IAAI,CAAA,IAAK,WAAA,CAAY,IAAI,CAAA,IAAK,GAAA;AAClE,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,GAAI,OAAQ,IAAA,CAAK,QAAA,CAAS,KAAK,CAAA,GAAI,IAAA,GAAQ,IAAA;AAClF,QAAA,MAAM,KAAA,GAAQC,KAAAA,CAAK,CAAC,UAAA,EAAY,UAAU,CAAA;AAC1C,QAAA,MAAM,QAAA,GAAW,WAAW,CAAA,GAAI,KAAA,CAAA;AAChC,QAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,IAAA,EAAM,QAAQ,CAAA;AAClC,QAAA,OAAO,QAAA;AAAA,MACT;AAAA,MAEQ,kBAAA,CAAmB,UAA+B,KAAA,EAAkC;AAC1F,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,SAAS,EAAE,CAAA;AAChD,QAAA,MAAM,OAAA,GAAU,IAAA,EAAM,GAAA,IAAO,QAAA,CAAS,OAAA;AAGtC,QAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AACzB,QAAA,MAAM,QAAA,GAAWA,KAAAA,CAAK,EAAA,EAAI,CAAC,CAAA;AAC3B,QAAA,MAAM,YAAA,GAAA,CAAgB,UAAU,OAAA,IAAW,IAAA;AAC3C,QAAA,MAAM,MAAM,KAAA,CAAM,OAAA,GAAU,QAAA,GAAW,YAAA,EAAc,GAAG,EAAE,CAAA;AAG1D,QAAA,MAAM,WAAW,GAAA,GAAM,EAAA,GAAK,GAAA,GAAM,GAAA,GAAM,KAAK,IAAA,GAAO,CAAA;AACpD,QAAA,MAAM,QAAA,GAAW,IAAA,EAAM,IAAA,CAAK,SAAA,IAAa,CAAA;AACzC,QAAA,MAAM,SAAA,GAAY,KAAA,CAAM,QAAA,GAAW,GAAA,GAAMA,KAAAA,CAAK,MAAM,GAAG,CAAA,GAAI,QAAA,EAAU,EAAA,EAAI,CAAC,CAAA;AAC1E,QAAA,MAAM,SAAA,GAAY,SAAA,GAAYA,KAAAA,CAAK,GAAA,EAAK,GAAG,CAAA;AAC3C,QAAA,MAAM,aAAa,SAAA,GAAY,SAAA;AAG/B,QAAA,MAAM,SAAA,GAAY,IAAA,EAAM,GAAA,CAAI,KAAA,IAAS,KAAA;AACrC,QAAA,MAAM,QAAA,GAAW,IAAA,EAAM,GAAA,CAAI,IAAA,IAAQ,KAAA;AACnC,QAAA,MAAM,QAAA,GAAW,SAAA,GAAY,GAAA,GAAM,KAAA,GAAQ,GAAA;AAC3C,QAAA,MAAM,OAAA,GAAU,QAAA,GAAW,IAAA,GAAO,KAAA,GAAQ,IAAA;AAC1C,QAAA,IAAI,SAAA,GAAyC,MAAA;AAC7C,QAAA,IAAI,SAAA,IAAa,QAAA,IAAY,QAAA,GAAW,OAAA,EAAS,SAAA,GAAY,QAAA;AAAA,aAAA,IACpD,SAAA,IAAa,QAAA,IAAY,QAAA,GAAW,OAAA,EAAS,SAAA,GAAY,OAAA;AAGlE,QAAA,MAAM,QAAA,GAAW,KAAA;AACjB,QAAA,MAAM,OAAA,GAAU,KAAA,GAAQA,KAAAA,CAAK,IAAA,EAAM,IAAI,CAAA;AACvC,QAAA,MAAM,UAAU,QAAA,GAAW,OAAA;AAC3B,QAAA,MAAM,UAAU,QAAA,GAAW,OAAA;AAC3B,QAAA,MAAM,UAAA,GAAA,CAAe,KAAA,GAAQ,OAAA,KAAY,OAAA,GAAU,OAAA,CAAA,GAAY,GAAA;AAG/D,QAAA,MAAM,QAAA,GAAWA,KAAAA,CAAK,GAAA,EAAK,GAAG,CAAA;AAC9B,QAAA,MAAM,UAAA,GAAaA,KAAAA,CAAK,GAAA,EAAQ,GAAO,CAAA;AAEvC,QAAA,OAAO;AAAA,UACL,GAAA;AAAA,UACA,MAAM,EAAE,KAAA,EAAO,SAAA,EAAW,MAAA,EAAQ,YAAY,SAAA,EAAU;AAAA,UACxD,KAAK,EAAE,KAAA,EAAO,QAAA,EAAU,IAAA,EAAM,SAAS,SAAA,EAAU;AAAA,UACjD,SAAA,EAAW,EAAE,KAAA,EAAO,OAAA,EAAS,MAAA,EAAQ,QAAA,EAAU,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,OAAA,GAAU,KAAA,EAAO,QAAA,EAAU,UAAA,EAAW;AAAA,UAC5G,MAAA,EAAQ,EAAE,OAAA,EAAS,UAAA,EAAY,SAAS,UAAA,GAAa,QAAA,EAAU,OAAO,QAAA;AAAS,SACjF;AAAA,MACF;AAAA,MAEQ,uBAAA,CAAwB,QAAA,EAA+B,IAAA,EAAc,KAAA,EAAyB;AACpG,QAAA,MAAM,WAAqB,EAAC;AAC5B,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AAGlC,QAAA,MAAM,iBAAA,GAAoB;AAAA,UACxB,aAAa,QAAQ,CAAA,oBAAA,CAAA;AAAA,UACrB,CAAA,SAAA,EAAY,QAAA,CAAS,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAC,CAAA,cAAA,CAAA;AAAA,UACjD,CAAA,+BAAA,EAAkC,SAAS,aAAa,CAAA,aAAA,CAAA;AAAA,UACxD,CAAA,8BAAA,EAAiC,WAAA,CAAY,KAAK,CAAC,CAAA,GAAA,CAAA;AAAA,UACnD,CAAA,6CAAA,CAAA;AAAA,UACA,CAAA,iCAAA,CAAA;AAAA,UACA,CAAA,wCAAA,CAAA;AAAA,UACA,gCAAgC,QAAQ,CAAA,GAAA,CAAA;AAAA,UACxC,CAAA,uCAAA,CAAA;AAAA,UACA,CAAA,uCAAA;AAAA,SACF;AAEA,QAAA,MAAM,WAAA,GAAcC,QAAAA,CAAQ,CAAA,EAAG,CAAC,CAAA;AAChC,QAAA,MAAM,QAAA,GAAW,CAAC,GAAG,iBAAiB,CAAA,CAAE,KAAK,MAAM,IAAA,CAAK,MAAA,EAAO,GAAI,GAAG,CAAA;AAEtE,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,WAAA,EAAa,CAAA,EAAA,EAAK;AACpC,UAAA,QAAA,CAAS,IAAA,CAAK,QAAA,CAAS,CAAC,CAAC,CAAA;AAAA,QAC3B;AAEA,QAAA,OAAO,QAAA;AAAA,MACT;AAAA,MAEQ,uBAAA,CACN,QAAA,EACA,MAAA,EACA,UAAA,EACA,IAAA,EACQ;AACR,QAAA,MAAM,WAAW,EAAC;AAGlB,QAAA,QAAA,CAAS,IAAA,CAAK,CAAA,CAAA,EAAI,QAAA,CAAS,IAAI,CAAA,CAAA,CAAG,CAAA;AAGlC,QAAA,MAAM,SAAA,GAAY,SAAS,aAAA,KAAkB,MAAA,GAAS,eAAe,QAAA,CAAS,aAAA,KAAkB,QAAQ,cAAA,GAAiB,UAAA;AACzH,QAAA,QAAA,CAAS,IAAA,CAAK,CAAA,MAAA,EAAS,SAAS,CAAA,CAAE,CAAA;AAGlC,QAAA,IAAI,UAAA,CAAW,GAAA,GAAM,EAAA,IAAM,UAAA,CAAW,MAAM,EAAA,EAAI;AAC9C,UAAA,QAAA,CAAS,IAAA,CAAK,CAAA,IAAA,EAAO,UAAA,CAAW,GAAA,GAAM,EAAA,GAAK,UAAA,GAAa,YAAY,CAAA,EAAA,EAAK,UAAA,CAAW,GAAA,CAAI,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,QACvG;AACA,QAAA,IAAI,UAAA,CAAW,GAAA,CAAI,SAAA,KAAc,MAAA,EAAQ;AACvC,UAAA,QAAA,CAAS,IAAA,CAAK,CAAA,IAAA,EAAO,UAAA,CAAW,GAAA,CAAI,SAAS,CAAA,MAAA,CAAQ,CAAA;AAAA,QACvD;AACA,QAAA,IAAI,KAAK,GAAA,CAAI,UAAA,CAAW,IAAA,CAAK,SAAS,IAAI,GAAA,EAAK;AAC7C,UAAA,QAAA,CAAS,IAAA,CAAK,QAAQ,UAAA,CAAW,IAAA,CAAK,YAAY,CAAA,GAAI,SAAA,GAAY,SAAS,CAAA,SAAA,CAAW,CAAA;AAAA,QACxF;AAGA,QAAA,MAAM,SAAA,GAAY,OAAO,UAAA,GAAa,GAAA,GAAM,SAAS,MAAA,CAAO,UAAA,GAAa,MAAM,QAAA,GAAW,KAAA;AAC1F,QAAA,QAAA,CAAS,IAAA,CAAK,CAAA,YAAA,EAAe,SAAS,CAAA,CAAE,CAAA;AAExC,QAAA,OAAO,QAAA,CAAS,KAAK,KAAK,CAAA;AAAA,MAC5B;AAAA,MAEQ,gBAAA,CAAiB,QAAA,EAA+B,UAAA,EAA+B,IAAA,EAAsB;AAC3G,QAAA,MAAM,WAAW,EAAC;AAElB,QAAA,IAAI,UAAA,CAAW,MAAM,EAAA,EAAI;AACvB,UAAA,QAAA,CAAS,KAAK,CAAA,OAAA,EAAU,UAAA,CAAW,IAAI,OAAA,CAAQ,CAAC,CAAC,CAAA,8CAAA,CAAgD,CAAA;AAAA,QACnG,CAAA,MAAA,IAAW,UAAA,CAAW,GAAA,GAAM,EAAA,EAAI;AAC9B,UAAA,QAAA,CAAS,KAAK,CAAA,OAAA,EAAU,UAAA,CAAW,IAAI,OAAA,CAAQ,CAAC,CAAC,CAAA,mCAAA,CAAqC,CAAA;AAAA,QACxF,CAAA,MAAA,IAAW,UAAA,CAAW,GAAA,GAAM,EAAA,EAAI;AAC9B,UAAA,QAAA,CAAS,KAAK,CAAA,wBAAA,EAA2B,UAAA,CAAW,IAAI,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAE,CAAA;AAAA,QACtE,CAAA,MAAO;AACL,UAAA,QAAA,CAAS,KAAK,CAAA,eAAA,EAAkB,UAAA,CAAW,IAAI,OAAA,CAAQ,CAAC,CAAC,CAAA,oBAAA,CAAsB,CAAA;AAAA,QACjF;AAEA,QAAA,IAAI,UAAA,CAAW,IAAA,CAAK,SAAA,GAAY,GAAA,EAAK;AACnC,UAAA,QAAA,CAAS,KAAK,uDAAuD,CAAA;AAAA,QACvE,CAAA,MAAA,IAAW,UAAA,CAAW,IAAA,CAAK,SAAA,GAAY,IAAA,EAAM;AAC3C,UAAA,QAAA,CAAS,KAAK,sDAAsD,CAAA;AAAA,QACtE;AAEA,QAAA,IAAI,UAAA,CAAW,GAAA,CAAI,SAAA,KAAc,QAAA,EAAU;AACzC,UAAA,QAAA,CAAS,KAAK,mDAAmD,CAAA;AAAA,QACnE,CAAA,MAAA,IAAW,UAAA,CAAW,GAAA,CAAI,SAAA,KAAc,OAAA,EAAS;AAC/C,UAAA,QAAA,CAAS,KAAK,4CAA4C,CAAA;AAAA,QAC5D;AAEA,QAAA,IAAI,UAAA,CAAW,SAAA,CAAU,QAAA,GAAW,EAAA,EAAI;AACtC,UAAA,QAAA,CAAS,IAAA,CAAK,oCAAoC,UAAA,CAAW,SAAA,CAAU,SAAS,OAAA,CAAQ,CAAC,CAAC,CAAA,yBAAA,CAA2B,CAAA;AAAA,QACvH,CAAA,MAAA,IAAW,UAAA,CAAW,SAAA,CAAU,QAAA,GAAW,EAAA,EAAI;AAC7C,UAAA,QAAA,CAAS,IAAA,CAAK,oCAAoC,UAAA,CAAW,SAAA,CAAU,SAAS,OAAA,CAAQ,CAAC,CAAC,CAAA,sBAAA,CAAwB,CAAA;AAAA,QACpH;AAEA,QAAA,IAAI,UAAA,CAAW,MAAA,CAAO,KAAA,GAAQ,GAAA,EAAK;AACjC,UAAA,QAAA,CAAS,IAAA,CAAK,gBAAgB,UAAA,CAAW,MAAA,CAAO,MAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,yBAAA,CAA2B,CAAA;AAAA,QAC7F;AAEA,QAAA,OAAO,QAAA,CAAS,SAAS,CAAA,GAAI,QAAA,CAAS,KAAK,KAAK,CAAA,GAAI,GAAG,IAAI,CAAA,0CAAA,CAAA;AAAA,MAC7D;AAAA,MAEQ,cAAA,CACN,UACA,UAAA,EAC8E;AAC9E,QAAA,IAAI,SAAA,GAAY,CAAA;AAChB,QAAA,IAAI,SAAA,GAAY,CAAA;AAChB,QAAA,MAAM,UAAoB,EAAC;AAG3B,QAAA,IAAI,UAAA,CAAW,MAAM,EAAA,EAAI;AAAE,UAAA,SAAA,IAAa,CAAA;AAAG,UAAA,OAAA,CAAQ,KAAK,cAAc,CAAA;AAAA,QAAG,CAAA,MAAA,IAChE,UAAA,CAAW,GAAA,GAAM,EAAA,EAAI;AAAE,UAAA,SAAA,IAAa,CAAA;AAAG,UAAA,OAAA,CAAQ,KAAK,SAAS,CAAA;AAAA,QAAG,CAAA,MAAA,IAChE,UAAA,CAAW,GAAA,GAAM,EAAA,EAAI;AAAE,UAAA,SAAA,IAAa,CAAA;AAAG,UAAA,OAAA,CAAQ,KAAK,gBAAgB,CAAA;AAAA,QAAG,CAAA,MAAA,IACvE,UAAA,CAAW,GAAA,GAAM,EAAA,EAAI;AAAE,UAAA,SAAA,IAAa,CAAA;AAAG,UAAA,OAAA,CAAQ,KAAK,UAAU,CAAA;AAAA,QAAG;AAG1E,QAAA,IAAI,UAAA,CAAW,IAAA,CAAK,SAAA,GAAY,GAAA,EAAK;AAAE,UAAA,SAAA,IAAa,GAAA;AAAK,UAAA,OAAA,CAAQ,KAAK,cAAc,CAAA;AAAA,QAAG,CAAA,MAAA,IAC9E,UAAA,CAAW,IAAA,CAAK,SAAA,GAAY,IAAA,EAAM;AAAE,UAAA,SAAA,IAAa,GAAA;AAAK,UAAA,OAAA,CAAQ,KAAK,cAAc,CAAA;AAAA,QAAG;AAG7F,QAAA,IAAI,UAAA,CAAW,GAAA,CAAI,SAAA,KAAc,QAAA,EAAU;AAAE,UAAA,SAAA,IAAa,GAAA;AAAK,UAAA,OAAA,CAAQ,KAAK,cAAc,CAAA;AAAA,QAAG,CAAA,MAAA,IACpF,UAAA,CAAW,GAAA,CAAI,SAAA,KAAc,OAAA,EAAS;AAAE,UAAA,SAAA,IAAa,GAAA;AAAK,UAAA,OAAA,CAAQ,KAAK,aAAa,CAAA;AAAA,QAAG,WACvF,UAAA,CAAW,GAAA,CAAI,KAAA,GAAQ,UAAA,CAAW,IAAI,IAAA,EAAM;AAAE,UAAA,SAAA,IAAa,GAAA;AAAA,QAAK,CAAA,MACpE;AAAE,UAAA,SAAA,IAAa,GAAA;AAAA,QAAK;AAGzB,QAAA,IAAI,UAAA,CAAW,SAAA,CAAU,QAAA,GAAW,EAAA,EAAI;AAAE,UAAA,SAAA,IAAa,CAAA;AAAG,UAAA,OAAA,CAAQ,KAAK,YAAY,CAAA;AAAA,QAAG,CAAA,MAAA,IAC7E,UAAA,CAAW,SAAA,CAAU,QAAA,GAAW,EAAA,EAAI;AAAE,UAAA,SAAA,IAAa,CAAA;AAAG,UAAA,OAAA,CAAQ,KAAK,eAAe,CAAA;AAAA,QAAG;AAG9F,QAAA,IAAI,UAAA,CAAW,MAAA,CAAO,KAAA,GAAQ,GAAA,EAAK;AACjC,UAAA,IAAI,SAAA,GAAY,WAAW,SAAA,IAAa,CAAA;AAAA,eACnC,SAAA,IAAa,CAAA;AAClB,UAAA,OAAA,CAAQ,KAAK,iBAAiB,CAAA;AAAA,QAChC;AAEA,QAAA,MAAM,WAAW,SAAA,GAAY,SAAA;AAC7B,QAAA,MAAM,UAAA,GAAa,KAAK,GAAA,CAAI,IAAA,CAAK,IAAI,QAAQ,CAAA,GAAI,GAAG,IAAI,CAAA;AACxD,QAAA,MAAM,SAAA,GAAY,SAAS,aAAA,KAAkB,MAAA,GAAS,MAAM,QAAA,CAAS,aAAA,KAAkB,WAAW,CAAA,GAAM,GAAA;AAGxG,QAAA,IAAI,IAAA,CAAK,MAAA,EAAO,GAAI,QAAA,CAAS,cAAA,EAAgB;AAC3C,UAAA,OAAO,EAAE,SAAA,EAAW,MAAA,EAAQ,UAAA,EAAY,CAAA,EAAG,QAAQ,YAAA,EAAa;AAAA,QAClE;AAEA,QAAA,IAAI,WAAW,SAAA,EAAW;AACxB,UAAA,OAAO,EAAE,SAAA,EAAW,MAAA,EAAQ,UAAA,EAAY,MAAA,EAAQ,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,EAAE;AAAA,QACjF,CAAA,MAAA,IAAW,QAAA,GAAW,CAAC,SAAA,EAAW;AAChC,UAAA,OAAO,EAAE,SAAA,EAAW,OAAA,EAAS,UAAA,EAAY,MAAA,EAAQ,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,EAAE;AAAA,QAClF;AAEA,QAAA,OAAO,EAAE,SAAA,EAAW,MAAA,EAAQ,UAAA,EAAY,CAAA,EAAG,QAAQ,iBAAA,EAAkB;AAAA,MACvE;AAAA,MAEQ,iBAAA,CACN,QAAA,EACA,MAAA,EACA,KAAA,EACkG;AAElG,QAAA,IAAI,KAAA,CAAM,aAAA,CAAc,MAAA,IAAU,CAAA,EAAG;AACnC,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,YAAA,EAAc,CAAA,EAAG,UAAU,CAAA,EAAG,UAAA,EAAY,CAAA,EAAG,MAAA,EAAQ,2BAAA,EAA4B;AAAA,QAC5G;AAGA,QAAA,MAAM,aAAA,GAAgB,SAAS,aAAA,KAAkB,MAAA,GAAS,MAAM,QAAA,CAAS,aAAA,KAAkB,WAAW,IAAA,GAAO,GAAA;AAC7G,QAAA,IAAI,MAAA,CAAO,aAAa,aAAA,EAAe;AACrC,UAAA,OAAO,EAAE,SAAS,KAAA,EAAO,YAAA,EAAc,GAAG,QAAA,EAAU,CAAA,EAAG,UAAA,EAAY,CAAA,EAAG,MAAA,EAAQ,CAAA,oBAAA,EAAA,CAAwB,OAAO,UAAA,GAAa,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,IAAA,EAAA,CAAQ,gBAAgB,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA,CAAA,EAAK;AAAA,QACvL;AAEA,QAAA,MAAM,YAAA,GAAeD,KAAAA,CAAK,QAAA,CAAS,eAAA,EAAiB,SAAS,eAAe,CAAA;AAC5E,QAAA,MAAM,QAAA,GAAWC,QAAAA,CAAQ,QAAA,CAAS,WAAA,EAAa,SAAS,WAAW,CAAA;AACnE,QAAA,MAAM,UAAA,GAAaD,KAAAA,CAAK,GAAA,EAAK,GAAG,CAAA;AAEhC,QAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,cAAc,QAAA,EAAU,UAAA,EAAY,QAAQ,EAAA,EAAG;AAAA,MACzE;AAAA,KACF;AAIO,IAAM,mBAAA,GAAsB,IAAI,mBAAA,EAAoB;AAAA,EAAA;AAAA,CAAA,CAAA;AC75BpD,SAAS,SAAA,GAAuB;AACrC,EAAa;AACX,IAAA,MAAM,IAAI,MAAM,mDAAmD,CAAA;AAAA,EACrE;AAEF;;;AC8IO,IAAM,kBAAN,MAAsB;AAAA,EAM3B,YAAY,OAAA,EAIT;AACD,IAAA,MAAMK,UAAS,SAAA,EAAU;AACzB,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA,EAAS,OAAA,IAAWA,OAAAA,CAAO,YAAA;AAC1C,IAAA,IAAA,CAAK,QAAA,GAAW,OAAA,EAAS,QAAA,IAAYA,OAAAA,CAAO,WAAA,IAAe,EAAA;AAC3D,IAAA,IAAA,CAAK,SAAA,GAAY,OAAA,EAAS,SAAA,IAAaA,OAAAA,CAAO,YAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,KAAA,EAAe;AAC5B,IAAA,IAAA,CAAK,WAAA,GAAc,KAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAA,GAAmB;AACjB,IAAA,IAAA,CAAK,WAAA,GAAc,MAAA;AAAA,EACrB;AAAA,EAEQ,UAAA,CAAW,gBAAgB,KAAA,EAA+B;AAChE,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,cAAA,EAAgB,kBAAA;AAAA,MAChB,eAAe,IAAA,CAAK;AAAA,KACtB;AAEA,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,OAAA,CAAQ,eAAe,CAAA,GAAI,CAAA,OAAA,EAAU,IAAA,CAAK,WAAW,CAAA,CAAA;AAAA,IACvD;AAEA,IAAA,IAAI,aAAA,IAAiB,KAAK,SAAA,EAAW;AACnC,MAAA,OAAA,CAAQ,cAAc,IAAI,IAAA,CAAK,SAAA;AAAA,IACjC;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAc,OAAA,CACZ,QAAA,EACA,UAAuB,EAAC,EACxB,gBAAgB,KAAA,EACS;AACzB,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,KAAK,OAAO,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI;AAAA,QACzD,GAAG,OAAA;AAAA,QACH,OAAA,EAAS;AAAA,UACP,GAAG,IAAA,CAAK,UAAA,CAAW,aAAa,CAAA;AAAA,UAChC,GAAG,OAAA,CAAQ;AAAA;AACb,OACD,CAAA;AAED,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AAEjC,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO;AAAA,YACL,MAAM,IAAA,CAAK,KAAA,EAAO,IAAA,IAAQ,CAAA,KAAA,EAAQ,SAAS,MAAM,CAAA,CAAA;AAAA,YACjD,OAAA,EAAS,IAAA,CAAK,KAAA,EAAO,OAAA,IAAW;AAAA;AAClC,SACF;AAAA,MACF;AAEA,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,IAAA,EAAM,KAAK,IAAA,IAAQ;AAAA,OACrB;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,eAAA;AAAA,UACN,OAAA,EAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA;AACpD,OACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,aAAa,KAAA,EAA0D;AAC3E,IAAA,OAAO,IAAA,CAAK,QAAQ,kBAAA,EAAoB;AAAA,MACtC,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,OAAO;AAAA,KAC/B,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAA,CAAe,KAAA,EAAe,GAAA,EAAuD;AACzF,IAAA,OAAO,IAAA,CAAK,QAAQ,yBAAA,EAA2B;AAAA,MAC7C,MAAA,EAAQ,MAAA;AAAA,MACR,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,KAAK;AAAA,KACpC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAA,CACJ,aAAA,EACA,SAAA,EACA,OAAA,EAC0C;AAC1C,IAAA,OAAO,IAAA,CAAK,QAAQ,qBAAA,EAAuB;AAAA,MACzC,MAAA,EAAQ,MAAA;AAAA,MACR,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,aAAA,EAAe,SAAA,EAAW,SAAS;AAAA,KAC3D,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,YAAA,EAAgE;AACjF,IAAA,OAAO,IAAA,CAAK,QAAQ,sBAAA,EAAwB;AAAA,MAC1C,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,cAAc;AAAA,KACtC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAA,GAA6C;AACjD,IAAA,OAAO,KAAK,OAAA,CAAQ,iBAAA,EAAmB,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,GAAsD;AAC1D,IAAA,OAAO,KAAK,OAAA,CAAQ,qBAAA,EAAuB,EAAE,MAAA,EAAQ,QAAQ,CAAA;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,gBAAA,CACJ,aAAA,EACA,MAAA,EAC2C;AAC3C,IAAA,MAAM,SAAS,IAAI,eAAA,CAAgB,EAAE,OAAA,EAAS,eAAe,CAAA;AAC7D,IAAA,IAAI,MAAA,EAAQ,MAAA,IAAU,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AACvC,MAAA,MAAA,CAAO,IAAI,SAAA,EAAW,MAAA,CAAO,CAAC,CAAA,CAAE,UAAU,CAAA;AAAA,IAC5C;AACA,IAAA,OAAO,IAAA,CAAK,QAAQ,CAAA,eAAA,EAAkB,MAAM,IAAI,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBACJ,aAAA,EACkF;AAClF,IAAA,MAAM,SAAS,IAAI,eAAA,CAAgB,EAAE,OAAA,EAAS,eAAe,CAAA;AAC7D,IAAA,OAAO,IAAA,CAAK,QAAQ,CAAA,yBAAA,EAA4B,MAAM,IAAI,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EAC7E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eACJ,OAAA,EACyD;AACzD,IAAA,MAAM,MAAA,GAAS,OAAA,GAAU,CAAA,SAAA,EAAY,OAAO,CAAA,CAAA,GAAK,EAAA;AACjD,IAAA,OAAO,IAAA,CAAK,QAAQ,CAAA,cAAA,EAAiB,MAAM,IAAI,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,CACJ,OAAA,GAAkB,IAAA,EAClB,OAAqC,OAAA,EACwD;AAC7F,IAAA,OAAO,IAAA,CAAK,QAAQ,gBAAA,EAAkB;AAAA,MACpC,MAAA,EAAQ,MAAA;AAAA,MACR,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,OAAA,EAAS,MAAM;AAAA,KACvC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBAAA,CACJ,aAAA,EACA,OAAA,EACsE;AACtE,IAAA,MAAM,SAAS,IAAI,eAAA,CAAgB,EAAE,OAAA,EAAS,eAAe,CAAA;AAC7D,IAAA,IAAI,OAAA,EAAS,OAAO,MAAA,CAAO,GAAA,CAAI,SAAS,OAAA,CAAQ,KAAA,CAAM,UAAU,CAAA;AAChE,IAAA,IAAI,OAAA,EAAS,QAAQ,MAAA,CAAO,GAAA,CAAI,UAAU,OAAA,CAAQ,MAAA,CAAO,UAAU,CAAA;AACnE,IAAA,IAAI,OAAA,EAAS,SAAS,MAAA,CAAO,GAAA,CAAI,WAAW,OAAA,CAAQ,OAAA,CAAQ,UAAU,CAAA;AACtE,IAAA,OAAO,IAAA,CAAK,QAAQ,CAAA,4BAAA,EAA+B,MAAM,IAAI,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EAChF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBACJ,OAAA,EACiD;AACjD,IAAA,OAAO,IAAA,CAAK,QAAQ,qBAAA,EAAuB;AAAA,MACzC,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,OAAO;AAAA,KAC7B,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBAAqB,IAAA,EAA+D;AACxF,IAAA,OAAO,IAAA,CAAK,QAAQ,CAAA,2BAAA,EAA8B,IAAI,IAAI,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EAC7E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,cAAA,CACJ,YAAA,EACA,UAAA,EACA,gBACA,aAAA,EACqC;AACrC,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB;AAAA,MACjC,YAAA;AAAA,MACA,UAAA,EAAY,WAAW,QAAA,EAAS;AAAA,MAChC;AAAA,KACD,CAAA;AACD,IAAA,IAAI,aAAA,EAAe,MAAA,CAAO,GAAA,CAAI,eAAA,EAAiB,aAAa,CAAA;AAC5D,IAAA,OAAO,IAAA,CAAK,QAAQ,CAAA,0BAAA,EAA6B,MAAM,IAAI,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EAC9E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBACJ,OAAA,EACqC;AACrC,IAAA,OAAO,IAAA,CAAK,QAAQ,qBAAA,EAAuB;AAAA,MACzC,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,QACnB,YAAA,EAAc,QAAQ,YAAA,IAAgB,KAAA;AAAA,QACtC,UAAA,EAAY,QAAQ,UAAA,IAAc,GAAA;AAAA,QAClC,cAAA,EAAgB,QAAQ,cAAA,IAAkB,KAAA;AAAA,QAC1C,eAAe,OAAA,CAAQ,aAAA;AAAA,QACvB,OAAA,EAAS;AAAA;AAAA,OACV;AAAA,KACF,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,SAAA,EAA4D;AAChF,IAAA,OAAO,IAAA,CAAK,QAAQ,CAAA,oBAAA,EAAuB,SAAS,IAAI,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EAC3E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,sBAAA,GAAyG;AAC7G,IAAA,OAAO,KAAK,OAAA,CAAQ,qBAAA,EAAuB,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,0BAAA,GAA6D;AACjE,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,sBAAA,EAAuB;AACjD,IAAA,IAAI,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,IAAA,EAAM;AACjC,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,MAAA,CAAO,KAAK,cAAA,EAAe;AAAA,IAC3D;AACA,IAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,OAAO,KAAA,EAAM;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,2BAA2B,OAAA,EAAkD;AAEjF,IAAA,OAAO,EAAE,SAAS,IAAA,EAAM,IAAA,EAAM,CAAC,MAAA,EAAQ,eAAA,EAAiB,WAAA,EAAa,YAAY,CAAA,EAAE;AAAA,EACrF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,aAAa,OAAA,EAA4D;AAC7E,IAAA,OAAO,IAAA,CAAK,QAAQ,oBAAA,EAAsB;AAAA,MACxC,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,OAAO;AAAA,KAC7B,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,OAAA,EAA+D;AAC/E,IAAA,OAAO,IAAA,CAAK,QAAQ,sBAAA,EAAwB;AAAA,MAC1C,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,OAAO;AAAA,KAC7B,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,MAAA,EAAkD;AACpE,IAAA,OAAO,IAAA,CAAK,QAAQ,CAAA,aAAA,EAAgB,MAAM,IAAI,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,uBAAuB,OAAA,EAA6D;AACxF,IAAA,MAAM,MAAA,GAAS,OAAA,GAAU,CAAA,SAAA,EAAY,OAAO,CAAA,CAAA,GAAK,EAAA;AACjD,IAAA,OAAO,IAAA,CAAK,QAAQ,CAAA,mBAAA,EAAsB,MAAM,IAAI,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EACvE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,sBAAA,GAA2F;AAC/F,IAAA,OAAO,KAAK,OAAA,CAAQ,qBAAA,EAAuB,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,aAAA,GAAoD;AACxD,IAAA,OAAO,KAAK,OAAA,CAAQ,0BAAA,EAA4B,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,UAAA,EAAsD;AACtE,IAAA,OAAO,IAAA,CAAK,QAAQ,CAAA,yBAAA,EAA4B,UAAU,IAAI,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EACjF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,GAA4C;AAChD,IAAA,OAAO,KAAK,OAAA,CAAQ,yBAAA,EAA2B,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,CACJ,UAAA,EACA,MAAA,EACA,QAAA,EAC+B;AAC/B,IAAA,OAAO,IAAA,CAAK,QAAQ,wBAAA,EAA0B;AAAA,MAC5C,MAAA,EAAQ,MAAA;AAAA,MACR,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,UAAA,EAAY,MAAA,EAAQ,UAAU;AAAA,KACtD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAA,GAAiD;AACrD,IAAA,OAAO,KAAK,OAAA,CAAQ,wBAAA,EAA0B,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAA,GAMF;AAEF,IAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,YAAA,EAAa;AAChD,IAAA,IAAI,eAAA,CAAgB,OAAA,IAAW,eAAA,CAAgB,IAAA,EAAM;AACnD,MAAA,MAAM,YAAY,eAAA,CAAgB,IAAA;AAClC,MAAA,MAAM,aAAA,GAAgB,SAAA,CAAU,MAAA,CAAO,CAAC,GAAA,EAAK,MAAM,GAAA,IAAO,CAAA,CAAE,cAAA,IAAkB,CAAA,CAAA,EAAI,CAAC,CAAA;AACnF,MAAA,MAAM,UAAA,GAAa,SAAA,CAAU,MAAA,CAAO,CAAC,GAAA,EAAK,MAAM,GAAA,IAAO,CAAA,CAAE,YAAA,IAAgB,CAAA,CAAA,EAAI,CAAC,CAAA;AAC9E,MAAA,MAAM,WAAW,UAAA,GAAa,aAAA;AAC9B,MAAA,MAAM,eAAA,GAAkB,aAAA,GAAgB,CAAA,GAAK,QAAA,GAAW,gBAAiB,GAAA,GAAM,CAAA;AAC/E,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,IAAA,EAAM;AAAA,UACJ,aAAA;AAAA,UACA,UAAA;AAAA,UACA,QAAA;AAAA,UACA,eAAA;AAAA,UACA,eAAA,EAAiB,UAAU,MAAA,CAAO,CAAC,MAAW,CAAA,CAAE,MAAA,KAAW,QAAQ,CAAA,CAAE;AAAA;AACvE,OACF;AAAA,IACF;AACA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,IAAA,EAAM,EAAE,aAAA,EAAe,CAAA,EAAG,UAAA,EAAY,CAAA,EAAG,QAAA,EAAU,CAAA,EAAG,eAAA,EAAiB,CAAA,EAAG,eAAA,EAAiB,CAAA;AAAE,KAC/F;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,eAAe,OAAA,EAIhB;AAEH,IAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAA,KAAK;AACpC,MAAA,MAAM,KAAA,GAAQ,EAAE,WAAA,EAAY;AAC5B,MAAA,IAAI,KAAA,CAAM,QAAA,CAAS,MAAM,CAAA,EAAG,OAAO,KAAA;AACnC,MAAA,OAAO,GAAG,KAAK,CAAA,IAAA,CAAA;AAAA,IACjB,CAAC,CAAA;AAED,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA;AAAA,MACxB,CAAA,+BAAA,EAAkC,YAAA,CAAa,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AAAA,MACxD,EAAE,QAAQ,KAAA;AAAM,KAClB;AAEA,IAAA,IAAI,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,IAAA,EAAM,OAAA,EAAS;AAC1C,MAAA,MAAM,SAAmF,EAAC;AAC1F,MAAA,KAAA,MAAW,MAAA,IAAU,MAAA,CAAO,IAAA,CAAK,OAAA,EAAS;AACxC,QAAA,MAAM,SAAS,MAAA,CAAO,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA,IAAK,EAAA;AACrD,QAAA,MAAA,CAAO,MAAM,CAAA,GAAI;AAAA,UACf,KAAA,EAAO,UAAA,CAAW,MAAA,CAAO,SAAS,CAAA,IAAK,CAAA;AAAA,UACvC,SAAA,EAAW,UAAA,CAAW,MAAA,CAAO,YAAY,IAAI,GAAA,IAAO,CAAA;AAAA,UACpD,SAAA,EAAW;AAAA;AAAA,SACb;AAAA,MACF;AACA,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,MAAA,EAAO;AAAA,IACvC;AACA,IAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,OAAO,KAAA,EAAM;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAA,GAKF;AACF,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAA4B,0BAA0B,EAAE,MAAA,EAAQ,OAAO,CAAA;AACjG,IAAA,IAAI,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,IAAA,EAAM,OAAA,EAAS;AAC1C,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,IAAA,EAAM;AAAA,UACJ,cAAA,EAAgB,CAAA;AAAA;AAAA,UAChB,cAAA,EAAgB,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,IAAO,UAAA,CAAW,CAAA,CAAE,SAAS,CAAA,IAAK,IAAI,CAAC,CAAA;AAAA,UAC9F,YAAA,EAAc,CAAA;AAAA;AAAA,UACd,OAAA,EAAS,OAAO,IAAA,CAAK;AAAA;AACvB,OACF;AAAA,IACF;AACA,IAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,OAAO,KAAA,EAAM;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,WAAA,CACJ,aAAA,EACA,OAAA,EACsD;AACtD,IAAA,MAAM,SAAS,IAAI,eAAA,CAAgB,EAAE,OAAA,EAAS,eAAe,CAAA;AAC7D,IAAA,IAAI,OAAA,EAAS,SAAS,MAAA,CAAO,GAAA,CAAI,WAAW,OAAA,CAAQ,OAAA,CAAQ,UAAU,CAAA;AACtE,IAAA,IAAI,OAAA,EAAS,OAAO,MAAA,CAAO,GAAA,CAAI,SAAS,OAAA,CAAQ,KAAA,CAAM,UAAU,CAAA;AAChE,IAAA,IAAI,OAAA,EAAS,QAAQ,MAAA,CAAO,GAAA,CAAI,UAAU,OAAA,CAAQ,MAAA,CAAO,UAAU,CAAA;AACnE,IAAA,OAAO,IAAA,CAAK,QAAQ,CAAA,oBAAA,EAAuB,MAAM,IAAI,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAA,CACJ,eAAA,EACA,OAAA,EACA,OAAA,EAC2B;AAC3B,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,CAAA,oBAAA,EAAuB,eAAe,CAAA,CAAA,EAAI,OAAO,CAAA,SAAA,EAAY,OAAO,CAAA,CAAA,EAAI,EAAE,MAAA,EAAQ,KAAA,EAAO,CAAA;AAAA,EAC/G;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAA,CACJ,eAAA,EACA,OAAA,EACqC;AACrC,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,CAAA,+BAAA,EAAkC,eAAe,CAAA,SAAA,EAAY,OAAO,CAAA,CAAA,EAAI,EAAE,MAAA,EAAQ,KAAA,EAAO,CAAA;AAAA,EAC/G;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,MAAA,EAO2C;AAC3D,IAAA,OAAO,IAAA,CAAK,QAAQ,8BAAA,EAAgC;AAAA,MAClD,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM;AAAA,KAC5B,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,iBACJ,OAAA,EACgE;AAChE,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,IAAA,IAAI,OAAA,EAAS,SAAS,MAAA,CAAO,GAAA,CAAI,WAAW,OAAA,CAAQ,OAAA,CAAQ,UAAU,CAAA;AACtE,IAAA,IAAI,OAAA,EAAS,OAAO,MAAA,CAAO,GAAA,CAAI,SAAS,OAAA,CAAQ,KAAA,CAAM,UAAU,CAAA;AAChE,IAAA,IAAI,OAAA,EAAS,QAAQ,MAAA,CAAO,GAAA,CAAI,UAAU,OAAA,CAAQ,MAAA,CAAO,UAAU,CAAA;AACnE,IAAA,OAAO,IAAA,CAAK,QAAQ,CAAA,kBAAA,EAAqB,MAAM,IAAI,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EACtE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAA,CACJ,OAAA,EACA,OAAA,EACgC;AAChC,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,CAAA,kBAAA,EAAqB,OAAO,CAAA,SAAA,EAAY,OAAO,CAAA,CAAA,EAAI,EAAE,MAAA,EAAQ,KAAA,EAAO,CAAA;AAAA,EAC1F;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,MAAA,EAAuD;AACxE,IAAA,OAAO,IAAA,CAAK,QAAQ,wBAAA,EAA0B;AAAA,MAC5C,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM;AAAA,KAC5B,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,MAAA,EAGhB;AACF,IAAA,OAAO,IAAA,CAAK,QAAQ,yBAAA,EAA2B;AAAA,MAC7C,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM;AAAA,KAC5B,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe,MAAA,EAIjB;AACF,IAAA,OAAO,IAAA,CAAK,QAAQ,0BAAA,EAA4B;AAAA,MAC9C,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM;AAAA,KAC5B,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,eAAA,CACJ,cAAA,EACA,YAAA,EACA,cACA,YAAA,EACsC;AACtC,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB;AAAA,MACjC,cAAA;AAAA,MACA,YAAA,EAAc,aAAa,QAAA,EAAS;AAAA,MACpC;AAAA,KACD,CAAA;AACD,IAAA,IAAI,YAAA,EAAc,MAAA,CAAO,GAAA,CAAI,cAAA,EAAgB,YAAY,CAAA;AACzD,IAAA,OAAO,IAAA,CAAK,QAAQ,CAAA,2BAAA,EAA8B,MAAM,IAAI,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EAC/E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,yBAAyB,OAAA,EAAmE;AAChG,IAAA,OAAO,IAAA,CAAK,QAAQ,sBAAA,EAAwB;AAAA,MAC1C,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,OAAO;AAAA,KAC7B,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAiB,aAAA,EAAiE;AACtF,IAAA,OAAO,IAAA,CAAK,QAAQ,CAAA,qBAAA,EAAwB,aAAa,IAAI,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EAChF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,0BAA0B,OAAA,EAAkD;AAChF,IAAA,MAAM,MAAA,GAAS,OAAA,GAAU,CAAA,SAAA,EAAY,OAAO,CAAA,CAAA,GAAK,EAAA;AACjD,IAAA,OAAO,IAAA,CAAK,QAAQ,CAAA,4BAAA,EAA+B,MAAM,IAAI,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EAChF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,gBAAA,CACJ,OAAA,EACA,QAAA,EACsC;AACtC,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,IAAA,IAAI,OAAA,EAAS,MAAA,CAAO,GAAA,CAAI,SAAA,EAAW,OAAO,CAAA;AAC1C,IAAA,IAAI,QAAA,EAAU,MAAA,CAAO,GAAA,CAAI,UAAA,EAAY,QAAQ,CAAA;AAC7C,IAAA,OAAO,IAAA,CAAK,QAAQ,CAAA,wBAAA,EAA2B,MAAM,IAAI,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EAC5E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAA,CACJ,UAAA,EACA,aAAA,EAOE;AACF,IAAA,OAAO,IAAA,CAAK,QAAQ,wBAAA,EAA0B;AAAA,MAC5C,MAAA,EAAQ,MAAA;AAAA,MACR,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,UAAA,EAAY,eAAe;AAAA,KACnD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAQ,MAAA,EAKwB;AACpC,IAAA,OAAO,IAAA,CAAK,QAAQ,mBAAA,EAAqB;AAAA,MACvC,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM;AAAA,KAC5B,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eACJ,OAAA,EACkE;AAClE,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,IAAA,IAAI,OAAA,EAAS,OAAO,MAAA,CAAO,GAAA,CAAI,SAAS,OAAA,CAAQ,KAAA,CAAM,UAAU,CAAA;AAChE,IAAA,IAAI,OAAA,EAAS,QAAQ,MAAA,CAAO,GAAA,CAAI,UAAU,OAAA,CAAQ,MAAA,CAAO,UAAU,CAAA;AACnE,IAAA,OAAO,IAAA,CAAK,QAAQ,CAAA,sBAAA,EAAyB,MAAM,IAAI,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,gBACJ,OAAA,EACqC;AACrC,IAAA,MAAM,MAAA,GAAS,OAAA,GAAU,CAAA,SAAA,EAAY,OAAO,CAAA,CAAA,GAAK,EAAA;AACjD,IAAA,OAAO,IAAA,CAAK,QAAQ,CAAA,qBAAA,EAAwB,MAAM,IAAI,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EACzE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAA,GAA+D;AACnE,IAAA,OAAO,KAAK,OAAA,CAAQ,2BAAA,EAA6B,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EACpE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAM,MAAA,EAGqD;AAC/D,IAAA,OAAO,IAAA,CAAK,QAAQ,uBAAA,EAAyB;AAAA,MAC3C,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM;AAAA,KAC5B,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAQ,MAAA,EAG+B;AAC3C,IAAA,OAAO,IAAA,CAAK,QAAQ,yBAAA,EAA2B;AAAA,MAC7C,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM;AAAA,KAC5B,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAoB,UAAA,EAA8E;AACtG,IAAA,OAAO,IAAA,CAAK,QAAQ,uBAAA,EAAyB;AAAA,MAC3C,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,YAAY;AAAA,KACpC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,cAAA,GAAoD;AACxD,IAAA,OAAO,KAAK,OAAA,CAAQ,sBAAA,EAAwB,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAkB,OAAA,EAAkE;AACxF,IAAA,OAAO,IAAA,CAAK,QAAQ,sBAAA,EAAwB;AAAA,MAC1C,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,OAAO;AAAA,KAC7B,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAA,GAAsD;AAC1D,IAAA,OAAO,KAAK,OAAA,CAAQ,uBAAA,EAAyB,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAmB,OAAA,EAAoE;AAC3F,IAAA,OAAO,IAAA,CAAK,QAAQ,uBAAA,EAAyB;AAAA,MAC3C,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,OAAO;AAAA,KAC7B,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,iBACJ,OAAA,EAC8E;AAC9E,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,IAAA,IAAI,OAAA,EAAS,UAAA,EAAY,MAAA,CAAO,GAAA,CAAI,cAAc,MAAM,CAAA;AACxD,IAAA,IAAI,OAAA,EAAS,OAAO,MAAA,CAAO,GAAA,CAAI,SAAS,OAAA,CAAQ,KAAA,CAAM,UAAU,CAAA;AAChE,IAAA,IAAI,OAAA,EAAS,QAAQ,MAAA,CAAO,GAAA,CAAI,UAAU,OAAA,CAAQ,MAAA,CAAO,UAAU,CAAA;AACnE,IAAA,OAAO,IAAA,CAAK,QAAQ,CAAA,sBAAA,EAAyB,MAAM,IAAI,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBAAqB,cAAA,EAAoD;AAC7E,IAAA,OAAO,IAAA,CAAK,QAAQ,CAAA,sBAAA,EAAyB,cAAc,SAAS,EAAE,MAAA,EAAQ,QAAQ,CAAA;AAAA,EACxF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,wBAAA,GAAuD;AAC3D,IAAA,OAAO,KAAK,OAAA,CAAQ,gCAAA,EAAkC,EAAE,MAAA,EAAQ,QAAQ,CAAA;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,eAAA,GAAsD;AAC1D,IAAA,OAAO,KAAK,OAAA,CAAQ,kBAAA,EAAoB,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,GAAiD;AACrD,IAAA,OAAO,KAAK,OAAA,CAAQ,uBAAA,EAAyB,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAkB,IAAA,EAA2E;AACjG,IAAA,OAAO,IAAA,CAAK,QAAQ,wBAAA,EAA0B;AAAA,MAC5C,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,MAAM;AAAA,KAC9B,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAA,GAAkF;AACtF,IAAA,OAAO,KAAK,OAAA,CAAQ,wBAAA,EAA0B,EAAE,MAAA,EAAQ,QAAQ,CAAA;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,YAAA,GAKF;AACF,IAAA,OAAO,KAAK,OAAA,CAAQ,oBAAA,EAAsB,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBAAqB,KAAA,EAGvB;AACF,IAAA,OAAO,IAAA,CAAK,QAAQ,mBAAA,EAAqB;AAAA,MACvC,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,OAAO;AAAA,KAC/B,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAmB,MAAA,EAKqC;AAC5D,IAAA,OAAO,IAAA,CAAK,QAAQ,oBAAA,EAAsB;AAAA,MACxC,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM;AAAA,KAC5B,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,eAAe,MAAA,EAOiB;AACpC,IAAA,OAAO,IAAA,CAAK,QAAQ,sBAAA,EAAwB;AAAA,MAC1C,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM;AAAA,KAC5B,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,MAAA,EAGwB;AAC1C,IAAA,OAAO,IAAA,CAAK,QAAQ,wBAAA,EAA0B;AAAA,MAC5C,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM;AAAA,KAC5B,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,QAAA,EAA2D;AAC/E,IAAA,OAAO,IAAA,CAAK,QAAQ,CAAA,eAAA,EAAkB,QAAQ,IAAI,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,wBAAA,GAEF;AACF,IAAA,OAAO,KAAK,OAAA,CAAQ,uBAAA,EAAyB,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,eAAe,MAAA,EAKiB;AACpC,IAAA,OAAO,IAAA,CAAK,QAAQ,sBAAA,EAAwB;AAAA,MAC1C,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM;AAAA,KAC5B,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,OAAA,EAAiD;AACjE,IAAA,OAAO,IAAA,CAAK,QAAQ,CAAA,0BAAA,EAA6B,OAAO,IAAI,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EAC/E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,aAAa,OAAA,EAIf;AACF,IAAA,OAAO,IAAA,CAAK,QAAQ,uBAAA,EAAyB;AAAA,MAC3C,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,OAAO;AAAA,OAC3B,IAAI,CAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,YAAA,CAAa,QAAA,EAAkB,GAAA,EAGjC;AACF,IAAA,OAAO,IAAA,CAAK,QAAQ,uBAAA,EAAyB;AAAA,MAC3C,MAAA,EAAQ,MAAA;AAAA,MACR,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,QAAA,EAAU,KAAK;AAAA,OACrC,IAAI,CAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAA,GAAgF;AACpF,IAAA,OAAO,KAAK,OAAA,CAAQ,kCAAA,EAAoC,EAAE,MAAA,EAAQ,MAAA,IAAU,IAAI,CAAA;AAAA,EAClF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAiB,QAAA,EAA8E;AACnG,IAAA,OAAO,IAAA,CAAK,QAAQ,kCAAA,EAAoC;AAAA,MACtD,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,UAAU;AAAA,KAClC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,qBAAA,CACJ,aAAA,EACA,MAAA,GAAsD,KAAA,EACZ;AAC1C,IAAA,MAAM,SAAS,IAAI,eAAA,CAAgB,EAAE,OAAA,EAAS,aAAA,EAAe,QAAQ,CAAA;AACrE,IAAA,OAAO,IAAA,CAAK,QAAQ,CAAA,4BAAA,EAA+B,MAAM,IAAI,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EAChF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,uBAAA,CACJ,aAAA,EACA,MAAA,GAAuC,KAAA,EAOrC;AACF,IAAA,MAAM,SAAS,IAAI,eAAA,CAAgB,EAAE,OAAA,EAAS,aAAA,EAAe,QAAQ,CAAA;AACrE,IAAA,OAAO,IAAA,CAAK,QAAQ,CAAA,+BAAA,EAAkC,MAAM,IAAI,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EACnF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,iBAAiB,MAAA,EAQc;AACnC,IAAA,OAAO,IAAA,CAAK,QAAQ,8BAAA,EAAgC;AAAA,MAClD,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM;AAAA,KAC5B,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe,MAAA,EAAiF;AACpG,IAAA,MAAM,MAAA,GAAS,MAAA,GAAS,CAAA,QAAA,EAAW,MAAM,CAAA,CAAA,GAAK,EAAA;AAC9C,IAAA,OAAO,IAAA,CAAK,QAAQ,CAAA,4BAAA,EAA+B,MAAM,IAAI,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EAChF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAiB,OAAA,EAA6D;AAClF,IAAA,OAAO,IAAA,CAAK,QAAQ,CAAA,6BAAA,EAAgC,OAAO,IAAI,EAAE,MAAA,EAAQ,UAAU,CAAA;AAAA,EACrF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,MAAA,EAK0B;AAC5C,IAAA,OAAO,IAAA,CAAK,QAAQ,wBAAA,EAA0B;AAAA,MAC5C,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM;AAAA,KAC5B,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAA,GAQA;AACJ,IAAA,OAAO,KAAK,OAAA,CAAQ,wBAAA,EAA0B,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAiB,OAAA,EAA6D;AAClF,IAAA,OAAO,IAAA,CAAK,QAAQ,CAAA,uBAAA,EAA0B,OAAO,IAAI,EAAE,MAAA,EAAQ,UAAU,CAAA;AAAA,EAC/E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,iBAAA,GAQF;AACF,IAAA,OAAO,KAAK,OAAA,CAAQ,uBAAA,EAAyB,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,SAAA,EAA+D;AACjF,IAAA,OAAO,IAAA,CAAK,QAAQ,CAAA,sBAAA,EAAyB,SAAS,IAAI,EAAE,MAAA,EAAQ,UAAU,CAAA;AAAA,EAChF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,sBAAA,GAAyE;AAC7E,IAAA,OAAO,KAAK,OAAA,CAAQ,kCAAA,EAAoC,EAAE,MAAA,EAAQ,QAAQ,CAAA;AAAA,EAC5E;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,aAAa,OAAA,EAAgG;AACjH,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,IAAA,IAAI,OAAA,EAAS,aAAa,MAAA,EAAW,MAAA,CAAO,IAAI,UAAA,EAAY,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAC,CAAA;AACpF,IAAA,MAAM,KAAA,GAAQ,OAAO,QAAA,EAAS;AAC9B,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,CAAA,gBAAA,EAAmB,KAAA,GAAQ,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA,EAAI,EAAE,MAAA,EAAQ,KAAA,EAAO,CAAA;AAAA,EACtF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,SAAA,EAA+D;AAC9E,IAAA,OAAO,IAAA,CAAK,QAAQ,CAAA,iBAAA,EAAoB,SAAS,IAAI,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,KAAA,EAAuE;AACzF,IAAA,OAAO,IAAA,CAAK,QAAQ,kBAAA,EAAoB;AAAA,MACtC,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,KAAK;AAAA,KAC3B,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAA,CAAc,SAAA,EAAmB,KAAA,EAAuE;AAC5G,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,CAAA,iBAAA,EAAoB,SAAS,CAAA,CAAA,EAAI;AAAA,MACnD,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,KAAK;AAAA,KAC3B,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,SAAA,EAA+D;AACjF,IAAA,OAAO,IAAA,CAAK,QAAQ,CAAA,iBAAA,EAAoB,SAAS,IAAI,EAAE,MAAA,EAAQ,UAAU,CAAA;AAAA,EAC3E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAA,CACJ,SAAA,EACA,OAAA,EACwE;AACxE,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,IAAA,IAAI,SAAS,MAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,QAAA,EAAU,QAAQ,MAAM,CAAA;AACxD,IAAA,IAAI,OAAA,EAAS,OAAO,MAAA,CAAO,GAAA,CAAI,SAAS,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAC,CAAA;AAC7D,IAAA,IAAI,OAAA,EAAS,QAAQ,MAAA,CAAO,GAAA,CAAI,UAAU,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAC,CAAA;AAChE,IAAA,MAAM,KAAA,GAAQ,OAAO,QAAA,EAAS;AAC9B,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,CAAA,iBAAA,EAAoB,SAAS,cAAc,KAAA,GAAQ,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA,EAAI,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EAC9G;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,SAAA,EAKd;AACF,IAAA,OAAO,IAAA,CAAK,QAAQ,CAAA,iBAAA,EAAoB,SAAS,SAAS,EAAE,MAAA,EAAQ,QAAQ,CAAA;AAAA,EAC9E;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,eAAe,OAAA,EAIgC;AACnD,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,IAAA,IAAI,OAAA,EAAS,MAAM,MAAA,CAAO,GAAA,CAAI,QAAQ,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAC,CAAA;AAC1D,IAAA,IAAI,OAAA,EAAS,OAAO,MAAA,CAAO,GAAA,CAAI,SAAS,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAC,CAAA;AAC7D,IAAA,IAAI,SAAS,MAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,QAAA,EAAU,QAAQ,MAAM,CAAA;AACxD,IAAA,IAAI,SAAS,MAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,QAAA,EAAU,QAAQ,MAAM,CAAA;AACxD,IAAA,IAAI,SAAS,SAAA,EAAW,MAAA,CAAO,GAAA,CAAI,WAAA,EAAa,QAAQ,SAAS,CAAA;AACjE,IAAA,IAAI,SAAS,IAAA,EAAM,MAAA,CAAO,GAAA,CAAI,MAAA,EAAQ,QAAQ,IAAI,CAAA;AAClD,IAAA,IAAI,SAAS,SAAA,EAAW,MAAA,CAAO,GAAA,CAAI,WAAA,EAAa,QAAQ,SAAS,CAAA;AACjE,IAAA,IAAI,OAAA,EAAS,aAAa,MAAA,EAAW,MAAA,CAAO,IAAI,UAAA,EAAY,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAC,CAAA;AACpF,IAAA,MAAM,KAAA,GAAQ,OAAO,QAAA,EAAS;AAC9B,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,CAAA,mBAAA,EAAsB,KAAA,GAAQ,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA,EAAI,EAAE,MAAA,EAAQ,KAAA,EAAO,CAAA;AAAA,EACzF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,MAAA,EAA2D;AAC5E,IAAA,OAAO,IAAA,CAAK,QAAQ,CAAA,oBAAA,EAAuB,MAAM,IAAI,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAA,CAAgB,MAAA,EAAgB,IAAA,EAIQ;AAC5C,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,CAAA,oBAAA,EAAuB,MAAM,CAAA,CAAA,EAAI;AAAA,MACnD,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA,KAC1B,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAkB,OAAA,EAEgC;AACtD,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,IAAA,IAAI,OAAA,EAAS,MAAM,MAAA,CAAO,GAAA,CAAI,QAAQ,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAC,CAAA;AAC1D,IAAA,IAAI,OAAA,EAAS,OAAO,MAAA,CAAO,GAAA,CAAI,SAAS,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAC,CAAA;AAC7D,IAAA,IAAI,SAAS,MAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,QAAA,EAAU,QAAQ,MAAM,CAAA;AACxD,IAAA,IAAI,SAAS,MAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,QAAA,EAAU,QAAQ,MAAM,CAAA;AACxD,IAAA,IAAI,SAAS,SAAA,EAAW,MAAA,CAAO,GAAA,CAAI,WAAA,EAAa,QAAQ,SAAS,CAAA;AACjE,IAAA,IAAI,OAAA,EAAS,aAAa,MAAA,EAAW,MAAA,CAAO,IAAI,UAAA,EAAY,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAC,CAAA;AACpF,IAAA,MAAM,KAAA,GAAQ,OAAO,QAAA,EAAS;AAC9B,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,CAAA,sBAAA,EAAyB,KAAA,GAAQ,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA,EAAI,EAAE,MAAA,EAAQ,KAAA,EAAO,CAAA;AAAA,EAC5F;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,SAAA,EAAoE;AACxF,IAAA,OAAO,IAAA,CAAK,QAAQ,CAAA,uBAAA,EAA0B,SAAS,IAAI,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EAC9E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAA,CAAmB,SAAA,EAAmB,IAAA,EAIQ;AAClD,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,CAAA,uBAAA,EAA0B,SAAS,CAAA,CAAA,EAAI;AAAA,MACzD,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA,KAC1B,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,sBAAsB,SAAA,EAA6D;AACvF,IAAA,OAAO,IAAA,CAAK,QAAQ,CAAA,uBAAA,EAA0B,SAAS,mBAAmB,EAAE,MAAA,EAAQ,QAAQ,CAAA;AAAA,EAC9F;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,IAAA,EAAkD;AACpE,IAAA,MAAM,KAAA,GAAQ,IAAA,GAAO,CAAA,MAAA,EAAS,IAAI,CAAA,CAAA,GAAK,EAAA;AACvC,IAAA,OAAO,IAAA,CAAK,QAAQ,CAAA,mBAAA,EAAsB,KAAK,IAAI,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EACtE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,OAAA,EAO4C;AAC7D,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,IAAA,IAAI,SAAS,KAAA,EAAO,MAAA,CAAO,GAAA,CAAI,OAAA,EAAS,QAAQ,KAAK,CAAA;AACrD,IAAA,IAAI,SAAS,OAAA,EAAS,MAAA,CAAO,GAAA,CAAI,SAAA,EAAW,QAAQ,OAAO,CAAA;AAC3D,IAAA,IAAI,OAAA,EAAS,OAAO,MAAA,CAAO,GAAA,CAAI,SAAS,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAC,CAAA;AAC7D,IAAA,IAAI,OAAA,EAAS,QAAQ,MAAA,CAAO,GAAA,CAAI,UAAU,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAC,CAAA;AAChE,IAAA,IAAI,SAAS,SAAA,EAAW,MAAA,CAAO,GAAA,CAAI,WAAA,EAAa,QAAQ,SAAS,CAAA;AACjE,IAAA,IAAI,SAAS,OAAA,EAAS,MAAA,CAAO,GAAA,CAAI,SAAA,EAAW,QAAQ,OAAO,CAAA;AAC3D,IAAA,MAAM,KAAA,GAAQ,OAAO,QAAA,EAAS;AAC9B,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,CAAA,kBAAA,EAAqB,KAAA,GAAQ,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA,EAAI,EAAE,MAAA,EAAQ,KAAA,EAAO,CAAA;AAAA,EACxF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAmB,OAAA,EAG6B;AACpD,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,IAAA,IAAI,SAAS,UAAA,EAAY,MAAA,CAAO,GAAA,CAAI,YAAA,EAAc,QAAQ,UAAU,CAAA;AACpE,IAAA,IAAI,OAAA,EAAS,OAAO,MAAA,CAAO,GAAA,CAAI,SAAS,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAC,CAAA;AAC7D,IAAA,MAAM,KAAA,GAAQ,OAAO,QAAA,EAAS;AAC9B,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,CAAA,yBAAA,EAA4B,KAAA,GAAQ,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA,EAAI,EAAE,MAAA,EAAQ,KAAA,EAAO,CAAA;AAAA,EAC/F;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBAAqB,UAAA,EAAgE;AACzF,IAAA,OAAO,IAAA,CAAK,QAAQ,CAAA,0BAAA,EAA6B,UAAU,IAAI,EAAE,MAAA,EAAQ,UAAU,CAAA;AAAA,EACrF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,gBAAgB,OAAA,EAgClB;AACF,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,IAAA,IAAI,OAAA,EAAS,eAAA,EAAiB,MAAA,CAAO,GAAA,CAAI,mBAAmB,MAAM,CAAA;AAClE,IAAA,IAAI,SAAS,OAAA,EAAS,MAAA,CAAO,GAAA,CAAI,SAAA,EAAW,QAAQ,OAAO,CAAA;AAC3D,IAAA,MAAM,KAAA,GAAQ,OAAO,QAAA,EAAS;AAC9B,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,CAAA,cAAA,EAAiB,KAAA,GAAQ,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA,EAAI,EAAE,MAAA,EAAQ,KAAA,EAAO,CAAA;AAAA,EACpF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBAAqB,MAAA,EAWvB;AACF,IAAA,OAAO,IAAA,CAAK,QAAQ,0BAAA,EAA4B;AAAA,MAC9C,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM;AAAA,KAC5B,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAA,GAGF;AACF,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,eAAA,EAAgB;AAC1C,IAAA,IAAI,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,IAAA,EAAM,MAAA,EAAQ;AACzC,MAAA,MAAM,QAAA,uBAAe,GAAA,EAAY;AACjC,MAAA,MAAM,UAAoC,EAAC;AAC3C,MAAA,KAAA,MAAW,KAAA,IAAS,MAAA,CAAO,IAAA,CAAK,MAAA,EAAQ;AACtC,QAAA,OAAA,CAAQ,KAAA,CAAM,EAAE,CAAA,GAAI,KAAA,CAAM,eAAA;AAC1B,QAAA,KAAA,CAAM,gBAAgB,OAAA,CAAQ,CAAA,CAAA,KAAK,QAAA,CAAS,GAAA,CAAI,CAAC,CAAC,CAAA;AAAA,MACpD;AACA,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,EAAE,KAAA,EAAO,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA,EAAG,OAAA,EAAQ,EAAE;AAAA,IACzE;AACA,IAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,OAAO,KAAA,EAAM;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,gBAAgB,OAAA,EAKiC;AACrD,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,IAAA,IAAI,SAAS,QAAA,EAAU,MAAA,CAAO,GAAA,CAAI,UAAA,EAAY,QAAQ,QAAQ,CAAA;AAC9D,IAAA,IAAI,OAAA,EAAS,WAAW,MAAA,CAAO,GAAA,CAAI,cAAc,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAC,CAAA;AAC1E,IAAA,IAAI,OAAA,EAAS,QAAQ,MAAA,CAAO,GAAA,CAAI,WAAW,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAC,CAAA;AACjE,IAAA,IAAI,OAAA,EAAS,aAAa,MAAA,EAAW,MAAA,CAAO,IAAI,WAAA,EAAa,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAC,CAAA;AACrF,IAAA,MAAM,KAAA,GAAQ,OAAO,QAAA,EAAS;AAC9B,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,CAAA,2BAAA,EAA8B,KAAA,GAAQ,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA,EAAI,EAAE,MAAA,EAAQ,KAAA,EAAO,CAAA;AAAA,EACjG;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAA,CAAc,UAAA,EAAoB,OAAA,EAKpC;AACF,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,IAAA,IAAI,OAAA,EAAS,QAAQ,MAAA,CAAO,GAAA,CAAI,WAAW,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAC,CAAA;AAC5D,IAAA,MAAM,KAAA,GAAQ,OAAO,QAAA,EAAS;AAC9B,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,CAAA,4BAAA,EAA+B,UAAU,GAAG,KAAA,GAAQ,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA,EAAI,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EAC/G;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,wBAAA,CAAyB,UAAA,EAAoB,IAAA,GAAO,EAAA,EAA4D;AACpH,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,CAAA,4BAAA,EAA+B,UAAU,CAAA,0BAAA,EAA6B,IAAI,CAAA,CAAA,EAAI,EAAE,MAAA,EAAQ,KAAA,EAAO,CAAA;AAAA,EACrH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,wBAAwB,UAAA,EAA0E;AACtG,IAAA,OAAO,IAAA,CAAK,QAAQ,CAAA,4BAAA,EAA+B,UAAU,mBAAmB,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EACnG;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,OAAA,EAAyE;AAC3F,IAAA,OAAO,IAAA,CAAK,QAAQ,yBAAA,EAA2B;AAAA,MAC7C,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,OAAO;AAAA,KAC7B,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,OAAA,EAG8B;AAC9C,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,IAAA,IAAI,SAAS,UAAA,EAAY,MAAA,CAAO,GAAA,CAAI,aAAA,EAAe,QAAQ,UAAU,CAAA;AACrE,IAAA,IAAI,SAAS,MAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,QAAA,EAAU,QAAQ,MAAM,CAAA;AACxD,IAAA,MAAM,KAAA,GAAQ,OAAO,QAAA,EAAS;AAC9B,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,CAAA,uBAAA,EAA0B,KAAA,GAAQ,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA,EAAI,EAAE,MAAA,EAAQ,KAAA,EAAO,CAAA;AAAA,EAC7F;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,OAAA,EAGb;AACF,IAAA,OAAO,IAAA,CAAK,QAAQ,CAAA,wBAAA,EAA2B,OAAO,IAAI,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EAC7E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,OAAA,EAA4E;AAC7F,IAAA,OAAO,IAAA,CAAK,QAAQ,CAAA,wBAAA,EAA2B,OAAO,UAAU,EAAE,MAAA,EAAQ,QAAQ,CAAA;AAAA,EACpF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,OAAA,EAA4E;AAC9F,IAAA,OAAO,IAAA,CAAK,QAAQ,CAAA,wBAAA,EAA2B,OAAO,WAAW,EAAE,MAAA,EAAQ,QAAQ,CAAA;AAAA,EACrF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,OAAA,EAIhB;AACF,IAAA,OAAO,IAAA,CAAK,QAAQ,CAAA,wBAAA,EAA2B,OAAO,WAAW,EAAE,MAAA,EAAQ,QAAQ,CAAA;AAAA,EACrF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe,OAAA,EAIjB;AACF,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,IAAA,IAAI,OAAA,EAAS,QAAQ,MAAA,CAAO,GAAA,CAAI,WAAW,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAC,CAAA;AAC5D,IAAA,MAAM,KAAA,GAAQ,OAAO,QAAA,EAAS;AAC9B,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,CAAA,0BAAA,EAA6B,KAAA,GAAQ,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA,EAAI,EAAE,MAAA,EAAQ,KAAA,EAAO,CAAA;AAAA,EAChG;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBAAA,CAAsB,KAAA,GAAQ,EAAA,EAAgE;AAClG,IAAA,OAAO,IAAA,CAAK,QAAQ,CAAA,qDAAA,EAAwD,KAAK,IAAI,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EACxG;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAA,CAAkB,UAAA,EAAoB,KAAA,GAAQ,EAAA,EAA0D;AAC5G,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,CAAA,4BAAA,EAA+B,UAAU,CAAA,sBAAA,EAAyB,KAAK,CAAA,CAAA,EAAI,EAAE,MAAA,EAAQ,KAAA,EAAO,CAAA;AAAA,EAClH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAiB,UAAA,EAInB;AACF,IAAA,OAAO,IAAA,CAAK,QAAQ,0BAAA,EAA4B;AAAA,MAC9C,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,YAAY;AAAA,KACpC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,gBAAgB,OAAA,EAYlB;AACF,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,CAAA,uBAAA,EAA0B,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,EAAI,EAAE,MAAA,EAAQ,KAAA,EAAO,CAAA;AAAA,EACtF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe,MAAA,EAYjB;AACF,IAAA,OAAO,IAAA,CAAK,QAAQ,CAAA,eAAA,EAAkB,MAAM,IAAI,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAA,CACJ,MAAA,EACA,QAAA,GAAqD,IAAA,EACrD,QAAQ,GAAA,EAYN;AACF,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,CAAA,eAAA,EAAkB,MAAM,CAAA,uBAAA,EAA0B,QAAQ,CAAA,OAAA,EAAU,KAAK,CAAA,CAAA,EAAI,EAAE,MAAA,EAAQ,KAAA,EAAO,CAAA;AAAA,EACpH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAA,CAAc,KAAA,GAAQ,EAAA,EAYxB;AACF,IAAA,OAAO,IAAA,CAAK,QAAQ,CAAA,8BAAA,EAAiC,KAAK,IAAI,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EACjF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,uBAAA,GAQF;AACF,IAAA,OAAO,KAAK,OAAA,CAAQ,8BAAA,EAAgC,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EACvE;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,YAAY,OAAA,EAEoD;AACpE,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,IAAA,IAAI,OAAA,EAAS,aAAa,MAAA,EAAW,MAAA,CAAO,IAAI,UAAA,EAAY,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAC,CAAA;AACpF,IAAA,MAAM,KAAA,GAAQ,OAAO,QAAA,EAAS;AAC9B,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,CAAA,gBAAA,EAAmB,KAAA,GAAQ,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA,EAAI,EAAE,MAAA,EAAQ,KAAA,EAAO,CAAA;AAAA,EACtF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,MAAA,EAIgC;AAClD,IAAA,OAAO,IAAA,CAAK,QAAQ,kBAAA,EAAoB;AAAA,MACtC,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM;AAAA,KAC5B,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,SAAA,EAAoE;AACnF,IAAA,OAAO,IAAA,CAAK,QAAQ,CAAA,iBAAA,EAAoB,SAAS,IAAI,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAA,CAAc,SAAA,EAAmB,OAAA,EAIa;AAClD,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,CAAA,iBAAA,EAAoB,SAAS,CAAA,CAAA,EAAI;AAAA,MACnD,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,OAAO;AAAA,KAC7B,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAmB,SAAA,EAQrB;AACF,IAAA,OAAO,IAAA,CAAK,QAAQ,CAAA,iBAAA,EAAoB,SAAS,aAAa,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EACjF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBAAA,CAAsB,SAAA,EAAmB,QAAA,EASsB;AACnE,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,CAAA,iBAAA,EAAoB,SAAS,CAAA,SAAA,CAAA,EAAa;AAAA,MAC5D,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,QAAQ;AAAA,KAC9B,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,wBAAwB,SAAA,EAA6D;AACzF,IAAA,OAAO,IAAA,CAAK,QAAQ,CAAA,iBAAA,EAAoB,SAAS,YAAY,EAAE,MAAA,EAAQ,QAAQ,CAAA;AAAA,EACjF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,SAAA,EAA+D;AACjF,IAAA,OAAO,IAAA,CAAK,QAAQ,CAAA,iBAAA,EAAoB,SAAS,IAAI,EAAE,MAAA,EAAQ,UAAU,CAAA;AAAA,EAC3E;AACF,CAAA;AAGO,SAAS,sBAAsB,OAAA,EAIlB;AAClB,EAAA,OAAO,IAAI,gBAAgB,OAAO,CAAA;AACpC;;;ACx9DO,SAAS,gBAAA,CACd,aAAA,EACA,OAAA,GAAmC,EAAC,EACZ;AACxB,EAAA,MAAM;AAAA,IACJ,MAAA;AAAA,IACA,WAAA,GAAc,KAAA;AAAA,IACd,eAAA,GAAkB,GAAA;AAAA;AAAA,IAClB,SAAA;AAAA,IACA;AAAA,GACF,GAAI,OAAA;AAEJ,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIC,eAAqC,IAAI,CAAA;AACvE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAGtD,EAAA,MAAM,SAAA,GAAYC,aAAO,qBAAA,CAAsB;AAAA,IAC7C,OAAA,EAAS,SAAA;AAAA,IACT;AAAA,GACD,CAAC,CAAA;AAEF,EAAA,MAAM,YAAA,GAAeC,kBAAY,YAAY;AAC3C,IAAA,IAAI,CAAC,aAAA,EAAe;AAClB,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA;AAAA,IACF;AAEA,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,MAAM,SAAA,CAAU,OAAA,CAAQ,gBAAA,CAAiB,eAAe,MAAM,CAAA;AAC7E,MAAA,IAAI,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,IAAA,EAAM;AACjC,QAAA,UAAA,CAAW,OAAO,IAAI,CAAA;AAAA,MACxB,CAAA,MAAO;AACL,QAAA,QAAA,CAAS,MAAA,CAAO,KAAA,EAAO,OAAA,IAAW,yBAAyB,CAAA;AAAA,MAC7D;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,QAAA,CAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,yBAAyB,CAAA;AAAA,IACzE,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA,EAAG,CAAC,aAAA,EAAe,MAAM,CAAC,CAAA;AAG1B,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,YAAA,EAAa;AAAA,EACf,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAGjB,EAAAA,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,WAAA,IAAe,CAAC,aAAA,EAAe;AAEpC,IAAA,MAAM,QAAA,GAAW,WAAA,CAAY,YAAA,EAAc,eAAe,CAAA;AAC1D,IAAA,OAAO,MAAM,cAAc,QAAQ,CAAA;AAAA,EACrC,GAAG,CAAC,WAAA,EAAa,eAAA,EAAiB,YAAA,EAAc,aAAa,CAAC,CAAA;AAE9D,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,MAAA,EAAQ,OAAA,EAAS,MAAA,IAAU,EAAC;AAAA,IAC5B,QAAA,EAAU,SAAS,QAAA,IAAY,CAAA;AAAA,IAC/B,SAAA,EAAW,SAAS,SAAA,IAAa,CAAA;AAAA,IACjC,gBAAA,EAAkB,SAAS,gBAAA,IAAoB,CAAA;AAAA,IAC/C,SAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAA,EAAS;AAAA,GACX;AACF;ACzEO,SAAS,aAAA,CACd,MAAA,EACA,OAAA,GAAgC,EAAC,EACZ;AACrB,EAAA,MAAM,EAAE,WAAA,GAAc,KAAA,EAAO,kBAAkB,GAAA,EAAO,SAAA,EAAW,UAAS,GAAI,OAAA;AAE9E,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIH,eAA4B,IAAI,CAAA;AAC1D,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,SAAA,GAAYC,aAAO,qBAAA,CAAsB;AAAA,IAC7C,OAAA,EAAS,SAAA;AAAA,IACT;AAAA,GACD,CAAC,CAAA;AAEF,EAAA,MAAM,UAAA,GAAaC,kBAAY,YAAY;AACzC,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,MAAM,SAAA,CAAU,QAAQ,cAAA,CAAe,CAAC,MAAM,CAAC,CAAA;AAC9D,MAAA,IAAI,OAAO,OAAA,IAAW,MAAA,CAAO,QAAQ,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,EAAG;AACxD,QAAA,MAAM,SAAA,GAAY,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA;AACpC,QAAA,QAAA,CAAS;AAAA,UACP,MAAA;AAAA,UACA,OAAO,SAAA,CAAU,KAAA;AAAA,UACjB,WAAW,SAAA,CAAU,SAAA;AAAA,UACrB,kBAAkB,SAAA,CAAU,SAAA;AAAA;AAAA,UAC5B,WAAW,SAAA,CAAU,SAAA;AAAA,UACrB,SAAA,EAAW,CAAA;AAAA;AAAA,UACX,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,SACnC,CAAA;AAAA,MACH,CAAA,MAAO;AACL,QAAA,QAAA,CAAS,MAAA,CAAO,KAAA,EAAO,OAAA,IAAW,uBAAuB,CAAA;AAAA,MAC3D;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,QAAA,CAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,uBAAuB,CAAA;AAAA,IACvE,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAAC,gBAAU,MAAM;AACd,IAAA,UAAA,EAAW;AAAA,EACb,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,EAAAA,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,WAAA,EAAa;AAElB,IAAA,MAAM,QAAA,GAAW,WAAA,CAAY,UAAA,EAAY,eAAe,CAAA;AACxD,IAAA,OAAO,MAAM,cAAc,QAAQ,CAAA;AAAA,EACrC,CAAA,EAAG,CAAC,WAAA,EAAa,eAAA,EAAiB,UAAU,CAAC,CAAA;AAE7C,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAA,EAAS;AAAA,GACX;AACF;AAUO,SAAS,cAAA,CACd,OAAA,EACA,OAAA,GAAgC,EAAC,EACX;AACtB,EAAA,MAAM,EAAE,WAAA,GAAc,KAAA,EAAO,kBAAkB,GAAA,EAAO,SAAA,EAAW,UAAS,GAAI,OAAA;AAE9E,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIH,cAAAA,CAAqC,EAAE,CAAA;AACnE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,SAAA,GAAYC,aAAO,qBAAA,CAAsB;AAAA,IAC7C,OAAA,EAAS,SAAA;AAAA,IACT;AAAA,GACD,CAAC,CAAA;AAEF,EAAA,MAAM,WAAA,GAAcC,kBAAY,YAAY;AAC1C,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AAE1B,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,OAAA,CAAQ,eAAe,OAAO,CAAA;AAC7D,MAAA,IAAI,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,IAAA,EAAM;AACjC,QAAA,MAAM,WAAuC,EAAC;AAC9C,QAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACzB,UAAA,IAAI,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,EAAG;AACpB,YAAA,QAAA,CAAS,GAAG,CAAA,GAAI;AAAA,cACd,MAAA,EAAQ,GAAA;AAAA,cACR,KAAA,EAAO,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,CAAE,KAAA;AAAA,cACxB,SAAA,EAAW,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,CAAE,SAAA;AAAA,cAC5B,gBAAA,EAAkB,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,CAAE,SAAA;AAAA,cACnC,SAAA,EAAW,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,CAAE,SAAA;AAAA,cAC5B,SAAA,EAAW,CAAA;AAAA,cACX,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,aACpC;AAAA,UACF;AAAA,QACF;AACA,QAAA,SAAA,CAAU,QAAQ,CAAA;AAAA,MACpB,CAAA,MAAO;AACL,QAAA,QAAA,CAAS,MAAA,CAAO,KAAA,EAAO,OAAA,IAAW,wBAAwB,CAAA;AAAA,MAC5D;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,QAAA,CAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,wBAAwB,CAAA;AAAA,IACxE,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAAC,gBAAU,MAAM;AACd,IAAA,WAAA,EAAY;AAAA,EACd,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAAA,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,WAAA,EAAa;AAElB,IAAA,MAAM,QAAA,GAAW,WAAA,CAAY,WAAA,EAAa,eAAe,CAAA;AACzD,IAAA,OAAO,MAAM,cAAc,QAAQ,CAAA;AAAA,EACrC,CAAA,EAAG,CAAC,WAAA,EAAa,eAAA,EAAiB,WAAW,CAAC,CAAA;AAE9C,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAA,EAAS;AAAA,GACX;AACF;AC1IA,IAAI,cAAA,GAAyC,IAAA;AAE7C,SAAS,SAAA,GAA6B;AACpC,EAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,IAAA,cAAA,GAAiB,qBAAA,EAAsB;AAAA,EACzC;AACA,EAAA,OAAO,cAAA;AACT;AAKO,SAAS,wBAAwB,KAAA,EAAe;AACrD,EAAA,SAAA,EAAU,CAAE,eAAe,KAAK,CAAA;AAClC;AAKO,SAAS,yBAAA,GAA4B;AAC1C,EAAA,SAAA,GAAY,gBAAA,EAAiB;AAC/B;AAyBO,SAAS,eAAA,CAAgB,OAAA,GAAkC,EAAC,EAA0B;AAC3F,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIH,cAAAA,CAAuB,EAAE,CAAA;AAC7D,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,IAAI,CAAA;AAC/C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,EAAE,UAAU,SAAA,EAAW,MAAA,EAAQ,UAAU,WAAA,GAAc,KAAA,EAAO,eAAA,GAAkB,GAAA,EAAM,GAAI,OAAA;AAEhG,EAAA,MAAM,eAAA,GAAkBE,kBAAY,YAAY;AAC9C,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,EAAU,CAAE,eAAA,CAAgB,EAAE,QAAA,EAAU,SAAA,EAAW,MAAA,EAAQ,QAAA,EAAU,CAAA;AAC1F,MAAA,IAAI,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,IAAA,EAAM,UAAA,EAAY;AAC7C,QAAA,aAAA,CAAc,MAAA,CAAO,KAAK,UAAU,CAAA;AAAA,MACtC,CAAA,MAAO;AACL,QAAA,QAAA,CAAS,MAAA,CAAO,KAAA,EAAO,OAAA,IAAW,4BAA4B,CAAA;AAAA,MAChE;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,QAAA,CAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,eAAe,CAAA;AAAA,IAC/D,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,QAAA,EAAU,SAAA,EAAW,MAAA,EAAQ,QAAQ,CAAC,CAAA;AAE1C,EAAAC,gBAAU,MAAM;AACd,IAAA,eAAA,EAAgB;AAAA,EAClB,CAAA,EAAG,CAAC,eAAe,CAAC,CAAA;AAEpB,EAAAA,gBAAU,MAAM;AACd,IAAA,IAAI,WAAA,IAAe,kBAAkB,CAAA,EAAG;AACtC,MAAA,MAAM,QAAA,GAAW,WAAA,CAAY,eAAA,EAAiB,eAAe,CAAA;AAC7D,MAAA,OAAO,MAAM,cAAc,QAAQ,CAAA;AAAA,IACrC;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,eAAA,EAAiB,eAAe,CAAC,CAAA;AAElD,EAAA,OAAO,EAAE,UAAA,EAAY,SAAA,EAAW,KAAA,EAAO,SAAS,eAAA,EAAgB;AAClE;AAcO,SAAS,cACd,UAAA,EACA,OAAA,GAAmD,CAAC,aAAA,EAAe,QAAQ,CAAA,EACtD;AACrB,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIH,eAA4B,IAAI,CAAA;AAChE,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,cAAAA,CAA0B,EAAE,CAAA;AAClE,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,cAAAA,CAAyB,EAAE,CAAA;AAC/D,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,IAAI,CAAA;AAC/C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,aAAA,GAAgBE,kBAAY,YAAY;AAC5C,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA;AAAA,IACF;AAEA,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,MAAM,SAAA,EAAU,CAAE,aAAA,CAAc,YAAY,OAAO,CAAA;AAClE,MAAA,IAAI,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,IAAA,EAAM;AACjC,QAAA,WAAA,CAAY,MAAA,CAAO,KAAK,QAAQ,CAAA;AAChC,QAAA,cAAA,CAAe,MAAA,CAAO,IAAA,CAAK,WAAA,IAAe,EAAE,CAAA;AAC5C,QAAA,aAAA,CAAc,MAAA,CAAO,IAAA,CAAK,UAAA,IAAc,EAAE,CAAA;AAAA,MAC5C,CAAA,MAAO;AACL,QAAA,QAAA,CAAS,MAAA,CAAO,KAAA,EAAO,OAAA,IAAW,0BAA0B,CAAA;AAAA,MAC9D;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,QAAA,CAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,eAAe,CAAA;AAAA,IAC/D,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,UAAA,EAAY,QAAQ,IAAA,CAAK,GAAG,CAAC,CAAC,CAAA;AAElC,EAAAC,gBAAU,MAAM;AACd,IAAA,aAAA,EAAc;AAAA,EAChB,CAAA,EAAG,CAAC,aAAa,CAAC,CAAA;AAElB,EAAA,OAAO,EAAE,QAAA,EAAU,WAAA,EAAa,YAAY,SAAA,EAAW,KAAA,EAAO,SAAS,aAAA,EAAc;AACvF;AA2BO,SAAS,WAAA,CAAY,OAAA,GAA8B,EAAC,EAAsB;AAC/E,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIH,cAAAA,CAAoB,EAAE,CAAA;AAClD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,IAAI,CAAA;AAC/C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,EAAE,UAAA,EAAY,MAAA,EAAQ,cAAc,IAAA,EAAM,eAAA,GAAkB,KAAM,GAAI,OAAA;AAE5E,EAAA,MAAM,WAAA,GAAcE,kBAAY,YAAY;AAC1C,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,EAAU,CAAE,YAAY,EAAE,UAAA,EAAY,QAAQ,CAAA;AACnE,MAAA,IAAI,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,IAAA,EAAM,MAAA,EAAQ;AACzC,QAAA,SAAA,CAAU,MAAA,CAAO,KAAK,MAAM,CAAA;AAAA,MAC9B,CAAA,MAAO;AACL,QAAA,QAAA,CAAS,MAAA,CAAO,KAAA,EAAO,OAAA,IAAW,wBAAwB,CAAA;AAAA,MAC5D;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,QAAA,CAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,eAAe,CAAA;AAAA,IAC/D,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA,EAAG,CAAC,UAAA,EAAY,MAAM,CAAC,CAAA;AAEvB,EAAAC,gBAAU,MAAM;AACd,IAAA,WAAA,EAAY;AAAA,EACd,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAAA,gBAAU,MAAM;AACd,IAAA,IAAI,WAAA,IAAe,kBAAkB,CAAA,EAAG;AACtC,MAAA,MAAM,QAAA,GAAW,WAAA,CAAY,WAAA,EAAa,eAAe,CAAA;AACzD,MAAA,OAAO,MAAM,cAAc,QAAQ,CAAA;AAAA,IACrC;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,eAAA,EAAiB,WAAW,CAAC,CAAA;AAE9C,EAAA,MAAM,WAAA,GAAcD,iBAAAA,CAAY,OAAO,OAAA,KAAkC;AACvE,IAAA,MAAM,MAAA,GAAS,MAAM,SAAA,EAAU,CAAE,cAAc,OAAO,CAAA;AACtD,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,MAAM,WAAA,EAAY;AAAA,IACpB;AACA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAA,MAAM,UAAA,GAAaA,iBAAAA,CAAY,OAAO,OAAA,KAAoB;AACxD,IAAA,MAAM,MAAA,GAAS,MAAM,SAAA,EAAU,CAAE,aAAa,OAAO,CAAA;AACrD,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,MAAM,WAAA,EAAY;AAAA,IACpB;AACA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAA,MAAM,WAAA,GAAcA,iBAAAA,CAAY,OAAO,OAAA,KAAoB;AACzD,IAAA,MAAM,MAAA,GAAS,MAAM,SAAA,EAAU,CAAE,cAAc,OAAO,CAAA;AACtD,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,MAAM,WAAA,EAAY;AAAA,IACpB;AACA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAA,MAAM,WAAA,GAAcA,iBAAAA,CAAY,OAAO,OAAA,KAAoB;AACzD,IAAA,MAAM,MAAA,GAAS,MAAM,SAAA,EAAU,CAAE,cAAc,OAAO,CAAA;AACtD,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,MAAM,WAAA,EAAY;AAAA,IACpB;AACA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAA,EAAS,WAAA;AAAA,IACT,WAAA;AAAA,IACA,UAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACF;AACF;AAkBO,SAAS,cAAA,CAAe,cAAc,IAAA,EAA4B;AACvE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIF,eAAoC,IAAI,CAAA;AAC1E,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,cAAAA,CAA8B,EAAE,CAAA;AACtE,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,cAAAA,CAAoB,EAAE,CAAA;AAC9D,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,IAAI,CAAA;AAC/C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,cAAA,GAAiBE,kBAAY,YAAY;AAC7C,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,EAAU,CAAE,eAAe,CAAC,aAAA,EAAe,QAAQ,CAAC,CAAA;AACzE,MAAA,IAAI,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,IAAA,EAAM;AACjC,QAAA,YAAA,CAAa,MAAA,CAAO,KAAK,SAAS,CAAA;AAClC,QAAA,cAAA,CAAe,MAAA,CAAO,IAAA,CAAK,WAAA,IAAe,EAAE,CAAA;AAC5C,QAAA,eAAA,CAAgB,MAAA,CAAO,IAAA,CAAK,MAAA,IAAU,EAAE,CAAA;AAAA,MAC1C,CAAA,MAAO;AACL,QAAA,QAAA,CAAS,MAAA,CAAO,KAAA,EAAO,OAAA,IAAW,2BAA2B,CAAA;AAAA,MAC/D;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,QAAA,CAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,eAAe,CAAA;AAAA,IAC/D,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAAC,gBAAU,MAAM;AACd,IAAA,cAAA,EAAe;AAAA,EACjB,CAAA,EAAG,CAAC,cAAc,CAAC,CAAA;AAEnB,EAAAA,gBAAU,MAAM;AACd,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,MAAM,QAAA,GAAW,WAAA,CAAY,cAAA,EAAgB,GAAK,CAAA;AAClD,MAAA,OAAO,MAAM,cAAc,QAAQ,CAAA;AAAA,IACrC;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,cAAc,CAAC,CAAA;AAEhC,EAAA,OAAO,EAAE,SAAA,EAAW,WAAA,EAAa,cAAc,SAAA,EAAW,KAAA,EAAO,SAAS,cAAA,EAAe;AAC3F;AAgBO,SAAS,eAAA,CACd,OAAA,GAAoB,CAAC,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAM,CAAA,EAC7E,cAAc,IAAA,EACS;AACvB,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIH,cAAAA,CAA+D,EAAE,CAAA;AAC7F,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,IAAI,CAAA;AAC/C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,WAAA,GAAcE,kBAAY,YAAY;AAC1C,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,EAAU,CAAE,eAAe,OAAO,CAAA;AACvD,MAAA,IAAI,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,IAAA,EAAM;AACjC,QAAA,SAAA,CAAU,OAAO,IAAI,CAAA;AAAA,MACvB,CAAA,MAAO;AACL,QAAA,QAAA,CAAS,MAAA,CAAO,KAAA,EAAO,OAAA,IAAW,wBAAwB,CAAA;AAAA,MAC5D;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,QAAA,CAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,eAAe,CAAA;AAAA,IAC/D,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAC,CAAC,CAAA;AAEtB,EAAAC,gBAAU,MAAM;AACd,IAAA,WAAA,EAAY;AAAA,EACd,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAAA,gBAAU,MAAM;AACd,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,MAAM,QAAA,GAAW,WAAA,CAAY,WAAA,EAAa,IAAK,CAAA;AAC/C,MAAA,OAAO,MAAM,cAAc,QAAQ,CAAA;AAAA,IACrC;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,WAAW,CAAC,CAAA;AAE7B,EAAA,OAAO,EAAE,MAAA,EAAQ,SAAA,EAAW,KAAA,EAAO,SAAS,WAAA,EAAY;AAC1D;AAsCO,SAAS,YAAA,GAAmC;AACjD,EAAA,MAAM,gBAAA,GAAmB,eAAA,CAAgB,EAAE,WAAA,EAAa,MAAM,CAAA;AAC9D,EAAA,MAAM,YAAA,GAAe,WAAA,CAAY,EAAE,WAAA,EAAa,MAAM,CAAA;AACtD,EAAA,MAAM,eAAA,GAAkB,eAAe,IAAI,CAAA;AAC3C,EAAA,MAAM,eAAe,eAAA,EAAgB;AAErC,EAAA,MAAM,UAAA,GAAaD,kBAAY,YAAY;AACzC,IAAA,MAAM,QAAQ,GAAA,CAAI;AAAA,MAChB,iBAAiB,OAAA,EAAQ;AAAA,MACzB,aAAa,OAAA,EAAQ;AAAA,MACrB,gBAAgB,OAAA,EAAQ;AAAA,MACxB,aAAa,OAAA;AAAQ,KACtB,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,gBAAA,CAAiB,OAAA,EAAS,YAAA,CAAa,SAAS,eAAA,CAAgB,OAAA,EAAS,YAAA,CAAa,OAAO,CAAC,CAAA;AAElG,EAAA,MAAM,KAAA,GAAQE,cAAQ,MAAM;AAC1B,IAAA,OAAO,iBAAiB,KAAA,IAAS,YAAA,CAAa,KAAA,IAAS,eAAA,CAAgB,SAAS,YAAA,CAAa,KAAA;AAAA,EAC/F,CAAA,EAAG,CAAC,gBAAA,CAAiB,KAAA,EAAO,YAAA,CAAa,OAAO,eAAA,CAAgB,KAAA,EAAO,YAAA,CAAa,KAAK,CAAC,CAAA;AAE1F,EAAA,OAAO;AAAA,IACL,YAAY,gBAAA,CAAiB,UAAA;AAAA,IAC7B,mBAAmB,gBAAA,CAAiB,SAAA;AAAA,IACpC,QAAQ,YAAA,CAAa,MAAA;AAAA,IACrB,eAAe,YAAA,CAAa,SAAA;AAAA,IAC5B,WAAW,eAAA,CAAgB,SAAA;AAAA,IAC3B,kBAAkB,eAAA,CAAgB,SAAA;AAAA,IAClC,QAAQ,YAAA,CAAa,MAAA;AAAA,IACrB,aAAa,YAAA,CAAa,WAAA;AAAA,IAC1B,YAAY,YAAA,CAAa,UAAA;AAAA,IACzB,aAAa,YAAA,CAAa,WAAA;AAAA,IAC1B,aAAa,YAAA,CAAa,WAAA;AAAA,IAC1B,UAAA;AAAA,IACA;AAAA,GACF;AACF;AAqDO,SAAS,WAAA,CAAY,kBAAkB,KAAA,EAA0B;AACtE,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIJ,cAAAA,CAAoB,EAAE,CAAA;AAClD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,cAAAA,CAAiC,EAAE,CAAA;AACvE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,IAAI,CAAA;AAC/C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,WAAA,GAAcE,kBAAY,YAAY;AAC1C,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,MAAM,SAAA,GAAY,eAAA,CAAgB,EAAE,iBAAiB,CAAA;AACpE,MAAA,IAAI,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,IAAA,EAAM;AACjC,QAAA,SAAA,CAAU,MAAA,CAAO,IAAA,CAAK,MAAA,IAAU,EAAE,CAAA;AAClC,QAAA,aAAA,CAAc,MAAA,CAAO,IAAA,CAAK,UAAA,IAAc,EAAE,CAAA;AAAA,MAC5C,CAAA,MAAO;AACL,QAAA,QAAA,CAAS,MAAA,CAAO,KAAA,EAAO,OAAA,IAAW,wBAAwB,CAAA;AAAA,MAC5D;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,QAAA,CAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,eAAe,CAAA;AAAA,IAC/D,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA,EAAG,CAAC,eAAe,CAAC,CAAA;AAEpB,EAAAC,gBAAU,MAAM;AACd,IAAA,WAAA,EAAY;AAAA,EACd,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAA,OAAO,EAAE,MAAA,EAAQ,UAAA,EAAY,SAAA,EAAW,KAAA,EAAO,SAAS,WAAA,EAAY;AACtE;AAcO,SAAS,WAAW,OAAA,EAA+C;AACxE,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIH,eAAyB,IAAI,CAAA;AACvD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,eAA+B,IAAI,CAAA;AAC/D,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,IAAI,CAAA;AAC/C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,UAAA,GAAaE,kBAAY,YAAY;AACzC,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA;AAAA,IACF;AAEA,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,MAAM,SAAA,GAAY,eAAA,CAAgB,EAAE,SAAS,CAAA;AAC5D,MAAA,IAAI,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,IAAA,EAAM,KAAA,EAAO;AACxC,QAAA,QAAA,CAAS,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,MAC5B,CAAA,MAAO;AACL,QAAA,QAAA,CAAS,MAAA,CAAO,KAAA,EAAO,OAAA,IAAW,iBAAiB,CAAA;AAAA,MACrD;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,QAAA,CAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,eAAe,CAAA;AAAA,IAC/D,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAAC,gBAAU,MAAM;AACd,IAAA,UAAA,EAAW;AAAA,EACb,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,EAAA,MAAM,eAAA,GAAkBD,iBAAAA,CAAY,OAAO,MAAA,EAAgB,SAAA,KAAqD;AAC9G,IAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AAErB,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,EAAU,CAAE,qBAAqB,EAAE,OAAA,EAAS,MAAA,EAAQ,SAAA,EAAW,CAAA;AACpF,MAAA,IAAI,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,IAAA,EAAM;AACjC,QAAA,SAAA,CAAU,OAAO,IAAI,CAAA;AACrB,QAAA,OAAO,MAAA,CAAO,IAAA;AAAA,MAChB;AACA,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,QAAA,CAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,4BAA4B,CAAA;AAC1E,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,OAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,WAAW,KAAA,EAAO,OAAA,EAAS,YAAY,eAAA,EAAgB;AACjF;AAWO,SAAS,sBAAA,GAAuD;AACrE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIF,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,YAAYE,iBAAAA,CAAY,OAC5B,OAAA,EACA,MAAA,EACA,WACA,MAAA,KAC6C;AAC7C,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AAEF,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,EAAU,CAAE,aAAA,CAAc;AAAA,QAC7C,UAAA,EAAY,OAAA;AAAA,QACZ,MAAA;AAAA,QACA,cAAA,EAAgB,SAAA;AAAA,QAChB,aAAA,EAAe;AAAA,OAChB,CAAA;AACD,MAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,QAAA,QAAA,CAAS,MAAA,CAAO,KAAA,EAAO,OAAA,IAAW,qBAAqB,CAAA;AAAA,MACzD;AACA,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,QAAA,GAAW,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,qBAAA;AACtD,MAAA,QAAA,CAAS,QAAQ,CAAA;AACjB,MAAA,OAAO,EAAE,SAAS,KAAA,EAAO,KAAA,EAAO,EAAE,IAAA,EAAM,oBAAA,EAAsB,OAAA,EAAS,QAAA,EAAS,EAAE;AAAA,IACpF,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO,EAAE,SAAA,EAAW,SAAA,EAAW,KAAA,EAAM;AACvC;;;ACzmBA,UAAA,EAAA;AAWA,IAAI,iBAAA,GAAmC,IAAA;AACvC,IAAI,eAAA,GAA0B,sBAAA;AAGvB,SAAS,oBAAoB,KAAA,EAAqB;AACvD,EAAA,iBAAA,GAAoB,KAAA;AACtB;AAGO,SAAS,qBAAA,GAA8B;AAC5C,EAAA,iBAAA,GAAoB,IAAA;AACtB;AAGO,SAAS,kBAAkB,GAAA,EAAmB;AACnD,EAAA,eAAA,GAAkB,GAAA;AACpB;AAIA,eAAe,QAAA,CAAY,MAAc,OAAA,EAA0C;AACjF,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,cAAA,EAAgB;AAAA,KAClB;AACA,IAAA,IAAI,iBAAA,EAAmB;AACrB,MAAA,OAAA,CAAQ,eAAe,CAAA,GAAI,CAAA,OAAA,EAAU,iBAAiB,CAAA,CAAA;AAAA,IACxD;AACA,IAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,CAAA,EAAG,eAAe,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,EAAE,GAAG,OAAA,EAAS,OAAA,EAAS,CAAA;AAC5E,IAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAI,OAAO,IAAA;AACpB,IAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,IAAA,OAAO,MAAM,IAAA,IAAQ,IAAA;AAAA,EACvB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAWO,SAAS,cAAc,OAAA,EAA6D;AACzF,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIF,eAAsB,mBAAmB,CAAA;AACnE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,UAAA,GAAaE,kBAAY,YAAY;AACzC,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAA2B,kBAAkB,CAAA;AAChE,MAAA,IAAI,MAAM,KAAA,EAAO;AACf,QAAA,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,MAAY;AAAA,UACnC,EAAA,EAAI,CAAA,CAAE,IAAA,IAAQ,CAAA,CAAE,EAAA;AAAA,UAChB,OAAA,EAAS,CAAA,WAAA,EAAc,CAAA,CAAE,IAAA,IAAQ,EAAE,EAAE,CAAA,CAAA;AAAA,UACrC,cAAA,EAAgB,CAAA,WAAA,EAAc,CAAA,CAAE,IAAA,IAAQ,EAAE,EAAE,CAAA,KAAA,CAAA;AAAA,UAC5C,UAAA,EAAY,CAAA,CAAE,UAAA,KAAe,CAAA,CAAE,IAAA,KAAS,aAAa,GAAA,GAAO,CAAA,CAAE,IAAA,KAAS,SAAA,GAAY,GAAA,GAAO,GAAA,CAAA;AAAA,UAC1F,SAAA,EAAW,CAAA,CAAE,SAAA,IAAa,CAAA,CAAE,UAAA,IAAc,CAAA;AAAA,UAC1C,WAAA,EAAa,EAAE,WAAA,IAAe,CAAA;AAAA,UAC9B,KAAA,EAAO,EAAE,IAAA,KAAS,UAAA,GAAa,YAAY,CAAA,CAAE,IAAA,KAAS,YAAY,SAAA,GAAY,SAAA;AAAA,UAC9E,KAAA,EAAO,EAAE,KAAA,IAAS,CAAA;AAAA,UAClB,MAAA,EAAQ,EAAE,MAAA,IAAU,CAAA;AAAA,UACpB,UAAA,EAAY,EAAE,UAAA,IAAc,CAAA;AAAA,UAC5B,UAAA,EAAY,EAAE,UAAA,IAAc,CAAA;AAAA,UAC5B,YAAA,EAAc,EAAE,YAAA,IAAgB,CAAA;AAAA,UAChC,aAAA,EAAe,EAAE,aAAA,IAAiB,CAAA;AAAA,UAClC,gBAAA,EAAkB,EAAE,gBAAA,IAAoB,CAAA;AAAA,UACxC,iBAAA,EAAmB,EAAE,iBAAA,IAAqB,CAAA;AAAA,UAC1C,WAAA,EAAa,CAAA,CAAE,WAAA,IAAe,IAAA,CAAK,GAAA;AAAI,UACvC,CAAC,CAAA;AAAA,MACL;AACA,MAAA,QAAA,CAAS,IAAI,CAAA;AAAA,IACf,SAAS,GAAA,EAAK;AACZ,MAAA,QAAA,CAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,uBAAuB,CAAA;AAAA,IACvE,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAAC,gBAAU,MAAM;AACd,IAAA,UAAA,EAAW;AACX,IAAA,IAAI,SAAS,eAAA,EAAiB;AAC5B,MAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,UAAA,EAAY,OAAA,CAAQ,eAAe,CAAA;AAC7D,MAAA,OAAO,MAAM,cAAc,KAAK,CAAA;AAAA,IAClC;AAAA,EACF,CAAA,EAAG,CAAC,UAAA,EAAY,OAAA,EAAS,eAAe,CAAC,CAAA;AAEzC,EAAA,OAAO,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,SAAS,UAAA,EAAW;AACxD;AAmBO,SAAS,oBAAoB,OAAA,EAAmE;AACrG,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIH,cAAAA,CAA4B,EAAE,CAAA;AACpE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,gBAAA,GAAmBE,kBAAY,YAAY;AAC/C,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAiC,wBAAwB,CAAA;AAC5E,MAAA,IAAI,MAAM,WAAA,EAAa;AACrB,QAAA,cAAA,CAAe,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,aAAa,CAAC,CAAA;AAAA,MACpD;AACA,MAAA,QAAA,CAAS,IAAI,CAAA;AAAA,IACf,CAAA,CAAA,MAAQ;AACN,MAAA,QAAA,CAAS,6BAA6B,CAAA;AAAA,IACxC,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,gBAAA,GAAmBA,iBAAAA,CAAY,OAAO,MAAA,KAEL;AACrC,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAA8B,wBAAA,EAA0B;AAAA,QACzE,MAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM;AAAA,OAC5B,CAAA;AACD,MAAA,IAAI,MAAM,UAAA,EAAY;AACpB,QAAA,MAAMG,IAAAA,GAAM,aAAA,CAAc,IAAA,CAAK,UAAU,CAAA;AACzC,QAAA,cAAA,CAAe,CAAA,IAAA,KAAQ,CAACA,IAAAA,EAAK,GAAG,IAAI,CAAC,CAAA;AACrC,QAAA,OAAOA,IAAAA;AAAA,MACT;AAEA,MAAA,MAAM,GAAA,GAAM,sBAAsB,MAAM,CAAA;AACxC,MAAA,cAAA,CAAe,CAAA,IAAA,KAAQ,CAAC,GAAA,EAAK,GAAG,IAAI,CAAC,CAAA;AACrC,MAAA,OAAO,GAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,MAAM,GAAA,GAAM,sBAAsB,MAAM,CAAA;AACxC,MAAA,cAAA,CAAe,CAAA,IAAA,KAAQ,CAAC,GAAA,EAAK,GAAG,IAAI,CAAC,CAAA;AACrC,MAAA,OAAO,GAAA;AAAA,IACT,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,gBAAA,GAAmBH,iBAAAA,CAAY,OAAO,YAAA,KAA2C;AACrF,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,CAAA,uBAAA,EAA0B,YAAY,WAAW,EAAE,MAAA,EAAQ,QAAQ,CAAA;AAClF,MAAA,cAAA,CAAe,UAAQ,IAAA,CAAK,GAAA;AAAA,QAAI,CAAA,GAAA,KAC9B,IAAI,EAAA,KAAO,YAAA,GAAe,EAAE,GAAG,GAAA,EAAK,MAAA,EAAQ,UAAA,EAAoB,GAAI;AAAA,OACrE,CAAA;AACD,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAAC,gBAAU,MAAM;AACd,IAAA,gBAAA,EAAiB;AACjB,IAAA,IAAI,SAAS,eAAA,EAAiB;AAC5B,MAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,gBAAA,EAAkB,OAAA,CAAQ,eAAe,CAAA;AACnE,MAAA,OAAO,MAAM,cAAc,KAAK,CAAA;AAAA,IAClC;AAAA,EACF,CAAA,EAAG,CAAC,gBAAA,EAAkB,OAAA,EAAS,eAAe,CAAC,CAAA;AAE/C,EAAA,MAAM,gBAAA,GAAmBC,cAAQ,MAAM;AACrC,IAAA,MAAM,SAAS,WAAA,CAAY,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,WAAW,QAAQ,CAAA;AAC5D,IAAA,OAAO;AAAA,MACL,aAAA,EAAe,OAAO,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,CAAA,CAAE,MAAA,EAAQ,CAAC,CAAA;AAAA,MACtD,UAAA,EAAY,OAAO,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,CAAA,CAAE,YAAA,EAAc,CAAC,CAAA;AAAA,MACzD,WAAA,EAAa,OAAO,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,CAAA,CAAE,MAAA,EAAQ,CAAC,CAAA;AAAA,MACpD,aAAa,MAAA,CAAO;AAAA,KACtB;AAAA,EACF,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAA,OAAO,EAAE,aAAa,SAAA,EAAW,KAAA,EAAO,kBAAkB,gBAAA,EAAkB,OAAA,EAAS,kBAAkB,gBAAA,EAAiB;AAC1H;AAcO,SAAS,mBAAmB,OAAA,EAA0D;AAC3F,EAAA,MAAM,OAAA,GAAU,SAAS,OAAA,IAAW,GAAA;AACpC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIJ,cAAAA,CAA0B,EAAE,CAAA;AACpD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,cAAAA,CAAiC,EAAE,CAAA;AACjE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAS,EAAE,QAAA,EAAU,CAAA,EAAG,WAAA,EAAa,CAAA,EAAG,SAAA,EAAW,CAAA,EAAG,SAAA,EAAW,GAAG,CAAA;AAC9F,EAAA,MAAM,SAAA,GAAYC,aAAY,IAAI,CAAA;AAElC,EAAA,MAAM,SAAA,GAAYC,kBAAY,MAAM;AAClC,IAAA,IAAI,CAAC,UAAU,OAAA,EAAS;AACtB,MAAA,IAAI;AACF,QAAA,MAAM,EAAE,qBAAA,EAAAI,sBAAAA,EAAsB,IAAI,0BAAA,EAAA,EAAA,YAAA,CAAA,6BAAA,CAAA,CAAA;AAClC,QAAA,SAAA,CAAU,OAAA,GAAUA,sBAAAA;AAAA,MACtB,CAAA,CAAA,MAAQ;AAAA,MAAsB;AAAA,IAChC;AACA,IAAA,OAAO,SAAA,CAAU,OAAA;AAAA,EACnB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,KAAA,GAAQJ,kBAAY,MAAM;AAC9B,IAAA,MAAM,SAAS,SAAA,EAAU;AACzB,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,IAAI,CAAC,MAAA,CAAO,SAAA,EAAU,SAAU,KAAA,EAAM;AACtC,IAAA,YAAA,CAAa,IAAI,CAAA;AAAA,EACnB,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,MAAM,IAAA,GAAOA,kBAAY,MAAM;AAC7B,IAAA,MAAM,SAAS,SAAA,EAAU;AACzB,IAAA,IAAI,MAAA,SAAe,IAAA,EAAK;AACxB,IAAA,YAAA,CAAa,KAAK,CAAA;AAAA,EACpB,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,MAAM,SAAA,GAAYA,kBAAY,MAAM;AAClC,IAAA,OAAA,CAAQ,EAAE,CAAA;AACV,IAAA,UAAA,CAAW,EAAE,CAAA;AAAA,EACf,CAAA,EAAG,EAAE,CAAA;AAEL,EAAAC,gBAAU,MAAM;AACd,IAAA,MAAM,SAAS,SAAA,EAAU;AACzB,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,KAAA,CAAM,CAAC,KAAA,KAAyB;AACtD,MAAA,OAAA,CAAQ,CAAA,IAAA,KAAQ;AACd,QAAA,MAAM,IAAA,GAAO,CAAC,GAAG,IAAA,EAAM,KAAK,CAAA;AAC5B,QAAA,OAAO,KAAK,MAAA,GAAS,OAAA,GAAU,KAAK,KAAA,CAAM,CAAC,OAAO,CAAA,GAAI,IAAA;AAAA,MACxD,CAAC,CAAA;AACD,MAAA,MAAM,CAAA,GAAI,OAAO,QAAA,EAAS;AAC1B,MAAA,QAAA,CAAS,EAAE,QAAA,EAAU,CAAA,CAAE,QAAA,EAAU,WAAA,EAAa,CAAA,CAAE,WAAA,EAAa,SAAA,EAAW,CAAA,CAAE,SAAA,EAAW,SAAA,EAAW,CAAA,CAAE,WAAW,CAAA;AAAA,IAC/G,CAAC,CAAA;AAED,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,iBAAA,CAAkB,CAAC,EAAA,KAA6B;AACrE,MAAA,UAAA,CAAW,CAAA,IAAA,KAAQ,CAAC,GAAG,IAAA,CAAK,MAAM,IAAI,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,IAC9C,CAAC,CAAA;AAED,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,EAAS;AACT,MAAA,OAAA,EAAQ;AAAA,IACV,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,SAAA,EAAW,OAAO,CAAC,CAAA;AAEvB,EAAA,OAAO,EAAE,MAAM,gBAAA,EAAkB,OAAA,EAAS,WAAW,KAAA,EAAO,KAAA,EAAO,MAAM,SAAA,EAAU;AACrF;AAWO,SAAS,gBAAA,GAA2C;AACzD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIH,eAA0D,EAAE,QAAA,EAAU,EAAC,EAAG,SAAS,EAAC,EAAG,SAAA,EAAW,IAAI,CAAA;AACxI,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,cAAAA,CAAiC,EAAE,CAAA;AAC3E,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,eAAS,KAAK,CAAA;AAExD,EAAA,MAAM,UAAA,GAAaE,kBAAY,MAAM;AACnC,IAAA,IAAI,aAAA,EAAe;AACnB,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,sBAAA,EAAAL,uBAAAA,EAAuB,IAAI,2BAAA,EAAA,EAAA,YAAA,CAAA,8BAAA,CAAA,CAAA;AACnC,MAAA,MAAM,GAAA,GAAMA,wBAAuB,WAAA,EAAY;AAC/C,MAAA,YAAA,CAAa,GAAA,CAAI,sBAAsB,CAAA;AACvC,MAAA,eAAA,CAAgB,GAAA,CAAI,yBAAyB,CAAA;AAC7C,MAAA,gBAAA,CAAiB,IAAI,CAAA;AAAA,IACvB,CAAA,CAAA,MAAQ;AAAA,IAAsB;AAAA,EAChC,CAAA,EAAG,CAAC,aAAa,CAAC,CAAA;AAElB,EAAA,OAAO,EAAE,SAAA,EAAW,YAAA,EAAc,aAAA,EAAe,UAAA,EAAW;AAC9D;AAkBO,SAAS,gBAAgB,OAAA,EAGN;AACxB,EAAA,MAAM,QAAQ,aAAA,CAAc,EAAE,eAAA,EAAiB,OAAA,EAAS,qBAAqB,CAAA;AAC7E,EAAA,MAAM,cAAc,mBAAA,CAAoB,EAAE,eAAA,EAAiB,OAAA,EAAS,2BAA2B,CAAA;AAC/F,EAAA,MAAM,aAAa,kBAAA,EAAmB;AACtC,EAAA,MAAM,WAAW,gBAAA,EAAiB;AAElC,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,WAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAA;AAAA,IACA,YAAA,EAAc,mBAAA;AAAA,IACd,KAAA,EAAO,WAAA;AAAA,IACP,eAAe,CAAA,UAAA,EAAA,EAAA,YAAA,CAAA,aAAA,CAAA,EAA0B,oBAAA;AAAA,IACzC,cAAc,CAAA,UAAA,EAAA,EAAA,YAAA,CAAA,aAAA,CAAA,EAA0B,mBAAA;AAAA,IACxC,sBAAA;AAAA,IACA,cAAA,EAAgB;AAAA,GAClB;AACF;AAIA,SAAS,cAAc,GAAA,EAA2B;AAChD,EAAA,MAAM,SAAA,GAAY,GAAA,CAAI,SAAA,IAAa,GAAA,CAAI,UAAA,IAAc,EAAA;AACrD,EAAA,MAAM,WAAA,GAAc,oBAAoB,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,IAAA,KAAS,SAAS,CAAA,IAAK,mBAAA,CAAoB,CAAC,CAAA;AAChG,EAAA,MAAM,MAAA,GAAS,OAAO,GAAA,CAAI,MAAA,KAAW,QAAA,GAAW,WAAW,GAAA,CAAI,MAAM,CAAA,GAAK,GAAA,CAAI,MAAA,IAAU,CAAA;AACxF,EAAA,MAAM,MAAA,GAAS,uBAAuB,MAAM,CAAA;AAE5C,EAAA,OAAO;AAAA,IACL,IAAI,GAAA,CAAI,EAAA;AAAA,IACR,MAAA,EAAQ,GAAA,CAAI,MAAA,IAAU,GAAA,CAAI,OAAA;AAAA,IAC1B,MAAA;AAAA,IACA,YAAA,EAAc,GAAA,CAAI,YAAA,IAAgB,GAAA,CAAI,aAAA,IAAiB,MAAA;AAAA,IACvD,MAAA,EAAQ,IAAI,MAAA,IAAU,CAAA;AAAA,IACtB,MAAA,EAAQ,IAAI,MAAA,IAAU,QAAA;AAAA,IACtB,aAAA,EAAe,GAAA,CAAI,aAAA,IAAiB,GAAA,CAAI,kBAAkB,EAAC;AAAA,IAC3D,SAAA;AAAA,IACA,WAAA;AAAA,IACA,OAAA,EAAS,GAAA,CAAI,OAAA,IAAW,WAAA,CAAY,OAAA;AAAA,IACpC,cAAA,EAAgB,GAAA,CAAI,cAAA,IAAkB,WAAA,CAAY,cAAA;AAAA,IAClD,SAAA,EAAW,IAAI,SAAA,IAAa,GAAA,CAAI,+BAAc,IAAI,IAAA,IAAO,WAAA,EAAY;AAAA,IACrE,OAAA,EAAS,GAAA,CAAI,OAAA,IAAW,GAAA,CAAI,QAAA,IAAY,EAAA;AAAA,IACxC,cAAA,EAAgB,GAAA,CAAI,cAAA,IAAkB,MAAA,CAAO,cAAA;AAAA,IAC7C,iBAAA,EAAmB,GAAA,CAAI,iBAAA,IAAqB,MAAA,CAAO,iBAAA;AAAA,IACnD,eAAA,EAAiB,IAAI,eAAA,IAAmB;AAAA,MACtC,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,WAAW,MAAA,CAAO;AAAA,KACpB;AAAA,IACA,WAAA,EAAa,IAAI,WAAA,IAAe,CAAA;AAAA,IAChC,SAAA,EAAW,IAAI,SAAA,IAAa,CAAA;AAAA,IAC5B,SAAA,EAAW,IAAI,SAAA,IAAa,CAAA;AAAA,IAC5B,WAAA,EAAa,IAAI,WAAA,IAAe,CAAA;AAAA,IAChC,SAAA,EAAW,GAAA,CAAI,SAAA,IAAa,EAAC;AAAA,IAC7B,YAAA,EAAc,GAAA,CAAI,YAAA,IAAgB,EAAC;AAAA,IACnC,YAAY,GAAA,CAAI,UAAA;AAAA,IAChB,WAAW,GAAA,CAAI,SAAA;AAAA,IACf,WAAW,GAAA,CAAI;AAAA,GACjB;AACF;AAEA,SAAS,sBAAsB,MAAA,EAAyF;AACtH,EAAA,MAAM,EAAE,MAAA,EAAQ,aAAA,EAAe,SAAA,EAAU,GAAI,MAAA;AAC7C,EAAA,MAAM,WAAA,GAAc,oBAAoB,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,IAAA,KAAS,SAAS,CAAA,IAAK,mBAAA,CAAoB,CAAC,CAAA;AAChG,EAAA,MAAM,MAAA,GAAS,uBAAuB,MAAM,CAAA;AAC5C,EAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,EAAA,MAAM,OAAA,GAAU,IAAI,IAAA,CAAK,GAAG,CAAA;AAC5B,EAAA,OAAA,CAAQ,OAAA,CAAQ,OAAA,CAAQ,OAAA,EAAQ,GAAI,SAAS,CAAA;AAE7C,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,CAAA,GAAA,EAAM,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAAA,IAC9D,MAAA;AAAA,IACA,YAAA,EAAc,MAAA;AAAA,IACd,MAAA,EAAQ,CAAA;AAAA,IACR,MAAA,EAAQ,QAAA;AAAA,IACR,aAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAA;AAAA,IACA,SAAA,EAAW,IAAI,WAAA,EAAY;AAAA,IAC3B,OAAA,EAAS,QAAQ,WAAA,EAAY;AAAA,IAC7B,gBAAgB,MAAA,CAAO,cAAA;AAAA,IACvB,mBAAmB,MAAA,CAAO,iBAAA;AAAA,IAC1B,eAAA,EAAiB,EAAE,QAAA,EAAU,MAAA,CAAO,QAAA,EAAU,SAAS,MAAA,CAAO,OAAA,EAAS,SAAA,EAAW,MAAA,CAAO,SAAA,EAAU;AAAA,IACnG,WAAA,EAAa,CAAA;AAAA,IACb,SAAA,EAAW,CAAA;AAAA,IACX,SAAA,EAAW,CAAA;AAAA,IACX,WAAA,EAAa,CAAA;AAAA,IACb,WAAW,EAAC;AAAA,IACZ,cAAc;AAAC,GACjB;AACF;AClYO,SAAS,iBAAiB,OAAA,EAA2D;AAC1F,EAAA,MAAM,OAAA,GAAU,SAAS,OAAA,IAAW,GAAA;AACpC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIG,cAAAA,CAAwB,EAAE,CAAA;AAClD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,cAAAA,CAAgC,EAAE,CAAA;AACtE,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,IAAIA,cAAAA,iBAAgC,IAAI,KAAK,CAAA;AACjF,EAAA,MAAM,SAAA,GAAYC,aAAY,IAAI,CAAA;AAClC,EAAA,MAAM,QAAA,GAAWA,aAA4B,IAAI,CAAA;AAGjD,EAAA,MAAM,SAAA,GAAYC,kBAAY,MAAM;AAClC,IAAA,IAAI,CAAC,UAAU,OAAA,EAAS;AACtB,MAAA,IAAI;AACF,QAAA,MAAM,EAAE,mBAAA,EAAAK,oBAAAA,EAAoB,IAAI,wBAAA,EAAA,EAAA,YAAA,CAAA,2BAAA,CAAA,CAAA;AAChC,QAAA,SAAA,CAAU,OAAA,GAAUA,oBAAAA;AACpB,QAAA,aAAA,CAAcA,oBAAAA,CAAoB,eAAe,CAAA;AAAA,MACnD,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AACA,IAAA,OAAO,SAAA,CAAU,OAAA;AAAA,EACnB,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,cAAA,GAAiBH,cAAQ,MAAM;AACnC,IAAA,MAAM,OAAA,uBAAc,GAAA,EAA2B;AAC/C,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,MAAM,WAAW,OAAA,CAAQ,GAAA,CAAI,GAAA,CAAI,UAAU,KAAK,EAAC;AACjD,MAAA,OAAA,CAAQ,IAAI,GAAA,CAAI,UAAA,EAAY,CAAC,GAAG,QAAA,EAAU,GAAG,CAAC,CAAA;AAAA,IAChD;AACA,IAAA,OAAO,OAAA;AAAA,EACT,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAGT,EAAA,MAAM,KAAA,GAAQF,iBAAAA,CAAY,CACxB,WAAA,EACA,WACA,UAAA,KACG;AACH,IAAA,MAAM,SAAS,SAAA,EAAU;AACzB,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,MAAM,GAAA,GAAM,eAAe,OAAA,EAAS,WAAA;AACpC,IAAA,MAAM,KAAA,GAAQ,aAAa,OAAA,EAAS,SAAA;AACpC,IAAA,MAAM,MAAA,GAAS,cAAc,OAAA,EAAS,UAAA;AAEtC,IAAA,IAAI,CAAC,MAAA,CAAO,SAAA,EAAU,EAAG;AACvB,MAAA,MAAA,CAAO,KAAA,CAAM,GAAA,EAAK,KAAA,EAAO,MAAM,CAAA;AAAA,IACjC;AACA,IAAA,YAAA,CAAa,IAAI,CAAA;AAAA,EACnB,CAAA,EAAG,CAAC,SAAA,EAAW,OAAA,EAAS,aAAa,OAAA,EAAS,SAAA,EAAW,OAAA,EAAS,UAAU,CAAC,CAAA;AAG7E,EAAA,MAAM,IAAA,GAAOA,iBAAAA,CAAY,CAAC,WAAA,KAA2B;AACnD,IAAA,MAAM,SAAS,SAAA,EAAU;AACzB,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAA,CAAO,KAAK,WAAW,CAAA;AACvB,MAAA,IAAI,CAAC,WAAA,EAAa;AAChB,QAAA,YAAA,CAAa,KAAK,CAAA;AAAA,MACpB;AAAA,IACF;AAAA,EACF,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAGd,EAAA,MAAM,SAAA,GAAYA,kBAAY,MAAM;AAClC,IAAA,OAAA,CAAQ,EAAE,CAAA;AAAA,EACZ,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,gBAAA,GAAmBA,kBAAY,MAAM;AACzC,IAAA,MAAM,SAAS,SAAA,EAAU;AACzB,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAA,CAAO,gBAAA,EAAiB;AAAA,IAC1B;AAAA,EACF,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAGd,EAAA,MAAM,WAAA,GAAcA,iBAAAA,CAAY,CAAC,UAAA,KAA6C;AAC5E,IAAA,OAAO,YAAA,CAAa,IAAI,UAAU,CAAA;AAAA,EACpC,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAGjB,EAAAC,gBAAU,MAAM;AACd,IAAA,MAAM,SAAS,SAAA,EAAU;AACzB,IAAA,IAAI,CAAC,MAAA,EAAQ;AAGb,IAAA,YAAA,CAAa,MAAA,CAAO,WAAW,CAAA;AAG/B,IAAA,QAAA,CAAS,OAAA,GAAU,MAAA,CAAO,KAAA,CAAM,CAAC,KAAA,KAAuB;AACtD,MAAA,OAAA,CAAQ,CAAA,IAAA,KAAQ;AACd,QAAA,MAAM,IAAA,GAAO,CAAC,GAAG,IAAA,EAAM,KAAK,CAAA;AAC5B,QAAA,OAAO,KAAK,MAAA,GAAS,OAAA,GAAU,KAAK,KAAA,CAAM,CAAC,OAAO,CAAA,GAAI,IAAA;AAAA,MACxD,CAAC,CAAA;AAGD,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,WAAA,CAAY,KAAA,CAAM,UAAU,CAAA;AACjD,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,eAAA,CAAgB,CAAA,IAAA,KAAQ;AACtB,UAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,IAAI,CAAA;AACzB,UAAA,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,UAAA,EAAY,KAAK,CAAA;AAChC,UAAA,OAAO,IAAA;AAAA,QACT,CAAC,CAAA;AAAA,MACH;AAAA,IACF,CAAC,CAAA;AAED,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,SAAS,OAAA,EAAS;AACpB,QAAA,QAAA,CAAS,OAAA,EAAQ;AACjB,QAAA,QAAA,CAAS,OAAA,GAAU,IAAA;AAAA,MACrB;AAAA,IACF,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,SAAA,EAAW,OAAO,CAAC,CAAA;AAGvB,EAAAA,gBAAU,MAAM;AACd,IAAA,IAAI,SAAS,SAAA,EAAW;AACtB,MAAA,MAAM,SAAS,SAAA,EAAU;AACzB,MAAA,IAAI,MAAA,IAAU,CAAC,MAAA,CAAO,SAAA,EAAU,EAAG;AACjC,QAAA,gBAAA,EAAiB;AACjB,QAAA,UAAA,CAAW,MAAM;AACf,UAAA,KAAA,EAAM;AAAA,QACR,GAAG,IAAI,CAAA;AAAA,MACT;AAAA,IACF;AAAA,EACF,GAAG,CAAC,OAAA,EAAS,WAAW,SAAA,EAAW,gBAAA,EAAkB,KAAK,CAAC,CAAA;AAG3D,EAAAA,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,IAAA,MAAM,QAAA,GAAW,YAAY,MAAM;AACjC,MAAA,MAAM,SAAS,SAAA,EAAU;AACzB,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAM,MAAA,GAAS,OAAO,eAAA,EAAgB;AACtC,QAAA,IAAI,MAAA,CAAO,OAAO,CAAA,EAAG;AACnB,UAAA,eAAA,CAAgB,IAAI,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA,QACjC;AAAA,MACF;AAAA,IACF,GAAG,GAAI,CAAA;AAEP,IAAA,OAAO,MAAM,cAAc,QAAQ,CAAA;AAAA,EACrC,CAAA,EAAG,CAAC,SAAA,EAAW,SAAS,CAAC,CAAA;AAEzB,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,cAAA;AAAA,IACA,SAAA,EAAW,YAAA;AAAA,IACX,SAAA;AAAA,IACA,UAAA;AAAA,IACA,KAAA;AAAA,IACA,IAAA;AAAA,IACA,SAAA;AAAA,IACA,gBAAA;AAAA,IACA;AAAA,GACF;AACF;AC9LA,IAAI,mBAAA,GAAqC,IAAA;AACzC,IAAI,iBAAA,GAA4B,sBAAA;AAEzB,SAAS,sBAAsB,KAAA,EAAqB;AACzD,EAAA,mBAAA,GAAsB,KAAA;AACxB;AAEO,SAAS,uBAAA,GAAgC;AAC9C,EAAA,mBAAA,GAAsB,IAAA;AACxB;AAEO,SAAS,oBAAoB,GAAA,EAAmB;AACrD,EAAA,iBAAA,GAAoB,GAAA;AACtB;AAIA,eAAe,UAAA,CAAc,MAAc,OAAA,EAA0C;AACnF,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,cAAA,EAAgB;AAAA,KAClB;AACA,IAAA,IAAI,mBAAA,EAAqB;AACvB,MAAA,OAAA,CAAQ,eAAe,CAAA,GAAI,CAAA,OAAA,EAAU,mBAAmB,CAAA,CAAA;AAAA,IAC1D;AACA,IAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,CAAA,EAAG,iBAAiB,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,EAAE,GAAG,OAAA,EAAS,OAAA,EAAS,CAAA;AAC9E,IAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAI,OAAO,IAAA;AACpB,IAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,IAAA,OAAO,MAAM,IAAA,IAAQ,IAAA;AAAA,EACvB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAqCA,SAAS,2BAA2B,WAAA,EAAsC;AACxE,EAAA,MAAM,UAAA,GAAa;AAAA,IACjB,EAAE,EAAA,EAAI,aAAA,EAAe,IAAA,EAAM,gBAAA,EAAkB,WAAW,KAAA,EAAM;AAAA,IAC9D,EAAE,EAAA,EAAI,iBAAA,EAAmB,IAAA,EAAM,qBAAA,EAAuB,WAAW,KAAA,EAAM;AAAA,IACvE,EAAE,EAAA,EAAI,eAAA,EAAiB,IAAA,EAAM,qBAAA,EAAuB,WAAW,KAAA;AAAM,GACvE;AAEA,EAAA,MAAM,QAAQ,CAAC,UAAA,EAAY,UAAA,EAAY,UAAA,EAAY,YAAY,WAAW,CAAA;AAC1E,EAAA,MAAM,UAAA,GAAqC;AAAA,IACzC,UAAA,EAAY,KAAA;AAAA,IACZ,UAAA,EAAY,IAAA;AAAA,IACZ,UAAA,EAAY,GAAA;AAAA,IACZ,UAAA,EAAY,IAAA;AAAA,IACZ,WAAA,EAAa;AAAA,GACf;AAEA,EAAA,MAAM,YAA0B,EAAC;AACjC,EAAA,MAAM,kBAAA,GAAqB,WAAA,GACvB,UAAA,CAAW,MAAA,CAAO,CAAA,CAAA,KAAK,YAAY,QAAA,CAAS,CAAA,CAAE,EAAE,CAAC,CAAA,GACjD,UAAA;AAEJ,EAAA,KAAA,MAAW,YAAY,kBAAA,EAAoB;AAEzC,IAAA,MAAM,eAAe,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAA,KAAW,CAAC,CAAA;AACjD,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,YAAA,EAAc,CAAA,EAAA,EAAK;AACrC,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,KAAA,CAAM,KAAK,MAAA,EAAO,GAAI,KAAA,CAAM,MAAM,CAAC,CAAA;AAC3D,MAAA,MAAM,SAAA,GAAY,WAAW,IAAI,CAAA;AACjC,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,EAAO,GAAI,MAAM,MAAA,GAAS,OAAA;AAC5C,MAAA,MAAM,aAAa,SAAA,IAAa,CAAA,GAAA,CAAK,IAAA,CAAK,MAAA,KAAW,GAAA,IAAO,IAAA,CAAA;AAC5D,MAAA,MAAM,eAAe,SAAA,IAAa,CAAA,GAAA,CAAK,IAAA,CAAK,MAAA,KAAW,GAAA,IAAO,IAAA,CAAA;AAC9D,MAAA,MAAM,WAAW,IAAA,CAAK,KAAA,CAAM,KAAK,MAAA,EAAO,GAAI,EAAE,CAAA,GAAI,CAAA;AAClD,MAAA,MAAM,OAAO,IAAA,CAAK,KAAA,CAAM,KAAK,MAAA,EAAO,GAAI,GAAI,CAAA,GAAI,GAAA;AAChD,MAAA,MAAM,SAAS,IAAA,GAAO,QAAA;AAEtB,MAAA,MAAM,YAAY,IAAA,KAAS,MAAA,GAAA,CACtB,eAAe,UAAA,IAAc,UAAA,GAAA,CAC7B,aAAa,YAAA,IAAgB,UAAA;AAClC,MAAA,MAAM,UAAA,GAAa,YAAY,QAAA,GAAW,GAAA;AAC1C,MAAA,MAAM,GAAA,GAAM,OAAO,SAAA,GAAY,QAAA;AAE/B,MAAA,SAAA,CAAU,IAAA,CAAK;AAAA,QACb,EAAA,EAAI,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAAA,QAC/D,YAAY,QAAA,CAAS,EAAA;AAAA,QACrB,cAAc,QAAA,CAAS,IAAA;AAAA,QACvB,IAAA;AAAA,QACA,IAAA;AAAA,QACA,UAAA;AAAA,QACA,YAAA;AAAA,QACA,IAAA;AAAA,QACA,QAAA;AAAA,QACA,MAAA;AAAA,QACA,GAAA;AAAA,QACA,UAAA;AAAA,QACA,MAAA,EAAQ,MAAA;AAAA,QACR,QAAA,EAAU,UAAA,IAAc,IAAA,KAAS,MAAA,GAAS,IAAA,GAAO,IAAA,CAAA;AAAA,QACjD,UAAA,EAAY,UAAA,IAAc,IAAA,KAAS,MAAA,GAAS,GAAA,GAAM,GAAA,CAAA;AAAA,QAClD,gBAAA,EAAkB,cAAc,IAAA,KAAS,MAAA,GAAU,IAAI,CAAA,GAAI,QAAA,GAAa,IAAI,CAAA,GAAI,QAAA,CAAA;AAAA,QAChF,QAAA,EAAU,KAAK,GAAA,EAAI,GAAI,KAAK,KAAA,CAAM,IAAA,CAAK,MAAA,EAAO,GAAI,KAAQ,CAAA;AAAA,QAC1D,KAAA,EAAO,CAAC,UAAA,EAAY,UAAA,EAAY,MAAM,CAAA,CAAE,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAA,EAAO,GAAI,CAAC,CAAC,CAAA;AAAA,QACrE,YAAA,EAAc,IAAA,CAAK,MAAA,EAAO,GAAI,GAAA,GAAM,GAAA;AAAA,QACpC,aAAa,CAAA,EAAG,IAAA,KAAS,SAAS,SAAA,GAAY,SAAS,yBAAyB,IAAI,CAAA;AAAA,OACrF,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,OAAO,SAAA;AACT;AAIO,SAAS,eAAe,OAAA,EAAuD;AACpF,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIH,cAAAA,CAAuB,EAAE,CAAA;AAC3D,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,cAAA,GAAiBE,kBAAY,YAAY;AAC7C,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI;AACF,MAAA,IAAI,SAAS,UAAA,EAAY;AAEvB,QAAA,MAAM,SAAA,GAAY,0BAAA,CAA2B,OAAA,EAAS,WAAW,CAAA;AACjE,QAAA,YAAA,CAAa,SAAS,CAAA;AAAA,MACxB,CAAA,MAAO;AAEL,QAAA,IAAI,IAAA,GAAO,4BAAA;AACX,QAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,QAAA,IAAI,SAAS,UAAA,EAAY;AACvB,UAAA,MAAA,CAAO,MAAA,CAAO,YAAA,EAAc,OAAA,CAAQ,UAAU,CAAA;AAAA,QAChD;AACA,QAAA,IAAI,OAAA,EAAS,aAAa,MAAA,EAAQ;AAChC,UAAA,MAAA,CAAO,OAAO,aAAA,EAAe,OAAA,CAAQ,WAAA,CAAY,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,QAC5D;AACA,QAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,UAAA,MAAM,QAAA,GAAW,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,MAAM,IAAI,OAAA,CAAQ,MAAA,GAAS,CAAC,OAAA,CAAQ,MAAM,CAAA;AACjF,UAAA,MAAA,CAAO,MAAA,CAAO,QAAA,EAAU,QAAA,CAAS,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,QAC5C;AACA,QAAA,IAAI,MAAA,CAAO,UAAS,EAAG;AACrB,UAAA,IAAA,IAAQ,CAAA,CAAA,EAAI,MAAA,CAAO,QAAA,EAAU,CAAA,CAAA;AAAA,QAC/B;AAEA,QAAA,MAAM,IAAA,GAAO,MAAM,UAAA,CAAiC,IAAI,CAAA;AACxD,QAAA,IAAI,MAAM,SAAA,EAAW;AACnB,UAAA,YAAA,CAAa,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,WAAW,CAAC,CAAA;AAAA,QAC9C;AAAA,MACF;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,QAAA,CAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,2BAA2B,CAAA;AAAA,IAC3E,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,UAAA,EAAY,OAAA,EAAS,YAAY,OAAA,EAAS,WAAA,EAAa,OAAA,EAAS,MAAM,CAAC,CAAA;AAGpF,EAAA,MAAM,aAAA,GAAgBA,iBAAAA,CAAY,OAAO,UAAA,KAAyC;AAChF,IAAA,IAAI;AACF,MAAA,IAAI,SAAS,UAAA,EAAY;AACvB,QAAA,YAAA,CAAa,UAAQ,IAAA,CAAK,GAAA;AAAA,UAAI,CAAA,CAAA,KAC5B,CAAA,CAAE,EAAA,KAAO,UAAA,GAAa,EAAE,GAAG,CAAA,EAAG,MAAA,EAAQ,QAAA,EAAmB,SAAA,EAAW,IAAA,CAAK,GAAA,IAAM,GAAI;AAAA,SACpF,CAAA;AACD,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,MAAM,WAAW,CAAA,2BAAA,EAA8B,UAAU,UAAU,EAAE,MAAA,EAAQ,QAAQ,CAAA;AACrF,MAAA,YAAA,CAAa,UAAQ,IAAA,CAAK,GAAA;AAAA,QAAI,CAAA,CAAA,KAC5B,CAAA,CAAE,EAAA,KAAO,UAAA,GAAa,EAAE,GAAG,CAAA,EAAG,MAAA,EAAQ,QAAA,EAAmB,SAAA,EAAW,IAAA,CAAK,GAAA,IAAM,GAAI;AAAA,OACpF,CAAA;AACD,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,UAAU,CAAC,CAAA;AAGxB,EAAA,MAAM,cAAA,GAAiBA,iBAAAA,CAAY,OAAO,UAAA,EAAoB,QAAA,KAAuC;AACnG,IAAA,IAAI;AACF,MAAA,IAAI,SAAS,UAAA,EAAY;AACvB,QAAA,YAAA,CAAa,UAAQ,IAAA,CAAK,GAAA;AAAA,UAAI,CAAA,CAAA,KAC5B,EAAE,EAAA,KAAO,UAAA,GAAa,EAAE,GAAG,CAAA,EAAG,UAAS,GAAI;AAAA,SAC5C,CAAA;AACD,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,MAAM,UAAA,CAAW,CAAA,2BAAA,EAA8B,UAAU,CAAA,CAAA,EAAI;AAAA,QAC3D,MAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,UAAU;AAAA,OAClC,CAAA;AACD,MAAA,YAAA,CAAa,UAAQ,IAAA,CAAK,GAAA;AAAA,QAAI,CAAA,CAAA,KAC5B,EAAE,EAAA,KAAO,UAAA,GAAa,EAAE,GAAG,CAAA,EAAG,UAAS,GAAI;AAAA,OAC5C,CAAA;AACD,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,UAAU,CAAC,CAAA;AAGxB,EAAA,MAAM,gBAAA,GAAmBA,iBAAAA,CAAY,OAAO,UAAA,EAAoB,UAAA,KAAyC;AACvG,IAAA,IAAI;AACF,MAAA,IAAI,SAAS,UAAA,EAAY;AACvB,QAAA,YAAA,CAAa,UAAQ,IAAA,CAAK,GAAA;AAAA,UAAI,CAAA,CAAA,KAC5B,EAAE,EAAA,KAAO,UAAA,GAAa,EAAE,GAAG,CAAA,EAAG,YAAW,GAAI;AAAA,SAC9C,CAAA;AACD,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,MAAM,UAAA,CAAW,CAAA,2BAAA,EAA8B,UAAU,CAAA,CAAA,EAAI;AAAA,QAC3D,MAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,YAAY;AAAA,OACpC,CAAA;AACD,MAAA,YAAA,CAAa,UAAQ,IAAA,CAAK,GAAA;AAAA,QAAI,CAAA,CAAA,KAC5B,EAAE,EAAA,KAAO,UAAA,GAAa,EAAE,GAAG,CAAA,EAAG,YAAW,GAAI;AAAA,OAC9C,CAAA;AACD,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,UAAU,CAAC,CAAA;AAGxB,EAAAC,gBAAU,MAAM;AACd,IAAA,cAAA,EAAe;AACf,IAAA,IAAI,SAAS,YAAA,EAAc;AACzB,MAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,cAAA,EAAgB,OAAA,CAAQ,YAAY,CAAA;AAC9D,MAAA,OAAO,MAAM,cAAc,KAAK,CAAA;AAAA,IAClC;AAAA,EACF,CAAA,EAAG,CAAC,cAAA,EAAgB,OAAA,EAAS,YAAY,CAAC,CAAA;AAG1C,EAAA,MAAM,aAAA,GAAgBC,aAAAA;AAAA,IAAQ,MAC5B,SAAA,CAAU,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,WAAW,MAAM,CAAA;AAAA,IACzC,CAAC,SAAS;AAAA,GACZ;AAEA,EAAA,MAAM,eAAA,GAAkBA,aAAAA;AAAA,IAAQ,MAC9B,SAAA,CAAU,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,WAAW,QAAQ,CAAA;AAAA,IAC3C,CAAC,SAAS;AAAA,GACZ;AAEA,EAAA,MAAM,OAAA,GAAUA,cAAQ,MAAM;AAC5B,IAAA,MAAM,OAAO,SAAA,CAAU,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,WAAW,MAAM,CAAA;AACtD,IAAA,MAAM,aAA+E,EAAC;AAEtF,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,IAAI,CAAC,UAAA,CAAW,GAAA,CAAI,UAAU,CAAA,EAAG;AAC/B,QAAA,UAAA,CAAW,GAAA,CAAI,UAAU,CAAA,GAAI,EAAE,OAAO,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,QAAA,EAAU,CAAA,EAAE;AAAA,MAC/D;AACA,MAAA,UAAA,CAAW,GAAA,CAAI,UAAU,CAAA,CAAE,KAAA,EAAA;AAC3B,MAAA,UAAA,CAAW,GAAA,CAAI,UAAU,CAAA,CAAE,GAAA,IAAO,GAAA,CAAI,GAAA;AACtC,MAAA,UAAA,CAAW,GAAA,CAAI,UAAU,CAAA,CAAE,QAAA,IAAY,GAAA,CAAI,IAAA;AAAA,IAC7C;AAEA,IAAA,MAAM,aAAA,GAAgB,KAAK,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,IAAA,EAAM,CAAC,CAAA;AAC7D,IAAA,MAAM,QAAA,GAAW,UAAU,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,GAAA,EAAK,CAAC,CAAA;AAC5D,IAAA,MAAM,aAAA,GAAgB,KAAK,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,GAAA,EAAK,CAAC,CAAA;AAC5D,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,MAAA,GAAS,CAAA,GAC9B,KAAK,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,MAAM,CAAA,CAAE,QAAA,EAAU,CAAC,CAAA,GAAI,KAAK,MAAA,GACpD,CAAA;AAEJ,IAAA,OAAO;AAAA,MACL,gBAAgB,SAAA,CAAU,MAAA;AAAA,MAC1B,WAAW,IAAA,CAAK,MAAA;AAAA,MAChB,aAAA;AAAA,MACA,QAAA;AAAA,MACA,aAAA;AAAA,MACA,WAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,OAAO;AAAA,IACL,SAAA;AAAA,IACA,aAAA;AAAA,IACA,eAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAA,EAAS,cAAA;AAAA,IACT,aAAA;AAAA,IACA,cAAA;AAAA,IACA,gBAAA;AAAA,IACA;AAAA,GACF;AACF;AAIA,SAAS,YAAY,GAAA,EAAsB;AACzC,EAAA,OAAO;AAAA,IACL,IAAI,GAAA,CAAI,EAAA;AAAA,IACR,UAAA,EAAY,GAAA,CAAI,UAAA,IAAc,GAAA,CAAI,WAAA;AAAA,IAClC,YAAA,EAAc,GAAA,CAAI,YAAA,IAAgB,GAAA,CAAI,aAAA,IAAiB,EAAA;AAAA,IACvD,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,UAAA,EAAY,GAAA,CAAI,UAAA,IAAc,GAAA,CAAI,WAAA,IAAe,CAAA;AAAA,IACjD,YAAA,EAAc,GAAA,CAAI,YAAA,IAAgB,GAAA,CAAI,aAAA,IAAiB,CAAA;AAAA,IACvD,IAAA,EAAM,IAAI,IAAA,IAAQ,CAAA;AAAA,IAClB,QAAA,EAAU,IAAI,QAAA,IAAY,CAAA;AAAA,IAC1B,QAAQ,GAAA,CAAI,MAAA,IAAU,GAAA,CAAI,IAAA,IAAQ,IAAI,QAAA,IAAY,CAAA,CAAA;AAAA,IAClD,GAAA,EAAK,IAAI,GAAA,IAAO,CAAA;AAAA,IAChB,UAAA,EAAY,GAAA,CAAI,UAAA,IAAc,GAAA,CAAI,WAAA,IAAe,CAAA;AAAA,IACjD,MAAA,EAAQ,IAAI,MAAA,IAAU,MAAA;AAAA,IACtB,QAAA,EAAU,GAAA,CAAI,QAAA,IAAY,GAAA,CAAI,SAAA;AAAA,IAC9B,UAAA,EAAY,GAAA,CAAI,UAAA,IAAc,GAAA,CAAI,WAAA;AAAA,IAClC,gBAAA,EAAkB,GAAA,CAAI,gBAAA,IAAoB,GAAA,CAAI,iBAAA;AAAA,IAC9C,UAAU,GAAA,CAAI,QAAA,IAAY,GAAA,CAAI,SAAA,IAAa,KAAK,GAAA,EAAI;AAAA,IACpD,SAAA,EAAW,GAAA,CAAI,SAAA,IAAa,GAAA,CAAI,UAAA;AAAA,IAChC,OAAO,GAAA,CAAI,KAAA;AAAA,IACX,OAAA,EAAS,GAAA,CAAI,OAAA,IAAW,GAAA,CAAI,QAAA;AAAA,IAC5B,YAAA,EAAc,GAAA,CAAI,YAAA,IAAgB,GAAA,CAAI,aAAA;AAAA,IACtC,WAAA,EAAa,GAAA,CAAI,WAAA,IAAe,GAAA,CAAI;AAAA,GACtC;AACF;AClTA,SAAS,0BAAA,CACP,WAAA,EACA,KAAA,GAAgB,EAAA,EACF;AACd,EAAA,MAAM,UAAA,GAAa;AAAA,IACjB,EAAE,EAAA,EAAI,aAAA,EAAe,IAAA,EAAM,gBAAA,EAAiB;AAAA,IAC5C,EAAE,EAAA,EAAI,iBAAA,EAAmB,IAAA,EAAM,qBAAA,EAAsB;AAAA,IACrD,EAAE,EAAA,EAAI,eAAA,EAAiB,IAAA,EAAM,qBAAA;AAAsB,GACrD;AAEA,EAAA,MAAM,QAAQ,CAAC,UAAA,EAAY,UAAA,EAAY,UAAA,EAAY,YAAY,WAAW,CAAA;AAC1E,EAAA,MAAM,UAA4B,CAAC,WAAA,EAAa,cAAc,YAAA,EAAc,aAAA,EAAe,QAAQ,MAAM,CAAA;AAEzG,EAAA,MAAM,UAAA,GAAa;AAAA,IACjB,SAAA,EAAW;AAAA,MACT,0CAAA;AAAA,MACA,iDAAA;AAAA,MACA,uCAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,UAAA,EAAY;AAAA,MACV,4CAAA;AAAA,MACA,uCAAA;AAAA,MACA,6CAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,UAAA,EAAY;AAAA,MACV,4BAAA;AAAA,MACA,sCAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,WAAA,EAAa;AAAA,MACX,4BAAA;AAAA,MACA,4BAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,2CAAA;AAAA,MACA,4CAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,4BAAA;AAAA,MACA,0BAAA;AAAA,MACA;AAAA;AACF,GACF;AAEA,EAAA,MAAM,kBAAA,GAAqB,WAAA,GACvB,UAAA,CAAW,MAAA,CAAO,CAAA,CAAA,KAAK,YAAY,QAAA,CAAS,CAAA,CAAE,EAAE,CAAC,CAAA,GACjD,UAAA;AAEJ,EAAA,MAAM,YAA0B,EAAC;AACjC,EAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAErB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK;AAC9B,IAAA,MAAM,QAAA,GAAW,mBAAmB,IAAA,CAAK,KAAA,CAAM,KAAK,MAAA,EAAO,GAAI,kBAAA,CAAmB,MAAM,CAAC,CAAA;AACzF,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,KAAA,CAAM,KAAK,MAAA,EAAO,GAAI,KAAA,CAAM,MAAM,CAAC,CAAA;AAC3D,IAAA,MAAM,MAAA,GAAS,QAAQ,IAAA,CAAK,KAAA,CAAM,KAAK,MAAA,EAAO,GAAI,OAAA,CAAQ,MAAM,CAAC,CAAA;AACjE,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,MAAA,EAAO,GAAI,GAAA,GAAM,GAAA;AACzC,IAAA,MAAM,QAAA,GAAW,MAAA,KAAW,MAAA,IAAU,MAAA,KAAW,UAAU,UAAA,GAAa,GAAA;AACxE,IAAA,MAAM,aAAA,GAAgB,WAAW,MAAM,CAAA;AAEvC,IAAA,SAAA,CAAU,IAAA,CAAK;AAAA,MACb,EAAA,EAAI,CAAA,IAAA,EAAO,GAAA,GAAM,CAAA,GAAI,GAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAAA,MACpE,WAAW,GAAA,GAAM,CAAA,IAAK,IAAA,CAAK,MAAA,KAAW,GAAA,GAAS,GAAA,CAAA;AAAA,MAC/C,YAAY,QAAA,CAAS,EAAA;AAAA,MACrB,cAAc,QAAA,CAAS,IAAA;AAAA,MACvB,IAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,MACA,SAAA,EAAW,cAAc,IAAA,CAAK,KAAA,CAAM,KAAK,MAAA,EAAO,GAAI,aAAA,CAAc,MAAM,CAAC,CAAA;AAAA,MACzE,UAAA,EAAY;AAAA,QACV,GAAA,EAAK,IAAA,CAAK,MAAA,EAAO,GAAI,GAAA;AAAA,QACrB,IAAA,EAAA,CAAO,IAAA,CAAK,MAAA,EAAO,GAAI,GAAA,IAAO,CAAA;AAAA,QAC9B,GAAA,EAAK,IAAA,CAAK,MAAA,EAAO,GAAI,MAAM,SAAA,GAAY,SAAA;AAAA,QACvC,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAO,GAAI,CAAA,GAAI,GAAA;AAAA,QAC5B,SAAA,EAAW,IAAA,CAAK,MAAA,EAAO,GAAI,MAAM,OAAA,GAAU;AAAA,OAC7C;AAAA,MACA,OAAA,EAAS;AAAA,QACP,OAAO,IAAA,CAAK,MAAA,EAAO,GAAI,GAAA,GAAM,aAAa,YAAY,CAAA,CAAA;AAAA,QACtD,QAAQ,IAAA,CAAK,MAAA,EAAO,GAAI,GAAA,GAAM,YAAY,SAAS,CAAA;AAAA,OACrD;AAAA,MACA,QAAA;AAAA,MACA,YAAY,QAAA,GAAW,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,MAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,GAAK,MAAA;AAAA,MACvF,OAAO,GAAA,IAAS,CAAA,GAAA,CAAK,IAAA,CAAK,MAAA,KAAW,GAAA,IAAO,GAAA,CAAA;AAAA,MAC5C,IAAA,EAAM,WAAW,IAAA,CAAK,KAAA,CAAM,KAAK,MAAA,EAAO,GAAI,GAAI,CAAA,GAAI,GAAA,GAAM,MAAA;AAAA,MAC1D,QAAA,EAAU,WAAW,IAAA,CAAK,KAAA,CAAM,KAAK,MAAA,EAAO,GAAI,EAAE,CAAA,GAAI,CAAA,GAAI;AAAA,KAC3D,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,SAAA,CAAU,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,SAAA,GAAY,EAAE,SAAS,CAAA;AAC3D;AAIO,SAAS,eAAe,OAAA,EAAuD;AACpF,EAAA,MAAM,KAAA,GAAQ,SAAS,KAAA,IAAS,GAAA;AAChC,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIJ,cAAAA,CAAuB,EAAE,CAAA;AAC3D,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,cAAA,GAAiBE,kBAAY,YAAY;AAC7C,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI;AACF,MAAA,IAAI,SAAS,UAAA,EAAY;AACvB,QAAA,MAAM,SAAA,GAAY,0BAAA,CAA2B,OAAA,EAAS,WAAA,EAAa,KAAK,CAAA;AACxE,QAAA,YAAA,CAAa,SAAS,CAAA;AAAA,MACxB,CAAA,MAAO;AACL,QAAA,IAAI,IAAA,GAAO,4BAAA;AACX,QAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,QAAA,IAAI,SAAS,UAAA,EAAY;AACvB,UAAA,MAAA,CAAO,MAAA,CAAO,YAAA,EAAc,OAAA,CAAQ,UAAU,CAAA;AAAA,QAChD;AACA,QAAA,IAAI,OAAA,EAAS,aAAa,MAAA,EAAQ;AAChC,UAAA,MAAA,CAAO,OAAO,aAAA,EAAe,OAAA,CAAQ,WAAA,CAAY,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,QAC5D;AACA,QAAA,IAAI,OAAA,EAAS,SAAS,MAAA,EAAQ;AAC5B,UAAA,MAAA,CAAO,OAAO,SAAA,EAAW,OAAA,CAAQ,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,QACpD;AACA,QAAA,MAAA,CAAO,MAAA,CAAO,OAAA,EAAS,KAAA,CAAM,QAAA,EAAU,CAAA;AACvC,QAAA,IAAI,MAAA,CAAO,UAAS,EAAG;AACrB,UAAA,IAAA,IAAQ,CAAA,CAAA,EAAI,MAAA,CAAO,QAAA,EAAU,CAAA,CAAA;AAAA,QAC/B;AAEA,QAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,CAAA,oBAAA,EAAuB,IAAI,CAAA,CAAE,CAAA;AACrD,QAAA,IAAI,IAAI,EAAA,EAAI;AACV,UAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,UAAA,IAAI,MAAM,SAAA,EAAW;AACnB,YAAA,YAAA,CAAa,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,WAAW,CAAC,CAAA;AAAA,UAC9C;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,QAAA,CAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,2BAA2B,CAAA;AAAA,IAC3E,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,UAAA,EAAY,OAAA,EAAS,UAAA,EAAY,OAAA,EAAS,WAAA,EAAa,OAAA,EAAS,OAAA,EAAS,KAAK,CAAC,CAAA;AAG5F,EAAAC,gBAAU,MAAM;AACd,IAAA,cAAA,EAAe;AACf,IAAA,IAAI,SAAS,YAAA,EAAc;AACzB,MAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,cAAA,EAAgB,OAAA,CAAQ,YAAY,CAAA;AAC9D,MAAA,OAAO,MAAM,cAAc,KAAK,CAAA;AAAA,IAClC;AAAA,EACF,CAAA,EAAG,CAAC,cAAA,EAAgB,OAAA,EAAS,YAAY,CAAC,CAAA;AAG1C,EAAA,MAAM,aAAA,GAAgBD,iBAAAA;AAAA,IAAY,CAAC,UAAA,KACjC,SAAA,CAAU,OAAO,CAAA,CAAA,KAAK,CAAA,CAAE,eAAe,UAAU,CAAA;AAAA,IACjD,CAAC,SAAS;AAAA,GACZ;AAEA,EAAA,MAAM,WAAA,GAAcA,iBAAAA;AAAA,IAAY,CAAC,MAAA,KAC/B,SAAA,CAAU,OAAO,CAAA,CAAA,KAAK,CAAA,CAAE,WAAW,MAAM,CAAA;AAAA,IACzC,CAAC,SAAS;AAAA,GACZ;AAGA,EAAA,MAAM,eAAA,GAAkBE,aAAAA;AAAA,IAAQ,MAC9B,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,IACrB,CAAC,SAAS;AAAA,GACZ;AAEA,EAAA,MAAM,iBAAA,GAAoBA,aAAAA;AAAA,IAAQ,MAChC,SAAA,CAAU,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,QAAQ,CAAA;AAAA,IAChC,CAAC,SAAS;AAAA,GACZ;AAEA,EAAA,MAAM,KAAA,GAAQA,cAAQ,MAAM;AAC1B,IAAA,MAAM,QAAA,GAAW,SAAA,CAAU,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,QAAQ,CAAA;AACjD,IAAA,MAAM,QAAA,GAA2C;AAAA,MAC/C,SAAA,EAAW,CAAA;AAAA,MACX,UAAA,EAAY,CAAA;AAAA,MACZ,UAAA,EAAY,CAAA;AAAA,MACZ,WAAA,EAAa,CAAA;AAAA,MACb,IAAA,EAAM,CAAA;AAAA,MACN,IAAA,EAAM;AAAA,KACR;AACA,IAAA,MAAM,aAAqC,EAAC;AAE5C,IAAA,KAAA,MAAW,KAAK,SAAA,EAAW;AACzB,MAAA,QAAA,CAAS,EAAE,MAAM,CAAA,EAAA;AACjB,MAAA,UAAA,CAAW,EAAE,UAAU,CAAA,GAAA,CAAK,WAAW,CAAA,CAAE,UAAU,KAAK,CAAA,IAAK,CAAA;AAAA,IAC/D;AAEA,IAAA,MAAM,aAAA,GAAgB,SAAA,CAAU,MAAA,GAAS,CAAA,GACrC,UAAU,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,MAAM,CAAA,CAAE,UAAA,EAAY,CAAC,CAAA,GAAI,UAAU,MAAA,GAChE,CAAA;AAEJ,IAAA,OAAO;AAAA,MACL,gBAAgB,SAAA,CAAU,MAAA;AAAA,MAC1B,eAAe,QAAA,CAAS,MAAA;AAAA,MACxB,eAAe,SAAA,CAAU,MAAA,GAAS,IAAI,QAAA,CAAS,MAAA,GAAS,UAAU,MAAA,GAAS,CAAA;AAAA,MAC3E,QAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,OAAO;AAAA,IACL,SAAA;AAAA,IACA,eAAA;AAAA,IACA,iBAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAA,EAAS,cAAA;AAAA,IACT,aAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACF;AACF;AAIA,SAAS,YAAY,GAAA,EAAsB;AACzC,EAAA,OAAO;AAAA,IACL,IAAI,GAAA,CAAI,EAAA;AAAA,IACR,SAAA,EAAW,GAAA,CAAI,SAAA,IAAa,IAAA,CAAK,GAAA,EAAI;AAAA,IACrC,UAAA,EAAY,GAAA,CAAI,UAAA,IAAc,GAAA,CAAI,WAAA;AAAA,IAClC,YAAA,EAAc,GAAA,CAAI,YAAA,IAAgB,GAAA,CAAI,aAAA,IAAiB,EAAA;AAAA,IACvD,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,QAAQ,GAAA,CAAI,MAAA;AAAA,IACZ,UAAA,EAAY,IAAI,UAAA,IAAc,CAAA;AAAA,IAC9B,SAAA,EAAW,IAAI,SAAA,IAAa,EAAA;AAAA,IAC5B,UAAA,EAAY,GAAA,CAAI,UAAA,IAAc,EAAC;AAAA,IAC/B,OAAA,EAAS,GAAA,CAAI,OAAA,IAAW,EAAC;AAAA,IACzB,QAAA,EAAU,IAAI,QAAA,IAAY,KAAA;AAAA,IAC1B,UAAA,EAAY,GAAA,CAAI,UAAA,IAAc,GAAA,CAAI,WAAA;AAAA,IAClC,OAAO,GAAA,CAAI,KAAA;AAAA,IACX,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,UAAU,GAAA,CAAI;AAAA,GAChB;AACF;;;AC6BO,IAAM,mBAAA,GAAkC;AAAA,EAC7C,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,EACpB,aAAA,EAAe,CAAA;AAAA,EACf,WAAA,EAAa,GAAA;AAAA,EACb,eAAA,EAAiB,CAAA;AAAA,EACjB,QAAA,EAAU,CAAA;AAAA,EACV,aAAA,EAAe,GAAA;AAAA,EACf,eAAA,EAAiB,CAAA;AAAA,EACjB,eAAA,EAAiB,CAAA;AAAA,EACjB,eAAA,EAAiB,EAAA;AAAA,EACjB,eAAA,EAAiB,CAAA;AAAA,EACjB,WAAA,EAAa,EAAA;AAAA,EACb,eAAA,EAAiB,CAAA;AAAA,EACjB,aAAA,EAAe,CAAA;AAAA,EACf,YAAA,EAAc,EAAA;AAAA,EACd,SAAA,EAAW,KAAA;AAAA,EACX,aAAA,EAAe,QAAA;AAAA,EACf,UAAU;AACZ,CAAA;AA2BO,SAAS,kBAAA,CACd,eAAA,EACA,eAAA,EACA,eAAA,EACW;AACX,EAAA,MAAM,WAAA,GAAc,KAAK,GAAA,CAAI,eAAA,EAAiB,iBAAiB,IAAA,CAAK,GAAA,CAAI,eAAe,CAAC,CAAA;AACxF,EAAA,IAAI,WAAA,IAAe,IAAI,OAAO,UAAA;AAC9B,EAAA,IAAI,WAAA,IAAe,IAAI,OAAO,MAAA;AAC9B,EAAA,IAAI,WAAA,IAAe,IAAI,OAAO,QAAA;AAC9B,EAAA,OAAO,KAAA;AACT;;;ACvUA,SAAS,2BAAA,GAA0C;AACjD,EAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,MAAA,EAAO,GAAI,GAAA,GAAQ,GAAA;AAC9C,EAAA,MAAM,WAAA,GAAc,GAAA;AACpB,EAAA,MAAM,eAAA,GAAmB,gBAAgB,WAAA,GAAe,GAAA;AAExD,EAAA,MAAM,QAAA,GAAA,CAAY,IAAA,CAAK,MAAA,EAAO,GAAI,GAAA,IAAO,GAAA;AACzC,EAAA,MAAM,aAAA,GAAgB,GAAA;AACtB,EAAA,MAAM,eAAA,GAAmB,IAAA,CAAK,GAAA,CAAI,QAAQ,IAAI,aAAA,GAAiB,GAAA;AAE/D,EAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,MAAA,EAAO,GAAI,EAAA;AACxC,EAAA,MAAM,WAAA,GAAc,EAAA;AACpB,EAAA,MAAM,eAAA,GAAmB,kBAAkB,WAAA,GAAe,GAAA;AAE1D,EAAA,MAAM,gBAAgB,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAA,KAAW,CAAC,CAAA;AAClD,EAAA,MAAM,YAAA,GAAe,EAAA;AAErB,EAAA,MAAM,kBAAkB,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAA,KAAW,EAAE,CAAA;AACrD,EAAA,MAAM,eAAA,GAAkB,EAAA;AAExB,EAAA,MAAM,SAAA,GAAY,kBAAA,CAAmB,eAAA,EAAiB,eAAA,EAAiB,eAAe,CAAA;AAEtF,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,IAAI,eAAA,GAAkB,EAAA,EAAI,QAAA,CAAS,IAAA,CAAK,yBAAyB,CAAA;AACjE,EAAA,IAAI,eAAA,GAAkB,EAAA,EAAI,QAAA,CAAS,IAAA,CAAK,0BAA0B,CAAA;AAClE,EAAA,IAAI,kBAAkB,EAAA,IAAM,QAAA,GAAW,CAAA,EAAG,QAAA,CAAS,KAAK,0BAA0B,CAAA;AAClF,EAAA,IAAI,aAAA,IAAiB,YAAA,GAAe,CAAA,EAAG,QAAA,CAAS,KAAK,+BAA+B,CAAA;AAEpF,EAAA,IAAI,aAAA,GAA+B,QAAA;AACnC,EAAA,IAAI,SAAA,KAAc,YAAY,aAAA,GAAgB,SAAA;AAAA,OAAA,IACrC,SAAA,KAAc,MAAA,IAAU,QAAA,CAAS,MAAA,GAAS,GAAG,aAAA,GAAgB,QAAA;AAEtE,EAAA,MAAM,aAAA,GAA8F;AAAA,IAClG,aAAA,EAAe;AAAA,MACb,QAAA,EAAU,IAAA,CAAK,MAAA,EAAO,GAAI,GAAA;AAAA,MAC1B,QAAA,EAAU,IAAA,CAAK,MAAA,EAAO,GAAI,CAAA;AAAA,MAC1B,SAAA,EAAW,IAAA,CAAK,MAAA,EAAO,GAAI,MAAM,QAAA,GAAW;AAAA,KAC9C;AAAA,IACA,iBAAA,EAAmB;AAAA,MACjB,QAAA,EAAU,IAAA,CAAK,MAAA,EAAO,GAAI,GAAA;AAAA,MAC1B,QAAA,EAAU,IAAA,CAAK,MAAA,EAAO,GAAI,CAAA;AAAA,MAC1B,SAAA,EAAW;AAAA,KACb;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,QAAA,EAAU,IAAA,CAAK,MAAA,EAAO,GAAI,GAAA;AAAA,MAC1B,QAAA,EAAU,IAAA,CAAK,MAAA,EAAO,GAAI,CAAA;AAAA,MAC1B,SAAA,EAAW,IAAA,CAAK,MAAA,EAAO,GAAI,MAAM,MAAA,GAAS;AAAA;AAC5C,GACF;AAEA,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,IACpB,aAAA;AAAA,IACA,WAAA;AAAA,IACA,eAAA;AAAA,IACA,QAAA;AAAA,IACA,aAAA;AAAA,IACA,eAAA;AAAA,IACA,eAAA;AAAA,IACA,eAAA;AAAA,IACA,eAAA;AAAA,IACA,WAAA;AAAA,IACA,eAAA;AAAA,IACA,aAAA;AAAA,IACA,YAAA;AAAA,IACA,SAAA;AAAA,IACA,aAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACF;AACF;AAIO,SAAS,gBAAgB,OAAA,EAAyD;AACvF,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIJ,eAAqB,mBAAmB,CAAA;AAC5E,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,eAAA,GAAkBE,kBAAY,YAAY;AAC9C,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI;AACF,MAAA,IAAI,SAAS,UAAA,EAAY;AACvB,QAAA,MAAM,YAAY,2BAAA,EAA4B;AAC9C,QAAA,aAAA,CAAc,SAAS,CAAA;AAAA,MACzB,CAAA,MAAO;AACL,QAAA,IAAI,IAAA,GAAO,8BAAA;AACX,QAAA,IAAI,SAAS,UAAA,EAAY;AACvB,UAAA,IAAA,IAAQ,CAAA,YAAA,EAAe,QAAQ,UAAU,CAAA,CAAA;AAAA,QAC3C;AAEA,QAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,CAAA,oBAAA,EAAuB,IAAI,CAAA,CAAE,CAAA;AACrD,QAAA,IAAI,IAAI,EAAA,EAAI;AACV,UAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,UAAA,IAAI,IAAA,EAAM;AACR,YAAA,aAAA,CAAc,aAAA,CAAc,IAAI,CAAC,CAAA;AAAA,UACnC;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,QAAA,CAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,6BAA6B,CAAA;AAAA,IAC7E,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,OAAA,EAAS,UAAA,EAAY,OAAA,EAAS,UAAU,CAAC,CAAA;AAG7C,EAAAC,gBAAU,MAAM;AACd,IAAA,eAAA,EAAgB;AAChB,IAAA,IAAI,SAAS,YAAA,EAAc;AACzB,MAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,eAAA,EAAiB,OAAA,CAAQ,YAAY,CAAA;AAC/D,MAAA,OAAO,MAAM,cAAc,KAAK,CAAA;AAAA,IAClC;AAAA,EACF,CAAA,EAAG,CAAC,eAAA,EAAiB,OAAA,EAAS,YAAY,CAAC,CAAA;AAG3C,EAAA,MAAM,YAAA,GAAeD,kBAAY,YAA8B;AAC7D,IAAA,IAAI;AACF,MAAA,IAAI,SAAS,UAAA,EAAY;AACvB,QAAA,aAAA,CAAc,WAAS,EAAE,GAAG,IAAA,EAAM,aAAA,EAAe,UAAS,CAAE,CAAA;AAC5D,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,oDAAA,EAAsD;AAAA,QAC5E,MAAA,EAAQ;AAAA,OACT,CAAA;AACD,MAAA,IAAI,IAAI,EAAA,EAAI;AACV,QAAA,aAAA,CAAc,WAAS,EAAE,GAAG,IAAA,EAAM,aAAA,EAAe,UAAS,CAAE,CAAA;AAC5D,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,OAAO,KAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,UAAU,CAAC,CAAA;AAExB,EAAA,MAAM,aAAA,GAAgBA,kBAAY,YAA8B;AAC9D,IAAA,IAAI;AACF,MAAA,IAAI,SAAS,UAAA,EAAY;AACvB,QAAA,aAAA,CAAc,WAAS,EAAE,GAAG,IAAA,EAAM,aAAA,EAAe,UAAS,CAAE,CAAA;AAC5D,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,qDAAA,EAAuD;AAAA,QAC7E,MAAA,EAAQ;AAAA,OACT,CAAA;AACD,MAAA,IAAI,IAAI,EAAA,EAAI;AACV,QAAA,aAAA,CAAc,WAAS,EAAE,GAAG,IAAA,EAAM,aAAA,EAAe,UAAS,CAAE,CAAA;AAC5D,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,OAAO,KAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,UAAU,CAAC,CAAA;AAExB,EAAA,MAAM,gBAAA,GAAmBA,kBAAY,YAA8B;AACjE,IAAA,IAAI;AACF,MAAA,IAAI,SAAS,UAAA,EAAY;AACvB,QAAA,aAAA,CAAc,CAAA,IAAA,MAAS;AAAA,UACrB,GAAG,IAAA;AAAA,UACH,QAAA,EAAU,CAAA;AAAA,UACV,eAAA,EAAiB,CAAA;AAAA,UACjB,eAAA,EAAiB,CAAA;AAAA,UACjB,QAAA,EAAU,KAAK,QAAA,CAAS,MAAA,CAAO,OAAK,CAAC,CAAA,CAAE,QAAA,CAAS,OAAO,CAAC;AAAA,SAC1D,CAAE,CAAA;AACF,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,uDAAA,EAAyD;AAAA,QAC/E,MAAA,EAAQ;AAAA,OACT,CAAA;AACD,MAAA,OAAO,GAAA,CAAI,EAAA;AAAA,IACb,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,UAAU,CAAC,CAAA;AAGxB,EAAA,MAAM,cAAA,GAAiBE,cAAQ,MAAM;AACnC,IAAA,OACE,UAAA,CAAW,eAAA,GAAkB,EAAA,IAC7B,UAAA,CAAW,eAAA,GAAkB,EAAA,IAC7B,UAAA,CAAW,eAAA,GAAkB,EAAA,IAC7B,UAAA,CAAW,aAAA,GAAgB,UAAA,CAAW,YAAA;AAAA,EAE1C,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,EAAA,MAAM,QAAA,GAAWA,cAAQ,MAAM;AAC7B,IAAA,OAAO,UAAA,CAAW,kBAAkB,QAAA,IAAY,cAAA;AAAA,EAClD,CAAA,EAAG,CAAC,UAAA,CAAW,aAAA,EAAe,cAAc,CAAC,CAAA;AAE7C,EAAA,OAAO;AAAA,IACL,UAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAA,EAAS,eAAA;AAAA,IACT,cAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAW,UAAA,CAAW,SAAA;AAAA,IACtB,eAAe,UAAA,CAAW,aAAA;AAAA,IAC1B,UAAU,UAAA,CAAW,QAAA;AAAA,IACrB,YAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACF;AACF;AAIA,SAAS,cAAc,GAAA,EAAsB;AAC3C,EAAA,MAAM,eAAA,GAAkB,IAAI,WAAA,GAAc,CAAA,GACrC,IAAI,aAAA,GAAgB,GAAA,CAAI,cAAe,GAAA,GACxC,CAAA;AACJ,EAAA,MAAM,eAAA,GAAkB,GAAA,CAAI,aAAA,GAAgB,CAAA,GACvC,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,QAAQ,CAAA,GAAI,GAAA,CAAI,aAAA,GAAiB,GAAA,GAC/C,CAAA;AACJ,EAAA,MAAM,eAAA,GAAkB,IAAI,WAAA,GAAc,CAAA,GACrC,IAAI,eAAA,GAAkB,GAAA,CAAI,cAAe,GAAA,GAC1C,CAAA;AAEJ,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,GAAA,CAAI,SAAA,IAAa,IAAA,CAAK,GAAA,EAAI;AAAA,IACrC,aAAA,EAAe,GAAA,CAAI,aAAA,IAAiB,GAAA,CAAI,cAAA,IAAkB,CAAA;AAAA,IAC1D,WAAA,EAAa,GAAA,CAAI,WAAA,IAAe,GAAA,CAAI,YAAA,IAAgB,GAAA;AAAA,IACpD,eAAA;AAAA,IACA,QAAA,EAAU,GAAA,CAAI,QAAA,IAAY,GAAA,CAAI,SAAA,IAAa,CAAA;AAAA,IAC3C,aAAA,EAAe,GAAA,CAAI,aAAA,IAAiB,GAAA,CAAI,eAAA,IAAmB,GAAA;AAAA,IAC3D,eAAA;AAAA,IACA,eAAA,EAAiB,GAAA,CAAI,eAAA,IAAmB,GAAA,CAAI,iBAAA,IAAqB,CAAA;AAAA,IACjE,eAAA,EAAiB,GAAA,CAAI,eAAA,IAAmB,GAAA,CAAI,iBAAA,IAAqB,EAAA;AAAA,IACjE,eAAA,EAAiB,GAAA,CAAI,eAAA,IAAmB,GAAA,CAAI,gBAAA,IAAoB,CAAA;AAAA,IAChE,WAAA,EAAa,GAAA,CAAI,WAAA,IAAe,GAAA,CAAI,YAAA,IAAgB,EAAA;AAAA,IACpD,eAAA;AAAA,IACA,aAAA,EAAe,GAAA,CAAI,aAAA,IAAiB,GAAA,CAAI,cAAA,IAAkB,CAAA;AAAA,IAC1D,YAAA,EAAc,GAAA,CAAI,YAAA,IAAgB,GAAA,CAAI,aAAA,IAAiB,EAAA;AAAA,IACvD,SAAA,EAAW,IAAI,SAAA,IAAa,GAAA,CAAI,cAAc,kBAAA,CAAmB,eAAA,EAAiB,iBAAiB,eAAe,CAAA;AAAA,IAClH,aAAA,EAAe,GAAA,CAAI,aAAA,IAAiB,GAAA,CAAI,cAAA,IAAkB,QAAA;AAAA,IAC1D,QAAA,EAAU,GAAA,CAAI,QAAA,IAAY,EAAC;AAAA,IAC3B,aAAA,EAAe,GAAA,CAAI,aAAA,IAAiB,GAAA,CAAI;AAAA,GAC1C;AACF;;;ACtNO,SAAS,kBAAkB,OAAA,EAA0D;AAC1F,EAAA,MAAM,UAAA,GAAa,SAAS,UAAA,IAAc,IAAA;AAC1C,EAAA,MAAM,YAAA,GAAe,SAAS,YAAA,IAAgB,GAAA;AAC9C,EAAA,MAAM,OAAA,GAAU,SAAS,OAAA,IAAW,GAAA;AACpC,EAAA,MAAM,cAAc,OAAA,EAAS,WAAA;AAG7B,EAAA,MAAM,SAAS,gBAAA,CAAiB;AAAA,IAC9B,OAAA;AAAA,IACA,WAAA;AAAA,IACA,SAAA,EAAW;AAAA,GACZ,CAAA;AAED,EAAA,MAAM,gBAAgB,cAAA,CAAe;AAAA,IACnC,WAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,MAAM,gBAAgB,cAAA,CAAe;AAAA,IACnC,WAAA;AAAA,IACA,YAAA;AAAA,IACA,UAAA;AAAA,IACA,KAAA,EAAO;AAAA,GACR,CAAA;AAED,EAAA,MAAM,WAAW,eAAA,CAAgB;AAAA,IAC/B,YAAA;AAAA,IACA;AAAA,GACD,CAAA;AAGD,EAAA,MAAM,MAAA,GAASA,cAAQ,MAAiB;AACtC,IAAA,MAAM,YAAuB,EAAC;AAE9B,IAAA,KAAA,MAAW,QAAA,IAAY,OAAO,UAAA,EAAY;AACxC,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,SAAA,CAAU,GAAA,CAAI,SAAS,EAAE,CAAA;AAC9C,MAAA,MAAM,iBAAA,GAAoB,cAAc,SAAA,CAAU,MAAA,CAAO,OAAK,CAAA,CAAE,UAAA,KAAe,SAAS,EAAE,CAAA;AAC1F,MAA0B,cAAc,SAAA,CAAU,MAAA,CAAO,OAAK,CAAA,CAAE,UAAA,KAAe,SAAS,EAAE;AAC1F,MAAA,MAAM,UAAU,iBAAA,CAAkB,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,WAAW,MAAM,CAAA;AAEjE,MAAA,MAAM,QAAA,GAAW,kBAAkB,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,GAAA,EAAK,CAAC,CAAA;AACpE,MAAA,MAAM,QAAA,GAAW,QAAQ,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,IAAA,EAAM,CAAC,CAAA;AAC3D,MAAA,MAAM,WAAW,iBAAA,CAAkB,MAAA,CAAO,OAAK,CAAA,CAAE,GAAA,GAAM,CAAC,CAAA,CAAE,MAAA;AAC1D,MAAA,MAAM,cAAc,iBAAA,CAAkB,MAAA;AAGtC,MAAA,IAAI,SAAA,GAAoD,KAAA;AACxD,MAAA,IAAI,QAAA,CAAS,aAAA,KAAkB,MAAA,EAAQ,SAAA,GAAY,QAAA;AACnD,MAAA,IAAI,QAAA,GAAW,KAAO,SAAA,GAAY,MAAA;AAClC,MAAA,IAAI,KAAA,IAAS,KAAA,CAAM,aAAA,CAAc,MAAA,IAAU,GAAG,SAAA,GAAY,MAAA;AAE1D,MAAA,SAAA,CAAU,IAAA,CAAK;AAAA,QACb,IAAI,QAAA,CAAS,EAAA;AAAA,QACb,YAAY,QAAA,CAAS,EAAA;AAAA,QACrB,MAAM,QAAA,CAAS,IAAA;AAAA,QACf,WAAW,QAAA,CAAS,SAAA;AAAA,QACpB,OAAO,QAAA,CAAS,KAAA;AAAA,QAChB,QAAQ,KAAA,EAAO,SAAA,GAAY,QAAA,GAAW,MAAA,CAAO,YAAY,MAAA,GAAS,QAAA;AAAA,QAClE,QAAA,EAAU,OAAO,QAAA,IAAY,QAAA;AAAA,QAC7B,UAAU,QAAA,GAAW,GAAA;AAAA;AAAA,QACrB,SAAS,KAAA,EAAO,OAAA,KAAY,WAAA,GAAc,CAAA,GAAI,WAAW,WAAA,GAAc,GAAA,CAAA;AAAA,QACvE,WAAA,EAAa,OAAO,WAAA,IAAe,WAAA;AAAA,QACnC,aAAa,IAAA,CAAK,KAAA,CAAA,CAAO,KAAA,EAAO,WAAA,IAAe,eAAe,GAAG,CAAA;AAAA,QACjE,aAAa,KAAA,EAAO,WAAA;AAAA,QACpB,cAAc,KAAA,EAAO,YAAA;AAAA,QACrB,YAAY,KAAA,EAAO,UAAA;AAAA,QACnB,sBAAsB,KAAA,EAAO,oBAAA;AAAA,QAC7B,YAAA,EAAc,KAAA,GAAQ,IAAA,CAAK,GAAA,EAAI,GAAI,MAAA;AAAA,QACnC,eAAe,OAAA,CAAQ,MAAA;AAAA,QACvB,aAAA,EAAe,QAAA;AAAA,QACf,SAAA;AAAA,QACA,QAAA,EAAU,IAAA,CAAK,MAAA,EAAO,GAAI,CAAA;AAAA;AAAA,QAC1B,eAAe,QAAA,CAAS,aAAA;AAAA,QACxB,mBAAmB,QAAA,CAAS,iBAAA;AAAA,QAC5B,gBAAgB,QAAA,CAAS,cAAA;AAAA,QACzB,aAAA,EAAe,CAAC,QAAA,CAAS,WAAA,EAAa,SAAS,WAAW;AAAA,OAC3D,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,SAAA;AAAA,EACT,CAAA,EAAG,CAAC,MAAA,CAAO,UAAA,EAAY,MAAA,CAAO,SAAA,EAAW,MAAA,CAAO,SAAA,EAAW,aAAA,CAAc,SAAA,EAAW,aAAA,CAAc,SAAS,CAAC,CAAA;AAG5G,EAAA,MAAM,OAAA,GAAUA,cAAQ,MAAsB;AAC5C,IAAA,MAAM,YAAY,aAAA,CAAc,SAAA;AAChC,IAAA,MAAM,UAAU,SAAA,CAAU,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,WAAW,MAAM,CAAA;AACzD,IAAA,MAAM,YAAY,SAAA,CAAU,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,WAAW,QAAQ,CAAA;AAE7D,IAAA,MAAM,QAAA,GAAW,UAAU,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,GAAA,EAAK,CAAC,CAAA;AAC5D,IAAA,MAAM,aAAA,GAAgB,QAAQ,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,GAAA,EAAK,CAAC,CAAA;AAC/D,IAAA,MAAM,WAAA,GAAc,UAAU,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,GAAA,EAAK,CAAC,CAAA;AAE/D,IAAA,MAAM,OAAO,SAAA,CAAU,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,MAAM,CAAC,CAAA;AAC5C,IAAA,MAAM,SAAS,SAAA,CAAU,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,MAAM,CAAC,CAAA;AAE9C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,GAAS,CAAA,GACzB,KAAK,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,MAAM,CAAA,CAAE,GAAA,EAAK,CAAC,CAAA,GAAI,KAAK,MAAA,GAC/C,CAAA;AACJ,IAAA,MAAM,UAAU,MAAA,CAAO,MAAA,GAAS,IAC5B,IAAA,CAAK,GAAA,CAAI,OAAO,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,MAAM,CAAA,CAAE,GAAA,EAAK,CAAC,CAAC,CAAA,GAAI,OAAO,MAAA,GAC7D,CAAA;AAEJ,IAAA,MAAM,eAAe,OAAA,GAAU,CAAA,GAAI,SAAS,OAAA,GAAU,MAAA,GAAS,IAAI,QAAA,GAAW,CAAA;AAE9E,IAAA,MAAM,aAAA,GAAgB,QAAQ,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,IAAA,EAAM,CAAC,CAAA;AAChE,IAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,MAAA,GAAS,CAAA,GACjC,QAAQ,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,MAAM,CAAA,CAAE,QAAA,EAAU,CAAC,CAAA,GAAI,QAAQ,MAAA,GAC1D,CAAA;AAGJ,IAAA,MAAM,kBAAsG,EAAC;AAC7G,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,MAAM,cAAc,SAAA,CAAU,MAAA,CAAO,OAAK,CAAA,CAAE,UAAA,KAAe,MAAM,UAAU,CAAA;AAC3E,MAAA,MAAM,eAAe,WAAA,CAAY,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,WAAW,MAAM,CAAA;AAChE,MAAA,MAAM,eAAe,WAAA,CAAY,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,MAAM,CAAC,CAAA;AAEtD,MAAA,eAAA,CAAgB,KAAA,CAAM,UAAU,CAAA,GAAI;AAAA,QAClC,GAAA,EAAK,YAAY,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,GAAA,EAAK,CAAC,CAAA;AAAA,QAClD,QAAQ,WAAA,CAAY,MAAA;AAAA,QACpB,SAAS,WAAA,CAAY,MAAA,GAAS,IAAI,YAAA,CAAa,MAAA,GAAS,YAAY,MAAA,GAAS,CAAA;AAAA,QAC7E,QAAA,EAAU,aAAa,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,IAAA,EAAM,CAAC;AAAA,OAC3D;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,KAAK,GAAA,GAAS,QAAA;AAAA,MACd,cAAc,QAAA,GAAW,GAAA;AAAA,MACzB,mBAAA,EAAsB,QAAA,GAAW,GAAA,GAAO,GAAA,GAAS,GAAA;AAAA,MACjD,QAAA;AAAA,MACA,WAAA;AAAA,MACA,aAAA;AAAA,MACA,UAAU,QAAA,GAAW,GAAA;AAAA,MACrB,OAAO,QAAA,GAAW,GAAA;AAAA,MAClB,MAAA,EAAQ,QAAA;AAAA,MACR,aAAa,SAAA,CAAU,MAAA;AAAA,MACvB,WAAA,EAAa,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,SAAS,GAAG,CAAA;AAAA,MAC9C,SAAS,SAAA,CAAU,MAAA,GAAS,IAAI,IAAA,CAAK,MAAA,GAAS,UAAU,MAAA,GAAS,CAAA;AAAA,MACjE,UAAU,IAAA,CAAK,MAAA;AAAA,MACf,WAAW,MAAA,CAAO,MAAA;AAAA,MAClB,MAAA;AAAA,MACA,OAAA;AAAA,MACA,YAAA;AAAA,MACA,eAAe,OAAA,CAAQ,MAAA;AAAA,MACvB,aAAA;AAAA,MACA,WAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAA,EAAG,CAAC,aAAA,CAAc,SAAA,EAAW,MAAM,CAAC,CAAA;AAGpC,EAAA,MAAM,KAAA,GAAQF,iBAAAA,CAAY,CAAC,GAAA,KAAmB;AAC5C,IAAA,MAAA,CAAO,KAAA,CAAM,OAAO,WAAW,CAAA;AAAA,EACjC,CAAA,EAAG,CAAC,MAAA,EAAQ,WAAW,CAAC,CAAA;AAExB,EAAA,MAAM,IAAA,GAAOA,iBAAAA,CAAY,CAAC,GAAA,KAAmB;AAC3C,IAAA,MAAA,CAAO,KAAK,GAAG,CAAA;AAAA,EACjB,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,MAAM,SAAA,GAAYA,kBAAY,MAAM;AAClC,IAAA,MAAA,CAAO,SAAA,EAAU;AAAA,EACnB,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,MAAM,OAAA,GAAUA,kBAAY,YAAY;AACtC,IAAA,MAAM,QAAQ,GAAA,CAAI;AAAA,MAChB,cAAc,OAAA,EAAQ;AAAA,MACtB,cAAc,OAAA,EAAQ;AAAA,MACtB,SAAS,OAAA;AAAQ,KAClB,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,aAAA,EAAe,aAAA,EAAe,QAAQ,CAAC,CAAA;AAG3C,EAAA,MAAM,QAAA,GAAWA,iBAAAA;AAAA,IAAY,CAAC,UAAA,KAC5B,MAAA,CAAO,KAAK,CAAA,CAAA,KAAK,CAAA,CAAE,eAAe,UAAU,CAAA;AAAA,IAC5C,CAAC,MAAM;AAAA,GACT;AAEA,EAAA,MAAM,YAAA,GAAeA,iBAAAA;AAAA,IAAY,CAAC,UAAA,KAChC,MAAA,CAAO,eAAe,GAAA,CAAI,UAAU,KAAK,EAAC;AAAA,IAC1C,CAAC,OAAO,cAAc;AAAA,GACxB;AAEA,EAAA,MAAM,iBAAA,GAAoBA,iBAAAA;AAAA,IAAY,CAAC,eACrC,aAAA,CAAc,SAAA,CAAU,OAAO,CAAA,CAAA,KAAK,CAAA,CAAE,eAAe,UAAU,CAAA;AAAA,IAC/D,CAAC,cAAc,SAAS;AAAA,GAC1B;AAEA,EAAA,MAAM,iBAAA,GAAoBA,iBAAAA;AAAA,IAAY,CAAC,eACrC,aAAA,CAAc,SAAA,CAAU,OAAO,CAAA,CAAA,KAAK,CAAA,CAAE,eAAe,UAAU,CAAA;AAAA,IAC/D,CAAC,cAAc,SAAS;AAAA,GAC1B;AAGA,EAAA,MAAM,SAAA,GAAY,aAAA,CAAc,SAAA,IAAa,aAAA,CAAc,aAAa,QAAA,CAAS,SAAA;AACjF,EAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,KAAA,IAAS,aAAA,CAAc,SAAS,QAAA,CAAS,KAAA;AAErE,EAAA,OAAO;AAAA,IACL,YAAY,MAAA,CAAO,UAAA;AAAA,IACnB,MAAA;AAAA,IACA,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,gBAAgB,MAAA,CAAO,cAAA;AAAA,IACvB,WAAW,MAAA,CAAO,SAAA;AAAA,IAClB,WAAW,aAAA,CAAc,SAAA;AAAA,IACzB,eAAe,aAAA,CAAc,aAAA;AAAA,IAC7B,WAAW,aAAA,CAAc,SAAA;AAAA,IACzB,iBAAiB,aAAA,CAAc,eAAA;AAAA,IAC/B,YAAY,QAAA,CAAS,UAAA;AAAA,IACrB,OAAA;AAAA,IACA,WAAW,MAAA,CAAO,SAAA;AAAA,IAClB,SAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA,IAAA;AAAA,IACA,SAAA;AAAA,IACA,kBAAkB,MAAA,CAAO,gBAAA;AAAA,IACzB,OAAA;AAAA,IACA,QAAA;AAAA,IACA,YAAA;AAAA,IACA,iBAAA;AAAA,IACA;AAAA,GACF;AACF;;;ACzMO,SAAS,kBAAkB,OAAA,EAA0D;AAC1F,EAAA,MAAM,UAAA,GAAa,SAAS,UAAA,IAAc,IAAA;AAC1C,EAAA,MAAM,YAAA,GAAe,SAAS,YAAA,IAAgB,GAAA;AAC9C,EAAA,MAAM,OAAA,GAAU,SAAS,OAAA,IAAW,GAAA;AACpC,EAAA,MAAM,cAAc,OAAA,EAAS,WAAA;AAC7B,EAAA,MAAM,SAAA,GAAY,SAAS,SAAA,IAAa,KAAA;AAGxC,EAAA,MAAM,YAAY,iBAAA,CAAkB;AAAA,IAClC,UAAA;AAAA,IACA,YAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACD,CAAA;AAGD,EAAA,MAAM,QAAA,GAAW,kBAAA,CAAmB,EAAE,OAAA,EAAS,CAAA;AAC/C,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,EAAE,eAAA,EAAiB,cAAc,CAAA;AAClE,EAAA,MAAM,gBAAA,GAAmB,mBAAA,CAAoB,EAAE,eAAA,EAAiB,cAAc,CAAA;AAG9E,EAAA,MAAM,YAAA,GAAeE,cAAQ,MAA0B;AACrD,IAAA,MAAM,WAA+B,EAAC;AAGtC,IAAA,KAAA,MAAW,GAAA,IAAO,UAAU,IAAA,EAAM;AAChC,MAAA,QAAA,CAAS,IAAA,CAAK;AAAA,QACZ,IAAI,GAAA,CAAI,EAAA;AAAA,QACR,WAAW,GAAA,CAAI,SAAA;AAAA,QACf,MAAA,EAAQ,IAAA;AAAA,QACR,YAAY,GAAA,CAAI,UAAA;AAAA,QAChB,cAAc,GAAA,CAAI,YAAA;AAAA,QAClB,MAAM,GAAA,CAAI,IAAA;AAAA,QACV,SAAS,GAAA,CAAI,OAAA;AAAA,QACb,MAAM,GAAA,CAAI,IAAA;AAAA,QACV,YAAY,GAAA,CAAI;AAAA,OACjB,CAAA;AAAA,IACH;AAGA,IAAA,KAAA,MAAW,GAAA,IAAO,SAAS,IAAA,EAAM;AAC/B,MAAA,QAAA,CAAS,IAAA,CAAK;AAAA,QACZ,IAAI,GAAA,CAAI,EAAA;AAAA,QACR,WAAW,GAAA,CAAI,SAAA;AAAA,QACf,MAAA,EAAQ,OAAA;AAAA,QACR,MAAM,GAAA,CAAI,IAAA;AAAA,QACV,SAAS,GAAA,CAAI,OAAA;AAAA,QACb,MAAM,GAAA,CAAI,IAAA;AAAA,QACV,YAAY,GAAA,CAAI;AAAA,OACjB,CAAA;AAAA,IACH;AAGA,IAAA,OAAO,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,SAAA,GAAY,CAAA,CAAE,SAAS,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,OAAO,CAAA;AAAA,EAC5E,GAAG,CAAC,SAAA,CAAU,MAAM,QAAA,CAAS,IAAA,EAAM,OAAO,CAAC,CAAA;AAG3C,EAAA,MAAM,eAAA,GAAkBA,cAAQ,MAAsB;AACpD,IAAA,MAAM,YAAY,SAAA,CAAU,OAAA;AAG5B,IAAA,OAAO;AAAA,MACL,GAAG,SAAA;AAAA,MACH,QAAA,EAAU,SAAA,CAAU,QAAA,GAAW,QAAA,CAAS,KAAA,CAAM,QAAA;AAAA,MAC9C,WAAA,EAAa,SAAA,CAAU,WAAA,GAAc,QAAA,CAAS,KAAA,CAAM;AAAA,KACtD;AAAA,EACF,GAAG,CAAC,SAAA,CAAU,OAAA,EAAS,QAAA,CAAS,KAAK,CAAC,CAAA;AAGtC,EAAA,MAAM,QAAA,GAAWA,cAAQ,OAAO;AAAA,IAC9B,iBAAA,EAAmB,CAAC,GAAA,KAAmB;AACrC,MAAA,SAAA,CAAU,gBAAA,EAAiB;AAC3B,MAAA,UAAA,CAAW,MAAM,SAAA,CAAU,KAAA,CAAM,GAAG,GAAG,IAAI,CAAA;AAAA,IAC7C,CAAA;AAAA,IACA,gBAAA,EAAkB,CAAC,GAAA,KAAmB;AACpC,MAAA,SAAA,CAAU,KAAK,GAAG,CAAA;AAAA,IACpB,CAAA;AAAA,IACA,sBAAsB,MAAM;AAC1B,MAAA,QAAA,CAAS,KAAA,EAAM;AAAA,IACjB,CAAA;AAAA,IACA,qBAAqB,MAAM;AACzB,MAAA,QAAA,CAAS,IAAA,EAAK;AAAA,IAChB,CAAA;AAAA,IACA,UAAU,MAAM;AACd,MAAA,SAAA,CAAU,gBAAA,EAAiB;AAC3B,MAAA,UAAA,CAAW,MAAM;AACf,QAAA,SAAA,CAAU,KAAA,EAAM;AAChB,QAAA,QAAA,CAAS,KAAA,EAAM;AAAA,MACjB,GAAG,IAAI,CAAA;AAAA,IACT,CAAA;AAAA,IACA,SAAS,MAAM;AACb,MAAA,SAAA,CAAU,IAAA,EAAK;AACf,MAAA,QAAA,CAAS,IAAA,EAAK;AAAA,IAChB,CAAA;AAAA,IACA,WAAW,MAAM;AACf,MAAA,SAAA,CAAU,SAAA,EAAU;AACpB,MAAA,QAAA,CAAS,SAAA,EAAU;AAAA,IACrB,CAAA;AAAA,IACA,kBAAkB,MAAM;AACtB,MAAA,SAAA,CAAU,gBAAA,EAAiB;AAAA,IAC7B,CAAA;AAAA,IACA,YAAY,YAAY;AACtB,MAAA,MAAM,QAAQ,GAAA,CAAI;AAAA,QAChB,UAAU,OAAA,EAAQ;AAAA,QAClB,WAAW,OAAA,EAAQ;AAAA,QACnB,iBAAiB,OAAA;AAAQ,OAC1B,CAAA;AAAA,IACH;AAAA,MACE,CAAC,SAAA,EAAW,QAAA,EAAU,UAAA,EAAY,gBAAgB,CAAC,CAAA;AAGvD,EAAA,MAAM,KAAA,GAAQA,cAAQ,OAAO;AAAA,IAC3B,uBAAuB,SAAA,CAAU,SAAA;AAAA,IACjC,0BAA0B,QAAA,CAAS,SAAA;AAAA,IACnC,YAAA,EAAc,SAAA,CAAU,SAAA,IAAa,QAAA,CAAS,SAAA;AAAA,IAC9C,SAAA,EAAW,SAAA,CAAU,SAAA,IAAa,UAAA,CAAW,aAAa,gBAAA,CAAiB,SAAA;AAAA,IAC3E,KAAA,EAAO,SAAA,CAAU,KAAA,IAAS,UAAA,CAAW,SAAS,gBAAA,CAAiB;AAAA,GACjE,CAAA,EAAI,CAAC,SAAA,CAAU,SAAA,EAAW,SAAA,CAAU,SAAA,EAAW,SAAA,CAAU,KAAA,EAAO,QAAA,CAAS,SAAA,EAAW,UAAA,EAAY,gBAAgB,CAAC,CAAA;AAGjH,EAAAD,gBAAU,MAAM;AACd,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,QAAA,CAAS,QAAA,EAAS;AAAA,IACpB;AAAA,EACF,CAAA,EAAG,CAAC,SAAA,EAAW,QAAQ,CAAC,CAAA;AAExB,EAAA,OAAO;AAAA,IACL,EAAA,EAAI;AAAA,MACF,YAAY,SAAA,CAAU,UAAA;AAAA,MACtB,QAAQ,SAAA,CAAU,MAAA;AAAA,MAClB,WAAW,SAAA,CAAU,SAAA;AAAA,MACrB,WAAW,SAAA,CAAU,SAAA;AAAA,MACrB,YAAY,SAAA,CAAU,UAAA;AAAA,MACtB,gBAAgB,SAAA,CAAU,IAAA;AAAA,MAC1B,gBAAgB,SAAA,CAAU,cAAA;AAAA,MAC1B,WAAW,SAAA,CAAU;AAAA,KACvB;AAAA,IACA,KAAA,EAAO;AAAA,MACL,MAAM,QAAA,CAAS,IAAA;AAAA,MACf,kBAAkB,QAAA,CAAS,gBAAA;AAAA,MAC3B,OAAO,UAAA,CAAW,KAAA;AAAA,MAClB,aAAa,gBAAA,CAAiB,WAAA;AAAA,MAC9B,OAAO,QAAA,CAAS;AAAA,KAClB;AAAA,IACA,YAAA;AAAA,IACA,OAAA,EAAS,eAAA;AAAA,IACT,QAAA;AAAA,IACA,KAAA;AAAA,IACA,UAAU,SAAA,CAAU,QAAA;AAAA,IACpB,cAAc,SAAA,CAAU,YAAA;AAAA,IACxB,mBAAmB,SAAA,CAAU,iBAAA;AAAA,IAC7B,mBAAmB,SAAA,CAAU;AAAA,GAC/B;AACF","file":"index.js","sourcesContent":["// ══════════════════════════════════════════════════════════════════════════════\n// ONE SDK - StableFX On-Chain Forex Types & Constants\n// Shared types for stablecoin foreign exchange pool trading\n// ══════════════════════════════════════════════════════════════════════════════\n\n// ── Capital Split ────────────────────────────────────────────────────────────\n\nexport const FOREX_CAPITAL_SPLIT = {\n poolReserves: 0.50,\n tradingCapital: 0.50,\n} as const;\n\nexport function computePoolAllocations(amount: number): {\n tradingCapital: number;\n totalPoolReserves: number;\n clearing: number;\n hedging: number;\n insurance: number;\n} {\n const totalPoolReserves = amount * FOREX_CAPITAL_SPLIT.poolReserves;\n const tradingCapital = amount * FOREX_CAPITAL_SPLIT.tradingCapital;\n return {\n tradingCapital,\n totalPoolReserves,\n clearing: totalPoolReserves * 0.50,\n hedging: totalPoolReserves * 0.30,\n insurance: totalPoolReserves * 0.20,\n };\n}\n\n// ── Cycle Options ────────────────────────────────────────────────────────────\n\nexport interface ForexCycleOption {\n days: number;\n feeRate: number;\n commissionRate: number;\n label: string;\n}\n\nexport const FOREX_CYCLE_OPTIONS: ForexCycleOption[] = [\n { days: 30, feeRate: 0.10, commissionRate: 0.60, label: '30D' },\n { days: 60, feeRate: 0.08, commissionRate: 0.70, label: '60D' },\n { days: 90, feeRate: 0.07, commissionRate: 0.75, label: '90D' },\n { days: 180, feeRate: 0.05, commissionRate: 0.85, label: '180D' },\n { days: 360, feeRate: 0.03, commissionRate: 0.90, label: '360D' },\n];\n\n// ── Currency Pairs ───────────────────────────────────────────────────────────\n\nexport interface ForexCurrencyPair {\n id: string;\n base: string;\n quote: string;\n symbol: string;\n flag: string;\n name: string;\n basePrice: number;\n pipSize: number;\n spreadPips: number;\n}\n\nexport const FOREX_CURRENCY_PAIRS: ForexCurrencyPair[] = [\n { id: 'USDC_EURC', base: 'USDC', quote: 'EURC', symbol: 'USDC/EURC', flag: '\\u{1F1EA}\\u{1F1FA}', name: 'Euro', basePrice: 0.9230, pipSize: 0.0001, spreadPips: 1.2 },\n { id: 'USDC_GBPC', base: 'USDC', quote: 'GBPC', symbol: 'USDC/GBPC', flag: '\\u{1F1EC}\\u{1F1E7}', name: 'British Pound', basePrice: 0.7890, pipSize: 0.0001, spreadPips: 1.5 },\n { id: 'USDC_JPYC', base: 'USDC', quote: 'JPYC', symbol: 'USDC/JPYC', flag: '\\u{1F1EF}\\u{1F1F5}', name: 'Japanese Yen', basePrice: 154.50, pipSize: 0.01, spreadPips: 1.0 },\n { id: 'USDC_AUDC', base: 'USDC', quote: 'AUDC', symbol: 'USDC/AUDC', flag: '\\u{1F1E6}\\u{1F1FA}', name: 'Australian Dollar', basePrice: 1.5380, pipSize: 0.0001, spreadPips: 1.8 },\n { id: 'USDC_CADC', base: 'USDC', quote: 'CADC', symbol: 'USDC/CADC', flag: '\\u{1F1E8}\\u{1F1E6}', name: 'Canadian Dollar', basePrice: 1.3640, pipSize: 0.0001, spreadPips: 1.5 },\n { id: 'USDC_CHFC', base: 'USDC', quote: 'CHFC', symbol: 'USDC/CHFC', flag: '\\u{1F1E8}\\u{1F1ED}', name: 'Swiss Franc', basePrice: 0.8750, pipSize: 0.0001, spreadPips: 1.3 },\n];\n\n// ── Pools ────────────────────────────────────────────────────────────────────\n\nexport type ForexPoolType = 'clearing' | 'hedging' | 'insurance';\n\nexport interface ForexPool {\n id: ForexPoolType;\n nameKey: string;\n descriptionKey: string;\n allocation: number;\n totalSize: number;\n utilization: number;\n color: string;\n apy7d: number;\n apy30d: number;\n netFlow24h: number;\n txCount24h: number;\n txCountTotal: number;\n totalDeposits: number;\n totalWithdrawals: number;\n profitDistributed: number;\n lastUpdated: number;\n}\n\nexport const FOREX_POOL_DEFAULTS: ForexPool[] = [\n { id: 'clearing', nameKey: 'forex.pool_clearing', descriptionKey: 'forex.pool_clearing_desc', allocation: 0.50, totalSize: 12500000, utilization: 0.78, color: '#3B82F6', apy7d: 12.8, apy30d: 11.5, netFlow24h: 185000, txCount24h: 42, txCountTotal: 12840, totalDeposits: 45200000, totalWithdrawals: 32700000, profitDistributed: 1850000, lastUpdated: Date.now() },\n { id: 'hedging', nameKey: 'forex.pool_hedging', descriptionKey: 'forex.pool_hedging_desc', allocation: 0.30, totalSize: 7500000, utilization: 0.65, color: '#F59E0B', apy7d: 8.1, apy30d: 7.6, netFlow24h: 72000, txCount24h: 24, txCountTotal: 7620, totalDeposits: 28500000, totalWithdrawals: 21000000, profitDistributed: 980000, lastUpdated: Date.now() },\n { id: 'insurance', nameKey: 'forex.pool_insurance', descriptionKey: 'forex.pool_insurance_desc', allocation: 0.20, totalSize: 5000000, utilization: 0.42, color: '#10B981', apy7d: 4.8, apy30d: 4.5, netFlow24h: 35000, txCount24h: 14, txCountTotal: 4280, totalDeposits: 15800000, totalWithdrawals: 10800000, profitDistributed: 520000, lastUpdated: Date.now() },\n];\n\n// ── Pool Transactions ────────────────────────────────────────────────────────\n\nexport type ForexPoolTransactionType =\n | 'deposit' | 'withdrawal' | 'profit_distribution'\n | 'loss_absorption' | 'inter_pool_transfer' | 'fee_collection' | 'reserve_rebalance';\n\nexport interface ForexPoolTransaction {\n id: string;\n poolId: ForexPoolType;\n type: ForexPoolTransactionType;\n amount: number;\n balanceBefore: number;\n balanceAfter: number;\n txHash: string;\n blockNumber: number;\n timestamp: number;\n description: string;\n}\n\n// ── Pool Daily Snapshots ────────────────────────────────────────────────────\n\nexport interface ForexPoolDailySnapshot {\n poolId: ForexPoolType;\n date: string;\n openBalance: number;\n closeBalance: number;\n deposits: number;\n withdrawals: number;\n netFlow: number;\n dailyPnl: number;\n dailyPnlPct: number;\n cumulativePnl: number;\n utilization: number;\n txCount: number;\n activeUsers: number;\n}\n\n// ── Positions ────────────────────────────────────────────────────────────────\n\nexport interface ForexPosition {\n id: string;\n pairId: string;\n side: 'BUY' | 'SELL';\n lots: number;\n pips: number;\n entryPrice: number;\n currentPrice: number;\n pnl: number;\n openTime: number;\n}\n\n// ── Investment ───────────────────────────────────────────────────────────────\n\nexport interface ForexInvestment {\n id: string;\n userId?: string;\n amount: number;\n currentValue: number;\n profit: number;\n status: 'active' | 'completed' | 'pending' | 'redeemed' | 'cancelled';\n selectedPairs: string[];\n cycleDays: number;\n cycleOption: ForexCycleOption;\n feeRate?: number;\n commissionRate?: number;\n startDate: string;\n endDate: string;\n tradingCapital: number;\n totalPoolReserves: number;\n poolAllocations: {\n clearing: number;\n hedging: number;\n insurance: number;\n };\n tradeWeight: number;\n totalLots: number;\n totalPips: number;\n totalTrades: number;\n positions: ForexPosition[];\n tradeHistory: ForexTradeRecord[];\n redeemedAt?: string;\n createdAt?: string;\n updatedAt?: string;\n}\n\n// ── Trade Records ────────────────────────────────────────────────────────────\n\nexport type ForexTradeStatus = 'RFQ' | 'QUOTED' | 'MATCHED' | 'SETTLED' | 'FAILED';\n\nexport interface ForexTradeRecord {\n id: string;\n timestamp: number;\n pairId: string;\n pairSymbol: string;\n side: 'BUY' | 'SELL';\n rfqPrice: number;\n quotePrice: number;\n matchPrice: number;\n settlePrice: number;\n lots: number;\n pips: number;\n pnl: number;\n status: ForexTradeStatus;\n pvpSettled: boolean;\n clearingFee?: number;\n hedgingCost?: number;\n insuranceReserve?: number;\n txHash?: string;\n blockNumber?: number;\n cycleDay?: number;\n cumulativePnl?: number;\n}\n\n// ── Console Log Types ────────────────────────────────────────────────────────\n\nexport type ForexLogType =\n | 'RFQ' | 'QUOTE' | 'MATCH' | 'SETTLE' | 'PVP'\n | 'HEDGE' | 'CLEAR' | 'POSITION' | 'PNL' | 'SYSTEM';\n\nexport interface ForexLogEntry {\n id: string;\n timestamp: number;\n type: ForexLogType;\n message: string;\n data?: Record<string, any>;\n importance: 'low' | 'medium' | 'high';\n pairId?: string;\n}\n\n// ── Agent ────────────────────────────────────────────────────────────────────\n\nexport interface ForexAgent {\n id: string;\n nameKey: string;\n descriptionKey: string;\n icon: string;\n color: string;\n supportedPairs: string[];\n dailyRoiMin: number;\n dailyRoiMax: number;\n totalManaged: number;\n totalUsers: number;\n winRate: number;\n}\n\nexport const FOREX_AGENT: ForexAgent = {\n id: 'stablefx-01',\n nameKey: 'forex.agent_name',\n descriptionKey: 'forex.agent_description',\n icon: '\\u{1F4B1}',\n color: '#0EA5E9',\n supportedPairs: FOREX_CURRENCY_PAIRS.map(p => p.id),\n dailyRoiMin: 0.002,\n dailyRoiMax: 0.005,\n totalManaged: 25000000,\n totalUsers: 3847,\n winRate: 72.5,\n};\n\n// ── Profit Calculation ───────────────────────────────────────────────────────\n\nexport function calculateForexNetProfit(\n grossProfit: number,\n cycleOption: ForexCycleOption,\n): { feeAmount: number; postFeeProfit: number; netProfit: number } {\n const feeAmount = grossProfit * cycleOption.feeRate;\n const postFeeProfit = grossProfit - feeAmount;\n const netProfit = postFeeProfit * cycleOption.commissionRate;\n return { feeAmount, postFeeProfit, netProfit };\n}\n\nexport function estimateForexProfit(\n amount: number,\n cycleDays: number,\n agent: ForexAgent = FOREX_AGENT,\n): { grossProfit: number; feeAmount: number; netProfit: number; dailyRate: number } {\n const cycleOption = FOREX_CYCLE_OPTIONS.find(c => c.days === cycleDays) || FOREX_CYCLE_OPTIONS[0];\n const estimatedApy = ((agent.dailyRoiMin + agent.dailyRoiMax) / 2) * 365 * 100;\n const dailyRate = estimatedApy / 100 / 365;\n const grossProfit = amount * dailyRate * cycleDays;\n const { feeAmount, netProfit } = calculateForexNetProfit(grossProfit, cycleOption);\n return { grossProfit, feeAmount, netProfit, dailyRate };\n}\n","// ForexPoolDataGenerator.ts - Generates historical pool snapshots, transactions, and trade history\n// Singleton service following existing pattern (like ForexSimulationEngine)\n\nimport type {\n ForexPoolType,\n ForexPoolDailySnapshot,\n ForexPoolTransaction,\n ForexPoolTransactionType,\n ForexTradeRecord,\n} from '../../types/forex';\nimport { FOREX_CURRENCY_PAIRS, FOREX_POOL_DEFAULTS, FOREX_AGENT } from '../../types/forex';\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction rand(min: number, max: number): number {\n return min + Math.random() * (max - min);\n}\n\nfunction randInt(min: number, max: number): number {\n return Math.floor(rand(min, max + 1));\n}\n\nfunction pick<T>(arr: T[]): T {\n return arr[Math.floor(Math.random() * arr.length)];\n}\n\nfunction genTxHash(): string {\n const chars = '0123456789abcdef';\n let hash = '0x';\n for (let i = 0; i < 64; i++) hash += chars[Math.floor(Math.random() * 16)];\n return hash;\n}\n\nfunction formatDate(d: Date): string {\n return d.toISOString().split('T')[0];\n}\n\nlet _idCounter = 0;\nfunction genId(prefix: string): string {\n return `${prefix}_${Date.now().toString(36)}_${(++_idCounter).toString(36)}`;\n}\n\n// ── Pool Parameters ──────────────────────────────────────────────────────────\n\ninterface PoolParams {\n meanDailyPnlPct: number;\n stddevPnlPct: number;\n utilizationMin: number;\n utilizationMax: number;\n depositsPerDay: [number, number];\n withdrawalsPerDay: [number, number];\n profitDistPerDay: number;\n avgDepositSize: number;\n avgWithdrawalSize: number;\n}\n\nconst POOL_PARAMS: Record<ForexPoolType, PoolParams> = {\n clearing: {\n meanDailyPnlPct: 0.00035,\n stddevPnlPct: 0.00015,\n utilizationMin: 0.70,\n utilizationMax: 0.85,\n depositsPerDay: [15, 25],\n withdrawalsPerDay: [8, 12],\n profitDistPerDay: 5,\n avgDepositSize: 25000,\n avgWithdrawalSize: 18000,\n },\n hedging: {\n meanDailyPnlPct: 0.00022,\n stddevPnlPct: 0.00020,\n utilizationMin: 0.55,\n utilizationMax: 0.75,\n depositsPerDay: [8, 15],\n withdrawalsPerDay: [5, 8],\n profitDistPerDay: 3,\n avgDepositSize: 18000,\n avgWithdrawalSize: 12000,\n },\n insurance: {\n meanDailyPnlPct: 0.00013,\n stddevPnlPct: 0.00008,\n utilizationMin: 0.30,\n utilizationMax: 0.50,\n depositsPerDay: [5, 10],\n withdrawalsPerDay: [3, 5],\n profitDistPerDay: 2,\n avgDepositSize: 12000,\n avgWithdrawalSize: 8000,\n },\n};\n\n// ── Generator Class ──────────────────────────────────────────────────────────\n\nclass ForexPoolDataGeneratorClass {\n private snapshotCache: Record<ForexPoolType, ForexPoolDailySnapshot[]> | null = null;\n private transactionCache: ForexPoolTransaction[] | null = null;\n private baseBlockNumber = 19_500_000;\n\n // ── Public API ─────────────────────────────────────────────────────────\n\n generateAllSnapshots(): Record<ForexPoolType, ForexPoolDailySnapshot[]> {\n if (this.snapshotCache) return this.snapshotCache;\n\n const result: Record<ForexPoolType, ForexPoolDailySnapshot[]> = {\n clearing: [],\n hedging: [],\n insurance: [],\n };\n\n for (const pool of FOREX_POOL_DEFAULTS) {\n result[pool.id] = this.generatePoolSnapshots(pool.id, pool.totalSize);\n }\n\n this.snapshotCache = result;\n return result;\n }\n\n generateAllTransactions(): ForexPoolTransaction[] {\n if (this.transactionCache) return this.transactionCache;\n\n const allTx: ForexPoolTransaction[] = [];\n\n for (const pool of FOREX_POOL_DEFAULTS) {\n const snapshots = this.snapshotCache?.[pool.id] || this.generatePoolSnapshots(pool.id, pool.totalSize);\n const txs = this.generatePoolTransactions(pool.id, snapshots);\n allTx.push(...txs);\n }\n\n // Add inter-pool transfers (~2-3/week = ~17-26 over 60 days)\n const now = new Date();\n for (let i = 0; i < 60; i++) {\n const day = new Date(now);\n day.setDate(day.getDate() - (60 - i));\n const dayOfWeek = day.getDay();\n\n // Inter-pool transfers: ~2-3 per week\n if (dayOfWeek === 2 || dayOfWeek === 4 || (dayOfWeek === 5 && Math.random() < 0.4)) {\n const fromPool = pick(['clearing', 'hedging', 'insurance'] as ForexPoolType[]);\n const toOptions = (['clearing', 'hedging', 'insurance'] as ForexPoolType[]).filter(p => p !== fromPool);\n const toPool = pick(toOptions);\n const amount = rand(50000, 200000);\n const ts = day.getTime() + randInt(10, 18) * 3600000;\n\n allTx.push({\n id: genId('ipt'),\n poolId: fromPool,\n type: 'inter_pool_transfer',\n amount: -amount,\n balanceBefore: 0,\n balanceAfter: 0,\n txHash: genTxHash(),\n blockNumber: this.baseBlockNumber + i * 7200 + randInt(0, 100),\n timestamp: ts,\n description: `Transfer to ${toPool} pool`,\n });\n\n allTx.push({\n id: genId('ipt'),\n poolId: toPool,\n type: 'inter_pool_transfer',\n amount: amount,\n balanceBefore: 0,\n balanceAfter: 0,\n txHash: genTxHash(),\n blockNumber: this.baseBlockNumber + i * 7200 + randInt(100, 200),\n timestamp: ts + 5000,\n description: `Transfer from ${fromPool} pool`,\n });\n }\n\n // Reserve rebalance: ~1/week\n if (dayOfWeek === 3 && Math.random() < 0.85) {\n const pool = pick(FOREX_POOL_DEFAULTS);\n const rebalanceAmt = rand(20000, 100000);\n const ts = day.getTime() + randInt(2, 6) * 3600000;\n allTx.push({\n id: genId('rrb'),\n poolId: pool.id,\n type: 'reserve_rebalance',\n amount: Math.random() < 0.5 ? rebalanceAmt : -rebalanceAmt,\n balanceBefore: 0,\n balanceAfter: 0,\n txHash: genTxHash(),\n blockNumber: this.baseBlockNumber + i * 7200 + randInt(200, 300),\n timestamp: ts,\n description: 'Automated reserve rebalance',\n });\n }\n }\n\n // Sort all transactions by timestamp\n allTx.sort((a, b) => a.timestamp - b.timestamp);\n\n // Assign running balances per pool\n const runningBalance: Record<ForexPoolType, number> = {\n clearing: FOREX_POOL_DEFAULTS[0].totalSize * 0.85,\n hedging: FOREX_POOL_DEFAULTS[1].totalSize * 0.82,\n insurance: FOREX_POOL_DEFAULTS[2].totalSize * 0.88,\n };\n\n for (const tx of allTx) {\n tx.balanceBefore = runningBalance[tx.poolId];\n runningBalance[tx.poolId] += tx.amount;\n tx.balanceAfter = runningBalance[tx.poolId];\n }\n\n this.transactionCache = allTx;\n return allTx;\n }\n\n generateTradeHistory(\n investmentAmount: number,\n startDate: string,\n selectedPairs: string[],\n ): ForexTradeRecord[] {\n const trades: ForexTradeRecord[] = [];\n const start = new Date(startDate);\n const now = new Date();\n const dayCount = Math.min(60, Math.ceil((now.getTime() - start.getTime()) / 86400000));\n let cumulativePnl = 0;\n let blockNum = this.baseBlockNumber + randInt(0, 5000);\n\n for (let d = 0; d < dayCount; d++) {\n const day = new Date(start);\n day.setDate(day.getDate() + d);\n const dayOfWeek = day.getDay();\n\n // Fewer trades on weekends\n const baseCount = (dayOfWeek === 0 || dayOfWeek === 6) ? randInt(1, 2) : randInt(3, 8);\n\n for (let t = 0; t < baseCount; t++) {\n const pair = FOREX_CURRENCY_PAIRS.find(p => p.id === pick(selectedPairs)) || pick(FOREX_CURRENCY_PAIRS);\n const side: 'BUY' | 'SELL' = Math.random() > 0.5 ? 'BUY' : 'SELL';\n const lots = parseFloat(rand(0.1, 2.5).toFixed(2));\n const rfqPrice = pair.basePrice * (1 + rand(-0.003, 0.003));\n const quoteSpread = rand(0.5, 2.0) * pair.pipSize;\n const quotePrice = side === 'BUY' ? rfqPrice + quoteSpread : rfqPrice - quoteSpread;\n\n // 85% match rate\n const matched = Math.random() < 0.85;\n if (!matched) continue;\n\n const matchPrice = quotePrice * (1 + rand(-0.00005, 0.00005));\n const settlePrice = matchPrice * (1 + rand(-0.00002, 0.00002));\n const pips = ((settlePrice - rfqPrice) / pair.pipSize) * (side === 'BUY' ? 1 : -1);\n const pnl = pips * pair.pipSize * lots * 100000;\n\n // Win rate matching FOREX_AGENT\n const isWin = Math.random() < (FOREX_AGENT.winRate / 100);\n const finalPnl = isWin ? Math.abs(pnl) : -Math.abs(pnl) * rand(0.3, 0.8);\n cumulativePnl += finalPnl;\n\n const clearingFee = Math.abs(finalPnl) * rand(0.001, 0.003);\n const hedgingCost = Math.abs(finalPnl) * rand(0.0005, 0.002);\n const insuranceReserve = Math.abs(finalPnl) * rand(0.0003, 0.001);\n\n blockNum += randInt(1, 20);\n const timestamp = day.getTime() + randInt(0, 23) * 3600000 + randInt(0, 3600000);\n\n trades.push({\n id: genId('FXT'),\n timestamp,\n pairId: pair.id,\n pairSymbol: pair.symbol,\n side,\n rfqPrice,\n quotePrice,\n matchPrice,\n settlePrice,\n lots,\n pips: isWin ? Math.abs(pips) : -Math.abs(pips) * rand(0.3, 0.8),\n pnl: finalPnl,\n status: 'SETTLED',\n pvpSettled: true,\n clearingFee,\n hedgingCost,\n insuranceReserve,\n txHash: genTxHash(),\n blockNumber: blockNum,\n cycleDay: d + 1,\n cumulativePnl,\n });\n }\n }\n\n trades.sort((a, b) => a.timestamp - b.timestamp);\n return trades;\n }\n\n generateLiveTransaction(\n poolId: ForexPoolType,\n type: ForexPoolTransactionType,\n baseAmount?: number,\n ): ForexPoolTransaction {\n const params = POOL_PARAMS[poolId];\n let amount: number;\n\n switch (type) {\n case 'deposit':\n amount = baseAmount ?? rand(params.avgDepositSize * 0.5, params.avgDepositSize * 1.5);\n break;\n case 'withdrawal':\n amount = -(baseAmount ?? rand(params.avgWithdrawalSize * 0.5, params.avgWithdrawalSize * 1.5));\n break;\n case 'profit_distribution':\n amount = baseAmount ?? rand(500, 5000);\n break;\n case 'fee_collection':\n amount = baseAmount ?? rand(100, 2000);\n break;\n case 'loss_absorption':\n amount = -(baseAmount ?? rand(200, 3000));\n break;\n default:\n amount = baseAmount ?? rand(-5000, 5000);\n }\n\n const pool = FOREX_POOL_DEFAULTS.find(p => p.id === poolId)!;\n const balanceBefore = pool.totalSize;\n\n return {\n id: genId('ptx'),\n poolId,\n type,\n amount,\n balanceBefore,\n balanceAfter: balanceBefore + amount,\n txHash: genTxHash(),\n blockNumber: this.baseBlockNumber + Math.floor(Date.now() / 12000),\n timestamp: Date.now(),\n description: this.getTxDescription(type, poolId, Math.abs(amount)),\n };\n }\n\n // ── Private Methods ────────────────────────────────────────────────────\n\n private generatePoolSnapshots(\n poolId: ForexPoolType,\n currentSize: number,\n ): ForexPoolDailySnapshot[] {\n const params = POOL_PARAMS[poolId];\n const snapshots: ForexPoolDailySnapshot[] = [];\n const now = new Date();\n\n // Work backward: start with a smaller balance 60 days ago\n let balance = currentSize * rand(0.82, 0.88);\n let cumulativePnl = 0;\n\n for (let i = 59; i >= 0; i--) {\n const day = new Date(now);\n day.setDate(day.getDate() - i);\n const dayOfWeek = day.getDay();\n const isWeekend = dayOfWeek === 0 || dayOfWeek === 6;\n\n const openBalance = balance;\n\n // Weekend activity ~20% of weekday\n const activityMultiplier = isWeekend ? 0.2 : 1.0;\n\n // Daily PnL with occasional drawdowns (1-2 per week)\n const isDrawdown = !isWeekend && Math.random() < 0.2; // ~1.4/week\n let dailyPnlPct: number;\n if (isDrawdown) {\n dailyPnlPct = -rand(0.0001, params.stddevPnlPct * 2);\n } else {\n dailyPnlPct = this.gaussianRandom(params.meanDailyPnlPct, params.stddevPnlPct);\n }\n dailyPnlPct *= activityMultiplier;\n\n const dailyPnl = balance * dailyPnlPct;\n cumulativePnl += dailyPnl;\n\n // Net deposits: organic growth with slight positive bias\n const depositCount = isWeekend\n ? randInt(1, Math.ceil(params.depositsPerDay[0] * 0.2))\n : randInt(params.depositsPerDay[0], params.depositsPerDay[1]);\n const withdrawalCount = isWeekend\n ? randInt(0, Math.ceil(params.withdrawalsPerDay[0] * 0.2))\n : randInt(params.withdrawalsPerDay[0], params.withdrawalsPerDay[1]);\n\n const deposits = depositCount * params.avgDepositSize * rand(0.7, 1.3) * activityMultiplier;\n const withdrawals = withdrawalCount * params.avgWithdrawalSize * rand(0.7, 1.3) * activityMultiplier;\n const netFlow = deposits - withdrawals;\n\n balance += dailyPnl + netFlow;\n\n const txCount = depositCount + withdrawalCount + Math.round(params.profitDistPerDay * activityMultiplier);\n const utilization = rand(params.utilizationMin, params.utilizationMax);\n const activeUsers = Math.round(rand(80, 400) * activityMultiplier);\n\n snapshots.push({\n poolId,\n date: formatDate(day),\n openBalance,\n closeBalance: balance,\n deposits,\n withdrawals,\n netFlow,\n dailyPnl,\n dailyPnlPct,\n cumulativePnl,\n utilization,\n txCount,\n activeUsers,\n });\n }\n\n return snapshots;\n }\n\n private generatePoolTransactions(\n poolId: ForexPoolType,\n snapshots: ForexPoolDailySnapshot[],\n ): ForexPoolTransaction[] {\n const params = POOL_PARAMS[poolId];\n const transactions: ForexPoolTransaction[] = [];\n\n for (const snap of snapshots) {\n const day = new Date(snap.date);\n const dayOfWeek = day.getDay();\n const isWeekend = dayOfWeek === 0 || dayOfWeek === 6;\n const mult = isWeekend ? 0.2 : 1.0;\n\n const depositCount = Math.round(randInt(params.depositsPerDay[0], params.depositsPerDay[1]) * mult);\n const withdrawalCount = Math.round(randInt(params.withdrawalsPerDay[0], params.withdrawalsPerDay[1]) * mult);\n const profitCount = Math.round(params.profitDistPerDay * mult);\n\n // Deposits\n for (let i = 0; i < depositCount; i++) {\n const amount = rand(params.avgDepositSize * 0.3, params.avgDepositSize * 2.0);\n const ts = day.getTime() + randInt(0, 23) * 3600000 + randInt(0, 3600000);\n transactions.push({\n id: genId('dep'),\n poolId,\n type: 'deposit',\n amount,\n balanceBefore: 0,\n balanceAfter: 0,\n txHash: genTxHash(),\n blockNumber: this.baseBlockNumber + Math.floor(ts / 12000) + randInt(0, 50),\n timestamp: ts,\n description: `Deposit to ${poolId} pool`,\n });\n }\n\n // Withdrawals\n for (let i = 0; i < withdrawalCount; i++) {\n const amount = rand(params.avgWithdrawalSize * 0.3, params.avgWithdrawalSize * 2.0);\n const ts = day.getTime() + randInt(0, 23) * 3600000 + randInt(0, 3600000);\n transactions.push({\n id: genId('wdr'),\n poolId,\n type: 'withdrawal',\n amount: -amount,\n balanceBefore: 0,\n balanceAfter: 0,\n txHash: genTxHash(),\n blockNumber: this.baseBlockNumber + Math.floor(ts / 12000) + randInt(0, 50),\n timestamp: ts,\n description: `Withdrawal from ${poolId} pool`,\n });\n }\n\n // Profit distributions\n for (let i = 0; i < profitCount; i++) {\n const amount = rand(500, 8000);\n const ts = day.getTime() + randInt(6, 22) * 3600000 + randInt(0, 3600000);\n transactions.push({\n id: genId('prd'),\n poolId,\n type: 'profit_distribution',\n amount,\n balanceBefore: 0,\n balanceAfter: 0,\n txHash: genTxHash(),\n blockNumber: this.baseBlockNumber + Math.floor(ts / 12000) + randInt(0, 50),\n timestamp: ts,\n description: `Profit distribution from ${poolId} pool`,\n });\n }\n\n // Fee collection (1-2 per day on weekdays)\n if (!isWeekend) {\n const feeCount = randInt(1, 2);\n for (let i = 0; i < feeCount; i++) {\n const amount = rand(100, 3000);\n const ts = day.getTime() + randInt(8, 20) * 3600000;\n transactions.push({\n id: genId('fee'),\n poolId,\n type: 'fee_collection',\n amount,\n balanceBefore: 0,\n balanceAfter: 0,\n txHash: genTxHash(),\n blockNumber: this.baseBlockNumber + Math.floor(ts / 12000) + randInt(0, 50),\n timestamp: ts,\n description: `Fee collection for ${poolId} pool`,\n });\n }\n }\n }\n\n return transactions;\n }\n\n private gaussianRandom(mean: number, stddev: number): number {\n let u = 0, v = 0;\n while (u === 0) u = Math.random();\n while (v === 0) v = Math.random();\n const z = Math.sqrt(-2.0 * Math.log(u)) * Math.cos(2.0 * Math.PI * v);\n return mean + z * stddev;\n }\n\n private getTxDescription(type: ForexPoolTransactionType, poolId: ForexPoolType, amount: number): string {\n const fmt = `$${amount.toLocaleString(undefined, { maximumFractionDigits: 0 })}`;\n switch (type) {\n case 'deposit': return `Deposit ${fmt} to ${poolId} pool`;\n case 'withdrawal': return `Withdrawal ${fmt} from ${poolId} pool`;\n case 'profit_distribution': return `Profit distribution ${fmt} from ${poolId}`;\n case 'loss_absorption': return `Loss absorbed ${fmt} by ${poolId} pool`;\n case 'inter_pool_transfer': return `Inter-pool transfer ${fmt}`;\n case 'fee_collection': return `Fee collected ${fmt} in ${poolId}`;\n case 'reserve_rebalance': return `Reserve rebalance ${fmt} in ${poolId}`;\n default: return `${type} ${fmt}`;\n }\n }\n}\n\n// ── Singleton Export ──────────────────────────────────────────────────────────\n\nlet _instance: ForexPoolDataGeneratorClass | null = null;\n\nexport const ForexPoolDataGenerator = {\n getInstance(): ForexPoolDataGeneratorClass {\n if (!_instance) {\n _instance = new ForexPoolDataGeneratorClass();\n }\n return _instance;\n },\n};\n","// ForexSimulationEngine.ts - StableFX RFQ+PvP on-chain forex simulation engine\n// Simulates Circle StableFX-style foreign exchange operations using USDC stablecoin pairs\n\nimport type {\n ForexLogEntry,\n ForexLogType,\n ForexCurrencyPair,\n ForexTradeRecord,\n ForexPosition,\n ForexPoolTransaction,\n} from '../../types/forex';\nimport { FOREX_CURRENCY_PAIRS } from '../../types/forex';\n\n// ── Types ──────────────────────────────────────────────────────────────────────\n\ntype LogCallback = (entry: ForexLogEntry) => void;\ntype PoolTxCallback = (tx: ForexPoolTransaction) => void;\n\ninterface PairState {\n pair: ForexCurrencyPair;\n currentPrice: number;\n bidPrice: number;\n askPrice: number;\n lastSpread: number;\n}\n\n// ── Helpers ────────────────────────────────────────────────────────────────────\n\nlet idCounter = 0;\nfunction genId(): string {\n return `fxlog_${Date.now()}_${++idCounter}`;\n}\n\nfunction tradeId(): string {\n return `FXT_${Date.now().toString(36).toUpperCase()}_${(++idCounter).toString(36).toUpperCase()}`;\n}\n\nfunction rand(min: number, max: number): number {\n return min + Math.random() * (max - min);\n}\n\nfunction randInt(min: number, max: number): number {\n return Math.floor(rand(min, max + 1));\n}\n\nfunction pick<T>(arr: T[]): T {\n return arr[Math.floor(Math.random() * arr.length)];\n}\n\nfunction formatRate(price: number, pair: ForexCurrencyPair): string {\n if (pair.pipSize >= 0.01) return price.toFixed(3);\n return price.toFixed(5);\n}\n\n// ── News Headlines ───────────────────────────────────────────────────────────\n\nconst FX_NEWS = [\n 'ECB signals potential rate adjustment, EUR pairs volatile',\n 'BOJ maintains yield curve control, JPY weakens further',\n 'Fed minutes reveal hawkish sentiment, USD strengthens',\n 'UK CPI data beats expectations, GBP rallies',\n 'RBA holds rates steady, AUD consolidates',\n 'SNB intervenes in currency markets, CHF stabilizes',\n 'Bank of Canada rate decision pending, CAD in focus',\n 'Cross-border stablecoin settlement volume hits $2.1B daily',\n 'Circle USDC reserves fully backed, attestation report released',\n 'DeFi forex protocol TVL reaches new high at $890M',\n 'On-chain FX liquidity deepens across major pairs',\n 'Institutional adoption of on-chain forex accelerates',\n];\n\n// ── Engine ─────────────────────────────────────────────────────────────────────\n\nclass ForexSimulationEngine {\n private listeners: LogCallback[] = [];\n private poolTxListeners: PoolTxCallback[] = [];\n private cycleTimer: ReturnType<typeof setTimeout> | null = null;\n private pairStates: Map<string, PairState> = new Map();\n private running = false;\n private openPositions: ForexPosition[] = [];\n private totalPnl = 0;\n private totalTrades = 0;\n private totalPips = 0;\n private totalLots = 0;\n\n constructor() {\n for (const pair of FOREX_CURRENCY_PAIRS) {\n const jitter = pair.basePrice * rand(-0.003, 0.003);\n const price = pair.basePrice + jitter;\n const halfSpread = pair.spreadPips * pair.pipSize / 2;\n this.pairStates.set(pair.id, {\n pair,\n currentPrice: price,\n bidPrice: price - halfSpread,\n askPrice: price + halfSpread,\n lastSpread: pair.spreadPips,\n });\n }\n }\n\n // ── Public API ─────────────────────────────────────────────────────────────\n\n start(): void {\n this.running = true;\n this.scheduleCycle();\n }\n\n stop(): void {\n this.running = false;\n if (this.cycleTimer) {\n clearTimeout(this.cycleTimer);\n this.cycleTimer = null;\n }\n }\n\n onLog(callback: LogCallback): () => void {\n this.listeners.push(callback);\n return () => {\n this.listeners = this.listeners.filter(l => l !== callback);\n };\n }\n\n onPoolTransaction(callback: PoolTxCallback): () => void {\n this.poolTxListeners.push(callback);\n return () => {\n this.poolTxListeners = this.poolTxListeners.filter(l => l !== callback);\n };\n }\n\n isRunning(): boolean {\n return this.running;\n }\n\n getStats(): { totalPnl: number; totalTrades: number; totalPips: number; totalLots: number; positions: number } {\n return {\n totalPnl: this.totalPnl,\n totalTrades: this.totalTrades,\n totalPips: this.totalPips,\n totalLots: this.totalLots,\n positions: this.openPositions.length,\n };\n }\n\n getPairStates(): Map<string, PairState> {\n return this.pairStates;\n }\n\n emitBootSequence(): void {\n const bootMessages: Array<{ msg: string; delay: number }> = [\n { msg: 'Initializing StableFX Engine v2.1.0...', delay: 0 },\n { msg: 'Connecting to Circle StableFX RFQ network...', delay: 500 },\n { msg: 'Loading USDC stablecoin pair feeds (6 pairs)...', delay: 1200 },\n { msg: 'Calibrating PvP settlement engine...', delay: 2000 },\n { msg: 'Initializing clearing pool ($12.5M)...', delay: 2800 },\n { msg: 'Initializing hedging pool ($7.5M)...', delay: 3400 },\n { msg: 'Initializing insurance pool ($5.0M)...', delay: 4000 },\n { msg: 'Risk management module online (max exposure: 25%)', delay: 4500 },\n { msg: '=== StableFX Engine ready. Starting RFQ cycles ===', delay: 5000 },\n ];\n\n for (const { msg, delay } of bootMessages) {\n setTimeout(() => {\n this.emit({\n id: genId(),\n timestamp: Date.now(),\n type: 'SYSTEM',\n message: msg,\n importance: 'medium',\n });\n }, delay);\n }\n }\n\n destroy(): void {\n this.stop();\n this.listeners = [];\n this.poolTxListeners = [];\n this.pairStates.clear();\n this.openPositions = [];\n }\n\n // ── Private Methods ────────────────────────────────────────────────────────\n\n private emit(entry: ForexLogEntry): void {\n for (const listener of this.listeners) {\n listener(entry);\n }\n }\n\n private emitPoolTx(tx: ForexPoolTransaction): void {\n for (const listener of this.poolTxListeners) {\n listener(tx);\n }\n }\n\n private generatePoolTxFromEvent(\n type: 'SETTLE' | 'HEDGE' | 'CLEAR',\n data: { pnl?: number; volume?: number; lots?: number },\n ): void {\n try {\n const { ForexPoolDataGenerator } = require('./ForexPoolDataGenerator');\n const generator = ForexPoolDataGenerator.getInstance();\n\n if (type === 'SETTLE' && data.pnl !== undefined) {\n const tx = generator.generateLiveTransaction('clearing', 'fee_collection', Math.abs(data.pnl) * rand(0.001, 0.003));\n this.emitPoolTx(tx);\n } else if (type === 'HEDGE') {\n const tx = generator.generateLiveTransaction('hedging', data.pnl && data.pnl < 0 ? 'loss_absorption' : 'profit_distribution', Math.abs(data.lots || 1) * rand(50, 200));\n this.emitPoolTx(tx);\n } else if (type === 'CLEAR') {\n const tx = generator.generateLiveTransaction('clearing', 'profit_distribution', (data.volume || 100000) * rand(0.0001, 0.0005));\n this.emitPoolTx(tx);\n }\n } catch {\n // Generator not available\n }\n }\n\n private scheduleCycle(): void {\n if (!this.running) return;\n const interval = rand(8000, 14000);\n this.cycleTimer = setTimeout(() => {\n if (this.running) {\n this.runTradeCycle();\n this.scheduleCycle();\n }\n }, interval);\n }\n\n private simulatePrice(pairId: string): number {\n const state = this.pairStates.get(pairId);\n if (!state) return 0;\n const volatility = state.pair.id.includes('JPYC') ? 0.0008 : 0.0004;\n const drift = rand(-volatility, volatility);\n const newPrice = state.currentPrice * (1 + drift);\n const halfSpread = (state.pair.spreadPips + rand(-0.3, 0.3)) * state.pair.pipSize / 2;\n state.currentPrice = newPrice;\n state.bidPrice = newPrice - halfSpread;\n state.askPrice = newPrice + halfSpread;\n state.lastSpread = halfSpread * 2 / state.pair.pipSize;\n return newPrice;\n }\n\n private runTradeCycle(): void {\n const pairState = pick(Array.from(this.pairStates.values()));\n const pair = pairState.pair;\n const entries: Array<{ entry: Omit<ForexLogEntry, 'id' | 'timestamp'>; delay: number }> = [];\n let delay = 0;\n\n // Update price\n const price = this.simulatePrice(pair.id);\n\n // 1. RFQ - Request for Quote\n const side = Math.random() > 0.5 ? 'BUY' : 'SELL';\n const lots = parseFloat((rand(0.1, 2.5)).toFixed(2));\n const notional = lots * 100000;\n const rfqId = tradeId();\n\n entries.push({\n entry: {\n type: 'RFQ',\n message: `RFQ ${rfqId} | ${pair.symbol} ${side} ${lots.toFixed(2)} lots ($${(notional / 1000).toFixed(0)}K) | Mid: ${formatRate(price, pair)}`,\n data: { rfqId, pair: pair.id, side, lots, price },\n importance: 'medium',\n pairId: pair.id,\n },\n delay,\n });\n delay += rand(400, 800);\n\n // 2. QUOTE - Price quote from LP\n const quoteSpread = rand(0.5, 2.0) * pair.pipSize;\n const quotePrice = side === 'BUY'\n ? price + quoteSpread\n : price - quoteSpread;\n const quotePips = Math.abs(quotePrice - price) / pair.pipSize;\n\n entries.push({\n entry: {\n type: 'QUOTE',\n message: `QUOTE ${rfqId} | ${pair.symbol} @ ${formatRate(quotePrice, pair)} | Spread: ${quotePips.toFixed(1)} pips | Valid: 3s`,\n data: { rfqId, quotePrice, spread: quotePips },\n importance: 'medium',\n pairId: pair.id,\n },\n delay,\n });\n delay += rand(500, 1000);\n\n // 3. MATCH - Trade matching (85% success rate)\n const matched = Math.random() < 0.85;\n if (matched) {\n const matchPrice = quotePrice * (1 + rand(-0.00005, 0.00005));\n entries.push({\n entry: {\n type: 'MATCH',\n message: `MATCH ${rfqId} | ${pair.symbol} ${side} @ ${formatRate(matchPrice, pair)} | ${lots.toFixed(2)} lots | Counterparty: LP-${randInt(1, 8)}`,\n data: { rfqId, matchPrice, counterparty: `LP-${randInt(1, 8)}` },\n importance: 'high',\n pairId: pair.id,\n },\n delay,\n });\n delay += rand(1000, 2500);\n\n // 4. SETTLE - PvP Settlement\n const settlePrice = matchPrice * (1 + rand(-0.00002, 0.00002));\n const pips = ((settlePrice - price) / pair.pipSize) * (side === 'BUY' ? 1 : -1);\n const pnl = pips * pair.pipSize * lots * 100000;\n\n entries.push({\n entry: {\n type: 'SETTLE',\n message: `SETTLE ${rfqId} | PvP confirmed | ${pair.symbol} @ ${formatRate(settlePrice, pair)} | P&L: ${pips >= 0 ? '+' : ''}${pips.toFixed(1)} pips ($${pnl >= 0 ? '+' : ''}${pnl.toFixed(2)})`,\n data: { rfqId, settlePrice, pips, pnl, pvp: true },\n importance: 'high',\n pairId: pair.id,\n },\n delay,\n });\n delay += rand(300, 600);\n\n // 5. PVP - Settlement confirmation\n entries.push({\n entry: {\n type: 'PVP',\n message: `PvP ${rfqId} | Atomic settlement confirmed on-chain | USDC transferred: $${notional.toLocaleString()} | Gas: ~$0.${randInt(10, 50)}`,\n data: { rfqId, settled: true, gasWei: randInt(10, 50) },\n importance: 'medium',\n pairId: pair.id,\n },\n delay,\n });\n\n // Generate pool transaction for settlement\n this.generatePoolTxFromEvent('SETTLE', { pnl });\n\n // Update stats\n this.totalTrades++;\n this.totalPnl += pnl;\n this.totalPips += pips;\n this.totalLots += lots;\n\n // Update positions\n if (Math.random() < 0.4) {\n this.openPositions.push({\n id: rfqId,\n pairId: pair.id,\n side: side as 'BUY' | 'SELL',\n lots,\n pips,\n entryPrice: matchPrice,\n currentPrice: settlePrice,\n pnl,\n openTime: Date.now(),\n });\n if (this.openPositions.length > 5) {\n this.openPositions.shift();\n }\n }\n } else {\n entries.push({\n entry: {\n type: 'MATCH',\n message: `MATCH FAILED ${rfqId} | ${pair.symbol} | No counterparty at requested price | Requoting...`,\n data: { rfqId, matched: false },\n importance: 'low',\n pairId: pair.id,\n },\n delay,\n });\n }\n\n // 6. HEDGE - Pool hedging operations (20% chance)\n if (Math.random() < 0.2) {\n delay += rand(400, 800);\n const hedgePair = pick(FOREX_CURRENCY_PAIRS);\n const hedgeLots = parseFloat(rand(0.5, 5.0).toFixed(2));\n const hedgeDirection = Math.random() > 0.5 ? 'LONG' : 'SHORT';\n entries.push({\n entry: {\n type: 'HEDGE',\n message: `HEDGE | ${hedgePair.symbol} ${hedgeDirection} ${hedgeLots.toFixed(2)} lots | Pool delta neutralization | Exposure: ${rand(5, 20).toFixed(1)}%`,\n data: { pair: hedgePair.id, direction: hedgeDirection, lots: hedgeLots },\n importance: 'medium',\n },\n delay,\n });\n this.generatePoolTxFromEvent('HEDGE', { lots: hedgeLots });\n }\n\n // 7. CLEAR - Clearing pool operations (15% chance)\n if (Math.random() < 0.15) {\n delay += rand(300, 600);\n const clearAmount = randInt(50000, 500000);\n entries.push({\n entry: {\n type: 'CLEAR',\n message: `CLEAR | Netting cycle complete | Volume: $${(clearAmount / 1000).toFixed(0)}K | Pairs settled: ${randInt(2, 6)} | Pool util: ${rand(60, 85).toFixed(1)}%`,\n data: { volume: clearAmount, pairsSettled: randInt(2, 6) },\n importance: 'low',\n },\n delay,\n });\n this.generatePoolTxFromEvent('CLEAR', { volume: clearAmount });\n }\n\n // 8. POSITION - Position update (25% chance)\n if (this.openPositions.length > 0 && Math.random() < 0.25) {\n delay += rand(300, 600);\n const posUpdates = this.openPositions.slice(0, 3).map(pos => {\n const pState = this.pairStates.get(pos.pairId);\n if (pState) {\n pos.currentPrice = pState.currentPrice;\n pos.pips = ((pos.currentPrice - pos.entryPrice) / pState.pair.pipSize) * (pos.side === 'BUY' ? 1 : -1);\n pos.pnl = pos.pips * pState.pair.pipSize * pos.lots * 100000;\n }\n return `${pState?.pair.symbol || pos.pairId} ${pos.side}: ${pos.pips >= 0 ? '+' : ''}${pos.pips.toFixed(1)} pips`;\n });\n entries.push({\n entry: {\n type: 'POSITION',\n message: `POSITION | ${posUpdates.join(' | ')} | Open: ${this.openPositions.length}`,\n data: { positions: this.openPositions.length },\n importance: 'low',\n },\n delay,\n });\n\n // Close old positions\n if (this.openPositions.length > 2 && Math.random() < 0.3) {\n const closed = this.openPositions.shift()!;\n this.totalPnl += closed.pnl * rand(0.01, 0.03);\n }\n }\n\n // 9. PNL - Periodic P&L summary (30% chance)\n if (Math.random() < 0.3) {\n delay += rand(300, 600);\n entries.push({\n entry: {\n type: 'PNL',\n message: `PNL | Session: $${this.totalPnl >= 0 ? '+' : ''}${this.totalPnl.toFixed(2)} | Trades: ${this.totalTrades} | Pips: ${this.totalPips >= 0 ? '+' : ''}${this.totalPips.toFixed(1)} | Lots: ${this.totalLots.toFixed(2)}`,\n data: { totalPnl: this.totalPnl, totalTrades: this.totalTrades, totalPips: this.totalPips },\n importance: 'medium',\n },\n delay,\n });\n }\n\n // 10. NEWS (10% chance)\n if (Math.random() < 0.1) {\n delay += rand(300, 600);\n entries.push({\n entry: {\n type: 'SYSTEM',\n message: `[Market] ${pick(FX_NEWS)}`,\n importance: 'medium',\n },\n delay,\n });\n }\n\n // Emit all entries with delays\n for (const { entry, delay: d } of entries) {\n setTimeout(() => {\n if (this.running) {\n this.emit({\n ...entry,\n id: genId(),\n timestamp: Date.now(),\n });\n }\n }, d);\n }\n }\n}\n\n// ── Singleton Export ──────────────────────────────────────────────────────────\n\nexport const forexSimulationEngine = new ForexSimulationEngine();\nexport type { PairState };\n","// BotSimulationEngine.ts - Core simulation engine for trading bot console\n// Runs independent simulation loops for each strategy bot with distinct personalities\n\n// ── Types ──────────────────────────────────────────────────────────────────────\n\nexport type BotLogType =\n | 'SCAN'\n | 'INDICATOR'\n | 'NEWS'\n | 'SIGNAL'\n | 'ANALYSIS'\n | 'DECISION'\n | 'ORDER'\n | 'FILLED'\n | 'PNL'\n | 'RISK'\n | 'SYSTEM'\n | 'STRATEGY' // Strategy reasoning and context\n | 'THINKING'; // AI thinking process\n\nexport interface BotLogEntry {\n id: string;\n timestamp: number;\n strategyId: string;\n strategyName: string;\n type: BotLogType;\n message: string;\n data?: Record<string, any>;\n importance: 'low' | 'medium' | 'high';\n}\n\nexport interface IndicatorSnapshot {\n rsi: number;\n macd: { value: number; signal: number; histogram: number };\n ema: { short: number; long: number; crossover: 'golden' | 'death' | 'none' };\n bollinger: { upper: number; middle: number; lower: number; width: number; position: number };\n volume: { current: number; average: number; ratio: number };\n}\n\nexport interface BotState {\n strategyId: string;\n strategyName: string;\n isRunning: boolean;\n currentPair: string;\n currentPrice: number;\n indicators: IndicatorSnapshot;\n openPositions: OpenPosition[];\n totalPnl: number;\n totalTrades: number;\n winRate: number;\n lastSignal: string;\n lastSignalConfidence: number;\n}\n\ninterface OpenPosition {\n id: string;\n pair: string;\n side: 'LONG' | 'SHORT';\n entryPrice: number;\n currentPrice: number;\n size: number;\n leverage: number;\n pnl: number;\n pnlPercent: number;\n}\n\nexport interface StrategyPersonality {\n id: string;\n name: string;\n shortName: string;\n color: string;\n scanIntervalMin: number;\n scanIntervalMax: number;\n tradeFrequency: number;\n positionSizeMin: number;\n positionSizeMax: number;\n leverageMin: number;\n leverageMax: number;\n primaryIndicators: string[];\n riskTolerance: 'low' | 'medium' | 'high';\n preferredPairs: string[];\n rsiBias: number;\n}\n\ntype LogCallback = (entry: BotLogEntry) => void;\n\n// ── Strategy Personalities ─────────────────────────────────────────────────────\n\nexport const STRATEGY_PERSONALITIES: StrategyPersonality[] = [\n {\n id: 'balanced-01',\n name: 'Balanced Alpha',\n shortName: 'BAL',\n color: '#3B82F6',\n scanIntervalMin: 25000, // Slower: 25-40s between cycles\n scanIntervalMax: 40000,\n tradeFrequency: 0.4,\n positionSizeMin: 15,\n positionSizeMax: 35,\n leverageMin: 3,\n leverageMax: 10,\n primaryIndicators: ['RSI', 'MACD'],\n riskTolerance: 'medium',\n preferredPairs: ['BTC/USDT', 'ETH/USDT', 'SOL/USDT'],\n rsiBias: 50,\n },\n {\n id: 'conservative-01',\n name: 'Conservative Shield',\n shortName: 'CON',\n color: '#10B981',\n scanIntervalMin: 35000, // Slower: 35-55s between cycles\n scanIntervalMax: 55000,\n tradeFrequency: 0.25,\n positionSizeMin: 10,\n positionSizeMax: 20,\n leverageMin: 2,\n leverageMax: 5,\n primaryIndicators: ['Bollinger', 'Volume'],\n riskTolerance: 'low',\n preferredPairs: ['BTC/USDT', 'ETH/USDT'],\n rsiBias: 45,\n },\n {\n id: 'aggressive-01',\n name: 'Aggressive Momentum',\n shortName: 'AGG',\n color: '#EF4444',\n scanIntervalMin: 18000, // Slower: 18-30s between cycles\n scanIntervalMax: 30000,\n tradeFrequency: 0.5,\n positionSizeMin: 25,\n positionSizeMax: 50,\n leverageMin: 5,\n leverageMax: 20,\n primaryIndicators: ['RSI', 'MACD', 'EMA', 'Volume'],\n riskTolerance: 'high',\n preferredPairs: ['BTC/USDT', 'ETH/USDT', 'SOL/USDT', 'DOGE/USDT', 'AVAX/USDT'],\n rsiBias: 55,\n },\n];\n\n// ── Trading pairs with base prices ─────────────────────────────────────────────\n\nconst PAIR_PRICES: Record<string, number> = {\n 'BTC/USDT': 67500,\n 'ETH/USDT': 3450,\n 'BNB/USDT': 605,\n 'SOL/USDT': 178,\n 'XRP/USDT': 0.62,\n 'DOGE/USDT': 0.165,\n 'ADA/USDT': 0.45,\n 'AVAX/USDT': 38.5,\n 'ARB/USDT': 1.18,\n 'MATIC/USDT': 0.72,\n 'LINK/USDT': 14.5,\n 'UNI/USDT': 7.8,\n 'AAVE/USDT': 92,\n 'OP/USDT': 2.45,\n 'APT/USDT': 8.9,\n 'INJ/USDT': 24.5,\n 'TIA/USDT': 11.2,\n 'SUI/USDT': 1.65,\n 'DOT/USDT': 7.2,\n 'ATOM/USDT': 9.8,\n 'FIL/USDT': 5.6,\n 'LTC/USDT': 72,\n 'NEAR/USDT': 5.1,\n 'FTM/USDT': 0.42,\n};\n\nconst CHAIN_INFO: Record<string, { name: string; shortName: string; icon: string }> = {\n ethereum: { name: 'Ethereum', shortName: 'ETH', icon: 'Ξ' },\n arbitrum: { name: 'Arbitrum', shortName: 'ARB', icon: '◆' },\n bsc: { name: 'BSC', shortName: 'BSC', icon: '◆' },\n base: { name: 'Base', shortName: 'BASE', icon: '●' },\n polygon: { name: 'Polygon', shortName: 'POLY', icon: '⬡' },\n optimism: { name: 'Optimism', shortName: 'OP', icon: '◉' },\n avalanche: { name: 'Avalanche', shortName: 'AVAX', icon: '▲' },\n linea: { name: 'Linea', shortName: 'LINEA', icon: '═' },\n zksync: { name: 'zkSync', shortName: 'ZK', icon: '⬢' },\n scroll: { name: 'Scroll', shortName: 'SCRL', icon: '◎' },\n};\n\nconst NEWS_HEADLINES = [\n 'Fed signals potential rate pause, crypto markets react positively',\n 'Major institutional investor increases BTC allocation by 15%',\n 'On-chain data shows whale accumulation pattern forming',\n 'DeFi TVL reaches new monthly high across major protocols',\n 'Exchange outflows surge as holders move to cold storage',\n 'Options market signals increased volatility expected this week',\n 'Mining difficulty adjustment approaching, hash rate stable',\n 'Regulatory clarity in EU boosts market sentiment',\n 'Stablecoin supply expanding, potential bullish indicator',\n 'Social sentiment score shifts to extreme greed zone',\n 'Cross-chain bridge volume hits record daily high',\n 'Layer 2 adoption metrics show 40% MoM growth',\n];\n\n// ── Helpers ────────────────────────────────────────────────────────────────────\n\nlet idCounter = 0;\nfunction genId(): string {\n return `log_${Date.now()}_${++idCounter}`;\n}\n\nfunction rand(min: number, max: number): number {\n return min + Math.random() * (max - min);\n}\n\nfunction randInt(min: number, max: number): number {\n return Math.floor(rand(min, max + 1));\n}\n\nfunction pick<T>(arr: T[]): T {\n return arr[Math.floor(Math.random() * arr.length)];\n}\n\nfunction clamp(val: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, val));\n}\n\nfunction formatPrice(price: number): string {\n if (price >= 1000) return price.toFixed(2);\n if (price >= 1) return price.toFixed(3);\n return price.toFixed(5);\n}\n\n// ── Engine ─────────────────────────────────────────────────────────────────────\n\nclass BotSimulationEngine {\n private listeners: LogCallback[] = [];\n private botTimers: Map<string, ReturnType<typeof setTimeout>> = new Map();\n private botStates: Map<string, BotState> = new Map();\n private priceState: Map<string, number> = new Map();\n private indicatorState: Map<string, IndicatorSnapshot> = new Map();\n private running = false;\n private userPairs: string[] = [];\n private userChains: string[] = [];\n\n constructor() {\n // Initialize prices with some jitter\n for (const [pair, base] of Object.entries(PAIR_PRICES)) {\n this.priceState.set(pair, base * (1 + rand(-0.02, 0.02)));\n }\n }\n\n // ── Public API ─────────────────────────────────────────────────────────────\n\n getStrategies(): StrategyPersonality[] {\n return STRATEGY_PERSONALITIES;\n }\n\n start(strategyIds?: string[], userPairs?: string[], userChains?: string[]): void {\n this.running = true;\n // Convert pair IDs (e.g. 'BTC') to full symbols (e.g. 'BTC/USDT') if needed\n this.userPairs = (userPairs || [])\n .map(p => p.includes('/') ? p : `${p}/USDT`)\n .filter(p => p in PAIR_PRICES);\n this.userChains = (userChains || []).filter(c => c in CHAIN_INFO);\n const strategies = strategyIds\n ? STRATEGY_PERSONALITIES.filter(s => strategyIds.includes(s.id))\n : STRATEGY_PERSONALITIES;\n\n for (const strategy of strategies) {\n this.initBotState(strategy);\n this.scheduleCycle(strategy);\n }\n }\n\n stop(strategyIds?: string[]): void {\n const ids = strategyIds || Array.from(this.botTimers.keys());\n for (const id of ids) {\n const timer = this.botTimers.get(id);\n if (timer) {\n clearTimeout(timer);\n this.botTimers.delete(id);\n }\n }\n if (!strategyIds) {\n this.running = false;\n }\n }\n\n onLog(callback: LogCallback): () => void {\n this.listeners.push(callback);\n return () => {\n this.listeners = this.listeners.filter(l => l !== callback);\n };\n }\n\n getBotState(strategyId: string): BotState | undefined {\n return this.botStates.get(strategyId);\n }\n\n getAllBotStates(): Map<string, BotState> {\n return this.botStates;\n }\n\n isRunning(): boolean {\n return this.running;\n }\n\n emitBootSequence(): void {\n const bootMessages: Array<{ msg: string; delay: number }> = [\n { msg: 'Initializing ONE Trading Engine v3.2.1...', delay: 0 },\n { msg: 'Loading market data feeds...', delay: 500 },\n { msg: 'Connecting to exchange WebSocket streams...', delay: 1200 },\n { msg: 'Calibrating indicator engines (RSI, MACD, EMA, Bollinger)...', delay: 2000 },\n { msg: 'Loading strategy personalities: balanced-01, conservative-01, aggressive-01', delay: 2800 },\n { msg: 'Risk management module initialized (max drawdown: 15%)', delay: 3600 },\n { msg: 'Portfolio allocation engine ready', delay: 4200 },\n { msg: '=== All systems online. Starting trading cycles ===', delay: 5000 },\n ];\n\n for (const { msg, delay } of bootMessages) {\n setTimeout(() => {\n this.emit({\n id: genId(),\n timestamp: Date.now(),\n strategyId: 'system',\n strategyName: 'SYSTEM',\n type: 'SYSTEM',\n message: msg,\n importance: 'medium',\n });\n }, delay);\n }\n }\n\n destroy(): void {\n this.stop();\n this.listeners = [];\n this.botStates.clear();\n this.priceState.clear();\n this.indicatorState.clear();\n this.userPairs = [];\n this.userChains = [];\n }\n\n // ── Private Methods ────────────────────────────────────────────────────────\n\n private emit(entry: BotLogEntry): void {\n for (const listener of this.listeners) {\n listener(entry);\n }\n }\n\n private getActivePairs(strategy: StrategyPersonality): string[] {\n return this.userPairs.length > 0 ? this.userPairs : strategy.preferredPairs;\n }\n\n private getActiveChain(): string {\n const chains = this.userChains.length > 0\n ? this.userChains\n : ['ethereum', 'arbitrum', 'bsc'];\n return pick(chains);\n }\n\n private getChainLabel(chainId: string): string {\n const info = CHAIN_INFO[chainId];\n return info ? info.shortName : chainId;\n }\n\n private initBotState(strategy: StrategyPersonality): void {\n const activePairs = this.getActivePairs(strategy);\n const pair = pick(activePairs);\n const price = this.priceState.get(pair) || PAIR_PRICES[pair] || 50000;\n const indicators = this.generateIndicators(strategy, price);\n this.indicatorState.set(strategy.id, indicators);\n\n this.botStates.set(strategy.id, {\n strategyId: strategy.id,\n strategyName: strategy.name,\n isRunning: true,\n currentPair: pair,\n currentPrice: price,\n indicators,\n openPositions: [],\n totalPnl: rand(-50, 200),\n totalTrades: randInt(5, 25),\n winRate: rand(0.48, 0.68),\n lastSignal: 'HOLD',\n lastSignalConfidence: 0,\n });\n }\n\n private scheduleCycle(strategy: StrategyPersonality): void {\n if (!this.running) return;\n const interval = rand(strategy.scanIntervalMin, strategy.scanIntervalMax);\n const timer = setTimeout(() => {\n if (this.running) {\n this.runBotCycle(strategy);\n this.scheduleCycle(strategy);\n }\n }, interval);\n this.botTimers.set(strategy.id, timer);\n }\n\n private async runBotCycle(strategy: StrategyPersonality): Promise<void> {\n const state = this.botStates.get(strategy.id);\n if (!state) return;\n\n const activePairs = this.getActivePairs(strategy);\n const pair = pick(activePairs);\n const price = this.simulatePrice(pair);\n const indicators = this.generateIndicators(strategy, price);\n this.indicatorState.set(strategy.id, indicators);\n\n state.currentPair = pair;\n state.currentPrice = price;\n state.indicators = indicators;\n\n const entries: Array<{ entry: Omit<BotLogEntry, 'id' | 'timestamp'>; delay: number }> = [];\n let delay = 0;\n\n // 1. SCAN - Always (slower delay)\n const chain = this.getActiveChain();\n const chainLabel = this.getChainLabel(chain);\n entries.push({\n entry: {\n strategyId: strategy.id,\n strategyName: strategy.shortName,\n type: 'SCAN',\n message: `Scanning ${pair} on ${chainLabel} | Price: $${formatPrice(price)}`,\n data: { pair, chain, chainLabel },\n importance: 'low',\n },\n delay,\n });\n delay += rand(800, 1500); // Slower: 0.8-1.5s\n\n // 2. THINKING - AI reasoning process (new)\n const thinkingMessages = this.generateThinkingProcess(strategy, pair, price);\n for (const thinking of thinkingMessages) {\n entries.push({\n entry: {\n strategyId: strategy.id,\n strategyName: strategy.shortName,\n type: 'THINKING',\n message: thinking,\n importance: 'low',\n },\n delay,\n });\n delay += rand(600, 1200); // 0.6-1.2s between thoughts\n }\n\n // 3. INDICATOR - Always (slower delay)\n const indicatorParts = [];\n if (strategy.primaryIndicators.includes('RSI') || strategy.primaryIndicators.includes('MACD')) {\n indicatorParts.push(`RSI: ${indicators.rsi.toFixed(1)}`);\n }\n if (strategy.primaryIndicators.includes('MACD') || strategy.primaryIndicators.includes('RSI')) {\n indicatorParts.push(`MACD: ${indicators.macd.histogram > 0 ? '+' : ''}${indicators.macd.histogram.toFixed(3)}`);\n }\n if (strategy.primaryIndicators.includes('EMA')) {\n indicatorParts.push(`EMA: ${indicators.ema.short.toFixed(1)}/${indicators.ema.long.toFixed(1)}`);\n if (indicators.ema.crossover !== 'none') {\n indicatorParts.push(`[${indicators.ema.crossover.toUpperCase()} CROSS]`);\n }\n }\n if (strategy.primaryIndicators.includes('Bollinger')) {\n indicatorParts.push(`BB: ${indicators.bollinger.position.toFixed(1)}% width=${indicators.bollinger.width.toFixed(2)}`);\n }\n if (strategy.primaryIndicators.includes('Volume')) {\n indicatorParts.push(`Vol: ${indicators.volume.ratio.toFixed(2)}x avg`);\n }\n\n entries.push({\n entry: {\n strategyId: strategy.id,\n strategyName: strategy.shortName,\n type: 'INDICATOR',\n message: indicatorParts.join(' | '),\n data: { indicators },\n importance: 'low',\n },\n delay,\n });\n delay += rand(800, 1500); // Slower: 0.8-1.5s\n\n // 4. NEWS - 12% chance (slower)\n if (Math.random() < 0.12) {\n const sentiment = Math.random() > 0.4 ? 'Bullish' : 'Bearish';\n entries.push({\n entry: {\n strategyId: strategy.id,\n strategyName: strategy.shortName,\n type: 'NEWS',\n message: `[${sentiment}] ${pick(NEWS_HEADLINES)}`,\n importance: 'medium',\n },\n delay,\n });\n delay += rand(1000, 1800); // Slower: 1-1.8s\n }\n\n // 5. ANALYSIS - 40% chance (slower)\n if (Math.random() < 0.4) {\n const analysis = this.generateAnalysis(strategy, indicators, pair);\n entries.push({\n entry: {\n strategyId: strategy.id,\n strategyName: strategy.shortName,\n type: 'ANALYSIS',\n message: analysis,\n importance: 'medium',\n },\n delay,\n });\n delay += rand(1000, 2000); // Slower: 1-2s\n }\n\n // 6-10. Signal evaluation and potential trade\n const signal = this.evaluateSignal(strategy, indicators);\n state.lastSignal = signal.direction;\n state.lastSignalConfidence = signal.confidence;\n\n if (signal.direction !== 'HOLD') {\n // 6. STRATEGY - Show strategy reasoning context (NEW)\n const strategyContext = this.generateStrategyContext(strategy, signal, indicators, pair);\n entries.push({\n entry: {\n strategyId: strategy.id,\n strategyName: strategy.shortName,\n type: 'STRATEGY',\n message: strategyContext,\n data: {\n strategy: strategy.name,\n riskTolerance: strategy.riskTolerance,\n primaryIndicators: strategy.primaryIndicators,\n signal: signal.direction,\n confidence: signal.confidence,\n },\n importance: 'high',\n },\n delay,\n });\n delay += rand(1500, 2500); // Slower: 1.5-2.5s\n\n // 7. SIGNAL\n entries.push({\n entry: {\n strategyId: strategy.id,\n strategyName: strategy.shortName,\n type: 'SIGNAL',\n message: `${signal.direction} signal detected | Confidence: ${(signal.confidence * 100).toFixed(1)}% | ${signal.reason}`,\n data: { signal },\n importance: 'high',\n },\n delay,\n });\n delay += rand(1200, 2000); // Slower: 1.2-2s\n\n // 8. DECISION\n const decision = this.makeTradeDecision(strategy, signal, state);\n if (decision.execute) {\n entries.push({\n entry: {\n strategyId: strategy.id,\n strategyName: strategy.shortName,\n type: 'DECISION',\n message: `Execute ${signal.direction} | Size: ${decision.positionSize.toFixed(1)}% | Leverage: ${decision.leverage}x | Risk/Reward: 1:${decision.riskReward.toFixed(1)}`,\n data: {\n strategyName: strategy.name,\n strategyId: strategy.id,\n riskTolerance: strategy.riskTolerance,\n signalReason: signal.reason,\n confidence: signal.confidence,\n },\n importance: 'high',\n },\n delay,\n });\n delay += rand(1000, 1800); // Slower: 1-1.8s\n\n // 9. ORDER\n const orderId = `ORD_${Date.now().toString(36).toUpperCase()}`;\n const orderPrice = signal.direction === 'LONG'\n ? price * (1 - rand(0.0001, 0.0005))\n : price * (1 + rand(0.0001, 0.0005));\n\n entries.push({\n entry: {\n strategyId: strategy.id,\n strategyName: strategy.shortName,\n type: 'ORDER',\n message: `Submitting ${signal.direction} order | ${pair} @ $${formatPrice(orderPrice)} on ${chainLabel} | ID: ${orderId}`,\n data: {\n orderId,\n pair,\n side: signal.direction,\n price: orderPrice,\n leverage: decision.leverage,\n chain,\n chainLabel,\n strategyName: strategy.name,\n strategyContext: strategyContext,\n signalReason: signal.reason,\n },\n importance: 'high',\n },\n delay,\n });\n delay += rand(2000, 4000); // Slower: 2-4s for order execution\n\n // 10. FILLED\n const fillPrice = orderPrice * (1 + rand(-0.0003, 0.0003));\n const slippage = Math.abs(fillPrice - orderPrice) / orderPrice * 100;\n entries.push({\n entry: {\n strategyId: strategy.id,\n strategyName: strategy.shortName,\n type: 'FILLED',\n message: `Order FILLED | ${pair} ${signal.direction} @ $${formatPrice(fillPrice)} on ${chainLabel} | Slippage: ${slippage.toFixed(4)}% | ID: ${orderId}`,\n data: {\n orderId,\n fillPrice,\n slippage,\n chain,\n chainLabel,\n strategyName: strategy.name,\n executedBy: strategy.id,\n },\n importance: 'high',\n },\n delay,\n });\n\n // Update state with new position\n const position: OpenPosition = {\n id: orderId,\n pair,\n side: signal.direction as 'LONG' | 'SHORT',\n entryPrice: fillPrice,\n currentPrice: price,\n size: decision.positionSize,\n leverage: decision.leverage,\n pnl: 0,\n pnlPercent: 0,\n };\n state.openPositions = [...state.openPositions.slice(-2), position];\n state.totalTrades++;\n } else {\n entries.push({\n entry: {\n strategyId: strategy.id,\n strategyName: strategy.shortName,\n type: 'DECISION',\n message: `SKIP - ${decision.reason}`,\n importance: 'medium',\n },\n delay,\n });\n }\n }\n\n // 11. PNL - Update open positions (slower)\n if (state.openPositions.length > 0 && Math.random() < 0.5) {\n delay += rand(1500, 2500); // Slower: 1.5-2.5s\n let totalPositionPnl = 0;\n const pnlParts: string[] = [];\n\n for (const pos of state.openPositions) {\n pos.currentPrice = this.simulatePrice(pos.pair);\n const priceDiff = pos.side === 'LONG'\n ? (pos.currentPrice - pos.entryPrice) / pos.entryPrice\n : (pos.entryPrice - pos.currentPrice) / pos.entryPrice;\n pos.pnlPercent = priceDiff * pos.leverage * 100;\n pos.pnl = priceDiff * pos.leverage * pos.size;\n totalPositionPnl += pos.pnl;\n pnlParts.push(`${pos.pair} ${pos.side}: ${pos.pnlPercent >= 0 ? '+' : ''}${pos.pnlPercent.toFixed(2)}%`);\n }\n\n state.totalPnl += totalPositionPnl * rand(0.01, 0.05);\n\n // Sometimes close a position\n if (state.openPositions.length > 1 && Math.random() < 0.3) {\n const closed = state.openPositions.shift()!;\n const finalPnl = closed.pnlPercent;\n if (finalPnl > 0) {\n state.winRate = state.winRate * 0.95 + 0.05;\n } else {\n state.winRate = state.winRate * 0.95;\n }\n state.winRate = clamp(state.winRate, 0.35, 0.75);\n pnlParts.push(`CLOSED ${closed.pair}: ${finalPnl >= 0 ? '+' : ''}${finalPnl.toFixed(2)}%`);\n }\n\n entries.push({\n entry: {\n strategyId: strategy.id,\n strategyName: strategy.shortName,\n type: 'PNL',\n message: pnlParts.join(' | '),\n data: { totalPnl: state.totalPnl, positions: state.openPositions.length },\n importance: 'medium',\n },\n delay,\n });\n }\n\n // 12. RISK - Periodic check (slower)\n if (Math.random() < 0.2) {\n delay += rand(1000, 2000); // Slower: 1-2s\n const exposure = state.openPositions.reduce((sum, p) => sum + p.size * p.leverage, 0);\n const maxDrawdown = rand(2, 12);\n entries.push({\n entry: {\n strategyId: strategy.id,\n strategyName: strategy.shortName,\n type: 'RISK',\n message: `Portfolio exposure: ${exposure.toFixed(1)}% | Max drawdown: ${maxDrawdown.toFixed(1)}% | Open positions: ${state.openPositions.length} | Win rate: ${(state.winRate * 100).toFixed(1)}%`,\n importance: exposure > 80 ? 'high' : 'low',\n },\n delay,\n });\n }\n\n // Emit entries with delays\n for (const { entry, delay: d } of entries) {\n setTimeout(() => {\n if (this.running) {\n this.emit({\n ...entry,\n id: genId(),\n timestamp: Date.now(),\n });\n }\n }, d);\n }\n }\n\n private simulatePrice(pair: string): number {\n const current = this.priceState.get(pair) || PAIR_PRICES[pair] || 50000;\n const volatility = pair.includes('DOGE') ? 0.005 : pair.includes('BTC') ? 0.002 : 0.003;\n const drift = rand(-volatility, volatility);\n const newPrice = current * (1 + drift);\n this.priceState.set(pair, newPrice);\n return newPrice;\n }\n\n private generateIndicators(strategy: StrategyPersonality, price: number): IndicatorSnapshot {\n const prev = this.indicatorState.get(strategy.id);\n const prevRsi = prev?.rsi ?? strategy.rsiBias;\n\n // RSI: mean-reverting around bias\n const rsiMean = strategy.rsiBias;\n const rsiDrift = rand(-8, 8);\n const rsiReversion = (rsiMean - prevRsi) * 0.15;\n const rsi = clamp(prevRsi + rsiDrift + rsiReversion, 8, 95);\n\n // MACD: correlated with RSI\n const macdBias = rsi > 65 ? 0.3 : rsi < 35 ? -0.3 : 0;\n const prevHist = prev?.macd.histogram ?? 0;\n const histogram = clamp(prevHist * 0.7 + rand(-0.5, 0.5) + macdBias, -2, 2);\n const macdValue = histogram * rand(0.8, 1.5);\n const macdSignal = macdValue - histogram;\n\n // EMA: occasional crossovers\n const prevShort = prev?.ema.short ?? price;\n const prevLong = prev?.ema.long ?? price;\n const emaShort = prevShort * 0.9 + price * 0.1;\n const emaLong = prevLong * 0.95 + price * 0.05;\n let crossover: 'golden' | 'death' | 'none' = 'none';\n if (prevShort <= prevLong && emaShort > emaLong) crossover = 'golden';\n else if (prevShort >= prevLong && emaShort < emaLong) crossover = 'death';\n\n // Bollinger\n const bbMiddle = price;\n const bbWidth = price * rand(0.01, 0.04);\n const bbUpper = bbMiddle + bbWidth;\n const bbLower = bbMiddle - bbWidth;\n const bbPosition = ((price - bbLower) / (bbUpper - bbLower)) * 100;\n\n // Volume\n const volRatio = rand(0.3, 2.5);\n const volCurrent = rand(100000, 5000000);\n\n return {\n rsi,\n macd: { value: macdValue, signal: macdSignal, histogram },\n ema: { short: emaShort, long: emaLong, crossover },\n bollinger: { upper: bbUpper, middle: bbMiddle, lower: bbLower, width: bbWidth / price, position: bbPosition },\n volume: { current: volCurrent, average: volCurrent / volRatio, ratio: volRatio },\n };\n }\n\n private generateThinkingProcess(strategy: StrategyPersonality, pair: string, price: number): string[] {\n const thoughts: string[] = [];\n const pairBase = pair.split('/')[0];\n\n // Generate 1-3 thinking steps\n const thinkingTemplates = [\n `Analyzing ${pairBase} market structure...`,\n `Checking ${strategy.primaryIndicators.join(', ')} confluence...`,\n `Evaluating risk parameters for ${strategy.riskTolerance} tolerance...`,\n `Scanning order book depth at $${formatPrice(price)}...`,\n `Cross-referencing with historical patterns...`,\n `Calculating optimal entry zone...`,\n `Assessing market sentiment indicators...`,\n `Monitoring whale activity on ${pairBase}...`,\n `Comparing momentum across timeframes...`,\n `Validating support/resistance levels...`,\n ];\n\n const numThoughts = randInt(1, 3);\n const shuffled = [...thinkingTemplates].sort(() => Math.random() - 0.5);\n\n for (let i = 0; i < numThoughts; i++) {\n thoughts.push(shuffled[i]);\n }\n\n return thoughts;\n }\n\n private generateStrategyContext(\n strategy: StrategyPersonality,\n signal: { direction: string; confidence: number; reason: string },\n indicators: IndicatorSnapshot,\n pair: string\n ): string {\n const contexts = [];\n\n // Strategy personality context\n contexts.push(`[${strategy.name}]`);\n\n // Risk context\n const riskLevel = strategy.riskTolerance === 'high' ? 'aggressive' : strategy.riskTolerance === 'low' ? 'conservative' : 'balanced';\n contexts.push(`Risk: ${riskLevel}`);\n\n // Key indicator that triggered\n if (indicators.rsi < 35 || indicators.rsi > 65) {\n contexts.push(`RSI ${indicators.rsi < 35 ? 'oversold' : 'overbought'} (${indicators.rsi.toFixed(1)})`);\n }\n if (indicators.ema.crossover !== 'none') {\n contexts.push(`EMA ${indicators.ema.crossover} cross`);\n }\n if (Math.abs(indicators.macd.histogram) > 0.3) {\n contexts.push(`MACD ${indicators.macd.histogram > 0 ? 'bullish' : 'bearish'} momentum`);\n }\n\n // Confidence interpretation\n const confLevel = signal.confidence > 0.7 ? 'HIGH' : signal.confidence > 0.5 ? 'MEDIUM' : 'LOW';\n contexts.push(`Confidence: ${confLevel}`);\n\n return contexts.join(' | ');\n }\n\n private generateAnalysis(strategy: StrategyPersonality, indicators: IndicatorSnapshot, pair: string): string {\n const analyses = [];\n\n if (indicators.rsi > 70) {\n analyses.push(`RSI at ${indicators.rsi.toFixed(1)} - overbought territory, watching for reversal`);\n } else if (indicators.rsi < 30) {\n analyses.push(`RSI at ${indicators.rsi.toFixed(1)} - oversold, potential bounce setup`);\n } else if (indicators.rsi > 55) {\n analyses.push(`RSI trending bullish at ${indicators.rsi.toFixed(1)}`);\n } else {\n analyses.push(`RSI neutral at ${indicators.rsi.toFixed(1)}, no clear direction`);\n }\n\n if (indicators.macd.histogram > 0.5) {\n analyses.push('MACD histogram expanding positive - momentum building');\n } else if (indicators.macd.histogram < -0.5) {\n analyses.push('MACD histogram expanding negative - bearish pressure');\n }\n\n if (indicators.ema.crossover === 'golden') {\n analyses.push('EMA golden cross detected - strong bullish signal');\n } else if (indicators.ema.crossover === 'death') {\n analyses.push('EMA death cross detected - bearish warning');\n }\n\n if (indicators.bollinger.position > 90) {\n analyses.push(`Price near upper Bollinger band (${indicators.bollinger.position.toFixed(0)}%) - potential resistance`);\n } else if (indicators.bollinger.position < 10) {\n analyses.push(`Price near lower Bollinger band (${indicators.bollinger.position.toFixed(0)}%) - potential support`);\n }\n\n if (indicators.volume.ratio > 1.8) {\n analyses.push(`Volume spike ${indicators.volume.ratio.toFixed(1)}x average - high activity`);\n }\n\n return analyses.length > 0 ? analyses.join(' | ') : `${pair} consolidating - waiting for clearer setup`;\n }\n\n private evaluateSignal(\n strategy: StrategyPersonality,\n indicators: IndicatorSnapshot,\n ): { direction: 'LONG' | 'SHORT' | 'HOLD'; confidence: number; reason: string } {\n let bullScore = 0;\n let bearScore = 0;\n const reasons: string[] = [];\n\n // RSI\n if (indicators.rsi < 30) { bullScore += 2; reasons.push('RSI oversold'); }\n else if (indicators.rsi < 40) { bullScore += 1; reasons.push('RSI low'); }\n else if (indicators.rsi > 70) { bearScore += 2; reasons.push('RSI overbought'); }\n else if (indicators.rsi > 60) { bearScore += 1; reasons.push('RSI high'); }\n\n // MACD\n if (indicators.macd.histogram > 0.3) { bullScore += 1.5; reasons.push('MACD bullish'); }\n else if (indicators.macd.histogram < -0.3) { bearScore += 1.5; reasons.push('MACD bearish'); }\n\n // EMA\n if (indicators.ema.crossover === 'golden') { bullScore += 2.5; reasons.push('Golden cross'); }\n else if (indicators.ema.crossover === 'death') { bearScore += 2.5; reasons.push('Death cross'); }\n else if (indicators.ema.short > indicators.ema.long) { bullScore += 0.5; }\n else { bearScore += 0.5; }\n\n // Bollinger\n if (indicators.bollinger.position < 15) { bullScore += 1; reasons.push('BB support'); }\n else if (indicators.bollinger.position > 85) { bearScore += 1; reasons.push('BB resistance'); }\n\n // Volume confirmation\n if (indicators.volume.ratio > 1.5) {\n if (bullScore > bearScore) bullScore += 1;\n else bearScore += 1;\n reasons.push('Volume confirms');\n }\n\n const netScore = bullScore - bearScore;\n const confidence = Math.min(Math.abs(netScore) / 6, 0.95);\n const threshold = strategy.riskTolerance === 'high' ? 1.5 : strategy.riskTolerance === 'medium' ? 2.0 : 2.5;\n\n // Apply trade frequency filter\n if (Math.random() > strategy.tradeFrequency) {\n return { direction: 'HOLD', confidence: 0, reason: 'Cycle skip' };\n }\n\n if (netScore > threshold) {\n return { direction: 'LONG', confidence, reason: reasons.slice(0, 3).join(', ') };\n } else if (netScore < -threshold) {\n return { direction: 'SHORT', confidence, reason: reasons.slice(0, 3).join(', ') };\n }\n\n return { direction: 'HOLD', confidence: 0, reason: 'No clear signal' };\n }\n\n private makeTradeDecision(\n strategy: StrategyPersonality,\n signal: { direction: string; confidence: number },\n state: BotState,\n ): { execute: boolean; positionSize: number; leverage: number; riskReward: number; reason: string } {\n // Check position limits\n if (state.openPositions.length >= 3) {\n return { execute: false, positionSize: 0, leverage: 0, riskReward: 0, reason: 'Max positions reached (3)' };\n }\n\n // Confidence threshold\n const minConfidence = strategy.riskTolerance === 'high' ? 0.3 : strategy.riskTolerance === 'medium' ? 0.45 : 0.6;\n if (signal.confidence < minConfidence) {\n return { execute: false, positionSize: 0, leverage: 0, riskReward: 0, reason: `Confidence too low (${(signal.confidence * 100).toFixed(0)}% < ${(minConfidence * 100).toFixed(0)}%)` };\n }\n\n const positionSize = rand(strategy.positionSizeMin, strategy.positionSizeMax);\n const leverage = randInt(strategy.leverageMin, strategy.leverageMax);\n const riskReward = rand(1.2, 3.5);\n\n return { execute: true, positionSize, leverage, riskReward, reason: '' };\n }\n}\n\n// ── Singleton Export ────────────────────────────────────────────────────────────\n\nexport const botSimulationEngine = new BotSimulationEngine();\n","/**\n * ONE SDK Configuration\n *\n * Chain data is fetched from ONE Engine API - no duplicates needed here.\n * Engine is the single source of truth for 200+ EVM chains.\n */\n\nimport type { ChainConfig } from '../types';\n\n// ===== SDK Configuration =====\nexport interface OneConfig {\n // ONE Engine (required)\n oneEngineUrl: string;\n oneClientId: string;\n oneSecretKey?: string; // Only for backend usage\n\n // Optional: Direct Supabase access (for realtime subscriptions)\n supabaseUrl?: string;\n supabaseAnonKey?: string;\n\n // Deprecated: Use ONE Engine instead\n thirdwebClientId?: string;\n}\n\n// Default configuration values\nconst DEFAULT_ENGINE_URL = 'https://api.one23.io';\nconst DEFAULT_CLIENT_ID = 'one_pk_e8f647bfa643fdcfaa3a23f760488e49be09f929296eed4a6c399d437d907f60';\n\nlet config: OneConfig | null = null;\n\nexport function initOneSDK(options: Partial<OneConfig>): void {\n // Use defaults if not provided\n const engineUrl = options.oneEngineUrl || DEFAULT_ENGINE_URL;\n const clientId = options.oneClientId || DEFAULT_CLIENT_ID;\n\n config = {\n ...options,\n oneEngineUrl: engineUrl,\n oneClientId: clientId,\n } as OneConfig;\n}\n\nexport function getConfig(): OneConfig {\n if (!config) {\n throw new Error('ONE SDK not initialized. Call initOneSDK() first.');\n }\n return config;\n}\n\nexport function isInitialized(): boolean {\n return config !== null;\n}\n\nexport function getEngineUrl(): string {\n return config?.oneEngineUrl || process.env.NEXT_PUBLIC_ONE_ENGINE_URL || DEFAULT_ENGINE_URL;\n}\n\n// ===== Chain Data (Fetched from Engine) =====\n\n// Cache for chain data\nlet chainsCache: ChainConfig[] | null = null;\nlet chainsCacheTimestamp = 0;\nconst CACHE_TTL = 5 * 60 * 1000; // 5 minutes\n\n/**\n * Fetch chains from ONE Engine API\n * Engine is the source of truth for 200+ EVM chains\n */\nexport async function fetchChains(options?: {\n category?: 'mainnet' | 'l2' | 'testnet' | 'gaming' | 'recommended';\n smartWallet?: boolean;\n limit?: number;\n}): Promise<ChainConfig[]> {\n const engineUrl = getEngineUrl();\n const params = new URLSearchParams();\n\n if (options?.category) params.set('category', options.category);\n if (options?.smartWallet) params.set('smartWallet', 'true');\n if (options?.limit) params.set('limit', options.limit.toString());\n\n const response = await fetch(`${engineUrl}/v1/chains?${params}`);\n const data = await response.json();\n\n if (!data.success) {\n throw new Error(data.error?.message || 'Failed to fetch chains');\n }\n\n // Transform Engine response to SDK ChainConfig format\n return data.data.chains.map((chain: any) => ({\n id: chain.id,\n name: chain.name,\n shortName: chain.shortName || chain.slug || chain.name.toLowerCase(),\n icon: getChainIcon(chain.id),\n nativeCurrency: chain.nativeCurrency,\n rpcUrls: Array.isArray(chain.rpc) ? chain.rpc : [chain.rpc],\n blockExplorerUrls: chain.blockExplorer ? [chain.blockExplorer] : [],\n testnet: chain.testnet,\n }));\n}\n\n/**\n * Get all supported chains (cached)\n */\nexport async function getChains(): Promise<ChainConfig[]> {\n const now = Date.now();\n if (chainsCache && (now - chainsCacheTimestamp) < CACHE_TTL) {\n return chainsCache;\n }\n\n chainsCache = await fetchChains({ limit: 200 });\n chainsCacheTimestamp = now;\n return chainsCache;\n}\n\n/**\n * Get chain by ID\n */\nexport async function getChainById(chainId: number): Promise<ChainConfig | undefined> {\n const chains = await getChains();\n return chains.find(c => c.id === chainId);\n}\n\n/**\n * Get chain by name/shortName\n */\nexport async function getChainByName(name: string): Promise<ChainConfig | undefined> {\n const chains = await getChains();\n const lowerName = name.toLowerCase();\n return chains.find(\n c => c.name.toLowerCase() === lowerName || c.shortName.toLowerCase() === lowerName\n );\n}\n\n/**\n * Get recommended chains for UI display\n */\nexport async function getRecommendedChains(): Promise<ChainConfig[]> {\n return fetchChains({ category: 'recommended', limit: 10 });\n}\n\n/**\n * Get chains with smart wallet support\n */\nexport async function getSmartWalletChains(): Promise<ChainConfig[]> {\n return fetchChains({ smartWallet: true, limit: 50 });\n}\n\n// ===== Default Chain Constants =====\n// These are commonly used chain IDs, but full data should be fetched from Engine\n\nexport const CHAIN_IDS = {\n ETHEREUM: 1,\n POLYGON: 137,\n BSC: 56,\n ARBITRUM: 42161,\n OPTIMISM: 10,\n BASE: 8453,\n AVALANCHE: 43114,\n ZKSYNC: 324,\n LINEA: 59144,\n SCROLL: 534352,\n BLAST: 81457,\n // Testnets\n SEPOLIA: 11155111,\n BASE_SEPOLIA: 84532,\n ARBITRUM_SEPOLIA: 421614,\n} as const;\n\nexport const DEFAULT_CHAIN_ID = CHAIN_IDS.BASE;\n\n// ===== Chain Icons (Simple emoji fallback) =====\nconst CHAIN_ICONS: Record<number, string> = {\n 1: '\\u229F', // Ethereum\n 137: '\\uD83D\\uDFE3', // Polygon\n 56: '\\uD83D\\uDFE1', // BSC\n 42161: '\\uD83D\\uDD35', // Arbitrum\n 10: '\\uD83D\\uDD34', // Optimism\n 8453: '\\uD83D\\uDD37', // Base\n 43114: '\\uD83D\\uDD3A', // Avalanche\n 324: '\\u26A1', // zkSync\n 59144: '\\uD83D\\uDD39', // Linea\n 534352: '\\uD83D\\uDCDC', // Scroll\n};\n\nfunction getChainIcon(chainId: number): string {\n return CHAIN_ICONS[chainId] || '\\uD83D\\uDD17';\n}\n\n// ===== Token Names Mapping =====\n// Common token symbols to human-readable names\nexport const TOKEN_NAMES: Record<string, string> = {\n ETH: 'Ethereum',\n BTC: 'Bitcoin',\n BNB: 'BNB',\n MATIC: 'Polygon',\n POL: 'Polygon',\n AVAX: 'Avalanche',\n USDT: 'Tether',\n USDC: 'USD Coin',\n DAI: 'Dai',\n WBTC: 'Wrapped Bitcoin',\n WETH: 'Wrapped Ether',\n ARB: 'Arbitrum',\n OP: 'Optimism',\n LINK: 'Chainlink',\n UNI: 'Uniswap',\n AAVE: 'Aave',\n CRV: 'Curve',\n MKR: 'Maker',\n SNX: 'Synthetix',\n COMP: 'Compound',\n SUSHI: 'SushiSwap',\n YFI: 'Yearn Finance',\n SOL: 'Solana',\n DOT: 'Polkadot',\n ATOM: 'Cosmos',\n NEAR: 'Near Protocol',\n};\n\n// ===== CoinGecko ID Mapping =====\n// For price lookups via CoinGecko API\nexport const COINGECKO_IDS: Record<string, string> = {\n ETH: 'ethereum',\n BTC: 'bitcoin',\n BNB: 'binancecoin',\n MATIC: 'matic-network',\n POL: 'matic-network',\n AVAX: 'avalanche-2',\n USDT: 'tether',\n USDC: 'usd-coin',\n DAI: 'dai',\n WBTC: 'wrapped-bitcoin',\n WETH: 'weth',\n ARB: 'arbitrum',\n OP: 'optimism',\n LINK: 'chainlink',\n UNI: 'uniswap',\n AAVE: 'aave',\n SOL: 'solana',\n};\n\n// ===== Backwards Compatibility =====\n// @deprecated - Use getChains() or fetch from Engine API\n// These static configs are kept for backwards compatibility only\n\nexport const CHAIN_CONFIGS: Record<string, ChainConfig> = {\n ethereum: {\n id: 1,\n name: 'Ethereum',\n shortName: 'ETH',\n icon: '\\u229F',\n nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\n rpcUrls: ['https://ethereum.rpc.thirdweb.com'],\n blockExplorerUrls: ['https://etherscan.io'],\n testnet: false,\n },\n polygon: {\n id: 137,\n name: 'Polygon',\n shortName: 'MATIC',\n icon: '\\uD83D\\uDFE3',\n nativeCurrency: { name: 'POL', symbol: 'POL', decimals: 18 },\n rpcUrls: ['https://polygon.rpc.thirdweb.com'],\n blockExplorerUrls: ['https://polygonscan.com'],\n testnet: false,\n },\n base: {\n id: 8453,\n name: 'Base',\n shortName: 'BASE',\n icon: '\\uD83D\\uDD37',\n nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\n rpcUrls: ['https://base.rpc.thirdweb.com'],\n blockExplorerUrls: ['https://basescan.org'],\n testnet: false,\n },\n arbitrum: {\n id: 42161,\n name: 'Arbitrum One',\n shortName: 'ARB',\n icon: '\\uD83D\\uDD35',\n nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\n rpcUrls: ['https://arbitrum.rpc.thirdweb.com'],\n blockExplorerUrls: ['https://arbiscan.io'],\n testnet: false,\n },\n optimism: {\n id: 10,\n name: 'Optimism',\n shortName: 'OP',\n icon: '\\uD83D\\uDD34',\n nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\n rpcUrls: ['https://optimism.rpc.thirdweb.com'],\n blockExplorerUrls: ['https://optimistic.etherscan.io'],\n testnet: false,\n },\n};\n\n// @deprecated - Use getChains() to get all supported chains\nexport const SUPPORTED_CHAINS = Object.keys(CHAIN_CONFIGS);\n\n// @deprecated - Use getChainByName() instead\nexport function getChainConfig(chain: string): ChainConfig | undefined {\n return CHAIN_CONFIGS[chain.toLowerCase()];\n}\n","/**\n * ONE Engine Client - The unified API gateway for all ONE Ecosystem services\n *\n * All wallet operations, onramp, swap, trading go through ONE Engine.\n * Thirdweb/Onramper/etc are internal to ONE Engine and hidden from clients.\n */\n\nimport { getConfig } from '../config';\nimport type {\n ApiResponse,\n User,\n Token,\n WalletBalance,\n Transaction,\n AIStrategy,\n AIOrder,\n AIOrderStatus,\n AITradeExecution,\n AITradeAllocation,\n AINavSnapshot,\n AIPortfolioSummary,\n AIRedemptionResult,\n AIMarketData,\n CreateAIOrderRequest,\n StrategyCategory,\n NFT,\n NFTCollection,\n Contract,\n ContractReadParams,\n ContractWriteParams,\n ContractDeployParams,\n BillProvider,\n BillPayment,\n OfframpQuote,\n OfframpRequest,\n OfframpTransaction,\n StakingPool,\n StakingPosition,\n ReferralInfo,\n Referral,\n UserProfile,\n UserSettings,\n Notification,\n BridgeQuote,\n BridgeTransaction,\n GasEstimate,\n GasPrice,\n WalletImportRequest,\n PortfolioAnalytics,\n LimitOrder,\n TradingCondition,\n Webhook,\n WebhookDelivery,\n CreateWebhookInput,\n UpdateWebhookInput,\n AdminUser,\n AdminProject,\n SystemStats,\n PaginatedResult,\n AdminListOptions,\n SystemLog,\n RateLimitInfo,\n} from '../types';\n\n// ===== Auth Types =====\nexport interface EngineAuthResponse {\n user: User;\n accessToken: string;\n refreshToken?: string;\n expiresIn: number;\n}\n\n// ===== Wallet Types =====\nexport interface EngineWalletBalance {\n address: string;\n totalUsd: number;\n change24h: number;\n changePercent24h: number;\n tokens: Token[];\n}\n\nexport interface EngineTransactionRequest {\n to: string;\n amount: string;\n tokenSymbol: string;\n chainId: number;\n memo?: string;\n}\n\nexport interface EngineTransactionResponse {\n txId: string;\n status: 'queued' | 'pending' | 'confirmed' | 'failed';\n txHash?: string;\n explorerUrl?: string;\n}\n\n// ===== Onramp Types =====\nexport interface OnrampSessionRequest {\n walletAddress: string;\n fiatCurrency?: string;\n fiatAmount?: number;\n cryptoCurrency?: string;\n cryptoNetwork?: string;\n paymentMethod?: string;\n redirectUrl?: string;\n}\n\nexport interface OnrampSession {\n sessionId: string;\n widgetUrl: string;\n expiresAt: string;\n}\n\nexport interface OnrampQuote {\n provider: string;\n fiatCurrency: string;\n fiatAmount: number;\n cryptoCurrency: string;\n cryptoAmount: number;\n rate: number;\n fees: {\n network: number;\n provider: number;\n total: number;\n };\n paymentMethod: string;\n estimatedTime: string;\n}\n\nexport interface OnrampTransaction {\n id: string;\n sessionId: string;\n status: 'pending' | 'processing' | 'completed' | 'failed' | 'expired';\n fiatAmount: number;\n fiatCurrency: string;\n cryptoAmount?: number;\n cryptoCurrency: string;\n walletAddress: string;\n txHash?: string;\n createdAt: string;\n completedAt?: string;\n}\n\n// ===== Swap Types =====\nexport interface SwapQuoteRequest {\n fromToken: string;\n fromAmount: string;\n fromChainId: number;\n toToken: string;\n toChainId: number;\n walletAddress: string;\n slippage?: number;\n}\n\nexport interface SwapQuote {\n quoteId: string;\n fromToken: string;\n fromAmount: string;\n fromChainId: number;\n toToken: string;\n toAmount: string;\n toChainId: number;\n rate: number;\n priceImpact: number;\n estimatedGas: string;\n estimatedTime: string;\n fees: {\n gas: number;\n protocol: number;\n total: number;\n };\n expiresAt: string;\n}\n\nexport interface SwapExecuteRequest {\n quoteId: string;\n walletAddress: string;\n signature?: string; // For backend wallets\n}\n\nexport interface SwapResult {\n swapId: string;\n status: 'pending' | 'confirming' | 'completed' | 'failed';\n txHash?: string;\n fromAmount: string;\n toAmount?: string;\n}\n\n// ===== Main Client =====\nexport class OneEngineClient {\n private baseUrl: string;\n private clientId: string;\n private secretKey?: string;\n private accessToken?: string;\n\n constructor(options?: {\n baseUrl?: string;\n clientId?: string;\n secretKey?: string;\n }) {\n const config = getConfig();\n this.baseUrl = options?.baseUrl || config.oneEngineUrl;\n this.clientId = options?.clientId || config.oneClientId || '';\n this.secretKey = options?.secretKey || config.oneSecretKey;\n }\n\n /**\n * Set access token for authenticated requests\n */\n setAccessToken(token: string) {\n this.accessToken = token;\n }\n\n /**\n * Clear access token\n */\n clearAccessToken() {\n this.accessToken = undefined;\n }\n\n private getHeaders(includeSecret = false): Record<string, string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'x-client-id': this.clientId,\n };\n\n if (this.accessToken) {\n headers['Authorization'] = `Bearer ${this.accessToken}`;\n }\n\n if (includeSecret && this.secretKey) {\n headers['x-secret-key'] = this.secretKey;\n }\n\n return headers;\n }\n\n private async request<T>(\n endpoint: string,\n options: RequestInit = {},\n includeSecret = false\n ): Promise<ApiResponse<T>> {\n try {\n const response = await fetch(`${this.baseUrl}${endpoint}`, {\n ...options,\n headers: {\n ...this.getHeaders(includeSecret),\n ...options.headers,\n },\n });\n\n const data = await response.json();\n\n if (!response.ok) {\n return {\n success: false,\n error: {\n code: data.error?.code || `HTTP_${response.status}`,\n message: data.error?.message || 'Request failed',\n },\n };\n }\n\n return {\n success: true,\n data: data.data || data,\n };\n } catch (error) {\n return {\n success: false,\n error: {\n code: 'NETWORK_ERROR',\n message: error instanceof Error ? error.message : 'Network request failed',\n },\n };\n }\n }\n\n // ===============================\n // AUTH ENDPOINTS\n // ===============================\n\n /**\n * Send OTP to email for authentication\n */\n async sendEmailOtp(email: string): Promise<ApiResponse<{ message: string }>> {\n return this.request('/api/v1/auth/otp', {\n method: 'POST',\n body: JSON.stringify({ email }),\n });\n }\n\n /**\n * Verify OTP and get access token\n */\n async verifyEmailOtp(email: string, otp: string): Promise<ApiResponse<EngineAuthResponse>> {\n return this.request('/api/v1/auth/otp/verify', {\n method: 'POST',\n body: JSON.stringify({ email, otp }),\n });\n }\n\n /**\n * Authenticate with wallet signature\n */\n async authWithWallet(\n walletAddress: string,\n signature: string,\n message: string\n ): Promise<ApiResponse<EngineAuthResponse>> {\n return this.request('/api/v1/auth/wallet', {\n method: 'POST',\n body: JSON.stringify({ walletAddress, signature, message }),\n });\n }\n\n /**\n * Refresh access token\n */\n async refreshToken(refreshToken: string): Promise<ApiResponse<EngineAuthResponse>> {\n return this.request('/api/v1/auth/refresh', {\n method: 'POST',\n body: JSON.stringify({ refreshToken }),\n });\n }\n\n /**\n * Get current user\n */\n async getCurrentUser(): Promise<ApiResponse<User>> {\n return this.request('/api/v1/auth/me', { method: 'GET' });\n }\n\n /**\n * Sign out\n */\n async signOut(): Promise<ApiResponse<{ success: boolean }>> {\n return this.request('/api/v1/auth/logout', { method: 'POST' });\n }\n\n // ===============================\n // WALLET/ASSETS ENDPOINTS\n // ===============================\n\n /**\n * Get wallet balance across all chains\n */\n async getWalletBalance(\n walletAddress: string,\n chains?: number[]\n ): Promise<ApiResponse<EngineWalletBalance>> {\n const params = new URLSearchParams({ address: walletAddress });\n if (chains?.length && chains.length > 0) {\n params.set('chainId', chains[0].toString()); // Engine expects single chainId\n }\n return this.request(`/api/v1/assets?${params}`, { method: 'GET' });\n }\n\n /**\n * Get portfolio summary\n */\n async getPortfolioSummary(\n walletAddress: string\n ): Promise<ApiResponse<{ totalValue: number; change24h: number; tokens: Token[] }>> {\n const params = new URLSearchParams({ address: walletAddress });\n return this.request(`/api/v1/assets/portfolio?${params}`, { method: 'GET' });\n }\n\n /**\n * Get user's wallets\n */\n async getUserWallets(\n chainId?: number\n ): Promise<ApiResponse<{ wallets: any[]; total: number }>> {\n const params = chainId ? `?chainId=${chainId}` : '';\n return this.request(`/api/v1/wallet${params}`, { method: 'GET' });\n }\n\n /**\n * Create a new wallet\n */\n async createWallet(\n chainId: number = 8453,\n type: 'smart' | 'eoa' | 'multisig' = 'smart'\n ): Promise<ApiResponse<{ wallet: any; smartAccountAddress: string; personalAddress: string }>> {\n return this.request('/api/v1/wallet', {\n method: 'POST',\n body: JSON.stringify({ chainId, type }),\n });\n }\n\n /**\n * Get wallet transactions (placeholder - needs endpoint)\n */\n async getWalletTransactions(\n walletAddress: string,\n options?: { limit?: number; offset?: number; chainId?: number }\n ): Promise<ApiResponse<{ transactions: Transaction[]; total: number }>> {\n const params = new URLSearchParams({ address: walletAddress });\n if (options?.limit) params.set('limit', options.limit.toString());\n if (options?.offset) params.set('offset', options.offset.toString());\n if (options?.chainId) params.set('chainId', options.chainId.toString());\n return this.request(`/api/v1/assets/transactions?${params}`, { method: 'GET' });\n }\n\n /**\n * Send native token or ERC20\n */\n async sendTransaction(\n request: EngineTransactionRequest\n ): Promise<ApiResponse<EngineTransactionResponse>> {\n return this.request('/api/v1/wallet/send', {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /**\n * Get transaction status\n */\n async getTransactionStatus(txId: string): Promise<ApiResponse<EngineTransactionResponse>> {\n return this.request(`/api/v1/wallet/transaction/${txId}`, { method: 'GET' });\n }\n\n // ===============================\n // ONRAMP ENDPOINTS (Fiat-to-Crypto)\n // ===============================\n\n /**\n * Get onramp quote\n */\n async getOnrampQuote(\n fiatCurrency: string,\n fiatAmount: number,\n cryptoCurrency: string,\n paymentMethod?: string\n ): Promise<ApiResponse<OnrampQuote[]>> {\n const params = new URLSearchParams({\n fiatCurrency,\n fiatAmount: fiatAmount.toString(),\n cryptoCurrency,\n });\n if (paymentMethod) params.set('paymentMethod', paymentMethod);\n return this.request(`/api/v1/fiat/onramp/quote?${params}`, { method: 'GET' });\n }\n\n /**\n * Create onramp session (returns widget URL)\n */\n async createOnrampSession(\n request: OnrampSessionRequest\n ): Promise<ApiResponse<OnrampSession>> {\n return this.request('/api/v1/fiat/onramp', {\n method: 'POST',\n body: JSON.stringify({\n fiatCurrency: request.fiatCurrency || 'USD',\n fiatAmount: request.fiatAmount || 100,\n cryptoCurrency: request.cryptoCurrency || 'ETH',\n walletAddress: request.walletAddress,\n chainId: 8453, // Default to Base\n }),\n });\n }\n\n /**\n * Get onramp session status\n */\n async getOnrampStatus(sessionId: string): Promise<ApiResponse<OnrampTransaction>> {\n return this.request(`/api/v1/fiat/onramp/${sessionId}`, { method: 'GET' });\n }\n\n /**\n * Get supported currencies (fiat + crypto)\n */\n async getSupportedCurrencies(): Promise<ApiResponse<{ fiatCurrencies: string[]; cryptoCurrencies: string[] }>> {\n return this.request('/api/v1/fiat/onramp', { method: 'GET' });\n }\n\n /**\n * Get supported fiat currencies\n */\n async getSupportedFiatCurrencies(): Promise<ApiResponse<string[]>> {\n const result = await this.getSupportedCurrencies();\n if (result.success && result.data) {\n return { success: true, data: result.data.fiatCurrencies };\n }\n return { success: false, error: result.error };\n }\n\n /**\n * Get supported payment methods\n */\n async getSupportedPaymentMethods(country?: string): Promise<ApiResponse<string[]>> {\n // Placeholder - engine doesn't have this endpoint yet\n return { success: true, data: ['card', 'bank_transfer', 'apple_pay', 'google_pay'] };\n }\n\n // ===============================\n // SWAP ENDPOINTS\n // ===============================\n\n /**\n * Get swap quote\n */\n async getSwapQuote(request: SwapQuoteRequest): Promise<ApiResponse<SwapQuote>> {\n return this.request('/api/v1/swap/quote', {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /**\n * Execute swap\n */\n async executeSwap(request: SwapExecuteRequest): Promise<ApiResponse<SwapResult>> {\n return this.request('/api/v1/swap/execute', {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /**\n * Get swap status\n */\n async getSwapStatus(swapId: string): Promise<ApiResponse<SwapResult>> {\n return this.request(`/api/v1/swap/${swapId}`, { method: 'GET' });\n }\n\n /**\n * Get supported tokens for swap\n */\n async getSupportedSwapTokens(chainId?: number): Promise<ApiResponse<{ tokens: Token[] }>> {\n const params = chainId ? `?chainId=${chainId}` : '';\n return this.request(`/api/v1/swap/tokens${params}`, { method: 'GET' });\n }\n\n /**\n * Get supported chains for swap\n */\n async getSupportedSwapChains(): Promise<ApiResponse<{ chains: { id: number; name: string }[] }>> {\n return this.request('/api/v1/swap/chains', { method: 'GET' });\n }\n\n // ===============================\n // AI TRADING/QUANT ENDPOINTS\n // ===============================\n\n /**\n * Get available AI trading strategies\n */\n async getStrategies(): Promise<ApiResponse<AIStrategy[]>> {\n return this.request('/api/v1/quant/strategies', { method: 'GET' });\n }\n\n /**\n * Get strategy details\n */\n async getStrategy(strategyId: string): Promise<ApiResponse<AIStrategy>> {\n return this.request(`/api/v1/quant/strategies/${strategyId}`, { method: 'GET' });\n }\n\n /**\n * Get user's positions\n */\n async getPositions(): Promise<ApiResponse<any[]>> {\n return this.request('/api/v1/quant/positions', { method: 'GET' });\n }\n\n /**\n * Create investment order\n */\n async createOrder(\n strategyId: string,\n amount: number,\n currency: string\n ): Promise<ApiResponse<AIOrder>> {\n return this.request('/api/v1/trading/orders', {\n method: 'POST',\n body: JSON.stringify({ strategyId, amount, currency }),\n });\n }\n\n /**\n * Get user's orders\n */\n async getUserOrders(): Promise<ApiResponse<AIOrder[]>> {\n return this.request('/api/v1/trading/orders', { method: 'GET' });\n }\n\n /**\n * Get user's portfolio stats from positions\n */\n async getPortfolioStats(): Promise<ApiResponse<{\n totalInvested: number;\n totalValue: number;\n totalPnl: number;\n totalPnlPercent: number;\n activePositions: number;\n }>> {\n // Derive from positions\n const positionsResult = await this.getPositions();\n if (positionsResult.success && positionsResult.data) {\n const positions = positionsResult.data;\n const totalInvested = positions.reduce((sum, p) => sum + (p.investedAmount || 0), 0);\n const totalValue = positions.reduce((sum, p) => sum + (p.currentValue || 0), 0);\n const totalPnl = totalValue - totalInvested;\n const totalPnlPercent = totalInvested > 0 ? (totalPnl / totalInvested) * 100 : 0;\n return {\n success: true,\n data: {\n totalInvested,\n totalValue,\n totalPnl,\n totalPnlPercent,\n activePositions: positions.filter((p: any) => p.status === 'active').length,\n },\n };\n }\n return {\n success: true,\n data: { totalInvested: 0, totalValue: 0, totalPnl: 0, totalPnlPercent: 0, activePositions: 0 },\n };\n }\n\n // ===============================\n // MARKET/PRICE ENDPOINTS\n // ===============================\n\n /**\n * Get token prices\n */\n async getTokenPrices(symbols: string[]): Promise<ApiResponse<Record<string, {\n price: number;\n change24h: number;\n marketCap?: number;\n }>>> {\n // Convert symbols to Bybit format (add USDT suffix if needed)\n const bybitSymbols = symbols.map(s => {\n const upper = s.toUpperCase();\n if (upper.endsWith('USDT')) return upper;\n return `${upper}USDT`;\n });\n\n const result = await this.request<{ markets: any[] }>(\n `/api/v1/trading/market?symbols=${bybitSymbols.join(',')}`,\n { method: 'GET' }\n );\n\n if (result.success && result.data?.markets) {\n const prices: Record<string, { price: number; change24h: number; marketCap?: number }> = {};\n for (const market of result.data.markets) {\n const symbol = market.symbol?.replace('USDT', '') || '';\n prices[symbol] = {\n price: parseFloat(market.lastPrice) || 0,\n change24h: parseFloat(market.price24hPcnt) * 100 || 0,\n marketCap: undefined, // Bybit doesn't provide this\n };\n }\n return { success: true, data: prices };\n }\n return { success: false, error: result.error };\n }\n\n /**\n * Get market data overview\n */\n async getMarketData(): Promise<ApiResponse<{\n totalMarketCap: number;\n totalVolume24h: number;\n btcDominance: number;\n markets: any[];\n }>> {\n const result = await this.request<{ markets: any[] }>('/api/v1/trading/market', { method: 'GET' });\n if (result.success && result.data?.markets) {\n return {\n success: true,\n data: {\n totalMarketCap: 0, // Would need separate API\n totalVolume24h: result.data.markets.reduce((sum, m) => sum + (parseFloat(m.volume24h) || 0), 0),\n btcDominance: 0, // Would need separate API\n markets: result.data.markets,\n },\n };\n }\n return { success: false, error: result.error };\n }\n\n // ===============================\n // NFT ENDPOINTS\n // ===============================\n\n /**\n * Get user's NFTs\n */\n async getUserNFTs(\n walletAddress: string,\n options?: { chainId?: number; limit?: number; offset?: number }\n ): Promise<ApiResponse<{ nfts: NFT[]; total: number }>> {\n const params = new URLSearchParams({ address: walletAddress });\n if (options?.chainId) params.set('chainId', options.chainId.toString());\n if (options?.limit) params.set('limit', options.limit.toString());\n if (options?.offset) params.set('offset', options.offset.toString());\n return this.request(`/api/v1/assets/nfts?${params}`, { method: 'GET' });\n }\n\n /**\n * Get NFT details\n */\n async getNFTDetails(\n contractAddress: string,\n tokenId: string,\n chainId: number\n ): Promise<ApiResponse<NFT>> {\n return this.request(`/api/v1/assets/nfts/${contractAddress}/${tokenId}?chainId=${chainId}`, { method: 'GET' });\n }\n\n /**\n * Get NFT collection\n */\n async getNFTCollection(\n contractAddress: string,\n chainId: number\n ): Promise<ApiResponse<NFTCollection>> {\n return this.request(`/api/v1/assets/nfts/collection/${contractAddress}?chainId=${chainId}`, { method: 'GET' });\n }\n\n /**\n * Transfer NFT\n */\n async transferNFT(params: {\n contractAddress: string;\n tokenId: string;\n chainId: number;\n to: string;\n tokenType?: 'ERC721' | 'ERC1155';\n amount?: number; // For ERC1155\n }): Promise<ApiResponse<{ txHash: string; status: string }>> {\n return this.request('/api/v1/assets/nfts/transfer', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n // ===============================\n // CONTRACT ENDPOINTS\n // ===============================\n\n /**\n * Get user's contracts\n */\n async getUserContracts(\n options?: { chainId?: number; limit?: number; offset?: number }\n ): Promise<ApiResponse<{ contracts: Contract[]; total: number }>> {\n const params = new URLSearchParams();\n if (options?.chainId) params.set('chainId', options.chainId.toString());\n if (options?.limit) params.set('limit', options.limit.toString());\n if (options?.offset) params.set('offset', options.offset.toString());\n return this.request(`/api/v1/contracts?${params}`, { method: 'GET' });\n }\n\n /**\n * Get contract details\n */\n async getContractDetails(\n address: string,\n chainId: number\n ): Promise<ApiResponse<Contract>> {\n return this.request(`/api/v1/contracts/${address}?chainId=${chainId}`, { method: 'GET' });\n }\n\n /**\n * Read contract (call view function)\n */\n async readContract(params: ContractReadParams): Promise<ApiResponse<any>> {\n return this.request('/api/v1/contracts/read', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n /**\n * Write to contract (execute transaction)\n */\n async writeContract(params: ContractWriteParams): Promise<ApiResponse<{\n txHash: string;\n status: string;\n }>> {\n return this.request('/api/v1/contracts/write', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n /**\n * Deploy contract\n */\n async deployContract(params: ContractDeployParams): Promise<ApiResponse<{\n address: string;\n txHash: string;\n contract: Contract;\n }>> {\n return this.request('/api/v1/contracts/deploy', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n // ===============================\n // OFFRAMP ENDPOINTS (Crypto-to-Fiat)\n // ===============================\n\n /**\n * Get offramp quote\n */\n async getOfframpQuote(\n cryptoCurrency: string,\n cryptoAmount: number,\n fiatCurrency: string,\n payoutMethod?: string\n ): Promise<ApiResponse<OfframpQuote[]>> {\n const params = new URLSearchParams({\n cryptoCurrency,\n cryptoAmount: cryptoAmount.toString(),\n fiatCurrency,\n });\n if (payoutMethod) params.set('payoutMethod', payoutMethod);\n return this.request(`/api/v1/fiat/offramp/quote?${params}`, { method: 'GET' });\n }\n\n /**\n * Create offramp transaction\n */\n async createOfframpTransaction(request: OfframpRequest): Promise<ApiResponse<OfframpTransaction>> {\n return this.request('/api/v1/fiat/offramp', {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /**\n * Get offramp transaction status\n */\n async getOfframpStatus(transactionId: string): Promise<ApiResponse<OfframpTransaction>> {\n return this.request(`/api/v1/fiat/offramp/${transactionId}`, { method: 'GET' });\n }\n\n /**\n * Get supported payout methods\n */\n async getSupportedPayoutMethods(country?: string): Promise<ApiResponse<string[]>> {\n const params = country ? `?country=${country}` : '';\n return this.request(`/api/v1/fiat/offramp/methods${params}`, { method: 'GET' });\n }\n\n // ===============================\n // BILL PAYMENT ENDPOINTS\n // ===============================\n\n /**\n * Get bill providers\n */\n async getBillProviders(\n country?: string,\n category?: string\n ): Promise<ApiResponse<BillProvider[]>> {\n const params = new URLSearchParams();\n if (country) params.set('country', country);\n if (category) params.set('category', category);\n return this.request(`/api/v1/bills/providers?${params}`, { method: 'GET' });\n }\n\n /**\n * Get bill details/validate account\n */\n async validateBillAccount(\n providerId: string,\n accountNumber: string\n ): Promise<ApiResponse<{\n valid: boolean;\n accountName?: string;\n minAmount?: number;\n maxAmount?: number;\n dueAmount?: number;\n }>> {\n return this.request('/api/v1/bills/validate', {\n method: 'POST',\n body: JSON.stringify({ providerId, accountNumber }),\n });\n }\n\n /**\n * Pay bill\n */\n async payBill(params: {\n providerId: string;\n accountNumber: string;\n amount: number;\n currency: string;\n }): Promise<ApiResponse<BillPayment>> {\n return this.request('/api/v1/bills/pay', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n /**\n * Get bill payment history\n */\n async getBillHistory(\n options?: { limit?: number; offset?: number }\n ): Promise<ApiResponse<{ payments: BillPayment[]; total: number }>> {\n const params = new URLSearchParams();\n if (options?.limit) params.set('limit', options.limit.toString());\n if (options?.offset) params.set('offset', options.offset.toString());\n return this.request(`/api/v1/bills/history?${params}`, { method: 'GET' });\n }\n\n // ===============================\n // STAKING ENDPOINTS\n // ===============================\n\n /**\n * Get staking pools\n */\n async getStakingPools(\n chainId?: number\n ): Promise<ApiResponse<StakingPool[]>> {\n const params = chainId ? `?chainId=${chainId}` : '';\n return this.request(`/api/v1/staking/pools${params}`, { method: 'GET' });\n }\n\n /**\n * Get user's staking positions\n */\n async getStakingPositions(): Promise<ApiResponse<StakingPosition[]>> {\n return this.request('/api/v1/staking/positions', { method: 'GET' });\n }\n\n /**\n * Stake tokens\n */\n async stake(params: {\n poolId: string;\n amount: number;\n }): Promise<ApiResponse<{ positionId: string; txHash: string }>> {\n return this.request('/api/v1/staking/stake', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n /**\n * Unstake tokens\n */\n async unstake(params: {\n positionId: string;\n amount?: number; // Optional for partial unstake\n }): Promise<ApiResponse<{ txHash: string }>> {\n return this.request('/api/v1/staking/unstake', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n /**\n * Claim staking rewards\n */\n async claimStakingRewards(positionId: string): Promise<ApiResponse<{ txHash: string; amount: number }>> {\n return this.request('/api/v1/staking/claim', {\n method: 'POST',\n body: JSON.stringify({ positionId }),\n });\n }\n\n // ===============================\n // USER PROFILE ENDPOINTS\n // ===============================\n\n /**\n * Get user profile\n */\n async getUserProfile(): Promise<ApiResponse<UserProfile>> {\n return this.request('/api/v1/user/profile', { method: 'GET' });\n }\n\n /**\n * Update user profile\n */\n async updateUserProfile(updates: Partial<UserProfile>): Promise<ApiResponse<UserProfile>> {\n return this.request('/api/v1/user/profile', {\n method: 'PATCH',\n body: JSON.stringify(updates),\n });\n }\n\n /**\n * Get user settings\n */\n async getUserSettings(): Promise<ApiResponse<UserSettings>> {\n return this.request('/api/v1/user/settings', { method: 'GET' });\n }\n\n /**\n * Update user settings\n */\n async updateUserSettings(updates: Partial<UserSettings>): Promise<ApiResponse<UserSettings>> {\n return this.request('/api/v1/user/settings', {\n method: 'PATCH',\n body: JSON.stringify(updates),\n });\n }\n\n // ===============================\n // NOTIFICATION ENDPOINTS\n // ===============================\n\n /**\n * Get notifications\n */\n async getNotifications(\n options?: { unreadOnly?: boolean; limit?: number; offset?: number }\n ): Promise<ApiResponse<{ notifications: Notification[]; unreadCount: number }>> {\n const params = new URLSearchParams();\n if (options?.unreadOnly) params.set('unreadOnly', 'true');\n if (options?.limit) params.set('limit', options.limit.toString());\n if (options?.offset) params.set('offset', options.offset.toString());\n return this.request(`/api/v1/notifications?${params}`, { method: 'GET' });\n }\n\n /**\n * Mark notification as read\n */\n async markNotificationRead(notificationId: string): Promise<ApiResponse<void>> {\n return this.request(`/api/v1/notifications/${notificationId}/read`, { method: 'POST' });\n }\n\n /**\n * Mark all notifications as read\n */\n async markAllNotificationsRead(): Promise<ApiResponse<void>> {\n return this.request('/api/v1/notifications/read-all', { method: 'POST' });\n }\n\n // ===============================\n // REFERRAL ENDPOINTS\n // ===============================\n\n /**\n * Get referral info\n */\n async getReferralInfo(): Promise<ApiResponse<ReferralInfo>> {\n return this.request('/api/v1/referral', { method: 'GET' });\n }\n\n /**\n * Get referred users\n */\n async getReferrals(): Promise<ApiResponse<Referral[]>> {\n return this.request('/api/v1/referral/list', { method: 'GET' });\n }\n\n /**\n * Apply referral code\n */\n async applyReferralCode(code: string): Promise<ApiResponse<{ success: boolean; message: string }>> {\n return this.request('/api/v1/referral/apply', {\n method: 'POST',\n body: JSON.stringify({ code }),\n });\n }\n\n /**\n * Claim referral rewards\n */\n async claimReferralRewards(): Promise<ApiResponse<{ amount: number; txHash?: string }>> {\n return this.request('/api/v1/referral/claim', { method: 'POST' });\n }\n\n // ===============================\n // KYC ENDPOINTS\n // ===============================\n\n /**\n * Get KYC status\n */\n async getKycStatus(): Promise<ApiResponse<{\n status: 'none' | 'pending' | 'verified' | 'rejected';\n level: number;\n limits: { daily: number; monthly: number };\n rejectionReason?: string;\n }>> {\n return this.request('/api/v1/kyc/status', { method: 'GET' });\n }\n\n /**\n * Start KYC verification\n */\n async startKycVerification(level: number): Promise<ApiResponse<{\n verificationUrl: string;\n sessionId: string;\n }>> {\n return this.request('/api/v1/kyc/start', {\n method: 'POST',\n body: JSON.stringify({ level }),\n });\n }\n\n /**\n * Submit KYC documents\n */\n async submitKycDocuments(params: {\n documentType: 'passport' | 'id_card' | 'drivers_license';\n frontImage: string; // base64\n backImage?: string; // base64\n selfieImage: string; // base64\n }): Promise<ApiResponse<{ status: string; message: string }>> {\n return this.request('/api/v1/kyc/submit', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n // ===============================\n // BRIDGE ENDPOINTS\n // ===============================\n\n /**\n * Get bridge quote\n */\n async getBridgeQuote(params: {\n fromChainId: number;\n toChainId: number;\n fromToken: string;\n toToken: string;\n amount: string;\n walletAddress: string;\n }): Promise<ApiResponse<BridgeQuote>> {\n return this.request('/api/v1/bridge/quote', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n /**\n * Execute bridge transaction\n */\n async executeBridge(params: {\n quoteId: string;\n walletAddress: string;\n }): Promise<ApiResponse<BridgeTransaction>> {\n return this.request('/api/v1/bridge/execute', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n /**\n * Get bridge transaction status\n */\n async getBridgeStatus(bridgeId: string): Promise<ApiResponse<BridgeTransaction>> {\n return this.request(`/api/v1/bridge/${bridgeId}`, { method: 'GET' });\n }\n\n /**\n * Get supported bridge routes\n */\n async getSupportedBridgeRoutes(): Promise<ApiResponse<{\n routes: { fromChainId: number; toChainId: number; tokens: string[] }[];\n }>> {\n return this.request('/api/v1/bridge/routes', { method: 'GET' });\n }\n\n // ===============================\n // GAS ENDPOINTS\n // ===============================\n\n /**\n * Get gas estimate for transaction\n */\n async getGasEstimate(params: {\n chainId: number;\n to: string;\n data?: string;\n value?: string;\n }): Promise<ApiResponse<GasEstimate>> {\n return this.request('/api/v1/gas/estimate', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n /**\n * Get current gas prices for chain\n */\n async getGasPrice(chainId: number): Promise<ApiResponse<GasPrice>> {\n return this.request(`/api/v1/gas/price?chainId=${chainId}`, { method: 'GET' });\n }\n\n // ===============================\n // WALLET IMPORT/EXPORT ENDPOINTS\n // ===============================\n\n /**\n * Import wallet from private key or mnemonic\n */\n async importWallet(request: WalletImportRequest): Promise<ApiResponse<{\n wallet: any;\n address: string;\n smartAccountAddress?: string;\n }>> {\n return this.request('/api/v1/wallet/import', {\n method: 'POST',\n body: JSON.stringify(request),\n }, true); // Include secret key for secure import\n }\n\n /**\n * Export wallet (get encrypted private key)\n * Requires additional authentication\n */\n async exportWallet(walletId: string, pin: string): Promise<ApiResponse<{\n encryptedPrivateKey: string;\n address: string;\n }>> {\n return this.request('/api/v1/wallet/export', {\n method: 'POST',\n body: JSON.stringify({ walletId, pin }),\n }, true);\n }\n\n /**\n * Generate new mnemonic phrase\n */\n async generateMnemonic(): Promise<ApiResponse<{ mnemonic: string; address: string }>> {\n return this.request('/api/v1/wallet/generate-mnemonic', { method: 'POST' }, true);\n }\n\n /**\n * Validate mnemonic phrase\n */\n async validateMnemonic(mnemonic: string): Promise<ApiResponse<{ valid: boolean; address?: string }>> {\n return this.request('/api/v1/wallet/validate-mnemonic', {\n method: 'POST',\n body: JSON.stringify({ mnemonic }),\n });\n }\n\n // ===============================\n // PORTFOLIO ANALYTICS ENDPOINTS\n // ===============================\n\n /**\n * Get portfolio analytics with historical data\n */\n async getPortfolioAnalytics(\n walletAddress: string,\n period: '24h' | '7d' | '30d' | '90d' | '1y' | 'all' = '30d'\n ): Promise<ApiResponse<PortfolioAnalytics>> {\n const params = new URLSearchParams({ address: walletAddress, period });\n return this.request(`/api/v1/analytics/portfolio?${params}`, { method: 'GET' });\n }\n\n /**\n * Get transaction analytics\n */\n async getTransactionAnalytics(\n walletAddress: string,\n period: '24h' | '7d' | '30d' | '90d' = '30d'\n ): Promise<ApiResponse<{\n totalTransactions: number;\n totalVolume: number;\n avgTransactionValue: number;\n byType: Record<string, number>;\n byChain: Record<string, number>;\n }>> {\n const params = new URLSearchParams({ address: walletAddress, period });\n return this.request(`/api/v1/analytics/transactions?${params}`, { method: 'GET' });\n }\n\n // ===============================\n // ADVANCED TRADING ENDPOINTS\n // ===============================\n\n /**\n * Create limit order\n */\n async createLimitOrder(params: {\n tokenSymbol: string;\n type: 'buy' | 'sell';\n amount: number;\n limitPrice: number;\n chainId: number;\n expiresIn?: number; // seconds\n conditions?: TradingCondition[];\n }): Promise<ApiResponse<LimitOrder>> {\n return this.request('/api/v1/trading/limit-orders', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n /**\n * Get user's limit orders\n */\n async getLimitOrders(status?: 'pending' | 'filled' | 'cancelled'): Promise<ApiResponse<LimitOrder[]>> {\n const params = status ? `?status=${status}` : '';\n return this.request(`/api/v1/trading/limit-orders${params}`, { method: 'GET' });\n }\n\n /**\n * Cancel limit order\n */\n async cancelLimitOrder(orderId: string): Promise<ApiResponse<{ success: boolean }>> {\n return this.request(`/api/v1/trading/limit-orders/${orderId}`, { method: 'DELETE' });\n }\n\n /**\n * Set price alert\n */\n async setPriceAlert(params: {\n tokenSymbol: string;\n targetPrice: number;\n condition: 'above' | 'below';\n notification: 'push' | 'email' | 'both';\n }): Promise<ApiResponse<{ alertId: string }>> {\n return this.request('/api/v1/trading/alerts', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n /**\n * Get price alerts\n */\n async getPriceAlerts(): Promise<ApiResponse<{\n id: string;\n tokenSymbol: string;\n targetPrice: number;\n condition: 'above' | 'below';\n status: 'active' | 'triggered' | 'cancelled';\n createdAt: string;\n triggeredAt?: string;\n }[]>> {\n return this.request('/api/v1/trading/alerts', { method: 'GET' });\n }\n\n /**\n * Delete price alert\n */\n async deletePriceAlert(alertId: string): Promise<ApiResponse<{ success: boolean }>> {\n return this.request(`/api/v1/trading/alerts/${alertId}`, { method: 'DELETE' });\n }\n\n // ===============================\n // SESSION MANAGEMENT\n // ===============================\n\n /**\n * Get active sessions\n */\n async getActiveSessions(): Promise<ApiResponse<{\n sessions: {\n id: string;\n deviceName: string;\n ipAddress: string;\n lastActive: string;\n current: boolean;\n }[];\n }>> {\n return this.request('/api/v1/auth/sessions', { method: 'GET' });\n }\n\n /**\n * Revoke session\n */\n async revokeSession(sessionId: string): Promise<ApiResponse<{ success: boolean }>> {\n return this.request(`/api/v1/auth/sessions/${sessionId}`, { method: 'DELETE' });\n }\n\n /**\n * Revoke all other sessions\n */\n async revokeAllOtherSessions(): Promise<ApiResponse<{ revokedCount: number }>> {\n return this.request('/api/v1/auth/sessions/revoke-all', { method: 'POST' });\n }\n\n // ========== Webhooks ==========\n\n /**\n * List webhooks for the project\n */\n async listWebhooks(options?: { isActive?: boolean }): Promise<ApiResponse<{ webhooks: Webhook[]; total: number }>> {\n const params = new URLSearchParams();\n if (options?.isActive !== undefined) params.set('isActive', String(options.isActive));\n const query = params.toString();\n return this.request(`/api/v1/webhooks${query ? `?${query}` : ''}`, { method: 'GET' });\n }\n\n /**\n * Get webhook by ID\n */\n async getWebhook(webhookId: string): Promise<ApiResponse<{ webhook: Webhook }>> {\n return this.request(`/api/v1/webhooks/${webhookId}`, { method: 'GET' });\n }\n\n /**\n * Create a webhook\n */\n async createWebhook(input: CreateWebhookInput): Promise<ApiResponse<{ webhook: Webhook }>> {\n return this.request('/api/v1/webhooks', {\n method: 'POST',\n body: JSON.stringify(input),\n });\n }\n\n /**\n * Update a webhook\n */\n async updateWebhook(webhookId: string, input: UpdateWebhookInput): Promise<ApiResponse<{ webhook: Webhook }>> {\n return this.request(`/api/v1/webhooks/${webhookId}`, {\n method: 'PATCH',\n body: JSON.stringify(input),\n });\n }\n\n /**\n * Delete a webhook\n */\n async deleteWebhook(webhookId: string): Promise<ApiResponse<{ deleted: boolean }>> {\n return this.request(`/api/v1/webhooks/${webhookId}`, { method: 'DELETE' });\n }\n\n /**\n * Get webhook deliveries\n */\n async getWebhookDeliveries(\n webhookId: string,\n options?: { status?: 'pending' | 'success' | 'failed'; limit?: number; offset?: number }\n ): Promise<ApiResponse<{ deliveries: WebhookDelivery[]; total: number }>> {\n const params = new URLSearchParams();\n if (options?.status) params.set('status', options.status);\n if (options?.limit) params.set('limit', String(options.limit));\n if (options?.offset) params.set('offset', String(options.offset));\n const query = params.toString();\n return this.request(`/api/v1/webhooks/${webhookId}/deliveries${query ? `?${query}` : ''}`, { method: 'GET' });\n }\n\n /**\n * Test a webhook\n */\n async testWebhook(webhookId: string): Promise<ApiResponse<{\n success: boolean;\n statusCode?: number;\n responseTime?: number;\n error?: string;\n }>> {\n return this.request(`/api/v1/webhooks/${webhookId}/test`, { method: 'POST' });\n }\n\n // ========== Admin (requires admin role) ==========\n\n /**\n * List all users (admin only)\n */\n async adminListUsers(options?: AdminListOptions & {\n role?: 'user' | 'admin';\n kycStatus?: 'none' | 'pending' | 'verified' | 'rejected';\n isActive?: boolean;\n }): Promise<ApiResponse<PaginatedResult<AdminUser>>> {\n const params = new URLSearchParams();\n if (options?.page) params.set('page', String(options.page));\n if (options?.limit) params.set('limit', String(options.limit));\n if (options?.search) params.set('search', options.search);\n if (options?.sortBy) params.set('sortBy', options.sortBy);\n if (options?.sortOrder) params.set('sortOrder', options.sortOrder);\n if (options?.role) params.set('role', options.role);\n if (options?.kycStatus) params.set('kycStatus', options.kycStatus);\n if (options?.isActive !== undefined) params.set('isActive', String(options.isActive));\n const query = params.toString();\n return this.request(`/api/v1/admin/users${query ? `?${query}` : ''}`, { method: 'GET' });\n }\n\n /**\n * Get user by ID (admin only)\n */\n async adminGetUser(userId: string): Promise<ApiResponse<{ user: AdminUser }>> {\n return this.request(`/api/v1/admin/users/${userId}`, { method: 'GET' });\n }\n\n /**\n * Update user (admin only)\n */\n async adminUpdateUser(userId: string, data: {\n role?: 'user' | 'admin';\n isActive?: boolean;\n kycStatus?: 'none' | 'pending' | 'verified' | 'rejected';\n }): Promise<ApiResponse<{ user: AdminUser }>> {\n return this.request(`/api/v1/admin/users/${userId}`, {\n method: 'PATCH',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * List all projects (admin only)\n */\n async adminListProjects(options?: AdminListOptions & {\n isActive?: boolean;\n }): Promise<ApiResponse<PaginatedResult<AdminProject>>> {\n const params = new URLSearchParams();\n if (options?.page) params.set('page', String(options.page));\n if (options?.limit) params.set('limit', String(options.limit));\n if (options?.search) params.set('search', options.search);\n if (options?.sortBy) params.set('sortBy', options.sortBy);\n if (options?.sortOrder) params.set('sortOrder', options.sortOrder);\n if (options?.isActive !== undefined) params.set('isActive', String(options.isActive));\n const query = params.toString();\n return this.request(`/api/v1/admin/projects${query ? `?${query}` : ''}`, { method: 'GET' });\n }\n\n /**\n * Get project by ID (admin only)\n */\n async adminGetProject(projectId: string): Promise<ApiResponse<{ project: AdminProject }>> {\n return this.request(`/api/v1/admin/projects/${projectId}`, { method: 'GET' });\n }\n\n /**\n * Update project (admin only)\n */\n async adminUpdateProject(projectId: string, data: {\n name?: string;\n isActive?: boolean;\n settings?: Record<string, unknown>;\n }): Promise<ApiResponse<{ project: AdminProject }>> {\n return this.request(`/api/v1/admin/projects/${projectId}`, {\n method: 'PATCH',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * Regenerate project API key (admin only)\n */\n async adminRegenerateApiKey(projectId: string): Promise<ApiResponse<{ apiKey: string }>> {\n return this.request(`/api/v1/admin/projects/${projectId}/regenerate-key`, { method: 'POST' });\n }\n\n /**\n * Get system statistics (admin only)\n */\n async adminGetStats(days?: number): Promise<ApiResponse<SystemStats>> {\n const query = days ? `?days=${days}` : '';\n return this.request(`/api/v1/admin/stats${query}`, { method: 'GET' });\n }\n\n /**\n * Get system logs (admin only)\n */\n async adminGetLogs(options?: {\n level?: 'info' | 'warn' | 'error';\n service?: string;\n limit?: number;\n offset?: number;\n startDate?: string;\n endDate?: string;\n }): Promise<ApiResponse<{ logs: SystemLog[]; total: number }>> {\n const params = new URLSearchParams();\n if (options?.level) params.set('level', options.level);\n if (options?.service) params.set('service', options.service);\n if (options?.limit) params.set('limit', String(options.limit));\n if (options?.offset) params.set('offset', String(options.offset));\n if (options?.startDate) params.set('startDate', options.startDate);\n if (options?.endDate) params.set('endDate', options.endDate);\n const query = params.toString();\n return this.request(`/api/v1/admin/logs${query ? `?${query}` : ''}`, { method: 'GET' });\n }\n\n /**\n * Get rate limit status (admin only)\n */\n async adminGetRateLimits(options?: {\n identifier?: string;\n limit?: number;\n }): Promise<ApiResponse<{ limits: RateLimitInfo[] }>> {\n const params = new URLSearchParams();\n if (options?.identifier) params.set('identifier', options.identifier);\n if (options?.limit) params.set('limit', String(options.limit));\n const query = params.toString();\n return this.request(`/api/v1/admin/rate-limits${query ? `?${query}` : ''}`, { method: 'GET' });\n }\n\n /**\n * Clear rate limits for an identifier (admin only)\n */\n async adminClearRateLimits(identifier: string): Promise<ApiResponse<{ success: boolean }>> {\n return this.request(`/api/v1/admin/rate-limits/${identifier}`, { method: 'DELETE' });\n }\n\n // ========== AI Agent Configuration ==========\n\n /**\n * Get all AI agent configurations\n * This returns the full agent setup including tiers, cycles, and trading parameters\n */\n async getAgentConfigs(options?: {\n includeInactive?: boolean;\n agentId?: string;\n }): Promise<ApiResponse<{\n agents?: Array<{\n id: string;\n name: string;\n name_zh: string;\n description: string;\n description_zh: string;\n category: string;\n risk_level: number;\n icon: string;\n color: string;\n tiers: Array<{ tier: number; amount: number; label: string; label_zh: string }>;\n supported_cycles: number[];\n default_cycle: number;\n supported_pairs: string[];\n supported_chains: string[];\n is_active: boolean;\n preview: {\n tier: { tier: number; amount: number; label: string };\n cycle: number;\n dailyLots: number;\n stabilityScore: number;\n roiRange: { min: number; max: number; userMin: number; userMax: number };\n shareRate: number;\n profitEstimate: { monthlyMin: number; monthlyMax: number; cycleMin: number; cycleMax: number };\n };\n }>;\n agent?: any;\n shareRates?: Record<number, number>;\n }>> {\n const params = new URLSearchParams();\n if (options?.includeInactive) params.set('includeInactive', 'true');\n if (options?.agentId) params.set('agentId', options.agentId);\n const query = params.toString();\n return this.request(`/api/v1/agents${query ? `?${query}` : ''}`, { method: 'GET' });\n }\n\n /**\n * Calculate subscription parameters for an agent\n */\n async calculateAgentParams(params: {\n agentId: string;\n amount: number;\n cycleDays: number;\n }): Promise<ApiResponse<{\n dailyLots: number;\n effectiveCapital: number;\n stabilityScore: number;\n roiRange: { min: number; max: number; userMin: number; userMax: number };\n shareRate: number;\n profitEstimate: { monthlyMin: number; monthlyMax: number; cycleMin: number; cycleMax: number };\n }>> {\n return this.request('/api/v1/agents/calculate', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n /**\n * Get supported trading pairs from agents\n */\n async getTradingPairs(): Promise<ApiResponse<{\n pairs: string[];\n byAgent: Record<string, string[]>;\n }>> {\n const result = await this.getAgentConfigs();\n if (result.success && result.data?.agents) {\n const allPairs = new Set<string>();\n const byAgent: Record<string, string[]> = {};\n for (const agent of result.data.agents) {\n byAgent[agent.id] = agent.supported_pairs;\n agent.supported_pairs.forEach(p => allPairs.add(p));\n }\n return { success: true, data: { pairs: Array.from(allPairs), byAgent } };\n }\n return { success: false, error: result.error };\n }\n\n // ========== AI Quant Trading ==========\n\n /**\n * Get all AI trading strategies\n */\n async getAIStrategies(filters?: {\n category?: StrategyCategory;\n riskLevel?: number;\n minTvl?: number;\n isActive?: boolean;\n }): Promise<ApiResponse<{ strategies: AIStrategy[] }>> {\n const params = new URLSearchParams();\n if (filters?.category) params.set('category', filters.category);\n if (filters?.riskLevel) params.set('risk_level', String(filters.riskLevel));\n if (filters?.minTvl) params.set('min_tvl', String(filters.minTvl));\n if (filters?.isActive !== undefined) params.set('is_active', String(filters.isActive));\n const query = params.toString();\n return this.request(`/api/v1/ai-quant/strategies${query ? `?${query}` : ''}`, { method: 'GET' });\n }\n\n /**\n * Get AI strategy details\n */\n async getAIStrategy(strategyId: string, include?: ('performance' | 'market' | 'trades')[]): Promise<ApiResponse<{\n strategy: AIStrategy;\n performance?: AINavSnapshot[];\n marketData?: AIMarketData[];\n trades?: AITradeExecution[];\n }>> {\n const params = new URLSearchParams();\n if (include?.length) params.set('include', include.join(','));\n const query = params.toString();\n return this.request(`/api/v1/ai-quant/strategies/${strategyId}${query ? `?${query}` : ''}`, { method: 'GET' });\n }\n\n /**\n * Get strategy performance history\n */\n async getAIStrategyPerformance(strategyId: string, days = 30): Promise<ApiResponse<{ performance: AINavSnapshot[] }>> {\n return this.request(`/api/v1/ai-quant/strategies/${strategyId}?include=performance&days=${days}`, { method: 'GET' });\n }\n\n /**\n * Get real-time market data for strategy pairs\n */\n async getAIStrategyMarketData(strategyId: string): Promise<ApiResponse<{ marketData: AIMarketData[] }>> {\n return this.request(`/api/v1/ai-quant/strategies/${strategyId}?include=market`, { method: 'GET' });\n }\n\n /**\n * Create AI trading order\n */\n async createAIOrder(request: CreateAIOrderRequest): Promise<ApiResponse<{ order: AIOrder }>> {\n return this.request('/api/v1/ai-quant/orders', {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /**\n * Get user's AI orders\n */\n async getAIOrders(filters?: {\n strategyId?: string;\n status?: AIOrderStatus;\n }): Promise<ApiResponse<{ orders: AIOrder[] }>> {\n const params = new URLSearchParams();\n if (filters?.strategyId) params.set('strategy_id', filters.strategyId);\n if (filters?.status) params.set('status', filters.status);\n const query = params.toString();\n return this.request(`/api/v1/ai-quant/orders${query ? `?${query}` : ''}`, { method: 'GET' });\n }\n\n /**\n * Get AI order details\n */\n async getAIOrder(orderId: string): Promise<ApiResponse<{\n order: AIOrder;\n strategy: AIStrategy;\n }>> {\n return this.request(`/api/v1/ai-quant/orders/${orderId}`, { method: 'GET' });\n }\n\n /**\n * Pause AI order\n */\n async pauseAIOrder(orderId: string): Promise<ApiResponse<{ order: AIOrder; message: string }>> {\n return this.request(`/api/v1/ai-quant/orders/${orderId}/pause`, { method: 'POST' });\n }\n\n /**\n * Resume AI order\n */\n async resumeAIOrder(orderId: string): Promise<ApiResponse<{ order: AIOrder; message: string }>> {\n return this.request(`/api/v1/ai-quant/orders/${orderId}/resume`, { method: 'POST' });\n }\n\n /**\n * Request redemption for AI order\n */\n async redeemAIOrder(orderId: string): Promise<ApiResponse<{\n success: boolean;\n redemption: AIRedemptionResult;\n message: string;\n }>> {\n return this.request(`/api/v1/ai-quant/orders/${orderId}/redeem`, { method: 'POST' });\n }\n\n /**\n * Get AI portfolio summary\n */\n async getAIPortfolio(include?: ('allocations' | 'orders')[]): Promise<ApiResponse<{\n portfolio: AIPortfolioSummary;\n allocations?: AITradeAllocation[];\n orders?: AIOrder[];\n }>> {\n const params = new URLSearchParams();\n if (include?.length) params.set('include', include.join(','));\n const query = params.toString();\n return this.request(`/api/v1/ai-quant/portfolio${query ? `?${query}` : ''}`, { method: 'GET' });\n }\n\n /**\n * Get user's trade allocations\n */\n async getAITradeAllocations(limit = 50): Promise<ApiResponse<{ allocations: AITradeAllocation[] }>> {\n return this.request(`/api/v1/ai-quant/portfolio?include=allocations&limit=${limit}`, { method: 'GET' });\n }\n\n /**\n * Get trade history for a strategy\n */\n async getAITradeHistory(strategyId: string, limit = 50): Promise<ApiResponse<{ trades: AITradeExecution[] }>> {\n return this.request(`/api/v1/ai-quant/strategies/${strategyId}?include=trades&limit=${limit}`, { method: 'GET' });\n }\n\n /**\n * Execute AI signals for a strategy (admin only)\n */\n async executeAISignals(strategyId: string): Promise<ApiResponse<{\n executions: AITradeExecution[];\n count: number;\n message: string;\n }>> {\n return this.request('/api/v1/ai-quant/execute', {\n method: 'POST',\n body: JSON.stringify({ strategyId }),\n });\n }\n\n // ========== Free Price APIs (No API Key Required) ==========\n\n /**\n * Get cryptocurrency prices (FREE - uses CoinGecko/Binance/CoinCap)\n */\n async getCryptoPrices(symbols: string[]): Promise<ApiResponse<{\n prices: Array<{\n symbol: string;\n price: number;\n change24h: number;\n changePercent24h: number;\n high24h: number;\n low24h: number;\n volume24h: number;\n marketCap?: number;\n lastUpdated: string;\n }>;\n }>> {\n return this.request(`/api/v1/prices?symbols=${symbols.join(',')}`, { method: 'GET' });\n }\n\n /**\n * Get single cryptocurrency price (FREE)\n */\n async getCryptoPrice(symbol: string): Promise<ApiResponse<{\n price: {\n symbol: string;\n price: number;\n change24h: number;\n changePercent24h: number;\n high24h: number;\n low24h: number;\n volume24h: number;\n marketCap?: number;\n lastUpdated: string;\n };\n }>> {\n return this.request(`/api/v1/prices/${symbol}`, { method: 'GET' });\n }\n\n /**\n * Get OHLCV candles for charting (FREE - from Binance)\n */\n async getCryptoCandles(\n symbol: string,\n interval: '1m' | '5m' | '15m' | '1h' | '4h' | '1d' = '1h',\n limit = 100\n ): Promise<ApiResponse<{\n symbol: string;\n interval: string;\n candles: Array<{\n timestamp: number;\n open: number;\n high: number;\n low: number;\n close: number;\n volume: number;\n }>;\n }>> {\n return this.request(`/api/v1/prices/${symbol}?candles=true&interval=${interval}&limit=${limit}`, { method: 'GET' });\n }\n\n /**\n * Get top cryptocurrencies by market cap (FREE)\n */\n async getTopCryptos(limit = 20): Promise<ApiResponse<{\n prices: Array<{\n symbol: string;\n price: number;\n change24h: number;\n changePercent24h: number;\n high24h: number;\n low24h: number;\n volume24h: number;\n marketCap?: number;\n lastUpdated: string;\n }>;\n }>> {\n return this.request(`/api/v1/prices?type=top&limit=${limit}`, { method: 'GET' });\n }\n\n /**\n * Get crypto market overview (FREE)\n */\n async getCryptoMarketOverview(): Promise<ApiResponse<{\n overview: {\n totalMarketCap: number;\n totalVolume24h: number;\n btcDominance: number;\n marketCapChange24h: number;\n activeCryptocurrencies: number;\n };\n }>> {\n return this.request('/api/v1/prices?type=overview', { method: 'GET' });\n }\n\n // ========== Project Management ==========\n\n /**\n * Get user's projects\n */\n async getProjects(options?: {\n isActive?: boolean;\n }): Promise<ApiResponse<{ projects: AdminProject[]; total: number }>> {\n const params = new URLSearchParams();\n if (options?.isActive !== undefined) params.set('isActive', String(options.isActive));\n const query = params.toString();\n return this.request(`/api/v1/projects${query ? `?${query}` : ''}`, { method: 'GET' });\n }\n\n /**\n * Create a new project for ecosystem partners\n */\n async createProject(params: {\n name: string;\n slug: string;\n settings?: Record<string, unknown>;\n }): Promise<ApiResponse<{ project: AdminProject }>> {\n return this.request('/api/v1/projects', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n /**\n * Get project details\n */\n async getProject(projectId: string): Promise<ApiResponse<{ project: AdminProject }>> {\n return this.request(`/api/v1/projects/${projectId}`, { method: 'GET' });\n }\n\n /**\n * Update project settings\n */\n async updateProject(projectId: string, updates: {\n name?: string;\n isActive?: boolean;\n settings?: Record<string, unknown>;\n }): Promise<ApiResponse<{ project: AdminProject }>> {\n return this.request(`/api/v1/projects/${projectId}`, {\n method: 'PATCH',\n body: JSON.stringify(updates),\n });\n }\n\n /**\n * Get project features status\n */\n async getProjectFeatures(projectId: string): Promise<ApiResponse<{\n features: Record<string, {\n enabled: boolean;\n name: string;\n description: string;\n description_zh: string;\n }>;\n availableFeatures: string[];\n }>> {\n return this.request(`/api/v1/projects/${projectId}/features`, { method: 'GET' });\n }\n\n /**\n * Enable/disable features for a project\n */\n async updateProjectFeatures(projectId: string, features: {\n wallet?: boolean;\n swap?: boolean;\n contracts?: boolean;\n fiat?: boolean;\n payments?: boolean;\n quant?: boolean;\n ai?: boolean;\n x402?: boolean;\n }): Promise<ApiResponse<{ project: AdminProject; message: string }>> {\n return this.request(`/api/v1/projects/${projectId}/features`, {\n method: 'PATCH',\n body: JSON.stringify(features),\n });\n }\n\n /**\n * Regenerate project API key\n */\n async regenerateProjectApiKey(projectId: string): Promise<ApiResponse<{ apiKey: string }>> {\n return this.request(`/api/v1/projects/${projectId}/api-key`, { method: 'POST' });\n }\n\n /**\n * Delete project\n */\n async deleteProject(projectId: string): Promise<ApiResponse<{ deleted: boolean }>> {\n return this.request(`/api/v1/projects/${projectId}`, { method: 'DELETE' });\n }\n}\n\n// Factory function\nexport function createOneEngineClient(options?: {\n baseUrl?: string;\n clientId?: string;\n secretKey?: string;\n}): OneEngineClient {\n return new OneEngineClient(options);\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport { createOneEngineClient, type EngineWalletBalance } from '../services/engine';\nimport type { Token } from '../types';\n\ninterface UseWalletBalanceOptions {\n chains?: number[];\n autoRefresh?: boolean;\n refreshInterval?: number; // in milliseconds\n engineUrl?: string;\n clientId?: string;\n}\n\ninterface UseWalletBalanceReturn {\n balance: EngineWalletBalance | null;\n tokens: Token[];\n totalUsd: number;\n change24h: number;\n changePercent24h: number;\n isLoading: boolean;\n error: string | null;\n refetch: () => Promise<void>;\n}\n\n/**\n * Hook for fetching wallet balance via ONE Engine\n *\n * Note: If using OneProvider, prefer useOneWallet() instead for better integration.\n * This hook is for standalone usage outside of OneProvider.\n */\nexport function useWalletBalance(\n walletAddress: string | null,\n options: UseWalletBalanceOptions = {}\n): UseWalletBalanceReturn {\n const {\n chains,\n autoRefresh = false,\n refreshInterval = 60000, // 1 minute\n engineUrl,\n clientId,\n } = options;\n\n const [balance, setBalance] = useState<EngineWalletBalance | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n // Create engine client once\n const engineRef = useRef(createOneEngineClient({\n baseUrl: engineUrl,\n clientId: clientId,\n }));\n\n const fetchBalance = useCallback(async () => {\n if (!walletAddress) {\n setBalance(null);\n return;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await engineRef.current.getWalletBalance(walletAddress, chains);\n if (result.success && result.data) {\n setBalance(result.data);\n } else {\n setError(result.error?.message || 'Failed to fetch balance');\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to fetch balance');\n } finally {\n setIsLoading(false);\n }\n }, [walletAddress, chains]);\n\n // Initial fetch\n useEffect(() => {\n fetchBalance();\n }, [fetchBalance]);\n\n // Auto-refresh\n useEffect(() => {\n if (!autoRefresh || !walletAddress) return;\n\n const interval = setInterval(fetchBalance, refreshInterval);\n return () => clearInterval(interval);\n }, [autoRefresh, refreshInterval, fetchBalance, walletAddress]);\n\n return {\n balance,\n tokens: balance?.tokens || [],\n totalUsd: balance?.totalUsd || 0,\n change24h: balance?.change24h || 0,\n changePercent24h: balance?.changePercent24h || 0,\n isLoading,\n error,\n refetch: fetchBalance,\n };\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport { createOneEngineClient } from '../services/engine';\nimport type { TokenPrice } from '../types';\n\ninterface UseTokenPriceOptions {\n autoRefresh?: boolean;\n refreshInterval?: number;\n engineUrl?: string;\n clientId?: string;\n}\n\ninterface UseTokenPriceReturn {\n price: TokenPrice | null;\n isLoading: boolean;\n error: string | null;\n refetch: () => Promise<void>;\n}\n\n/**\n * Hook for fetching token price via ONE Engine\n *\n * Note: If using OneProvider, prefer useOneEngine().getTokenPrices() instead.\n * This hook is for standalone usage outside of OneProvider.\n */\nexport function useTokenPrice(\n symbol: string,\n options: UseTokenPriceOptions = {}\n): UseTokenPriceReturn {\n const { autoRefresh = false, refreshInterval = 30000, engineUrl, clientId } = options;\n\n const [price, setPrice] = useState<TokenPrice | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const engineRef = useRef(createOneEngineClient({\n baseUrl: engineUrl,\n clientId: clientId,\n }));\n\n const fetchPrice = useCallback(async () => {\n if (!symbol) return;\n\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await engineRef.current.getTokenPrices([symbol]);\n if (result.success && result.data && result.data[symbol]) {\n const priceData = result.data[symbol];\n setPrice({\n symbol,\n price: priceData.price,\n change24h: priceData.change24h,\n changePercent24h: priceData.change24h, // Same as change24h for percentage\n marketCap: priceData.marketCap,\n volume24h: 0, // Not provided by engine\n updatedAt: new Date().toISOString(),\n });\n } else {\n setError(result.error?.message || 'Failed to fetch price');\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to fetch price');\n } finally {\n setIsLoading(false);\n }\n }, [symbol]);\n\n useEffect(() => {\n fetchPrice();\n }, [fetchPrice]);\n\n useEffect(() => {\n if (!autoRefresh) return;\n\n const interval = setInterval(fetchPrice, refreshInterval);\n return () => clearInterval(interval);\n }, [autoRefresh, refreshInterval, fetchPrice]);\n\n return {\n price,\n isLoading,\n error,\n refetch: fetchPrice,\n };\n}\n\n// Hook for multiple token prices\ninterface UseTokenPricesReturn {\n prices: Record<string, TokenPrice>;\n isLoading: boolean;\n error: string | null;\n refetch: () => Promise<void>;\n}\n\nexport function useTokenPrices(\n symbols: string[],\n options: UseTokenPriceOptions = {}\n): UseTokenPricesReturn {\n const { autoRefresh = false, refreshInterval = 30000, engineUrl, clientId } = options;\n\n const [prices, setPrices] = useState<Record<string, TokenPrice>>({});\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const engineRef = useRef(createOneEngineClient({\n baseUrl: engineUrl,\n clientId: clientId,\n }));\n\n const fetchPrices = useCallback(async () => {\n if (symbols.length === 0) return;\n\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await engineRef.current.getTokenPrices(symbols);\n if (result.success && result.data) {\n const priceMap: Record<string, TokenPrice> = {};\n for (const sym of symbols) {\n if (result.data[sym]) {\n priceMap[sym] = {\n symbol: sym,\n price: result.data[sym].price,\n change24h: result.data[sym].change24h,\n changePercent24h: result.data[sym].change24h,\n marketCap: result.data[sym].marketCap,\n volume24h: 0,\n updatedAt: new Date().toISOString(),\n };\n }\n }\n setPrices(priceMap);\n } else {\n setError(result.error?.message || 'Failed to fetch prices');\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to fetch prices');\n } finally {\n setIsLoading(false);\n }\n }, [symbols]);\n\n useEffect(() => {\n fetchPrices();\n }, [fetchPrices]);\n\n useEffect(() => {\n if (!autoRefresh) return;\n\n const interval = setInterval(fetchPrices, refreshInterval);\n return () => clearInterval(interval);\n }, [autoRefresh, refreshInterval, fetchPrices]);\n\n return {\n prices,\n isLoading,\n error,\n refetch: fetchPrices,\n };\n}\n","/**\n * AI Trading Hooks for ONE SDK\n *\n * React hooks for AI quantitative trading features.\n * These hooks provide easy access to AI strategies, orders, and portfolio management.\n */\n\nimport { useState, useEffect, useCallback, useMemo } from 'react';\nimport { createOneEngineClient, OneEngineClient } from '../services/engine';\nimport type {\n AIStrategy,\n AIOrder,\n AIOrderStatus,\n AIPortfolioSummary,\n AITradeAllocation,\n AINavSnapshot,\n AIMarketData,\n CreateAIOrderRequest,\n StrategyCategory,\n ApiResponse,\n} from '../types';\n\n// Singleton client instance\nlet clientInstance: OneEngineClient | null = null;\n\nfunction getClient(): OneEngineClient {\n if (!clientInstance) {\n clientInstance = createOneEngineClient();\n }\n return clientInstance;\n}\n\n/**\n * Set the access token for authenticated requests\n */\nexport function setAITradingAccessToken(token: string) {\n getClient().setAccessToken(token);\n}\n\n/**\n * Clear the access token\n */\nexport function clearAITradingAccessToken() {\n getClient().clearAccessToken();\n}\n\n// ============================================\n// AI Strategies Hooks\n// ============================================\n\nexport interface UseAIStrategiesOptions {\n category?: StrategyCategory;\n riskLevel?: number;\n minTvl?: number;\n isActive?: boolean;\n autoRefresh?: boolean;\n refreshInterval?: number;\n}\n\nexport interface UseAIStrategiesResult {\n strategies: AIStrategy[];\n isLoading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\n/**\n * Hook to fetch and manage AI trading strategies\n */\nexport function useAIStrategies(options: UseAIStrategiesOptions = {}): UseAIStrategiesResult {\n const [strategies, setStrategies] = useState<AIStrategy[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const { category, riskLevel, minTvl, isActive, autoRefresh = false, refreshInterval = 60000 } = options;\n\n const fetchStrategies = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n const result = await getClient().getAIStrategies({ category, riskLevel, minTvl, isActive });\n if (result.success && result.data?.strategies) {\n setStrategies(result.data.strategies);\n } else {\n setError(result.error?.message || 'Failed to fetch strategies');\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Unknown error');\n } finally {\n setIsLoading(false);\n }\n }, [category, riskLevel, minTvl, isActive]);\n\n useEffect(() => {\n fetchStrategies();\n }, [fetchStrategies]);\n\n useEffect(() => {\n if (autoRefresh && refreshInterval > 0) {\n const interval = setInterval(fetchStrategies, refreshInterval);\n return () => clearInterval(interval);\n }\n }, [autoRefresh, refreshInterval, fetchStrategies]);\n\n return { strategies, isLoading, error, refresh: fetchStrategies };\n}\n\n/**\n * Hook to fetch a single AI strategy with performance data\n */\nexport interface UseAIStrategyResult {\n strategy: AIStrategy | null;\n performance: AINavSnapshot[];\n marketData: AIMarketData[];\n isLoading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useAIStrategy(\n strategyId: string | undefined,\n include: ('performance' | 'market' | 'trades')[] = ['performance', 'market']\n): UseAIStrategyResult {\n const [strategy, setStrategy] = useState<AIStrategy | null>(null);\n const [performance, setPerformance] = useState<AINavSnapshot[]>([]);\n const [marketData, setMarketData] = useState<AIMarketData[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const fetchStrategy = useCallback(async () => {\n if (!strategyId) {\n setIsLoading(false);\n return;\n }\n\n setIsLoading(true);\n setError(null);\n try {\n const result = await getClient().getAIStrategy(strategyId, include);\n if (result.success && result.data) {\n setStrategy(result.data.strategy);\n setPerformance(result.data.performance || []);\n setMarketData(result.data.marketData || []);\n } else {\n setError(result.error?.message || 'Failed to fetch strategy');\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Unknown error');\n } finally {\n setIsLoading(false);\n }\n }, [strategyId, include.join(',')]);\n\n useEffect(() => {\n fetchStrategy();\n }, [fetchStrategy]);\n\n return { strategy, performance, marketData, isLoading, error, refresh: fetchStrategy };\n}\n\n// ============================================\n// AI Orders Hooks\n// ============================================\n\nexport interface UseAIOrdersOptions {\n strategyId?: string;\n status?: AIOrderStatus;\n autoRefresh?: boolean;\n refreshInterval?: number;\n}\n\nexport interface UseAIOrdersResult {\n orders: AIOrder[];\n isLoading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n createOrder: (request: CreateAIOrderRequest) => Promise<ApiResponse<{ order: AIOrder }>>;\n pauseOrder: (orderId: string) => Promise<ApiResponse<{ order: AIOrder; message: string }>>;\n resumeOrder: (orderId: string) => Promise<ApiResponse<{ order: AIOrder; message: string }>>;\n redeemOrder: (orderId: string) => Promise<ApiResponse<any>>;\n}\n\n/**\n * Hook to manage AI trading orders\n */\nexport function useAIOrders(options: UseAIOrdersOptions = {}): UseAIOrdersResult {\n const [orders, setOrders] = useState<AIOrder[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const { strategyId, status, autoRefresh = true, refreshInterval = 30000 } = options;\n\n const fetchOrders = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n const result = await getClient().getAIOrders({ strategyId, status });\n if (result.success && result.data?.orders) {\n setOrders(result.data.orders);\n } else {\n setError(result.error?.message || 'Failed to fetch orders');\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Unknown error');\n } finally {\n setIsLoading(false);\n }\n }, [strategyId, status]);\n\n useEffect(() => {\n fetchOrders();\n }, [fetchOrders]);\n\n useEffect(() => {\n if (autoRefresh && refreshInterval > 0) {\n const interval = setInterval(fetchOrders, refreshInterval);\n return () => clearInterval(interval);\n }\n }, [autoRefresh, refreshInterval, fetchOrders]);\n\n const createOrder = useCallback(async (request: CreateAIOrderRequest) => {\n const result = await getClient().createAIOrder(request);\n if (result.success) {\n await fetchOrders(); // Refresh orders list\n }\n return result;\n }, [fetchOrders]);\n\n const pauseOrder = useCallback(async (orderId: string) => {\n const result = await getClient().pauseAIOrder(orderId);\n if (result.success) {\n await fetchOrders();\n }\n return result;\n }, [fetchOrders]);\n\n const resumeOrder = useCallback(async (orderId: string) => {\n const result = await getClient().resumeAIOrder(orderId);\n if (result.success) {\n await fetchOrders();\n }\n return result;\n }, [fetchOrders]);\n\n const redeemOrder = useCallback(async (orderId: string) => {\n const result = await getClient().redeemAIOrder(orderId);\n if (result.success) {\n await fetchOrders();\n }\n return result;\n }, [fetchOrders]);\n\n return {\n orders,\n isLoading,\n error,\n refresh: fetchOrders,\n createOrder,\n pauseOrder,\n resumeOrder,\n redeemOrder,\n };\n}\n\n// ============================================\n// AI Portfolio Hooks\n// ============================================\n\nexport interface UseAIPortfolioResult {\n portfolio: AIPortfolioSummary | null;\n allocations: AITradeAllocation[];\n activeOrders: AIOrder[];\n isLoading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\n/**\n * Hook to fetch AI trading portfolio summary\n */\nexport function useAIPortfolio(autoRefresh = true): UseAIPortfolioResult {\n const [portfolio, setPortfolio] = useState<AIPortfolioSummary | null>(null);\n const [allocations, setAllocations] = useState<AITradeAllocation[]>([]);\n const [activeOrders, setActiveOrders] = useState<AIOrder[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const fetchPortfolio = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n const result = await getClient().getAIPortfolio(['allocations', 'orders']);\n if (result.success && result.data) {\n setPortfolio(result.data.portfolio);\n setAllocations(result.data.allocations || []);\n setActiveOrders(result.data.orders || []);\n } else {\n setError(result.error?.message || 'Failed to fetch portfolio');\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Unknown error');\n } finally {\n setIsLoading(false);\n }\n }, []);\n\n useEffect(() => {\n fetchPortfolio();\n }, [fetchPortfolio]);\n\n useEffect(() => {\n if (autoRefresh) {\n const interval = setInterval(fetchPortfolio, 30000);\n return () => clearInterval(interval);\n }\n }, [autoRefresh, fetchPortfolio]);\n\n return { portfolio, allocations, activeOrders, isLoading, error, refresh: fetchPortfolio };\n}\n\n// ============================================\n// AI Market Data Hook\n// ============================================\n\nexport interface UseAIMarketDataResult {\n prices: Record<string, { price: number; change24h: number }>;\n isLoading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\n/**\n * Hook to fetch real-time market data for AI trading pairs\n */\nexport function useAIMarketData(\n symbols: string[] = ['BTC', 'ETH', 'BNB', 'SOL', 'XRP', 'DOGE', 'ADA', 'AVAX'],\n autoRefresh = true\n): UseAIMarketDataResult {\n const [prices, setPrices] = useState<Record<string, { price: number; change24h: number }>>({});\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const fetchPrices = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n const result = await getClient().getTokenPrices(symbols);\n if (result.success && result.data) {\n setPrices(result.data);\n } else {\n setError(result.error?.message || 'Failed to fetch prices');\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Unknown error');\n } finally {\n setIsLoading(false);\n }\n }, [symbols.join(',')]);\n\n useEffect(() => {\n fetchPrices();\n }, [fetchPrices]);\n\n useEffect(() => {\n if (autoRefresh) {\n const interval = setInterval(fetchPrices, 15000); // Update every 15 seconds\n return () => clearInterval(interval);\n }\n }, [autoRefresh, fetchPrices]);\n\n return { prices, isLoading, error, refresh: fetchPrices };\n}\n\n// ============================================\n// Combined AI Trading Hook\n// ============================================\n\nexport interface UseAITradingResult {\n // Strategies\n strategies: AIStrategy[];\n strategiesLoading: boolean;\n\n // Orders\n orders: AIOrder[];\n ordersLoading: boolean;\n\n // Portfolio\n portfolio: AIPortfolioSummary | null;\n portfolioLoading: boolean;\n\n // Market Data\n prices: Record<string, { price: number; change24h: number }>;\n\n // Actions\n createOrder: (request: CreateAIOrderRequest) => Promise<ApiResponse<{ order: AIOrder }>>;\n pauseOrder: (orderId: string) => Promise<ApiResponse<{ order: AIOrder; message: string }>>;\n resumeOrder: (orderId: string) => Promise<ApiResponse<{ order: AIOrder; message: string }>>;\n redeemOrder: (orderId: string) => Promise<ApiResponse<any>>;\n\n // Refresh\n refreshAll: () => Promise<void>;\n\n // Error\n error: string | null;\n}\n\n/**\n * Combined hook for all AI trading functionality\n */\nexport function useAITrading(): UseAITradingResult {\n const strategiesResult = useAIStrategies({ autoRefresh: true });\n const ordersResult = useAIOrders({ autoRefresh: true });\n const portfolioResult = useAIPortfolio(true);\n const marketResult = useAIMarketData();\n\n const refreshAll = useCallback(async () => {\n await Promise.all([\n strategiesResult.refresh(),\n ordersResult.refresh(),\n portfolioResult.refresh(),\n marketResult.refresh(),\n ]);\n }, [strategiesResult.refresh, ordersResult.refresh, portfolioResult.refresh, marketResult.refresh]);\n\n const error = useMemo(() => {\n return strategiesResult.error || ordersResult.error || portfolioResult.error || marketResult.error;\n }, [strategiesResult.error, ordersResult.error, portfolioResult.error, marketResult.error]);\n\n return {\n strategies: strategiesResult.strategies,\n strategiesLoading: strategiesResult.isLoading,\n orders: ordersResult.orders,\n ordersLoading: ordersResult.isLoading,\n portfolio: portfolioResult.portfolio,\n portfolioLoading: portfolioResult.isLoading,\n prices: marketResult.prices,\n createOrder: ordersResult.createOrder,\n pauseOrder: ordersResult.pauseOrder,\n resumeOrder: ordersResult.resumeOrder,\n redeemOrder: ordersResult.redeemOrder,\n refreshAll,\n error,\n };\n}\n\n// ============================================\n// AI Agents Hooks\n// ============================================\n\nexport interface AIAgent {\n id: string;\n name: string;\n name_zh: string;\n description: string;\n description_zh: string;\n category: string;\n risk_level: number;\n icon: string;\n color: string;\n tiers: Array<{ tier: number; amount: number; label: string; label_zh: string }>;\n supported_cycles: number[];\n default_cycle: number;\n supported_pairs: string[];\n supported_chains: string[];\n is_active: boolean;\n preview?: {\n tier: { tier: number; amount: number; label: string };\n cycle: number;\n dailyLots: number;\n stabilityScore: number;\n roiRange: { min: number; max: number; userMin: number; userMax: number };\n shareRate: number;\n profitEstimate: { monthlyMin: number; monthlyMax: number; cycleMin: number; cycleMax: number };\n };\n}\n\nexport interface AIAgentParams {\n dailyLots: number;\n effectiveCapital: number;\n stabilityScore: number;\n roiRange: { min: number; max: number; userMin: number; userMax: number };\n shareRate: number;\n profitEstimate: { monthlyMin: number; monthlyMax: number; cycleMin: number; cycleMax: number };\n}\n\nexport interface UseAIAgentsResult {\n agents: AIAgent[];\n shareRates: Record<number, number>;\n isLoading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\n/**\n * Hook to fetch all AI agents with their configurations\n */\nexport function useAIAgents(includeInactive = false): UseAIAgentsResult {\n const [agents, setAgents] = useState<AIAgent[]>([]);\n const [shareRates, setShareRates] = useState<Record<number, number>>({});\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const fetchAgents = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n const result = await getClient().getAgentConfigs({ includeInactive });\n if (result.success && result.data) {\n setAgents(result.data.agents || []);\n setShareRates(result.data.shareRates || {});\n } else {\n setError(result.error?.message || 'Failed to fetch agents');\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Unknown error');\n } finally {\n setIsLoading(false);\n }\n }, [includeInactive]);\n\n useEffect(() => {\n fetchAgents();\n }, [fetchAgents]);\n\n return { agents, shareRates, isLoading, error, refresh: fetchAgents };\n}\n\nexport interface UseAIAgentResult {\n agent: AIAgent | null;\n params: AIAgentParams | null;\n isLoading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n calculateParams: (amount: number, cycleDays: number) => Promise<AIAgentParams | null>;\n}\n\n/**\n * Hook to fetch a single AI agent with detailed parameters\n */\nexport function useAIAgent(agentId: string | undefined): UseAIAgentResult {\n const [agent, setAgent] = useState<AIAgent | null>(null);\n const [params, setParams] = useState<AIAgentParams | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const fetchAgent = useCallback(async () => {\n if (!agentId) {\n setIsLoading(false);\n return;\n }\n\n setIsLoading(true);\n setError(null);\n try {\n const result = await getClient().getAgentConfigs({ agentId });\n if (result.success && result.data?.agent) {\n setAgent(result.data.agent);\n } else {\n setError(result.error?.message || 'Agent not found');\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Unknown error');\n } finally {\n setIsLoading(false);\n }\n }, [agentId]);\n\n useEffect(() => {\n fetchAgent();\n }, [fetchAgent]);\n\n const calculateParams = useCallback(async (amount: number, cycleDays: number): Promise<AIAgentParams | null> => {\n if (!agentId) return null;\n\n try {\n const result = await getClient().calculateAgentParams({ agentId, amount, cycleDays });\n if (result.success && result.data) {\n setParams(result.data);\n return result.data;\n }\n return null;\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to calculate params');\n return null;\n }\n }, [agentId]);\n\n return { agent, params, isLoading, error, refresh: fetchAgent, calculateParams };\n}\n\nexport interface UseAIAgentSubscriptionResult {\n subscribe: (agentId: string, amount: number, cycleDays: number, txHash?: string) => Promise<ApiResponse<{ order: AIOrder }>>;\n isLoading: boolean;\n error: string | null;\n}\n\n/**\n * Hook to subscribe to an AI agent strategy\n */\nexport function useAIAgentSubscription(): UseAIAgentSubscriptionResult {\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const subscribe = useCallback(async (\n agentId: string,\n amount: number,\n cycleDays: number,\n txHash?: string\n ): Promise<ApiResponse<{ order: AIOrder }>> => {\n setIsLoading(true);\n setError(null);\n try {\n // Create order for the agent strategy\n const result = await getClient().createAIOrder({\n strategyId: agentId,\n amount,\n lockPeriodDays: cycleDays,\n txHashDeposit: txHash,\n });\n if (!result.success) {\n setError(result.error?.message || 'Failed to subscribe');\n }\n return result;\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : 'Subscription failed';\n setError(errorMsg);\n return { success: false, error: { code: 'SUBSCRIPTION_ERROR', message: errorMsg } };\n } finally {\n setIsLoading(false);\n }\n }, []);\n\n return { subscribe, isLoading, error };\n}\n","/**\n * ONE SDK - Forex Trading Hooks\n * Provides React hooks for StableFX on-chain forex trading integration\n * Can be used by any ecosystem partner\n */\n\nimport { useState, useEffect, useCallback, useRef, useMemo } from 'react';\nimport type {\n ForexPool,\n ForexPoolType,\n ForexInvestment,\n ForexLogEntry,\n ForexPoolTransaction,\n ForexPoolDailySnapshot,\n ForexTradeRecord,\n} from '../types/forex';\nimport {\n FOREX_POOL_DEFAULTS,\n FOREX_CYCLE_OPTIONS,\n FOREX_AGENT,\n FOREX_CAPITAL_SPLIT,\n computePoolAllocations,\n estimateForexProfit,\n} from '../types/forex';\n\n// ── Configuration ────────────────────────────────────────────────────────────\n\nlet _forexAccessToken: string | null = null;\nlet _forexEngineUrl: string = 'https://api.one23.io';\n\n/** Set the access token for authenticated forex API calls */\nexport function setForexAccessToken(token: string): void {\n _forexAccessToken = token;\n}\n\n/** Clear the forex access token */\nexport function clearForexAccessToken(): void {\n _forexAccessToken = null;\n}\n\n/** Configure the engine URL for forex API calls */\nexport function setForexEngineUrl(url: string): void {\n _forexEngineUrl = url;\n}\n\n// ── Internal API Helper ──────────────────────────────────────────────────────\n\nasync function forexApi<T>(path: string, options?: RequestInit): Promise<T | null> {\n try {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n if (_forexAccessToken) {\n headers['Authorization'] = `Bearer ${_forexAccessToken}`;\n }\n const res = await fetch(`${_forexEngineUrl}${path}`, { ...options, headers });\n if (!res.ok) return null;\n const json = await res.json();\n return json?.data ?? json;\n } catch {\n return null;\n }\n}\n\n// ── useForexPools ────────────────────────────────────────────────────────────\n\nexport interface UseForexPoolsResult {\n pools: ForexPool[];\n isLoading: boolean;\n error: string | null;\n refresh: () => void;\n}\n\nexport function useForexPools(options?: { refreshInterval?: number }): UseForexPoolsResult {\n const [pools, setPools] = useState<ForexPool[]>(FOREX_POOL_DEFAULTS);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const fetchPools = useCallback(async () => {\n setIsLoading(true);\n try {\n const data = await forexApi<{ pools: any[] }>('/api/forex/pools');\n if (data?.pools) {\n setPools(data.pools.map((p: any) => ({\n id: p.type ?? p.id,\n nameKey: `forex.pool_${p.type ?? p.id}`,\n descriptionKey: `forex.pool_${p.type ?? p.id}_desc`,\n allocation: p.allocation ?? (p.type === 'clearing' ? 0.50 : p.type === 'hedging' ? 0.30 : 0.20),\n totalSize: p.totalSize ?? p.total_size ?? 0,\n utilization: p.utilization ?? 0,\n color: p.type === 'clearing' ? '#3B82F6' : p.type === 'hedging' ? '#F59E0B' : '#10B981',\n apy7d: p.apy7d ?? 0,\n apy30d: p.apy30d ?? 0,\n netFlow24h: p.netFlow24h ?? 0,\n txCount24h: p.txCount24h ?? 0,\n txCountTotal: p.txCountTotal ?? 0,\n totalDeposits: p.totalDeposits ?? 0,\n totalWithdrawals: p.totalWithdrawals ?? 0,\n profitDistributed: p.profitDistributed ?? 0,\n lastUpdated: p.lastUpdated ?? Date.now(),\n })));\n }\n setError(null);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to fetch pools');\n } finally {\n setIsLoading(false);\n }\n }, []);\n\n useEffect(() => {\n fetchPools();\n if (options?.refreshInterval) {\n const timer = setInterval(fetchPools, options.refreshInterval);\n return () => clearInterval(timer);\n }\n }, [fetchPools, options?.refreshInterval]);\n\n return { pools, isLoading, error, refresh: fetchPools };\n}\n\n// ── useForexInvestments ──────────────────────────────────────────────────────\n\nexport interface UseForexInvestmentsResult {\n investments: ForexInvestment[];\n isLoading: boolean;\n error: string | null;\n createInvestment: (params: { amount: number; selectedPairs: string[]; cycleDays: number }) => Promise<ForexInvestment | null>;\n redeemInvestment: (investmentId: string) => Promise<boolean>;\n refresh: () => void;\n portfolioSummary: {\n totalInvested: number;\n totalValue: number;\n totalProfit: number;\n activeCount: number;\n };\n}\n\nexport function useForexInvestments(options?: { refreshInterval?: number }): UseForexInvestmentsResult {\n const [investments, setInvestments] = useState<ForexInvestment[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const fetchInvestments = useCallback(async () => {\n setIsLoading(true);\n try {\n const data = await forexApi<{ investments: any[] }>('/api/forex/investments');\n if (data?.investments) {\n setInvestments(data.investments.map(mapInvestment));\n }\n setError(null);\n } catch {\n setError('Failed to fetch investments');\n } finally {\n setIsLoading(false);\n }\n }, []);\n\n const createInvestment = useCallback(async (params: {\n amount: number; selectedPairs: string[]; cycleDays: number;\n }): Promise<ForexInvestment | null> => {\n setIsLoading(true);\n try {\n const data = await forexApi<{ investment: any }>('/api/forex/investments', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n if (data?.investment) {\n const inv = mapInvestment(data.investment);\n setInvestments(prev => [inv, ...prev]);\n return inv;\n }\n // Local fallback\n const inv = createLocalInvestment(params);\n setInvestments(prev => [inv, ...prev]);\n return inv;\n } catch {\n const inv = createLocalInvestment(params);\n setInvestments(prev => [inv, ...prev]);\n return inv;\n } finally {\n setIsLoading(false);\n }\n }, []);\n\n const redeemInvestment = useCallback(async (investmentId: string): Promise<boolean> => {\n try {\n await forexApi(`/api/forex/investments/${investmentId}/redeem`, { method: 'POST' });\n setInvestments(prev => prev.map(inv =>\n inv.id === investmentId ? { ...inv, status: 'redeemed' as const } : inv\n ));\n return true;\n } catch {\n return false;\n }\n }, []);\n\n useEffect(() => {\n fetchInvestments();\n if (options?.refreshInterval) {\n const timer = setInterval(fetchInvestments, options.refreshInterval);\n return () => clearInterval(timer);\n }\n }, [fetchInvestments, options?.refreshInterval]);\n\n const portfolioSummary = useMemo(() => {\n const active = investments.filter(i => i.status === 'active');\n return {\n totalInvested: active.reduce((s, i) => s + i.amount, 0),\n totalValue: active.reduce((s, i) => s + i.currentValue, 0),\n totalProfit: active.reduce((s, i) => s + i.profit, 0),\n activeCount: active.length,\n };\n }, [investments]);\n\n return { investments, isLoading, error, createInvestment, redeemInvestment, refresh: fetchInvestments, portfolioSummary };\n}\n\n// ── useForexSimulation ───────────────────────────────────────────────────────\n\nexport interface UseForexSimulationResult {\n logs: ForexLogEntry[];\n poolTransactions: ForexPoolTransaction[];\n isRunning: boolean;\n stats: { totalPnl: number; totalTrades: number; totalPips: number; totalLots: number };\n start: () => void;\n stop: () => void;\n clearLogs: () => void;\n}\n\nexport function useForexSimulation(options?: { maxLogs?: number }): UseForexSimulationResult {\n const maxLogs = options?.maxLogs ?? 500;\n const [logs, setLogs] = useState<ForexLogEntry[]>([]);\n const [poolTxs, setPoolTxs] = useState<ForexPoolTransaction[]>([]);\n const [isRunning, setIsRunning] = useState(false);\n const [stats, setStats] = useState({ totalPnl: 0, totalTrades: 0, totalPips: 0, totalLots: 0 });\n const engineRef = useRef<any>(null);\n\n const getEngine = useCallback(() => {\n if (!engineRef.current) {\n try {\n const { forexSimulationEngine } = require('../services/forex/ForexSimulationEngine');\n engineRef.current = forexSimulationEngine;\n } catch { /* not available */ }\n }\n return engineRef.current;\n }, []);\n\n const start = useCallback(() => {\n const engine = getEngine();\n if (!engine) return;\n if (!engine.isRunning()) engine.start();\n setIsRunning(true);\n }, [getEngine]);\n\n const stop = useCallback(() => {\n const engine = getEngine();\n if (engine) engine.stop();\n setIsRunning(false);\n }, [getEngine]);\n\n const clearLogs = useCallback(() => {\n setLogs([]);\n setPoolTxs([]);\n }, []);\n\n useEffect(() => {\n const engine = getEngine();\n if (!engine) return;\n\n const unsubLog = engine.onLog((entry: ForexLogEntry) => {\n setLogs(prev => {\n const next = [...prev, entry];\n return next.length > maxLogs ? next.slice(-maxLogs) : next;\n });\n const s = engine.getStats();\n setStats({ totalPnl: s.totalPnl, totalTrades: s.totalTrades, totalPips: s.totalPips, totalLots: s.totalLots });\n });\n\n const unsubTx = engine.onPoolTransaction((tx: ForexPoolTransaction) => {\n setPoolTxs(prev => [...prev.slice(-999), tx]);\n });\n\n return () => {\n unsubLog();\n unsubTx();\n };\n }, [getEngine, maxLogs]);\n\n return { logs, poolTransactions: poolTxs, isRunning, stats, start, stop, clearLogs };\n}\n\n// ── useForexPoolData ─────────────────────────────────────────────────────────\n\nexport interface UseForexPoolDataResult {\n snapshots: Record<ForexPoolType, ForexPoolDailySnapshot[]>;\n transactions: ForexPoolTransaction[];\n isInitialized: boolean;\n initialize: () => void;\n}\n\nexport function useForexPoolData(): UseForexPoolDataResult {\n const [snapshots, setSnapshots] = useState<Record<ForexPoolType, ForexPoolDailySnapshot[]>>({ clearing: [], hedging: [], insurance: [] });\n const [transactions, setTransactions] = useState<ForexPoolTransaction[]>([]);\n const [isInitialized, setIsInitialized] = useState(false);\n\n const initialize = useCallback(() => {\n if (isInitialized) return;\n try {\n const { ForexPoolDataGenerator } = require('../services/forex/ForexPoolDataGenerator');\n const gen = ForexPoolDataGenerator.getInstance();\n setSnapshots(gen.generateAllSnapshots());\n setTransactions(gen.generateAllTransactions());\n setIsInitialized(true);\n } catch { /* not available */ }\n }, [isInitialized]);\n\n return { snapshots, transactions, isInitialized, initialize };\n}\n\n// ── Combined useForexTrading ─────────────────────────────────────────────────\n\nexport interface UseForexTradingResult {\n pools: UseForexPoolsResult;\n investments: UseForexInvestmentsResult;\n simulation: UseForexSimulationResult;\n poolData: UseForexPoolDataResult;\n // Convenience re-exports\n capitalSplit: typeof FOREX_CAPITAL_SPLIT;\n agent: typeof FOREX_AGENT;\n currencyPairs: typeof import('../types/forex').FOREX_CURRENCY_PAIRS;\n cycleOptions: typeof import('../types/forex').FOREX_CYCLE_OPTIONS;\n computePoolAllocations: typeof computePoolAllocations;\n estimateProfit: typeof estimateForexProfit;\n}\n\nexport function useForexTrading(options?: {\n poolRefreshInterval?: number;\n investmentRefreshInterval?: number;\n}): UseForexTradingResult {\n const pools = useForexPools({ refreshInterval: options?.poolRefreshInterval });\n const investments = useForexInvestments({ refreshInterval: options?.investmentRefreshInterval });\n const simulation = useForexSimulation();\n const poolData = useForexPoolData();\n\n return {\n pools,\n investments,\n simulation,\n poolData,\n capitalSplit: FOREX_CAPITAL_SPLIT,\n agent: FOREX_AGENT,\n currencyPairs: require('../types/forex').FOREX_CURRENCY_PAIRS,\n cycleOptions: require('../types/forex').FOREX_CYCLE_OPTIONS,\n computePoolAllocations,\n estimateProfit: estimateForexProfit,\n };\n}\n\n// ── Internal Helpers ─────────────────────────────────────────────────────────\n\nfunction mapInvestment(raw: any): ForexInvestment {\n const cycleDays = raw.cycleDays ?? raw.cycle_days ?? 90;\n const cycleOption = FOREX_CYCLE_OPTIONS.find(c => c.days === cycleDays) || FOREX_CYCLE_OPTIONS[2];\n const amount = typeof raw.amount === 'string' ? parseFloat(raw.amount) : (raw.amount ?? 0);\n const allocs = computePoolAllocations(amount);\n\n return {\n id: raw.id,\n userId: raw.userId ?? raw.user_id,\n amount,\n currentValue: raw.currentValue ?? raw.current_value ?? amount,\n profit: raw.profit ?? 0,\n status: raw.status ?? 'active',\n selectedPairs: raw.selectedPairs ?? raw.selected_pairs ?? [],\n cycleDays,\n cycleOption,\n feeRate: raw.feeRate ?? cycleOption.feeRate,\n commissionRate: raw.commissionRate ?? cycleOption.commissionRate,\n startDate: raw.startDate ?? raw.start_date ?? new Date().toISOString(),\n endDate: raw.endDate ?? raw.end_date ?? '',\n tradingCapital: raw.tradingCapital ?? allocs.tradingCapital,\n totalPoolReserves: raw.totalPoolReserves ?? allocs.totalPoolReserves,\n poolAllocations: raw.poolAllocations ?? {\n clearing: allocs.clearing,\n hedging: allocs.hedging,\n insurance: allocs.insurance,\n },\n tradeWeight: raw.tradeWeight ?? 0,\n totalLots: raw.totalLots ?? 0,\n totalPips: raw.totalPips ?? 0,\n totalTrades: raw.totalTrades ?? 0,\n positions: raw.positions ?? [],\n tradeHistory: raw.tradeHistory ?? [],\n redeemedAt: raw.redeemedAt,\n createdAt: raw.createdAt,\n updatedAt: raw.updatedAt,\n };\n}\n\nfunction createLocalInvestment(params: { amount: number; selectedPairs: string[]; cycleDays: number }): ForexInvestment {\n const { amount, selectedPairs, cycleDays } = params;\n const cycleOption = FOREX_CYCLE_OPTIONS.find(c => c.days === cycleDays) || FOREX_CYCLE_OPTIONS[2];\n const allocs = computePoolAllocations(amount);\n const now = new Date();\n const endDate = new Date(now);\n endDate.setDate(endDate.getDate() + cycleDays);\n\n return {\n id: `fx_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`,\n amount,\n currentValue: amount,\n profit: 0,\n status: 'active',\n selectedPairs,\n cycleDays,\n cycleOption,\n startDate: now.toISOString(),\n endDate: endDate.toISOString(),\n tradingCapital: allocs.tradingCapital,\n totalPoolReserves: allocs.totalPoolReserves,\n poolAllocations: { clearing: allocs.clearing, hedging: allocs.hedging, insurance: allocs.insurance },\n tradeWeight: 0,\n totalLots: 0,\n totalPips: 0,\n totalTrades: 0,\n positions: [],\n tradeHistory: [],\n };\n}\n","/**\n * ONE SDK - Bot Simulation Hook\n * Provides React hook for subscribing to BotSimulationEngine events\n */\n\nimport { useState, useEffect, useCallback, useRef, useMemo } from 'react';\nimport type { BotLogEntry, BotState, StrategyPersonality } from '../services/forex/BotSimulationEngine';\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\nexport interface UseBotSimulationOptions {\n maxLogs?: number;\n strategyIds?: string[];\n userPairs?: string[];\n userChains?: string[];\n autoStart?: boolean;\n}\n\nexport interface UseBotSimulationResult {\n /** All log entries from all strategies */\n logs: BotLogEntry[];\n /** Logs grouped by strategy ID */\n logsByStrategy: Map<string, BotLogEntry[]>;\n /** Current state for each strategy */\n botStates: Map<string, BotState>;\n /** Whether simulation is currently running */\n isRunning: boolean;\n /** Available strategies */\n strategies: StrategyPersonality[];\n /** Start the simulation */\n start: (strategyIds?: string[], userPairs?: string[], userChains?: string[]) => void;\n /** Stop the simulation */\n stop: (strategyIds?: string[]) => void;\n /** Clear all logs */\n clearLogs: () => void;\n /** Emit boot sequence messages */\n emitBootSequence: () => void;\n /** Get state for a specific strategy */\n getBotState: (strategyId: string) => BotState | undefined;\n}\n\n// ── Hook Implementation ───────────────────────────────────────────────────────\n\nexport function useBotSimulation(options?: UseBotSimulationOptions): UseBotSimulationResult {\n const maxLogs = options?.maxLogs ?? 500;\n const [logs, setLogs] = useState<BotLogEntry[]>([]);\n const [isRunning, setIsRunning] = useState(false);\n const [strategies, setStrategies] = useState<StrategyPersonality[]>([]);\n const [botStatesMap, setBotStatesMap] = useState<Map<string, BotState>>(new Map());\n const engineRef = useRef<any>(null);\n const unsubRef = useRef<(() => void) | null>(null);\n\n // Lazy load the engine\n const getEngine = useCallback(() => {\n if (!engineRef.current) {\n try {\n const { botSimulationEngine } = require('../services/forex/BotSimulationEngine');\n engineRef.current = botSimulationEngine;\n setStrategies(botSimulationEngine.getStrategies());\n } catch {\n // Engine not available\n }\n }\n return engineRef.current;\n }, []);\n\n // Group logs by strategy\n const logsByStrategy = useMemo(() => {\n const grouped = new Map<string, BotLogEntry[]>();\n for (const log of logs) {\n const existing = grouped.get(log.strategyId) || [];\n grouped.set(log.strategyId, [...existing, log]);\n }\n return grouped;\n }, [logs]);\n\n // Start simulation\n const start = useCallback((\n strategyIds?: string[],\n userPairs?: string[],\n userChains?: string[]\n ) => {\n const engine = getEngine();\n if (!engine) return;\n\n const ids = strategyIds || options?.strategyIds;\n const pairs = userPairs || options?.userPairs;\n const chains = userChains || options?.userChains;\n\n if (!engine.isRunning()) {\n engine.start(ids, pairs, chains);\n }\n setIsRunning(true);\n }, [getEngine, options?.strategyIds, options?.userPairs, options?.userChains]);\n\n // Stop simulation\n const stop = useCallback((strategyIds?: string[]) => {\n const engine = getEngine();\n if (engine) {\n engine.stop(strategyIds);\n if (!strategyIds) {\n setIsRunning(false);\n }\n }\n }, [getEngine]);\n\n // Clear logs\n const clearLogs = useCallback(() => {\n setLogs([]);\n }, []);\n\n // Emit boot sequence\n const emitBootSequence = useCallback(() => {\n const engine = getEngine();\n if (engine) {\n engine.emitBootSequence();\n }\n }, [getEngine]);\n\n // Get state for specific strategy\n const getBotState = useCallback((strategyId: string): BotState | undefined => {\n return botStatesMap.get(strategyId);\n }, [botStatesMap]);\n\n // Subscribe to engine events\n useEffect(() => {\n const engine = getEngine();\n if (!engine) return;\n\n // Check if already running\n setIsRunning(engine.isRunning());\n\n // Subscribe to log events\n unsubRef.current = engine.onLog((entry: BotLogEntry) => {\n setLogs(prev => {\n const next = [...prev, entry];\n return next.length > maxLogs ? next.slice(-maxLogs) : next;\n });\n\n // Update bot states\n const state = engine.getBotState(entry.strategyId);\n if (state) {\n setBotStatesMap(prev => {\n const next = new Map(prev);\n next.set(entry.strategyId, state);\n return next;\n });\n }\n });\n\n return () => {\n if (unsubRef.current) {\n unsubRef.current();\n unsubRef.current = null;\n }\n };\n }, [getEngine, maxLogs]);\n\n // Auto-start if configured\n useEffect(() => {\n if (options?.autoStart) {\n const engine = getEngine();\n if (engine && !engine.isRunning()) {\n emitBootSequence();\n setTimeout(() => {\n start();\n }, 5500); // After boot sequence completes\n }\n }\n }, [options?.autoStart, getEngine, emitBootSequence, start]);\n\n // Periodically update bot states\n useEffect(() => {\n if (!isRunning) return;\n\n const interval = setInterval(() => {\n const engine = getEngine();\n if (engine) {\n const states = engine.getAllBotStates();\n if (states.size > 0) {\n setBotStatesMap(new Map(states));\n }\n }\n }, 1000);\n\n return () => clearInterval(interval);\n }, [isRunning, getEngine]);\n\n return {\n logs,\n logsByStrategy,\n botStates: botStatesMap,\n isRunning,\n strategies,\n start,\n stop,\n clearLogs,\n emitBootSequence,\n getBotState,\n };\n}\n","/**\n * ONE SDK - AI Positions Hook\n * Provides React hook for fetching and tracking AI trading positions\n */\n\nimport { useState, useEffect, useCallback, useMemo } from 'react';\nimport type { AIPosition, PositionStatus } from '../types/console';\n\n// ── Configuration ─────────────────────────────────────────────────────────────\n\nlet _consoleAccessToken: string | null = null;\nlet _consoleEngineUrl: string = 'https://api.one23.io';\n\nexport function setConsoleAccessToken(token: string): void {\n _consoleAccessToken = token;\n}\n\nexport function clearConsoleAccessToken(): void {\n _consoleAccessToken = null;\n}\n\nexport function setConsoleEngineUrl(url: string): void {\n _consoleEngineUrl = url;\n}\n\n// ── Internal API Helper ───────────────────────────────────────────────────────\n\nasync function consoleApi<T>(path: string, options?: RequestInit): Promise<T | null> {\n try {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n if (_consoleAccessToken) {\n headers['Authorization'] = `Bearer ${_consoleAccessToken}`;\n }\n const res = await fetch(`${_consoleEngineUrl}${path}`, { ...options, headers });\n if (!res.ok) return null;\n const json = await res.json();\n return json?.data ?? json;\n } catch {\n return null;\n }\n}\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\nexport interface UseAIPositionsOptions {\n strategyId?: string;\n strategyIds?: string[];\n status?: PositionStatus | PositionStatus[];\n pollInterval?: number;\n simulation?: boolean;\n}\n\nexport interface UseAIPositionsResult {\n positions: AIPosition[];\n openPositions: AIPosition[];\n closedPositions: AIPosition[];\n isLoading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n // Position actions\n closePosition: (positionId: string) => Promise<boolean>;\n updateStopLoss: (positionId: string, stopLoss: number) => Promise<boolean>;\n updateTakeProfit: (positionId: string, takeProfit: number) => Promise<boolean>;\n // Computed values\n summary: {\n totalPositions: number;\n openCount: number;\n totalExposure: number;\n totalPnl: number;\n unrealizedPnl: number;\n avgLeverage: number;\n byStrategy: Record<string, { count: number; pnl: number; exposure: number }>;\n };\n}\n\n// ── Simulation Data Generator ─────────────────────────────────────────────────\n\nfunction generateSimulatedPositions(strategyIds?: string[]): AIPosition[] {\n const strategies = [\n { id: 'balanced-01', name: 'Balanced Alpha', shortName: 'BAL' },\n { id: 'conservative-01', name: 'Conservative Shield', shortName: 'CON' },\n { id: 'aggressive-01', name: 'Aggressive Momentum', shortName: 'AGG' },\n ];\n\n const pairs = ['BTC/USDT', 'ETH/USDT', 'SOL/USDT', 'ARB/USDT', 'AVAX/USDT'];\n const basePrices: Record<string, number> = {\n 'BTC/USDT': 67500,\n 'ETH/USDT': 3450,\n 'SOL/USDT': 178,\n 'ARB/USDT': 1.18,\n 'AVAX/USDT': 38.5,\n };\n\n const positions: AIPosition[] = [];\n const filteredStrategies = strategyIds\n ? strategies.filter(s => strategyIds.includes(s.id))\n : strategies;\n\n for (const strategy of filteredStrategies) {\n // Generate 0-3 positions per strategy\n const numPositions = Math.floor(Math.random() * 4);\n for (let i = 0; i < numPositions; i++) {\n const pair = pairs[Math.floor(Math.random() * pairs.length)];\n const basePrice = basePrices[pair];\n const side = Math.random() > 0.5 ? 'LONG' : 'SHORT';\n const entryPrice = basePrice * (1 + (Math.random() - 0.5) * 0.02);\n const currentPrice = basePrice * (1 + (Math.random() - 0.5) * 0.03);\n const leverage = Math.floor(Math.random() * 10) + 2;\n const size = Math.floor(Math.random() * 1000) + 100;\n const margin = size / leverage;\n\n const priceDiff = side === 'LONG'\n ? (currentPrice - entryPrice) / entryPrice\n : (entryPrice - currentPrice) / entryPrice;\n const pnlPercent = priceDiff * leverage * 100;\n const pnl = size * priceDiff * leverage;\n\n positions.push({\n id: `pos_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`,\n strategyId: strategy.id,\n strategyName: strategy.name,\n pair,\n side,\n entryPrice,\n currentPrice,\n size,\n leverage,\n margin,\n pnl,\n pnlPercent,\n status: 'open',\n stopLoss: entryPrice * (side === 'LONG' ? 0.95 : 1.05),\n takeProfit: entryPrice * (side === 'LONG' ? 1.1 : 0.9),\n liquidationPrice: entryPrice * (side === 'LONG' ? (1 - 1 / leverage) : (1 + 1 / leverage)),\n openTime: Date.now() - Math.floor(Math.random() * 86400000),\n chain: ['ethereum', 'arbitrum', 'base'][Math.floor(Math.random() * 3)],\n aiConfidence: Math.random() * 0.4 + 0.5,\n aiReasoning: `${side === 'LONG' ? 'Bullish' : 'Bearish'} momentum detected on ${pair}`,\n });\n }\n }\n\n return positions;\n}\n\n// ── Hook Implementation ───────────────────────────────────────────────────────\n\nexport function useAIPositions(options?: UseAIPositionsOptions): UseAIPositionsResult {\n const [positions, setPositions] = useState<AIPosition[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const fetchPositions = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n\n try {\n if (options?.simulation) {\n // Use simulated data\n const simulated = generateSimulatedPositions(options?.strategyIds);\n setPositions(simulated);\n } else {\n // Fetch from API\n let path = '/api/v1/ai-quant/positions';\n const params = new URLSearchParams();\n if (options?.strategyId) {\n params.append('strategyId', options.strategyId);\n }\n if (options?.strategyIds?.length) {\n params.append('strategyIds', options.strategyIds.join(','));\n }\n if (options?.status) {\n const statuses = Array.isArray(options.status) ? options.status : [options.status];\n params.append('status', statuses.join(','));\n }\n if (params.toString()) {\n path += `?${params.toString()}`;\n }\n\n const data = await consoleApi<{ positions: any[] }>(path);\n if (data?.positions) {\n setPositions(data.positions.map(mapPosition));\n }\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to fetch positions');\n } finally {\n setIsLoading(false);\n }\n }, [options?.simulation, options?.strategyId, options?.strategyIds, options?.status]);\n\n // Close position\n const closePosition = useCallback(async (positionId: string): Promise<boolean> => {\n try {\n if (options?.simulation) {\n setPositions(prev => prev.map(p =>\n p.id === positionId ? { ...p, status: 'closed' as const, closeTime: Date.now() } : p\n ));\n return true;\n }\n await consoleApi(`/api/v1/ai-quant/positions/${positionId}/close`, { method: 'POST' });\n setPositions(prev => prev.map(p =>\n p.id === positionId ? { ...p, status: 'closed' as const, closeTime: Date.now() } : p\n ));\n return true;\n } catch {\n return false;\n }\n }, [options?.simulation]);\n\n // Update stop loss\n const updateStopLoss = useCallback(async (positionId: string, stopLoss: number): Promise<boolean> => {\n try {\n if (options?.simulation) {\n setPositions(prev => prev.map(p =>\n p.id === positionId ? { ...p, stopLoss } : p\n ));\n return true;\n }\n await consoleApi(`/api/v1/ai-quant/positions/${positionId}`, {\n method: 'PATCH',\n body: JSON.stringify({ stopLoss }),\n });\n setPositions(prev => prev.map(p =>\n p.id === positionId ? { ...p, stopLoss } : p\n ));\n return true;\n } catch {\n return false;\n }\n }, [options?.simulation]);\n\n // Update take profit\n const updateTakeProfit = useCallback(async (positionId: string, takeProfit: number): Promise<boolean> => {\n try {\n if (options?.simulation) {\n setPositions(prev => prev.map(p =>\n p.id === positionId ? { ...p, takeProfit } : p\n ));\n return true;\n }\n await consoleApi(`/api/v1/ai-quant/positions/${positionId}`, {\n method: 'PATCH',\n body: JSON.stringify({ takeProfit }),\n });\n setPositions(prev => prev.map(p =>\n p.id === positionId ? { ...p, takeProfit } : p\n ));\n return true;\n } catch {\n return false;\n }\n }, [options?.simulation]);\n\n // Initial fetch and polling\n useEffect(() => {\n fetchPositions();\n if (options?.pollInterval) {\n const timer = setInterval(fetchPositions, options.pollInterval);\n return () => clearInterval(timer);\n }\n }, [fetchPositions, options?.pollInterval]);\n\n // Computed values\n const openPositions = useMemo(() =>\n positions.filter(p => p.status === 'open'),\n [positions]\n );\n\n const closedPositions = useMemo(() =>\n positions.filter(p => p.status === 'closed'),\n [positions]\n );\n\n const summary = useMemo(() => {\n const open = positions.filter(p => p.status === 'open');\n const byStrategy: Record<string, { count: number; pnl: number; exposure: number }> = {};\n\n for (const pos of open) {\n if (!byStrategy[pos.strategyId]) {\n byStrategy[pos.strategyId] = { count: 0, pnl: 0, exposure: 0 };\n }\n byStrategy[pos.strategyId].count++;\n byStrategy[pos.strategyId].pnl += pos.pnl;\n byStrategy[pos.strategyId].exposure += pos.size;\n }\n\n const totalExposure = open.reduce((sum, p) => sum + p.size, 0);\n const totalPnl = positions.reduce((sum, p) => sum + p.pnl, 0);\n const unrealizedPnl = open.reduce((sum, p) => sum + p.pnl, 0);\n const avgLeverage = open.length > 0\n ? open.reduce((sum, p) => sum + p.leverage, 0) / open.length\n : 0;\n\n return {\n totalPositions: positions.length,\n openCount: open.length,\n totalExposure,\n totalPnl,\n unrealizedPnl,\n avgLeverage,\n byStrategy,\n };\n }, [positions]);\n\n return {\n positions,\n openPositions,\n closedPositions,\n isLoading,\n error,\n refresh: fetchPositions,\n closePosition,\n updateStopLoss,\n updateTakeProfit,\n summary,\n };\n}\n\n// ── Helper Functions ──────────────────────────────────────────────────────────\n\nfunction mapPosition(raw: any): AIPosition {\n return {\n id: raw.id,\n strategyId: raw.strategyId ?? raw.strategy_id,\n strategyName: raw.strategyName ?? raw.strategy_name ?? '',\n pair: raw.pair,\n side: raw.side,\n entryPrice: raw.entryPrice ?? raw.entry_price ?? 0,\n currentPrice: raw.currentPrice ?? raw.current_price ?? 0,\n size: raw.size ?? 0,\n leverage: raw.leverage ?? 1,\n margin: raw.margin ?? raw.size / (raw.leverage ?? 1),\n pnl: raw.pnl ?? 0,\n pnlPercent: raw.pnlPercent ?? raw.pnl_percent ?? 0,\n status: raw.status ?? 'open',\n stopLoss: raw.stopLoss ?? raw.stop_loss,\n takeProfit: raw.takeProfit ?? raw.take_profit,\n liquidationPrice: raw.liquidationPrice ?? raw.liquidation_price,\n openTime: raw.openTime ?? raw.open_time ?? Date.now(),\n closeTime: raw.closeTime ?? raw.close_time,\n chain: raw.chain,\n orderId: raw.orderId ?? raw.order_id,\n aiConfidence: raw.aiConfidence ?? raw.ai_confidence,\n aiReasoning: raw.aiReasoning ?? raw.ai_reasoning,\n };\n}\n","/**\n * ONE SDK - AI Decisions Hook\n * Provides React hook for fetching AI trading decision history with reasoning\n */\n\nimport { useState, useEffect, useCallback, useMemo } from 'react';\nimport type { AIDecision, DecisionAction } from '../types/console';\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\nexport interface UseAIDecisionsOptions {\n strategyId?: string;\n strategyIds?: string[];\n actions?: DecisionAction[];\n limit?: number;\n pollInterval?: number;\n simulation?: boolean;\n}\n\nexport interface UseAIDecisionsResult {\n decisions: AIDecision[];\n recentDecisions: AIDecision[];\n executedDecisions: AIDecision[];\n isLoading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n // Filters\n getByStrategy: (strategyId: string) => AIDecision[];\n getByAction: (action: DecisionAction) => AIDecision[];\n // Stats\n stats: {\n totalDecisions: number;\n executedCount: number;\n executionRate: number;\n byAction: Record<DecisionAction, number>;\n byStrategy: Record<string, number>;\n avgConfidence: number;\n };\n}\n\n// ── Simulation Data Generator ─────────────────────────────────────────────────\n\nfunction generateSimulatedDecisions(\n strategyIds?: string[],\n limit: number = 50\n): AIDecision[] {\n const strategies = [\n { id: 'balanced-01', name: 'Balanced Alpha' },\n { id: 'conservative-01', name: 'Conservative Shield' },\n { id: 'aggressive-01', name: 'Aggressive Momentum' },\n ];\n\n const pairs = ['BTC/USDT', 'ETH/USDT', 'SOL/USDT', 'ARB/USDT', 'AVAX/USDT'];\n const actions: DecisionAction[] = ['OPEN_LONG', 'OPEN_SHORT', 'CLOSE_LONG', 'CLOSE_SHORT', 'HOLD', 'SKIP'];\n\n const reasonings = {\n OPEN_LONG: [\n 'RSI oversold with MACD bullish crossover',\n 'Golden cross detected on EMA, volume confirming',\n 'Support level held, momentum building',\n 'Bullish divergence on RSI, trend reversal likely',\n ],\n OPEN_SHORT: [\n 'RSI overbought with MACD bearish crossover',\n 'Death cross on EMA, volume increasing',\n 'Resistance level rejected, bearish pressure',\n 'Bearish divergence detected, reversal expected',\n ],\n CLOSE_LONG: [\n 'Take profit target reached',\n 'Momentum weakening, securing profits',\n 'Risk management triggered',\n ],\n CLOSE_SHORT: [\n 'Take profit target reached',\n 'Bearish momentum exhausted',\n 'Stop loss proximity warning',\n ],\n HOLD: [\n 'No clear signal, waiting for confirmation',\n 'Consolidation phase, insufficient momentum',\n 'Mixed indicators, patience advised',\n ],\n SKIP: [\n 'Confidence below threshold',\n 'Risk parameters exceeded',\n 'Position limit reached',\n ],\n };\n\n const filteredStrategies = strategyIds\n ? strategies.filter(s => strategyIds.includes(s.id))\n : strategies;\n\n const decisions: AIDecision[] = [];\n const now = Date.now();\n\n for (let i = 0; i < limit; i++) {\n const strategy = filteredStrategies[Math.floor(Math.random() * filteredStrategies.length)];\n const pair = pairs[Math.floor(Math.random() * pairs.length)];\n const action = actions[Math.floor(Math.random() * actions.length)];\n const confidence = Math.random() * 0.5 + 0.3;\n const executed = action !== 'HOLD' && action !== 'SKIP' && confidence > 0.5;\n const reasoningList = reasonings[action];\n\n decisions.push({\n id: `dec_${now - i * 60000}_${Math.random().toString(36).slice(2, 8)}`,\n timestamp: now - i * (Math.random() * 300000 + 60000),\n strategyId: strategy.id,\n strategyName: strategy.name,\n pair,\n action,\n confidence,\n reasoning: reasoningList[Math.floor(Math.random() * reasoningList.length)],\n indicators: {\n rsi: Math.random() * 100,\n macd: (Math.random() - 0.5) * 2,\n ema: Math.random() > 0.5 ? 'bullish' : 'bearish',\n volume: Math.random() * 2 + 0.5,\n bollinger: Math.random() > 0.5 ? 'upper' : 'lower',\n },\n signals: [\n `RSI ${Math.random() > 0.5 ? 'oversold' : 'overbought'}`,\n `MACD ${Math.random() > 0.5 ? 'bullish' : 'bearish'}`,\n ],\n executed,\n positionId: executed ? `pos_${Date.now()}_${Math.random().toString(36).slice(2, 6)}` : undefined,\n price: 50000 * (1 + (Math.random() - 0.5) * 0.1),\n size: executed ? Math.floor(Math.random() * 1000) + 100 : undefined,\n leverage: executed ? Math.floor(Math.random() * 10) + 2 : undefined,\n });\n }\n\n return decisions.sort((a, b) => b.timestamp - a.timestamp);\n}\n\n// ── Hook Implementation ───────────────────────────────────────────────────────\n\nexport function useAIDecisions(options?: UseAIDecisionsOptions): UseAIDecisionsResult {\n const limit = options?.limit ?? 100;\n const [decisions, setDecisions] = useState<AIDecision[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const fetchDecisions = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n\n try {\n if (options?.simulation) {\n const simulated = generateSimulatedDecisions(options?.strategyIds, limit);\n setDecisions(simulated);\n } else {\n let path = '/api/v1/ai-quant/decisions';\n const params = new URLSearchParams();\n if (options?.strategyId) {\n params.append('strategyId', options.strategyId);\n }\n if (options?.strategyIds?.length) {\n params.append('strategyIds', options.strategyIds.join(','));\n }\n if (options?.actions?.length) {\n params.append('actions', options.actions.join(','));\n }\n params.append('limit', limit.toString());\n if (params.toString()) {\n path += `?${params.toString()}`;\n }\n\n const res = await fetch(`https://api.one23.io${path}`);\n if (res.ok) {\n const data = await res.json();\n if (data?.decisions) {\n setDecisions(data.decisions.map(mapDecision));\n }\n }\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to fetch decisions');\n } finally {\n setIsLoading(false);\n }\n }, [options?.simulation, options?.strategyId, options?.strategyIds, options?.actions, limit]);\n\n // Initial fetch and polling\n useEffect(() => {\n fetchDecisions();\n if (options?.pollInterval) {\n const timer = setInterval(fetchDecisions, options.pollInterval);\n return () => clearInterval(timer);\n }\n }, [fetchDecisions, options?.pollInterval]);\n\n // Filter functions\n const getByStrategy = useCallback((strategyId: string) =>\n decisions.filter(d => d.strategyId === strategyId),\n [decisions]\n );\n\n const getByAction = useCallback((action: DecisionAction) =>\n decisions.filter(d => d.action === action),\n [decisions]\n );\n\n // Computed values\n const recentDecisions = useMemo(() =>\n decisions.slice(0, 10),\n [decisions]\n );\n\n const executedDecisions = useMemo(() =>\n decisions.filter(d => d.executed),\n [decisions]\n );\n\n const stats = useMemo(() => {\n const executed = decisions.filter(d => d.executed);\n const byAction: Record<DecisionAction, number> = {\n OPEN_LONG: 0,\n OPEN_SHORT: 0,\n CLOSE_LONG: 0,\n CLOSE_SHORT: 0,\n HOLD: 0,\n SKIP: 0,\n };\n const byStrategy: Record<string, number> = {};\n\n for (const d of decisions) {\n byAction[d.action]++;\n byStrategy[d.strategyId] = (byStrategy[d.strategyId] || 0) + 1;\n }\n\n const avgConfidence = decisions.length > 0\n ? decisions.reduce((sum, d) => sum + d.confidence, 0) / decisions.length\n : 0;\n\n return {\n totalDecisions: decisions.length,\n executedCount: executed.length,\n executionRate: decisions.length > 0 ? executed.length / decisions.length : 0,\n byAction,\n byStrategy,\n avgConfidence,\n };\n }, [decisions]);\n\n return {\n decisions,\n recentDecisions,\n executedDecisions,\n isLoading,\n error,\n refresh: fetchDecisions,\n getByStrategy,\n getByAction,\n stats,\n };\n}\n\n// ── Helper Functions ──────────────────────────────────────────────────────────\n\nfunction mapDecision(raw: any): AIDecision {\n return {\n id: raw.id,\n timestamp: raw.timestamp ?? Date.now(),\n strategyId: raw.strategyId ?? raw.strategy_id,\n strategyName: raw.strategyName ?? raw.strategy_name ?? '',\n pair: raw.pair,\n action: raw.action,\n confidence: raw.confidence ?? 0,\n reasoning: raw.reasoning ?? '',\n indicators: raw.indicators ?? {},\n signals: raw.signals ?? [],\n executed: raw.executed ?? false,\n positionId: raw.positionId ?? raw.position_id,\n price: raw.price,\n size: raw.size,\n leverage: raw.leverage,\n };\n}\n","// ══════════════════════════════════════════════════════════════════════════════\n// ONE SDK - Trading Console Types & Constants\n// Shared types for real-time trading console components\n// ══════════════════════════════════════════════════════════════════════════════\n\nimport type { BotLogEntry, BotState, StrategyPersonality } from '../services/forex/BotSimulationEngine';\nimport type { ForexLogEntry, ForexPoolTransaction, ForexLogType } from './forex';\n\n// ── Re-exports for convenience ────────────────────────────────────────────────\n\nexport type { BotLogEntry, BotLogType, BotState, IndicatorSnapshot, StrategyPersonality } from '../services/forex/BotSimulationEngine';\n\n// ── Console Log Types ─────────────────────────────────────────────────────────\n\nexport type AILogType =\n | 'SCAN' | 'THINKING' | 'INDICATOR' | 'ANALYSIS' | 'SIGNAL'\n | 'STRATEGY' | 'DECISION' | 'ORDER' | 'FILLED' | 'PNL'\n | 'RISK' | 'NEWS' | 'SYSTEM';\n\nexport const AI_LOG_COLORS: Record<AILogType, string> = {\n SCAN: '#06B6D4', // Cyan\n THINKING: '#A855F7', // Purple\n INDICATOR: '#3B82F6', // Blue\n ANALYSIS: '#6366F1', // Indigo\n SIGNAL: '#F59E0B', // Amber\n STRATEGY: '#D946EF', // Fuchsia\n DECISION: '#F97316', // Orange\n ORDER: '#EC4899', // Pink\n FILLED: '#10B981', // Green\n PNL: '#22C55E', // Emerald\n RISK: '#EF4444', // Red\n NEWS: '#14B8A6', // Teal\n SYSTEM: '#9CA3AF', // Gray\n};\n\n// Forex log type colors (for ForexSimulationEngine logs)\nexport const FOREX_LOG_COLORS: Record<ForexLogType, string> = {\n RFQ: '#06B6D4', // Cyan\n QUOTE: '#8B5CF6', // Purple\n MATCH: '#10B981', // Green\n SETTLE: '#F59E0B', // Amber\n PVP: '#3B82F6', // Blue\n HEDGE: '#EC4899', // Pink\n CLEAR: '#14B8A6', // Teal\n POSITION: '#6366F1', // Indigo\n PNL: '#22C55E', // Emerald\n SYSTEM: '#9CA3AF', // Gray\n};\n\n// ── AI Position Types ─────────────────────────────────────────────────────────\n\nexport type PositionSide = 'LONG' | 'SHORT';\nexport type PositionStatus = 'open' | 'closed' | 'liquidated' | 'pending';\n\nexport interface AIPosition {\n id: string;\n strategyId: string;\n strategyName: string;\n pair: string;\n side: PositionSide;\n entryPrice: number;\n currentPrice: number;\n size: number;\n leverage: number;\n margin: number;\n pnl: number;\n pnlPercent: number;\n status: PositionStatus;\n stopLoss?: number;\n takeProfit?: number;\n liquidationPrice?: number;\n openTime: number;\n closeTime?: number;\n chain?: string;\n orderId?: string;\n aiConfidence?: number;\n aiReasoning?: string;\n}\n\n// ── AI Decision Types ─────────────────────────────────────────────────────────\n\nexport type DecisionAction = 'OPEN_LONG' | 'OPEN_SHORT' | 'CLOSE_LONG' | 'CLOSE_SHORT' | 'HOLD' | 'SKIP';\n\nexport interface AIDecision {\n id: string;\n timestamp: number;\n strategyId: string;\n strategyName: string;\n pair: string;\n action: DecisionAction;\n confidence: number;\n reasoning: string;\n indicators: {\n rsi?: number;\n macd?: number;\n ema?: string;\n volume?: number;\n bollinger?: string;\n };\n signals: string[];\n executed: boolean;\n positionId?: string;\n price?: number;\n size?: number;\n leverage?: number;\n}\n\n// ── Risk Status Types ─────────────────────────────────────────────────────────\n\nexport type RiskLevel = 'low' | 'medium' | 'high' | 'critical';\nexport type TradingStatus = 'active' | 'paused' | 'stopped' | 'cooldown';\n\nexport interface RiskStatus {\n timestamp: number;\n // Portfolio exposure\n totalExposure: number;\n maxExposure: number;\n exposurePercent: number;\n // Daily limits\n dailyPnl: number;\n dailyPnlLimit: number;\n dailyPnlPercent: number;\n dailyTradeCount: number;\n dailyTradeLimit: number;\n // Drawdown\n currentDrawdown: number;\n maxDrawdown: number;\n drawdownPercent: number;\n // Position limits\n openPositions: number;\n maxPositions: number;\n // Risk assessment\n riskLevel: RiskLevel;\n tradingStatus: TradingStatus;\n warnings: string[];\n // Per-strategy risk\n strategyRisks?: Record<string, {\n exposure: number;\n drawdown: number;\n riskLevel: RiskLevel;\n }>;\n}\n\nexport const RISK_LEVEL_COLORS: Record<RiskLevel, { color: string; bgColor: string }> = {\n low: { color: '#10B981', bgColor: '#D1FAE5' },\n medium: { color: '#F59E0B', bgColor: '#FEF3C7' },\n high: { color: '#F97316', bgColor: '#FFEDD5' },\n critical: { color: '#EF4444', bgColor: '#FEE2E2' },\n};\n\nexport const TRADING_STATUS_COLORS: Record<TradingStatus, { color: string; bgColor: string }> = {\n active: { color: '#10B981', bgColor: '#D1FAE5' },\n paused: { color: '#F59E0B', bgColor: '#FEF3C7' },\n stopped: { color: '#EF4444', bgColor: '#FEE2E2' },\n cooldown: { color: '#6366F1', bgColor: '#E0E7FF' },\n};\n\n// ── Console Metrics Types ─────────────────────────────────────────────────────\n\nexport interface ConsoleMetrics {\n // NAV & Performance\n nav: number;\n navChange24h: number;\n navChangePercent24h: number;\n // P&L\n totalPnl: number;\n realizedPnl: number;\n unrealizedPnl: number;\n pnlToday: number;\n pnl7d: number;\n pnl30d: number;\n // Trading stats\n totalTrades: number;\n tradesToday: number;\n winRate: number;\n winCount: number;\n lossCount: number;\n avgWin: number;\n avgLoss: number;\n profitFactor: number;\n // Position stats\n openPositions: number;\n totalExposure: number;\n avgLeverage: number;\n // By strategy\n strategyMetrics?: Record<string, {\n pnl: number;\n trades: number;\n winRate: number;\n exposure: number;\n }>;\n}\n\n// ── Agent Types ───────────────────────────────────────────────────────────────\n\nexport type AgentStatus = 'active' | 'paused' | 'idle' | 'error' | 'initializing';\n\nexport interface AIAgent {\n id: string;\n strategyId: string;\n name: string;\n shortName: string;\n color: string;\n status: AgentStatus;\n // Performance\n totalPnl: number;\n pnlToday: number;\n winRate: number;\n totalTrades: number;\n tradesToday: number;\n // Current state\n currentPair?: string;\n currentPrice?: number;\n lastSignal?: string;\n lastSignalConfidence?: number;\n lastActivity?: number;\n // Positions\n openPositions: number;\n totalExposure: number;\n // Risk\n riskLevel: RiskLevel;\n drawdown: number;\n // Config\n riskTolerance: 'low' | 'medium' | 'high';\n primaryIndicators: string[];\n preferredPairs: string[];\n leverageRange: [number, number];\n}\n\nexport const AGENT_STATUS_COLORS: Record<AgentStatus, { color: string; bgColor: string; label: string }> = {\n active: { color: '#10B981', bgColor: '#D1FAE5', label: 'Active' },\n paused: { color: '#F59E0B', bgColor: '#FEF3C7', label: 'Paused' },\n idle: { color: '#6B7280', bgColor: '#F3F4F6', label: 'Idle' },\n error: { color: '#EF4444', bgColor: '#FEE2E2', label: 'Error' },\n initializing: { color: '#3B82F6', bgColor: '#DBEAFE', label: 'Starting' },\n};\n\n// ── Combined Console State ────────────────────────────────────────────────────\n\nexport interface CombinedLogEntry {\n id: string;\n timestamp: number;\n source: 'ai' | 'forex';\n strategyId?: string;\n strategyName?: string;\n type: string;\n message: string;\n data?: Record<string, any>;\n importance: 'low' | 'medium' | 'high';\n}\n\nexport interface TradingConsoleState {\n ai: {\n strategies: StrategyPersonality[];\n agents: AIAgent[];\n positions: AIPosition[];\n decisions: AIDecision[];\n riskStatus: RiskStatus | null;\n simulationLogs: BotLogEntry[];\n botStates: Map<string, BotState>;\n };\n forex: {\n logs: ForexLogEntry[];\n poolTransactions: ForexPoolTransaction[];\n stats: {\n totalPnl: number;\n totalTrades: number;\n totalPips: number;\n totalLots: number;\n };\n };\n metrics: ConsoleMetrics;\n combinedLogs: CombinedLogEntry[];\n}\n\n// ── Hook Options ──────────────────────────────────────────────────────────────\n\nexport interface TradingConsoleOptions {\n simulation?: boolean;\n pollInterval?: number;\n maxLogs?: number;\n strategyIds?: string[];\n autoStart?: boolean;\n}\n\nexport interface AIQuantConsoleOptions {\n strategyIds?: string[];\n pollInterval?: number;\n simulation?: boolean;\n maxLogs?: number;\n}\n\nexport interface AgentConsoleOptions {\n strategyId: string;\n pollInterval?: number;\n simulation?: boolean;\n maxLogs?: number;\n}\n\n// ── Default Values ────────────────────────────────────────────────────────────\n\nexport const DEFAULT_CONSOLE_OPTIONS: TradingConsoleOptions = {\n simulation: true,\n pollInterval: 5000,\n maxLogs: 500,\n autoStart: false,\n};\n\nexport const DEFAULT_RISK_STATUS: RiskStatus = {\n timestamp: Date.now(),\n totalExposure: 0,\n maxExposure: 100000,\n exposurePercent: 0,\n dailyPnl: 0,\n dailyPnlLimit: 5000,\n dailyPnlPercent: 0,\n dailyTradeCount: 0,\n dailyTradeLimit: 50,\n currentDrawdown: 0,\n maxDrawdown: 15,\n drawdownPercent: 0,\n openPositions: 0,\n maxPositions: 10,\n riskLevel: 'low',\n tradingStatus: 'active',\n warnings: [],\n};\n\nexport const DEFAULT_CONSOLE_METRICS: ConsoleMetrics = {\n nav: 0,\n navChange24h: 0,\n navChangePercent24h: 0,\n totalPnl: 0,\n realizedPnl: 0,\n unrealizedPnl: 0,\n pnlToday: 0,\n pnl7d: 0,\n pnl30d: 0,\n totalTrades: 0,\n tradesToday: 0,\n winRate: 0,\n winCount: 0,\n lossCount: 0,\n avgWin: 0,\n avgLoss: 0,\n profitFactor: 0,\n openPositions: 0,\n totalExposure: 0,\n avgLeverage: 0,\n};\n\n// ── Utility Functions ─────────────────────────────────────────────────────────\n\nexport function calculateRiskLevel(\n exposurePercent: number,\n drawdownPercent: number,\n dailyPnlPercent: number\n): RiskLevel {\n const worstMetric = Math.max(exposurePercent, drawdownPercent, Math.abs(dailyPnlPercent));\n if (worstMetric >= 90) return 'critical';\n if (worstMetric >= 70) return 'high';\n if (worstMetric >= 40) return 'medium';\n return 'low';\n}\n\nexport function formatPnl(pnl: number): string {\n const sign = pnl >= 0 ? '+' : '';\n if (Math.abs(pnl) >= 1000000) {\n return `${sign}$${(pnl / 1000000).toFixed(2)}M`;\n }\n if (Math.abs(pnl) >= 1000) {\n return `${sign}$${(pnl / 1000).toFixed(2)}K`;\n }\n return `${sign}$${pnl.toFixed(2)}`;\n}\n\nexport function formatPercent(value: number, showSign = true): string {\n const sign = showSign && value >= 0 ? '+' : '';\n return `${sign}${value.toFixed(2)}%`;\n}\n","/**\n * ONE SDK - AI Risk Status Hook\n * Provides React hook for monitoring trading risk status and limits\n */\n\nimport { useState, useEffect, useCallback, useMemo } from 'react';\nimport type { RiskStatus, RiskLevel, TradingStatus } from '../types/console';\nimport { DEFAULT_RISK_STATUS, calculateRiskLevel } from '../types/console';\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\nexport interface UseAIRiskStatusOptions {\n strategyId?: string;\n pollInterval?: number;\n simulation?: boolean;\n}\n\nexport interface UseAIRiskStatusResult {\n riskStatus: RiskStatus;\n isLoading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n // Computed values\n isWithinLimits: boolean;\n canTrade: boolean;\n riskLevel: RiskLevel;\n tradingStatus: TradingStatus;\n warnings: string[];\n // Actions\n pauseTrading: () => Promise<boolean>;\n resumeTrading: () => Promise<boolean>;\n resetDailyLimits: () => Promise<boolean>;\n}\n\n// ── Simulation Data Generator ─────────────────────────────────────────────────\n\nfunction generateSimulatedRiskStatus(): RiskStatus {\n const totalExposure = Math.random() * 80000 + 10000;\n const maxExposure = 100000;\n const exposurePercent = (totalExposure / maxExposure) * 100;\n\n const dailyPnl = (Math.random() - 0.3) * 3000;\n const dailyPnlLimit = 5000;\n const dailyPnlPercent = (Math.abs(dailyPnl) / dailyPnlLimit) * 100;\n\n const currentDrawdown = Math.random() * 10;\n const maxDrawdown = 15;\n const drawdownPercent = (currentDrawdown / maxDrawdown) * 100;\n\n const openPositions = Math.floor(Math.random() * 8);\n const maxPositions = 10;\n\n const dailyTradeCount = Math.floor(Math.random() * 30);\n const dailyTradeLimit = 50;\n\n const riskLevel = calculateRiskLevel(exposurePercent, drawdownPercent, dailyPnlPercent);\n\n const warnings: string[] = [];\n if (exposurePercent > 70) warnings.push('High portfolio exposure');\n if (drawdownPercent > 60) warnings.push('Approaching max drawdown');\n if (dailyPnlPercent > 80 && dailyPnl < 0) warnings.push('Daily loss limit warning');\n if (openPositions >= maxPositions - 1) warnings.push('Position limit nearly reached');\n\n let tradingStatus: TradingStatus = 'active';\n if (riskLevel === 'critical') tradingStatus = 'stopped';\n else if (riskLevel === 'high' && warnings.length > 1) tradingStatus = 'paused';\n\n const strategyRisks: Record<string, { exposure: number; drawdown: number; riskLevel: RiskLevel }> = {\n 'balanced-01': {\n exposure: Math.random() * 30000,\n drawdown: Math.random() * 5,\n riskLevel: Math.random() > 0.7 ? 'medium' : 'low',\n },\n 'conservative-01': {\n exposure: Math.random() * 20000,\n drawdown: Math.random() * 3,\n riskLevel: 'low',\n },\n 'aggressive-01': {\n exposure: Math.random() * 40000,\n drawdown: Math.random() * 8,\n riskLevel: Math.random() > 0.5 ? 'high' : 'medium',\n },\n };\n\n return {\n timestamp: Date.now(),\n totalExposure,\n maxExposure,\n exposurePercent,\n dailyPnl,\n dailyPnlLimit,\n dailyPnlPercent,\n dailyTradeCount,\n dailyTradeLimit,\n currentDrawdown,\n maxDrawdown,\n drawdownPercent,\n openPositions,\n maxPositions,\n riskLevel,\n tradingStatus,\n warnings,\n strategyRisks,\n };\n}\n\n// ── Hook Implementation ───────────────────────────────────────────────────────\n\nexport function useAIRiskStatus(options?: UseAIRiskStatusOptions): UseAIRiskStatusResult {\n const [riskStatus, setRiskStatus] = useState<RiskStatus>(DEFAULT_RISK_STATUS);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const fetchRiskStatus = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n\n try {\n if (options?.simulation) {\n const simulated = generateSimulatedRiskStatus();\n setRiskStatus(simulated);\n } else {\n let path = '/api/v1/ai-quant/risk-status';\n if (options?.strategyId) {\n path += `?strategyId=${options.strategyId}`;\n }\n\n const res = await fetch(`https://api.one23.io${path}`);\n if (res.ok) {\n const data = await res.json();\n if (data) {\n setRiskStatus(mapRiskStatus(data));\n }\n }\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to fetch risk status');\n } finally {\n setIsLoading(false);\n }\n }, [options?.simulation, options?.strategyId]);\n\n // Initial fetch and polling\n useEffect(() => {\n fetchRiskStatus();\n if (options?.pollInterval) {\n const timer = setInterval(fetchRiskStatus, options.pollInterval);\n return () => clearInterval(timer);\n }\n }, [fetchRiskStatus, options?.pollInterval]);\n\n // Actions\n const pauseTrading = useCallback(async (): Promise<boolean> => {\n try {\n if (options?.simulation) {\n setRiskStatus(prev => ({ ...prev, tradingStatus: 'paused' }));\n return true;\n }\n const res = await fetch('https://api.one23.io/api/v1/ai-quant/trading/pause', {\n method: 'POST',\n });\n if (res.ok) {\n setRiskStatus(prev => ({ ...prev, tradingStatus: 'paused' }));\n return true;\n }\n return false;\n } catch {\n return false;\n }\n }, [options?.simulation]);\n\n const resumeTrading = useCallback(async (): Promise<boolean> => {\n try {\n if (options?.simulation) {\n setRiskStatus(prev => ({ ...prev, tradingStatus: 'active' }));\n return true;\n }\n const res = await fetch('https://api.one23.io/api/v1/ai-quant/trading/resume', {\n method: 'POST',\n });\n if (res.ok) {\n setRiskStatus(prev => ({ ...prev, tradingStatus: 'active' }));\n return true;\n }\n return false;\n } catch {\n return false;\n }\n }, [options?.simulation]);\n\n const resetDailyLimits = useCallback(async (): Promise<boolean> => {\n try {\n if (options?.simulation) {\n setRiskStatus(prev => ({\n ...prev,\n dailyPnl: 0,\n dailyPnlPercent: 0,\n dailyTradeCount: 0,\n warnings: prev.warnings.filter(w => !w.includes('Daily')),\n }));\n return true;\n }\n const res = await fetch('https://api.one23.io/api/v1/ai-quant/risk/reset-daily', {\n method: 'POST',\n });\n return res.ok;\n } catch {\n return false;\n }\n }, [options?.simulation]);\n\n // Computed values\n const isWithinLimits = useMemo(() => {\n return (\n riskStatus.exposurePercent < 90 &&\n riskStatus.drawdownPercent < 90 &&\n riskStatus.dailyPnlPercent < 90 &&\n riskStatus.openPositions < riskStatus.maxPositions\n );\n }, [riskStatus]);\n\n const canTrade = useMemo(() => {\n return riskStatus.tradingStatus === 'active' && isWithinLimits;\n }, [riskStatus.tradingStatus, isWithinLimits]);\n\n return {\n riskStatus,\n isLoading,\n error,\n refresh: fetchRiskStatus,\n isWithinLimits,\n canTrade,\n riskLevel: riskStatus.riskLevel,\n tradingStatus: riskStatus.tradingStatus,\n warnings: riskStatus.warnings,\n pauseTrading,\n resumeTrading,\n resetDailyLimits,\n };\n}\n\n// ── Helper Functions ──────────────────────────────────────────────────────────\n\nfunction mapRiskStatus(raw: any): RiskStatus {\n const exposurePercent = raw.maxExposure > 0\n ? (raw.totalExposure / raw.maxExposure) * 100\n : 0;\n const dailyPnlPercent = raw.dailyPnlLimit > 0\n ? (Math.abs(raw.dailyPnl) / raw.dailyPnlLimit) * 100\n : 0;\n const drawdownPercent = raw.maxDrawdown > 0\n ? (raw.currentDrawdown / raw.maxDrawdown) * 100\n : 0;\n\n return {\n timestamp: raw.timestamp ?? Date.now(),\n totalExposure: raw.totalExposure ?? raw.total_exposure ?? 0,\n maxExposure: raw.maxExposure ?? raw.max_exposure ?? 100000,\n exposurePercent,\n dailyPnl: raw.dailyPnl ?? raw.daily_pnl ?? 0,\n dailyPnlLimit: raw.dailyPnlLimit ?? raw.daily_pnl_limit ?? 5000,\n dailyPnlPercent,\n dailyTradeCount: raw.dailyTradeCount ?? raw.daily_trade_count ?? 0,\n dailyTradeLimit: raw.dailyTradeLimit ?? raw.daily_trade_limit ?? 50,\n currentDrawdown: raw.currentDrawdown ?? raw.current_drawdown ?? 0,\n maxDrawdown: raw.maxDrawdown ?? raw.max_drawdown ?? 15,\n drawdownPercent,\n openPositions: raw.openPositions ?? raw.open_positions ?? 0,\n maxPositions: raw.maxPositions ?? raw.max_positions ?? 10,\n riskLevel: raw.riskLevel ?? raw.risk_level ?? calculateRiskLevel(exposurePercent, drawdownPercent, dailyPnlPercent),\n tradingStatus: raw.tradingStatus ?? raw.trading_status ?? 'active',\n warnings: raw.warnings ?? [],\n strategyRisks: raw.strategyRisks ?? raw.strategy_risks,\n };\n}\n","/**\n * ONE SDK - AI Quant Console Hook\n * Combined hook for all AI trading console data\n */\n\nimport { useState, useEffect, useCallback, useMemo } from 'react';\nimport { useBotSimulation } from './useBotSimulation';\nimport { useAIPositions } from './useAIPositions';\nimport { useAIDecisions } from './useAIDecisions';\nimport { useAIRiskStatus } from './useAIRiskStatus';\nimport type {\n AIAgent,\n AIPosition,\n AIDecision,\n RiskStatus,\n ConsoleMetrics,\n AIQuantConsoleOptions,\n} from '../types/console';\nimport { DEFAULT_CONSOLE_METRICS, AGENT_STATUS_COLORS } from '../types/console';\nimport type { BotLogEntry, BotState, StrategyPersonality } from '../services/forex/BotSimulationEngine';\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\nexport interface UseAIQuantConsoleResult {\n // Strategies and Agents\n strategies: StrategyPersonality[];\n agents: AIAgent[];\n // Logs\n logs: BotLogEntry[];\n logsByStrategy: Map<string, BotLogEntry[]>;\n // Bot States\n botStates: Map<string, BotState>;\n // Positions\n positions: AIPosition[];\n openPositions: AIPosition[];\n // Decisions\n decisions: AIDecision[];\n recentDecisions: AIDecision[];\n // Risk\n riskStatus: RiskStatus | null;\n // Metrics\n metrics: ConsoleMetrics;\n // State\n isRunning: boolean;\n isLoading: boolean;\n error: string | null;\n // Controls\n start: (strategyIds?: string[]) => void;\n stop: (strategyIds?: string[]) => void;\n clearLogs: () => void;\n emitBootSequence: () => void;\n refresh: () => Promise<void>;\n // Agent helpers\n getAgent: (strategyId: string) => AIAgent | undefined;\n getAgentLogs: (strategyId: string) => BotLogEntry[];\n getAgentPositions: (strategyId: string) => AIPosition[];\n getAgentDecisions: (strategyId: string) => AIDecision[];\n}\n\n// ── Hook Implementation ───────────────────────────────────────────────────────\n\nexport function useAIQuantConsole(options?: AIQuantConsoleOptions): UseAIQuantConsoleResult {\n const simulation = options?.simulation ?? true;\n const pollInterval = options?.pollInterval ?? 5000;\n const maxLogs = options?.maxLogs ?? 500;\n const strategyIds = options?.strategyIds;\n\n // Sub-hooks\n const botSim = useBotSimulation({\n maxLogs,\n strategyIds,\n autoStart: false,\n });\n\n const positionsHook = useAIPositions({\n strategyIds,\n pollInterval,\n simulation,\n });\n\n const decisionsHook = useAIDecisions({\n strategyIds,\n pollInterval,\n simulation,\n limit: 100,\n });\n\n const riskHook = useAIRiskStatus({\n pollInterval,\n simulation,\n });\n\n // Transform bot states to agents\n const agents = useMemo((): AIAgent[] => {\n const agentList: AIAgent[] = [];\n\n for (const strategy of botSim.strategies) {\n const state = botSim.botStates.get(strategy.id);\n const strategyPositions = positionsHook.positions.filter(p => p.strategyId === strategy.id);\n const strategyDecisions = decisionsHook.decisions.filter(d => d.strategyId === strategy.id);\n const openPos = strategyPositions.filter(p => p.status === 'open');\n\n const totalPnl = strategyPositions.reduce((sum, p) => sum + p.pnl, 0);\n const exposure = openPos.reduce((sum, p) => sum + p.size, 0);\n const winCount = strategyPositions.filter(p => p.pnl > 0).length;\n const totalTrades = strategyPositions.length;\n\n // Determine agent risk level based on exposure and drawdown\n let riskLevel: 'low' | 'medium' | 'high' | 'critical' = 'low';\n if (strategy.riskTolerance === 'high') riskLevel = 'medium';\n if (exposure > 50000) riskLevel = 'high';\n if (state && state.openPositions.length >= 3) riskLevel = 'high';\n\n agentList.push({\n id: strategy.id,\n strategyId: strategy.id,\n name: strategy.name,\n shortName: strategy.shortName,\n color: strategy.color,\n status: state?.isRunning ? 'active' : botSim.isRunning ? 'idle' : 'paused',\n totalPnl: state?.totalPnl ?? totalPnl,\n pnlToday: totalPnl * 0.3, // Simulated\n winRate: state?.winRate ?? (totalTrades > 0 ? winCount / totalTrades : 0.5),\n totalTrades: state?.totalTrades ?? totalTrades,\n tradesToday: Math.floor((state?.totalTrades ?? totalTrades) * 0.2),\n currentPair: state?.currentPair,\n currentPrice: state?.currentPrice,\n lastSignal: state?.lastSignal,\n lastSignalConfidence: state?.lastSignalConfidence,\n lastActivity: state ? Date.now() : undefined,\n openPositions: openPos.length,\n totalExposure: exposure,\n riskLevel,\n drawdown: Math.random() * 5, // Simulated\n riskTolerance: strategy.riskTolerance,\n primaryIndicators: strategy.primaryIndicators,\n preferredPairs: strategy.preferredPairs,\n leverageRange: [strategy.leverageMin, strategy.leverageMax],\n });\n }\n\n return agentList;\n }, [botSim.strategies, botSim.botStates, botSim.isRunning, positionsHook.positions, decisionsHook.decisions]);\n\n // Calculate combined metrics\n const metrics = useMemo((): ConsoleMetrics => {\n const positions = positionsHook.positions;\n const openPos = positions.filter(p => p.status === 'open');\n const closedPos = positions.filter(p => p.status === 'closed');\n\n const totalPnl = positions.reduce((sum, p) => sum + p.pnl, 0);\n const unrealizedPnl = openPos.reduce((sum, p) => sum + p.pnl, 0);\n const realizedPnl = closedPos.reduce((sum, p) => sum + p.pnl, 0);\n\n const wins = positions.filter(p => p.pnl > 0);\n const losses = positions.filter(p => p.pnl < 0);\n\n const avgWin = wins.length > 0\n ? wins.reduce((sum, p) => sum + p.pnl, 0) / wins.length\n : 0;\n const avgLoss = losses.length > 0\n ? Math.abs(losses.reduce((sum, p) => sum + p.pnl, 0)) / losses.length\n : 0;\n\n const profitFactor = avgLoss > 0 ? avgWin / avgLoss : avgWin > 0 ? Infinity : 0;\n\n const totalExposure = openPos.reduce((sum, p) => sum + p.size, 0);\n const avgLeverage = openPos.length > 0\n ? openPos.reduce((sum, p) => sum + p.leverage, 0) / openPos.length\n : 0;\n\n // Strategy metrics\n const strategyMetrics: Record<string, { pnl: number; trades: number; winRate: number; exposure: number }> = {};\n for (const agent of agents) {\n const strategyPos = positions.filter(p => p.strategyId === agent.strategyId);\n const strategyOpen = strategyPos.filter(p => p.status === 'open');\n const strategyWins = strategyPos.filter(p => p.pnl > 0);\n\n strategyMetrics[agent.strategyId] = {\n pnl: strategyPos.reduce((sum, p) => sum + p.pnl, 0),\n trades: strategyPos.length,\n winRate: strategyPos.length > 0 ? strategyWins.length / strategyPos.length : 0,\n exposure: strategyOpen.reduce((sum, p) => sum + p.size, 0),\n };\n }\n\n return {\n nav: 100000 + totalPnl,\n navChange24h: totalPnl * 0.3,\n navChangePercent24h: (totalPnl * 0.3) / 100000 * 100,\n totalPnl,\n realizedPnl,\n unrealizedPnl,\n pnlToday: totalPnl * 0.3,\n pnl7d: totalPnl * 0.7,\n pnl30d: totalPnl,\n totalTrades: positions.length,\n tradesToday: Math.floor(positions.length * 0.2),\n winRate: positions.length > 0 ? wins.length / positions.length : 0,\n winCount: wins.length,\n lossCount: losses.length,\n avgWin,\n avgLoss,\n profitFactor,\n openPositions: openPos.length,\n totalExposure,\n avgLeverage,\n strategyMetrics,\n };\n }, [positionsHook.positions, agents]);\n\n // Controls\n const start = useCallback((ids?: string[]) => {\n botSim.start(ids || strategyIds);\n }, [botSim, strategyIds]);\n\n const stop = useCallback((ids?: string[]) => {\n botSim.stop(ids);\n }, [botSim]);\n\n const clearLogs = useCallback(() => {\n botSim.clearLogs();\n }, [botSim]);\n\n const refresh = useCallback(async () => {\n await Promise.all([\n positionsHook.refresh(),\n decisionsHook.refresh(),\n riskHook.refresh(),\n ]);\n }, [positionsHook, decisionsHook, riskHook]);\n\n // Agent helpers\n const getAgent = useCallback((strategyId: string) =>\n agents.find(a => a.strategyId === strategyId),\n [agents]\n );\n\n const getAgentLogs = useCallback((strategyId: string) =>\n botSim.logsByStrategy.get(strategyId) || [],\n [botSim.logsByStrategy]\n );\n\n const getAgentPositions = useCallback((strategyId: string) =>\n positionsHook.positions.filter(p => p.strategyId === strategyId),\n [positionsHook.positions]\n );\n\n const getAgentDecisions = useCallback((strategyId: string) =>\n decisionsHook.decisions.filter(d => d.strategyId === strategyId),\n [decisionsHook.decisions]\n );\n\n // Combined loading/error state\n const isLoading = positionsHook.isLoading || decisionsHook.isLoading || riskHook.isLoading;\n const error = positionsHook.error || decisionsHook.error || riskHook.error;\n\n return {\n strategies: botSim.strategies,\n agents,\n logs: botSim.logs,\n logsByStrategy: botSim.logsByStrategy,\n botStates: botSim.botStates,\n positions: positionsHook.positions,\n openPositions: positionsHook.openPositions,\n decisions: decisionsHook.decisions,\n recentDecisions: decisionsHook.recentDecisions,\n riskStatus: riskHook.riskStatus,\n metrics,\n isRunning: botSim.isRunning,\n isLoading,\n error,\n start,\n stop,\n clearLogs,\n emitBootSequence: botSim.emitBootSequence,\n refresh,\n getAgent,\n getAgentLogs,\n getAgentPositions,\n getAgentDecisions,\n };\n}\n","/**\n * ONE SDK - Master Trading Console Hook\n * Orchestrates all AI and Forex trading data in a unified interface\n */\n\nimport { useState, useEffect, useCallback, useMemo } from 'react';\nimport { useAIQuantConsole } from './useAIQuantConsole';\nimport { useForexSimulation, useForexPools, useForexInvestments } from './useForexTrading';\nimport type {\n AIAgent,\n AIPosition,\n AIDecision,\n RiskStatus,\n ConsoleMetrics,\n CombinedLogEntry,\n TradingConsoleOptions,\n TradingConsoleState,\n} from '../types/console';\nimport { DEFAULT_CONSOLE_METRICS } from '../types/console';\nimport type { BotLogEntry, BotState, StrategyPersonality } from '../services/forex/BotSimulationEngine';\nimport type { ForexLogEntry, ForexPoolTransaction, ForexPool, ForexInvestment } from '../types/forex';\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\nexport interface UseTradingConsoleResult {\n // AI Data\n ai: {\n strategies: StrategyPersonality[];\n agents: AIAgent[];\n positions: AIPosition[];\n decisions: AIDecision[];\n riskStatus: RiskStatus | null;\n simulationLogs: BotLogEntry[];\n logsByStrategy: Map<string, BotLogEntry[]>;\n botStates: Map<string, BotState>;\n };\n // Forex Data\n forex: {\n logs: ForexLogEntry[];\n poolTransactions: ForexPoolTransaction[];\n pools: ForexPool[];\n investments: ForexInvestment[];\n stats: {\n totalPnl: number;\n totalTrades: number;\n totalPips: number;\n totalLots: number;\n };\n };\n // Combined\n combinedLogs: CombinedLogEntry[];\n metrics: ConsoleMetrics;\n // Controls\n controls: {\n startAISimulation: (strategyIds?: string[]) => void;\n stopAISimulation: (strategyIds?: string[]) => void;\n startForexSimulation: () => void;\n stopForexSimulation: () => void;\n startAll: () => void;\n stopAll: () => void;\n clearLogs: () => void;\n emitBootSequence: () => void;\n refreshAll: () => Promise<void>;\n };\n // State\n state: {\n isAISimulationRunning: boolean;\n isForexSimulationRunning: boolean;\n isAnyRunning: boolean;\n isLoading: boolean;\n error: string | null;\n };\n // Agent helpers\n getAgent: (strategyId: string) => AIAgent | undefined;\n getAgentLogs: (strategyId: string) => BotLogEntry[];\n getAgentPositions: (strategyId: string) => AIPosition[];\n getAgentDecisions: (strategyId: string) => AIDecision[];\n}\n\n// ── Hook Implementation ───────────────────────────────────────────────────────\n\nexport function useTradingConsole(options?: TradingConsoleOptions): UseTradingConsoleResult {\n const simulation = options?.simulation ?? true;\n const pollInterval = options?.pollInterval ?? 5000;\n const maxLogs = options?.maxLogs ?? 500;\n const strategyIds = options?.strategyIds;\n const autoStart = options?.autoStart ?? false;\n\n // AI Console Hook\n const aiConsole = useAIQuantConsole({\n simulation,\n pollInterval,\n maxLogs,\n strategyIds,\n });\n\n // Forex Hooks\n const forexSim = useForexSimulation({ maxLogs });\n const forexPools = useForexPools({ refreshInterval: pollInterval });\n const forexInvestments = useForexInvestments({ refreshInterval: pollInterval });\n\n // Combine logs from both AI and Forex\n const combinedLogs = useMemo((): CombinedLogEntry[] => {\n const combined: CombinedLogEntry[] = [];\n\n // Add AI logs\n for (const log of aiConsole.logs) {\n combined.push({\n id: log.id,\n timestamp: log.timestamp,\n source: 'ai',\n strategyId: log.strategyId,\n strategyName: log.strategyName,\n type: log.type,\n message: log.message,\n data: log.data,\n importance: log.importance,\n });\n }\n\n // Add Forex logs\n for (const log of forexSim.logs) {\n combined.push({\n id: log.id,\n timestamp: log.timestamp,\n source: 'forex',\n type: log.type,\n message: log.message,\n data: log.data,\n importance: log.importance,\n });\n }\n\n // Sort by timestamp descending\n return combined.sort((a, b) => b.timestamp - a.timestamp).slice(0, maxLogs);\n }, [aiConsole.logs, forexSim.logs, maxLogs]);\n\n // Combine metrics from AI and Forex\n const combinedMetrics = useMemo((): ConsoleMetrics => {\n const aiMetrics = aiConsole.metrics;\n\n // Add forex stats to metrics\n return {\n ...aiMetrics,\n totalPnl: aiMetrics.totalPnl + forexSim.stats.totalPnl,\n totalTrades: aiMetrics.totalTrades + forexSim.stats.totalTrades,\n };\n }, [aiConsole.metrics, forexSim.stats]);\n\n // Controls\n const controls = useMemo(() => ({\n startAISimulation: (ids?: string[]) => {\n aiConsole.emitBootSequence();\n setTimeout(() => aiConsole.start(ids), 5500);\n },\n stopAISimulation: (ids?: string[]) => {\n aiConsole.stop(ids);\n },\n startForexSimulation: () => {\n forexSim.start();\n },\n stopForexSimulation: () => {\n forexSim.stop();\n },\n startAll: () => {\n aiConsole.emitBootSequence();\n setTimeout(() => {\n aiConsole.start();\n forexSim.start();\n }, 5500);\n },\n stopAll: () => {\n aiConsole.stop();\n forexSim.stop();\n },\n clearLogs: () => {\n aiConsole.clearLogs();\n forexSim.clearLogs();\n },\n emitBootSequence: () => {\n aiConsole.emitBootSequence();\n },\n refreshAll: async () => {\n await Promise.all([\n aiConsole.refresh(),\n forexPools.refresh(),\n forexInvestments.refresh(),\n ]);\n },\n }), [aiConsole, forexSim, forexPools, forexInvestments]);\n\n // State\n const state = useMemo(() => ({\n isAISimulationRunning: aiConsole.isRunning,\n isForexSimulationRunning: forexSim.isRunning,\n isAnyRunning: aiConsole.isRunning || forexSim.isRunning,\n isLoading: aiConsole.isLoading || forexPools.isLoading || forexInvestments.isLoading,\n error: aiConsole.error || forexPools.error || forexInvestments.error,\n }), [aiConsole.isRunning, aiConsole.isLoading, aiConsole.error, forexSim.isRunning, forexPools, forexInvestments]);\n\n // Auto-start if configured\n useEffect(() => {\n if (autoStart) {\n controls.startAll();\n }\n }, [autoStart, controls]);\n\n return {\n ai: {\n strategies: aiConsole.strategies,\n agents: aiConsole.agents,\n positions: aiConsole.positions,\n decisions: aiConsole.decisions,\n riskStatus: aiConsole.riskStatus,\n simulationLogs: aiConsole.logs,\n logsByStrategy: aiConsole.logsByStrategy,\n botStates: aiConsole.botStates,\n },\n forex: {\n logs: forexSim.logs,\n poolTransactions: forexSim.poolTransactions,\n pools: forexPools.pools,\n investments: forexInvestments.investments,\n stats: forexSim.stats,\n },\n combinedLogs,\n metrics: combinedMetrics,\n controls,\n state,\n getAgent: aiConsole.getAgent,\n getAgentLogs: aiConsole.getAgentLogs,\n getAgentPositions: aiConsole.getAgentPositions,\n getAgentDecisions: aiConsole.getAgentDecisions,\n };\n}\n\n// ── Convenience Exports ───────────────────────────────────────────────────────\n\nexport { useAIQuantConsole } from './useAIQuantConsole';\nexport { useBotSimulation } from './useBotSimulation';\nexport { useAIPositions, setConsoleAccessToken, clearConsoleAccessToken, setConsoleEngineUrl } from './useAIPositions';\nexport { useAIDecisions } from './useAIDecisions';\nexport { useAIRiskStatus } from './useAIRiskStatus';\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/types/forex.ts","../../src/services/forex/ForexPoolDataGenerator.ts","../../src/services/forex/ForexSimulationEngine.ts","../../src/services/forex/BotSimulationEngine.ts","../../src/config/index.ts","../../src/services/engine.ts","../../src/hooks/useWalletBalance.ts","../../src/hooks/useTokenPrice.ts","../../src/hooks/useAITrading.ts","../../src/hooks/useForexTrading.ts","../../src/hooks/useBotSimulation.ts","../../src/hooks/useAIPositions.ts","../../src/hooks/useAIDecisions.ts","../../src/types/console.ts","../../src/hooks/useAIRiskStatus.ts","../../src/hooks/useAIQuantConsole.ts","../../src/hooks/useTradingConsole.ts"],"names":["genId","rand","randInt","pick","ForexPoolDataGenerator","idCounter","config","useState","useRef","useCallback","useEffect","useMemo","inv","forexSimulationEngine","botSimulationEngine"],"mappings":"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","file":"index.js","sourcesContent":["// ══════════════════════════════════════════════════════════════════════════════\n// ONE SDK - StableFX On-Chain Forex Types & Constants\n// Shared types for stablecoin foreign exchange pool trading\n// ══════════════════════════════════════════════════════════════════════════════\n\n// ── Capital Split ────────────────────────────────────────────────────────────\n\nexport const FOREX_CAPITAL_SPLIT = {\n poolReserves: 0.50,\n tradingCapital: 0.50,\n} as const;\n\nexport function computePoolAllocations(amount: number): {\n tradingCapital: number;\n totalPoolReserves: number;\n clearing: number;\n hedging: number;\n insurance: number;\n} {\n const totalPoolReserves = amount * FOREX_CAPITAL_SPLIT.poolReserves;\n const tradingCapital = amount * FOREX_CAPITAL_SPLIT.tradingCapital;\n return {\n tradingCapital,\n totalPoolReserves,\n clearing: totalPoolReserves * 0.50,\n hedging: totalPoolReserves * 0.30,\n insurance: totalPoolReserves * 0.20,\n };\n}\n\n// ── Cycle Options ────────────────────────────────────────────────────────────\n\nexport interface ForexCycleOption {\n days: number;\n feeRate: number;\n commissionRate: number;\n label: string;\n}\n\nexport const FOREX_CYCLE_OPTIONS: ForexCycleOption[] = [\n { days: 30, feeRate: 0.10, commissionRate: 0.60, label: '30D' },\n { days: 60, feeRate: 0.08, commissionRate: 0.70, label: '60D' },\n { days: 90, feeRate: 0.07, commissionRate: 0.75, label: '90D' },\n { days: 180, feeRate: 0.05, commissionRate: 0.85, label: '180D' },\n { days: 360, feeRate: 0.03, commissionRate: 0.90, label: '360D' },\n];\n\n// ── Currency Pairs ───────────────────────────────────────────────────────────\n\nexport interface ForexCurrencyPair {\n id: string;\n base: string;\n quote: string;\n symbol: string;\n flag: string;\n name: string;\n basePrice: number;\n pipSize: number;\n spreadPips: number;\n}\n\nexport const FOREX_CURRENCY_PAIRS: ForexCurrencyPair[] = [\n { id: 'USDC_EURC', base: 'USDC', quote: 'EURC', symbol: 'USDC/EURC', flag: '\\u{1F1EA}\\u{1F1FA}', name: 'Euro', basePrice: 0.9230, pipSize: 0.0001, spreadPips: 1.2 },\n { id: 'USDC_GBPC', base: 'USDC', quote: 'GBPC', symbol: 'USDC/GBPC', flag: '\\u{1F1EC}\\u{1F1E7}', name: 'British Pound', basePrice: 0.7890, pipSize: 0.0001, spreadPips: 1.5 },\n { id: 'USDC_JPYC', base: 'USDC', quote: 'JPYC', symbol: 'USDC/JPYC', flag: '\\u{1F1EF}\\u{1F1F5}', name: 'Japanese Yen', basePrice: 154.50, pipSize: 0.01, spreadPips: 1.0 },\n { id: 'USDC_AUDC', base: 'USDC', quote: 'AUDC', symbol: 'USDC/AUDC', flag: '\\u{1F1E6}\\u{1F1FA}', name: 'Australian Dollar', basePrice: 1.5380, pipSize: 0.0001, spreadPips: 1.8 },\n { id: 'USDC_CADC', base: 'USDC', quote: 'CADC', symbol: 'USDC/CADC', flag: '\\u{1F1E8}\\u{1F1E6}', name: 'Canadian Dollar', basePrice: 1.3640, pipSize: 0.0001, spreadPips: 1.5 },\n { id: 'USDC_CHFC', base: 'USDC', quote: 'CHFC', symbol: 'USDC/CHFC', flag: '\\u{1F1E8}\\u{1F1ED}', name: 'Swiss Franc', basePrice: 0.8750, pipSize: 0.0001, spreadPips: 1.3 },\n];\n\n// ── Pools ────────────────────────────────────────────────────────────────────\n\nexport type ForexPoolType = 'clearing' | 'hedging' | 'insurance';\n\nexport interface ForexPool {\n id: ForexPoolType;\n nameKey: string;\n descriptionKey: string;\n allocation: number;\n totalSize: number;\n utilization: number;\n color: string;\n apy7d: number;\n apy30d: number;\n netFlow24h: number;\n txCount24h: number;\n txCountTotal: number;\n totalDeposits: number;\n totalWithdrawals: number;\n profitDistributed: number;\n lastUpdated: number;\n}\n\nexport const FOREX_POOL_DEFAULTS: ForexPool[] = [\n { id: 'clearing', nameKey: 'forex.pool_clearing', descriptionKey: 'forex.pool_clearing_desc', allocation: 0.50, totalSize: 12500000, utilization: 0.78, color: '#3B82F6', apy7d: 12.8, apy30d: 11.5, netFlow24h: 185000, txCount24h: 42, txCountTotal: 12840, totalDeposits: 45200000, totalWithdrawals: 32700000, profitDistributed: 1850000, lastUpdated: Date.now() },\n { id: 'hedging', nameKey: 'forex.pool_hedging', descriptionKey: 'forex.pool_hedging_desc', allocation: 0.30, totalSize: 7500000, utilization: 0.65, color: '#F59E0B', apy7d: 8.1, apy30d: 7.6, netFlow24h: 72000, txCount24h: 24, txCountTotal: 7620, totalDeposits: 28500000, totalWithdrawals: 21000000, profitDistributed: 980000, lastUpdated: Date.now() },\n { id: 'insurance', nameKey: 'forex.pool_insurance', descriptionKey: 'forex.pool_insurance_desc', allocation: 0.20, totalSize: 5000000, utilization: 0.42, color: '#10B981', apy7d: 4.8, apy30d: 4.5, netFlow24h: 35000, txCount24h: 14, txCountTotal: 4280, totalDeposits: 15800000, totalWithdrawals: 10800000, profitDistributed: 520000, lastUpdated: Date.now() },\n];\n\n// ── Pool Transactions ────────────────────────────────────────────────────────\n\nexport type ForexPoolTransactionType =\n | 'deposit' | 'withdrawal' | 'profit_distribution'\n | 'loss_absorption' | 'inter_pool_transfer' | 'fee_collection' | 'reserve_rebalance';\n\nexport interface ForexPoolTransaction {\n id: string;\n poolId: ForexPoolType;\n type: ForexPoolTransactionType;\n amount: number;\n balanceBefore: number;\n balanceAfter: number;\n txHash: string;\n blockNumber: number;\n timestamp: number;\n description: string;\n}\n\n// ── Pool Daily Snapshots ────────────────────────────────────────────────────\n\nexport interface ForexPoolDailySnapshot {\n poolId: ForexPoolType;\n date: string;\n openBalance: number;\n closeBalance: number;\n deposits: number;\n withdrawals: number;\n netFlow: number;\n dailyPnl: number;\n dailyPnlPct: number;\n cumulativePnl: number;\n utilization: number;\n txCount: number;\n activeUsers: number;\n}\n\n// ── Positions ────────────────────────────────────────────────────────────────\n\nexport interface ForexPosition {\n id: string;\n pairId: string;\n side: 'BUY' | 'SELL';\n lots: number;\n pips: number;\n entryPrice: number;\n currentPrice: number;\n pnl: number;\n openTime: number;\n}\n\n// ── Investment ───────────────────────────────────────────────────────────────\n\nexport interface ForexInvestment {\n id: string;\n userId?: string;\n amount: number;\n currentValue: number;\n profit: number;\n status: 'active' | 'completed' | 'pending' | 'redeemed' | 'cancelled';\n selectedPairs: string[];\n cycleDays: number;\n cycleOption: ForexCycleOption;\n feeRate?: number;\n commissionRate?: number;\n startDate: string;\n endDate: string;\n tradingCapital: number;\n totalPoolReserves: number;\n poolAllocations: {\n clearing: number;\n hedging: number;\n insurance: number;\n };\n tradeWeight: number;\n totalLots: number;\n totalPips: number;\n totalTrades: number;\n positions: ForexPosition[];\n tradeHistory: ForexTradeRecord[];\n redeemedAt?: string;\n createdAt?: string;\n updatedAt?: string;\n}\n\n// ── Trade Records ────────────────────────────────────────────────────────────\n\nexport type ForexTradeStatus = 'RFQ' | 'QUOTED' | 'MATCHED' | 'SETTLED' | 'FAILED';\n\nexport interface ForexTradeRecord {\n id: string;\n timestamp: number;\n pairId: string;\n pairSymbol: string;\n side: 'BUY' | 'SELL';\n rfqPrice: number;\n quotePrice: number;\n matchPrice: number;\n settlePrice: number;\n lots: number;\n pips: number;\n pnl: number;\n status: ForexTradeStatus;\n pvpSettled: boolean;\n clearingFee?: number;\n hedgingCost?: number;\n insuranceReserve?: number;\n txHash?: string;\n blockNumber?: number;\n cycleDay?: number;\n cumulativePnl?: number;\n}\n\n// ── Console Log Types ────────────────────────────────────────────────────────\n\nexport type ForexLogType =\n | 'RFQ' | 'QUOTE' | 'MATCH' | 'SETTLE' | 'PVP'\n | 'HEDGE' | 'CLEAR' | 'POSITION' | 'PNL' | 'SYSTEM';\n\nexport interface ForexLogEntry {\n id: string;\n timestamp: number;\n type: ForexLogType;\n message: string;\n data?: Record<string, any>;\n importance: 'low' | 'medium' | 'high';\n pairId?: string;\n}\n\n// ── Agent ────────────────────────────────────────────────────────────────────\n\nexport interface ForexAgent {\n id: string;\n nameKey: string;\n descriptionKey: string;\n icon: string;\n color: string;\n supportedPairs: string[];\n dailyRoiMin: number;\n dailyRoiMax: number;\n totalManaged: number;\n totalUsers: number;\n winRate: number;\n}\n\nexport const FOREX_AGENT: ForexAgent = {\n id: 'stablefx-01',\n nameKey: 'forex.agent_name',\n descriptionKey: 'forex.agent_description',\n icon: '\\u{1F4B1}',\n color: '#0EA5E9',\n supportedPairs: FOREX_CURRENCY_PAIRS.map(p => p.id),\n dailyRoiMin: 0.002,\n dailyRoiMax: 0.005,\n totalManaged: 25000000,\n totalUsers: 3847,\n winRate: 72.5,\n};\n\n// ── Profit Calculation ───────────────────────────────────────────────────────\n\nexport function calculateForexNetProfit(\n grossProfit: number,\n cycleOption: ForexCycleOption,\n): { feeAmount: number; postFeeProfit: number; netProfit: number } {\n const feeAmount = grossProfit * cycleOption.feeRate;\n const postFeeProfit = grossProfit - feeAmount;\n const netProfit = postFeeProfit * cycleOption.commissionRate;\n return { feeAmount, postFeeProfit, netProfit };\n}\n\nexport function estimateForexProfit(\n amount: number,\n cycleDays: number,\n agent: ForexAgent = FOREX_AGENT,\n): { grossProfit: number; feeAmount: number; netProfit: number; dailyRate: number } {\n const cycleOption = FOREX_CYCLE_OPTIONS.find(c => c.days === cycleDays) || FOREX_CYCLE_OPTIONS[0];\n const estimatedApy = ((agent.dailyRoiMin + agent.dailyRoiMax) / 2) * 365 * 100;\n const dailyRate = estimatedApy / 100 / 365;\n const grossProfit = amount * dailyRate * cycleDays;\n const { feeAmount, netProfit } = calculateForexNetProfit(grossProfit, cycleOption);\n return { grossProfit, feeAmount, netProfit, dailyRate };\n}\n","// ForexPoolDataGenerator.ts - Generates historical pool snapshots, transactions, and trade history\n// Singleton service following existing pattern (like ForexSimulationEngine)\n\nimport type {\n ForexPoolType,\n ForexPoolDailySnapshot,\n ForexPoolTransaction,\n ForexPoolTransactionType,\n ForexTradeRecord,\n} from '../../types/forex';\nimport { FOREX_CURRENCY_PAIRS, FOREX_POOL_DEFAULTS, FOREX_AGENT } from '../../types/forex';\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction rand(min: number, max: number): number {\n return min + Math.random() * (max - min);\n}\n\nfunction randInt(min: number, max: number): number {\n return Math.floor(rand(min, max + 1));\n}\n\nfunction pick<T>(arr: T[]): T {\n return arr[Math.floor(Math.random() * arr.length)];\n}\n\nfunction genTxHash(): string {\n const chars = '0123456789abcdef';\n let hash = '0x';\n for (let i = 0; i < 64; i++) hash += chars[Math.floor(Math.random() * 16)];\n return hash;\n}\n\nfunction formatDate(d: Date): string {\n return d.toISOString().split('T')[0];\n}\n\nlet _idCounter = 0;\nfunction genId(prefix: string): string {\n return `${prefix}_${Date.now().toString(36)}_${(++_idCounter).toString(36)}`;\n}\n\n// ── Pool Parameters ──────────────────────────────────────────────────────────\n\ninterface PoolParams {\n meanDailyPnlPct: number;\n stddevPnlPct: number;\n utilizationMin: number;\n utilizationMax: number;\n depositsPerDay: [number, number];\n withdrawalsPerDay: [number, number];\n profitDistPerDay: number;\n avgDepositSize: number;\n avgWithdrawalSize: number;\n}\n\nconst POOL_PARAMS: Record<ForexPoolType, PoolParams> = {\n clearing: {\n meanDailyPnlPct: 0.00035,\n stddevPnlPct: 0.00015,\n utilizationMin: 0.70,\n utilizationMax: 0.85,\n depositsPerDay: [15, 25],\n withdrawalsPerDay: [8, 12],\n profitDistPerDay: 5,\n avgDepositSize: 25000,\n avgWithdrawalSize: 18000,\n },\n hedging: {\n meanDailyPnlPct: 0.00022,\n stddevPnlPct: 0.00020,\n utilizationMin: 0.55,\n utilizationMax: 0.75,\n depositsPerDay: [8, 15],\n withdrawalsPerDay: [5, 8],\n profitDistPerDay: 3,\n avgDepositSize: 18000,\n avgWithdrawalSize: 12000,\n },\n insurance: {\n meanDailyPnlPct: 0.00013,\n stddevPnlPct: 0.00008,\n utilizationMin: 0.30,\n utilizationMax: 0.50,\n depositsPerDay: [5, 10],\n withdrawalsPerDay: [3, 5],\n profitDistPerDay: 2,\n avgDepositSize: 12000,\n avgWithdrawalSize: 8000,\n },\n};\n\n// ── Generator Class ──────────────────────────────────────────────────────────\n\nclass ForexPoolDataGeneratorClass {\n private snapshotCache: Record<ForexPoolType, ForexPoolDailySnapshot[]> | null = null;\n private transactionCache: ForexPoolTransaction[] | null = null;\n private baseBlockNumber = 19_500_000;\n\n // ── Public API ─────────────────────────────────────────────────────────\n\n generateAllSnapshots(): Record<ForexPoolType, ForexPoolDailySnapshot[]> {\n if (this.snapshotCache) return this.snapshotCache;\n\n const result: Record<ForexPoolType, ForexPoolDailySnapshot[]> = {\n clearing: [],\n hedging: [],\n insurance: [],\n };\n\n for (const pool of FOREX_POOL_DEFAULTS) {\n result[pool.id] = this.generatePoolSnapshots(pool.id, pool.totalSize);\n }\n\n this.snapshotCache = result;\n return result;\n }\n\n generateAllTransactions(): ForexPoolTransaction[] {\n if (this.transactionCache) return this.transactionCache;\n\n const allTx: ForexPoolTransaction[] = [];\n\n for (const pool of FOREX_POOL_DEFAULTS) {\n const snapshots = this.snapshotCache?.[pool.id] || this.generatePoolSnapshots(pool.id, pool.totalSize);\n const txs = this.generatePoolTransactions(pool.id, snapshots);\n allTx.push(...txs);\n }\n\n // Add inter-pool transfers (~2-3/week = ~17-26 over 60 days)\n const now = new Date();\n for (let i = 0; i < 60; i++) {\n const day = new Date(now);\n day.setDate(day.getDate() - (60 - i));\n const dayOfWeek = day.getDay();\n\n // Inter-pool transfers: ~2-3 per week\n if (dayOfWeek === 2 || dayOfWeek === 4 || (dayOfWeek === 5 && Math.random() < 0.4)) {\n const fromPool = pick(['clearing', 'hedging', 'insurance'] as ForexPoolType[]);\n const toOptions = (['clearing', 'hedging', 'insurance'] as ForexPoolType[]).filter(p => p !== fromPool);\n const toPool = pick(toOptions);\n const amount = rand(50000, 200000);\n const ts = day.getTime() + randInt(10, 18) * 3600000;\n\n allTx.push({\n id: genId('ipt'),\n poolId: fromPool,\n type: 'inter_pool_transfer',\n amount: -amount,\n balanceBefore: 0,\n balanceAfter: 0,\n txHash: genTxHash(),\n blockNumber: this.baseBlockNumber + i * 7200 + randInt(0, 100),\n timestamp: ts,\n description: `Transfer to ${toPool} pool`,\n });\n\n allTx.push({\n id: genId('ipt'),\n poolId: toPool,\n type: 'inter_pool_transfer',\n amount: amount,\n balanceBefore: 0,\n balanceAfter: 0,\n txHash: genTxHash(),\n blockNumber: this.baseBlockNumber + i * 7200 + randInt(100, 200),\n timestamp: ts + 5000,\n description: `Transfer from ${fromPool} pool`,\n });\n }\n\n // Reserve rebalance: ~1/week\n if (dayOfWeek === 3 && Math.random() < 0.85) {\n const pool = pick(FOREX_POOL_DEFAULTS);\n const rebalanceAmt = rand(20000, 100000);\n const ts = day.getTime() + randInt(2, 6) * 3600000;\n allTx.push({\n id: genId('rrb'),\n poolId: pool.id,\n type: 'reserve_rebalance',\n amount: Math.random() < 0.5 ? rebalanceAmt : -rebalanceAmt,\n balanceBefore: 0,\n balanceAfter: 0,\n txHash: genTxHash(),\n blockNumber: this.baseBlockNumber + i * 7200 + randInt(200, 300),\n timestamp: ts,\n description: 'Automated reserve rebalance',\n });\n }\n }\n\n // Sort all transactions by timestamp\n allTx.sort((a, b) => a.timestamp - b.timestamp);\n\n // Assign running balances per pool\n const runningBalance: Record<ForexPoolType, number> = {\n clearing: FOREX_POOL_DEFAULTS[0].totalSize * 0.85,\n hedging: FOREX_POOL_DEFAULTS[1].totalSize * 0.82,\n insurance: FOREX_POOL_DEFAULTS[2].totalSize * 0.88,\n };\n\n for (const tx of allTx) {\n tx.balanceBefore = runningBalance[tx.poolId];\n runningBalance[tx.poolId] += tx.amount;\n tx.balanceAfter = runningBalance[tx.poolId];\n }\n\n this.transactionCache = allTx;\n return allTx;\n }\n\n generateTradeHistory(\n investmentAmount: number,\n startDate: string,\n selectedPairs: string[],\n ): ForexTradeRecord[] {\n const trades: ForexTradeRecord[] = [];\n const start = new Date(startDate);\n const now = new Date();\n const dayCount = Math.min(60, Math.ceil((now.getTime() - start.getTime()) / 86400000));\n let cumulativePnl = 0;\n let blockNum = this.baseBlockNumber + randInt(0, 5000);\n\n for (let d = 0; d < dayCount; d++) {\n const day = new Date(start);\n day.setDate(day.getDate() + d);\n const dayOfWeek = day.getDay();\n\n // Fewer trades on weekends\n const baseCount = (dayOfWeek === 0 || dayOfWeek === 6) ? randInt(1, 2) : randInt(3, 8);\n\n for (let t = 0; t < baseCount; t++) {\n const pair = FOREX_CURRENCY_PAIRS.find(p => p.id === pick(selectedPairs)) || pick(FOREX_CURRENCY_PAIRS);\n const side: 'BUY' | 'SELL' = Math.random() > 0.5 ? 'BUY' : 'SELL';\n const lots = parseFloat(rand(0.1, 2.5).toFixed(2));\n const rfqPrice = pair.basePrice * (1 + rand(-0.003, 0.003));\n const quoteSpread = rand(0.5, 2.0) * pair.pipSize;\n const quotePrice = side === 'BUY' ? rfqPrice + quoteSpread : rfqPrice - quoteSpread;\n\n // 85% match rate\n const matched = Math.random() < 0.85;\n if (!matched) continue;\n\n const matchPrice = quotePrice * (1 + rand(-0.00005, 0.00005));\n const settlePrice = matchPrice * (1 + rand(-0.00002, 0.00002));\n const pips = ((settlePrice - rfqPrice) / pair.pipSize) * (side === 'BUY' ? 1 : -1);\n const pnl = pips * pair.pipSize * lots * 100000;\n\n // Win rate matching FOREX_AGENT\n const isWin = Math.random() < (FOREX_AGENT.winRate / 100);\n const finalPnl = isWin ? Math.abs(pnl) : -Math.abs(pnl) * rand(0.3, 0.8);\n cumulativePnl += finalPnl;\n\n const clearingFee = Math.abs(finalPnl) * rand(0.001, 0.003);\n const hedgingCost = Math.abs(finalPnl) * rand(0.0005, 0.002);\n const insuranceReserve = Math.abs(finalPnl) * rand(0.0003, 0.001);\n\n blockNum += randInt(1, 20);\n const timestamp = day.getTime() + randInt(0, 23) * 3600000 + randInt(0, 3600000);\n\n trades.push({\n id: genId('FXT'),\n timestamp,\n pairId: pair.id,\n pairSymbol: pair.symbol,\n side,\n rfqPrice,\n quotePrice,\n matchPrice,\n settlePrice,\n lots,\n pips: isWin ? Math.abs(pips) : -Math.abs(pips) * rand(0.3, 0.8),\n pnl: finalPnl,\n status: 'SETTLED',\n pvpSettled: true,\n clearingFee,\n hedgingCost,\n insuranceReserve,\n txHash: genTxHash(),\n blockNumber: blockNum,\n cycleDay: d + 1,\n cumulativePnl,\n });\n }\n }\n\n trades.sort((a, b) => a.timestamp - b.timestamp);\n return trades;\n }\n\n generateLiveTransaction(\n poolId: ForexPoolType,\n type: ForexPoolTransactionType,\n baseAmount?: number,\n ): ForexPoolTransaction {\n const params = POOL_PARAMS[poolId];\n let amount: number;\n\n switch (type) {\n case 'deposit':\n amount = baseAmount ?? rand(params.avgDepositSize * 0.5, params.avgDepositSize * 1.5);\n break;\n case 'withdrawal':\n amount = -(baseAmount ?? rand(params.avgWithdrawalSize * 0.5, params.avgWithdrawalSize * 1.5));\n break;\n case 'profit_distribution':\n amount = baseAmount ?? rand(500, 5000);\n break;\n case 'fee_collection':\n amount = baseAmount ?? rand(100, 2000);\n break;\n case 'loss_absorption':\n amount = -(baseAmount ?? rand(200, 3000));\n break;\n default:\n amount = baseAmount ?? rand(-5000, 5000);\n }\n\n const pool = FOREX_POOL_DEFAULTS.find(p => p.id === poolId)!;\n const balanceBefore = pool.totalSize;\n\n return {\n id: genId('ptx'),\n poolId,\n type,\n amount,\n balanceBefore,\n balanceAfter: balanceBefore + amount,\n txHash: genTxHash(),\n blockNumber: this.baseBlockNumber + Math.floor(Date.now() / 12000),\n timestamp: Date.now(),\n description: this.getTxDescription(type, poolId, Math.abs(amount)),\n };\n }\n\n // ── Private Methods ────────────────────────────────────────────────────\n\n private generatePoolSnapshots(\n poolId: ForexPoolType,\n currentSize: number,\n ): ForexPoolDailySnapshot[] {\n const params = POOL_PARAMS[poolId];\n const snapshots: ForexPoolDailySnapshot[] = [];\n const now = new Date();\n\n // Work backward: start with a smaller balance 60 days ago\n let balance = currentSize * rand(0.82, 0.88);\n let cumulativePnl = 0;\n\n for (let i = 59; i >= 0; i--) {\n const day = new Date(now);\n day.setDate(day.getDate() - i);\n const dayOfWeek = day.getDay();\n const isWeekend = dayOfWeek === 0 || dayOfWeek === 6;\n\n const openBalance = balance;\n\n // Weekend activity ~20% of weekday\n const activityMultiplier = isWeekend ? 0.2 : 1.0;\n\n // Daily PnL with occasional drawdowns (1-2 per week)\n const isDrawdown = !isWeekend && Math.random() < 0.2; // ~1.4/week\n let dailyPnlPct: number;\n if (isDrawdown) {\n dailyPnlPct = -rand(0.0001, params.stddevPnlPct * 2);\n } else {\n dailyPnlPct = this.gaussianRandom(params.meanDailyPnlPct, params.stddevPnlPct);\n }\n dailyPnlPct *= activityMultiplier;\n\n const dailyPnl = balance * dailyPnlPct;\n cumulativePnl += dailyPnl;\n\n // Net deposits: organic growth with slight positive bias\n const depositCount = isWeekend\n ? randInt(1, Math.ceil(params.depositsPerDay[0] * 0.2))\n : randInt(params.depositsPerDay[0], params.depositsPerDay[1]);\n const withdrawalCount = isWeekend\n ? randInt(0, Math.ceil(params.withdrawalsPerDay[0] * 0.2))\n : randInt(params.withdrawalsPerDay[0], params.withdrawalsPerDay[1]);\n\n const deposits = depositCount * params.avgDepositSize * rand(0.7, 1.3) * activityMultiplier;\n const withdrawals = withdrawalCount * params.avgWithdrawalSize * rand(0.7, 1.3) * activityMultiplier;\n const netFlow = deposits - withdrawals;\n\n balance += dailyPnl + netFlow;\n\n const txCount = depositCount + withdrawalCount + Math.round(params.profitDistPerDay * activityMultiplier);\n const utilization = rand(params.utilizationMin, params.utilizationMax);\n const activeUsers = Math.round(rand(80, 400) * activityMultiplier);\n\n snapshots.push({\n poolId,\n date: formatDate(day),\n openBalance,\n closeBalance: balance,\n deposits,\n withdrawals,\n netFlow,\n dailyPnl,\n dailyPnlPct,\n cumulativePnl,\n utilization,\n txCount,\n activeUsers,\n });\n }\n\n return snapshots;\n }\n\n private generatePoolTransactions(\n poolId: ForexPoolType,\n snapshots: ForexPoolDailySnapshot[],\n ): ForexPoolTransaction[] {\n const params = POOL_PARAMS[poolId];\n const transactions: ForexPoolTransaction[] = [];\n\n for (const snap of snapshots) {\n const day = new Date(snap.date);\n const dayOfWeek = day.getDay();\n const isWeekend = dayOfWeek === 0 || dayOfWeek === 6;\n const mult = isWeekend ? 0.2 : 1.0;\n\n const depositCount = Math.round(randInt(params.depositsPerDay[0], params.depositsPerDay[1]) * mult);\n const withdrawalCount = Math.round(randInt(params.withdrawalsPerDay[0], params.withdrawalsPerDay[1]) * mult);\n const profitCount = Math.round(params.profitDistPerDay * mult);\n\n // Deposits\n for (let i = 0; i < depositCount; i++) {\n const amount = rand(params.avgDepositSize * 0.3, params.avgDepositSize * 2.0);\n const ts = day.getTime() + randInt(0, 23) * 3600000 + randInt(0, 3600000);\n transactions.push({\n id: genId('dep'),\n poolId,\n type: 'deposit',\n amount,\n balanceBefore: 0,\n balanceAfter: 0,\n txHash: genTxHash(),\n blockNumber: this.baseBlockNumber + Math.floor(ts / 12000) + randInt(0, 50),\n timestamp: ts,\n description: `Deposit to ${poolId} pool`,\n });\n }\n\n // Withdrawals\n for (let i = 0; i < withdrawalCount; i++) {\n const amount = rand(params.avgWithdrawalSize * 0.3, params.avgWithdrawalSize * 2.0);\n const ts = day.getTime() + randInt(0, 23) * 3600000 + randInt(0, 3600000);\n transactions.push({\n id: genId('wdr'),\n poolId,\n type: 'withdrawal',\n amount: -amount,\n balanceBefore: 0,\n balanceAfter: 0,\n txHash: genTxHash(),\n blockNumber: this.baseBlockNumber + Math.floor(ts / 12000) + randInt(0, 50),\n timestamp: ts,\n description: `Withdrawal from ${poolId} pool`,\n });\n }\n\n // Profit distributions\n for (let i = 0; i < profitCount; i++) {\n const amount = rand(500, 8000);\n const ts = day.getTime() + randInt(6, 22) * 3600000 + randInt(0, 3600000);\n transactions.push({\n id: genId('prd'),\n poolId,\n type: 'profit_distribution',\n amount,\n balanceBefore: 0,\n balanceAfter: 0,\n txHash: genTxHash(),\n blockNumber: this.baseBlockNumber + Math.floor(ts / 12000) + randInt(0, 50),\n timestamp: ts,\n description: `Profit distribution from ${poolId} pool`,\n });\n }\n\n // Fee collection (1-2 per day on weekdays)\n if (!isWeekend) {\n const feeCount = randInt(1, 2);\n for (let i = 0; i < feeCount; i++) {\n const amount = rand(100, 3000);\n const ts = day.getTime() + randInt(8, 20) * 3600000;\n transactions.push({\n id: genId('fee'),\n poolId,\n type: 'fee_collection',\n amount,\n balanceBefore: 0,\n balanceAfter: 0,\n txHash: genTxHash(),\n blockNumber: this.baseBlockNumber + Math.floor(ts / 12000) + randInt(0, 50),\n timestamp: ts,\n description: `Fee collection for ${poolId} pool`,\n });\n }\n }\n }\n\n return transactions;\n }\n\n private gaussianRandom(mean: number, stddev: number): number {\n let u = 0, v = 0;\n while (u === 0) u = Math.random();\n while (v === 0) v = Math.random();\n const z = Math.sqrt(-2.0 * Math.log(u)) * Math.cos(2.0 * Math.PI * v);\n return mean + z * stddev;\n }\n\n private getTxDescription(type: ForexPoolTransactionType, poolId: ForexPoolType, amount: number): string {\n const fmt = `$${amount.toLocaleString(undefined, { maximumFractionDigits: 0 })}`;\n switch (type) {\n case 'deposit': return `Deposit ${fmt} to ${poolId} pool`;\n case 'withdrawal': return `Withdrawal ${fmt} from ${poolId} pool`;\n case 'profit_distribution': return `Profit distribution ${fmt} from ${poolId}`;\n case 'loss_absorption': return `Loss absorbed ${fmt} by ${poolId} pool`;\n case 'inter_pool_transfer': return `Inter-pool transfer ${fmt}`;\n case 'fee_collection': return `Fee collected ${fmt} in ${poolId}`;\n case 'reserve_rebalance': return `Reserve rebalance ${fmt} in ${poolId}`;\n default: return `${type} ${fmt}`;\n }\n }\n}\n\n// ── Singleton Export ──────────────────────────────────────────────────────────\n\nlet _instance: ForexPoolDataGeneratorClass | null = null;\n\nexport const ForexPoolDataGenerator = {\n getInstance(): ForexPoolDataGeneratorClass {\n if (!_instance) {\n _instance = new ForexPoolDataGeneratorClass();\n }\n return _instance;\n },\n};\n","// ForexSimulationEngine.ts - StableFX RFQ+PvP on-chain forex simulation engine\n// Simulates Circle StableFX-style foreign exchange operations using USDC stablecoin pairs\n\nimport type {\n ForexLogEntry,\n ForexLogType,\n ForexCurrencyPair,\n ForexTradeRecord,\n ForexPosition,\n ForexPoolTransaction,\n} from '../../types/forex';\nimport { FOREX_CURRENCY_PAIRS } from '../../types/forex';\n\n// ── Types ──────────────────────────────────────────────────────────────────────\n\ntype LogCallback = (entry: ForexLogEntry) => void;\ntype PoolTxCallback = (tx: ForexPoolTransaction) => void;\n\ninterface PairState {\n pair: ForexCurrencyPair;\n currentPrice: number;\n bidPrice: number;\n askPrice: number;\n lastSpread: number;\n}\n\n// ── Helpers ────────────────────────────────────────────────────────────────────\n\nlet idCounter = 0;\nfunction genId(): string {\n return `fxlog_${Date.now()}_${++idCounter}`;\n}\n\nfunction tradeId(): string {\n return `FXT_${Date.now().toString(36).toUpperCase()}_${(++idCounter).toString(36).toUpperCase()}`;\n}\n\nfunction rand(min: number, max: number): number {\n return min + Math.random() * (max - min);\n}\n\nfunction randInt(min: number, max: number): number {\n return Math.floor(rand(min, max + 1));\n}\n\nfunction pick<T>(arr: T[]): T {\n return arr[Math.floor(Math.random() * arr.length)];\n}\n\nfunction formatRate(price: number, pair: ForexCurrencyPair): string {\n if (pair.pipSize >= 0.01) return price.toFixed(3);\n return price.toFixed(5);\n}\n\n// ── News Headlines ───────────────────────────────────────────────────────────\n\nconst FX_NEWS = [\n 'ECB signals potential rate adjustment, EUR pairs volatile',\n 'BOJ maintains yield curve control, JPY weakens further',\n 'Fed minutes reveal hawkish sentiment, USD strengthens',\n 'UK CPI data beats expectations, GBP rallies',\n 'RBA holds rates steady, AUD consolidates',\n 'SNB intervenes in currency markets, CHF stabilizes',\n 'Bank of Canada rate decision pending, CAD in focus',\n 'Cross-border stablecoin settlement volume hits $2.1B daily',\n 'Circle USDC reserves fully backed, attestation report released',\n 'DeFi forex protocol TVL reaches new high at $890M',\n 'On-chain FX liquidity deepens across major pairs',\n 'Institutional adoption of on-chain forex accelerates',\n];\n\n// ── Engine ─────────────────────────────────────────────────────────────────────\n\nclass ForexSimulationEngine {\n private listeners: LogCallback[] = [];\n private poolTxListeners: PoolTxCallback[] = [];\n private cycleTimer: ReturnType<typeof setTimeout> | null = null;\n private pairStates: Map<string, PairState> = new Map();\n private running = false;\n private openPositions: ForexPosition[] = [];\n private totalPnl = 0;\n private totalTrades = 0;\n private totalPips = 0;\n private totalLots = 0;\n\n constructor() {\n for (const pair of FOREX_CURRENCY_PAIRS) {\n const jitter = pair.basePrice * rand(-0.003, 0.003);\n const price = pair.basePrice + jitter;\n const halfSpread = pair.spreadPips * pair.pipSize / 2;\n this.pairStates.set(pair.id, {\n pair,\n currentPrice: price,\n bidPrice: price - halfSpread,\n askPrice: price + halfSpread,\n lastSpread: pair.spreadPips,\n });\n }\n }\n\n // ── Public API ─────────────────────────────────────────────────────────────\n\n start(): void {\n this.running = true;\n this.scheduleCycle();\n }\n\n stop(): void {\n this.running = false;\n if (this.cycleTimer) {\n clearTimeout(this.cycleTimer);\n this.cycleTimer = null;\n }\n }\n\n onLog(callback: LogCallback): () => void {\n this.listeners.push(callback);\n return () => {\n this.listeners = this.listeners.filter(l => l !== callback);\n };\n }\n\n onPoolTransaction(callback: PoolTxCallback): () => void {\n this.poolTxListeners.push(callback);\n return () => {\n this.poolTxListeners = this.poolTxListeners.filter(l => l !== callback);\n };\n }\n\n isRunning(): boolean {\n return this.running;\n }\n\n getStats(): { totalPnl: number; totalTrades: number; totalPips: number; totalLots: number; positions: number } {\n return {\n totalPnl: this.totalPnl,\n totalTrades: this.totalTrades,\n totalPips: this.totalPips,\n totalLots: this.totalLots,\n positions: this.openPositions.length,\n };\n }\n\n getPairStates(): Map<string, PairState> {\n return this.pairStates;\n }\n\n emitBootSequence(): void {\n const bootMessages: Array<{ msg: string; delay: number }> = [\n { msg: 'Initializing StableFX Engine v2.1.0...', delay: 0 },\n { msg: 'Connecting to Circle StableFX RFQ network...', delay: 500 },\n { msg: 'Loading USDC stablecoin pair feeds (6 pairs)...', delay: 1200 },\n { msg: 'Calibrating PvP settlement engine...', delay: 2000 },\n { msg: 'Initializing clearing pool ($12.5M)...', delay: 2800 },\n { msg: 'Initializing hedging pool ($7.5M)...', delay: 3400 },\n { msg: 'Initializing insurance pool ($5.0M)...', delay: 4000 },\n { msg: 'Risk management module online (max exposure: 25%)', delay: 4500 },\n { msg: '=== StableFX Engine ready. Starting RFQ cycles ===', delay: 5000 },\n ];\n\n for (const { msg, delay } of bootMessages) {\n setTimeout(() => {\n this.emit({\n id: genId(),\n timestamp: Date.now(),\n type: 'SYSTEM',\n message: msg,\n importance: 'medium',\n });\n }, delay);\n }\n }\n\n destroy(): void {\n this.stop();\n this.listeners = [];\n this.poolTxListeners = [];\n this.pairStates.clear();\n this.openPositions = [];\n }\n\n // ── Private Methods ────────────────────────────────────────────────────────\n\n private emit(entry: ForexLogEntry): void {\n for (const listener of this.listeners) {\n listener(entry);\n }\n }\n\n private emitPoolTx(tx: ForexPoolTransaction): void {\n for (const listener of this.poolTxListeners) {\n listener(tx);\n }\n }\n\n private generatePoolTxFromEvent(\n type: 'SETTLE' | 'HEDGE' | 'CLEAR',\n data: { pnl?: number; volume?: number; lots?: number },\n ): void {\n try {\n const { ForexPoolDataGenerator } = require('./ForexPoolDataGenerator');\n const generator = ForexPoolDataGenerator.getInstance();\n\n if (type === 'SETTLE' && data.pnl !== undefined) {\n const tx = generator.generateLiveTransaction('clearing', 'fee_collection', Math.abs(data.pnl) * rand(0.001, 0.003));\n this.emitPoolTx(tx);\n } else if (type === 'HEDGE') {\n const tx = generator.generateLiveTransaction('hedging', data.pnl && data.pnl < 0 ? 'loss_absorption' : 'profit_distribution', Math.abs(data.lots || 1) * rand(50, 200));\n this.emitPoolTx(tx);\n } else if (type === 'CLEAR') {\n const tx = generator.generateLiveTransaction('clearing', 'profit_distribution', (data.volume || 100000) * rand(0.0001, 0.0005));\n this.emitPoolTx(tx);\n }\n } catch {\n // Generator not available\n }\n }\n\n private scheduleCycle(): void {\n if (!this.running) return;\n const interval = rand(8000, 14000);\n this.cycleTimer = setTimeout(() => {\n if (this.running) {\n this.runTradeCycle();\n this.scheduleCycle();\n }\n }, interval);\n }\n\n private simulatePrice(pairId: string): number {\n const state = this.pairStates.get(pairId);\n if (!state) return 0;\n const volatility = state.pair.id.includes('JPYC') ? 0.0008 : 0.0004;\n const drift = rand(-volatility, volatility);\n const newPrice = state.currentPrice * (1 + drift);\n const halfSpread = (state.pair.spreadPips + rand(-0.3, 0.3)) * state.pair.pipSize / 2;\n state.currentPrice = newPrice;\n state.bidPrice = newPrice - halfSpread;\n state.askPrice = newPrice + halfSpread;\n state.lastSpread = halfSpread * 2 / state.pair.pipSize;\n return newPrice;\n }\n\n private runTradeCycle(): void {\n const pairState = pick(Array.from(this.pairStates.values()));\n const pair = pairState.pair;\n const entries: Array<{ entry: Omit<ForexLogEntry, 'id' | 'timestamp'>; delay: number }> = [];\n let delay = 0;\n\n // Update price\n const price = this.simulatePrice(pair.id);\n\n // 1. RFQ - Request for Quote\n const side = Math.random() > 0.5 ? 'BUY' : 'SELL';\n const lots = parseFloat((rand(0.1, 2.5)).toFixed(2));\n const notional = lots * 100000;\n const rfqId = tradeId();\n\n entries.push({\n entry: {\n type: 'RFQ',\n message: `RFQ ${rfqId} | ${pair.symbol} ${side} ${lots.toFixed(2)} lots ($${(notional / 1000).toFixed(0)}K) | Mid: ${formatRate(price, pair)}`,\n data: { rfqId, pair: pair.id, side, lots, price },\n importance: 'medium',\n pairId: pair.id,\n },\n delay,\n });\n delay += rand(400, 800);\n\n // 2. QUOTE - Price quote from LP\n const quoteSpread = rand(0.5, 2.0) * pair.pipSize;\n const quotePrice = side === 'BUY'\n ? price + quoteSpread\n : price - quoteSpread;\n const quotePips = Math.abs(quotePrice - price) / pair.pipSize;\n\n entries.push({\n entry: {\n type: 'QUOTE',\n message: `QUOTE ${rfqId} | ${pair.symbol} @ ${formatRate(quotePrice, pair)} | Spread: ${quotePips.toFixed(1)} pips | Valid: 3s`,\n data: { rfqId, quotePrice, spread: quotePips },\n importance: 'medium',\n pairId: pair.id,\n },\n delay,\n });\n delay += rand(500, 1000);\n\n // 3. MATCH - Trade matching (85% success rate)\n const matched = Math.random() < 0.85;\n if (matched) {\n const matchPrice = quotePrice * (1 + rand(-0.00005, 0.00005));\n entries.push({\n entry: {\n type: 'MATCH',\n message: `MATCH ${rfqId} | ${pair.symbol} ${side} @ ${formatRate(matchPrice, pair)} | ${lots.toFixed(2)} lots | Counterparty: LP-${randInt(1, 8)}`,\n data: { rfqId, matchPrice, counterparty: `LP-${randInt(1, 8)}` },\n importance: 'high',\n pairId: pair.id,\n },\n delay,\n });\n delay += rand(1000, 2500);\n\n // 4. SETTLE - PvP Settlement\n const settlePrice = matchPrice * (1 + rand(-0.00002, 0.00002));\n const pips = ((settlePrice - price) / pair.pipSize) * (side === 'BUY' ? 1 : -1);\n const pnl = pips * pair.pipSize * lots * 100000;\n\n entries.push({\n entry: {\n type: 'SETTLE',\n message: `SETTLE ${rfqId} | PvP confirmed | ${pair.symbol} @ ${formatRate(settlePrice, pair)} | P&L: ${pips >= 0 ? '+' : ''}${pips.toFixed(1)} pips ($${pnl >= 0 ? '+' : ''}${pnl.toFixed(2)})`,\n data: { rfqId, settlePrice, pips, pnl, pvp: true },\n importance: 'high',\n pairId: pair.id,\n },\n delay,\n });\n delay += rand(300, 600);\n\n // 5. PVP - Settlement confirmation\n entries.push({\n entry: {\n type: 'PVP',\n message: `PvP ${rfqId} | Atomic settlement confirmed on-chain | USDC transferred: $${notional.toLocaleString()} | Gas: ~$0.${randInt(10, 50)}`,\n data: { rfqId, settled: true, gasWei: randInt(10, 50) },\n importance: 'medium',\n pairId: pair.id,\n },\n delay,\n });\n\n // Generate pool transaction for settlement\n this.generatePoolTxFromEvent('SETTLE', { pnl });\n\n // Update stats\n this.totalTrades++;\n this.totalPnl += pnl;\n this.totalPips += pips;\n this.totalLots += lots;\n\n // Update positions\n if (Math.random() < 0.4) {\n this.openPositions.push({\n id: rfqId,\n pairId: pair.id,\n side: side as 'BUY' | 'SELL',\n lots,\n pips,\n entryPrice: matchPrice,\n currentPrice: settlePrice,\n pnl,\n openTime: Date.now(),\n });\n if (this.openPositions.length > 5) {\n this.openPositions.shift();\n }\n }\n } else {\n entries.push({\n entry: {\n type: 'MATCH',\n message: `MATCH FAILED ${rfqId} | ${pair.symbol} | No counterparty at requested price | Requoting...`,\n data: { rfqId, matched: false },\n importance: 'low',\n pairId: pair.id,\n },\n delay,\n });\n }\n\n // 6. HEDGE - Pool hedging operations (20% chance)\n if (Math.random() < 0.2) {\n delay += rand(400, 800);\n const hedgePair = pick(FOREX_CURRENCY_PAIRS);\n const hedgeLots = parseFloat(rand(0.5, 5.0).toFixed(2));\n const hedgeDirection = Math.random() > 0.5 ? 'LONG' : 'SHORT';\n entries.push({\n entry: {\n type: 'HEDGE',\n message: `HEDGE | ${hedgePair.symbol} ${hedgeDirection} ${hedgeLots.toFixed(2)} lots | Pool delta neutralization | Exposure: ${rand(5, 20).toFixed(1)}%`,\n data: { pair: hedgePair.id, direction: hedgeDirection, lots: hedgeLots },\n importance: 'medium',\n },\n delay,\n });\n this.generatePoolTxFromEvent('HEDGE', { lots: hedgeLots });\n }\n\n // 7. CLEAR - Clearing pool operations (15% chance)\n if (Math.random() < 0.15) {\n delay += rand(300, 600);\n const clearAmount = randInt(50000, 500000);\n entries.push({\n entry: {\n type: 'CLEAR',\n message: `CLEAR | Netting cycle complete | Volume: $${(clearAmount / 1000).toFixed(0)}K | Pairs settled: ${randInt(2, 6)} | Pool util: ${rand(60, 85).toFixed(1)}%`,\n data: { volume: clearAmount, pairsSettled: randInt(2, 6) },\n importance: 'low',\n },\n delay,\n });\n this.generatePoolTxFromEvent('CLEAR', { volume: clearAmount });\n }\n\n // 8. POSITION - Position update (25% chance)\n if (this.openPositions.length > 0 && Math.random() < 0.25) {\n delay += rand(300, 600);\n const posUpdates = this.openPositions.slice(0, 3).map(pos => {\n const pState = this.pairStates.get(pos.pairId);\n if (pState) {\n pos.currentPrice = pState.currentPrice;\n pos.pips = ((pos.currentPrice - pos.entryPrice) / pState.pair.pipSize) * (pos.side === 'BUY' ? 1 : -1);\n pos.pnl = pos.pips * pState.pair.pipSize * pos.lots * 100000;\n }\n return `${pState?.pair.symbol || pos.pairId} ${pos.side}: ${pos.pips >= 0 ? '+' : ''}${pos.pips.toFixed(1)} pips`;\n });\n entries.push({\n entry: {\n type: 'POSITION',\n message: `POSITION | ${posUpdates.join(' | ')} | Open: ${this.openPositions.length}`,\n data: { positions: this.openPositions.length },\n importance: 'low',\n },\n delay,\n });\n\n // Close old positions\n if (this.openPositions.length > 2 && Math.random() < 0.3) {\n const closed = this.openPositions.shift()!;\n this.totalPnl += closed.pnl * rand(0.01, 0.03);\n }\n }\n\n // 9. PNL - Periodic P&L summary (30% chance)\n if (Math.random() < 0.3) {\n delay += rand(300, 600);\n entries.push({\n entry: {\n type: 'PNL',\n message: `PNL | Session: $${this.totalPnl >= 0 ? '+' : ''}${this.totalPnl.toFixed(2)} | Trades: ${this.totalTrades} | Pips: ${this.totalPips >= 0 ? '+' : ''}${this.totalPips.toFixed(1)} | Lots: ${this.totalLots.toFixed(2)}`,\n data: { totalPnl: this.totalPnl, totalTrades: this.totalTrades, totalPips: this.totalPips },\n importance: 'medium',\n },\n delay,\n });\n }\n\n // 10. NEWS (10% chance)\n if (Math.random() < 0.1) {\n delay += rand(300, 600);\n entries.push({\n entry: {\n type: 'SYSTEM',\n message: `[Market] ${pick(FX_NEWS)}`,\n importance: 'medium',\n },\n delay,\n });\n }\n\n // Emit all entries with delays\n for (const { entry, delay: d } of entries) {\n setTimeout(() => {\n if (this.running) {\n this.emit({\n ...entry,\n id: genId(),\n timestamp: Date.now(),\n });\n }\n }, d);\n }\n }\n}\n\n// ── Singleton Export ──────────────────────────────────────────────────────────\n\nexport const forexSimulationEngine = new ForexSimulationEngine();\nexport type { PairState };\n","// BotSimulationEngine.ts - Core simulation engine for trading bot console\n// Runs independent simulation loops for each strategy bot with distinct personalities\n\n// ── Types ──────────────────────────────────────────────────────────────────────\n\nexport type BotLogType =\n | 'SCAN'\n | 'INDICATOR'\n | 'NEWS'\n | 'SIGNAL'\n | 'ANALYSIS'\n | 'DECISION'\n | 'ORDER'\n | 'FILLED'\n | 'PNL'\n | 'RISK'\n | 'SYSTEM'\n | 'STRATEGY' // Strategy reasoning and context\n | 'THINKING'; // AI thinking process\n\nexport interface BotLogEntry {\n id: string;\n timestamp: number;\n strategyId: string;\n strategyName: string;\n type: BotLogType;\n message: string;\n data?: Record<string, any>;\n importance: 'low' | 'medium' | 'high';\n}\n\nexport interface IndicatorSnapshot {\n rsi: number;\n macd: { value: number; signal: number; histogram: number };\n ema: { short: number; long: number; crossover: 'golden' | 'death' | 'none' };\n bollinger: { upper: number; middle: number; lower: number; width: number; position: number };\n volume: { current: number; average: number; ratio: number };\n}\n\nexport interface BotState {\n strategyId: string;\n strategyName: string;\n isRunning: boolean;\n currentPair: string;\n currentPrice: number;\n indicators: IndicatorSnapshot;\n openPositions: OpenPosition[];\n totalPnl: number;\n totalTrades: number;\n winRate: number;\n lastSignal: string;\n lastSignalConfidence: number;\n}\n\ninterface OpenPosition {\n id: string;\n pair: string;\n side: 'LONG' | 'SHORT';\n entryPrice: number;\n currentPrice: number;\n size: number;\n leverage: number;\n pnl: number;\n pnlPercent: number;\n}\n\nexport interface StrategyPersonality {\n id: string;\n name: string;\n shortName: string;\n color: string;\n scanIntervalMin: number;\n scanIntervalMax: number;\n tradeFrequency: number;\n positionSizeMin: number;\n positionSizeMax: number;\n leverageMin: number;\n leverageMax: number;\n primaryIndicators: string[];\n riskTolerance: 'low' | 'medium' | 'high';\n preferredPairs: string[];\n rsiBias: number;\n // Yield configuration\n tier: InvestmentTier;\n dailyYieldMin: number; // Min daily interest rate (%)\n dailyYieldMax: number; // Max daily interest rate (%)\n description: string;\n category: StrategyCategory;\n}\n\nexport type StrategyCategory =\n | 'conservative' // 保守型 - 稳健收益\n | 'balanced' // 平衡型 - 风险收益均衡\n | 'growth' // 成长型 - 较高收益\n | 'aggressive' // 激进型 - 高风险高收益\n | 'quantitative'; // 量化型 - AI驱动\n\nexport type InvestmentTier = 'starter' | 'basic' | 'standard' | 'premium' | 'elite' | 'vip';\n\n// ── Investment Tier Configuration ─────────────────────────────────────────────\n\nexport interface TierConfig {\n id: InvestmentTier;\n name: string;\n nameCn: string;\n minInvestment: number;\n maxInvestment: number;\n color: string;\n icon: string;\n}\n\nexport const INVESTMENT_TIERS: Record<InvestmentTier, TierConfig> = {\n starter: {\n id: 'starter',\n name: 'Starter',\n nameCn: '入门版',\n minInvestment: 100,\n maxInvestment: 999,\n color: '#6B7280',\n icon: '🌱',\n },\n basic: {\n id: 'basic',\n name: 'Basic',\n nameCn: '基础版',\n minInvestment: 1000,\n maxInvestment: 4999,\n color: '#3B82F6',\n icon: '📊',\n },\n standard: {\n id: 'standard',\n name: 'Standard',\n nameCn: '标准版',\n minInvestment: 5000,\n maxInvestment: 19999,\n color: '#10B981',\n icon: '💎',\n },\n premium: {\n id: 'premium',\n name: 'Premium',\n nameCn: '高级版',\n minInvestment: 20000,\n maxInvestment: 49999,\n color: '#8B5CF6',\n icon: '👑',\n },\n elite: {\n id: 'elite',\n name: 'Elite',\n nameCn: '精英版',\n minInvestment: 50000,\n maxInvestment: 99999,\n color: '#F59E0B',\n icon: '🏆',\n },\n vip: {\n id: 'vip',\n name: 'VIP',\n nameCn: 'VIP专属',\n minInvestment: 100000,\n maxInvestment: Infinity,\n color: '#EF4444',\n icon: '🔥',\n },\n};\n\n// ── Investment Cycle Configuration ────────────────────────────────────────────\n\nexport interface CycleConfig {\n id: string;\n days: number;\n name: string;\n nameCn: string;\n profitSharePercent: number; // Platform takes this %, user gets (100 - this)%\n bonusMultiplier: number; // Bonus yield multiplier for longer cycles\n earlyWithdrawPenalty: number; // Penalty % for early withdrawal\n}\n\nexport const INVESTMENT_CYCLES: CycleConfig[] = [\n {\n id: 'flexible',\n days: 0,\n name: 'Flexible',\n nameCn: '灵活期',\n profitSharePercent: 30, // Platform 30%, User 70%\n bonusMultiplier: 1.0,\n earlyWithdrawPenalty: 0,\n },\n {\n id: 'week',\n days: 7,\n name: '7 Days',\n nameCn: '7天期',\n profitSharePercent: 25, // Platform 25%, User 75%\n bonusMultiplier: 1.1,\n earlyWithdrawPenalty: 5,\n },\n {\n id: 'biweek',\n days: 14,\n name: '14 Days',\n nameCn: '14天期',\n profitSharePercent: 22, // Platform 22%, User 78%\n bonusMultiplier: 1.2,\n earlyWithdrawPenalty: 8,\n },\n {\n id: 'month',\n days: 30,\n name: '30 Days',\n nameCn: '30天期',\n profitSharePercent: 20, // Platform 20%, User 80%\n bonusMultiplier: 1.35,\n earlyWithdrawPenalty: 10,\n },\n {\n id: 'quarter',\n days: 90,\n name: '90 Days',\n nameCn: '90天期',\n profitSharePercent: 15, // Platform 15%, User 85%\n bonusMultiplier: 1.5,\n earlyWithdrawPenalty: 15,\n },\n {\n id: 'halfyear',\n days: 180,\n name: '180 Days',\n nameCn: '180天期',\n profitSharePercent: 12, // Platform 12%, User 88%\n bonusMultiplier: 1.8,\n earlyWithdrawPenalty: 20,\n },\n {\n id: 'year',\n days: 365,\n name: '365 Days',\n nameCn: '365天期',\n profitSharePercent: 10, // Platform 10%, User 90%\n bonusMultiplier: 2.0,\n earlyWithdrawPenalty: 25,\n },\n];\n\n// ── Yield Calculator ──────────────────────────────────────────────────────────\n\nexport function calculateDailyYield(\n strategy: StrategyPersonality,\n tier: InvestmentTier,\n cycle: CycleConfig\n): { grossYield: number; netYield: number; platformFee: number } {\n // Base yield from strategy\n const baseYield = (strategy.dailyYieldMin + strategy.dailyYieldMax) / 2;\n\n // Tier bonus (higher tiers get slightly better rates)\n const tierBonuses: Record<InvestmentTier, number> = {\n starter: 0,\n basic: 0.02,\n standard: 0.05,\n premium: 0.08,\n elite: 0.12,\n vip: 0.15,\n };\n\n // Calculate gross yield with bonuses\n const grossYield = baseYield * cycle.bonusMultiplier * (1 + tierBonuses[tier]);\n\n // Calculate platform fee and net yield\n const platformFee = grossYield * (cycle.profitSharePercent / 100);\n const netYield = grossYield - platformFee;\n\n return { grossYield, netYield, platformFee };\n}\n\nexport function estimateReturns(\n principal: number,\n strategy: StrategyPersonality,\n tier: InvestmentTier,\n cycle: CycleConfig\n): {\n dailyReturn: number;\n totalReturn: number;\n finalAmount: number;\n platformProfit: number;\n userProfit: number;\n apr: number;\n} {\n const { netYield, platformFee } = calculateDailyYield(strategy, tier, cycle);\n const days = cycle.days || 30; // Default to 30 days for flexible\n\n const dailyReturn = principal * (netYield / 100);\n const totalReturn = dailyReturn * days;\n const finalAmount = principal + totalReturn;\n const platformProfit = principal * (platformFee / 100) * days;\n const userProfit = totalReturn;\n const apr = netYield * 365;\n\n return { dailyReturn, totalReturn, finalAmount, platformProfit, userProfit, apr };\n}\n\ntype LogCallback = (entry: BotLogEntry) => void;\n\n// ── Strategy Personalities ─────────────────────────────────────────────────────\n\nexport const STRATEGY_PERSONALITIES: StrategyPersonality[] = [\n // ═══════════════════════════════════════════════════════════════════════════\n // CONSERVATIVE STRATEGIES (保守型) - Low risk, stable returns\n // ═══════════════════════════════════════════════════════════════════════════\n {\n id: 'stable-yield-01',\n name: 'Stable Yield',\n shortName: 'STB',\n color: '#6B7280',\n scanIntervalMin: 80000,\n scanIntervalMax: 120000,\n tradeFrequency: 0.15,\n positionSizeMin: 5,\n positionSizeMax: 15,\n leverageMin: 1,\n leverageMax: 3,\n primaryIndicators: ['Bollinger', 'Volume'],\n riskTolerance: 'low',\n preferredPairs: ['BTC/USDT', 'ETH/USDT'],\n rsiBias: 45,\n tier: 'starter',\n dailyYieldMin: 0.15,\n dailyYieldMax: 0.25,\n description: '稳健收益策略,低风险低波动,适合新手入门',\n category: 'conservative',\n },\n {\n id: 'conservative-shield-01',\n name: 'Conservative Shield',\n shortName: 'CON',\n color: '#10B981',\n scanIntervalMin: 60000,\n scanIntervalMax: 90000,\n tradeFrequency: 0.25,\n positionSizeMin: 10,\n positionSizeMax: 20,\n leverageMin: 2,\n leverageMax: 5,\n primaryIndicators: ['Bollinger', 'Volume', 'RSI'],\n riskTolerance: 'low',\n preferredPairs: ['BTC/USDT', 'ETH/USDT'],\n rsiBias: 45,\n tier: 'basic',\n dailyYieldMin: 0.25,\n dailyYieldMax: 0.40,\n description: '保守防御策略,注重资金安全,稳定收益',\n category: 'conservative',\n },\n\n // ═══════════════════════════════════════════════════════════════════════════\n // BALANCED STRATEGIES (平衡型) - Moderate risk, balanced returns\n // ═══════════════════════════════════════════════════════════════════════════\n {\n id: 'balanced-alpha-01',\n name: 'Balanced Alpha',\n shortName: 'BAL',\n color: '#3B82F6',\n scanIntervalMin: 45000,\n scanIntervalMax: 70000,\n tradeFrequency: 0.4,\n positionSizeMin: 15,\n positionSizeMax: 35,\n leverageMin: 3,\n leverageMax: 10,\n primaryIndicators: ['RSI', 'MACD'],\n riskTolerance: 'medium',\n preferredPairs: ['BTC/USDT', 'ETH/USDT', 'SOL/USDT'],\n rsiBias: 50,\n tier: 'standard',\n dailyYieldMin: 0.40,\n dailyYieldMax: 0.65,\n description: '平衡型策略,风险收益均衡,适合稳健投资者',\n category: 'balanced',\n },\n {\n id: 'smart-rebalance-01',\n name: 'Smart Rebalance',\n shortName: 'SRB',\n color: '#06B6D4',\n scanIntervalMin: 50000,\n scanIntervalMax: 75000,\n tradeFrequency: 0.35,\n positionSizeMin: 12,\n positionSizeMax: 30,\n leverageMin: 3,\n leverageMax: 8,\n primaryIndicators: ['RSI', 'EMA', 'Volume'],\n riskTolerance: 'medium',\n preferredPairs: ['BTC/USDT', 'ETH/USDT', 'BNB/USDT', 'SOL/USDT'],\n rsiBias: 50,\n tier: 'standard',\n dailyYieldMin: 0.45,\n dailyYieldMax: 0.70,\n description: '智能再平衡策略,动态调整持仓,优化收益',\n category: 'balanced',\n },\n\n // ═══════════════════════════════════════════════════════════════════════════\n // GROWTH STRATEGIES (成长型) - Higher risk, higher returns\n // ═══════════════════════════════════════════════════════════════════════════\n {\n id: 'growth-momentum-01',\n name: 'Growth Momentum',\n shortName: 'GRO',\n color: '#8B5CF6',\n scanIntervalMin: 40000,\n scanIntervalMax: 60000,\n tradeFrequency: 0.45,\n positionSizeMin: 20,\n positionSizeMax: 40,\n leverageMin: 5,\n leverageMax: 12,\n primaryIndicators: ['RSI', 'MACD', 'EMA'],\n riskTolerance: 'medium',\n preferredPairs: ['BTC/USDT', 'ETH/USDT', 'SOL/USDT', 'AVAX/USDT'],\n rsiBias: 52,\n tier: 'premium',\n dailyYieldMin: 0.60,\n dailyYieldMax: 0.95,\n description: '成长动量策略,追求较高收益,适合有经验投资者',\n category: 'growth',\n },\n {\n id: 'trend-hunter-01',\n name: 'Trend Hunter',\n shortName: 'TRH',\n color: '#EC4899',\n scanIntervalMin: 38000,\n scanIntervalMax: 55000,\n tradeFrequency: 0.48,\n positionSizeMin: 22,\n positionSizeMax: 42,\n leverageMin: 5,\n leverageMax: 15,\n primaryIndicators: ['EMA', 'MACD', 'Volume', 'Bollinger'],\n riskTolerance: 'medium',\n preferredPairs: ['BTC/USDT', 'ETH/USDT', 'SOL/USDT', 'ARB/USDT', 'OP/USDT'],\n rsiBias: 53,\n tier: 'premium',\n dailyYieldMin: 0.65,\n dailyYieldMax: 1.00,\n description: '趋势猎手策略,捕捉市场趋势,追求超额收益',\n category: 'growth',\n },\n\n // ═══════════════════════════════════════════════════════════════════════════\n // AGGRESSIVE STRATEGIES (激进型) - High risk, high returns\n // ═══════════════════════════════════════════════════════════════════════════\n {\n id: 'aggressive-momentum-01',\n name: 'Aggressive Momentum',\n shortName: 'AGG',\n color: '#EF4444',\n scanIntervalMin: 35000,\n scanIntervalMax: 55000,\n tradeFrequency: 0.5,\n positionSizeMin: 25,\n positionSizeMax: 50,\n leverageMin: 5,\n leverageMax: 20,\n primaryIndicators: ['RSI', 'MACD', 'EMA', 'Volume'],\n riskTolerance: 'high',\n preferredPairs: ['BTC/USDT', 'ETH/USDT', 'SOL/USDT', 'DOGE/USDT', 'AVAX/USDT'],\n rsiBias: 55,\n tier: 'elite',\n dailyYieldMin: 0.85,\n dailyYieldMax: 1.40,\n description: '激进动量策略,高风险高收益,适合风险承受能力强的投资者',\n category: 'aggressive',\n },\n {\n id: 'leverage-maximizer-01',\n name: 'Leverage Maximizer',\n shortName: 'LEV',\n color: '#F97316',\n scanIntervalMin: 30000,\n scanIntervalMax: 50000,\n tradeFrequency: 0.55,\n positionSizeMin: 30,\n positionSizeMax: 55,\n leverageMin: 10,\n leverageMax: 25,\n primaryIndicators: ['RSI', 'MACD', 'EMA', 'Volume', 'Bollinger'],\n riskTolerance: 'high',\n preferredPairs: ['BTC/USDT', 'ETH/USDT', 'SOL/USDT', 'DOGE/USDT', 'AVAX/USDT', 'ARB/USDT'],\n rsiBias: 55,\n tier: 'elite',\n dailyYieldMin: 1.00,\n dailyYieldMax: 1.80,\n description: '杠杆最大化策略,追求极致收益,需要专业投资经验',\n category: 'aggressive',\n },\n\n // ═══════════════════════════════════════════════════════════════════════════\n // QUANTITATIVE STRATEGIES (量化型) - AI-driven, advanced algorithms\n // ═══════════════════════════════════════════════════════════════════════════\n {\n id: 'ai-quant-alpha-01',\n name: 'AI Quant Alpha',\n shortName: 'AQA',\n color: '#A855F7',\n scanIntervalMin: 42000,\n scanIntervalMax: 65000,\n tradeFrequency: 0.42,\n positionSizeMin: 18,\n positionSizeMax: 38,\n leverageMin: 4,\n leverageMax: 12,\n primaryIndicators: ['RSI', 'MACD', 'EMA', 'Volume', 'Bollinger'],\n riskTolerance: 'medium',\n preferredPairs: ['BTC/USDT', 'ETH/USDT', 'SOL/USDT', 'BNB/USDT'],\n rsiBias: 51,\n tier: 'premium',\n dailyYieldMin: 0.70,\n dailyYieldMax: 1.10,\n description: 'AI量化Alpha策略,机器学习驱动,智能风控',\n category: 'quantitative',\n },\n {\n id: 'neural-trader-01',\n name: 'Neural Trader',\n shortName: 'NRT',\n color: '#14B8A6',\n scanIntervalMin: 40000,\n scanIntervalMax: 62000,\n tradeFrequency: 0.44,\n positionSizeMin: 20,\n positionSizeMax: 40,\n leverageMin: 5,\n leverageMax: 15,\n primaryIndicators: ['RSI', 'MACD', 'EMA', 'Volume', 'Bollinger'],\n riskTolerance: 'medium',\n preferredPairs: ['BTC/USDT', 'ETH/USDT', 'SOL/USDT', 'AVAX/USDT', 'LINK/USDT'],\n rsiBias: 52,\n tier: 'elite',\n dailyYieldMin: 0.80,\n dailyYieldMax: 1.25,\n description: '神经网络交易策略,深度学习模型,自适应市场',\n category: 'quantitative',\n },\n {\n id: 'quantum-edge-01',\n name: 'Quantum Edge',\n shortName: 'QTE',\n color: '#6366F1',\n scanIntervalMin: 35000,\n scanIntervalMax: 55000,\n tradeFrequency: 0.5,\n positionSizeMin: 25,\n positionSizeMax: 50,\n leverageMin: 8,\n leverageMax: 20,\n primaryIndicators: ['RSI', 'MACD', 'EMA', 'Volume', 'Bollinger'],\n riskTolerance: 'high',\n preferredPairs: ['BTC/USDT', 'ETH/USDT', 'SOL/USDT', 'AVAX/USDT', 'ARB/USDT', 'OP/USDT'],\n rsiBias: 54,\n tier: 'vip',\n dailyYieldMin: 1.20,\n dailyYieldMax: 2.00,\n description: 'VIP量子优势策略,顶级AI算法,极致收益追求',\n category: 'quantitative',\n },\n];\n\n// ── Trading pairs with base prices ─────────────────────────────────────────────\n\nconst PAIR_PRICES: Record<string, number> = {\n 'BTC/USDT': 67500,\n 'ETH/USDT': 3450,\n 'BNB/USDT': 605,\n 'SOL/USDT': 178,\n 'XRP/USDT': 0.62,\n 'DOGE/USDT': 0.165,\n 'ADA/USDT': 0.45,\n 'AVAX/USDT': 38.5,\n 'ARB/USDT': 1.18,\n 'MATIC/USDT': 0.72,\n 'LINK/USDT': 14.5,\n 'UNI/USDT': 7.8,\n 'AAVE/USDT': 92,\n 'OP/USDT': 2.45,\n 'APT/USDT': 8.9,\n 'INJ/USDT': 24.5,\n 'TIA/USDT': 11.2,\n 'SUI/USDT': 1.65,\n 'DOT/USDT': 7.2,\n 'ATOM/USDT': 9.8,\n 'FIL/USDT': 5.6,\n 'LTC/USDT': 72,\n 'NEAR/USDT': 5.1,\n 'FTM/USDT': 0.42,\n};\n\nconst CHAIN_INFO: Record<string, { name: string; shortName: string; icon: string }> = {\n ethereum: { name: 'Ethereum', shortName: 'ETH', icon: 'Ξ' },\n arbitrum: { name: 'Arbitrum', shortName: 'ARB', icon: '◆' },\n bsc: { name: 'BSC', shortName: 'BSC', icon: '◆' },\n base: { name: 'Base', shortName: 'BASE', icon: '●' },\n polygon: { name: 'Polygon', shortName: 'POLY', icon: '⬡' },\n optimism: { name: 'Optimism', shortName: 'OP', icon: '◉' },\n avalanche: { name: 'Avalanche', shortName: 'AVAX', icon: '▲' },\n linea: { name: 'Linea', shortName: 'LINEA', icon: '═' },\n zksync: { name: 'zkSync', shortName: 'ZK', icon: '⬢' },\n scroll: { name: 'Scroll', shortName: 'SCRL', icon: '◎' },\n};\n\nconst NEWS_HEADLINES = [\n 'Fed signals potential rate pause, crypto markets react positively',\n 'Major institutional investor increases BTC allocation by 15%',\n 'On-chain data shows whale accumulation pattern forming',\n 'DeFi TVL reaches new monthly high across major protocols',\n 'Exchange outflows surge as holders move to cold storage',\n 'Options market signals increased volatility expected this week',\n 'Mining difficulty adjustment approaching, hash rate stable',\n 'Regulatory clarity in EU boosts market sentiment',\n 'Stablecoin supply expanding, potential bullish indicator',\n 'Social sentiment score shifts to extreme greed zone',\n 'Cross-chain bridge volume hits record daily high',\n 'Layer 2 adoption metrics show 40% MoM growth',\n];\n\n// ── Helpers ────────────────────────────────────────────────────────────────────\n\nlet idCounter = 0;\nfunction genId(): string {\n return `log_${Date.now()}_${++idCounter}`;\n}\n\nfunction rand(min: number, max: number): number {\n return min + Math.random() * (max - min);\n}\n\nfunction randInt(min: number, max: number): number {\n return Math.floor(rand(min, max + 1));\n}\n\nfunction pick<T>(arr: T[]): T {\n return arr[Math.floor(Math.random() * arr.length)];\n}\n\nfunction clamp(val: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, val));\n}\n\nfunction formatPrice(price: number): string {\n if (price >= 1000) return price.toFixed(2);\n if (price >= 1) return price.toFixed(3);\n return price.toFixed(5);\n}\n\n// ── Engine ─────────────────────────────────────────────────────────────────────\n\nclass BotSimulationEngine {\n private listeners: LogCallback[] = [];\n private botTimers: Map<string, ReturnType<typeof setTimeout>> = new Map();\n private botStates: Map<string, BotState> = new Map();\n private priceState: Map<string, number> = new Map();\n private indicatorState: Map<string, IndicatorSnapshot> = new Map();\n private running = false;\n private userPairs: string[] = [];\n private userChains: string[] = [];\n\n constructor() {\n // Initialize prices with some jitter\n for (const [pair, base] of Object.entries(PAIR_PRICES)) {\n this.priceState.set(pair, base * (1 + rand(-0.02, 0.02)));\n }\n }\n\n // ── Public API ─────────────────────────────────────────────────────────────\n\n getStrategies(): StrategyPersonality[] {\n return STRATEGY_PERSONALITIES;\n }\n\n start(strategyIds?: string[], userPairs?: string[], userChains?: string[]): void {\n this.running = true;\n // Convert pair IDs (e.g. 'BTC') to full symbols (e.g. 'BTC/USDT') if needed\n this.userPairs = (userPairs || [])\n .map(p => p.includes('/') ? p : `${p}/USDT`)\n .filter(p => p in PAIR_PRICES);\n this.userChains = (userChains || []).filter(c => c in CHAIN_INFO);\n const strategies = strategyIds\n ? STRATEGY_PERSONALITIES.filter(s => strategyIds.includes(s.id))\n : STRATEGY_PERSONALITIES;\n\n for (const strategy of strategies) {\n this.initBotState(strategy);\n this.scheduleCycle(strategy);\n }\n }\n\n stop(strategyIds?: string[]): void {\n const ids = strategyIds || Array.from(this.botTimers.keys());\n for (const id of ids) {\n const timer = this.botTimers.get(id);\n if (timer) {\n clearTimeout(timer);\n this.botTimers.delete(id);\n }\n }\n if (!strategyIds) {\n this.running = false;\n }\n }\n\n onLog(callback: LogCallback): () => void {\n this.listeners.push(callback);\n return () => {\n this.listeners = this.listeners.filter(l => l !== callback);\n };\n }\n\n getBotState(strategyId: string): BotState | undefined {\n return this.botStates.get(strategyId);\n }\n\n getAllBotStates(): Map<string, BotState> {\n return this.botStates;\n }\n\n isRunning(): boolean {\n return this.running;\n }\n\n emitBootSequence(): void {\n const bootMessages: Array<{ msg: string; delay: number }> = [\n { msg: 'Initializing ONE Trading Engine v3.2.1...', delay: 0 },\n { msg: 'Loading market data feeds...', delay: 500 },\n { msg: 'Connecting to exchange WebSocket streams...', delay: 1200 },\n { msg: 'Calibrating indicator engines (RSI, MACD, EMA, Bollinger)...', delay: 2000 },\n { msg: 'Loading strategy personalities: balanced-01, conservative-01, aggressive-01', delay: 2800 },\n { msg: 'Risk management module initialized (max drawdown: 15%)', delay: 3600 },\n { msg: 'Portfolio allocation engine ready', delay: 4200 },\n { msg: '=== All systems online. Starting trading cycles ===', delay: 5000 },\n ];\n\n for (const { msg, delay } of bootMessages) {\n setTimeout(() => {\n this.emit({\n id: genId(),\n timestamp: Date.now(),\n strategyId: 'system',\n strategyName: 'SYSTEM',\n type: 'SYSTEM',\n message: msg,\n importance: 'medium',\n });\n }, delay);\n }\n }\n\n destroy(): void {\n this.stop();\n this.listeners = [];\n this.botStates.clear();\n this.priceState.clear();\n this.indicatorState.clear();\n this.userPairs = [];\n this.userChains = [];\n }\n\n // ── Private Methods ────────────────────────────────────────────────────────\n\n private emit(entry: BotLogEntry): void {\n for (const listener of this.listeners) {\n listener(entry);\n }\n }\n\n private getActivePairs(strategy: StrategyPersonality): string[] {\n return this.userPairs.length > 0 ? this.userPairs : strategy.preferredPairs;\n }\n\n private getActiveChain(): string {\n const chains = this.userChains.length > 0\n ? this.userChains\n : ['ethereum', 'arbitrum', 'bsc'];\n return pick(chains);\n }\n\n private getChainLabel(chainId: string): string {\n const info = CHAIN_INFO[chainId];\n return info ? info.shortName : chainId;\n }\n\n private initBotState(strategy: StrategyPersonality): void {\n const activePairs = this.getActivePairs(strategy);\n const pair = pick(activePairs);\n const price = this.priceState.get(pair) || PAIR_PRICES[pair] || 50000;\n const indicators = this.generateIndicators(strategy, price);\n this.indicatorState.set(strategy.id, indicators);\n\n this.botStates.set(strategy.id, {\n strategyId: strategy.id,\n strategyName: strategy.name,\n isRunning: true,\n currentPair: pair,\n currentPrice: price,\n indicators,\n openPositions: [],\n totalPnl: rand(-50, 200),\n totalTrades: randInt(5, 25),\n winRate: rand(0.48, 0.68),\n lastSignal: 'HOLD',\n lastSignalConfidence: 0,\n });\n }\n\n private scheduleCycle(strategy: StrategyPersonality): void {\n if (!this.running) return;\n const interval = rand(strategy.scanIntervalMin, strategy.scanIntervalMax);\n const timer = setTimeout(() => {\n if (this.running) {\n this.runBotCycle(strategy);\n this.scheduleCycle(strategy);\n }\n }, interval);\n this.botTimers.set(strategy.id, timer);\n }\n\n private async runBotCycle(strategy: StrategyPersonality): Promise<void> {\n const state = this.botStates.get(strategy.id);\n if (!state) return;\n\n const activePairs = this.getActivePairs(strategy);\n const pair = pick(activePairs);\n const price = this.simulatePrice(pair);\n const indicators = this.generateIndicators(strategy, price);\n this.indicatorState.set(strategy.id, indicators);\n\n state.currentPair = pair;\n state.currentPrice = price;\n state.indicators = indicators;\n\n const entries: Array<{ entry: Omit<BotLogEntry, 'id' | 'timestamp'>; delay: number }> = [];\n let delay = 0;\n\n // 1. SCAN - Always (slower delay)\n const chain = this.getActiveChain();\n const chainLabel = this.getChainLabel(chain);\n entries.push({\n entry: {\n strategyId: strategy.id,\n strategyName: strategy.shortName,\n type: 'SCAN',\n message: `Scanning ${pair} on ${chainLabel} | Price: $${formatPrice(price)}`,\n data: { pair, chain, chainLabel },\n importance: 'low',\n },\n delay,\n });\n delay += rand(2000, 3500); // 2-3.5s after SCAN\n\n // 2. THINKING - AI reasoning process (new)\n const thinkingMessages = this.generateThinkingProcess(strategy, pair, price);\n for (const thinking of thinkingMessages) {\n entries.push({\n entry: {\n strategyId: strategy.id,\n strategyName: strategy.shortName,\n type: 'THINKING',\n message: thinking,\n importance: 'low',\n },\n delay,\n });\n delay += rand(1500, 2500); // 1.5-2.5s between thoughts\n }\n\n // 3. INDICATOR - Always (slower delay)\n const indicatorParts = [];\n if (strategy.primaryIndicators.includes('RSI') || strategy.primaryIndicators.includes('MACD')) {\n indicatorParts.push(`RSI: ${indicators.rsi.toFixed(1)}`);\n }\n if (strategy.primaryIndicators.includes('MACD') || strategy.primaryIndicators.includes('RSI')) {\n indicatorParts.push(`MACD: ${indicators.macd.histogram > 0 ? '+' : ''}${indicators.macd.histogram.toFixed(3)}`);\n }\n if (strategy.primaryIndicators.includes('EMA')) {\n indicatorParts.push(`EMA: ${indicators.ema.short.toFixed(1)}/${indicators.ema.long.toFixed(1)}`);\n if (indicators.ema.crossover !== 'none') {\n indicatorParts.push(`[${indicators.ema.crossover.toUpperCase()} CROSS]`);\n }\n }\n if (strategy.primaryIndicators.includes('Bollinger')) {\n indicatorParts.push(`BB: ${indicators.bollinger.position.toFixed(1)}% width=${indicators.bollinger.width.toFixed(2)}`);\n }\n if (strategy.primaryIndicators.includes('Volume')) {\n indicatorParts.push(`Vol: ${indicators.volume.ratio.toFixed(2)}x avg`);\n }\n\n entries.push({\n entry: {\n strategyId: strategy.id,\n strategyName: strategy.shortName,\n type: 'INDICATOR',\n message: indicatorParts.join(' | '),\n data: { indicators },\n importance: 'low',\n },\n delay,\n });\n delay += rand(2000, 3500); // 2-3.5s after INDICATOR\n\n // 4. NEWS - 12% chance\n if (Math.random() < 0.12) {\n const sentiment = Math.random() > 0.4 ? 'Bullish' : 'Bearish';\n entries.push({\n entry: {\n strategyId: strategy.id,\n strategyName: strategy.shortName,\n type: 'NEWS',\n message: `[${sentiment}] ${pick(NEWS_HEADLINES)}`,\n importance: 'medium',\n },\n delay,\n });\n delay += rand(2500, 4000); // 2.5-4s after NEWS\n }\n\n // 5. ANALYSIS - 40% chance\n if (Math.random() < 0.4) {\n const analysis = this.generateAnalysis(strategy, indicators, pair);\n entries.push({\n entry: {\n strategyId: strategy.id,\n strategyName: strategy.shortName,\n type: 'ANALYSIS',\n message: analysis,\n importance: 'medium',\n },\n delay,\n });\n delay += rand(2500, 4000); // 2.5-4s after ANALYSIS\n }\n\n // 6-10. Signal evaluation and potential trade\n const signal = this.evaluateSignal(strategy, indicators);\n state.lastSignal = signal.direction;\n state.lastSignalConfidence = signal.confidence;\n\n if (signal.direction !== 'HOLD') {\n // 6. STRATEGY - Show strategy reasoning context (NEW)\n const strategyContext = this.generateStrategyContext(strategy, signal, indicators, pair);\n entries.push({\n entry: {\n strategyId: strategy.id,\n strategyName: strategy.shortName,\n type: 'STRATEGY',\n message: strategyContext,\n data: {\n strategy: strategy.name,\n riskTolerance: strategy.riskTolerance,\n primaryIndicators: strategy.primaryIndicators,\n signal: signal.direction,\n confidence: signal.confidence,\n },\n importance: 'high',\n },\n delay,\n });\n delay += rand(3000, 5000); // 3-5s after STRATEGY\n\n // 7. SIGNAL\n entries.push({\n entry: {\n strategyId: strategy.id,\n strategyName: strategy.shortName,\n type: 'SIGNAL',\n message: `${signal.direction} signal detected | Confidence: ${(signal.confidence * 100).toFixed(1)}% | ${signal.reason}`,\n data: { signal },\n importance: 'high',\n },\n delay,\n });\n delay += rand(3000, 4500); // 3-4.5s after SIGNAL\n\n // 8. DECISION\n const decision = this.makeTradeDecision(strategy, signal, state);\n if (decision.execute) {\n entries.push({\n entry: {\n strategyId: strategy.id,\n strategyName: strategy.shortName,\n type: 'DECISION',\n message: `Execute ${signal.direction} | Size: ${decision.positionSize.toFixed(1)}% | Leverage: ${decision.leverage}x | Risk/Reward: 1:${decision.riskReward.toFixed(1)}`,\n data: {\n strategyName: strategy.name,\n strategyId: strategy.id,\n riskTolerance: strategy.riskTolerance,\n signalReason: signal.reason,\n confidence: signal.confidence,\n },\n importance: 'high',\n },\n delay,\n });\n delay += rand(2500, 4000); // 2.5-4s after DECISION\n\n // 9. ORDER\n const orderId = `ORD_${Date.now().toString(36).toUpperCase()}`;\n const orderPrice = signal.direction === 'LONG'\n ? price * (1 - rand(0.0001, 0.0005))\n : price * (1 + rand(0.0001, 0.0005));\n\n entries.push({\n entry: {\n strategyId: strategy.id,\n strategyName: strategy.shortName,\n type: 'ORDER',\n message: `Submitting ${signal.direction} order | ${pair} @ $${formatPrice(orderPrice)} on ${chainLabel} | ID: ${orderId}`,\n data: {\n orderId,\n pair,\n side: signal.direction,\n price: orderPrice,\n leverage: decision.leverage,\n chain,\n chainLabel,\n strategyName: strategy.name,\n strategyContext: strategyContext,\n signalReason: signal.reason,\n },\n importance: 'high',\n },\n delay,\n });\n delay += rand(4000, 7000); // 4-7s for order execution\n\n // 10. FILLED\n const fillPrice = orderPrice * (1 + rand(-0.0003, 0.0003));\n const slippage = Math.abs(fillPrice - orderPrice) / orderPrice * 100;\n entries.push({\n entry: {\n strategyId: strategy.id,\n strategyName: strategy.shortName,\n type: 'FILLED',\n message: `Order FILLED | ${pair} ${signal.direction} @ $${formatPrice(fillPrice)} on ${chainLabel} | Slippage: ${slippage.toFixed(4)}% | ID: ${orderId}`,\n data: {\n orderId,\n fillPrice,\n slippage,\n chain,\n chainLabel,\n strategyName: strategy.name,\n executedBy: strategy.id,\n },\n importance: 'high',\n },\n delay,\n });\n\n // Update state with new position\n const position: OpenPosition = {\n id: orderId,\n pair,\n side: signal.direction as 'LONG' | 'SHORT',\n entryPrice: fillPrice,\n currentPrice: price,\n size: decision.positionSize,\n leverage: decision.leverage,\n pnl: 0,\n pnlPercent: 0,\n };\n state.openPositions = [...state.openPositions.slice(-2), position];\n state.totalTrades++;\n } else {\n entries.push({\n entry: {\n strategyId: strategy.id,\n strategyName: strategy.shortName,\n type: 'DECISION',\n message: `SKIP - ${decision.reason}`,\n importance: 'medium',\n },\n delay,\n });\n }\n }\n\n // 11. PNL - Update open positions\n if (state.openPositions.length > 0 && Math.random() < 0.5) {\n delay += rand(3500, 5500); // 3.5-5.5s before PNL\n let totalPositionPnl = 0;\n const pnlParts: string[] = [];\n\n for (const pos of state.openPositions) {\n pos.currentPrice = this.simulatePrice(pos.pair);\n const priceDiff = pos.side === 'LONG'\n ? (pos.currentPrice - pos.entryPrice) / pos.entryPrice\n : (pos.entryPrice - pos.currentPrice) / pos.entryPrice;\n pos.pnlPercent = priceDiff * pos.leverage * 100;\n pos.pnl = priceDiff * pos.leverage * pos.size;\n totalPositionPnl += pos.pnl;\n pnlParts.push(`${pos.pair} ${pos.side}: ${pos.pnlPercent >= 0 ? '+' : ''}${pos.pnlPercent.toFixed(2)}%`);\n }\n\n state.totalPnl += totalPositionPnl * rand(0.01, 0.05);\n\n // Sometimes close a position\n if (state.openPositions.length > 1 && Math.random() < 0.3) {\n const closed = state.openPositions.shift()!;\n const finalPnl = closed.pnlPercent;\n if (finalPnl > 0) {\n state.winRate = state.winRate * 0.95 + 0.05;\n } else {\n state.winRate = state.winRate * 0.95;\n }\n state.winRate = clamp(state.winRate, 0.35, 0.75);\n pnlParts.push(`CLOSED ${closed.pair}: ${finalPnl >= 0 ? '+' : ''}${finalPnl.toFixed(2)}%`);\n }\n\n entries.push({\n entry: {\n strategyId: strategy.id,\n strategyName: strategy.shortName,\n type: 'PNL',\n message: pnlParts.join(' | '),\n data: { totalPnl: state.totalPnl, positions: state.openPositions.length },\n importance: 'medium',\n },\n delay,\n });\n }\n\n // 12. RISK - Periodic check\n if (Math.random() < 0.2) {\n delay += rand(3000, 5000); // 3-5s before RISK\n const exposure = state.openPositions.reduce((sum, p) => sum + p.size * p.leverage, 0);\n const maxDrawdown = rand(2, 12);\n entries.push({\n entry: {\n strategyId: strategy.id,\n strategyName: strategy.shortName,\n type: 'RISK',\n message: `Portfolio exposure: ${exposure.toFixed(1)}% | Max drawdown: ${maxDrawdown.toFixed(1)}% | Open positions: ${state.openPositions.length} | Win rate: ${(state.winRate * 100).toFixed(1)}%`,\n importance: exposure > 80 ? 'high' : 'low',\n },\n delay,\n });\n }\n\n // Emit entries with delays\n for (const { entry, delay: d } of entries) {\n setTimeout(() => {\n if (this.running) {\n this.emit({\n ...entry,\n id: genId(),\n timestamp: Date.now(),\n });\n }\n }, d);\n }\n }\n\n private simulatePrice(pair: string): number {\n const current = this.priceState.get(pair) || PAIR_PRICES[pair] || 50000;\n const volatility = pair.includes('DOGE') ? 0.005 : pair.includes('BTC') ? 0.002 : 0.003;\n const drift = rand(-volatility, volatility);\n const newPrice = current * (1 + drift);\n this.priceState.set(pair, newPrice);\n return newPrice;\n }\n\n private generateIndicators(strategy: StrategyPersonality, price: number): IndicatorSnapshot {\n const prev = this.indicatorState.get(strategy.id);\n const prevRsi = prev?.rsi ?? strategy.rsiBias;\n\n // RSI: mean-reverting around bias\n const rsiMean = strategy.rsiBias;\n const rsiDrift = rand(-8, 8);\n const rsiReversion = (rsiMean - prevRsi) * 0.15;\n const rsi = clamp(prevRsi + rsiDrift + rsiReversion, 8, 95);\n\n // MACD: correlated with RSI\n const macdBias = rsi > 65 ? 0.3 : rsi < 35 ? -0.3 : 0;\n const prevHist = prev?.macd.histogram ?? 0;\n const histogram = clamp(prevHist * 0.7 + rand(-0.5, 0.5) + macdBias, -2, 2);\n const macdValue = histogram * rand(0.8, 1.5);\n const macdSignal = macdValue - histogram;\n\n // EMA: occasional crossovers\n const prevShort = prev?.ema.short ?? price;\n const prevLong = prev?.ema.long ?? price;\n const emaShort = prevShort * 0.9 + price * 0.1;\n const emaLong = prevLong * 0.95 + price * 0.05;\n let crossover: 'golden' | 'death' | 'none' = 'none';\n if (prevShort <= prevLong && emaShort > emaLong) crossover = 'golden';\n else if (prevShort >= prevLong && emaShort < emaLong) crossover = 'death';\n\n // Bollinger\n const bbMiddle = price;\n const bbWidth = price * rand(0.01, 0.04);\n const bbUpper = bbMiddle + bbWidth;\n const bbLower = bbMiddle - bbWidth;\n const bbPosition = ((price - bbLower) / (bbUpper - bbLower)) * 100;\n\n // Volume\n const volRatio = rand(0.3, 2.5);\n const volCurrent = rand(100000, 5000000);\n\n return {\n rsi,\n macd: { value: macdValue, signal: macdSignal, histogram },\n ema: { short: emaShort, long: emaLong, crossover },\n bollinger: { upper: bbUpper, middle: bbMiddle, lower: bbLower, width: bbWidth / price, position: bbPosition },\n volume: { current: volCurrent, average: volCurrent / volRatio, ratio: volRatio },\n };\n }\n\n private generateThinkingProcess(strategy: StrategyPersonality, pair: string, price: number): string[] {\n const thoughts: string[] = [];\n const pairBase = pair.split('/')[0];\n\n // Generate 1-3 thinking steps\n const thinkingTemplates = [\n `Analyzing ${pairBase} market structure...`,\n `Checking ${strategy.primaryIndicators.join(', ')} confluence...`,\n `Evaluating risk parameters for ${strategy.riskTolerance} tolerance...`,\n `Scanning order book depth at $${formatPrice(price)}...`,\n `Cross-referencing with historical patterns...`,\n `Calculating optimal entry zone...`,\n `Assessing market sentiment indicators...`,\n `Monitoring whale activity on ${pairBase}...`,\n `Comparing momentum across timeframes...`,\n `Validating support/resistance levels...`,\n ];\n\n const numThoughts = randInt(1, 3);\n const shuffled = [...thinkingTemplates].sort(() => Math.random() - 0.5);\n\n for (let i = 0; i < numThoughts; i++) {\n thoughts.push(shuffled[i]);\n }\n\n return thoughts;\n }\n\n private generateStrategyContext(\n strategy: StrategyPersonality,\n signal: { direction: string; confidence: number; reason: string },\n indicators: IndicatorSnapshot,\n pair: string\n ): string {\n const contexts = [];\n\n // Strategy personality context\n contexts.push(`[${strategy.name}]`);\n\n // Risk context\n const riskLevel = strategy.riskTolerance === 'high' ? 'aggressive' : strategy.riskTolerance === 'low' ? 'conservative' : 'balanced';\n contexts.push(`Risk: ${riskLevel}`);\n\n // Key indicator that triggered\n if (indicators.rsi < 35 || indicators.rsi > 65) {\n contexts.push(`RSI ${indicators.rsi < 35 ? 'oversold' : 'overbought'} (${indicators.rsi.toFixed(1)})`);\n }\n if (indicators.ema.crossover !== 'none') {\n contexts.push(`EMA ${indicators.ema.crossover} cross`);\n }\n if (Math.abs(indicators.macd.histogram) > 0.3) {\n contexts.push(`MACD ${indicators.macd.histogram > 0 ? 'bullish' : 'bearish'} momentum`);\n }\n\n // Confidence interpretation\n const confLevel = signal.confidence > 0.7 ? 'HIGH' : signal.confidence > 0.5 ? 'MEDIUM' : 'LOW';\n contexts.push(`Confidence: ${confLevel}`);\n\n return contexts.join(' | ');\n }\n\n private generateAnalysis(strategy: StrategyPersonality, indicators: IndicatorSnapshot, pair: string): string {\n const analyses = [];\n\n if (indicators.rsi > 70) {\n analyses.push(`RSI at ${indicators.rsi.toFixed(1)} - overbought territory, watching for reversal`);\n } else if (indicators.rsi < 30) {\n analyses.push(`RSI at ${indicators.rsi.toFixed(1)} - oversold, potential bounce setup`);\n } else if (indicators.rsi > 55) {\n analyses.push(`RSI trending bullish at ${indicators.rsi.toFixed(1)}`);\n } else {\n analyses.push(`RSI neutral at ${indicators.rsi.toFixed(1)}, no clear direction`);\n }\n\n if (indicators.macd.histogram > 0.5) {\n analyses.push('MACD histogram expanding positive - momentum building');\n } else if (indicators.macd.histogram < -0.5) {\n analyses.push('MACD histogram expanding negative - bearish pressure');\n }\n\n if (indicators.ema.crossover === 'golden') {\n analyses.push('EMA golden cross detected - strong bullish signal');\n } else if (indicators.ema.crossover === 'death') {\n analyses.push('EMA death cross detected - bearish warning');\n }\n\n if (indicators.bollinger.position > 90) {\n analyses.push(`Price near upper Bollinger band (${indicators.bollinger.position.toFixed(0)}%) - potential resistance`);\n } else if (indicators.bollinger.position < 10) {\n analyses.push(`Price near lower Bollinger band (${indicators.bollinger.position.toFixed(0)}%) - potential support`);\n }\n\n if (indicators.volume.ratio > 1.8) {\n analyses.push(`Volume spike ${indicators.volume.ratio.toFixed(1)}x average - high activity`);\n }\n\n return analyses.length > 0 ? analyses.join(' | ') : `${pair} consolidating - waiting for clearer setup`;\n }\n\n private evaluateSignal(\n strategy: StrategyPersonality,\n indicators: IndicatorSnapshot,\n ): { direction: 'LONG' | 'SHORT' | 'HOLD'; confidence: number; reason: string } {\n let bullScore = 0;\n let bearScore = 0;\n const reasons: string[] = [];\n\n // RSI\n if (indicators.rsi < 30) { bullScore += 2; reasons.push('RSI oversold'); }\n else if (indicators.rsi < 40) { bullScore += 1; reasons.push('RSI low'); }\n else if (indicators.rsi > 70) { bearScore += 2; reasons.push('RSI overbought'); }\n else if (indicators.rsi > 60) { bearScore += 1; reasons.push('RSI high'); }\n\n // MACD\n if (indicators.macd.histogram > 0.3) { bullScore += 1.5; reasons.push('MACD bullish'); }\n else if (indicators.macd.histogram < -0.3) { bearScore += 1.5; reasons.push('MACD bearish'); }\n\n // EMA\n if (indicators.ema.crossover === 'golden') { bullScore += 2.5; reasons.push('Golden cross'); }\n else if (indicators.ema.crossover === 'death') { bearScore += 2.5; reasons.push('Death cross'); }\n else if (indicators.ema.short > indicators.ema.long) { bullScore += 0.5; }\n else { bearScore += 0.5; }\n\n // Bollinger\n if (indicators.bollinger.position < 15) { bullScore += 1; reasons.push('BB support'); }\n else if (indicators.bollinger.position > 85) { bearScore += 1; reasons.push('BB resistance'); }\n\n // Volume confirmation\n if (indicators.volume.ratio > 1.5) {\n if (bullScore > bearScore) bullScore += 1;\n else bearScore += 1;\n reasons.push('Volume confirms');\n }\n\n const netScore = bullScore - bearScore;\n const confidence = Math.min(Math.abs(netScore) / 6, 0.95);\n const threshold = strategy.riskTolerance === 'high' ? 1.5 : strategy.riskTolerance === 'medium' ? 2.0 : 2.5;\n\n // Apply trade frequency filter\n if (Math.random() > strategy.tradeFrequency) {\n return { direction: 'HOLD', confidence: 0, reason: 'Cycle skip' };\n }\n\n if (netScore > threshold) {\n return { direction: 'LONG', confidence, reason: reasons.slice(0, 3).join(', ') };\n } else if (netScore < -threshold) {\n return { direction: 'SHORT', confidence, reason: reasons.slice(0, 3).join(', ') };\n }\n\n return { direction: 'HOLD', confidence: 0, reason: 'No clear signal' };\n }\n\n private makeTradeDecision(\n strategy: StrategyPersonality,\n signal: { direction: string; confidence: number },\n state: BotState,\n ): { execute: boolean; positionSize: number; leverage: number; riskReward: number; reason: string } {\n // Check position limits\n if (state.openPositions.length >= 3) {\n return { execute: false, positionSize: 0, leverage: 0, riskReward: 0, reason: 'Max positions reached (3)' };\n }\n\n // Confidence threshold\n const minConfidence = strategy.riskTolerance === 'high' ? 0.3 : strategy.riskTolerance === 'medium' ? 0.45 : 0.6;\n if (signal.confidence < minConfidence) {\n return { execute: false, positionSize: 0, leverage: 0, riskReward: 0, reason: `Confidence too low (${(signal.confidence * 100).toFixed(0)}% < ${(minConfidence * 100).toFixed(0)}%)` };\n }\n\n const positionSize = rand(strategy.positionSizeMin, strategy.positionSizeMax);\n const leverage = randInt(strategy.leverageMin, strategy.leverageMax);\n const riskReward = rand(1.2, 3.5);\n\n return { execute: true, positionSize, leverage, riskReward, reason: '' };\n }\n}\n\n// ── Singleton Export ────────────────────────────────────────────────────────────\n\nexport const botSimulationEngine = new BotSimulationEngine();\n","/**\n * ONE SDK Configuration\n *\n * Chain data is fetched from ONE Engine API - no duplicates needed here.\n * Engine is the single source of truth for 200+ EVM chains.\n */\n\nimport type { ChainConfig } from '../types';\n\n// ===== SDK Configuration =====\nexport interface OneConfig {\n // ONE Engine (required)\n oneEngineUrl: string;\n oneClientId: string;\n oneSecretKey?: string; // Only for backend usage\n\n // Optional: Direct Supabase access (for realtime subscriptions)\n supabaseUrl?: string;\n supabaseAnonKey?: string;\n\n // Deprecated: Use ONE Engine instead\n thirdwebClientId?: string;\n}\n\n// Default configuration values\nconst DEFAULT_ENGINE_URL = 'https://api.one23.io';\nconst DEFAULT_CLIENT_ID = 'one_pk_e8f647bfa643fdcfaa3a23f760488e49be09f929296eed4a6c399d437d907f60';\n\nlet config: OneConfig | null = null;\n\nexport function initOneSDK(options: Partial<OneConfig>): void {\n // Use defaults if not provided\n const engineUrl = options.oneEngineUrl || DEFAULT_ENGINE_URL;\n const clientId = options.oneClientId || DEFAULT_CLIENT_ID;\n\n config = {\n ...options,\n oneEngineUrl: engineUrl,\n oneClientId: clientId,\n } as OneConfig;\n}\n\nexport function getConfig(): OneConfig {\n if (!config) {\n throw new Error('ONE SDK not initialized. Call initOneSDK() first.');\n }\n return config;\n}\n\nexport function isInitialized(): boolean {\n return config !== null;\n}\n\nexport function getEngineUrl(): string {\n return config?.oneEngineUrl || process.env.NEXT_PUBLIC_ONE_ENGINE_URL || DEFAULT_ENGINE_URL;\n}\n\n// ===== Chain Data (Fetched from Engine) =====\n\n// Cache for chain data\nlet chainsCache: ChainConfig[] | null = null;\nlet chainsCacheTimestamp = 0;\nconst CACHE_TTL = 5 * 60 * 1000; // 5 minutes\n\n/**\n * Fetch chains from ONE Engine API\n * Engine is the source of truth for 200+ EVM chains\n */\nexport async function fetchChains(options?: {\n category?: 'mainnet' | 'l2' | 'testnet' | 'gaming' | 'recommended';\n smartWallet?: boolean;\n limit?: number;\n}): Promise<ChainConfig[]> {\n const engineUrl = getEngineUrl();\n const params = new URLSearchParams();\n\n if (options?.category) params.set('category', options.category);\n if (options?.smartWallet) params.set('smartWallet', 'true');\n if (options?.limit) params.set('limit', options.limit.toString());\n\n const response = await fetch(`${engineUrl}/v1/chains?${params}`);\n const data = await response.json();\n\n if (!data.success) {\n throw new Error(data.error?.message || 'Failed to fetch chains');\n }\n\n // Transform Engine response to SDK ChainConfig format\n return data.data.chains.map((chain: any) => ({\n id: chain.id,\n name: chain.name,\n shortName: chain.shortName || chain.slug || chain.name.toLowerCase(),\n icon: getChainIcon(chain.id),\n nativeCurrency: chain.nativeCurrency,\n rpcUrls: Array.isArray(chain.rpc) ? chain.rpc : [chain.rpc],\n blockExplorerUrls: chain.blockExplorer ? [chain.blockExplorer] : [],\n testnet: chain.testnet,\n }));\n}\n\n/**\n * Get all supported chains (cached)\n */\nexport async function getChains(): Promise<ChainConfig[]> {\n const now = Date.now();\n if (chainsCache && (now - chainsCacheTimestamp) < CACHE_TTL) {\n return chainsCache;\n }\n\n chainsCache = await fetchChains({ limit: 200 });\n chainsCacheTimestamp = now;\n return chainsCache;\n}\n\n/**\n * Get chain by ID\n */\nexport async function getChainById(chainId: number): Promise<ChainConfig | undefined> {\n const chains = await getChains();\n return chains.find(c => c.id === chainId);\n}\n\n/**\n * Get chain by name/shortName\n */\nexport async function getChainByName(name: string): Promise<ChainConfig | undefined> {\n const chains = await getChains();\n const lowerName = name.toLowerCase();\n return chains.find(\n c => c.name.toLowerCase() === lowerName || c.shortName.toLowerCase() === lowerName\n );\n}\n\n/**\n * Get recommended chains for UI display\n */\nexport async function getRecommendedChains(): Promise<ChainConfig[]> {\n return fetchChains({ category: 'recommended', limit: 10 });\n}\n\n/**\n * Get chains with smart wallet support\n */\nexport async function getSmartWalletChains(): Promise<ChainConfig[]> {\n return fetchChains({ smartWallet: true, limit: 50 });\n}\n\n// ===== Default Chain Constants =====\n// These are commonly used chain IDs, but full data should be fetched from Engine\n\nexport const CHAIN_IDS = {\n ETHEREUM: 1,\n POLYGON: 137,\n BSC: 56,\n ARBITRUM: 42161,\n OPTIMISM: 10,\n BASE: 8453,\n AVALANCHE: 43114,\n ZKSYNC: 324,\n LINEA: 59144,\n SCROLL: 534352,\n BLAST: 81457,\n // Testnets\n SEPOLIA: 11155111,\n BASE_SEPOLIA: 84532,\n ARBITRUM_SEPOLIA: 421614,\n} as const;\n\nexport const DEFAULT_CHAIN_ID = CHAIN_IDS.BASE;\n\n// ===== Chain Icons (Simple emoji fallback) =====\nconst CHAIN_ICONS: Record<number, string> = {\n 1: '\\u229F', // Ethereum\n 137: '\\uD83D\\uDFE3', // Polygon\n 56: '\\uD83D\\uDFE1', // BSC\n 42161: '\\uD83D\\uDD35', // Arbitrum\n 10: '\\uD83D\\uDD34', // Optimism\n 8453: '\\uD83D\\uDD37', // Base\n 43114: '\\uD83D\\uDD3A', // Avalanche\n 324: '\\u26A1', // zkSync\n 59144: '\\uD83D\\uDD39', // Linea\n 534352: '\\uD83D\\uDCDC', // Scroll\n};\n\nfunction getChainIcon(chainId: number): string {\n return CHAIN_ICONS[chainId] || '\\uD83D\\uDD17';\n}\n\n// ===== Token Names Mapping =====\n// Common token symbols to human-readable names\nexport const TOKEN_NAMES: Record<string, string> = {\n ETH: 'Ethereum',\n BTC: 'Bitcoin',\n BNB: 'BNB',\n MATIC: 'Polygon',\n POL: 'Polygon',\n AVAX: 'Avalanche',\n USDT: 'Tether',\n USDC: 'USD Coin',\n DAI: 'Dai',\n WBTC: 'Wrapped Bitcoin',\n WETH: 'Wrapped Ether',\n ARB: 'Arbitrum',\n OP: 'Optimism',\n LINK: 'Chainlink',\n UNI: 'Uniswap',\n AAVE: 'Aave',\n CRV: 'Curve',\n MKR: 'Maker',\n SNX: 'Synthetix',\n COMP: 'Compound',\n SUSHI: 'SushiSwap',\n YFI: 'Yearn Finance',\n SOL: 'Solana',\n DOT: 'Polkadot',\n ATOM: 'Cosmos',\n NEAR: 'Near Protocol',\n};\n\n// ===== CoinGecko ID Mapping =====\n// For price lookups via CoinGecko API\nexport const COINGECKO_IDS: Record<string, string> = {\n ETH: 'ethereum',\n BTC: 'bitcoin',\n BNB: 'binancecoin',\n MATIC: 'matic-network',\n POL: 'matic-network',\n AVAX: 'avalanche-2',\n USDT: 'tether',\n USDC: 'usd-coin',\n DAI: 'dai',\n WBTC: 'wrapped-bitcoin',\n WETH: 'weth',\n ARB: 'arbitrum',\n OP: 'optimism',\n LINK: 'chainlink',\n UNI: 'uniswap',\n AAVE: 'aave',\n SOL: 'solana',\n};\n\n// ===== Backwards Compatibility =====\n// @deprecated - Use getChains() or fetch from Engine API\n// These static configs are kept for backwards compatibility only\n\nexport const CHAIN_CONFIGS: Record<string, ChainConfig> = {\n ethereum: {\n id: 1,\n name: 'Ethereum',\n shortName: 'ETH',\n icon: '\\u229F',\n nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\n rpcUrls: ['https://ethereum.rpc.thirdweb.com'],\n blockExplorerUrls: ['https://etherscan.io'],\n testnet: false,\n },\n polygon: {\n id: 137,\n name: 'Polygon',\n shortName: 'MATIC',\n icon: '\\uD83D\\uDFE3',\n nativeCurrency: { name: 'POL', symbol: 'POL', decimals: 18 },\n rpcUrls: ['https://polygon.rpc.thirdweb.com'],\n blockExplorerUrls: ['https://polygonscan.com'],\n testnet: false,\n },\n base: {\n id: 8453,\n name: 'Base',\n shortName: 'BASE',\n icon: '\\uD83D\\uDD37',\n nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\n rpcUrls: ['https://base.rpc.thirdweb.com'],\n blockExplorerUrls: ['https://basescan.org'],\n testnet: false,\n },\n arbitrum: {\n id: 42161,\n name: 'Arbitrum One',\n shortName: 'ARB',\n icon: '\\uD83D\\uDD35',\n nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\n rpcUrls: ['https://arbitrum.rpc.thirdweb.com'],\n blockExplorerUrls: ['https://arbiscan.io'],\n testnet: false,\n },\n optimism: {\n id: 10,\n name: 'Optimism',\n shortName: 'OP',\n icon: '\\uD83D\\uDD34',\n nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\n rpcUrls: ['https://optimism.rpc.thirdweb.com'],\n blockExplorerUrls: ['https://optimistic.etherscan.io'],\n testnet: false,\n },\n};\n\n// @deprecated - Use getChains() to get all supported chains\nexport const SUPPORTED_CHAINS = Object.keys(CHAIN_CONFIGS);\n\n// @deprecated - Use getChainByName() instead\nexport function getChainConfig(chain: string): ChainConfig | undefined {\n return CHAIN_CONFIGS[chain.toLowerCase()];\n}\n","/**\n * ONE Engine Client - The unified API gateway for all ONE Ecosystem services\n *\n * All wallet operations, onramp, swap, trading go through ONE Engine.\n * Thirdweb/Onramper/etc are internal to ONE Engine and hidden from clients.\n */\n\nimport { getConfig } from '../config';\nimport type {\n ApiResponse,\n User,\n Token,\n WalletBalance,\n Transaction,\n AIStrategy,\n AIOrder,\n AIOrderStatus,\n AITradeExecution,\n AITradeAllocation,\n AINavSnapshot,\n AIPortfolioSummary,\n AIRedemptionResult,\n AIMarketData,\n CreateAIOrderRequest,\n StrategyCategory,\n NFT,\n NFTCollection,\n Contract,\n ContractReadParams,\n ContractWriteParams,\n ContractDeployParams,\n BillProvider,\n BillPayment,\n OfframpQuote,\n OfframpRequest,\n OfframpTransaction,\n StakingPool,\n StakingPosition,\n ReferralInfo,\n Referral,\n UserProfile,\n UserSettings,\n Notification,\n BridgeQuote,\n BridgeTransaction,\n GasEstimate,\n GasPrice,\n WalletImportRequest,\n PortfolioAnalytics,\n LimitOrder,\n TradingCondition,\n Webhook,\n WebhookDelivery,\n CreateWebhookInput,\n UpdateWebhookInput,\n AdminUser,\n AdminProject,\n SystemStats,\n PaginatedResult,\n AdminListOptions,\n SystemLog,\n RateLimitInfo,\n} from '../types';\n\n// ===== Auth Types =====\nexport interface EngineAuthResponse {\n user: User;\n accessToken: string;\n refreshToken?: string;\n expiresIn: number;\n}\n\n// ===== Wallet Types =====\nexport interface EngineWalletBalance {\n address: string;\n totalUsd: number;\n change24h: number;\n changePercent24h: number;\n tokens: Token[];\n}\n\nexport interface EngineTransactionRequest {\n to: string;\n amount: string;\n tokenSymbol: string;\n chainId: number;\n memo?: string;\n}\n\nexport interface EngineTransactionResponse {\n txId: string;\n status: 'queued' | 'pending' | 'confirmed' | 'failed';\n txHash?: string;\n explorerUrl?: string;\n}\n\n// ===== Onramp Types =====\nexport interface OnrampSessionRequest {\n walletAddress: string;\n fiatCurrency?: string;\n fiatAmount?: number;\n cryptoCurrency?: string;\n cryptoNetwork?: string;\n paymentMethod?: string;\n redirectUrl?: string;\n}\n\nexport interface OnrampSession {\n sessionId: string;\n widgetUrl: string;\n expiresAt: string;\n}\n\nexport interface OnrampQuote {\n provider: string;\n fiatCurrency: string;\n fiatAmount: number;\n cryptoCurrency: string;\n cryptoAmount: number;\n rate: number;\n fees: {\n network: number;\n provider: number;\n total: number;\n };\n paymentMethod: string;\n estimatedTime: string;\n}\n\nexport interface OnrampTransaction {\n id: string;\n sessionId: string;\n status: 'pending' | 'processing' | 'completed' | 'failed' | 'expired';\n fiatAmount: number;\n fiatCurrency: string;\n cryptoAmount?: number;\n cryptoCurrency: string;\n walletAddress: string;\n txHash?: string;\n createdAt: string;\n completedAt?: string;\n}\n\n// ===== Swap Types =====\nexport interface SwapQuoteRequest {\n fromToken: string;\n fromAmount: string;\n fromChainId: number;\n toToken: string;\n toChainId: number;\n walletAddress: string;\n slippage?: number;\n}\n\nexport interface SwapQuote {\n quoteId: string;\n fromToken: string;\n fromAmount: string;\n fromChainId: number;\n toToken: string;\n toAmount: string;\n toChainId: number;\n rate: number;\n priceImpact: number;\n estimatedGas: string;\n estimatedTime: string;\n fees: {\n gas: number;\n protocol: number;\n total: number;\n };\n expiresAt: string;\n}\n\nexport interface SwapExecuteRequest {\n quoteId: string;\n walletAddress: string;\n signature?: string; // For backend wallets\n}\n\nexport interface SwapResult {\n swapId: string;\n status: 'pending' | 'confirming' | 'completed' | 'failed';\n txHash?: string;\n fromAmount: string;\n toAmount?: string;\n}\n\n// ===== Main Client =====\nexport class OneEngineClient {\n private baseUrl: string;\n private clientId: string;\n private secretKey?: string;\n private accessToken?: string;\n\n constructor(options?: {\n baseUrl?: string;\n clientId?: string;\n secretKey?: string;\n }) {\n const config = getConfig();\n this.baseUrl = options?.baseUrl || config.oneEngineUrl;\n this.clientId = options?.clientId || config.oneClientId || '';\n this.secretKey = options?.secretKey || config.oneSecretKey;\n }\n\n /**\n * Set access token for authenticated requests\n */\n setAccessToken(token: string) {\n this.accessToken = token;\n }\n\n /**\n * Clear access token\n */\n clearAccessToken() {\n this.accessToken = undefined;\n }\n\n private getHeaders(includeSecret = false): Record<string, string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'x-client-id': this.clientId,\n };\n\n if (this.accessToken) {\n headers['Authorization'] = `Bearer ${this.accessToken}`;\n }\n\n if (includeSecret && this.secretKey) {\n headers['x-secret-key'] = this.secretKey;\n }\n\n return headers;\n }\n\n private async request<T>(\n endpoint: string,\n options: RequestInit = {},\n includeSecret = false\n ): Promise<ApiResponse<T>> {\n try {\n const response = await fetch(`${this.baseUrl}${endpoint}`, {\n ...options,\n headers: {\n ...this.getHeaders(includeSecret),\n ...options.headers,\n },\n });\n\n const data = await response.json();\n\n if (!response.ok) {\n return {\n success: false,\n error: {\n code: data.error?.code || `HTTP_${response.status}`,\n message: data.error?.message || 'Request failed',\n },\n };\n }\n\n return {\n success: true,\n data: data.data || data,\n };\n } catch (error) {\n return {\n success: false,\n error: {\n code: 'NETWORK_ERROR',\n message: error instanceof Error ? error.message : 'Network request failed',\n },\n };\n }\n }\n\n // ===============================\n // AUTH ENDPOINTS\n // ===============================\n\n /**\n * Send OTP to email for authentication\n */\n async sendEmailOtp(email: string): Promise<ApiResponse<{ message: string }>> {\n return this.request('/api/v1/auth/otp', {\n method: 'POST',\n body: JSON.stringify({ email }),\n });\n }\n\n /**\n * Verify OTP and get access token\n */\n async verifyEmailOtp(email: string, otp: string): Promise<ApiResponse<EngineAuthResponse>> {\n return this.request('/api/v1/auth/otp/verify', {\n method: 'POST',\n body: JSON.stringify({ email, otp }),\n });\n }\n\n /**\n * Authenticate with wallet signature\n */\n async authWithWallet(\n walletAddress: string,\n signature: string,\n message: string\n ): Promise<ApiResponse<EngineAuthResponse>> {\n return this.request('/api/v1/auth/wallet', {\n method: 'POST',\n body: JSON.stringify({ walletAddress, signature, message }),\n });\n }\n\n /**\n * Refresh access token\n */\n async refreshToken(refreshToken: string): Promise<ApiResponse<EngineAuthResponse>> {\n return this.request('/api/v1/auth/refresh', {\n method: 'POST',\n body: JSON.stringify({ refreshToken }),\n });\n }\n\n /**\n * Get current user\n */\n async getCurrentUser(): Promise<ApiResponse<User>> {\n return this.request('/api/v1/auth/me', { method: 'GET' });\n }\n\n /**\n * Sign out\n */\n async signOut(): Promise<ApiResponse<{ success: boolean }>> {\n return this.request('/api/v1/auth/logout', { method: 'POST' });\n }\n\n // ===============================\n // WALLET/ASSETS ENDPOINTS\n // ===============================\n\n /**\n * Get wallet balance across all chains\n */\n async getWalletBalance(\n walletAddress: string,\n chains?: number[]\n ): Promise<ApiResponse<EngineWalletBalance>> {\n const params = new URLSearchParams({ address: walletAddress });\n if (chains?.length && chains.length > 0) {\n params.set('chainId', chains[0].toString()); // Engine expects single chainId\n }\n return this.request(`/api/v1/assets?${params}`, { method: 'GET' });\n }\n\n /**\n * Get portfolio summary\n */\n async getPortfolioSummary(\n walletAddress: string\n ): Promise<ApiResponse<{ totalValue: number; change24h: number; tokens: Token[] }>> {\n const params = new URLSearchParams({ address: walletAddress });\n return this.request(`/api/v1/assets/portfolio?${params}`, { method: 'GET' });\n }\n\n /**\n * Get user's wallets\n */\n async getUserWallets(\n chainId?: number\n ): Promise<ApiResponse<{ wallets: any[]; total: number }>> {\n const params = chainId ? `?chainId=${chainId}` : '';\n return this.request(`/api/v1/wallet${params}`, { method: 'GET' });\n }\n\n /**\n * Create a new wallet\n */\n async createWallet(\n chainId: number = 8453,\n type: 'smart' | 'eoa' | 'multisig' = 'smart'\n ): Promise<ApiResponse<{ wallet: any; smartAccountAddress: string; personalAddress: string }>> {\n return this.request('/api/v1/wallet', {\n method: 'POST',\n body: JSON.stringify({ chainId, type }),\n });\n }\n\n /**\n * Get wallet transactions (placeholder - needs endpoint)\n */\n async getWalletTransactions(\n walletAddress: string,\n options?: { limit?: number; offset?: number; chainId?: number }\n ): Promise<ApiResponse<{ transactions: Transaction[]; total: number }>> {\n const params = new URLSearchParams({ address: walletAddress });\n if (options?.limit) params.set('limit', options.limit.toString());\n if (options?.offset) params.set('offset', options.offset.toString());\n if (options?.chainId) params.set('chainId', options.chainId.toString());\n return this.request(`/api/v1/assets/transactions?${params}`, { method: 'GET' });\n }\n\n /**\n * Send native token or ERC20\n */\n async sendTransaction(\n request: EngineTransactionRequest\n ): Promise<ApiResponse<EngineTransactionResponse>> {\n return this.request('/api/v1/wallet/send', {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /**\n * Get transaction status\n */\n async getTransactionStatus(txId: string): Promise<ApiResponse<EngineTransactionResponse>> {\n return this.request(`/api/v1/wallet/transaction/${txId}`, { method: 'GET' });\n }\n\n // ===============================\n // ONRAMP ENDPOINTS (Fiat-to-Crypto)\n // ===============================\n\n /**\n * Get onramp quote\n */\n async getOnrampQuote(\n fiatCurrency: string,\n fiatAmount: number,\n cryptoCurrency: string,\n paymentMethod?: string\n ): Promise<ApiResponse<OnrampQuote[]>> {\n const params = new URLSearchParams({\n fiatCurrency,\n fiatAmount: fiatAmount.toString(),\n cryptoCurrency,\n });\n if (paymentMethod) params.set('paymentMethod', paymentMethod);\n return this.request(`/api/v1/fiat/onramp/quote?${params}`, { method: 'GET' });\n }\n\n /**\n * Create onramp session (returns widget URL)\n */\n async createOnrampSession(\n request: OnrampSessionRequest\n ): Promise<ApiResponse<OnrampSession>> {\n return this.request('/api/v1/fiat/onramp', {\n method: 'POST',\n body: JSON.stringify({\n fiatCurrency: request.fiatCurrency || 'USD',\n fiatAmount: request.fiatAmount || 100,\n cryptoCurrency: request.cryptoCurrency || 'ETH',\n walletAddress: request.walletAddress,\n chainId: 8453, // Default to Base\n }),\n });\n }\n\n /**\n * Get onramp session status\n */\n async getOnrampStatus(sessionId: string): Promise<ApiResponse<OnrampTransaction>> {\n return this.request(`/api/v1/fiat/onramp/${sessionId}`, { method: 'GET' });\n }\n\n /**\n * Get supported currencies (fiat + crypto)\n */\n async getSupportedCurrencies(): Promise<ApiResponse<{ fiatCurrencies: string[]; cryptoCurrencies: string[] }>> {\n return this.request('/api/v1/fiat/onramp', { method: 'GET' });\n }\n\n /**\n * Get supported fiat currencies\n */\n async getSupportedFiatCurrencies(): Promise<ApiResponse<string[]>> {\n const result = await this.getSupportedCurrencies();\n if (result.success && result.data) {\n return { success: true, data: result.data.fiatCurrencies };\n }\n return { success: false, error: result.error };\n }\n\n /**\n * Get supported payment methods\n */\n async getSupportedPaymentMethods(country?: string): Promise<ApiResponse<string[]>> {\n // Placeholder - engine doesn't have this endpoint yet\n return { success: true, data: ['card', 'bank_transfer', 'apple_pay', 'google_pay'] };\n }\n\n // ===============================\n // SWAP ENDPOINTS\n // ===============================\n\n /**\n * Get swap quote\n */\n async getSwapQuote(request: SwapQuoteRequest): Promise<ApiResponse<SwapQuote>> {\n return this.request('/api/v1/swap/quote', {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /**\n * Execute swap\n */\n async executeSwap(request: SwapExecuteRequest): Promise<ApiResponse<SwapResult>> {\n return this.request('/api/v1/swap/execute', {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /**\n * Get swap status\n */\n async getSwapStatus(swapId: string): Promise<ApiResponse<SwapResult>> {\n return this.request(`/api/v1/swap/${swapId}`, { method: 'GET' });\n }\n\n /**\n * Get supported tokens for swap\n */\n async getSupportedSwapTokens(chainId?: number): Promise<ApiResponse<{ tokens: Token[] }>> {\n const params = chainId ? `?chainId=${chainId}` : '';\n return this.request(`/api/v1/swap/tokens${params}`, { method: 'GET' });\n }\n\n /**\n * Get supported chains for swap\n */\n async getSupportedSwapChains(): Promise<ApiResponse<{ chains: { id: number; name: string }[] }>> {\n return this.request('/api/v1/swap/chains', { method: 'GET' });\n }\n\n // ===============================\n // AI TRADING/QUANT ENDPOINTS\n // ===============================\n\n /**\n * Get available AI trading strategies\n */\n async getStrategies(): Promise<ApiResponse<AIStrategy[]>> {\n return this.request('/api/v1/quant/strategies', { method: 'GET' });\n }\n\n /**\n * Get strategy details\n */\n async getStrategy(strategyId: string): Promise<ApiResponse<AIStrategy>> {\n return this.request(`/api/v1/quant/strategies/${strategyId}`, { method: 'GET' });\n }\n\n /**\n * Get user's positions\n */\n async getPositions(): Promise<ApiResponse<any[]>> {\n return this.request('/api/v1/quant/positions', { method: 'GET' });\n }\n\n /**\n * Create investment order\n */\n async createOrder(\n strategyId: string,\n amount: number,\n currency: string\n ): Promise<ApiResponse<AIOrder>> {\n return this.request('/api/v1/trading/orders', {\n method: 'POST',\n body: JSON.stringify({ strategyId, amount, currency }),\n });\n }\n\n /**\n * Get user's orders\n */\n async getUserOrders(): Promise<ApiResponse<AIOrder[]>> {\n return this.request('/api/v1/trading/orders', { method: 'GET' });\n }\n\n /**\n * Get user's portfolio stats from positions\n */\n async getPortfolioStats(): Promise<ApiResponse<{\n totalInvested: number;\n totalValue: number;\n totalPnl: number;\n totalPnlPercent: number;\n activePositions: number;\n }>> {\n // Derive from positions\n const positionsResult = await this.getPositions();\n if (positionsResult.success && positionsResult.data) {\n const positions = positionsResult.data;\n const totalInvested = positions.reduce((sum, p) => sum + (p.investedAmount || 0), 0);\n const totalValue = positions.reduce((sum, p) => sum + (p.currentValue || 0), 0);\n const totalPnl = totalValue - totalInvested;\n const totalPnlPercent = totalInvested > 0 ? (totalPnl / totalInvested) * 100 : 0;\n return {\n success: true,\n data: {\n totalInvested,\n totalValue,\n totalPnl,\n totalPnlPercent,\n activePositions: positions.filter((p: any) => p.status === 'active').length,\n },\n };\n }\n return {\n success: true,\n data: { totalInvested: 0, totalValue: 0, totalPnl: 0, totalPnlPercent: 0, activePositions: 0 },\n };\n }\n\n // ===============================\n // MARKET/PRICE ENDPOINTS\n // ===============================\n\n /**\n * Get token prices\n */\n async getTokenPrices(symbols: string[]): Promise<ApiResponse<Record<string, {\n price: number;\n change24h: number;\n marketCap?: number;\n }>>> {\n // Convert symbols to Bybit format (add USDT suffix if needed)\n const bybitSymbols = symbols.map(s => {\n const upper = s.toUpperCase();\n if (upper.endsWith('USDT')) return upper;\n return `${upper}USDT`;\n });\n\n const result = await this.request<{ markets: any[] }>(\n `/api/v1/trading/market?symbols=${bybitSymbols.join(',')}`,\n { method: 'GET' }\n );\n\n if (result.success && result.data?.markets) {\n const prices: Record<string, { price: number; change24h: number; marketCap?: number }> = {};\n for (const market of result.data.markets) {\n const symbol = market.symbol?.replace('USDT', '') || '';\n prices[symbol] = {\n price: parseFloat(market.lastPrice) || 0,\n change24h: parseFloat(market.price24hPcnt) * 100 || 0,\n marketCap: undefined, // Bybit doesn't provide this\n };\n }\n return { success: true, data: prices };\n }\n return { success: false, error: result.error };\n }\n\n /**\n * Get market data overview\n */\n async getMarketData(): Promise<ApiResponse<{\n totalMarketCap: number;\n totalVolume24h: number;\n btcDominance: number;\n markets: any[];\n }>> {\n const result = await this.request<{ markets: any[] }>('/api/v1/trading/market', { method: 'GET' });\n if (result.success && result.data?.markets) {\n return {\n success: true,\n data: {\n totalMarketCap: 0, // Would need separate API\n totalVolume24h: result.data.markets.reduce((sum, m) => sum + (parseFloat(m.volume24h) || 0), 0),\n btcDominance: 0, // Would need separate API\n markets: result.data.markets,\n },\n };\n }\n return { success: false, error: result.error };\n }\n\n // ===============================\n // NFT ENDPOINTS\n // ===============================\n\n /**\n * Get user's NFTs\n */\n async getUserNFTs(\n walletAddress: string,\n options?: { chainId?: number; limit?: number; offset?: number }\n ): Promise<ApiResponse<{ nfts: NFT[]; total: number }>> {\n const params = new URLSearchParams({ address: walletAddress });\n if (options?.chainId) params.set('chainId', options.chainId.toString());\n if (options?.limit) params.set('limit', options.limit.toString());\n if (options?.offset) params.set('offset', options.offset.toString());\n return this.request(`/api/v1/assets/nfts?${params}`, { method: 'GET' });\n }\n\n /**\n * Get NFT details\n */\n async getNFTDetails(\n contractAddress: string,\n tokenId: string,\n chainId: number\n ): Promise<ApiResponse<NFT>> {\n return this.request(`/api/v1/assets/nfts/${contractAddress}/${tokenId}?chainId=${chainId}`, { method: 'GET' });\n }\n\n /**\n * Get NFT collection\n */\n async getNFTCollection(\n contractAddress: string,\n chainId: number\n ): Promise<ApiResponse<NFTCollection>> {\n return this.request(`/api/v1/assets/nfts/collection/${contractAddress}?chainId=${chainId}`, { method: 'GET' });\n }\n\n /**\n * Transfer NFT\n */\n async transferNFT(params: {\n contractAddress: string;\n tokenId: string;\n chainId: number;\n to: string;\n tokenType?: 'ERC721' | 'ERC1155';\n amount?: number; // For ERC1155\n }): Promise<ApiResponse<{ txHash: string; status: string }>> {\n return this.request('/api/v1/assets/nfts/transfer', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n // ===============================\n // CONTRACT ENDPOINTS\n // ===============================\n\n /**\n * Get user's contracts\n */\n async getUserContracts(\n options?: { chainId?: number; limit?: number; offset?: number }\n ): Promise<ApiResponse<{ contracts: Contract[]; total: number }>> {\n const params = new URLSearchParams();\n if (options?.chainId) params.set('chainId', options.chainId.toString());\n if (options?.limit) params.set('limit', options.limit.toString());\n if (options?.offset) params.set('offset', options.offset.toString());\n return this.request(`/api/v1/contracts?${params}`, { method: 'GET' });\n }\n\n /**\n * Get contract details\n */\n async getContractDetails(\n address: string,\n chainId: number\n ): Promise<ApiResponse<Contract>> {\n return this.request(`/api/v1/contracts/${address}?chainId=${chainId}`, { method: 'GET' });\n }\n\n /**\n * Read contract (call view function)\n */\n async readContract(params: ContractReadParams): Promise<ApiResponse<any>> {\n return this.request('/api/v1/contracts/read', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n /**\n * Write to contract (execute transaction)\n */\n async writeContract(params: ContractWriteParams): Promise<ApiResponse<{\n txHash: string;\n status: string;\n }>> {\n return this.request('/api/v1/contracts/write', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n /**\n * Deploy contract\n */\n async deployContract(params: ContractDeployParams): Promise<ApiResponse<{\n address: string;\n txHash: string;\n contract: Contract;\n }>> {\n return this.request('/api/v1/contracts/deploy', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n // ===============================\n // OFFRAMP ENDPOINTS (Crypto-to-Fiat)\n // ===============================\n\n /**\n * Get offramp quote\n */\n async getOfframpQuote(\n cryptoCurrency: string,\n cryptoAmount: number,\n fiatCurrency: string,\n payoutMethod?: string\n ): Promise<ApiResponse<OfframpQuote[]>> {\n const params = new URLSearchParams({\n cryptoCurrency,\n cryptoAmount: cryptoAmount.toString(),\n fiatCurrency,\n });\n if (payoutMethod) params.set('payoutMethod', payoutMethod);\n return this.request(`/api/v1/fiat/offramp/quote?${params}`, { method: 'GET' });\n }\n\n /**\n * Create offramp transaction\n */\n async createOfframpTransaction(request: OfframpRequest): Promise<ApiResponse<OfframpTransaction>> {\n return this.request('/api/v1/fiat/offramp', {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /**\n * Get offramp transaction status\n */\n async getOfframpStatus(transactionId: string): Promise<ApiResponse<OfframpTransaction>> {\n return this.request(`/api/v1/fiat/offramp/${transactionId}`, { method: 'GET' });\n }\n\n /**\n * Get supported payout methods\n */\n async getSupportedPayoutMethods(country?: string): Promise<ApiResponse<string[]>> {\n const params = country ? `?country=${country}` : '';\n return this.request(`/api/v1/fiat/offramp/methods${params}`, { method: 'GET' });\n }\n\n // ===============================\n // BILL PAYMENT ENDPOINTS\n // ===============================\n\n /**\n * Get bill providers\n */\n async getBillProviders(\n country?: string,\n category?: string\n ): Promise<ApiResponse<BillProvider[]>> {\n const params = new URLSearchParams();\n if (country) params.set('country', country);\n if (category) params.set('category', category);\n return this.request(`/api/v1/bills/providers?${params}`, { method: 'GET' });\n }\n\n /**\n * Get bill details/validate account\n */\n async validateBillAccount(\n providerId: string,\n accountNumber: string\n ): Promise<ApiResponse<{\n valid: boolean;\n accountName?: string;\n minAmount?: number;\n maxAmount?: number;\n dueAmount?: number;\n }>> {\n return this.request('/api/v1/bills/validate', {\n method: 'POST',\n body: JSON.stringify({ providerId, accountNumber }),\n });\n }\n\n /**\n * Pay bill\n */\n async payBill(params: {\n providerId: string;\n accountNumber: string;\n amount: number;\n currency: string;\n }): Promise<ApiResponse<BillPayment>> {\n return this.request('/api/v1/bills/pay', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n /**\n * Get bill payment history\n */\n async getBillHistory(\n options?: { limit?: number; offset?: number }\n ): Promise<ApiResponse<{ payments: BillPayment[]; total: number }>> {\n const params = new URLSearchParams();\n if (options?.limit) params.set('limit', options.limit.toString());\n if (options?.offset) params.set('offset', options.offset.toString());\n return this.request(`/api/v1/bills/history?${params}`, { method: 'GET' });\n }\n\n // ===============================\n // STAKING ENDPOINTS\n // ===============================\n\n /**\n * Get staking pools\n */\n async getStakingPools(\n chainId?: number\n ): Promise<ApiResponse<StakingPool[]>> {\n const params = chainId ? `?chainId=${chainId}` : '';\n return this.request(`/api/v1/staking/pools${params}`, { method: 'GET' });\n }\n\n /**\n * Get user's staking positions\n */\n async getStakingPositions(): Promise<ApiResponse<StakingPosition[]>> {\n return this.request('/api/v1/staking/positions', { method: 'GET' });\n }\n\n /**\n * Stake tokens\n */\n async stake(params: {\n poolId: string;\n amount: number;\n }): Promise<ApiResponse<{ positionId: string; txHash: string }>> {\n return this.request('/api/v1/staking/stake', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n /**\n * Unstake tokens\n */\n async unstake(params: {\n positionId: string;\n amount?: number; // Optional for partial unstake\n }): Promise<ApiResponse<{ txHash: string }>> {\n return this.request('/api/v1/staking/unstake', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n /**\n * Claim staking rewards\n */\n async claimStakingRewards(positionId: string): Promise<ApiResponse<{ txHash: string; amount: number }>> {\n return this.request('/api/v1/staking/claim', {\n method: 'POST',\n body: JSON.stringify({ positionId }),\n });\n }\n\n // ===============================\n // USER PROFILE ENDPOINTS\n // ===============================\n\n /**\n * Get user profile\n */\n async getUserProfile(): Promise<ApiResponse<UserProfile>> {\n return this.request('/api/v1/user/profile', { method: 'GET' });\n }\n\n /**\n * Update user profile\n */\n async updateUserProfile(updates: Partial<UserProfile>): Promise<ApiResponse<UserProfile>> {\n return this.request('/api/v1/user/profile', {\n method: 'PATCH',\n body: JSON.stringify(updates),\n });\n }\n\n /**\n * Get user settings\n */\n async getUserSettings(): Promise<ApiResponse<UserSettings>> {\n return this.request('/api/v1/user/settings', { method: 'GET' });\n }\n\n /**\n * Update user settings\n */\n async updateUserSettings(updates: Partial<UserSettings>): Promise<ApiResponse<UserSettings>> {\n return this.request('/api/v1/user/settings', {\n method: 'PATCH',\n body: JSON.stringify(updates),\n });\n }\n\n // ===============================\n // NOTIFICATION ENDPOINTS\n // ===============================\n\n /**\n * Get notifications\n */\n async getNotifications(\n options?: { unreadOnly?: boolean; limit?: number; offset?: number }\n ): Promise<ApiResponse<{ notifications: Notification[]; unreadCount: number }>> {\n const params = new URLSearchParams();\n if (options?.unreadOnly) params.set('unreadOnly', 'true');\n if (options?.limit) params.set('limit', options.limit.toString());\n if (options?.offset) params.set('offset', options.offset.toString());\n return this.request(`/api/v1/notifications?${params}`, { method: 'GET' });\n }\n\n /**\n * Mark notification as read\n */\n async markNotificationRead(notificationId: string): Promise<ApiResponse<void>> {\n return this.request(`/api/v1/notifications/${notificationId}/read`, { method: 'POST' });\n }\n\n /**\n * Mark all notifications as read\n */\n async markAllNotificationsRead(): Promise<ApiResponse<void>> {\n return this.request('/api/v1/notifications/read-all', { method: 'POST' });\n }\n\n // ===============================\n // REFERRAL ENDPOINTS\n // ===============================\n\n /**\n * Get referral info\n */\n async getReferralInfo(): Promise<ApiResponse<ReferralInfo>> {\n return this.request('/api/v1/referral', { method: 'GET' });\n }\n\n /**\n * Get referred users\n */\n async getReferrals(): Promise<ApiResponse<Referral[]>> {\n return this.request('/api/v1/referral/list', { method: 'GET' });\n }\n\n /**\n * Apply referral code\n */\n async applyReferralCode(code: string): Promise<ApiResponse<{ success: boolean; message: string }>> {\n return this.request('/api/v1/referral/apply', {\n method: 'POST',\n body: JSON.stringify({ code }),\n });\n }\n\n /**\n * Claim referral rewards\n */\n async claimReferralRewards(): Promise<ApiResponse<{ amount: number; txHash?: string }>> {\n return this.request('/api/v1/referral/claim', { method: 'POST' });\n }\n\n // ===============================\n // KYC ENDPOINTS\n // ===============================\n\n /**\n * Get KYC status\n */\n async getKycStatus(): Promise<ApiResponse<{\n status: 'none' | 'pending' | 'verified' | 'rejected';\n level: number;\n limits: { daily: number; monthly: number };\n rejectionReason?: string;\n }>> {\n return this.request('/api/v1/kyc/status', { method: 'GET' });\n }\n\n /**\n * Start KYC verification\n */\n async startKycVerification(level: number): Promise<ApiResponse<{\n verificationUrl: string;\n sessionId: string;\n }>> {\n return this.request('/api/v1/kyc/start', {\n method: 'POST',\n body: JSON.stringify({ level }),\n });\n }\n\n /**\n * Submit KYC documents\n */\n async submitKycDocuments(params: {\n documentType: 'passport' | 'id_card' | 'drivers_license';\n frontImage: string; // base64\n backImage?: string; // base64\n selfieImage: string; // base64\n }): Promise<ApiResponse<{ status: string; message: string }>> {\n return this.request('/api/v1/kyc/submit', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n // ===============================\n // BRIDGE ENDPOINTS\n // ===============================\n\n /**\n * Get bridge quote\n */\n async getBridgeQuote(params: {\n fromChainId: number;\n toChainId: number;\n fromToken: string;\n toToken: string;\n amount: string;\n walletAddress: string;\n }): Promise<ApiResponse<BridgeQuote>> {\n return this.request('/api/v1/bridge/quote', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n /**\n * Execute bridge transaction\n */\n async executeBridge(params: {\n quoteId: string;\n walletAddress: string;\n }): Promise<ApiResponse<BridgeTransaction>> {\n return this.request('/api/v1/bridge/execute', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n /**\n * Get bridge transaction status\n */\n async getBridgeStatus(bridgeId: string): Promise<ApiResponse<BridgeTransaction>> {\n return this.request(`/api/v1/bridge/${bridgeId}`, { method: 'GET' });\n }\n\n /**\n * Get supported bridge routes\n */\n async getSupportedBridgeRoutes(): Promise<ApiResponse<{\n routes: { fromChainId: number; toChainId: number; tokens: string[] }[];\n }>> {\n return this.request('/api/v1/bridge/routes', { method: 'GET' });\n }\n\n // ===============================\n // GAS ENDPOINTS\n // ===============================\n\n /**\n * Get gas estimate for transaction\n */\n async getGasEstimate(params: {\n chainId: number;\n to: string;\n data?: string;\n value?: string;\n }): Promise<ApiResponse<GasEstimate>> {\n return this.request('/api/v1/gas/estimate', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n /**\n * Get current gas prices for chain\n */\n async getGasPrice(chainId: number): Promise<ApiResponse<GasPrice>> {\n return this.request(`/api/v1/gas/price?chainId=${chainId}`, { method: 'GET' });\n }\n\n // ===============================\n // WALLET IMPORT/EXPORT ENDPOINTS\n // ===============================\n\n /**\n * Import wallet from private key or mnemonic\n */\n async importWallet(request: WalletImportRequest): Promise<ApiResponse<{\n wallet: any;\n address: string;\n smartAccountAddress?: string;\n }>> {\n return this.request('/api/v1/wallet/import', {\n method: 'POST',\n body: JSON.stringify(request),\n }, true); // Include secret key for secure import\n }\n\n /**\n * Export wallet (get encrypted private key)\n * Requires additional authentication\n */\n async exportWallet(walletId: string, pin: string): Promise<ApiResponse<{\n encryptedPrivateKey: string;\n address: string;\n }>> {\n return this.request('/api/v1/wallet/export', {\n method: 'POST',\n body: JSON.stringify({ walletId, pin }),\n }, true);\n }\n\n /**\n * Generate new mnemonic phrase\n */\n async generateMnemonic(): Promise<ApiResponse<{ mnemonic: string; address: string }>> {\n return this.request('/api/v1/wallet/generate-mnemonic', { method: 'POST' }, true);\n }\n\n /**\n * Validate mnemonic phrase\n */\n async validateMnemonic(mnemonic: string): Promise<ApiResponse<{ valid: boolean; address?: string }>> {\n return this.request('/api/v1/wallet/validate-mnemonic', {\n method: 'POST',\n body: JSON.stringify({ mnemonic }),\n });\n }\n\n // ===============================\n // PORTFOLIO ANALYTICS ENDPOINTS\n // ===============================\n\n /**\n * Get portfolio analytics with historical data\n */\n async getPortfolioAnalytics(\n walletAddress: string,\n period: '24h' | '7d' | '30d' | '90d' | '1y' | 'all' = '30d'\n ): Promise<ApiResponse<PortfolioAnalytics>> {\n const params = new URLSearchParams({ address: walletAddress, period });\n return this.request(`/api/v1/analytics/portfolio?${params}`, { method: 'GET' });\n }\n\n /**\n * Get transaction analytics\n */\n async getTransactionAnalytics(\n walletAddress: string,\n period: '24h' | '7d' | '30d' | '90d' = '30d'\n ): Promise<ApiResponse<{\n totalTransactions: number;\n totalVolume: number;\n avgTransactionValue: number;\n byType: Record<string, number>;\n byChain: Record<string, number>;\n }>> {\n const params = new URLSearchParams({ address: walletAddress, period });\n return this.request(`/api/v1/analytics/transactions?${params}`, { method: 'GET' });\n }\n\n // ===============================\n // ADVANCED TRADING ENDPOINTS\n // ===============================\n\n /**\n * Create limit order\n */\n async createLimitOrder(params: {\n tokenSymbol: string;\n type: 'buy' | 'sell';\n amount: number;\n limitPrice: number;\n chainId: number;\n expiresIn?: number; // seconds\n conditions?: TradingCondition[];\n }): Promise<ApiResponse<LimitOrder>> {\n return this.request('/api/v1/trading/limit-orders', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n /**\n * Get user's limit orders\n */\n async getLimitOrders(status?: 'pending' | 'filled' | 'cancelled'): Promise<ApiResponse<LimitOrder[]>> {\n const params = status ? `?status=${status}` : '';\n return this.request(`/api/v1/trading/limit-orders${params}`, { method: 'GET' });\n }\n\n /**\n * Cancel limit order\n */\n async cancelLimitOrder(orderId: string): Promise<ApiResponse<{ success: boolean }>> {\n return this.request(`/api/v1/trading/limit-orders/${orderId}`, { method: 'DELETE' });\n }\n\n /**\n * Set price alert\n */\n async setPriceAlert(params: {\n tokenSymbol: string;\n targetPrice: number;\n condition: 'above' | 'below';\n notification: 'push' | 'email' | 'both';\n }): Promise<ApiResponse<{ alertId: string }>> {\n return this.request('/api/v1/trading/alerts', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n /**\n * Get price alerts\n */\n async getPriceAlerts(): Promise<ApiResponse<{\n id: string;\n tokenSymbol: string;\n targetPrice: number;\n condition: 'above' | 'below';\n status: 'active' | 'triggered' | 'cancelled';\n createdAt: string;\n triggeredAt?: string;\n }[]>> {\n return this.request('/api/v1/trading/alerts', { method: 'GET' });\n }\n\n /**\n * Delete price alert\n */\n async deletePriceAlert(alertId: string): Promise<ApiResponse<{ success: boolean }>> {\n return this.request(`/api/v1/trading/alerts/${alertId}`, { method: 'DELETE' });\n }\n\n // ===============================\n // SESSION MANAGEMENT\n // ===============================\n\n /**\n * Get active sessions\n */\n async getActiveSessions(): Promise<ApiResponse<{\n sessions: {\n id: string;\n deviceName: string;\n ipAddress: string;\n lastActive: string;\n current: boolean;\n }[];\n }>> {\n return this.request('/api/v1/auth/sessions', { method: 'GET' });\n }\n\n /**\n * Revoke session\n */\n async revokeSession(sessionId: string): Promise<ApiResponse<{ success: boolean }>> {\n return this.request(`/api/v1/auth/sessions/${sessionId}`, { method: 'DELETE' });\n }\n\n /**\n * Revoke all other sessions\n */\n async revokeAllOtherSessions(): Promise<ApiResponse<{ revokedCount: number }>> {\n return this.request('/api/v1/auth/sessions/revoke-all', { method: 'POST' });\n }\n\n // ========== Webhooks ==========\n\n /**\n * List webhooks for the project\n */\n async listWebhooks(options?: { isActive?: boolean }): Promise<ApiResponse<{ webhooks: Webhook[]; total: number }>> {\n const params = new URLSearchParams();\n if (options?.isActive !== undefined) params.set('isActive', String(options.isActive));\n const query = params.toString();\n return this.request(`/api/v1/webhooks${query ? `?${query}` : ''}`, { method: 'GET' });\n }\n\n /**\n * Get webhook by ID\n */\n async getWebhook(webhookId: string): Promise<ApiResponse<{ webhook: Webhook }>> {\n return this.request(`/api/v1/webhooks/${webhookId}`, { method: 'GET' });\n }\n\n /**\n * Create a webhook\n */\n async createWebhook(input: CreateWebhookInput): Promise<ApiResponse<{ webhook: Webhook }>> {\n return this.request('/api/v1/webhooks', {\n method: 'POST',\n body: JSON.stringify(input),\n });\n }\n\n /**\n * Update a webhook\n */\n async updateWebhook(webhookId: string, input: UpdateWebhookInput): Promise<ApiResponse<{ webhook: Webhook }>> {\n return this.request(`/api/v1/webhooks/${webhookId}`, {\n method: 'PATCH',\n body: JSON.stringify(input),\n });\n }\n\n /**\n * Delete a webhook\n */\n async deleteWebhook(webhookId: string): Promise<ApiResponse<{ deleted: boolean }>> {\n return this.request(`/api/v1/webhooks/${webhookId}`, { method: 'DELETE' });\n }\n\n /**\n * Get webhook deliveries\n */\n async getWebhookDeliveries(\n webhookId: string,\n options?: { status?: 'pending' | 'success' | 'failed'; limit?: number; offset?: number }\n ): Promise<ApiResponse<{ deliveries: WebhookDelivery[]; total: number }>> {\n const params = new URLSearchParams();\n if (options?.status) params.set('status', options.status);\n if (options?.limit) params.set('limit', String(options.limit));\n if (options?.offset) params.set('offset', String(options.offset));\n const query = params.toString();\n return this.request(`/api/v1/webhooks/${webhookId}/deliveries${query ? `?${query}` : ''}`, { method: 'GET' });\n }\n\n /**\n * Test a webhook\n */\n async testWebhook(webhookId: string): Promise<ApiResponse<{\n success: boolean;\n statusCode?: number;\n responseTime?: number;\n error?: string;\n }>> {\n return this.request(`/api/v1/webhooks/${webhookId}/test`, { method: 'POST' });\n }\n\n // ========== Admin (requires admin role) ==========\n\n /**\n * List all users (admin only)\n */\n async adminListUsers(options?: AdminListOptions & {\n role?: 'user' | 'admin';\n kycStatus?: 'none' | 'pending' | 'verified' | 'rejected';\n isActive?: boolean;\n }): Promise<ApiResponse<PaginatedResult<AdminUser>>> {\n const params = new URLSearchParams();\n if (options?.page) params.set('page', String(options.page));\n if (options?.limit) params.set('limit', String(options.limit));\n if (options?.search) params.set('search', options.search);\n if (options?.sortBy) params.set('sortBy', options.sortBy);\n if (options?.sortOrder) params.set('sortOrder', options.sortOrder);\n if (options?.role) params.set('role', options.role);\n if (options?.kycStatus) params.set('kycStatus', options.kycStatus);\n if (options?.isActive !== undefined) params.set('isActive', String(options.isActive));\n const query = params.toString();\n return this.request(`/api/v1/admin/users${query ? `?${query}` : ''}`, { method: 'GET' });\n }\n\n /**\n * Get user by ID (admin only)\n */\n async adminGetUser(userId: string): Promise<ApiResponse<{ user: AdminUser }>> {\n return this.request(`/api/v1/admin/users/${userId}`, { method: 'GET' });\n }\n\n /**\n * Update user (admin only)\n */\n async adminUpdateUser(userId: string, data: {\n role?: 'user' | 'admin';\n isActive?: boolean;\n kycStatus?: 'none' | 'pending' | 'verified' | 'rejected';\n }): Promise<ApiResponse<{ user: AdminUser }>> {\n return this.request(`/api/v1/admin/users/${userId}`, {\n method: 'PATCH',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * List all projects (admin only)\n */\n async adminListProjects(options?: AdminListOptions & {\n isActive?: boolean;\n }): Promise<ApiResponse<PaginatedResult<AdminProject>>> {\n const params = new URLSearchParams();\n if (options?.page) params.set('page', String(options.page));\n if (options?.limit) params.set('limit', String(options.limit));\n if (options?.search) params.set('search', options.search);\n if (options?.sortBy) params.set('sortBy', options.sortBy);\n if (options?.sortOrder) params.set('sortOrder', options.sortOrder);\n if (options?.isActive !== undefined) params.set('isActive', String(options.isActive));\n const query = params.toString();\n return this.request(`/api/v1/admin/projects${query ? `?${query}` : ''}`, { method: 'GET' });\n }\n\n /**\n * Get project by ID (admin only)\n */\n async adminGetProject(projectId: string): Promise<ApiResponse<{ project: AdminProject }>> {\n return this.request(`/api/v1/admin/projects/${projectId}`, { method: 'GET' });\n }\n\n /**\n * Update project (admin only)\n */\n async adminUpdateProject(projectId: string, data: {\n name?: string;\n isActive?: boolean;\n settings?: Record<string, unknown>;\n }): Promise<ApiResponse<{ project: AdminProject }>> {\n return this.request(`/api/v1/admin/projects/${projectId}`, {\n method: 'PATCH',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * Regenerate project API key (admin only)\n */\n async adminRegenerateApiKey(projectId: string): Promise<ApiResponse<{ apiKey: string }>> {\n return this.request(`/api/v1/admin/projects/${projectId}/regenerate-key`, { method: 'POST' });\n }\n\n /**\n * Get system statistics (admin only)\n */\n async adminGetStats(days?: number): Promise<ApiResponse<SystemStats>> {\n const query = days ? `?days=${days}` : '';\n return this.request(`/api/v1/admin/stats${query}`, { method: 'GET' });\n }\n\n /**\n * Get system logs (admin only)\n */\n async adminGetLogs(options?: {\n level?: 'info' | 'warn' | 'error';\n service?: string;\n limit?: number;\n offset?: number;\n startDate?: string;\n endDate?: string;\n }): Promise<ApiResponse<{ logs: SystemLog[]; total: number }>> {\n const params = new URLSearchParams();\n if (options?.level) params.set('level', options.level);\n if (options?.service) params.set('service', options.service);\n if (options?.limit) params.set('limit', String(options.limit));\n if (options?.offset) params.set('offset', String(options.offset));\n if (options?.startDate) params.set('startDate', options.startDate);\n if (options?.endDate) params.set('endDate', options.endDate);\n const query = params.toString();\n return this.request(`/api/v1/admin/logs${query ? `?${query}` : ''}`, { method: 'GET' });\n }\n\n /**\n * Get rate limit status (admin only)\n */\n async adminGetRateLimits(options?: {\n identifier?: string;\n limit?: number;\n }): Promise<ApiResponse<{ limits: RateLimitInfo[] }>> {\n const params = new URLSearchParams();\n if (options?.identifier) params.set('identifier', options.identifier);\n if (options?.limit) params.set('limit', String(options.limit));\n const query = params.toString();\n return this.request(`/api/v1/admin/rate-limits${query ? `?${query}` : ''}`, { method: 'GET' });\n }\n\n /**\n * Clear rate limits for an identifier (admin only)\n */\n async adminClearRateLimits(identifier: string): Promise<ApiResponse<{ success: boolean }>> {\n return this.request(`/api/v1/admin/rate-limits/${identifier}`, { method: 'DELETE' });\n }\n\n // ========== AI Agent Configuration ==========\n\n /**\n * Get all AI agent configurations\n * This returns the full agent setup including tiers, cycles, and trading parameters\n */\n async getAgentConfigs(options?: {\n includeInactive?: boolean;\n agentId?: string;\n }): Promise<ApiResponse<{\n agents?: Array<{\n id: string;\n name: string;\n name_zh: string;\n description: string;\n description_zh: string;\n category: string;\n risk_level: number;\n icon: string;\n color: string;\n tiers: Array<{ tier: number; amount: number; label: string; label_zh: string }>;\n supported_cycles: number[];\n default_cycle: number;\n supported_pairs: string[];\n supported_chains: string[];\n is_active: boolean;\n preview: {\n tier: { tier: number; amount: number; label: string };\n cycle: number;\n dailyLots: number;\n stabilityScore: number;\n roiRange: { min: number; max: number; userMin: number; userMax: number };\n shareRate: number;\n profitEstimate: { monthlyMin: number; monthlyMax: number; cycleMin: number; cycleMax: number };\n };\n }>;\n agent?: any;\n shareRates?: Record<number, number>;\n }>> {\n const params = new URLSearchParams();\n if (options?.includeInactive) params.set('includeInactive', 'true');\n if (options?.agentId) params.set('agentId', options.agentId);\n const query = params.toString();\n return this.request(`/api/v1/agents${query ? `?${query}` : ''}`, { method: 'GET' });\n }\n\n /**\n * Calculate subscription parameters for an agent\n */\n async calculateAgentParams(params: {\n agentId: string;\n amount: number;\n cycleDays: number;\n }): Promise<ApiResponse<{\n dailyLots: number;\n effectiveCapital: number;\n stabilityScore: number;\n roiRange: { min: number; max: number; userMin: number; userMax: number };\n shareRate: number;\n profitEstimate: { monthlyMin: number; monthlyMax: number; cycleMin: number; cycleMax: number };\n }>> {\n return this.request('/api/v1/agents/calculate', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n /**\n * Get supported trading pairs from agents\n */\n async getTradingPairs(): Promise<ApiResponse<{\n pairs: string[];\n byAgent: Record<string, string[]>;\n }>> {\n const result = await this.getAgentConfigs();\n if (result.success && result.data?.agents) {\n const allPairs = new Set<string>();\n const byAgent: Record<string, string[]> = {};\n for (const agent of result.data.agents) {\n byAgent[agent.id] = agent.supported_pairs;\n agent.supported_pairs.forEach(p => allPairs.add(p));\n }\n return { success: true, data: { pairs: Array.from(allPairs), byAgent } };\n }\n return { success: false, error: result.error };\n }\n\n // ========== AI Quant Trading ==========\n\n /**\n * Get all AI trading strategies\n */\n async getAIStrategies(filters?: {\n category?: StrategyCategory;\n riskLevel?: number;\n minTvl?: number;\n isActive?: boolean;\n }): Promise<ApiResponse<{ strategies: AIStrategy[] }>> {\n const params = new URLSearchParams();\n if (filters?.category) params.set('category', filters.category);\n if (filters?.riskLevel) params.set('risk_level', String(filters.riskLevel));\n if (filters?.minTvl) params.set('min_tvl', String(filters.minTvl));\n if (filters?.isActive !== undefined) params.set('is_active', String(filters.isActive));\n const query = params.toString();\n return this.request(`/api/v1/ai-quant/strategies${query ? `?${query}` : ''}`, { method: 'GET' });\n }\n\n /**\n * Get AI strategy details\n */\n async getAIStrategy(strategyId: string, include?: ('performance' | 'market' | 'trades')[]): Promise<ApiResponse<{\n strategy: AIStrategy;\n performance?: AINavSnapshot[];\n marketData?: AIMarketData[];\n trades?: AITradeExecution[];\n }>> {\n const params = new URLSearchParams();\n if (include?.length) params.set('include', include.join(','));\n const query = params.toString();\n return this.request(`/api/v1/ai-quant/strategies/${strategyId}${query ? `?${query}` : ''}`, { method: 'GET' });\n }\n\n /**\n * Get strategy performance history\n */\n async getAIStrategyPerformance(strategyId: string, days = 30): Promise<ApiResponse<{ performance: AINavSnapshot[] }>> {\n return this.request(`/api/v1/ai-quant/strategies/${strategyId}?include=performance&days=${days}`, { method: 'GET' });\n }\n\n /**\n * Get real-time market data for strategy pairs\n */\n async getAIStrategyMarketData(strategyId: string): Promise<ApiResponse<{ marketData: AIMarketData[] }>> {\n return this.request(`/api/v1/ai-quant/strategies/${strategyId}?include=market`, { method: 'GET' });\n }\n\n /**\n * Create AI trading order\n */\n async createAIOrder(request: CreateAIOrderRequest): Promise<ApiResponse<{ order: AIOrder }>> {\n return this.request('/api/v1/ai-quant/orders', {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /**\n * Get user's AI orders\n */\n async getAIOrders(filters?: {\n strategyId?: string;\n status?: AIOrderStatus;\n }): Promise<ApiResponse<{ orders: AIOrder[] }>> {\n const params = new URLSearchParams();\n if (filters?.strategyId) params.set('strategy_id', filters.strategyId);\n if (filters?.status) params.set('status', filters.status);\n const query = params.toString();\n return this.request(`/api/v1/ai-quant/orders${query ? `?${query}` : ''}`, { method: 'GET' });\n }\n\n /**\n * Get AI order details\n */\n async getAIOrder(orderId: string): Promise<ApiResponse<{\n order: AIOrder;\n strategy: AIStrategy;\n }>> {\n return this.request(`/api/v1/ai-quant/orders/${orderId}`, { method: 'GET' });\n }\n\n /**\n * Pause AI order\n */\n async pauseAIOrder(orderId: string): Promise<ApiResponse<{ order: AIOrder; message: string }>> {\n return this.request(`/api/v1/ai-quant/orders/${orderId}/pause`, { method: 'POST' });\n }\n\n /**\n * Resume AI order\n */\n async resumeAIOrder(orderId: string): Promise<ApiResponse<{ order: AIOrder; message: string }>> {\n return this.request(`/api/v1/ai-quant/orders/${orderId}/resume`, { method: 'POST' });\n }\n\n /**\n * Request redemption for AI order\n */\n async redeemAIOrder(orderId: string): Promise<ApiResponse<{\n success: boolean;\n redemption: AIRedemptionResult;\n message: string;\n }>> {\n return this.request(`/api/v1/ai-quant/orders/${orderId}/redeem`, { method: 'POST' });\n }\n\n /**\n * Get AI portfolio summary\n */\n async getAIPortfolio(include?: ('allocations' | 'orders')[]): Promise<ApiResponse<{\n portfolio: AIPortfolioSummary;\n allocations?: AITradeAllocation[];\n orders?: AIOrder[];\n }>> {\n const params = new URLSearchParams();\n if (include?.length) params.set('include', include.join(','));\n const query = params.toString();\n return this.request(`/api/v1/ai-quant/portfolio${query ? `?${query}` : ''}`, { method: 'GET' });\n }\n\n /**\n * Get user's trade allocations\n */\n async getAITradeAllocations(limit = 50): Promise<ApiResponse<{ allocations: AITradeAllocation[] }>> {\n return this.request(`/api/v1/ai-quant/portfolio?include=allocations&limit=${limit}`, { method: 'GET' });\n }\n\n /**\n * Get trade history for a strategy\n */\n async getAITradeHistory(strategyId: string, limit = 50): Promise<ApiResponse<{ trades: AITradeExecution[] }>> {\n return this.request(`/api/v1/ai-quant/strategies/${strategyId}?include=trades&limit=${limit}`, { method: 'GET' });\n }\n\n /**\n * Execute AI signals for a strategy (admin only)\n */\n async executeAISignals(strategyId: string): Promise<ApiResponse<{\n executions: AITradeExecution[];\n count: number;\n message: string;\n }>> {\n return this.request('/api/v1/ai-quant/execute', {\n method: 'POST',\n body: JSON.stringify({ strategyId }),\n });\n }\n\n // ========== Free Price APIs (No API Key Required) ==========\n\n /**\n * Get cryptocurrency prices (FREE - uses CoinGecko/Binance/CoinCap)\n */\n async getCryptoPrices(symbols: string[]): Promise<ApiResponse<{\n prices: Array<{\n symbol: string;\n price: number;\n change24h: number;\n changePercent24h: number;\n high24h: number;\n low24h: number;\n volume24h: number;\n marketCap?: number;\n lastUpdated: string;\n }>;\n }>> {\n return this.request(`/api/v1/prices?symbols=${symbols.join(',')}`, { method: 'GET' });\n }\n\n /**\n * Get single cryptocurrency price (FREE)\n */\n async getCryptoPrice(symbol: string): Promise<ApiResponse<{\n price: {\n symbol: string;\n price: number;\n change24h: number;\n changePercent24h: number;\n high24h: number;\n low24h: number;\n volume24h: number;\n marketCap?: number;\n lastUpdated: string;\n };\n }>> {\n return this.request(`/api/v1/prices/${symbol}`, { method: 'GET' });\n }\n\n /**\n * Get OHLCV candles for charting (FREE - from Binance)\n */\n async getCryptoCandles(\n symbol: string,\n interval: '1m' | '5m' | '15m' | '1h' | '4h' | '1d' = '1h',\n limit = 100\n ): Promise<ApiResponse<{\n symbol: string;\n interval: string;\n candles: Array<{\n timestamp: number;\n open: number;\n high: number;\n low: number;\n close: number;\n volume: number;\n }>;\n }>> {\n return this.request(`/api/v1/prices/${symbol}?candles=true&interval=${interval}&limit=${limit}`, { method: 'GET' });\n }\n\n /**\n * Get top cryptocurrencies by market cap (FREE)\n */\n async getTopCryptos(limit = 20): Promise<ApiResponse<{\n prices: Array<{\n symbol: string;\n price: number;\n change24h: number;\n changePercent24h: number;\n high24h: number;\n low24h: number;\n volume24h: number;\n marketCap?: number;\n lastUpdated: string;\n }>;\n }>> {\n return this.request(`/api/v1/prices?type=top&limit=${limit}`, { method: 'GET' });\n }\n\n /**\n * Get crypto market overview (FREE)\n */\n async getCryptoMarketOverview(): Promise<ApiResponse<{\n overview: {\n totalMarketCap: number;\n totalVolume24h: number;\n btcDominance: number;\n marketCapChange24h: number;\n activeCryptocurrencies: number;\n };\n }>> {\n return this.request('/api/v1/prices?type=overview', { method: 'GET' });\n }\n\n // ========== Project Management ==========\n\n /**\n * Get user's projects\n */\n async getProjects(options?: {\n isActive?: boolean;\n }): Promise<ApiResponse<{ projects: AdminProject[]; total: number }>> {\n const params = new URLSearchParams();\n if (options?.isActive !== undefined) params.set('isActive', String(options.isActive));\n const query = params.toString();\n return this.request(`/api/v1/projects${query ? `?${query}` : ''}`, { method: 'GET' });\n }\n\n /**\n * Create a new project for ecosystem partners\n */\n async createProject(params: {\n name: string;\n slug: string;\n settings?: Record<string, unknown>;\n }): Promise<ApiResponse<{ project: AdminProject }>> {\n return this.request('/api/v1/projects', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n /**\n * Get project details\n */\n async getProject(projectId: string): Promise<ApiResponse<{ project: AdminProject }>> {\n return this.request(`/api/v1/projects/${projectId}`, { method: 'GET' });\n }\n\n /**\n * Update project settings\n */\n async updateProject(projectId: string, updates: {\n name?: string;\n isActive?: boolean;\n settings?: Record<string, unknown>;\n }): Promise<ApiResponse<{ project: AdminProject }>> {\n return this.request(`/api/v1/projects/${projectId}`, {\n method: 'PATCH',\n body: JSON.stringify(updates),\n });\n }\n\n /**\n * Get project features status\n */\n async getProjectFeatures(projectId: string): Promise<ApiResponse<{\n features: Record<string, {\n enabled: boolean;\n name: string;\n description: string;\n description_zh: string;\n }>;\n availableFeatures: string[];\n }>> {\n return this.request(`/api/v1/projects/${projectId}/features`, { method: 'GET' });\n }\n\n /**\n * Enable/disable features for a project\n */\n async updateProjectFeatures(projectId: string, features: {\n wallet?: boolean;\n swap?: boolean;\n contracts?: boolean;\n fiat?: boolean;\n payments?: boolean;\n quant?: boolean;\n ai?: boolean;\n x402?: boolean;\n }): Promise<ApiResponse<{ project: AdminProject; message: string }>> {\n return this.request(`/api/v1/projects/${projectId}/features`, {\n method: 'PATCH',\n body: JSON.stringify(features),\n });\n }\n\n /**\n * Regenerate project API key\n */\n async regenerateProjectApiKey(projectId: string): Promise<ApiResponse<{ apiKey: string }>> {\n return this.request(`/api/v1/projects/${projectId}/api-key`, { method: 'POST' });\n }\n\n /**\n * Delete project\n */\n async deleteProject(projectId: string): Promise<ApiResponse<{ deleted: boolean }>> {\n return this.request(`/api/v1/projects/${projectId}`, { method: 'DELETE' });\n }\n}\n\n// Factory function\nexport function createOneEngineClient(options?: {\n baseUrl?: string;\n clientId?: string;\n secretKey?: string;\n}): OneEngineClient {\n return new OneEngineClient(options);\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport { createOneEngineClient, type EngineWalletBalance } from '../services/engine';\nimport type { Token } from '../types';\n\ninterface UseWalletBalanceOptions {\n chains?: number[];\n autoRefresh?: boolean;\n refreshInterval?: number; // in milliseconds\n engineUrl?: string;\n clientId?: string;\n}\n\ninterface UseWalletBalanceReturn {\n balance: EngineWalletBalance | null;\n tokens: Token[];\n totalUsd: number;\n change24h: number;\n changePercent24h: number;\n isLoading: boolean;\n error: string | null;\n refetch: () => Promise<void>;\n}\n\n/**\n * Hook for fetching wallet balance via ONE Engine\n *\n * Note: If using OneProvider, prefer useOneWallet() instead for better integration.\n * This hook is for standalone usage outside of OneProvider.\n */\nexport function useWalletBalance(\n walletAddress: string | null,\n options: UseWalletBalanceOptions = {}\n): UseWalletBalanceReturn {\n const {\n chains,\n autoRefresh = false,\n refreshInterval = 60000, // 1 minute\n engineUrl,\n clientId,\n } = options;\n\n const [balance, setBalance] = useState<EngineWalletBalance | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n // Create engine client once\n const engineRef = useRef(createOneEngineClient({\n baseUrl: engineUrl,\n clientId: clientId,\n }));\n\n const fetchBalance = useCallback(async () => {\n if (!walletAddress) {\n setBalance(null);\n return;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await engineRef.current.getWalletBalance(walletAddress, chains);\n if (result.success && result.data) {\n setBalance(result.data);\n } else {\n setError(result.error?.message || 'Failed to fetch balance');\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to fetch balance');\n } finally {\n setIsLoading(false);\n }\n }, [walletAddress, chains]);\n\n // Initial fetch\n useEffect(() => {\n fetchBalance();\n }, [fetchBalance]);\n\n // Auto-refresh\n useEffect(() => {\n if (!autoRefresh || !walletAddress) return;\n\n const interval = setInterval(fetchBalance, refreshInterval);\n return () => clearInterval(interval);\n }, [autoRefresh, refreshInterval, fetchBalance, walletAddress]);\n\n return {\n balance,\n tokens: balance?.tokens || [],\n totalUsd: balance?.totalUsd || 0,\n change24h: balance?.change24h || 0,\n changePercent24h: balance?.changePercent24h || 0,\n isLoading,\n error,\n refetch: fetchBalance,\n };\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport { createOneEngineClient } from '../services/engine';\nimport type { TokenPrice } from '../types';\n\ninterface UseTokenPriceOptions {\n autoRefresh?: boolean;\n refreshInterval?: number;\n engineUrl?: string;\n clientId?: string;\n}\n\ninterface UseTokenPriceReturn {\n price: TokenPrice | null;\n isLoading: boolean;\n error: string | null;\n refetch: () => Promise<void>;\n}\n\n/**\n * Hook for fetching token price via ONE Engine\n *\n * Note: If using OneProvider, prefer useOneEngine().getTokenPrices() instead.\n * This hook is for standalone usage outside of OneProvider.\n */\nexport function useTokenPrice(\n symbol: string,\n options: UseTokenPriceOptions = {}\n): UseTokenPriceReturn {\n const { autoRefresh = false, refreshInterval = 30000, engineUrl, clientId } = options;\n\n const [price, setPrice] = useState<TokenPrice | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const engineRef = useRef(createOneEngineClient({\n baseUrl: engineUrl,\n clientId: clientId,\n }));\n\n const fetchPrice = useCallback(async () => {\n if (!symbol) return;\n\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await engineRef.current.getTokenPrices([symbol]);\n if (result.success && result.data && result.data[symbol]) {\n const priceData = result.data[symbol];\n setPrice({\n symbol,\n price: priceData.price,\n change24h: priceData.change24h,\n changePercent24h: priceData.change24h, // Same as change24h for percentage\n marketCap: priceData.marketCap,\n volume24h: 0, // Not provided by engine\n updatedAt: new Date().toISOString(),\n });\n } else {\n setError(result.error?.message || 'Failed to fetch price');\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to fetch price');\n } finally {\n setIsLoading(false);\n }\n }, [symbol]);\n\n useEffect(() => {\n fetchPrice();\n }, [fetchPrice]);\n\n useEffect(() => {\n if (!autoRefresh) return;\n\n const interval = setInterval(fetchPrice, refreshInterval);\n return () => clearInterval(interval);\n }, [autoRefresh, refreshInterval, fetchPrice]);\n\n return {\n price,\n isLoading,\n error,\n refetch: fetchPrice,\n };\n}\n\n// Hook for multiple token prices\ninterface UseTokenPricesReturn {\n prices: Record<string, TokenPrice>;\n isLoading: boolean;\n error: string | null;\n refetch: () => Promise<void>;\n}\n\nexport function useTokenPrices(\n symbols: string[],\n options: UseTokenPriceOptions = {}\n): UseTokenPricesReturn {\n const { autoRefresh = false, refreshInterval = 30000, engineUrl, clientId } = options;\n\n const [prices, setPrices] = useState<Record<string, TokenPrice>>({});\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const engineRef = useRef(createOneEngineClient({\n baseUrl: engineUrl,\n clientId: clientId,\n }));\n\n const fetchPrices = useCallback(async () => {\n if (symbols.length === 0) return;\n\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await engineRef.current.getTokenPrices(symbols);\n if (result.success && result.data) {\n const priceMap: Record<string, TokenPrice> = {};\n for (const sym of symbols) {\n if (result.data[sym]) {\n priceMap[sym] = {\n symbol: sym,\n price: result.data[sym].price,\n change24h: result.data[sym].change24h,\n changePercent24h: result.data[sym].change24h,\n marketCap: result.data[sym].marketCap,\n volume24h: 0,\n updatedAt: new Date().toISOString(),\n };\n }\n }\n setPrices(priceMap);\n } else {\n setError(result.error?.message || 'Failed to fetch prices');\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to fetch prices');\n } finally {\n setIsLoading(false);\n }\n }, [symbols]);\n\n useEffect(() => {\n fetchPrices();\n }, [fetchPrices]);\n\n useEffect(() => {\n if (!autoRefresh) return;\n\n const interval = setInterval(fetchPrices, refreshInterval);\n return () => clearInterval(interval);\n }, [autoRefresh, refreshInterval, fetchPrices]);\n\n return {\n prices,\n isLoading,\n error,\n refetch: fetchPrices,\n };\n}\n","/**\n * AI Trading Hooks for ONE SDK\n *\n * React hooks for AI quantitative trading features.\n * These hooks provide easy access to AI strategies, orders, and portfolio management.\n */\n\nimport { useState, useEffect, useCallback, useMemo } from 'react';\nimport { createOneEngineClient, OneEngineClient } from '../services/engine';\nimport type {\n AIStrategy,\n AIOrder,\n AIOrderStatus,\n AIPortfolioSummary,\n AITradeAllocation,\n AINavSnapshot,\n AIMarketData,\n CreateAIOrderRequest,\n StrategyCategory,\n ApiResponse,\n} from '../types';\n\n// Singleton client instance\nlet clientInstance: OneEngineClient | null = null;\n\nfunction getClient(): OneEngineClient {\n if (!clientInstance) {\n clientInstance = createOneEngineClient();\n }\n return clientInstance;\n}\n\n/**\n * Set the access token for authenticated requests\n */\nexport function setAITradingAccessToken(token: string) {\n getClient().setAccessToken(token);\n}\n\n/**\n * Clear the access token\n */\nexport function clearAITradingAccessToken() {\n getClient().clearAccessToken();\n}\n\n// ============================================\n// AI Strategies Hooks\n// ============================================\n\nexport interface UseAIStrategiesOptions {\n category?: StrategyCategory;\n riskLevel?: number;\n minTvl?: number;\n isActive?: boolean;\n autoRefresh?: boolean;\n refreshInterval?: number;\n}\n\nexport interface UseAIStrategiesResult {\n strategies: AIStrategy[];\n isLoading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\n/**\n * Hook to fetch and manage AI trading strategies\n */\nexport function useAIStrategies(options: UseAIStrategiesOptions = {}): UseAIStrategiesResult {\n const [strategies, setStrategies] = useState<AIStrategy[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const { category, riskLevel, minTvl, isActive, autoRefresh = false, refreshInterval = 60000 } = options;\n\n const fetchStrategies = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n const result = await getClient().getAIStrategies({ category, riskLevel, minTvl, isActive });\n if (result.success && result.data?.strategies) {\n setStrategies(result.data.strategies);\n } else {\n setError(result.error?.message || 'Failed to fetch strategies');\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Unknown error');\n } finally {\n setIsLoading(false);\n }\n }, [category, riskLevel, minTvl, isActive]);\n\n useEffect(() => {\n fetchStrategies();\n }, [fetchStrategies]);\n\n useEffect(() => {\n if (autoRefresh && refreshInterval > 0) {\n const interval = setInterval(fetchStrategies, refreshInterval);\n return () => clearInterval(interval);\n }\n }, [autoRefresh, refreshInterval, fetchStrategies]);\n\n return { strategies, isLoading, error, refresh: fetchStrategies };\n}\n\n/**\n * Hook to fetch a single AI strategy with performance data\n */\nexport interface UseAIStrategyResult {\n strategy: AIStrategy | null;\n performance: AINavSnapshot[];\n marketData: AIMarketData[];\n isLoading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useAIStrategy(\n strategyId: string | undefined,\n include: ('performance' | 'market' | 'trades')[] = ['performance', 'market']\n): UseAIStrategyResult {\n const [strategy, setStrategy] = useState<AIStrategy | null>(null);\n const [performance, setPerformance] = useState<AINavSnapshot[]>([]);\n const [marketData, setMarketData] = useState<AIMarketData[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const fetchStrategy = useCallback(async () => {\n if (!strategyId) {\n setIsLoading(false);\n return;\n }\n\n setIsLoading(true);\n setError(null);\n try {\n const result = await getClient().getAIStrategy(strategyId, include);\n if (result.success && result.data) {\n setStrategy(result.data.strategy);\n setPerformance(result.data.performance || []);\n setMarketData(result.data.marketData || []);\n } else {\n setError(result.error?.message || 'Failed to fetch strategy');\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Unknown error');\n } finally {\n setIsLoading(false);\n }\n }, [strategyId, include.join(',')]);\n\n useEffect(() => {\n fetchStrategy();\n }, [fetchStrategy]);\n\n return { strategy, performance, marketData, isLoading, error, refresh: fetchStrategy };\n}\n\n// ============================================\n// AI Orders Hooks\n// ============================================\n\nexport interface UseAIOrdersOptions {\n strategyId?: string;\n status?: AIOrderStatus;\n autoRefresh?: boolean;\n refreshInterval?: number;\n}\n\nexport interface UseAIOrdersResult {\n orders: AIOrder[];\n isLoading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n createOrder: (request: CreateAIOrderRequest) => Promise<ApiResponse<{ order: AIOrder }>>;\n pauseOrder: (orderId: string) => Promise<ApiResponse<{ order: AIOrder; message: string }>>;\n resumeOrder: (orderId: string) => Promise<ApiResponse<{ order: AIOrder; message: string }>>;\n redeemOrder: (orderId: string) => Promise<ApiResponse<any>>;\n}\n\n/**\n * Hook to manage AI trading orders\n */\nexport function useAIOrders(options: UseAIOrdersOptions = {}): UseAIOrdersResult {\n const [orders, setOrders] = useState<AIOrder[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const { strategyId, status, autoRefresh = true, refreshInterval = 30000 } = options;\n\n const fetchOrders = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n const result = await getClient().getAIOrders({ strategyId, status });\n if (result.success && result.data?.orders) {\n setOrders(result.data.orders);\n } else {\n setError(result.error?.message || 'Failed to fetch orders');\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Unknown error');\n } finally {\n setIsLoading(false);\n }\n }, [strategyId, status]);\n\n useEffect(() => {\n fetchOrders();\n }, [fetchOrders]);\n\n useEffect(() => {\n if (autoRefresh && refreshInterval > 0) {\n const interval = setInterval(fetchOrders, refreshInterval);\n return () => clearInterval(interval);\n }\n }, [autoRefresh, refreshInterval, fetchOrders]);\n\n const createOrder = useCallback(async (request: CreateAIOrderRequest) => {\n const result = await getClient().createAIOrder(request);\n if (result.success) {\n await fetchOrders(); // Refresh orders list\n }\n return result;\n }, [fetchOrders]);\n\n const pauseOrder = useCallback(async (orderId: string) => {\n const result = await getClient().pauseAIOrder(orderId);\n if (result.success) {\n await fetchOrders();\n }\n return result;\n }, [fetchOrders]);\n\n const resumeOrder = useCallback(async (orderId: string) => {\n const result = await getClient().resumeAIOrder(orderId);\n if (result.success) {\n await fetchOrders();\n }\n return result;\n }, [fetchOrders]);\n\n const redeemOrder = useCallback(async (orderId: string) => {\n const result = await getClient().redeemAIOrder(orderId);\n if (result.success) {\n await fetchOrders();\n }\n return result;\n }, [fetchOrders]);\n\n return {\n orders,\n isLoading,\n error,\n refresh: fetchOrders,\n createOrder,\n pauseOrder,\n resumeOrder,\n redeemOrder,\n };\n}\n\n// ============================================\n// AI Portfolio Hooks\n// ============================================\n\nexport interface UseAIPortfolioResult {\n portfolio: AIPortfolioSummary | null;\n allocations: AITradeAllocation[];\n activeOrders: AIOrder[];\n isLoading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\n/**\n * Hook to fetch AI trading portfolio summary\n */\nexport function useAIPortfolio(autoRefresh = true): UseAIPortfolioResult {\n const [portfolio, setPortfolio] = useState<AIPortfolioSummary | null>(null);\n const [allocations, setAllocations] = useState<AITradeAllocation[]>([]);\n const [activeOrders, setActiveOrders] = useState<AIOrder[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const fetchPortfolio = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n const result = await getClient().getAIPortfolio(['allocations', 'orders']);\n if (result.success && result.data) {\n setPortfolio(result.data.portfolio);\n setAllocations(result.data.allocations || []);\n setActiveOrders(result.data.orders || []);\n } else {\n setError(result.error?.message || 'Failed to fetch portfolio');\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Unknown error');\n } finally {\n setIsLoading(false);\n }\n }, []);\n\n useEffect(() => {\n fetchPortfolio();\n }, [fetchPortfolio]);\n\n useEffect(() => {\n if (autoRefresh) {\n const interval = setInterval(fetchPortfolio, 30000);\n return () => clearInterval(interval);\n }\n }, [autoRefresh, fetchPortfolio]);\n\n return { portfolio, allocations, activeOrders, isLoading, error, refresh: fetchPortfolio };\n}\n\n// ============================================\n// AI Market Data Hook\n// ============================================\n\nexport interface UseAIMarketDataResult {\n prices: Record<string, { price: number; change24h: number }>;\n isLoading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\n/**\n * Hook to fetch real-time market data for AI trading pairs\n */\nexport function useAIMarketData(\n symbols: string[] = ['BTC', 'ETH', 'BNB', 'SOL', 'XRP', 'DOGE', 'ADA', 'AVAX'],\n autoRefresh = true\n): UseAIMarketDataResult {\n const [prices, setPrices] = useState<Record<string, { price: number; change24h: number }>>({});\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const fetchPrices = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n const result = await getClient().getTokenPrices(symbols);\n if (result.success && result.data) {\n setPrices(result.data);\n } else {\n setError(result.error?.message || 'Failed to fetch prices');\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Unknown error');\n } finally {\n setIsLoading(false);\n }\n }, [symbols.join(',')]);\n\n useEffect(() => {\n fetchPrices();\n }, [fetchPrices]);\n\n useEffect(() => {\n if (autoRefresh) {\n const interval = setInterval(fetchPrices, 15000); // Update every 15 seconds\n return () => clearInterval(interval);\n }\n }, [autoRefresh, fetchPrices]);\n\n return { prices, isLoading, error, refresh: fetchPrices };\n}\n\n// ============================================\n// Combined AI Trading Hook\n// ============================================\n\nexport interface UseAITradingResult {\n // Strategies\n strategies: AIStrategy[];\n strategiesLoading: boolean;\n\n // Orders\n orders: AIOrder[];\n ordersLoading: boolean;\n\n // Portfolio\n portfolio: AIPortfolioSummary | null;\n portfolioLoading: boolean;\n\n // Market Data\n prices: Record<string, { price: number; change24h: number }>;\n\n // Actions\n createOrder: (request: CreateAIOrderRequest) => Promise<ApiResponse<{ order: AIOrder }>>;\n pauseOrder: (orderId: string) => Promise<ApiResponse<{ order: AIOrder; message: string }>>;\n resumeOrder: (orderId: string) => Promise<ApiResponse<{ order: AIOrder; message: string }>>;\n redeemOrder: (orderId: string) => Promise<ApiResponse<any>>;\n\n // Refresh\n refreshAll: () => Promise<void>;\n\n // Error\n error: string | null;\n}\n\n/**\n * Combined hook for all AI trading functionality\n */\nexport function useAITrading(): UseAITradingResult {\n const strategiesResult = useAIStrategies({ autoRefresh: true });\n const ordersResult = useAIOrders({ autoRefresh: true });\n const portfolioResult = useAIPortfolio(true);\n const marketResult = useAIMarketData();\n\n const refreshAll = useCallback(async () => {\n await Promise.all([\n strategiesResult.refresh(),\n ordersResult.refresh(),\n portfolioResult.refresh(),\n marketResult.refresh(),\n ]);\n }, [strategiesResult.refresh, ordersResult.refresh, portfolioResult.refresh, marketResult.refresh]);\n\n const error = useMemo(() => {\n return strategiesResult.error || ordersResult.error || portfolioResult.error || marketResult.error;\n }, [strategiesResult.error, ordersResult.error, portfolioResult.error, marketResult.error]);\n\n return {\n strategies: strategiesResult.strategies,\n strategiesLoading: strategiesResult.isLoading,\n orders: ordersResult.orders,\n ordersLoading: ordersResult.isLoading,\n portfolio: portfolioResult.portfolio,\n portfolioLoading: portfolioResult.isLoading,\n prices: marketResult.prices,\n createOrder: ordersResult.createOrder,\n pauseOrder: ordersResult.pauseOrder,\n resumeOrder: ordersResult.resumeOrder,\n redeemOrder: ordersResult.redeemOrder,\n refreshAll,\n error,\n };\n}\n\n// ============================================\n// AI Agents Hooks\n// ============================================\n\nexport interface AIAgent {\n id: string;\n name: string;\n name_zh: string;\n description: string;\n description_zh: string;\n category: string;\n risk_level: number;\n icon: string;\n color: string;\n tiers: Array<{ tier: number; amount: number; label: string; label_zh: string }>;\n supported_cycles: number[];\n default_cycle: number;\n supported_pairs: string[];\n supported_chains: string[];\n is_active: boolean;\n preview?: {\n tier: { tier: number; amount: number; label: string };\n cycle: number;\n dailyLots: number;\n stabilityScore: number;\n roiRange: { min: number; max: number; userMin: number; userMax: number };\n shareRate: number;\n profitEstimate: { monthlyMin: number; monthlyMax: number; cycleMin: number; cycleMax: number };\n };\n}\n\nexport interface AIAgentParams {\n dailyLots: number;\n effectiveCapital: number;\n stabilityScore: number;\n roiRange: { min: number; max: number; userMin: number; userMax: number };\n shareRate: number;\n profitEstimate: { monthlyMin: number; monthlyMax: number; cycleMin: number; cycleMax: number };\n}\n\nexport interface UseAIAgentsResult {\n agents: AIAgent[];\n shareRates: Record<number, number>;\n isLoading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\n/**\n * Hook to fetch all AI agents with their configurations\n */\nexport function useAIAgents(includeInactive = false): UseAIAgentsResult {\n const [agents, setAgents] = useState<AIAgent[]>([]);\n const [shareRates, setShareRates] = useState<Record<number, number>>({});\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const fetchAgents = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n const result = await getClient().getAgentConfigs({ includeInactive });\n if (result.success && result.data) {\n setAgents(result.data.agents || []);\n setShareRates(result.data.shareRates || {});\n } else {\n setError(result.error?.message || 'Failed to fetch agents');\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Unknown error');\n } finally {\n setIsLoading(false);\n }\n }, [includeInactive]);\n\n useEffect(() => {\n fetchAgents();\n }, [fetchAgents]);\n\n return { agents, shareRates, isLoading, error, refresh: fetchAgents };\n}\n\nexport interface UseAIAgentResult {\n agent: AIAgent | null;\n params: AIAgentParams | null;\n isLoading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n calculateParams: (amount: number, cycleDays: number) => Promise<AIAgentParams | null>;\n}\n\n/**\n * Hook to fetch a single AI agent with detailed parameters\n */\nexport function useAIAgent(agentId: string | undefined): UseAIAgentResult {\n const [agent, setAgent] = useState<AIAgent | null>(null);\n const [params, setParams] = useState<AIAgentParams | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const fetchAgent = useCallback(async () => {\n if (!agentId) {\n setIsLoading(false);\n return;\n }\n\n setIsLoading(true);\n setError(null);\n try {\n const result = await getClient().getAgentConfigs({ agentId });\n if (result.success && result.data?.agent) {\n setAgent(result.data.agent);\n } else {\n setError(result.error?.message || 'Agent not found');\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Unknown error');\n } finally {\n setIsLoading(false);\n }\n }, [agentId]);\n\n useEffect(() => {\n fetchAgent();\n }, [fetchAgent]);\n\n const calculateParams = useCallback(async (amount: number, cycleDays: number): Promise<AIAgentParams | null> => {\n if (!agentId) return null;\n\n try {\n const result = await getClient().calculateAgentParams({ agentId, amount, cycleDays });\n if (result.success && result.data) {\n setParams(result.data);\n return result.data;\n }\n return null;\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to calculate params');\n return null;\n }\n }, [agentId]);\n\n return { agent, params, isLoading, error, refresh: fetchAgent, calculateParams };\n}\n\nexport interface UseAIAgentSubscriptionResult {\n subscribe: (agentId: string, amount: number, cycleDays: number, txHash?: string) => Promise<ApiResponse<{ order: AIOrder }>>;\n isLoading: boolean;\n error: string | null;\n}\n\n/**\n * Hook to subscribe to an AI agent strategy\n */\nexport function useAIAgentSubscription(): UseAIAgentSubscriptionResult {\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const subscribe = useCallback(async (\n agentId: string,\n amount: number,\n cycleDays: number,\n txHash?: string\n ): Promise<ApiResponse<{ order: AIOrder }>> => {\n setIsLoading(true);\n setError(null);\n try {\n // Create order for the agent strategy\n const result = await getClient().createAIOrder({\n strategyId: agentId,\n amount,\n lockPeriodDays: cycleDays,\n txHashDeposit: txHash,\n });\n if (!result.success) {\n setError(result.error?.message || 'Failed to subscribe');\n }\n return result;\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : 'Subscription failed';\n setError(errorMsg);\n return { success: false, error: { code: 'SUBSCRIPTION_ERROR', message: errorMsg } };\n } finally {\n setIsLoading(false);\n }\n }, []);\n\n return { subscribe, isLoading, error };\n}\n","/**\n * ONE SDK - Forex Trading Hooks\n * Provides React hooks for StableFX on-chain forex trading integration\n * Can be used by any ecosystem partner\n */\n\nimport { useState, useEffect, useCallback, useRef, useMemo } from 'react';\nimport type {\n ForexPool,\n ForexPoolType,\n ForexInvestment,\n ForexLogEntry,\n ForexPoolTransaction,\n ForexPoolDailySnapshot,\n ForexTradeRecord,\n} from '../types/forex';\nimport {\n FOREX_POOL_DEFAULTS,\n FOREX_CYCLE_OPTIONS,\n FOREX_AGENT,\n FOREX_CAPITAL_SPLIT,\n computePoolAllocations,\n estimateForexProfit,\n} from '../types/forex';\n\n// ── Configuration ────────────────────────────────────────────────────────────\n\nlet _forexAccessToken: string | null = null;\nlet _forexEngineUrl: string = 'https://api.one23.io';\n\n/** Set the access token for authenticated forex API calls */\nexport function setForexAccessToken(token: string): void {\n _forexAccessToken = token;\n}\n\n/** Clear the forex access token */\nexport function clearForexAccessToken(): void {\n _forexAccessToken = null;\n}\n\n/** Configure the engine URL for forex API calls */\nexport function setForexEngineUrl(url: string): void {\n _forexEngineUrl = url;\n}\n\n// ── Internal API Helper ──────────────────────────────────────────────────────\n\nasync function forexApi<T>(path: string, options?: RequestInit): Promise<T | null> {\n try {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n if (_forexAccessToken) {\n headers['Authorization'] = `Bearer ${_forexAccessToken}`;\n }\n const res = await fetch(`${_forexEngineUrl}${path}`, { ...options, headers });\n if (!res.ok) return null;\n const json = await res.json();\n return json?.data ?? json;\n } catch {\n return null;\n }\n}\n\n// ── useForexPools ────────────────────────────────────────────────────────────\n\nexport interface UseForexPoolsResult {\n pools: ForexPool[];\n isLoading: boolean;\n error: string | null;\n refresh: () => void;\n}\n\nexport function useForexPools(options?: { refreshInterval?: number }): UseForexPoolsResult {\n const [pools, setPools] = useState<ForexPool[]>(FOREX_POOL_DEFAULTS);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const fetchPools = useCallback(async () => {\n setIsLoading(true);\n try {\n const data = await forexApi<{ pools: any[] }>('/api/forex/pools');\n if (data?.pools) {\n setPools(data.pools.map((p: any) => ({\n id: p.type ?? p.id,\n nameKey: `forex.pool_${p.type ?? p.id}`,\n descriptionKey: `forex.pool_${p.type ?? p.id}_desc`,\n allocation: p.allocation ?? (p.type === 'clearing' ? 0.50 : p.type === 'hedging' ? 0.30 : 0.20),\n totalSize: p.totalSize ?? p.total_size ?? 0,\n utilization: p.utilization ?? 0,\n color: p.type === 'clearing' ? '#3B82F6' : p.type === 'hedging' ? '#F59E0B' : '#10B981',\n apy7d: p.apy7d ?? 0,\n apy30d: p.apy30d ?? 0,\n netFlow24h: p.netFlow24h ?? 0,\n txCount24h: p.txCount24h ?? 0,\n txCountTotal: p.txCountTotal ?? 0,\n totalDeposits: p.totalDeposits ?? 0,\n totalWithdrawals: p.totalWithdrawals ?? 0,\n profitDistributed: p.profitDistributed ?? 0,\n lastUpdated: p.lastUpdated ?? Date.now(),\n })));\n }\n setError(null);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to fetch pools');\n } finally {\n setIsLoading(false);\n }\n }, []);\n\n useEffect(() => {\n fetchPools();\n if (options?.refreshInterval) {\n const timer = setInterval(fetchPools, options.refreshInterval);\n return () => clearInterval(timer);\n }\n }, [fetchPools, options?.refreshInterval]);\n\n return { pools, isLoading, error, refresh: fetchPools };\n}\n\n// ── useForexInvestments ──────────────────────────────────────────────────────\n\nexport interface UseForexInvestmentsResult {\n investments: ForexInvestment[];\n isLoading: boolean;\n error: string | null;\n createInvestment: (params: { amount: number; selectedPairs: string[]; cycleDays: number }) => Promise<ForexInvestment | null>;\n redeemInvestment: (investmentId: string) => Promise<boolean>;\n refresh: () => void;\n portfolioSummary: {\n totalInvested: number;\n totalValue: number;\n totalProfit: number;\n activeCount: number;\n };\n}\n\nexport function useForexInvestments(options?: { refreshInterval?: number }): UseForexInvestmentsResult {\n const [investments, setInvestments] = useState<ForexInvestment[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const fetchInvestments = useCallback(async () => {\n setIsLoading(true);\n try {\n const data = await forexApi<{ investments: any[] }>('/api/forex/investments');\n if (data?.investments) {\n setInvestments(data.investments.map(mapInvestment));\n }\n setError(null);\n } catch {\n setError('Failed to fetch investments');\n } finally {\n setIsLoading(false);\n }\n }, []);\n\n const createInvestment = useCallback(async (params: {\n amount: number; selectedPairs: string[]; cycleDays: number;\n }): Promise<ForexInvestment | null> => {\n setIsLoading(true);\n try {\n const data = await forexApi<{ investment: any }>('/api/forex/investments', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n if (data?.investment) {\n const inv = mapInvestment(data.investment);\n setInvestments(prev => [inv, ...prev]);\n return inv;\n }\n // Local fallback\n const inv = createLocalInvestment(params);\n setInvestments(prev => [inv, ...prev]);\n return inv;\n } catch {\n const inv = createLocalInvestment(params);\n setInvestments(prev => [inv, ...prev]);\n return inv;\n } finally {\n setIsLoading(false);\n }\n }, []);\n\n const redeemInvestment = useCallback(async (investmentId: string): Promise<boolean> => {\n try {\n await forexApi(`/api/forex/investments/${investmentId}/redeem`, { method: 'POST' });\n setInvestments(prev => prev.map(inv =>\n inv.id === investmentId ? { ...inv, status: 'redeemed' as const } : inv\n ));\n return true;\n } catch {\n return false;\n }\n }, []);\n\n useEffect(() => {\n fetchInvestments();\n if (options?.refreshInterval) {\n const timer = setInterval(fetchInvestments, options.refreshInterval);\n return () => clearInterval(timer);\n }\n }, [fetchInvestments, options?.refreshInterval]);\n\n const portfolioSummary = useMemo(() => {\n const active = investments.filter(i => i.status === 'active');\n return {\n totalInvested: active.reduce((s, i) => s + i.amount, 0),\n totalValue: active.reduce((s, i) => s + i.currentValue, 0),\n totalProfit: active.reduce((s, i) => s + i.profit, 0),\n activeCount: active.length,\n };\n }, [investments]);\n\n return { investments, isLoading, error, createInvestment, redeemInvestment, refresh: fetchInvestments, portfolioSummary };\n}\n\n// ── useForexSimulation ───────────────────────────────────────────────────────\n\nexport interface UseForexSimulationResult {\n logs: ForexLogEntry[];\n poolTransactions: ForexPoolTransaction[];\n isRunning: boolean;\n stats: { totalPnl: number; totalTrades: number; totalPips: number; totalLots: number };\n start: () => void;\n stop: () => void;\n clearLogs: () => void;\n}\n\nexport function useForexSimulation(options?: { maxLogs?: number }): UseForexSimulationResult {\n const maxLogs = options?.maxLogs ?? 500;\n const [logs, setLogs] = useState<ForexLogEntry[]>([]);\n const [poolTxs, setPoolTxs] = useState<ForexPoolTransaction[]>([]);\n const [isRunning, setIsRunning] = useState(false);\n const [stats, setStats] = useState({ totalPnl: 0, totalTrades: 0, totalPips: 0, totalLots: 0 });\n const engineRef = useRef<any>(null);\n\n const getEngine = useCallback(() => {\n if (!engineRef.current) {\n try {\n const { forexSimulationEngine } = require('../services/forex/ForexSimulationEngine');\n engineRef.current = forexSimulationEngine;\n } catch { /* not available */ }\n }\n return engineRef.current;\n }, []);\n\n const start = useCallback(() => {\n const engine = getEngine();\n if (!engine) return;\n if (!engine.isRunning()) engine.start();\n setIsRunning(true);\n }, [getEngine]);\n\n const stop = useCallback(() => {\n const engine = getEngine();\n if (engine) engine.stop();\n setIsRunning(false);\n }, [getEngine]);\n\n const clearLogs = useCallback(() => {\n setLogs([]);\n setPoolTxs([]);\n }, []);\n\n useEffect(() => {\n const engine = getEngine();\n if (!engine) return;\n\n const unsubLog = engine.onLog((entry: ForexLogEntry) => {\n setLogs(prev => {\n const next = [...prev, entry];\n return next.length > maxLogs ? next.slice(-maxLogs) : next;\n });\n const s = engine.getStats();\n setStats({ totalPnl: s.totalPnl, totalTrades: s.totalTrades, totalPips: s.totalPips, totalLots: s.totalLots });\n });\n\n const unsubTx = engine.onPoolTransaction((tx: ForexPoolTransaction) => {\n setPoolTxs(prev => [...prev.slice(-999), tx]);\n });\n\n return () => {\n unsubLog();\n unsubTx();\n };\n }, [getEngine, maxLogs]);\n\n return { logs, poolTransactions: poolTxs, isRunning, stats, start, stop, clearLogs };\n}\n\n// ── useForexPoolData ─────────────────────────────────────────────────────────\n\nexport interface UseForexPoolDataResult {\n snapshots: Record<ForexPoolType, ForexPoolDailySnapshot[]>;\n transactions: ForexPoolTransaction[];\n isInitialized: boolean;\n initialize: () => void;\n}\n\nexport function useForexPoolData(): UseForexPoolDataResult {\n const [snapshots, setSnapshots] = useState<Record<ForexPoolType, ForexPoolDailySnapshot[]>>({ clearing: [], hedging: [], insurance: [] });\n const [transactions, setTransactions] = useState<ForexPoolTransaction[]>([]);\n const [isInitialized, setIsInitialized] = useState(false);\n\n const initialize = useCallback(() => {\n if (isInitialized) return;\n try {\n const { ForexPoolDataGenerator } = require('../services/forex/ForexPoolDataGenerator');\n const gen = ForexPoolDataGenerator.getInstance();\n setSnapshots(gen.generateAllSnapshots());\n setTransactions(gen.generateAllTransactions());\n setIsInitialized(true);\n } catch { /* not available */ }\n }, [isInitialized]);\n\n return { snapshots, transactions, isInitialized, initialize };\n}\n\n// ── Combined useForexTrading ─────────────────────────────────────────────────\n\nexport interface UseForexTradingResult {\n pools: UseForexPoolsResult;\n investments: UseForexInvestmentsResult;\n simulation: UseForexSimulationResult;\n poolData: UseForexPoolDataResult;\n // Convenience re-exports\n capitalSplit: typeof FOREX_CAPITAL_SPLIT;\n agent: typeof FOREX_AGENT;\n currencyPairs: typeof import('../types/forex').FOREX_CURRENCY_PAIRS;\n cycleOptions: typeof import('../types/forex').FOREX_CYCLE_OPTIONS;\n computePoolAllocations: typeof computePoolAllocations;\n estimateProfit: typeof estimateForexProfit;\n}\n\nexport function useForexTrading(options?: {\n poolRefreshInterval?: number;\n investmentRefreshInterval?: number;\n}): UseForexTradingResult {\n const pools = useForexPools({ refreshInterval: options?.poolRefreshInterval });\n const investments = useForexInvestments({ refreshInterval: options?.investmentRefreshInterval });\n const simulation = useForexSimulation();\n const poolData = useForexPoolData();\n\n return {\n pools,\n investments,\n simulation,\n poolData,\n capitalSplit: FOREX_CAPITAL_SPLIT,\n agent: FOREX_AGENT,\n currencyPairs: require('../types/forex').FOREX_CURRENCY_PAIRS,\n cycleOptions: require('../types/forex').FOREX_CYCLE_OPTIONS,\n computePoolAllocations,\n estimateProfit: estimateForexProfit,\n };\n}\n\n// ── Internal Helpers ─────────────────────────────────────────────────────────\n\nfunction mapInvestment(raw: any): ForexInvestment {\n const cycleDays = raw.cycleDays ?? raw.cycle_days ?? 90;\n const cycleOption = FOREX_CYCLE_OPTIONS.find(c => c.days === cycleDays) || FOREX_CYCLE_OPTIONS[2];\n const amount = typeof raw.amount === 'string' ? parseFloat(raw.amount) : (raw.amount ?? 0);\n const allocs = computePoolAllocations(amount);\n\n return {\n id: raw.id,\n userId: raw.userId ?? raw.user_id,\n amount,\n currentValue: raw.currentValue ?? raw.current_value ?? amount,\n profit: raw.profit ?? 0,\n status: raw.status ?? 'active',\n selectedPairs: raw.selectedPairs ?? raw.selected_pairs ?? [],\n cycleDays,\n cycleOption,\n feeRate: raw.feeRate ?? cycleOption.feeRate,\n commissionRate: raw.commissionRate ?? cycleOption.commissionRate,\n startDate: raw.startDate ?? raw.start_date ?? new Date().toISOString(),\n endDate: raw.endDate ?? raw.end_date ?? '',\n tradingCapital: raw.tradingCapital ?? allocs.tradingCapital,\n totalPoolReserves: raw.totalPoolReserves ?? allocs.totalPoolReserves,\n poolAllocations: raw.poolAllocations ?? {\n clearing: allocs.clearing,\n hedging: allocs.hedging,\n insurance: allocs.insurance,\n },\n tradeWeight: raw.tradeWeight ?? 0,\n totalLots: raw.totalLots ?? 0,\n totalPips: raw.totalPips ?? 0,\n totalTrades: raw.totalTrades ?? 0,\n positions: raw.positions ?? [],\n tradeHistory: raw.tradeHistory ?? [],\n redeemedAt: raw.redeemedAt,\n createdAt: raw.createdAt,\n updatedAt: raw.updatedAt,\n };\n}\n\nfunction createLocalInvestment(params: { amount: number; selectedPairs: string[]; cycleDays: number }): ForexInvestment {\n const { amount, selectedPairs, cycleDays } = params;\n const cycleOption = FOREX_CYCLE_OPTIONS.find(c => c.days === cycleDays) || FOREX_CYCLE_OPTIONS[2];\n const allocs = computePoolAllocations(amount);\n const now = new Date();\n const endDate = new Date(now);\n endDate.setDate(endDate.getDate() + cycleDays);\n\n return {\n id: `fx_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`,\n amount,\n currentValue: amount,\n profit: 0,\n status: 'active',\n selectedPairs,\n cycleDays,\n cycleOption,\n startDate: now.toISOString(),\n endDate: endDate.toISOString(),\n tradingCapital: allocs.tradingCapital,\n totalPoolReserves: allocs.totalPoolReserves,\n poolAllocations: { clearing: allocs.clearing, hedging: allocs.hedging, insurance: allocs.insurance },\n tradeWeight: 0,\n totalLots: 0,\n totalPips: 0,\n totalTrades: 0,\n positions: [],\n tradeHistory: [],\n };\n}\n","/**\n * ONE SDK - Bot Simulation Hook\n * Provides React hook for subscribing to BotSimulationEngine events\n */\n\nimport { useState, useEffect, useCallback, useRef, useMemo } from 'react';\nimport type { BotLogEntry, BotState, StrategyPersonality } from '../services/forex/BotSimulationEngine';\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\nexport interface UseBotSimulationOptions {\n maxLogs?: number;\n strategyIds?: string[];\n userPairs?: string[];\n userChains?: string[];\n autoStart?: boolean;\n}\n\nexport interface UseBotSimulationResult {\n /** All log entries from all strategies */\n logs: BotLogEntry[];\n /** Logs grouped by strategy ID */\n logsByStrategy: Map<string, BotLogEntry[]>;\n /** Current state for each strategy */\n botStates: Map<string, BotState>;\n /** Whether simulation is currently running */\n isRunning: boolean;\n /** Available strategies */\n strategies: StrategyPersonality[];\n /** Start the simulation */\n start: (strategyIds?: string[], userPairs?: string[], userChains?: string[]) => void;\n /** Stop the simulation */\n stop: (strategyIds?: string[]) => void;\n /** Clear all logs */\n clearLogs: () => void;\n /** Emit boot sequence messages */\n emitBootSequence: () => void;\n /** Get state for a specific strategy */\n getBotState: (strategyId: string) => BotState | undefined;\n}\n\n// ── Hook Implementation ───────────────────────────────────────────────────────\n\nexport function useBotSimulation(options?: UseBotSimulationOptions): UseBotSimulationResult {\n const maxLogs = options?.maxLogs ?? 500;\n const [logs, setLogs] = useState<BotLogEntry[]>([]);\n const [isRunning, setIsRunning] = useState(false);\n const [strategies, setStrategies] = useState<StrategyPersonality[]>([]);\n const [botStatesMap, setBotStatesMap] = useState<Map<string, BotState>>(new Map());\n const engineRef = useRef<any>(null);\n const unsubRef = useRef<(() => void) | null>(null);\n\n // Lazy load the engine\n const getEngine = useCallback(() => {\n if (!engineRef.current) {\n try {\n const { botSimulationEngine } = require('../services/forex/BotSimulationEngine');\n engineRef.current = botSimulationEngine;\n setStrategies(botSimulationEngine.getStrategies());\n } catch {\n // Engine not available\n }\n }\n return engineRef.current;\n }, []);\n\n // Group logs by strategy\n const logsByStrategy = useMemo(() => {\n const grouped = new Map<string, BotLogEntry[]>();\n for (const log of logs) {\n const existing = grouped.get(log.strategyId) || [];\n grouped.set(log.strategyId, [...existing, log]);\n }\n return grouped;\n }, [logs]);\n\n // Start simulation\n const start = useCallback((\n strategyIds?: string[],\n userPairs?: string[],\n userChains?: string[]\n ) => {\n const engine = getEngine();\n if (!engine) return;\n\n const ids = strategyIds || options?.strategyIds;\n const pairs = userPairs || options?.userPairs;\n const chains = userChains || options?.userChains;\n\n if (!engine.isRunning()) {\n engine.start(ids, pairs, chains);\n }\n setIsRunning(true);\n }, [getEngine, options?.strategyIds, options?.userPairs, options?.userChains]);\n\n // Stop simulation\n const stop = useCallback((strategyIds?: string[]) => {\n const engine = getEngine();\n if (engine) {\n engine.stop(strategyIds);\n if (!strategyIds) {\n setIsRunning(false);\n }\n }\n }, [getEngine]);\n\n // Clear logs\n const clearLogs = useCallback(() => {\n setLogs([]);\n }, []);\n\n // Emit boot sequence\n const emitBootSequence = useCallback(() => {\n const engine = getEngine();\n if (engine) {\n engine.emitBootSequence();\n }\n }, [getEngine]);\n\n // Get state for specific strategy\n const getBotState = useCallback((strategyId: string): BotState | undefined => {\n return botStatesMap.get(strategyId);\n }, [botStatesMap]);\n\n // Subscribe to engine events\n useEffect(() => {\n const engine = getEngine();\n if (!engine) return;\n\n // Check if already running\n setIsRunning(engine.isRunning());\n\n // Subscribe to log events\n unsubRef.current = engine.onLog((entry: BotLogEntry) => {\n setLogs(prev => {\n const next = [...prev, entry];\n return next.length > maxLogs ? next.slice(-maxLogs) : next;\n });\n\n // Update bot states\n const state = engine.getBotState(entry.strategyId);\n if (state) {\n setBotStatesMap(prev => {\n const next = new Map(prev);\n next.set(entry.strategyId, state);\n return next;\n });\n }\n });\n\n return () => {\n if (unsubRef.current) {\n unsubRef.current();\n unsubRef.current = null;\n }\n };\n }, [getEngine, maxLogs]);\n\n // Auto-start if configured\n useEffect(() => {\n if (options?.autoStart) {\n const engine = getEngine();\n if (engine && !engine.isRunning()) {\n emitBootSequence();\n setTimeout(() => {\n start();\n }, 5500); // After boot sequence completes\n }\n }\n }, [options?.autoStart, getEngine, emitBootSequence, start]);\n\n // Periodically update bot states\n useEffect(() => {\n if (!isRunning) return;\n\n const interval = setInterval(() => {\n const engine = getEngine();\n if (engine) {\n const states = engine.getAllBotStates();\n if (states.size > 0) {\n setBotStatesMap(new Map(states));\n }\n }\n }, 1000);\n\n return () => clearInterval(interval);\n }, [isRunning, getEngine]);\n\n return {\n logs,\n logsByStrategy,\n botStates: botStatesMap,\n isRunning,\n strategies,\n start,\n stop,\n clearLogs,\n emitBootSequence,\n getBotState,\n };\n}\n","/**\n * ONE SDK - AI Positions Hook\n * Provides React hook for fetching and tracking AI trading positions\n */\n\nimport { useState, useEffect, useCallback, useMemo } from 'react';\nimport type { AIPosition, PositionStatus } from '../types/console';\n\n// ── Configuration ─────────────────────────────────────────────────────────────\n\nlet _consoleAccessToken: string | null = null;\nlet _consoleEngineUrl: string = 'https://api.one23.io';\n\nexport function setConsoleAccessToken(token: string): void {\n _consoleAccessToken = token;\n}\n\nexport function clearConsoleAccessToken(): void {\n _consoleAccessToken = null;\n}\n\nexport function setConsoleEngineUrl(url: string): void {\n _consoleEngineUrl = url;\n}\n\n// ── Internal API Helper ───────────────────────────────────────────────────────\n\nasync function consoleApi<T>(path: string, options?: RequestInit): Promise<T | null> {\n try {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n if (_consoleAccessToken) {\n headers['Authorization'] = `Bearer ${_consoleAccessToken}`;\n }\n const res = await fetch(`${_consoleEngineUrl}${path}`, { ...options, headers });\n if (!res.ok) return null;\n const json = await res.json();\n return json?.data ?? json;\n } catch {\n return null;\n }\n}\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\nexport interface UseAIPositionsOptions {\n strategyId?: string;\n strategyIds?: string[];\n status?: PositionStatus | PositionStatus[];\n pollInterval?: number;\n simulation?: boolean;\n}\n\nexport interface UseAIPositionsResult {\n positions: AIPosition[];\n openPositions: AIPosition[];\n closedPositions: AIPosition[];\n isLoading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n // Position actions\n closePosition: (positionId: string) => Promise<boolean>;\n updateStopLoss: (positionId: string, stopLoss: number) => Promise<boolean>;\n updateTakeProfit: (positionId: string, takeProfit: number) => Promise<boolean>;\n // Computed values\n summary: {\n totalPositions: number;\n openCount: number;\n totalExposure: number;\n totalPnl: number;\n unrealizedPnl: number;\n avgLeverage: number;\n byStrategy: Record<string, { count: number; pnl: number; exposure: number }>;\n };\n}\n\n// ── Simulation Data Generator ─────────────────────────────────────────────────\n\nfunction generateSimulatedPositions(strategyIds?: string[]): AIPosition[] {\n const strategies = [\n { id: 'balanced-01', name: 'Balanced Alpha', shortName: 'BAL' },\n { id: 'conservative-01', name: 'Conservative Shield', shortName: 'CON' },\n { id: 'aggressive-01', name: 'Aggressive Momentum', shortName: 'AGG' },\n ];\n\n const pairs = ['BTC/USDT', 'ETH/USDT', 'SOL/USDT', 'ARB/USDT', 'AVAX/USDT'];\n const basePrices: Record<string, number> = {\n 'BTC/USDT': 67500,\n 'ETH/USDT': 3450,\n 'SOL/USDT': 178,\n 'ARB/USDT': 1.18,\n 'AVAX/USDT': 38.5,\n };\n\n const positions: AIPosition[] = [];\n const filteredStrategies = strategyIds\n ? strategies.filter(s => strategyIds.includes(s.id))\n : strategies;\n\n for (const strategy of filteredStrategies) {\n // Generate 0-3 positions per strategy\n const numPositions = Math.floor(Math.random() * 4);\n for (let i = 0; i < numPositions; i++) {\n const pair = pairs[Math.floor(Math.random() * pairs.length)];\n const basePrice = basePrices[pair];\n const side = Math.random() > 0.5 ? 'LONG' : 'SHORT';\n const entryPrice = basePrice * (1 + (Math.random() - 0.5) * 0.02);\n const currentPrice = basePrice * (1 + (Math.random() - 0.5) * 0.03);\n const leverage = Math.floor(Math.random() * 10) + 2;\n const size = Math.floor(Math.random() * 1000) + 100;\n const margin = size / leverage;\n\n const priceDiff = side === 'LONG'\n ? (currentPrice - entryPrice) / entryPrice\n : (entryPrice - currentPrice) / entryPrice;\n const pnlPercent = priceDiff * leverage * 100;\n const pnl = size * priceDiff * leverage;\n\n positions.push({\n id: `pos_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`,\n strategyId: strategy.id,\n strategyName: strategy.name,\n pair,\n side,\n entryPrice,\n currentPrice,\n size,\n leverage,\n margin,\n pnl,\n pnlPercent,\n status: 'open',\n stopLoss: entryPrice * (side === 'LONG' ? 0.95 : 1.05),\n takeProfit: entryPrice * (side === 'LONG' ? 1.1 : 0.9),\n liquidationPrice: entryPrice * (side === 'LONG' ? (1 - 1 / leverage) : (1 + 1 / leverage)),\n openTime: Date.now() - Math.floor(Math.random() * 86400000),\n chain: ['ethereum', 'arbitrum', 'base'][Math.floor(Math.random() * 3)],\n aiConfidence: Math.random() * 0.4 + 0.5,\n aiReasoning: `${side === 'LONG' ? 'Bullish' : 'Bearish'} momentum detected on ${pair}`,\n });\n }\n }\n\n return positions;\n}\n\n// ── Hook Implementation ───────────────────────────────────────────────────────\n\nexport function useAIPositions(options?: UseAIPositionsOptions): UseAIPositionsResult {\n const [positions, setPositions] = useState<AIPosition[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const fetchPositions = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n\n try {\n if (options?.simulation) {\n // Use simulated data\n const simulated = generateSimulatedPositions(options?.strategyIds);\n setPositions(simulated);\n } else {\n // Fetch from API\n let path = '/api/v1/ai-quant/positions';\n const params = new URLSearchParams();\n if (options?.strategyId) {\n params.append('strategyId', options.strategyId);\n }\n if (options?.strategyIds?.length) {\n params.append('strategyIds', options.strategyIds.join(','));\n }\n if (options?.status) {\n const statuses = Array.isArray(options.status) ? options.status : [options.status];\n params.append('status', statuses.join(','));\n }\n if (params.toString()) {\n path += `?${params.toString()}`;\n }\n\n const data = await consoleApi<{ positions: any[] }>(path);\n if (data?.positions) {\n setPositions(data.positions.map(mapPosition));\n }\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to fetch positions');\n } finally {\n setIsLoading(false);\n }\n }, [options?.simulation, options?.strategyId, options?.strategyIds, options?.status]);\n\n // Close position\n const closePosition = useCallback(async (positionId: string): Promise<boolean> => {\n try {\n if (options?.simulation) {\n setPositions(prev => prev.map(p =>\n p.id === positionId ? { ...p, status: 'closed' as const, closeTime: Date.now() } : p\n ));\n return true;\n }\n await consoleApi(`/api/v1/ai-quant/positions/${positionId}/close`, { method: 'POST' });\n setPositions(prev => prev.map(p =>\n p.id === positionId ? { ...p, status: 'closed' as const, closeTime: Date.now() } : p\n ));\n return true;\n } catch {\n return false;\n }\n }, [options?.simulation]);\n\n // Update stop loss\n const updateStopLoss = useCallback(async (positionId: string, stopLoss: number): Promise<boolean> => {\n try {\n if (options?.simulation) {\n setPositions(prev => prev.map(p =>\n p.id === positionId ? { ...p, stopLoss } : p\n ));\n return true;\n }\n await consoleApi(`/api/v1/ai-quant/positions/${positionId}`, {\n method: 'PATCH',\n body: JSON.stringify({ stopLoss }),\n });\n setPositions(prev => prev.map(p =>\n p.id === positionId ? { ...p, stopLoss } : p\n ));\n return true;\n } catch {\n return false;\n }\n }, [options?.simulation]);\n\n // Update take profit\n const updateTakeProfit = useCallback(async (positionId: string, takeProfit: number): Promise<boolean> => {\n try {\n if (options?.simulation) {\n setPositions(prev => prev.map(p =>\n p.id === positionId ? { ...p, takeProfit } : p\n ));\n return true;\n }\n await consoleApi(`/api/v1/ai-quant/positions/${positionId}`, {\n method: 'PATCH',\n body: JSON.stringify({ takeProfit }),\n });\n setPositions(prev => prev.map(p =>\n p.id === positionId ? { ...p, takeProfit } : p\n ));\n return true;\n } catch {\n return false;\n }\n }, [options?.simulation]);\n\n // Initial fetch and polling\n useEffect(() => {\n fetchPositions();\n if (options?.pollInterval) {\n const timer = setInterval(fetchPositions, options.pollInterval);\n return () => clearInterval(timer);\n }\n }, [fetchPositions, options?.pollInterval]);\n\n // Computed values\n const openPositions = useMemo(() =>\n positions.filter(p => p.status === 'open'),\n [positions]\n );\n\n const closedPositions = useMemo(() =>\n positions.filter(p => p.status === 'closed'),\n [positions]\n );\n\n const summary = useMemo(() => {\n const open = positions.filter(p => p.status === 'open');\n const byStrategy: Record<string, { count: number; pnl: number; exposure: number }> = {};\n\n for (const pos of open) {\n if (!byStrategy[pos.strategyId]) {\n byStrategy[pos.strategyId] = { count: 0, pnl: 0, exposure: 0 };\n }\n byStrategy[pos.strategyId].count++;\n byStrategy[pos.strategyId].pnl += pos.pnl;\n byStrategy[pos.strategyId].exposure += pos.size;\n }\n\n const totalExposure = open.reduce((sum, p) => sum + p.size, 0);\n const totalPnl = positions.reduce((sum, p) => sum + p.pnl, 0);\n const unrealizedPnl = open.reduce((sum, p) => sum + p.pnl, 0);\n const avgLeverage = open.length > 0\n ? open.reduce((sum, p) => sum + p.leverage, 0) / open.length\n : 0;\n\n return {\n totalPositions: positions.length,\n openCount: open.length,\n totalExposure,\n totalPnl,\n unrealizedPnl,\n avgLeverage,\n byStrategy,\n };\n }, [positions]);\n\n return {\n positions,\n openPositions,\n closedPositions,\n isLoading,\n error,\n refresh: fetchPositions,\n closePosition,\n updateStopLoss,\n updateTakeProfit,\n summary,\n };\n}\n\n// ── Helper Functions ──────────────────────────────────────────────────────────\n\nfunction mapPosition(raw: any): AIPosition {\n return {\n id: raw.id,\n strategyId: raw.strategyId ?? raw.strategy_id,\n strategyName: raw.strategyName ?? raw.strategy_name ?? '',\n pair: raw.pair,\n side: raw.side,\n entryPrice: raw.entryPrice ?? raw.entry_price ?? 0,\n currentPrice: raw.currentPrice ?? raw.current_price ?? 0,\n size: raw.size ?? 0,\n leverage: raw.leverage ?? 1,\n margin: raw.margin ?? raw.size / (raw.leverage ?? 1),\n pnl: raw.pnl ?? 0,\n pnlPercent: raw.pnlPercent ?? raw.pnl_percent ?? 0,\n status: raw.status ?? 'open',\n stopLoss: raw.stopLoss ?? raw.stop_loss,\n takeProfit: raw.takeProfit ?? raw.take_profit,\n liquidationPrice: raw.liquidationPrice ?? raw.liquidation_price,\n openTime: raw.openTime ?? raw.open_time ?? Date.now(),\n closeTime: raw.closeTime ?? raw.close_time,\n chain: raw.chain,\n orderId: raw.orderId ?? raw.order_id,\n aiConfidence: raw.aiConfidence ?? raw.ai_confidence,\n aiReasoning: raw.aiReasoning ?? raw.ai_reasoning,\n };\n}\n","/**\n * ONE SDK - AI Decisions Hook\n * Provides React hook for fetching AI trading decision history with reasoning\n */\n\nimport { useState, useEffect, useCallback, useMemo } from 'react';\nimport type { AIDecision, DecisionAction } from '../types/console';\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\nexport interface UseAIDecisionsOptions {\n strategyId?: string;\n strategyIds?: string[];\n actions?: DecisionAction[];\n limit?: number;\n pollInterval?: number;\n simulation?: boolean;\n}\n\nexport interface UseAIDecisionsResult {\n decisions: AIDecision[];\n recentDecisions: AIDecision[];\n executedDecisions: AIDecision[];\n isLoading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n // Filters\n getByStrategy: (strategyId: string) => AIDecision[];\n getByAction: (action: DecisionAction) => AIDecision[];\n // Stats\n stats: {\n totalDecisions: number;\n executedCount: number;\n executionRate: number;\n byAction: Record<DecisionAction, number>;\n byStrategy: Record<string, number>;\n avgConfidence: number;\n };\n}\n\n// ── Simulation Data Generator ─────────────────────────────────────────────────\n\nfunction generateSimulatedDecisions(\n strategyIds?: string[],\n limit: number = 50\n): AIDecision[] {\n const strategies = [\n { id: 'balanced-01', name: 'Balanced Alpha' },\n { id: 'conservative-01', name: 'Conservative Shield' },\n { id: 'aggressive-01', name: 'Aggressive Momentum' },\n ];\n\n const pairs = ['BTC/USDT', 'ETH/USDT', 'SOL/USDT', 'ARB/USDT', 'AVAX/USDT'];\n const actions: DecisionAction[] = ['OPEN_LONG', 'OPEN_SHORT', 'CLOSE_LONG', 'CLOSE_SHORT', 'HOLD', 'SKIP'];\n\n const reasonings = {\n OPEN_LONG: [\n 'RSI oversold with MACD bullish crossover',\n 'Golden cross detected on EMA, volume confirming',\n 'Support level held, momentum building',\n 'Bullish divergence on RSI, trend reversal likely',\n ],\n OPEN_SHORT: [\n 'RSI overbought with MACD bearish crossover',\n 'Death cross on EMA, volume increasing',\n 'Resistance level rejected, bearish pressure',\n 'Bearish divergence detected, reversal expected',\n ],\n CLOSE_LONG: [\n 'Take profit target reached',\n 'Momentum weakening, securing profits',\n 'Risk management triggered',\n ],\n CLOSE_SHORT: [\n 'Take profit target reached',\n 'Bearish momentum exhausted',\n 'Stop loss proximity warning',\n ],\n HOLD: [\n 'No clear signal, waiting for confirmation',\n 'Consolidation phase, insufficient momentum',\n 'Mixed indicators, patience advised',\n ],\n SKIP: [\n 'Confidence below threshold',\n 'Risk parameters exceeded',\n 'Position limit reached',\n ],\n };\n\n const filteredStrategies = strategyIds\n ? strategies.filter(s => strategyIds.includes(s.id))\n : strategies;\n\n const decisions: AIDecision[] = [];\n const now = Date.now();\n\n for (let i = 0; i < limit; i++) {\n const strategy = filteredStrategies[Math.floor(Math.random() * filteredStrategies.length)];\n const pair = pairs[Math.floor(Math.random() * pairs.length)];\n const action = actions[Math.floor(Math.random() * actions.length)];\n const confidence = Math.random() * 0.5 + 0.3;\n const executed = action !== 'HOLD' && action !== 'SKIP' && confidence > 0.5;\n const reasoningList = reasonings[action];\n\n decisions.push({\n id: `dec_${now - i * 60000}_${Math.random().toString(36).slice(2, 8)}`,\n timestamp: now - i * (Math.random() * 300000 + 60000),\n strategyId: strategy.id,\n strategyName: strategy.name,\n pair,\n action,\n confidence,\n reasoning: reasoningList[Math.floor(Math.random() * reasoningList.length)],\n indicators: {\n rsi: Math.random() * 100,\n macd: (Math.random() - 0.5) * 2,\n ema: Math.random() > 0.5 ? 'bullish' : 'bearish',\n volume: Math.random() * 2 + 0.5,\n bollinger: Math.random() > 0.5 ? 'upper' : 'lower',\n },\n signals: [\n `RSI ${Math.random() > 0.5 ? 'oversold' : 'overbought'}`,\n `MACD ${Math.random() > 0.5 ? 'bullish' : 'bearish'}`,\n ],\n executed,\n positionId: executed ? `pos_${Date.now()}_${Math.random().toString(36).slice(2, 6)}` : undefined,\n price: 50000 * (1 + (Math.random() - 0.5) * 0.1),\n size: executed ? Math.floor(Math.random() * 1000) + 100 : undefined,\n leverage: executed ? Math.floor(Math.random() * 10) + 2 : undefined,\n });\n }\n\n return decisions.sort((a, b) => b.timestamp - a.timestamp);\n}\n\n// ── Hook Implementation ───────────────────────────────────────────────────────\n\nexport function useAIDecisions(options?: UseAIDecisionsOptions): UseAIDecisionsResult {\n const limit = options?.limit ?? 100;\n const [decisions, setDecisions] = useState<AIDecision[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const fetchDecisions = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n\n try {\n if (options?.simulation) {\n const simulated = generateSimulatedDecisions(options?.strategyIds, limit);\n setDecisions(simulated);\n } else {\n let path = '/api/v1/ai-quant/decisions';\n const params = new URLSearchParams();\n if (options?.strategyId) {\n params.append('strategyId', options.strategyId);\n }\n if (options?.strategyIds?.length) {\n params.append('strategyIds', options.strategyIds.join(','));\n }\n if (options?.actions?.length) {\n params.append('actions', options.actions.join(','));\n }\n params.append('limit', limit.toString());\n if (params.toString()) {\n path += `?${params.toString()}`;\n }\n\n const res = await fetch(`https://api.one23.io${path}`);\n if (res.ok) {\n const data = await res.json();\n if (data?.decisions) {\n setDecisions(data.decisions.map(mapDecision));\n }\n }\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to fetch decisions');\n } finally {\n setIsLoading(false);\n }\n }, [options?.simulation, options?.strategyId, options?.strategyIds, options?.actions, limit]);\n\n // Initial fetch and polling\n useEffect(() => {\n fetchDecisions();\n if (options?.pollInterval) {\n const timer = setInterval(fetchDecisions, options.pollInterval);\n return () => clearInterval(timer);\n }\n }, [fetchDecisions, options?.pollInterval]);\n\n // Filter functions\n const getByStrategy = useCallback((strategyId: string) =>\n decisions.filter(d => d.strategyId === strategyId),\n [decisions]\n );\n\n const getByAction = useCallback((action: DecisionAction) =>\n decisions.filter(d => d.action === action),\n [decisions]\n );\n\n // Computed values\n const recentDecisions = useMemo(() =>\n decisions.slice(0, 10),\n [decisions]\n );\n\n const executedDecisions = useMemo(() =>\n decisions.filter(d => d.executed),\n [decisions]\n );\n\n const stats = useMemo(() => {\n const executed = decisions.filter(d => d.executed);\n const byAction: Record<DecisionAction, number> = {\n OPEN_LONG: 0,\n OPEN_SHORT: 0,\n CLOSE_LONG: 0,\n CLOSE_SHORT: 0,\n HOLD: 0,\n SKIP: 0,\n };\n const byStrategy: Record<string, number> = {};\n\n for (const d of decisions) {\n byAction[d.action]++;\n byStrategy[d.strategyId] = (byStrategy[d.strategyId] || 0) + 1;\n }\n\n const avgConfidence = decisions.length > 0\n ? decisions.reduce((sum, d) => sum + d.confidence, 0) / decisions.length\n : 0;\n\n return {\n totalDecisions: decisions.length,\n executedCount: executed.length,\n executionRate: decisions.length > 0 ? executed.length / decisions.length : 0,\n byAction,\n byStrategy,\n avgConfidence,\n };\n }, [decisions]);\n\n return {\n decisions,\n recentDecisions,\n executedDecisions,\n isLoading,\n error,\n refresh: fetchDecisions,\n getByStrategy,\n getByAction,\n stats,\n };\n}\n\n// ── Helper Functions ──────────────────────────────────────────────────────────\n\nfunction mapDecision(raw: any): AIDecision {\n return {\n id: raw.id,\n timestamp: raw.timestamp ?? Date.now(),\n strategyId: raw.strategyId ?? raw.strategy_id,\n strategyName: raw.strategyName ?? raw.strategy_name ?? '',\n pair: raw.pair,\n action: raw.action,\n confidence: raw.confidence ?? 0,\n reasoning: raw.reasoning ?? '',\n indicators: raw.indicators ?? {},\n signals: raw.signals ?? [],\n executed: raw.executed ?? false,\n positionId: raw.positionId ?? raw.position_id,\n price: raw.price,\n size: raw.size,\n leverage: raw.leverage,\n };\n}\n","// ══════════════════════════════════════════════════════════════════════════════\n// ONE SDK - Trading Console Types & Constants\n// Shared types for real-time trading console components\n// ══════════════════════════════════════════════════════════════════════════════\n\nimport type { BotLogEntry, BotState, StrategyPersonality } from '../services/forex/BotSimulationEngine';\nimport type { ForexLogEntry, ForexPoolTransaction, ForexLogType } from './forex';\n\n// ── Re-exports for convenience ────────────────────────────────────────────────\n\nexport type { BotLogEntry, BotLogType, BotState, IndicatorSnapshot, StrategyPersonality } from '../services/forex/BotSimulationEngine';\n\n// ── Console Log Types ─────────────────────────────────────────────────────────\n\nexport type AILogType =\n | 'SCAN' | 'THINKING' | 'INDICATOR' | 'ANALYSIS' | 'SIGNAL'\n | 'STRATEGY' | 'DECISION' | 'ORDER' | 'FILLED' | 'PNL'\n | 'RISK' | 'NEWS' | 'SYSTEM';\n\nexport const AI_LOG_COLORS: Record<AILogType, string> = {\n SCAN: '#06B6D4', // Cyan\n THINKING: '#A855F7', // Purple\n INDICATOR: '#3B82F6', // Blue\n ANALYSIS: '#6366F1', // Indigo\n SIGNAL: '#F59E0B', // Amber\n STRATEGY: '#D946EF', // Fuchsia\n DECISION: '#F97316', // Orange\n ORDER: '#EC4899', // Pink\n FILLED: '#10B981', // Green\n PNL: '#22C55E', // Emerald\n RISK: '#EF4444', // Red\n NEWS: '#14B8A6', // Teal\n SYSTEM: '#9CA3AF', // Gray\n};\n\n// Forex log type colors (for ForexSimulationEngine logs)\nexport const FOREX_LOG_COLORS: Record<ForexLogType, string> = {\n RFQ: '#06B6D4', // Cyan\n QUOTE: '#8B5CF6', // Purple\n MATCH: '#10B981', // Green\n SETTLE: '#F59E0B', // Amber\n PVP: '#3B82F6', // Blue\n HEDGE: '#EC4899', // Pink\n CLEAR: '#14B8A6', // Teal\n POSITION: '#6366F1', // Indigo\n PNL: '#22C55E', // Emerald\n SYSTEM: '#9CA3AF', // Gray\n};\n\n// ── AI Position Types ─────────────────────────────────────────────────────────\n\nexport type PositionSide = 'LONG' | 'SHORT';\nexport type PositionStatus = 'open' | 'closed' | 'liquidated' | 'pending';\n\nexport interface AIPosition {\n id: string;\n strategyId: string;\n strategyName: string;\n pair: string;\n side: PositionSide;\n entryPrice: number;\n currentPrice: number;\n size: number;\n leverage: number;\n margin: number;\n pnl: number;\n pnlPercent: number;\n status: PositionStatus;\n stopLoss?: number;\n takeProfit?: number;\n liquidationPrice?: number;\n openTime: number;\n closeTime?: number;\n chain?: string;\n orderId?: string;\n aiConfidence?: number;\n aiReasoning?: string;\n}\n\n// ── AI Decision Types ─────────────────────────────────────────────────────────\n\nexport type DecisionAction = 'OPEN_LONG' | 'OPEN_SHORT' | 'CLOSE_LONG' | 'CLOSE_SHORT' | 'HOLD' | 'SKIP';\n\nexport interface AIDecision {\n id: string;\n timestamp: number;\n strategyId: string;\n strategyName: string;\n pair: string;\n action: DecisionAction;\n confidence: number;\n reasoning: string;\n indicators: {\n rsi?: number;\n macd?: number;\n ema?: string;\n volume?: number;\n bollinger?: string;\n };\n signals: string[];\n executed: boolean;\n positionId?: string;\n price?: number;\n size?: number;\n leverage?: number;\n}\n\n// ── Risk Status Types ─────────────────────────────────────────────────────────\n\nexport type RiskLevel = 'low' | 'medium' | 'high' | 'critical';\nexport type TradingStatus = 'active' | 'paused' | 'stopped' | 'cooldown';\n\nexport interface RiskStatus {\n timestamp: number;\n // Portfolio exposure\n totalExposure: number;\n maxExposure: number;\n exposurePercent: number;\n // Daily limits\n dailyPnl: number;\n dailyPnlLimit: number;\n dailyPnlPercent: number;\n dailyTradeCount: number;\n dailyTradeLimit: number;\n // Drawdown\n currentDrawdown: number;\n maxDrawdown: number;\n drawdownPercent: number;\n // Position limits\n openPositions: number;\n maxPositions: number;\n // Risk assessment\n riskLevel: RiskLevel;\n tradingStatus: TradingStatus;\n warnings: string[];\n // Per-strategy risk\n strategyRisks?: Record<string, {\n exposure: number;\n drawdown: number;\n riskLevel: RiskLevel;\n }>;\n}\n\nexport const RISK_LEVEL_COLORS: Record<RiskLevel, { color: string; bgColor: string }> = {\n low: { color: '#10B981', bgColor: '#D1FAE5' },\n medium: { color: '#F59E0B', bgColor: '#FEF3C7' },\n high: { color: '#F97316', bgColor: '#FFEDD5' },\n critical: { color: '#EF4444', bgColor: '#FEE2E2' },\n};\n\nexport const TRADING_STATUS_COLORS: Record<TradingStatus, { color: string; bgColor: string }> = {\n active: { color: '#10B981', bgColor: '#D1FAE5' },\n paused: { color: '#F59E0B', bgColor: '#FEF3C7' },\n stopped: { color: '#EF4444', bgColor: '#FEE2E2' },\n cooldown: { color: '#6366F1', bgColor: '#E0E7FF' },\n};\n\n// ── Console Metrics Types ─────────────────────────────────────────────────────\n\nexport interface ConsoleMetrics {\n // NAV & Performance\n nav: number;\n navChange24h: number;\n navChangePercent24h: number;\n // P&L\n totalPnl: number;\n realizedPnl: number;\n unrealizedPnl: number;\n pnlToday: number;\n pnl7d: number;\n pnl30d: number;\n // Trading stats\n totalTrades: number;\n tradesToday: number;\n winRate: number;\n winCount: number;\n lossCount: number;\n avgWin: number;\n avgLoss: number;\n profitFactor: number;\n // Position stats\n openPositions: number;\n totalExposure: number;\n avgLeverage: number;\n // By strategy\n strategyMetrics?: Record<string, {\n pnl: number;\n trades: number;\n winRate: number;\n exposure: number;\n }>;\n}\n\n// ── Agent Types ───────────────────────────────────────────────────────────────\n\nexport type AgentStatus = 'active' | 'paused' | 'idle' | 'error' | 'initializing';\n\nexport interface AIAgent {\n id: string;\n strategyId: string;\n name: string;\n shortName: string;\n color: string;\n status: AgentStatus;\n // Performance\n totalPnl: number;\n pnlToday: number;\n winRate: number;\n totalTrades: number;\n tradesToday: number;\n // Current state\n currentPair?: string;\n currentPrice?: number;\n lastSignal?: string;\n lastSignalConfidence?: number;\n lastActivity?: number;\n // Positions\n openPositions: number;\n totalExposure: number;\n // Risk\n riskLevel: RiskLevel;\n drawdown: number;\n // Config\n riskTolerance: 'low' | 'medium' | 'high';\n primaryIndicators: string[];\n preferredPairs: string[];\n leverageRange: [number, number];\n}\n\nexport const AGENT_STATUS_COLORS: Record<AgentStatus, { color: string; bgColor: string; label: string }> = {\n active: { color: '#10B981', bgColor: '#D1FAE5', label: 'Active' },\n paused: { color: '#F59E0B', bgColor: '#FEF3C7', label: 'Paused' },\n idle: { color: '#6B7280', bgColor: '#F3F4F6', label: 'Idle' },\n error: { color: '#EF4444', bgColor: '#FEE2E2', label: 'Error' },\n initializing: { color: '#3B82F6', bgColor: '#DBEAFE', label: 'Starting' },\n};\n\n// ── Combined Console State ────────────────────────────────────────────────────\n\nexport interface CombinedLogEntry {\n id: string;\n timestamp: number;\n source: 'ai' | 'forex';\n strategyId?: string;\n strategyName?: string;\n type: string;\n message: string;\n data?: Record<string, any>;\n importance: 'low' | 'medium' | 'high';\n}\n\nexport interface TradingConsoleState {\n ai: {\n strategies: StrategyPersonality[];\n agents: AIAgent[];\n positions: AIPosition[];\n decisions: AIDecision[];\n riskStatus: RiskStatus | null;\n simulationLogs: BotLogEntry[];\n botStates: Map<string, BotState>;\n };\n forex: {\n logs: ForexLogEntry[];\n poolTransactions: ForexPoolTransaction[];\n stats: {\n totalPnl: number;\n totalTrades: number;\n totalPips: number;\n totalLots: number;\n };\n };\n metrics: ConsoleMetrics;\n combinedLogs: CombinedLogEntry[];\n}\n\n// ── Hook Options ──────────────────────────────────────────────────────────────\n\nexport interface TradingConsoleOptions {\n simulation?: boolean;\n pollInterval?: number;\n maxLogs?: number;\n strategyIds?: string[];\n autoStart?: boolean;\n}\n\nexport interface AIQuantConsoleOptions {\n strategyIds?: string[];\n pollInterval?: number;\n simulation?: boolean;\n maxLogs?: number;\n}\n\nexport interface AgentConsoleOptions {\n strategyId: string;\n pollInterval?: number;\n simulation?: boolean;\n maxLogs?: number;\n}\n\n// ── Default Values ────────────────────────────────────────────────────────────\n\nexport const DEFAULT_CONSOLE_OPTIONS: TradingConsoleOptions = {\n simulation: true,\n pollInterval: 5000,\n maxLogs: 500,\n autoStart: false,\n};\n\nexport const DEFAULT_RISK_STATUS: RiskStatus = {\n timestamp: Date.now(),\n totalExposure: 0,\n maxExposure: 100000,\n exposurePercent: 0,\n dailyPnl: 0,\n dailyPnlLimit: 5000,\n dailyPnlPercent: 0,\n dailyTradeCount: 0,\n dailyTradeLimit: 50,\n currentDrawdown: 0,\n maxDrawdown: 15,\n drawdownPercent: 0,\n openPositions: 0,\n maxPositions: 10,\n riskLevel: 'low',\n tradingStatus: 'active',\n warnings: [],\n};\n\nexport const DEFAULT_CONSOLE_METRICS: ConsoleMetrics = {\n nav: 0,\n navChange24h: 0,\n navChangePercent24h: 0,\n totalPnl: 0,\n realizedPnl: 0,\n unrealizedPnl: 0,\n pnlToday: 0,\n pnl7d: 0,\n pnl30d: 0,\n totalTrades: 0,\n tradesToday: 0,\n winRate: 0,\n winCount: 0,\n lossCount: 0,\n avgWin: 0,\n avgLoss: 0,\n profitFactor: 0,\n openPositions: 0,\n totalExposure: 0,\n avgLeverage: 0,\n};\n\n// ── Utility Functions ─────────────────────────────────────────────────────────\n\nexport function calculateRiskLevel(\n exposurePercent: number,\n drawdownPercent: number,\n dailyPnlPercent: number\n): RiskLevel {\n const worstMetric = Math.max(exposurePercent, drawdownPercent, Math.abs(dailyPnlPercent));\n if (worstMetric >= 90) return 'critical';\n if (worstMetric >= 70) return 'high';\n if (worstMetric >= 40) return 'medium';\n return 'low';\n}\n\nexport function formatPnl(pnl: number): string {\n const sign = pnl >= 0 ? '+' : '';\n if (Math.abs(pnl) >= 1000000) {\n return `${sign}$${(pnl / 1000000).toFixed(2)}M`;\n }\n if (Math.abs(pnl) >= 1000) {\n return `${sign}$${(pnl / 1000).toFixed(2)}K`;\n }\n return `${sign}$${pnl.toFixed(2)}`;\n}\n\nexport function formatPercent(value: number, showSign = true): string {\n const sign = showSign && value >= 0 ? '+' : '';\n return `${sign}${value.toFixed(2)}%`;\n}\n","/**\n * ONE SDK - AI Risk Status Hook\n * Provides React hook for monitoring trading risk status and limits\n */\n\nimport { useState, useEffect, useCallback, useMemo } from 'react';\nimport type { RiskStatus, RiskLevel, TradingStatus } from '../types/console';\nimport { DEFAULT_RISK_STATUS, calculateRiskLevel } from '../types/console';\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\nexport interface UseAIRiskStatusOptions {\n strategyId?: string;\n pollInterval?: number;\n simulation?: boolean;\n}\n\nexport interface UseAIRiskStatusResult {\n riskStatus: RiskStatus;\n isLoading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n // Computed values\n isWithinLimits: boolean;\n canTrade: boolean;\n riskLevel: RiskLevel;\n tradingStatus: TradingStatus;\n warnings: string[];\n // Actions\n pauseTrading: () => Promise<boolean>;\n resumeTrading: () => Promise<boolean>;\n resetDailyLimits: () => Promise<boolean>;\n}\n\n// ── Simulation Data Generator ─────────────────────────────────────────────────\n\nfunction generateSimulatedRiskStatus(): RiskStatus {\n const totalExposure = Math.random() * 80000 + 10000;\n const maxExposure = 100000;\n const exposurePercent = (totalExposure / maxExposure) * 100;\n\n const dailyPnl = (Math.random() - 0.3) * 3000;\n const dailyPnlLimit = 5000;\n const dailyPnlPercent = (Math.abs(dailyPnl) / dailyPnlLimit) * 100;\n\n const currentDrawdown = Math.random() * 10;\n const maxDrawdown = 15;\n const drawdownPercent = (currentDrawdown / maxDrawdown) * 100;\n\n const openPositions = Math.floor(Math.random() * 8);\n const maxPositions = 10;\n\n const dailyTradeCount = Math.floor(Math.random() * 30);\n const dailyTradeLimit = 50;\n\n const riskLevel = calculateRiskLevel(exposurePercent, drawdownPercent, dailyPnlPercent);\n\n const warnings: string[] = [];\n if (exposurePercent > 70) warnings.push('High portfolio exposure');\n if (drawdownPercent > 60) warnings.push('Approaching max drawdown');\n if (dailyPnlPercent > 80 && dailyPnl < 0) warnings.push('Daily loss limit warning');\n if (openPositions >= maxPositions - 1) warnings.push('Position limit nearly reached');\n\n let tradingStatus: TradingStatus = 'active';\n if (riskLevel === 'critical') tradingStatus = 'stopped';\n else if (riskLevel === 'high' && warnings.length > 1) tradingStatus = 'paused';\n\n const strategyRisks: Record<string, { exposure: number; drawdown: number; riskLevel: RiskLevel }> = {\n 'balanced-01': {\n exposure: Math.random() * 30000,\n drawdown: Math.random() * 5,\n riskLevel: Math.random() > 0.7 ? 'medium' : 'low',\n },\n 'conservative-01': {\n exposure: Math.random() * 20000,\n drawdown: Math.random() * 3,\n riskLevel: 'low',\n },\n 'aggressive-01': {\n exposure: Math.random() * 40000,\n drawdown: Math.random() * 8,\n riskLevel: Math.random() > 0.5 ? 'high' : 'medium',\n },\n };\n\n return {\n timestamp: Date.now(),\n totalExposure,\n maxExposure,\n exposurePercent,\n dailyPnl,\n dailyPnlLimit,\n dailyPnlPercent,\n dailyTradeCount,\n dailyTradeLimit,\n currentDrawdown,\n maxDrawdown,\n drawdownPercent,\n openPositions,\n maxPositions,\n riskLevel,\n tradingStatus,\n warnings,\n strategyRisks,\n };\n}\n\n// ── Hook Implementation ───────────────────────────────────────────────────────\n\nexport function useAIRiskStatus(options?: UseAIRiskStatusOptions): UseAIRiskStatusResult {\n const [riskStatus, setRiskStatus] = useState<RiskStatus>(DEFAULT_RISK_STATUS);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const fetchRiskStatus = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n\n try {\n if (options?.simulation) {\n const simulated = generateSimulatedRiskStatus();\n setRiskStatus(simulated);\n } else {\n let path = '/api/v1/ai-quant/risk-status';\n if (options?.strategyId) {\n path += `?strategyId=${options.strategyId}`;\n }\n\n const res = await fetch(`https://api.one23.io${path}`);\n if (res.ok) {\n const data = await res.json();\n if (data) {\n setRiskStatus(mapRiskStatus(data));\n }\n }\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to fetch risk status');\n } finally {\n setIsLoading(false);\n }\n }, [options?.simulation, options?.strategyId]);\n\n // Initial fetch and polling\n useEffect(() => {\n fetchRiskStatus();\n if (options?.pollInterval) {\n const timer = setInterval(fetchRiskStatus, options.pollInterval);\n return () => clearInterval(timer);\n }\n }, [fetchRiskStatus, options?.pollInterval]);\n\n // Actions\n const pauseTrading = useCallback(async (): Promise<boolean> => {\n try {\n if (options?.simulation) {\n setRiskStatus(prev => ({ ...prev, tradingStatus: 'paused' }));\n return true;\n }\n const res = await fetch('https://api.one23.io/api/v1/ai-quant/trading/pause', {\n method: 'POST',\n });\n if (res.ok) {\n setRiskStatus(prev => ({ ...prev, tradingStatus: 'paused' }));\n return true;\n }\n return false;\n } catch {\n return false;\n }\n }, [options?.simulation]);\n\n const resumeTrading = useCallback(async (): Promise<boolean> => {\n try {\n if (options?.simulation) {\n setRiskStatus(prev => ({ ...prev, tradingStatus: 'active' }));\n return true;\n }\n const res = await fetch('https://api.one23.io/api/v1/ai-quant/trading/resume', {\n method: 'POST',\n });\n if (res.ok) {\n setRiskStatus(prev => ({ ...prev, tradingStatus: 'active' }));\n return true;\n }\n return false;\n } catch {\n return false;\n }\n }, [options?.simulation]);\n\n const resetDailyLimits = useCallback(async (): Promise<boolean> => {\n try {\n if (options?.simulation) {\n setRiskStatus(prev => ({\n ...prev,\n dailyPnl: 0,\n dailyPnlPercent: 0,\n dailyTradeCount: 0,\n warnings: prev.warnings.filter(w => !w.includes('Daily')),\n }));\n return true;\n }\n const res = await fetch('https://api.one23.io/api/v1/ai-quant/risk/reset-daily', {\n method: 'POST',\n });\n return res.ok;\n } catch {\n return false;\n }\n }, [options?.simulation]);\n\n // Computed values\n const isWithinLimits = useMemo(() => {\n return (\n riskStatus.exposurePercent < 90 &&\n riskStatus.drawdownPercent < 90 &&\n riskStatus.dailyPnlPercent < 90 &&\n riskStatus.openPositions < riskStatus.maxPositions\n );\n }, [riskStatus]);\n\n const canTrade = useMemo(() => {\n return riskStatus.tradingStatus === 'active' && isWithinLimits;\n }, [riskStatus.tradingStatus, isWithinLimits]);\n\n return {\n riskStatus,\n isLoading,\n error,\n refresh: fetchRiskStatus,\n isWithinLimits,\n canTrade,\n riskLevel: riskStatus.riskLevel,\n tradingStatus: riskStatus.tradingStatus,\n warnings: riskStatus.warnings,\n pauseTrading,\n resumeTrading,\n resetDailyLimits,\n };\n}\n\n// ── Helper Functions ──────────────────────────────────────────────────────────\n\nfunction mapRiskStatus(raw: any): RiskStatus {\n const exposurePercent = raw.maxExposure > 0\n ? (raw.totalExposure / raw.maxExposure) * 100\n : 0;\n const dailyPnlPercent = raw.dailyPnlLimit > 0\n ? (Math.abs(raw.dailyPnl) / raw.dailyPnlLimit) * 100\n : 0;\n const drawdownPercent = raw.maxDrawdown > 0\n ? (raw.currentDrawdown / raw.maxDrawdown) * 100\n : 0;\n\n return {\n timestamp: raw.timestamp ?? Date.now(),\n totalExposure: raw.totalExposure ?? raw.total_exposure ?? 0,\n maxExposure: raw.maxExposure ?? raw.max_exposure ?? 100000,\n exposurePercent,\n dailyPnl: raw.dailyPnl ?? raw.daily_pnl ?? 0,\n dailyPnlLimit: raw.dailyPnlLimit ?? raw.daily_pnl_limit ?? 5000,\n dailyPnlPercent,\n dailyTradeCount: raw.dailyTradeCount ?? raw.daily_trade_count ?? 0,\n dailyTradeLimit: raw.dailyTradeLimit ?? raw.daily_trade_limit ?? 50,\n currentDrawdown: raw.currentDrawdown ?? raw.current_drawdown ?? 0,\n maxDrawdown: raw.maxDrawdown ?? raw.max_drawdown ?? 15,\n drawdownPercent,\n openPositions: raw.openPositions ?? raw.open_positions ?? 0,\n maxPositions: raw.maxPositions ?? raw.max_positions ?? 10,\n riskLevel: raw.riskLevel ?? raw.risk_level ?? calculateRiskLevel(exposurePercent, drawdownPercent, dailyPnlPercent),\n tradingStatus: raw.tradingStatus ?? raw.trading_status ?? 'active',\n warnings: raw.warnings ?? [],\n strategyRisks: raw.strategyRisks ?? raw.strategy_risks,\n };\n}\n","/**\n * ONE SDK - AI Quant Console Hook\n * Combined hook for all AI trading console data\n */\n\nimport { useState, useEffect, useCallback, useMemo } from 'react';\nimport { useBotSimulation } from './useBotSimulation';\nimport { useAIPositions } from './useAIPositions';\nimport { useAIDecisions } from './useAIDecisions';\nimport { useAIRiskStatus } from './useAIRiskStatus';\nimport type {\n AIAgent,\n AIPosition,\n AIDecision,\n RiskStatus,\n ConsoleMetrics,\n AIQuantConsoleOptions,\n} from '../types/console';\nimport { DEFAULT_CONSOLE_METRICS, AGENT_STATUS_COLORS } from '../types/console';\nimport type { BotLogEntry, BotState, StrategyPersonality } from '../services/forex/BotSimulationEngine';\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\nexport interface UseAIQuantConsoleResult {\n // Strategies and Agents\n strategies: StrategyPersonality[];\n agents: AIAgent[];\n // Logs\n logs: BotLogEntry[];\n logsByStrategy: Map<string, BotLogEntry[]>;\n // Bot States\n botStates: Map<string, BotState>;\n // Positions\n positions: AIPosition[];\n openPositions: AIPosition[];\n // Decisions\n decisions: AIDecision[];\n recentDecisions: AIDecision[];\n // Risk\n riskStatus: RiskStatus | null;\n // Metrics\n metrics: ConsoleMetrics;\n // State\n isRunning: boolean;\n isLoading: boolean;\n error: string | null;\n // Controls\n start: (strategyIds?: string[]) => void;\n stop: (strategyIds?: string[]) => void;\n clearLogs: () => void;\n emitBootSequence: () => void;\n refresh: () => Promise<void>;\n // Agent helpers\n getAgent: (strategyId: string) => AIAgent | undefined;\n getAgentLogs: (strategyId: string) => BotLogEntry[];\n getAgentPositions: (strategyId: string) => AIPosition[];\n getAgentDecisions: (strategyId: string) => AIDecision[];\n}\n\n// ── Hook Implementation ───────────────────────────────────────────────────────\n\nexport function useAIQuantConsole(options?: AIQuantConsoleOptions): UseAIQuantConsoleResult {\n const simulation = options?.simulation ?? true;\n const pollInterval = options?.pollInterval ?? 5000;\n const maxLogs = options?.maxLogs ?? 500;\n const strategyIds = options?.strategyIds;\n\n // Sub-hooks\n const botSim = useBotSimulation({\n maxLogs,\n strategyIds,\n autoStart: false,\n });\n\n const positionsHook = useAIPositions({\n strategyIds,\n pollInterval,\n simulation,\n });\n\n const decisionsHook = useAIDecisions({\n strategyIds,\n pollInterval,\n simulation,\n limit: 100,\n });\n\n const riskHook = useAIRiskStatus({\n pollInterval,\n simulation,\n });\n\n // Transform bot states to agents\n const agents = useMemo((): AIAgent[] => {\n const agentList: AIAgent[] = [];\n\n for (const strategy of botSim.strategies) {\n const state = botSim.botStates.get(strategy.id);\n const strategyPositions = positionsHook.positions.filter(p => p.strategyId === strategy.id);\n const strategyDecisions = decisionsHook.decisions.filter(d => d.strategyId === strategy.id);\n const openPos = strategyPositions.filter(p => p.status === 'open');\n\n const totalPnl = strategyPositions.reduce((sum, p) => sum + p.pnl, 0);\n const exposure = openPos.reduce((sum, p) => sum + p.size, 0);\n const winCount = strategyPositions.filter(p => p.pnl > 0).length;\n const totalTrades = strategyPositions.length;\n\n // Determine agent risk level based on exposure and drawdown\n let riskLevel: 'low' | 'medium' | 'high' | 'critical' = 'low';\n if (strategy.riskTolerance === 'high') riskLevel = 'medium';\n if (exposure > 50000) riskLevel = 'high';\n if (state && state.openPositions.length >= 3) riskLevel = 'high';\n\n agentList.push({\n id: strategy.id,\n strategyId: strategy.id,\n name: strategy.name,\n shortName: strategy.shortName,\n color: strategy.color,\n status: state?.isRunning ? 'active' : botSim.isRunning ? 'idle' : 'paused',\n totalPnl: state?.totalPnl ?? totalPnl,\n pnlToday: totalPnl * 0.3, // Simulated\n winRate: state?.winRate ?? (totalTrades > 0 ? winCount / totalTrades : 0.5),\n totalTrades: state?.totalTrades ?? totalTrades,\n tradesToday: Math.floor((state?.totalTrades ?? totalTrades) * 0.2),\n currentPair: state?.currentPair,\n currentPrice: state?.currentPrice,\n lastSignal: state?.lastSignal,\n lastSignalConfidence: state?.lastSignalConfidence,\n lastActivity: state ? Date.now() : undefined,\n openPositions: openPos.length,\n totalExposure: exposure,\n riskLevel,\n drawdown: Math.random() * 5, // Simulated\n riskTolerance: strategy.riskTolerance,\n primaryIndicators: strategy.primaryIndicators,\n preferredPairs: strategy.preferredPairs,\n leverageRange: [strategy.leverageMin, strategy.leverageMax],\n });\n }\n\n return agentList;\n }, [botSim.strategies, botSim.botStates, botSim.isRunning, positionsHook.positions, decisionsHook.decisions]);\n\n // Calculate combined metrics\n const metrics = useMemo((): ConsoleMetrics => {\n const positions = positionsHook.positions;\n const openPos = positions.filter(p => p.status === 'open');\n const closedPos = positions.filter(p => p.status === 'closed');\n\n const totalPnl = positions.reduce((sum, p) => sum + p.pnl, 0);\n const unrealizedPnl = openPos.reduce((sum, p) => sum + p.pnl, 0);\n const realizedPnl = closedPos.reduce((sum, p) => sum + p.pnl, 0);\n\n const wins = positions.filter(p => p.pnl > 0);\n const losses = positions.filter(p => p.pnl < 0);\n\n const avgWin = wins.length > 0\n ? wins.reduce((sum, p) => sum + p.pnl, 0) / wins.length\n : 0;\n const avgLoss = losses.length > 0\n ? Math.abs(losses.reduce((sum, p) => sum + p.pnl, 0)) / losses.length\n : 0;\n\n const profitFactor = avgLoss > 0 ? avgWin / avgLoss : avgWin > 0 ? Infinity : 0;\n\n const totalExposure = openPos.reduce((sum, p) => sum + p.size, 0);\n const avgLeverage = openPos.length > 0\n ? openPos.reduce((sum, p) => sum + p.leverage, 0) / openPos.length\n : 0;\n\n // Strategy metrics\n const strategyMetrics: Record<string, { pnl: number; trades: number; winRate: number; exposure: number }> = {};\n for (const agent of agents) {\n const strategyPos = positions.filter(p => p.strategyId === agent.strategyId);\n const strategyOpen = strategyPos.filter(p => p.status === 'open');\n const strategyWins = strategyPos.filter(p => p.pnl > 0);\n\n strategyMetrics[agent.strategyId] = {\n pnl: strategyPos.reduce((sum, p) => sum + p.pnl, 0),\n trades: strategyPos.length,\n winRate: strategyPos.length > 0 ? strategyWins.length / strategyPos.length : 0,\n exposure: strategyOpen.reduce((sum, p) => sum + p.size, 0),\n };\n }\n\n return {\n nav: 100000 + totalPnl,\n navChange24h: totalPnl * 0.3,\n navChangePercent24h: (totalPnl * 0.3) / 100000 * 100,\n totalPnl,\n realizedPnl,\n unrealizedPnl,\n pnlToday: totalPnl * 0.3,\n pnl7d: totalPnl * 0.7,\n pnl30d: totalPnl,\n totalTrades: positions.length,\n tradesToday: Math.floor(positions.length * 0.2),\n winRate: positions.length > 0 ? wins.length / positions.length : 0,\n winCount: wins.length,\n lossCount: losses.length,\n avgWin,\n avgLoss,\n profitFactor,\n openPositions: openPos.length,\n totalExposure,\n avgLeverage,\n strategyMetrics,\n };\n }, [positionsHook.positions, agents]);\n\n // Controls\n const start = useCallback((ids?: string[]) => {\n botSim.start(ids || strategyIds);\n }, [botSim, strategyIds]);\n\n const stop = useCallback((ids?: string[]) => {\n botSim.stop(ids);\n }, [botSim]);\n\n const clearLogs = useCallback(() => {\n botSim.clearLogs();\n }, [botSim]);\n\n const refresh = useCallback(async () => {\n await Promise.all([\n positionsHook.refresh(),\n decisionsHook.refresh(),\n riskHook.refresh(),\n ]);\n }, [positionsHook, decisionsHook, riskHook]);\n\n // Agent helpers\n const getAgent = useCallback((strategyId: string) =>\n agents.find(a => a.strategyId === strategyId),\n [agents]\n );\n\n const getAgentLogs = useCallback((strategyId: string) =>\n botSim.logsByStrategy.get(strategyId) || [],\n [botSim.logsByStrategy]\n );\n\n const getAgentPositions = useCallback((strategyId: string) =>\n positionsHook.positions.filter(p => p.strategyId === strategyId),\n [positionsHook.positions]\n );\n\n const getAgentDecisions = useCallback((strategyId: string) =>\n decisionsHook.decisions.filter(d => d.strategyId === strategyId),\n [decisionsHook.decisions]\n );\n\n // Combined loading/error state\n const isLoading = positionsHook.isLoading || decisionsHook.isLoading || riskHook.isLoading;\n const error = positionsHook.error || decisionsHook.error || riskHook.error;\n\n return {\n strategies: botSim.strategies,\n agents,\n logs: botSim.logs,\n logsByStrategy: botSim.logsByStrategy,\n botStates: botSim.botStates,\n positions: positionsHook.positions,\n openPositions: positionsHook.openPositions,\n decisions: decisionsHook.decisions,\n recentDecisions: decisionsHook.recentDecisions,\n riskStatus: riskHook.riskStatus,\n metrics,\n isRunning: botSim.isRunning,\n isLoading,\n error,\n start,\n stop,\n clearLogs,\n emitBootSequence: botSim.emitBootSequence,\n refresh,\n getAgent,\n getAgentLogs,\n getAgentPositions,\n getAgentDecisions,\n };\n}\n","/**\n * ONE SDK - Master Trading Console Hook\n * Orchestrates all AI and Forex trading data in a unified interface\n */\n\nimport { useState, useEffect, useCallback, useMemo } from 'react';\nimport { useAIQuantConsole } from './useAIQuantConsole';\nimport { useForexSimulation, useForexPools, useForexInvestments } from './useForexTrading';\nimport type {\n AIAgent,\n AIPosition,\n AIDecision,\n RiskStatus,\n ConsoleMetrics,\n CombinedLogEntry,\n TradingConsoleOptions,\n TradingConsoleState,\n} from '../types/console';\nimport { DEFAULT_CONSOLE_METRICS } from '../types/console';\nimport type { BotLogEntry, BotState, StrategyPersonality } from '../services/forex/BotSimulationEngine';\nimport type { ForexLogEntry, ForexPoolTransaction, ForexPool, ForexInvestment } from '../types/forex';\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\nexport interface UseTradingConsoleResult {\n // AI Data\n ai: {\n strategies: StrategyPersonality[];\n agents: AIAgent[];\n positions: AIPosition[];\n decisions: AIDecision[];\n riskStatus: RiskStatus | null;\n simulationLogs: BotLogEntry[];\n logsByStrategy: Map<string, BotLogEntry[]>;\n botStates: Map<string, BotState>;\n };\n // Forex Data\n forex: {\n logs: ForexLogEntry[];\n poolTransactions: ForexPoolTransaction[];\n pools: ForexPool[];\n investments: ForexInvestment[];\n stats: {\n totalPnl: number;\n totalTrades: number;\n totalPips: number;\n totalLots: number;\n };\n };\n // Combined\n combinedLogs: CombinedLogEntry[];\n metrics: ConsoleMetrics;\n // Controls\n controls: {\n startAISimulation: (strategyIds?: string[]) => void;\n stopAISimulation: (strategyIds?: string[]) => void;\n startForexSimulation: () => void;\n stopForexSimulation: () => void;\n startAll: () => void;\n stopAll: () => void;\n clearLogs: () => void;\n emitBootSequence: () => void;\n refreshAll: () => Promise<void>;\n };\n // State\n state: {\n isAISimulationRunning: boolean;\n isForexSimulationRunning: boolean;\n isAnyRunning: boolean;\n isLoading: boolean;\n error: string | null;\n };\n // Agent helpers\n getAgent: (strategyId: string) => AIAgent | undefined;\n getAgentLogs: (strategyId: string) => BotLogEntry[];\n getAgentPositions: (strategyId: string) => AIPosition[];\n getAgentDecisions: (strategyId: string) => AIDecision[];\n}\n\n// ── Hook Implementation ───────────────────────────────────────────────────────\n\nexport function useTradingConsole(options?: TradingConsoleOptions): UseTradingConsoleResult {\n const simulation = options?.simulation ?? true;\n const pollInterval = options?.pollInterval ?? 5000;\n const maxLogs = options?.maxLogs ?? 500;\n const strategyIds = options?.strategyIds;\n const autoStart = options?.autoStart ?? false;\n\n // AI Console Hook\n const aiConsole = useAIQuantConsole({\n simulation,\n pollInterval,\n maxLogs,\n strategyIds,\n });\n\n // Forex Hooks\n const forexSim = useForexSimulation({ maxLogs });\n const forexPools = useForexPools({ refreshInterval: pollInterval });\n const forexInvestments = useForexInvestments({ refreshInterval: pollInterval });\n\n // Combine logs from both AI and Forex\n const combinedLogs = useMemo((): CombinedLogEntry[] => {\n const combined: CombinedLogEntry[] = [];\n\n // Add AI logs\n for (const log of aiConsole.logs) {\n combined.push({\n id: log.id,\n timestamp: log.timestamp,\n source: 'ai',\n strategyId: log.strategyId,\n strategyName: log.strategyName,\n type: log.type,\n message: log.message,\n data: log.data,\n importance: log.importance,\n });\n }\n\n // Add Forex logs\n for (const log of forexSim.logs) {\n combined.push({\n id: log.id,\n timestamp: log.timestamp,\n source: 'forex',\n type: log.type,\n message: log.message,\n data: log.data,\n importance: log.importance,\n });\n }\n\n // Sort by timestamp descending\n return combined.sort((a, b) => b.timestamp - a.timestamp).slice(0, maxLogs);\n }, [aiConsole.logs, forexSim.logs, maxLogs]);\n\n // Combine metrics from AI and Forex\n const combinedMetrics = useMemo((): ConsoleMetrics => {\n const aiMetrics = aiConsole.metrics;\n\n // Add forex stats to metrics\n return {\n ...aiMetrics,\n totalPnl: aiMetrics.totalPnl + forexSim.stats.totalPnl,\n totalTrades: aiMetrics.totalTrades + forexSim.stats.totalTrades,\n };\n }, [aiConsole.metrics, forexSim.stats]);\n\n // Controls\n const controls = useMemo(() => ({\n startAISimulation: (ids?: string[]) => {\n aiConsole.emitBootSequence();\n setTimeout(() => aiConsole.start(ids), 5500);\n },\n stopAISimulation: (ids?: string[]) => {\n aiConsole.stop(ids);\n },\n startForexSimulation: () => {\n forexSim.start();\n },\n stopForexSimulation: () => {\n forexSim.stop();\n },\n startAll: () => {\n aiConsole.emitBootSequence();\n setTimeout(() => {\n aiConsole.start();\n forexSim.start();\n }, 5500);\n },\n stopAll: () => {\n aiConsole.stop();\n forexSim.stop();\n },\n clearLogs: () => {\n aiConsole.clearLogs();\n forexSim.clearLogs();\n },\n emitBootSequence: () => {\n aiConsole.emitBootSequence();\n },\n refreshAll: async () => {\n await Promise.all([\n aiConsole.refresh(),\n forexPools.refresh(),\n forexInvestments.refresh(),\n ]);\n },\n }), [aiConsole, forexSim, forexPools, forexInvestments]);\n\n // State\n const state = useMemo(() => ({\n isAISimulationRunning: aiConsole.isRunning,\n isForexSimulationRunning: forexSim.isRunning,\n isAnyRunning: aiConsole.isRunning || forexSim.isRunning,\n isLoading: aiConsole.isLoading || forexPools.isLoading || forexInvestments.isLoading,\n error: aiConsole.error || forexPools.error || forexInvestments.error,\n }), [aiConsole.isRunning, aiConsole.isLoading, aiConsole.error, forexSim.isRunning, forexPools, forexInvestments]);\n\n // Auto-start if configured\n useEffect(() => {\n if (autoStart) {\n controls.startAll();\n }\n }, [autoStart, controls]);\n\n return {\n ai: {\n strategies: aiConsole.strategies,\n agents: aiConsole.agents,\n positions: aiConsole.positions,\n decisions: aiConsole.decisions,\n riskStatus: aiConsole.riskStatus,\n simulationLogs: aiConsole.logs,\n logsByStrategy: aiConsole.logsByStrategy,\n botStates: aiConsole.botStates,\n },\n forex: {\n logs: forexSim.logs,\n poolTransactions: forexSim.poolTransactions,\n pools: forexPools.pools,\n investments: forexInvestments.investments,\n stats: forexSim.stats,\n },\n combinedLogs,\n metrics: combinedMetrics,\n controls,\n state,\n getAgent: aiConsole.getAgent,\n getAgentLogs: aiConsole.getAgentLogs,\n getAgentPositions: aiConsole.getAgentPositions,\n getAgentDecisions: aiConsole.getAgentDecisions,\n };\n}\n\n// ── Convenience Exports ───────────────────────────────────────────────────────\n\nexport { useAIQuantConsole } from './useAIQuantConsole';\nexport { useBotSimulation } from './useBotSimulation';\nexport { useAIPositions, setConsoleAccessToken, clearConsoleAccessToken, setConsoleEngineUrl } from './useAIPositions';\nexport { useAIDecisions } from './useAIDecisions';\nexport { useAIRiskStatus } from './useAIRiskStatus';\n"]}
|