@ghostspeak/sdk 2.0.6 → 2.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/README.md +152 -30
  2. package/dist/GhostSpeakClient-CWmGaM9Q.d.ts +1007 -0
  3. package/dist/StakingModule-C5rzuOWb.d.ts +2526 -0
  4. package/dist/{agent-M74TCRON.js → agent-5YLZ7DAC.js} +4 -4
  5. package/dist/{agent-M74TCRON.js.map → agent-5YLZ7DAC.js.map} +1 -1
  6. package/dist/batch-operations-45CQFEID.js +4 -0
  7. package/dist/batch-operations-45CQFEID.js.map +1 -0
  8. package/dist/browser.d.ts +45 -554
  9. package/dist/browser.js +15 -842
  10. package/dist/browser.js.map +1 -1
  11. package/dist/chunk-AL3HQN73.js +754 -0
  12. package/dist/chunk-AL3HQN73.js.map +1 -0
  13. package/dist/chunk-BF3IQ35I.js +284 -0
  14. package/dist/chunk-BF3IQ35I.js.map +1 -0
  15. package/dist/chunk-BQDGRTVP.js +168 -0
  16. package/dist/chunk-BQDGRTVP.js.map +1 -0
  17. package/dist/chunk-C5CDA3WX.js +7314 -0
  18. package/dist/chunk-C5CDA3WX.js.map +1 -0
  19. package/dist/chunk-E3FD2CNY.js +1869 -0
  20. package/dist/chunk-E3FD2CNY.js.map +1 -0
  21. package/dist/{chunk-F3DZMBUA.js → chunk-G7S6B6WB.js} +327 -493
  22. package/dist/chunk-G7S6B6WB.js.map +1 -0
  23. package/dist/chunk-IHVDQ4YI.js +4231 -0
  24. package/dist/chunk-IHVDQ4YI.js.map +1 -0
  25. package/dist/chunk-JV2SWONF.js +98 -0
  26. package/dist/chunk-JV2SWONF.js.map +1 -0
  27. package/dist/chunk-KB6CKIUK.js +231 -0
  28. package/dist/chunk-KB6CKIUK.js.map +1 -0
  29. package/dist/chunk-S74EH3KD.js +7890 -0
  30. package/dist/chunk-S74EH3KD.js.map +1 -0
  31. package/dist/chunk-SFTSZ3LC.js +156 -0
  32. package/dist/chunk-SFTSZ3LC.js.map +1 -0
  33. package/dist/chunk-SKMJJ3Q6.js +125 -0
  34. package/dist/chunk-SKMJJ3Q6.js.map +1 -0
  35. package/dist/chunk-SZGFSCNU.js +3682 -0
  36. package/dist/chunk-SZGFSCNU.js.map +1 -0
  37. package/dist/chunk-TTB4OS2D.js +69 -0
  38. package/dist/chunk-TTB4OS2D.js.map +1 -0
  39. package/dist/chunk-UP2VWCW5.js +33 -0
  40. package/dist/{chunk-NSBPE2FW.js.map → chunk-UP2VWCW5.js.map} +1 -1
  41. package/dist/{chunk-UJUGGLMT.js → chunk-VQZQCHUT.js} +5 -5
  42. package/dist/{chunk-UJUGGLMT.js.map → chunk-VQZQCHUT.js.map} +1 -1
  43. package/dist/client.d.ts +5 -4
  44. package/dist/client.js +11 -10
  45. package/dist/createAgentAuthorization-ULG47ZJI.js +5 -0
  46. package/dist/createAgentAuthorization-ULG47ZJI.js.map +1 -0
  47. package/dist/credentials.js +1 -1
  48. package/dist/crypto.js +2 -2
  49. package/dist/errors.js +1 -1
  50. package/dist/feature-flags-B1g0DCPe.d.ts +1181 -0
  51. package/dist/generated-EG5USUFG.js +9 -0
  52. package/dist/{generated-VNLHMR6Y.js.map → generated-EG5USUFG.js.map} +1 -1
  53. package/dist/{ghostspeak_wasm-SB2RPJ3D.js → ghostspeak_wasm-F227HOSM.js} +3 -3
  54. package/dist/{ghostspeak_wasm-SB2RPJ3D.js.map → ghostspeak_wasm-F227HOSM.js.map} +1 -1
  55. package/dist/index.d.ts +1209 -1506
  56. package/dist/index.js +600 -3532
  57. package/dist/index.js.map +1 -1
  58. package/dist/metafile-esm.json +1 -1
  59. package/dist/minimal/core-minimal.d.ts +2383 -1264
  60. package/dist/minimal/core-minimal.js +9 -9
  61. package/dist/minimal/core-minimal.js.map +1 -1
  62. package/dist/nacl-fast-W5BJ3KZ2.js +2229 -0
  63. package/dist/nacl-fast-W5BJ3KZ2.js.map +1 -0
  64. package/dist/pda-4KP7CURF.js +4 -0
  65. package/dist/pda-4KP7CURF.js.map +1 -0
  66. package/dist/pda-Ce7VYg4T.d.ts +25 -0
  67. package/dist/reputation-types-Yebf0Rm_.d.ts +1071 -0
  68. package/dist/revokeAuthorization-OK7E7OK3.js +5 -0
  69. package/dist/revokeAuthorization-OK7E7OK3.js.map +1 -0
  70. package/dist/signature-verification-DGxR4aYQ.d.ts +448 -0
  71. package/dist/types.js +1 -1
  72. package/dist/updateReputationWithAuth-Y4ONEVSP.js +5 -0
  73. package/dist/updateReputationWithAuth-Y4ONEVSP.js.map +1 -0
  74. package/dist/utils.d.ts +69 -203
  75. package/dist/utils.js +15 -153
  76. package/dist/utils.js.map +1 -1
  77. package/package.json +24 -31
  78. package/dist/.tsbuildinfo +0 -1
  79. package/dist/GhostSpeakClient-D_66Uzsf.d.ts +0 -707
  80. package/dist/GovernanceModule-DQYYys-H.d.ts +0 -1766
  81. package/dist/chunk-APCKGD23.js +0 -1328
  82. package/dist/chunk-APCKGD23.js.map +0 -1
  83. package/dist/chunk-ASQXX4IT.js +0 -572
  84. package/dist/chunk-ASQXX4IT.js.map +0 -1
  85. package/dist/chunk-COGZFWOT.js +0 -19657
  86. package/dist/chunk-COGZFWOT.js.map +0 -1
  87. package/dist/chunk-F3DZMBUA.js.map +0 -1
  88. package/dist/chunk-GMHIUK2R.js +0 -7526
  89. package/dist/chunk-GMHIUK2R.js.map +0 -1
  90. package/dist/chunk-IAWBZYPE.js +0 -356
  91. package/dist/chunk-IAWBZYPE.js.map +0 -1
  92. package/dist/chunk-NSBPE2FW.js +0 -15
  93. package/dist/chunk-OWYHJG6H.js +0 -13311
  94. package/dist/chunk-OWYHJG6H.js.map +0 -1
  95. package/dist/chunk-RDDPOFR5.js +0 -3
  96. package/dist/chunk-RDDPOFR5.js.map +0 -1
  97. package/dist/chunk-RERCHKZP.js +0 -35
  98. package/dist/chunk-RERCHKZP.js.map +0 -1
  99. package/dist/chunk-TVVGXYCI.js +0 -2887
  100. package/dist/chunk-TVVGXYCI.js.map +0 -1
  101. package/dist/chunk-ZGP5552B.js +0 -377
  102. package/dist/chunk-ZGP5552B.js.map +0 -1
  103. package/dist/chunk-ZWOYNHVK.js +0 -196
  104. package/dist/chunk-ZWOYNHVK.js.map +0 -1
  105. package/dist/dist/.tsbuildinfo +0 -1
  106. package/dist/elgamal-VZLWB3XK.js +0 -5
  107. package/dist/elgamal-VZLWB3XK.js.map +0 -1
  108. package/dist/feature-flags-V722ZuXO.d.ts +0 -3512
  109. package/dist/generated-VNLHMR6Y.js +0 -5
  110. package/dist/ipfs-types-BOt9ZNg4.d.ts +0 -592
  111. package/dist/multisigConfig-BzEhy6jy.d.ts +0 -58
  112. package/dist/pda-B_nS8SbD.d.ts +0 -114
  113. package/dist/pda-S4BFJVGE.js +0 -4
  114. package/dist/pda-S4BFJVGE.js.map +0 -1
  115. package/dist/system-addresses-BFNLEbFx.d.ts +0 -857
  116. package/dist/token-2022-rpc-RALH4RK7.js +0 -593
  117. package/dist/token-2022-rpc-RALH4RK7.js.map +0 -1
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/x402/X402Client.ts","../src/database/config.ts","../src/database/connection.ts","../src/database/schema/agents.ts","../src/database/schema/transactions.ts","../src/database/schema/analytics.ts","../src/database/schema/facilitators.ts","../src/database/schema/resources.ts","../src/database/schema/resourceMetrics.ts","../src/database/schema/index.ts","../src/database/db.ts","../src/database/services/AgentCacheService.ts","../src/x402/AgentDiscoveryClient.ts","../src/utils/format.ts","../src/x402/middleware.ts","../src/x402/schemas/enhanced-x402.ts","../src/x402/fetchWithPayment.ts","../src/x402/analytics.ts","../src/x402/PaymentStreaming.ts","../src/protocols/A2AClient.ts","../src/protocols/H2AClient.ts","../src/utils/test-ipfs-config.ts","../src/utils/ipfs-error-handling.ts","../../../node_modules/.bun/chalk@5.6.2/node_modules/chalk/source/vendor/ansi-styles/index.js","../../../node_modules/.bun/chalk@5.6.2/node_modules/chalk/source/vendor/supports-color/index.js","../../../node_modules/.bun/chalk@5.6.2/node_modules/chalk/source/utilities.js","../../../node_modules/.bun/chalk@5.6.2/node_modules/chalk/source/index.js","../src/utils/wallet-funding.ts","../src/utils/private-metadata.ts","../src/utils/feature-gate-detector.ts"],"names":["pipe","parsed","sqliteTable","text","integer","index","real","createSolanaRpc","address","agents","EventEmitter","createTransactionMessage","setTransactionMessageFeePayer","setTransactionMessageLifetimeUsingBlockhash","appendTransactionMessageInstruction","signTransactionMessageWithSigners","getBase64EncodedWireTransaction","DEFAULT_RETRY_CONFIG","process","styles","chalk","i","walletData","fs","lamports","createClient"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwJO,IAAM,UAAA,GAAN,cAAyB,YAAA,CAAa;AAAA,EAC3C,WAAA,CACU,KACA,MAAA,EACR;AACA,IAAA,KAAA,EAAM;AAHE,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAGV;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,qBAAqB,MAAA,EAME;AACrB,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,MAAM,IAAI,MAAM,2CAA2C,CAAA;AAAA,IAC7D;AAGA,IAAA,MAAM,SAAA,GAAY,KAAK,MAAA,CAAO,OAAA;AAE9B,IAAA,OAAO;AAAA,MACL,SAAA;AAAA,MACA,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,SAAA,EAAW,MAAA,CAAO,SAAA,IAAa,IAAA,CAAK,KAAI,GAAI,GAAA;AAAA;AAAA,MAC5C,eAAA,EAAiB;AAAA,KACnB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAqB,OAAA,EAAiD;AACpE,IAAA,MAAM,OAAA,GAA8B;AAAA,MAClC,qBAAqB,OAAA,CAAQ,SAAA;AAAA,MAC7B,kBAAA,EAAoB,OAAA,CAAQ,MAAA,CAAO,QAAA,EAAS;AAAA,MAC5C,mBAAmB,OAAA,CAAQ,KAAA;AAAA,MAC3B,sBAAA,EAAwB;AAAA,KAC1B;AAEA,IAAA,IAAI,QAAQ,WAAA,EAAa;AACvB,MAAA,OAAA,CAAQ,uBAAuB,IAAI,OAAA,CAAQ,WAAA;AAAA,IAC7C;AAEA,IAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,MAAA,OAAA,CAAQ,sBAAsB,CAAA,GAAI,OAAA,CAAQ,SAAA,CAAU,QAAA,EAAS;AAAA,IAC/D;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAI,OAAA,EAA0D;AAClE,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,MAAM,IAAI,MAAM,iCAAiC,CAAA;AAAA,IACnD;AAGA,IAAA,IAAI,OAAA,CAAQ,UAAU,EAAA,EAAI;AACxB,MAAA,MAAM,IAAI,MAAM,0CAA0C,CAAA;AAAA,IAC5D;AAEA,IAAA,IAAI,CAAC,QAAQ,SAAA,EAAW;AACtB,MAAA,MAAM,IAAI,MAAM,uCAAuC,CAAA;AAAA,IACzD;AAEA,IAAA,IAAI,CAAC,QAAQ,KAAA,EAAO;AAClB,MAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,IACrD;AAGA,IAAA,IAAA,CAAK,KAAK,iBAAA,EAAmB;AAAA,MAC3B,IAAA,EAAM,iBAAA;AAAA,MACN,OAAA;AAAA,MACA,SAAA,EAAW,KAAK,GAAA;AAAI,KACrB,CAAA;AAED,IAAA,IAAI;AAEF,MAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,yBAAA;AAAA,QAC5B,OAAA,CAAQ,SAAA;AAAA,QACR,OAAA,CAAQ,MAAA;AAAA,QACR,OAAA,CAAQ;AAAA,OACV,CAAE,KAAA,CAAM,CAAC,KAAA,KAAU;AACjB,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,uCAAA,EAA0C,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,UAAU,eAAe,CAAA;AAAA,SACpG;AAAA,MACF,CAAC,CAAA;AAGD,MAAA,MAAM,SAAS,IAAA,CAAK,qBAAA;AAAA,QAClB,CAAA,KAAA,EAAQ,OAAA,CAAQ,WAAW,CAAA,CAAA,EAAI,IAAA,CAAK,UAAU,OAAA,CAAQ,QAAA,IAAY,EAAE,CAAC,CAAA;AAAA,OACvE;AAGA,MAAA,MAAM,EAAE,KAAA,EAAO,eAAA,EAAgB,GAAI,MAAM,IAAA,CAAK,GAAA,CAC3C,kBAAA,EAAmB,CACnB,IAAA,EAAK,CACL,KAAA,CAAM,CAAC,KAAA,KAAU;AAChB,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,kCAAA,EAAqC,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,UAAU,eAAe,CAAA;AAAA,SAC/F;AAAA,MACF,CAAC,CAAA;AAGH,MAAA,MAAM,eAAA,GAAkB,KAAK,MAAA,CAAO,OAAA;AACpC,MAAA,MAAM,OAAA,GAAUA,MAAA;AAAA,QACd,wBAAA,CAAyB,EAAE,OAAA,EAAS,CAAA,EAAG,CAAA;AAAA,QACvC,CAAC,CAAA,KAAM,6BAAA,CAA8B,eAAA,EAAiB,CAAC,CAAA;AAAA,QACvD,CAAC,CAAA,KAAM,2CAAA,CAA4C,eAAA,EAAiB,CAAC,CAAA;AAAA,QACrE,CAAC,CAAA,KAAM,mCAAA,CAAoC,UAAA,EAAY,CAAC,CAAA;AAAA,QACxD,CAAC,CAAA,KAAM,mCAAA,CAAoC,MAAA,EAAQ,CAAC;AAAA,OACtD;AAGA,MAAA,MAAM,oBAAoB,MAAM,iCAAA,CAAkC,OAAO,CAAA,CAAE,KAAA,CAAM,CAAC,KAAA,KAAU;AAC1F,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,4BAAA,EAA+B,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,UAAU,eAAe,CAAA;AAAA,SACzF;AAAA,MACF,CAAC,CAAA;AAMD,MAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,iCAAA,CAAkC,iBAAiB,CAAA,CAAE,KAAA,CAAM,CAAC,KAAA,KAAU;AAEjG,QAAA,MAAM,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAE1E,QAAA,IAAI,YAAA,CAAa,QAAA,CAAS,oBAAoB,CAAA,EAAG;AAC/C,UAAA,MAAM,IAAI,MAAM,wCAAwC,CAAA;AAAA,QAC1D;AACA,QAAA,IAAI,YAAA,CAAa,QAAA,CAAS,qBAAqB,CAAA,EAAG;AAChD,UAAA,MAAM,IAAI,MAAM,gDAAgD,CAAA;AAAA,QAClE;AACA,QAAA,IAAI,YAAA,CAAa,QAAA,CAAS,qBAAqB,CAAA,EAAG;AAChD,UAAA,MAAM,IAAI,KAAA;AAAA,YACR;AAAA,WAEF;AAAA,QACF;AAEA,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,uBAAuB,YAAY,CAAA;AAAA,SACrC;AAAA,MACF,CAAC,CAAA;AAGD,MAAA,IAAA,CAAK,KAAK,cAAA,EAAgB;AAAA,QACxB,IAAA,EAAM,cAAA;AAAA,QACN,SAAA;AAAA,QACA,OAAA;AAAA,QACA,SAAA,EAAW,KAAK,GAAA;AAAI,OACrB,CAAA;AAGD,MAAA,MAAM,EAAA,GAAK,MAAM,IAAA,CAAK,GAAA,CAAI,eAAe,SAAA,EAAW;AAAA,QAClD,QAAA,EAAU,YAAA;AAAA,QACV,8BAAA,EAAgC;AAAA,OACjC,CAAA,CAAE,IAAA,EAAK,CAAE,KAAA,CAAM,CAAC,KAAA,KAAU;AAGzB,QAAA,OAAA,CAAQ,IAAA,CAAK,8DAA8D,KAAK,CAAA;AAChF,QAAA,OAAO,IAAA;AAAA,MACT,CAAC,CAAA;AAED,MAAA,MAAM,OAAA,GAA8B;AAAA,QAClC,SAAA;AAAA,QACA,WAAW,OAAA,CAAQ,SAAA;AAAA,QACnB,QAAQ,OAAA,CAAQ,MAAA;AAAA,QAChB,OAAO,OAAA,CAAQ,KAAA;AAAA,QACf,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,UAAU,OAAA,CAAQ,QAAA;AAAA,QAClB,WAAW,EAAA,EAAI,SAAA,GAAY,MAAA,CAAO,EAAA,CAAG,SAAS,CAAA,GAAI,KAAA,CAAA;AAAA,QAClD,IAAA,EAAM,IAAI,IAAA,IAAQ,KAAA;AAAA,OACpB;AAGA,MAAA,IAAA,CAAK,KAAK,mBAAA,EAAqB;AAAA,QAC7B,IAAA,EAAM,mBAAA;AAAA,QACN,SAAA;AAAA,QACA,OAAA;AAAA,QACA,OAAA;AAAA,QACA,SAAA,EAAW,KAAK,GAAA;AAAI,OACrB,CAAA;AAED,MAAA,OAAO,OAAA;AAAA,IACT,SAAS,KAAA,EAAO;AAEd,MAAA,MAAM,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC1E,MAAA,IAAA,CAAK,KAAK,gBAAA,EAAkB;AAAA,QAC1B,IAAA,EAAM,gBAAA;AAAA,QACN,OAAA;AAAA,QACA,KAAA,EAAO,YAAA;AAAA,QACP,SAAA,EAAW,KAAK,GAAA;AAAI,OACrB,CAAA;AAGD,MAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,QAAA,MAAM,KAAA;AAAA,MACR;AACA,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,MAAA,CAAO,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,IACpD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,SAAA,EAAuD;AACzE,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,GAAK,MAAM,IAAA,CAAK,GAAA,CAAI,eAAe,SAAA,EAAW;AAAA,QAClD,QAAA,EAAU,YAAA;AAAA,QACV,8BAAA,EAAgC;AAAA,OACjC,EAAE,IAAA,EAAK;AAER,MAAA,IAAI,CAAC,EAAA,EAAI;AACP,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,KAAA;AAAA,UACP,KAAA,EAAO;AAAA,SACT;AAAA,MACF;AAGA,MAAA,IAAI,EAAA,CAAG,IAAA,EAAM,GAAA,KAAQ,IAAA,EAAM;AACzB,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,KAAA;AAAA,UACP,KAAA,EAAO;AAAA,SACT;AAAA,MACF;AAGA,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,uBAAA,CAAwB,EAAA,EAAI,SAAS,CAAA;AAE1D,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,IAAA;AAAA,QACP;AAAA,OACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,KAAA;AAAA,QACP,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBAAqB,MAAA,EAKS;AAClC,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,aAAA,CAAc,OAAO,SAAS,CAAA;AAExD,IAAA,IAAI,CAAC,MAAA,CAAO,KAAA,IAAS,CAAC,OAAO,OAAA,EAAS;AACpC,MAAA,OAAO,MAAA;AAAA,IACT;AAGA,IAAA,IAAI,MAAA,CAAO,OAAA,CAAQ,SAAA,KAAc,MAAA,CAAO,iBAAA,EAAmB;AACzD,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,KAAA;AAAA,QACP,KAAA,EAAO;AAAA,OACT;AAAA,IACF;AAGA,IAAA,IAAI,MAAA,CAAO,OAAA,CAAQ,MAAA,KAAW,MAAA,CAAO,cAAA,EAAgB;AACnD,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,KAAA;AAAA,QACP,KAAA,EAAO;AAAA,OACT;AAAA,IACF;AAGA,IAAA,IAAI,MAAA,CAAO,OAAA,CAAQ,KAAA,KAAU,MAAA,CAAO,aAAA,EAAe;AACjD,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,KAAA;AAAA,QACP,KAAA,EAAO;AAAA,OACT;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,IAAA;AAAA,MACP,SAAS,MAAA,CAAO;AAAA,KAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAiB,SAAA,EAGpB;AACD,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,qBAAqB,CAAC,SAAS,CAAC,CAAA,CAAE,IAAA,EAAK;AAErE,MAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA,EAAG;AACpB,QAAA,OAAO,EAAE,QAAQ,WAAA,EAAY;AAAA,MAC/B;AAEA,MAAA,MAAM,QAAA,GAAW,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA;AAE/B,MAAA,IAAI,SAAS,GAAA,EAAK;AAChB,QAAA,OAAO,EAAE,QAAQ,QAAA,EAAS;AAAA,MAC5B;AAEA,MAAA,IAAI,QAAA,CAAS,uBAAuB,WAAA,EAAa;AAC/C,QAAA,OAAO,EAAE,MAAA,EAAQ,WAAA,EAAa,aAAA,EAAe,EAAA,EAAG;AAAA,MAClD;AAEA,MAAA,IAAI,QAAA,CAAS,uBAAuB,WAAA,EAAa;AAC/C,QAAA,OAAO,EAAE,MAAA,EAAQ,WAAA,EAAa,aAAA,EAAe,CAAA,EAAE;AAAA,MACjD;AAEA,MAAA,OAAO,EAAE,QAAQ,SAAA,EAAU;AAAA,IAC7B,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,EAAE,QAAQ,WAAA,EAAY;AAAA,IAC/B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,yBAAA,CACZ,SAAA,EACA,MAAA,EACA,KAAA,EACuB;AACvB,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,MAAM,IAAI,MAAM,iBAAiB,CAAA;AAAA,IACnC;AAGA,IAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,yBAAA;AAAA,MAC/B,KAAK,MAAA,CAAO,OAAA;AAAA,MACZ;AAAA,KACF;AACA,IAAA,MAAM,kBAAA,GAAqB,MAAM,IAAA,CAAK,yBAAA;AAAA,MACpC,SAAA;AAAA,MACA;AAAA,KACF;AAIA,IAAA,MAAM,gBAAA,GAAmB,QAAQ,6CAA6C,CAAA;AAE9E,IAAA,MAAM,IAAA,GAAO;AAAA,MACX,EAAE,SAAS,aAAA,EAAe,IAAA,EAAM,GAAG,UAAA,EAAY,IAAA,EAAM,UAAU,KAAA,EAAM;AAAA,MACrE,EAAE,SAAS,kBAAA,EAAoB,IAAA,EAAM,GAAG,UAAA,EAAY,IAAA,EAAM,UAAU,KAAA,EAAM;AAAA,MAC1E,EAAE,OAAA,EAAS,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,MAAM,CAAA,EAAG,UAAA,EAAY,KAAA,EAAO,QAAA,EAAU,IAAA;AAAK,KAC7E;AAGA,IAAA,MAAM,IAAA,GAAO,IAAI,UAAA,CAAW,CAAC,CAAA;AAC7B,IAAA,IAAA,CAAK,CAAC,CAAA,GAAI,CAAA;AACV,IAAA,MAAM,WAAA,GAAc,IAAI,cAAA,CAAe,CAAC,MAAM,CAAC,CAAA;AAC/C,IAAA,IAAA,CAAK,IAAI,IAAI,UAAA,CAAW,WAAA,CAAY,MAAM,GAAG,CAAC,CAAA;AAE9C,IAAA,OAAO;AAAA,MACL,cAAA,EAAgB,gBAAA;AAAA,MAChB,QAAA,EAAU,IAAA;AAAA,MACV;AAAA,KACF;AAAA,EACF;AAAA,EAEQ,sBAAsB,IAAA,EAA4B;AACxD,IAAA,MAAM,eAAA,GAAkB,QAAQ,6CAA6C,CAAA;AAE7E,IAAA,OAAO;AAAA,MACL,cAAA,EAAgB,eAAA;AAAA,MAChB,UAAU,EAAC;AAAA,MACX,IAAA,EAAM,IAAI,WAAA,EAAY,CAAE,OAAO,IAAI;AAAA,KACrC;AAAA,EACF;AAAA,EAEA,MAAc,yBAAA,CACZ,KAAA,EACA,KAAA,EACkB;AAElB,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,GAAA,CAAI,uBAAA;AAAA,QAC9B,KAAA;AAAA,QACA,EAAE,MAAM,KAAA,EAAM;AAAA,QACd,EAAE,UAAU,YAAA;AAAa,QACzB,IAAA,EAAK;AAEP,MAAA,IAAI,QAAA,CAAS,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AAE7B,QAAA,OAAO,QAAA,CAAS,KAAA,CAAM,CAAC,CAAA,CAAE,MAAA;AAAA,MAC3B;AAGA,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,6CAAA,EAAgD,KAAK,CAAA,UAAA,EAAa,KAAK,CAAA,wHAAA;AAAA,OAGzE;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,iBAAiB,KAAA,IAAS,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,oCAAoC,CAAA,EAAG;AAC1F,QAAA,MAAM,KAAA;AAAA,MACR;AACA,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,wCAAA,EAA2C,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,UAAU,eAAe,CAAA;AAAA,OACrG;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,uBAAA,CACN,IACA,SAAA,EACoB;AAEpB,IAAA,MAAM,YAAA,GAA6C,EAAA,CAAG,WAAA,EAAa,OAAA,EAAS,gBAAgB,EAAC;AAG7F,IAAA,MAAM,mBAAA,GAAsB,YAAA,CAAa,IAAA,CAAK,CAAC,EAAA,KAA0B;AACvE,MAAA,MAAMC,UAAS,OAAO,EAAA,CAAG,MAAA,KAAW,QAAA,GAAW,GAAG,MAAA,GAAS,IAAA;AAC3D,MAAA,OAAO,EAAA,CAAG,OAAA,KAAY,WAAA,IAAeA,OAAAA,EAAQ,IAAA,KAAS,UAAA;AAAA,IACxD,CAAC,CAAA;AAED,IAAA,IAAI,CAAC,mBAAA,EAAqB;AACxB,MAAA,MAAM,IAAI,MAAM,4CAA4C,CAAA;AAAA,IAC9D;AAEA,IAAA,MAAM,SAAS,OAAO,mBAAA,CAAoB,MAAA,KAAW,QAAA,GAAW,oBAAoB,MAAA,GAAS,IAAA;AAC7F,IAAA,MAAM,eAAe,MAAA,EAAQ,IAAA;AAC7B,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,MAAM,IAAI,MAAM,gDAAgD,CAAA;AAAA,IAClE;AAGA,IAAA,MAAM,YAAY,OAAA,CAAQ,YAAA,CAAa,WAAA,IAAe,YAAA,CAAa,WAAW,EAAE,CAAA;AAChF,IAAA,MAAM,SAAS,MAAA,CAAO,YAAA,CAAa,UAAU,YAAA,CAAa,WAAA,EAAa,UAAU,GAAG,CAAA;AAGpF,IAAA,IAAI,SAAA;AACJ,IAAA,MAAM,aAAA,GAAyC,EAAA,CAAG,IAAA,EAAM,gBAAA,IAAoB,EAAC;AAC7E,IAAA,IAAI,aAAA,CAAc,SAAS,CAAA,EAAG;AAC5B,MAAA,SAAA,GAAY,QAAQ,MAAA,CAAO,aAAA,CAAc,CAAC,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,IACnD,CAAA,MAAO;AACL,MAAA,MAAM,IAAI,MAAM,+CAA+C,CAAA;AAAA,IACjE;AAGA,IAAA,MAAM,eAAA,GAAkB,YAAA,CAAa,IAAA,CAAK,CAAC,EAAA,KAA0B;AACnE,MAAA,MAAM,YAAA,GAAe,OAAO,EAAA,CAAG,SAAA,KAAc,QAAA,GACzC,GAAG,SAAA,GACH,EAAA,CAAG,SAAA,EAAW,QAAA,EAAS,IAAK,EAAA;AAChC,MAAA,OAAO,EAAA,CAAG,OAAA,KAAY,UAAA,IAAc,YAAA,KAAiB,6CAAA;AAAA,IACvD,CAAC,CAAA;AAED,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI,eAAA,EAAiB;AACnB,MAAA,IAAI;AACF,QAAA,MAAM,UAAA,GAAa,OAAO,eAAA,CAAgB,MAAA,KAAW,WACjD,eAAA,CAAgB,MAAA,GAChB,OAAO,eAAA,CAAgB,MAAA,KAAW,QAAA,GAC/B,eAAA,CAAgB,MAAA,EAAQ,QAAQ,EAAA,GACjC,EAAA;AACN,QAAA,MAAM,QAAA,GAAW,UAAA,KACA,eAAA,CAAgB,IAAA,GAAO,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,eAAA,CAAgB,IAAA,EAAM,QAAQ,CAAC,CAAA,GAAI,EAAA,CAAA;AAEhH,QAAA,IAAI,OAAO,QAAA,KAAa,QAAA,IAAY,QAAA,CAAS,UAAA,CAAW,OAAO,CAAA,EAAG;AAChE,UAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA;AAChC,UAAA,IAAI,KAAA,CAAM,UAAU,CAAA,EAAG;AACrB,YAAA,IAAI;AACF,cAAA,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,YAChC,CAAA,CAAA,MAAQ;AAAA,YAER;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAGA,IAAA,MAAM,YAAA,GAAe,EAAA,CAAG,SAAA,IAAa,IAAA,GAChC,OAAO,EAAA,CAAG,SAAA,KAAc,QAAA,GAAW,MAAA,CAAO,EAAA,CAAG,SAAS,CAAA,GAAI,GAAG,SAAA,GAC9D,MAAA;AAEJ,IAAA,OAAO;AAAA,MACL,SAAA;AAAA,MACA,SAAA;AAAA,MACA,MAAA;AAAA,MACA,KAAA,EAAO,SAAA;AAAA,MACP,WAAW,YAAA,IAAgB,IAAA,GAAO,YAAA,GAAe,GAAA,GAAO,KAAK,GAAA,EAAI;AAAA,MACjE,QAAA;AAAA,MACA,SAAA,EAAW,YAAA;AAAA,MACX,MAAM,EAAA,CAAG;AAAA,KACX;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,kCACZ,iBAAA,EACoB;AAEpB,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,MAAA,CAAO,iBAAA,CAAkB,UAAU,CAAA;AAC7D,IAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,MAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,IACjD;AAGA,IAAA,MAAM,QAAA,GAAW,WAAW,CAAC,CAAA;AAC7B,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,IACjD;AAEA,IAAA,MAAM,SAAA,GAAY,QAAA;AAGlB,IAAA,MAAM,eAAA,GAAkB,gCAAgC,iBAAiB,CAAA;AAGzE,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,eAAA,CAAgB,eAAe,EAAE,IAAA,EAAK;AAGrD,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,EAAK;AAC3B,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,qBAAqB,CAAC,SAAS,CAAC,CAAA,CAAE,IAAA,EAAK;AACrE,MAAA,IAAI,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA,EAAG,kBAAA,KAAuB,WAAA,IACxC,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA,EAAG,kBAAA,KAAuB,WAAA,EAAa;AACvD,QAAA,OAAO,SAAA;AAAA,MACT;AACA,MAAA,MAAM,IAAI,OAAA,CAAQ,CAAA,OAAA,KAAW,UAAA,CAAW,OAAA,EAAS,GAAI,CAAC,CAAA;AAAA,IACxD;AAEA,IAAA,MAAM,IAAI,MAAM,kCAAkC,CAAA;AAAA,EACpD;AACF;AAMO,SAAS,gBAAA,CACd,QACA,MAAA,EACY;AACZ,EAAA,MAAM,GAAA,GAAM,gBAAgB,MAAM,CAAA;AAClC,EAAA,OAAO,IAAI,UAAA,CAAW,GAAA,EAAK,MAAM,CAAA;AACnC;;;AC3oBA,IAAM,cAAA,GAAqE;AAAA,EACvE,IAAA,EAAM,OAAA,CAAQ,GAAA,CAAI,QAAA,KAAa,eAAe,YAAA,GAAe,aAAA;AAAA,EAC7D,IAAA,EAAM;AAAA,IACF,GAAA,EAAK,EAAA;AAAA,IACL,GAAA,EAAK,CAAA;AAAA,IACL,mBAAA,EAAqB,GAAA;AAAA,IACrB,aAAA,EAAe;AAAA;AAEvB,CAAA;AAoBO,SAAS,cAAA,GAA8B;AAC1C,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,CAAI,kBAAA,IAAsB,IAAA;AAC9C,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,GAAA,CAAI,gBAAA,IAAoB,IAAA;AAGlD,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,GAAA,IAAO,SAAS,CAAA;AAExC,EAAA,IAAI,CAAC,OAAA,KAAY,GAAA,IAAO,SAAA,CAAA,EAAY;AAEhC,IAAA,OAAA,CAAQ,IAAA;AAAA,MACJ;AAAA,KAGJ;AAAA,EACJ;AAEA,EAAA,OAAO;AAAA,IACH,GAAA;AAAA,IACA,SAAA;AAAA,IACA,OAAA;AAAA,IACA,GAAG;AAAA,GACP;AACJ;AAUO,SAAS,eAAe,MAAA,EAA8B;AACzD,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACjB,IAAA,OAAO,KAAA;AAAA,EACX;AAEA,EAAA,IAAI,CAAC,MAAA,CAAO,GAAA,IAAO,CAAC,OAAO,SAAA,EAAW;AAClC,IAAA,OAAO,KAAA;AAAA,EACX;AAGA,EAAA,IAAI,CAAC,MAAA,CAAO,GAAA,CAAI,UAAA,CAAW,WAAW,KAAK,CAAC,MAAA,CAAO,GAAA,CAAI,UAAA,CAAW,SAAS,CAAA,IAAK,CAAC,OAAO,GAAA,CAAI,UAAA,CAAW,UAAU,CAAA,EAAG;AAChH,IAAA,OAAA,CAAQ,MAAM,mGAAmG,CAAA;AACjH,IAAA,OAAO,KAAA;AAAA,EACX;AAEA,EAAA,OAAO,IAAA;AACX;;;ACxGA,IAAM,oBAAA,GAAoC;AAAA,EACtC,UAAA,EAAY,CAAA;AAAA,EACZ,cAAA,EAAgB,GAAA;AAAA,EAChB,UAAA,EAAY,GAAA;AAAA,EACZ,iBAAA,EAAmB;AACvB,CAAA;AAKA,IAAI,eAAA,GAAmC;AAAA,EACnC,MAAA,EAAQ,IAAA;AAAA,EACR,WAAA,EAAa,KAAA;AAAA,EACb,OAAA,EAAS,KAAA;AAAA,EACT,SAAA,EAAW,IAAA;AAAA,EACX,UAAA,EAAY,CAAA;AAAA,EACZ,kBAAA,EAAoB;AACxB,CAAA;AAKA,SAAS,MAAM,EAAA,EAA2B;AACtC,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAA,OAAA,KAAW,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AACzD;AAKA,SAAS,aAAA,CAAc,YAAoB,MAAA,EAA6B;AACpE,EAAA,MAAM,QAAQ,IAAA,CAAK,GAAA;AAAA,IACf,OAAO,cAAA,GAAiB,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,mBAAmB,UAAU,CAAA;AAAA,IACrE,MAAA,CAAO;AAAA,GACX;AACA,EAAA,OAAO,KAAA;AACX;AAUA,eAAe,oBAAA,CACX,MAAA,EACA,WAAA,GAA2B,oBAAA,EACZ;AACf,EAAA,IAAI,SAAA,GAA0B,IAAA;AAE9B,EAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,IAAW,WAAA,CAAY,YAAY,OAAA,EAAA,EAAW;AAChE,IAAA,IAAI;AACA,MAAA,eAAA,CAAgB,kBAAA,GAAqB,KAAK,GAAA,EAAI;AAE9C,MAAA,IAAI,UAAU,CAAA,EAAG;AACb,QAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,OAAA,GAAU,CAAA,EAAG,WAAW,CAAA;AACpD,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,mDAAA,EAAsD,OAAA,GAAU,CAAC,CAAA,CAAA,EAAI,YAAY,UAAA,GAAa,CAAC,CAAA,QAAA,EAAW,KAAK,CAAA,KAAA,CAAO,CAAA;AAClI,QAAA,MAAM,MAAM,KAAK,CAAA;AAAA,MACrB;AAGA,MAAA,MAAM,SAAS,YAAA,CAAa;AAAA,QACxB,KAAK,MAAA,CAAO,GAAA;AAAA,QACZ,WAAW,MAAA,CAAO;AAAA,OACrB,CAAA;AAGD,MAAA,MAAM,MAAA,CAAO,QAAQ,UAAU,CAAA;AAE/B,MAAA,OAAA,CAAQ,IAAI,2DAA2D,CAAA;AACvE,MAAA,eAAA,CAAgB,UAAA,GAAa,OAAA;AAC7B,MAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAC1B,MAAA,eAAA,CAAgB,SAAA,GAAY,IAAA;AAE5B,MAAA,OAAO,MAAA;AAAA,IAEX,SAAS,KAAA,EAAO;AACZ,MAAA,SAAA,GAAY,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AACpE,MAAA,OAAA,CAAQ,MAAM,CAAA,yCAAA,EAA4C,OAAA,GAAU,CAAC,CAAA,QAAA,CAAA,EAAY,UAAU,OAAO,CAAA;AAElG,MAAA,IAAI,OAAA,KAAY,YAAY,UAAA,EAAY;AACpC,QAAA,eAAA,CAAgB,OAAA,GAAU,KAAA;AAC1B,QAAA,eAAA,CAAgB,SAAA,GAAY,SAAA;AAC5B,QAAA;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAEA,EAAA,MAAM,IAAI,KAAA;AAAA,IACN,6CAA6C,WAAA,CAAY,UAAA,GAAa,CAAC,CAAA,uBAAA,EACxD,SAAA,EAAW,WAAW,eAAe,CAAA;AAAA,GACxD;AACJ;AAuBA,eAAsB,aAAA,GAAiC;AACnD,EAAA,MAAM,SAAS,cAAA,EAAe;AAG9B,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACjB,IAAA,MAAM,IAAI,KAAA;AAAA,MACN;AAAA,KACJ;AAAA,EACJ;AAGA,EAAA,IAAI,CAAC,cAAA,CAAe,MAAM,CAAA,EAAG;AACzB,IAAA,MAAM,IAAI,MAAM,sCAAsC,CAAA;AAAA,EAC1D;AAGA,EAAA,IAAI,eAAA,CAAgB,MAAA,IAAU,eAAA,CAAgB,OAAA,EAAS;AACnD,IAAA,OAAO,eAAA,CAAgB,MAAA;AAAA,EAC3B;AAGA,EAAA,IAAI,CAAC,eAAA,CAAgB,WAAA,IAAe,CAAC,gBAAgB,OAAA,EAAS;AAC1D,IAAA,eAAA,CAAgB,WAAA,GAAc,IAAA;AAC9B,IAAA,eAAA,CAAgB,MAAA,GAAS,MAAM,oBAAA,CAAqB,MAAM,CAAA;AAAA,EAC9D;AAEA,EAAA,OAAO,eAAA,CAAgB,MAAA;AAC3B;AAuFA,eAAsB,WAAA,GAAgC;AAClD,EAAA,MAAM,SAAS,cAAA,EAAe;AAE9B,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACjB,IAAA,OAAO,KAAA;AAAA,EACX;AAEA,EAAA,IAAI;AACA,IAAA,MAAM,aAAA,EAAc;AACpB,IAAA,OAAO,IAAA;AAAA,EACX,CAAA,CAAA,MAAQ;AACJ,IAAA,OAAO,KAAA;AAAA,EACX;AACJ;;;ACrRA,IAAA,cAAA,GAAA,EAAA;AAAA,QAAA,CAAA,cAAA,EAAA;AAAA,EAAA,iBAAA,EAAA,MAAA,iBAAA;AAAA,EAAA,YAAA,EAAA,MAAA,YAAA;AAAA,EAAA,MAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAcO,IAAM,MAAA,GAAS,YAAY,QAAA,EAAU;AAAA;AAAA,EAExC,YAAA,EAAc,IAAA,CAAK,eAAe,CAAA,CAAE,UAAA,EAAW;AAAA;AAAA,EAG/C,KAAA,EAAO,IAAA,CAAK,OAAO,CAAA,CAAE,OAAA,EAAQ;AAAA,EAC7B,IAAA,EAAM,IAAA,CAAK,MAAM,CAAA,CAAE,OAAA,EAAQ;AAAA,EAC3B,WAAA,EAAa,IAAA,CAAK,aAAa,CAAA,CAAE,OAAA,EAAQ;AAAA;AAAA,EAGzC,iBAAiB,OAAA,CAAQ,kBAAkB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,EAChE,oBAAoB,OAAA,CAAQ,sBAAsB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,EACvE,eAAe,IAAA,CAAK,gBAAgB,EAAE,OAAA,EAAQ,CAAE,QAAQ,GAAG,CAAA;AAAA;AAAA;AAAA,EAG3D,QAAA,EAAU,OAAA,CAAQ,WAAA,EAAa,EAAE,IAAA,EAAM,SAAA,EAAW,CAAA,CAAE,OAAA,EAAQ,CAAE,OAAA,CAAQ,IAAI,CAAA;AAAA,EAC1E,UAAA,EAAY,OAAA,CAAQ,aAAA,EAAe,EAAE,IAAA,EAAM,SAAA,EAAW,CAAA,CAAE,OAAA,EAAQ,CAAE,OAAA,CAAQ,KAAK,CAAA;AAAA,EAC/E,uBAAuB,OAAA,CAAQ,wBAAwB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA;AAAA,EAG5E,eAAe,IAAA,CAAK,gBAAgB,EAAE,OAAA,EAAQ,CAAE,QAAQ,GAAG,CAAA;AAAA,EAC3D,gBAAgB,IAAA,CAAK,iBAAiB,EAAE,OAAA,EAAQ,CAAE,QAAQ,GAAG,CAAA;AAAA;AAAA,EAG7D,YAAY,IAAA,CAAK,aAAa,EAAE,OAAA,EAAQ,CAAE,QAAQ,EAAE,CAAA;AAAA,EACpD,YAAA,EAAc,OAAA,CAAQ,eAAA,EAAiB,EAAE,IAAA,EAAM,SAAA,EAAW,CAAA,CAAE,OAAA,EAAQ,CAAE,OAAA,CAAQ,KAAK,CAAA;AAAA,EACnF,iBAAiB,IAAA,CAAK,kBAAkB,EAAE,OAAA,EAAQ,CAAE,QAAQ,EAAE,CAAA;AAAA,EAC9D,aAAa,IAAA,CAAK,cAAc,EAAE,OAAA,EAAQ,CAAE,QAAQ,EAAE,CAAA;AAAA;AAAA,EAGtD,iBAAiB,IAAA,CAAK,kBAAkB,EAAE,OAAA,EAAQ,CAAE,QAAQ,EAAE,CAAA;AAAA,EAC9D,QAAA,EAAU,KAAK,WAAW,CAAA;AAAA;AAAA,EAC1B,UAAA,EAAY,KAAK,aAAa,CAAA;AAAA;AAAA,EAC9B,WAAA,EAAa,OAAA,CAAQ,cAAA,EAAgB,EAAE,IAAA,EAAM,SAAA,EAAW,CAAA,CAAE,OAAA,EAAQ,CAAE,OAAA,CAAQ,KAAK,CAAA;AAAA,EACjF,YAAA,EAAc,KAAK,eAAe,CAAA;AAAA;AAAA,EAClC,WAAA,EAAa,KAAK,cAAc,CAAA;AAAA;AAAA,EAChC,YAAY,OAAA,CAAQ,YAAY,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA;AAAA,EAGrD,WAAA,EAAa,OAAA,CAAQ,cAAA,EAAgB,EAAE,IAAA,EAAM,SAAA,EAAW,CAAA,CAAE,OAAA,EAAQ,CAAE,OAAA,CAAQ,KAAK,CAAA;AAAA,EACjF,kBAAA,EAAoB,IAAA,CAAK,sBAAsB,CAAA,CAAE,OAAA,EAAQ;AAAA,EACzD,kBAAkB,IAAA,CAAK,qBAAqB,EAAE,OAAA,EAAQ,CAAE,QAAQ,GAAG,CAAA;AAAA,EACnE,qBAAqB,IAAA,CAAK,uBAAuB,EAAE,OAAA,EAAQ,CAAE,QAAQ,EAAE,CAAA;AAAA,EACvE,mBAAmB,IAAA,CAAK,qBAAqB,EAAE,OAAA,EAAQ,CAAE,QAAQ,GAAG,CAAA;AAAA,EACpE,gBAAgB,IAAA,CAAK,kBAAkB,EAAE,OAAA,EAAQ,CAAE,QAAQ,GAAG,CAAA;AAAA,EAC9D,sBAAsB,OAAA,CAAQ,wBAAwB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA;AAAA,EAG3E,YAAY,IAAA,CAAK,cAAc,EAAE,OAAA,EAAQ,CAAE,QAAQ,EAAE,CAAA;AAAA,EACrD,YAAY,IAAA,CAAK,aAAa,EAAE,OAAA,EAAQ,CAAE,QAAQ,EAAE,CAAA;AAAA;AAAA,EAGpD,SAAA,EAAW,OAAA,CAAQ,YAAY,CAAA,CAAE,OAAA,EAAQ;AAAA,EACzC,SAAA,EAAW,OAAA,CAAQ,YAAY,CAAA,CAAE,OAAA,EAAQ;AAAA,EACzC,QAAA,EAAU,OAAA,CAAQ,WAAW,CAAA,CAAE,OAAA,EAAQ;AAAA;AAAA;AAAA,EAGvC,IAAA,EAAM,OAAA,CAAQ,MAAM,CAAA,CAAE,OAAA;AAC1B,CAAA,EAAG,CAAC,KAAA,MAAW;AAAA;AAAA,EAEX,UAAU,KAAA,CAAM,kBAAkB,CAAA,CAAE,EAAA,CAAG,MAAM,KAAK,CAAA;AAAA,EAClD,gBAAgB,KAAA,CAAM,yBAAyB,CAAA,CAAE,EAAA,CAAG,MAAM,WAAW,CAAA;AAAA,EACrE,eAAe,KAAA,CAAM,uBAAuB,CAAA,CAAE,EAAA,CAAG,MAAM,eAAe,CAAA;AAAA,EACtE,cAAc,KAAA,CAAM,sBAAsB,CAAA,CAAE,EAAA,CAAG,MAAM,eAAe,CAAA;AAAA,EACpE,aAAa,KAAA,CAAM,qBAAqB,CAAA,CAAE,EAAA,CAAG,MAAM,UAAU,CAAA;AAAA,EAC7D,aAAa,KAAA,CAAM,sBAAsB,CAAA,CAAE,EAAA,CAAG,MAAM,QAAQ;AAChE,CAAA,CAAE,CAAA;AAKK,IAAM,iBAAA,GAAoB,YAAY,oBAAA,EAAsB;AAAA,EAC/D,EAAA,EAAI,QAAQ,IAAI,CAAA,CAAE,WAAW,EAAE,aAAA,EAAe,MAAM,CAAA;AAAA,EACpD,YAAA,EAAc,IAAA,CAAK,eAAe,CAAA,CAAE,OAAA,EAAQ,CAAE,UAAA,CAAW,MAAM,MAAA,CAAO,YAAA,EAAc,EAAE,QAAA,EAAU,WAAW,CAAA;AAAA,EAC3G,UAAA,EAAY,IAAA,CAAK,YAAY,CAAA,CAAE,OAAA;AACnC,CAAA,EAAG,CAAC,KAAA,MAAW;AAAA;AAAA,EAEX,kBAAA,EAAoB,MAAM,sBAAsB,CAAA,CAAE,GAAG,KAAA,CAAM,YAAA,EAAc,MAAM,UAAU;AAC7F,CAAA,CAAE,CAAA;AAKK,IAAM,YAAA,GAAe,YAAY,eAAA,EAAiB;AAAA,EACrD,EAAA,EAAI,QAAQ,IAAI,CAAA,CAAE,WAAW,EAAE,aAAA,EAAe,MAAM,CAAA;AAAA,EACpD,YAAA,EAAc,IAAA,CAAK,eAAe,CAAA,CAAE,OAAA,EAAQ,CAAE,UAAA,CAAW,MAAM,MAAA,CAAO,YAAA,EAAc,EAAE,QAAA,EAAU,WAAW,CAAA;AAAA,EAC3G,YAAA,EAAc,IAAA,CAAK,eAAe,CAAA,CAAE,OAAA,EAAQ;AAAA;AAAA,EAC5C,QAAA,EAAU,OAAA,CAAQ,UAAU,CAAA,CAAE,OAAA,EAAQ;AAAA,EACtC,MAAA,EAAQ,IAAA,CAAK,QAAQ,CAAA,CAAE,OAAA;AAC3B,CAAA,EAAG,CAAC,KAAA,MAAW;AAAA;AAAA,EAEX,aAAA,EAAe,MAAM,iBAAiB,CAAA,CAAE,GAAG,KAAA,CAAM,YAAA,EAAc,MAAM,YAAY;AACrF,CAAA,CAAE,CAAA;;;AC1GF,IAAA,oBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,oBAAA,EAAA;AAAA,EAAA,gBAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAcO,IAAM,gBAAA,GAAmBC,YAAY,mBAAA,EAAqB;AAAA;AAAA,EAE7D,SAAA,EAAWC,IAAAA,CAAK,WAAW,CAAA,CAAE,UAAA,EAAW;AAAA;AAAA,EAGxC,YAAA,EAAcA,IAAAA,CAAK,eAAe,CAAA,CAAE,OAAA,EAAQ;AAAA;AAAA,EAC5C,YAAA,EAAcA,IAAAA,CAAK,eAAe,CAAA,CAAE,OAAA,EAAQ;AAAA;AAAA,EAC5C,gBAAA,EAAkBA,IAAAA,CAAK,mBAAmB,CAAA,CAAE,OAAA,EAAQ;AAAA;AAAA;AAAA,EAGpD,MAAA,EAAQA,IAAAA,CAAK,QAAQ,CAAA,CAAE,OAAA,EAAQ;AAAA;AAAA,EAC/B,SAAA,EAAWA,IAAAA,CAAK,YAAY,CAAA,CAAE,OAAA,EAAQ;AAAA;AAAA,EACtC,aAAA,EAAeC,OAAAA,CAAQ,gBAAgB,CAAA,CAAE,OAAA,EAAQ;AAAA;AAAA,EAGjD,QAAQD,IAAAA,CAAK,QAAQ,EAAE,OAAA,EAAQ,CAAE,QAAQ,WAAW,CAAA;AAAA;AAAA;AAAA,EAGpD,SAAA,EAAWC,OAAAA,CAAQ,YAAY,CAAA,CAAE,OAAA,EAAQ;AAAA;AAAA,EACzC,cAAA,EAAgBA,QAAQ,kBAAkB,CAAA;AAAA;AAAA;AAAA,EAG1C,YAAA,EAAcD,KAAK,eAAe,CAAA;AAAA;AAAA;AAAA,EAGlC,SAAA,EAAWC,OAAAA,CAAQ,YAAY,CAAA,CAAE,OAAA,EAAQ;AAAA;AAAA,EACzC,SAAA,EAAWA,OAAAA,CAAQ,YAAY,CAAA,CAAE,OAAA;AAAQ;AAC7C,CAAA,EAAG,CAAC,KAAA,MAAW;AAAA;AAAA,EAEX,UAAUC,KAAAA,CAAM,cAAc,CAAA,CAAE,EAAA,CAAG,MAAM,YAAY,CAAA;AAAA,EACrD,UAAUA,KAAAA,CAAM,cAAc,CAAA,CAAE,EAAA,CAAG,MAAM,YAAY,CAAA;AAAA,EACrD,cAAcA,KAAAA,CAAM,mBAAmB,CAAA,CAAE,EAAA,CAAG,MAAM,SAAS,CAAA;AAAA,EAC3D,WAAWA,KAAAA,CAAM,eAAe,CAAA,CAAE,EAAA,CAAG,MAAM,MAAM,CAAA;AAAA,EACjD,UAAUA,KAAAA,CAAM,cAAc,CAAA,CAAE,EAAA,CAAG,MAAM,SAAS,CAAA;AAAA;AAAA,EAElD,YAAA,EAAcA,MAAM,mBAAmB,CAAA,CAAE,GAAG,KAAA,CAAM,YAAA,EAAc,MAAM,SAAS;AACnF,CAAA,CAAE,CAAA;;;AClDF,IAAA,iBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,iBAAA,EAAA;AAAA,EAAA,cAAA,EAAA,MAAA,cAAA;AAAA,EAAA,YAAA,EAAA,MAAA,YAAA;AAAA,EAAA,eAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAcO,IAAM,cAAA,GAAiBH,YAAY,iBAAA,EAAmB;AAAA;AAAA,EAEzD,YAAA,EAAcC,IAAAA,CAAK,eAAe,CAAA,CAAE,UAAA,EAAW;AAAA;AAAA,EAG/C,cAAcA,IAAAA,CAAK,eAAe,EAAE,OAAA,EAAQ,CAAE,QAAQ,GAAG,CAAA;AAAA;AAAA;AAAA,EAGzD,mBAAmBC,OAAAA,CAAQ,oBAAoB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,EACpE,wBAAwBA,OAAAA,CAAQ,yBAAyB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,EAC9E,aAAaE,IAAAA,CAAK,cAAc,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA;AAAA;AAAA,EAGrD,eAAeA,IAAAA,CAAK,gBAAgB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,EACzD,uBAAuBF,OAAAA,CAAQ,0BAA0B,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA;AAAA,EAG9E,iBAAA,EAAmBA,QAAQ,qBAAqB,CAAA;AAAA;AAAA;AAAA,EAGhD,SAAA,EAAWA,OAAAA,CAAQ,YAAY,CAAA,CAAE,OAAA;AACrC,CAAA,EAAG,CAAC,KAAA,MAAW;AAAA,EACX,cAAcC,KAAAA,CAAM,6BAA6B,CAAA,CAAE,EAAA,CAAG,MAAM,SAAS;AACzE,CAAA,CAAE,CAAA;AAKK,IAAM,eAAA,GAAkBH,YAAY,kBAAA,EAAoB;AAAA,EAC3D,EAAA,EAAIE,QAAQ,IAAI,CAAA,CAAE,WAAW,EAAE,aAAA,EAAe,MAAM,CAAA;AAAA;AAAA,EAGpD,YAAYD,IAAAA,CAAK,aAAa,CAAA,CAAE,OAAA,GAAU,MAAA,EAAO;AAAA;AAAA;AAAA,EAGjD,aAAaA,IAAAA,CAAK,cAAc,EAAE,OAAA,EAAQ,CAAE,QAAQ,GAAG,CAAA;AAAA;AAAA,EACvD,mBAAmBC,OAAAA,CAAQ,oBAAoB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA;AAAA,EAGpE,mBAAmBA,OAAAA,CAAQ,qBAAqB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA;AAAA,EAGrE,cAAcD,IAAAA,CAAK,eAAe,EAAE,OAAA,EAAQ,CAAE,QAAQ,GAAG,CAAA;AAAA;AAAA;AAAA,EAGzD,cAAcC,OAAAA,CAAQ,eAAe,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA;AAAA,EAG1D,SAAA,EAAWA,OAAAA,CAAQ,YAAY,CAAA,CAAE,OAAA;AACrC,CAAA,EAAG,CAAC,KAAA,MAAW;AAAA,EACX,SAASC,KAAAA,CAAM,2BAA2B,CAAA,CAAE,EAAA,CAAG,MAAM,UAAU;AACnE,CAAA,CAAE,CAAA;AAKK,IAAM,YAAA,GAAeH,YAAY,eAAA,EAAiB;AAAA,EACrD,EAAA,EAAIE,QAAQ,IAAI,CAAA,CAAE,WAAW,EAAE,aAAA,EAAe,MAAM,CAAA;AAAA;AAAA,EAGpD,UAAA,EAAYD,IAAAA,CAAK,aAAa,CAAA,CAAE,OAAA,EAAQ;AAAA;AAAA,EACxC,UAAA,EAAYA,IAAAA,CAAK,aAAa,CAAA,CAAE,OAAA,EAAQ;AAAA;AAAA;AAAA,EAGxC,YAAA,EAAcA,KAAK,eAAe,CAAA;AAAA;AAAA;AAAA,EAGlC,KAAA,EAAOA,IAAAA,CAAK,OAAO,CAAA,CAAE,OAAA,EAAQ;AAAA;AAAA,EAC7B,QAAA,EAAUA,KAAK,UAAU,CAAA;AAAA;AAAA;AAAA,EAGzB,SAAA,EAAWC,OAAAA,CAAQ,YAAY,CAAA,CAAE,OAAA;AACrC,CAAA,EAAG,CAAC,KAAA,MAAW;AAAA;AAAA,EAEX,WAAA,EAAaC,MAAM,6BAA6B,CAAA,CAAE,GAAG,KAAA,CAAM,UAAA,EAAY,MAAM,UAAU,CAAA;AAAA;AAAA,EAEvF,UAAUA,KAAAA,CAAM,yBAAyB,CAAA,CAAE,EAAA,CAAG,MAAM,YAAY,CAAA;AAAA;AAAA,EAEhE,SAASA,KAAAA,CAAM,wBAAwB,CAAA,CAAE,EAAA,CAAG,MAAM,UAAU;AAChE,CAAA,CAAE,CAAA;;;AC7FF,IAAA,oBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,oBAAA,EAAA;AAAA,EAAA,kBAAA,EAAA,MAAA,kBAAA;AAAA,EAAA,wBAAA,EAAA,MAAA,wBAAA;AAAA,EAAA,YAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAcO,IAAM,YAAA,GAAeH,WAAAA;AAAA,EAC1B,cAAA;AAAA,EACA;AAAA;AAAA,IAEE,EAAA,EAAIC,IAAAA,CAAK,IAAI,CAAA,CAAE,UAAA,EAAW;AAAA;AAAA,IAG1B,IAAA,EAAMA,IAAAA,CAAK,MAAM,CAAA,CAAE,OAAA,EAAQ;AAAA,IAC3B,WAAA,EAAaA,KAAK,aAAa,CAAA;AAAA,IAC/B,IAAA,EAAMA,KAAK,MAAM,CAAA;AAAA,IACjB,OAAA,EAASA,KAAK,SAAS,CAAA;AAAA;AAAA,IAGvB,QAAA,EAAUA,IAAAA,CAAK,UAAU,CAAA,CAAE,OAAA,EAAQ;AAAA;AAAA;AAAA,IAGnC,SAAA,EAAWA,IAAAA,CAAK,WAAW,CAAA,CAAE,OAAA,EAAQ;AAAA;AAAA;AAAA,IAGrC,YAAA,EAAcA,KAAK,eAAe,CAAA;AAAA,IAClC,SAAA,EAAWA,IAAAA,CAAK,YAAY,CAAA,CAAE,OAAA,EAAQ;AAAA,IACtC,SAAA,EAAWA,IAAAA,CAAK,YAAY,CAAA,CAAE,OAAA,EAAQ;AAAA;AAAA,IAGtC,cAAA,EAAgBC,OAAAA,CAAQ,kBAAA,EAAoB,EAAE,IAAA,EAAM,SAAA,EAAW,CAAA,CAAE,OAAA,EAAQ,CAAE,OAAA,CAAQ,KAAK,CAAA;AAAA,IACxF,YAAA,EAAcD,KAAK,gBAAgB,CAAA;AAAA;AAAA,IAGnC,OAAA,EAASC,OAAAA,CAAQ,SAAA,EAAW,EAAE,IAAA,EAAM,SAAA,EAAW,CAAA,CAAE,OAAA,EAAQ,CAAE,OAAA,CAAQ,IAAI,CAAA;AAAA;AAAA,IAGvE,eAAA,EAAiBA,QAAQ,mBAAmB,CAAA;AAAA;AAAA,IAC5C,YAAA,EAAcD,IAAAA,CAAK,eAAe,CAAA,CAAE,QAAQ,SAAS,CAAA;AAAA;AAAA,IACrD,SAAA,EAAWG,KAAK,YAAY,CAAA;AAAA,IAC5B,aAAA,EAAeA,KAAK,gBAAgB,CAAA;AAAA,IACpC,eAAeF,OAAAA,CAAQ,gBAAgB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IAC5D,oBAAoBA,OAAAA,CAAQ,qBAAqB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IACtE,gBAAgBA,OAAAA,CAAQ,iBAAiB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA;AAAA,IAG9D,WAAWA,OAAAA,CAAQ,YAAY,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IACpD,WAAWA,OAAAA,CAAQ,YAAY,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC;AAAA,GACtD;AAAA,EACA,CAAA,KAAA,MAAU;AAAA,IACR,YAAYC,KAAAA,CAAM,0BAA0B,CAAA,CAAE,EAAA,CAAG,MAAM,OAAO,CAAA;AAAA,IAC9D,iBAAiBA,KAAAA,CAAM,gCAAgC,CAAA,CAAE,EAAA,CAAG,MAAM,YAAY;AAAA,GAChF;AACF,CAAA;AAKO,IAAM,kBAAA,GAAqBH,WAAAA;AAAA,EAChC,sBAAA;AAAA,EACA;AAAA;AAAA,IAEE,EAAA,EAAIC,IAAAA,CAAK,IAAI,CAAA,CAAE,UAAA,EAAW;AAAA;AAAA;AAAA,IAG1B,aAAA,EAAeA,KAAK,gBAAgB,CAAA,CACjC,SAAQ,CACR,UAAA,CAAW,MAAM,YAAA,CAAa,EAAE,CAAA;AAAA,IACnC,MAAA,EAAQA,IAAAA,CAAK,SAAS,CAAA,CAAE,OAAA,EAAQ;AAAA;AAAA;AAAA,IAGhC,eAAA,EAAiBA,IAAAA,CAAK,mBAAmB,CAAA,CAAE,OAAA,EAAQ;AAAA,IACnD,QAAA,EAAUA,KAAK,WAAW,CAAA;AAAA;AAAA;AAAA,IAG1B,QAAA,EAAUC,QAAQ,WAAW,CAAA;AAAA;AAAA,IAC7B,YAAYA,OAAAA,CAAQ,aAAa,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA;AAAA,IAGtD,WAAWA,OAAAA,CAAQ,YAAY,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IACpD,WAAWA,OAAAA,CAAQ,YAAY,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC;AAAA,GACtD;AAAA,EACA,CAAA,KAAA,MAAU;AAAA,IACR,kBAAA,EAAoBC,KAAAA,CAAM,+BAA+B,CAAA,CAAE,EAAA;AAAA,MACzD,KAAA,CAAM,aAAA;AAAA,MACN,KAAA,CAAM;AAAA;AACR,GACF;AACF,CAAA;AAKO,IAAM,wBAAA,GAA2BH,WAAAA;AAAA,EACtC,4BAAA;AAAA,EACA;AAAA;AAAA,IAEE,EAAA,EAAIC,IAAAA,CAAK,IAAI,CAAA,CAAE,UAAA,EAAW;AAAA;AAAA;AAAA,IAG1B,aAAA,EAAeA,KAAK,gBAAgB,CAAA,CACjC,SAAQ,CACR,UAAA,CAAW,MAAM,YAAA,CAAa,EAAE,CAAA;AAAA;AAAA,IAGnC,MAAA,EAAQA,IAAAA,CAAK,QAAQ,CAAA,CAAE,OAAA,EAAQ;AAAA;AAAA,IAC/B,SAAA,EAAWG,IAAAA,CAAK,YAAY,CAAA,CAAE,OAAA,EAAQ;AAAA,IACtC,YAAA,EAAcH,KAAK,eAAe,CAAA;AAAA;AAAA,IAGlC,cAAA,EAAgBA,KAAK,iBAAiB,CAAA;AAAA;AAAA;AAAA,IAGtC,SAAA,EAAWC,OAAAA,CAAQ,YAAY,CAAA,CAAE,OAAA;AAAQ,GAC3C;AAAA,EACA,CAAA,KAAA,MAAU;AAAA,IACR,kBAAA,EAAoBC,KAAAA,CAAM,qCAAqC,CAAA,CAAE,EAAA;AAAA,MAC/D,KAAA,CAAM,aAAA;AAAA,MACN,KAAA,CAAM;AAAA;AACR,GACF;AACF,CAAA;;;ACjIA,IAAA,iBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,iBAAA,EAAA;AAAA,EAAA,eAAA,EAAA,MAAA,eAAA;AAAA,EAAA,eAAA,EAAA,MAAA,eAAA;AAAA,EAAA,mBAAA,EAAA,MAAA,mBAAA;AAAA,EAAA,YAAA,EAAA,MAAA,YAAA;AAAA,EAAA,SAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAeO,IAAM,eAAA,GAAkBH,WAAAA;AAAA,EAC7B,kBAAA;AAAA,EACA;AAAA;AAAA,IAEE,EAAA,EAAIC,IAAAA,CAAK,IAAI,CAAA,CAAE,UAAA,EAAW;AAAA;AAAA,IAG1B,QAAQA,IAAAA,CAAK,QAAQ,CAAA,CAAE,OAAA,GAAU,MAAA,EAAO;AAAA;AAAA,IAGxC,IAAA,EAAMA,KAAK,MAAM,CAAA;AAAA,IACjB,WAAA,EAAaA,KAAK,aAAa,CAAA;AAAA,IAC/B,UAAA,EAAYA,KAAK,aAAa,CAAA;AAAA,IAC9B,UAAA,EAAYA,KAAK,cAAc,CAAA;AAAA,IAC/B,OAAA,EAASA,KAAK,UAAU,CAAA;AAAA,IACxB,aAAA,EAAeA,KAAK,gBAAgB,CAAA;AAAA;AAAA,IAGpC,YAAA,EAAcA,KAAK,eAAe,CAAA;AAAA,IAClC,aAAA,EAAeA,KAAK,gBAAgB,CAAA;AAAA,IACpC,UAAA,EAAYA,KAAK,aAAa,CAAA;AAAA;AAAA,IAG9B,UAAA,EAAYC,OAAAA,CAAQ,aAAA,EAAe,EAAE,IAAA,EAAM,SAAA,EAAW,CAAA,CAAE,OAAA,EAAQ,CAAE,OAAA,CAAQ,KAAK,CAAA;AAAA,IAC/E,UAAA,EAAYA,QAAQ,aAAa,CAAA;AAAA,IACjC,UAAA,EAAYD,KAAK,aAAa,CAAA;AAAA;AAAA,IAG9B,WAAWC,OAAAA,CAAQ,YAAY,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IACpD,WAAWA,OAAAA,CAAQ,YAAY,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IACpD,aAAA,EAAeA,QAAQ,iBAAiB;AAAA,GAC1C;AAAA,EACA,CAAA,KAAA,MAAU;AAAA,IACR,WAAWC,KAAAA,CAAM,6BAA6B,CAAA,CAAE,EAAA,CAAG,MAAM,MAAM;AAAA,GACjE;AACF,CAAA;AAKO,IAAM,SAAA,GAAYH,WAAAA;AAAA,EACvB,WAAA;AAAA,EACA;AAAA;AAAA,IAEE,EAAA,EAAIC,IAAAA,CAAK,IAAI,CAAA,CAAE,UAAA,EAAW;AAAA;AAAA,IAG1B,KAAKA,IAAAA,CAAK,KAAK,CAAA,CAAE,OAAA,GAAU,MAAA,EAAO;AAAA;AAAA,IAGlC,MAAMA,IAAAA,CAAK,MAAM,EAAE,OAAA,EAAQ,CAAE,QAAQ,MAAM,CAAA;AAAA;AAAA;AAAA,IAG3C,WAAA,EAAaA,KAAK,cAAc,CAAA;AAAA;AAAA,IAGhC,UAAUA,IAAAA,CAAK,WAAW,EAAE,UAAA,CAAW,MAAM,gBAAgB,EAAE,CAAA;AAAA,IAC/D,eAAeA,IAAAA,CAAK,gBAAgB,EAAE,UAAA,CAAW,MAAM,aAAa,EAAE,CAAA;AAAA;AAAA,IAGtE,OAAA,EAASA,IAAAA,CAAK,SAAS,CAAA,CAAE,OAAA,EAAQ;AAAA;AAAA;AAAA,IAGjC,SAAA,EAAWA,KAAK,YAAY,CAAA;AAAA;AAAA,IAC5B,SAAA,EAAWA,KAAK,YAAY,CAAA;AAAA;AAAA,IAC5B,QAAA,EAAUA,IAAAA,CAAK,UAAU,CAAA,CAAE,QAAQ,MAAM,CAAA;AAAA;AAAA,IAGzC,WAAA,EAAaA,KAAK,cAAc,CAAA;AAAA;AAAA,IAChC,YAAA,EAAcA,KAAK,eAAe,CAAA;AAAA;AAAA,IAClC,YAAA,EAAcA,KAAK,eAAe,CAAA;AAAA;AAAA;AAAA,IAGlC,IAAA,EAAMA,KAAK,MAAM,CAAA;AAAA,IACjB,WAAA,EAAaA,KAAK,aAAa,CAAA;AAAA,IAC/B,IAAA,EAAMA,KAAK,MAAM,CAAA;AAAA;AAAA,IACjB,YAAA,EAAcA,KAAK,cAAc,CAAA;AAAA;AAAA,IACjC,QAAA,EAAUA,KAAK,UAAU,CAAA;AAAA;AAAA;AAAA,IAGzB,UAAA,EAAYA,IAAAA,CAAK,aAAa,CAAA,CAAE,QAAQ,MAAM,CAAA;AAAA,IAC9C,WAAA,EAAaA,IAAAA,CAAK,cAAc,CAAA,CAAE,QAAQ,kBAAkB,CAAA;AAAA,IAC5D,QAAA,EAAUA,KAAK,WAAW,CAAA;AAAA;AAAA;AAAA,IAG1B,QAAA,EAAUC,OAAAA,CAAQ,WAAA,EAAa,EAAE,IAAA,EAAM,SAAA,EAAW,CAAA,CAAE,OAAA,EAAQ,CAAE,OAAA,CAAQ,IAAI,CAAA;AAAA,IAC1E,UAAA,EAAYA,OAAAA,CAAQ,aAAA,EAAe,EAAE,IAAA,EAAM,SAAA,EAAW,CAAA,CAAE,OAAA,EAAQ,CAAE,OAAA,CAAQ,KAAK,CAAA;AAAA,IAC/E,UAAA,EAAYA,QAAQ,cAAc,CAAA;AAAA,IAClC,cAAA,EAAgBA,QAAQ,kBAAkB,CAAA;AAAA;AAAA,IAC1C,iBAAA,EAAmBE,KAAK,sBAAsB,CAAA;AAAA,IAC9C,qBAAqBF,OAAAA,CAAQ,sBAAsB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA;AAAA,IAGxE,cAAA,EAAgBD,KAAK,iBAAiB,CAAA;AAAA;AAAA,IACtC,YAAA,EAAcC,QAAQ,eAAe,CAAA;AAAA;AAAA,IAGrC,eAAA,EAAiBD,KAAK,mBAAmB,CAAA;AAAA;AAAA,IACzC,WAAA,EAAaC,QAAQ,eAAe,CAAA;AAAA;AAAA,IAGpC,WAAWA,OAAAA,CAAQ,YAAY,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IACpD,WAAWA,OAAAA,CAAQ,YAAY,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC;AAAA,GACtD;AAAA,EACA,CAAA,KAAA,MAAU;AAAA,IACR,WAAWC,KAAAA,CAAM,sBAAsB,CAAA,CAAE,EAAA,CAAG,MAAM,QAAQ,CAAA;AAAA,IAC1D,gBAAgBA,KAAAA,CAAM,2BAA2B,CAAA,CAAE,EAAA,CAAG,MAAM,aAAa,CAAA;AAAA,IACzE,WAAWA,KAAAA,CAAM,sBAAsB,CAAA,CAAE,EAAA,CAAG,MAAM,QAAQ,CAAA;AAAA,IAC1D,aAAaA,KAAAA,CAAM,wBAAwB,CAAA,CAAE,EAAA,CAAG,MAAM,QAAQ;AAAA,GAChE;AACF,CAAA;AAKO,IAAM,YAAA,GAAeH,WAAAA;AAAA,EAC1B,eAAA;AAAA,EACA;AAAA;AAAA,IAEE,EAAA,EAAIC,IAAAA,CAAK,IAAI,CAAA,CAAE,UAAA,EAAW;AAAA;AAAA;AAAA,IAG1B,UAAA,EAAYA,KAAK,aAAa,CAAA,CAC3B,SAAQ,CACR,UAAA,CAAW,MAAM,SAAA,CAAU,EAAE,CAAA;AAAA;AAAA,IAGhC,GAAA,EAAKA,IAAAA,CAAK,KAAK,CAAA,CAAE,OAAA,EAAQ;AAAA,IACzB,aAAA,EAAeC,OAAAA,CAAQ,iBAAA,EAAmB,EAAE,IAAA,EAAM,SAAA,EAAW,CAAA,CAAE,OAAA,EAAQ,CAAE,OAAA,CAAQ,KAAK,CAAA;AAAA;AAAA,IAGtF,WAAWA,OAAAA,CAAQ,YAAY,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC;AAAA,GACtD;AAAA,EACA,CAAA,KAAA,MAAU;AAAA,IACR,aAAaC,KAAAA,CAAM,4BAA4B,CAAA,CAAE,EAAA,CAAG,MAAM,UAAU,CAAA;AAAA,IACpE,QAAQA,KAAAA,CAAM,uBAAuB,CAAA,CAAE,EAAA,CAAG,MAAM,GAAG;AAAA,GACrD;AACF,CAAA;AAKO,IAAM,mBAAA,GAAsBH,WAAAA;AAAA,EACjC,uBAAA;AAAA,EACA;AAAA;AAAA,IAEE,EAAA,EAAIC,IAAAA,CAAK,IAAI,CAAA,CAAE,UAAA,EAAW;AAAA;AAAA,IAG1B,UAAA,EAAYA,KAAK,aAAa,CAAA,CAC3B,SAAQ,CACR,UAAA,CAAW,MAAM,SAAA,CAAU,EAAE,CAAA;AAAA;AAAA,IAGhC,UAAA,EAAYC,QAAQ,aAAa,CAAA;AAAA,IACjC,SAAA,EAAWE,KAAK,YAAY,CAAA;AAAA,IAC5B,OAAA,EAASF,QAAQ,SAAA,EAAW,EAAE,MAAM,SAAA,EAAW,EAAE,OAAA,EAAQ;AAAA,IACzD,YAAA,EAAcD,KAAK,eAAe,CAAA;AAAA;AAAA,IAGlC,cAAcC,OAAAA,CAAQ,gBAAA,EAAkB,EAAE,IAAA,EAAM,WAAW,CAAA;AAAA,IAC3D,cAAA,EAAgBD,KAAK,kBAAkB,CAAA;AAAA;AAAA,IAGvC,gBAAA,EAAkBC,QAAQ,oBAAoB,CAAA;AAAA,IAC9C,WAAA,EAAaD,KAAK,cAAc,CAAA;AAAA;AAAA,IAGhC,QAAA,EAAUC,OAAAA,CAAQ,WAAW,CAAA,CAAE,OAAA;AAAQ,GACzC;AAAA,EACA,CAAA,KAAA,MAAU;AAAA,IACR,eAAA,EAAiBC,KAAAA,CAAM,gCAAgC,CAAA,CAAE,EAAA;AAAA,MACvD,KAAA,CAAM,UAAA;AAAA,MACN,KAAA,CAAM;AAAA;AACR,GACF;AACF,CAAA;AAKO,IAAM,eAAA,GAAkBH,WAAAA;AAAA,EAC7B,kBAAA;AAAA,EACA;AAAA;AAAA,IAEE,EAAA,EAAIC,IAAAA,CAAK,IAAI,CAAA,CAAE,UAAA,EAAW;AAAA;AAAA,IAG1B,UAAA,EAAYA,KAAK,aAAa,CAAA,CAC3B,SAAQ,CACR,UAAA,CAAW,MAAM,SAAA,CAAU,EAAE,CAAA;AAAA;AAAA,IAGhC,MAAA,EAAQA,IAAAA,CAAK,QAAQ,CAAA,CAAE,OAAA,EAAQ;AAAA;AAAA,IAC/B,OAAA,EAASA,IAAAA,CAAK,SAAS,CAAA,CAAE,OAAA,EAAQ;AAAA;AAAA,IACjC,iBAAA,EAAmBA,IAAAA,CAAK,qBAAqB,CAAA,CAAE,OAAA,EAAQ;AAAA;AAAA,IACvD,KAAA,EAAOA,IAAAA,CAAK,QAAQ,CAAA,CAAE,OAAA,EAAQ;AAAA;AAAA,IAC9B,KAAA,EAAOA,IAAAA,CAAK,OAAO,CAAA,CAAE,OAAA,EAAQ;AAAA;AAAA,IAC7B,iBAAA,EAAmBC,QAAQ,qBAAqB,CAAA;AAAA,IAChD,WAAA,EAAaD,KAAK,aAAa,CAAA;AAAA,IAC/B,QAAA,EAAUA,KAAK,WAAW,CAAA;AAAA;AAAA,IAG1B,KAAA,EAAOA,KAAK,OAAO,CAAA;AAAA;AAAA,IAGnB,WAAWC,OAAAA,CAAQ,YAAY,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IACpD,WAAWA,OAAAA,CAAQ,YAAY,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC;AAAA,GACtD;AAAA,EACA,CAAA,KAAA,MAAU;AAAA,IACR,aAAaC,KAAAA,CAAM,+BAA+B,CAAA,CAAE,EAAA,CAAG,MAAM,UAAU,CAAA;AAAA,IACvE,YAAYA,KAAAA,CAAM,8BAA8B,CAAA,CAAE,EAAA,CAAG,MAAM,OAAO,CAAA;AAAA,IAClE,UAAUA,KAAAA,CAAM,4BAA4B,CAAA,CAAE,EAAA,CAAG,MAAM,KAAK;AAAA,GAC9D;AACF,CAAA;;;ACrOA,IAAA,uBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,uBAAA,EAAA;AAAA,EAAA,YAAA,EAAA,MAAA,YAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,eAAA,EAAA,MAAA,eAAA;AAAA,EAAA,qBAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAoBO,IAAM,YAAA,GAAe,CAAC,IAAA,EAAM,IAAA,EAAM,OAAO,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,KAAK,CAAA;AAaxE,IAAM,eAAA,GAAkBH,WAAAA;AAAA,EAC7B,kBAAA;AAAA,EACA;AAAA;AAAA,IAEE,EAAA,EAAIC,IAAAA,CAAK,IAAI,CAAA,CAAE,UAAA,EAAW;AAAA;AAAA,IAG1B,UAAA,EAAYA,KAAK,aAAa,CAAA,CAC3B,SAAQ,CACR,UAAA,CAAW,MAAM,SAAA,CAAU,EAAE,CAAA;AAAA;AAAA,IAGhC,SAAA,EAAWC,OAAAA,CAAQ,YAAY,CAAA,CAAE,OAAA,EAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,IAOzC,iBAAiBA,OAAAA,CAAQ,mBAAmB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IACjE,iBAAiBA,OAAAA,CAAQ,mBAAmB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IACjE,kBAAkBA,OAAAA,CAAQ,oBAAoB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IACnE,iBAAiBA,OAAAA,CAAQ,mBAAmB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IACjE,iBAAiBA,OAAAA,CAAQ,mBAAmB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IACjE,kBAAkBA,OAAAA,CAAQ,oBAAoB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IACnE,kBAAkBA,OAAAA,CAAQ,oBAAoB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IACnE,kBAAkBA,OAAAA,CAAQ,oBAAoB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA;AAAA,IAGnE,gBAAgBA,OAAAA,CAAQ,kBAAkB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IAC/D,gBAAgBA,OAAAA,CAAQ,kBAAkB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IAC/D,iBAAiBA,OAAAA,CAAQ,mBAAmB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IACjE,gBAAgBA,OAAAA,CAAQ,kBAAkB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IAC/D,gBAAgBA,OAAAA,CAAQ,kBAAkB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IAC/D,iBAAiBA,OAAAA,CAAQ,mBAAmB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IACjE,iBAAiBA,OAAAA,CAAQ,mBAAmB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IACjE,iBAAiBA,OAAAA,CAAQ,mBAAmB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA;AAAA,IAGjE,gBAAgBA,OAAAA,CAAQ,kBAAkB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IAC/D,gBAAgBA,OAAAA,CAAQ,kBAAkB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IAC/D,iBAAiBA,OAAAA,CAAQ,mBAAmB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IACjE,gBAAgBA,OAAAA,CAAQ,kBAAkB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IAC/D,gBAAgBA,OAAAA,CAAQ,kBAAkB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IAC/D,iBAAiBA,OAAAA,CAAQ,mBAAmB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IACjE,iBAAiBA,OAAAA,CAAQ,mBAAmB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IACjE,iBAAiBA,OAAAA,CAAQ,mBAAmB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOjE,aAAA,EAAeE,KAAK,gBAAgB,CAAA;AAAA,IACpC,aAAA,EAAeA,KAAK,gBAAgB,CAAA;AAAA,IACpC,cAAA,EAAgBA,KAAK,iBAAiB,CAAA;AAAA,IACtC,aAAA,EAAeA,KAAK,gBAAgB,CAAA;AAAA,IACpC,aAAA,EAAeA,KAAK,gBAAgB,CAAA;AAAA,IACpC,cAAA,EAAgBA,KAAK,iBAAiB,CAAA;AAAA,IACtC,cAAA,EAAgBA,KAAK,iBAAiB,CAAA;AAAA,IACtC,aAAA,EAAeA,KAAK,iBAAiB,CAAA;AAAA;AAAA,IAGrC,aAAA,EAAeA,KAAK,gBAAgB,CAAA;AAAA,IACpC,aAAA,EAAeA,KAAK,gBAAgB,CAAA;AAAA,IACpC,cAAA,EAAgBA,KAAK,iBAAiB,CAAA;AAAA,IACtC,aAAA,EAAeA,KAAK,gBAAgB,CAAA;AAAA,IACpC,aAAA,EAAeA,KAAK,gBAAgB,CAAA;AAAA,IACpC,cAAA,EAAgBA,KAAK,iBAAiB,CAAA;AAAA,IACtC,cAAA,EAAgBA,KAAK,iBAAiB,CAAA;AAAA,IACtC,aAAA,EAAeA,KAAK,iBAAiB,CAAA;AAAA;AAAA,IAGrC,aAAA,EAAeA,KAAK,gBAAgB,CAAA;AAAA,IACpC,aAAA,EAAeA,KAAK,gBAAgB,CAAA;AAAA,IACpC,cAAA,EAAgBA,KAAK,iBAAiB,CAAA;AAAA,IACtC,aAAA,EAAeA,KAAK,gBAAgB,CAAA;AAAA,IACpC,aAAA,EAAeA,KAAK,gBAAgB,CAAA;AAAA,IACpC,cAAA,EAAgBA,KAAK,iBAAiB,CAAA;AAAA,IACtC,cAAA,EAAgBA,KAAK,iBAAiB,CAAA;AAAA,IACtC,aAAA,EAAeA,KAAK,iBAAiB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOrC,aAAaF,OAAAA,CAAQ,eAAe,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IACzD,cAAcA,OAAAA,CAAQ,gBAAgB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IAC3D,aAAaA,OAAAA,CAAQ,eAAe,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IACzD,cAAcA,OAAAA,CAAQ,gBAAgB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA;AAAA,IAG3D,aAAaA,OAAAA,CAAQ,eAAe,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IACzD,cAAcA,OAAAA,CAAQ,gBAAgB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IAC3D,aAAaA,OAAAA,CAAQ,eAAe,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IACzD,cAAcA,OAAAA,CAAQ,gBAAgB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA;AAAA,IAG3D,aAAaA,OAAAA,CAAQ,eAAe,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IACzD,cAAcA,OAAAA,CAAQ,gBAAgB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IAC3D,aAAaA,OAAAA,CAAQ,eAAe,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IACzD,cAAcA,OAAAA,CAAQ,gBAAgB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA;AAAA,IAG3D,aAAaA,OAAAA,CAAQ,eAAe,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IACzD,cAAcA,OAAAA,CAAQ,gBAAgB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IAC3D,aAAaA,OAAAA,CAAQ,eAAe,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IACzD,cAAcA,OAAAA,CAAQ,gBAAgB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAO3D,eAAA,EAAiBE,KAAK,mBAAmB,CAAA;AAAA,IACzC,gBAAA,EAAkBA,KAAK,oBAAoB,CAAA;AAAA,IAC3C,eAAA,EAAiBA,KAAK,mBAAmB,CAAA;AAAA,IACzC,gBAAA,EAAkBA,KAAK,oBAAoB,CAAA;AAAA,IAC3C,gBAAA,EAAkBA,KAAK,oBAAoB,CAAA;AAAA;AAAA,IAG3C,eAAeF,OAAAA,CAAQ,iBAAiB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IAC7D,gBAAgBA,OAAAA,CAAQ,kBAAkB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IAC/D,eAAeA,OAAAA,CAAQ,iBAAiB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IAC7D,gBAAgBA,OAAAA,CAAQ,kBAAkB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAO/D,iBAAiBD,IAAAA,CAAK,mBAAmB,EAAE,OAAA,EAAQ,CAAE,QAAQ,GAAG,CAAA;AAAA,IAChE,kBAAkBA,IAAAA,CAAK,oBAAoB,EAAE,OAAA,EAAQ,CAAE,QAAQ,GAAG,CAAA;AAAA,IAClE,iBAAiBA,IAAAA,CAAK,mBAAmB,EAAE,OAAA,EAAQ,CAAE,QAAQ,GAAG,CAAA;AAAA,IAChE,kBAAkBA,IAAAA,CAAK,oBAAoB,EAAE,OAAA,EAAQ,CAAE,QAAQ,GAAG,CAAA;AAAA,IAClE,kBAAkBA,IAAAA,CAAK,oBAAoB,EAAE,OAAA,EAAQ,CAAE,QAAQ,GAAG,CAAA;AAAA;AAAA,IAGlE,gBAAgBC,OAAAA,CAAQ,kBAAkB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IAC/D,iBAAiBA,OAAAA,CAAQ,mBAAmB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IACjE,gBAAgBA,OAAAA,CAAQ,kBAAkB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IAC/D,iBAAiBA,OAAAA,CAAQ,mBAAmB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IACjE,iBAAiBA,OAAAA,CAAQ,mBAAmB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA;AAAA,IAGjE,YAAA,EAAcD,KAAK,gBAAgB,CAAA;AAAA,IACnC,aAAA,EAAeA,KAAK,iBAAiB,CAAA;AAAA,IACrC,YAAA,EAAcA,KAAK,gBAAgB,CAAA;AAAA,IACnC,aAAA,EAAeA,KAAK,iBAAiB,CAAA;AAAA;AAAA,IAGrC,gBAAgBC,OAAAA,CAAQ,kBAAkB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IAC/D,iBAAiBA,OAAAA,CAAQ,mBAAmB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IACjE,gBAAgBA,OAAAA,CAAQ,kBAAkB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IAC/D,iBAAiBA,OAAAA,CAAQ,mBAAmB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC;AAAA,GACnE;AAAA,EACA,CAAA,KAAA,MAAU;AAAA,IACR,aAAaC,KAAAA,CAAM,+BAA+B,CAAA,CAAE,EAAA,CAAG,MAAM,UAAU,CAAA;AAAA,IACvE,cAAcA,KAAAA,CAAM,iCAAiC,CAAA,CAAE,EAAA,CAAG,MAAM,SAAS,CAAA;AAAA,IACzE,kBAAA,EAAoBA,KAAAA,CAAM,uCAAuC,CAAA,CAAE,EAAA;AAAA,MACjE,KAAA,CAAM,UAAA;AAAA,MACN,KAAA,CAAM;AAAA;AACR,GACF;AACF,CAAA;AASO,IAAM,qBAAA,GAAwBH,WAAAA;AAAA,EACnC,yBAAA;AAAA,EACA;AAAA;AAAA,IAEE,EAAA,EAAIC,IAAAA,CAAK,IAAI,CAAA,CAAE,UAAA,EAAW;AAAA;AAAA,IAG1B,QAAA,EAAUA,KAAK,WAAW,CAAA,CACvB,SAAQ,CACR,UAAA,CAAW,MAAM,eAAA,CAAgB,EAAE,CAAA;AAAA;AAAA,IAGtC,SAAA,EAAWC,OAAAA,CAAQ,YAAY,CAAA,CAAE,OAAA,EAAQ;AAAA;AAAA,IAGzC,eAAeA,OAAAA,CAAQ,gBAAgB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IAC5D,qBAAqBA,OAAAA,CAAQ,uBAAuB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA;AAAA,IAGzE,iBAAiBA,OAAAA,CAAQ,mBAAmB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IACjE,kBAAkBA,OAAAA,CAAQ,oBAAoB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IACnE,iBAAiBA,OAAAA,CAAQ,mBAAmB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IACjE,kBAAkBA,OAAAA,CAAQ,oBAAoB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA;AAAA,IAGnE,gBAAgBA,OAAAA,CAAQ,kBAAkB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IAC/D,iBAAiBA,OAAAA,CAAQ,mBAAmB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IACjE,gBAAgBA,OAAAA,CAAQ,kBAAkB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IAC/D,iBAAiBA,OAAAA,CAAQ,mBAAmB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA;AAAA,IAGjE,gBAAgBA,OAAAA,CAAQ,kBAAkB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IAC/D,iBAAiBA,OAAAA,CAAQ,mBAAmB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IACjE,gBAAgBA,OAAAA,CAAQ,kBAAkB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IAC/D,iBAAiBA,OAAAA,CAAQ,mBAAmB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA;AAAA,IAGjE,gBAAA,EAAkBE,KAAK,oBAAoB,CAAA;AAAA,IAC3C,iBAAA,EAAmBA,KAAK,qBAAqB,CAAA;AAAA,IAC7C,gBAAA,EAAkBA,KAAK,oBAAoB,CAAA;AAAA,IAC3C,gBAAA,EAAkBA,KAAK,qBAAqB,CAAA;AAAA,IAE5C,gBAAA,EAAkBA,KAAK,oBAAoB,CAAA;AAAA,IAC3C,iBAAA,EAAmBA,KAAK,qBAAqB,CAAA;AAAA,IAC7C,gBAAA,EAAkBA,KAAK,oBAAoB,CAAA;AAAA,IAC3C,gBAAA,EAAkBA,KAAK,qBAAqB,CAAA;AAAA;AAAA,IAG5C,kBAAA,EAAoBA,KAAK,uBAAuB,CAAA;AAAA,IAChD,mBAAA,EAAqBA,KAAK,wBAAwB,CAAA;AAAA,IAClD,kBAAA,EAAoBA,KAAK,uBAAuB,CAAA;AAAA,IAChD,mBAAA,EAAqBA,KAAK,wBAAwB,CAAA;AAAA;AAAA,IAGlD,iBAAiBH,IAAAA,CAAK,mBAAmB,EAAE,OAAA,EAAQ,CAAE,QAAQ,GAAG,CAAA;AAAA,IAChE,kBAAkBA,IAAAA,CAAK,oBAAoB,EAAE,OAAA,EAAQ,CAAE,QAAQ,GAAG,CAAA;AAAA,IAClE,iBAAiBA,IAAAA,CAAK,mBAAmB,EAAE,OAAA,EAAQ,CAAE,QAAQ,GAAG,CAAA;AAAA,IAChE,kBAAkBA,IAAAA,CAAK,oBAAoB,EAAE,OAAA,EAAQ,CAAE,QAAQ,GAAG,CAAA;AAAA,IAElE,gBAAgBC,OAAAA,CAAQ,kBAAkB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IAC/D,iBAAiBA,OAAAA,CAAQ,mBAAmB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IACjE,gBAAgBA,OAAAA,CAAQ,kBAAkB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,IAC/D,iBAAiBA,OAAAA,CAAQ,mBAAmB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC;AAAA,GACnE;AAAA,EACA,CAAA,KAAA,MAAU;AAAA,IACR,WAAWC,KAAAA,CAAM,2BAA2B,CAAA,CAAE,EAAA,CAAG,MAAM,QAAQ,CAAA;AAAA,IAC/D,cAAcA,KAAAA,CAAM,+BAA+B,CAAA,CAAE,EAAA,CAAG,MAAM,SAAS;AAAA,GACzE;AACF,CAAA;AASO,IAAM,aAAA,GAAgBH,YAAY,gBAAA,EAAkB;AAAA;AAAA,EAEzD,EAAA,EAAIC,IAAAA,CAAK,IAAI,CAAA,CAAE,UAAA,EAAW;AAAA;AAAA,EAG1B,SAAA,EAAWC,OAAAA,CAAQ,YAAY,CAAA,CAAE,OAAA,EAAQ;AAAA;AAAA,EAGzC,gBAAgBA,OAAAA,CAAQ,iBAAiB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,EAC9D,iBAAiBA,OAAAA,CAAQ,kBAAkB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,EAChE,cAAcA,OAAAA,CAAQ,eAAe,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,EAC1D,mBAAmBA,OAAAA,CAAQ,oBAAoB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA;AAAA,EAGpE,iBAAiBA,OAAAA,CAAQ,mBAAmB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,EACjE,kBAAkBA,OAAAA,CAAQ,oBAAoB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,EACnE,iBAAiBA,OAAAA,CAAQ,mBAAmB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,EACjE,kBAAkBA,OAAAA,CAAQ,oBAAoB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA;AAAA,EAGnE,iBAAiBD,IAAAA,CAAK,mBAAmB,EAAE,OAAA,EAAQ,CAAE,QAAQ,GAAG,CAAA;AAAA,EAChE,kBAAkBA,IAAAA,CAAK,oBAAoB,EAAE,OAAA,EAAQ,CAAE,QAAQ,GAAG,CAAA;AAAA,EAClE,iBAAiBA,IAAAA,CAAK,mBAAmB,EAAE,OAAA,EAAQ,CAAE,QAAQ,GAAG,CAAA;AAAA,EAChE,kBAAkBA,IAAAA,CAAK,oBAAoB,EAAE,OAAA,EAAQ,CAAE,QAAQ,GAAG,CAAA;AAAA,EAElE,gBAAgBC,OAAAA,CAAQ,kBAAkB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,EAC/D,iBAAiBA,OAAAA,CAAQ,mBAAmB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,EACjE,gBAAgBA,OAAAA,CAAQ,kBAAkB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,EAC/D,iBAAiBA,OAAAA,CAAQ,mBAAmB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA;AAAA,EAGjE,gBAAgBA,OAAAA,CAAQ,kBAAkB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,EAC/D,iBAAiBA,OAAAA,CAAQ,mBAAmB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,EACjE,gBAAgBA,OAAAA,CAAQ,kBAAkB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,EAC/D,iBAAiBA,OAAAA,CAAQ,mBAAmB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA;AAAA,EAGjE,gBAAA,EAAkBD,KAAK,mBAAmB,CAAA;AAAA;AAAA;AAAA,EAG1C,oBAAA,EAAsBA,KAAK,yBAAyB,CAAA;AAAA;AAAA,EACpD,sBAAA,EAAwBA,KAAK,2BAA2B,CAAA;AAAA;AAAA,EACxD,kBAAA,EAAoBA,KAAK,uBAAuB;AAAA;AAClD,CAAC,CAAA;;;ACpTM,IAAM,MAAA,GAAS;AAAA,EAClB,GAAG,cAAA;AAAA,EACH,GAAG,oBAAA;AAAA,EACH,GAAG,iBAAA;AAAA,EACH,GAAG,oBAAA;AAAA,EACH,GAAG,iBAAA;AAAA,EACH,GAAG;AACP,CAAA;;;ACIA,eAAsB,KAAA,GAAQ;AAC1B,EAAA,MAAM,MAAA,GAAS,MAAM,aAAA,EAAc;AACnC,EAAA,OAAO,OAAA,CAAQ,MAAA,EAAQ,EAAE,MAAA,EAAQ,CAAA;AACrC;;;ACJO,IAAM,iBAAA,GAAN,MAAM,kBAAA,CAAkB;AAAA,EAC3B,OAAe,QAAA,GAAqC,IAAA;AAAA,EACnC,aAAA,GAAgB,IAAI,EAAA,GAAK,GAAA;AAAA;AAAA,EAElC,WAAA,GAAc;AAAA,EAAE;AAAA;AAAA;AAAA;AAAA,EAKxB,OAAO,WAAA,GAAiC;AACpC,IAAA,IAAI,CAAC,mBAAkB,QAAA,EAAU;AAC7B,MAAA,kBAAA,CAAkB,QAAA,GAAW,IAAI,kBAAA,EAAkB;AAAA,IACvD;AACA,IAAA,OAAO,kBAAA,CAAkB,QAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAA,GAAqC;AACvC,IAAA,OAAO,MAAM,WAAA,EAAY;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,QAAA,CACF,YAAA,EACA,OAAA,GAAwB,EAAC,EACJ;AACrB,IAAA,IAAI,CAAC,MAAM,IAAA,CAAK,gBAAA,EAAiB,EAAG;AAChC,MAAA,OAAO,IAAA;AAAA,IACX;AAEA,IAAA,MAAM,EAAE,MAAA,GAAS,IAAA,CAAK,aAAA,EAAe,YAAA,GAAe,OAAM,GAAI,OAAA;AAE9D,IAAA,IAAI,YAAA,EAAc;AACd,MAAA,OAAO,IAAA;AAAA,IACX;AAEA,IAAA,IAAI;AACA,MAAA,MAAM,EAAA,GAAK,MAAM,KAAA,EAAM;AACvB,MAAA,MAAM,UAAU,MAAM,EAAA,CACjB,MAAA,EAAO,CACP,KAAK,MAAM,CAAA,CACX,KAAA,CAAM,EAAA,CAAG,OAAO,YAAA,EAAc,YAAY,CAAC,CAAA,CAC3C,MAAM,CAAC,CAAA;AAEZ,MAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACtB,QAAA,OAAO,IAAA;AAAA,MACX;AAEA,MAAA,MAAM,KAAA,GAAQ,QAAQ,CAAC,CAAA;AACvB,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA,CAAM,QAAA;AAG/B,MAAA,IAAI,MAAM,MAAA,EAAQ;AACd,QAAA,OAAO,IAAA;AAAA,MACX;AAEA,MAAA,OAAO,KAAA;AAAA,IACX,SAAS,KAAA,EAAO;AACZ,MAAA,OAAA,CAAQ,IAAA,CAAK,uDAAuD,KAAK,CAAA;AACzE,MAAA,OAAO,IAAA;AAAA,IACX;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,SAAA,CACF,cAAA,EACA,OAAA,GAAwB,EAAC,EACE;AAC3B,IAAA,IAAI,CAAC,MAAM,IAAA,CAAK,kBAAiB,IAAK,cAAA,CAAe,WAAW,CAAA,EAAG;AAC/D,MAAA,2BAAW,GAAA,EAAI;AAAA,IACnB;AAEA,IAAA,MAAM,EAAE,MAAA,GAAS,IAAA,CAAK,aAAA,EAAc,GAAI,OAAA;AAExC,IAAA,IAAI;AACA,MAAA,MAAM,EAAA,GAAK,MAAM,KAAA,EAAM;AACvB,MAAA,MAAM,OAAA,GAAU,MAAM,EAAA,CACjB,MAAA,GACA,IAAA,CAAK,MAAM,CAAA,CACX,KAAA,CAAM,GAAA,CAAA,EAAM,MAAA,CAAO,YAAY,CAAA,IAAA,EAAO,cAAc,CAAA,CAAE,CAAA;AAE3D,MAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,MAAA,MAAM,QAAA,uBAAe,GAAA,EAAmB;AAExC,MAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AACzB,QAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,QAAA;AACxB,QAAA,IAAI,OAAO,MAAA,EAAQ;AACf,UAAA,QAAA,CAAS,GAAA,CAAI,KAAA,CAAM,YAAA,EAAc,KAAK,CAAA;AAAA,QAC1C;AAAA,MACJ;AAEA,MAAA,OAAO,QAAA;AAAA,IACX,SAAS,KAAA,EAAO;AACZ,MAAA,OAAA,CAAQ,IAAA,CAAK,wDAAwD,KAAK,CAAA;AAC1E,MAAA,2BAAW,GAAA,EAAI;AAAA,IACnB;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,WACF,KAAA,EACA,YAAA,GAAyB,EAAC,EAC1B,OAAA,GAA6E,EAAC,EACjE;AACb,IAAA,IAAI,CAAC,MAAM,IAAA,CAAK,gBAAA,EAAiB,EAAG;AAChC,MAAA;AAAA,IACJ;AAEA,IAAA,IAAI;AACA,MAAA,MAAM,EAAA,GAAK,MAAM,KAAA,EAAM;AAGvB,MAAA,MAAM,EAAA,CACD,MAAA,CAAO,MAAM,CAAA,CACb,MAAA,CAAO;AAAA,QACJ,GAAG,KAAA;AAAA,QACH,QAAA,EAAU,KAAK,GAAA;AAAI,OACtB,EACA,kBAAA,CAAmB;AAAA,QAChB,QAAQ,MAAA,CAAO,YAAA;AAAA,QACf,GAAA,EAAK;AAAA,UACD,GAAG,KAAA;AAAA,UACH,QAAA,EAAU,KAAK,GAAA,EAAI;AAAA,UACnB,SAAA,EAAW,KAAK,GAAA;AAAI;AACxB,OACH,CAAA;AAGL,MAAA,MAAM,EAAA,CACD,MAAA,CAAO,iBAAiB,CAAA,CACxB,KAAA,CAAM,GAAG,iBAAA,CAAkB,YAAA,EAAc,KAAA,CAAM,YAAY,CAAC,CAAA;AAEjE,MAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AACzB,QAAA,MAAM,EAAA,CAAG,MAAA,CAAO,iBAAiB,CAAA,CAAE,MAAA;AAAA,UAC/B,YAAA,CAAa,IAAI,CAAA,GAAA,MAAQ;AAAA,YACrB,cAAc,KAAA,CAAM,YAAA;AAAA,YACpB,UAAA,EAAY;AAAA,WAChB,CAAE;AAAA,SACN;AAAA,MACJ;AAGA,MAAA,MAAM,EAAA,CACD,MAAA,CAAO,YAAY,CAAA,CACnB,KAAA,CAAM,GAAG,YAAA,CAAa,YAAA,EAAc,KAAA,CAAM,YAAY,CAAC,CAAA;AAE5D,MAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACpB,QAAA,MAAM,EAAA,CAAG,MAAA,CAAO,YAAY,CAAA,CAAE,MAAA;AAAA,UAC1B,OAAA,CAAQ,IAAI,CAAA,CAAA,MAAM;AAAA,YACd,cAAc,KAAA,CAAM,YAAA;AAAA,YACpB,GAAG;AAAA,WACP,CAAE;AAAA,SACN;AAAA,MACJ;AAAA,IACJ,SAAS,KAAA,EAAO;AACZ,MAAA,OAAA,CAAQ,KAAA,CAAM,8CAA8C,KAAK,CAAA;AAAA,IAErE;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,UAAA,CAAW,OAAA,GAOb,EAAC,EAAqB;AACtB,IAAA,IAAI,CAAC,MAAM,IAAA,CAAK,gBAAA,EAAiB,EAAG;AAChC,MAAA,OAAO,EAAC;AAAA,IACZ;AAEA,IAAA,IAAI;AACA,MAAA,MAAM,EAAA,GAAK,MAAM,KAAA,EAAM;AACvB,MAAA,MAAM;AAAA,QACF,WAAA;AAAA,QACA,SAAA;AAAA,QACA,UAAA;AAAA,QACA,aAAA;AAAA,QACA,KAAA,GAAQ,EAAA;AAAA,QACR,MAAA,GAAS;AAAA,OACb,GAAI,OAAA;AAGJ,MAAA,MAAM,aAAa,EAAC;AACpB,MAAA,IAAI,gBAAgB,KAAA,CAAA,EAAW;AAC3B,QAAA,UAAA,CAAW,IAAA,CAAK,EAAA,CAAG,MAAA,CAAO,WAAA,EAAa,WAAW,CAAC,CAAA;AAAA,MACvD;AACA,MAAA,IAAI,SAAA,EAAW;AACX,QAAA,UAAA,CAAW,IAAA,CAAK,EAAA,CAAG,MAAA,CAAO,eAAA,EAAiB,SAAS,CAAC,CAAA;AAAA,MACzD;AACA,MAAA,IAAI,eAAe,KAAA,CAAA,EAAW;AAC1B,QAAA,UAAA,CAAW,IAAA,CAAK,EAAA,CAAG,MAAA,CAAO,UAAA,EAAY,UAAU,CAAC,CAAA;AAAA,MACrD;AACA,MAAA,IAAI,kBAAkB,KAAA,CAAA,EAAW;AAC7B,QAAA,UAAA,CAAW,KAAK,GAAA,CAAA,EAAM,MAAA,CAAO,eAAe,CAAA,IAAA,EAAO,aAAa,CAAA,CAAE,CAAA;AAAA,MACtE;AAGA,MAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACvB,QAAA,MAAM,OAAA,GAAU,MAAM,EAAA,CACjB,MAAA,EAAO,CACP,KAAK,MAAM,CAAA,CACX,KAAA,CAAM,GAAA,CAAI,GAAG,UAAU,CAAC,CAAA,CACxB,OAAA,CAAQ,IAAA,CAAK,MAAA,CAAO,eAAe,CAAC,EACpC,KAAA,CAAM,KAAK,CAAA,CACX,MAAA,CAAO,MAAM,CAAA;AAClB,QAAA,OAAO,OAAA;AAAA,MACX,CAAA,MAAO;AACH,QAAA,MAAM,UAAU,MAAM,EAAA,CACjB,QAAO,CACP,IAAA,CAAK,MAAM,CAAA,CACX,OAAA,CAAQ,IAAA,CAAK,MAAA,CAAO,eAAe,CAAC,CAAA,CACpC,MAAM,KAAK,CAAA,CACX,OAAO,MAAM,CAAA;AAClB,QAAA,OAAO,OAAA;AAAA,MACX;AAAA,IACJ,SAAS,KAAA,EAAO;AACZ,MAAA,OAAA,CAAQ,IAAA,CAAK,8CAA8C,KAAK,CAAA;AAChE,MAAA,OAAO,EAAC;AAAA,IACZ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,gBAAgB,YAAA,EAAqC;AACvD,IAAA,IAAI,CAAC,MAAM,IAAA,CAAK,gBAAA,EAAiB,EAAG;AAChC,MAAA;AAAA,IACJ;AAEA,IAAA,IAAI;AACA,MAAA,MAAM,EAAA,GAAK,MAAM,KAAA,EAAM;AACvB,MAAA,MAAM,EAAA,CAAG,OAAO,MAAM,CAAA,CAAE,MAAM,EAAA,CAAG,MAAA,CAAO,YAAA,EAAc,YAAY,CAAC,CAAA;AAAA,IACvE,SAAS,KAAA,EAAO;AACZ,MAAA,OAAA,CAAQ,IAAA,CAAK,mDAAmD,KAAK,CAAA;AAAA,IACzE;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,GAA4B;AAC9B,IAAA,IAAI,CAAC,MAAM,IAAA,CAAK,gBAAA,EAAiB,EAAG;AAChC,MAAA;AAAA,IACJ;AAEA,IAAA,IAAI;AACA,MAAA,MAAM,EAAA,GAAK,MAAM,KAAA,EAAM;AACvB,MAAA,MAAM,EAAA,CAAG,OAAO,MAAM,CAAA;AAAA,IAC1B,SAAS,KAAA,EAAO;AACZ,MAAA,OAAA,CAAQ,KAAA,CAAM,8CAA8C,KAAK,CAAA;AAAA,IACrE;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAA,GAII;AACN,IAAA,IAAI,CAAC,MAAM,IAAA,CAAK,gBAAA,EAAiB,EAAG;AAChC,MAAA,OAAO,IAAA;AAAA,IACX;AAEA,IAAA,IAAI;AACA,MAAA,MAAM,EAAA,GAAK,MAAM,KAAA,EAAM;AACvB,MAAA,MAAM,MAAA,GAAS,MAAM,EAAA,CAChB,MAAA,CAAO;AAAA,QACJ,KAAA,EAAO,GAAA,CAAA,QAAA,CAAA;AAAA,QACP,QAAQ,GAAA,CAAA,IAAA,EAAkB,IAAA,CAAK,KAAK,CAAA,GAAA,EAAM,OAAO,QAAQ,CAAA,CAAA,CAAA;AAAA,QACzD,WAAA,EAAa,GAAA,CAAA,IAAA,EAAkB,MAAA,CAAO,QAAQ,CAAA,CAAA;AAAA,OACjD,CAAA,CACA,IAAA,CAAK,MAAM,CAAA;AAEhB,MAAA,OAAO;AAAA,QACH,WAAA,EAAa,MAAA,CAAO,CAAC,CAAA,CAAE,KAAA;AAAA,QACvB,UAAA,EAAY,MAAA,CAAO,CAAC,CAAA,CAAE,MAAA;AAAA,QACtB,WAAA,EAAa,MAAA,CAAO,CAAC,CAAA,CAAE;AAAA,OAC3B;AAAA,IACJ,SAAS,KAAA,EAAO;AACZ,MAAA,OAAA,CAAQ,IAAA,CAAK,kDAAkD,KAAK,CAAA;AACpE,MAAA,OAAO,IAAA;AAAA,IACX;AAAA,EACJ;AACJ,CAAA;AAG0B,kBAAkB,WAAA;;;ACxU5C,IAAM,gCAAA,GAAmC,GAAA;AAgHlC,IAAM,uBAAN,MAA2B;AAAA,EACxB,GAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,KAAA,uBAA4D,GAAA,EAAI;AAAA,EAChE,YAAA;AAAA,EACA,QAAA;AAAA,EACA,gBAAA;AAAA,EACA,OAAA;AAAA,EAER,YAAY,OAAA,EAAgC;AAC1C,IAAA,IAAA,CAAK,GAAA,GAAMI,eAAAA,CAAgB,OAAA,CAAQ,WAAW,CAAA;AAC9C,IAAA,IAAA,CAAK,YAAY,OAAA,CAAQ,SAAA;AACzB,IAAA,IAAA,CAAK,UAAA,GAAa,QAAQ,UAAA,IAAc,WAAA;AACxC,IAAA,IAAA,CAAK,YAAA,GAAe,QAAQ,YAAA,IAAgB,IAAA;AAC5C,IAAA,IAAA,CAAK,QAAA,GAAW,QAAQ,QAAA,IAAY,GAAA;AACpC,IAAA,IAAA,CAAK,gBAAA,GAAmB,QAAQ,gBAAA,IAAoB,IAAA;AACpD,IAAA,IAAA,CAAK,OAAA,GAAU,kBAAkB,WAAA,EAAY;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,CAAa,MAAA,GAA4B,EAAC,EAAiC;AAC/E,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,QAAA,EAAU,MAAM,CAAA;AAGlD,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,YAAA,CAAkC,QAAQ,CAAA;AAC9D,MAAA,IAAI,QAAQ,OAAO,MAAA;AAAA,IACrB;AAGA,IAAA,MAAM,IAAA,GAAO,OAAO,IAAA,IAAQ,CAAA;AAC5B,IAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,KAAA,IAAS,IAAI,GAAG,CAAA;AAC9C,IAAA,MAAM,MAAA,GAAS,OAAO,OAAA,IAAW,YAAA;AACjC,IAAA,MAAM,SAAA,GAAY,OAAO,UAAA,IAAc,MAAA;AAGvC,IAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,oBAAA,CAAqB,MAAM,CAAA;AAGxD,IAAA,IAAI,cAAA,GAAiB,IAAA,CAAK,YAAA,CAAa,SAAA,EAAW,MAAM,CAAA;AAGxD,IAAA,cAAA,GAAiB,IAAA,CAAK,UAAA,CAAW,cAAA,EAAgB,MAAA,EAAQ,SAAS,CAAA;AAGlE,IAAA,MAAM,QAAQ,cAAA,CAAe,MAAA;AAC7B,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,IAAA,CAAK,KAAA,GAAQ,KAAK,CAAA;AAC1C,IAAA,MAAM,UAAA,GAAA,CAAc,OAAO,CAAA,IAAK,KAAA;AAChC,IAAA,MAAM,WAAW,UAAA,GAAa,KAAA;AAC9B,IAAA,MAAM,eAAA,GAAkB,cAAA,CAAe,KAAA,CAAM,UAAA,EAAY,QAAQ,CAAA;AAEjE,IAAA,MAAM,QAAA,GAAgC;AAAA,MACpC,MAAA,EAAQ,eAAA;AAAA,MACR,UAAA,EAAY;AAAA,QACV,IAAA;AAAA,QACA,KAAA;AAAA,QACA,KAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,OAAA,EAAS;AAAA,KACX;AAGA,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,IAAA,CAAK,QAAA,CAAS,UAAU,QAAQ,CAAA;AAAA,IAClC;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,QAAA,CAASC,QAAAA,EAAkB,YAAA,GAAe,KAAA,EAA8B;AAC5E,IAAA,MAAM,WAAW,IAAA,CAAK,WAAA,CAAY,SAAS,EAAE,OAAA,EAAAA,UAAS,CAAA;AAGtD,IAAA,IAAI,IAAA,CAAK,gBAAA,IAAoB,CAAC,YAAA,EAAc;AAC1C,MAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,OAAA,CAAQ,SAASA,QAAAA,EAAS;AAAA,QACvD,MAAA,EAAQ,KAAK,QAAA,GAAW,GAAA;AAAA,QACxB;AAAA,OACD,CAAA;AAED,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,qCAAA,EAAwCA,QAAO,CAAA,CAAE,CAAA;AAC7D,QAAA,OAAO,IAAA,CAAK,qBAAqB,WAAW,CAAA;AAAA,MAC9C;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,CAAK,YAAA,IAAgB,CAAC,YAAA,EAAc;AACtC,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,YAAA,CAAoB,QAAQ,CAAA;AAChD,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,4CAAA,EAA+CA,QAAO,CAAA,CAAE,CAAA;AACpE,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,IACF;AAGA,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,sCAAA,EAAyCA,QAAO,CAAA,mBAAA,CAAqB,CAAA;AAEjF,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,eAAeA,QAAAA,EAAS;AAAA,QACpD,YAAY,IAAA,CAAK,UAAA;AAAA,QACjB,QAAA,EAAU;AAAA,OACX,EAAE,IAAA,EAAK;AAER,MAAA,MAAM,WAAA,GAAc,MAAA;AACpB,MAAA,IAAI,CAAC,WAAA,CAAY,KAAA,EAAO,OAAO,IAAA;AAE/B,MAAA,MAAM,QAAQ,IAAA,CAAK,iBAAA,CAAkBA,QAAAA,EAAS,WAAA,CAAY,MAAM,IAAI,CAAA;AAEpE,MAAA,IAAI,KAAA,EAAO;AAET,QAAA,IAAI,KAAK,gBAAA,EAAkB;AACzB,UAAA,IAAA,CAAK,oBAAA,CAAqB,KAAK,CAAA,CAAE,KAAA;AAAA,YAAM,CAAA,GAAA,KACrC,OAAA,CAAQ,IAAA,CAAK,qDAAA,EAAuD,GAAG;AAAA,WACzE;AAAA,QACF;AAGA,QAAA,IAAI,KAAK,YAAA,EAAc;AACrB,UAAA,IAAA,CAAK,QAAA,CAAS,UAAU,KAAK,CAAA;AAAA,QAC/B;AAAA,MACF;AAEA,MAAA,OAAO,KAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,sBAAA,EAAyBA,QAAO,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AACxD,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,qBAAqB,KAAA,EAA6B;AAC9D,IAAA,MAAM,KAAK,OAAA,CAAQ,UAAA;AAAA,MACjB;AAAA,QACE,cAAc,KAAA,CAAM,OAAA;AAAA,QACpB,OAAO,KAAA,CAAM,KAAA;AAAA,QACb,MAAM,KAAA,CAAM,IAAA;AAAA,QACZ,aAAa,KAAA,CAAM,WAAA;AAAA,QACnB,iBAAiB,KAAA,CAAM,gBAAA;AAAA,QACvB,kBAAA,EAAoB,MAAA,CAAO,KAAA,CAAM,UAAU,CAAA;AAAA,QAC3C,aAAA,EAAe,KAAA,CAAM,cAAA,CAAe,QAAA,EAAS;AAAA,QAC7C,aAAa,KAAA,CAAM,YAAA;AAAA,QACnB,oBAAoB,KAAA,CAAM,oBAAA;AAAA,QAC1B,gBAAA,EAAkB,KAAA,CAAM,mBAAA,CAAoB,QAAA,EAAS;AAAA,QACrD,qBAAqB,KAAA,CAAM,qBAAA;AAAA,QAC3B,iBAAA,EAAmB,KAAA,CAAM,mBAAA,CAAoB,QAAA,EAAS;AAAA,QACtD,cAAA,EAAgB,KAAA,CAAM,gBAAA,CAAiB,QAAA,EAAS;AAAA,QAChD,oBAAA,EAAsB,MAAA,CAAO,KAAA,CAAM,sBAAsB,CAAA;AAAA,QACzD,aAAa,KAAA,CAAM,YAAA;AAAA,QACnB,iBAAiB,KAAA,CAAM,gBAAA;AAAA,QACvB,YAAY,KAAA,CAAM,WAAA;AAAA,QAClB,SAAA,EAAW,MAAA,CAAO,KAAA,CAAM,UAAU,CAAA;AAAA,QAClC,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,QAAA,EAAU,KAAK,GAAA,EAAI;AAAA,QACnB,IAAA,EAAM;AAAA;AAAA,OACR;AAAA,MACA,KAAA,CAAM,YAAA;AAAA,MACN;AAAC;AAAA,KACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAAqB,WAAA,EAAyB;AACpD,IAAA,OAAO;AAAA,MACL,SAAS,WAAA,CAAY,YAAA;AAAA,MACrB,OAAO,WAAA,CAAY,KAAA;AAAA,MACnB,MAAM,WAAA,CAAY,IAAA;AAAA,MAClB,aAAa,WAAA,CAAY,WAAA;AAAA,MACzB,cAAc,EAAC;AAAA;AAAA,MACf,YAAA,EAAc,OAAA,CAAQ,WAAA,CAAY,WAAW,CAAA;AAAA,MAC7C,sBAAsB,WAAA,CAAY,kBAAA;AAAA,MAClC,sBAAsB,EAAC;AAAA;AAAA,MACvB,mBAAA,EAAqB,MAAA,CAAO,WAAA,CAAY,gBAAgB,CAAA;AAAA,MACxD,uBAAuB,WAAA,CAAY,mBAAA;AAAA,MACnC,mBAAA,EAAqB,MAAA,CAAO,WAAA,CAAY,iBAAiB,CAAA;AAAA,MACzD,gBAAA,EAAkB,MAAA,CAAO,WAAA,CAAY,cAAc,CAAA;AAAA,MACnD,sBAAA,EAAwB,MAAA,CAAO,WAAA,CAAY,oBAAoB,CAAA;AAAA,MAC/D,kBAAkB,WAAA,CAAY,eAAA;AAAA,MAC9B,UAAA,EAAY,MAAA,CAAO,WAAA,CAAY,kBAAkB,CAAA;AAAA,MACjD,eAAA,EAAiB,MAAA,CAAO,WAAA,CAAY,kBAAkB,CAAA;AAAA,MACtD,cAAA,EAAgB,MAAA,CAAO,WAAA,CAAY,aAAa,CAAA;AAAA,MAChD,cAAA,EAAgB,YAAY,eAAA,GAAkB,gCAAA;AAAA,MAC9C,UAAA,EAAY,MAAA,CAAO,WAAA,CAAY,SAAS,CAAA;AAAA,MACxC,cAAc,WAAA,CAAY,WAAA;AAAA,MAC1B,kBAAkB,WAAA,CAAY,eAAA;AAAA,MAC9B,WAAA,EAAa,OAAA,CAAQ,WAAA,CAAY,UAAU;AAAA,KAC7C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgBA,QAAAA,EAAgD;AACpE,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,QAAA,CAASA,QAAO,CAAA;AACzC,IAAA,IAAI,CAAC,KAAA,EAAO,YAAA,EAAc,OAAO,IAAA;AAEjC,IAAA,OAAO;AAAA,MACL,gBAAgB,KAAA,CAAM,mBAAA;AAAA,MACtB,eAAA,EAAiB,MAAM,IAAA,CAAK,YAAA,CAAa,MAAM,oBAAoB,CAAA;AAAA,MACnE,iBAAiB,KAAA,CAAM,oBAAA;AAAA,MACvB,kBAAkB,KAAA,CAAM;AAAA,KAC1B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAA,CACJ,UAAA,EACA,KAAA,GAAQ,EAAA,EACU;AAClB,IAAA,MAAM,MAAA,GAA4B;AAAA,MAChC,UAAA;AAAA,MACA,YAAA,EAAc,IAAA;AAAA,MACd,OAAA,EAAS,YAAA;AAAA,MACT,UAAA,EAAY,MAAA;AAAA,MACZ,KAAA;AAAA,MACA,cAAA,EAAgB;AAAA;AAAA,KAClB;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,YAAA,CAAa,MAAM,CAAA;AAC/C,IAAA,OAAO,QAAA,CAAS,MAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,sBAAsB,UAAA,EAAsC;AAChE,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,YAAA,CAAa;AAAA,MACvC,UAAA;AAAA,MACA,YAAA,EAAc;AAAA,KACf,CAAA;AACD,IAAA,OAAO,QAAA,CAAS,MAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAiB,YAAA,EAAyC;AAC9D,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,YAAA,CAAa;AAAA,MACvC,eAAA,EAAiB,CAAC,YAAY,CAAA;AAAA,MAC9B,YAAA,EAAc;AAAA,KACf,CAAA;AACD,IAAA,OAAO,QAAA,CAAS,MAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBAAA,CACJ,QAAA,EACA,UAAA,EACkB;AAClB,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,YAAA,CAAa;AAAA,MACvC,SAAA,EAAW,QAAA;AAAA,MACX,UAAA;AAAA,MACA,YAAA,EAAc,IAAA;AAAA,MACd,OAAA,EAAS,OAAA;AAAA,MACT,UAAA,EAAY;AAAA,KACb,CAAA;AACD,IAAA,OAAO,QAAA,CAAS,MAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,KAAA,EAAiC;AACnD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,YAAA,CAAa;AAAA,MACvC,KAAA;AAAA,MACA,YAAA,EAAc;AAAA,KACf,CAAA;AACD,IAAA,OAAO,QAAA,CAAS,MAAA;AAAA,EAClB;AAAA;AAAA,EAIA,MAAc,qBAAqB,MAAA,EAA6C;AAC9E,IAAA,IAAI;AAGF,MAAA,MAAM,UAAuC,EAAC;AAG9C,MAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,QAAA,EAAU,IAAA,EAAM,CAAA;AAM/B,MAAA,MAAM,WAAW,MAAM,IAAA,CAAK,GAAA,CAAI,kBAAA,CAAmB,KAAK,SAAA,EAAW;AAAA,QACjE,YAAY,IAAA,CAAK,UAAA;AAAA,QACjB,QAAA,EAAU,QAAA;AAAA,QACV;AAAA,OACD,EAAE,IAAA,EAAK;AAGR,MAAA,MAAMC,UAAkB,EAAC;AACzB,MAAA,KAAA,MAAW,EAAE,MAAA,EAAQ,OAAA,EAAQ,IAAK,QAAA,EAAU;AAC1C,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,iBAAA,CAAkB,MAAA,EAAQ,QAAQ,IAAI,CAAA;AACzD,QAAA,IAAI,KAAA,EAAO;AACT,UAAAA,OAAAA,CAAO,KAAK,KAAK,CAAA;AAAA,QACnB;AAAA,MACF;AAEA,MAAA,OAAOA,OAAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,sCAAsC,KAAK,CAAA;AACzD,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA,EAEQ,iBAAA,CAAkBD,UAAkB,IAAA,EAA6B;AACvE,IAAA,IAAI;AAEF,MAAA,IAAI,SAAA;AACJ,MAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,QAAA,SAAA,GAAY,WAAW,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,IAAA,EAAM,QAAQ,CAAC,CAAA;AAAA,MACzD,CAAA,MAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AAE9B,QAAA,IACE,KAAK,MAAA,KAAW,CAAA,IAChB,OAAO,IAAA,CAAK,CAAC,CAAA,KAAM,QAAA,IACnB,OAAO,IAAA,CAAK,CAAC,CAAA,KAAM,QAAA,IACnB,IAAA,CAAK,CAAC,MAAM,QAAA,EACZ;AACA,UAAA,SAAA,GAAY,UAAA,CAAW,KAAK,MAAA,CAAO,IAAA,CAAK,KAAK,CAAC,CAAA,EAAG,QAAQ,CAAC,CAAA;AAAA,QAC5D,CAAA,MAAO;AAEL,UAAA,SAAA,GAAY,UAAA,CAAW,KAAK,IAAgB,CAAA;AAAA,QAC9C;AAAA,MACF,CAAA,MAAA,IAAW,gBAAgB,UAAA,EAAY;AACrC,QAAA,SAAA,GAAY,IAAA;AAAA,MACd,CAAA,MAAO;AACL,QAAA,MAAM,IAAI,MAAM,qBAAqB,CAAA;AAAA,MACvC;AAGA,MAAA,MAAM,UAAU,eAAA,EAAgB;AAChC,MAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,MAAA,CAAO,SAAS,CAAA;AAC5C,MAAA,MAAM,eAAe,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,GAAI,WAAA,CAAY,CAAC,CAAA,GAAI,WAAA;AAInE,MAAA,OAAO;AAAA,QACL,OAAA,EAAAA,QAAAA;AAAA,QACA,OAAO,YAAA,CAAa,KAAA;AAAA,QACpB,MAAM,YAAA,CAAa,IAAA;AAAA,QACnB,aAAa,YAAA,CAAa,WAAA;AAAA,QAC1B,cAAc,YAAA,CAAa,YAAA;AAAA;AAAA,QAE3B,cAAc,YAAA,CAAa,WAAA;AAAA,QAC3B,sBAAsB,YAAA,CAAa,kBAAA;AAAA,QACnC,sBAAsB,YAAA,CAAa,kBAAA;AAAA,QACnC,qBAAqB,YAAA,CAAa,gBAAA;AAAA,QAClC,uBAAuB,YAAA,CAAa,mBAAA;AAAA,QACpC,qBAAqB,YAAA,CAAa,iBAAA;AAAA,QAClC,kBAAkB,YAAA,CAAa,cAAA;AAAA,QAC/B,wBAAwB,YAAA,CAAa,oBAAA;AAAA;AAAA,QAErC,kBAAkB,YAAA,CAAa,eAAA;AAAA,QAC/B,UAAA,EAAY,MAAA,CAAO,YAAA,CAAa,kBAAkB,CAAA;AAAA,QAClD,eAAA,EAAiB,MAAA,CAAO,YAAA,CAAa,kBAAkB,CAAA;AAAA;AAAA,QACvD,gBAAgB,YAAA,CAAa,aAAA;AAAA,QAC7B,cAAA,EAAgB,aAAa,eAAA,GAAkB,gCAAA;AAAA;AAAA,QAC/C,YAAY,YAAA,CAAa,SAAA;AAAA,QACzB,cAAc,YAAA,CAAa,WAAA;AAAA,QAC3B,kBAAkB,YAAA,CAAa,eAAA;AAAA,QAC/B,aAAa,YAAA,CAAa;AAAA,OAC5B;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,kCAAkC,KAAK,CAAA;AACrD,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,YAAA,CAAaC,SAAiB,MAAA,EAAoC;AACxE,IAAA,IAAI,QAAA,GAAWA,OAAAA;AAGf,IAAA,IAAI,MAAA,CAAO,iBAAiB,MAAA,EAAW;AACrC,MAAA,QAAA,GAAW,SAAS,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,YAAA,KAAiB,OAAO,YAAY,CAAA;AAAA,IACxE;AAGA,IAAA,IAAI,OAAO,UAAA,EAAY;AACrB,MAAA,QAAA,GAAW,QAAA,CAAS,MAAA;AAAA,QAAO,CAAA,CAAA,KACzB,EAAE,YAAA,CAAa,IAAA;AAAA,UAAK,CAAA,CAAA,KAClB,EAAE,WAAA,EAAY,CAAE,SAAS,MAAA,CAAO,UAAA,CAAY,aAAa;AAAA;AAC3D,OACF;AAAA,IACF;AAGA,IAAA,IAAI,MAAA,CAAO,iBAAiB,MAAA,EAAQ;AAClC,MAAA,QAAA,GAAW,QAAA,CAAS,MAAA;AAAA,QAAO,CAAA,CAAA,KACzB,OAAO,eAAA,CAAiB,IAAA;AAAA,UAAK,CAAA,KAAA,KAC3B,CAAA,CAAE,oBAAA,CAAqB,QAAA,CAAS,KAAgB;AAAA;AAClD,OACF;AAAA,IACF;AAGA,IAAA,IAAI,MAAA,CAAO,mBAAmB,MAAA,EAAW;AACvC,MAAA,QAAA,GAAW,SAAS,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,gBAAA,IAAoB,OAAO,cAAe,CAAA;AAAA,IAC9E;AAGA,IAAA,IAAI,MAAA,CAAO,cAAc,MAAA,EAAW;AAClC,MAAA,QAAA,GAAW,SAAS,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,mBAAA,IAAuB,OAAO,SAAU,CAAA;AAAA,IAC5E;AAGA,IAAA,IAAI,OAAO,gBAAA,EAAkB;AAC3B,MAAA,QAAA,GAAW,QAAA,CAAS,MAAA;AAAA,QAAO,OACzB,CAAA,CAAE,gBAAA,CAAiB,aAAY,KAAM,MAAA,CAAO,iBAAkB,WAAA;AAAY,OAC5E;AAAA,IACF;AAGA,IAAA,IAAI,MAAA,CAAO,gBAAgB,MAAA,EAAW;AACpC,MAAA,QAAA,GAAW,SAAS,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,WAAA,KAAgB,OAAO,WAAW,CAAA;AAAA,IACtE;AAGA,IAAA,IAAI,OAAO,KAAA,EAAO;AAChB,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,WAAA,EAAY;AACvC,MAAA,QAAA,GAAW,QAAA,CAAS,MAAA;AAAA,QAAO,CAAA,CAAA,KACzB,CAAA,CAAE,IAAA,CAAK,WAAA,EAAY,CAAE,QAAA,CAAS,KAAK,CAAA,IACnC,CAAA,CAAE,WAAA,CAAY,WAAA,EAAY,CAAE,SAAS,KAAK;AAAA,OAC5C;AAAA,IACF;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEQ,UAAA,CACNA,OAAAA,EACA,MAAA,EACA,SAAA,EACS;AACT,IAAA,MAAM,MAAA,GAAS,CAAC,GAAGA,OAAM,CAAA;AACzB,IAAA,MAAM,KAAA,GAAQ,SAAA,KAAc,KAAA,GAAQ,CAAA,GAAI,EAAA;AAExC,IAAA,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACpB,MAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,MAAA,QAAQ,MAAA;AAAQ,QACd,KAAK,YAAA;AACH,UAAA,UAAA,GAAa,CAAA,CAAE,mBAAmB,CAAA,CAAE,gBAAA;AACpC,UAAA;AAAA,QACF,KAAK,OAAA;AACH,UAAA,UAAA,GAAa,MAAA,CAAO,CAAA,CAAE,mBAAA,GAAsB,CAAA,CAAE,mBAAmB,CAAA;AACjE,UAAA;AAAA,QACF,KAAK,YAAA;AACH,UAAA,UAAA,GAAa,MAAA,CAAO,CAAA,CAAE,UAAA,GAAa,CAAA,CAAE,UAAU,CAAA;AAC/C,UAAA;AAAA,QACF,KAAK,YAAA;AACH,UAAA,UAAA,GAAa,MAAA,CAAO,CAAA,CAAE,UAAA,GAAa,CAAA,CAAE,UAAU,CAAA;AAC/C,UAAA;AAAA;AAGJ,MAAA,OAAO,UAAA,GAAa,KAAA;AAAA,IACtB,CAAC,CAAA;AAED,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAc,aAAa,MAAA,EAIvB;AACF,IAAA,MAAM,YAAyE,EAAC;AAEhF,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,IAAI;AAEF,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,eAAe,KAAA,EAAO;AAAA,UAClD,YAAY,IAAA,CAAK,UAAA;AAAA,UACjB,QAAA,EAAU;AAAA,SACX,EAAE,IAAA,EAAK;AAER,QAAA,MAAM,QAAA,GAAW,MAAA;AACjB,QAAA,IAAI,SAAS,KAAA,EAAO;AAGlB,UAAA,MAAM,IAAA,GAAO,OAAO,IAAA,CAAK,QAAA,CAAS,MAAM,IAAA,CAAK,CAAC,GAAG,QAAQ,CAAA;AACzD,UAAA,MAAM,QAAA,GAAW,KAAK,EAAE,CAAA;AAExB,UAAA,SAAA,CAAU,IAAA,CAAK;AAAA,YACb,KAAA;AAAA,YACA,QAAA;AAAA,YACA,MAAA,EAAQ;AAAA;AAAA,WACT,CAAA;AAAA,QACH;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,+BAAA,EAAkC,KAAK,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAAA,MACjE;AAAA,IACF;AAEA,IAAA,OAAO,SAAA;AAAA,EACT;AAAA,EAEQ,WAAA,CAAY,QAAgB,MAAA,EAAyB;AAC3D,IAAA,OAAO,GAAG,MAAM,CAAA,CAAA,EAAI,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA,CAAA;AAAA,EAC5C;AAAA,EAEQ,aAAgB,GAAA,EAAuB;AAC7C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AACjC,IAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,IAAA,IAAI,IAAA,CAAK,GAAA,EAAI,GAAI,MAAA,CAAO,MAAA,EAAQ;AAC9B,MAAA,IAAA,CAAK,KAAA,CAAM,OAAO,GAAG,CAAA;AACrB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,MAAA,CAAO,IAAA;AAAA,EAChB;AAAA,EAEQ,QAAA,CAAS,KAAa,IAAA,EAAqB;AACjD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,EAAI,GAAK,KAAK,QAAA,GAAW,GAAA;AAC7C,IAAA,IAAA,CAAK,MAAM,GAAA,CAAI,GAAA,EAAK,EAAE,IAAA,EAAM,QAAQ,CAAA;AAGpC,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,GAAA,EAAM;AAE1B,MAAA,MAAM,UAAU,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA;AAC/C,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,CAAC,CAAA,CAAE,MAAA,GAAS,CAAA,CAAE,CAAC,CAAA,CAAE,MAAM,CAAA;AAChD,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,EAAK,CAAA,EAAA,EAAK;AAC5B,QAAA,IAAA,CAAK,MAAM,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,CAAE,CAAC,CAAC,CAAA;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAAmB;AACjB,IAAA,IAAA,CAAK,MAAM,KAAA,EAAM;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAAiE;AAC/D,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,KAAK,KAAA,CAAM,IAAA;AAAA,MACjB,SAAS,IAAA,CAAK,YAAA;AAAA,MACd,KAAK,IAAA,CAAK;AAAA,KACZ;AAAA,EACF;AACF;AAKO,SAAS,2BACd,OAAA,EACsB;AACtB,EAAA,OAAO,IAAI,qBAAqB,OAAO,CAAA;AACzC;ACvqBO,SAAS,YAAY,KAAA,EAAsC;AAChE,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAE7B,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAA;AACT;AC8DA,IAAM,iBAAN,MAAqB;AAAA,EACX,KAAA,uBAA8C,GAAA,EAAI;AAAA,EACzC,GAAA;AAAA,EACT,eAAA,GAAyC,IAAA;AAAA,EAEjD,WAAA,CAAY,MAAc,IAAA,EAAM;AAC9B,IAAA,IAAA,CAAK,MAAM,GAAA,GAAM,GAAA;AAGjB,IAAA,IAAA,CAAK,kBAAkB,WAAA,CAAY,MAAM,IAAA,CAAK,OAAA,IAAW,GAAM,CAAA;AAG/D,IAAA,IAAI,IAAA,CAAK,gBAAgB,KAAA,EAAO;AAC9B,MAAA,IAAA,CAAK,gBAAgB,KAAA,EAAM;AAAA,IAC7B;AAAA,EACF;AAAA,EAEA,IAAI,SAAA,EAA4B;AAC9B,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,SAAS,CAAA;AACtC,IAAA,IAAI,CAAC,OAAO,OAAO,KAAA;AAGnB,IAAA,IAAI,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA,CAAM,SAAA,EAAW;AAChC,MAAA,IAAA,CAAK,KAAA,CAAM,OAAO,SAAS,CAAA;AAC3B,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,IAAI,SAAA,EAAyB;AAC3B,IAAA,IAAA,CAAK,KAAA,CAAM,IAAI,SAAA,EAAW;AAAA,MACxB,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,SAAA,EAAW,IAAA,CAAK,GAAA,EAAI,GAAI,IAAA,CAAK;AAAA,KAC9B,CAAA;AAAA,EACH;AAAA,EAEQ,OAAA,GAAgB;AACtB,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,KAAA,MAAW,CAAC,SAAA,EAAW,KAAK,KAAK,IAAA,CAAK,KAAA,CAAM,SAAQ,EAAG;AACrD,MAAA,IAAI,GAAA,GAAM,MAAM,SAAA,EAAW;AACzB,QAAA,IAAA,CAAK,KAAA,CAAM,OAAO,SAAS,CAAA;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAA,GAAkB;AAChB,IAAA,OAAO,KAAK,KAAA,CAAM,IAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAA,GAAgB;AACd,IAAA,IAAI,KAAK,eAAA,EAAiB;AACxB,MAAA,aAAA,CAAc,KAAK,eAAe,CAAA;AAClC,MAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AAAA,IACzB;AACA,IAAA,IAAA,CAAK,MAAM,KAAA,EAAM;AAAA,EACnB;AACF,CAAA;AAGI,IAAI,oBAAA,GAA8C,IAAA;AA2E/C,SAAS,qBAAqB,OAAA,EAAgC;AAEnE,EAAA,MAAM,iBAAA,GAAoB,QAAQ,wBAAA,IAA4B,IAAA;AAC9D,EAAA,MAAM,iBAAA,GAAoB,QAAQ,iBAAA,IAAqB,IAAA;AACvD,EAAA,MAAM,QAAA,GAAW,QAAQ,iBAAA,IAAqB,IAAA;AAG9C,EAAA,MAAM,cAAA,GAAiB,oBACpB,OAAA,CAAQ,iBAAA,GAAoB,IAAI,cAAA,CAAe,QAAQ,IAAI,oBAAA,GAC5D,IAAA;AAEF,EAAA,OAAO,OACL,GAAA,EACA,GAAA,EACA,IAAA,KACG;AAEH,IAAA,MAAM,gBAAA,GAAmB,KAAK,GAAA,EAAI;AAElC,IAAA,MAAM,gBAAA,GAAmB,GAAA,CAAI,OAAA,CAAQ,qBAAqB,CAAA;AAC1D,IAAA,MAAM,gBAAA,GAAmB,GAAA,CAAI,OAAA,CAAQ,sBAAsB,CAAA;AAG3D,IAAA,IAAI,OAAA,CAAQ,WAAA,IAAe,YAAA,CAAa,GAAA,EAAK,OAAO,CAAA,EAAG;AACrD,MAAA,OAAO,IAAA,EAAK;AAAA,IACd;AAGA,IAAA,MAAM,cAAA,GAAiB,OAAA,CAAQ,UAAA,CAAW,oBAAA,CAAqB;AAAA,MAC7D,QAAQ,OAAA,CAAQ,eAAA;AAAA,MAChB,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,aAAa,OAAA,CAAQ;AAAA,KACtB,CAAA;AAGD,IAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,MAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,UAAA,CAAW,oBAAA,CAAqB,cAAc,CAAA;AAEtE,MAAA,GAAA,CAAI,OAAO,GAAG,CAAA,CAAE,GAAA,CAAI,OAA4C,EAAE,IAAA,CAAK;AAAA,QACrE,KAAA,EAAO,kBAAA;AAAA,QACP,OAAA,EAAS,qCAAA;AAAA,QACT,IAAA,EAAM,kBAAA;AAAA,QACN,cAAA,EAAgB;AAAA,UACd,SAAS,cAAA,CAAe,SAAA;AAAA,UACxB,MAAA,EAAQ,cAAA,CAAe,MAAA,CAAO,QAAA,EAAS;AAAA,UACvC,OAAO,cAAA,CAAe,KAAA;AAAA,UACtB,UAAA,EAAY,QAAA;AAAA,UACZ,aAAa,OAAA,CAAQ,WAAA;AAAA,UACrB,WAAW,cAAA,CAAe;AAAA,SAC5B;AAAA,QACA,aAAA,EAAe;AAAA,OAChB,CAAA;AACD,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,iBAAA,IAAqB,cAAA,EAAgB,GAAA,CAAI,gBAAgB,CAAA,EAAG;AAC9D,MAAA,IAAI,QAAQ,eAAA,EAAiB;AAC3B,QAAA,MAAM,OAAA,CAAQ,eAAA,CAAgB,gCAAA,EAAkC,GAAG,CAAA;AAAA,MACrE;AAEA,MAAA,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,CAAK;AAAA,QACnB,KAAA,EAAO,sBAAA;AAAA,QACP,OAAA,EAAS,4EAAA;AAAA,QACT,IAAA,EAAM;AAAA,OACP,CAAA;AACD,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,qBAAqB,gBAAA,EAAkB;AACzC,MAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,MAAA,MAAM,kBAAA,GAAqB,QAAA,CAAS,gBAAA,EAAkB,EAAE,CAAA;AAExD,MAAA,IAAI,KAAA,CAAM,kBAAkB,CAAA,EAAG;AAC7B,QAAA,IAAI,QAAQ,eAAA,EAAiB;AAC3B,UAAA,MAAM,OAAA,CAAQ,eAAA,CAAgB,8BAAA,EAAgC,GAAG,CAAA;AAAA,QACnE;AAEA,QAAA,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,CAAK;AAAA,UACnB,KAAA,EAAO,4BAAA;AAAA,UACP,OAAA,EAAS,gEAAA;AAAA,UACT,IAAA,EAAM;AAAA,SACP,CAAA;AACD,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,MAAM,kBAAA,EAAoB;AAC5B,QAAA,IAAI,QAAQ,eAAA,EAAiB;AAC3B,UAAA,MAAM,OAAA,CAAQ,eAAA,CAAgB,yBAAA,EAA2B,GAAG,CAAA;AAAA,QAC9D;AAEA,QAAA,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,CAAK;AAAA,UACnB,KAAA,EAAO,iBAAA;AAAA,UACP,OAAA,EAAS,gEAAA;AAAA,UACT,IAAA,EAAM,iBAAA;AAAA,UACN,SAAA,EAAW,kBAAA;AAAA,UACX,WAAA,EAAa;AAAA,SACd,CAAA;AACD,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI;AAEF,MAAA,MAAM,YAAA,GAAe,MAAM,OAAA,CAAQ,UAAA,CAAW,oBAAA,CAAqB;AAAA,QACjE,SAAA,EAAW,YAAY,gBAAgB,CAAA;AAAA,QACvC,mBAAmB,cAAA,CAAe,SAAA;AAAA,QAClC,gBAAgB,OAAA,CAAQ,eAAA;AAAA,QACxB,eAAe,OAAA,CAAQ;AAAA,OACxB,CAAA;AAED,MAAA,IAAI,CAAC,aAAa,KAAA,EAAO;AAEvB,QAAA,IAAI,QAAQ,eAAA,EAAiB;AAC3B,UAAA,MAAM,OAAA,CAAQ,eAAA,CAAgB,YAAA,CAAa,KAAA,IAAS,iBAAiB,GAAG,CAAA;AAAA,QAC1E;AAEA,QAAA,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,CAAK;AAAA,UACnB,KAAA,EAAO,6BAAA;AAAA,UACP,OAAA,EAAS,aAAa,KAAA,IAAS,iBAAA;AAAA,UAC/B,IAAA,EAAM;AAAA,SACP,CAAA;AACD,QAAA;AAAA,MACF;AAGA,MAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,GAAA,EAAI,GAAI,gBAAA;AAGpC,MAAA,IAAI,cAAA;AAEJ,MAAA,IAAI,QAAQ,oBAAA,EAAsB;AAChC,QAAA,IAAI;AACF,UAAA,cAAA,GAAiB,MAAM,oBAAA;AAAA,YACrB,aAAa,OAAA,CAAS,SAAA;AAAA,YACtB,OAAA,CAAQ,WAAA;AAAA,YACR,OAAA,CAAQ;AAAA,WACV;AAAA,QACF,SAAS,aAAA,EAAe;AAGtB,UAAA,OAAA,CAAQ,IAAA,CAAK,4CAA4C,aAAa,CAAA;AAAA,QACxE;AAAA,MACF;AAGA,MAAA,GAAA,CAAI,WAAA,GAAc;AAAA,QAChB,SAAA,EAAW,gBAAA;AAAA,QACX,QAAA,EAAU,IAAA;AAAA,QACV,MAAA,EAAQ,aAAa,OAAA,CAAS,MAAA;AAAA,QAC9B,KAAA,EAAO,aAAa,OAAA,CAAS,KAAA;AAAA,QAC7B,cAAA;AAAA,QACA,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,MAAA,EAAQ;AAAA,OACV;AAGA,MAAA,IAAI,qBAAqB,cAAA,EAAgB;AACvC,QAAA,cAAA,CAAe,IAAI,gBAAgB,CAAA;AAAA,MACrC;AAGA,MAAA,IAAI,OAAA,CAAQ,oBAAA,IAAwB,OAAA,CAAQ,OAAA,EAAS;AACnD,QAAA,IAAI;AAaF,UAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,+CAAA,EAAkD,OAAA,CAAQ,OAAO,CAAA,CAAE,CAAA;AAAA,QACjF,SAAS,eAAA,EAAiB;AAGxB,UAAA,IAAI,OAAA,CAAQ,wBAAA,IAA4B,eAAA,YAA2B,KAAA,EAAO;AACxE,YAAA,OAAA,CAAQ,yBAAyB,eAAe,CAAA;AAAA,UAClD,CAAA,MAAO;AACL,YAAA,OAAA,CAAQ,KAAA,CAAM,6CAA6C,eAAe,CAAA;AAAA,UAC5E;AAAA,QAEF;AAAA,MACF;AAEA,MAAA,IAAI,QAAQ,iBAAA,EAAmB;AAC7B,QAAA,MAAM,OAAA,CAAQ,iBAAA,CAAkB,gBAAA,EAAkB,GAAG,CAAA;AAAA,MACvD;AAGA,MAAA,IAAA,EAAK;AAAA,IACP,SAAS,KAAA,EAAO;AAEd,MAAA,MAAM,YAAA,GAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AAE9D,MAAA,IAAI,QAAQ,eAAA,EAAiB;AAC3B,QAAA,MAAM,OAAA,CAAQ,eAAA,CAAgB,YAAA,EAAc,GAAG,CAAA;AAAA,MACjD;AAEA,MAAA,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,CAAK;AAAA,QACnB,KAAA,EAAO,4BAAA;AAAA,QACP,OAAA,EAAS,YAAA;AAAA,QACT,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH;AAAA,EACF,CAAA;AACF;AAwBO,SAAS,iBAAA,CACd,SACA,OAAA,EAQA;AACA,EAAA,OAAA,CAAQ,OAAA,CAAQ,YAAA,EAAc,OAAO,OAAA,EAA6B,KAAA,KAAwB;AACxF,IAAA,MAAM,QAAQ,OAAA,CAAQ,GAAA,GAAM,QAAQ,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,GAAI,MAAA;AAE1D,IAAA,IAAI,CAAC,KAAA,EAAO;AAEV,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,gBAAA,GAAmB,OAAA,CAAQ,OAAA,CAAQ,qBAAqB,CAAA;AAG9D,IAAA,MAAM,cAAA,GAAiB,OAAA,CAAQ,UAAA,CAAW,oBAAA,CAAqB;AAAA,MAC7D,QAAQ,KAAA,CAAM,OAAA;AAAA,MACd,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,aAAa,KAAA,CAAM;AAAA,KACpB,CAAA;AAED,IAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,MAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,UAAA,CAAW,oBAAA,CAAqB,cAAc,CAAA;AAEtE,MAAA,KAAA,CAAM,KAAK,GAAG,CAAA,CAAE,OAAA,CAAQ,OAA4C,EAAE,IAAA,CAAK;AAAA,QACzE,KAAA,EAAO,kBAAA;AAAA,QACP,cAAA,EAAgB;AAAA,UACd,SAAS,cAAA,CAAe,SAAA;AAAA,UACxB,MAAA,EAAQ,cAAA,CAAe,MAAA,CAAO,QAAA,EAAS;AAAA,UACvC,OAAO,cAAA,CAAe;AAAA;AACxB,OACD,CAAA;AACD,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,YAAA,GAAe,MAAM,OAAA,CAAQ,UAAA,CAAW,oBAAA,CAAqB;AAAA,MACjE,SAAA,EAAW,YAAY,gBAAgB,CAAA;AAAA,MACvC,mBAAmB,cAAA,CAAe,SAAA;AAAA,MAClC,gBAAgB,KAAA,CAAM,OAAA;AAAA,MACtB,eAAe,KAAA,CAAM;AAAA,KACtB,CAAA;AAED,IAAA,IAAI,CAAC,aAAa,KAAA,EAAO;AACvB,MAAA,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA,CAAE,IAAA,CAAK;AAAA,QACnB,KAAA,EAAO,6BAAA;AAAA,QACP,SAAS,YAAA,CAAa;AAAA,OACvB,CAAA;AACD,MAAA;AAAA,IACF;AAGA,IAAA,OAAA,CAAQ,WAAA,GAAc;AAAA,MACpB,SAAA,EAAW,gBAAA;AAAA,MACX,QAAA,EAAU,IAAA;AAAA,MACV,MAAA,EAAQ,aAAa,OAAA,CAAS,MAAA;AAAA,MAC9B,KAAA,EAAO,aAAa,OAAA,CAAS;AAAA,KAC/B;AAAA,EACF,CAAC,CAAA;AACH;AAMA,SAAS,YAAA,CACP,KACA,OAAA,EACS;AAET,EAAA,MAAM,aAAA,GAAgB,GAAA,CAAI,OAAA,CAAQ,kBAAkB,CAAA;AAEpD,EAAA,IAAI,aAAA,IAAiB,QAAQ,eAAA,EAAiB;AAC5C,IAAA,OAAO,OAAA,CAAQ,eAAA,CAAgB,QAAA,CAAS,aAAwB,CAAA;AAAA,EAClE;AAEA,EAAA,OAAO,KAAA;AACT;AAaA,eAAe,oBAAA,CACb,aAAA,EACA,WAAA,EACA,SAAA,EAC6B;AAC7B,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,SAAA;AAAA,MACN,OAAA,EAAS;AAAA,KACX;AAAA,EACF;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAMF,gBAAgB,WAAW,CAAA;AAGvC,IAAA,MAAM,UAAA,GAAa,MAAM,eAAA,CAAgB,GAAA,EAAK,aAAa,CAAA;AAE3D,IAAA,IAAI,CAAC,WAAW,MAAA,EAAQ;AACtB,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,SAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACX;AAAA,IACF;AAEA,IAAA,MAAM,QAAQ,UAAA,CAAW,IAAA;AAEzB,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,OAAA;AAAA,MACN,OAAA,EAAS,aAAA;AAAA,MACT,KAAA,EAAO;AAAA,QACL,MAAM,KAAA,CAAM,IAAA;AAAA,QACZ,OAAO,KAAA,CAAM,KAAA;AAAA,QACb,kBAAkB,KAAA,CAAM,eAAA;AAAA,QACxB,aAAa,KAAA,CAAM,UAAA;AAAA,QACnB,cAAc,KAAA,CAAM,YAAA;AAAA,QACpB,kBAAkB,KAAA,CAAM,eAAA;AAAA,QACxB,YAAA,EAAc;AAAA;AAAA;AAChB,KACF;AAAA,EACF,SAAS,KAAA,EAAO;AAEd,IAAA,OAAA,CAAQ,IAAA,CAAK,+BAA+B,KAAK,CAAA;AACjD,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,SAAA;AAAA,MACN,OAAA,EAAS;AAAA,KACX;AAAA,EACF;AACF;AASO,SAAS,kBAAkB,OAAA,EAG/B;AACD,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAsB;AAE3C,EAAA,OAAO,CACL,MAAA,EACA,WAAA,EACA,UAAA,KACG;AACH,IAAA,MAAM,iBAAiB,UAAA,CAAW,KAAA;AAElC,IAAA,UAAA,CAAW,KAAA,GAAQ,kBAAmB,IAAA,EAAa;AACjD,MAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,MAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAGlB,MAAA,MAAM,YAAA,GAAe,GAAA,CAAI,OAAA,CAAQ,iBAAiB,CAAA;AAClD,MAAA,MAAM,QAAA,GAAW,YAAA,EAAc,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,EAAG,IAAA,EAAK,IAAK,GAAA,CAAI,EAAA,IAAM,SAAA;AAClE,MAAA,MAAM,QAAA,GAAW,GAAA,CAAI,WAAA,EAAa,SAAA,IAAa,QAAA;AAC/C,MAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAGrB,MAAA,MAAM,YAAA,GAAe,QAAA,CAAS,GAAA,CAAI,QAAQ,KAAK,EAAC;AAChD,MAAA,MAAM,iBAAiB,YAAA,CAAa,MAAA;AAAA,QAClC,CAAA,SAAA,KAAa,MAAM,SAAA,GAAY;AAAA,OACjC;AAGA,MAAA,IAAI,cAAA,CAAe,MAAA,IAAU,OAAA,CAAQ,oBAAA,EAAsB;AACzD,QAAA,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,CAAK;AAAA,UACnB,KAAA,EAAO,qBAAA;AAAA,UACP,OAAA,EAAS,CAAA,QAAA,EAAW,OAAA,CAAQ,oBAAoB,CAAA,oBAAA,CAAA;AAAA,UAChD,eAAA,EAAiB,OAAA,CAAQ,eAAA,CAAgB,QAAA;AAAS,SACnD,CAAA;AACD,QAAA;AAAA,MACF;AAGA,MAAA,cAAA,CAAe,KAAK,GAAG,CAAA;AACvB,MAAA,QAAA,CAAS,GAAA,CAAI,UAAU,cAAc,CAAA;AAGrC,MAAA,OAAO,cAAA,CAAe,KAAA,CAAM,IAAA,EAAM,IAAI,CAAA;AAAA,IACxC,CAAA;AAAA,EACF,CAAA;AACF;;;AC1XO,SAAS,2BACd,GAAA,EAC2F;AAC3F,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,CAAA,GAAI,GAAA;AAEV,EAAA,IAAI,CAAC,CAAA,IAAK,OAAO,CAAA,KAAM,QAAA,EAAU;AAC/B,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,CAAC,uCAAuC,CAAA,EAAE;AAAA,EAC3E;AAGA,EAAA,IAAI,CAAC,CAAA,CAAE,OAAA,IAAW,OAAO,CAAA,CAAE,YAAY,QAAA,EAAU;AAC/C,IAAA,MAAA,CAAO,KAAK,oCAAoC,CAAA;AAAA,EAClD;AAEA,EAAA,IAAI,CAAC,EAAE,iBAAA,IAAqB,CAAC,EAAE,mBAAA,IAAuB,CAAC,EAAE,MAAA,EAAQ;AAC/D,IAAA,MAAA,CAAO,KAAK,mCAAmC,CAAA;AAAA,EACjD;AAEA,EAAA,IAAI,CAAC,EAAE,KAAA,IAAS,CAAC,EAAE,MAAA,IAAU,CAAC,EAAE,SAAA,EAAW;AACzC,IAAA,MAAA,CAAO,KAAK,uBAAuB,CAAA;AAAA,EACrC;AAEA,EAAA,IAAI,CAAC,CAAA,CAAE,KAAA,IAAS,CAAC,EAAE,KAAA,EAAO;AACxB,IAAA,MAAA,CAAO,KAAK,uBAAuB,CAAA;AAAA,EACrC;AAEA,EAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,MAAA,EAAO;AAAA,EAChC;AAGA,EAAA,MAAM,WAAA,GAAsC;AAAA,IAC1C,MAAA,EAAS,EAAE,MAAA,IAAU,OAAA;AAAA,IACrB,OAAA,EAAU,CAAA,CAAE,OAAA,IAAW,CAAA,CAAE,KAAA;AAAA,IACzB,mBAAmB,MAAA,CAAO,CAAA,CAAE,qBAAqB,CAAA,CAAE,mBAAA,IAAuB,EAAE,MAAM,CAAA;AAAA,IAClF,UAAU,CAAA,CAAE,QAAA;AAAA,IACZ,aAAa,CAAA,CAAE,WAAA;AAAA,IACf,QAAA,EAAW,CAAA,CAAE,QAAA,IAAY,CAAA,CAAE,SAAA;AAAA,IAC3B,OAAO,MAAA,CAAO,CAAA,CAAE,SAAS,CAAA,CAAE,MAAA,IAAU,EAAE,SAAS,CAAA;AAAA,IAChD,iBAAA,EAAoB,CAAA,CAAE,iBAAA,IAAqB,CAAA,CAAE,mBAAA;AAAA,IAC7C,KAAA,EAAO,MAAA,CAAO,CAAA,CAAE,KAAA,IAAS,EAAE,KAAK,CAAA;AAAA,IAChC,OAAO,CAAA,CAAE;AAAA,GACX;AAEA,EAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,WAAA,EAAY;AACpC;AAKO,SAAS,qBACd,QAAA,EACsF;AACtF,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,CAAA,GAAI,QAAA;AAEV,EAAA,IAAI,CAAC,CAAA,IAAK,OAAO,CAAA,KAAM,QAAA,EAAU;AAC/B,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,CAAC,4BAA4B,CAAA,EAAE;AAAA,EAChE;AAGA,EAAA,MAAM,OAAA,GAAU,CAAA,CAAE,WAAA,IAAe,CAAA,CAAE,YAAA;AACnC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAA,CAAO,KAAK,6BAA6B,CAAA;AAAA,EAC3C;AAGA,EAAA,MAAM,OAAA,GAAU,CAAA,CAAE,OAAA,IAAW,CAAA,CAAE,oBAAA;AAC/B,EAAA,IAAI,CAAC,OAAA,IAAW,CAAC,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AACvC,IAAA,MAAA,CAAO,KAAK,oCAAoC,CAAA;AAAA,EAClD,CAAA,MAAA,IAAW,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AAC/B,IAAA,MAAA,CAAO,KAAK,mCAAmC,CAAA;AAAA,EACjD,CAAA,MAAO;AAEL,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACvC,MAAA,MAAM,MAAA,GAAS,0BAAA,CAA2B,OAAA,CAAQ,CAAC,CAAC,CAAA;AACpD,MAAA,IAAI,CAAC,OAAO,KAAA,EAAO;AACjB,QAAA,MAAA,CAAO,IAAA,CAAK,WAAW,CAAC,CAAA,GAAA,EAAM,OAAO,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,MAC1D;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,MAAA,EAAO;AAAA,EAChC;AAGA,EAAA,MAAM,QAAA,GAAiC;AAAA,IACrC,WAAA,EAAa,KAAA;AAAA,IACb,OAAA,EAAU,OAAA,CAAsB,GAAA,CAAI,CAAA,CAAA,KAAK;AACvC,MAAA,MAAM,MAAA,GAAS,2BAA2B,CAAC,CAAA;AAC3C,MAAA,OAAO,MAAA,CAAO,KAAA,GAAQ,MAAA,CAAO,WAAA,GAAe,EAAC;AAAA,IAC/C,CAAC,CAAA;AAAA,IACD,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,WAAA,EAAc,CAAA,CAAE,WAAA,IAAe,CAAA,CAAE,YAAA;AAAA,IACjC,YAAA,EAAe,CAAA,CAAE,YAAA,IAAgB,CAAA,CAAE,aAAA;AAAA,IACnC,aAAa,CAAA,CAAE,WAAA;AAAA,IACf,MAAM,CAAA,CAAE,IAAA;AAAA,IACR,MAAM,CAAA,CAAE,IAAA;AAAA,IACR,UAAU,CAAA,CAAE,QAAA;AAAA,IACZ,UAAU,CAAA,CAAE,QAAA;AAAA,IACZ,UAAA,EAAa,CAAA,CAAE,UAAA,IAAc,CAAA,CAAE,WAAA;AAAA,IAC/B,SAAS,CAAA,CAAE,OAAA;AAAA,IACX,SAAA,EAAY,CAAA,CAAE,SAAA,IAAa,CAAA,CAAE,UAAA;AAAA,IAC7B,YAAA,EAAe,CAAA,CAAE,YAAA,IAAgB,CAAA,CAAE,aAAA;AAAA,IACnC,KAAK,CAAA,CAAE,GAAA;AAAA,IACP,QAAA,EAAW,CAAA,CAAE,QAAA,IAAY,CAAA,CAAE,SAAA;AAAA,IAC3B,UAAA,EAAa,CAAA,CAAE,UAAA,IAAc,CAAA,CAAE,WAAA;AAAA,IAC/B,OAAA,EAAU,CAAA,CAAE,OAAA,IAAW,CAAA,CAAE,QAAA;AAAA,IACzB,SAAS,CAAA,CAAE;AAAA,GACb;AAEA,EAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,QAAA,EAAU,QAAA,EAAS;AAC3C;AAKO,SAAS,kBACd,IAAA,EACsF;AACtF,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC9B,IAAA,OAAO,qBAAqB,MAAM,CAAA;AAAA,EACpC,SAAS,KAAA,EAAO;AACd,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,MAAA,EAAQ,CAAC,CAAA,sBAAA,EAAyB,KAAA,YAAiB,QAAQ,KAAA,CAAM,OAAA,GAAU,eAAe,CAAA,CAAE;AAAA,KAC9F;AAAA,EACF;AACF;ACtUO,IAAM,sBAAA,GAAN,cAAqCG,YAAAA,CAAa;AAAA,EACtC,MAAA;AAAA,EACA,mBAAA;AAAA,EACA,UAAA;AAAA,EACA,gBAAA;AAAA,EACA,cAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EAEjB,YAAY,OAAA,EAAwC;AAClD,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AACtB,IAAA,IAAA,CAAK,sBAAsB,OAAA,CAAQ,mBAAA;AACnC,IAAA,IAAA,CAAK,UAAA,GAAa,OAAA,CAAQ,UAAA,IAAc,MAAA,CAAO,YAAY,CAAA;AAC3D,IAAA,IAAA,CAAK,mBAAmB,OAAA,CAAQ,gBAAA;AAChC,IAAA,IAAA,CAAK,iBAAiB,OAAA,CAAQ,cAAA;AAC9B,IAAA,IAAA,CAAK,OAAA,GAAU,QAAQ,OAAA,IAAW,GAAA;AAClC,IAAA,IAAA,CAAK,OAAA,GAAU,QAAQ,OAAA,IAAW,CAAA;AAClC,IAAA,IAAA,CAAK,SAAA,GAAY,QAAQ,SAAA,IAAa,2BAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAA,CAAM,GAAA,EAAa,OAAA,EAA0D;AACjF,IAAA,MAAM,aAAA,GAAyC;AAAA,MAC7C,GAAG,OAAA;AAAA,MACH,UAAA,EAAY,OAAA,EAAS,UAAA,IAAc,IAAA,CAAK,UAAA;AAAA,MACxC,gBAAA,EAAkB,OAAA,EAAS,gBAAA,IAAoB,IAAA,CAAK,gBAAA;AAAA,MACpD,cAAA,EAAgB,OAAA,EAAS,cAAA,IAAkB,IAAA,CAAK,cAAA;AAAA,MAChD,OAAA,EAAS,OAAA,EAAS,OAAA,IAAW,IAAA,CAAK,OAAA;AAAA,MAClC,OAAA,EAAS,OAAA,EAAS,OAAA,IAAW,IAAA,CAAK;AAAA,KACpC;AAEA,IAAA,OAAO,IAAA,CAAK,gBAAA,CAAiB,GAAA,EAAK,aAAa,CAAA;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,gBAAA,CACZ,GAAA,EACA,OAAA,EACuB;AACvB,IAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAQ,OAAA,CAAQ,OAAO,CAAA;AAC3C,IAAA,OAAA,CAAQ,GAAA,CAAI,YAAA,EAAc,IAAA,CAAK,SAAS,CAAA;AAGxC,IAAA,MAAM,eAAA,GAAkB,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,MACvC,GAAG,OAAA;AAAA,MACH,OAAA;AAAA,MACA,QAAQ,OAAA,CAAQ,OAAA,GAAU,YAAY,OAAA,CAAQ,OAAA,CAAQ,OAAO,CAAA,GAAI;AAAA,KAClE,CAAA;AAGD,IAAA,IAAI,eAAA,CAAgB,WAAW,GAAA,EAAK;AAClC,MAAA,OAAO,eAAA;AAAA,IACT;AAGA,IAAA,MAAM,IAAA,GAAO,MAAM,eAAA,CAAgB,IAAA,EAAK;AACxC,IAAA,MAAM,WAAA,GAAc,kBAAkB,IAAI,CAAA;AAE1C,IAAA,IAAI,CAAC,YAAY,KAAA,EAAO;AACtB,MAAA,MAAM,aAAA,GAAgB,IAAI,QAAA,CAAS,IAAA,EAAM;AAAA,QACvC,MAAA,EAAQ,GAAA;AAAA,QACR,UAAA,EAAY,0CAAA;AAAA,QACZ,SAAS,eAAA,CAAgB;AAAA,OAC1B,CAAA;AACD,MAAA,aAAA,CAAc,mBAAmB,EAAC;AAClC,MAAA,OAAO,aAAA;AAAA,IACT;AAEA,IAAA,MAAM,eAAe,WAAA,CAAY,QAAA;AAGjC,IAAA,IAAA,CAAK,IAAA,CAAK,iBAAA,EAAmB,YAAA,CAAa,OAAO,CAAA;AACjD,IAAA,OAAA,CAAQ,iBAAA,GAAoB,aAAa,OAAO,CAAA;AAGhD,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,MAAM,cAAA,GAAiB,IAAI,QAAA,CAAS,IAAA,EAAM;AAAA,QACxC,MAAA,EAAQ,GAAA;AAAA,QACR,UAAA,EAAY,kBAAA;AAAA,QACZ,SAAS,eAAA,CAAgB;AAAA,OAC1B,CAAA;AACD,MAAA,cAAA,CAAe,mBAAmB,YAAA,CAAa,OAAA;AAC/C,MAAA,OAAO,cAAA;AAAA,IACT;AAGA,IAAA,MAAM,sBAAsB,IAAA,CAAK,wBAAA;AAAA,MAC/B,YAAA,CAAa,OAAA;AAAA,MACb;AAAA,KACF;AAEA,IAAA,IAAI,CAAC,mBAAA,EAAqB;AACxB,MAAA,MAAM,IAAI,gBAAA;AAAA,QACR,2DAAA;AAAA,QACA,YAAA,CAAa;AAAA,OACf;AAAA,IACF;AAGA,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,mBAAA,CAAoB,iBAAiB,CAAA;AAC3D,IAAA,IAAI,MAAA,IAAU,OAAA,CAAQ,UAAA,IAAc,IAAA,CAAK,UAAA,CAAA,EAAa;AACpD,MAAA,MAAM,IAAI,gBAAA;AAAA,QACR,kBAAkB,MAAM,CAAA,qBAAA,EAAwB,OAAA,CAAQ,UAAA,IAAc,KAAK,UAAU,CAAA,CAAA;AAAA,QACrF,YAAA,CAAa;AAAA,OACf;AAAA,IACF;AAGA,IAAA,IAAI,aAAA;AACJ,IAAA,IAAI;AACF,MAAA,aAAA,GAAgB,MAAM,IAAA,CAAK,mBAAA,CAAoB,mBAAA,EAAqB,KAAK,MAAM,CAAA;AAAA,IACjF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,gBAAA;AAAA,QACR,CAAA,iCAAA,EAAoC,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,UAAU,eAAe,CAAA,CAAA;AAAA,QAC5F,YAAA,CAAa;AAAA,OACf;AAAA,IACF;AAGA,IAAA,MAAM,YAAA,GAAe,IAAI,OAAA,CAAQ,OAAO,CAAA;AACxC,IAAA,YAAA,CAAa,GAAA,CAAI,aAAa,aAAa,CAAA;AAE3C,IAAA,KAAA,IAAS,UAAU,CAAA,EAAG,OAAA,KAAY,QAAQ,OAAA,IAAW,IAAA,CAAK,UAAU,OAAA,EAAA,EAAW;AAC7E,MAAA,IAAI;AACF,QAAA,MAAM,YAAA,GAAe,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,UACpC,GAAG,OAAA;AAAA,UACH,OAAA,EAAS,YAAA;AAAA,UACT,QAAQ,OAAA,CAAQ,OAAA,GAAU,YAAY,OAAA,CAAQ,OAAA,CAAQ,OAAO,CAAA,GAAI,KAAA;AAAA,SAClE,CAAA;AAGD,QAAA,MAAM,WAAA,GAA2B;AAAA,UAC/B,WAAW,aAAA,CAAc,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,EAAA;AAAA,UAC1C,MAAA;AAAA,UACA,WAAW,mBAAA,CAAoB,KAAA;AAAA,UAC/B,OAAO,mBAAA,CAAoB,KAAA;AAAA,UAC3B,SAAS,mBAAA,CAAoB,OAAA;AAAA,UAC7B,SAAA,EAAW,KAAK,GAAA;AAAI,SACtB;AAEA,QAAA,MAAM,QAAA,GAAW,YAAA;AACjB,QAAA,QAAA,CAAS,WAAA,GAAc,WAAA;AACvB,QAAA,QAAA,CAAS,mBAAmB,YAAA,CAAa,OAAA;AAGzC,QAAA,IAAA,CAAK,IAAA,CAAK,WAAW,WAAW,CAAA;AAChC,QAAA,OAAA,CAAQ,YAAY,WAAW,CAAA;AAE/B,QAAA,OAAO,QAAA;AAAA,MACT,SAAS,KAAA,EAAO;AACd,QAAA,IAAI,OAAA,MAAa,OAAA,CAAQ,OAAA,IAAW,IAAA,CAAK,OAAA,CAAA,EAAU;AACjD,UAAA,MAAM,KAAA;AAAA,QACR;AAEA,QAAA,MAAM,IAAI,QAAQ,CAAA,OAAA,KAAW,UAAA,CAAW,SAAS,GAAA,IAAQ,OAAA,GAAU,EAAE,CAAC,CAAA;AAAA,MACxE;AAAA,IACF;AAEA,IAAA,MAAM,IAAI,MAAM,kDAAkD,CAAA;AAAA,EACpE;AAAA;AAAA;AAAA;AAAA,EAKQ,wBAAA,CACN,SACA,OAAA,EAC+B;AAC/B,IAAA,IAAI,UAAA,GAAa,CAAC,GAAG,OAAO,CAAA;AAG5B,IAAA,IAAI,QAAQ,gBAAA,EAAkB;AAC5B,MAAA,MAAM,iBAAiB,UAAA,CAAW,MAAA;AAAA,QAChC,CAAA,CAAA,KAAK,CAAA,CAAE,OAAA,KAAY,OAAA,CAAQ;AAAA,OAC7B;AACA,MAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAC7B,QAAA,UAAA,GAAa,cAAA;AAAA,MACf;AAAA,IACF;AAGA,IAAA,IAAI,QAAQ,cAAA,EAAgB;AAC1B,MAAA,MAAM,eAAe,UAAA,CAAW,MAAA;AAAA,QAC9B,OAAK,CAAA,CAAE,KAAA,CAAM,aAAY,KAAM,OAAA,CAAQ,eAAgB,WAAA;AAAY,OACrE;AACA,MAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AAC3B,QAAA,UAAA,GAAa,YAAA;AAAA,MACf;AAAA,IACF;AAGA,IAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,UAAA,IAAc,IAAA,CAAK,UAAA;AAC9C,IAAA,UAAA,GAAa,WAAW,MAAA,CAAO,CAAA,CAAA,KAAK,OAAO,CAAA,CAAE,iBAAiB,KAAK,UAAU,CAAA;AAE7E,IAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,OAAO,UAAA,CAAW,IAAA;AAAA,MAChB,CAAC,CAAA,EAAG,CAAA,KAAM,MAAA,CAAO,MAAA,CAAO,CAAA,CAAE,iBAAiB,CAAA,GAAI,MAAA,CAAO,CAAA,CAAE,iBAAiB,CAAC;AAAA,MAC1E,CAAC,CAAA;AAAA,EACL;AACF;AASO,IAAM,gBAAA,GAAN,cAA+B,KAAA,CAAM;AAAA,EAC1C,WAAA,CACE,SACgB,YAAA,EAChB;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AAFG,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AAGhB,IAAA,IAAA,CAAK,IAAA,GAAO,kBAAA;AAAA,EACd;AACF,CAAA;AA8BA,eAAsB,oBAAA,CACpB,GAAA,EACA,OAAA,EACA,MAAA,EACA,qBACA,cAAA,EACuB;AACvB,EAAA,MAAM,MAAA,GAAS,IAAI,sBAAA,CAAuB;AAAA,IACxC,MAAA;AAAA,IACA,mBAAA;AAAA,IACA,YAAY,cAAA,EAAgB,UAAA;AAAA,IAC5B,kBAAkB,cAAA,EAAgB,gBAAA;AAAA,IAClC,gBAAgB,cAAA,EAAgB,cAAA;AAAA,IAChC,SAAS,cAAA,EAAgB,OAAA;AAAA,IACzB,SAAS,cAAA,EAAgB;AAAA,GAC1B,CAAA;AAED,EAAA,OAAO,MAAA,CAAO,MAAM,GAAA,EAAK;AAAA,IACvB,GAAG,OAAA;AAAA,IACH,GAAG;AAAA,GACJ,CAAA;AACH;AAqBO,SAAS,oBAAA,CACd,MAAA,EACA,mBAAA,EACA,cAAA,EAC2E;AAC3E,EAAA,MAAM,MAAA,GAAS,IAAI,sBAAA,CAAuB;AAAA,IACxC,MAAA;AAAA,IACA,mBAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AAED,EAAA,OAAO,CAAC,GAAA,EAAa,OAAA,KAAsC,MAAA,CAAO,KAAA,CAAM,KAAK,OAAO,CAAA;AACtF;ACnUO,IAAM,oBAAA,GAAN,cAAmCA,YAAAA,CAAa;AAAA,EAYrD,WAAA,CAAoB,OAAA,GAAgC,EAAC,EAAG;AACtD,IAAA,KAAA,EAAM;AADY,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EAEpB;AAAA,EAbQ,gBAAoC,EAAC;AAAA,EACrC,aAAA,uBAA0C,GAAA,EAAI;AAAA,EAC9C,eAAA,uBAA4C,GAAA,EAAI;AAAA,EAChD,YAAA,uBAAyC,GAAA,EAAI;AAAA,EAC7C,YAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA;AAAA,EAGX,iBAAA;AAAA,EACA,mBAAA;AAAA;AAAA;AAAA;AAAA,EASR,KAAA,GAAc;AACZ,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,OAAA,CAAQ,KAAK,0CAA0C,CAAA;AACvD,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAGhB,IAAA,IAAI,IAAA,CAAK,QAAQ,eAAA,EAAiB;AAChC,MAAA,IAAA,CAAK,YAAA,GAAe,YAAY,MAAM;AACpC,QAAA,IAAA,CAAK,uBAAA,EAAwB;AAAA,MAC/B,CAAA,EAAG,IAAA,CAAK,OAAA,CAAQ,eAAe,CAAA;AAAA,IACjC;AAEA,IAAA,IAAA,CAAK,KAAK,SAAS,CAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAA,GAAa;AACX,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAEhB,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,aAAA,CAAc,KAAK,YAAY,CAAA;AAC/B,MAAA,IAAA,CAAK,YAAA,GAAe,MAAA;AAAA,IACtB;AAEA,IAAA,IAAA,CAAK,KAAK,SAAS,CAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,KAAA,EAA+B;AAC3C,IAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAGpB,IAAA,IAAA,CAAK,aAAA,CAAc,KAAK,KAAK,CAAA;AAG7B,IAAA,IAAI,KAAA,CAAM,KAAA,IAAS,KAAA,CAAM,MAAA,KAAW,WAAA,EAAa;AAC/C,MAAA,MAAM,kBAAkB,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,KAAA,CAAM,KAAK,CAAA,IAAK,EAAA;AAC/D,MAAA,IAAA,CAAK,cAAc,GAAA,CAAI,KAAA,CAAM,KAAA,EAAO,eAAA,GAAkB,MAAM,MAAM,CAAA;AAElE,MAAA,MAAM,eAAe,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,KAAA,CAAM,KAAK,CAAA,IAAK,CAAA;AAC9D,MAAA,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,KAAA,CAAM,KAAA,EAAO,eAAe,CAAC,CAAA;AAAA,IACxD;AAGA,IAAA,IAAI,KAAA,CAAM,WAAW,WAAA,EAAa;AAChC,MAAA,MAAM,gBAAgB,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,KAAA,CAAM,KAAK,CAAA,IAAK,EAAA;AAC5D,MAAA,IAAA,CAAK,aAAa,GAAA,CAAI,KAAA,CAAM,KAAA,EAAO,aAAA,GAAgB,MAAM,MAAM,CAAA;AAAA,IACjE;AAGA,IAAA,IAAA,CAAK,IAAA,CAAK,WAAW,KAAK,CAAA;AAC1B,IAAA,IAAI,IAAA,CAAK,QAAQ,SAAA,EAAW;AAC1B,MAAA,IAAA,CAAK,OAAA,CAAQ,UAAU,KAAK,CAAA;AAAA,IAC9B;AAGA,IAAA,IAAA,CAAK,cAAA,EAAe;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,0BAAA,CACJ,SAAA,EACA,OACA,SAAA,EACA,MAAA,EACA,OACA,KAAA,EACe;AACf,IAAA,MAAM,KAAA,GAA0B;AAAA,MAC9B,SAAA;AAAA,MACA,SAAA,EAAW,MAAA,CAAO,IAAA,CAAK,GAAA,EAAK,CAAA;AAAA,MAC5B,KAAA;AAAA,MACA,SAAA;AAAA,MACA,MAAA;AAAA,MACA,KAAA;AAAA,MACA,KAAA;AAAA,MACA,MAAA,EAAQ;AAAA,KACV;AAEA,IAAA,IAAA,CAAK,cAAc,KAAK,CAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAA,CACE,SAAA,EACA,MAAA,EACA,QAAA,EACM;AACN,IAAA,MAAM,QAAQ,IAAA,CAAK,aAAA,CAAc,KAAK,CAAA,CAAA,KAAK,CAAA,CAAE,cAAc,SAAS,CAAA;AACpE,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,KAAA,CAAM,MAAA,GAAS,MAAA;AACf,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,KAAA,CAAM,WAAW,EAAE,GAAG,KAAA,CAAM,QAAA,EAAU,GAAG,QAAA,EAAS;AAAA,MACpD;AAEA,MAAA,IAAA,CAAK,IAAA,CAAK,wBAAwB,KAAK,CAAA;AAAA,IACzC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,aAAA,EAAgD;AACzD,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,IAAA,CAAK,GAAA,EAAK,CAAA;AAC7B,IAAA,MAAM,SAAA,GAAY,gBACd,GAAA,GAAM,MAAA,CAAO,gBAAgB,GAAI,CAAA,GACjC,KAAK,uBAAA,EAAwB;AAGjC,IAAA,MAAM,eAAe,IAAA,CAAK,aAAA,CAAc,OAAO,CAAA,CAAA,KAAK,CAAA,CAAE,aAAa,SAAS,CAAA;AAG5E,IAAA,MAAM,QAAQ,YAAA,CAAa,MAAA;AAC3B,IAAA,MAAM,aAAa,YAAA,CAAa,MAAA,CAAO,OAAK,CAAA,CAAE,MAAA,KAAW,WAAW,CAAA,CAAE,MAAA;AACtE,IAAA,MAAM,SAAS,YAAA,CAAa,MAAA,CAAO,OAAK,CAAA,CAAE,MAAA,KAAW,QAAQ,CAAA,CAAE,MAAA;AAC/D,IAAA,MAAM,UAAU,YAAA,CAAa,MAAA,CAAO,OAAK,CAAA,CAAE,MAAA,KAAW,SAAS,CAAA,CAAE,MAAA;AAGjE,IAAA,MAAM,mBAAmB,YAAA,CAAa,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,WAAW,WAAW,CAAA;AAC1E,IAAA,MAAM,WAAA,GAAc,iBAAiB,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,MAAA,EAAQ,EAAE,CAAA;AAC1E,IAAA,MAAM,gBAAgB,UAAA,GAAa,CAAA,GAAI,WAAA,GAAc,MAAA,CAAO,UAAU,CAAA,GAAI,EAAA;AAG1E,IAAA,MAAM,aAAA,uBAAoB,GAAA,EAAqB;AAC/C,IAAA,KAAA,MAAW,SAAS,gBAAA,EAAkB;AACpC,MAAA,MAAM,OAAA,GAAU,aAAA,CAAc,GAAA,CAAI,KAAA,CAAM,KAAK,CAAA,IAAK,EAAA;AAClD,MAAA,aAAA,CAAc,GAAA,CAAI,KAAA,CAAM,KAAA,EAAO,OAAA,GAAU,MAAM,MAAM,CAAA;AAAA,IACvD;AAGA,IAAA,MAAM,eAAe,IAAI,GAAA;AAAA,MACvB,YAAA,CAAa,OAAO,CAAA,CAAA,KAAK,CAAA,CAAE,KAAK,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,KAAM;AAAA,KACrD;AAGA,IAAA,MAAM,UAAA,GAAa,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,aAAA,CAAc,OAAA,EAAS,CAAA,CACvD,GAAA,CAAI,CAAC,CAAC,KAAA,EAAO,QAAQ,CAAA,MAAO;AAAA,MAC3B,KAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA,EAAW,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,KAAK,CAAA,IAAK;AAAA,KAChD,CAAE,CAAA,CACD,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,MAAA,CAAO,CAAA,CAAE,QAAA,GAAW,EAAE,QAAQ,CAAC,CAAA,CAC9C,KAAA,CAAM,GAAG,EAAE,CAAA;AAGd,IAAA,MAAM,kBAAkB,YAAA,CAAa,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,WAAW,WAAW,CAAA;AACzE,IAAA,MAAM,iBAAA,GAAoB,eAAA,CACvB,GAAA,CAAI,CAAA,CAAA,KAAK,OAAO,CAAA,CAAE,QAAA,EAAU,gBAAA,IAAoB,CAAC,CAAC,CAAA,CAClD,MAAA,CAAO,CAAA,CAAA,KAAK,IAAI,CAAC,CAAA;AAEpB,IAAA,MAAM,uBAAA,GAA0B,iBAAA,CAAkB,MAAA,GAAS,CAAA,GACvD,kBAAkB,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA,GAAI,kBAAkB,MAAA,GACjE,CAAA;AAGJ,IAAA,MAAM,WAAA,GAAc,KAAA,GAAQ,CAAA,GAAK,UAAA,GAAa,QAAS,GAAA,GAAM,CAAA;AAC7D,IAAA,MAAM,SAAA,GAAY,KAAA,GAAQ,CAAA,GAAK,MAAA,GAAS,QAAS,GAAA,GAAM,CAAA;AAEvD,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ;AAAA,QACN,KAAA,EAAO,SAAA;AAAA,QACP,GAAA,EAAK;AAAA,OACP;AAAA,MACA,QAAA,EAAU;AAAA,QACR,KAAA;AAAA,QACA,UAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,MAAA,EAAQ;AAAA,QACN,KAAA,EAAO,WAAA;AAAA,QACP,OAAA,EAAS,aAAA;AAAA,QACT,OAAA,EAAS;AAAA,OACX;AAAA,MACA,MAAA,EAAQ;AAAA,QACN,aAAa,YAAA,CAAa,IAAA;AAAA,QAC1B;AAAA,OACF;AAAA,MACA,WAAA,EAAa;AAAA,QACX,uBAAA;AAAA,QACA,WAAA;AAAA,QACA;AAAA;AACF,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,KAAA,EAIf;AACA,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,KAAK,CAAA,IAAK,EAAA;AACvD,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,KAAK,CAAA,IAAK,CAAA;AACtD,IAAA,MAAM,iBAAiB,UAAA,GAAa,CAAA,GAAI,aAAA,GAAgB,MAAA,CAAO,UAAU,CAAA,GAAI,EAAA;AAE7E,IAAA,OAAO;AAAA,MACL,aAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,KAAA,EAAwB;AACrC,IAAA,OAAO,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,KAAK,CAAA,IAAK,EAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,sBAAA,CACE,OACA,KAAA,EACoB;AACpB,IAAA,MAAM,cAAc,IAAA,CAAK,aAAA,CACtB,OAAO,CAAA,CAAA,KAAK,CAAA,CAAE,UAAU,KAAK,CAAA,CAC7B,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,MAAA,CAAO,EAAE,SAAA,GAAY,CAAA,CAAE,SAAS,CAAC,CAAA;AAEnD,IAAA,OAAO,KAAA,GAAQ,WAAA,CAAY,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA,GAAI,WAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAA,CAAkB,QAAQ,GAAA,EAAyB;AACjD,IAAA,OAAO,IAAA,CAAK,aAAA,CACT,KAAA,CAAM,CAAC,KAAK,CAAA,CACZ,IAAA,CAAK,CAAC,CAAA,EAAG,MAAM,MAAA,CAAO,CAAA,CAAE,SAAA,GAAY,CAAA,CAAE,SAAS,CAAC,CAAA;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA,EAKA,sBAAsB,QAAA,EAAmC;AACvD,IAAA,IAAA,CAAK,iBAAA,GAAoB,QAAA;AAGzB,IAAA,QAAA,CAAS,EAAA,CAAG,sBAAA,EAAwB,CAAC,KAAA,KAAqC;AAExE,MAAA,IAAI,IAAA,CAAK,iBAAA,CAAkB,KAAK,CAAA,EAAG;AACjC,QAAA,IAAA,CAAK,gCAAgC,KAAK,CAAA;AAAA,MAC5C;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,wBAAwB,UAAA,EAAuC;AAC7D,IAAA,IAAA,CAAK,mBAAA,GAAsB,UAAA;AAG3B,IAAA,IAAA,CAAK,EAAA,CAAG,SAAA,EAAW,CAAC,KAAA,KAA4B;AAC9C,MAAA,IAAI,KAAA,CAAM,MAAA,KAAW,WAAA,IAAe,IAAA,CAAK,mBAAA,EAAqB;AAE5D,QAAA,MAAM,OAAA,GAAqC;AAAA,UACzC,eAAA,EAAiB,cAAA;AAAA,UACjB,QAAQ,KAAA,CAAM,MAAA;AAAA,UACd,MAAM,KAAA,CAAM,KAAA;AAAA,UACZ,IAAI,KAAA,CAAM,SAAA;AAAA,UACV,MAAA,EAAQ,WAAA;AAAA,UACR,SAAA,EAAW,MAAA,CAAO,KAAA,CAAM,SAAS,CAAA;AAAA,UACjC,WAAA,EAAa;AAAA;AAAA,SACf;AAEA,QAAA,IAAA,CAAK,mBAAA,CAAoB,wBAAwB,OAAO,CAAA;AAAA,MAC1D;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAA,GAAiD;AAC/C,IAAA,OAAO,IAAA,CAAK,mBAAA,EAAqB,SAAA,EAAU,IAAK,IAAA;AAAA,EAClD;AAAA;AAAA,EAIQ,uBAAA,GAAgC;AACtC,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,KAAK,UAAA,EAAW;AAChC,MAAA,IAAA,CAAK,IAAA,CAAK,WAAW,OAAO,CAAA;AAE5B,MAAA,IAAI,IAAA,CAAK,QAAQ,SAAA,EAAW;AAC1B,QAAA,IAAA,CAAK,OAAA,CAAQ,UAAU,OAAO,CAAA;AAAA,MAChC;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,YAAY,KAAc,CAAA;AAAA,IACjC;AAAA,EACF;AAAA,EAEQ,cAAA,GAAuB;AAC7B,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,eAAA,EAAiB;AAEnC,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,IAAA,CAAK,GAAA,EAAK,IAAI,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,eAAA,GAAkB,GAAI,CAAA;AAClF,IAAA,IAAA,CAAK,gBAAgB,IAAA,CAAK,aAAA,CAAc,OAAO,CAAA,CAAA,KAAK,CAAA,CAAE,YAAY,UAAU,CAAA;AAAA,EAC9E;AAAA,EAEQ,uBAAA,GAAkC;AACxC,IAAA,IAAI,IAAA,CAAK,aAAA,CAAc,MAAA,KAAW,CAAA,EAAG;AACnC,MAAA,OAAO,MAAA,CAAO,IAAA,CAAK,GAAA,EAAK,CAAA;AAAA,IAC1B;AACA,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,CAAC,CAAA,CAAE,SAAA;AAAA,EAC/B;AAAA,EAEQ,kBAAkB,KAAA,EAA2C;AACnE,IAAA,OAAO,KAAA,CAAM,eAAA,KAAoB,cAAA,IAC1B,KAAA,CAAM,eAAA,KAAoB,SAAA;AAAA,EACnC;AAAA,EAEQ,gCAAgC,KAAA,EAAwC;AAC9E,IAAA,MAAM,YAAA,GAAiC;AAAA,MACrC,SAAA,EAAW,EAAA;AAAA;AAAA,MACX,SAAA,EAAW,MAAA,CAAO,KAAA,CAAM,SAAS,CAAA;AAAA,MACjC,OAAO,KAAA,CAAM,IAAA;AAAA,MACb,WAAW,KAAA,CAAM,EAAA;AAAA,MACjB,QAAQ,KAAA,CAAM,MAAA;AAAA,MACd,KAAA,EAAO,kCAAA;AAAA;AAAA,MACP,MAAA,EAAQ,KAAA,CAAM,MAAA,KAAW,WAAA,GAAc,WAAA,GAAc;AAAA,KACvD;AAEA,IAAA,IAAA,CAAK,cAAc,YAAY,CAAA;AAAA,EACjC;AAAA,EAEQ,YAAY,KAAA,EAAoB;AACtC,IAAA,IAAA,CAAK,IAAA,CAAK,SAAS,KAAK,CAAA;AACxB,IAAA,IAAI,IAAA,CAAK,QAAQ,OAAA,EAAS;AACxB,MAAA,IAAA,CAAK,OAAA,CAAQ,QAAQ,KAAK,CAAA;AAAA,IAC5B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,GAAkB;AAChB,IAAA,IAAA,CAAK,gBAAgB,EAAC;AACtB,IAAA,IAAA,CAAK,cAAc,KAAA,EAAM;AACzB,IAAA,IAAA,CAAK,gBAAgB,KAAA,EAAM;AAC3B,IAAA,IAAA,CAAK,aAAa,KAAA,EAAM;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAKE;AACA,IAAA,OAAO;AAAA,MACL,aAAA,EAAe,KAAK,aAAA,CAAc,MAAA;AAAA,MAClC,aAAA,EAAe,KAAK,aAAA,CAAc,IAAA;AAAA,MAClC,aAAA,EAAe,KAAK,YAAA,CAAa,IAAA;AAAA,MACjC,UAAU,IAAA,CAAK;AAAA,KACjB;AAAA,EACF;AACF;AAKO,SAAS,2BACd,OAAA,EACsB;AACtB,EAAA,OAAO,IAAI,qBAAqB,OAAO,CAAA;AACzC;AC5XO,IAAM,uBAAA,GAAN,cAAsCA,YAAAA,CAAa;AAAA,EAChD,OAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EAER,WAAA,CAAY,YAAwB,UAAA,EAAwB;AAC1D,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,OAAA,uBAAc,GAAA,EAAI;AACvB,IAAA,IAAA,CAAK,SAAA,uBAAgB,GAAA,EAAI;AACzB,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAClB,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,MAAA,EAAqD;AACtE,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,gBAAA,CAAiB,MAAM,CAAA;AAG7C,IAAA,IAAA,CAAK,qBAAqB,MAAM,CAAA;AAEhC,IAAA,MAAM,MAAA,GAAwB;AAAA,MAC5B,EAAA,EAAI,QAAA;AAAA,MACJ,MAAA;AAAA,MACA,MAAA,EAAQ,QAAA;AAAA,MACR,UAAA,EAAY,EAAA;AAAA,MACZ,UAAU,EAAC;AAAA,MACX,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,aAAA,EAAe,IAAA,CAAK,GAAA,EAAI,GAAI,MAAA,CAAO;AAAA,KACrC;AAEA,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,QAAA,EAAU,MAAM,CAAA;AAGjC,IAAA,IAAA,CAAK,oBAAoB,MAAM,CAAA;AAE/B,IAAA,IAAA,CAAK,IAAA,CAAK,kBAAkB,MAAM,CAAA;AAElC,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,QAAA,EAAwB;AAClC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA;AACxC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,OAAA,EAAU,QAAQ,CAAA,UAAA,CAAY,CAAA;AAAA,IAChD;AAEA,IAAA,IAAI,MAAA,CAAO,WAAW,QAAA,EAAU;AAC9B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,OAAA,EAAU,QAAQ,CAAA,cAAA,CAAgB,CAAA;AAAA,IACpD;AAEA,IAAA,IAAA,CAAK,mBAAmB,QAAQ,CAAA;AAChC,IAAA,MAAA,CAAO,MAAA,GAAS,QAAA;AAEhB,IAAA,IAAA,CAAK,IAAA,CAAK,iBAAiB,MAAM,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,QAAA,EAAwB;AACnC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA;AACxC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,OAAA,EAAU,QAAQ,CAAA,UAAA,CAAY,CAAA;AAAA,IAChD;AAEA,IAAA,IAAI,MAAA,CAAO,WAAW,QAAA,EAAU;AAC9B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,OAAA,EAAU,QAAQ,CAAA,cAAA,CAAgB,CAAA;AAAA,IACpD;AAEA,IAAA,MAAA,CAAO,MAAA,GAAS,QAAA;AAChB,IAAA,MAAA,CAAO,aAAA,GAAgB,IAAA,CAAK,GAAA,EAAI,GAAI,OAAO,MAAA,CAAO,UAAA;AAClD,IAAA,IAAA,CAAK,oBAAoB,MAAM,CAAA;AAE/B,IAAA,IAAA,CAAK,IAAA,CAAK,kBAAkB,MAAM,CAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,QAAA,EAAwB;AACnC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA;AACxC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,OAAA,EAAU,QAAQ,CAAA,UAAA,CAAY,CAAA;AAAA,IAChD;AAEA,IAAA,IAAA,CAAK,mBAAmB,QAAQ,CAAA;AAChC,IAAA,MAAA,CAAO,MAAA,GAAS,WAAA;AAChB,IAAA,MAAA,CAAO,OAAA,GAAU,KAAK,GAAA,EAAI;AAE1B,IAAA,IAAA,CAAK,IAAA,CAAK,oBAAoB,MAAM,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,QAAA,EAA6C;AACrD,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAAiC;AAC/B,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAA,GAAoC;AAClC,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,QAAQ,CAAA;AAAA,EAC9E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAA,CAAkB,QAAA,EAAkB,WAAA,EAAoC;AAC5E,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA;AACxC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,OAAA,EAAU,QAAQ,CAAA,UAAA,CAAY,CAAA;AAAA,IAChD;AAEA,IAAA,MAAM,SAAA,GAAY,OAAO,MAAA,CAAO,UAAA,EAAY,KAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,WAAW,CAAA;AAC5E,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,UAAA,EAAa,WAAW,CAAA,UAAA,CAAY,CAAA;AAAA,IACtD;AAEA,IAAA,IAAI,UAAU,SAAA,EAAW;AACvB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,UAAA,EAAa,WAAW,CAAA,kBAAA,CAAoB,CAAA;AAAA,IAC9D;AAGA,IAAA,MAAM,YAAA,GAAe,MAAM,SAAA,CAAU,SAAA,EAAU;AAC/C,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,UAAA,EAAa,WAAW,CAAA,kBAAA,CAAoB,CAAA;AAAA,IAC9D;AAGA,IAAA,IAAI;AACF,MAAA,MAAM,mBAAmB,MAAM,IAAA,CAAK,YAAY,MAAA,EAAQ,SAAA,CAAU,QAAQ,WAAW,CAAA;AAErF,MAAA,SAAA,CAAU,SAAA,GAAY,IAAA;AACtB,MAAA,SAAA,CAAU,WAAA,GAAc,KAAK,GAAA,EAAI;AAEjC,MAAA,IAAA,CAAK,KAAK,qBAAA,EAAuB;AAAA,QAC/B,QAAA;AAAA,QACA,WAAA;AAAA,QACA,SAAA,EAAW;AAAA,OACZ,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,KAAK,kBAAA,EAAoB;AAAA,QAC5B,QAAA;AAAA,QACA,WAAA;AAAA,QACA;AAAA,OACD,CAAA;AACD,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAAgB;AACd,IAAA,KAAA,MAAW,QAAA,IAAY,IAAA,CAAK,SAAA,CAAU,IAAA,EAAK,EAAG;AAC5C,MAAA,IAAA,CAAK,mBAAmB,QAAQ,CAAA;AAAA,IAClC;AACA,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AACnB,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AAAA,EACvB;AAAA;AAAA,EAIQ,iBAAiB,MAAA,EAAqC;AAC5D,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,MAAM,IAAA,GAAO,GAAG,MAAA,CAAO,YAAY,IAAI,MAAA,CAAO,aAAa,IAAI,SAAS,CAAA,CAAA;AACxE,IAAA,OAAO,MAAA,CAAO,KAAK,IAAI,CAAA,CAAE,SAAS,QAAQ,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,EACzD;AAAA,EAEQ,qBAAqB,MAAA,EAAmC;AAC9D,IAAA,IAAI,MAAA,CAAO,eAAe,EAAA,EAAI;AAC5B,MAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,IACjD;AAEA,IAAA,IAAI,MAAA,CAAO,cAAc,CAAA,EAAG;AAC1B,MAAA,MAAM,IAAI,MAAM,2BAA2B,CAAA;AAAA,IAC7C;AAEA,IAAA,IAAI,MAAA,CAAO,cAAc,CAAA,EAAG;AAC1B,MAAA,MAAM,IAAI,MAAM,2BAA2B,CAAA;AAAA,IAC7C;AAEA,IAAA,IAAI,MAAA,CAAO,qBAAqB,EAAA,EAAI;AAClC,MAAA,MAAM,IAAI,MAAM,sCAAsC,CAAA;AAAA,IACxD;AAEA,IAAA,MAAM,cAAc,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,UAAA,GAAa,OAAO,UAAU,CAAA;AACnE,IAAA,MAAM,gBAAA,GAAmB,MAAA,CAAO,iBAAA,GAAoB,MAAA,CAAO,WAAW,CAAA;AAEtE,IAAA,MAAM,cAAA,GACJ,MAAA,CAAO,UAAA,EAAY,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,MAAA,EAAQ,EAAE,CAAA,IAAK,EAAA;AAE/D,IAAA,IAAI,gBAAA,GAAmB,cAAA,GAAiB,MAAA,CAAO,WAAA,GAAc,OAAO,IAAA,EAAM;AACxE,MAAA,MAAM,IAAI,MAAM,4DAA4D,CAAA;AAAA,IAC9E;AAAA,EACF;AAAA,EAEQ,oBAAoB,MAAA,EAA6B;AACvD,IAAA,MAAM,QAAA,GAAW,YAAY,YAAY;AACvC,MAAA,MAAM,IAAA,CAAK,eAAe,MAAM,CAAA;AAAA,IAClC,CAAA,EAAG,MAAA,CAAO,MAAA,CAAO,UAAU,CAAA;AAE3B,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,MAAA,CAAO,EAAA,EAAI,QAAQ,CAAA;AAAA,EACxC;AAAA,EAEQ,mBAAmB,QAAA,EAAwB;AACjD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,QAAQ,CAAA;AAC5C,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,aAAA,CAAc,QAAQ,CAAA;AACtB,MAAA,IAAA,CAAK,SAAA,CAAU,OAAO,QAAQ,CAAA;AAAA,IAChC;AAAA,EACF;AAAA,EAEA,MAAc,eAAe,MAAA,EAAsC;AACjE,IAAA,IAAI,MAAA,CAAO,WAAW,QAAA,EAAU;AAC9B,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,MAAA,CAAO,UAAA,IAAc,MAAA,CAAO,MAAA,CAAO,WAAA,EAAa;AAClD,MAAA,IAAA,CAAK,eAAe,MAAM,CAAA;AAC1B,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,KAAK,GAAA,EAAI,IAAK,OAAO,SAAA,GAAY,MAAA,CAAO,OAAO,UAAA,EAAY;AAC7D,MAAA,IAAA,CAAK,eAAe,MAAM,CAAA;AAC1B,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,OAAO,MAAA,CAAO,iBAAA;AAC7B,MAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,WAAA,CAAY,QAAQ,MAAM,CAAA;AAEvD,MAAA,MAAA,CAAO,aAAA,GAAgB,KAAK,GAAA,EAAI;AAChC,MAAA,MAAA,CAAO,aAAA,GAAgB,IAAA,CAAK,GAAA,EAAI,GAAI,OAAO,MAAA,CAAO,UAAA;AAElD,MAAA,IAAA,CAAK,KAAK,mBAAA,EAAqB;AAAA,QAC7B,UAAU,MAAA,CAAO,EAAA;AAAA,QACjB,MAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,KAAK,gBAAA,EAAkB;AAAA,QAC1B,UAAU,MAAA,CAAO,EAAA;AAAA,QACjB;AAAA,OACD,CAAA;AAED,MAAA,IAAI,MAAA,CAAO,MAAA,CAAO,UAAA,KAAe,IAAA,EAAM;AACrC,QAAA,MAAA,CAAO,MAAA,GAAS,QAAA;AAChB,QAAA,MAAA,CAAO,KAAA,GAAQ,KAAA;AACf,QAAA,MAAA,CAAO,OAAA,GAAU,KAAK,GAAA,EAAI;AAC1B,QAAA,IAAA,CAAK,kBAAA,CAAmB,OAAO,EAAE,CAAA;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,WAAA,CACZ,MAAA,EACA,MAAA,EACA,WAAA,EACoB;AAGpB,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,UAAA,CAAW,oBAAA,CAAqB;AAAA,MAC1D,MAAA;AAAA,MACA,KAAA,EAAO,OAAO,MAAA,CAAO,SAAA;AAAA,MACrB,WAAA,EAAa,WAAA,GACT,CAAA,OAAA,EAAU,MAAA,CAAO,EAAE,gBAAgB,WAAW,CAAA,CAAA,GAC9C,CAAA,OAAA,EAAU,MAAA,CAAO,EAAE,CAAA,mBAAA,CAAA;AAAA,MACvB,QAAA,EAAU;AAAA,QACR,UAAU,MAAA,CAAO,EAAA;AAAA,QACjB,GAAI,WAAA,IAAe,EAAE,WAAA;AAAY;AACnC,KACD,CAAA;AAGD,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,UAAA,CAAW,IAAI,cAAc,CAAA;AAGxD,IAAA,MAAM,OAAA,GAAyB;AAAA,MAC7B,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,MAAA;AAAA,MACA,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,WAAA;AAAA,MACA,OAAA,EAAS;AAAA,KACX;AAEA,IAAA,MAAA,CAAO,QAAA,CAAS,KAAK,OAAO,CAAA;AAC5B,IAAA,MAAA,CAAO,UAAA,IAAc,MAAA;AAErB,IAAA,OAAO,OAAA,CAAQ,SAAA;AAAA,EACjB;AAAA,EAEQ,eAAe,MAAA,EAA6B;AAClD,IAAA,IAAA,CAAK,kBAAA,CAAmB,OAAO,EAAE,CAAA;AACjC,IAAA,MAAA,CAAO,MAAA,GAAS,WAAA;AAChB,IAAA,MAAA,CAAO,OAAA,GAAU,KAAK,GAAA,EAAI;AAE1B,IAAA,IAAA,CAAK,IAAA,CAAK,oBAAoB,MAAM,CAAA;AAAA,EACtC;AACF;ACjTO,IAAM,SAAA,GAAN,cAAwBA,YAAAA,CAAa;AAAA,EAClC,GAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EAER,WAAA,CAAY,SAA2B,MAAA,EAA2B;AAChE,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,GAAA,GAAMH,eAAAA,CAAgB,OAAA,CAAQ,WAAW,CAAA;AAC9C,IAAA,IAAA,CAAK,SAAA,GAAY,QAAQ,SAAA,IAAa,sCAAA;AACtC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBA,MAAM,cAAc,MAAA,EAAsD;AACxE,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AACxC,MAAA,MAAM,SAAA,GAAY,GAAA,IAAO,MAAA,CAAO,SAAA,IAAa,IAAA,CAAA;AAG7C,MAAA,MAAM,SAAA,GAAY,MAAA,CAAO,IAAA,CAAK,GAAA,EAAK,CAAA;AAGnC,MAAA,MAAM,WAAA,GAAc,MAAM,mCAAA,CAAoC;AAAA,QAC5D,SAAS,IAAA,CAAK,MAAA;AAAA,QACd,SAAA;AAAA,QACA,SAAA,EAAW,KAAK,MAAA,CAAO,OAAA;AAAA,QACvB,WAAW,MAAA,CAAO,SAAA;AAAA,QAClB,aAAa,MAAA,CAAO,WAAA;AAAA,QACpB,QAAA,EAAU,OAAO,QAAA,IAAY,EAAA;AAAA,QAC7B,SAAA,EAAW,OAAO,SAAS;AAAA,OAC7B,EAAG,EAAE,cAAA,EAAgB,IAAA,CAAK,WAAW,CAAA;AAGrC,MAAA,MAAM,YAAY,MAAM,IAAA,CAAK,eAAA,CAAgB,CAAC,WAAW,CAAC,CAAA;AAI1D,MAAA,MAAM,cAAA,GAAiB,WAAA,CAAY,QAAA,CAAS,CAAC,CAAA,CAAE,OAAA;AAG/C,MAAA,IAAA,CAAK,KAAK,iBAAA,EAAmB;AAAA,QAC3B,IAAA,EAAM,iBAAA;AAAA,QACN,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,IAAA,EAAM,EAAE,cAAA,EAAgB,SAAA;AAAU,OACvB,CAAA;AAGb,MAAA,MAAM,OAAA,GAAU,MAAM,eAAA,CAAgB,IAAA,CAAK,KAAK,cAAc,CAAA;AAE9D,MAAA,OAAO;AAAA,QACL,GAAG,OAAA,CAAQ,IAAA;AAAA,QACX,OAAA,EAAS;AAAA,OACX;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC1E,MAAA,IAAA,CAAK,KAAK,OAAA,EAAS;AAAA,QACjB,IAAA,EAAM,OAAA;AAAA,QACN,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,KAAA,EAAO;AAAA,OACI,CAAA;AACb,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,8BAAA,EAAiC,YAAY,CAAA,CAAE,CAAA;AAAA,IACjE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,MAAM,YAAY,MAAA,EAA8C;AAC9D,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,GAAY,MAAA,CAAO,IAAA,CAAK,GAAA,EAAK,CAAA;AACnC,MAAA,MAAM,SAAA,GAAY,MAAA,CAAO,IAAA,CAAK,GAAA,EAAK,CAAA;AACnC,MAAA,MAAM,SAAA,GAAY,OAAO,IAAA,CAAK,KAAA,CAAM,KAAK,GAAA,EAAI,GAAI,GAAI,CAAC,CAAA;AAOtD,MAAA,MAAM,cAAc,4BAAA,CAA6B;AAAA,QAC/C,OAAA,EAAS,MAAM,IAAA,CAAK,oBAAA,CAAqB,OAAO,cAAc,CAAA;AAAA,QAC9D,SAAS,MAAA,CAAO,cAAA;AAAA,QAChB,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,SAAA;AAAA,QACA,SAAA;AAAA,QACA,SAAA,EAAW,KAAK,MAAA,CAAO,OAAA;AAAA,QACvB,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,WAAA,EAAa,OAAO,WAAA,IAAe,MAAA;AAAA,QACnC;AAAA,OACF,EAAG,EAAE,cAAA,EAAgB,IAAA,CAAK,WAAW,CAAA;AAGrC,MAAA,MAAM,YAAY,MAAM,IAAA,CAAK,eAAA,CAAgB,CAAC,WAAW,CAAC,CAAA;AAG1D,MAAA,IAAA,CAAK,KAAK,cAAA,EAAgB;AAAA,QACxB,IAAA,EAAM,cAAA;AAAA,QACN,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,IAAA,EAAM,EAAE,SAAA,EAAW,OAAA,EAAS,OAAO,OAAA;AAAQ,OAChC,CAAA;AAEb,MAAA,OAAO,SAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC1E,MAAA,IAAA,CAAK,KAAK,OAAA,EAAS;AAAA,QACjB,IAAA,EAAM,OAAA;AAAA,QACN,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,KAAA,EAAO;AAAA,OACI,CAAA;AACb,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+B,YAAY,CAAA,CAAE,CAAA;AAAA,IAC/D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,MAAM,aAAa,MAAA,EAA6C;AAC9D,IAAA,IAAI;AAKF,MAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,mBAAA,EAAoB;AAGrD,MAAA,MAAM,cAAc,6BAAA,CAA8B;AAAA,QAChD,MAAA,EAAQ,aAAA;AAAA,QACR,OAAA,EAASC,QAAQ,kCAAkC,CAAA;AAAA;AAAA,QACnD,SAAS,IAAA,CAAK,MAAA;AAAA,QACd,QAAA,EAAU,MAAA,CAAO,IAAA,CAAK,GAAA,EAAK,CAAA;AAAA,QAC3B,KAAA,EAAO,KAAK,MAAA,CAAO,OAAA;AAAA,QACnB,WAAW,MAAA,CAAO,MAAA;AAAA,QAClB,YAAA,EAAc,MAAA,CAAO,YAAA,IAAgB,EAAC;AAAA,QACtC,YAAA,EAAc,OAAO,YAAA,IAAgB,IAAA;AAAA,QACrC,WAAA,EAAa,OAAO,IAAA,CAAK,KAAA,CAAM,KAAK,GAAA,EAAI,GAAI,GAAI,CAAC;AAAA,OACnD,EAAG,EAAE,cAAA,EAAgB,IAAA,CAAK,WAAW,CAAA;AAGrC,MAAA,MAAM,YAAY,MAAM,IAAA,CAAK,eAAA,CAAgB,CAAC,WAAW,CAAC,CAAA;AAG1D,MAAA,IAAA,CAAK,KAAK,gBAAA,EAAkB;AAAA,QAC1B,IAAA,EAAM,gBAAA;AAAA,QACN,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,IAAA,EAAM,EAAE,SAAA,EAAW,MAAA,EAAQ,OAAO,MAAA;AAAO,OAC9B,CAAA;AAEb,MAAA,OAAO,SAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC1E,MAAA,IAAA,CAAK,KAAK,OAAA,EAAS;AAAA,QACjB,IAAA,EAAM,OAAA;AAAA,QACN,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,KAAA,EAAO;AAAA,OACI,CAAA;AACb,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,6BAAA,EAAgC,YAAY,CAAA,CAAE,CAAA;AAAA,IAChE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,WAAW,cAAA,EAA4D;AAC3E,IAAA,IAAI;AACF,MAAA,MAAM,YAAA,GAAe,MAAM,oBAAA,CAAqB,IAAA,CAAK,KAAK,cAAc,CAAA;AAExE,MAAA,IAAI,CAAC,aAAa,MAAA,EAAQ;AACxB,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,OAAO;AAAA,QACL,GAAG,YAAA,CAAa,IAAA;AAAA,QAChB,OAAA,EAAS;AAAA,OACX;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,gCAAgC,KAAK,CAAA;AACnD,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,WAAW,cAAA,EAAqD;AACpE,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,MAAM,eAAA,CAAgB,IAAA,CAAK,KAAK,cAAc,CAAA;AAC9D,MAAA,OAAO,OAAA,CAAQ,IAAA;AAAA,IACjB,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,gCAAgC,KAAK,CAAA;AACnD,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,UAAU,aAAA,EAAmD;AACjE,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,cAAA,CAAe,IAAA,CAAK,KAAK,aAAa,CAAA;AAC3D,MAAA,OAAO,MAAA,CAAO,IAAA;AAAA,IAChB,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,+BAA+B,KAAK,CAAA;AAClD,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,gBAAgB,YAAA,EAAsD;AAClF,IAAA,IAAI;AAEF,MAAA,MAAM,EAAE,OAAO,eAAA,EAAgB,GAAI,MAAM,IAAA,CAAK,GAAA,CAAI,kBAAA,EAAmB,CAAE,IAAA,EAAK;AAG5E,MAAA,IAAI,OAAA,GAAmBG,wBAAAA,CAAyB,EAAE,OAAA,EAAS,GAAG,CAAA;AAC9D,MAAA,OAAA,GAAUC,6BAAAA,CAA8B,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,OAAsD,CAAA;AACnH,MAAA,OAAA,GAAUC,2CAAAA,CAA4C,iBAAiB,OAA4E,CAAA;AAEnJ,MAAA,KAAA,MAAW,MAAM,YAAA,EAAc;AAC7B,QAAA,OAAA,GAAUC,mCAAAA,CAAoC,IAAiE,OAAoE,CAAA;AAAA,MACrL;AAGA,MAAA,MAAM,iBAAA,GAAoB,MAAMC,iCAAAA,CAAkC,OAAkE,CAAA;AAGpI,MAAA,MAAM,UAAA,GAAa,MAAA,CAAO,MAAA,CAAO,iBAAA,CAAkB,UAAU,CAAA;AAC7D,MAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,QAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,MACjD;AAEA,MAAA,MAAM,SAAA,GAAY,WAAW,CAAC,CAAA;AAG9B,MAAA,MAAM,eAAA,GAAkBC,gCAAgC,iBAAiB,CAAA;AACzE,MAAA,MAAM,IAAA,CAAK,GAAA,CAAI,eAAA,CAAgB,eAAe,EAAE,IAAA,EAAK;AAGrD,MAAA,MAAM,IAAA,CAAK,mBAAmB,SAAS,CAAA;AAEvC,MAAA,OAAO,SAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,uBAAuB,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,OAC/E;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,mBAAmB,SAAA,EAAqC;AACpE,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,EAAK;AAC3B,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,qBAAqB,CAAC,SAAS,CAAC,CAAA,CAAE,IAAA,EAAK;AACrE,MAAA,IACE,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA,EAAG,kBAAA,KAAuB,WAAA,IACxC,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA,EAAG,kBAAA,KAAuB,WAAA,EACxC;AACA,QAAA;AAAA,MACF;AACA,MAAA,MAAM,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,GAAI,CAAC,CAAA;AAAA,IAC1D;AACA,IAAA,MAAM,IAAI,MAAM,kCAAkC,CAAA;AAAA,EACpD;AAAA,EAEA,MAAc,qBAAqB,cAAA,EAA2C;AAM5E,IAAA,OAAOR,QAAQ,kCAAkC,CAAA;AAAA,EACnD;AAAA,EAEA,MAAc,mBAAA,GAAwC;AAGpD,IAAA,OAAOA,QAAQ,kCAAkC,CAAA;AAAA,EACnD;AACF;AAaO,SAAS,eAAA,CACd,SACA,MAAA,EACW;AACX,EAAA,OAAO,IAAI,SAAA,CAAU,OAAA,EAAS,MAAM,CAAA;AACtC;ACxWO,IAAM,SAAA,GAAN,cAAwBE,YAAAA,CAAa;AAAA,EAClC,GAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EAER,WAAA,CAAY,SAA2B,MAAA,EAA2B;AAChE,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,GAAA,GAAMH,eAAAA,CAAgB,OAAA,CAAQ,WAAW,CAAA;AAC9C,IAAA,IAAA,CAAK,SAAA,GAAY,QAAQ,SAAA,IAAa,sCAAA;AACtC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,MAAM,cAAc,MAAA,EAA+E;AACjG,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,EAAI,GAAI,GAAI,CAAA,IAAK,MAAA,CAAO,SAAA,IAAa,IAAA,CAAK,CAAA;AACnF,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,IAAA,CAAK,GAAA,EAAK,CAAA;AAGnC,IAAA,MAAM,SAAA,GAAY,KAAK,MAAA,CAAO,OAAA;AAQ9B,IAAA,MAAM,CAAC,cAAc,CAAA,GAAI,MAAM,wBAAA,CAAyB;AAAA,MACtD,gBAAgB,IAAA,CAAK,SAAA;AAAA,MACrB,KAAA,EAAO;AAAA,QACL,iBAAgB,CAAE,MAAA,CAAO,IAAI,UAAA,CAAW,CAAC,IAAI,GAAA,EAAK,GAAA,EAAK,KAAK,EAAA,EAAI,GAAA,EAAK,KAAK,GAAA,EAAK,GAAA,EAAK,KAAK,GAAA,EAAK,GAAG,CAAC,CAAC,CAAA;AAAA;AAAA,QACnG,iBAAA,EAAkB,CAAE,MAAA,CAAO,SAAS;AAAA;AACtC,KACD,CAAA;AAED,IAAA,MAAM,WAAA,GAAc,MAAM,6CAAA,CAA8C;AAAA,MACtE,OAAA,EAAS,cAAA;AAAA,MACT,SAAS,IAAA,CAAK,MAAA;AAAA,MACd,SAAA;AAAA,MACA,SAAA;AAAA,MACA,aAAA,EAAA,CAAA;AAAA,MACA,WAAW,MAAA,CAAO,YAAA;AAAA,MAClB,aAAA,EAAA,CAAA;AAAA,MACA,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,QAAA,EAAU,OAAO,QAAA,IAAY,EAAA;AAAA,MAC7B;AAAA,KACF,EAAG,EAAE,cAAA,EAAgB,IAAA,CAAK,WAAW,CAAA;AAErC,IAAA,MAAM,YAAY,MAAM,IAAA,CAAK,eAAA,CAAgB,CAAC,WAAW,CAAC,CAAA;AAG1D,IAAA,IAAA,CAAK,KAAK,iBAAA,EAAmB;AAAA,MAC3B,IAAA,EAAM,iBAAA;AAAA,MACN,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,IAAA,EAAM;AAAA,QACJ,OAAA,EAAS,cAAA;AAAA,QACT,SAAA;AAAA,QACA,OAAO,MAAA,CAAO;AAAA;AAChB,KACW,CAAA;AAEb,IAAA,OAAO,EAAE,OAAA,EAAS,cAAA,EAAgB,SAAA,EAAU;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,MAAM,mBAAmB,OAAA,EAAgD;AACvE,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,IAAA,CAAK,GAAA,EAAK,CAAA;AAInC,IAAA,MAAM,cAAA,GAAiB,IAAI,UAAA,CAAW,CAAC,CAAA;AACvC,IAAA,MAAM,IAAA,GAAO,IAAI,QAAA,CAAS,cAAA,CAAe,MAAM,CAAA;AAC/C,IAAA,IAAA,CAAK,YAAA,CAAa,CAAA,EAAG,SAAA,EAAW,IAAI,CAAA;AAEpC,IAAA,MAAM,CAAC,cAAc,CAAA,GAAI,MAAM,wBAAA,CAAyB;AAAA,MACtD,gBAAgB,IAAA,CAAK,SAAA;AAAA,MACrB,KAAA,EAAO;AAAA,QACL,iBAAgB,CAAE,MAAA,CAAO,IAAI,UAAA,CAAW,CAAC,IAAI,GAAA,EAAK,GAAA,EAAK,KAAK,EAAA,EAAI,GAAA,EAAK,KAAK,GAAA,EAAK,GAAA,EAAK,IAAI,GAAA,EAAK,GAAG,CAAC,CAAC,CAAA;AAAA;AAAA,QAClG,iBAAA,EAAkB,CAAE,MAAA,CAAO,OAAA,CAAQ,cAAc,CAAA;AAAA,QACjD,eAAA,EAAgB,CAAE,MAAA,CAAO,cAAc;AAAA;AACzC,KACD,CAAA;AAED,IAAA,MAAM,cAAc,sCAAA,CAAuC;AAAA,MACzD,OAAA,EAAS,cAAA;AAAA,MACT,SAAS,OAAA,CAAQ,cAAA;AAAA,MACjB,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,SAAA;AAAA,MACA,UAAA,EAAA,CAAA;AAAA,MACA,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,WAAA,EAAa,QAAQ,WAAA,IAAe,iBAAA;AAAA,MACpC,WAAA,EAAa,OAAA,CAAQ,WAAA,IAAe;AAAC,KACvC,EAAG,EAAE,cAAA,EAAgB,IAAA,CAAK,WAAW,CAAA;AAErC,IAAA,MAAM,YAAY,MAAM,IAAA,CAAK,eAAA,CAAgB,CAAC,WAAW,CAAC,CAAA;AAE1D,IAAA,IAAA,CAAK,KAAK,mBAAA,EAAqB;AAAA,MAC7B,IAAA,EAAM,mBAAA;AAAA,MACN,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,IAAA,EAAM;AAAA,QACJ,cAAA;AAAA,QACA,gBAAgB,OAAA,CAAQ,cAAA;AAAA,QACxB;AAAA;AACF,KACW,CAAA;AAEb,IAAA,OAAO,SAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,YAAY,MAAA,EAA8C;AAC9D,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,IAAA,CAAK,GAAA,EAAK,CAAA;AAInC,IAAA,MAAM,cAAA,GAAiB,IAAI,UAAA,CAAW,CAAC,CAAA;AACvC,IAAA,MAAM,IAAA,GAAO,IAAI,QAAA,CAAS,cAAA,CAAe,MAAM,CAAA;AAC/C,IAAA,IAAA,CAAK,YAAA,CAAa,CAAA,EAAG,SAAA,EAAW,IAAI,CAAA;AAEpC,IAAA,MAAM,CAAC,cAAc,CAAA,GAAI,MAAM,wBAAA,CAAyB;AAAA,MACtD,gBAAgB,IAAA,CAAK,SAAA;AAAA,MACrB,KAAA,EAAO;AAAA,QACL,iBAAgB,CAAE,MAAA,CAAO,IAAI,UAAA,CAAW,CAAC,IAAI,GAAA,EAAK,GAAA,EAAK,KAAK,EAAA,EAAI,GAAA,EAAK,KAAK,GAAA,EAAK,GAAA,EAAK,IAAI,GAAA,EAAK,GAAG,CAAC,CAAC,CAAA;AAAA;AAAA,QAClG,iBAAA,EAAkB,CAAE,MAAA,CAAO,MAAA,CAAO,cAAc,CAAA;AAAA,QAChD,eAAA,EAAgB,CAAE,MAAA,CAAO,cAAc;AAAA;AACzC,KACD,CAAA;AAED,IAAA,MAAM,cAAc,sCAAA,CAAuC;AAAA,MACzD,OAAA,EAAS,cAAA;AAAA,MACT,SAAS,MAAA,CAAO,cAAA;AAAA,MAChB,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,SAAA;AAAA,MACA,UAAA,EAAA,CAAA;AAAA,MACA,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,WAAA,EAAa,OAAO,WAAA,IAAe,MAAA;AAAA,MACnC,WAAA,EAAa,MAAA,CAAO,WAAA,IAAe;AAAC,KACtC,EAAG,EAAE,cAAA,EAAgB,IAAA,CAAK,WAAW,CAAA;AAErC,IAAA,MAAM,YAAY,MAAM,IAAA,CAAK,eAAA,CAAgB,CAAC,WAAW,CAAC,CAAA;AAE1D,IAAA,IAAA,CAAK,KAAK,cAAA,EAAgB;AAAA,MACxB,IAAA,EAAM,cAAA;AAAA,MACN,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,IAAA,EAAM;AAAA,QACJ,cAAA;AAAA,QACA,gBAAgB,MAAA,CAAO,cAAA;AAAA,QACvB;AAAA;AACF,KACW,CAAA;AAEb,IAAA,OAAO,SAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,WAAW,cAAA,EAA4D;AAC3E,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,GAAA,CAAI,cAAA,CAAe,cAAA,EAAgB,EAAE,QAAA,EAAU,QAAA,EAAU,CAAA,CAAE,IAAA,EAAK;AAE/F,IAAA,IAAI,CAAC,YAAY,KAAA,EAAO;AACtB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,cAAc,CAAA,CAAE,CAAA;AAAA,IAChE;AAEA,IAAA,MAAM,IAAA,GAAO,YAAY,KAAA,CAAM,IAAA;AAK/B,IAAA,OAAO,oCAAmC,CAAE,MAAA;AAAA,MAC1C,OAAO,IAAA,KAAS,QAAA,GACZ,UAAA,CAAW,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,IAAA,EAAM,QAAQ,CAAC,CAAA,GAC3C,IAAI,WAAW,IAA8B;AAAA,KACnD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,gBAAgB,YAAA,EAAsD;AAClF,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,OAAO,eAAA,EAAgB,GAAI,MAAM,IAAA,CAAK,GAAA,CAAI,kBAAA,EAAmB,CAAE,IAAA,EAAK;AAG5E,MAAA,IAAI,OAAA,GAAmBI,wBAAAA,CAAyB,EAAE,OAAA,EAAS,GAAG,CAAA;AAC9D,MAAA,OAAA,GAAUC,6BAAAA,CAA8B,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,OAAsD,CAAA;AACnH,MAAA,OAAA,GAAUC,2CAAAA,CAA4C,iBAAiB,OAA4E,CAAA;AAEnJ,MAAA,KAAA,MAAW,MAAM,YAAA,EAAc;AAC7B,QAAA,OAAA,GAAUC,mCAAAA,CAAoC,IAAiE,OAAoE,CAAA;AAAA,MACrL;AAEA,MAAA,MAAM,iBAAA,GAAoB,MAAMC,iCAAAA,CAAkC,OAAkE,CAAA;AAEpI,MAAA,MAAM,UAAA,GAAa,MAAA,CAAO,MAAA,CAAO,iBAAA,CAAkB,UAAU,CAAA;AAC7D,MAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,QAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,MACjD;AAEA,MAAA,MAAM,SAAA,GAAY,WAAW,CAAC,CAAA;AAE9B,MAAA,MAAM,eAAA,GAAkBC,gCAAgC,iBAAiB,CAAA;AACzE,MAAA,MAAM,IAAA,CAAK,GAAA,CAAI,eAAA,CAAgB,eAAe,EAAE,IAAA,EAAK;AAErD,MAAA,MAAM,IAAA,CAAK,mBAAmB,SAAS,CAAA;AAEvC,MAAA,OAAO,SAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,uBAAuB,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,OAC/E;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,mBAAmB,SAAA,EAAqC;AACpE,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,EAAK;AAC3B,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,qBAAqB,CAAC,SAAS,CAAC,CAAA,CAAE,IAAA,EAAK;AACrE,MAAA,IACE,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA,EAAG,kBAAA,KAAuB,WAAA,IACxC,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA,EAAG,kBAAA,KAAuB,WAAA,EACxC;AACA,QAAA;AAAA,MACF;AACA,MAAA,MAAM,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,GAAI,CAAC,CAAA;AAAA,IAC1D;AACA,IAAA,MAAM,IAAI,MAAM,kCAAkC,CAAA;AAAA,EACpD;AACF;AAaO,SAAS,eAAA,CACd,SACA,MAAA,EACW;AACX,EAAA,OAAO,IAAI,SAAA,CAAU,OAAA,EAAS,MAAM,CAAA;AACtC;;;ACtYO,IAAM,gBAAA,GAA+B;AAAA,EAC1C,QAAA,EAAU;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,QAAA,EAAU;AAAA;AAAA,GACZ;AAAA,EACA,QAAA,EAAU;AAAA,IACR,uBAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,WAAA,EAAa,IAAA;AAAA,EACb,aAAA,EAAe,GAAA;AAAA;AAAA,EACf,UAAA,EAAY,CAAA;AAAA,EACZ,UAAA,EAAY,GAAA;AAAA,EACZ,WAAA,EAAa,IAAA;AAAA,EACb,QAAA,EAAU;AAAA;AACZ;AAKO,SAAS,qBAAqB,OAAA,EAA2C;AAC9E,EAAA,OAAO;AAAA,IACL,GAAG,gBAAA;AAAA,IACH,GAAG,OAAA;AAAA,IACH,QAAA,EAAU;AAAA,MACR,GAAG,gBAAA,CAAiB,QAAA;AAAA,MACpB,GAAI,OAAA,EAAS,QAAA,IAAY;AAAC;AAC5B,GACF;AACF;;;AC9BO,IAAM,kBAAA,GAAN,cAAiC,KAAA,CAAM;AAAA,EAC5C,WAAA,CACkB,IAAA,EAChB,OAAA,EACgB,QAAA,EACA,YACA,aAAA,EAChB;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AANG,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAEA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AACA,IAAA,IAAA,CAAA,aAAA,GAAA,aAAA;AAGhB,IAAA,IAAA,CAAK,IAAA,GAAO,oBAAA;AAAA,EACd;AACF;AAgBO,IAAMC,qBAAAA,GAAoC;AAAA,EAC/C,UAAA,EAAY,CAAA;AAAA,EACZ,SAAA,EAAW,GAAA;AAAA,EACX,QAAA,EAAU,GAAA;AAAA,EACV,aAAA,EAAe,CAAA;AAAA,EACf,eAAA,EAAiB;AAAA,IACf,eAAA;AAAA,IACA,eAAA;AAAA,IACA;AAAA;AAEJ;AAKO,IAAM,iBAAN,MAAqB;AAAA,EAK1B,WAAA,CACmB,gBAAA,GAAmB,CAAA,EACnB,YAAA,GAAe,GAAA,EAChC;AAFiB,IAAA,IAAA,CAAA,gBAAA,GAAA,gBAAA;AACA,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AAAA,EAChB;AAAA,EAPK,QAAA,GAAW,CAAA;AAAA,EACX,eAAA,GAAkB,CAAA;AAAA,EAClB,KAAA,GAAyC,QAAA;AAAA,EAOjD,MAAM,QAAW,SAAA,EAAyC;AACxD,IAAA,IAAI,IAAA,CAAK,UAAU,MAAA,EAAQ;AACzB,MAAA,IAAI,KAAK,GAAA,EAAI,GAAI,IAAA,CAAK,eAAA,GAAkB,KAAK,YAAA,EAAc;AACzD,QAAA,IAAA,CAAK,KAAA,GAAQ,WAAA;AAAA,MACf,CAAA,MAAO;AACL,QAAA,MAAM,IAAI,MAAM,6CAA6C,CAAA;AAAA,MAC/D;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,EAAU;AAC/B,MAAA,IAAA,CAAK,SAAA,EAAU;AACf,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,SAAA,EAAU;AACf,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEQ,SAAA,GAAkB;AACxB,IAAA,IAAA,CAAK,QAAA,GAAW,CAAA;AAChB,IAAA,IAAA,CAAK,KAAA,GAAQ,QAAA;AAAA,EACf;AAAA,EAEQ,SAAA,GAAkB;AACxB,IAAA,IAAA,CAAK,QAAA,EAAA;AACL,IAAA,IAAA,CAAK,eAAA,GAAkB,KAAK,GAAA,EAAI;AAEhC,IAAA,IAAI,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,gBAAA,EAAkB;AAC1C,MAAA,IAAA,CAAK,KAAA,GAAQ,MAAA;AAAA,IACf;AAAA,EACF;AAAA,EAEA,QAAA,GAAyE;AACvE,IAAA,OAAO;AAAA,MACL,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,iBAAiB,IAAA,CAAK;AAAA,KACxB;AAAA,EACF;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,QAAA,GAAW,CAAA;AAChB,IAAA,IAAA,CAAK,eAAA,GAAkB,CAAA;AACvB,IAAA,IAAA,CAAK,KAAA,GAAQ,QAAA;AAAA,EACf;AACF;AAKO,IAAM,eAAN,MAAmB;AAAA,EAGxB,WAAA,CACmB,SAAsBA,qBAAAA,EACvC;AADiB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAEjB,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAI,cAAA,EAAe;AAAA,EAC3C;AAAA,EANQ,cAAA;AAAA,EAQR,MAAM,OAAA,CACJ,SAAA,EACA,OAAA,EACY;AACZ,IAAA,OAAO,IAAA,CAAK,cAAA,CAAe,OAAA,CAAQ,YAAY;AAC7C,MAAA,IAAI,SAAA;AAEJ,MAAA,KAAA,IAAS,UAAU,CAAA,EAAG,OAAA,IAAW,IAAA,CAAK,MAAA,CAAO,YAAY,OAAA,EAAA,EAAW;AAClE,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,MAAM,SAAA,EAAU;AAE/B,UAAA,IAAI,UAAU,CAAA,EAAG;AACf,YAAA,OAAA,CAAQ,GAAA,CAAI,oCAA+B,OAAO,CAAA,QAAA,EAAW,UAAU,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA,CAAA,GAAM,EAAE,CAAA,CAAE,CAAA;AAAA,UAC/F;AAEA,UAAA,OAAO,MAAA;AAAA,QACT,SAAS,KAAA,EAAO;AACd,UAAA,SAAA,GAAY,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AAEpE,UAAA,IAAI,OAAA,KAAY,IAAA,CAAK,MAAA,CAAO,UAAA,EAAY;AACtC,YAAA;AAAA,UACF;AAEA,UAAA,MAAM,WAAA,GAAc,IAAA,CAAK,WAAA,CAAY,SAAA,EAAW,OAAO,CAAA;AACvD,UAAA,IAAI,CAAC,WAAA,EAAa;AAChB,YAAA,OAAA,CAAQ,GAAA,CAAI,6BAAwB,OAAA,GAAU,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA,CAAA,GAAM,EAAE,CAAA,CAAA,CAAA,EAAK,SAAA,CAAU,OAAO,CAAA;AACxF,YAAA;AAAA,UACF;AAEA,UAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,cAAA,CAAe,OAAO,CAAA;AACzC,UAAA,OAAA,CAAQ,IAAI,CAAA,mBAAA,EAAiB,KAAK,CAAA,eAAA,EAAkB,OAAA,GAAU,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,CAAO,UAAU,GAAG,OAAA,GAAU,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA,CAAG,CAAA;AAE5H,UAAA,MAAM,IAAI,OAAA,CAAQ,CAAA,OAAA,KAAW,UAAA,CAAW,OAAA,EAAS,KAAK,CAAC,CAAA;AAAA,QACzD;AAAA,MACF;AAEA,MAAA,MAAM,IAAI,kBAAA;AAAA,QACR,IAAA,CAAK,gBAAgB,SAAU,CAAA;AAAA,QAC/B,CAAA,uBAAA,EAA0B,IAAA,CAAK,MAAA,CAAO,UAAA,GAAa,CAAC,CAAA,SAAA,EAAY,OAAA,GAAU,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA,CAAA,GAAM,EAAE,CAAA,EAAA,EAAK,UAAW,OAAO,CAAA,CAAA;AAAA,QACrH,MAAA;AAAA,QACA,KAAK,MAAA,CAAO;AAAA,OACd;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,WAAA,CAAY,OAAc,OAAA,EAA0B;AAC1D,IAAA,IAAI,OAAA,IAAW,IAAA,CAAK,MAAA,CAAO,UAAA,EAAY;AACrC,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAA;AAC5C,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,eAAA,CAAgB,QAAA,CAAS,SAAS,CAAA;AAAA,EACvD;AAAA,EAEQ,eAAe,OAAA,EAAyB;AAC9C,IAAA,MAAM,gBAAA,GAAmB,KAAK,MAAA,CAAO,SAAA,GAAY,KAAK,GAAA,CAAI,IAAA,CAAK,MAAA,CAAO,aAAA,EAAe,OAAO,CAAA;AAC5F,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,EAAO,GAAI,GAAA,GAAM,gBAAA;AACrC,IAAA,OAAO,KAAK,GAAA,CAAI,gBAAA,GAAmB,MAAA,EAAQ,IAAA,CAAK,OAAO,QAAQ,CAAA;AAAA,EACjE;AAAA,EAEQ,gBAAgB,KAAA,EAAyB;AAC/C,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,WAAA,EAAY;AAE9C,IAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,SAAS,CAAA,EAAG;AAC3B,MAAA,OAAO,eAAA;AAAA,IACT;AAEJ,IAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,SAAS,CAAA,EAAG;AAC3B,MAAA,OAAO,eAAA;AAAA,IACT;AAEJ,IAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,cAAc,CAAA,EAAG;AAChC,MAAA,OAAO,uBAAA;AAAA,IACT;AAEJ,IAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAA,EAAG;AACzB,MAAA,OAAO,gBAAA;AAAA,IACT;AAEA,IAAA,IAAI,QAAQ,QAAA,CAAS,SAAS,KAAK,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,EAAG;AAC3D,MAAA,OAAO,cAAA;AAAA,IACT;AAEJ,IAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,WAAW,CAAA,EAAG;AAC7B,MAAA,OAAO,mBAAA;AAAA,IACT;AAEA,IAAA,OAAO,gBAAA;AAAA,EACT;AAAA,EAEA,QAAA,GAGE;AACA,IAAA,OAAO;AAAA,MACL,mBAAA,EAAqB,IAAA,CAAK,cAAA,CAAe,QAAA,EAAS;AAAA,MAClD,QAAQ,IAAA,CAAK;AAAA,KACf;AAAA,EACF;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,eAAe,KAAA,EAAM;AAAA,EAC5B;AACF;AAKO,IAAM,kBAAN,MAAsB;AAAA,EACnB,kBAAA,uBAA0F,GAAA,EAAI;AAAA,EAEtG,WAAA,GAAc;AACZ,IAAA,IAAA,CAAK,qBAAA,EAAsB;AAAA,EAC7B;AAAA,EAEQ,qBAAA,GAA8B;AAEpC,IAAA,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,eAAA,EAAiB,OAAO,KAAA,KAAU;AAC5D,MAAA,OAAA,CAAQ,IAAI,gEAAyD,CAAA;AACrE,MAAA,MAAM,KAAA;AAAA,IACR,CAAC,CAAA;AAGD,IAAA,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,kBAAA,EAAoB,OAAO,KAAA,KAAU;AAC/D,MAAA,OAAA,CAAQ,IAAI,4DAAqD,CAAA;AACjE,MAAA,MAAM,KAAA;AAAA,IACR,CAAC,CAAA;AAGD,IAAA,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,gBAAA,EAAkB,OAAO,KAAA,KAAU;AAC7D,MAAA,OAAA,CAAQ,KAAK,uFAA6E,CAAA;AAC1F,MAAA,MAAM,KAAA;AAAA,IACR,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,WAAA,CAAe,KAAA,EAA2B,aAAA,EAA+B;AAC7E,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,MAAM,IAAI,CAAA;AAEvD,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,KAAK,CAAA;AACnC,QAAA,OAAO,MAAA;AAAA,MACT,SAAS,cAAA,EAAgB;AACvB,QAAA,OAAA,CAAQ,IAAA,CAAK,kCAAkC,cAAA,YAA0B,KAAA,GAAQ,eAAe,OAAA,GAAU,MAAA,CAAO,cAAc,CAAC,CAAA;AAAA,MAClI;AAAA,IACF;AAEA,IAAA,IAAI,kBAAkB,MAAA,EAAW;AAC/B,MAAA,OAAA,CAAQ,IAAI,+BAA+B,CAAA;AAC3C,MAAA,OAAO,aAAA;AAAA,IACT;AAEA,IAAA,MAAM,KAAA;AAAA,EACR;AAAA,EAEA,gBAAA,CAAoB,WAAsB,QAAA,EAA2D;AACnG,IAAA,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,SAAA,EAAW,QAAQ,CAAA;AAAA,EACjD;AACF;AAKO,IAAM,mBAAN,MAAuB;AAAA,EACpB,YAAA;AAAA,EACA,eAAA;AAAA,EAER,YAAY,WAAA,EAAoC;AAC9C,IAAA,IAAA,CAAK,YAAA,GAAe,IAAI,YAAA,CAAa,EAAE,GAAGA,qBAAAA,EAAsB,GAAG,aAAa,CAAA;AAChF,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAI,eAAA,EAAgB;AAAA,EAC7C;AAAA,EAEA,MAAM,wBAAA,CACJ,SAAA,EACA,OAAA,EACA,aAAA,EACiC;AACjC,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,YAAA,CAAa,QAAQ,YAAY;AACzD,QAAA,MAAM,QAAA,GAAW,MAAM,SAAA,EAAU;AAEjC,QAAA,IAAI,CAAC,QAAA,CAAS,OAAA,IAAW,QAAA,CAAS,KAAA,EAAO;AACvC,UAAA,MAAM,IAAI,kBAAA;AAAA,YACR,QAAA,CAAS,KAAA;AAAA,YACT,QAAA,CAAS,OAAA,IAAW,CAAA,uBAAA,EAA0B,QAAA,CAAS,KAAK,CAAA;AAAA,WAC9D;AAAA,QACF;AAEA,QAAA,OAAO,QAAA;AAAA,MACT,GAAG,OAAO,CAAA;AAEV,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,SAAA,GAAY,KAAA,YAAiB,kBAAA,GAC/B,KAAA,GACA,IAAI,kBAAA,CAAmB,gBAAA,EAAkB,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAEnG,MAAA,IAAI;AACF,QAAA,MAAM,iBAAiB,MAAM,IAAA,CAAK,eAAA,CAAgB,WAAA,CAAY,WAAW,aAAa,CAAA;AACtF,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,IAAA;AAAA,UACT,IAAA,EAAM,cAAA;AAAA,UACN,OAAA,EAAS;AAAA,SACX;AAAA,MACF,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,OAAO,SAAA,CAAU,IAAA;AAAA,UACjB,SAAS,SAAA,CAAU,OAAA;AAAA,UACnB,QAAA,EAAU;AAAA,SACZ;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAA,CAAoB,WAAsB,QAAA,EAA2D;AACnG,IAAA,IAAA,CAAK,eAAA,CAAgB,gBAAA,CAAiB,SAAA,EAAW,QAAQ,CAAA;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAGE;AACA,IAAA,OAAO;AAAA,MACL,UAAA,EAAY,IAAA,CAAK,YAAA,CAAa,QAAA,EAAS;AAAA,MACvC,mBAAA,EAAqB,MAAM,IAAA,CAAK,IAAA,CAAK,gBAAgB,oBAAoB,CAAA,CAAE,MAAM;AAAA,KACnF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,aAAa,KAAA,EAAM;AAAA,EAC1B;AACF;AAKO,SAAS,uBAAuB,MAAA,EAMlB;AACnB,EAAA,MAAM,OAAA,GAAU,IAAI,gBAAA,CAAiB,MAAA,EAAQ,WAAW,CAAA;AAExD,EAAA,IAAI,QAAQ,eAAA,EAAiB;AAC3B,IAAA,KAAA,MAAW,EAAE,SAAA,EAAW,QAAA,EAAS,IAAK,OAAO,eAAA,EAAiB;AAC5D,MAAA,OAAA,CAAQ,gBAAA,CAAiB,WAAW,QAAQ,CAAA;AAAA,IAC9C;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;AAKO,SAAS,YAAY,KAAA,EAA6C;AACvE,EAAA,OAAO,KAAA,YAAiB,kBAAA;AAC1B;AAKA,eAAsB,qBAAA,CACpB,SAAA,EACA,OAAA,EACA,YAAA,EACiC;AACjC,EAAA,MAAM,OAAA,GAAU,YAAA,IAAgB,IAAI,gBAAA,EAAiB;AAErD,EAAA,OAAO,OAAA,CAAQ,wBAAA;AAAA,IACb,YAAY;AACV,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,SAAA,EAAU;AAC/B,QAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,MAAA,EAAO;AAAA,MACvC,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,SAAA,GAAY,KAAA,YAAiB,kBAAA,GAC/B,KAAA,CAAM,IAAA,GACN,gBAAA;AAEJ,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO,SAAA;AAAA,UACP,SAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,SAChE;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IACA;AAAA,GACF;AACF;;;ACraA,IAAM,sBAAA,GAAyB,EAAA;AAE/B,IAAM,aAAa,CAAC,MAAA,GAAS,MAAM,CAAA,IAAA,KAAQ,CAAA,KAAA,EAAU,OAAO,MAAM,CAAA,CAAA,CAAA;AAElE,IAAM,WAAA,GAAc,CAAC,MAAA,GAAS,CAAA,KAAM,UAAQ,CAAA,KAAA,EAAU,EAAA,GAAK,MAAM,CAAA,GAAA,EAAM,IAAI,CAAA,CAAA,CAAA;AAE3E,IAAM,cAAc,CAAC,MAAA,GAAS,CAAA,KAAM,CAAC,KAAK,KAAA,EAAO,IAAA,KAAS,CAAA,KAAA,EAAU,EAAA,GAAK,MAAM,CAAA,GAAA,EAAM,GAAG,CAAA,CAAA,EAAI,KAAK,IAAI,IAAI,CAAA,CAAA,CAAA;AAEzG,IAAM,MAAA,GAAS;AAAA,EACd,QAAA,EAAU;AAAA,IACT,KAAA,EAAO,CAAC,CAAA,EAAG,CAAC,CAAA;AAAA;AAAA,IAEZ,IAAA,EAAM,CAAC,CAAA,EAAG,EAAE,CAAA;AAAA,IACZ,GAAA,EAAK,CAAC,CAAA,EAAG,EAAE,CAAA;AAAA,IACX,MAAA,EAAQ,CAAC,CAAA,EAAG,EAAE,CAAA;AAAA,IACd,SAAA,EAAW,CAAC,CAAA,EAAG,EAAE,CAAA;AAAA,IACjB,QAAA,EAAU,CAAC,EAAA,EAAI,EAAE,CAAA;AAAA,IACjB,OAAA,EAAS,CAAC,CAAA,EAAG,EAAE,CAAA;AAAA,IACf,MAAA,EAAQ,CAAC,CAAA,EAAG,EAAE,CAAA;AAAA,IACd,aAAA,EAAe,CAAC,CAAA,EAAG,EAAE;AAAA,GACtB;AAAA,EACA,KAAA,EAAO;AAAA,IACN,KAAA,EAAO,CAAC,EAAA,EAAI,EAAE,CAAA;AAAA,IACd,GAAA,EAAK,CAAC,EAAA,EAAI,EAAE,CAAA;AAAA,IACZ,KAAA,EAAO,CAAC,EAAA,EAAI,EAAE,CAAA;AAAA,IACd,MAAA,EAAQ,CAAC,EAAA,EAAI,EAAE,CAAA;AAAA,IACf,IAAA,EAAM,CAAC,EAAA,EAAI,EAAE,CAAA;AAAA,IACb,OAAA,EAAS,CAAC,EAAA,EAAI,EAAE,CAAA;AAAA,IAChB,IAAA,EAAM,CAAC,EAAA,EAAI,EAAE,CAAA;AAAA,IACb,KAAA,EAAO,CAAC,EAAA,EAAI,EAAE,CAAA;AAAA;AAAA,IAGd,WAAA,EAAa,CAAC,EAAA,EAAI,EAAE,CAAA;AAAA,IACpB,IAAA,EAAM,CAAC,EAAA,EAAI,EAAE,CAAA;AAAA;AAAA,IACb,IAAA,EAAM,CAAC,EAAA,EAAI,EAAE,CAAA;AAAA;AAAA,IACb,SAAA,EAAW,CAAC,EAAA,EAAI,EAAE,CAAA;AAAA,IAClB,WAAA,EAAa,CAAC,EAAA,EAAI,EAAE,CAAA;AAAA,IACpB,YAAA,EAAc,CAAC,EAAA,EAAI,EAAE,CAAA;AAAA,IACrB,UAAA,EAAY,CAAC,EAAA,EAAI,EAAE,CAAA;AAAA,IACnB,aAAA,EAAe,CAAC,EAAA,EAAI,EAAE,CAAA;AAAA,IACtB,UAAA,EAAY,CAAC,EAAA,EAAI,EAAE,CAAA;AAAA,IACnB,WAAA,EAAa,CAAC,EAAA,EAAI,EAAE;AAAA,GACrB;AAAA,EACA,OAAA,EAAS;AAAA,IACR,OAAA,EAAS,CAAC,EAAA,EAAI,EAAE,CAAA;AAAA,IAChB,KAAA,EAAO,CAAC,EAAA,EAAI,EAAE,CAAA;AAAA,IACd,OAAA,EAAS,CAAC,EAAA,EAAI,EAAE,CAAA;AAAA,IAChB,QAAA,EAAU,CAAC,EAAA,EAAI,EAAE,CAAA;AAAA,IACjB,MAAA,EAAQ,CAAC,EAAA,EAAI,EAAE,CAAA;AAAA,IACf,SAAA,EAAW,CAAC,EAAA,EAAI,EAAE,CAAA;AAAA,IAClB,MAAA,EAAQ,CAAC,EAAA,EAAI,EAAE,CAAA;AAAA,IACf,OAAA,EAAS,CAAC,EAAA,EAAI,EAAE,CAAA;AAAA;AAAA,IAGhB,aAAA,EAAe,CAAC,GAAA,EAAK,EAAE,CAAA;AAAA,IACvB,MAAA,EAAQ,CAAC,GAAA,EAAK,EAAE,CAAA;AAAA;AAAA,IAChB,MAAA,EAAQ,CAAC,GAAA,EAAK,EAAE,CAAA;AAAA;AAAA,IAChB,WAAA,EAAa,CAAC,GAAA,EAAK,EAAE,CAAA;AAAA,IACrB,aAAA,EAAe,CAAC,GAAA,EAAK,EAAE,CAAA;AAAA,IACvB,cAAA,EAAgB,CAAC,GAAA,EAAK,EAAE,CAAA;AAAA,IACxB,YAAA,EAAc,CAAC,GAAA,EAAK,EAAE,CAAA;AAAA,IACtB,eAAA,EAAiB,CAAC,GAAA,EAAK,EAAE,CAAA;AAAA,IACzB,YAAA,EAAc,CAAC,GAAA,EAAK,EAAE,CAAA;AAAA,IACtB,aAAA,EAAe,CAAC,GAAA,EAAK,EAAE;AAAA;AAEzB,CAAA;AAE6B,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,QAAQ;AACjD,IAAM,oBAAA,GAAuB,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AACrD,IAAM,oBAAA,GAAuB,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACpC,CAAC,GAAG,oBAAA,EAAsB,GAAG,oBAAoB;AAE3E,SAAS,cAAA,GAAiB;AACzB,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAI;AAEtB,EAAA,KAAA,MAAW,CAAC,SAAA,EAAW,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACxD,IAAA,KAAA,MAAW,CAAC,SAAA,EAAW,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AACvD,MAAA,MAAA,CAAO,SAAS,CAAA,GAAI;AAAA,QACnB,IAAA,EAAM,CAAA,KAAA,EAAU,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA,CAAA;AAAA,QACxB,KAAA,EAAO,CAAA,KAAA,EAAU,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAAA,OAC1B;AAEA,MAAA,KAAA,CAAM,SAAS,CAAA,GAAI,MAAA,CAAO,SAAS,CAAA;AAEnC,MAAA,KAAA,CAAM,IAAI,KAAA,CAAM,CAAC,CAAA,EAAG,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,IAC7B;AAEA,IAAA,MAAA,CAAO,cAAA,CAAe,QAAQ,SAAA,EAAW;AAAA,MACxC,KAAA,EAAO,KAAA;AAAA,MACP,UAAA,EAAY;AAAA,KACZ,CAAA;AAAA,EACF;AAEA,EAAA,MAAA,CAAO,cAAA,CAAe,QAAQ,OAAA,EAAS;AAAA,IACtC,KAAA,EAAO,KAAA;AAAA,IACP,UAAA,EAAY;AAAA,GACZ,CAAA;AAED,EAAA,MAAA,CAAO,MAAM,KAAA,GAAQ,UAAA;AACrB,EAAA,MAAA,CAAO,QAAQ,KAAA,GAAQ,UAAA;AAEvB,EAAA,MAAA,CAAO,KAAA,CAAM,OAAO,UAAA,EAAW;AAC/B,EAAA,MAAA,CAAO,KAAA,CAAM,UAAU,WAAA,EAAY;AACnC,EAAA,MAAA,CAAO,KAAA,CAAM,UAAU,WAAA,EAAY;AACnC,EAAA,MAAA,CAAO,OAAA,CAAQ,IAAA,GAAO,UAAA,CAAW,sBAAsB,CAAA;AACvD,EAAA,MAAA,CAAO,OAAA,CAAQ,OAAA,GAAU,WAAA,CAAY,sBAAsB,CAAA;AAC3D,EAAA,MAAA,CAAO,OAAA,CAAQ,OAAA,GAAU,WAAA,CAAY,sBAAsB,CAAA;AAG3D,EAAA,MAAA,CAAO,iBAAiB,MAAA,EAAQ;AAAA,IAC/B,YAAA,EAAc;AAAA,MACb,KAAA,CAAM,GAAA,EAAK,KAAA,EAAO,IAAA,EAAM;AAGvB,QAAA,IAAI,GAAA,KAAQ,KAAA,IAAS,KAAA,KAAU,IAAA,EAAM;AACpC,UAAA,IAAI,MAAM,CAAA,EAAG;AACZ,YAAA,OAAO,EAAA;AAAA,UACR;AAEA,UAAA,IAAI,MAAM,GAAA,EAAK;AACd,YAAA,OAAO,GAAA;AAAA,UACR;AAEA,UAAA,OAAO,KAAK,KAAA,CAAA,CAAQ,GAAA,GAAM,CAAA,IAAK,GAAA,GAAO,EAAE,CAAA,GAAI,GAAA;AAAA,QAC7C;AAEA,QAAA,OAAO,KACH,EAAA,GAAK,IAAA,CAAK,MAAM,GAAA,GAAM,GAAA,GAAM,CAAC,CAAA,GAC7B,CAAA,GAAI,KAAK,KAAA,CAAM,KAAA,GAAQ,MAAM,CAAC,CAAA,GAC/B,KAAK,KAAA,CAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AAAA,MAC7B,CAAA;AAAA,MACA,UAAA,EAAY;AAAA,KACb;AAAA,IACA,QAAA,EAAU;AAAA,MACT,MAAM,GAAA,EAAK;AACV,QAAA,MAAM,UAAU,wBAAA,CAAyB,IAAA,CAAK,GAAA,CAAI,QAAA,CAAS,EAAE,CAAC,CAAA;AAC9D,QAAA,IAAI,CAAC,OAAA,EAAS;AACb,UAAA,OAAO,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAA,QAChB;AAEA,QAAA,IAAI,CAAC,WAAW,CAAA,GAAI,OAAA;AAEpB,QAAA,IAAI,WAAA,CAAY,WAAW,CAAA,EAAG;AAC7B,UAAA,WAAA,GAAc,CAAC,GAAG,WAAW,CAAA,CAAE,GAAA,CAAI,eAAa,SAAA,GAAY,SAAS,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AAAA,QAC/E;AAEA,QAAA,MAAMb,QAAAA,GAAU,MAAA,CAAO,QAAA,CAAS,WAAA,EAAa,EAAE,CAAA;AAE/C,QAAA,OAAO;AAAA;AAAA,UAELA,YAAW,EAAA,GAAM,GAAA;AAAA,UACjBA,YAAW,CAAA,GAAK,GAAA;AAAA,UACjBA,QAAAA,GAAU;AAAA;AAAA,SAEX;AAAA,MACD,CAAA;AAAA,MACA,UAAA,EAAY;AAAA,KACb;AAAA,IACA,YAAA,EAAc;AAAA,MACb,KAAA,EAAO,SAAO,MAAA,CAAO,YAAA,CAAa,GAAG,MAAA,CAAO,QAAA,CAAS,GAAG,CAAC,CAAA;AAAA,MACzD,UAAA,EAAY;AAAA,KACb;AAAA,IACA,aAAA,EAAe;AAAA,MACd,MAAM,IAAA,EAAM;AACX,QAAA,IAAI,OAAO,CAAA,EAAG;AACb,UAAA,OAAO,EAAA,GAAK,IAAA;AAAA,QACb;AAEA,QAAA,IAAI,OAAO,EAAA,EAAI;AACd,UAAA,OAAO,MAAM,IAAA,GAAO,CAAA,CAAA;AAAA,QACrB;AAEA,QAAA,IAAI,GAAA;AACJ,QAAA,IAAI,KAAA;AACJ,QAAA,IAAI,IAAA;AAEJ,QAAA,IAAI,QAAQ,GAAA,EAAK;AAChB,UAAA,GAAA,GAAA,CAAA,CAAS,IAAA,GAAO,GAAA,IAAO,EAAA,GAAM,CAAA,IAAK,GAAA;AAClC,UAAA,KAAA,GAAQ,GAAA;AACR,UAAA,IAAA,GAAO,GAAA;AAAA,QACR,CAAA,MAAO;AACN,UAAA,IAAA,IAAQ,EAAA;AAER,UAAA,MAAM,YAAY,IAAA,GAAO,EAAA;AAEzB,UAAA,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,EAAE,CAAA,GAAI,CAAA;AAC9B,UAAA,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,SAAA,GAAY,CAAC,CAAA,GAAI,CAAA;AACpC,UAAA,IAAA,GAAQ,YAAY,CAAA,GAAK,CAAA;AAAA,QAC1B;AAEA,QAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,KAAA,EAAO,IAAI,CAAA,GAAI,CAAA;AAE3C,QAAA,IAAI,UAAU,CAAA,EAAG;AAChB,UAAA,OAAO,EAAA;AAAA,QACR;AAGA,QAAA,IAAI,MAAA,GAAS,EAAA,IAAO,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,IAAK,CAAA,GAAM,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA,IAAK,CAAA,GAAK,IAAA,CAAK,MAAM,GAAG,CAAA,CAAA;AAEtF,QAAA,IAAI,UAAU,CAAA,EAAG;AAChB,UAAA,MAAA,IAAU,EAAA;AAAA,QACX;AAEA,QAAA,OAAO,MAAA;AAAA,MACR,CAAA;AAAA,MACA,UAAA,EAAY;AAAA,KACb;AAAA,IACA,SAAA,EAAW;AAAA,MACV,KAAA,EAAO,CAAC,GAAA,EAAK,KAAA,EAAO,IAAA,KAAS,MAAA,CAAO,aAAA,CAAc,MAAA,CAAO,YAAA,CAAa,GAAA,EAAK,KAAA,EAAO,IAAI,CAAC,CAAA;AAAA,MACvF,UAAA,EAAY;AAAA,KACb;AAAA,IACA,SAAA,EAAW;AAAA,MACV,OAAO,CAAA,GAAA,KAAO,MAAA,CAAO,cAAc,MAAA,CAAO,YAAA,CAAa,GAAG,CAAC,CAAA;AAAA,MAC3D,UAAA,EAAY;AAAA;AACb,GACA,CAAA;AAED,EAAA,OAAO,MAAA;AACR;AAEA,IAAM,aAAa,cAAA,EAAe;AAElC,IAAO,mBAAA,GAAQ,UAAA;ACxNf,SAAS,OAAA,CAAQ,MAAM,IAAA,GAAO,UAAA,CAAW,OAAO,UAAA,CAAW,IAAA,CAAK,IAAA,GAAOc,QAAAA,CAAQ,IAAA,EAAM;AACpF,EAAA,MAAM,MAAA,GAAS,KAAK,UAAA,CAAW,GAAG,IAAI,EAAA,GAAM,IAAA,CAAK,MAAA,KAAW,CAAA,GAAI,GAAA,GAAM,IAAA;AACtE,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,MAAA,GAAS,IAAI,CAAA;AAC3C,EAAA,MAAM,kBAAA,GAAqB,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAA;AAC5C,EAAA,OAAO,QAAA,KAAa,EAAA,KAAO,kBAAA,KAAuB,EAAA,IAAM,QAAA,GAAW,kBAAA,CAAA;AACpE;AAEA,IAAM,EAAC,KAAG,GAAIA,QAAAA;AAEd,IAAI,cAAA;AACJ,IACC,OAAA,CAAQ,UAAU,CAAA,IACf,OAAA,CAAQ,WAAW,CAAA,IACnB,OAAA,CAAQ,aAAa,CAAA,IACrB,OAAA,CAAQ,aAAa,CAAA,EACvB;AACD,EAAA,cAAA,GAAiB,CAAA;AAClB,CAAA,MAAA,IACC,OAAA,CAAQ,OAAO,CAAA,IACZ,OAAA,CAAQ,QAAQ,CAAA,IAChB,OAAA,CAAQ,YAAY,CAAA,IACpB,OAAA,CAAQ,cAAc,CAAA,EACxB;AACD,EAAA,cAAA,GAAiB,CAAA;AAClB;AAEA,SAAS,aAAA,GAAgB;AACxB,EAAA,IAAI,iBAAiB,GAAA,EAAK;AACzB,IAAA,IAAI,GAAA,CAAI,gBAAgB,MAAA,EAAQ;AAC/B,MAAA,OAAO,CAAA;AAAA,IACR;AAEA,IAAA,IAAI,GAAA,CAAI,gBAAgB,OAAA,EAAS;AAChC,MAAA,OAAO,CAAA;AAAA,IACR;AAEA,IAAA,OAAO,GAAA,CAAI,WAAA,CAAY,MAAA,KAAW,CAAA,GAAI,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,QAAA,CAAS,GAAA,CAAI,WAAA,EAAa,EAAE,GAAG,CAAC,CAAA;AAAA,EAC3F;AACD;AAEA,SAAS,eAAe,KAAA,EAAO;AAC9B,EAAA,IAAI,UAAU,CAAA,EAAG;AAChB,IAAA,OAAO,KAAA;AAAA,EACR;AAEA,EAAA,OAAO;AAAA,IACN,KAAA;AAAA,IACA,QAAA,EAAU,IAAA;AAAA,IACV,QAAQ,KAAA,IAAS,CAAA;AAAA,IACjB,QAAQ,KAAA,IAAS;AAAA,GAClB;AACD;AAEA,SAAS,cAAA,CAAe,YAAY,EAAC,WAAA,EAAa,aAAa,IAAA,EAAI,GAAI,EAAC,EAAG;AAC1E,EAAA,MAAM,mBAAmB,aAAA,EAAc;AACvC,EAAA,IAAI,qBAAqB,MAAA,EAAW;AACnC,IAAA,cAAA,GAAiB,gBAAA;AAAA,EAClB;AAEA,EAAA,MAAM,UAAA,GAAa,aAAa,cAAA,GAAiB,gBAAA;AAEjD,EAAA,IAAI,eAAe,CAAA,EAAG;AACrB,IAAA,OAAO,CAAA;AAAA,EACR;AAEA,EAAA,IAAI,UAAA,EAAY;AACf,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,IACnB,OAAA,CAAQ,YAAY,CAAA,IACpB,OAAA,CAAQ,iBAAiB,CAAA,EAAG;AAC/B,MAAA,OAAO,CAAA;AAAA,IACR;AAEA,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACzB,MAAA,OAAO,CAAA;AAAA,IACR;AAAA,EACD;AAIA,EAAA,IAAI,UAAA,IAAc,GAAA,IAAO,YAAA,IAAgB,GAAA,EAAK;AAC7C,IAAA,OAAO,CAAA;AAAA,EACR;AAEA,EAAA,IAAI,UAAA,IAAc,CAAC,WAAA,IAAe,UAAA,KAAe,MAAA,EAAW;AAC3D,IAAA,OAAO,CAAA;AAAA,EACR;AAEA,EAAA,MAAM,MAAM,UAAA,IAAc,CAAA;AAE1B,EAAA,IAAI,GAAA,CAAI,SAAS,MAAA,EAAQ;AACxB,IAAA,OAAO,GAAA;AAAA,EACR;AAEA,EAAA,IAAIA,QAAAA,CAAQ,aAAa,OAAA,EAAS;AAGjC,IAAA,MAAM,SAAA,GAAY,EAAA,CAAG,OAAA,EAAQ,CAAE,MAAM,GAAG,CAAA;AACxC,IAAA,IACC,MAAA,CAAO,SAAA,CAAU,CAAC,CAAC,CAAA,IAAK,EAAA,IACrB,MAAA,CAAO,SAAA,CAAU,CAAC,CAAC,CAAA,IAAK,KAAA,EAC1B;AACD,MAAA,OAAO,OAAO,SAAA,CAAU,CAAC,CAAC,CAAA,IAAK,QAAS,CAAA,GAAI,CAAA;AAAA,IAC7C;AAEA,IAAA,OAAO,CAAA;AAAA,EACR;AAEA,EAAA,IAAI,QAAQ,GAAA,EAAK;AAChB,IAAA,IAAI,CAAC,kBAAkB,eAAA,EAAiB,UAAU,EAAE,IAAA,CAAK,CAAA,GAAA,KAAO,GAAA,IAAO,GAAG,CAAA,EAAG;AAC5E,MAAA,OAAO,CAAA;AAAA,IACR;AAEA,IAAA,IAAI,CAAC,QAAA,EAAU,UAAA,EAAY,WAAA,EAAa,aAAa,OAAO,CAAA,CAAE,IAAA,CAAK,CAAA,IAAA,KAAQ,IAAA,IAAQ,GAAG,CAAA,IAAK,GAAA,CAAI,YAAY,UAAA,EAAY;AACtH,MAAA,OAAO,CAAA;AAAA,IACR;AAEA,IAAA,OAAO,GAAA;AAAA,EACR;AAEA,EAAA,IAAI,sBAAsB,GAAA,EAAK;AAC9B,IAAA,OAAO,+BAAA,CAAgC,IAAA,CAAK,GAAA,CAAI,gBAAgB,IAAI,CAAA,GAAI,CAAA;AAAA,EACzE;AAEA,EAAA,IAAI,GAAA,CAAI,cAAc,WAAA,EAAa;AAClC,IAAA,OAAO,CAAA;AAAA,EACR;AAEA,EAAA,IAAI,GAAA,CAAI,SAAS,aAAA,EAAe;AAC/B,IAAA,OAAO,CAAA;AAAA,EACR;AAEA,EAAA,IAAI,GAAA,CAAI,SAAS,eAAA,EAAiB;AACjC,IAAA,OAAO,CAAA;AAAA,EACR;AAEA,EAAA,IAAI,GAAA,CAAI,SAAS,SAAA,EAAW;AAC3B,IAAA,OAAO,CAAA;AAAA,EACR;AAEA,EAAA,IAAI,kBAAkB,GAAA,EAAK;AAC1B,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,QAAA,CAAA,CAAU,GAAA,CAAI,oBAAA,IAAwB,EAAA,EAAI,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,EAAG,EAAE,CAAA;AAElF,IAAA,QAAQ,IAAI,YAAA;AAAc,MACzB,KAAK,WAAA,EAAa;AACjB,QAAA,OAAO,OAAA,IAAW,IAAI,CAAA,GAAI,CAAA;AAAA,MAC3B;AAAA,MAEA,KAAK,gBAAA,EAAkB;AACtB,QAAA,OAAO,CAAA;AAAA,MACR;AAAA;AAED,EACD;AAEA,EAAA,IAAI,gBAAA,CAAiB,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,EAAG;AACpC,IAAA,OAAO,CAAA;AAAA,EACR;AAEA,EAAA,IAAI,6DAAA,CAA8D,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,EAAG;AACjF,IAAA,OAAO,CAAA;AAAA,EACR;AAEA,EAAA,IAAI,eAAe,GAAA,EAAK;AACvB,IAAA,OAAO,CAAA;AAAA,EACR;AAEA,EAAA,OAAO,GAAA;AACR;AAEO,SAAS,mBAAA,CAAoB,MAAA,EAAQ,OAAA,GAAU,EAAC,EAAG;AACzD,EAAA,MAAM,KAAA,GAAQ,eAAe,MAAA,EAAQ;AAAA,IACpC,WAAA,EAAa,UAAU,MAAA,CAAO,KAAA;AAAA,IAC9B,GAAG;AAAA,GACH,CAAA;AAED,EAAA,OAAO,eAAe,KAAK,CAAA;AAC5B;AAEA,IAAM,aAAA,GAAgB;AAAA,EACrB,MAAA,EAAQ,oBAAoB,EAAC,KAAA,EAAO,IAAI,MAAA,CAAO,CAAC,GAAE,CAAA;AAAA,EAClD,MAAA,EAAQ,oBAAoB,EAAC,KAAA,EAAO,IAAI,MAAA,CAAO,CAAC,GAAE;AACnD,CAAA;AAEA,IAAO,sBAAA,GAAQ,aAAA;;;AC5LR,SAAS,gBAAA,CAAiB,MAAA,EAAQ,SAAA,EAAW,QAAA,EAAU;AAC7D,EAAA,IAAIb,MAAAA,GAAQ,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA;AACpC,EAAA,IAAIA,WAAU,EAAA,EAAI;AACjB,IAAA,OAAO,MAAA;AAAA,EACR;AAEA,EAAA,MAAM,kBAAkB,SAAA,CAAU,MAAA;AAClC,EAAA,IAAI,QAAA,GAAW,CAAA;AACf,EAAA,IAAI,WAAA,GAAc,EAAA;AAClB,EAAA,GAAG;AACF,IAAA,WAAA,IAAe,MAAA,CAAO,KAAA,CAAM,QAAA,EAAUA,MAAK,IAAI,SAAA,GAAY,QAAA;AAC3D,IAAA,QAAA,GAAWA,MAAAA,GAAQ,eAAA;AACnB,IAAAA,MAAAA,GAAQ,MAAA,CAAO,OAAA,CAAQ,SAAA,EAAW,QAAQ,CAAA;AAAA,EAC3C,SAASA,MAAAA,KAAU,EAAA;AAEnB,EAAA,WAAA,IAAe,MAAA,CAAO,MAAM,QAAQ,CAAA;AACpC,EAAA,OAAO,WAAA;AACR;AAEO,SAAS,8BAAA,CAA+B,MAAA,EAAQ,MAAA,EAAQ,OAAA,EAASA,MAAAA,EAAO;AAC9E,EAAA,IAAI,QAAA,GAAW,CAAA;AACf,EAAA,IAAI,WAAA,GAAc,EAAA;AAClB,EAAA,GAAG;AACF,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAOA,MAAAA,GAAQ,CAAC,CAAA,KAAM,IAAA;AACpC,IAAA,WAAA,IAAe,MAAA,CAAO,KAAA,CAAM,QAAA,EAAW,KAAA,GAAQA,MAAAA,GAAQ,CAAA,GAAIA,MAAM,CAAA,GAAI,MAAA,IAAU,KAAA,GAAQ,MAAA,GAAS,IAAA,CAAA,GAAQ,OAAA;AACxG,IAAA,QAAA,GAAWA,MAAAA,GAAQ,CAAA;AACnB,IAAAA,MAAAA,GAAQ,MAAA,CAAO,OAAA,CAAQ,IAAA,EAAM,QAAQ,CAAA;AAAA,EACtC,SAASA,MAAAA,KAAU,EAAA;AAEnB,EAAA,WAAA,IAAe,MAAA,CAAO,MAAM,QAAQ,CAAA;AACpC,EAAA,OAAO,WAAA;AACR;;;ACzBA,IAAM,EAAC,MAAA,EAAQ,WAAA,EAAa,MAAA,EAAQ,aAAW,GAAI,sBAAA;AAEnD,IAAM,SAAA,0BAAmB,WAAW,CAAA;AACpC,IAAM,MAAA,0BAAgB,QAAQ,CAAA;AAC9B,IAAM,QAAA,0BAAkB,UAAU,CAAA;AAGlC,IAAM,YAAA,GAAe;AAAA,EACpB,MAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA;AACD,CAAA;AAEA,IAAMc,OAAAA,mBAAS,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA;AAEjC,IAAM,YAAA,GAAe,CAAC,MAAA,EAAQ,OAAA,GAAU,EAAC,KAAM;AAC9C,EAAA,IAAI,OAAA,CAAQ,KAAA,IAAS,EAAE,MAAA,CAAO,SAAA,CAAU,OAAA,CAAQ,KAAK,CAAA,IAAK,OAAA,CAAQ,KAAA,IAAS,CAAA,IAAK,OAAA,CAAQ,SAAS,CAAA,CAAA,EAAI;AACpG,IAAA,MAAM,IAAI,MAAM,qDAAqD,CAAA;AAAA,EACtE;AAGA,EAAA,MAAM,UAAA,GAAa,WAAA,GAAc,WAAA,CAAY,KAAA,GAAQ,CAAA;AACrD,EAAA,MAAA,CAAO,KAAA,GAAQ,OAAA,CAAQ,KAAA,KAAU,MAAA,GAAY,aAAa,OAAA,CAAQ,KAAA;AACnE,CAAA;AASA,IAAM,eAAe,CAAA,OAAA,KAAW;AAC/B,EAAA,MAAMC,MAAAA,GAAQ,CAAA,GAAI,OAAA,KAAY,OAAA,CAAQ,KAAK,GAAG,CAAA;AAC9C,EAAA,YAAA,CAAaA,QAAO,OAAO,CAAA;AAE3B,EAAA,MAAA,CAAO,cAAA,CAAeA,MAAAA,EAAO,WAAA,CAAY,SAAS,CAAA;AAElD,EAAA,OAAOA,MAAAA;AACR,CAAA;AAEA,SAAS,YAAY,OAAA,EAAS;AAC7B,EAAA,OAAO,aAAa,OAAO,CAAA;AAC5B;AAEA,MAAA,CAAO,cAAA,CAAe,WAAA,CAAY,SAAA,EAAW,QAAA,CAAS,SAAS,CAAA;AAE/D,KAAA,MAAW,CAAC,SAAA,EAAW,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,mBAAU,CAAA,EAAG;AAC5D,EAAAD,OAAAA,CAAO,SAAS,CAAA,GAAI;AAAA,IACnB,GAAA,GAAM;AACL,MAAA,MAAM,OAAA,GAAU,aAAA,CAAc,IAAA,EAAM,YAAA,CAAa,MAAM,IAAA,EAAM,KAAA,CAAM,KAAA,EAAO,IAAA,CAAK,MAAM,CAAC,CAAA,EAAG,IAAA,CAAK,QAAQ,CAAC,CAAA;AACvG,MAAA,MAAA,CAAO,eAAe,IAAA,EAAM,SAAA,EAAW,EAAC,KAAA,EAAO,SAAQ,CAAA;AACvD,MAAA,OAAO,OAAA;AAAA,IACR;AAAA,GACD;AACD;AAEAA,OAAAA,CAAO,OAAA,GAAU;AAAA,EAChB,GAAA,GAAM;AACL,IAAA,MAAM,UAAU,aAAA,CAAc,IAAA,EAAM,IAAA,CAAK,MAAM,GAAG,IAAI,CAAA;AACtD,IAAA,MAAA,CAAO,eAAe,IAAA,EAAM,SAAA,EAAW,EAAC,KAAA,EAAO,SAAQ,CAAA;AACvD,IAAA,OAAO,OAAA;AAAA,EACR;AACD,CAAA;AAEA,IAAM,YAAA,GAAe,CAAC,KAAA,EAAO,KAAA,EAAO,SAAS,UAAA,KAAe;AAC3D,EAAA,IAAI,UAAU,KAAA,EAAO;AACpB,IAAA,IAAI,UAAU,SAAA,EAAW;AACxB,MAAA,OAAO,mBAAA,CAAW,IAAI,CAAA,CAAE,OAAA,CAAQ,GAAG,UAAU,CAAA;AAAA,IAC9C;AAEA,IAAA,IAAI,UAAU,SAAA,EAAW;AACxB,MAAA,OAAO,mBAAA,CAAW,IAAI,CAAA,CAAE,OAAA,CAAQ,oBAAW,YAAA,CAAa,GAAG,UAAU,CAAC,CAAA;AAAA,IACvE;AAEA,IAAA,OAAO,mBAAA,CAAW,IAAI,CAAA,CAAE,IAAA,CAAK,oBAAW,SAAA,CAAU,GAAG,UAAU,CAAC,CAAA;AAAA,EACjE;AAEA,EAAA,IAAI,UAAU,KAAA,EAAO;AACpB,IAAA,OAAO,YAAA,CAAa,OAAO,KAAA,EAAO,IAAA,EAAM,GAAG,mBAAA,CAAW,QAAA,CAAS,GAAG,UAAU,CAAC,CAAA;AAAA,EAC9E;AAEA,EAAA,OAAO,oBAAW,IAAI,CAAA,CAAE,KAAK,CAAA,CAAE,GAAG,UAAU,CAAA;AAC7C,CAAA;AAEA,IAAM,UAAA,GAAa,CAAC,KAAA,EAAO,KAAA,EAAO,SAAS,CAAA;AAE3C,KAAA,MAAW,SAAS,UAAA,EAAY;AAC/B,EAAAA,OAAAA,CAAO,KAAK,CAAA,GAAI;AAAA,IACf,GAAA,GAAM;AACL,MAAA,MAAM,EAAC,OAAK,GAAI,IAAA;AAChB,MAAA,OAAO,YAAa,UAAA,EAAY;AAC/B,QAAA,MAAM,SAAS,YAAA,CAAa,YAAA,CAAa,KAAA,EAAO,YAAA,CAAa,KAAK,CAAA,EAAG,OAAA,EAAS,GAAG,UAAU,GAAG,mBAAA,CAAW,KAAA,CAAM,KAAA,EAAO,IAAA,CAAK,MAAM,CAAC,CAAA;AAClI,QAAA,OAAO,aAAA,CAAc,IAAA,EAAM,MAAA,EAAQ,IAAA,CAAK,QAAQ,CAAC,CAAA;AAAA,MAClD,CAAA;AAAA,IACD;AAAA,GACD;AAEA,EAAA,MAAM,OAAA,GAAU,OAAO,KAAA,CAAM,CAAC,EAAE,WAAA,EAAY,GAAI,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA;AAC7D,EAAAA,OAAAA,CAAO,OAAO,CAAA,GAAI;AAAA,IACjB,GAAA,GAAM;AACL,MAAA,MAAM,EAAC,OAAK,GAAI,IAAA;AAChB,MAAA,OAAO,YAAa,UAAA,EAAY;AAC/B,QAAA,MAAM,SAAS,YAAA,CAAa,YAAA,CAAa,KAAA,EAAO,YAAA,CAAa,KAAK,CAAA,EAAG,SAAA,EAAW,GAAG,UAAU,GAAG,mBAAA,CAAW,OAAA,CAAQ,KAAA,EAAO,IAAA,CAAK,MAAM,CAAC,CAAA;AACtI,QAAA,OAAO,aAAA,CAAc,IAAA,EAAM,MAAA,EAAQ,IAAA,CAAK,QAAQ,CAAC,CAAA;AAAA,MAClD,CAAA;AAAA,IACD;AAAA,GACD;AACD;AAEA,IAAM,KAAA,GAAQ,MAAA,CAAO,gBAAA,CAAiB,MAAM;AAAC,CAAA,EAAG;AAAA,EAC/C,GAAGA,OAAAA;AAAA,EACH,KAAA,EAAO;AAAA,IACN,UAAA,EAAY,IAAA;AAAA,IACZ,GAAA,GAAM;AACL,MAAA,OAAO,IAAA,CAAK,SAAS,CAAA,CAAE,KAAA;AAAA,IACxB,CAAA;AAAA,IACA,IAAI,KAAA,EAAO;AACV,MAAA,IAAA,CAAK,SAAS,EAAE,KAAA,GAAQ,KAAA;AAAA,IACzB;AAAA;AAEF,CAAC,CAAA;AAED,IAAM,YAAA,GAAe,CAAC,IAAA,EAAM,KAAA,EAAO,MAAA,KAAW;AAC7C,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI,WAAW,MAAA,EAAW;AACzB,IAAA,OAAA,GAAU,IAAA;AACV,IAAA,QAAA,GAAW,KAAA;AAAA,EACZ,CAAA,MAAO;AACN,IAAA,OAAA,GAAU,OAAO,OAAA,GAAU,IAAA;AAC3B,IAAA,QAAA,GAAW,QAAQ,MAAA,CAAO,QAAA;AAAA,EAC3B;AAEA,EAAA,OAAO;AAAA,IACN,IAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACD;AACD,CAAA;AAEA,IAAM,aAAA,GAAgB,CAAC,IAAA,EAAM,OAAA,EAAS,QAAA,KAAa;AAGlD,EAAA,MAAM,OAAA,GAAU,CAAA,GAAI,UAAA,KAAe,UAAA,CAAW,SAAU,UAAA,CAAW,MAAA,KAAW,CAAA,GAAM,EAAA,GAAK,WAAW,CAAC,CAAA,GAAK,UAAA,CAAW,IAAA,CAAK,GAAG,CAAC,CAAA;AAI9H,EAAA,MAAA,CAAO,cAAA,CAAe,SAAS,KAAK,CAAA;AAEpC,EAAA,OAAA,CAAQ,SAAS,CAAA,GAAI,IAAA;AACrB,EAAA,OAAA,CAAQ,MAAM,CAAA,GAAI,OAAA;AAClB,EAAA,OAAA,CAAQ,QAAQ,CAAA,GAAI,QAAA;AAEpB,EAAA,OAAO,OAAA;AACR,CAAA;AAEA,IAAM,UAAA,GAAa,CAAC,IAAA,EAAM,MAAA,KAAW;AACpC,EAAA,IAAI,IAAA,CAAK,KAAA,IAAS,CAAA,IAAK,CAAC,MAAA,EAAQ;AAC/B,IAAA,OAAO,IAAA,CAAK,QAAQ,CAAA,GAAI,EAAA,GAAK,MAAA;AAAA,EAC9B;AAEA,EAAA,IAAI,MAAA,GAAS,KAAK,MAAM,CAAA;AAExB,EAAA,IAAI,WAAW,MAAA,EAAW;AACzB,IAAA,OAAO,MAAA;AAAA,EACR;AAEA,EAAA,MAAM,EAAC,OAAA,EAAS,QAAA,EAAQ,GAAI,MAAA;AAC5B,EAAA,IAAI,MAAA,CAAO,QAAA,CAAS,MAAQ,CAAA,EAAG;AAC9B,IAAA,OAAO,WAAW,MAAA,EAAW;AAI5B,MAAA,MAAA,GAAS,gBAAA,CAAiB,MAAA,EAAQ,MAAA,CAAO,KAAA,EAAO,OAAO,IAAI,CAAA;AAE3D,MAAA,MAAA,GAAS,MAAA,CAAO,MAAA;AAAA,IACjB;AAAA,EACD;AAKA,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA;AACnC,EAAA,IAAI,YAAY,EAAA,EAAI;AACnB,IAAA,MAAA,GAAS,8BAAA,CAA+B,MAAA,EAAQ,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAAA,EAC3E;AAEA,EAAA,OAAO,UAAU,MAAA,GAAS,QAAA;AAC3B,CAAA;AAEA,MAAA,CAAO,gBAAA,CAAiB,WAAA,CAAY,SAAA,EAAWA,OAAM,CAAA;AAErD,IAAM,QAAQ,WAAA,EAAY;AACC,YAAY,EAAC,KAAA,EAAO,cAAc,WAAA,CAAY,KAAA,GAAQ,GAAE;AAoBnF,IAAO,cAAA,GAAQ,KAAA;ACvJR,IAAM,uBAAN,MAA2B;AAAA,EACxB,GAAA;AAAA,EACA,UAAA,GAAyB,WAAA;AAAA,EACzB,WAAA;AAAA,EAER,WAAA,CAAY,MAAA,EAAgB,UAAA,GAAyB,WAAA,EAAa;AAEhE,IAAA,IAAA,CAAK,WAAA,GAAc,MAAA,CAAO,QAAA,CAAS,QAAQ,CAAA;AAG3C,IAAA,IAAA,CAAK,GAAA,GAAMZ,gBAAgB,MAAM,CAAA;AAEjC,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,CACJ,YAAA,EACA,OAAA,EACwB;AACxB,IAAA,MAAM;AAAA,MACJ,MAAA;AAAA,MACA,SAAA,GAAY,MAAA;AAAA,MACZ,UAAA,GAAa,CAAA;AAAA,MACb,UAAA,GAAa,GAAA;AAAA,MACb,WAAA,GAAc,IAAA;AAAA,MACd,cAAA;AAAA,MACA,gBAAgB,EAAC;AAAA,MACjB,OAAA,GAAU;AAAA,KACZ,GAAI,OAAA;AAEJ,IAAA,MAAM,GAAA,GAAM,CAAC,OAAA,KAAoB;AAC/B,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,OAAA,CAAQ,IAAI,cAAA,CAAM,IAAA,CAAK,CAAA,gBAAA,EAAmB,OAAO,EAAE,CAAC,CAAA;AAAA,MACtD;AAAA,IACF,CAAA;AAEA,IAAA,IAAI,QAAA,GAAW,CAAA;AAEf,IAAA,IAAI;AAEF,MAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,UAAA,CAAW,YAAY,CAAA;AACzD,MAAA,GAAA,CAAI,CAAA,iBAAA,EAAoB,IAAA,CAAK,SAAA,CAAU,cAAc,CAAC,CAAA,IAAA,CAAM,CAAA;AAE5D,MAAA,IAAI,kBAAkB,SAAA,EAAW;AAC/B,QAAA,GAAA,CAAI,CAAA,qCAAA,CAAuC,CAAA;AAC3C,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,IAAA;AAAA,UACT,OAAA,EAAS,cAAA;AAAA,UACT,MAAA,EAAQ,UAAA;AAAA,UACR,QAAA,EAAU;AAAA,SACZ;AAAA,MACF;AAEA,MAAA,MAAM,SAAS,MAAA,GAAS,cAAA;AACxB,MAAA,GAAA,CAAI,CAAA,cAAA,EAAiB,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA,IAAA,CAAM,CAAA;AAGjD,MAAA,IAAI,IAAA,CAAK,WAAA,IAAe,gBAAA,IAAoB,IAAA,CAAK,GAAA,EAAK;AACpD,QAAA,GAAA,CAAI,CAAA,4BAAA,CAA8B,CAAA;AAClC,QAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,UAAA;AAAA,UAC/B,YAAA;AAAA,UACA,MAAA;AAAA,UACA,UAAA;AAAA,UACA,UAAA;AAAA,UACA;AAAA,SACF;AAEA,QAAA,IAAI,cAAc,OAAA,EAAS;AACzB,UAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,UAAA,CAAW,YAAY,CAAA;AACvD,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,IAAA;AAAA,YACT,OAAA,EAAS,YAAA;AAAA,YACT,MAAA,EAAQ,SAAA;AAAA,YACR,UAAU,aAAA,CAAc,QAAA;AAAA,YACxB,WAAW,aAAA,CAAc;AAAA,WAC3B;AAAA,QACF;AAEA,QAAA,QAAA,IAAY,aAAA,CAAc,QAAA;AAC1B,QAAA,GAAA,CAAI,CAAA,qBAAA,EAAwB,aAAA,CAAc,QAAQ,CAAA,SAAA,CAAW,CAAA;AAAA,MAC/D;AAGA,MAAA,IAAI,eAAe,cAAA,EAAgB;AACjC,QAAA,GAAA,CAAI,CAAA,qCAAA,CAAuC,CAAA;AAC3C,QAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,kBAAA;AAAA,UAChC,YAAA;AAAA,UACA,MAAA;AAAA,UACA,cAAA;AAAA,UACA;AAAA,SACF;AAEA,QAAA,IAAI,eAAe,OAAA,EAAS;AAC1B,UAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,UAAA,CAAW,YAAY,CAAA;AACvD,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,IAAA;AAAA,YACT,OAAA,EAAS,YAAA;AAAA,YACT,MAAA,EAAQ,UAAA;AAAA,YACR,UAAU,QAAA,GAAW,CAAA;AAAA,YACrB,WAAW,cAAA,CAAe;AAAA,WAC5B;AAAA,QACF;AAEA,QAAA,QAAA,EAAA;AACA,QAAA,GAAA,CAAI,CAAA,yBAAA,EAA4B,cAAA,CAAe,KAAK,CAAA,CAAE,CAAA;AAAA,MACxD;AAGA,MAAA,KAAA,MAAW,gBAAgB,aAAA,EAAe;AACxC,QAAA,GAAA,CAAI,CAAA,4CAAA,CAA8C,CAAA;AAClD,QAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,uBAAA;AAAA,UAC9B,YAAA;AAAA,UACA,MAAA;AAAA,UACA,YAAA;AAAA,UACA;AAAA,SACF;AAEA,QAAA,IAAI,aAAa,OAAA,EAAS;AACxB,UAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,UAAA,CAAW,YAAY,CAAA;AACvD,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,IAAA;AAAA,YACT,OAAA,EAAS,YAAA;AAAA,YACT,MAAA,EAAQ,eAAA;AAAA,YACR,UAAU,QAAA,GAAW,CAAA;AAAA,YACrB,WAAW,YAAA,CAAa;AAAA,WAC1B;AAAA,QACF;AAEA,QAAA,QAAA,EAAA;AACA,QAAA,GAAA,CAAI,CAAA,+BAAA,EAAkC,YAAA,CAAa,KAAK,CAAA,CAAE,CAAA;AAAA,MAC5D;AAGA,MAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,IAEjD,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,OAAA,EAAS,MAAM,IAAA,CAAK,UAAA,CAAW,YAAY,CAAA;AAAA,QAC3C,MAAA,EAAQ,SAAA;AAAA,QACR,QAAA;AAAA,QACA,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,UAAA,CACZ,YAAA,EACA,MAAA,EACA,UAAA,EACA,YACA,OAAA,EACqF;AAErF,IAAA,IAAI,EAAE,gBAAA,IAAoB,IAAA,CAAK,GAAA,CAAA,EAAM;AACnC,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,QAAA,EAAU,CAAA;AAAA,QACV,KAAA,EAAO;AAAA,OACT;AAAA,IACF;AAEA,IAAA,IAAI,QAAA,GAAW,CAAA;AAEf,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,UAAA,EAAY,CAAA,EAAA,EAAK;AACnC,MAAA,QAAA,EAAA;AAEA,MAAA,IAAI;AACF,QAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,GAAA,CAChC,eAAe,YAAA,EAAc,QAAA,CAAS,MAAM,CAAA,EAAG,EAAE,UAAA,EAAY,IAAA,CAAK,UAAA,EAAY,EAC9E,IAAA,EAAK;AAGR,QAAA,MAAM,SAAA,GAAY,eAAA;AAElB,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,OAAA,CAAQ,IAAI,cAAA,CAAM,IAAA,CAAK,CAAA,mCAAA,EAAsC,SAAS,EAAE,CAAC,CAAA;AAAA,QAC3E;AAGA,QAAA,MAAM,IAAA,CAAK,GAAA,CAAI,kBAAA,EAAmB,CAAE,IAAA,EAAK;AAGzC,QAAA,IAAI,SAAA,GAAY,KAAA;AAChB,QAAA,MAAM,WAAA,GAAc,EAAA;AACpB,QAAA,KAAA,IAASc,EAAAA,GAAI,CAAA,EAAGA,EAAAA,GAAI,WAAA,EAAaA,EAAAA,EAAAA,EAAK;AACpC,UAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,GAAA,CAC/B,qBAAqB,CAAC,SAAS,CAAC,CAAA,CAChC,IAAA,EAAK;AAER,UAAA,MAAM,MAAA,GAAS,cAAA,CAAe,KAAA,CAAM,CAAC,CAAA;AACrC,UAAA,IAAI,MAAA,IAAU,MAAA,CAAO,kBAAA,KAAuB,WAAA,EAAa;AACvD,YAAA,SAAA,GAAY,IAAA;AACZ,YAAA;AAAA,UACF;AAEA,UAAA,MAAM,IAAI,OAAA,CAAQ,CAAA,OAAA,KAAW,UAAA,CAAW,OAAA,EAAS,GAAI,CAAC,CAAA;AAAA,QACxD;AAGA,QAAA,MAAM,IAAI,OAAA,CAAQ,CAAA,OAAA,KAAW,UAAA,CAAW,OAAA,EAAS,GAAI,CAAC,CAAA;AAEtD,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,MAAM,IAAI,MAAM,8BAA8B,CAAA;AAAA,QAChD;AAEA,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,IAAA;AAAA,UACT,QAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,OAAA,CAAQ,GAAA,CAAI,eAAM,IAAA,CAAK,CAAA,gCAAA,EAAmC,QAAQ,CAAA,SAAA,EAAY,KAAK,EAAE,CAAC,CAAA;AAAA,QACxF;AAEA,QAAA,IAAI,CAAA,GAAI,aAAa,CAAA,EAAG;AACtB,UAAA,MAAM,IAAI,OAAA,CAAQ,CAAA,OAAA,KAAW,UAAA,CAAW,OAAA,EAAS,UAAU,CAAC,CAAA;AAAA,QAC9D;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,QAAA;AAAA,MACA,KAAA,EAAO;AAAA,KACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,kBAAA,CACZ,YAAA,EACA,MAAA,EACA,gBACA,OAAA,EACmE;AACnE,IAAA,IAAI;AACF,MAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,UAAA,CAAW,cAAc,CAAA;AAC3D,MAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,UAAA,CAAW,eAAe,OAAO,CAAA;AAEpE,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,OAAA,CAAQ,GAAA,CAAI,eAAM,IAAA,CAAK,CAAA,kCAAA,EAAqC,KAAK,SAAA,CAAU,eAAe,CAAC,CAAA,IAAA,CAAM,CAAC,CAAA;AAAA,MACpG;AAEA,MAAA,IAAI,eAAA,GAAkB,MAAA,GAAS,MAAA,CAAO,GAAI,CAAA,EAAG;AAC3C,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO;AAAA,SACT;AAAA,MACF;AAEA,MAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,WAAA;AAAA,QAC3B,cAAA;AAAA,QACA,YAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT;AAAA,OACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,uBAAA,CACZ,YAAA,EACA,MAAA,EACA,cACA,OAAA,EACmE;AACnE,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,UAAA,CAAW,YAAY,CAAA;AACjD,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,UAAA,CAAW,OAAO,OAAO,CAAA;AAEpD,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,OAAA,CAAQ,GAAA,CAAI,eAAM,IAAA,CAAK,CAAA,uCAAA,EAA0C,KAAK,SAAA,CAAU,OAAO,CAAC,CAAA,IAAA,CAAM,CAAC,CAAA;AAAA,MACjG;AAEA,MAAA,IAAI,OAAA,GAAU,MAAA,GAAS,MAAA,CAAO,GAAI,CAAA,EAAG;AACnC,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO;AAAA,SACT;AAAA,MACF;AAEA,MAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,WAAA;AAAA,QAC3B,MAAA;AAAA,QACA,YAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT;AAAA,OACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,WAAA,CACZ,IAAA,EACA,EAAA,EACA,QACA,OAAA,EACiB;AACjB,IAAA,MAAM,EAAE,OAAO,eAAA,EAAgB,GAAI,MAAM,IAAA,CAAK,GAAA,CAAI,kBAAA,EAAmB,CAAE,IAAA,EAAK;AAE5E,IAAA,MAAM,sBAAsB,yBAAA,CAA0B;AAAA,MACpD,MAAA,EAAQ,IAAA;AAAA,MACR,WAAA,EAAa,EAAA;AAAA,MACb;AAAA,KACD,CAAA;AAED,IAAA,MAAM,OAAA,GAAUrB,IAAAA;AAAA,MACdW,wBAAAA,CAAyB,EAAE,OAAA,EAAS,CAAA,EAAG,CAAA;AAAA,MACvC,CAAA,EAAA,KAAMC,6BAAAA,CAA8B,IAAA,CAAK,OAAA,EAAS,EAAE,CAAA;AAAA,MACpD,CAAA,EAAA,KAAMC,2CAAAA,CAA4C,eAAA,EAAiB,EAAE,CAAA;AAAA,MACrE,CAAA,EAAA,KAAM,oCAAA,CAAqC,CAAC,mBAAmB,GAAG,EAAE;AAAA,KACtE;AAEA,IAAA,MAAM,iBAAA,GAAoB,MAAME,iCAAAA,CAAkC,OAAO,CAAA;AACzE,IAAA,MAAM,iBAAA,GAAoBC,gCAAgC,iBAAiB,CAAA;AAE3E,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,GAAA,CAC3B,gBAAgB,iBAAA,EAAmB;AAAA,MAClC,aAAA,EAAe,KAAA;AAAA,MACf,qBAAqB,IAAA,CAAK,UAAA;AAAA,MAC1B,UAAA,EAAY,OAAO,CAAC;AAAA,KACrB,EACA,IAAA,EAAK;AAGR,IAAA,MAAM,SAAA,GAAY,UAAA;AAElB,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,IAAI,cAAA,CAAM,IAAA,CAAK,CAAA,+BAAA,EAAkC,SAAS,EAAE,CAAC,CAAA;AAAA,IACvE;AAGA,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,MAAM,WAAA,GAAc,EAAA;AACpB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,WAAA,EAAa,CAAA,EAAA,EAAK;AACpC,MAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,GAAA,CAC/B,qBAAqB,CAAC,SAAS,CAAC,CAAA,CAChC,IAAA,EAAK;AAER,MAAA,MAAM,MAAA,GAAS,cAAA,CAAe,KAAA,CAAM,CAAC,CAAA;AACrC,MAAA,IAAI,MAAA,IAAU,MAAA,CAAO,kBAAA,KAAuB,WAAA,EAAa;AACvD,QAAA,SAAA,GAAY,IAAA;AACZ,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,IAAI,OAAA,CAAQ,CAAA,OAAA,KAAW,UAAA,CAAW,OAAA,EAAS,GAAI,CAAC,CAAA;AAAA,IACxD;AAEA,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,MAAM,IAAI,MAAM,kCAAkC,CAAA;AAAA,IACpD;AAEA,IAAA,OAAO,SAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,WAAW,YAAA,EAA8D;AACrF,IAAA,IAAI,OAAO,iBAAiB,QAAA,EAAU;AACpC,MAAA,OAAO,YAAA;AAAA,IACT;AAGA,IAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,GAAA,CAAI,YAAY,CAAA;AACzC,IAAA,IAAI,QAAA,EAAU;AAEZ,MAAA,IAAI;AACF,QAAA,MAAMM,WAAAA,GAAa,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AACtC,QAAA,OAAO,MAAM,4BAAA,CAA6B,IAAI,UAAA,CAAWA,WAAU,CAAC,CAAA;AAAA,MACtE,CAAA,CAAA,MAAQ;AAEN,QAAA,IAAI;AACF,UAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA;AAE5C,UAAA,IAAI,eAAA,CAAgB,MAAA,KAAW,EAAA,IAAM,eAAA,CAAgB,WAAW,EAAA,EAAI;AAClE,YAAA,OAAO,MAAM,6BAA6B,eAAe,CAAA;AAAA,UAC3D;AACA,UAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,QACrD,SAAS,KAAA,EAAO;AACd,UAAA,MAAM,IAAI,MAAM,CAAA,uCAAA,EAA0C,KAAA,YAAiB,QAAQ,KAAA,CAAM,OAAA,GAAU,eAAe,CAAA,CAAE,CAAA;AAAA,QACtH;AAAA,MACF;AAAA,IACF;AAGA,IAAA,MAAM,UAAA,GAAa,KAAK,KAAA,CAAM,MAAMC,SAAG,QAAA,CAAS,YAAA,EAAc,OAAO,CAAC,CAAA;AACtE,IAAA,OAAO,4BAAA,CAA6B,IAAI,UAAA,CAAW,UAAU,CAAC,CAAA;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,qBAAqB,gBAAA,EAAkD;AAClF,IAAA,IAAI;AACF,MAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,MAAA,CAAO,gBAAgB,CAAA;AAEpD,MAAA,IAAI,eAAA,CAAgB,MAAA,KAAW,EAAA,IAAM,eAAA,CAAgB,WAAW,EAAA,EAAI;AAClE,QAAA,OAAO,MAAM,6BAA6B,eAAe,CAAA;AAAA,MAC3D;AACA,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+B,eAAA,CAAgB,MAAM,CAAA,gCAAA,CAAkC,CAAA;AAAA,IACzG,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,iBAAiB,KAAA,IAAS,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,4BAA4B,CAAA,EAAG;AAClF,QAAA,MAAM,KAAA;AAAA,MACR;AACA,MAAA,MAAM,IAAI,MAAM,CAAA,qCAAA,EAAwC,KAAA,YAAiB,QAAQ,KAAA,CAAM,OAAA,GAAU,eAAe,CAAA,CAAE,CAAA;AAAA,IACpH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,MAAA,EAAkC;AACjD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,GAAA,CACzB,UAAA,CAAW,MAAA,EAAQ,EAAE,UAAA,EAAY,IAAA,CAAK,UAAA,EAAY,CAAA,CAClD,IAAA,EAAK;AACR,IAAA,OAAO,QAAA,CAAS,KAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,QAAA,GAA6B;AACzC,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,MAAM,IAAA,CAAK,GAAA,CAAI,cAAA,GAAiB,IAAA,EAAK;AAEtD,MAAA,OAAO,MAAM,OAAA,CAAQ,OAAA,CAAQ,QAAA,KAAa,8CAA8C,CAAA;AAAA,IAC1F,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,UAAUC,SAAAA,EAA0B;AAC1C,IAAA,OAAA,CAAQ,MAAA,CAAOA,SAAQ,CAAA,GAAI,GAAA,EAAe,QAAQ,CAAC,CAAA;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,wBAAA,CACJ,KAAA,EACA,eAAA,EACA,OAAA,EAC0B;AAC1B,IAAA,MAAM,UAA2B,EAAC;AAElC,IAAA,OAAA,CAAQ,IAAI,cAAA,CAAM,IAAA,CAAK,CAAA,qBAAA,EAAwB,KAAK,kBAAkB,CAAC,CAAA;AAEvE,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK;AAC9B,MAAA,MAAM,MAAA,GAAS,MAAM,qBAAA,EAAsB;AAE3C,MAAA,OAAA,CAAQ,GAAA,CAAI,cAAA,CAAM,IAAA,CAAK,CAAA,OAAA,EAAU,CAAA,GAAI,CAAC,CAAA,EAAA,EAAK,MAAA,CAAO,OAAO,CAAA,CAAE,CAAC,CAAA;AAE5D,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,UAAA,CAAW,OAAO,OAAA,EAAS;AAAA,QACnD,GAAG,OAAA;AAAA,QACH,MAAA,EAAQ;AAAA,OACT,CAAA;AAED,MAAA,IAAI,OAAO,OAAA,EAAS;AAClB,QAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AACnB,QAAA,OAAA,CAAQ,GAAA,CAAI,cAAA,CAAM,KAAA,CAAM,CAAA,mBAAA,EAAiB,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,OAAO,CAAC,CAAA,SAAA,EAAY,MAAA,CAAO,MAAM,EAAE,CAAC,CAAA;AAAA,MACrG,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,IAAI,cAAA,CAAM,GAAA,CAAI,0BAAqB,MAAA,CAAO,KAAK,EAAE,CAAC,CAAA;AAAA,MAC5D;AAAA,IACF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAA,CACJ,MAAA,EACA,UAAA,EACA,OAAA,EACwB;AACxB,IAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA;AAEnD,IAAA,IAAI,kBAAkB,UAAA,EAAY;AAChC,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,OAAA,EAAS,cAAA;AAAA,QACT,MAAA,EAAQ,UAAA;AAAA,QACR,QAAA,EAAU;AAAA,OACZ;AAAA,IACF;AAEA,IAAA,MAAM,SAAS,UAAA,GAAa,cAAA;AAC5B,IAAA,OAAO,IAAA,CAAK,WAAW,MAAA,EAAQ;AAAA,MAC7B,MAAA,EAAQ,MAAA;AAAA,MACR,SAAA,EAAW,UAAA;AAAA,MACX,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AACF;AAKO,IAAM,wBAAwB,IAAI,oBAAA;AAAA,EACvC,OAAA,CAAQ,IAAI,kBAAA,IAAsB;AACpC;AAKA,eAAsB,UAAA,CACpB,MAAA,EACA,WAAA,EACA,OAAA,EACwB;AACxB,EAAA,OAAO,qBAAA,CAAsB,WAAW,MAAA,EAAQ;AAAA,IAC9C,QAAQ,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,WAAA,GAAc,GAAa,CAAC,CAAA;AAAA,IACtD,GAAG;AAAA,GACJ,CAAA;AACH;AAKA,eAAsB,oBAAA,CACpB,MAAA,EACA,eAAA,EACA,OAAA,EACwB;AACxB,EAAA,OAAO,qBAAA,CAAsB,oBAAA;AAAA,IAC3B,MAAA;AAAA,IACA,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,eAAA,GAAkB,GAAa,CAAC,CAAA;AAAA,IAClD;AAAA,GACF;AACF;AC5iBO,IAAM,eAAN,MAA8C;AAAA,EAC3C,MAAA;AAAA,EACS,gBAAA;AAAA,EAEjB,YAAY,OAAA,EAIT;AAED,IAAA,MAAMC,aAAAA,GAAe,SAAA,CAAQ,iBAAiB,CAAA,CAAE,MAAA;AAGhD,IAAA,MAAM,WAAA,GAAc,SAAS,WAAA,IAAe,uBAAA;AAC5C,IAAA,MAAM,OAAA,GAAU,OAAA,EAAS,OAAA,IAAW,EAAC;AACrC,IAAA,IAAA,CAAK,gBAAA,GAAmB,SAAS,iBAAA,IAAqB,KAAA;AAGtD,IAAA,IAAI;AACF,MAAA,IAAI,IAAI,WAAW,CAAA;AAAA,IACrB,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gCAAA,EAAmC,WAAW,CAAA,CAAE,CAAA;AAAA,IAClE;AAGA,IAAA,IAAI,CAAC,IAAA,CAAK,gBAAA,IAAoB,WAAA,CAAY,QAAA,CAAS,WAAW,CAAA,EAAG;AAC/D,MAAA,OAAA,CAAQ,KAAK,mGAAmG,CAAA;AAAA,IAClH;AAGA,IAAA,IAAI,OAAO,OAAA,KAAY,QAAA,IAAY,OAAA,KAAY,IAAA,EAAM;AACnD,MAAA,MAAM,IAAI,MAAM,gCAAgC,CAAA;AAAA,IAClD;AAEA,IAAA,IAAA,CAAK,SAASA,aAAAA,CAAa;AAAA,MACzB,GAAA,EAAK,WAAA;AAAA,MACL;AAAA,KACD,CAAA;AAED,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,MAAM,IAAI,MAAM,8DAA8D,CAAA;AAAA,IAChF;AAAA,EACF;AAAA,EAEA,MAAM,MAAM,IAAA,EAAmC;AAC7C,IAAA,IAAI;AAEF,MAAA,IAAI,IAAA,CAAK,MAAA,GAAS,EAAA,GAAK,IAAA,GAAO,IAAA,EAAM;AAClC,QAAA,MAAM,IAAI,MAAM,gDAAgD,CAAA;AAAA,MAClE;AAGA,MAAA,IAAI,CAAC,IAAA,CAAK,gBAAA,IAAoB,IAAA,CAAK,iBAAA,CAAkB,IAAI,CAAA,EAAG;AAC1D,QAAA,OAAA,CAAQ,KAAK,6FAA6F,CAAA;AAAA,MAC5G;AAEA,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,IAAI,IAAA,EAAM;AAAA,QACzC,GAAA,EAAK,IAAA;AAAA;AAAA,QACL,UAAA,EAAY;AAAA;AAAA,OACb,CAAA;AACD,MAAA,OAAO,MAAA,CAAO,IAAI,QAAA,EAAS;AAAA,IAC7B,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,8BAAA,EAAiC,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,IAC3G;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,kBAAkB,IAAA,EAA2B;AAEnD,IAAA,MAAMtB,KAAAA,GAAO,IAAI,WAAA,CAAY,OAAA,EAAS,EAAE,KAAA,EAAO,KAAA,EAAO,CAAA,CAAE,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA;AACjF,IAAA,MAAM,cAAA,GAAiB,CAAC,GAAA,EAAK,GAAA,EAAK,SAAS,MAAA,EAAQ,SAAA,EAAW,SAAS,UAAU,CAAA;AACjF,IAAA,OAAO,cAAA,CAAe,IAAA,CAAK,CAAA,OAAA,KAAWA,KAAAA,CAAK,WAAA,GAAc,QAAA,CAAS,OAAA,CAAQ,WAAA,EAAa,CAAC,CAAA;AAAA,EAC1F;AAAA,EAEA,MAAM,SAAS,IAAA,EAAmC;AAChD,IAAA,IAAI;AACF,MAAA,MAAM,SAAuB,EAAC;AAC9B,MAAA,WAAA,MAAiB,KAAA,IAAS,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA,EAAG;AAC/C,QAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,MACnB;AAGA,MAAA,MAAM,WAAA,GAAc,OAAO,MAAA,CAAO,CAAC,KAAK,KAAA,KAAU,GAAA,GAAM,KAAA,CAAM,MAAA,EAAQ,CAAC,CAAA;AACvE,MAAA,MAAM,MAAA,GAAS,IAAI,UAAA,CAAW,WAAW,CAAA;AACzC,MAAA,IAAI,MAAA,GAAS,CAAA;AACb,MAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,QAAA,MAAA,CAAO,GAAA,CAAI,OAAO,MAAM,CAAA;AACxB,QAAA,MAAA,IAAU,KAAA,CAAM,MAAA;AAAA,MAClB;AAEA,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mCAAA,EAAsC,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,IAChH;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,IAAA,EAAgC;AAC3C,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,EAAA,CAAG,IAAI,CAAA;AAC7B,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,KAAA,EAAO;AAGd,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,uBAAA,EAA0B,IAAI,CAAA,EAAA,EAAK,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA,CAAE,CAAA;AACxG,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AACF;AAKO,IAAM,uBAAN,MAAsD;AAAA,EACnD,MAAA,GAAS,qBAAA;AAAA,EAEjB,MAAM,MAAM,IAAA,EAAmC;AAC7C,IAAA,MAAM,IAAA,GAAO,UAAA,CAAW,MAAA,CAAO,IAAI,CAAC,CAAA;AACpC,IAAA,UAAA,CAAW,aAAa,OAAA,CAAQ,IAAA,CAAK,SAAS,IAAA,EAAM,UAAA,CAAW,IAAI,CAAC,CAAA;AACpE,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,SAAS,IAAA,EAAmC;AAChD,IAAA,MAAM,MAAM,UAAA,CAAW,YAAA,CAAa,OAAA,CAAQ,IAAA,CAAK,SAAS,IAAI,CAAA;AAC9D,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,OAAO,WAAW,GAAG,CAAA;AAAA,IACvB;AACA,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,IAAI,CAAA,CAAE,CAAA;AAAA,EAC3C;AAAA,EAEA,MAAM,OAAO,IAAA,EAAgC;AAC3C,IAAA,UAAA,CAAW,YAAA,CAAa,UAAA,CAAW,IAAA,CAAK,MAAA,GAAS,IAAI,CAAA;AACrD,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAMO,IAAM,yBAAN,MAA6B;AAAA,EAC1B,iBAAA;AAAA,EACA,eAAA;AAAA,EACA,eAAe,eAAA,EAAgB;AAAA,EAEvC,WAAA,CACE,iBACA,iBAAA,EACA;AACA,IAAA,IAAA,CAAK,eAAA,GAAkB,eAAA,IAAmB,IAAI,YAAA,EAAa;AAC3D,IAAA,IAAA,CAAK,iBAAA,GAAoB,iBAAA,IAAqB,IAAI,uBAAA,EAAwB;AAAA,EAC5E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAA,CACJ,IAAA,EACA,cAAA,EACA,eAAA,EAC4B;AAE5B,IAAA,IAAI,CAAC,IAAA,CAAK,YAAA,CAAa,SAAA,CAAU,qBAAqB,CAAA,EAAG;AACvD,MAAA,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAAA,IAC/C;AAGA,IAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,iBAAA,CAAkB,qBAAA;AAAA,MACnD,IAAA;AAAA,MACA,cAAA;AAAA,MACA;AAAA,KACF;AAGA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,wBAAA,CAAyB,eAAe,CAAA;AAGhE,IAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,eAAA,CAAgB,MAAM,UAAU,CAAA;AAGnE,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,iBAAA,CAAkB,eAAA,EAAiB,eAAe,CAAA;AAE3E,IAAA,OAAO;AAAA,MACL,WAAA;AAAA,MACA,eAAA,EAAiB,MAAA;AAAA,MACjB,eAAA;AAAA,MACA,kBAAA,EAAoB;AAAA,QAClB,OAAA,EAAS,gBAAgB,SAAA,CAAU,OAAA;AAAA,QACnC,SAAA,EAAW,gBAAgB,SAAA,CAAU,SAAA;AAAA,QACrC,SAAA,EAAW,gBAAgB,SAAA,CAAU;AAAA,OACvC;AAAA,MACA,MAAM,UAAA,CAAW,MAAA;AAAA,MACjB,WAAA,EAAa;AAAA,KACf;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAA,CACJ,SAAA,EACA,SAAA,EAIC;AAED,IAAA,MAAM,aAAa,MAAM,IAAA,CAAK,eAAA,CAAgB,QAAA,CAAS,UAAU,eAAe,CAAA;AAGhF,IAAA,MAAM,eAAe,IAAA,CAAK,iBAAA;AAAA,MACxB,IAAA,CAAK,2BAA2B,UAAU,CAAA;AAAA,MAC1C,SAAA,CAAU;AAAA,KACZ;AAEA,IAAA,IAAI,WAAW,YAAY,CAAA,KAAM,UAAA,CAAW,SAAA,CAAU,WAAW,CAAA,EAAG;AAClE,MAAA,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAAA,IAC/C;AAGA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,0BAAA,CAA2B,UAAU,CAAA;AAG3D,IAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,kBAAA;AAAA,MAChC,QAAA,CAAS,SAAA;AAAA,MACT;AAAA,KACF;AAEA,IAAA,MAAM,WAAA,GAAc,KAAK,KAAA,CAAM,IAAI,aAAY,CAAE,MAAA,CAAO,cAAc,CAAC,CAAA;AAEvE,IAAA,OAAO;AAAA,MACL,WAAA;AAAA,MACA,YAAY,QAAA,CAAS;AAAA,KACvB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAA,CACE,aACA,iBAAA,EACY;AACZ,IAAA,MAAM,QAAA,GAAW;AAAA,MACf,OAAA,EAAS,WAAA;AAAA,MACT,QAAA,EAAU;AAAA,QACR,IAAA,EAAM,UAAA,CAAW,iBAAA,CAAkB,WAAW,CAAA;AAAA,QAC9C,UAAU,iBAAA,CAAkB,eAAA;AAAA,QAC5B,UAAU,iBAAA,CAAkB;AAAA,OAC9B;AAAA,MACA,SAAA,EAAW,KAAK,GAAA;AAAI,KACtB;AAEA,IAAA,OAAO,MAAA,CAAO,IAAI,WAAA,EAAY,CAAE,OAAO,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAC,CAAC,CAAA;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WACJ,KAAA,EAK8B;AAC9B,IAAA,MAAM,UAA+B,EAAC;AAEtC,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,gBAAA;AAAA,QACxB,IAAA,CAAK,IAAA;AAAA,QACL,IAAA,CAAK,cAAA;AAAA,QACL,IAAA,CAAK;AAAA,OACP;AACA,MAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AAAA,IACrB;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAMQ,yBAAyB,QAAA,EAAuC;AACtE,IAAA,MAAM,IAAA,GAAO,KAAK,SAAA,CAAU;AAAA,MAC1B,SAAA,EAAW;AAAA,QACT,UAAA,EAAY;AAAA,UACV,YAAY,UAAA,CAAW,QAAA,CAAS,SAAA,CAAU,UAAA,CAAW,WAAW,UAAU,CAAA;AAAA,UAC1E,QAAQ,UAAA,CAAW,QAAA,CAAS,SAAA,CAAU,UAAA,CAAW,OAAO,MAAM;AAAA,SAChE;AAAA,QACA,SAAA,EAAW,UAAA,CAAW,QAAA,CAAS,SAAA,CAAU,SAAS,CAAA;AAAA,QAClD,UAAA,EAAY,UAAA,CAAW,QAAA,CAAS,SAAA,CAAU,UAAU,CAAA;AAAA,QACpD,SAAA,EAAW,SAAS,SAAA,CAAU,SAAA;AAAA,QAC9B,OAAA,EAAS,SAAS,SAAA,CAAU;AAAA,OAC9B;AAAA,MACA,QAAQ,QAAA,CAAS,MAAA;AAAA,MACjB,WAAA,EAAa,UAAA,CAAW,QAAA,CAAS,WAAW,CAAA;AAAA,MAC5C,UAAU,QAAA,CAAS;AAAA,KACpB,CAAA;AAED,IAAA,OAAO,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,IAAI,CAAA;AAAA,EACtC;AAAA,EAEQ,2BAA2B,IAAA,EAAmC;AACpE,IAAA,MAAM,IAAA,GAAO,KAAK,KAAA,CAAM,IAAI,aAAY,CAAE,MAAA,CAAO,IAAI,CAAC,CAAA;AAgBtD,IAAA,OAAO;AAAA,MACL,SAAA,EAAW;AAAA,QACT,UAAA,EAAY;AAAA,UACV,UAAA,EAAY;AAAA,YACV,UAAA,EAAY,UAAA,CAAW,IAAA,CAAK,SAAA,CAAU,WAAW,UAAU;AAAA,WAC7D;AAAA,UACA,MAAA,EAAQ;AAAA,YACN,MAAA,EAAQ,UAAA,CAAW,IAAA,CAAK,SAAA,CAAU,WAAW,MAAM;AAAA;AACrD,SACF;AAAA,QACA,SAAA,EAAW,UAAA,CAAW,IAAA,CAAK,SAAA,CAAU,SAAS,CAAA;AAAA,QAC9C,UAAA,EAAY,UAAA,CAAW,IAAA,CAAK,SAAA,CAAU,UAAU,CAAA;AAAA,QAChD,SAAA,EAAW,KAAK,SAAA,CAAU,SAAA;AAAA,QAC1B,OAAA,EAAS,KAAK,SAAA,CAAU;AAAA,OAC1B;AAAA,MACA,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,WAAA,EAAa,UAAA,CAAW,IAAA,CAAK,WAAW,CAAA;AAAA,MACxC,UAAU,IAAA,CAAK;AAAA,KACjB;AAAA,EACF;AAAA,EAEQ,iBAAA,CACN,UACA,eAAA,EACY;AACZ,IAAA,MAAM,IAAA,GAAO;AAAA,MACX,WAAA,EAAa,UAAA,CAAW,QAAA,CAAS,WAAW,CAAA;AAAA,MAC5C,eAAA;AAAA,MACA,UAAA,EAAY,UAAA,CAAW,QAAA,CAAS,SAAA,CAAU,UAAU,CAAA;AAAA,MACpD,SAAA,EAAW,SAAS,SAAA,CAAU;AAAA,KAChC;AAEA,IAAA,OAAO,MAAA,CAAO,IAAI,WAAA,EAAY,CAAE,OAAO,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAC,CAAA;AAAA,EAC9D;AAAA,EAEA,MAAc,kBAAA,CACZ,SAAA,EACA,SAAA,EACqB;AAIrB,IAAA,MAAM,kBAAkB,MAAM,IAAA,CAAK,iBAAA,CAAkB,aAAA,CAAc,WAAW,SAAS,CAAA;AACvF,IAAA,OAAO,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,IAAA,CAAK,SAAA,CAAU,EAAE,MAAA,EAAQ,eAAA,CAAgB,QAAA,EAAS,EAAG,CAAC,CAAA;AAAA,EACxF;AACF;AASO,IAAM,mBAAN,MAAuB;AAAA,EACpB,aAKF,EAAC;AAAA,EAEP,KAAA,CAAM,KAAA,EAAe,QAAA,EAA2C,KAAA,EAAsB;AACpF,IAAA,IAAA,CAAK,UAAA,CAAW,KAAK,EAAE,KAAA,EAAO,UAAU,KAAA,EAAO,SAAA,EAAW,OAAO,CAAA;AACjE,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,cAAA,CAAe,OAAe,UAAA,EAA8B;AAC1D,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK;AAAA,MACnB,KAAA;AAAA,MACA,QAAA,EAAU,IAAA;AAAA,MACV,KAAA,EAAO,UAAA;AAAA,MACP,SAAA,EAAW;AAAA,KACZ,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,OAAA,CACJ,OAAA,EACA,UAAA,EAC8B;AAG9B,IAAA,MAAM,UAA+B,EAAC;AAEtC,IAAA,KAAA,MAAW,OAAO,UAAA,EAAY;AAC5B,MAAA,IAAI,OAAA,GAAU,IAAA;AAEd,MAAA,KAAA,MAAW,SAAA,IAAa,KAAK,UAAA,EAAY;AACvC,QAAA,IAAI,UAAU,SAAA,EAAW;AAGvB,UAAA,IAAI,SAAA,CAAU,UAAU,YAAA,EAAc;AACpC,YAAA,MAAM,QAAQ,UAAA,CAAW,GAAA,CAAI,WAAW,CAAA,KAAM,UAAA,CAAW,UAAU,KAAmB,CAAA;AACtF,YAAA,IAAI,CAAC,KAAA,EAAO;AACV,cAAA,OAAA,GAAU,KAAA;AACV,cAAA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,OAAA,CAAQ,KAAK,GAAG,CAAA;AAAA,MAClB;AAAA,IACF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AACF;AASO,SAAS,mBAAA,CACd,UACA,QAAA,EAIA;AAGA,EAAA,IAAI,aAAa,MAAA,EAAQ;AACvB,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,MAAA,CAAO,MAAA,CAAO,QAAQ,IAAI,CAAC,CAAA;AAAA;AAAA,MACjC,QAAA,EAAU;AAAA,KACZ;AAAA,EACF,CAAA,MAAO;AACL,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,MAAA,CAAO,MAAA,CAAO,QAAQ,IAAI,EAAE,CAAA;AAAA;AAAA,MAClC,QAAA,EAAU;AAAA,KACZ;AAAA,EACF;AACF;AAaO,SAAS,qBAAA,CACd,SAAA,EACA,OAAA,GAAoC,EAAC,EACpB;AACjB,EAAA,OAAO;AAAA,IACL,SAAA;AAAA,IACA,gBAAA,EAAkB,QAAQ,gBAAA,IAAoB,SAAA;AAAA,IAC9C,eAAA,EAAiB,QAAQ,eAAA,IAAmB,MAAA;AAAA,IAC5C,iBAAiB,OAAA,CAAQ,eAAA;AAAA,IACzB,aAAA,EAAe,QAAQ,aAAA,IAAiB;AAAA,GAC1C;AACF;ACviBO,IAAM,aAAA,GAAgB;AAAA;AAAA,EAE3B,sBAAA,EAAwBK,QAAQ,kCAAkC,CAAA;AAAA;AAAA,EAGlE,UAAA,EAAYA,QAAQ,6CAA6C;AACnE;AAKA,IAAM,YAAA,GAAe,IAAI,EAAA,GAAK,GAAA;AAC9B,IAAM,iBAAA,GAAoB,GAAA;AA4B1B,IAAM,0BAAN,MAA8B;AAAA,EACpB,QAA0B,EAAC;AAAA,EAC3B,aAAuB,EAAC;AAAA;AAAA;AAAA;AAAA,EAKhC,IAAI,SAAA,EAAyC;AAC3C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA;AAInC,IAAA,IAAI,IAAA,CAAK,GAAA,EAAI,GAAI,MAAA,CAAO,cAAc,YAAA,EAAc;AAClD,MAAA,IAAA,CAAK,OAAO,SAAS,CAAA;AACrB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,GAAA,CAAI,WAAmB,MAAA,EAA6B;AAElD,IAAA,IAAA,CAAK,OAAO,SAAS,CAAA;AAGrB,IAAA,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA,GAAI,MAAA;AACxB,IAAA,IAAA,CAAK,UAAA,CAAW,KAAK,SAAS,CAAA;AAG9B,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,MAAA,GAAS,iBAAA,EAAmB;AAC9C,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,UAAA,CAAW,KAAA,EAAM;AACrC,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,OAAO,IAAA,CAAK,MAAM,MAAM,CAAA;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,SAAA,EAAyB;AAC9B,IAAA,OAAO,IAAA,CAAK,MAAM,SAAS,CAAA;AAC3B,IAAA,IAAA,CAAK,aAAa,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,CAAA,EAAA,KAAM,OAAO,SAAS,CAAA;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,QAAQ,EAAC;AACd,IAAA,IAAA,CAAK,aAAa,EAAC;AAAA,EACrB;AACF,CAAA;AAGA,IAAM,YAAA,GAAe,IAAI,uBAAA,EAAwB;AAajD,eAAsB,gBAAA,CACpB,KACA,WAAA,EACwB;AACxB,EAAA,MAAM,SAAA,GAAY,WAAA;AAGlB,EAAA,MAAM,MAAA,GAAS,YAAA,CAAa,GAAA,CAAI,SAAS,CAAA;AACzC,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI;AAEF,IAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,cAAA,CAAe,WAAA,EAAa,EAAE,QAAA,EAAU,QAAA,EAAU,CAAA,CAAE,IAAA,EAAK;AAGpF,IAAA,MAAM,cAAc,QAAA,CAAS,KAAA;AAC7B,IAAA,MAAM,YAAY,WAAA,KAAgB,IAAA;AAElC,IAAA,MAAM,MAAA,GAAwB;AAAA,MAC5B,SAAA;AAAA,MACA,WAAA,EAAa,KAAK,GAAA;AAAI,KACxB;AAGA,IAAA,IAAI,aAAa,IAAA,EAAM;AACrB,MAAA,IAAI;AAEF,QAAA,MAAM,UAAA,GAAa,OAAO,WAAA,CAAY,IAAA,KAAS,WAAW,WAAA,CAAY,IAAA,GAAO,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA;AAC/F,QAAA,MAAM,UAAA,GAAa,MAAA,CAAO,IAAA,CAAK,UAAA,EAAY,QAAQ,CAAA;AAGnD,QAAA,MAAM,cAAA,GAAiB,MAAA;AAAA,UACrB,UAAA,CAAW,gBAAgB,CAAC;AAAA,SAC9B;AACA,QAAA,MAAA,CAAO,cAAA,GAAiB,cAAA;AAAA,MAC1B,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAGA,IAAA,YAAA,CAAa,GAAA,CAAI,WAAW,MAAM,CAAA;AAElC,IAAA,OAAO,MAAA;AAAA,EACT,SAAS,KAAA,EAAO;AAEd,IAAA,MAAM,WAAA,GAA6B;AAAA,MACjC,SAAA,EAAW,KAAA;AAAA,MACX,WAAA,EAAa,KAAK,GAAA,EAAI;AAAA,MACtB,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,KAClD;AAEA,IAAA,YAAA,CAAa,GAAA,CAAI,WAAW,WAAW,CAAA;AAEvC,IAAA,OAAO,WAAA;AAAA,EACT;AACF;AAgFO,SAAS,qBAAA,GAA8B;AAC5C,EAAA,YAAA,CAAa,KAAA,EAAM;AACrB","file":"index.js","sourcesContent":["/**\n * x402 Payment Protocol Client for Solana\n *\n * Implements the x402 open payment standard for AI agent commerce.\n * Reference: https://www.x402.org\n *\n * @module X402Client\n */\n\nimport type { Address } from '@solana/addresses'\nimport { address } from '@solana/addresses'\nimport { pipe } from '@solana/functional'\nimport type {\n Rpc,\n GetTransactionApi,\n SolanaRpcApi,\n Signature,\n TransactionSigner,\n} from '@solana/kit'\nimport {\n createSolanaRpc,\n createTransactionMessage,\n setTransactionMessageFeePayer,\n setTransactionMessageLifetimeUsingBlockhash,\n appendTransactionMessageInstruction,\n signTransactionMessageWithSigners,\n getBase64EncodedWireTransaction\n} from '@solana/kit'\nimport type { Instruction } from '@solana/kit'\n// Type alias for backward compatibility with @solana/kit v2\ntype IInstruction = Instruction\nimport { EventEmitter } from 'node:events'\n\n// =====================================================\n// TYPES\n// =====================================================\n\nexport interface X402PaymentRequest {\n recipient: Address\n amount: bigint\n token: Address\n description: string\n metadata?: Record<string, string>\n expiresAt?: number\n requiresReceipt?: boolean\n}\n\nexport interface X402PaymentReceipt {\n signature: Signature\n recipient: Address\n amount: bigint\n token: Address\n timestamp: number\n metadata?: Record<string, string>\n blockTime?: number\n slot?: bigint\n}\n\nexport interface X402PaymentHeaders {\n 'X-Payment-Address': string\n 'X-Payment-Amount': string\n 'X-Payment-Token': string\n 'X-Payment-Blockchain': 'solana'\n 'X-Payment-Description'?: string\n 'X-Payment-Expires-At'?: string\n}\n\nexport interface X402VerificationResult {\n valid: boolean\n receipt?: X402PaymentReceipt\n error?: string\n}\n\n// =====================================================\n// SOLANA TRANSACTION TYPES (for parsing jsonParsed responses)\n// =====================================================\n\ninterface ParsedTransferInfo {\n destination?: string\n source?: string\n authority?: string\n account?: string\n amount?: string\n mint?: string\n tokenAmount?: {\n amount: string\n decimals: number\n uiAmount: number\n }\n}\n\ninterface ParsedInstruction {\n program?: string\n programId?: Address | { toString(): string; toBase58?(): string }\n parsed?: {\n type?: string\n info?: ParsedTransferInfo\n data?: string\n } | string\n data?: string\n}\n\ninterface TokenBalance {\n accountIndex: number\n mint: string | Address\n owner?: Address\n programId?: Address\n uiTokenAmount: {\n uiAmount: number | null\n decimals: number\n amount: string\n uiAmountString?: string\n }\n}\n\ninterface TransactionMeta {\n err: unknown | null\n preTokenBalances?: readonly TokenBalance[] | null\n postTokenBalances?: readonly TokenBalance[] | null\n innerInstructions?: readonly { index: number; instructions: readonly ParsedInstruction[] }[] | null\n}\n\ninterface ParsedTransactionMessage {\n instructions: readonly ParsedInstruction[]\n accountKeys?: readonly { pubkey: Address | { toString(): string } }[]\n}\n\ninterface ParsedSolanaTransaction {\n transaction?: {\n message?: ParsedTransactionMessage\n }\n meta?: TransactionMeta | null\n blockTime?: number | bigint | null\n slot?: bigint\n}\n\n// =====================================================\n// X402 CLIENT\n// =====================================================\n\n/**\n * x402 Payment Events\n */\nexport interface X402PaymentEvent {\n type: 'payment_created' | 'payment_sent' | 'payment_confirmed' | 'payment_failed'\n signature?: Signature\n request: X402PaymentRequest\n receipt?: X402PaymentReceipt\n error?: string\n timestamp: number\n}\n\nexport class X402Client extends EventEmitter {\n constructor(\n private rpc: Rpc<SolanaRpcApi & GetTransactionApi>,\n private wallet?: TransactionSigner\n ) {\n super()\n }\n\n /**\n * Create an x402 payment request\n * Returns HTTP 402 compatible headers\n */\n createPaymentRequest(params: {\n amount: bigint\n token: Address\n description: string\n expiresAt?: number\n metadata?: Record<string, string>\n }): X402PaymentRequest {\n if (!this.wallet) {\n throw new Error('Wallet required to create payment request')\n }\n\n // wallet.address is already an Address type, no conversion needed\n const recipient = this.wallet.address\n\n return {\n recipient,\n amount: params.amount,\n token: params.token,\n description: params.description,\n metadata: params.metadata,\n expiresAt: params.expiresAt ?? Date.now() + 300000, // 5 minutes default\n requiresReceipt: true\n }\n }\n\n /**\n * Create HTTP 402 response headers\n */\n createPaymentHeaders(request: X402PaymentRequest): X402PaymentHeaders {\n const headers: X402PaymentHeaders = {\n 'X-Payment-Address': request.recipient,\n 'X-Payment-Amount': request.amount.toString(),\n 'X-Payment-Token': request.token,\n 'X-Payment-Blockchain': 'solana'\n }\n\n if (request.description) {\n headers['X-Payment-Description'] = request.description\n }\n\n if (request.expiresAt) {\n headers['X-Payment-Expires-At'] = request.expiresAt.toString()\n }\n\n return headers\n }\n\n /**\n * Execute an x402 payment\n */\n async pay(request: X402PaymentRequest): Promise<X402PaymentReceipt> {\n if (!this.wallet) {\n throw new Error('Wallet required to make payment')\n }\n\n // Validate payment request\n if (request.amount <= 0n) {\n throw new Error('Payment amount must be greater than zero')\n }\n\n if (!request.recipient) {\n throw new Error('Payment recipient address is required')\n }\n\n if (!request.token) {\n throw new Error('Payment token address is required')\n }\n\n // Emit payment creation event\n this.emit('payment_created', {\n type: 'payment_created',\n request,\n timestamp: Date.now()\n })\n\n try {\n // Create SPL token transfer instruction\n const transferIx = await this.createTransferInstruction(\n request.recipient,\n request.amount,\n request.token\n ).catch((error) => {\n throw new Error(\n `Failed to create transfer instruction: ${error instanceof Error ? error.message : 'Unknown error'}`\n )\n })\n\n // Add memo with x402 metadata\n const memoIx = this.createMemoInstruction(\n `x402:${request.description}:${JSON.stringify(request.metadata ?? {})}`\n )\n\n // Build transaction\n const { value: latestBlockhash } = await this.rpc\n .getLatestBlockhash()\n .send()\n .catch((error) => {\n throw new Error(\n `Failed to fetch latest blockhash: ${error instanceof Error ? error.message : 'Unknown error'}`\n )\n })\n\n // Build transaction message with proper type flow using pipe\n const feePayerAddress = this.wallet.address\n const message = pipe(\n createTransactionMessage({ version: 0 }),\n (m) => setTransactionMessageFeePayer(feePayerAddress, m),\n (m) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, m),\n (m) => appendTransactionMessageInstruction(transferIx, m),\n (m) => appendTransactionMessageInstruction(memoIx, m)\n )\n\n // Sign transaction - TypeScript now knows message has all required properties\n const signedTransaction = await signTransactionMessageWithSigners(message).catch((error) => {\n throw new Error(\n `Failed to sign transaction: ${error instanceof Error ? error.message : 'Unknown error'}`\n )\n })\n\n // Send transaction\n // Note: This is a simplified implementation. For production, you should create\n // rpcSubscriptions and use proper transaction confirmation patterns.\n // For now, we'll send and poll for confirmation manually.\n const signature = await this.sendAndConfirmTransactionManually(signedTransaction).catch((error) => {\n // Parse common Solana transaction errors\n const errorMessage = error instanceof Error ? error.message : String(error)\n\n if (errorMessage.includes('insufficient funds')) {\n throw new Error('Insufficient funds to complete payment')\n }\n if (errorMessage.includes('Blockhash not found')) {\n throw new Error('Transaction expired. Please retry the payment.')\n }\n if (errorMessage.includes('InvalidAccountOwner')) {\n throw new Error(\n 'Associated Token Account not found or invalid. ' +\n 'Please ensure the token account exists for both sender and recipient.'\n )\n }\n\n throw new Error(\n `Transaction failed: ${errorMessage}`\n )\n })\n\n // Emit payment sent event\n this.emit('payment_sent', {\n type: 'payment_sent',\n signature,\n request,\n timestamp: Date.now()\n })\n\n // Get transaction details\n const tx = await this.rpc.getTransaction(signature, {\n encoding: 'jsonParsed',\n maxSupportedTransactionVersion: 0\n }).send().catch((error) => {\n // Transaction was sent but we couldn't fetch details\n // Return receipt with basic info\n console.warn('Payment succeeded but failed to fetch transaction details:', error)\n return null\n })\n\n const receipt: X402PaymentReceipt = {\n signature,\n recipient: request.recipient,\n amount: request.amount,\n token: request.token,\n timestamp: Date.now(),\n metadata: request.metadata,\n blockTime: tx?.blockTime ? Number(tx.blockTime) : undefined,\n slot: tx?.slot ?? undefined\n }\n\n // Emit payment confirmed event\n this.emit('payment_confirmed', {\n type: 'payment_confirmed',\n signature,\n request,\n receipt,\n timestamp: Date.now()\n })\n\n return receipt\n } catch (error) {\n // Emit payment failed event\n const errorMessage = error instanceof Error ? error.message : String(error)\n this.emit('payment_failed', {\n type: 'payment_failed',\n request,\n error: errorMessage,\n timestamp: Date.now()\n })\n\n // Wrap and rethrow with context\n if (error instanceof Error) {\n throw error // Already has good error message\n }\n throw new Error(`Payment failed: ${String(error)}`)\n }\n }\n\n /**\n * Verify an x402 payment\n */\n async verifyPayment(signature: Signature): Promise<X402VerificationResult> {\n try {\n const tx = await this.rpc.getTransaction(signature, {\n encoding: 'jsonParsed',\n maxSupportedTransactionVersion: 0\n }).send()\n\n if (!tx) {\n return {\n valid: false,\n error: 'Transaction not found'\n }\n }\n\n // Check if transaction succeeded\n if (tx.meta?.err !== null) {\n return {\n valid: false,\n error: 'Transaction failed'\n }\n }\n\n // Parse transaction to extract payment details\n const receipt = this.parseTransactionReceipt(tx, signature)\n\n return {\n valid: true,\n receipt\n }\n } catch (error) {\n return {\n valid: false,\n error: error instanceof Error ? error.message : 'Unknown error'\n }\n }\n }\n\n /**\n * Verify payment for specific recipient and amount\n */\n async verifyPaymentDetails(params: {\n signature: Signature\n expectedRecipient: Address\n expectedAmount: bigint\n expectedToken: Address\n }): Promise<X402VerificationResult> {\n const result = await this.verifyPayment(params.signature)\n\n if (!result.valid || !result.receipt) {\n return result\n }\n\n // Verify recipient\n if (result.receipt.recipient !== params.expectedRecipient) {\n return {\n valid: false,\n error: 'Recipient mismatch'\n }\n }\n\n // Verify amount\n if (result.receipt.amount !== params.expectedAmount) {\n return {\n valid: false,\n error: 'Amount mismatch'\n }\n }\n\n // Verify token\n if (result.receipt.token !== params.expectedToken) {\n return {\n valid: false,\n error: 'Token mismatch'\n }\n }\n\n return {\n valid: true,\n receipt: result.receipt\n }\n }\n\n /**\n * Get payment status\n */\n async getPaymentStatus(signature: Signature): Promise<{\n status: 'pending' | 'confirmed' | 'finalized' | 'failed' | 'not_found'\n confirmations?: number\n }> {\n try {\n const status = await this.rpc.getSignatureStatuses([signature]).send()\n\n if (!status.value[0]) {\n return { status: 'not_found' }\n }\n\n const txStatus = status.value[0]\n\n if (txStatus.err) {\n return { status: 'failed' }\n }\n\n if (txStatus.confirmationStatus === 'finalized') {\n return { status: 'finalized', confirmations: 32 }\n }\n\n if (txStatus.confirmationStatus === 'confirmed') {\n return { status: 'confirmed', confirmations: 1 }\n }\n\n return { status: 'pending' }\n } catch {\n return { status: 'not_found' }\n }\n }\n\n // =====================================================\n // PRIVATE HELPER METHODS\n // =====================================================\n\n private async createTransferInstruction(\n recipient: Address,\n amount: bigint,\n token: Address\n ): Promise<IInstruction> {\n if (!this.wallet) {\n throw new Error('Wallet required')\n }\n\n // Get token accounts\n const sourceAccount = await this.getAssociatedTokenAddress(\n this.wallet.address,\n token\n )\n const destinationAccount = await this.getAssociatedTokenAddress(\n recipient,\n token\n )\n\n // Create transfer instruction\n // Using SPL Token program\n const TOKEN_PROGRAM_ID = address('TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA')\n\n const keys = [\n { address: sourceAccount, role: 1, isWritable: true, isSigner: false },\n { address: destinationAccount, role: 1, isWritable: true, isSigner: false },\n { address: this.wallet.address, role: 2, isWritable: false, isSigner: true }\n ]\n\n // Transfer instruction data (discriminator + amount)\n const data = new Uint8Array(9)\n data[0] = 3 // Transfer instruction\n const amountBytes = new BigUint64Array([amount])\n data.set(new Uint8Array(amountBytes.buffer), 1)\n\n return {\n programAddress: TOKEN_PROGRAM_ID,\n accounts: keys,\n data\n }\n }\n\n private createMemoInstruction(memo: string): IInstruction {\n const MEMO_PROGRAM_ID = address('MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr')\n\n return {\n programAddress: MEMO_PROGRAM_ID,\n accounts: [],\n data: new TextEncoder().encode(memo)\n }\n }\n\n private async getAssociatedTokenAddress(\n owner: Address,\n token: Address\n ): Promise<Address> {\n // Query for token accounts owned by the owner address for this specific mint\n try {\n const response = await this.rpc.getTokenAccountsByOwner(\n owner,\n { mint: token },\n { encoding: 'jsonParsed' }\n ).send()\n\n if (response.value.length > 0) {\n // Return the first ATA found (there should only be one per mint)\n return response.value[0].pubkey\n }\n\n // If no ATA exists, it needs to be created first\n throw new Error(\n `Associated Token Account not found for owner ${owner} and mint ${token}. ` +\n `Please ensure the ATA is initialized before making payments. ` +\n `Use createAssociatedTokenAccountInstruction to create it.`\n )\n } catch (error) {\n if (error instanceof Error && error.message.includes('Associated Token Account not found')) {\n throw error\n }\n throw new Error(\n `Failed to get Associated Token Account: ${error instanceof Error ? error.message : 'Unknown error'}`\n )\n }\n }\n\n private parseTransactionReceipt(\n tx: ParsedSolanaTransaction,\n signature: Signature\n ): X402PaymentReceipt {\n // Parse transaction to extract payment details from SPL token transfer\n const instructions: readonly ParsedInstruction[] = tx.transaction?.message?.instructions ?? []\n\n // Find the SPL token transfer instruction\n const transferInstruction = instructions.find((ix: ParsedInstruction) => {\n const parsed = typeof ix.parsed === 'object' ? ix.parsed : null\n return ix.program === 'spl-token' && parsed?.type === 'transfer'\n })\n\n if (!transferInstruction) {\n throw new Error('No SPL token transfer found in transaction')\n }\n\n const parsed = typeof transferInstruction.parsed === 'object' ? transferInstruction.parsed : null\n const transferInfo = parsed?.info\n if (!transferInfo) {\n throw new Error('Failed to parse SPL token transfer instruction')\n }\n\n // Extract recipient, amount, and token from the transfer instruction\n const recipient = address(transferInfo.destination ?? transferInfo.account ?? '')\n const amount = BigInt(transferInfo.amount ?? transferInfo.tokenAmount?.amount ?? '0')\n\n // Get token mint from pre or post token balances\n let tokenMint: Address\n const tokenBalances: readonly TokenBalance[] = tx.meta?.preTokenBalances ?? []\n if (tokenBalances.length > 0) {\n tokenMint = address(String(tokenBalances[0].mint))\n } else {\n throw new Error('Failed to extract token mint from transaction')\n }\n\n // Parse memo instruction for metadata\n const memoInstruction = instructions.find((ix: ParsedInstruction) => {\n const programIdStr = typeof ix.programId === 'string' \n ? ix.programId \n : ix.programId?.toString() ?? ''\n return ix.program === 'spl-memo' || programIdStr === 'MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr'\n })\n\n let metadata: Record<string, string> | undefined\n if (memoInstruction) {\n try {\n const parsedMemo = typeof memoInstruction.parsed === 'string' \n ? memoInstruction.parsed \n : typeof memoInstruction.parsed === 'object' \n ? (memoInstruction.parsed?.data ?? '')\n : ''\n const memoText = parsedMemo ||\n (memoInstruction.data ? new TextDecoder().decode(Buffer.from(memoInstruction.data, 'base64')) : '')\n\n if (typeof memoText === 'string' && memoText.startsWith('x402:')) {\n const parts = memoText.split(':')\n if (parts.length >= 3) {\n try {\n metadata = JSON.parse(parts[2]) as Record<string, string>\n } catch {\n // Ignore JSON parse errors for metadata\n }\n }\n }\n } catch {\n // Ignore memo parsing errors\n }\n }\n\n // Handle blockTime which can be number | bigint | null\n const blockTimeNum = tx.blockTime != null \n ? (typeof tx.blockTime === 'bigint' ? Number(tx.blockTime) : tx.blockTime)\n : undefined\n\n return {\n signature,\n recipient,\n amount,\n token: tokenMint,\n timestamp: blockTimeNum != null ? blockTimeNum * 1000 : Date.now(),\n metadata,\n blockTime: blockTimeNum,\n slot: tx.slot\n }\n }\n\n /**\n * Send and confirm transaction manually (simplified implementation)\n * This is a workaround for the missing rpcSubscriptions dependency\n */\n private async sendAndConfirmTransactionManually(\n signedTransaction: ReturnType<typeof signTransactionMessageWithSigners> extends Promise<infer T> ? T : never\n ): Promise<Signature> {\n // Extract signature from signed transaction\n const signatures = Object.values(signedTransaction.signatures)\n if (signatures.length === 0) {\n throw new Error('Transaction has no signatures')\n }\n\n // Get the first signature and ensure it's a valid Signature type\n const firstSig = signatures[0]\n if (!firstSig) {\n throw new Error('Transaction signature is null')\n }\n // Convert SignatureBytes to Signature (they have the same structure)\n const signature = firstSig as unknown as Signature\n\n // Serialize transaction to wire format for sending\n const wireTransaction = getBase64EncodedWireTransaction(signedTransaction)\n\n // Send the transaction\n await this.rpc.sendTransaction(wireTransaction).send()\n\n // Poll for confirmation (simplified - not production-ready)\n for (let i = 0; i < 30; i++) {\n const status = await this.rpc.getSignatureStatuses([signature]).send()\n if (status.value[0]?.confirmationStatus === 'confirmed' ||\n status.value[0]?.confirmationStatus === 'finalized') {\n return signature\n }\n await new Promise(resolve => setTimeout(resolve, 1000))\n }\n\n throw new Error('Transaction confirmation timeout')\n }\n}\n\n// =====================================================\n// FACTORY FUNCTION\n// =====================================================\n\nexport function createX402Client(\n rpcUrl: string,\n wallet?: TransactionSigner\n): X402Client {\n const rpc = createSolanaRpc(rpcUrl)\n return new X402Client(rpc, wallet)\n}\n\n// =====================================================\n// EXPORTS\n// =====================================================\n\nexport default X402Client\n","/**\n * Turso Database Configuration Module\n * \n * Handles environment variable configuration for Turso database connection.\n * Provides graceful defaults when database is not configured (optional feature).\n * \n * @module database/config\n */\n\n/**\n * Turso database configuration\n */\nexport interface TursoConfig {\n /**\n * Turso database URL (libsql://...)\n */\n url: string | null\n\n /**\n * Turso authentication token\n */\n authToken: string | null\n\n /**\n * Whether database is enabled (both URL and token present)\n */\n enabled: boolean\n\n /**\n * Environment mode\n */\n mode: 'development' | 'production'\n\n /**\n * Connection pool configuration\n */\n pool: {\n /**\n * Maximum number of concurrent connections\n */\n max: number\n\n /**\n * Minimum number of idle connections\n */\n min: number\n\n /**\n * Connection timeout in milliseconds\n */\n connectionTimeoutMs: number\n\n /**\n * Idle timeout in milliseconds\n */\n idleTimeoutMs: number\n }\n}\n\n/**\n * Default configuration values\n */\nconst DEFAULT_CONFIG: Omit<TursoConfig, 'url' | 'authToken' | 'enabled'> = {\n mode: process.env.NODE_ENV === 'production' ? 'production' : 'development',\n pool: {\n max: 10,\n min: 2,\n connectionTimeoutMs: 5000,\n idleTimeoutMs: 30000\n }\n}\n\n/**\n * Get Turso database configuration from environment variables\n * \n * Reads TURSO_DATABASE_URL and TURSO_AUTH_TOKEN from environment.\n * If either is missing, returns disabled configuration (graceful fallback).\n * \n * @returns Turso configuration object\n * \n * @example\n * ```typescript\n * const config = getTursoConfig()\n * if (config.enabled) {\n * console.log('Database enabled:', config.url)\n * } else {\n * console.log('Database not configured, using on-chain only')\n * }\n * ```\n */\nexport function getTursoConfig(): TursoConfig {\n const url = process.env.TURSO_DATABASE_URL ?? null\n const authToken = process.env.TURSO_AUTH_TOKEN ?? null\n\n // Database is only enabled if both URL and token are provided\n const enabled = Boolean(url && authToken)\n\n if (!enabled && (url ?? authToken)) {\n // Warn if only one is set (likely configuration error)\n console.warn(\n '[GhostSpeak Database] Incomplete Turso configuration detected. ' +\n 'Both TURSO_DATABASE_URL and TURSO_AUTH_TOKEN are required. ' +\n 'Falling back to on-chain only mode.'\n )\n }\n\n return {\n url,\n authToken,\n enabled,\n ...DEFAULT_CONFIG\n }\n}\n\n/**\n * Validate Turso configuration\n * \n * Checks if configuration is valid and ready to use.\n * \n * @param config - Configuration to validate\n * @returns True if configuration is valid\n */\nexport function validateConfig(config: TursoConfig): boolean {\n if (!config.enabled) {\n return false\n }\n\n if (!config.url || !config.authToken) {\n return false\n }\n\n // Validate URL format\n if (!config.url.startsWith('libsql://') && !config.url.startsWith('http://') && !config.url.startsWith('https://')) {\n console.error('[GhostSpeak Database] Invalid TURSO_DATABASE_URL format. Expected libsql://, http://, or https://')\n return false\n }\n\n return true\n}\n\n/**\n * Get configuration summary for logging\n * \n * Returns safe configuration summary (without sensitive data)\n * \n * @param config - Configuration to summarize\n * @returns Configuration summary\n */\nexport function getConfigSummary(config: TursoConfig): Record<string, unknown> {\n return {\n enabled: config.enabled,\n mode: config.mode,\n url: config.url ? '***' : null,\n authToken: config.authToken ? '***' : null,\n pool: config.pool\n }\n}\n","/**\n * Turso Database Connection Manager\n * \n * Provides singleton connection management with health checks,\n * retry logic, and graceful error handling.\n * \n * @module database/connection\n */\n\nimport { createClient, type Client } from '@libsql/client'\nimport { getTursoConfig, validateConfig, type TursoConfig } from './config.js'\n\n/**\n * Connection state\n */\ninterface ConnectionState {\n client: Client | null\n initialized: boolean\n healthy: boolean\n lastError: Error | null\n retryCount: number\n lastConnectAttempt: number\n}\n\n/**\n * Retry configuration\n */\ninterface RetryConfig {\n maxRetries: number\n initialDelayMs: number\n maxDelayMs: number\n backoffMultiplier: number\n}\n\nconst DEFAULT_RETRY_CONFIG: RetryConfig = {\n maxRetries: 3,\n initialDelayMs: 1000,\n maxDelayMs: 10000,\n backoffMultiplier: 2\n}\n\n/**\n * Singleton connection state\n */\nlet connectionState: ConnectionState = {\n client: null,\n initialized: false,\n healthy: false,\n lastError: null,\n retryCount: 0,\n lastConnectAttempt: 0\n}\n\n/**\n * Sleep utility for retry delays\n */\nfunction sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms))\n}\n\n/**\n * Calculate retry delay with exponential backoff\n */\nfunction getRetryDelay(retryCount: number, config: RetryConfig): number {\n const delay = Math.min(\n config.initialDelayMs * Math.pow(config.backoffMultiplier, retryCount),\n config.maxDelayMs\n )\n return delay\n}\n\n/**\n * Initialize database connection with retry logic\n * \n * @param config - Turso configuration\n * @param retryConfig - Retry configuration\n * @returns Database client\n * @throws Error if connection fails after all retries\n */\nasync function initializeConnection(\n config: TursoConfig,\n retryConfig: RetryConfig = DEFAULT_RETRY_CONFIG\n): Promise<Client> {\n let lastError: Error | null = null\n\n for (let attempt = 0; attempt <= retryConfig.maxRetries; attempt++) {\n try {\n connectionState.lastConnectAttempt = Date.now()\n\n if (attempt > 0) {\n const delay = getRetryDelay(attempt - 1, retryConfig)\n console.log(`[GhostSpeak Database] Retrying connection (attempt ${attempt + 1}/${retryConfig.maxRetries + 1}) after ${delay}ms...`)\n await sleep(delay)\n }\n\n // Create libsql client\n const client = createClient({\n url: config.url!,\n authToken: config.authToken!\n })\n\n // Test connection with simple query\n await client.execute('SELECT 1')\n\n console.log('[GhostSpeak Database] Connection established successfully')\n connectionState.retryCount = attempt\n connectionState.healthy = true\n connectionState.lastError = null\n\n return client\n\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error))\n console.error(`[GhostSpeak Database] Connection attempt ${attempt + 1} failed:`, lastError.message)\n\n if (attempt === retryConfig.maxRetries) {\n connectionState.healthy = false\n connectionState.lastError = lastError\n break\n }\n }\n }\n\n throw new Error(\n `Failed to connect to Turso database after ${retryConfig.maxRetries + 1} attempts. ` +\n `Last error: ${lastError?.message ?? 'Unknown error'}`\n )\n}\n\n/**\n * Get database connection (singleton pattern with lazy initialization)\n * \n * Returns existing connection if available, otherwise creates new one.\n * Throws error if database is not configured or connection fails.\n * \n * @returns Database client\n * @throws Error if database not configured or connection fails\n * \n * @example\n * ```typescript\n * try {\n * const db = await getConnection()\n * const result = await db.execute('SELECT * FROM agents LIMIT 10')\n * console.log('Query successful:', result.rows.length)\n * } catch (error) {\n * console.error('Database not available:', error)\n * // Fallback to on-chain only\n * }\n * ```\n */\nexport async function getConnection(): Promise<Client> {\n const config = getTursoConfig()\n\n // Check if database is configured\n if (!config.enabled) {\n throw new Error(\n 'Turso database not configured. Set TURSO_DATABASE_URL and TURSO_AUTH_TOKEN environment variables.'\n )\n }\n\n // Validate configuration\n if (!validateConfig(config)) {\n throw new Error('Invalid Turso database configuration')\n }\n\n // Return existing connection if available and healthy\n if (connectionState.client && connectionState.healthy) {\n return connectionState.client\n }\n\n // Initialize new connection\n if (!connectionState.initialized || !connectionState.healthy) {\n connectionState.initialized = true\n connectionState.client = await initializeConnection(config)\n }\n\n return connectionState.client!\n}\n\n/**\n * Check database connection health\n * \n * Executes simple query to verify connection is working.\n * Updates connection state based on result.\n * \n * @returns True if connection is healthy\n * \n * @example\n * ```typescript\n * const isHealthy = await ping()\n * if (!isHealthy) {\n * console.warn('Database connection unhealthy, reconnecting...')\n * await disconnect()\n * await getConnection() // Reconnect\n * }\n * ```\n */\nexport async function ping(): Promise<boolean> {\n try {\n const client = await getConnection()\n const result = await client.execute('SELECT 1 as ping')\n\n connectionState.healthy = true\n connectionState.lastError = null\n\n return result.rows.length === 1\n\n } catch (error) {\n connectionState.healthy = false\n connectionState.lastError = error instanceof Error ? error : new Error(String(error))\n console.error('[GhostSpeak Database] Health check failed:', connectionState.lastError.message)\n return false\n }\n}\n\n/**\n * Disconnect from database\n * \n * Closes connection and resets state. Safe to call multiple times.\n * \n * @example\n * ```typescript\n * // Clean shutdown\n * await disconnect()\n * console.log('Database connection closed')\n * ```\n */\nexport async function disconnect(): Promise<void> {\n if (connectionState.client) {\n try {\n // libsql client doesn't have explicit close method\n // Just reset state to allow reconnection\n connectionState.client = null\n connectionState.initialized = false\n connectionState.healthy = false\n console.log('[GhostSpeak Database] Connection closed')\n } catch (error) {\n console.error('[GhostSpeak Database] Error during disconnect:', error)\n }\n }\n}\n\n/**\n * Get connection state (for monitoring and debugging)\n * \n * @returns Current connection state (without sensitive data)\n */\nexport function getConnectionState(): Omit<ConnectionState, 'client'> {\n return {\n initialized: connectionState.initialized,\n healthy: connectionState.healthy,\n lastError: connectionState.lastError,\n retryCount: connectionState.retryCount,\n lastConnectAttempt: connectionState.lastConnectAttempt\n }\n}\n\n/**\n * Check if database is available\n * \n * Non-throwing check for database availability.\n * \n * @returns True if database is configured and connection can be established\n */\nexport async function isAvailable(): Promise<boolean> {\n const config = getTursoConfig()\n\n if (!config.enabled) {\n return false\n }\n\n try {\n await getConnection()\n return true\n } catch {\n return false\n }\n}\n\n/**\n * Reset connection state (useful for testing)\n * \n * @internal\n */\nexport function resetConnectionState(): void {\n connectionState = {\n client: null,\n initialized: false,\n healthy: false,\n lastError: null,\n retryCount: 0,\n lastConnectAttempt: 0\n }\n}\n","/**\n * Agent Registry Cache Schema\n * \n * Drizzle ORM schema for caching agent data from Solana blockchain.\n * Maps to the Rust Agent struct from programs/src/state/agent.rs\n * \n * @module database/schema/agents\n */\n\nimport { sqliteTable, text, integer, real, index } from 'drizzle-orm/sqlite-core'\n\n/**\n * Main agents table - caches on-chain agent data\n */\nexport const agents = sqliteTable('agents', {\n // Primary key - Solana address\n agentAddress: text('agent_address').primaryKey(),\n\n // Basic info\n owner: text('owner').notNull(),\n name: text('name').notNull(),\n description: text('description').notNull(),\n\n // Reputation & stats\n reputationScore: integer('reputation_score').notNull().default(0),\n totalJobsCompleted: integer('total_jobs_completed').notNull().default(0),\n totalEarnings: text('total_earnings').notNull().default('0'), // Stored as text for u64\n\n // Status\n isActive: integer('is_active', { mode: 'boolean' }).notNull().default(true),\n isVerified: integer('is_verified', { mode: 'boolean' }).notNull().default(false),\n verificationTimestamp: integer('verification_timestamp').notNull().default(0),\n\n // Pricing\n originalPrice: text('original_price').notNull().default('0'),\n replicationFee: text('replication_fee').notNull().default('0'),\n\n // Configuration\n genomeHash: text('genome_hash').notNull().default(''),\n isReplicable: integer('is_replicable', { mode: 'boolean' }).notNull().default(false),\n serviceEndpoint: text('service_endpoint').notNull().default(''),\n metadataUri: text('metadata_uri').notNull().default(''),\n\n // Framework & lineage\n frameworkOrigin: text('framework_origin').notNull().default(''),\n cnftMint: text('cnft_mint'), // Nullable\n merkleTree: text('merkle_tree'), // Nullable\n supportsA2a: integer('supports_a2a', { mode: 'boolean' }).notNull().default(false),\n transferHook: text('transfer_hook'), // Nullable\n parentAgent: text('parent_agent'), // Nullable\n generation: integer('generation').notNull().default(0),\n\n // x402 Payment Protocol\n x402Enabled: integer('x402_enabled', { mode: 'boolean' }).notNull().default(false),\n x402PaymentAddress: text('x402_payment_address').notNull(),\n x402PricePerCall: text('x402_price_per_call').notNull().default('0'),\n x402ServiceEndpoint: text('x402_service_endpoint').notNull().default(''),\n x402TotalPayments: text('x402_total_payments').notNull().default('0'),\n x402TotalCalls: text('x402_total_calls').notNull().default('0'),\n lastPaymentTimestamp: integer('last_payment_timestamp').notNull().default(0),\n\n // API Schema\n apiSpecUri: text('api_spec_uri').notNull().default(''),\n apiVersion: text('api_version').notNull().default(''),\n\n // Timestamps\n createdAt: integer('created_at').notNull(),\n updatedAt: integer('updated_at').notNull(),\n cachedAt: integer('cached_at').notNull(), // When cached from chain\n\n // Bump seed for PDA\n bump: integer('bump').notNull()\n}, (table) => ({\n // Indexes for common queries\n ownerIdx: index('idx_agents_owner').on(table.owner),\n x402EnabledIdx: index('idx_agents_x402_enabled').on(table.x402Enabled),\n reputationIdx: index('idx_agents_reputation').on(table.reputationScore),\n frameworkIdx: index('idx_agents_framework').on(table.frameworkOrigin),\n verifiedIdx: index('idx_agents_verified').on(table.isVerified),\n cachedAtIdx: index('idx_agents_cached_at').on(table.cachedAt)\n}))\n\n/**\n * Agent capabilities - many-to-many relationship\n */\nexport const agentCapabilities = sqliteTable('agent_capabilities', {\n id: integer('id').primaryKey({ autoIncrement: true }),\n agentAddress: text('agent_address').notNull().references(() => agents.agentAddress, { onDelete: 'cascade' }),\n capability: text('capability').notNull()\n}, (table) => ({\n // Composite index for lookups\n agentCapabilityIdx: index('idx_agent_capability').on(table.agentAddress, table.capability)\n}))\n\n/**\n * Agent pricing per token - supports multiple tokens\n */\nexport const agentPricing = sqliteTable('agent_pricing', {\n id: integer('id').primaryKey({ autoIncrement: true }),\n agentAddress: text('agent_address').notNull().references(() => agents.agentAddress, { onDelete: 'cascade' }),\n tokenAddress: text('token_address').notNull(), // SPL token mint address\n decimals: integer('decimals').notNull(),\n symbol: text('symbol').notNull()\n}, (table) => ({\n // Index for token lookups\n agentTokenIdx: index('idx_agent_token').on(table.agentAddress, table.tokenAddress)\n}))\n\n// TypeScript types inferred from schema\nexport type Agent = typeof agents.$inferSelect\nexport type NewAgent = typeof agents.$inferInsert\n\nexport type AgentCapability = typeof agentCapabilities.$inferSelect\nexport type NewAgentCapability = typeof agentCapabilities.$inferInsert\n\nexport type AgentPricing = typeof agentPricing.$inferSelect\nexport type NewAgentPricing = typeof agentPricing.$inferInsert\n","/**\n * Transaction Index Schema\n * \n * Drizzle ORM schema for indexing x402 payment transactions.\n * Enables fast queries for transaction history and analytics.\n * \n * @module database/schema/transactions\n */\n\nimport { sqliteTable, text, integer, index } from 'drizzle-orm/sqlite-core'\n\n/**\n * x402 transactions table - indexes all payment transactions\n */\nexport const x402Transactions = sqliteTable('x402_transactions', {\n // Primary key - Solana transaction signature\n signature: text('signature').primaryKey(),\n\n // Addresses\n agentAddress: text('agent_address').notNull(), // Agent that received payment\n payerAddress: text('payer_address').notNull(), // Who paid\n recipientAddress: text('recipient_address').notNull(), // Payment recipient\n\n // Payment details\n amount: text('amount').notNull(), // Amount in token's smallest unit (stored as text for bigint)\n tokenMint: text('token_mint').notNull(), // Token used for payment\n tokenDecimals: integer('token_decimals').notNull(),\n\n // Transaction status\n status: text('status').notNull().default('confirmed'), // 'confirmed', 'finalized', 'failed'\n\n // Timing\n blockTime: integer('block_time').notNull(), // Unix timestamp from Solana\n responseTimeMs: integer('response_time_ms'), // API response time (nullable)\n\n // Metadata\n metadataHash: text('metadata_hash'), // IPFS hash if applicable (nullable)\n\n // Timestamps\n createdAt: integer('created_at').notNull(), // When indexed\n updatedAt: integer('updated_at').notNull() // Last update\n}, (table) => ({\n // Indexes for common queries\n agentIdx: index('idx_tx_agent').on(table.agentAddress),\n payerIdx: index('idx_tx_payer').on(table.payerAddress),\n blockTimeIdx: index('idx_tx_block_time').on(table.blockTime),\n statusIdx: index('idx_tx_status').on(table.status),\n tokenIdx: index('idx_tx_token').on(table.tokenMint),\n // Composite index for agent + time range queries\n agentTimeIdx: index('idx_tx_agent_time').on(table.agentAddress, table.blockTime)\n}))\n\n// TypeScript types inferred from schema\nexport type X402Transaction = typeof x402Transactions.$inferSelect\nexport type NewX402Transaction = typeof x402Transactions.$inferInsert\n","/**\n * Analytics Schema\n * \n * Drizzle ORM schema for analytics aggregation.\n * Stores pre-computed metrics for fast dashboard queries.\n * \n * @module database/schema/analytics\n */\n\nimport { sqliteTable, text, integer, real, index } from 'drizzle-orm/sqlite-core'\n\n/**\n * Agent-level analytics - aggregated metrics per agent\n */\nexport const agentAnalytics = sqliteTable('agent_analytics', {\n // Primary key - agent address\n agentAddress: text('agent_address').primaryKey(),\n\n // Revenue metrics\n totalRevenue: text('total_revenue').notNull().default('0'), // Stored as text for bigint\n\n // Transaction metrics\n totalTransactions: integer('total_transactions').notNull().default(0),\n successfulTransactions: integer('successful_transactions').notNull().default(0),\n successRate: real('success_rate').notNull().default(0), // Percentage 0-100\n\n // Quality metrics\n averageRating: real('average_rating').notNull().default(0),\n averageResponseTimeMs: integer('average_response_time_ms').notNull().default(0),\n\n // Activity\n lastTransactionAt: integer('last_transaction_at'), // Unix timestamp (nullable)\n\n // Timestamp\n updatedAt: integer('updated_at').notNull()\n}, (table) => ({\n updatedAtIdx: index('idx_agent_analytics_updated').on(table.updatedAt)\n}))\n\n/**\n * Market-level analytics - aggregated metrics for entire marketplace\n */\nexport const marketAnalytics = sqliteTable('market_analytics', {\n id: integer('id').primaryKey({ autoIncrement: true }),\n\n // Date for this snapshot\n metricDate: text('metric_date').notNull().unique(), // ISO date string (YYYY-MM-DD)\n\n // Volume metrics\n totalVolume: text('total_volume').notNull().default('0'), // Stored as text for bigint\n totalTransactions: integer('total_transactions').notNull().default(0),\n\n // Agent metrics\n activeAgentsCount: integer('active_agents_count').notNull().default(0),\n\n // Price metrics\n averagePrice: text('average_price').notNull().default('0'), // Average transaction amount\n\n // User metrics\n uniquePayers: integer('unique_payers').notNull().default(0),\n\n // Timestamp\n updatedAt: integer('updated_at').notNull()\n}, (table) => ({\n dateIdx: index('idx_market_analytics_date').on(table.metricDate)\n}))\n\n/**\n * Daily metrics - time-series data for trends\n */\nexport const dailyMetrics = sqliteTable('daily_metrics', {\n id: integer('id').primaryKey({ autoIncrement: true }),\n\n // Date and metric type\n metricDate: text('metric_date').notNull(), // ISO date (YYYY-MM-DD)\n metricType: text('metric_type').notNull(), // 'agent_revenue', 'market_volume', etc.\n\n // Optional agent address (null for market-wide metrics)\n agentAddress: text('agent_address'), // Nullable\n\n // Metric value and metadata\n value: text('value').notNull(), // Metric value as text (supports bigint)\n metadata: text('metadata'), // JSON string for additional data (nullable)\n\n // Timestamp\n createdAt: integer('created_at').notNull()\n}, (table) => ({\n // Composite index for date + type queries\n dateTypeIdx: index('idx_daily_metrics_date_type').on(table.metricDate, table.metricType),\n // Index for agent-specific queries\n agentIdx: index('idx_daily_metrics_agent').on(table.agentAddress),\n // Index for time-series queries\n dateIdx: index('idx_daily_metrics_date').on(table.metricDate)\n}))\n\n// TypeScript types inferred from schema\nexport type AgentAnalytics = typeof agentAnalytics.$inferSelect\nexport type NewAgentAnalytics = typeof agentAnalytics.$inferInsert\n\nexport type MarketAnalytics = typeof marketAnalytics.$inferSelect\nexport type NewMarketAnalytics = typeof marketAnalytics.$inferInsert\n\nexport type DailyMetric = typeof dailyMetrics.$inferSelect\nexport type NewDailyMetric = typeof dailyMetrics.$inferInsert\n","/**\n * Facilitator Registry Schema\n *\n * Drizzle ORM schema for storing x402 facilitator configurations.\n * Facilitators are payment processors that handle x402 transactions.\n *\n * @module database/schema/facilitators\n */\n\nimport { sqliteTable, text, integer, real, index } from 'drizzle-orm/sqlite-core'\n\n/**\n * Facilitators table - stores x402 payment facilitator configurations\n */\nexport const facilitators = sqliteTable(\n 'facilitators',\n {\n // Primary key - unique facilitator ID\n id: text('id').primaryKey(),\n\n // Basic info\n name: text('name').notNull(),\n description: text('description'),\n logo: text('logo'),\n website: text('website'),\n\n // Network configuration (JSON serialized)\n networks: text('networks').notNull(), // JSON array of Network enum values\n\n // Address configuration (JSON serialized)\n addresses: text('addresses').notNull(), // JSON Record<Network, FacilitatorAddress[]>\n\n // Endpoints\n discoveryUrl: text('discovery_url'),\n settleUrl: text('settle_url').notNull(),\n verifyUrl: text('verify_url').notNull(),\n\n // API configuration\n requiresApiKey: integer('requires_api_key', { mode: 'boolean' }).notNull().default(false),\n apiKeyHeader: text('api_key_header'),\n\n // Status\n enabled: integer('enabled', { mode: 'boolean' }).notNull().default(true),\n\n // Health metrics\n lastHealthCheck: integer('last_health_check'), // Unix timestamp\n healthStatus: text('health_status').default('unknown'), // healthy, degraded, unhealthy, unknown\n latencyMs: real('latency_ms'),\n uptimePercent: real('uptime_percent'),\n totalRequests: integer('total_requests').notNull().default(0),\n successfulRequests: integer('successful_requests').notNull().default(0),\n failedRequests: integer('failed_requests').notNull().default(0),\n\n // Timestamps\n createdAt: integer('created_at').notNull().default(0),\n updatedAt: integer('updated_at').notNull().default(0)\n },\n table => ({\n enabledIdx: index('facilitators_enabled_idx').on(table.enabled),\n healthStatusIdx: index('facilitators_health_status_idx').on(table.healthStatus)\n })\n)\n\n/**\n * Facilitator API keys table - stores user API keys for facilitators\n */\nexport const facilitatorApiKeys = sqliteTable(\n 'facilitator_api_keys',\n {\n // Composite key\n id: text('id').primaryKey(), // UUID or generated\n\n // Foreign keys\n facilitatorId: text('facilitator_id')\n .notNull()\n .references(() => facilitators.id),\n userId: text('user_id').notNull(), // User or wallet address\n\n // Key storage (encrypted)\n encryptedApiKey: text('encrypted_api_key').notNull(),\n keyLabel: text('key_label'), // User-friendly label\n\n // Metadata\n lastUsed: integer('last_used'), // Unix timestamp\n usageCount: integer('usage_count').notNull().default(0),\n\n // Timestamps\n createdAt: integer('created_at').notNull().default(0),\n updatedAt: integer('updated_at').notNull().default(0)\n },\n table => ({\n facilitatorUserIdx: index('api_keys_facilitator_user_idx').on(\n table.facilitatorId,\n table.userId\n )\n })\n)\n\n/**\n * Facilitator health history table - stores health check results\n */\nexport const facilitatorHealthHistory = sqliteTable(\n 'facilitator_health_history',\n {\n // Primary key\n id: text('id').primaryKey(), // UUID\n\n // Foreign key\n facilitatorId: text('facilitator_id')\n .notNull()\n .references(() => facilitators.id),\n\n // Health check result\n status: text('status').notNull(), // healthy, degraded, unhealthy\n latencyMs: real('latency_ms').notNull(),\n errorMessage: text('error_message'),\n\n // Network-specific results (JSON serialized)\n networkResults: text('network_results'), // JSON array of network health\n\n // Timestamp\n checkedAt: integer('checked_at').notNull()\n },\n table => ({\n facilitatorTimeIdx: index('health_history_facilitator_time_idx').on(\n table.facilitatorId,\n table.checkedAt\n )\n })\n)\n\n// =====================================================\n// TYPE HELPERS\n// =====================================================\n\n/**\n * Type for inserting a new facilitator\n */\nexport type InsertFacilitator = typeof facilitators.$inferInsert\n\n/**\n * Type for selecting a facilitator\n */\nexport type SelectFacilitator = typeof facilitators.$inferSelect\n\n/**\n * Type for inserting a new API key\n */\nexport type InsertFacilitatorApiKey = typeof facilitatorApiKeys.$inferInsert\n\n/**\n * Type for selecting an API key\n */\nexport type SelectFacilitatorApiKey = typeof facilitatorApiKeys.$inferSelect\n\n/**\n * Type for inserting health history\n */\nexport type InsertFacilitatorHealthHistory = typeof facilitatorHealthHistory.$inferInsert\n\n/**\n * Type for selecting health history\n */\nexport type SelectFacilitatorHealthHistory = typeof facilitatorHealthHistory.$inferSelect\n","/**\n * Resource Registry Schema\n *\n * Drizzle ORM schema for storing x402 resource registry.\n * Resources are HTTP endpoints that implement the x402 payment protocol.\n *\n * @module database/schema/resources\n */\n\nimport { sqliteTable, text, integer, real, index } from 'drizzle-orm/sqlite-core'\nimport { facilitators } from './facilitators.js'\n\n/**\n * Resource origins table - stores information about resource domains\n */\nexport const resourceOrigins = sqliteTable(\n 'resource_origins',\n {\n // Primary key - UUID\n id: text('id').primaryKey(),\n\n // Origin URL (e.g., https://api.example.com)\n origin: text('origin').notNull().unique(),\n\n // Metadata from scraping\n name: text('name'),\n description: text('description'),\n faviconUrl: text('favicon_url'),\n ogImageUrl: text('og_image_url'),\n ogTitle: text('og_title'),\n ogDescription: text('og_description'),\n\n // Contact/attribution\n contactEmail: text('contact_email'),\n twitterHandle: text('twitter_handle'),\n githubRepo: text('github_repo'),\n\n // Verification\n isVerified: integer('is_verified', { mode: 'boolean' }).notNull().default(false),\n verifiedAt: integer('verified_at'),\n verifiedBy: text('verified_by'),\n\n // Timestamps\n createdAt: integer('created_at').notNull().default(0),\n updatedAt: integer('updated_at').notNull().default(0),\n lastScrapedAt: integer('last_scraped_at')\n },\n table => ({\n originIdx: index('resource_origins_origin_idx').on(table.origin)\n })\n)\n\n/**\n * Resources table - stores x402 resource endpoints\n */\nexport const resources = sqliteTable(\n 'resources',\n {\n // Primary key - UUID\n id: text('id').primaryKey(),\n\n // Resource URL (full endpoint URL)\n url: text('url').notNull().unique(),\n\n // Type of resource\n type: text('type').notNull().default('http'), // http, websocket, grpc\n\n // x402 protocol version\n x402Version: text('x402_version'),\n\n // Foreign keys\n originId: text('origin_id').references(() => resourceOrigins.id),\n facilitatorId: text('facilitator_id').references(() => facilitators.id),\n\n // Payment requirements (JSON serialized PaymentRequirement[])\n accepts: text('accepts').notNull(), // JSON array\n\n // Pricing\n maxAmount: text('max_amount'), // bigint as string\n minAmount: text('min_amount'), // bigint as string\n currency: text('currency').default('USDC'),\n\n // Enhanced schema for AI integration (JSON Schema)\n inputSchema: text('input_schema'), // JSON Schema for input\n outputSchema: text('output_schema'), // JSON Schema for output\n examplesJson: text('examples_json'), // JSON array of { input, output }\n\n // Metadata\n name: text('name'),\n description: text('description'),\n tags: text('tags'), // JSON array of strings\n capabilities: text('capabilities'), // JSON array of capabilities\n category: text('category'), // AI category\n\n // HTTP metadata\n httpMethod: text('http_method').default('POST'),\n contentType: text('content_type').default('application/json'),\n authType: text('auth_type'), // none, bearer, api_key, x402\n\n // Status\n isActive: integer('is_active', { mode: 'boolean' }).notNull().default(true),\n isVerified: integer('is_verified', { mode: 'boolean' }).notNull().default(false),\n lastPingAt: integer('last_ping_at'),\n lastPingStatus: integer('last_ping_status'), // HTTP status code\n lastPingLatencyMs: real('last_ping_latency_ms'),\n consecutiveFailures: integer('consecutive_failures').notNull().default(0),\n\n // Discovery source\n discoveredFrom: text('discovered_from'), // facilitator_id or 'manual'\n discoveredAt: integer('discovered_at'),\n\n // AI labeling\n aiGeneratedTags: text('ai_generated_tags'), // JSON array\n aiLabeledAt: integer('ai_labeled_at'),\n\n // Timestamps\n createdAt: integer('created_at').notNull().default(0),\n updatedAt: integer('updated_at').notNull().default(0)\n },\n table => ({\n originIdx: index('resources_origin_idx').on(table.originId),\n facilitatorIdx: index('resources_facilitator_idx').on(table.facilitatorId),\n activeIdx: index('resources_active_idx').on(table.isActive),\n categoryIdx: index('resources_category_idx').on(table.category)\n })\n)\n\n/**\n * Resource tags table - normalized tags for efficient querying\n */\nexport const resourceTags = sqliteTable(\n 'resource_tags',\n {\n // Composite key\n id: text('id').primaryKey(), // UUID\n\n // Foreign key\n resourceId: text('resource_id')\n .notNull()\n .references(() => resources.id),\n\n // Tag\n tag: text('tag').notNull(),\n isAiGenerated: integer('is_ai_generated', { mode: 'boolean' }).notNull().default(false),\n\n // Timestamps\n createdAt: integer('created_at').notNull().default(0)\n },\n table => ({\n resourceIdx: index('resource_tags_resource_idx').on(table.resourceId),\n tagIdx: index('resource_tags_tag_idx').on(table.tag)\n })\n)\n\n/**\n * Resource ping history - stores health check results\n */\nexport const resourcePingHistory = sqliteTable(\n 'resource_ping_history',\n {\n // Primary key - UUID\n id: text('id').primaryKey(),\n\n // Foreign key\n resourceId: text('resource_id')\n .notNull()\n .references(() => resources.id),\n\n // Ping result\n statusCode: integer('status_code'),\n latencyMs: real('latency_ms'),\n success: integer('success', { mode: 'boolean' }).notNull(),\n errorMessage: text('error_message'),\n\n // x402 response validation\n hasValidX402: integer('has_valid_x402', { mode: 'boolean' }),\n x402ParseError: text('x402_parse_error'),\n\n // Response details\n responseBodySize: integer('response_body_size'),\n contentType: text('content_type'),\n\n // Timestamp\n pingedAt: integer('pinged_at').notNull()\n },\n table => ({\n resourceTimeIdx: index('ping_history_resource_time_idx').on(\n table.resourceId,\n table.pingedAt\n )\n })\n)\n\n/**\n * Resource accepts table - normalized payment requirements\n */\nexport const resourceAccepts = sqliteTable(\n 'resource_accepts',\n {\n // Primary key - UUID\n id: text('id').primaryKey(),\n\n // Foreign key\n resourceId: text('resource_id')\n .notNull()\n .references(() => resources.id),\n\n // Payment requirement fields\n scheme: text('scheme').notNull(), // exact, upto, base, tiered\n network: text('network').notNull(), // solana, base, polygon\n maxAmountRequired: text('max_amount_required').notNull(), // bigint as string\n payTo: text('pay_to').notNull(), // facilitator address\n asset: text('asset').notNull(), // token address\n maxTimeoutSeconds: integer('max_timeout_seconds'),\n description: text('description'),\n mimeType: text('mime_type'),\n\n // Extra fields (JSON)\n extra: text('extra'),\n\n // Timestamps\n createdAt: integer('created_at').notNull().default(0),\n updatedAt: integer('updated_at').notNull().default(0)\n },\n table => ({\n resourceIdx: index('resource_accepts_resource_idx').on(table.resourceId),\n networkIdx: index('resource_accepts_network_idx').on(table.network),\n assetIdx: index('resource_accepts_asset_idx').on(table.asset)\n })\n)\n\n// =====================================================\n// TYPE HELPERS\n// =====================================================\n\n/**\n * Type for inserting a new resource origin\n */\nexport type InsertResourceOrigin = typeof resourceOrigins.$inferInsert\n\n/**\n * Type for selecting a resource origin\n */\nexport type SelectResourceOrigin = typeof resourceOrigins.$inferSelect\n\n/**\n * Type for inserting a new resource\n */\nexport type InsertResource = typeof resources.$inferInsert\n\n/**\n * Type for selecting a resource\n */\nexport type SelectResource = typeof resources.$inferSelect\n\n/**\n * Type for inserting a resource tag\n */\nexport type InsertResourceTag = typeof resourceTags.$inferInsert\n\n/**\n * Type for selecting a resource tag\n */\nexport type SelectResourceTag = typeof resourceTags.$inferSelect\n\n/**\n * Type for inserting ping history\n */\nexport type InsertResourcePingHistory = typeof resourcePingHistory.$inferInsert\n\n/**\n * Type for selecting ping history\n */\nexport type SelectResourcePingHistory = typeof resourcePingHistory.$inferSelect\n\n/**\n * Type for inserting resource accepts\n */\nexport type InsertResourceAccepts = typeof resourceAccepts.$inferInsert\n\n/**\n * Type for selecting resource accepts\n */\nexport type SelectResourceAccepts = typeof resourceAccepts.$inferSelect\n","/**\n * Resource Metrics Schema\n *\n * Drizzle ORM schema for storing time-windowed x402 resource metrics.\n * Tracks 72 metrics across 8 time windows for comprehensive analytics.\n *\n * @module database/schema/resourceMetrics\n */\n\nimport { sqliteTable, text, integer, real, index } from 'drizzle-orm/sqlite-core'\nimport { resources } from './resources.js'\nimport { resourceOrigins } from './resources.js'\n\n// =====================================================\n// TIME WINDOWS\n// =====================================================\n\n/**\n * Available time windows for metrics aggregation\n */\nexport const TIME_WINDOWS = ['1h', '6h', '24h', '3d', '7d', '15d', '30d', 'all'] as const\nexport type TimeWindow = (typeof TIME_WINDOWS)[number]\n\n// =====================================================\n// RESOURCE METRICS TABLE\n// =====================================================\n\n/**\n * Resource metrics table - stores per-resource time-windowed metrics\n *\n * Each row represents metrics for a single resource at a point in time.\n * Metrics are aggregated across 8 time windows for each measurement.\n */\nexport const resourceMetrics = sqliteTable(\n 'resource_metrics',\n {\n // Primary key\n id: text('id').primaryKey(),\n\n // Foreign key to resource\n resourceId: text('resource_id')\n .notNull()\n .references(() => resources.id),\n\n // Snapshot timestamp\n createdAt: integer('created_at').notNull(),\n\n // =========================================================\n // REQUEST COUNTS (8 time windows each)\n // =========================================================\n\n // Total requests\n totalRequests1h: integer('total_requests_1h').notNull().default(0),\n totalRequests6h: integer('total_requests_6h').notNull().default(0),\n totalRequests24h: integer('total_requests_24h').notNull().default(0),\n totalRequests3d: integer('total_requests_3d').notNull().default(0),\n totalRequests7d: integer('total_requests_7d').notNull().default(0),\n totalRequests15d: integer('total_requests_15d').notNull().default(0),\n totalRequests30d: integer('total_requests_30d').notNull().default(0),\n totalRequestsAll: integer('total_requests_all').notNull().default(0),\n\n // Successful requests (2xx)\n successCount1h: integer('success_count_1h').notNull().default(0),\n successCount6h: integer('success_count_6h').notNull().default(0),\n successCount24h: integer('success_count_24h').notNull().default(0),\n successCount3d: integer('success_count_3d').notNull().default(0),\n successCount7d: integer('success_count_7d').notNull().default(0),\n successCount15d: integer('success_count_15d').notNull().default(0),\n successCount30d: integer('success_count_30d').notNull().default(0),\n successCountAll: integer('success_count_all').notNull().default(0),\n\n // Failed requests (4xx, 5xx)\n failureCount1h: integer('failure_count_1h').notNull().default(0),\n failureCount6h: integer('failure_count_6h').notNull().default(0),\n failureCount24h: integer('failure_count_24h').notNull().default(0),\n failureCount3d: integer('failure_count_3d').notNull().default(0),\n failureCount7d: integer('failure_count_7d').notNull().default(0),\n failureCount15d: integer('failure_count_15d').notNull().default(0),\n failureCount30d: integer('failure_count_30d').notNull().default(0),\n failureCountAll: integer('failure_count_all').notNull().default(0),\n\n // =========================================================\n // LATENCY PERCENTILES (p50, p90, p99 for each window)\n // =========================================================\n\n // P50 (median) latency in ms\n latencyP50_1h: real('latency_p50_1h'),\n latencyP50_6h: real('latency_p50_6h'),\n latencyP50_24h: real('latency_p50_24h'),\n latencyP50_3d: real('latency_p50_3d'),\n latencyP50_7d: real('latency_p50_7d'),\n latencyP50_15d: real('latency_p50_15d'),\n latencyP50_30d: real('latency_p50_30d'),\n latencyP50All: real('latency_p50_all'),\n\n // P90 latency in ms\n latencyP90_1h: real('latency_p90_1h'),\n latencyP90_6h: real('latency_p90_6h'),\n latencyP90_24h: real('latency_p90_24h'),\n latencyP90_3d: real('latency_p90_3d'),\n latencyP90_7d: real('latency_p90_7d'),\n latencyP90_15d: real('latency_p90_15d'),\n latencyP90_30d: real('latency_p90_30d'),\n latencyP90All: real('latency_p90_all'),\n\n // P99 latency in ms\n latencyP99_1h: real('latency_p99_1h'),\n latencyP99_6h: real('latency_p99_6h'),\n latencyP99_24h: real('latency_p99_24h'),\n latencyP99_3d: real('latency_p99_3d'),\n latencyP99_7d: real('latency_p99_7d'),\n latencyP99_15d: real('latency_p99_15d'),\n latencyP99_30d: real('latency_p99_30d'),\n latencyP99All: real('latency_p99_all'),\n\n // =========================================================\n // STATUS CODE DISTRIBUTION\n // =========================================================\n\n // 2xx responses\n status2xx1h: integer('status_2xx_1h').notNull().default(0),\n status2xx24h: integer('status_2xx_24h').notNull().default(0),\n status2xx7d: integer('status_2xx_7d').notNull().default(0),\n status2xxAll: integer('status_2xx_all').notNull().default(0),\n\n // 3xx responses\n status3xx1h: integer('status_3xx_1h').notNull().default(0),\n status3xx24h: integer('status_3xx_24h').notNull().default(0),\n status3xx7d: integer('status_3xx_7d').notNull().default(0),\n status3xxAll: integer('status_3xx_all').notNull().default(0),\n\n // 4xx responses\n status4xx1h: integer('status_4xx_1h').notNull().default(0),\n status4xx24h: integer('status_4xx_24h').notNull().default(0),\n status4xx7d: integer('status_4xx_7d').notNull().default(0),\n status4xxAll: integer('status_4xx_all').notNull().default(0),\n\n // 5xx responses\n status5xx1h: integer('status_5xx_1h').notNull().default(0),\n status5xx24h: integer('status_5xx_24h').notNull().default(0),\n status5xx7d: integer('status_5xx_7d').notNull().default(0),\n status5xxAll: integer('status_5xx_all').notNull().default(0),\n\n // =========================================================\n // UPTIME & AVAILABILITY\n // =========================================================\n\n // Uptime percentage (0-100)\n uptimePercent1h: real('uptime_percent_1h'),\n uptimePercent24h: real('uptime_percent_24h'),\n uptimePercent7d: real('uptime_percent_7d'),\n uptimePercent30d: real('uptime_percent_30d'),\n uptimePercentAll: real('uptime_percent_all'),\n\n // Number of outages\n outageCount1h: integer('outage_count_1h').notNull().default(0),\n outageCount24h: integer('outage_count_24h').notNull().default(0),\n outageCount7d: integer('outage_count_7d').notNull().default(0),\n outageCount30d: integer('outage_count_30d').notNull().default(0),\n\n // =========================================================\n // PAYMENT METRICS\n // =========================================================\n\n // Total payment volume (stored as text for bigint)\n paymentVolume1h: text('payment_volume_1h').notNull().default('0'),\n paymentVolume24h: text('payment_volume_24h').notNull().default('0'),\n paymentVolume7d: text('payment_volume_7d').notNull().default('0'),\n paymentVolume30d: text('payment_volume_30d').notNull().default('0'),\n paymentVolumeAll: text('payment_volume_all').notNull().default('0'),\n\n // Number of payments\n paymentCount1h: integer('payment_count_1h').notNull().default(0),\n paymentCount24h: integer('payment_count_24h').notNull().default(0),\n paymentCount7d: integer('payment_count_7d').notNull().default(0),\n paymentCount30d: integer('payment_count_30d').notNull().default(0),\n paymentCountAll: integer('payment_count_all').notNull().default(0),\n\n // Average payment amount\n avgPayment1h: text('avg_payment_1h'),\n avgPayment24h: text('avg_payment_24h'),\n avgPayment7d: text('avg_payment_7d'),\n avgPaymentAll: text('avg_payment_all'),\n\n // Unique payers\n uniquePayers1h: integer('unique_payers_1h').notNull().default(0),\n uniquePayers24h: integer('unique_payers_24h').notNull().default(0),\n uniquePayers7d: integer('unique_payers_7d').notNull().default(0),\n uniquePayersAll: integer('unique_payers_all').notNull().default(0)\n },\n table => ({\n resourceIdx: index('resource_metrics_resource_idx').on(table.resourceId),\n createdAtIdx: index('resource_metrics_created_at_idx').on(table.createdAt),\n resourceCreatedIdx: index('resource_metrics_resource_created_idx').on(\n table.resourceId,\n table.createdAt\n )\n })\n)\n\n// =====================================================\n// ORIGIN METRICS TABLE\n// =====================================================\n\n/**\n * Resource origin metrics table - aggregated metrics per origin\n */\nexport const resourceOriginMetrics = sqliteTable(\n 'resource_origin_metrics',\n {\n // Primary key\n id: text('id').primaryKey(),\n\n // Foreign key to origin\n originId: text('origin_id')\n .notNull()\n .references(() => resourceOrigins.id),\n\n // Snapshot timestamp\n createdAt: integer('created_at').notNull(),\n\n // Resource count\n resourceCount: integer('resource_count').notNull().default(0),\n activeResourceCount: integer('active_resource_count').notNull().default(0),\n\n // Aggregated request counts\n totalRequests1h: integer('total_requests_1h').notNull().default(0),\n totalRequests24h: integer('total_requests_24h').notNull().default(0),\n totalRequests7d: integer('total_requests_7d').notNull().default(0),\n totalRequestsAll: integer('total_requests_all').notNull().default(0),\n\n // Aggregated success counts\n successCount1h: integer('success_count_1h').notNull().default(0),\n successCount24h: integer('success_count_24h').notNull().default(0),\n successCount7d: integer('success_count_7d').notNull().default(0),\n successCountAll: integer('success_count_all').notNull().default(0),\n\n // Aggregated failure counts\n failureCount1h: integer('failure_count_1h').notNull().default(0),\n failureCount24h: integer('failure_count_24h').notNull().default(0),\n failureCount7d: integer('failure_count_7d').notNull().default(0),\n failureCountAll: integer('failure_count_all').notNull().default(0),\n\n // Average latency across resources\n avgLatencyP50_1h: real('avg_latency_p50_1h'),\n avgLatencyP50_24h: real('avg_latency_p50_24h'),\n avgLatencyP50_7d: real('avg_latency_p50_7d'),\n avgLatencyP50All: real('avg_latency_p50_all'),\n\n avgLatencyP90_1h: real('avg_latency_p90_1h'),\n avgLatencyP90_24h: real('avg_latency_p90_24h'),\n avgLatencyP90_7d: real('avg_latency_p90_7d'),\n avgLatencyP90All: real('avg_latency_p90_all'),\n\n // Aggregated uptime\n avgUptimePercent1h: real('avg_uptime_percent_1h'),\n avgUptimePercent24h: real('avg_uptime_percent_24h'),\n avgUptimePercent7d: real('avg_uptime_percent_7d'),\n avgUptimePercentAll: real('avg_uptime_percent_all'),\n\n // Aggregated payment metrics\n paymentVolume1h: text('payment_volume_1h').notNull().default('0'),\n paymentVolume24h: text('payment_volume_24h').notNull().default('0'),\n paymentVolume7d: text('payment_volume_7d').notNull().default('0'),\n paymentVolumeAll: text('payment_volume_all').notNull().default('0'),\n\n paymentCount1h: integer('payment_count_1h').notNull().default(0),\n paymentCount24h: integer('payment_count_24h').notNull().default(0),\n paymentCount7d: integer('payment_count_7d').notNull().default(0),\n paymentCountAll: integer('payment_count_all').notNull().default(0)\n },\n table => ({\n originIdx: index('origin_metrics_origin_idx').on(table.originId),\n createdAtIdx: index('origin_metrics_created_at_idx').on(table.createdAt)\n })\n)\n\n// =====================================================\n// GLOBAL METRICS TABLE\n// =====================================================\n\n/**\n * Global x402 ecosystem metrics\n */\nexport const globalMetrics = sqliteTable('global_metrics', {\n // Primary key (single row, use 'global')\n id: text('id').primaryKey(),\n\n // Snapshot timestamp\n createdAt: integer('created_at').notNull(),\n\n // Resource counts\n totalResources: integer('total_resources').notNull().default(0),\n activeResources: integer('active_resources').notNull().default(0),\n totalOrigins: integer('total_origins').notNull().default(0),\n totalFacilitators: integer('total_facilitators').notNull().default(0),\n\n // Request aggregates\n totalRequests1h: integer('total_requests_1h').notNull().default(0),\n totalRequests24h: integer('total_requests_24h').notNull().default(0),\n totalRequests7d: integer('total_requests_7d').notNull().default(0),\n totalRequestsAll: integer('total_requests_all').notNull().default(0),\n\n // Payment aggregates\n paymentVolume1h: text('payment_volume_1h').notNull().default('0'),\n paymentVolume24h: text('payment_volume_24h').notNull().default('0'),\n paymentVolume7d: text('payment_volume_7d').notNull().default('0'),\n paymentVolumeAll: text('payment_volume_all').notNull().default('0'),\n\n paymentCount1h: integer('payment_count_1h').notNull().default(0),\n paymentCount24h: integer('payment_count_24h').notNull().default(0),\n paymentCount7d: integer('payment_count_7d').notNull().default(0),\n paymentCountAll: integer('payment_count_all').notNull().default(0),\n\n // Unique users\n uniquePayers1h: integer('unique_payers_1h').notNull().default(0),\n uniquePayers24h: integer('unique_payers_24h').notNull().default(0),\n uniquePayers7d: integer('unique_payers_7d').notNull().default(0),\n uniquePayersAll: integer('unique_payers_all').notNull().default(0),\n\n // Network breakdown (JSON)\n networkBreakdown: text('network_breakdown'), // JSON object\n\n // Top performers (JSON arrays)\n topResourcesByVolume: text('top_resources_by_volume'), // JSON array\n topResourcesByRequests: text('top_resources_by_requests'), // JSON array\n topOriginsByVolume: text('top_origins_by_volume') // JSON array\n})\n\n// =====================================================\n// TYPE HELPERS\n// =====================================================\n\nexport type InsertResourceMetrics = typeof resourceMetrics.$inferInsert\nexport type SelectResourceMetrics = typeof resourceMetrics.$inferSelect\n\nexport type InsertResourceOriginMetrics = typeof resourceOriginMetrics.$inferInsert\nexport type SelectResourceOriginMetrics = typeof resourceOriginMetrics.$inferSelect\n\nexport type InsertGlobalMetrics = typeof globalMetrics.$inferInsert\nexport type SelectGlobalMetrics = typeof globalMetrics.$inferSelect\n\n// =====================================================\n// METRICS INTERFACE\n// =====================================================\n\n/**\n * Time-windowed metrics for a resource\n */\nexport interface TimeWindowedResourceMetrics {\n resourceId: string\n window: TimeWindow\n requests: {\n total: number\n success: number\n failure: number\n successRate: number\n }\n latency: {\n p50: number | null\n p90: number | null\n p99: number | null\n }\n statusCodes: {\n '2xx': number\n '3xx': number\n '4xx': number\n '5xx': number\n }\n uptime: {\n percent: number | null\n outages: number\n }\n payments: {\n volume: bigint\n count: number\n average: bigint | null\n uniquePayers: number\n }\n}\n","/**\n * Database Schema Index\n * \n * Exports all database schemas.\n * \n * @module database/schema\n */\n\n// Import all schemas\nimport * as agents from './agents.js'\nimport * as transactions from './transactions.js'\nimport * as analytics from './analytics.js'\nimport * as facilitators from './facilitators.js'\nimport * as resources from './resources.js'\nimport * as resourceMetrics from './resourceMetrics.js'\n\n/**\n * Combined schema object for Drizzle\n */\nexport const schema = {\n ...agents,\n ...transactions,\n ...analytics,\n ...facilitators,\n ...resources,\n ...resourceMetrics\n}\n\n// Re-export all table definitions\nexport * from './agents.js'\nexport * from './transactions.js'\nexport * from './analytics.js'\nexport * from './facilitators.js'\nexport * from './resources.js'\nexport * from './resourceMetrics.js'\n","/**\n * Database Instance\n * \n * Provides Drizzle database instance with connection.\n * Separated from schema to avoid circular dependencies during migration generation.\n * \n * @module database/db\n */\n\nimport { drizzle } from 'drizzle-orm/libsql'\nimport { getConnection } from './connection.js'\nimport { schema } from './schema/index.js'\n\n/**\n * Get Drizzle database instance\n * \n * Creates a type-safe Drizzle ORM instance connected to Turso.\n * Throws error if database not configured.\n * \n * @returns Drizzle database instance\n * @throws Error if Turso not configured\n * \n * @example\n * ```typescript\n * import { getDb } from '@ghostspeak/sdk/database'\n * \n * const db = await getDb()\n * const allAgents = await db.select().from(schema.agents)\n * ```\n */\nexport async function getDb() {\n const client = await getConnection()\n return drizzle(client, { schema })\n}\n\n// Export type for database instance\nexport type Database = Awaited<ReturnType<typeof getDb>>\n","/**\n * Agent Cache Service\n * \n * Manages caching of agent data from Solana blockchain to Turso database.\n * Provides cache-first queries with RPC fallback for resilience.\n * \n * @module database/services/AgentCacheService\n */\n\nimport { eq, and, desc, sql } from 'drizzle-orm'\nimport { getDb } from '../db.js'\nimport { agents, agentCapabilities, agentPricing, type Agent, type NewAgent } from '../schema/index.js'\nimport { isAvailable } from '../connection.js'\n\n/**\n * Cache configuration options\n */\nexport interface CacheOptions {\n /** Maximum age of cached data in milliseconds (default: 5 minutes) */\n maxAge?: number\n /** Whether to force refresh from chain (default: false) */\n forceRefresh?: boolean\n}\n\n/**\n * Agent Cache Service\n * \n * Provides high-performance caching layer for agent data.\n */\nexport class AgentCacheService {\n private static instance: AgentCacheService | null = null\n private readonly defaultMaxAge = 5 * 60 * 1000 // 5 minutes\n\n private constructor() { }\n\n /**\n * Get singleton instance\n */\n static getInstance(): AgentCacheService {\n if (!AgentCacheService.instance) {\n AgentCacheService.instance = new AgentCacheService()\n }\n return AgentCacheService.instance\n }\n\n /**\n * Check if cache is available\n */\n async isCacheAvailable(): Promise<boolean> {\n return await isAvailable()\n }\n\n /**\n * Get agent from cache\n * \n * @param agentAddress - Agent's Solana address\n * @param options - Cache options\n * @returns Agent data or null if not found/expired\n */\n async getAgent(\n agentAddress: string,\n options: CacheOptions = {}\n ): Promise<Agent | null> {\n if (!await this.isCacheAvailable()) {\n return null\n }\n\n const { maxAge = this.defaultMaxAge, forceRefresh = false } = options\n\n if (forceRefresh) {\n return null // Force RPC fetch\n }\n\n try {\n const db = await getDb()\n const results = await db\n .select()\n .from(agents)\n .where(eq(agents.agentAddress, agentAddress))\n .limit(1)\n\n if (results.length === 0) {\n return null\n }\n\n const agent = results[0]\n const age = Date.now() - agent.cachedAt\n\n // Return null if cache is stale\n if (age > maxAge) {\n return null\n }\n\n return agent\n } catch (error) {\n console.warn('[AgentCacheService] Failed to get agent from cache:', error)\n return null\n }\n }\n\n /**\n * Get multiple agents from cache\n * \n * @param agentAddresses - Array of agent addresses\n * @param options - Cache options\n * @returns Map of address to agent data\n */\n async getAgents(\n agentAddresses: string[],\n options: CacheOptions = {}\n ): Promise<Map<string, Agent>> {\n if (!await this.isCacheAvailable() || agentAddresses.length === 0) {\n return new Map()\n }\n\n const { maxAge = this.defaultMaxAge } = options\n\n try {\n const db = await getDb()\n const results = await db\n .select()\n .from(agents)\n .where(sql`${agents.agentAddress} IN ${agentAddresses}`)\n\n const now = Date.now()\n const agentMap = new Map<string, Agent>()\n\n for (const agent of results) {\n const age = now - agent.cachedAt\n if (age <= maxAge) {\n agentMap.set(agent.agentAddress, agent)\n }\n }\n\n return agentMap\n } catch (error) {\n console.warn('[AgentCacheService] Failed to get agents from cache:', error)\n return new Map()\n }\n }\n\n /**\n * Cache agent data\n * \n * @param agent - Agent data to cache\n * @param capabilities - Agent capabilities\n * @param pricing - Agent pricing info\n */\n async cacheAgent(\n agent: NewAgent,\n capabilities: string[] = [],\n pricing: Array<{ tokenAddress: string; decimals: number; symbol: string }> = []\n ): Promise<void> {\n if (!await this.isCacheAvailable()) {\n return\n }\n\n try {\n const db = await getDb()\n\n // Insert or replace agent\n await db\n .insert(agents)\n .values({\n ...agent,\n cachedAt: Date.now()\n })\n .onConflictDoUpdate({\n target: agents.agentAddress,\n set: {\n ...agent,\n cachedAt: Date.now(),\n updatedAt: Date.now()\n }\n })\n\n // Delete old capabilities and insert new ones\n await db\n .delete(agentCapabilities)\n .where(eq(agentCapabilities.agentAddress, agent.agentAddress))\n\n if (capabilities.length > 0) {\n await db.insert(agentCapabilities).values(\n capabilities.map(cap => ({\n agentAddress: agent.agentAddress,\n capability: cap\n }))\n )\n }\n\n // Delete old pricing and insert new ones\n await db\n .delete(agentPricing)\n .where(eq(agentPricing.agentAddress, agent.agentAddress))\n\n if (pricing.length > 0) {\n await db.insert(agentPricing).values(\n pricing.map(p => ({\n agentAddress: agent.agentAddress,\n ...p\n }))\n )\n }\n } catch (error) {\n console.error('[AgentCacheService] Failed to cache agent:', error)\n // Don't throw - caching failures should not break the app\n }\n }\n\n /**\n * List agents with filters\n * \n * @param filters - Query filters\n * @returns Array of agents\n */\n async listAgents(filters: {\n x402Enabled?: boolean\n framework?: string\n isVerified?: boolean\n minReputation?: number\n limit?: number\n offset?: number\n } = {}): Promise<Agent[]> {\n if (!await this.isCacheAvailable()) {\n return []\n }\n\n try {\n const db = await getDb()\n const {\n x402Enabled,\n framework,\n isVerified,\n minReputation,\n limit = 50,\n offset = 0\n } = filters\n\n // Build WHERE conditions\n const conditions = []\n if (x402Enabled !== undefined) {\n conditions.push(eq(agents.x402Enabled, x402Enabled))\n }\n if (framework) {\n conditions.push(eq(agents.frameworkOrigin, framework))\n }\n if (isVerified !== undefined) {\n conditions.push(eq(agents.isVerified, isVerified))\n }\n if (minReputation !== undefined) {\n conditions.push(sql`${agents.reputationScore} >= ${minReputation}`)\n }\n\n // Build and execute query\n if (conditions.length > 0) {\n const results = await db\n .select()\n .from(agents)\n .where(and(...conditions))\n .orderBy(desc(agents.reputationScore))\n .limit(limit)\n .offset(offset)\n return results\n } else {\n const results = await db\n .select()\n .from(agents)\n .orderBy(desc(agents.reputationScore))\n .limit(limit)\n .offset(offset)\n return results\n }\n } catch (error) {\n console.warn('[AgentCacheService] Failed to list agents:', error)\n return []\n }\n }\n\n /**\n * Invalidate cached agent\n * \n * @param agentAddress - Agent address to invalidate\n */\n async invalidateAgent(agentAddress: string): Promise<void> {\n if (!await this.isCacheAvailable()) {\n return\n }\n\n try {\n const db = await getDb()\n await db.delete(agents).where(eq(agents.agentAddress, agentAddress))\n } catch (error) {\n console.warn('[AgentCacheService] Failed to invalidate agent:', error)\n }\n }\n\n /**\n * Clear all cached agents\n */\n async clearCache(): Promise<void> {\n if (!await this.isCacheAvailable()) {\n return\n }\n\n try {\n const db = await getDb()\n await db.delete(agents)\n } catch (error) {\n console.error('[AgentCacheService] Failed to clear cache:', error)\n }\n }\n\n /**\n * Get cache statistics\n */\n async getCacheStats(): Promise<{\n totalAgents: number\n averageAge: number\n oldestCache: number\n } | null> {\n if (!await this.isCacheAvailable()) {\n return null\n }\n\n try {\n const db = await getDb()\n const result = await db\n .select({\n count: sql<number>`count(*)`,\n avgAge: sql<number>`avg(${Date.now()} - ${agents.cachedAt})`,\n oldestCache: sql<number>`min(${agents.cachedAt})`\n })\n .from(agents)\n\n return {\n totalAgents: result[0].count,\n averageAge: result[0].avgAge,\n oldestCache: result[0].oldestCache\n }\n } catch (error) {\n console.warn('[AgentCacheService] Failed to get cache stats:', error)\n return null\n }\n }\n}\n\n// Export singleton instance\nexport const agentCache = AgentCacheService.getInstance()\n","/**\n * x402 Agent Discovery Client\n *\n * Enables search and discovery of x402-enabled AI agents based on\n * capabilities, pricing, reputation, and accepted payment tokens.\n *\n * @module x402/AgentDiscoveryClient\n */\n\nimport type { Address, Commitment, SolanaRpcApi } from '@solana/kit'\nimport { createSolanaRpc, type Rpc } from '@solana/kit'\nimport { getAgentDecoder } from '../generated/accounts/agent.js'\nimport { AgentCacheService } from '../database/services/AgentCacheService.js'\n\n// Create compatibility types for connection\ntype Connection = Rpc<SolanaRpcApi>\n\n// Constants\nconst SOLANA_SYSTEM_PROGRAM_ID = '11111111111111111111111111111111' as Address\nconst REPUTATION_BASIS_POINTS_PER_STAR = 2000 // 1 star = 2000 basis points (20%)\n\n/**\n * Agent search parameters\n */\nexport interface AgentSearchParams {\n // Filter parameters\n capability?: string\n x402_enabled?: boolean\n accepted_tokens?: string[]\n min_reputation?: number\n max_price?: bigint\n framework_origin?: string\n is_verified?: boolean\n\n // Pagination\n page?: number\n limit?: number\n\n // Sorting\n sort_by?: 'reputation' | 'price' | 'total_jobs' | 'created_at'\n sort_order?: 'asc' | 'desc'\n\n // Search\n query?: string\n\n // Cache control\n force_refresh?: boolean\n}\n\n/**\n * Agent data structure\n */\nexport interface Agent {\n // On-chain data\n address: Address\n owner: Address\n name: string\n description: string\n capabilities: string[]\n\n // x402 payment data\n x402_enabled: boolean\n x402_payment_address: Address\n x402_accepted_tokens: Address[]\n x402_price_per_call: bigint\n x402_service_endpoint: string\n x402_total_payments: bigint\n x402_total_calls: bigint\n last_payment_timestamp: bigint\n\n // Reputation & stats\n reputation_score: number\n total_jobs: bigint\n successful_jobs: bigint\n total_earnings: bigint\n average_rating: number\n created_at: bigint\n\n // Metadata\n metadata_uri: string\n framework_origin: string\n is_verified: boolean\n}\n\n/**\n * Agent pricing information\n */\nexport interface AgentPricing {\n price_per_call: bigint\n accepted_tokens: Array<{\n token: Address\n decimals: number\n symbol: string\n }>\n payment_address: Address\n service_endpoint: string\n}\n\n/**\n * Agent search response\n */\nexport interface AgentSearchResponse {\n agents: Agent[]\n pagination: {\n page: number\n limit: number\n total: number\n totalPages: number\n }\n filters: AgentSearchParams\n fromCache?: boolean // Indicates if results came from cache\n}\n\n/**\n * Discovery client options\n */\nexport interface AgentDiscoveryOptions {\n rpcEndpoint: string\n programId: Address\n commitment?: Commitment\n cacheEnabled?: boolean\n cacheTTL?: number // seconds\n useDatabaseCache?: boolean // Use Turso database cache\n}\n\n/**\n * Agent Discovery Client\n *\n * Provides methods to search, filter, and discover x402-enabled agents\n * on the GhostSpeak marketplace.\n */\nexport class AgentDiscoveryClient {\n private rpc: Connection\n private programId: Address\n private commitment: Commitment\n private cache: Map<string, { data: unknown; expiry: number }> = new Map()\n private cacheEnabled: boolean\n private cacheTTL: number\n private useDatabaseCache: boolean\n private dbCache: AgentCacheService\n\n constructor(options: AgentDiscoveryOptions) {\n this.rpc = createSolanaRpc(options.rpcEndpoint) as Connection\n this.programId = options.programId\n this.commitment = options.commitment ?? 'confirmed'\n this.cacheEnabled = options.cacheEnabled ?? true\n this.cacheTTL = options.cacheTTL ?? 300 // 5 minutes default\n this.useDatabaseCache = options.useDatabaseCache ?? true\n this.dbCache = AgentCacheService.getInstance()\n }\n\n /**\n * Search for agents with filters\n */\n async searchAgents(params: AgentSearchParams = {}): Promise<AgentSearchResponse> {\n const cacheKey = this.getCacheKey('search', params)\n\n // Check cache\n if (this.cacheEnabled) {\n const cached = this.getFromCache<AgentSearchResponse>(cacheKey)\n if (cached) return cached\n }\n\n // Set defaults\n const page = params.page ?? 1\n const limit = Math.min(params.limit ?? 20, 100)\n const sortBy = params.sort_by ?? 'reputation'\n const sortOrder = params.sort_order ?? 'desc'\n\n // Fetch agents from on-chain\n const allAgents = await this.fetchAgentsFromChain(params)\n\n // Apply filters\n let filteredAgents = this.applyFilters(allAgents, params)\n\n // Sort results\n filteredAgents = this.sortAgents(filteredAgents, sortBy, sortOrder)\n\n // Paginate\n const total = filteredAgents.length\n const totalPages = Math.ceil(total / limit)\n const startIndex = (page - 1) * limit\n const endIndex = startIndex + limit\n const paginatedAgents = filteredAgents.slice(startIndex, endIndex)\n\n const response: AgentSearchResponse = {\n agents: paginatedAgents,\n pagination: {\n page,\n limit,\n total,\n totalPages\n },\n filters: params\n }\n\n // Cache results\n if (this.cacheEnabled) {\n this.setCache(cacheKey, response)\n }\n\n return response\n }\n\n /**\n * Get agent by address with database cache support\n * \n * Cache hierarchy:\n * 1. Check Turso database cache (if enabled)\n * 2. Fallback to RPC fetch\n * 3. Cache result in database for future requests\n */\n async getAgent(address: Address, forceRefresh = false): Promise<Agent | null> {\n const cacheKey = this.getCacheKey('agent', { address })\n\n // Try database cache first (if enabled and not forcing refresh)\n if (this.useDatabaseCache && !forceRefresh) {\n const cachedAgent = await this.dbCache.getAgent(address, {\n maxAge: this.cacheTTL * 1000,\n forceRefresh\n })\n\n if (cachedAgent) {\n console.log(`[AgentDiscovery] Cache HIT for agent ${address}`)\n return this.transformCachedAgent(cachedAgent)\n }\n }\n\n // Check memory cache\n if (this.cacheEnabled && !forceRefresh) {\n const cached = this.getFromCache<Agent>(cacheKey)\n if (cached) {\n console.log(`[AgentDiscovery] Memory cache HIT for agent ${address}`)\n return cached\n }\n }\n\n // Cache MISS - fetch from RPC\n console.log(`[AgentDiscovery] Cache MISS for agent ${address}, fetching from RPC`)\n\n try {\n const result = await this.rpc.getAccountInfo(address, {\n commitment: this.commitment,\n encoding: 'base64'\n }).send()\n\n const accountInfo = result as { value: { data: [string, string] } | null }\n if (!accountInfo.value) return null\n\n const agent = this.parseAgentAccount(address, accountInfo.value.data)\n\n if (agent) {\n // Cache in database asynchronously (fire and forget)\n if (this.useDatabaseCache) {\n this.cacheAgentInDatabase(agent).catch(err =>\n console.warn('[AgentDiscovery] Failed to cache agent in database:', err)\n )\n }\n\n // Cache in memory\n if (this.cacheEnabled) {\n this.setCache(cacheKey, agent)\n }\n }\n\n return agent\n } catch (error) {\n console.error(`Failed to fetch agent ${address}:`, error)\n return null\n }\n }\n\n /**\n * Helper to cache agent in database\n */\n private async cacheAgentInDatabase(agent: Agent): Promise<void> {\n await this.dbCache.cacheAgent(\n {\n agentAddress: agent.address,\n owner: agent.owner,\n name: agent.name,\n description: agent.description,\n reputationScore: agent.reputation_score,\n totalJobsCompleted: Number(agent.total_jobs),\n totalEarnings: agent.total_earnings.toString(),\n x402Enabled: agent.x402_enabled,\n x402PaymentAddress: agent.x402_payment_address,\n x402PricePerCall: agent.x402_price_per_call.toString(),\n x402ServiceEndpoint: agent.x402_service_endpoint,\n x402TotalPayments: agent.x402_total_payments.toString(),\n x402TotalCalls: agent.x402_total_calls.toString(),\n lastPaymentTimestamp: Number(agent.last_payment_timestamp),\n metadataUri: agent.metadata_uri,\n frameworkOrigin: agent.framework_origin,\n isVerified: agent.is_verified,\n createdAt: Number(agent.created_at),\n updatedAt: Date.now(),\n cachedAt: Date.now(),\n bump: 0 // Placeholder\n },\n agent.capabilities,\n [] // Pricing info would be added here\n )\n }\n\n /**\n * Transform cached database agent to Agent interface\n */\n private transformCachedAgent(cachedAgent: any): Agent {\n return {\n address: cachedAgent.agentAddress as Address,\n owner: cachedAgent.owner as Address,\n name: cachedAgent.name,\n description: cachedAgent.description,\n capabilities: [], // Would need to join from agentCapabilities table\n x402_enabled: Boolean(cachedAgent.x402Enabled),\n x402_payment_address: cachedAgent.x402PaymentAddress as Address,\n x402_accepted_tokens: [], // Would join from agentPricing table\n x402_price_per_call: BigInt(cachedAgent.x402PricePerCall),\n x402_service_endpoint: cachedAgent.x402ServiceEndpoint,\n x402_total_payments: BigInt(cachedAgent.x402TotalPayments),\n x402_total_calls: BigInt(cachedAgent.x402TotalCalls),\n last_payment_timestamp: BigInt(cachedAgent.lastPaymentTimestamp),\n reputation_score: cachedAgent.reputationScore,\n total_jobs: BigInt(cachedAgent.totalJobsCompleted),\n successful_jobs: BigInt(cachedAgent.totalJobsCompleted),\n total_earnings: BigInt(cachedAgent.totalEarnings),\n average_rating: cachedAgent.reputationScore / REPUTATION_BASIS_POINTS_PER_STAR,\n created_at: BigInt(cachedAgent.createdAt),\n metadata_uri: cachedAgent.metadataUri,\n framework_origin: cachedAgent.frameworkOrigin,\n is_verified: Boolean(cachedAgent.isVerified)\n }\n }\n\n /**\n * Get agent pricing information\n */\n async getAgentPricing(address: Address): Promise<AgentPricing | null> {\n const agent = await this.getAgent(address)\n if (!agent?.x402_enabled) return null\n\n return {\n price_per_call: agent.x402_price_per_call,\n accepted_tokens: await this.getTokenInfo(agent.x402_accepted_tokens),\n payment_address: agent.x402_payment_address,\n service_endpoint: agent.x402_service_endpoint\n }\n }\n\n /**\n * Get recommended agents based on criteria\n */\n async getRecommendedAgents(\n capability?: string,\n limit = 10\n ): Promise<Agent[]> {\n const params: AgentSearchParams = {\n capability,\n x402_enabled: true,\n sort_by: 'reputation',\n sort_order: 'desc',\n limit,\n min_reputation: 7000 // Only recommend highly rated agents (7.0+)\n }\n\n const response = await this.searchAgents(params)\n return response.agents\n }\n\n /**\n * Get agents by capability\n */\n async getAgentsByCapability(capability: string): Promise<Agent[]> {\n const response = await this.searchAgents({\n capability,\n x402_enabled: true\n })\n return response.agents\n }\n\n /**\n * Get agents accepting specific token\n */\n async getAgentsByToken(tokenAddress: Address): Promise<Agent[]> {\n const response = await this.searchAgents({\n accepted_tokens: [tokenAddress],\n x402_enabled: true\n })\n return response.agents\n }\n\n /**\n * Get agents within price range\n */\n async getAgentsByPriceRange(\n maxPrice: bigint,\n capability?: string\n ): Promise<Agent[]> {\n const response = await this.searchAgents({\n max_price: maxPrice,\n capability,\n x402_enabled: true,\n sort_by: 'price',\n sort_order: 'asc'\n })\n return response.agents\n }\n\n /**\n * Search agents by text query\n */\n async searchByQuery(query: string): Promise<Agent[]> {\n const response = await this.searchAgents({\n query,\n x402_enabled: true\n })\n return response.agents\n }\n\n // Private helper methods\n\n private async fetchAgentsFromChain(params: AgentSearchParams): Promise<Agent[]> {\n try {\n // Build filters for getProgramAccounts\n // Note: Currently only using dataSize filter, memcmp filters would require Base58EncodedBytes type\n const filters: Array<{ dataSize: bigint }> = []\n\n // Add data size filter for Agent account\n filters.push({ dataSize: 359n }) // Agent account size from CLAUDE.md\n\n // If x402_enabled filter is true, we need to filter for accounts where x402_enabled = true\n // This would require knowing the exact offset of the x402_enabled field in the account\n // For now, we'll fetch all and filter in memory\n\n const accounts = await this.rpc.getProgramAccounts(this.programId, {\n commitment: this.commitment,\n encoding: 'base64',\n filters\n }).send()\n\n // Extract accounts from RPC response\n const agents: Agent[] = []\n for (const { pubkey, account } of accounts) {\n const agent = this.parseAgentAccount(pubkey, account.data)\n if (agent) {\n agents.push(agent)\n }\n }\n\n return agents\n } catch (error) {\n console.error('Failed to fetch agents from chain:', error)\n return []\n }\n }\n\n private parseAgentAccount(address: Address, data: unknown): Agent | null {\n try {\n // Convert data to Uint8Array if it's a string (base64)\n let dataBytes: Uint8Array\n if (typeof data === 'string') {\n dataBytes = Uint8Array.from(Buffer.from(data, 'base64'))\n } else if (Array.isArray(data)) {\n // Check if it's an RPC tuple: [base64String, 'base64']\n if (\n data.length === 2 &&\n typeof data[0] === 'string' &&\n typeof data[1] === 'string' &&\n data[1] === 'base64'\n ) {\n dataBytes = Uint8Array.from(Buffer.from(data[0], 'base64'))\n } else {\n // Assume it's a number array\n dataBytes = Uint8Array.from(data as number[])\n }\n } else if (data instanceof Uint8Array) {\n dataBytes = data\n } else {\n throw new Error('Invalid data format')\n }\n\n // Decode using generated Codama decoder\n const decoder = getAgentDecoder()\n const decodedData = decoder.decode(dataBytes)\n const decodedAgent = Array.isArray(decodedData) ? decodedData[0] : decodedData\n\n // Access x402 fields directly from generated type\n // Transform to our Agent interface format\n return {\n address,\n owner: decodedAgent.owner,\n name: decodedAgent.name,\n description: decodedAgent.description,\n capabilities: decodedAgent.capabilities,\n // x402 fields\n x402_enabled: decodedAgent.x402Enabled,\n x402_payment_address: decodedAgent.x402PaymentAddress,\n x402_accepted_tokens: decodedAgent.x402AcceptedTokens,\n x402_price_per_call: decodedAgent.x402PricePerCall,\n x402_service_endpoint: decodedAgent.x402ServiceEndpoint,\n x402_total_payments: decodedAgent.x402TotalPayments,\n x402_total_calls: decodedAgent.x402TotalCalls,\n last_payment_timestamp: decodedAgent.lastPaymentTimestamp,\n // Standard fields\n reputation_score: decodedAgent.reputationScore,\n total_jobs: BigInt(decodedAgent.totalJobsCompleted),\n successful_jobs: BigInt(decodedAgent.totalJobsCompleted), // Assuming successful = completed\n total_earnings: decodedAgent.totalEarnings,\n average_rating: decodedAgent.reputationScore / REPUTATION_BASIS_POINTS_PER_STAR, // Convert from basis points to 1-5 scale\n created_at: decodedAgent.createdAt,\n metadata_uri: decodedAgent.metadataUri,\n framework_origin: decodedAgent.frameworkOrigin,\n is_verified: decodedAgent.isVerified\n }\n } catch (error) {\n console.error('Failed to parse agent account:', error)\n return null\n }\n }\n\n private applyFilters(agents: Agent[], params: AgentSearchParams): Agent[] {\n let filtered = agents\n\n // Filter by x402_enabled\n if (params.x402_enabled !== undefined) {\n filtered = filtered.filter(a => a.x402_enabled === params.x402_enabled)\n }\n\n // Filter by capability\n if (params.capability) {\n filtered = filtered.filter(a =>\n a.capabilities.some(c =>\n c.toLowerCase().includes(params.capability!.toLowerCase())\n )\n )\n }\n\n // Filter by accepted tokens\n if (params.accepted_tokens?.length) {\n filtered = filtered.filter(a =>\n params.accepted_tokens!.some(token =>\n a.x402_accepted_tokens.includes(token as Address)\n )\n )\n }\n\n // Filter by minimum reputation\n if (params.min_reputation !== undefined) {\n filtered = filtered.filter(a => a.reputation_score >= params.min_reputation!)\n }\n\n // Filter by maximum price\n if (params.max_price !== undefined) {\n filtered = filtered.filter(a => a.x402_price_per_call <= params.max_price!)\n }\n\n // Filter by framework origin\n if (params.framework_origin) {\n filtered = filtered.filter(a =>\n a.framework_origin.toLowerCase() === params.framework_origin!.toLowerCase()\n )\n }\n\n // Filter by verified status\n if (params.is_verified !== undefined) {\n filtered = filtered.filter(a => a.is_verified === params.is_verified)\n }\n\n // Filter by text query\n if (params.query) {\n const query = params.query.toLowerCase()\n filtered = filtered.filter(a =>\n a.name.toLowerCase().includes(query) ||\n a.description.toLowerCase().includes(query)\n )\n }\n\n return filtered\n }\n\n private sortAgents(\n agents: Agent[],\n sortBy: string,\n sortOrder: string\n ): Agent[] {\n const sorted = [...agents]\n const order = sortOrder === 'asc' ? 1 : -1\n\n sorted.sort((a, b) => {\n let comparison = 0\n\n switch (sortBy) {\n case 'reputation':\n comparison = a.reputation_score - b.reputation_score\n break\n case 'price':\n comparison = Number(a.x402_price_per_call - b.x402_price_per_call)\n break\n case 'total_jobs':\n comparison = Number(a.total_jobs - b.total_jobs)\n break\n case 'created_at':\n comparison = Number(a.created_at - b.created_at)\n break\n }\n\n return comparison * order\n })\n\n return sorted\n }\n\n private async getTokenInfo(tokens: Address[]): Promise<Array<{\n token: Address\n decimals: number\n symbol: string\n }>> {\n const tokenInfo: Array<{ token: Address; decimals: number; symbol: string }> = []\n\n for (const token of tokens) {\n try {\n // Fetch token mint info\n const result = await this.rpc.getAccountInfo(token, {\n commitment: this.commitment,\n encoding: 'base64'\n }).send()\n\n const mintInfo = result as { value: { data: [string, string] } | null }\n if (mintInfo.value) {\n // Parse mint account to get decimals\n // Mint layout: MintAuthority(36) + Supply(8) + Decimals(1) + ...\n const data = Buffer.from(mintInfo.value.data[0], 'base64')\n const decimals = data[44]\n \n tokenInfo.push({\n token,\n decimals, \n symbol: 'USDC' // Placeholder - would look up from token registry or metadata\n })\n }\n } catch (error) {\n console.error(`Failed to fetch token info for ${token}:`, error)\n }\n }\n\n return tokenInfo\n }\n\n private getCacheKey(prefix: string, params: unknown): string {\n return `${prefix}:${JSON.stringify(params)}`\n }\n\n private getFromCache<T>(key: string): T | null {\n const cached = this.cache.get(key)\n if (!cached) return null\n\n if (Date.now() > cached.expiry) {\n this.cache.delete(key)\n return null\n }\n\n return cached.data as T\n }\n\n private setCache(key: string, data: unknown): void {\n const expiry = Date.now() + (this.cacheTTL * 1000)\n this.cache.set(key, { data, expiry })\n\n // Limit cache size\n if (this.cache.size > 1000) {\n // Remove oldest entries\n const entries = Array.from(this.cache.entries())\n entries.sort((a, b) => a[1].expiry - b[1].expiry)\n for (let i = 0; i < 100; i++) {\n this.cache.delete(entries[i][0])\n }\n }\n }\n\n /**\n * Clear all cached data\n */\n clearCache(): void {\n this.cache.clear()\n }\n\n /**\n * Get cache statistics\n */\n getCacheStats(): { size: number; enabled: boolean; ttl: number } {\n return {\n size: this.cache.size,\n enabled: this.cacheEnabled,\n ttl: this.cacheTTL\n }\n }\n}\n\n/**\n * Create an Agent Discovery Client instance\n */\nexport function createAgentDiscoveryClient(\n options: AgentDiscoveryOptions\n): AgentDiscoveryClient {\n return new AgentDiscoveryClient(options)\n}\n","/**\n * Format Utilities\n * \n * Utility functions for formatting and parsing Solana addresses, signatures, and amounts\n */\n\nimport { address } from '@solana/addresses'\nimport type { Address } from '@solana/addresses'\nimport type { Signature } from '@solana/kit'\n\n/**\n * Convert a string or Address to an Address type\n * @param value String representation of a public key or an Address\n * @returns Address type\n */\nexport function toAddress(value: string | Address): Address {\n if (typeof value === 'string') {\n return address(value)\n }\n return value\n}\n\n/**\n * Convert a string or Signature to a Signature type\n * @param value String representation of a signature or a Signature\n * @returns Signature type\n */\nexport function toSignature(value: string | Signature): Signature {\n if (typeof value === 'string') {\n // Cast string to Signature type\n return value as Signature\n }\n return value\n}\n\n/**\n * Format lamports to SOL as a string\n * @param lamports Amount in lamports (1 SOL = 1e9 lamports)\n * @returns String representation of SOL amount\n */\nexport function formatLamports(lamports: bigint): string {\n const sol = Number(lamports) / 1e9\n // Remove trailing zeros and decimal point if whole number\n return sol.toString()\n}\n\n/**\n * Parse SOL amount string to lamports\n * @param amount SOL amount as string (e.g., \"1.5\" for 1.5 SOL)\n * @returns Amount in lamports as bigint\n */\nexport function parseAmount(amount: string): bigint {\n // Handle edge cases\n if (amount === '0' || amount === '') {\n return 0n\n }\n \n // Parse the decimal number and convert to lamports\n const sol = parseFloat(amount)\n if (isNaN(sol)) {\n throw new Error(`Invalid amount: ${amount}`)\n }\n \n // Convert to lamports (1 SOL = 1e9 lamports)\n // Use Math.round to handle floating point precision issues\n const lamports = Math.round(sol * 1e9)\n \n return BigInt(lamports)\n}","/**\n * HTTP 402 Middleware for AI Agent Services\n *\n * Implements the x402 payment protocol as Express/Fastify middleware.\n * Enables pay-per-request API endpoints.\n *\n * @module X402Middleware\n */\n\n// Type imports with fallback for optional dependencies\nimport type { Address } from '@solana/addresses'\nimport type { Signature, Rpc, SolanaRpcApi } from '@solana/kit'\nimport type { X402Client } from './X402Client.js'\nimport { toSignature } from '../utils/format.js'\nimport { fetchMaybeAgent, type Agent } from '../generated/accounts/agent.js'\nimport { createSolanaRpc } from '@solana/kit'\n\n// Express types (optional dependency)\ntype Request = {\n headers: Record<string, string | string[] | undefined>\n body?: unknown\n query?: unknown\n params?: unknown\n url?: string\n ip?: string\n [key: string]: unknown\n}\n\ntype Response = {\n status(code: number): Response\n json(body: unknown): Response\n set(headers: Record<string, string>): Response\n send(body?: unknown): Response\n [key: string]: unknown\n}\n\ntype NextFunction = () => void\n\n// Fastify types (optional dependency)\ntype FastifyRequest = {\n headers: Record<string, string | string[] | undefined>\n body?: unknown\n query?: unknown\n params?: unknown\n url?: string\n ip?: string\n [key: string]: unknown\n}\n\ntype FastifyReply = {\n code(statusCode: number): FastifyReply\n send(payload?: unknown): FastifyReply\n header(name: string, value: string): FastifyReply\n headers(headers: Record<string, string>): FastifyReply\n [key: string]: unknown\n}\n\ntype FastifyInstance = {\n addHook(name: string, hook: (request: FastifyRequest, reply: FastifyReply) => Promise<void>): void\n [key: string]: unknown\n}\n\n// =====================================================\n// TYPES\n// =====================================================\n\nexport interface X402MiddlewareOptions {\n x402Client: X402Client\n requiredPayment: bigint\n token: Address\n description: string\n agentId?: string // Agent ID for on-chain payment recording\n recordPaymentOnChain?: boolean // Whether to call record_x402_payment instruction\n allowBypass?: boolean\n bypassAddresses?: Address[]\n preventDuplicatePayments?: boolean // Default: true - prevent signature replay attacks\n signatureCacheTTL?: number // Default: 3600 seconds (1 hour) - how long to remember used signatures\n enforceExpiration?: boolean // Default: true - reject expired payment requests\n lookupCallerIdentity?: boolean // Default: false - lookup agent identity from payment source\n rpcEndpoint?: string // Required if lookupCallerIdentity is true\n programId?: Address // Optional program ID for agent lookups\n onPaymentVerified?: (signature: string, req: Request) => Promise<void>\n onPaymentFailed?: (error: string, req: Request) => Promise<void>\n onReputationUpdateFailed?: (error: Error) => void // Graceful error handling for reputation updates\n}\n\n// =====================================================\n// SIGNATURE CACHE (for duplicate payment prevention)\n// =====================================================\n\ninterface SignatureCacheEntry {\n timestamp: number\n expiresAt: number\n}\n\nclass SignatureCache {\n private cache: Map<string, SignatureCacheEntry> = new Map()\n private readonly ttl: number\n private cleanupInterval: NodeJS.Timeout | null = null\n\n constructor(ttl: number = 3600) {\n this.ttl = ttl * 1000 // Convert to milliseconds\n\n // Cleanup expired entries every 5 minutes\n this.cleanupInterval = setInterval(() => this.cleanup(), 300000)\n\n // Unref the interval to allow Node.js to exit if this is the only remaining timer\n if (this.cleanupInterval.unref) {\n this.cleanupInterval.unref()\n }\n }\n\n has(signature: string): boolean {\n const entry = this.cache.get(signature)\n if (!entry) return false\n\n // Check if entry has expired\n if (Date.now() > entry.expiresAt) {\n this.cache.delete(signature)\n return false\n }\n\n return true\n }\n\n add(signature: string): void {\n this.cache.set(signature, {\n timestamp: Date.now(),\n expiresAt: Date.now() + this.ttl\n })\n }\n\n private cleanup(): void {\n const now = Date.now()\n for (const [signature, entry] of this.cache.entries()) {\n if (now > entry.expiresAt) {\n this.cache.delete(signature)\n }\n }\n }\n\n getSize(): number {\n return this.cache.size\n }\n\n /**\n * Destroy the cache and clear the cleanup interval\n * Call this when shutting down to prevent memory leaks\n */\n destroy(): void {\n if (this.cleanupInterval) {\n clearInterval(this.cleanupInterval)\n this.cleanupInterval = null\n }\n this.cache.clear()\n }\n}\n\n // Global signature cache (shared across middleware instances)\n let globalSignatureCache: SignatureCache | null = null;\n const getGlobalSignatureCache = (): SignatureCache => {\n if (!globalSignatureCache) {\n globalSignatureCache = new SignatureCache();\n }\n return globalSignatureCache;\n }\n\n/**\n * Caller identity information for authenticated agents\n */\nexport interface X402CallerIdentity {\n type: 'agent' | 'unknown'\n address: Address\n agent?: {\n name: string\n owner: Address\n reputation_score: number\n is_verified: boolean\n capabilities: string[]\n framework_origin: string\n x402_enabled: boolean\n }\n}\n\nexport interface X402RequestWithPayment extends Request {\n x402Payment?: {\n signature: string\n verified: boolean\n amount: bigint\n token: Address\n responseTimeMs?: number // Response time for analytics\n timestamp: number // Payment timestamp\n caller?: X402CallerIdentity // Optional caller identity (if lookupCallerIdentity enabled)\n }\n}\n\nexport interface X402FastifyRequest extends FastifyRequest {\n x402Payment?: {\n signature: string\n verified: boolean\n amount: bigint\n token: Address\n }\n}\n\n// =====================================================\n// MIDDLEWARE\n// =====================================================\n\n/**\n * Express middleware for x402 payment verification\n *\n * @example\n * ```typescript\n * import express from 'express'\n * import { createX402Middleware } from '@ghostspeak/sdk'\n *\n * const app = express()\n *\n * app.get('/api/agent/query',\n * createX402Middleware({\n * x402Client: client,\n * requiredPayment: 1000n, // 0.001 USDC\n * token: USDC_ADDRESS,\n * description: 'AI agent query'\n * }),\n * async (req, res) => {\n * // Payment verified, process request\n * const result = await processQuery(req.query)\n * res.json(result)\n * }\n * )\n * ```\n */\nexport function createX402Middleware(options: X402MiddlewareOptions) {\n // Set defaults for security options\n const preventDuplicates = options.preventDuplicatePayments ?? true\n const enforceExpiration = options.enforceExpiration ?? true\n const cacheTTL = options.signatureCacheTTL ?? 3600\n\n // Create instance-specific signature cache if needed\n const signatureCache = preventDuplicates ?\n (options.signatureCacheTTL ? new SignatureCache(cacheTTL) : globalSignatureCache) :\n null\n\n return async (\n req: X402RequestWithPayment,\n res: Response,\n next: NextFunction\n ) => {\n // Start response time tracking\n const requestStartTime = Date.now()\n\n const paymentSignature = req.headers['x-payment-signature'] as string | undefined\n const paymentExpiresAt = req.headers['x-payment-expires-at'] as string | undefined\n\n // Check bypass conditions\n if (options.allowBypass && shouldBypass(req, options)) {\n return next()\n }\n\n // Create payment request (needed for 402 response)\n const paymentRequest = options.x402Client.createPaymentRequest({\n amount: options.requiredPayment,\n token: options.token,\n description: options.description\n })\n\n // No payment provided - return HTTP 402\n if (!paymentSignature) {\n const headers = options.x402Client.createPaymentHeaders(paymentRequest)\n\n res.status(402).set(headers as unknown as Record<string, string>).json({\n error: 'Payment Required',\n message: 'This endpoint requires x402 payment',\n code: 'PAYMENT_REQUIRED',\n paymentDetails: {\n address: paymentRequest.recipient,\n amount: paymentRequest.amount.toString(),\n token: paymentRequest.token,\n blockchain: 'solana',\n description: options.description,\n expiresAt: paymentRequest.expiresAt\n },\n documentation: 'https://docs.ghostspeak.ai/x402'\n })\n return\n }\n\n // Check for duplicate payment (replay attack prevention)\n if (preventDuplicates && signatureCache?.has(paymentSignature)) {\n if (options.onPaymentFailed) {\n await options.onPaymentFailed('Payment signature already used', req)\n }\n\n res.status(402).json({\n error: 'Payment Already Used',\n message: 'This payment signature has already been used. Please create a new payment.',\n code: 'PAYMENT_DUPLICATE'\n })\n return\n }\n\n // Check payment expiration (from client-provided header)\n if (enforceExpiration && paymentExpiresAt) {\n const now = Date.now()\n const expiresAtTimestamp = parseInt(paymentExpiresAt, 10)\n\n if (isNaN(expiresAtTimestamp)) {\n if (options.onPaymentFailed) {\n await options.onPaymentFailed('Invalid expiration timestamp', req)\n }\n\n res.status(402).json({\n error: 'Invalid Payment Expiration',\n message: 'The x-payment-expires-at header contains an invalid timestamp.',\n code: 'PAYMENT_INVALID_EXPIRY'\n })\n return\n }\n\n if (now > expiresAtTimestamp) {\n if (options.onPaymentFailed) {\n await options.onPaymentFailed('Payment request expired', req)\n }\n\n res.status(402).json({\n error: 'Payment Expired',\n message: 'This payment request has expired. Please create a new payment.',\n code: 'PAYMENT_EXPIRED',\n expiresAt: expiresAtTimestamp,\n currentTime: now\n })\n return\n }\n }\n\n try {\n // Verify payment\n const verification = await options.x402Client.verifyPaymentDetails({\n signature: toSignature(paymentSignature),\n expectedRecipient: paymentRequest.recipient,\n expectedAmount: options.requiredPayment,\n expectedToken: options.token\n })\n\n if (!verification.valid) {\n // Payment verification failed\n if (options.onPaymentFailed) {\n await options.onPaymentFailed(verification.error ?? 'Unknown error', req)\n }\n\n res.status(402).json({\n error: 'Payment Verification Failed',\n message: verification.error ?? 'Invalid payment',\n code: 'PAYMENT_INVALID'\n })\n return\n }\n\n // Calculate response time (from start to payment verification)\n const responseTimeMs = Date.now() - requestStartTime\n\n // Lookup caller identity (if enabled)\n let callerIdentity: X402CallerIdentity | undefined\n\n if (options.lookupCallerIdentity) {\n try {\n callerIdentity = await lookupCallerIdentity(\n verification.receipt!.recipient,\n options.rpcEndpoint,\n options.programId\n )\n } catch (identityError) {\n // Gracefully handle identity lookup failures\n // Don't block the request if identity lookup fails\n console.warn('[x402] Failed to lookup caller identity:', identityError)\n }\n }\n\n // Payment verified successfully\n req.x402Payment = {\n signature: paymentSignature,\n verified: true,\n amount: verification.receipt!.amount,\n token: verification.receipt!.token,\n responseTimeMs,\n timestamp: Date.now(),\n caller: callerIdentity\n }\n\n // Add signature to cache to prevent replay attacks\n if (preventDuplicates && signatureCache) {\n signatureCache.add(paymentSignature)\n }\n\n // Optionally record payment on-chain via record_x402_payment instruction\n if (options.recordPaymentOnChain && options.agentId) {\n try {\n // This would call the record_x402_payment Solana instruction\n // Implementation depends on having a GhostSpeak SDK client with the instruction\n // Example:\n // await options.x402Client.recordPaymentOnChain({\n // agentId: options.agentId,\n // amount: verification.receipt!.amount,\n // tokenMint: verification.receipt!.token,\n // transactionSignature: paymentSignature,\n // responseTimeMs\n // })\n\n // For now, we'll just log that this would happen\n console.log(`[x402] Would record payment on-chain for agent ${options.agentId}`)\n } catch (reputationError) {\n // Gracefully handle reputation/on-chain update failures\n // Don't block the request if reputation update fails\n if (options.onReputationUpdateFailed && reputationError instanceof Error) {\n options.onReputationUpdateFailed(reputationError)\n } else {\n console.error('[x402] Failed to record payment on-chain:', reputationError)\n }\n // Continue processing the request despite reputation update failure\n }\n }\n\n if (options.onPaymentVerified) {\n await options.onPaymentVerified(paymentSignature, req)\n }\n\n // Proceed to route handler\n next()\n } catch (error) {\n // Error during verification\n const errorMessage = error instanceof Error ? error.message : 'Unknown error'\n\n if (options.onPaymentFailed) {\n await options.onPaymentFailed(errorMessage, req)\n }\n\n res.status(500).json({\n error: 'Payment Verification Error',\n message: errorMessage,\n code: 'PAYMENT_VERIFICATION_ERROR'\n })\n }\n }\n}\n\n/**\n * Fastify plugin for x402 payment verification\n *\n * @example\n * ```typescript\n * import Fastify from 'fastify'\n * import { x402FastifyPlugin } from '@ghostspeak/sdk'\n *\n * const fastify = Fastify()\n *\n * fastify.register(x402FastifyPlugin, {\n * x402Client: client,\n * routes: {\n * '/api/agent/query': {\n * payment: 1000n,\n * token: USDC_ADDRESS,\n * description: 'AI agent query'\n * }\n * }\n * })\n * ```\n */\nexport function x402FastifyPlugin(\n fastify: FastifyInstance,\n options: {\n x402Client: X402Client\n routes: Record<string, {\n payment: bigint\n token: Address\n description: string\n }>\n }\n) {\n fastify.addHook('preHandler', async (request: X402FastifyRequest, reply: FastifyReply) => {\n const route = request.url ? options.routes[request.url] : undefined\n\n if (!route) {\n // Route not protected by x402\n return\n }\n\n const paymentSignature = request.headers['x-payment-signature'] as string | undefined\n\n // Create payment request (needed for both 402 response and verification)\n const paymentRequest = options.x402Client.createPaymentRequest({\n amount: route.payment,\n token: route.token,\n description: route.description\n })\n\n if (!paymentSignature) {\n const headers = options.x402Client.createPaymentHeaders(paymentRequest)\n\n reply.code(402).headers(headers as unknown as Record<string, string>).send({\n error: 'Payment Required',\n paymentDetails: {\n address: paymentRequest.recipient,\n amount: paymentRequest.amount.toString(),\n token: paymentRequest.token\n }\n })\n return\n }\n\n // Verify payment\n const verification = await options.x402Client.verifyPaymentDetails({\n signature: toSignature(paymentSignature),\n expectedRecipient: paymentRequest.recipient,\n expectedAmount: route.payment,\n expectedToken: route.token\n })\n\n if (!verification.valid) {\n reply.code(402).send({\n error: 'Payment Verification Failed',\n message: verification.error\n })\n return\n }\n\n // Add payment info to request\n request.x402Payment = {\n signature: paymentSignature,\n verified: true,\n amount: verification.receipt!.amount,\n token: verification.receipt!.token\n }\n })\n}\n\n// =====================================================\n// HELPER FUNCTIONS\n// =====================================================\n\nfunction shouldBypass(\n req: X402RequestWithPayment,\n options: X402MiddlewareOptions\n): boolean {\n // Check if requester is in bypass list\n const clientAddress = req.headers['x-client-address'] as string | undefined\n\n if (clientAddress && options.bypassAddresses) {\n return options.bypassAddresses.includes(clientAddress as Address)\n }\n\n return false\n}\n\n/**\n * Lookup caller identity from payment source address\n *\n * Checks if the payment source is a registered GhostSpeak agent and\n * returns agent identity information for authentication and rate limiting.\n *\n * @param sourceAddress - Payment source address\n * @param rpcEndpoint - Solana RPC endpoint\n * @param programId - Optional GhostSpeak program ID\n * @returns Caller identity information\n */\nasync function lookupCallerIdentity(\n sourceAddress: Address,\n rpcEndpoint?: string,\n programId?: Address\n): Promise<X402CallerIdentity> {\n if (!rpcEndpoint) {\n return {\n type: 'unknown',\n address: sourceAddress\n }\n }\n\n try {\n const rpc = createSolanaRpc(rpcEndpoint) as Rpc<SolanaRpcApi>\n\n // Try to fetch agent account at this address\n const maybeAgent = await fetchMaybeAgent(rpc, sourceAddress)\n\n if (!maybeAgent.exists) {\n return {\n type: 'unknown',\n address: sourceAddress\n }\n }\n\n const agent = maybeAgent.data\n\n return {\n type: 'agent',\n address: sourceAddress,\n agent: {\n name: agent.name,\n owner: agent.owner,\n reputation_score: agent.reputationScore,\n is_verified: agent.isVerified,\n capabilities: agent.capabilities,\n framework_origin: agent.frameworkOrigin,\n x402_enabled: true // Assume all agents support x402 (no explicit flag in schema)\n }\n }\n } catch (error) {\n // Agent lookup failed, return unknown identity\n console.warn('[x402] Agent lookup failed:', error)\n return {\n type: 'unknown',\n address: sourceAddress\n }\n }\n}\n\n// =====================================================\n// RATE LIMITING DECORATOR\n// =====================================================\n\n/**\n * Decorator to add rate limiting based on x402 payments\n */\nexport function withX402RateLimit(options: {\n maxRequestsPerMinute: number\n paymentRequired: bigint\n}) {\n const requests = new Map<string, number[]>()\n\n return (\n target: any,\n propertyKey: string,\n descriptor: PropertyDescriptor\n ) => {\n const originalMethod = descriptor.value\n\n descriptor.value = async function (...args: any[]) {\n const req = args[0] as X402RequestWithPayment\n const res = args[1] as Response\n\n // Get client IP, checking X-Forwarded-For for proxies\n const forwardedFor = req.headers['x-forwarded-for'] as string | undefined\n const clientIp = forwardedFor?.split(',')[0]?.trim() ?? req.ip ?? 'unknown'\n const clientId = req.x402Payment?.signature ?? clientIp\n const now = Date.now()\n\n // Clean old requests\n const userRequests = requests.get(clientId) ?? []\n const recentRequests = userRequests.filter(\n timestamp => now - timestamp < 60000\n )\n\n // Check rate limit\n if (recentRequests.length >= options.maxRequestsPerMinute) {\n res.status(429).json({\n error: 'Rate Limit Exceeded',\n message: `Maximum ${options.maxRequestsPerMinute} requests per minute`,\n paymentRequired: options.paymentRequired.toString()\n })\n return\n }\n\n // Record request\n recentRequests.push(now)\n requests.set(clientId, recentRequests)\n\n // Call original method\n return originalMethod.apply(this, args)\n }\n }\n}\n\n// =====================================================\n// EXPORTS\n// =====================================================\n\nexport default createX402Middleware\n","/**\n * Enhanced x402 Response Schema\n *\n * Extended x402 protocol schema with AI integration fields.\n * Enables AI models to understand and use x402 resources as tools.\n *\n * @module x402/schemas/enhanced-x402\n */\n\nimport type { Network } from '../FacilitatorRegistry.js'\n\n// =====================================================\n// JSON SCHEMA TYPES\n// =====================================================\n\n/**\n * JSON Schema 7 compatible schema definition\n */\nexport interface JSONSchema7 {\n // Core\n $schema?: string\n $id?: string\n $ref?: string\n $defs?: Record<string, JSONSchema7>\n\n // Meta\n title?: string\n description?: string\n default?: unknown\n examples?: unknown[]\n deprecated?: boolean\n readOnly?: boolean\n writeOnly?: boolean\n\n // Type\n type?: JSONSchema7Type | JSONSchema7Type[]\n enum?: unknown[]\n const?: unknown\n\n // String\n minLength?: number\n maxLength?: number\n pattern?: string\n format?: string\n\n // Number\n multipleOf?: number\n minimum?: number\n maximum?: number\n exclusiveMinimum?: number\n exclusiveMaximum?: number\n\n // Array\n items?: JSONSchema7 | JSONSchema7[]\n additionalItems?: JSONSchema7 | boolean\n minItems?: number\n maxItems?: number\n uniqueItems?: boolean\n contains?: JSONSchema7\n\n // Object\n properties?: Record<string, JSONSchema7>\n patternProperties?: Record<string, JSONSchema7>\n additionalProperties?: JSONSchema7 | boolean\n required?: string[]\n propertyNames?: JSONSchema7\n minProperties?: number\n maxProperties?: number\n dependencies?: Record<string, JSONSchema7 | string[]>\n\n // Conditionals\n if?: JSONSchema7\n then?: JSONSchema7\n else?: JSONSchema7\n allOf?: JSONSchema7[]\n anyOf?: JSONSchema7[]\n oneOf?: JSONSchema7[]\n not?: JSONSchema7\n\n // Content\n contentMediaType?: string\n contentEncoding?: string\n}\n\nexport type JSONSchema7Type =\n | 'string'\n | 'number'\n | 'integer'\n | 'boolean'\n | 'object'\n | 'array'\n | 'null'\n\n// =====================================================\n// PAYMENT REQUIREMENT TYPES\n// =====================================================\n\n/**\n * Payment scheme types\n */\nexport type PaymentScheme = 'exact' | 'upto' | 'base' | 'tiered'\n\n/**\n * Standard x402 payment requirement\n */\nexport interface X402PaymentRequirement {\n /** Payment scheme: exact, upto, base, tiered */\n scheme: PaymentScheme\n\n /** Blockchain network */\n network: Network\n\n /** Maximum amount required (in smallest unit) */\n maxAmountRequired: string\n\n /** Resource identifier (usually the URL) */\n resource?: string\n\n /** Human-readable description */\n description?: string\n\n /** Expected response MIME type */\n mimeType?: string\n\n /** Address to pay (facilitator or direct) */\n payTo: string\n\n /** Maximum time to complete payment */\n maxTimeoutSeconds?: number\n\n /** Token/asset address */\n asset: string\n\n /** Additional facilitator-specific data */\n extra?: Record<string, unknown>\n}\n\n/**\n * Tiered pricing configuration\n */\nexport interface TieredPricing {\n tiers: Array<{\n name: string\n maxAmount: string\n features: string[]\n rateLimit?: number\n }>\n}\n\n// =====================================================\n// ENHANCED X402 RESPONSE\n// =====================================================\n\n/**\n * Standard x402 response (v1.0)\n */\nexport interface X402ResponseV1 {\n /** Protocol version */\n x402Version: '1.0'\n\n /** Array of accepted payment options */\n accepts: X402PaymentRequirement[]\n\n /** Error message if request failed */\n error?: string\n}\n\n/**\n * Enhanced x402 response with AI integration\n *\n * Extends the standard x402 response with additional fields\n * that enable AI models to understand and use the API.\n */\nexport interface EnhancedX402Response extends X402ResponseV1 {\n // =====================================================\n // AI INTEGRATION FIELDS\n // =====================================================\n\n /**\n * JSON Schema for input parameters\n * Enables AI to understand what parameters the API accepts\n */\n inputSchema?: JSONSchema7\n\n /**\n * JSON Schema for output response\n * Enables AI to understand what the API returns\n */\n outputSchema?: JSONSchema7\n\n /**\n * Human-readable description of what the API does\n */\n description?: string\n\n /**\n * Short name/title for the API\n */\n name?: string\n\n /**\n * Tags for categorization and discovery\n */\n tags?: string[]\n\n /**\n * Category for the API (e.g., text-generation, code-generation)\n */\n category?: string\n\n /**\n * Example input/output pairs for AI context\n */\n examples?: Array<{\n input: unknown\n output: unknown\n description?: string\n }>\n\n // =====================================================\n // METADATA FIELDS\n // =====================================================\n\n /**\n * API version\n */\n apiVersion?: string\n\n /**\n * Supported HTTP methods\n */\n methods?: Array<'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH'>\n\n /**\n * Rate limiting information\n */\n rateLimit?: {\n requestsPerMinute?: number\n requestsPerHour?: number\n requestsPerDay?: number\n }\n\n /**\n * Authentication requirements beyond x402\n */\n authRequired?: {\n type: 'none' | 'bearer' | 'api_key' | 'oauth2'\n header?: string\n description?: string\n }\n\n /**\n * Service level agreement\n */\n sla?: {\n uptimeTarget?: number // percentage\n responseTimeP50?: number // ms\n responseTimeP99?: number // ms\n }\n\n /**\n * Terms of service URL\n */\n termsUrl?: string\n\n /**\n * Privacy policy URL\n */\n privacyUrl?: string\n\n /**\n * Documentation URL\n */\n docsUrl?: string\n\n /**\n * Support contact\n */\n support?: {\n email?: string\n url?: string\n discord?: string\n }\n}\n\n// =====================================================\n// VALIDATION FUNCTIONS\n// =====================================================\n\n/**\n * Validate a payment requirement\n */\nexport function validatePaymentRequirement(\n req: unknown\n): { valid: true; requirement: X402PaymentRequirement } | { valid: false; errors: string[] } {\n const errors: string[] = []\n const r = req as Record<string, unknown>\n\n if (!r || typeof r !== 'object') {\n return { valid: false, errors: ['Payment requirement must be an object'] }\n }\n\n // Required fields\n if (!r.network || typeof r.network !== 'string') {\n errors.push('Missing or invalid \"network\" field')\n }\n\n if (!r.maxAmountRequired && !r.max_amount_required && !r.amount) {\n errors.push('Missing \"maxAmountRequired\" field')\n }\n\n if (!r.payTo && !r.pay_to && !r.recipient) {\n errors.push('Missing \"payTo\" field')\n }\n\n if (!r.asset && !r.token) {\n errors.push('Missing \"asset\" field')\n }\n\n if (errors.length > 0) {\n return { valid: false, errors }\n }\n\n // Normalize to standard format\n const requirement: X402PaymentRequirement = {\n scheme: (r.scheme ?? 'exact') as PaymentScheme,\n network: (r.network ?? r.chain) as Network,\n maxAmountRequired: String(r.maxAmountRequired ?? r.max_amount_required ?? r.amount),\n resource: r.resource as string | undefined,\n description: r.description as string | undefined,\n mimeType: (r.mimeType ?? r.mime_type) as string | undefined,\n payTo: String(r.payTo ?? r.pay_to ?? r.recipient),\n maxTimeoutSeconds: (r.maxTimeoutSeconds ?? r.max_timeout_seconds) as number | undefined,\n asset: String(r.asset ?? r.token),\n extra: r.extra as Record<string, unknown> | undefined\n }\n\n return { valid: true, requirement }\n}\n\n/**\n * Validate an x402 response\n */\nexport function validateX402Response(\n response: unknown\n): { valid: true; response: EnhancedX402Response } | { valid: false; errors: string[] } {\n const errors: string[] = []\n const r = response as Record<string, unknown>\n\n if (!r || typeof r !== 'object') {\n return { valid: false, errors: ['Response must be an object'] }\n }\n\n // Check version\n const version = r.x402Version ?? r.x402_version\n if (!version) {\n errors.push('Missing \"x402Version\" field')\n }\n\n // Check accepts\n const accepts = r.accepts ?? r.payment_requirements\n if (!accepts || !Array.isArray(accepts)) {\n errors.push('Missing or invalid \"accepts\" array')\n } else if (accepts.length === 0) {\n errors.push('\"accepts\" array must not be empty')\n } else {\n // Validate each payment requirement\n for (let i = 0; i < accepts.length; i++) {\n const result = validatePaymentRequirement(accepts[i])\n if (!result.valid) {\n errors.push(`accepts[${i}]: ${result.errors.join(', ')}`)\n }\n }\n }\n\n if (errors.length > 0) {\n return { valid: false, errors }\n }\n\n // Normalize to enhanced format\n const enhanced: EnhancedX402Response = {\n x402Version: '1.0',\n accepts: (accepts as unknown[]).map(a => {\n const result = validatePaymentRequirement(a)\n return result.valid ? result.requirement : ({} as X402PaymentRequirement)\n }),\n error: r.error as string | undefined,\n inputSchema: (r.inputSchema ?? r.input_schema) as JSONSchema7 | undefined,\n outputSchema: (r.outputSchema ?? r.output_schema) as JSONSchema7 | undefined,\n description: r.description as string | undefined,\n name: r.name as string | undefined,\n tags: r.tags as string[] | undefined,\n category: r.category as string | undefined,\n examples: r.examples as Array<{ input: unknown; output: unknown }> | undefined,\n apiVersion: (r.apiVersion ?? r.api_version) as string | undefined,\n methods: r.methods as Array<'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH'> | undefined,\n rateLimit: (r.rateLimit ?? r.rate_limit) as EnhancedX402Response['rateLimit'],\n authRequired: (r.authRequired ?? r.auth_required) as EnhancedX402Response['authRequired'],\n sla: r.sla as EnhancedX402Response['sla'],\n termsUrl: (r.termsUrl ?? r.terms_url) as string | undefined,\n privacyUrl: (r.privacyUrl ?? r.privacy_url) as string | undefined,\n docsUrl: (r.docsUrl ?? r.docs_url) as string | undefined,\n support: r.support as EnhancedX402Response['support']\n }\n\n return { valid: true, response: enhanced }\n}\n\n/**\n * Parse x402 response from string\n */\nexport function parseX402Response(\n body: string\n): { valid: true; response: EnhancedX402Response } | { valid: false; errors: string[] } {\n try {\n const parsed = JSON.parse(body)\n return validateX402Response(parsed)\n } catch (error) {\n return {\n valid: false,\n errors: [`Failed to parse JSON: ${error instanceof Error ? error.message : 'Unknown error'}`]\n }\n }\n}\n\n// =====================================================\n// SCHEMA GENERATION HELPERS\n// =====================================================\n\n/**\n * Create a basic input schema for common API patterns\n */\nexport function createInputSchema(options: {\n type: 'text' | 'code' | 'image' | 'audio' | 'data'\n fields?: Record<string, { type: string; description?: string; required?: boolean }>\n}): JSONSchema7 {\n const baseSchemas: Record<string, JSONSchema7> = {\n text: {\n type: 'object',\n properties: {\n prompt: { type: 'string', description: 'The text prompt or input' },\n maxTokens: { type: 'integer', description: 'Maximum tokens to generate', minimum: 1 },\n temperature: { type: 'number', description: 'Sampling temperature', minimum: 0, maximum: 2 }\n },\n required: ['prompt']\n },\n code: {\n type: 'object',\n properties: {\n code: { type: 'string', description: 'The code to process' },\n language: { type: 'string', description: 'Programming language' },\n task: {\n type: 'string',\n enum: ['complete', 'explain', 'refactor', 'debug', 'test'],\n description: 'The task to perform'\n }\n },\n required: ['code']\n },\n image: {\n type: 'object',\n properties: {\n image: { type: 'string', description: 'Base64 encoded image or URL' },\n prompt: { type: 'string', description: 'Instructions for processing' }\n },\n required: ['image']\n },\n audio: {\n type: 'object',\n properties: {\n audio: { type: 'string', description: 'Base64 encoded audio or URL' },\n language: { type: 'string', description: 'Audio language code' }\n },\n required: ['audio']\n },\n data: {\n type: 'object',\n properties: {\n data: { description: 'Input data to process' },\n format: { type: 'string', description: 'Data format (json, csv, etc.)' }\n },\n required: ['data']\n }\n }\n\n const schema = { ...baseSchemas[options.type] }\n\n // Add custom fields\n if (options.fields) {\n schema.properties = { ...schema.properties }\n const required = [...(schema.required ?? [])]\n\n for (const [name, config] of Object.entries(options.fields)) {\n schema.properties[name] = {\n type: config.type as JSONSchema7Type,\n description: config.description\n }\n if (config.required) {\n required.push(name)\n }\n }\n\n schema.required = [...new Set(required)]\n }\n\n return schema\n}\n\n/**\n * Create a basic output schema for common API patterns\n */\nexport function createOutputSchema(options: {\n type: 'text' | 'code' | 'image' | 'audio' | 'data' | 'structured'\n fields?: Record<string, { type: string; description?: string }>\n}): JSONSchema7 {\n const baseSchemas: Record<string, JSONSchema7> = {\n text: {\n type: 'object',\n properties: {\n text: { type: 'string', description: 'Generated text' },\n tokensUsed: { type: 'integer', description: 'Number of tokens used' }\n },\n required: ['text']\n },\n code: {\n type: 'object',\n properties: {\n code: { type: 'string', description: 'Generated or processed code' },\n language: { type: 'string', description: 'Programming language' },\n explanation: { type: 'string', description: 'Explanation of the code' }\n },\n required: ['code']\n },\n image: {\n type: 'object',\n properties: {\n image: { type: 'string', description: 'Base64 encoded image or URL' },\n width: { type: 'integer', description: 'Image width' },\n height: { type: 'integer', description: 'Image height' }\n },\n required: ['image']\n },\n audio: {\n type: 'object',\n properties: {\n audio: { type: 'string', description: 'Base64 encoded audio or URL' },\n duration: { type: 'number', description: 'Duration in seconds' },\n transcript: { type: 'string', description: 'Text transcript' }\n }\n },\n data: {\n type: 'object',\n properties: {\n data: { description: 'Processed data' },\n metadata: { type: 'object', description: 'Additional metadata' }\n },\n required: ['data']\n },\n structured: {\n type: 'object',\n additionalProperties: true\n }\n }\n\n const schema = { ...baseSchemas[options.type] }\n\n // Add custom fields\n if (options.fields) {\n schema.properties = { ...schema.properties }\n for (const [name, config] of Object.entries(options.fields)) {\n schema.properties[name] = {\n type: config.type as JSONSchema7Type,\n description: config.description\n }\n }\n }\n\n return schema\n}\n\n// =====================================================\n// EXPORTS\n// =====================================================\n\nexport type {\n JSONSchema7 as JSONSchema,\n JSONSchema7Type as JSONSchemaType\n}\n","/**\n * Fetch with x402 Payment\n *\n * Wraps the standard fetch API to automatically handle x402 payment flows.\n * When a 402 response is received, creates and submits payment, then retries.\n *\n * @module x402/fetchWithPayment\n */\n\nimport type { TransactionSigner, Address } from '@solana/kit'\nimport type { X402PaymentRequest, X402PaymentReceipt } from './X402Client.js'\nimport { parseX402Response, type EnhancedX402Response, type X402PaymentRequirement } from './schemas/enhanced-x402.js'\nimport type { Network } from './FacilitatorRegistry.js'\nimport { EventEmitter } from 'node:events'\n\n// =====================================================\n// TYPES\n// =====================================================\n\n/**\n * Options for fetchWithX402Payment\n */\nexport interface FetchWithPaymentOptions extends RequestInit {\n /** Maximum amount willing to pay (in smallest unit) */\n maxPayment?: bigint\n\n /** Preferred network for payment */\n preferredNetwork?: Network\n\n /** Preferred token address */\n preferredToken?: string\n\n /** Timeout for the request in ms */\n timeout?: number\n\n /** Number of retries for payment */\n retries?: number\n\n /** Callback when payment is made */\n onPayment?: (payment: PaymentInfo) => void\n\n /** Callback for 402 response before payment */\n onPaymentRequired?: (requirements: X402PaymentRequirement[]) => void\n\n /** Skip payment and return 402 response */\n dryRun?: boolean\n}\n\n/**\n * Payment information from a successful payment\n */\nexport interface PaymentInfo {\n signature: string\n amount: bigint\n recipient: string\n token: string\n network: Network\n timestamp: number\n}\n\n/**\n * Extended response with payment info\n */\nexport interface X402Response extends Response {\n paymentInfo?: PaymentInfo\n x402Requirements?: X402PaymentRequirement[]\n}\n\n/**\n * Payment header creator function type\n */\nexport type PaymentHeaderCreator = (\n requirement: X402PaymentRequirement,\n wallet: TransactionSigner\n) => Promise<string>\n\n/**\n * Fetch with payment client options\n */\nexport interface FetchWithPaymentClientOptions {\n wallet: TransactionSigner\n createPaymentHeader: PaymentHeaderCreator\n maxPayment?: bigint\n preferredNetwork?: Network\n preferredToken?: string\n timeout?: number\n retries?: number\n userAgent?: string\n}\n\n// =====================================================\n// FETCH WITH PAYMENT CLASS\n// =====================================================\n\n/**\n * Client for making x402-enabled HTTP requests\n */\nexport class FetchWithPaymentClient extends EventEmitter {\n private readonly wallet: TransactionSigner\n private readonly createPaymentHeader: PaymentHeaderCreator\n private readonly maxPayment: bigint\n private readonly preferredNetwork?: Network\n private readonly preferredToken?: string\n private readonly timeout: number\n private readonly retries: number\n private readonly userAgent: string\n\n constructor(options: FetchWithPaymentClientOptions) {\n super()\n this.wallet = options.wallet\n this.createPaymentHeader = options.createPaymentHeader\n this.maxPayment = options.maxPayment ?? BigInt('1000000000') // 1000 USDC default\n this.preferredNetwork = options.preferredNetwork\n this.preferredToken = options.preferredToken\n this.timeout = options.timeout ?? 30000\n this.retries = options.retries ?? 1\n this.userAgent = options.userAgent ?? 'GhostSpeak-x402-Fetch/1.0'\n }\n\n /**\n * Make an x402-enabled fetch request\n */\n async fetch(url: string, options?: FetchWithPaymentOptions): Promise<X402Response> {\n const mergedOptions: FetchWithPaymentOptions = {\n ...options,\n maxPayment: options?.maxPayment ?? this.maxPayment,\n preferredNetwork: options?.preferredNetwork ?? this.preferredNetwork,\n preferredToken: options?.preferredToken ?? this.preferredToken,\n timeout: options?.timeout ?? this.timeout,\n retries: options?.retries ?? this.retries\n }\n\n return this.fetchWithPayment(url, mergedOptions)\n }\n\n /**\n * Internal fetch with payment logic\n */\n private async fetchWithPayment(\n url: string,\n options: FetchWithPaymentOptions\n ): Promise<X402Response> {\n const headers = new Headers(options.headers)\n headers.set('User-Agent', this.userAgent)\n\n // Make initial request\n const initialResponse = await fetch(url, {\n ...options,\n headers,\n signal: options.timeout ? AbortSignal.timeout(options.timeout) : undefined\n })\n\n // If not 402, return as-is\n if (initialResponse.status !== 402) {\n return initialResponse as X402Response\n }\n\n // Parse 402 response\n const body = await initialResponse.text()\n const parseResult = parseX402Response(body)\n\n if (!parseResult.valid) {\n const errorResponse = new Response(body, {\n status: 402,\n statusText: 'Payment Required - Invalid x402 Response',\n headers: initialResponse.headers\n }) as X402Response\n errorResponse.x402Requirements = []\n return errorResponse\n }\n\n const x402Response = parseResult.response\n\n // Emit payment required event\n this.emit('paymentRequired', x402Response.accepts)\n options.onPaymentRequired?.(x402Response.accepts)\n\n // If dry run, return without paying\n if (options.dryRun) {\n const dryRunResponse = new Response(body, {\n status: 402,\n statusText: 'Payment Required',\n headers: initialResponse.headers\n }) as X402Response\n dryRunResponse.x402Requirements = x402Response.accepts\n return dryRunResponse\n }\n\n // Select payment requirement\n const selectedRequirement = this.selectPaymentRequirement(\n x402Response.accepts,\n options\n )\n\n if (!selectedRequirement) {\n throw new X402PaymentError(\n 'No suitable payment option found within max payment limit',\n x402Response.accepts\n )\n }\n\n // Check against max payment\n const amount = BigInt(selectedRequirement.maxAmountRequired)\n if (amount > (options.maxPayment ?? this.maxPayment)) {\n throw new X402PaymentError(\n `Payment amount ${amount} exceeds max payment ${options.maxPayment ?? this.maxPayment}`,\n x402Response.accepts\n )\n }\n\n // Create payment header\n let paymentHeader: string\n try {\n paymentHeader = await this.createPaymentHeader(selectedRequirement, this.wallet)\n } catch (error) {\n throw new X402PaymentError(\n `Failed to create payment header: ${error instanceof Error ? error.message : 'Unknown error'}`,\n x402Response.accepts\n )\n }\n\n // Retry with payment header\n const retryHeaders = new Headers(headers)\n retryHeaders.set('X-Payment', paymentHeader)\n\n for (let attempt = 0; attempt <= (options.retries ?? this.retries); attempt++) {\n try {\n const paidResponse = await fetch(url, {\n ...options,\n headers: retryHeaders,\n signal: options.timeout ? AbortSignal.timeout(options.timeout) : undefined\n })\n\n // Success! Add payment info\n const paymentInfo: PaymentInfo = {\n signature: paymentHeader.split(':')[0] ?? '',\n amount,\n recipient: selectedRequirement.payTo,\n token: selectedRequirement.asset,\n network: selectedRequirement.network,\n timestamp: Date.now()\n }\n\n const response = paidResponse as X402Response\n response.paymentInfo = paymentInfo\n response.x402Requirements = x402Response.accepts\n\n // Emit payment event\n this.emit('payment', paymentInfo)\n options.onPayment?.(paymentInfo)\n\n return response\n } catch (error) {\n if (attempt === (options.retries ?? this.retries)) {\n throw error\n }\n // Wait before retry\n await new Promise(resolve => setTimeout(resolve, 1000 * (attempt + 1)))\n }\n }\n\n throw new Error('Failed to complete payment request after retries')\n }\n\n /**\n * Select the best payment requirement based on options\n */\n private selectPaymentRequirement(\n accepts: X402PaymentRequirement[],\n options: FetchWithPaymentOptions\n ): X402PaymentRequirement | null {\n let candidates = [...accepts]\n\n // Filter by preferred network\n if (options.preferredNetwork) {\n const networkMatches = candidates.filter(\n a => a.network === options.preferredNetwork\n )\n if (networkMatches.length > 0) {\n candidates = networkMatches\n }\n }\n\n // Filter by preferred token\n if (options.preferredToken) {\n const tokenMatches = candidates.filter(\n a => a.asset.toLowerCase() === options.preferredToken!.toLowerCase()\n )\n if (tokenMatches.length > 0) {\n candidates = tokenMatches\n }\n }\n\n // Filter by max payment\n const maxPayment = options.maxPayment ?? this.maxPayment\n candidates = candidates.filter(a => BigInt(a.maxAmountRequired) <= maxPayment)\n\n if (candidates.length === 0) {\n return null\n }\n\n // Return the cheapest option\n return candidates.sort(\n (a, b) => Number(BigInt(a.maxAmountRequired) - BigInt(b.maxAmountRequired))\n )[0]\n }\n}\n\n// =====================================================\n// ERROR CLASS\n// =====================================================\n\n/**\n * Error thrown when x402 payment fails\n */\nexport class X402PaymentError extends Error {\n constructor(\n message: string,\n public readonly requirements: X402PaymentRequirement[]\n ) {\n super(message)\n this.name = 'X402PaymentError'\n }\n}\n\n// =====================================================\n// STANDALONE FUNCTION\n// =====================================================\n\n/**\n * Make an x402-enabled fetch request\n *\n * This function automatically handles 402 Payment Required responses\n * by creating a payment and retrying the request.\n *\n * @example\n * ```typescript\n * const response = await fetchWithX402Payment(\n * 'https://api.example.com/generate',\n * {\n * method: 'POST',\n * headers: { 'Content-Type': 'application/json' },\n * body: JSON.stringify({ prompt: 'Hello' })\n * },\n * wallet,\n * createPaymentHeader,\n * { maxPayment: 1000000n } // 1 USDC\n * );\n *\n * const data = await response.json();\n * console.log('Payment:', response.paymentInfo);\n * ```\n */\nexport async function fetchWithX402Payment(\n url: string,\n options: RequestInit,\n wallet: TransactionSigner,\n createPaymentHeader: PaymentHeaderCreator,\n paymentOptions?: Omit<FetchWithPaymentOptions, keyof RequestInit>\n): Promise<X402Response> {\n const client = new FetchWithPaymentClient({\n wallet,\n createPaymentHeader,\n maxPayment: paymentOptions?.maxPayment,\n preferredNetwork: paymentOptions?.preferredNetwork,\n preferredToken: paymentOptions?.preferredToken,\n timeout: paymentOptions?.timeout,\n retries: paymentOptions?.retries\n })\n\n return client.fetch(url, {\n ...options,\n ...paymentOptions\n })\n}\n\n// =====================================================\n// WRAPPER FUNCTION\n// =====================================================\n\n/**\n * Create a wrapped fetch function with x402 payment support\n *\n * @example\n * ```typescript\n * const x402Fetch = wrapFetchWithPayment(wallet, createPaymentHeader, {\n * maxPayment: 1000000n\n * });\n *\n * const response = await x402Fetch('https://api.example.com/generate', {\n * method: 'POST',\n * body: JSON.stringify({ prompt: 'Hello' })\n * });\n * ```\n */\nexport function wrapFetchWithPayment(\n wallet: TransactionSigner,\n createPaymentHeader: PaymentHeaderCreator,\n defaultOptions?: Partial<FetchWithPaymentClientOptions>\n): (url: string, options?: FetchWithPaymentOptions) => Promise<X402Response> {\n const client = new FetchWithPaymentClient({\n wallet,\n createPaymentHeader,\n ...defaultOptions\n })\n\n return (url: string, options?: FetchWithPaymentOptions) => client.fetch(url, options)\n}\n\n// =====================================================\n// UTILITY FUNCTIONS\n// =====================================================\n\n/**\n * Check if a response is a 402 Payment Required\n */\nexport function isPaymentRequired(response: Response): boolean {\n return response.status === 402\n}\n\n/**\n * Extract x402 requirements from a 402 response\n */\nexport async function extractPaymentRequirements(\n response: Response\n): Promise<X402PaymentRequirement[] | null> {\n if (response.status !== 402) {\n return null\n }\n\n try {\n const body = await response.text()\n const parseResult = parseX402Response(body)\n\n if (!parseResult.valid) {\n return null\n }\n\n return parseResult.response.accepts\n } catch {\n return null\n }\n}\n\n/**\n * Calculate total cost for a set of requirements\n */\nexport function calculateTotalCost(requirements: X402PaymentRequirement[]): bigint {\n if (requirements.length === 0) return 0n\n\n // Return the minimum required payment\n return requirements.reduce(\n (min, req) => {\n const amount = BigInt(req.maxAmountRequired)\n return amount < min ? amount : min\n },\n BigInt(requirements[0].maxAmountRequired)\n )\n}\n","/**\n * x402 Analytics Integration\n *\n * Provides real-time analytics and metrics tracking for x402 payment transactions,\n * integrating with the GhostSpeak analytics system.\n *\n * @module x402/analytics\n */\n\nimport type { Address } from '@solana/kit'\nimport { EventEmitter } from 'node:events'\nimport type {\n AnalyticsStreamer,\n TransactionAnalyticsEvent\n} from '../utils/analytics-streaming.js'\nimport type { AnalyticsAggregator, AggregatedMetrics } from '../utils/analytics-aggregation.js'\n\n/**\n * x402 payment event data\n */\nexport interface X402PaymentEvent {\n signature: string\n timestamp: bigint\n payer: Address\n recipient: Address\n amount: bigint\n token: Address\n agent?: Address\n status: 'pending' | 'confirmed' | 'failed'\n metadata?: Record<string, unknown>\n}\n\n/**\n * x402 transaction metrics\n */\nexport interface X402TransactionMetrics {\n period: {\n start: bigint\n end: bigint\n }\n payments: {\n total: number\n successful: number\n failed: number\n pending: number\n }\n volume: {\n total: bigint\n average: bigint\n byToken: Map<Address, bigint>\n }\n agents: {\n totalActive: number\n topEarners: Array<{\n agent: Address\n earnings: bigint\n callCount: number\n }>\n }\n performance: {\n averageConfirmationTime: number // milliseconds\n successRate: number // percentage\n errorRate: number // percentage\n }\n}\n\n/**\n * x402 analytics options\n */\nexport interface X402AnalyticsOptions {\n enableRealtime?: boolean\n metricsInterval?: number // milliseconds\n retentionPeriod?: number // seconds\n onPayment?: (event: X402PaymentEvent) => void\n onMetrics?: (metrics: X402TransactionMetrics) => void\n onError?: (error: Error) => void\n}\n\n/**\n * x402 Analytics Tracker\n *\n * Tracks and aggregates x402 payment transactions for real-time analytics,\n * monitoring, and dashboard visualization.\n */\nexport class X402AnalyticsTracker extends EventEmitter {\n private paymentEvents: X402PaymentEvent[] = []\n private agentEarnings: Map<Address, bigint> = new Map()\n private agentCallCounts: Map<Address, number> = new Map()\n private tokenVolumes: Map<Address, bigint> = new Map()\n private metricsTimer?: ReturnType<typeof setInterval>\n private isActive = false\n\n // Integration with existing analytics system\n private analyticsStreamer?: AnalyticsStreamer\n private analyticsAggregator?: AnalyticsAggregator\n\n constructor(private options: X402AnalyticsOptions = {}) {\n super()\n }\n\n /**\n * Start analytics tracking\n */\n start(): void {\n if (this.isActive) {\n console.warn('x402 analytics tracker is already active')\n return\n }\n\n this.isActive = true\n\n // Start metrics aggregation\n if (this.options.metricsInterval) {\n this.metricsTimer = setInterval(() => {\n this.aggregateAndEmitMetrics()\n }, this.options.metricsInterval)\n }\n\n this.emit('started')\n }\n\n /**\n * Stop analytics tracking\n */\n stop(): void {\n this.isActive = false\n\n if (this.metricsTimer) {\n clearInterval(this.metricsTimer)\n this.metricsTimer = undefined\n }\n\n this.emit('stopped')\n }\n\n /**\n * Record a new x402 payment event\n */\n recordPayment(event: X402PaymentEvent): void {\n if (!this.isActive) return\n\n // Store event\n this.paymentEvents.push(event)\n\n // Update agent metrics\n if (event.agent && event.status === 'confirmed') {\n const currentEarnings = this.agentEarnings.get(event.agent) ?? 0n\n this.agentEarnings.set(event.agent, currentEarnings + event.amount)\n\n const currentCalls = this.agentCallCounts.get(event.agent) ?? 0\n this.agentCallCounts.set(event.agent, currentCalls + 1)\n }\n\n // Update token volumes\n if (event.status === 'confirmed') {\n const currentVolume = this.tokenVolumes.get(event.token) ?? 0n\n this.tokenVolumes.set(event.token, currentVolume + event.amount)\n }\n\n // Emit event\n this.emit('payment', event)\n if (this.options.onPayment) {\n this.options.onPayment(event)\n }\n\n // Prune old events\n this.pruneOldEvents()\n }\n\n /**\n * Record payment from transaction signature\n */\n async recordPaymentFromSignature(\n signature: string,\n payer: Address,\n recipient: Address,\n amount: bigint,\n token: Address,\n agent?: Address\n ): Promise<void> {\n const event: X402PaymentEvent = {\n signature,\n timestamp: BigInt(Date.now()),\n payer,\n recipient,\n amount,\n token,\n agent,\n status: 'pending'\n }\n\n this.recordPayment(event)\n }\n\n /**\n * Update payment status\n */\n updatePaymentStatus(\n signature: string,\n status: 'confirmed' | 'failed',\n metadata?: Record<string, unknown>\n ): void {\n const event = this.paymentEvents.find(e => e.signature === signature)\n if (event) {\n event.status = status\n if (metadata) {\n event.metadata = { ...event.metadata, ...metadata }\n }\n\n this.emit('paymentStatusChanged', event)\n }\n }\n\n /**\n * Get current metrics\n */\n getMetrics(periodSeconds?: number): X402TransactionMetrics {\n const now = BigInt(Date.now())\n const startTime = periodSeconds\n ? now - BigInt(periodSeconds * 1000)\n : this.getOldestEventTimestamp()\n\n // Filter events by period\n const periodEvents = this.paymentEvents.filter(e => e.timestamp >= startTime)\n\n // Calculate payment counts\n const total = periodEvents.length\n const successful = periodEvents.filter(e => e.status === 'confirmed').length\n const failed = periodEvents.filter(e => e.status === 'failed').length\n const pending = periodEvents.filter(e => e.status === 'pending').length\n\n // Calculate volume\n const successfulEvents = periodEvents.filter(e => e.status === 'confirmed')\n const totalVolume = successfulEvents.reduce((sum, e) => sum + e.amount, 0n)\n const averageVolume = successful > 0 ? totalVolume / BigInt(successful) : 0n\n\n // Calculate volume by token\n const volumeByToken = new Map<Address, bigint>()\n for (const event of successfulEvents) {\n const current = volumeByToken.get(event.token) ?? 0n\n volumeByToken.set(event.token, current + event.amount)\n }\n\n // Get active agents\n const activeAgents = new Set(\n periodEvents.filter(e => e.agent).map(e => e.agent!)\n )\n\n // Get top earners\n const topEarners = Array.from(this.agentEarnings.entries())\n .map(([agent, earnings]) => ({\n agent,\n earnings,\n callCount: this.agentCallCounts.get(agent) ?? 0\n }))\n .sort((a, b) => Number(b.earnings - a.earnings))\n .slice(0, 10)\n\n // Calculate confirmation times\n const confirmedEvents = periodEvents.filter(e => e.status === 'confirmed')\n const confirmationTimes = confirmedEvents\n .map(e => Number(e.metadata?.confirmationTime ?? 0))\n .filter(t => t > 0)\n\n const averageConfirmationTime = confirmationTimes.length > 0\n ? confirmationTimes.reduce((a, b) => a + b, 0) / confirmationTimes.length\n : 0\n\n // Calculate rates\n const successRate = total > 0 ? (successful / total) * 100 : 0\n const errorRate = total > 0 ? (failed / total) * 100 : 0\n\n return {\n period: {\n start: startTime,\n end: now\n },\n payments: {\n total,\n successful,\n failed,\n pending\n },\n volume: {\n total: totalVolume,\n average: averageVolume,\n byToken: volumeByToken\n },\n agents: {\n totalActive: activeAgents.size,\n topEarners\n },\n performance: {\n averageConfirmationTime,\n successRate,\n errorRate\n }\n }\n }\n\n /**\n * Get agent earnings\n */\n getAgentEarnings(agent: Address): {\n totalEarnings: bigint\n totalCalls: number\n averagePerCall: bigint\n } {\n const totalEarnings = this.agentEarnings.get(agent) ?? 0n\n const totalCalls = this.agentCallCounts.get(agent) ?? 0\n const averagePerCall = totalCalls > 0 ? totalEarnings / BigInt(totalCalls) : 0n\n\n return {\n totalEarnings,\n totalCalls,\n averagePerCall\n }\n }\n\n /**\n * Get token volume\n */\n getTokenVolume(token: Address): bigint {\n return this.tokenVolumes.get(token) ?? 0n\n }\n\n /**\n * Get payment history for agent\n */\n getAgentPaymentHistory(\n agent: Address,\n limit?: number\n ): X402PaymentEvent[] {\n const agentEvents = this.paymentEvents\n .filter(e => e.agent === agent)\n .sort((a, b) => Number(b.timestamp - a.timestamp))\n\n return limit ? agentEvents.slice(0, limit) : agentEvents\n }\n\n /**\n * Get recent payments\n */\n getRecentPayments(limit = 100): X402PaymentEvent[] {\n return this.paymentEvents\n .slice(-limit)\n .sort((a, b) => Number(b.timestamp - a.timestamp))\n }\n\n /**\n * Integrate with existing analytics streamer\n */\n integrateWithStreamer(streamer: AnalyticsStreamer): void {\n this.analyticsStreamer = streamer\n\n // Listen for transaction analytics events\n streamer.on('transactionAnalytics', (event: TransactionAnalyticsEvent) => {\n // Check if this is an x402 payment\n if (this.isX402Transaction(event)) {\n this.recordPaymentFromAnalyticsEvent(event)\n }\n })\n }\n\n /**\n * Integrate with existing analytics aggregator\n */\n integrateWithAggregator(aggregator: AnalyticsAggregator): void {\n this.analyticsAggregator = aggregator\n\n // Feed x402 payment events to aggregator\n this.on('payment', (event: X402PaymentEvent) => {\n if (event.status === 'confirmed' && this.analyticsAggregator) {\n // Convert to transaction analytics event\n const txEvent: TransactionAnalyticsEvent = {\n transactionType: 'x402_payment',\n amount: event.amount,\n from: event.payer,\n to: event.recipient,\n status: 'completed',\n timestamp: BigInt(event.timestamp),\n blockHeight: 0n // Would be populated from actual blockchain data\n }\n\n this.analyticsAggregator.processTransactionEvent(txEvent)\n }\n })\n }\n\n /**\n * Get aggregated metrics from integrated aggregator\n */\n getAggregatedMetrics(): AggregatedMetrics | null {\n return this.analyticsAggregator?.aggregate() ?? null\n }\n\n // Private helper methods\n\n private aggregateAndEmitMetrics(): void {\n try {\n const metrics = this.getMetrics()\n this.emit('metrics', metrics)\n\n if (this.options.onMetrics) {\n this.options.onMetrics(metrics)\n }\n } catch (error) {\n this.handleError(error as Error)\n }\n }\n\n private pruneOldEvents(): void {\n if (!this.options.retentionPeriod) return\n\n const cutoffTime = BigInt(Date.now()) - BigInt(this.options.retentionPeriod * 1000)\n this.paymentEvents = this.paymentEvents.filter(e => e.timestamp > cutoffTime)\n }\n\n private getOldestEventTimestamp(): bigint {\n if (this.paymentEvents.length === 0) {\n return BigInt(Date.now())\n }\n return this.paymentEvents[0].timestamp\n }\n\n private isX402Transaction(event: TransactionAnalyticsEvent): boolean {\n return event.transactionType === 'x402_payment' ||\n event.transactionType === 'payment'\n }\n\n private recordPaymentFromAnalyticsEvent(event: TransactionAnalyticsEvent): void {\n const paymentEvent: X402PaymentEvent = {\n signature: '', // Not available in TransactionAnalyticsEvent\n timestamp: BigInt(event.timestamp),\n payer: event.from,\n recipient: event.to,\n amount: event.amount,\n token: '11111111111111111111111111111111' as Address, // Would parse from event\n status: event.status === 'completed' ? 'confirmed' : 'failed'\n }\n\n this.recordPayment(paymentEvent)\n }\n\n private handleError(error: Error): void {\n this.emit('error', error)\n if (this.options.onError) {\n this.options.onError(error)\n }\n }\n\n /**\n * Clear all tracked data\n */\n clearData(): void {\n this.paymentEvents = []\n this.agentEarnings.clear()\n this.agentCallCounts.clear()\n this.tokenVolumes.clear()\n }\n\n /**\n * Get tracker statistics\n */\n getStats(): {\n eventsTracked: number\n agentsTracked: number\n tokensTracked: number\n isActive: boolean\n } {\n return {\n eventsTracked: this.paymentEvents.length,\n agentsTracked: this.agentEarnings.size,\n tokensTracked: this.tokenVolumes.size,\n isActive: this.isActive\n }\n }\n}\n\n/**\n * Create x402 analytics tracker instance\n */\nexport function createX402AnalyticsTracker(\n options?: X402AnalyticsOptions\n): X402AnalyticsTracker {\n return new X402AnalyticsTracker(options)\n}\n\n/**\n * x402 analytics event handlers type\n */\nexport interface X402AnalyticsEventHandlers {\n onPayment?: (event: X402PaymentEvent) => void\n onPaymentStatusChanged?: (event: X402PaymentEvent) => void\n onMetrics?: (metrics: X402TransactionMetrics) => void\n onError?: (error: Error) => void\n onStarted?: () => void\n onStopped?: () => void\n}\n","/**\n * x402 Payment Streaming for Long-Running Tasks\n *\n * Enables continuous micropayment streams for long-running agent tasks,\n * supporting milestone-based payments and automatic stream management.\n */\n\nimport type { Address, Signature, Transaction } from '@solana/kit';\nimport { EventEmitter } from 'node:events';\nimport type { X402Client } from './X402Client';\n\n// Web3.js v2 compatibility: Connection type stub\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Connection = any;\n\n/**\n * Payment stream configuration\n */\nexport interface PaymentStreamConfig {\n /** Agent receiving payments */\n agentAddress: Address;\n /** Client making payments */\n clientAddress: Address;\n /** Token mint for payments */\n tokenMint: Address;\n /** Total stream amount */\n totalAmount: bigint;\n /** Payment interval in milliseconds */\n intervalMs: number;\n /** Amount per interval */\n amountPerInterval: bigint;\n /** Stream duration in milliseconds */\n durationMs: number;\n /** Optional milestones for conditional releases */\n milestones?: PaymentMilestone[];\n /** Auto-resume on failure */\n autoResume?: boolean;\n}\n\n/**\n * Payment milestone for conditional releases\n */\nexport interface PaymentMilestone {\n /** Milestone ID */\n id: string;\n /** Milestone description */\n description: string;\n /** Amount to release at this milestone */\n amount: bigint;\n /** Completion condition callback */\n condition: () => Promise<boolean>;\n /** Completed flag */\n completed: boolean;\n /** Completion timestamp */\n completedAt?: number;\n}\n\n/**\n * Payment stream state\n */\nexport interface PaymentStream {\n /** Stream ID */\n id: string;\n /** Configuration */\n config: PaymentStreamConfig;\n /** Current status */\n status: 'active' | 'paused' | 'completed' | 'cancelled' | 'failed';\n /** Amount paid so far */\n amountPaid: bigint;\n /** Payments made */\n payments: StreamPayment[];\n /** Start timestamp */\n startedAt: number;\n /** End timestamp */\n endedAt?: number;\n /** Last payment timestamp */\n lastPaymentAt?: number;\n /** Next payment due at */\n nextPaymentAt?: number;\n /** Error if failed */\n error?: Error;\n}\n\n/**\n * Individual stream payment\n */\nexport interface StreamPayment {\n /** Payment timestamp */\n timestamp: number;\n /** Amount paid */\n amount: bigint;\n /** Transaction signature */\n signature: Signature;\n /** Associated milestone ID */\n milestoneId?: string;\n /** Success flag */\n success: boolean;\n /** Error if failed */\n error?: Error;\n}\n\n/**\n * Payment Streaming Manager\n *\n * Manages continuous x402 payment streams for long-running tasks\n */\nexport class PaymentStreamingManager extends EventEmitter {\n private streams: Map<string, PaymentStream>;\n private intervals: Map<string, NodeJS.Timeout>;\n private x402Client: X402Client;\n private connection: Connection;\n\n constructor(x402Client: X402Client, connection: Connection) {\n super();\n this.streams = new Map();\n this.intervals = new Map();\n this.x402Client = x402Client;\n this.connection = connection;\n }\n\n /**\n * Create a new payment stream\n */\n async createStream(config: PaymentStreamConfig): Promise<PaymentStream> {\n const streamId = this.generateStreamId(config);\n\n // Validate configuration\n this.validateStreamConfig(config);\n\n const stream: PaymentStream = {\n id: streamId,\n config,\n status: 'active',\n amountPaid: 0n,\n payments: [],\n startedAt: Date.now(),\n nextPaymentAt: Date.now() + config.intervalMs,\n };\n\n this.streams.set(streamId, stream);\n\n // Start the payment interval\n this.startStreamInterval(stream);\n\n this.emit('stream_created', stream);\n\n return stream;\n }\n\n /**\n * Pause a payment stream\n */\n pauseStream(streamId: string): void {\n const stream = this.streams.get(streamId);\n if (!stream) {\n throw new Error(`Stream ${streamId} not found`);\n }\n\n if (stream.status !== 'active') {\n throw new Error(`Stream ${streamId} is not active`);\n }\n\n this.stopStreamInterval(streamId);\n stream.status = 'paused';\n\n this.emit('stream_paused', stream);\n }\n\n /**\n * Resume a paused payment stream\n */\n resumeStream(streamId: string): void {\n const stream = this.streams.get(streamId);\n if (!stream) {\n throw new Error(`Stream ${streamId} not found`);\n }\n\n if (stream.status !== 'paused') {\n throw new Error(`Stream ${streamId} is not paused`);\n }\n\n stream.status = 'active';\n stream.nextPaymentAt = Date.now() + stream.config.intervalMs;\n this.startStreamInterval(stream);\n\n this.emit('stream_resumed', stream);\n }\n\n /**\n * Cancel a payment stream\n */\n cancelStream(streamId: string): void {\n const stream = this.streams.get(streamId);\n if (!stream) {\n throw new Error(`Stream ${streamId} not found`);\n }\n\n this.stopStreamInterval(streamId);\n stream.status = 'cancelled';\n stream.endedAt = Date.now();\n\n this.emit('stream_cancelled', stream);\n }\n\n /**\n * Get stream by ID\n */\n getStream(streamId: string): PaymentStream | undefined {\n return this.streams.get(streamId);\n }\n\n /**\n * Get all streams\n */\n getAllStreams(): PaymentStream[] {\n return Array.from(this.streams.values());\n }\n\n /**\n * Get active streams\n */\n getActiveStreams(): PaymentStream[] {\n return Array.from(this.streams.values()).filter((s) => s.status === 'active');\n }\n\n /**\n * Complete a milestone\n */\n async completeMilestone(streamId: string, milestoneId: string): Promise<void> {\n const stream = this.streams.get(streamId);\n if (!stream) {\n throw new Error(`Stream ${streamId} not found`);\n }\n\n const milestone = stream.config.milestones?.find((m) => m.id === milestoneId);\n if (!milestone) {\n throw new Error(`Milestone ${milestoneId} not found`);\n }\n\n if (milestone.completed) {\n throw new Error(`Milestone ${milestoneId} already completed`);\n }\n\n // Check milestone condition\n const conditionMet = await milestone.condition();\n if (!conditionMet) {\n throw new Error(`Milestone ${milestoneId} condition not met`);\n }\n\n // Make milestone payment\n try {\n const paymentSignature = await this.makePayment(stream, milestone.amount, milestoneId);\n\n milestone.completed = true;\n milestone.completedAt = Date.now();\n\n this.emit('milestone_completed', {\n streamId,\n milestoneId,\n signature: paymentSignature,\n });\n } catch (error) {\n this.emit('milestone_failed', {\n streamId,\n milestoneId,\n error,\n });\n throw error;\n }\n }\n\n /**\n * Cleanup: Stop all streams and clear intervals\n */\n cleanup(): void {\n for (const streamId of this.intervals.keys()) {\n this.stopStreamInterval(streamId);\n }\n this.streams.clear();\n this.intervals.clear();\n }\n\n // Private methods\n\n private generateStreamId(config: PaymentStreamConfig): string {\n const timestamp = Date.now();\n const hash = `${config.agentAddress}-${config.clientAddress}-${timestamp}`;\n return Buffer.from(hash).toString('base64').slice(0, 16);\n }\n\n private validateStreamConfig(config: PaymentStreamConfig): void {\n if (config.totalAmount <= 0n) {\n throw new Error('Total amount must be positive');\n }\n\n if (config.intervalMs <= 0) {\n throw new Error('Interval must be positive');\n }\n\n if (config.durationMs <= 0) {\n throw new Error('Duration must be positive');\n }\n\n if (config.amountPerInterval <= 0n) {\n throw new Error('Amount per interval must be positive');\n }\n\n const maxPayments = Math.ceil(config.durationMs / config.intervalMs);\n const totalViaInterval = config.amountPerInterval * BigInt(maxPayments);\n\n const milestoneTotal =\n config.milestones?.reduce((sum, m) => sum + m.amount, 0n) ?? 0n;\n\n if (totalViaInterval + milestoneTotal > config.totalAmount * 110n / 100n) {\n throw new Error('Payment schedule exceeds total amount (with 10% tolerance)');\n }\n }\n\n private startStreamInterval(stream: PaymentStream): void {\n const interval = setInterval(async () => {\n await this.processPayment(stream);\n }, stream.config.intervalMs);\n\n this.intervals.set(stream.id, interval);\n }\n\n private stopStreamInterval(streamId: string): void {\n const interval = this.intervals.get(streamId);\n if (interval) {\n clearInterval(interval);\n this.intervals.delete(streamId);\n }\n }\n\n private async processPayment(stream: PaymentStream): Promise<void> {\n if (stream.status !== 'active') {\n return;\n }\n\n // Check if stream should complete\n if (stream.amountPaid >= stream.config.totalAmount) {\n this.completeStream(stream);\n return;\n }\n\n if (Date.now() >= stream.startedAt + stream.config.durationMs) {\n this.completeStream(stream);\n return;\n }\n\n try {\n const amount = stream.config.amountPerInterval;\n const signature = await this.makePayment(stream, amount);\n\n stream.lastPaymentAt = Date.now();\n stream.nextPaymentAt = Date.now() + stream.config.intervalMs;\n\n this.emit('payment_processed', {\n streamId: stream.id,\n amount,\n signature,\n });\n } catch (error) {\n this.emit('payment_failed', {\n streamId: stream.id,\n error,\n });\n\n if (stream.config.autoResume !== true) {\n stream.status = 'failed';\n stream.error = error as Error;\n stream.endedAt = Date.now();\n this.stopStreamInterval(stream.id);\n }\n }\n }\n\n private async makePayment(\n stream: PaymentStream,\n amount: bigint,\n milestoneId?: string\n ): Promise<Signature> {\n // Create x402 payment request\n // Note: recipient is automatically set to wallet address in createPaymentRequest\n const paymentRequest = this.x402Client.createPaymentRequest({\n amount,\n token: stream.config.tokenMint,\n description: milestoneId\n ? `Stream ${stream.id} - Milestone ${milestoneId}`\n : `Stream ${stream.id} - Interval payment`,\n metadata: {\n streamId: stream.id,\n ...(milestoneId && { milestoneId }),\n },\n });\n\n // Execute payment using x402Client\n const receipt = await this.x402Client.pay(paymentRequest);\n\n // Record payment\n const payment: StreamPayment = {\n timestamp: Date.now(),\n amount,\n signature: receipt.signature,\n milestoneId,\n success: true,\n };\n\n stream.payments.push(payment);\n stream.amountPaid += amount;\n\n return receipt.signature;\n }\n\n private completeStream(stream: PaymentStream): void {\n this.stopStreamInterval(stream.id);\n stream.status = 'completed';\n stream.endedAt = Date.now();\n\n this.emit('stream_completed', stream);\n }\n}\n","/**\n * A2A (Agent-to-Agent) Communication Client\n *\n * High-level SDK for agent-to-agent communication on the GhostSpeak protocol.\n * Enables agents to create sessions, send messages, and update status.\n *\n * @module protocols/A2AClient\n */\n\nimport type { Address, Rpc, SolanaRpcApi, TransactionSigner } from '@solana/kit'\nimport { pipe } from '@solana/functional'\nimport {\n createSolanaRpc,\n createTransactionMessage,\n setTransactionMessageFeePayer,\n setTransactionMessageLifetimeUsingBlockhash,\n appendTransactionMessageInstruction,\n signTransactionMessageWithSigners,\n getBase64EncodedWireTransaction,\n type Signature\n} from '@solana/kit'\nimport { getCreateA2aSessionInstructionAsync } from '../generated/instructions/createA2aSession.js'\nimport { getSendA2aMessageInstruction } from '../generated/instructions/sendA2aMessage.js'\nimport { getUpdateA2aStatusInstruction } from '../generated/instructions/updateA2aStatus.js'\nimport { fetchA2ASession, fetchMaybeA2ASession, type A2ASession } from '../generated/accounts/a2ASession.js'\nimport { fetchA2AMessage, type A2AMessage } from '../generated/accounts/a2AMessage.js'\nimport { fetchA2AStatus, type A2AStatus } from '../generated/accounts/a2AStatus.js'\nimport { GHOSTSPEAK_MARKETPLACE_PROGRAM_ADDRESS } from '../generated/programs/ghostspeakMarketplace.js'\nimport { address } from '@solana/addresses'\nimport { EventEmitter } from 'node:events'\n\n// =====================================================\n// TYPES\n// =====================================================\n\nexport interface A2ASessionConfig {\n responder: Address\n sessionType: string\n metadata?: string\n expiresIn?: number // Seconds from now (default: 3600 = 1 hour)\n}\n\nexport interface A2AMessageParams {\n sessionAddress: Address\n content: string\n messageType?: string // Default: 'text'\n}\n\nexport interface A2AStatusUpdate {\n status: string\n capabilities?: string[]\n availability?: boolean\n}\n\nexport interface A2AClientOptions {\n rpcEndpoint: string\n programId?: Address\n}\n\nexport interface A2ASessionDetails extends A2ASession {\n address: Address\n}\n\n// =====================================================\n// EVENTS\n// =====================================================\n\nexport interface A2AEvent {\n type: 'session_created' | 'message_sent' | 'status_updated' | 'error'\n timestamp: number\n data?: unknown\n error?: string\n}\n\n// =====================================================\n// A2A CLIENT\n// =====================================================\n\n/**\n * A2A Communication Client\n *\n * Provides high-level methods for agent-to-agent communication:\n * - Create communication sessions\n * - Send messages between agents\n * - Update agent status\n * - Query session state\n *\n * @example\n * ```typescript\n * const a2aClient = new A2AClient({\n * rpcEndpoint: 'https://api.devnet.solana.com',\n * wallet\n * })\n *\n * // Create session with another agent\n * const session = await a2aClient.createSession({\n * responder: otherAgentAddress,\n * sessionType: 'collaboration',\n * metadata: 'Working on data analysis task'\n * })\n *\n * // Send message\n * await a2aClient.sendMessage({\n * sessionAddress: session.address,\n * content: 'I have completed processing the dataset',\n * messageType: 'update'\n * })\n *\n * // Update status\n * await a2aClient.updateStatus({\n * status: 'available',\n * capabilities: ['data_analysis', 'ml_inference'],\n * availability: true\n * })\n * ```\n */\nexport class A2AClient extends EventEmitter {\n private rpc: Rpc<SolanaRpcApi>\n private programId: Address\n private wallet: TransactionSigner\n\n constructor(options: A2AClientOptions, wallet: TransactionSigner) {\n super()\n this.rpc = createSolanaRpc(options.rpcEndpoint)\n this.programId = options.programId ?? GHOSTSPEAK_MARKETPLACE_PROGRAM_ADDRESS\n this.wallet = wallet\n }\n\n /**\n * Create a new A2A communication session\n *\n * Establishes a secure communication channel between two agents.\n *\n * @param config - Session configuration\n * @returns Session details including address\n *\n * @example\n * ```typescript\n * const session = await a2aClient.createSession({\n * responder: 'AgentBpubkey...',\n * sessionType: 'data_processing',\n * metadata: 'Processing financial data',\n * expiresIn: 7200 // 2 hours\n * })\n * console.log('Session created:', session.address)\n * ```\n */\n async createSession(config: A2ASessionConfig): Promise<A2ASessionDetails> {\n try {\n const now = Math.floor(Date.now() / 1000)\n const expiresAt = now + (config.expiresIn ?? 3600) // Default 1 hour\n\n // Generate unique session ID\n const sessionId = BigInt(Date.now())\n\n // Build instruction\n const instruction = await getCreateA2aSessionInstructionAsync({\n creator: this.wallet,\n sessionId,\n initiator: this.wallet.address,\n responder: config.responder,\n sessionType: config.sessionType,\n metadata: config.metadata ?? '',\n expiresAt: BigInt(expiresAt)\n }, { programAddress: this.programId })\n\n // Send transaction\n const signature = await this.sendTransaction([instruction])\n\n // Derive session address from PDA\n // Seeds: [b\"a2a_session\", creator.key()]\n const sessionAddress = instruction.accounts[0].address\n\n // Emit event\n this.emit('session_created', {\n type: 'session_created',\n timestamp: Date.now(),\n data: { sessionAddress, signature }\n } as A2AEvent)\n\n // Fetch and return session details\n const session = await fetchA2ASession(this.rpc, sessionAddress)\n\n return {\n ...session.data,\n address: sessionAddress\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n this.emit('error', {\n type: 'error',\n timestamp: Date.now(),\n error: errorMessage\n } as A2AEvent)\n throw new Error(`Failed to create A2A session: ${errorMessage}`)\n }\n }\n\n /**\n * Send a message in an A2A session\n *\n * Sends structured messages between agents with automatic context management.\n *\n * @param params - Message parameters\n * @returns Transaction signature\n *\n * @example\n * ```typescript\n * await a2aClient.sendMessage({\n * sessionAddress: session.address,\n * content: 'Processing complete. Results: {...}',\n * messageType: 'result'\n * })\n * ```\n */\n async sendMessage(params: A2AMessageParams): Promise<Signature> {\n try {\n const messageId = BigInt(Date.now())\n const sessionId = BigInt(Date.now()) // This should ideally come from session\n const timestamp = BigInt(Math.floor(Date.now() / 1000))\n\n // Derive message address from PDA\n // Seeds: [b\"a2a_message\", session.key(), session.created_at.to_le_bytes()]\n // For now, we'll let the instruction builder derive it\n\n // Build instruction\n const instruction = getSendA2aMessageInstruction({\n message: await this.deriveMessageAddress(params.sessionAddress),\n session: params.sessionAddress,\n sender: this.wallet,\n messageId,\n sessionId,\n senderArg: this.wallet.address,\n content: params.content,\n messageType: params.messageType ?? 'text',\n timestamp\n }, { programAddress: this.programId })\n\n // Send transaction\n const signature = await this.sendTransaction([instruction])\n\n // Emit event\n this.emit('message_sent', {\n type: 'message_sent',\n timestamp: Date.now(),\n data: { signature, content: params.content }\n } as A2AEvent)\n\n return signature\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n this.emit('error', {\n type: 'error',\n timestamp: Date.now(),\n error: errorMessage\n } as A2AEvent)\n throw new Error(`Failed to send A2A message: ${errorMessage}`)\n }\n }\n\n /**\n * Update agent status\n *\n * Updates agent availability, capabilities, and status for discovery.\n *\n * @param update - Status update\n * @returns Transaction signature\n *\n * @example\n * ```typescript\n * await a2aClient.updateStatus({\n * status: 'busy',\n * capabilities: ['nlp', 'translation'],\n * availability: false\n * })\n * ```\n */\n async updateStatus(update: A2AStatusUpdate): Promise<Signature> {\n try {\n // Derive status address from PDA\n // Seeds: [b\"a2a_status\", session.key()]\n // For agent status, it might be [b\"a2a_status\", agent.key()]\n\n const statusAddress = await this.deriveStatusAddress()\n\n // Build instruction\n const instruction = getUpdateA2aStatusInstruction({\n status: statusAddress,\n session: address('11111111111111111111111111111111'), // Placeholder - need actual session\n updater: this.wallet,\n statusId: BigInt(Date.now()),\n agent: this.wallet.address,\n statusArg: update.status,\n capabilities: update.capabilities ?? [],\n availability: update.availability ?? true,\n lastUpdated: BigInt(Math.floor(Date.now() / 1000))\n }, { programAddress: this.programId })\n\n // Send transaction\n const signature = await this.sendTransaction([instruction])\n\n // Emit event\n this.emit('status_updated', {\n type: 'status_updated',\n timestamp: Date.now(),\n data: { signature, status: update.status }\n } as A2AEvent)\n\n return signature\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n this.emit('error', {\n type: 'error',\n timestamp: Date.now(),\n error: errorMessage\n } as A2AEvent)\n throw new Error(`Failed to update A2A status: ${errorMessage}`)\n }\n }\n\n /**\n * Get session details\n *\n * Fetches current session state from on-chain.\n *\n * @param sessionAddress - Session PDA address\n * @returns Session details\n */\n async getSession(sessionAddress: Address): Promise<A2ASessionDetails | null> {\n try {\n const maybeSession = await fetchMaybeA2ASession(this.rpc, sessionAddress)\n\n if (!maybeSession.exists) {\n return null\n }\n\n return {\n ...maybeSession.data,\n address: sessionAddress\n }\n } catch (error) {\n console.error('Failed to fetch A2A session:', error)\n return null\n }\n }\n\n /**\n * Get message by address\n *\n * @param messageAddress - Message PDA address\n * @returns Message data\n */\n async getMessage(messageAddress: Address): Promise<A2AMessage | null> {\n try {\n const message = await fetchA2AMessage(this.rpc, messageAddress)\n return message.data\n } catch (error) {\n console.error('Failed to fetch A2A message:', error)\n return null\n }\n }\n\n /**\n * Get agent status\n *\n * @param statusAddress - Status PDA address\n * @returns Status data\n */\n async getStatus(statusAddress: Address): Promise<A2AStatus | null> {\n try {\n const status = await fetchA2AStatus(this.rpc, statusAddress)\n return status.data\n } catch (error) {\n console.error('Failed to fetch A2A status:', error)\n return null\n }\n }\n\n // =====================================================\n // PRIVATE HELPER METHODS\n // =====================================================\n\n private async sendTransaction(instructions: readonly unknown[]): Promise<Signature> {\n try {\n // Get latest blockhash\n const { value: latestBlockhash } = await this.rpc.getLatestBlockhash().send()\n\n // Build transaction message with proper type inference\n let message: unknown = createTransactionMessage({ version: 0 })\n message = setTransactionMessageFeePayer(this.wallet.address, message as ReturnType<typeof createTransactionMessage>)\n message = setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, message as Parameters<typeof setTransactionMessageLifetimeUsingBlockhash>[1])\n\n for (const ix of instructions) {\n message = appendTransactionMessageInstruction(ix as Parameters<typeof appendTransactionMessageInstruction>[0], message as Parameters<typeof appendTransactionMessageInstruction>[1])\n }\n\n // Sign transaction\n const signedTransaction = await signTransactionMessageWithSigners(message as Parameters<typeof signTransactionMessageWithSigners>[0])\n\n // Extract signature\n const signatures = Object.values(signedTransaction.signatures)\n if (signatures.length === 0) {\n throw new Error('Transaction has no signatures')\n }\n\n const signature = signatures[0] as unknown as Signature\n\n // Send transaction\n const wireTransaction = getBase64EncodedWireTransaction(signedTransaction)\n await this.rpc.sendTransaction(wireTransaction).send()\n\n // Wait for confirmation\n await this.confirmTransaction(signature)\n\n return signature\n } catch (error) {\n throw new Error(\n `Transaction failed: ${error instanceof Error ? error.message : String(error)}`\n )\n }\n }\n\n private async confirmTransaction(signature: Signature): Promise<void> {\n for (let i = 0; i < 30; i++) {\n const status = await this.rpc.getSignatureStatuses([signature]).send()\n if (\n status.value[0]?.confirmationStatus === 'confirmed' ||\n status.value[0]?.confirmationStatus === 'finalized'\n ) {\n return\n }\n await new Promise((resolve) => setTimeout(resolve, 1000))\n }\n throw new Error('Transaction confirmation timeout')\n }\n\n private async deriveMessageAddress(sessionAddress: Address): Promise<Address> {\n // This is a simplified implementation\n // In reality, we need to derive the PDA properly using:\n // seeds: [b\"a2a_message\", session.key(), session.created_at.to_le_bytes()]\n // For now, we'll use a placeholder\n // The actual implementation should use getProgramDerivedAddress\n return address('11111111111111111111111111111111')\n }\n\n private async deriveStatusAddress(): Promise<Address> {\n // This is a simplified implementation\n // In reality, we need to derive the PDA properly\n return address('11111111111111111111111111111111')\n }\n}\n\n// =====================================================\n// FACTORY FUNCTION\n// =====================================================\n\n/**\n * Create an A2A Client instance\n *\n * @param options - Client configuration\n * @param wallet - Transaction signer (agent wallet)\n * @returns A2AClient instance\n */\nexport function createA2AClient(\n options: A2AClientOptions,\n wallet: TransactionSigner\n): A2AClient {\n return new A2AClient(options, wallet)\n}\n\n// =====================================================\n// EXPORTS\n// =====================================================\n\nexport default A2AClient\n","/**\n * H2A (Human-to-Agent) Communication Client\n *\n * High-level SDK for human-to-agent communication on the GhostSpeak protocol.\n * Enables humans to hire agents, send service requests, and communicate with agents.\n *\n * @module protocols/H2AClient\n *\n * NOTE: This client currently requires IDL regeneration to include H2A instruction builders.\n * The Rust instructions exist in programs/src/instructions/h2a_protocol.rs but haven't\n * been generated to TypeScript yet. Run `bun run codama` to regenerate.\n */\n\nimport type { Address, Rpc, SolanaRpcApi, TransactionSigner, Signature } from '@solana/kit'\n// Don't import conflicting local ParticipantType enum\nimport {\n createSolanaRpc,\n createTransactionMessage,\n setTransactionMessageFeePayer,\n setTransactionMessageLifetimeUsingBlockhash,\n appendTransactionMessageInstruction,\n signTransactionMessageWithSigners,\n getBase64EncodedWireTransaction\n} from '@solana/kit'\nimport { GHOSTSPEAK_MARKETPLACE_PROGRAM_ADDRESS } from '../generated/programs/ghostspeakMarketplace.js'\nimport { getCreateCommunicationSessionInstructionAsync } from '../generated/instructions/createCommunicationSession.js'\nimport { getSendCommunicationMessageInstruction } from '../generated/instructions/sendCommunicationMessage.js'\nimport { getCommunicationSessionDataDecoder, type CommunicationSessionData } from '../generated/types/communicationSessionData.js'\nexport { ParticipantType } from '../generated/types/participantType.js' // Export generated Enum\nimport { ParticipantType } from '../generated/types/participantType.js' // Local import for usage\nimport { EventEmitter } from 'node:events'\nimport { getProgramDerivedAddress, getBytesEncoder, getAddressEncoder } from '@solana/kit'\n\n// =====================================================\n// TYPES\n// =====================================================\n\nexport interface H2ASessionConfig {\n agentAddress: Address\n sessionType: string\n metadata?: string\n expiresIn?: number // Seconds from now (default: 3600 = 1 hour)\n}\n\nexport interface H2AMessageParams {\n sessionAddress: Address\n content: string\n messageType?: string // Default: 'service_request'\n attachments?: string[] // IPFS URIs or file references\n}\n\nexport interface H2AServiceRequest extends H2AMessageParams {\n paymentAmount?: bigint\n deadline?: number // Unix timestamp\n}\n\nexport interface H2AClientOptions {\n rpcEndpoint: string\n programId?: Address\n}\n\n// =====================================================\n// EVENTS\n// =====================================================\n\nexport interface H2AEvent {\n type: 'session_created' | 'message_sent' | 'service_requested' | 'error'\n timestamp: number\n data?: unknown\n error?: string\n}\n\n// =====================================================\n// H2A CLIENT\n// =====================================================\n\n/**\n * H2A Communication Client\n *\n * Provides high-level methods for human-to-agent communication:\n * - Create communication sessions with agents\n * - Send service requests to agents\n * - Send messages and receive updates\n * - Attach files and rich content\n *\n * @example\n * ```typescript\n * const h2aClient = new H2AClient({\n * rpcEndpoint: 'https://api.devnet.solana.com'\n * }, humanWallet)\n *\n * // Create session with an agent\n * const session = await h2aClient.createSession({\n * agentAddress: 'Agent123...',\n * sessionType: 'data_analysis',\n * metadata: 'Need financial data analysis'\n * })\n *\n * // Send service request\n * await h2aClient.sendServiceRequest({\n * sessionAddress: session.address,\n * content: 'Please analyze Q4 2024 revenue data',\n * attachments: ['ipfs://QmDataset123'],\n * paymentAmount: 5_000_000n, // 5 USDC\n * deadline: Date.now() / 1000 + 86400 // 24 hours\n * })\n * ```\n */\nexport class H2AClient extends EventEmitter {\n private rpc: Rpc<SolanaRpcApi>\n private programId: Address\n private wallet: TransactionSigner\n\n constructor(options: H2AClientOptions, wallet: TransactionSigner) {\n super()\n this.rpc = createSolanaRpc(options.rpcEndpoint)\n this.programId = options.programId ?? GHOSTSPEAK_MARKETPLACE_PROGRAM_ADDRESS\n this.wallet = wallet\n }\n\n /**\n * Create a new communication session with an agent\n *\n * Establishes a communication channel between a human and an agent.\n *\n * @param config - Session configuration\n * @returns Session details including address\n *\n * @throws {Error} Currently not implemented - requires IDL regeneration\n *\n * @example\n * ```typescript\n * const session = await h2aClient.createSession({\n * agentAddress: 'Agent123...',\n * sessionType: 'content_writing',\n * metadata: 'Blog post about AI agents',\n * expiresIn: 7200 // 2 hours\n * })\n * ```\n */\n async createSession(config: H2ASessionConfig): Promise<{ address: Address; signature: Signature }> {\n const expiresAt = BigInt(Math.floor(Date.now() / 1000) + (config.expiresIn ?? 3600))\n const sessionId = BigInt(Date.now())\n \n // Explicitly cast to unknown first to avoid type overlap issues\n const initiator = this.wallet.address\n\n // Derive session PDA\n // Pattern: ['comm_session', creator]\n // We'll compute this inside getCreateCommunicationSessionInstructionAsync's default resolution\n // but the return type gives us the resolved account addresses.\n \n // We can also pre-calculate it if needed for the return value\n const [sessionAddress] = await getProgramDerivedAddress({\n programAddress: this.programId,\n seeds: [\n getBytesEncoder().encode(new Uint8Array([99, 111, 109, 109, 95, 115, 101, 115, 115, 105, 111, 110])), // 'comm_session'\n getAddressEncoder().encode(initiator)\n ]\n })\n\n const instruction = await getCreateCommunicationSessionInstructionAsync({\n session: sessionAddress,\n creator: this.wallet,\n sessionId,\n initiator: initiator,\n initiatorType: ParticipantType.Human,\n responder: config.agentAddress,\n responderType: ParticipantType.Agent,\n sessionType: config.sessionType,\n metadata: config.metadata ?? '',\n expiresAt: expiresAt\n }, { programAddress: this.programId })\n\n const signature = await this.sendTransaction([instruction])\n\n // Emit event\n this.emit('session_created', {\n type: 'session_created',\n timestamp: Date.now(),\n data: {\n address: sessionAddress,\n signature,\n agent: config.agentAddress\n }\n } as H2AEvent)\n\n return { address: sessionAddress, signature }\n }\n\n /**\n * Send a service request to an agent\n *\n * Sends a work request to an agent with optional payment commitment.\n *\n * @param request - Service request parameters\n * @returns Transaction signature\n *\n * @example\n * ```typescript\n * await h2aClient.sendServiceRequest({\n * sessionAddress: session.address,\n * content: 'Generate 10 social media posts about web3',\n * messageType: 'service_request',\n * attachments: ['ipfs://QmBrandGuidelines'],\n * paymentAmount: 10_000_000n, // 10 USDC\n * deadline: Date.now() / 1000 + 172800 // 48 hours\n * })\n * ```\n */\n async sendServiceRequest(request: H2AServiceRequest): Promise<Signature> {\n const messageId = BigInt(Date.now())\n \n // Derive message PDA\n // Pattern: ['communication_message', session, messageId]\n const messageIdBytes = new Uint8Array(8)\n const view = new DataView(messageIdBytes.buffer)\n view.setBigUint64(0, messageId, true) // Little-endian\n\n const [messageAddress] = await getProgramDerivedAddress({\n programAddress: this.programId,\n seeds: [\n getBytesEncoder().encode(new Uint8Array([99, 111, 109, 109, 95, 109, 101, 115, 115, 97, 103, 101])), // 'comm_message'\n getAddressEncoder().encode(request.sessionAddress),\n getBytesEncoder().encode(messageIdBytes)\n ]\n })\n\n const instruction = getSendCommunicationMessageInstruction({\n message: messageAddress,\n session: request.sessionAddress,\n sender: this.wallet,\n messageId: messageId,\n senderType: ParticipantType.Human,\n content: request.content,\n messageType: request.messageType ?? 'service_request',\n attachments: request.attachments ?? []\n }, { programAddress: this.programId })\n\n const signature = await this.sendTransaction([instruction])\n\n this.emit('service_requested', {\n type: 'service_requested',\n timestamp: Date.now(),\n data: {\n messageAddress,\n sessionAddress: request.sessionAddress,\n signature\n }\n } as H2AEvent)\n\n return signature\n }\n\n /**\n * Send a message in an existing session\n *\n * Sends a message to an agent with support for file attachments.\n *\n * @param params - Message parameters\n * @returns Transaction signature\n */\n async sendMessage(params: H2AMessageParams): Promise<Signature> {\n const messageId = BigInt(Date.now())\n \n // Derive message PDA\n // Pattern: ['communication_message', session, messageId]\n const messageIdBytes = new Uint8Array(8)\n const view = new DataView(messageIdBytes.buffer)\n view.setBigUint64(0, messageId, true) // Little-endian\n\n const [messageAddress] = await getProgramDerivedAddress({\n programAddress: this.programId,\n seeds: [\n getBytesEncoder().encode(new Uint8Array([99, 111, 109, 109, 95, 109, 101, 115, 115, 97, 103, 101])), // 'comm_message'\n getAddressEncoder().encode(params.sessionAddress),\n getBytesEncoder().encode(messageIdBytes)\n ]\n })\n\n const instruction = getSendCommunicationMessageInstruction({\n message: messageAddress,\n session: params.sessionAddress,\n sender: this.wallet,\n messageId: messageId,\n senderType: ParticipantType.Human,\n content: params.content,\n messageType: params.messageType ?? 'text',\n attachments: params.attachments ?? []\n }, { programAddress: this.programId })\n\n const signature = await this.sendTransaction([instruction])\n\n this.emit('message_sent', {\n type: 'message_sent',\n timestamp: Date.now(),\n data: {\n messageAddress,\n sessionAddress: params.sessionAddress,\n signature\n }\n } as H2AEvent)\n\n return signature\n }\n\n /**\n * Get session details\n *\n * @param sessionAddress - Session PDA address\n */\n async getSession(sessionAddress: Address): Promise<CommunicationSessionData> {\n const accountInfo = await this.rpc.getAccountInfo(sessionAddress, { encoding: 'base64' }).send()\n \n if (!accountInfo.value) {\n throw new Error(`Session account not found: ${sessionAddress}`)\n }\n\n const data = accountInfo.value.data\n // Decode data - assuming generated getCommunicationSessionDataDecoder exists\n // If not, we'd need to manually decode or use the generated decoder\n \n // For now, we'll return the decoded data using the generated decoder\n return getCommunicationSessionDataDecoder().decode(\n typeof data === 'string' \n ? Uint8Array.from(Buffer.from(data, 'base64'))\n : new Uint8Array(data as unknown as ArrayBuffer)\n )\n }\n\n // =====================================================\n // PRIVATE HELPER METHODS\n // =====================================================\n\n private async sendTransaction(instructions: readonly unknown[]): Promise<Signature> {\n try {\n const { value: latestBlockhash } = await this.rpc.getLatestBlockhash().send()\n\n // Build transaction message with proper type inference\n let message: unknown = createTransactionMessage({ version: 0 })\n message = setTransactionMessageFeePayer(this.wallet.address, message as ReturnType<typeof createTransactionMessage>)\n message = setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, message as Parameters<typeof setTransactionMessageLifetimeUsingBlockhash>[1])\n\n for (const ix of instructions) {\n message = appendTransactionMessageInstruction(ix as Parameters<typeof appendTransactionMessageInstruction>[0], message as Parameters<typeof appendTransactionMessageInstruction>[1])\n }\n\n const signedTransaction = await signTransactionMessageWithSigners(message as Parameters<typeof signTransactionMessageWithSigners>[0])\n\n const signatures = Object.values(signedTransaction.signatures)\n if (signatures.length === 0) {\n throw new Error('Transaction has no signatures')\n }\n\n const signature = signatures[0] as unknown as Signature\n\n const wireTransaction = getBase64EncodedWireTransaction(signedTransaction)\n await this.rpc.sendTransaction(wireTransaction).send()\n\n await this.confirmTransaction(signature)\n\n return signature\n } catch (error) {\n throw new Error(\n `Transaction failed: ${error instanceof Error ? error.message : String(error)}`\n )\n }\n }\n\n private async confirmTransaction(signature: Signature): Promise<void> {\n for (let i = 0; i < 30; i++) {\n const status = await this.rpc.getSignatureStatuses([signature]).send()\n if (\n status.value[0]?.confirmationStatus === 'confirmed' ||\n status.value[0]?.confirmationStatus === 'finalized'\n ) {\n return\n }\n await new Promise((resolve) => setTimeout(resolve, 1000))\n }\n throw new Error('Transaction confirmation timeout')\n }\n}\n\n// =====================================================\n// FACTORY FUNCTION\n// =====================================================\n\n/**\n * Create an H2A Client instance\n *\n * @param options - Client configuration\n * @param wallet - Transaction signer (human wallet)\n * @returns H2AClient instance\n */\nexport function createH2AClient(\n options: H2AClientOptions,\n wallet: TransactionSigner\n): H2AClient {\n return new H2AClient(options, wallet)\n}\n\n// =====================================================\n// EXPORTS\n// =====================================================\n\nexport default H2AClient\n","/**\n * Test IPFS configuration for beta testing and development\n */\n\nimport type { IPFSConfig } from '../types/ipfs-types.js'\n\n/**\n * Test IPFS configuration that uses the in-memory test provider\n * This configuration does not require any external services\n */\nexport const TEST_IPFS_CONFIG: IPFSConfig = {\n provider: {\n name: 'test',\n endpoint: 'http://localhost:8080' // Fake endpoint for testing\n },\n gateways: [\n 'http://localhost:8080',\n 'https://test.ipfs.io'\n ],\n autoPinning: true,\n sizeThreshold: 400, // Lower threshold for testing (400 bytes)\n maxRetries: 2,\n retryDelay: 500,\n enableCache: true,\n cacheTTL: 60000 // 1 minute for testing\n}\n\n/**\n * Create a test IPFS configuration with custom options\n */\nexport function createTestIPFSConfig(options?: Partial<IPFSConfig>): IPFSConfig {\n return {\n ...TEST_IPFS_CONFIG,\n ...options,\n provider: {\n ...TEST_IPFS_CONFIG.provider,\n ...(options?.provider ?? {})\n }\n }\n}","/**\n * Enhanced error handling and retry logic for IPFS operations in GhostSpeak\n */\n\nimport type { IPFSError, IPFSOperationResult } from '../types/ipfs-types.js'\n\n/**\n * IPFS-specific error class with enhanced context\n */\nexport class IPFSOperationError extends Error {\n constructor(\n public readonly type: IPFSError,\n message: string,\n public readonly provider?: string,\n public readonly retryCount?: number,\n public readonly originalError?: Error\n ) {\n super(message)\n this.name = 'IPFSOperationError'\n }\n}\n\n/**\n * Configuration for retry logic\n */\nexport interface RetryConfig {\n maxRetries: number\n baseDelay: number\n maxDelay: number\n backoffFactor: number\n retryableErrors: IPFSError[]\n}\n\n/**\n * Default retry configuration\n */\nexport const DEFAULT_RETRY_CONFIG: RetryConfig = {\n maxRetries: 3,\n baseDelay: 1000,\n maxDelay: 30000,\n backoffFactor: 2,\n retryableErrors: [\n 'NETWORK_ERROR',\n 'TIMEOUT_ERROR',\n 'PROVIDER_ERROR'\n ]\n}\n\n/**\n * Circuit breaker for preventing cascading failures\n */\nexport class CircuitBreaker {\n private failures = 0\n private lastFailureTime = 0\n private state: 'CLOSED' | 'OPEN' | 'HALF_OPEN' = 'CLOSED'\n\n constructor(\n private readonly failureThreshold = 5,\n private readonly recoveryTime = 30000\n ) {}\n\n async execute<T>(operation: () => Promise<T>): Promise<T> {\n if (this.state === 'OPEN') {\n if (Date.now() - this.lastFailureTime > this.recoveryTime) {\n this.state = 'HALF_OPEN'\n } else {\n throw new Error('Circuit breaker is OPEN - too many failures')\n }\n }\n\n try {\n const result = await operation()\n this.onSuccess()\n return result\n } catch (error) {\n this.onFailure()\n throw error\n }\n }\n\n private onSuccess(): void {\n this.failures = 0\n this.state = 'CLOSED'\n }\n\n private onFailure(): void {\n this.failures++\n this.lastFailureTime = Date.now()\n \n if (this.failures >= this.failureThreshold) {\n this.state = 'OPEN'\n }\n }\n\n getState(): { state: string; failures: number; lastFailureTime: number } {\n return {\n state: this.state,\n failures: this.failures,\n lastFailureTime: this.lastFailureTime\n }\n }\n\n reset(): void {\n this.failures = 0\n this.lastFailureTime = 0\n this.state = 'CLOSED'\n }\n}\n\n/**\n * Enhanced retry utility with exponential backoff\n */\nexport class RetryHandler {\n private circuitBreaker: CircuitBreaker\n\n constructor(\n private readonly config: RetryConfig = DEFAULT_RETRY_CONFIG\n ) {\n this.circuitBreaker = new CircuitBreaker()\n }\n\n async execute<T>(\n operation: () => Promise<T>,\n context?: string\n ): Promise<T> {\n return this.circuitBreaker.execute(async () => {\n let lastError: Error\n \n for (let attempt = 0; attempt <= this.config.maxRetries; attempt++) {\n try {\n const result = await operation()\n \n if (attempt > 0) {\n console.log(`✅ Operation succeeded after ${attempt} retries${context ? ` (${context})` : ''}`)\n }\n \n return result\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error))\n \n if (attempt === this.config.maxRetries) {\n break // Don't delay on the last attempt\n }\n\n const shouldRetry = this.shouldRetry(lastError, attempt)\n if (!shouldRetry) {\n console.log(`❌ Error not retryable${context ? ` (${context})` : ''}:`, lastError.message)\n break\n }\n\n const delay = this.calculateDelay(attempt)\n console.log(`⏳ Retrying in ${delay}ms... (attempt ${attempt + 1}/${this.config.maxRetries}${context ? `, ${context}` : ''})`)\n \n await new Promise(resolve => setTimeout(resolve, delay))\n }\n }\n \n throw new IPFSOperationError(\n this.categorizeError(lastError!),\n `Operation failed after ${this.config.maxRetries + 1} attempts${context ? ` (${context})` : ''}: ${lastError!.message}`,\n undefined,\n this.config.maxRetries\n )\n })\n }\n\n private shouldRetry(error: Error, attempt: number): boolean {\n if (attempt >= this.config.maxRetries) {\n return false\n }\n\n const errorType = this.categorizeError(error)\n return this.config.retryableErrors.includes(errorType)\n }\n\n private calculateDelay(attempt: number): number {\n const exponentialDelay = this.config.baseDelay * Math.pow(this.config.backoffFactor, attempt)\n const jitter = Math.random() * 0.1 * exponentialDelay // Add 10% jitter\n return Math.min(exponentialDelay + jitter, this.config.maxDelay)\n }\n\n private categorizeError(error: Error): IPFSError {\n const message = error.message.toLowerCase()\n \nif (message.includes('timeout')) {\n return 'TIMEOUT_ERROR'\n }\n \nif (message.includes('network')) {\n return 'NETWORK_ERROR'\n }\n \nif (message.includes('unauthorized')) {\n return 'AUTHENTICATION_FAILED'\n }\n \nif (message.includes('quota')) {\n return 'QUOTA_EXCEEDED'\n }\n \n if (message.includes('invalid') && message.includes('hash')) {\n return 'INVALID_HASH'\n }\n \nif (message.includes('too large')) {\n return 'CONTENT_TOO_LARGE'\n }\n \n return 'PROVIDER_ERROR'\n }\n\n getStats(): {\n circuitBreakerState: ReturnType<CircuitBreaker['getState']>\n config: RetryConfig\n } {\n return {\n circuitBreakerState: this.circuitBreaker.getState(),\n config: this.config\n }\n }\n\n reset(): void {\n this.circuitBreaker.reset()\n }\n}\n\n/**\n * Fallback handler for graceful degradation\n */\nexport class FallbackHandler {\n private fallbackStrategies: Map<IPFSError, (error: IPFSOperationError) => Promise<unknown>> = new Map()\n\n constructor() {\n this.setupDefaultFallbacks()\n }\n\n private setupDefaultFallbacks(): void {\n // Fallback for upload failures - compress and retry inline storage\n this.fallbackStrategies.set('UPLOAD_FAILED', async (error) => {\n console.log('🔄 Upload failed, attempting inline storage fallback...')\n throw error // Let caller handle inline storage\n })\n\n // Fallback for retrieval failures - try alternative gateways\n this.fallbackStrategies.set('RETRIEVAL_FAILED', async (error) => {\n console.log('🔄 Retrieval failed, trying alternative gateways...')\n throw error // Let caller try alternative gateways\n })\n\n // Fallback for quota exceeded - suggest cleanup or alternative storage\n this.fallbackStrategies.set('QUOTA_EXCEEDED', async (error) => {\n console.warn('⚠️ IPFS quota exceeded - consider upgrading plan or cleaning up old content')\n throw error\n })\n }\n\n async handleError<T>(error: IPFSOperationError, fallbackValue?: T): Promise<T> {\n const strategy = this.fallbackStrategies.get(error.type)\n \n if (strategy) {\n try {\n const result = await strategy(error)\n return result as T\n } catch (_fallbackError) {\n console.warn('Fallback strategy also failed:', _fallbackError instanceof Error ? _fallbackError.message : String(_fallbackError))\n }\n }\n\n if (fallbackValue !== undefined) {\n console.log('Using provided fallback value')\n return fallbackValue\n }\n\n throw error\n }\n\n registerFallback<T>(errorType: IPFSError, strategy: (error: IPFSOperationError) => Promise<T>): void {\n this.fallbackStrategies.set(errorType, strategy)\n }\n}\n\n/**\n * Comprehensive error handler that combines retry logic with fallback strategies\n */\nexport class IPFSErrorHandler {\n private retryHandler: RetryHandler\n private fallbackHandler: FallbackHandler\n\n constructor(retryConfig?: Partial<RetryConfig>) {\n this.retryHandler = new RetryHandler({ ...DEFAULT_RETRY_CONFIG, ...retryConfig })\n this.fallbackHandler = new FallbackHandler()\n }\n\n async executeWithErrorHandling<T>(\n operation: () => Promise<IPFSOperationResult<T>>,\n context?: string,\n fallbackValue?: T\n ): Promise<IPFSOperationResult<T>> {\n try {\n const result = await this.retryHandler.execute(async () => {\n const opResult = await operation()\n \n if (!opResult.success && opResult.error) {\n throw new IPFSOperationError(\n opResult.error,\n opResult.message ?? `IPFS operation failed: ${opResult.error}`\n )\n }\n \n return opResult\n }, context)\n\n return result\n } catch (error) {\n const ipfsError = error instanceof IPFSOperationError \n ? error \n : new IPFSOperationError('PROVIDER_ERROR', error instanceof Error ? error.message : String(error))\n\n try {\n const fallbackResult = await this.fallbackHandler.handleError(ipfsError, fallbackValue)\n return {\n success: true,\n data: fallbackResult,\n message: 'Operation succeeded using fallback strategy'\n }\n } catch {\n return {\n success: false,\n error: ipfsError.type,\n message: ipfsError.message,\n duration: 0\n }\n }\n }\n }\n\n /**\n * Register a custom fallback strategy\n */\n registerFallback<T>(errorType: IPFSError, strategy: (error: IPFSOperationError) => Promise<T>): void {\n this.fallbackHandler.registerFallback(errorType, strategy)\n }\n\n /**\n * Get error handler statistics\n */\n getStats(): {\n retryStats: ReturnType<RetryHandler['getStats']>\n registeredFallbacks: IPFSError[]\n } {\n return {\n retryStats: this.retryHandler.getStats(),\n registeredFallbacks: Array.from(this.fallbackHandler['fallbackStrategies'].keys())\n }\n }\n\n /**\n * Reset all error handling state\n */\n reset(): void {\n this.retryHandler.reset()\n }\n}\n\n/**\n * Utility function to create a configured error handler\n */\nexport function createIPFSErrorHandler(config?: {\n retryConfig?: Partial<RetryConfig>\n customFallbacks?: {\n errorType: IPFSError\n strategy: (error: IPFSOperationError) => Promise<unknown>\n }[]\n}): IPFSErrorHandler {\n const handler = new IPFSErrorHandler(config?.retryConfig)\n \n if (config?.customFallbacks) {\n for (const { errorType, strategy } of config.customFallbacks) {\n handler.registerFallback(errorType, strategy)\n }\n }\n \n return handler\n}\n\n/**\n * Type guard to check if an error is an IPFS error\n */\nexport function isIPFSError(error: unknown): error is IPFSOperationError {\n return error instanceof IPFSOperationError\n}\n\n/**\n * Helper function to wrap any IPFS operation with error handling\n */\nexport async function withIPFSErrorHandling<T>(\n operation: () => Promise<T>,\n context?: string,\n errorHandler?: IPFSErrorHandler\n): Promise<IPFSOperationResult<T>> {\n const handler = errorHandler ?? new IPFSErrorHandler()\n \n return handler.executeWithErrorHandling(\n async () => {\n try {\n const result = await operation()\n return { success: true, data: result }\n } catch (error) {\n const ipfsError = error instanceof IPFSOperationError \n ? error.type \n : 'PROVIDER_ERROR' as IPFSError\n \n return {\n success: false,\n error: ipfsError,\n message: error instanceof Error ? error.message : String(error)\n }\n }\n },\n context\n )\n}","const ANSI_BACKGROUND_OFFSET = 10;\n\nconst wrapAnsi16 = (offset = 0) => code => `\\u001B[${code + offset}m`;\n\nconst wrapAnsi256 = (offset = 0) => code => `\\u001B[${38 + offset};5;${code}m`;\n\nconst wrapAnsi16m = (offset = 0) => (red, green, blue) => `\\u001B[${38 + offset};2;${red};${green};${blue}m`;\n\nconst styles = {\n\tmodifier: {\n\t\treset: [0, 0],\n\t\t// 21 isn't widely supported and 22 does the same thing\n\t\tbold: [1, 22],\n\t\tdim: [2, 22],\n\t\titalic: [3, 23],\n\t\tunderline: [4, 24],\n\t\toverline: [53, 55],\n\t\tinverse: [7, 27],\n\t\thidden: [8, 28],\n\t\tstrikethrough: [9, 29],\n\t},\n\tcolor: {\n\t\tblack: [30, 39],\n\t\tred: [31, 39],\n\t\tgreen: [32, 39],\n\t\tyellow: [33, 39],\n\t\tblue: [34, 39],\n\t\tmagenta: [35, 39],\n\t\tcyan: [36, 39],\n\t\twhite: [37, 39],\n\n\t\t// Bright color\n\t\tblackBright: [90, 39],\n\t\tgray: [90, 39], // Alias of `blackBright`\n\t\tgrey: [90, 39], // Alias of `blackBright`\n\t\tredBright: [91, 39],\n\t\tgreenBright: [92, 39],\n\t\tyellowBright: [93, 39],\n\t\tblueBright: [94, 39],\n\t\tmagentaBright: [95, 39],\n\t\tcyanBright: [96, 39],\n\t\twhiteBright: [97, 39],\n\t},\n\tbgColor: {\n\t\tbgBlack: [40, 49],\n\t\tbgRed: [41, 49],\n\t\tbgGreen: [42, 49],\n\t\tbgYellow: [43, 49],\n\t\tbgBlue: [44, 49],\n\t\tbgMagenta: [45, 49],\n\t\tbgCyan: [46, 49],\n\t\tbgWhite: [47, 49],\n\n\t\t// Bright color\n\t\tbgBlackBright: [100, 49],\n\t\tbgGray: [100, 49], // Alias of `bgBlackBright`\n\t\tbgGrey: [100, 49], // Alias of `bgBlackBright`\n\t\tbgRedBright: [101, 49],\n\t\tbgGreenBright: [102, 49],\n\t\tbgYellowBright: [103, 49],\n\t\tbgBlueBright: [104, 49],\n\t\tbgMagentaBright: [105, 49],\n\t\tbgCyanBright: [106, 49],\n\t\tbgWhiteBright: [107, 49],\n\t},\n};\n\nexport const modifierNames = Object.keys(styles.modifier);\nexport const foregroundColorNames = Object.keys(styles.color);\nexport const backgroundColorNames = Object.keys(styles.bgColor);\nexport const colorNames = [...foregroundColorNames, ...backgroundColorNames];\n\nfunction assembleStyles() {\n\tconst codes = new Map();\n\n\tfor (const [groupName, group] of Object.entries(styles)) {\n\t\tfor (const [styleName, style] of Object.entries(group)) {\n\t\t\tstyles[styleName] = {\n\t\t\t\topen: `\\u001B[${style[0]}m`,\n\t\t\t\tclose: `\\u001B[${style[1]}m`,\n\t\t\t};\n\n\t\t\tgroup[styleName] = styles[styleName];\n\n\t\t\tcodes.set(style[0], style[1]);\n\t\t}\n\n\t\tObject.defineProperty(styles, groupName, {\n\t\t\tvalue: group,\n\t\t\tenumerable: false,\n\t\t});\n\t}\n\n\tObject.defineProperty(styles, 'codes', {\n\t\tvalue: codes,\n\t\tenumerable: false,\n\t});\n\n\tstyles.color.close = '\\u001B[39m';\n\tstyles.bgColor.close = '\\u001B[49m';\n\n\tstyles.color.ansi = wrapAnsi16();\n\tstyles.color.ansi256 = wrapAnsi256();\n\tstyles.color.ansi16m = wrapAnsi16m();\n\tstyles.bgColor.ansi = wrapAnsi16(ANSI_BACKGROUND_OFFSET);\n\tstyles.bgColor.ansi256 = wrapAnsi256(ANSI_BACKGROUND_OFFSET);\n\tstyles.bgColor.ansi16m = wrapAnsi16m(ANSI_BACKGROUND_OFFSET);\n\n\t// From https://github.com/Qix-/color-convert/blob/3f0e0d4e92e235796ccb17f6e85c72094a651f49/conversions.js\n\tObject.defineProperties(styles, {\n\t\trgbToAnsi256: {\n\t\t\tvalue(red, green, blue) {\n\t\t\t\t// We use the extended greyscale palette here, with the exception of\n\t\t\t\t// black and white. normal palette only has 4 greyscale shades.\n\t\t\t\tif (red === green && green === blue) {\n\t\t\t\t\tif (red < 8) {\n\t\t\t\t\t\treturn 16;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (red > 248) {\n\t\t\t\t\t\treturn 231;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn Math.round(((red - 8) / 247) * 24) + 232;\n\t\t\t\t}\n\n\t\t\t\treturn 16\n\t\t\t\t\t+ (36 * Math.round(red / 255 * 5))\n\t\t\t\t\t+ (6 * Math.round(green / 255 * 5))\n\t\t\t\t\t+ Math.round(blue / 255 * 5);\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToRgb: {\n\t\t\tvalue(hex) {\n\t\t\t\tconst matches = /[a-f\\d]{6}|[a-f\\d]{3}/i.exec(hex.toString(16));\n\t\t\t\tif (!matches) {\n\t\t\t\t\treturn [0, 0, 0];\n\t\t\t\t}\n\n\t\t\t\tlet [colorString] = matches;\n\n\t\t\t\tif (colorString.length === 3) {\n\t\t\t\t\tcolorString = [...colorString].map(character => character + character).join('');\n\t\t\t\t}\n\n\t\t\t\tconst integer = Number.parseInt(colorString, 16);\n\n\t\t\t\treturn [\n\t\t\t\t\t/* eslint-disable no-bitwise */\n\t\t\t\t\t(integer >> 16) & 0xFF,\n\t\t\t\t\t(integer >> 8) & 0xFF,\n\t\t\t\t\tinteger & 0xFF,\n\t\t\t\t\t/* eslint-enable no-bitwise */\n\t\t\t\t];\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToAnsi256: {\n\t\t\tvalue: hex => styles.rgbToAnsi256(...styles.hexToRgb(hex)),\n\t\t\tenumerable: false,\n\t\t},\n\t\tansi256ToAnsi: {\n\t\t\tvalue(code) {\n\t\t\t\tif (code < 8) {\n\t\t\t\t\treturn 30 + code;\n\t\t\t\t}\n\n\t\t\t\tif (code < 16) {\n\t\t\t\t\treturn 90 + (code - 8);\n\t\t\t\t}\n\n\t\t\t\tlet red;\n\t\t\t\tlet green;\n\t\t\t\tlet blue;\n\n\t\t\t\tif (code >= 232) {\n\t\t\t\t\tred = (((code - 232) * 10) + 8) / 255;\n\t\t\t\t\tgreen = red;\n\t\t\t\t\tblue = red;\n\t\t\t\t} else {\n\t\t\t\t\tcode -= 16;\n\n\t\t\t\t\tconst remainder = code % 36;\n\n\t\t\t\t\tred = Math.floor(code / 36) / 5;\n\t\t\t\t\tgreen = Math.floor(remainder / 6) / 5;\n\t\t\t\t\tblue = (remainder % 6) / 5;\n\t\t\t\t}\n\n\t\t\t\tconst value = Math.max(red, green, blue) * 2;\n\n\t\t\t\tif (value === 0) {\n\t\t\t\t\treturn 30;\n\t\t\t\t}\n\n\t\t\t\t// eslint-disable-next-line no-bitwise\n\t\t\t\tlet result = 30 + ((Math.round(blue) << 2) | (Math.round(green) << 1) | Math.round(red));\n\n\t\t\t\tif (value === 2) {\n\t\t\t\t\tresult += 60;\n\t\t\t\t}\n\n\t\t\t\treturn result;\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\trgbToAnsi: {\n\t\t\tvalue: (red, green, blue) => styles.ansi256ToAnsi(styles.rgbToAnsi256(red, green, blue)),\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToAnsi: {\n\t\t\tvalue: hex => styles.ansi256ToAnsi(styles.hexToAnsi256(hex)),\n\t\t\tenumerable: false,\n\t\t},\n\t});\n\n\treturn styles;\n}\n\nconst ansiStyles = assembleStyles();\n\nexport default ansiStyles;\n","import process from 'node:process';\nimport os from 'node:os';\nimport tty from 'node:tty';\n\n// From: https://github.com/sindresorhus/has-flag/blob/main/index.js\n/// function hasFlag(flag, argv = globalThis.Deno?.args ?? process.argv) {\nfunction hasFlag(flag, argv = globalThis.Deno ? globalThis.Deno.args : process.argv) {\n\tconst prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--');\n\tconst position = argv.indexOf(prefix + flag);\n\tconst terminatorPosition = argv.indexOf('--');\n\treturn position !== -1 && (terminatorPosition === -1 || position < terminatorPosition);\n}\n\nconst {env} = process;\n\nlet flagForceColor;\nif (\n\thasFlag('no-color')\n\t|| hasFlag('no-colors')\n\t|| hasFlag('color=false')\n\t|| hasFlag('color=never')\n) {\n\tflagForceColor = 0;\n} else if (\n\thasFlag('color')\n\t|| hasFlag('colors')\n\t|| hasFlag('color=true')\n\t|| hasFlag('color=always')\n) {\n\tflagForceColor = 1;\n}\n\nfunction envForceColor() {\n\tif ('FORCE_COLOR' in env) {\n\t\tif (env.FORCE_COLOR === 'true') {\n\t\t\treturn 1;\n\t\t}\n\n\t\tif (env.FORCE_COLOR === 'false') {\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn env.FORCE_COLOR.length === 0 ? 1 : Math.min(Number.parseInt(env.FORCE_COLOR, 10), 3);\n\t}\n}\n\nfunction translateLevel(level) {\n\tif (level === 0) {\n\t\treturn false;\n\t}\n\n\treturn {\n\t\tlevel,\n\t\thasBasic: true,\n\t\thas256: level >= 2,\n\t\thas16m: level >= 3,\n\t};\n}\n\nfunction _supportsColor(haveStream, {streamIsTTY, sniffFlags = true} = {}) {\n\tconst noFlagForceColor = envForceColor();\n\tif (noFlagForceColor !== undefined) {\n\t\tflagForceColor = noFlagForceColor;\n\t}\n\n\tconst forceColor = sniffFlags ? flagForceColor : noFlagForceColor;\n\n\tif (forceColor === 0) {\n\t\treturn 0;\n\t}\n\n\tif (sniffFlags) {\n\t\tif (hasFlag('color=16m')\n\t\t\t|| hasFlag('color=full')\n\t\t\t|| hasFlag('color=truecolor')) {\n\t\t\treturn 3;\n\t\t}\n\n\t\tif (hasFlag('color=256')) {\n\t\t\treturn 2;\n\t\t}\n\t}\n\n\t// Check for Azure DevOps pipelines.\n\t// Has to be above the `!streamIsTTY` check.\n\tif ('TF_BUILD' in env && 'AGENT_NAME' in env) {\n\t\treturn 1;\n\t}\n\n\tif (haveStream && !streamIsTTY && forceColor === undefined) {\n\t\treturn 0;\n\t}\n\n\tconst min = forceColor || 0;\n\n\tif (env.TERM === 'dumb') {\n\t\treturn min;\n\t}\n\n\tif (process.platform === 'win32') {\n\t\t// Windows 10 build 10586 is the first Windows release that supports 256 colors.\n\t\t// Windows 10 build 14931 is the first release that supports 16m/TrueColor.\n\t\tconst osRelease = os.release().split('.');\n\t\tif (\n\t\t\tNumber(osRelease[0]) >= 10\n\t\t\t&& Number(osRelease[2]) >= 10_586\n\t\t) {\n\t\t\treturn Number(osRelease[2]) >= 14_931 ? 3 : 2;\n\t\t}\n\n\t\treturn 1;\n\t}\n\n\tif ('CI' in env) {\n\t\tif (['GITHUB_ACTIONS', 'GITEA_ACTIONS', 'CIRCLECI'].some(key => key in env)) {\n\t\t\treturn 3;\n\t\t}\n\n\t\tif (['TRAVIS', 'APPVEYOR', 'GITLAB_CI', 'BUILDKITE', 'DRONE'].some(sign => sign in env) || env.CI_NAME === 'codeship') {\n\t\t\treturn 1;\n\t\t}\n\n\t\treturn min;\n\t}\n\n\tif ('TEAMCITY_VERSION' in env) {\n\t\treturn /^(9\\.(0*[1-9]\\d*)\\.|\\d{2,}\\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0;\n\t}\n\n\tif (env.COLORTERM === 'truecolor') {\n\t\treturn 3;\n\t}\n\n\tif (env.TERM === 'xterm-kitty') {\n\t\treturn 3;\n\t}\n\n\tif (env.TERM === 'xterm-ghostty') {\n\t\treturn 3;\n\t}\n\n\tif (env.TERM === 'wezterm') {\n\t\treturn 3;\n\t}\n\n\tif ('TERM_PROGRAM' in env) {\n\t\tconst version = Number.parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10);\n\n\t\tswitch (env.TERM_PROGRAM) {\n\t\t\tcase 'iTerm.app': {\n\t\t\t\treturn version >= 3 ? 3 : 2;\n\t\t\t}\n\n\t\t\tcase 'Apple_Terminal': {\n\t\t\t\treturn 2;\n\t\t\t}\n\t\t\t// No default\n\t\t}\n\t}\n\n\tif (/-256(color)?$/i.test(env.TERM)) {\n\t\treturn 2;\n\t}\n\n\tif (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) {\n\t\treturn 1;\n\t}\n\n\tif ('COLORTERM' in env) {\n\t\treturn 1;\n\t}\n\n\treturn min;\n}\n\nexport function createSupportsColor(stream, options = {}) {\n\tconst level = _supportsColor(stream, {\n\t\tstreamIsTTY: stream && stream.isTTY,\n\t\t...options,\n\t});\n\n\treturn translateLevel(level);\n}\n\nconst supportsColor = {\n\tstdout: createSupportsColor({isTTY: tty.isatty(1)}),\n\tstderr: createSupportsColor({isTTY: tty.isatty(2)}),\n};\n\nexport default supportsColor;\n","// TODO: When targeting Node.js 16, use `String.prototype.replaceAll`.\nexport function stringReplaceAll(string, substring, replacer) {\n\tlet index = string.indexOf(substring);\n\tif (index === -1) {\n\t\treturn string;\n\t}\n\n\tconst substringLength = substring.length;\n\tlet endIndex = 0;\n\tlet returnValue = '';\n\tdo {\n\t\treturnValue += string.slice(endIndex, index) + substring + replacer;\n\t\tendIndex = index + substringLength;\n\t\tindex = string.indexOf(substring, endIndex);\n\t} while (index !== -1);\n\n\treturnValue += string.slice(endIndex);\n\treturn returnValue;\n}\n\nexport function stringEncaseCRLFWithFirstIndex(string, prefix, postfix, index) {\n\tlet endIndex = 0;\n\tlet returnValue = '';\n\tdo {\n\t\tconst gotCR = string[index - 1] === '\\r';\n\t\treturnValue += string.slice(endIndex, (gotCR ? index - 1 : index)) + prefix + (gotCR ? '\\r\\n' : '\\n') + postfix;\n\t\tendIndex = index + 1;\n\t\tindex = string.indexOf('\\n', endIndex);\n\t} while (index !== -1);\n\n\treturnValue += string.slice(endIndex);\n\treturn returnValue;\n}\n","import ansiStyles from '#ansi-styles';\nimport supportsColor from '#supports-color';\nimport { // eslint-disable-line import/order\n\tstringReplaceAll,\n\tstringEncaseCRLFWithFirstIndex,\n} from './utilities.js';\n\nconst {stdout: stdoutColor, stderr: stderrColor} = supportsColor;\n\nconst GENERATOR = Symbol('GENERATOR');\nconst STYLER = Symbol('STYLER');\nconst IS_EMPTY = Symbol('IS_EMPTY');\n\n// `supportsColor.level` → `ansiStyles.color[name]` mapping\nconst levelMapping = [\n\t'ansi',\n\t'ansi',\n\t'ansi256',\n\t'ansi16m',\n];\n\nconst styles = Object.create(null);\n\nconst applyOptions = (object, options = {}) => {\n\tif (options.level && !(Number.isInteger(options.level) && options.level >= 0 && options.level <= 3)) {\n\t\tthrow new Error('The `level` option should be an integer from 0 to 3');\n\t}\n\n\t// Detect level if not set manually\n\tconst colorLevel = stdoutColor ? stdoutColor.level : 0;\n\tobject.level = options.level === undefined ? colorLevel : options.level;\n};\n\nexport class Chalk {\n\tconstructor(options) {\n\t\t// eslint-disable-next-line no-constructor-return\n\t\treturn chalkFactory(options);\n\t}\n}\n\nconst chalkFactory = options => {\n\tconst chalk = (...strings) => strings.join(' ');\n\tapplyOptions(chalk, options);\n\n\tObject.setPrototypeOf(chalk, createChalk.prototype);\n\n\treturn chalk;\n};\n\nfunction createChalk(options) {\n\treturn chalkFactory(options);\n}\n\nObject.setPrototypeOf(createChalk.prototype, Function.prototype);\n\nfor (const [styleName, style] of Object.entries(ansiStyles)) {\n\tstyles[styleName] = {\n\t\tget() {\n\t\t\tconst builder = createBuilder(this, createStyler(style.open, style.close, this[STYLER]), this[IS_EMPTY]);\n\t\t\tObject.defineProperty(this, styleName, {value: builder});\n\t\t\treturn builder;\n\t\t},\n\t};\n}\n\nstyles.visible = {\n\tget() {\n\t\tconst builder = createBuilder(this, this[STYLER], true);\n\t\tObject.defineProperty(this, 'visible', {value: builder});\n\t\treturn builder;\n\t},\n};\n\nconst getModelAnsi = (model, level, type, ...arguments_) => {\n\tif (model === 'rgb') {\n\t\tif (level === 'ansi16m') {\n\t\t\treturn ansiStyles[type].ansi16m(...arguments_);\n\t\t}\n\n\t\tif (level === 'ansi256') {\n\t\t\treturn ansiStyles[type].ansi256(ansiStyles.rgbToAnsi256(...arguments_));\n\t\t}\n\n\t\treturn ansiStyles[type].ansi(ansiStyles.rgbToAnsi(...arguments_));\n\t}\n\n\tif (model === 'hex') {\n\t\treturn getModelAnsi('rgb', level, type, ...ansiStyles.hexToRgb(...arguments_));\n\t}\n\n\treturn ansiStyles[type][model](...arguments_);\n};\n\nconst usedModels = ['rgb', 'hex', 'ansi256'];\n\nfor (const model of usedModels) {\n\tstyles[model] = {\n\t\tget() {\n\t\t\tconst {level} = this;\n\t\t\treturn function (...arguments_) {\n\t\t\t\tconst styler = createStyler(getModelAnsi(model, levelMapping[level], 'color', ...arguments_), ansiStyles.color.close, this[STYLER]);\n\t\t\t\treturn createBuilder(this, styler, this[IS_EMPTY]);\n\t\t\t};\n\t\t},\n\t};\n\n\tconst bgModel = 'bg' + model[0].toUpperCase() + model.slice(1);\n\tstyles[bgModel] = {\n\t\tget() {\n\t\t\tconst {level} = this;\n\t\t\treturn function (...arguments_) {\n\t\t\t\tconst styler = createStyler(getModelAnsi(model, levelMapping[level], 'bgColor', ...arguments_), ansiStyles.bgColor.close, this[STYLER]);\n\t\t\t\treturn createBuilder(this, styler, this[IS_EMPTY]);\n\t\t\t};\n\t\t},\n\t};\n}\n\nconst proto = Object.defineProperties(() => {}, {\n\t...styles,\n\tlevel: {\n\t\tenumerable: true,\n\t\tget() {\n\t\t\treturn this[GENERATOR].level;\n\t\t},\n\t\tset(level) {\n\t\t\tthis[GENERATOR].level = level;\n\t\t},\n\t},\n});\n\nconst createStyler = (open, close, parent) => {\n\tlet openAll;\n\tlet closeAll;\n\tif (parent === undefined) {\n\t\topenAll = open;\n\t\tcloseAll = close;\n\t} else {\n\t\topenAll = parent.openAll + open;\n\t\tcloseAll = close + parent.closeAll;\n\t}\n\n\treturn {\n\t\topen,\n\t\tclose,\n\t\topenAll,\n\t\tcloseAll,\n\t\tparent,\n\t};\n};\n\nconst createBuilder = (self, _styler, _isEmpty) => {\n\t// Single argument is hot path, implicit coercion is faster than anything\n\t// eslint-disable-next-line no-implicit-coercion\n\tconst builder = (...arguments_) => applyStyle(builder, (arguments_.length === 1) ? ('' + arguments_[0]) : arguments_.join(' '));\n\n\t// We alter the prototype because we must return a function, but there is\n\t// no way to create a function with a different prototype\n\tObject.setPrototypeOf(builder, proto);\n\n\tbuilder[GENERATOR] = self;\n\tbuilder[STYLER] = _styler;\n\tbuilder[IS_EMPTY] = _isEmpty;\n\n\treturn builder;\n};\n\nconst applyStyle = (self, string) => {\n\tif (self.level <= 0 || !string) {\n\t\treturn self[IS_EMPTY] ? '' : string;\n\t}\n\n\tlet styler = self[STYLER];\n\n\tif (styler === undefined) {\n\t\treturn string;\n\t}\n\n\tconst {openAll, closeAll} = styler;\n\tif (string.includes('\\u001B')) {\n\t\twhile (styler !== undefined) {\n\t\t\t// Replace any instances already present with a re-opening code\n\t\t\t// otherwise only the part of the string until said closing code\n\t\t\t// will be colored, and the rest will simply be 'plain'.\n\t\t\tstring = stringReplaceAll(string, styler.close, styler.open);\n\n\t\t\tstyler = styler.parent;\n\t\t}\n\t}\n\n\t// We can move both next actions out of loop, because remaining actions in loop won't have\n\t// any/visible effect on parts we add here. Close the styling before a linebreak and reopen\n\t// after next line to fix a bleed issue on macOS: https://github.com/chalk/chalk/pull/92\n\tconst lfIndex = string.indexOf('\\n');\n\tif (lfIndex !== -1) {\n\t\tstring = stringEncaseCRLFWithFirstIndex(string, closeAll, openAll, lfIndex);\n\t}\n\n\treturn openAll + string + closeAll;\n};\n\nObject.defineProperties(createChalk.prototype, styles);\n\nconst chalk = createChalk();\nexport const chalkStderr = createChalk({level: stderrColor ? stderrColor.level : 0});\n\nexport {\n\tmodifierNames,\n\tforegroundColorNames,\n\tbackgroundColorNames,\n\tcolorNames,\n\n\t// TODO: Remove these aliases in the next major version\n\tmodifierNames as modifiers,\n\tforegroundColorNames as foregroundColors,\n\tbackgroundColorNames as backgroundColors,\n\tcolorNames as colors,\n} from './vendor/ansi-styles/index.js';\n\nexport {\n\tstdoutColor as supportsColor,\n\tstderrColor as supportsColorStderr,\n};\n\nexport default chalk;\n","/**\n * Wallet Funding Utilities\n * \n * Provides robust wallet funding strategies that don't depend solely on unreliable devnet airdrops.\n * Supports multiple funding strategies with automatic fallback mechanisms.\n */\n\nimport type { \n Address, \n KeyPairSigner, \n Commitment\n} from '@solana/kit'\nimport { \n generateKeyPairSigner,\n createSolanaRpc,\n createKeyPairSignerFromBytes,\n pipe,\n createTransactionMessage,\n setTransactionMessageFeePayer,\n setTransactionMessageLifetimeUsingBlockhash,\n appendTransactionMessageInstructions,\n signTransactionMessageWithSigners,\n getBase64EncodedWireTransaction,\n lamports\n} from '@solana/kit'\nimport { getTransferSolInstruction } from '@solana-program/system'\nimport { promises as fs } from 'fs'\nimport chalk from 'chalk'\nimport bs58 from 'bs58'\n\n/**\n * Funding strategy options\n */\nexport interface FundingStrategyOptions {\n /** Target amount in lamports */\n amount: bigint\n /** Minimum amount required (if less, will try to top up) */\n minAmount?: bigint\n /** Maximum retries for airdrop */\n maxRetries?: number\n /** Delay between retries in ms */\n retryDelay?: number\n /** Use treasury wallet if available */\n useTreasury?: boolean\n /** Treasury wallet path or signer */\n treasuryWallet?: string | KeyPairSigner\n /** Additional funded wallets to try */\n fundedWallets?: (string | KeyPairSigner)[]\n /** Log funding attempts */\n verbose?: boolean\n}\n\n/**\n * Funding result\n */\nexport interface FundingResult {\n /** Whether funding was successful */\n success: boolean\n /** Final balance after funding */\n balance: bigint\n /** Funding method used */\n method: 'airdrop' | 'treasury' | 'funded-wallet' | 'existing'\n /** Number of attempts made */\n attempts: number\n /** Error if funding failed */\n error?: string\n /** Transaction signature if transfer was made */\n signature?: string\n}\n\n/**\n * Wallet funding utility with multiple strategies\n */\nexport class WalletFundingService {\n private rpc: ReturnType<typeof createSolanaRpc>\n private commitment: Commitment = 'confirmed'\n private isDevnetUrl: boolean\n\n constructor(rpcUrl: string, commitment: Commitment = 'confirmed') {\n // Check if this is a devnet URL\n this.isDevnetUrl = rpcUrl.includes('devnet')\n \n // Create RPC client\n this.rpc = createSolanaRpc(rpcUrl)\n \n this.commitment = commitment\n }\n\n /**\n * Fund a wallet using multiple strategies\n */\n async fundWallet(\n targetWallet: Address,\n options: FundingStrategyOptions\n ): Promise<FundingResult> {\n const {\n amount,\n minAmount = amount,\n maxRetries = 3,\n retryDelay = 2000,\n useTreasury = true,\n treasuryWallet,\n fundedWallets = [],\n verbose = false\n } = options\n\n const log = (message: string) => {\n if (verbose) {\n console.log(chalk.gray(`[WalletFunding] ${message}`))\n }\n }\n\n let attempts = 0\n\n try {\n // First check existing balance\n const currentBalance = await this.getBalance(targetWallet)\n log(`Current balance: ${this.formatSol(currentBalance)} SOL`)\n\n if (currentBalance >= minAmount) {\n log(`Wallet already has sufficient balance`)\n return {\n success: true,\n balance: currentBalance,\n method: 'existing',\n attempts: 0\n }\n }\n\n const needed = amount - currentBalance\n log(`Need to fund: ${this.formatSol(needed)} SOL`)\n\n // Strategy 1: Try devnet airdrop first\n if (this.isDevnetUrl && 'requestAirdrop' in this.rpc) {\n log(`Attempting devnet airdrop...`)\n const airdropResult = await this.tryAirdrop(\n targetWallet,\n needed,\n maxRetries,\n retryDelay,\n verbose\n )\n \n if (airdropResult.success) {\n const finalBalance = await this.getBalance(targetWallet)\n return {\n success: true,\n balance: finalBalance,\n method: 'airdrop',\n attempts: airdropResult.attempts,\n signature: airdropResult.signature\n }\n }\n \n attempts += airdropResult.attempts\n log(`Airdrop failed after ${airdropResult.attempts} attempts`)\n }\n\n // Strategy 2: Try treasury wallet\n if (useTreasury && treasuryWallet) {\n log(`Attempting treasury wallet funding...`)\n const treasuryResult = await this.tryTreasuryFunding(\n targetWallet,\n needed,\n treasuryWallet,\n verbose\n )\n \n if (treasuryResult.success) {\n const finalBalance = await this.getBalance(targetWallet)\n return {\n success: true,\n balance: finalBalance,\n method: 'treasury',\n attempts: attempts + 1,\n signature: treasuryResult.signature\n }\n }\n \n attempts++\n log(`Treasury funding failed: ${treasuryResult.error}`)\n }\n\n // Strategy 3: Try other funded wallets\n for (const fundedWallet of fundedWallets) {\n log(`Attempting funding from additional wallet...`)\n const fundedResult = await this.tryFundedWalletTransfer(\n targetWallet,\n needed,\n fundedWallet,\n verbose\n )\n \n if (fundedResult.success) {\n const finalBalance = await this.getBalance(targetWallet)\n return {\n success: true,\n balance: finalBalance,\n method: 'funded-wallet',\n attempts: attempts + 1,\n signature: fundedResult.signature\n }\n }\n \n attempts++\n log(`Funded wallet transfer failed: ${fundedResult.error}`)\n }\n\n // All strategies failed\n throw new Error('All funding strategies failed')\n\n } catch (error) {\n return {\n success: false,\n balance: await this.getBalance(targetWallet),\n method: 'airdrop',\n attempts,\n error: error instanceof Error ? error.message : 'Unknown error'\n }\n }\n }\n\n /**\n * Try to fund using devnet airdrop with retries\n */\n private async tryAirdrop(\n targetWallet: Address,\n amount: bigint,\n maxRetries: number,\n retryDelay: number,\n verbose: boolean\n ): Promise<{ success: boolean; attempts: number; signature?: string; error?: string }> {\n // Type guard to ensure we have a devnet RPC\n if (!('requestAirdrop' in this.rpc)) {\n return {\n success: false,\n attempts: 0,\n error: 'Airdrop not available on this network'\n }\n }\n\n let attempts = 0\n\n for (let i = 0; i < maxRetries; i++) {\n attempts++\n \n try {\n const airdropResponse = await this.rpc\n .requestAirdrop(targetWallet, lamports(amount), { commitment: this.commitment })\n .send()\n \n // The response is the signature directly\n const signature = airdropResponse\n \n if (verbose) {\n console.log(chalk.gray(`[WalletFunding] Airdrop requested: ${signature}`))\n }\n\n // Get latest blockhash for confirmation\n await this.rpc.getLatestBlockhash().send()\n\n // Wait for confirmation using getSignatureStatuses\n let confirmed = false\n const maxAttempts = 30\n for (let i = 0; i < maxAttempts; i++) {\n const statusResponse = await this.rpc\n .getSignatureStatuses([signature])\n .send()\n \n const status = statusResponse.value[0]\n if (status && status.confirmationStatus === 'confirmed') {\n confirmed = true\n break\n }\n \n await new Promise(resolve => setTimeout(resolve, 1000))\n }\n\n // Additional wait to ensure balance is updated\n await new Promise(resolve => setTimeout(resolve, 1000))\n\n if (!confirmed) {\n throw new Error('Airdrop confirmation timeout')\n }\n\n return {\n success: true,\n attempts,\n signature\n }\n } catch (error) {\n if (verbose) {\n console.log(chalk.gray(`[WalletFunding] Airdrop attempt ${attempts} failed: ${error}`))\n }\n \n if (i < maxRetries - 1) {\n await new Promise(resolve => setTimeout(resolve, retryDelay))\n }\n }\n }\n\n return {\n success: false,\n attempts,\n error: 'Max retries exceeded'\n }\n }\n\n /**\n * Try to fund from treasury wallet\n */\n private async tryTreasuryFunding(\n targetWallet: Address,\n amount: bigint,\n treasuryWallet: string | KeyPairSigner,\n verbose: boolean\n ): Promise<{ success: boolean; signature?: string; error?: string }> {\n try {\n const treasurySigner = await this.loadWallet(treasuryWallet)\n const treasuryBalance = await this.getBalance(treasurySigner.address)\n\n if (verbose) {\n console.log(chalk.gray(`[WalletFunding] Treasury balance: ${this.formatSol(treasuryBalance)} SOL`))\n }\n\n if (treasuryBalance < amount + BigInt(5000)) { // Keep 5000 lamports for fees\n return {\n success: false,\n error: 'Insufficient treasury balance'\n }\n }\n\n const signature = await this.transferSol(\n treasurySigner,\n targetWallet,\n amount,\n verbose\n )\n\n return {\n success: true,\n signature\n }\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error'\n }\n }\n }\n\n /**\n * Try to fund from another funded wallet\n */\n private async tryFundedWalletTransfer(\n targetWallet: Address,\n amount: bigint,\n fundedWallet: string | KeyPairSigner,\n verbose: boolean\n ): Promise<{ success: boolean; signature?: string; error?: string }> {\n try {\n const signer = await this.loadWallet(fundedWallet)\n const balance = await this.getBalance(signer.address)\n\n if (verbose) {\n console.log(chalk.gray(`[WalletFunding] Funded wallet balance: ${this.formatSol(balance)} SOL`))\n }\n\n if (balance < amount + BigInt(5000)) { // Keep 5000 lamports for fees\n return {\n success: false,\n error: 'Insufficient wallet balance'\n }\n }\n\n const signature = await this.transferSol(\n signer,\n targetWallet,\n amount,\n verbose\n )\n\n return {\n success: true,\n signature\n }\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error'\n }\n }\n }\n\n /**\n * Transfer SOL from one wallet to another\n */\n private async transferSol(\n from: KeyPairSigner,\n to: Address,\n amount: bigint,\n verbose: boolean\n ): Promise<string> {\n const { value: latestBlockhash } = await this.rpc.getLatestBlockhash().send()\n \n const transferInstruction = getTransferSolInstruction({\n source: from,\n destination: to,\n amount\n })\n\n const message = pipe(\n createTransactionMessage({ version: 0 }),\n tx => setTransactionMessageFeePayer(from.address, tx),\n tx => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, tx),\n tx => appendTransactionMessageInstructions([transferInstruction], tx)\n )\n\n const signedTransaction = await signTransactionMessageWithSigners(message)\n const base64Transaction = getBase64EncodedWireTransaction(signedTransaction)\n \n const sendResult = await this.rpc\n .sendTransaction(base64Transaction, { \n skipPreflight: false,\n preflightCommitment: this.commitment,\n maxRetries: BigInt(5)\n })\n .send()\n \n // sendTransaction returns the signature directly\n const signature = sendResult\n\n if (verbose) {\n console.log(chalk.gray(`[WalletFunding] Transfer sent: ${signature}`))\n }\n\n // Wait for confirmation using getSignatureStatuses\n let confirmed = false\n const maxAttempts = 30\n for (let i = 0; i < maxAttempts; i++) {\n const statusResponse = await this.rpc\n .getSignatureStatuses([signature])\n .send()\n \n const status = statusResponse.value[0]\n if (status && status.confirmationStatus === 'confirmed') {\n confirmed = true\n break\n }\n \n await new Promise(resolve => setTimeout(resolve, 1000))\n }\n \n if (!confirmed) {\n throw new Error('Transaction confirmation timeout')\n }\n\n return signature\n }\n\n /**\n * Load wallet from path or return existing signer\n */\n private async loadWallet(walletSource: string | KeyPairSigner): Promise<KeyPairSigner> {\n if (typeof walletSource !== 'string') {\n return walletSource\n }\n\n // Check if it's an environment variable\n const envValue = process.env[walletSource]\n if (envValue) {\n // Try to parse as JSON array\n try {\n const walletData = JSON.parse(envValue) as number[]\n return await createKeyPairSignerFromBytes(new Uint8Array(walletData))\n } catch {\n // Try as base58 private key\n try {\n const privateKeyBytes = bs58.decode(envValue)\n // Solana private keys can be 32 bytes (seed) or 64 bytes (full keypair)\n if (privateKeyBytes.length === 32 || privateKeyBytes.length === 64) {\n return await createKeyPairSignerFromBytes(privateKeyBytes)\n }\n throw new Error('Invalid base58 private key length')\n } catch (error) {\n throw new Error(`Failed to load wallet from base58 key: ${error instanceof Error ? error.message : 'Unknown error'}`)\n }\n }\n }\n\n // Load from file\n const walletData = JSON.parse(await fs.readFile(walletSource, 'utf-8')) as number[]\n return createKeyPairSignerFromBytes(new Uint8Array(walletData))\n }\n\n /**\n * Load wallet from base58 private key\n */\n static async loadWalletFromBase58(base58PrivateKey: string): Promise<KeyPairSigner> {\n try {\n const privateKeyBytes = bs58.decode(base58PrivateKey)\n // Solana private keys can be 32 bytes (seed) or 64 bytes (full keypair)\n if (privateKeyBytes.length === 32 || privateKeyBytes.length === 64) {\n return await createKeyPairSignerFromBytes(privateKeyBytes)\n }\n throw new Error(`Invalid private key length: ${privateKeyBytes.length} bytes. Expected 32 or 64 bytes.`)\n } catch (error) {\n if (error instanceof Error && error.message.includes('Invalid private key length')) {\n throw error\n }\n throw new Error(`Failed to decode base58 private key: ${error instanceof Error ? error.message : 'Unknown error'}`)\n }\n }\n\n /**\n * Get wallet balance\n */\n async getBalance(wallet: Address): Promise<bigint> {\n const response = await this.rpc\n .getBalance(wallet, { commitment: this.commitment })\n .send()\n return response.value\n }\n\n /**\n * Check if connected to devnet\n */\n private async isDevnet(): Promise<boolean> {\n try {\n const response = await this.rpc.getGenesisHash().send()\n // Devnet genesis hash - response is the hash string directly\n return await Promise.resolve(response === 'EtWTRABZaYq6iMfeYKouRu166VU2xqa1wcaWoxPkrZBG')\n } catch {\n return false\n }\n }\n\n /**\n * Format lamports as SOL\n */\n private formatSol(lamports: bigint): string {\n return (Number(lamports) / 1_000_000_000).toFixed(4)\n }\n\n /**\n * Create and fund multiple test wallets\n */\n async createAndFundTestWallets(\n count: number,\n amountPerWallet: bigint,\n options: Omit<FundingStrategyOptions, 'amount'>\n ): Promise<KeyPairSigner[]> {\n const wallets: KeyPairSigner[] = []\n\n console.log(chalk.cyan(`Creating and funding ${count} test wallets...`))\n\n for (let i = 0; i < count; i++) {\n const wallet = await generateKeyPairSigner()\n \n console.log(chalk.gray(`Wallet ${i + 1}: ${wallet.address}`))\n \n const result = await this.fundWallet(wallet.address, {\n ...options,\n amount: amountPerWallet\n })\n\n if (result.success) {\n wallets.push(wallet)\n console.log(chalk.green(`✅ Funded with ${this.formatSol(result.balance)} SOL via ${result.method}`))\n } else {\n console.log(chalk.red(`❌ Failed to fund: ${result.error}`))\n }\n }\n\n return wallets\n }\n\n /**\n * Ensure minimum balance for a wallet\n */\n async ensureMinimumBalance(\n wallet: Address,\n minBalance: bigint,\n options?: Partial<FundingStrategyOptions>\n ): Promise<FundingResult> {\n const currentBalance = await this.getBalance(wallet)\n \n if (currentBalance >= minBalance) {\n return {\n success: true,\n balance: currentBalance,\n method: 'existing',\n attempts: 0\n }\n }\n\n const needed = minBalance - currentBalance\n return this.fundWallet(wallet, {\n amount: needed,\n minAmount: minBalance,\n ...options\n })\n }\n}\n\n/**\n * Default funding service instance for devnet\n */\nexport const defaultFundingService = new WalletFundingService(\n process.env.GHOSTSPEAK_RPC_URL ?? 'https://api.devnet.solana.com'\n)\n\n/**\n * Quick helper to fund a wallet with default settings\n */\nexport async function fundWallet(\n wallet: Address,\n amountInSol: number,\n options?: Partial<FundingStrategyOptions>\n): Promise<FundingResult> {\n return defaultFundingService.fundWallet(wallet, {\n amount: BigInt(Math.floor(amountInSol * 1_000_000_000)),\n ...options\n })\n}\n\n/**\n * Quick helper to ensure minimum balance\n */\nexport async function ensureMinimumBalance(\n wallet: Address,\n minBalanceInSol: number,\n options?: Partial<FundingStrategyOptions>\n): Promise<FundingResult> {\n return defaultFundingService.ensureMinimumBalance(\n wallet,\n BigInt(Math.floor(minBalanceInSol * 1_000_000_000)),\n options\n )\n}","/**\n * Private Metadata Storage\n * \n * Handles off-chain storage of encrypted data with on-chain references.\n * Supports IPFS and other storage backends for private data while\n * maintaining on-chain integrity verification.\n */\n\nimport { sha256 } from '@noble/hashes/sha256'\nimport { bytesToHex, hexToBytes } from '@noble/curves/abstract/utils'\nimport type { Address } from '@solana/kit'\n\nimport {\n ClientEncryptionService,\n type EncryptedData,\n type PrivateMetadata\n} from './client-encryption.js'\n\nimport { getFeatureFlags } from './feature-flags.js'\n\n// =====================================================\n// TYPES\n// =====================================================\n\nexport interface StorageProvider {\n store(data: Uint8Array): Promise<string>\n retrieve(hash: string): Promise<Uint8Array>\n delete(hash: string): Promise<boolean>\n}\n\nexport interface StoredPrivateData {\n /** On-chain reference hash */\n onChainHash: Uint8Array\n \n /** Storage provider identifier */\n storageProvider: 'ipfs' | 'arweave' | 'custom'\n \n /** Storage location (IPFS hash, Arweave ID, etc) */\n storageLocation: string\n \n /** Encryption metadata */\n encryptionMetadata: {\n version: number\n publicKey: Uint8Array\n timestamp: number\n }\n \n /** Size of stored data */\n size: number\n \n /** Content type hint */\n contentType?: string\n}\n\nexport interface PrivateDataReference {\n /** Account storing the reference */\n account: Address\n \n /** Storage details */\n storage: StoredPrivateData\n \n /** Access control */\n accessControl: {\n owner: Address\n allowedReaders: Address[]\n expiresAt?: number\n }\n}\n\n// =====================================================\n// STORAGE PROVIDERS\n// =====================================================\n\n/**\n * Real IPFS storage provider using kubo-rpc-client (2025)\n * Connects to actual IPFS nodes for production use\n * \n * SECURITY NOTICE (Kluster MCP): \n * - All data stored is encrypted client-side before IPFS upload\n * - Use private IPFS networks for sensitive production data\n * - Implement proper key management and rotation policies\n * - Monitor for unauthorized access patterns\n */\nexport class IPFSProvider implements StorageProvider {\n private client: any\n private readonly isPrivateNetwork: boolean\n \n constructor(options?: { \n ipfsNodeUrl?: string; \n headers?: Record<string, string>;\n usePrivateNetwork?: boolean;\n }) {\n // Dynamic import to avoid bundling issues\n const createClient = require('kubo-rpc-client').create\n \n // Add null checks and validation for IPFS client options\n const ipfsNodeUrl = options?.ipfsNodeUrl || 'http://localhost:5001'\n const headers = options?.headers || {}\n this.isPrivateNetwork = options?.usePrivateNetwork || false\n \n // Validate IPFS node URL format\n try {\n new URL(ipfsNodeUrl)\n } catch (error) {\n throw new Error(`Invalid IPFS node URL provided: ${ipfsNodeUrl}`)\n }\n \n // Security validation for production use\n if (!this.isPrivateNetwork && ipfsNodeUrl.includes('localhost')) {\n console.warn('SECURITY WARNING: Using localhost IPFS node in production. Consider using a private IPFS network.')\n }\n \n // Validate headers object\n if (typeof headers !== 'object' || headers === null) {\n throw new Error('Headers must be a valid object')\n }\n \n this.client = createClient({\n url: ipfsNodeUrl,\n headers\n })\n \n if (!this.client) {\n throw new Error('Failed to create IPFS client - kubo-rpc-client returned null')\n }\n }\n \n async store(data: Uint8Array): Promise<string> {\n try {\n // Security check: Validate data size to prevent abuse\n if (data.length > 10 * 1024 * 1024) { // 10MB limit\n throw new Error('Data size exceeds maximum allowed limit (10MB)')\n }\n \n // Security check: Ensure data appears encrypted (basic validation)\n if (!this.isPrivateNetwork && this.isDataUnencrypted(data)) {\n console.warn('SECURITY WARNING: Data appears to be unencrypted. Ensure client-side encryption is applied.')\n }\n \n const result = await this.client.add(data, {\n pin: true, // Pin to ensure persistence\n cidVersion: 1 // Use CIDv1 for better compatibility\n })\n return result.cid.toString()\n } catch (error) {\n throw new Error(`Failed to store data to IPFS: ${error instanceof Error ? error.message : String(error)}`)\n }\n }\n \n /**\n * Basic heuristic to detect potentially unencrypted data\n * This is not foolproof but can catch obvious cases\n */\n private isDataUnencrypted(data: Uint8Array): boolean {\n // Check for common unencrypted patterns\n const text = new TextDecoder('utf-8', { fatal: false }).decode(data.slice(0, 100))\n const commonPatterns = ['{', '<', 'BEGIN', 'name', 'address', 'email', 'password']\n return commonPatterns.some(pattern => text.toLowerCase().includes(pattern.toLowerCase()))\n }\n \n async retrieve(hash: string): Promise<Uint8Array> {\n try {\n const chunks: Uint8Array[] = []\n for await (const chunk of this.client.cat(hash)) {\n chunks.push(chunk)\n }\n \n // Concatenate all chunks\n const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0)\n const result = new Uint8Array(totalLength)\n let offset = 0\n for (const chunk of chunks) {\n result.set(chunk, offset)\n offset += chunk.length\n }\n \n return result\n } catch (error) {\n throw new Error(`Failed to retrieve data from IPFS: ${error instanceof Error ? error.message : String(error)}`)\n }\n }\n \n async delete(hash: string): Promise<boolean> {\n try {\n await this.client.pin.rm(hash)\n return true\n } catch (error) {\n // Pin removal might fail if not pinned - this is a non-critical error\n // Log as warning but don't throw since the data might not have been pinned\n console.warn(`IPFS unpin warning for ${hash}: ${error instanceof Error ? error.message : String(error)}`)\n return false // Return false to indicate pin removal didn't happen, but don't fail\n }\n }\n}\n\n/**\n * Local storage provider (for development)\n */\nexport class LocalStorageProvider implements StorageProvider {\n private prefix = 'ghostspeak_private_'\n \n async store(data: Uint8Array): Promise<string> {\n const hash = bytesToHex(sha256(data))\n globalThis.localStorage.setItem(this.prefix + hash, bytesToHex(data))\n return hash\n }\n \n async retrieve(hash: string): Promise<Uint8Array> {\n const hex = globalThis.localStorage.getItem(this.prefix + hash)\n if (hex) {\n return hexToBytes(hex)\n }\n throw new Error(`Data not found: ${hash}`)\n }\n \n async delete(hash: string): Promise<boolean> {\n globalThis.localStorage.removeItem(this.prefix + hash)\n return true\n }\n}\n\n// =====================================================\n// PRIVATE METADATA STORAGE SERVICE\n// =====================================================\n\nexport class PrivateMetadataStorage {\n private encryptionService: ClientEncryptionService\n private storageProvider: StorageProvider\n private featureFlags = getFeatureFlags()\n \n constructor(\n storageProvider?: StorageProvider,\n encryptionService?: ClientEncryptionService\n ) {\n this.storageProvider = storageProvider ?? new IPFSProvider()\n this.encryptionService = encryptionService ?? new ClientEncryptionService()\n }\n \n /**\n * Store private data off-chain with on-chain reference\n */\n async storePrivateData(\n data: Record<string, unknown>,\n publicMetadata: Record<string, unknown>,\n recipientPubkey: Uint8Array\n ): Promise<StoredPrivateData> {\n // Check if IPFS storage is enabled\n if (!this.featureFlags.isEnabled('ENABLE_IPFS_STORAGE')) {\n throw new Error('IPFS storage is not enabled')\n }\n \n // Create private metadata\n const privateMetadata = await this.encryptionService.createPrivateMetadata(\n data,\n publicMetadata,\n recipientPubkey\n )\n \n // Serialize for storage\n const serialized = this.serializePrivateMetadata(privateMetadata)\n \n // Store in IPFS (or other provider)\n const storageLocation = await this.storageProvider.store(serialized)\n \n // Create on-chain reference\n const onChainHash = this.createOnChainHash(privateMetadata, storageLocation)\n \n return {\n onChainHash,\n storageProvider: 'ipfs',\n storageLocation,\n encryptionMetadata: {\n version: privateMetadata.encrypted.version,\n publicKey: privateMetadata.encrypted.publicKey,\n timestamp: privateMetadata.encrypted.timestamp\n },\n size: serialized.length,\n contentType: 'application/json'\n }\n }\n \n /**\n * Retrieve private data from off-chain storage\n */\n async retrievePrivateData(\n reference: StoredPrivateData,\n secretKey: Uint8Array\n ): Promise<{\n privateData: Record<string, unknown>\n publicData: Record<string, unknown>\n }> {\n // Retrieve from storage\n const serialized = await this.storageProvider.retrieve(reference.storageLocation)\n \n // Verify integrity\n const expectedHash = this.createOnChainHash(\n this.deserializePrivateMetadata(serialized),\n reference.storageLocation\n )\n \n if (bytesToHex(expectedHash) !== bytesToHex(reference.onChainHash)) {\n throw new Error('Data integrity check failed')\n }\n \n // Deserialize\n const metadata = this.deserializePrivateMetadata(serialized)\n \n // Decrypt private data\n const decryptedBytes = await this.decryptPrivateData(\n metadata.encrypted,\n secretKey\n )\n \n const privateData = JSON.parse(new TextDecoder().decode(decryptedBytes)) as Record<string, unknown>\n \n return {\n privateData,\n publicData: metadata.public\n }\n }\n \n /**\n * Create a verifiable link between on-chain and off-chain data\n */\n createVerifiableLink(\n onChainData: Record<string, unknown>,\n offChainReference: StoredPrivateData\n ): Uint8Array {\n const combined = {\n onChain: onChainData,\n offChain: {\n hash: bytesToHex(offChainReference.onChainHash),\n location: offChainReference.storageLocation,\n provider: offChainReference.storageProvider\n },\n timestamp: Date.now()\n }\n \n return sha256(new TextEncoder().encode(JSON.stringify(combined)))\n }\n \n /**\n * Batch store multiple private data items\n */\n async batchStore(\n items: {\n data: Record<string, unknown>\n publicMetadata: Record<string, unknown>\n recipientPubkey: Uint8Array\n }[]\n ): Promise<StoredPrivateData[]> {\n const results: StoredPrivateData[] = []\n \n for (const item of items) {\n const stored = await this.storePrivateData(\n item.data,\n item.publicMetadata,\n item.recipientPubkey\n )\n results.push(stored)\n }\n \n return results\n }\n \n // =====================================================\n // PRIVATE METHODS\n // =====================================================\n \n private serializePrivateMetadata(metadata: PrivateMetadata): Uint8Array {\n const json = JSON.stringify({\n encrypted: {\n ciphertext: {\n commitment: bytesToHex(metadata.encrypted.ciphertext.commitment.commitment),\n handle: bytesToHex(metadata.encrypted.ciphertext.handle.handle)\n },\n publicKey: bytesToHex(metadata.encrypted.publicKey),\n commitment: bytesToHex(metadata.encrypted.commitment),\n timestamp: metadata.encrypted.timestamp,\n version: metadata.encrypted.version\n },\n public: metadata.public,\n storageHash: bytesToHex(metadata.storageHash),\n ipfsHash: metadata.ipfsHash\n })\n \n return new TextEncoder().encode(json)\n }\n \n private deserializePrivateMetadata(data: Uint8Array): PrivateMetadata {\n const json = JSON.parse(new TextDecoder().decode(data)) as {\n encrypted: {\n ciphertext: {\n commitment: string\n handle: string\n }\n publicKey: string\n commitment: string\n timestamp: number\n version: number\n }\n public: Record<string, unknown>\n storageHash: string\n ipfsHash?: string\n }\n \n return {\n encrypted: {\n ciphertext: {\n commitment: {\n commitment: hexToBytes(json.encrypted.ciphertext.commitment)\n },\n handle: {\n handle: hexToBytes(json.encrypted.ciphertext.handle)\n }\n },\n publicKey: hexToBytes(json.encrypted.publicKey),\n commitment: hexToBytes(json.encrypted.commitment),\n timestamp: json.encrypted.timestamp,\n version: json.encrypted.version\n },\n public: json.public,\n storageHash: hexToBytes(json.storageHash),\n ipfsHash: json.ipfsHash\n }\n }\n \n private createOnChainHash(\n metadata: PrivateMetadata,\n storageLocation: string\n ): Uint8Array {\n const data = {\n storageHash: bytesToHex(metadata.storageHash),\n storageLocation,\n commitment: bytesToHex(metadata.encrypted.commitment),\n timestamp: metadata.encrypted.timestamp\n }\n \n return sha256(new TextEncoder().encode(JSON.stringify(data)))\n }\n \n private async decryptPrivateData(\n encrypted: EncryptedData,\n secretKey: Uint8Array\n ): Promise<Uint8Array> {\n // TODO(encryption): Implement full decryption when encryption service supports generic data\n // For now, decrypt the amount and serialize it\n // This is a limitation of current ElGamal implementation which only supports amounts\n const decryptedAmount = await this.encryptionService.decryptAmount(encrypted, secretKey)\n return new TextEncoder().encode(JSON.stringify({ amount: decryptedAmount.toString() }))\n }\n}\n\n// =====================================================\n// PRIVACY-PRESERVING QUERIES\n// =====================================================\n\n/**\n * Query builder for private data\n */\nexport class PrivateDataQuery {\n private conditions: {\n field: string\n operator: 'eq' | 'gt' | 'lt' | 'contains'\n value: unknown\n encrypted: boolean\n }[] = []\n \n where(field: string, operator: 'eq' | 'gt' | 'lt' | 'contains', value: unknown): this {\n this.conditions.push({ field, operator, value, encrypted: false })\n return this\n }\n \n whereEncrypted(field: string, commitment: Uint8Array): this {\n this.conditions.push({\n field,\n operator: 'eq',\n value: commitment,\n encrypted: true\n })\n return this\n }\n \n /**\n * Execute query against encrypted data\n * Note: This is limited compared to on-chain queries\n */\n async execute(\n storage: PrivateMetadataStorage,\n references: StoredPrivateData[]\n ): Promise<StoredPrivateData[]> {\n // For encrypted fields, we can only match by commitment\n // This is a privacy-preserving but limited query capability\n const results: StoredPrivateData[] = []\n \n for (const ref of references) {\n let matches = true\n \n for (const condition of this.conditions) {\n if (condition.encrypted) {\n // Can only check commitments for encrypted data\n // Real implementation would be more sophisticated\n if (condition.field === 'commitment') {\n const match = bytesToHex(ref.onChainHash) === bytesToHex(condition.value as Uint8Array)\n if (!match) {\n matches = false\n break\n }\n }\n }\n }\n \n if (matches) {\n results.push(ref)\n }\n }\n \n return results\n }\n}\n\n// =====================================================\n// UTILITIES\n// =====================================================\n\n/**\n * Calculate storage cost estimate\n */\nexport function estimateStorageCost(\n dataSize: number,\n provider: 'ipfs' | 'arweave'\n): {\n cost: bigint\n currency: string\n} {\n // Mock cost calculation\n // In production, this would query actual storage costs\n if (provider === 'ipfs') {\n return {\n cost: BigInt(Number(dataSize) * 1), // 1 lamport per byte\n currency: 'lamports'\n }\n } else {\n return {\n cost: BigInt(Number(dataSize) * 10), // 10 lamports per byte\n currency: 'lamports'\n }\n }\n}\n\n/**\n * Create a privacy manifest for transparency\n */\nexport interface PrivacyManifest {\n dataTypes: string[]\n encryptionMethod: 'elgamal' | 'aes256'\n storageLocation: 'ipfs' | 'arweave' | 'on-chain'\n retentionPeriod?: number\n accessControl: 'owner-only' | 'public-read' | 'permissioned'\n}\n\nexport function createPrivacyManifest(\n dataTypes: string[],\n options: Partial<PrivacyManifest> = {}\n): PrivacyManifest {\n return {\n dataTypes,\n encryptionMethod: options.encryptionMethod ?? 'elgamal',\n storageLocation: options.storageLocation ?? 'ipfs',\n retentionPeriod: options.retentionPeriod,\n accessControl: options.accessControl ?? 'owner-only'\n }\n}","/**\n * Feature Gate Detector\n * \n * Runtime detection of Solana feature gates to determine which native\n * programs and features are available on the current network.\n * \n * This module specifically tracks feature gates\n * and provides caching to minimize RPC calls.\n */\n\nimport { address } from '@solana/addresses'\nimport type { Address } from '@solana/kit'\nimport type { Rpc, GetAccountInfoApi } from '@solana/rpc'\n\n// =====================================================\n// CONSTANTS\n// =====================================================\n\n/**\n * Known feature gate addresses\n */\nexport const FEATURE_GATES = {\n /** Confidential transfers feature (placeholder) */\n CONFIDENTIAL_TRANSFERS: address('11111111111111111111111111111111'),\n \n /** Token-2022 program (placeholder) */\n TOKEN_2022: address('TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb'),\n} as const\n\n/**\n * Cache configuration\n */\nconst CACHE_TTL_MS = 5 * 60 * 1000 // 5 minutes\nconst MAX_CACHE_ENTRIES = 100\n\n// =====================================================\n// TYPES\n// =====================================================\n\nexport interface FeatureStatus {\n /** Whether the feature is activated */\n activated: boolean\n \n /** When the status was last checked */\n lastChecked: number\n \n /** Optional activation slot if known */\n activationSlot?: bigint\n \n /** Error if status check failed */\n error?: string\n}\n\nexport interface FeatureGateCache {\n [featureId: string]: FeatureStatus\n}\n\n// =====================================================\n// CACHE IMPLEMENTATION\n// =====================================================\n\nclass FeatureGateCacheManager {\n private cache: FeatureGateCache = {}\n private cacheOrder: string[] = []\n \n /**\n * Get cached feature status\n */\n get(featureId: string): FeatureStatus | null {\n const cached = this.cache[featureId]\n // Cache found, continue\n \n // Check if cache is expired\n if (Date.now() - cached.lastChecked > CACHE_TTL_MS) {\n this.remove(featureId)\n return null\n }\n \n return cached\n }\n \n /**\n * Set feature status in cache\n */\n set(featureId: string, status: FeatureStatus): void {\n // Remove if already exists to update order\n this.remove(featureId)\n \n // Add to cache\n this.cache[featureId] = status\n this.cacheOrder.push(featureId)\n \n // Enforce max cache size\n if (this.cacheOrder.length > MAX_CACHE_ENTRIES) {\n const oldest = this.cacheOrder.shift()\n if (oldest) {\n delete this.cache[oldest]\n }\n }\n }\n \n /**\n * Remove from cache\n */\n remove(featureId: string): void {\n delete this.cache[featureId]\n this.cacheOrder = this.cacheOrder.filter(id => id !== featureId)\n }\n \n /**\n * Clear entire cache\n */\n clear(): void {\n this.cache = {}\n this.cacheOrder = []\n }\n}\n\n// Global cache instance\nconst featureCache = new FeatureGateCacheManager()\n\n// =====================================================\n// FEATURE DETECTION\n// =====================================================\n\n/**\n * Check if a feature gate is activated on the current network\n * \n * @param connection - Solana connection\n * @param featureGate - Feature gate public key to check\n * @returns Feature activation status\n */\nexport async function checkFeatureGate(\n rpc: Rpc<GetAccountInfoApi>,\n featureGate: Address\n): Promise<FeatureStatus> {\n const featureId = featureGate\n \n // Check cache first\n const cached = featureCache.get(featureId)\n if (cached) {\n return cached\n }\n \n try {\n // Check if the feature account exists\n const response = await rpc.getAccountInfo(featureGate, { encoding: 'base64' }).send()\n \n // Feature gates are special accounts - if they exist, the feature is active\n const accountInfo = response.value\n const activated = accountInfo !== null\n \n const status: FeatureStatus = {\n activated,\n lastChecked: Date.now(),\n }\n \n // If activated, try to get activation slot from account data\n if (accountInfo?.data) {\n try {\n // Decode base64 data\n const dataString = typeof accountInfo.data === 'string' ? accountInfo.data : accountInfo.data[0]\n const dataBuffer = Buffer.from(dataString, 'base64')\n \n // First 8 bytes of feature account data is the activation slot\n const activationSlot = BigInt(\n dataBuffer.readBigUInt64LE(0)\n )\n status.activationSlot = activationSlot\n } catch {\n // Ignore parsing errors\n }\n }\n \n // Cache the result\n featureCache.set(featureId, status)\n \n return status\n } catch (error) {\n // Cache error state to avoid repeated failures\n const errorStatus: FeatureStatus = {\n activated: false,\n lastChecked: Date.now(),\n error: error instanceof Error ? error.message : 'Unknown error',\n }\n \n featureCache.set(featureId, errorStatus)\n \n return errorStatus\n }\n}\n\n/**\n * Check multiple feature gates in parallel\n * \n * @param connection - Solana connection\n * @param featureGates - Array of feature gates to check\n * @returns Map of feature gate to status\n */\nexport async function checkMultipleFeatureGates(\n rpc: Rpc<GetAccountInfoApi>,\n featureGates: Address[]\n): Promise<Map<string, FeatureStatus>> {\n const results = await Promise.all(\n featureGates.map(gate => checkFeatureGate(rpc, gate))\n )\n \n const statusMap = new Map<string, FeatureStatus>()\n featureGates.forEach((gate, index) => {\n statusMap.set(gate, results[index])\n })\n \n return statusMap\n}\n\n/**\n * Monitor a feature gate for activation changes\n * \n * @param connection - Solana connection\n * @param featureGate - Feature gate to monitor\n * @param callback - Callback when status changes\n * @param intervalMs - Check interval (default 30 seconds)\n * @returns Function to stop monitoring\n */\nexport function monitorFeatureGate(\n rpc: Rpc<GetAccountInfoApi>,\n featureGate: Address,\n callback: (status: FeatureStatus) => void,\n intervalMs = 30_000\n): () => void {\n let lastStatus: FeatureStatus | null = null\n let intervalId: ReturnType<typeof setInterval> | null = null\n \n const check = async () => {\n try {\n const status = await checkFeatureGate(rpc, featureGate)\n \n // Check if status changed\n if (!lastStatus || lastStatus.activated !== status.activated) {\n callback(status)\n lastStatus = status\n }\n } catch (error) {\n console.error('Error monitoring feature gate:', error)\n }\n }\n \n // Initial check\n void check()\n \n // Set up interval\n intervalId = setInterval(check, intervalMs)\n \n // Return cleanup function\n return () => {\n if (intervalId) {\n clearInterval(intervalId)\n intervalId = null\n }\n }\n}\n\n// =====================================================\n// UTILITY FUNCTIONS\n// =====================================================\n\n/**\n * Clear the feature gate cache\n * Useful for testing or forcing fresh checks\n */\nexport function clearFeatureGateCache(): void {\n featureCache.clear()\n}\n\n/**\n * Convert feature gate public key to Address type\n */\nexport function featureGateToAddress(featureGate: Address): Address {\n return featureGate\n}\n\n// =====================================================\n// EXPORTS\n// =====================================================\n\nexport {\n FeatureGateCacheManager,\n featureCache as defaultFeatureCache,\n}"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/modules/indexer/X402TransactionIndexer.ts","../src/payai/PayAIWebhookHandler.ts","../src/payai/PayAIAgentSync.ts","../src/utils/test-ipfs-config.ts","../src/utils/ipfs-error-handling.ts","../../../node_modules/.bun/chalk@5.6.2/node_modules/chalk/source/vendor/ansi-styles/index.js","../../../node_modules/.bun/chalk@5.6.2/node_modules/chalk/source/vendor/supports-color/index.js","../../../node_modules/.bun/chalk@5.6.2/node_modules/chalk/source/utilities.js","../../../node_modules/.bun/chalk@5.6.2/node_modules/chalk/source/index.js","../src/utils/wallet-funding.ts","../src/utils/private-metadata.ts","../src/utils/feature-gate-detector.ts"],"names":["EventEmitter","process","styles","chalk","i","walletData","fs","lamports"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuIA,0BAAA,EAAA;;;AC9CO,IAAM,yBAAN,MAA6B;AAAA,EACjB,GAAA;AAAA,EACA,kBAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EAEjB,YAAY,MAAA,EAA2B;AACrC,IAAA,IAAA,CAAK,MAAM,MAAA,CAAO,GAAA;AAClB,IAAA,IAAA,CAAK,qBAAqB,MAAA,CAAO,kBAAA;AACjC,IAAA,IAAA,CAAK,OAAA,GAAU,OAAO,OAAA,IAAW,QAAA;AACjC,IAAA,IAAA,CAAK,SAAA,GAAY,OAAO,SAAA,IAAa,GAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,gBAAA,CACJ,aAAA,EACA,KAAA,EAC4B;AAC5B,IAAA,IAAI;AAEF,MAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,aAAA,CAAc,eAAe,KAAK,CAAA;AAEhE,MAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,QAAA,OAAO,EAAC;AAAA,MACV;AAEA,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,qBAAA,EAAwB,UAAA,CAAW,MAAM,CAAA,iBAAA,CAAmB,CAAA;AAGxE,MAAA,MAAM,WAA8B,EAAC;AAErC,MAAA,KAAA,MAAW,OAAO,UAAA,EAAY;AAC5B,QAAA,IAAI;AACF,UAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,gBAAA,CAAiB,IAAI,SAAS,CAAA;AAEzD,UAAA,IAAI,OAAA,EAAS;AACX,YAAA,QAAA,CAAS,KAAK,OAAO,CAAA;AAAA,UACvB;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,2CAAA,EAA8C,GAAA,CAAI,SAAS,KAAK,KAAK,CAAA;AAAA,QAErF;AAAA,MACF;AAEA,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,sBAAA,EAAyB,QAAA,CAAS,MAAM,CAAA,cAAA,CAAgB,CAAA;AAEpE,MAAA,OAAO,QAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,+CAA+C,KAAK,CAAA;AAClE,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,iBAAiB,GAAA,EAA0D;AAC/E,IAAA,IAAI;AAEF,MAAA,MAAM,WAAA,GAAe,OAAO,GAAA,KAAQ,QAAA,GAAW,GAAA,GAAM,GAAA;AACrD,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,GAAA,CACzB,eAAe,WAAA,EAAa;AAAA,QAC3B,8BAAA,EAAgC,CAAA;AAAA,QAChC,QAAA,EAAU;AAAA,OACX,EACA,IAAA,EAAK;AAER,MAAA,IAAI,CAAC,QAAA,IAAY,CAAC,QAAA,CAAS,WAAA,EAAa;AACtC,QAAA,OAAO,IAAA;AAAA,MACT;AAGA,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,QAAQ,CAAA;AAC1C,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,OAAO,IAAA;AAAA,MACT;AAGA,MAAA,OAAO,IAAA,CAAK,mBAAmB,QAAA,EAAU,OAAO,QAAQ,QAAA,GAAW,GAAA,GAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,IACtF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,2CAAA,EAA8C,GAAG,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AACzE,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAc,aAAA,CACZ,MAAA,EACA,KAAA,EAC0B;AAC1B,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAgD;AAAA,QACpD,KAAA,EAAO,SAAS,IAAA,CAAK;AAAA,OACvB;AAEA,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAA,CAAO,MAAA,GAAS,MAAA;AAAA,MAClB;AAEA,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,GAAA,CACzB,wBAAwB,IAAA,CAAK,kBAAA,EAAoB,MAAM,CAAA,CACvD,IAAA,EAAK;AAER,MAAA,OAAO,QAAA,CAAS,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,QAC5B,WAAW,GAAA,CAAI,SAAA;AAAA,QACf,MAAM,GAAA,CAAI,IAAA;AAAA,QACV,WAAW,GAAA,CAAI,SAAA;AAAA,QACf,GAAA,EAAK,IAAI,GAAA,IAAO;AAAA,OAClB,CAAE,CAAA;AAAA,IACJ,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,8CAA8C,KAAK,CAAA;AACjE,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,cAAc,WAAA,EAA2B;AAC/C,IAAA,IAAI;AACF,MAAA,MAAM,YAAA,GAAe,WAAA,CAAY,WAAA,EAAa,OAAA,EAAS,gBAAgB,EAAC;AAGxE,MAAA,MAAM,gBAAA,GAAmB,YAAA,CAAa,IAAA,CAAK,CAAC,EAAA,KAAY;AAEtD,QAAA,MAAM,SAAA,GAAY,EAAA,CAAG,SAAA,EAAW,QAAA,EAAS;AACzC,QAAA,MAAM,iBACJ,SAAA,KAAc,6CAAA;AAAA,QACd,SAAA,KAAc,6CAAA;AAEhB,QAAA,IAAI,CAAC,gBAAgB,OAAO,KAAA;AAG5B,QAAA,MAAM,SAAS,EAAA,CAAG,MAAA;AAClB,QAAA,IAAI,MAAA,EAAQ,IAAA,KAAS,UAAA,IAAc,MAAA,EAAQ,SAAS,iBAAA,EAAmB;AAErE,UAAA,MAAM,WAAA,GAAc,OAAO,IAAA,EAAM,WAAA;AACjC,UAAA,OAAO,WAAA,KAAgB,IAAA,CAAK,kBAAA,CAAmB,QAAA,EAAS;AAAA,QAC1D;AAEA,QAAA,OAAO,KAAA;AAAA,MACT,CAAC,CAAA;AAED,MAAA,OAAO,gBAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,kDAAkD,KAAK,CAAA;AACrE,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAA,CAAmB,aAAkB,SAAA,EAA2C;AACtF,IAAA,IAAI;AACF,MAAA,MAAM,YAAA,GAAe,WAAA,CAAY,WAAA,EAAa,OAAA,EAAS,gBAAgB,EAAC;AAGxE,MAAA,MAAM,UAAA,GAAa,YAAA,CAAa,IAAA,CAAK,CAAC,EAAA,KAAY;AAChD,QAAA,MAAM,SAAS,EAAA,CAAG,MAAA;AAClB,QAAA,OAAO,MAAA,EAAQ,IAAA,KAAS,UAAA,IAAc,MAAA,EAAQ,IAAA,KAAS,iBAAA;AAAA,MACzD,CAAC,CAAA;AAED,MAAA,IAAI,CAAC,UAAA,EAAY;AACf,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,MAAM,YAAA,GAAe,WAAW,MAAA,CAAO,IAAA;AAGvC,MAAA,MAAM,WAAW,YAAA,CAAa,WAAA;AAC9B,MAAA,MAAM,QAAQ,YAAA,CAAa,MAAA;AAC3B,MAAA,MAAM,MAAA,GAAS,YAAA,CAAa,MAAA,IAAU,YAAA,CAAa,aAAa,MAAA,IAAU,GAAA;AAC1E,MAAA,MAAM,OAAA,GAAU,WAAA,CAAY,IAAA,EAAM,GAAA,KAAQ,IAAA;AAG1C,MAAA,MAAM,YAAY,WAAA,CAAY,SAAA;AAC9B,MAAA,MAAM,SAAA,GAAY,YAAY,IAAI,IAAA,CAAK,YAAY,GAAI,CAAA,uBAAQ,IAAA,EAAK;AAGpE,MAAA,MAAM,SAAS,YAAA,CAAa,IAAA;AAAA,QAAK,CAAC,EAAA,KAChC,EAAA,CAAG,WAAW,QAAA,EAAS,EAAG,SAAS,MAAM;AAAA,OAC3C;AAEA,MAAA,IAAI,cAAA;AACJ,MAAA,IAAI,QAAA;AAEJ,MAAA,IAAI,MAAA,IAAU,OAAO,IAAA,EAAM;AACzB,QAAA,IAAI;AAEF,UAAA,MAAM,QAAA,GAAW,OAAO,IAAA,CAAK,MAAA,CAAO,MAAM,QAAQ,CAAA,CAAE,SAAS,OAAO,CAAA;AACpE,UAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AAEpC,UAAA,cAAA,GAAiB,QAAA,CAAS,cAAA;AAC1B,UAAA,QAAA,GAAW,QAAA;AAAA,QACb,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAEA,MAAA,OAAO;AAAA,QACL,SAAA;AAAA,QACA,QAAA;AAAA,QACA,KAAA;AAAA,QACA,MAAA;AAAA,QACA,OAAA;AAAA,QACA,SAAA;AAAA,QACA,SAAS,IAAA,CAAK,OAAA;AAAA,QACd,cAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,kDAAkD,KAAK,CAAA;AACrE,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AACF;;;ADvLA,oBAAA,EAAA;AAoBA,0BAAA,EAAA;AEzIA,IAAM,sBAAA,GAAyB,IAAI,EAAA,GAAK,GAAA;AAGxC,IAAM,gBAAA,GAAmB,mBAAA;AAGzB,IAAM,gBAAA,GAAmB,mBAAA;AAqClB,IAAM,mBAAA,GAAN,cAAkC,YAAA,CAAa;AAAA,EACnC,OAAA;AAAA,EACA,gBAAA;AAAA,EACA,mBAAA;AAAA,EACA,uBAAA;AAAA,EAEjB,WAAA,CACE,OAAA,GAAsC,EAAC,EACvC,qBACA,uBAAA,EACA;AACA,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,gBAAA,GAAmB,OAAA,CAAQ,gBAAA,IAAoB,OAAA,CAAQ,IAAI,QAAA,KAAa,YAAA;AAC7E,IAAA,IAAA,CAAK,mBAAA,GAAsB,mBAAA;AAC3B,IAAA,IAAA,CAAK,uBAAA,GAA0B,uBAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,cAAc,OAAA,EAGY;AAC9B,IAAA,IAAI;AAEF,MAAA,MAAM,OAAA,GAAU,OAAO,OAAA,CAAQ,IAAA,KAAS,QAAA,GACpC,KAAK,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,GACvB,OAAA,CAAQ,IAAA;AAGZ,MAAA,IAAI,IAAA,CAAK,gBAAA,IAAoB,IAAA,CAAK,OAAA,CAAQ,aAAA,EAAe;AACvD,QAAA,MAAM,OAAA,GAAU,OAAO,OAAA,CAAQ,IAAA,KAAS,QAAA,GACpC,QAAQ,IAAA,GACR,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,IAAI,CAAA;AAE/B,QAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,eAAA;AAAA,UAC9B,OAAA,CAAQ,OAAA;AAAA,UACR;AAAA,SACF;AAEA,QAAA,IAAI,CAAC,aAAa,KAAA,EAAO;AACvB,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,KAAA;AAAA,YACT,KAAA,EAAO,aAAa,KAAA,IAAS;AAAA,WAC/B;AAAA,QACF;AAAA,MACF;AAGA,MAAA,OAAO,MAAM,IAAA,CAAK,cAAA,CAAe,OAAO,CAAA;AAAA,IAE1C,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,YAAA,GAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AAC9D,MAAA,IAAA,CAAK,KAAK,OAAA,EAAS,IAAI,MAAM,CAAA,2BAAA,EAA8B,YAAY,EAAE,CAAC,CAAA;AAE1E,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,OACT;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAA,CACJ,OAAA,EACA,IAAA,EACmC;AACnC,IAAA,MAAM,SAAA,GAAY,CAAC,IAAA,KAAqC;AACtD,MAAA,IAAI,mBAAmB,OAAA,EAAS;AAC9B,QAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA,IAAK,MAAA;AAAA,MAC9B;AACA,MAAA,OAAO,QAAQ,IAAI,CAAA;AAAA,IACrB,CAAA;AAEA,IAAA,MAAM,SAAA,GAAY,UAAU,gBAAgB,CAAA;AAC5C,IAAA,MAAM,SAAA,GAAY,UAAU,gBAAgB,CAAA;AAE5C,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,0BAAA,EAA2B;AAAA,IAC3D;AAEA,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,0BAAA,EAA2B;AAAA,IAC3D;AAGA,IAAA,MAAM,WAAA,GAAc,QAAA,CAAS,SAAA,EAAW,EAAE,CAAA;AAC1C,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,MAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,0BAAA,EAA2B;AAAA,IAC3D;AAEA,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,GAAA,GAAM,WAAW,IAAI,sBAAA,EAAwB;AACxD,MAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,wCAAA,EAAyC;AAAA,IACzE;AAGA,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,aAAA,EAAe;AAC/B,MAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,+BAAA,EAAgC;AAAA,IAChE;AAEA,IAAA,MAAM,oBAAoB,IAAA,CAAK,gBAAA;AAAA,MAC7B,SAAA;AAAA,MACA,IAAA;AAAA,MACA,KAAK,OAAA,CAAQ;AAAA,KACf;AAEA,IAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,IAAA,CAAK,SAAA,EAAW,KAAK,CAAA;AACpD,IAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,IAAA,CAAK,iBAAA,EAAmB,KAAK,CAAA;AAE3D,IAAA,IAAI,eAAA,CAAgB,MAAA,KAAW,cAAA,CAAe,MAAA,EAAQ;AACpD,MAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,mBAAA,EAAoB;AAAA,IACpD;AAEA,IAAA,IAAI,CAAC,eAAA,CAAgB,eAAA,EAAiB,cAAc,CAAA,EAAG;AACrD,MAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,mBAAA,EAAoB;AAAA,IACpD;AAEA,IAAA,OAAO,EAAE,OAAO,IAAA,EAAK;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,0BAA0B,IAAA,EAA+C;AACvE,IAAA,OAAO;AAAA,MACL,cAAc,IAAA,CAAK,QAAA;AAAA,MACnB,kBAAkB,IAAA,CAAK,oBAAA;AAAA,MACvB,MAAA,EAAQ,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA;AAAA,MAC1B,OAAA,EAAS,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,MAAA,KAAW,SAAA;AAAA,MACzC,cAAA,EAAgB,KAAK,cAAA,IAAkB,CAAA;AAAA,MACvC,cAAc,IAAA,CAAK,KAAA;AAAA,MACnB,SAAA,EAAW,IAAI,IAAA,CAAK,IAAA,CAAK,aAAa,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,GAAA,EAAK,CAAA;AAAA,MACnE,SAAS,IAAA,CAAK;AAAA,KAChB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAc,eAAe,OAAA,EAA2D;AACtF,IAAA,MAAM,EAAE,IAAA,EAAM,IAAA,EAAK,GAAI,OAAA;AAGvB,IAAA,QAAQ,IAAA;AAAM,MACZ,KAAK,kBAAA;AACH,QAAA,IAAA,CAAK,IAAA,CAAK,oBAAoB,IAAI,CAAA;AAClC,QAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,iBAAA,GAAoB,IAAI,CAAA;AAC3C,QAAA;AAAA,MAEF,KAAK,iBAAA;AACH,QAAA,IAAA,CAAK,IAAA,CAAK,mBAAmB,IAAI,CAAA;AACjC,QAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,gBAAA,GAAmB,IAAI,CAAA;AAG1C,QAAA,IAAI,IAAA,CAAK,QAAQ,kBAAA,EAAoB;AAEnC,UAAA,IAAI,IAAA,CAAK,mBAAA,IAAuB,IAAA,CAAK,uBAAA,EAAyB;AAC5D,YAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,0BAAA,CAA2B,KAAK,QAAmB,CAAA;AACnF,YAAA,IAAI,CAAC,YAAA,EAAc;AACjB,cAAA,OAAO;AAAA,gBACL,OAAA,EAAS,KAAA;AAAA,gBACT,SAAA,EAAW,IAAA;AAAA,gBACX,WAAW,IAAA,CAAK,SAAA;AAAA,gBAChB,KAAA,EAAO,iEAAA;AAAA,gBACP,kBAAA,EAAoB;AAAA,eACtB;AAAA,YACF;AAAA,UACF;AAEA,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,yBAAA,CAA0B,IAAI,CAAA;AAClD,UAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,kBAAA,CAAmB,MAAM,CAAA;AAC5C,UAAA,IAAA,CAAK,IAAA,CAAK,uBAAuB,MAAM,CAAA;AAEvC,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,IAAA;AAAA,YACT,SAAA,EAAW,IAAA;AAAA,YACX,WAAW,IAAA,CAAK,SAAA;AAAA,YAChB,kBAAA,EAAoB;AAAA,WACtB;AAAA,QACF;AACA,QAAA;AAAA,MAEF,KAAK,gBAAA;AACH,QAAA,IAAA,CAAK,IAAA,CAAK,kBAAkB,IAAI,CAAA;AAChC,QAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,eAAA,GAAkB,IAAI,CAAA;AAGzC,QAAA,IAAI,IAAA,CAAK,QAAQ,kBAAA,EAAoB;AACnC,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,yBAAA,CAA0B,IAAI,CAAA;AAClD,UAAA,MAAA,CAAO,OAAA,GAAU,KAAA;AACjB,UAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,kBAAA,CAAmB,MAAM,CAAA;AAC5C,UAAA,IAAA,CAAK,IAAA,CAAK,uBAAuB,MAAM,CAAA;AAEvC,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,IAAA;AAAA,YACT,SAAA,EAAW,IAAA;AAAA,YACX,WAAW,IAAA,CAAK,SAAA;AAAA,YAChB,kBAAA,EAAoB;AAAA,WACtB;AAAA,QACF;AACA,QAAA;AAAA,MAEF,KAAK,kBAAA;AAEH,QAAA;AAAA,MAEF;AACE,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO,uBAAuB,IAAI,CAAA;AAAA,SACpC;AAAA;AAGJ,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,SAAA,EAAW,IAAA;AAAA,MACX,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,kBAAA,EAAoB;AAAA,KACtB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAc,2BAA2B,YAAA,EAAyC;AAChF,IAAA,IAAI,CAAC,IAAA,CAAK,mBAAA,IAAuB,CAAC,KAAK,uBAAA,EAAyB;AAG9D,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI;AAEF,MAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,mBAAA,CAAoB,kBAAA;AAAA,QACnD,YAAA;AAAA,QACA,IAAA,CAAK;AAAA,OACP;AAEA,MAAA,IAAI,CAAC,aAAA,EAAe;AAClB,QAAA,OAAO,KAAA;AAAA,MACT;AAGA,MAAA,MAAM,MAAA,GAAS,KAAK,mBAAA,CAAoB,sBAAA;AAAA,QACtC,aAAA;AAAA,QACA,aAAA,CAAc;AAAA,OAChB;AAEA,MAAA,OAAO,MAAA,CAAO,OAAA;AAAA,IAChB,SAAS,KAAA,EAAO;AAEd,MAAA,OAAA,CAAQ,KAAA,CAAM,4CAA4C,KAAK,CAAA;AAC/D,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAA,CAAiB,SAAA,EAAmB,IAAA,EAAc,MAAA,EAAwB;AAChF,IAAA,MAAM,aAAA,GAAgB,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AAC1C,IAAA,MAAM,IAAA,GAAO,UAAA,CAAW,QAAA,EAAU,MAAM,CAAA;AACxC,IAAA,IAAA,CAAK,OAAO,aAAa,CAAA;AACzB,IAAA,OAAO,IAAA,CAAK,OAAO,KAAK,CAAA;AAAA,EAC1B;AACF;AAYO,SAAS,yBAAA,CACd,OAAA,GAAsC,EAAC,EAClB;AACrB,EAAA,OAAO,IAAI,oBAAoB,OAAO,CAAA;AACxC;AAUO,SAAS,4BAAA,CACd,IAAA,EACA,MAAA,EACA,SAAA,EAC0C;AAC1C,EAAA,MAAM,EAAA,GAAA,CAAM,SAAA,IAAa,IAAA,CAAK,GAAA,IAAO,QAAA,EAAS;AAC9C,EAAA,MAAM,aAAA,GAAgB,CAAA,EAAG,EAAE,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AACnC,EAAA,MAAM,IAAA,GAAO,UAAA,CAAW,QAAA,EAAU,MAAM,CAAA;AACxC,EAAA,IAAA,CAAK,OAAO,aAAa,CAAA;AAEzB,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AAAA,IAC5B,SAAA,EAAW;AAAA,GACb;AACF;AAKO,SAAS,sBAAA,CACd,SAAA,GAAuC,EAAC,EACnB;AACrB,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA;AAAA,IACrB,IAAA,EAAM,iBAAA;AAAA,IACN,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,IAClC,IAAA,EAAM;AAAA,MACJ,SAAA,EAAW,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA;AAAA,MAC5B,oBAAA,EAAsB,GAAG,IAAA,CAAK,MAAA,GAAS,QAAA,CAAS,EAAE,EAAE,KAAA,CAAM,CAAC,CAAC,CAAA,EAAG,IAAA,CAAK,QAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAAA,MAClG,OAAA,EAAS,QAAA;AAAA,MACT,KAAA,EAAO,4CAAA;AAAA,MACP,QAAA,EAAU,0CAAA;AAAA,MACV,MAAA,EAAQ,SAAA;AAAA;AAAA,MACR,KAAA,EAAO,8CAAA;AAAA,MACP,WAAA,EAAa,MAAA;AAAA,MACb,MAAA,EAAQ,SAAA;AAAA,MACR,QAAA,EAAU,qCAAA;AAAA,MACV,cAAA,EAAgB,GAAA;AAAA,MAChB,cAAA,EAAgB,GAAA;AAAA,MAChB,OAAA,EAAS,IAAA;AAAA,MACT,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MAClC,GAAG;AAAA;AACL,GACF;AACF;ACvZA,IAAM,uBAAA,GAA0B,uCAAA;AAiFzB,IAAM,cAAA,GAAN,cAA6BA,YAAAA,CAAa;AAAA,EAC9B,MAAA;AAAA,EAEjB,WAAA,CAAY,MAAA,GAA+B,EAAC,EAAG;AAC7C,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,cAAA,EAAgB,OAAO,cAAA,IAAkB,uBAAA;AAAA,MACzC,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,OAAA,EAAS,OAAO,OAAA,IAAW,QAAA;AAAA,MAC3B,OAAA,EAAS,OAAO,OAAA,IAAW;AAAA,KAC7B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,cAAc,KAAA,EAAsD;AACxE,IAAA,IAAI;AACF,MAAA,MAAM,YAAA,GAAe,IAAA,CAAK,mBAAA,CAAoB,KAAK,CAAA;AAEnD,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA,CAAY,qBAAA,EAAuB;AAAA,QAC7D,MAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,YAAY;AAAA,OAClC,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO,wBAAwB,KAAK,CAAA;AAAA,SACtC;AAAA,MACF;AAEA,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AAEjC,MAAA,IAAA,CAAK,KAAK,kBAAA,EAAoB;AAAA,QAC5B,cAAc,KAAA,CAAM,OAAA;AAAA,QACpB,SAAS,IAAA,CAAK;AAAA,OACf,CAAA;AAED,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,SAAS,IAAA,CAAK,OAAA;AAAA,QACd,gBAAgB,IAAA,CAAK;AAAA,OACvB;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,YAAA,GAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AAC9D,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,OACT;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,WAAA,CAAY,OAAA,EAAiB,KAAA,EAA+D;AAChG,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,MAAM,IAAA,CAAK,WAAA,CAAY,CAAA,WAAA,EAAc,OAAO,CAAA,CAAA,EAAI;AAAA,QAC/D,MAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,KAAK;AAAA,OAC3B,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO,kBAAkB,KAAK,CAAA;AAAA,SAChC;AAAA,MACF;AAEA,MAAA,IAAA,CAAK,IAAA,CAAK,eAAA,EAAiB,EAAE,OAAA,EAAS,CAAA;AAEtC,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT;AAAA,OACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,YAAA,GAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AAC9D,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,OACT;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,YAAY,OAAA,EAA2C;AAC3D,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,MAAM,IAAA,CAAK,WAAA,CAAY,CAAA,WAAA,EAAc,OAAO,CAAA,CAAA,EAAI;AAAA,QAC/D,MAAA,EAAQ;AAAA,OACT,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO,mBAAmB,KAAK,CAAA;AAAA,SACjC;AAAA,MACF;AAEA,MAAA,IAAA,CAAK,IAAA,CAAK,eAAA,EAAiB,EAAE,OAAA,EAAS,CAAA;AAEtC,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT;AAAA,OACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,YAAA,GAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AAC9D,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,OACT;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,kBAAkB,YAAA,EAAyC;AAC/D,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA;AAAA,QAC1B,CAAA,yBAAA,EAA4B,YAAY,CAAA,SAAA,EAAY,IAAA,CAAK,OAAO,OAAO,CAAA;AAAA,OACzE;AAEA,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,OAAO,KAAA;AAAA,MACT;AAEA,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,MAAA,OAAO,IAAA,CAAK,UAAA;AAAA,IACd,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,gBAAgB,YAAA,EAA+D;AACnF,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA;AAAA,QAC1B,CAAA,8BAAA,EAAiC,YAAY,CAAA,SAAA,EAAY,IAAA,CAAK,OAAO,OAAO,CAAA;AAAA,OAC9E;AAEA,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,OAAO,SAAS,IAAA,EAAK;AAAA,IACvB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,mBAAA,CAAoB,OAAA,EAAiB,eAAA,EAAmD;AAC5F,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,MAAM,IAAA,CAAK,WAAA,CAAY,CAAA,WAAA,EAAc,OAAO,CAAA,WAAA,CAAA,EAAe;AAAA,QAC1E,MAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,UACnB,KAAA,EAAO,eAAA;AAAA,UACP,MAAA,EAAQ,YAAA;AAAA,UACR,SAAA,EAAW,KAAK,GAAA;AAAI,SACrB;AAAA,OACF,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO,2BAA2B,KAAK,CAAA;AAAA,SACzC;AAAA,MACF;AAEA,MAAA,IAAA,CAAK,IAAA,CAAK,mBAAA,EAAqB,EAAE,OAAA,EAAS,iBAAiB,CAAA;AAE3D,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT;AAAA,OACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,YAAA,GAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AAC9D,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,OACT;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,oBAAoB,KAAA,EAAoD;AAC9E,IAAA,OAAO;AAAA,MACL,cAAc,KAAA,CAAM,OAAA;AAAA,MACpB,iBAAiB,KAAA,CAAM,eAAA;AAAA,MACvB,cAAc,KAAA,CAAM,YAAA;AAAA,MACpB,gBAAgB,KAAA,CAAM,cAAA;AAAA,MACtB,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,QAAA,EAAU;AAAA,QACR,MAAM,KAAA,CAAM,IAAA;AAAA,QACZ,aAAa,KAAA,CAAM,WAAA;AAAA,QACnB,MAAM,KAAA,CAAM,IAAA;AAAA,QACZ,SAAS,KAAA,CAAM;AAAA;AACjB,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,WAAA,CACZ,IAAA,EACA,OAAA,GAAuB,EAAC,EACL;AACnB,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,SAAA,GAAY,WAAW,MAAM,UAAA,CAAW,OAAM,EAAG,IAAA,CAAK,OAAO,OAAO,CAAA;AAE1E,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,cAAA,EAAgB,kBAAA;AAAA,MAChB,0BAAA,EAA4B;AAAA,KAC9B;AAEA,IAAA,IAAI,IAAA,CAAK,OAAO,MAAA,EAAQ;AACtB,MAAA,OAAA,CAAQ,eAAe,CAAA,GAAI,CAAA,OAAA,EAAU,IAAA,CAAK,OAAO,MAAM,CAAA,CAAA;AAAA,IACzD;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,KAAK,MAAA,CAAO,cAAc,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI;AAAA,QACnE,GAAG,OAAA;AAAA,QACH,OAAA,EAAS;AAAA,UACP,GAAG,OAAA;AAAA,UACH,GAAG,OAAA,CAAQ;AAAA,SACb;AAAA,QACA,QAAQ,UAAA,CAAW;AAAA,OACpB,CAAA;AAED,MAAA,OAAO,QAAA;AAAA,IACT,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,SAAS,CAAA;AAAA,IACxB;AAAA,EACF;AACF;AAYO,SAAS,oBAAA,CAAqB,MAAA,GAA+B,EAAC,EAAmB;AACtF,EAAA,OAAO,IAAI,eAAe,MAAM,CAAA;AAClC;;;AC/XO,IAAM,gBAAA,GAA+B;AAAA,EAC1C,QAAA,EAAU;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,QAAA,EAAU;AAAA;AAAA,GACZ;AAAA,EACA,QAAA,EAAU;AAAA,IACR,uBAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,WAAA,EAAa,IAAA;AAAA,EACb,aAAA,EAAe,GAAA;AAAA;AAAA,EACf,UAAA,EAAY,CAAA;AAAA,EACZ,UAAA,EAAY,GAAA;AAAA,EACZ,WAAA,EAAa,IAAA;AAAA,EACb,QAAA,EAAU;AAAA;AACZ;AAKO,SAAS,qBAAqB,OAAA,EAA2C;AAC9E,EAAA,OAAO;AAAA,IACL,GAAG,gBAAA;AAAA,IACH,GAAG,OAAA;AAAA,IACH,QAAA,EAAU;AAAA,MACR,GAAG,gBAAA,CAAiB,QAAA;AAAA,MACpB,GAAI,OAAA,EAAS,QAAA,IAAY;AAAC;AAC5B,GACF;AACF;;;AC9BO,IAAM,kBAAA,GAAN,cAAiC,KAAA,CAAM;AAAA,EAC5C,WAAA,CACkB,IAAA,EAChB,OAAA,EACgB,QAAA,EACA,YACA,aAAA,EAChB;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AANG,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAEA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AACA,IAAA,IAAA,CAAA,aAAA,GAAA,aAAA;AAGhB,IAAA,IAAA,CAAK,IAAA,GAAO,oBAAA;AAAA,EACd;AACF;AAgBO,IAAM,oBAAA,GAAoC;AAAA,EAC/C,UAAA,EAAY,CAAA;AAAA,EACZ,SAAA,EAAW,GAAA;AAAA,EACX,QAAA,EAAU,GAAA;AAAA,EACV,aAAA,EAAe,CAAA;AAAA,EACf,eAAA,EAAiB;AAAA,IACf,eAAA;AAAA,IACA,eAAA;AAAA,IACA;AAAA;AAEJ;AAKO,IAAM,iBAAN,MAAqB;AAAA,EAK1B,WAAA,CACmB,gBAAA,GAAmB,CAAA,EACnB,YAAA,GAAe,GAAA,EAChC;AAFiB,IAAA,IAAA,CAAA,gBAAA,GAAA,gBAAA;AACA,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AAAA,EAChB;AAAA,EAPK,QAAA,GAAW,CAAA;AAAA,EACX,eAAA,GAAkB,CAAA;AAAA,EAClB,KAAA,GAAyC,QAAA;AAAA,EAOjD,MAAM,QAAW,SAAA,EAAyC;AACxD,IAAA,IAAI,IAAA,CAAK,UAAU,MAAA,EAAQ;AACzB,MAAA,IAAI,KAAK,GAAA,EAAI,GAAI,IAAA,CAAK,eAAA,GAAkB,KAAK,YAAA,EAAc;AACzD,QAAA,IAAA,CAAK,KAAA,GAAQ,WAAA;AAAA,MACf,CAAA,MAAO;AACL,QAAA,MAAM,IAAI,MAAM,6CAA6C,CAAA;AAAA,MAC/D;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,EAAU;AAC/B,MAAA,IAAA,CAAK,SAAA,EAAU;AACf,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,SAAA,EAAU;AACf,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEQ,SAAA,GAAkB;AACxB,IAAA,IAAA,CAAK,QAAA,GAAW,CAAA;AAChB,IAAA,IAAA,CAAK,KAAA,GAAQ,QAAA;AAAA,EACf;AAAA,EAEQ,SAAA,GAAkB;AACxB,IAAA,IAAA,CAAK,QAAA,EAAA;AACL,IAAA,IAAA,CAAK,eAAA,GAAkB,KAAK,GAAA,EAAI;AAEhC,IAAA,IAAI,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,gBAAA,EAAkB;AAC1C,MAAA,IAAA,CAAK,KAAA,GAAQ,MAAA;AAAA,IACf;AAAA,EACF;AAAA,EAEA,QAAA,GAAyE;AACvE,IAAA,OAAO;AAAA,MACL,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,iBAAiB,IAAA,CAAK;AAAA,KACxB;AAAA,EACF;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,QAAA,GAAW,CAAA;AAChB,IAAA,IAAA,CAAK,eAAA,GAAkB,CAAA;AACvB,IAAA,IAAA,CAAK,KAAA,GAAQ,QAAA;AAAA,EACf;AACF;AAKO,IAAM,eAAN,MAAmB;AAAA,EAGxB,WAAA,CACmB,SAAsB,oBAAA,EACvC;AADiB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAEjB,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAI,cAAA,EAAe;AAAA,EAC3C;AAAA,EANQ,cAAA;AAAA,EAQR,MAAM,OAAA,CACJ,SAAA,EACA,OAAA,EACY;AACZ,IAAA,OAAO,IAAA,CAAK,cAAA,CAAe,OAAA,CAAQ,YAAY;AAC7C,MAAA,IAAI,SAAA;AAEJ,MAAA,KAAA,IAAS,UAAU,CAAA,EAAG,OAAA,IAAW,IAAA,CAAK,MAAA,CAAO,YAAY,OAAA,EAAA,EAAW;AAClE,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,MAAM,SAAA,EAAU;AAE/B,UAAA,IAAI,UAAU,CAAA,EAAG;AACf,YAAA,OAAA,CAAQ,GAAA,CAAI,oCAA+B,OAAO,CAAA,QAAA,EAAW,UAAU,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA,CAAA,GAAM,EAAE,CAAA,CAAE,CAAA;AAAA,UAC/F;AAEA,UAAA,OAAO,MAAA;AAAA,QACT,SAAS,KAAA,EAAO;AACd,UAAA,SAAA,GAAY,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AAEpE,UAAA,IAAI,OAAA,KAAY,IAAA,CAAK,MAAA,CAAO,UAAA,EAAY;AACtC,YAAA;AAAA,UACF;AAEA,UAAA,MAAM,WAAA,GAAc,IAAA,CAAK,WAAA,CAAY,SAAA,EAAW,OAAO,CAAA;AACvD,UAAA,IAAI,CAAC,WAAA,EAAa;AAChB,YAAA,OAAA,CAAQ,GAAA,CAAI,6BAAwB,OAAA,GAAU,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA,CAAA,GAAM,EAAE,CAAA,CAAA,CAAA,EAAK,SAAA,CAAU,OAAO,CAAA;AACxF,YAAA;AAAA,UACF;AAEA,UAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,cAAA,CAAe,OAAO,CAAA;AACzC,UAAA,OAAA,CAAQ,IAAI,CAAA,mBAAA,EAAiB,KAAK,CAAA,eAAA,EAAkB,OAAA,GAAU,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,CAAO,UAAU,GAAG,OAAA,GAAU,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA,CAAG,CAAA;AAE5H,UAAA,MAAM,IAAI,OAAA,CAAQ,CAAA,OAAA,KAAW,UAAA,CAAW,OAAA,EAAS,KAAK,CAAC,CAAA;AAAA,QACzD;AAAA,MACF;AAEA,MAAA,MAAM,IAAI,kBAAA;AAAA,QACR,IAAA,CAAK,gBAAgB,SAAU,CAAA;AAAA,QAC/B,CAAA,uBAAA,EAA0B,IAAA,CAAK,MAAA,CAAO,UAAA,GAAa,CAAC,CAAA,SAAA,EAAY,OAAA,GAAU,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA,CAAA,GAAM,EAAE,CAAA,EAAA,EAAK,UAAW,OAAO,CAAA,CAAA;AAAA,QACrH,MAAA;AAAA,QACA,KAAK,MAAA,CAAO;AAAA,OACd;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,WAAA,CAAY,OAAc,OAAA,EAA0B;AAC1D,IAAA,IAAI,OAAA,IAAW,IAAA,CAAK,MAAA,CAAO,UAAA,EAAY;AACrC,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAA;AAC5C,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,eAAA,CAAgB,QAAA,CAAS,SAAS,CAAA;AAAA,EACvD;AAAA,EAEQ,eAAe,OAAA,EAAyB;AAC9C,IAAA,MAAM,gBAAA,GAAmB,KAAK,MAAA,CAAO,SAAA,GAAY,KAAK,GAAA,CAAI,IAAA,CAAK,MAAA,CAAO,aAAA,EAAe,OAAO,CAAA;AAC5F,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,EAAO,GAAI,GAAA,GAAM,gBAAA;AACrC,IAAA,OAAO,KAAK,GAAA,CAAI,gBAAA,GAAmB,MAAA,EAAQ,IAAA,CAAK,OAAO,QAAQ,CAAA;AAAA,EACjE;AAAA,EAEQ,gBAAgB,KAAA,EAAyB;AAC/C,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,WAAA,EAAY;AAE9C,IAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,SAAS,CAAA,EAAG;AAC3B,MAAA,OAAO,eAAA;AAAA,IACT;AAEJ,IAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,SAAS,CAAA,EAAG;AAC3B,MAAA,OAAO,eAAA;AAAA,IACT;AAEJ,IAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,cAAc,CAAA,EAAG;AAChC,MAAA,OAAO,uBAAA;AAAA,IACT;AAEJ,IAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAA,EAAG;AACzB,MAAA,OAAO,gBAAA;AAAA,IACT;AAEA,IAAA,IAAI,QAAQ,QAAA,CAAS,SAAS,KAAK,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,EAAG;AAC3D,MAAA,OAAO,cAAA;AAAA,IACT;AAEJ,IAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,WAAW,CAAA,EAAG;AAC7B,MAAA,OAAO,mBAAA;AAAA,IACT;AAEA,IAAA,OAAO,gBAAA;AAAA,EACT;AAAA,EAEA,QAAA,GAGE;AACA,IAAA,OAAO;AAAA,MACL,mBAAA,EAAqB,IAAA,CAAK,cAAA,CAAe,QAAA,EAAS;AAAA,MAClD,QAAQ,IAAA,CAAK;AAAA,KACf;AAAA,EACF;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,eAAe,KAAA,EAAM;AAAA,EAC5B;AACF;AAKO,IAAM,kBAAN,MAAsB;AAAA,EACnB,kBAAA,uBAA0F,GAAA,EAAI;AAAA,EAEtG,WAAA,GAAc;AACZ,IAAA,IAAA,CAAK,qBAAA,EAAsB;AAAA,EAC7B;AAAA,EAEQ,qBAAA,GAA8B;AAEpC,IAAA,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,eAAA,EAAiB,OAAO,KAAA,KAAU;AAC5D,MAAA,OAAA,CAAQ,IAAI,gEAAyD,CAAA;AACrE,MAAA,MAAM,KAAA;AAAA,IACR,CAAC,CAAA;AAGD,IAAA,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,kBAAA,EAAoB,OAAO,KAAA,KAAU;AAC/D,MAAA,OAAA,CAAQ,IAAI,4DAAqD,CAAA;AACjE,MAAA,MAAM,KAAA;AAAA,IACR,CAAC,CAAA;AAGD,IAAA,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,gBAAA,EAAkB,OAAO,KAAA,KAAU;AAC7D,MAAA,OAAA,CAAQ,KAAK,uFAA6E,CAAA;AAC1F,MAAA,MAAM,KAAA;AAAA,IACR,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,WAAA,CAAe,KAAA,EAA2B,aAAA,EAA+B;AAC7E,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,MAAM,IAAI,CAAA;AAEvD,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,KAAK,CAAA;AACnC,QAAA,OAAO,MAAA;AAAA,MACT,SAAS,cAAA,EAAgB;AACvB,QAAA,OAAA,CAAQ,IAAA,CAAK,kCAAkC,cAAA,YAA0B,KAAA,GAAQ,eAAe,OAAA,GAAU,MAAA,CAAO,cAAc,CAAC,CAAA;AAAA,MAClI;AAAA,IACF;AAEA,IAAA,IAAI,kBAAkB,MAAA,EAAW;AAC/B,MAAA,OAAA,CAAQ,IAAI,+BAA+B,CAAA;AAC3C,MAAA,OAAO,aAAA;AAAA,IACT;AAEA,IAAA,MAAM,KAAA;AAAA,EACR;AAAA,EAEA,gBAAA,CAAoB,WAAsB,QAAA,EAA2D;AACnG,IAAA,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,SAAA,EAAW,QAAQ,CAAA;AAAA,EACjD;AACF;AAKO,IAAM,mBAAN,MAAuB;AAAA,EACpB,YAAA;AAAA,EACA,eAAA;AAAA,EAER,YAAY,WAAA,EAAoC;AAC9C,IAAA,IAAA,CAAK,YAAA,GAAe,IAAI,YAAA,CAAa,EAAE,GAAG,oBAAA,EAAsB,GAAG,aAAa,CAAA;AAChF,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAI,eAAA,EAAgB;AAAA,EAC7C;AAAA,EAEA,MAAM,wBAAA,CACJ,SAAA,EACA,OAAA,EACA,aAAA,EACiC;AACjC,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,YAAA,CAAa,QAAQ,YAAY;AACzD,QAAA,MAAM,QAAA,GAAW,MAAM,SAAA,EAAU;AAEjC,QAAA,IAAI,CAAC,QAAA,CAAS,OAAA,IAAW,QAAA,CAAS,KAAA,EAAO;AACvC,UAAA,MAAM,IAAI,kBAAA;AAAA,YACR,QAAA,CAAS,KAAA;AAAA,YACT,QAAA,CAAS,OAAA,IAAW,CAAA,uBAAA,EAA0B,QAAA,CAAS,KAAK,CAAA;AAAA,WAC9D;AAAA,QACF;AAEA,QAAA,OAAO,QAAA;AAAA,MACT,GAAG,OAAO,CAAA;AAEV,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,SAAA,GAAY,KAAA,YAAiB,kBAAA,GAC/B,KAAA,GACA,IAAI,kBAAA,CAAmB,gBAAA,EAAkB,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAEnG,MAAA,IAAI;AACF,QAAA,MAAM,iBAAiB,MAAM,IAAA,CAAK,eAAA,CAAgB,WAAA,CAAY,WAAW,aAAa,CAAA;AACtF,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,IAAA;AAAA,UACT,IAAA,EAAM,cAAA;AAAA,UACN,OAAA,EAAS;AAAA,SACX;AAAA,MACF,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,OAAO,SAAA,CAAU,IAAA;AAAA,UACjB,SAAS,SAAA,CAAU,OAAA;AAAA,UACnB,QAAA,EAAU;AAAA,SACZ;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAA,CAAoB,WAAsB,QAAA,EAA2D;AACnG,IAAA,IAAA,CAAK,eAAA,CAAgB,gBAAA,CAAiB,SAAA,EAAW,QAAQ,CAAA;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAGE;AACA,IAAA,OAAO;AAAA,MACL,UAAA,EAAY,IAAA,CAAK,YAAA,CAAa,QAAA,EAAS;AAAA,MACvC,mBAAA,EAAqB,MAAM,IAAA,CAAK,IAAA,CAAK,gBAAgB,oBAAoB,CAAA,CAAE,MAAM;AAAA,KACnF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,aAAa,KAAA,EAAM;AAAA,EAC1B;AACF;AAKO,SAAS,uBAAuB,MAAA,EAMlB;AACnB,EAAA,MAAM,OAAA,GAAU,IAAI,gBAAA,CAAiB,MAAA,EAAQ,WAAW,CAAA;AAExD,EAAA,IAAI,QAAQ,eAAA,EAAiB;AAC3B,IAAA,KAAA,MAAW,EAAE,SAAA,EAAW,QAAA,EAAS,IAAK,OAAO,eAAA,EAAiB;AAC5D,MAAA,OAAA,CAAQ,gBAAA,CAAiB,WAAW,QAAQ,CAAA;AAAA,IAC9C;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;AAKO,SAAS,YAAY,KAAA,EAA6C;AACvE,EAAA,OAAO,KAAA,YAAiB,kBAAA;AAC1B;AAKA,eAAsB,qBAAA,CACpB,SAAA,EACA,OAAA,EACA,YAAA,EACiC;AACjC,EAAA,MAAM,OAAA,GAAU,YAAA,IAAgB,IAAI,gBAAA,EAAiB;AAErD,EAAA,OAAO,OAAA,CAAQ,wBAAA;AAAA,IACb,YAAY;AACV,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,SAAA,EAAU;AAC/B,QAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,MAAA,EAAO;AAAA,MACvC,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,SAAA,GAAY,KAAA,YAAiB,kBAAA,GAC/B,KAAA,CAAM,IAAA,GACN,gBAAA;AAEJ,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO,SAAA;AAAA,UACP,SAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,SAChE;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IACA;AAAA,GACF;AACF;;;ACraA,IAAM,sBAAA,GAAyB,EAAA;AAE/B,IAAM,aAAa,CAAC,MAAA,GAAS,MAAM,CAAA,IAAA,KAAQ,CAAA,KAAA,EAAU,OAAO,MAAM,CAAA,CAAA,CAAA;AAElE,IAAM,WAAA,GAAc,CAAC,MAAA,GAAS,CAAA,KAAM,UAAQ,CAAA,KAAA,EAAU,EAAA,GAAK,MAAM,CAAA,GAAA,EAAM,IAAI,CAAA,CAAA,CAAA;AAE3E,IAAM,cAAc,CAAC,MAAA,GAAS,CAAA,KAAM,CAAC,KAAK,KAAA,EAAO,IAAA,KAAS,CAAA,KAAA,EAAU,EAAA,GAAK,MAAM,CAAA,GAAA,EAAM,GAAG,CAAA,CAAA,EAAI,KAAK,IAAI,IAAI,CAAA,CAAA,CAAA;AAEzG,IAAM,MAAA,GAAS;AAAA,EACd,QAAA,EAAU;AAAA,IACT,KAAA,EAAO,CAAC,CAAA,EAAG,CAAC,CAAA;AAAA;AAAA,IAEZ,IAAA,EAAM,CAAC,CAAA,EAAG,EAAE,CAAA;AAAA,IACZ,GAAA,EAAK,CAAC,CAAA,EAAG,EAAE,CAAA;AAAA,IACX,MAAA,EAAQ,CAAC,CAAA,EAAG,EAAE,CAAA;AAAA,IACd,SAAA,EAAW,CAAC,CAAA,EAAG,EAAE,CAAA;AAAA,IACjB,QAAA,EAAU,CAAC,EAAA,EAAI,EAAE,CAAA;AAAA,IACjB,OAAA,EAAS,CAAC,CAAA,EAAG,EAAE,CAAA;AAAA,IACf,MAAA,EAAQ,CAAC,CAAA,EAAG,EAAE,CAAA;AAAA,IACd,aAAA,EAAe,CAAC,CAAA,EAAG,EAAE;AAAA,GACtB;AAAA,EACA,KAAA,EAAO;AAAA,IACN,KAAA,EAAO,CAAC,EAAA,EAAI,EAAE,CAAA;AAAA,IACd,GAAA,EAAK,CAAC,EAAA,EAAI,EAAE,CAAA;AAAA,IACZ,KAAA,EAAO,CAAC,EAAA,EAAI,EAAE,CAAA;AAAA,IACd,MAAA,EAAQ,CAAC,EAAA,EAAI,EAAE,CAAA;AAAA,IACf,IAAA,EAAM,CAAC,EAAA,EAAI,EAAE,CAAA;AAAA,IACb,OAAA,EAAS,CAAC,EAAA,EAAI,EAAE,CAAA;AAAA,IAChB,IAAA,EAAM,CAAC,EAAA,EAAI,EAAE,CAAA;AAAA,IACb,KAAA,EAAO,CAAC,EAAA,EAAI,EAAE,CAAA;AAAA;AAAA,IAGd,WAAA,EAAa,CAAC,EAAA,EAAI,EAAE,CAAA;AAAA,IACpB,IAAA,EAAM,CAAC,EAAA,EAAI,EAAE,CAAA;AAAA;AAAA,IACb,IAAA,EAAM,CAAC,EAAA,EAAI,EAAE,CAAA;AAAA;AAAA,IACb,SAAA,EAAW,CAAC,EAAA,EAAI,EAAE,CAAA;AAAA,IAClB,WAAA,EAAa,CAAC,EAAA,EAAI,EAAE,CAAA;AAAA,IACpB,YAAA,EAAc,CAAC,EAAA,EAAI,EAAE,CAAA;AAAA,IACrB,UAAA,EAAY,CAAC,EAAA,EAAI,EAAE,CAAA;AAAA,IACnB,aAAA,EAAe,CAAC,EAAA,EAAI,EAAE,CAAA;AAAA,IACtB,UAAA,EAAY,CAAC,EAAA,EAAI,EAAE,CAAA;AAAA,IACnB,WAAA,EAAa,CAAC,EAAA,EAAI,EAAE;AAAA,GACrB;AAAA,EACA,OAAA,EAAS;AAAA,IACR,OAAA,EAAS,CAAC,EAAA,EAAI,EAAE,CAAA;AAAA,IAChB,KAAA,EAAO,CAAC,EAAA,EAAI,EAAE,CAAA;AAAA,IACd,OAAA,EAAS,CAAC,EAAA,EAAI,EAAE,CAAA;AAAA,IAChB,QAAA,EAAU,CAAC,EAAA,EAAI,EAAE,CAAA;AAAA,IACjB,MAAA,EAAQ,CAAC,EAAA,EAAI,EAAE,CAAA;AAAA,IACf,SAAA,EAAW,CAAC,EAAA,EAAI,EAAE,CAAA;AAAA,IAClB,MAAA,EAAQ,CAAC,EAAA,EAAI,EAAE,CAAA;AAAA,IACf,OAAA,EAAS,CAAC,EAAA,EAAI,EAAE,CAAA;AAAA;AAAA,IAGhB,aAAA,EAAe,CAAC,GAAA,EAAK,EAAE,CAAA;AAAA,IACvB,MAAA,EAAQ,CAAC,GAAA,EAAK,EAAE,CAAA;AAAA;AAAA,IAChB,MAAA,EAAQ,CAAC,GAAA,EAAK,EAAE,CAAA;AAAA;AAAA,IAChB,WAAA,EAAa,CAAC,GAAA,EAAK,EAAE,CAAA;AAAA,IACrB,aAAA,EAAe,CAAC,GAAA,EAAK,EAAE,CAAA;AAAA,IACvB,cAAA,EAAgB,CAAC,GAAA,EAAK,EAAE,CAAA;AAAA,IACxB,YAAA,EAAc,CAAC,GAAA,EAAK,EAAE,CAAA;AAAA,IACtB,eAAA,EAAiB,CAAC,GAAA,EAAK,EAAE,CAAA;AAAA,IACzB,YAAA,EAAc,CAAC,GAAA,EAAK,EAAE,CAAA;AAAA,IACtB,aAAA,EAAe,CAAC,GAAA,EAAK,EAAE;AAAA;AAEzB,CAAA;AAE6B,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,QAAQ;AACjD,IAAM,oBAAA,GAAuB,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AACrD,IAAM,oBAAA,GAAuB,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACpC,CAAC,GAAG,oBAAA,EAAsB,GAAG,oBAAoB;AAE3E,SAAS,cAAA,GAAiB;AACzB,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAI;AAEtB,EAAA,KAAA,MAAW,CAAC,SAAA,EAAW,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACxD,IAAA,KAAA,MAAW,CAAC,SAAA,EAAW,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AACvD,MAAA,MAAA,CAAO,SAAS,CAAA,GAAI;AAAA,QACnB,IAAA,EAAM,CAAA,KAAA,EAAU,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA,CAAA;AAAA,QACxB,KAAA,EAAO,CAAA,KAAA,EAAU,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAAA,OAC1B;AAEA,MAAA,KAAA,CAAM,SAAS,CAAA,GAAI,MAAA,CAAO,SAAS,CAAA;AAEnC,MAAA,KAAA,CAAM,IAAI,KAAA,CAAM,CAAC,CAAA,EAAG,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,IAC7B;AAEA,IAAA,MAAA,CAAO,cAAA,CAAe,QAAQ,SAAA,EAAW;AAAA,MACxC,KAAA,EAAO,KAAA;AAAA,MACP,UAAA,EAAY;AAAA,KACZ,CAAA;AAAA,EACF;AAEA,EAAA,MAAA,CAAO,cAAA,CAAe,QAAQ,OAAA,EAAS;AAAA,IACtC,KAAA,EAAO,KAAA;AAAA,IACP,UAAA,EAAY;AAAA,GACZ,CAAA;AAED,EAAA,MAAA,CAAO,MAAM,KAAA,GAAQ,UAAA;AACrB,EAAA,MAAA,CAAO,QAAQ,KAAA,GAAQ,UAAA;AAEvB,EAAA,MAAA,CAAO,KAAA,CAAM,OAAO,UAAA,EAAW;AAC/B,EAAA,MAAA,CAAO,KAAA,CAAM,UAAU,WAAA,EAAY;AACnC,EAAA,MAAA,CAAO,KAAA,CAAM,UAAU,WAAA,EAAY;AACnC,EAAA,MAAA,CAAO,OAAA,CAAQ,IAAA,GAAO,UAAA,CAAW,sBAAsB,CAAA;AACvD,EAAA,MAAA,CAAO,OAAA,CAAQ,OAAA,GAAU,WAAA,CAAY,sBAAsB,CAAA;AAC3D,EAAA,MAAA,CAAO,OAAA,CAAQ,OAAA,GAAU,WAAA,CAAY,sBAAsB,CAAA;AAG3D,EAAA,MAAA,CAAO,iBAAiB,MAAA,EAAQ;AAAA,IAC/B,YAAA,EAAc;AAAA,MACb,KAAA,CAAM,GAAA,EAAK,KAAA,EAAO,IAAA,EAAM;AAGvB,QAAA,IAAI,GAAA,KAAQ,KAAA,IAAS,KAAA,KAAU,IAAA,EAAM;AACpC,UAAA,IAAI,MAAM,CAAA,EAAG;AACZ,YAAA,OAAO,EAAA;AAAA,UACR;AAEA,UAAA,IAAI,MAAM,GAAA,EAAK;AACd,YAAA,OAAO,GAAA;AAAA,UACR;AAEA,UAAA,OAAO,KAAK,KAAA,CAAA,CAAQ,GAAA,GAAM,CAAA,IAAK,GAAA,GAAO,EAAE,CAAA,GAAI,GAAA;AAAA,QAC7C;AAEA,QAAA,OAAO,KACH,EAAA,GAAK,IAAA,CAAK,MAAM,GAAA,GAAM,GAAA,GAAM,CAAC,CAAA,GAC7B,CAAA,GAAI,KAAK,KAAA,CAAM,KAAA,GAAQ,MAAM,CAAC,CAAA,GAC/B,KAAK,KAAA,CAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AAAA,MAC7B,CAAA;AAAA,MACA,UAAA,EAAY;AAAA,KACb;AAAA,IACA,QAAA,EAAU;AAAA,MACT,MAAM,GAAA,EAAK;AACV,QAAA,MAAM,UAAU,wBAAA,CAAyB,IAAA,CAAK,GAAA,CAAI,QAAA,CAAS,EAAE,CAAC,CAAA;AAC9D,QAAA,IAAI,CAAC,OAAA,EAAS;AACb,UAAA,OAAO,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAA,QAChB;AAEA,QAAA,IAAI,CAAC,WAAW,CAAA,GAAI,OAAA;AAEpB,QAAA,IAAI,WAAA,CAAY,WAAW,CAAA,EAAG;AAC7B,UAAA,WAAA,GAAc,CAAC,GAAG,WAAW,CAAA,CAAE,GAAA,CAAI,eAAa,SAAA,GAAY,SAAS,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AAAA,QAC/E;AAEA,QAAA,MAAM,OAAA,GAAU,MAAA,CAAO,QAAA,CAAS,WAAA,EAAa,EAAE,CAAA;AAE/C,QAAA,OAAO;AAAA;AAAA,UAEL,WAAW,EAAA,GAAM,GAAA;AAAA,UACjB,WAAW,CAAA,GAAK,GAAA;AAAA,UACjB,OAAA,GAAU;AAAA;AAAA,SAEX;AAAA,MACD,CAAA;AAAA,MACA,UAAA,EAAY;AAAA,KACb;AAAA,IACA,YAAA,EAAc;AAAA,MACb,KAAA,EAAO,SAAO,MAAA,CAAO,YAAA,CAAa,GAAG,MAAA,CAAO,QAAA,CAAS,GAAG,CAAC,CAAA;AAAA,MACzD,UAAA,EAAY;AAAA,KACb;AAAA,IACA,aAAA,EAAe;AAAA,MACd,MAAM,IAAA,EAAM;AACX,QAAA,IAAI,OAAO,CAAA,EAAG;AACb,UAAA,OAAO,EAAA,GAAK,IAAA;AAAA,QACb;AAEA,QAAA,IAAI,OAAO,EAAA,EAAI;AACd,UAAA,OAAO,MAAM,IAAA,GAAO,CAAA,CAAA;AAAA,QACrB;AAEA,QAAA,IAAI,GAAA;AACJ,QAAA,IAAI,KAAA;AACJ,QAAA,IAAI,IAAA;AAEJ,QAAA,IAAI,QAAQ,GAAA,EAAK;AAChB,UAAA,GAAA,GAAA,CAAA,CAAS,IAAA,GAAO,GAAA,IAAO,EAAA,GAAM,CAAA,IAAK,GAAA;AAClC,UAAA,KAAA,GAAQ,GAAA;AACR,UAAA,IAAA,GAAO,GAAA;AAAA,QACR,CAAA,MAAO;AACN,UAAA,IAAA,IAAQ,EAAA;AAER,UAAA,MAAM,YAAY,IAAA,GAAO,EAAA;AAEzB,UAAA,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,EAAE,CAAA,GAAI,CAAA;AAC9B,UAAA,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,SAAA,GAAY,CAAC,CAAA,GAAI,CAAA;AACpC,UAAA,IAAA,GAAQ,YAAY,CAAA,GAAK,CAAA;AAAA,QAC1B;AAEA,QAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,KAAA,EAAO,IAAI,CAAA,GAAI,CAAA;AAE3C,QAAA,IAAI,UAAU,CAAA,EAAG;AAChB,UAAA,OAAO,EAAA;AAAA,QACR;AAGA,QAAA,IAAI,MAAA,GAAS,EAAA,IAAO,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,IAAK,CAAA,GAAM,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA,IAAK,CAAA,GAAK,IAAA,CAAK,MAAM,GAAG,CAAA,CAAA;AAEtF,QAAA,IAAI,UAAU,CAAA,EAAG;AAChB,UAAA,MAAA,IAAU,EAAA;AAAA,QACX;AAEA,QAAA,OAAO,MAAA;AAAA,MACR,CAAA;AAAA,MACA,UAAA,EAAY;AAAA,KACb;AAAA,IACA,SAAA,EAAW;AAAA,MACV,KAAA,EAAO,CAAC,GAAA,EAAK,KAAA,EAAO,IAAA,KAAS,MAAA,CAAO,aAAA,CAAc,MAAA,CAAO,YAAA,CAAa,GAAA,EAAK,KAAA,EAAO,IAAI,CAAC,CAAA;AAAA,MACvF,UAAA,EAAY;AAAA,KACb;AAAA,IACA,SAAA,EAAW;AAAA,MACV,OAAO,CAAA,GAAA,KAAO,MAAA,CAAO,cAAc,MAAA,CAAO,YAAA,CAAa,GAAG,CAAC,CAAA;AAAA,MAC3D,UAAA,EAAY;AAAA;AACb,GACA,CAAA;AAED,EAAA,OAAO,MAAA;AACR;AAEA,IAAM,aAAa,cAAA,EAAe;AAElC,IAAO,mBAAA,GAAQ,UAAA;ACxNf,SAAS,OAAA,CAAQ,MAAM,IAAA,GAAO,UAAA,CAAW,OAAO,UAAA,CAAW,IAAA,CAAK,IAAA,GAAOC,QAAAA,CAAQ,IAAA,EAAM;AACpF,EAAA,MAAM,MAAA,GAAS,KAAK,UAAA,CAAW,GAAG,IAAI,EAAA,GAAM,IAAA,CAAK,MAAA,KAAW,CAAA,GAAI,GAAA,GAAM,IAAA;AACtE,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,MAAA,GAAS,IAAI,CAAA;AAC3C,EAAA,MAAM,kBAAA,GAAqB,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAA;AAC5C,EAAA,OAAO,QAAA,KAAa,EAAA,KAAO,kBAAA,KAAuB,EAAA,IAAM,QAAA,GAAW,kBAAA,CAAA;AACpE;AAEA,IAAM,EAAC,KAAG,GAAIA,QAAAA;AAEd,IAAI,cAAA;AACJ,IACC,OAAA,CAAQ,UAAU,CAAA,IACf,OAAA,CAAQ,WAAW,CAAA,IACnB,OAAA,CAAQ,aAAa,CAAA,IACrB,OAAA,CAAQ,aAAa,CAAA,EACvB;AACD,EAAA,cAAA,GAAiB,CAAA;AAClB,CAAA,MAAA,IACC,OAAA,CAAQ,OAAO,CAAA,IACZ,OAAA,CAAQ,QAAQ,CAAA,IAChB,OAAA,CAAQ,YAAY,CAAA,IACpB,OAAA,CAAQ,cAAc,CAAA,EACxB;AACD,EAAA,cAAA,GAAiB,CAAA;AAClB;AAEA,SAAS,aAAA,GAAgB;AACxB,EAAA,IAAI,iBAAiB,GAAA,EAAK;AACzB,IAAA,IAAI,GAAA,CAAI,gBAAgB,MAAA,EAAQ;AAC/B,MAAA,OAAO,CAAA;AAAA,IACR;AAEA,IAAA,IAAI,GAAA,CAAI,gBAAgB,OAAA,EAAS;AAChC,MAAA,OAAO,CAAA;AAAA,IACR;AAEA,IAAA,OAAO,GAAA,CAAI,WAAA,CAAY,MAAA,KAAW,CAAA,GAAI,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,QAAA,CAAS,GAAA,CAAI,WAAA,EAAa,EAAE,GAAG,CAAC,CAAA;AAAA,EAC3F;AACD;AAEA,SAAS,eAAe,KAAA,EAAO;AAC9B,EAAA,IAAI,UAAU,CAAA,EAAG;AAChB,IAAA,OAAO,KAAA;AAAA,EACR;AAEA,EAAA,OAAO;AAAA,IACN,KAAA;AAAA,IACA,QAAA,EAAU,IAAA;AAAA,IACV,QAAQ,KAAA,IAAS,CAAA;AAAA,IACjB,QAAQ,KAAA,IAAS;AAAA,GAClB;AACD;AAEA,SAAS,cAAA,CAAe,YAAY,EAAC,WAAA,EAAa,aAAa,IAAA,EAAI,GAAI,EAAC,EAAG;AAC1E,EAAA,MAAM,mBAAmB,aAAA,EAAc;AACvC,EAAA,IAAI,qBAAqB,MAAA,EAAW;AACnC,IAAA,cAAA,GAAiB,gBAAA;AAAA,EAClB;AAEA,EAAA,MAAM,UAAA,GAAa,aAAa,cAAA,GAAiB,gBAAA;AAEjD,EAAA,IAAI,eAAe,CAAA,EAAG;AACrB,IAAA,OAAO,CAAA;AAAA,EACR;AAEA,EAAA,IAAI,UAAA,EAAY;AACf,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,IACnB,OAAA,CAAQ,YAAY,CAAA,IACpB,OAAA,CAAQ,iBAAiB,CAAA,EAAG;AAC/B,MAAA,OAAO,CAAA;AAAA,IACR;AAEA,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACzB,MAAA,OAAO,CAAA;AAAA,IACR;AAAA,EACD;AAIA,EAAA,IAAI,UAAA,IAAc,GAAA,IAAO,YAAA,IAAgB,GAAA,EAAK;AAC7C,IAAA,OAAO,CAAA;AAAA,EACR;AAEA,EAAA,IAAI,UAAA,IAAc,CAAC,WAAA,IAAe,UAAA,KAAe,MAAA,EAAW;AAC3D,IAAA,OAAO,CAAA;AAAA,EACR;AAEA,EAAA,MAAM,MAAM,UAAA,IAAc,CAAA;AAE1B,EAAA,IAAI,GAAA,CAAI,SAAS,MAAA,EAAQ;AACxB,IAAA,OAAO,GAAA;AAAA,EACR;AAEA,EAAA,IAAIA,QAAAA,CAAQ,aAAa,OAAA,EAAS;AAGjC,IAAA,MAAM,SAAA,GAAY,EAAA,CAAG,OAAA,EAAQ,CAAE,MAAM,GAAG,CAAA;AACxC,IAAA,IACC,MAAA,CAAO,SAAA,CAAU,CAAC,CAAC,CAAA,IAAK,EAAA,IACrB,MAAA,CAAO,SAAA,CAAU,CAAC,CAAC,CAAA,IAAK,KAAA,EAC1B;AACD,MAAA,OAAO,OAAO,SAAA,CAAU,CAAC,CAAC,CAAA,IAAK,QAAS,CAAA,GAAI,CAAA;AAAA,IAC7C;AAEA,IAAA,OAAO,CAAA;AAAA,EACR;AAEA,EAAA,IAAI,QAAQ,GAAA,EAAK;AAChB,IAAA,IAAI,CAAC,kBAAkB,eAAA,EAAiB,UAAU,EAAE,IAAA,CAAK,CAAA,GAAA,KAAO,GAAA,IAAO,GAAG,CAAA,EAAG;AAC5E,MAAA,OAAO,CAAA;AAAA,IACR;AAEA,IAAA,IAAI,CAAC,QAAA,EAAU,UAAA,EAAY,WAAA,EAAa,aAAa,OAAO,CAAA,CAAE,IAAA,CAAK,CAAA,IAAA,KAAQ,IAAA,IAAQ,GAAG,CAAA,IAAK,GAAA,CAAI,YAAY,UAAA,EAAY;AACtH,MAAA,OAAO,CAAA;AAAA,IACR;AAEA,IAAA,OAAO,GAAA;AAAA,EACR;AAEA,EAAA,IAAI,sBAAsB,GAAA,EAAK;AAC9B,IAAA,OAAO,+BAAA,CAAgC,IAAA,CAAK,GAAA,CAAI,gBAAgB,IAAI,CAAA,GAAI,CAAA;AAAA,EACzE;AAEA,EAAA,IAAI,GAAA,CAAI,cAAc,WAAA,EAAa;AAClC,IAAA,OAAO,CAAA;AAAA,EACR;AAEA,EAAA,IAAI,GAAA,CAAI,SAAS,aAAA,EAAe;AAC/B,IAAA,OAAO,CAAA;AAAA,EACR;AAEA,EAAA,IAAI,GAAA,CAAI,SAAS,eAAA,EAAiB;AACjC,IAAA,OAAO,CAAA;AAAA,EACR;AAEA,EAAA,IAAI,GAAA,CAAI,SAAS,SAAA,EAAW;AAC3B,IAAA,OAAO,CAAA;AAAA,EACR;AAEA,EAAA,IAAI,kBAAkB,GAAA,EAAK;AAC1B,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,QAAA,CAAA,CAAU,GAAA,CAAI,oBAAA,IAAwB,EAAA,EAAI,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,EAAG,EAAE,CAAA;AAElF,IAAA,QAAQ,IAAI,YAAA;AAAc,MACzB,KAAK,WAAA,EAAa;AACjB,QAAA,OAAO,OAAA,IAAW,IAAI,CAAA,GAAI,CAAA;AAAA,MAC3B;AAAA,MAEA,KAAK,gBAAA,EAAkB;AACtB,QAAA,OAAO,CAAA;AAAA,MACR;AAAA;AAED,EACD;AAEA,EAAA,IAAI,gBAAA,CAAiB,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,EAAG;AACpC,IAAA,OAAO,CAAA;AAAA,EACR;AAEA,EAAA,IAAI,6DAAA,CAA8D,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,EAAG;AACjF,IAAA,OAAO,CAAA;AAAA,EACR;AAEA,EAAA,IAAI,eAAe,GAAA,EAAK;AACvB,IAAA,OAAO,CAAA;AAAA,EACR;AAEA,EAAA,OAAO,GAAA;AACR;AAEO,SAAS,mBAAA,CAAoB,MAAA,EAAQ,OAAA,GAAU,EAAC,EAAG;AACzD,EAAA,MAAM,KAAA,GAAQ,eAAe,MAAA,EAAQ;AAAA,IACpC,WAAA,EAAa,UAAU,MAAA,CAAO,KAAA;AAAA,IAC9B,GAAG;AAAA,GACH,CAAA;AAED,EAAA,OAAO,eAAe,KAAK,CAAA;AAC5B;AAEA,IAAM,aAAA,GAAgB;AAAA,EACrB,MAAA,EAAQ,oBAAoB,EAAC,KAAA,EAAO,IAAI,MAAA,CAAO,CAAC,GAAE,CAAA;AAAA,EAClD,MAAA,EAAQ,oBAAoB,EAAC,KAAA,EAAO,IAAI,MAAA,CAAO,CAAC,GAAE;AACnD,CAAA;AAEA,IAAO,sBAAA,GAAQ,aAAA;;;AC5LR,SAAS,gBAAA,CAAiB,MAAA,EAAQ,SAAA,EAAW,QAAA,EAAU;AAC7D,EAAA,IAAI,KAAA,GAAQ,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA;AACpC,EAAA,IAAI,UAAU,EAAA,EAAI;AACjB,IAAA,OAAO,MAAA;AAAA,EACR;AAEA,EAAA,MAAM,kBAAkB,SAAA,CAAU,MAAA;AAClC,EAAA,IAAI,QAAA,GAAW,CAAA;AACf,EAAA,IAAI,WAAA,GAAc,EAAA;AAClB,EAAA,GAAG;AACF,IAAA,WAAA,IAAe,MAAA,CAAO,KAAA,CAAM,QAAA,EAAU,KAAK,IAAI,SAAA,GAAY,QAAA;AAC3D,IAAA,QAAA,GAAW,KAAA,GAAQ,eAAA;AACnB,IAAA,KAAA,GAAQ,MAAA,CAAO,OAAA,CAAQ,SAAA,EAAW,QAAQ,CAAA;AAAA,EAC3C,SAAS,KAAA,KAAU,EAAA;AAEnB,EAAA,WAAA,IAAe,MAAA,CAAO,MAAM,QAAQ,CAAA;AACpC,EAAA,OAAO,WAAA;AACR;AAEO,SAAS,8BAAA,CAA+B,MAAA,EAAQ,MAAA,EAAQ,OAAA,EAAS,KAAA,EAAO;AAC9E,EAAA,IAAI,QAAA,GAAW,CAAA;AACf,EAAA,IAAI,WAAA,GAAc,EAAA;AAClB,EAAA,GAAG;AACF,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,GAAQ,CAAC,CAAA,KAAM,IAAA;AACpC,IAAA,WAAA,IAAe,MAAA,CAAO,KAAA,CAAM,QAAA,EAAW,KAAA,GAAQ,KAAA,GAAQ,CAAA,GAAI,KAAM,CAAA,GAAI,MAAA,IAAU,KAAA,GAAQ,MAAA,GAAS,IAAA,CAAA,GAAQ,OAAA;AACxG,IAAA,QAAA,GAAW,KAAA,GAAQ,CAAA;AACnB,IAAA,KAAA,GAAQ,MAAA,CAAO,OAAA,CAAQ,IAAA,EAAM,QAAQ,CAAA;AAAA,EACtC,SAAS,KAAA,KAAU,EAAA;AAEnB,EAAA,WAAA,IAAe,MAAA,CAAO,MAAM,QAAQ,CAAA;AACpC,EAAA,OAAO,WAAA;AACR;;;ACzBA,IAAM,EAAC,MAAA,EAAQ,WAAA,EAAa,MAAA,EAAQ,aAAW,GAAI,sBAAA;AAEnD,IAAM,SAAA,0BAAmB,WAAW,CAAA;AACpC,IAAM,MAAA,0BAAgB,QAAQ,CAAA;AAC9B,IAAM,QAAA,0BAAkB,UAAU,CAAA;AAGlC,IAAM,YAAA,GAAe;AAAA,EACpB,MAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA;AACD,CAAA;AAEA,IAAMC,OAAAA,mBAAS,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA;AAEjC,IAAM,YAAA,GAAe,CAAC,MAAA,EAAQ,OAAA,GAAU,EAAC,KAAM;AAC9C,EAAA,IAAI,OAAA,CAAQ,KAAA,IAAS,EAAE,MAAA,CAAO,SAAA,CAAU,OAAA,CAAQ,KAAK,CAAA,IAAK,OAAA,CAAQ,KAAA,IAAS,CAAA,IAAK,OAAA,CAAQ,SAAS,CAAA,CAAA,EAAI;AACpG,IAAA,MAAM,IAAI,MAAM,qDAAqD,CAAA;AAAA,EACtE;AAGA,EAAA,MAAM,UAAA,GAAa,WAAA,GAAc,WAAA,CAAY,KAAA,GAAQ,CAAA;AACrD,EAAA,MAAA,CAAO,KAAA,GAAQ,OAAA,CAAQ,KAAA,KAAU,MAAA,GAAY,aAAa,OAAA,CAAQ,KAAA;AACnE,CAAA;AASA,IAAM,eAAe,CAAA,OAAA,KAAW;AAC/B,EAAA,MAAMC,MAAAA,GAAQ,CAAA,GAAI,OAAA,KAAY,OAAA,CAAQ,KAAK,GAAG,CAAA;AAC9C,EAAA,YAAA,CAAaA,QAAO,OAAO,CAAA;AAE3B,EAAA,MAAA,CAAO,cAAA,CAAeA,MAAAA,EAAO,WAAA,CAAY,SAAS,CAAA;AAElD,EAAA,OAAOA,MAAAA;AACR,CAAA;AAEA,SAAS,YAAY,OAAA,EAAS;AAC7B,EAAA,OAAO,aAAa,OAAO,CAAA;AAC5B;AAEA,MAAA,CAAO,cAAA,CAAe,WAAA,CAAY,SAAA,EAAW,QAAA,CAAS,SAAS,CAAA;AAE/D,KAAA,MAAW,CAAC,SAAA,EAAW,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,mBAAU,CAAA,EAAG;AAC5D,EAAAD,OAAAA,CAAO,SAAS,CAAA,GAAI;AAAA,IACnB,GAAA,GAAM;AACL,MAAA,MAAM,OAAA,GAAU,aAAA,CAAc,IAAA,EAAM,YAAA,CAAa,MAAM,IAAA,EAAM,KAAA,CAAM,KAAA,EAAO,IAAA,CAAK,MAAM,CAAC,CAAA,EAAG,IAAA,CAAK,QAAQ,CAAC,CAAA;AACvG,MAAA,MAAA,CAAO,eAAe,IAAA,EAAM,SAAA,EAAW,EAAC,KAAA,EAAO,SAAQ,CAAA;AACvD,MAAA,OAAO,OAAA;AAAA,IACR;AAAA,GACD;AACD;AAEAA,OAAAA,CAAO,OAAA,GAAU;AAAA,EAChB,GAAA,GAAM;AACL,IAAA,MAAM,UAAU,aAAA,CAAc,IAAA,EAAM,IAAA,CAAK,MAAM,GAAG,IAAI,CAAA;AACtD,IAAA,MAAA,CAAO,eAAe,IAAA,EAAM,SAAA,EAAW,EAAC,KAAA,EAAO,SAAQ,CAAA;AACvD,IAAA,OAAO,OAAA;AAAA,EACR;AACD,CAAA;AAEA,IAAM,YAAA,GAAe,CAAC,KAAA,EAAO,KAAA,EAAO,SAAS,UAAA,KAAe;AAC3D,EAAA,IAAI,UAAU,KAAA,EAAO;AACpB,IAAA,IAAI,UAAU,SAAA,EAAW;AACxB,MAAA,OAAO,mBAAA,CAAW,IAAI,CAAA,CAAE,OAAA,CAAQ,GAAG,UAAU,CAAA;AAAA,IAC9C;AAEA,IAAA,IAAI,UAAU,SAAA,EAAW;AACxB,MAAA,OAAO,mBAAA,CAAW,IAAI,CAAA,CAAE,OAAA,CAAQ,oBAAW,YAAA,CAAa,GAAG,UAAU,CAAC,CAAA;AAAA,IACvE;AAEA,IAAA,OAAO,mBAAA,CAAW,IAAI,CAAA,CAAE,IAAA,CAAK,oBAAW,SAAA,CAAU,GAAG,UAAU,CAAC,CAAA;AAAA,EACjE;AAEA,EAAA,IAAI,UAAU,KAAA,EAAO;AACpB,IAAA,OAAO,YAAA,CAAa,OAAO,KAAA,EAAO,IAAA,EAAM,GAAG,mBAAA,CAAW,QAAA,CAAS,GAAG,UAAU,CAAC,CAAA;AAAA,EAC9E;AAEA,EAAA,OAAO,oBAAW,IAAI,CAAA,CAAE,KAAK,CAAA,CAAE,GAAG,UAAU,CAAA;AAC7C,CAAA;AAEA,IAAM,UAAA,GAAa,CAAC,KAAA,EAAO,KAAA,EAAO,SAAS,CAAA;AAE3C,KAAA,MAAW,SAAS,UAAA,EAAY;AAC/B,EAAAA,OAAAA,CAAO,KAAK,CAAA,GAAI;AAAA,IACf,GAAA,GAAM;AACL,MAAA,MAAM,EAAC,OAAK,GAAI,IAAA;AAChB,MAAA,OAAO,YAAa,UAAA,EAAY;AAC/B,QAAA,MAAM,SAAS,YAAA,CAAa,YAAA,CAAa,KAAA,EAAO,YAAA,CAAa,KAAK,CAAA,EAAG,OAAA,EAAS,GAAG,UAAU,GAAG,mBAAA,CAAW,KAAA,CAAM,KAAA,EAAO,IAAA,CAAK,MAAM,CAAC,CAAA;AAClI,QAAA,OAAO,aAAA,CAAc,IAAA,EAAM,MAAA,EAAQ,IAAA,CAAK,QAAQ,CAAC,CAAA;AAAA,MAClD,CAAA;AAAA,IACD;AAAA,GACD;AAEA,EAAA,MAAM,OAAA,GAAU,OAAO,KAAA,CAAM,CAAC,EAAE,WAAA,EAAY,GAAI,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA;AAC7D,EAAAA,OAAAA,CAAO,OAAO,CAAA,GAAI;AAAA,IACjB,GAAA,GAAM;AACL,MAAA,MAAM,EAAC,OAAK,GAAI,IAAA;AAChB,MAAA,OAAO,YAAa,UAAA,EAAY;AAC/B,QAAA,MAAM,SAAS,YAAA,CAAa,YAAA,CAAa,KAAA,EAAO,YAAA,CAAa,KAAK,CAAA,EAAG,SAAA,EAAW,GAAG,UAAU,GAAG,mBAAA,CAAW,OAAA,CAAQ,KAAA,EAAO,IAAA,CAAK,MAAM,CAAC,CAAA;AACtI,QAAA,OAAO,aAAA,CAAc,IAAA,EAAM,MAAA,EAAQ,IAAA,CAAK,QAAQ,CAAC,CAAA;AAAA,MAClD,CAAA;AAAA,IACD;AAAA,GACD;AACD;AAEA,IAAM,KAAA,GAAQ,MAAA,CAAO,gBAAA,CAAiB,MAAM;AAAC,CAAA,EAAG;AAAA,EAC/C,GAAGA,OAAAA;AAAA,EACH,KAAA,EAAO;AAAA,IACN,UAAA,EAAY,IAAA;AAAA,IACZ,GAAA,GAAM;AACL,MAAA,OAAO,IAAA,CAAK,SAAS,CAAA,CAAE,KAAA;AAAA,IACxB,CAAA;AAAA,IACA,IAAI,KAAA,EAAO;AACV,MAAA,IAAA,CAAK,SAAS,EAAE,KAAA,GAAQ,KAAA;AAAA,IACzB;AAAA;AAEF,CAAC,CAAA;AAED,IAAM,YAAA,GAAe,CAAC,IAAA,EAAM,KAAA,EAAO,MAAA,KAAW;AAC7C,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI,WAAW,MAAA,EAAW;AACzB,IAAA,OAAA,GAAU,IAAA;AACV,IAAA,QAAA,GAAW,KAAA;AAAA,EACZ,CAAA,MAAO;AACN,IAAA,OAAA,GAAU,OAAO,OAAA,GAAU,IAAA;AAC3B,IAAA,QAAA,GAAW,QAAQ,MAAA,CAAO,QAAA;AAAA,EAC3B;AAEA,EAAA,OAAO;AAAA,IACN,IAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACD;AACD,CAAA;AAEA,IAAM,aAAA,GAAgB,CAAC,IAAA,EAAM,OAAA,EAAS,QAAA,KAAa;AAGlD,EAAA,MAAM,OAAA,GAAU,CAAA,GAAI,UAAA,KAAe,UAAA,CAAW,SAAU,UAAA,CAAW,MAAA,KAAW,CAAA,GAAM,EAAA,GAAK,WAAW,CAAC,CAAA,GAAK,UAAA,CAAW,IAAA,CAAK,GAAG,CAAC,CAAA;AAI9H,EAAA,MAAA,CAAO,cAAA,CAAe,SAAS,KAAK,CAAA;AAEpC,EAAA,OAAA,CAAQ,SAAS,CAAA,GAAI,IAAA;AACrB,EAAA,OAAA,CAAQ,MAAM,CAAA,GAAI,OAAA;AAClB,EAAA,OAAA,CAAQ,QAAQ,CAAA,GAAI,QAAA;AAEpB,EAAA,OAAO,OAAA;AACR,CAAA;AAEA,IAAM,UAAA,GAAa,CAAC,IAAA,EAAM,MAAA,KAAW;AACpC,EAAA,IAAI,IAAA,CAAK,KAAA,IAAS,CAAA,IAAK,CAAC,MAAA,EAAQ;AAC/B,IAAA,OAAO,IAAA,CAAK,QAAQ,CAAA,GAAI,EAAA,GAAK,MAAA;AAAA,EAC9B;AAEA,EAAA,IAAI,MAAA,GAAS,KAAK,MAAM,CAAA;AAExB,EAAA,IAAI,WAAW,MAAA,EAAW;AACzB,IAAA,OAAO,MAAA;AAAA,EACR;AAEA,EAAA,MAAM,EAAC,OAAA,EAAS,QAAA,EAAQ,GAAI,MAAA;AAC5B,EAAA,IAAI,MAAA,CAAO,QAAA,CAAS,MAAQ,CAAA,EAAG;AAC9B,IAAA,OAAO,WAAW,MAAA,EAAW;AAI5B,MAAA,MAAA,GAAS,gBAAA,CAAiB,MAAA,EAAQ,MAAA,CAAO,KAAA,EAAO,OAAO,IAAI,CAAA;AAE3D,MAAA,MAAA,GAAS,MAAA,CAAO,MAAA;AAAA,IACjB;AAAA,EACD;AAKA,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA;AACnC,EAAA,IAAI,YAAY,EAAA,EAAI;AACnB,IAAA,MAAA,GAAS,8BAAA,CAA+B,MAAA,EAAQ,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAAA,EAC3E;AAEA,EAAA,OAAO,UAAU,MAAA,GAAS,QAAA;AAC3B,CAAA;AAEA,MAAA,CAAO,gBAAA,CAAiB,WAAA,CAAY,SAAA,EAAWA,OAAM,CAAA;AAErD,IAAM,QAAQ,WAAA,EAAY;AACC,YAAY,EAAC,KAAA,EAAO,cAAc,WAAA,CAAY,KAAA,GAAQ,GAAE;AAoBnF,IAAO,cAAA,GAAQ,KAAA;ACvJR,IAAM,uBAAN,MAA2B;AAAA,EACxB,GAAA;AAAA,EACA,UAAA,GAAyB,WAAA;AAAA,EACzB,WAAA;AAAA,EAER,WAAA,CAAY,MAAA,EAAgB,UAAA,GAAyB,WAAA,EAAa;AAEhE,IAAA,IAAA,CAAK,WAAA,GAAc,MAAA,CAAO,QAAA,CAAS,QAAQ,CAAA;AAG3C,IAAA,IAAA,CAAK,GAAA,GAAM,gBAAgB,MAAM,CAAA;AAEjC,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,CACJ,YAAA,EACA,OAAA,EACwB;AACxB,IAAA,MAAM;AAAA,MACJ,MAAA;AAAA,MACA,SAAA,GAAY,MAAA;AAAA,MACZ,UAAA,GAAa,CAAA;AAAA,MACb,UAAA,GAAa,GAAA;AAAA,MACb,WAAA,GAAc,IAAA;AAAA,MACd,cAAA;AAAA,MACA,gBAAgB,EAAC;AAAA,MACjB,OAAA,GAAU;AAAA,KACZ,GAAI,OAAA;AAEJ,IAAA,MAAM,GAAA,GAAM,CAAC,OAAA,KAAoB;AAC/B,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,OAAA,CAAQ,IAAI,cAAA,CAAM,IAAA,CAAK,CAAA,gBAAA,EAAmB,OAAO,EAAE,CAAC,CAAA;AAAA,MACtD;AAAA,IACF,CAAA;AAEA,IAAA,IAAI,QAAA,GAAW,CAAA;AAEf,IAAA,IAAI;AAEF,MAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,UAAA,CAAW,YAAY,CAAA;AACzD,MAAA,GAAA,CAAI,CAAA,iBAAA,EAAoB,IAAA,CAAK,SAAA,CAAU,cAAc,CAAC,CAAA,IAAA,CAAM,CAAA;AAE5D,MAAA,IAAI,kBAAkB,SAAA,EAAW;AAC/B,QAAA,GAAA,CAAI,CAAA,qCAAA,CAAuC,CAAA;AAC3C,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,IAAA;AAAA,UACT,OAAA,EAAS,cAAA;AAAA,UACT,MAAA,EAAQ,UAAA;AAAA,UACR,QAAA,EAAU;AAAA,SACZ;AAAA,MACF;AAEA,MAAA,MAAM,SAAS,MAAA,GAAS,cAAA;AACxB,MAAA,GAAA,CAAI,CAAA,cAAA,EAAiB,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA,IAAA,CAAM,CAAA;AAGjD,MAAA,IAAI,IAAA,CAAK,WAAA,IAAe,gBAAA,IAAoB,IAAA,CAAK,GAAA,EAAK;AACpD,QAAA,GAAA,CAAI,CAAA,4BAAA,CAA8B,CAAA;AAClC,QAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,UAAA;AAAA,UAC/B,YAAA;AAAA,UACA,MAAA;AAAA,UACA,UAAA;AAAA,UACA,UAAA;AAAA,UACA;AAAA,SACF;AAEA,QAAA,IAAI,cAAc,OAAA,EAAS;AACzB,UAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,UAAA,CAAW,YAAY,CAAA;AACvD,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,IAAA;AAAA,YACT,OAAA,EAAS,YAAA;AAAA,YACT,MAAA,EAAQ,SAAA;AAAA,YACR,UAAU,aAAA,CAAc,QAAA;AAAA,YACxB,WAAW,aAAA,CAAc;AAAA,WAC3B;AAAA,QACF;AAEA,QAAA,QAAA,IAAY,aAAA,CAAc,QAAA;AAC1B,QAAA,GAAA,CAAI,CAAA,qBAAA,EAAwB,aAAA,CAAc,QAAQ,CAAA,SAAA,CAAW,CAAA;AAAA,MAC/D;AAGA,MAAA,IAAI,eAAe,cAAA,EAAgB;AACjC,QAAA,GAAA,CAAI,CAAA,qCAAA,CAAuC,CAAA;AAC3C,QAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,kBAAA;AAAA,UAChC,YAAA;AAAA,UACA,MAAA;AAAA,UACA,cAAA;AAAA,UACA;AAAA,SACF;AAEA,QAAA,IAAI,eAAe,OAAA,EAAS;AAC1B,UAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,UAAA,CAAW,YAAY,CAAA;AACvD,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,IAAA;AAAA,YACT,OAAA,EAAS,YAAA;AAAA,YACT,MAAA,EAAQ,UAAA;AAAA,YACR,UAAU,QAAA,GAAW,CAAA;AAAA,YACrB,WAAW,cAAA,CAAe;AAAA,WAC5B;AAAA,QACF;AAEA,QAAA,QAAA,EAAA;AACA,QAAA,GAAA,CAAI,CAAA,yBAAA,EAA4B,cAAA,CAAe,KAAK,CAAA,CAAE,CAAA;AAAA,MACxD;AAGA,MAAA,KAAA,MAAW,gBAAgB,aAAA,EAAe;AACxC,QAAA,GAAA,CAAI,CAAA,4CAAA,CAA8C,CAAA;AAClD,QAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,uBAAA;AAAA,UAC9B,YAAA;AAAA,UACA,MAAA;AAAA,UACA,YAAA;AAAA,UACA;AAAA,SACF;AAEA,QAAA,IAAI,aAAa,OAAA,EAAS;AACxB,UAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,UAAA,CAAW,YAAY,CAAA;AACvD,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,IAAA;AAAA,YACT,OAAA,EAAS,YAAA;AAAA,YACT,MAAA,EAAQ,eAAA;AAAA,YACR,UAAU,QAAA,GAAW,CAAA;AAAA,YACrB,WAAW,YAAA,CAAa;AAAA,WAC1B;AAAA,QACF;AAEA,QAAA,QAAA,EAAA;AACA,QAAA,GAAA,CAAI,CAAA,+BAAA,EAAkC,YAAA,CAAa,KAAK,CAAA,CAAE,CAAA;AAAA,MAC5D;AAGA,MAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,IAEjD,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,OAAA,EAAS,MAAM,IAAA,CAAK,UAAA,CAAW,YAAY,CAAA;AAAA,QAC3C,MAAA,EAAQ,SAAA;AAAA,QACR,QAAA;AAAA,QACA,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,UAAA,CACZ,YAAA,EACA,MAAA,EACA,UAAA,EACA,YACA,OAAA,EACqF;AAErF,IAAA,IAAI,EAAE,gBAAA,IAAoB,IAAA,CAAK,GAAA,CAAA,EAAM;AACnC,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,QAAA,EAAU,CAAA;AAAA,QACV,KAAA,EAAO;AAAA,OACT;AAAA,IACF;AAEA,IAAA,IAAI,QAAA,GAAW,CAAA;AAEf,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,UAAA,EAAY,CAAA,EAAA,EAAK;AACnC,MAAA,QAAA,EAAA;AAEA,MAAA,IAAI;AACF,QAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,GAAA,CAChC,eAAe,YAAA,EAAc,QAAA,CAAS,MAAM,CAAA,EAAG,EAAE,UAAA,EAAY,IAAA,CAAK,UAAA,EAAY,EAC9E,IAAA,EAAK;AAGR,QAAA,MAAM,SAAA,GAAY,eAAA;AAElB,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,OAAA,CAAQ,IAAI,cAAA,CAAM,IAAA,CAAK,CAAA,mCAAA,EAAsC,SAAS,EAAE,CAAC,CAAA;AAAA,QAC3E;AAGA,QAAA,MAAM,IAAA,CAAK,GAAA,CAAI,kBAAA,EAAmB,CAAE,IAAA,EAAK;AAGzC,QAAA,IAAI,SAAA,GAAY,KAAA;AAChB,QAAA,MAAM,WAAA,GAAc,EAAA;AACpB,QAAA,KAAA,IAASE,EAAAA,GAAI,CAAA,EAAGA,EAAAA,GAAI,WAAA,EAAaA,EAAAA,EAAAA,EAAK;AACpC,UAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,GAAA,CAC/B,qBAAqB,CAAC,SAAS,CAAC,CAAA,CAChC,IAAA,EAAK;AAER,UAAA,MAAM,MAAA,GAAS,cAAA,CAAe,KAAA,CAAM,CAAC,CAAA;AACrC,UAAA,IAAI,MAAA,IAAU,MAAA,CAAO,kBAAA,KAAuB,WAAA,EAAa;AACvD,YAAA,SAAA,GAAY,IAAA;AACZ,YAAA;AAAA,UACF;AAEA,UAAA,MAAM,IAAI,OAAA,CAAQ,CAAA,OAAA,KAAW,UAAA,CAAW,OAAA,EAAS,GAAI,CAAC,CAAA;AAAA,QACxD;AAGA,QAAA,MAAM,IAAI,OAAA,CAAQ,CAAA,OAAA,KAAW,UAAA,CAAW,OAAA,EAAS,GAAI,CAAC,CAAA;AAEtD,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,MAAM,IAAI,MAAM,8BAA8B,CAAA;AAAA,QAChD;AAEA,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,IAAA;AAAA,UACT,QAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,OAAA,CAAQ,GAAA,CAAI,eAAM,IAAA,CAAK,CAAA,gCAAA,EAAmC,QAAQ,CAAA,SAAA,EAAY,KAAK,EAAE,CAAC,CAAA;AAAA,QACxF;AAEA,QAAA,IAAI,CAAA,GAAI,aAAa,CAAA,EAAG;AACtB,UAAA,MAAM,IAAI,OAAA,CAAQ,CAAA,OAAA,KAAW,UAAA,CAAW,OAAA,EAAS,UAAU,CAAC,CAAA;AAAA,QAC9D;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,QAAA;AAAA,MACA,KAAA,EAAO;AAAA,KACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,kBAAA,CACZ,YAAA,EACA,MAAA,EACA,gBACA,OAAA,EACmE;AACnE,IAAA,IAAI;AACF,MAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,UAAA,CAAW,cAAc,CAAA;AAC3D,MAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,UAAA,CAAW,eAAe,OAAO,CAAA;AAEpE,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,OAAA,CAAQ,GAAA,CAAI,eAAM,IAAA,CAAK,CAAA,kCAAA,EAAqC,KAAK,SAAA,CAAU,eAAe,CAAC,CAAA,IAAA,CAAM,CAAC,CAAA;AAAA,MACpG;AAEA,MAAA,IAAI,eAAA,GAAkB,MAAA,GAAS,MAAA,CAAO,GAAI,CAAA,EAAG;AAC3C,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO;AAAA,SACT;AAAA,MACF;AAEA,MAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,WAAA;AAAA,QAC3B,cAAA;AAAA,QACA,YAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT;AAAA,OACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,uBAAA,CACZ,YAAA,EACA,MAAA,EACA,cACA,OAAA,EACmE;AACnE,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,UAAA,CAAW,YAAY,CAAA;AACjD,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,UAAA,CAAW,OAAO,OAAO,CAAA;AAEpD,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,OAAA,CAAQ,GAAA,CAAI,eAAM,IAAA,CAAK,CAAA,uCAAA,EAA0C,KAAK,SAAA,CAAU,OAAO,CAAC,CAAA,IAAA,CAAM,CAAC,CAAA;AAAA,MACjG;AAEA,MAAA,IAAI,OAAA,GAAU,MAAA,GAAS,MAAA,CAAO,GAAI,CAAA,EAAG;AACnC,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO;AAAA,SACT;AAAA,MACF;AAEA,MAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,WAAA;AAAA,QAC3B,MAAA;AAAA,QACA,YAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT;AAAA,OACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,WAAA,CACZ,IAAA,EACA,EAAA,EACA,QACA,OAAA,EACiB;AACjB,IAAA,MAAM,EAAE,OAAO,eAAA,EAAgB,GAAI,MAAM,IAAA,CAAK,GAAA,CAAI,kBAAA,EAAmB,CAAE,IAAA,EAAK;AAE5E,IAAA,MAAM,sBAAsB,yBAAA,CAA0B;AAAA,MACpD,MAAA,EAAQ,IAAA;AAAA,MACR,WAAA,EAAa,EAAA;AAAA,MACb;AAAA,KACD,CAAA;AAED,IAAA,MAAM,OAAA,GAAU,IAAA;AAAA,MACd,wBAAA,CAAyB,EAAE,OAAA,EAAS,CAAA,EAAG,CAAA;AAAA,MACvC,CAAA,EAAA,KAAM,6BAAA,CAA8B,IAAA,CAAK,OAAA,EAAS,EAAE,CAAA;AAAA,MACpD,CAAA,EAAA,KAAM,2CAAA,CAA4C,eAAA,EAAiB,EAAE,CAAA;AAAA,MACrE,CAAA,EAAA,KAAM,oCAAA,CAAqC,CAAC,mBAAmB,GAAG,EAAE;AAAA,KACtE;AAEA,IAAA,MAAM,iBAAA,GAAoB,MAAM,iCAAA,CAAkC,OAAO,CAAA;AACzE,IAAA,MAAM,iBAAA,GAAoB,gCAAgC,iBAAiB,CAAA;AAE3E,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,GAAA,CAC3B,gBAAgB,iBAAA,EAAmB;AAAA,MAClC,aAAA,EAAe,KAAA;AAAA,MACf,qBAAqB,IAAA,CAAK,UAAA;AAAA,MAC1B,UAAA,EAAY,OAAO,CAAC;AAAA,KACrB,EACA,IAAA,EAAK;AAGR,IAAA,MAAM,SAAA,GAAY,UAAA;AAElB,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,IAAI,cAAA,CAAM,IAAA,CAAK,CAAA,+BAAA,EAAkC,SAAS,EAAE,CAAC,CAAA;AAAA,IACvE;AAGA,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,MAAM,WAAA,GAAc,EAAA;AACpB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,WAAA,EAAa,CAAA,EAAA,EAAK;AACpC,MAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,GAAA,CAC/B,qBAAqB,CAAC,SAAS,CAAC,CAAA,CAChC,IAAA,EAAK;AAER,MAAA,MAAM,MAAA,GAAS,cAAA,CAAe,KAAA,CAAM,CAAC,CAAA;AACrC,MAAA,IAAI,MAAA,IAAU,MAAA,CAAO,kBAAA,KAAuB,WAAA,EAAa;AACvD,QAAA,SAAA,GAAY,IAAA;AACZ,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,IAAI,OAAA,CAAQ,CAAA,OAAA,KAAW,UAAA,CAAW,OAAA,EAAS,GAAI,CAAC,CAAA;AAAA,IACxD;AAEA,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,MAAM,IAAI,MAAM,kCAAkC,CAAA;AAAA,IACpD;AAEA,IAAA,OAAO,SAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,WAAW,YAAA,EAA8D;AACrF,IAAA,IAAI,OAAO,iBAAiB,QAAA,EAAU;AACpC,MAAA,OAAO,YAAA;AAAA,IACT;AAGA,IAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,GAAA,CAAI,YAAY,CAAA;AACzC,IAAA,IAAI,QAAA,EAAU;AAEZ,MAAA,IAAI;AACF,QAAA,MAAMC,WAAAA,GAAa,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AACtC,QAAA,OAAO,MAAM,4BAAA,CAA6B,IAAI,UAAA,CAAWA,WAAU,CAAC,CAAA;AAAA,MACtE,CAAA,CAAA,MAAQ;AAEN,QAAA,IAAI;AACF,UAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA;AAE5C,UAAA,IAAI,eAAA,CAAgB,MAAA,KAAW,EAAA,IAAM,eAAA,CAAgB,WAAW,EAAA,EAAI;AAClE,YAAA,OAAO,MAAM,6BAA6B,eAAe,CAAA;AAAA,UAC3D;AACA,UAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,QACrD,SAAS,KAAA,EAAO;AACd,UAAA,MAAM,IAAI,MAAM,CAAA,uCAAA,EAA0C,KAAA,YAAiB,QAAQ,KAAA,CAAM,OAAA,GAAU,eAAe,CAAA,CAAE,CAAA;AAAA,QACtH;AAAA,MACF;AAAA,IACF;AAGA,IAAA,MAAM,UAAA,GAAa,KAAK,KAAA,CAAM,MAAMC,SAAG,QAAA,CAAS,YAAA,EAAc,OAAO,CAAC,CAAA;AACtE,IAAA,OAAO,4BAAA,CAA6B,IAAI,UAAA,CAAW,UAAU,CAAC,CAAA;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,qBAAqB,gBAAA,EAAkD;AAClF,IAAA,IAAI;AACF,MAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,MAAA,CAAO,gBAAgB,CAAA;AAEpD,MAAA,IAAI,eAAA,CAAgB,MAAA,KAAW,EAAA,IAAM,eAAA,CAAgB,WAAW,EAAA,EAAI;AAClE,QAAA,OAAO,MAAM,6BAA6B,eAAe,CAAA;AAAA,MAC3D;AACA,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+B,eAAA,CAAgB,MAAM,CAAA,gCAAA,CAAkC,CAAA;AAAA,IACzG,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,iBAAiB,KAAA,IAAS,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,4BAA4B,CAAA,EAAG;AAClF,QAAA,MAAM,KAAA;AAAA,MACR;AACA,MAAA,MAAM,IAAI,MAAM,CAAA,qCAAA,EAAwC,KAAA,YAAiB,QAAQ,KAAA,CAAM,OAAA,GAAU,eAAe,CAAA,CAAE,CAAA;AAAA,IACpH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,MAAA,EAAkC;AACjD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,GAAA,CACzB,UAAA,CAAW,MAAA,EAAQ,EAAE,UAAA,EAAY,IAAA,CAAK,UAAA,EAAY,CAAA,CAClD,IAAA,EAAK;AACR,IAAA,OAAO,QAAA,CAAS,KAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,QAAA,GAA6B;AACzC,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,MAAM,IAAA,CAAK,GAAA,CAAI,cAAA,GAAiB,IAAA,EAAK;AAEtD,MAAA,OAAO,MAAM,OAAA,CAAQ,OAAA,CAAQ,QAAA,KAAa,8CAA8C,CAAA;AAAA,IAC1F,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,UAAUC,SAAAA,EAA0B;AAC1C,IAAA,OAAA,CAAQ,MAAA,CAAOA,SAAQ,CAAA,GAAI,GAAA,EAAe,QAAQ,CAAC,CAAA;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,wBAAA,CACJ,KAAA,EACA,eAAA,EACA,OAAA,EAC0B;AAC1B,IAAA,MAAM,UAA2B,EAAC;AAElC,IAAA,OAAA,CAAQ,IAAI,cAAA,CAAM,IAAA,CAAK,CAAA,qBAAA,EAAwB,KAAK,kBAAkB,CAAC,CAAA;AAEvE,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK;AAC9B,MAAA,MAAM,MAAA,GAAS,MAAM,qBAAA,EAAsB;AAE3C,MAAA,OAAA,CAAQ,GAAA,CAAI,cAAA,CAAM,IAAA,CAAK,CAAA,OAAA,EAAU,CAAA,GAAI,CAAC,CAAA,EAAA,EAAK,MAAA,CAAO,OAAO,CAAA,CAAE,CAAC,CAAA;AAE5D,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,UAAA,CAAW,OAAO,OAAA,EAAS;AAAA,QACnD,GAAG,OAAA;AAAA,QACH,MAAA,EAAQ;AAAA,OACT,CAAA;AAED,MAAA,IAAI,OAAO,OAAA,EAAS;AAClB,QAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AACnB,QAAA,OAAA,CAAQ,GAAA,CAAI,cAAA,CAAM,KAAA,CAAM,CAAA,mBAAA,EAAiB,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,OAAO,CAAC,CAAA,SAAA,EAAY,MAAA,CAAO,MAAM,EAAE,CAAC,CAAA;AAAA,MACrG,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,IAAI,cAAA,CAAM,GAAA,CAAI,0BAAqB,MAAA,CAAO,KAAK,EAAE,CAAC,CAAA;AAAA,MAC5D;AAAA,IACF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAA,CACJ,MAAA,EACA,UAAA,EACA,OAAA,EACwB;AACxB,IAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA;AAEnD,IAAA,IAAI,kBAAkB,UAAA,EAAY;AAChC,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,OAAA,EAAS,cAAA;AAAA,QACT,MAAA,EAAQ,UAAA;AAAA,QACR,QAAA,EAAU;AAAA,OACZ;AAAA,IACF;AAEA,IAAA,MAAM,SAAS,UAAA,GAAa,cAAA;AAC5B,IAAA,OAAO,IAAA,CAAK,WAAW,MAAA,EAAQ;AAAA,MAC7B,MAAA,EAAQ,MAAA;AAAA,MACR,SAAA,EAAW,UAAA;AAAA,MACX,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AACF;AAKO,IAAM,wBAAwB,IAAI,oBAAA;AAAA,EACvC,OAAA,CAAQ,IAAI,kBAAA,IAAsB;AACpC;AAKA,eAAsB,UAAA,CACpB,MAAA,EACA,WAAA,EACA,OAAA,EACwB;AACxB,EAAA,OAAO,qBAAA,CAAsB,WAAW,MAAA,EAAQ;AAAA,IAC9C,QAAQ,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,WAAA,GAAc,GAAa,CAAC,CAAA;AAAA,IACtD,GAAG;AAAA,GACJ,CAAA;AACH;AAKA,eAAsB,oBAAA,CACpB,MAAA,EACA,eAAA,EACA,OAAA,EACwB;AACxB,EAAA,OAAO,qBAAA,CAAsB,oBAAA;AAAA,IAC3B,MAAA;AAAA,IACA,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,eAAA,GAAkB,GAAa,CAAC,CAAA;AAAA,IAClD;AAAA,GACF;AACF;AC5iBO,IAAM,eAAN,MAA8C;AAAA,EAC3C,MAAA;AAAA,EACS,gBAAA;AAAA,EAEjB,YAAY,OAAA,EAIT;AAED,IAAA,MAAM,YAAA,GAAe,SAAA,CAAQ,iBAAiB,CAAA,CAAE,MAAA;AAGhD,IAAA,MAAM,WAAA,GAAc,SAAS,WAAA,IAAe,uBAAA;AAC5C,IAAA,MAAM,OAAA,GAAU,OAAA,EAAS,OAAA,IAAW,EAAC;AACrC,IAAA,IAAA,CAAK,gBAAA,GAAmB,SAAS,iBAAA,IAAqB,KAAA;AAGtD,IAAA,IAAI;AACF,MAAA,IAAI,IAAI,WAAW,CAAA;AAAA,IACrB,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gCAAA,EAAmC,WAAW,CAAA,CAAE,CAAA;AAAA,IAClE;AAGA,IAAA,IAAI,CAAC,IAAA,CAAK,gBAAA,IAAoB,WAAA,CAAY,QAAA,CAAS,WAAW,CAAA,EAAG;AAC/D,MAAA,OAAA,CAAQ,KAAK,mGAAmG,CAAA;AAAA,IAClH;AAGA,IAAA,IAAI,OAAO,OAAA,KAAY,QAAA,IAAY,OAAA,KAAY,IAAA,EAAM;AACnD,MAAA,MAAM,IAAI,MAAM,gCAAgC,CAAA;AAAA,IAClD;AAEA,IAAA,IAAA,CAAK,SAAS,YAAA,CAAa;AAAA,MACzB,GAAA,EAAK,WAAA;AAAA,MACL;AAAA,KACD,CAAA;AAED,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,MAAM,IAAI,MAAM,8DAA8D,CAAA;AAAA,IAChF;AAAA,EACF;AAAA,EAEA,MAAM,MAAM,IAAA,EAAmC;AAC7C,IAAA,IAAI;AAEF,MAAA,IAAI,IAAA,CAAK,MAAA,GAAS,EAAA,GAAK,IAAA,GAAO,IAAA,EAAM;AAClC,QAAA,MAAM,IAAI,MAAM,gDAAgD,CAAA;AAAA,MAClE;AAGA,MAAA,IAAI,CAAC,IAAA,CAAK,gBAAA,IAAoB,IAAA,CAAK,iBAAA,CAAkB,IAAI,CAAA,EAAG;AAC1D,QAAA,OAAA,CAAQ,KAAK,6FAA6F,CAAA;AAAA,MAC5G;AAEA,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,IAAI,IAAA,EAAM;AAAA,QACzC,GAAA,EAAK,IAAA;AAAA;AAAA,QACL,UAAA,EAAY;AAAA;AAAA,OACb,CAAA;AACD,MAAA,OAAO,MAAA,CAAO,IAAI,QAAA,EAAS;AAAA,IAC7B,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,8BAAA,EAAiC,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,IAC3G;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,kBAAkB,IAAA,EAA2B;AAEnD,IAAA,MAAM,IAAA,GAAO,IAAI,WAAA,CAAY,OAAA,EAAS,EAAE,KAAA,EAAO,KAAA,EAAO,CAAA,CAAE,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA;AACjF,IAAA,MAAM,cAAA,GAAiB,CAAC,GAAA,EAAK,GAAA,EAAK,SAAS,MAAA,EAAQ,SAAA,EAAW,SAAS,UAAU,CAAA;AACjF,IAAA,OAAO,cAAA,CAAe,IAAA,CAAK,CAAA,OAAA,KAAW,IAAA,CAAK,WAAA,GAAc,QAAA,CAAS,OAAA,CAAQ,WAAA,EAAa,CAAC,CAAA;AAAA,EAC1F;AAAA,EAEA,MAAM,SAAS,IAAA,EAAmC;AAChD,IAAA,IAAI;AACF,MAAA,MAAM,SAAuB,EAAC;AAC9B,MAAA,WAAA,MAAiB,KAAA,IAAS,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA,EAAG;AAC/C,QAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,MACnB;AAGA,MAAA,MAAM,WAAA,GAAc,OAAO,MAAA,CAAO,CAAC,KAAK,KAAA,KAAU,GAAA,GAAM,KAAA,CAAM,MAAA,EAAQ,CAAC,CAAA;AACvE,MAAA,MAAM,MAAA,GAAS,IAAI,UAAA,CAAW,WAAW,CAAA;AACzC,MAAA,IAAI,MAAA,GAAS,CAAA;AACb,MAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,QAAA,MAAA,CAAO,GAAA,CAAI,OAAO,MAAM,CAAA;AACxB,QAAA,MAAA,IAAU,KAAA,CAAM,MAAA;AAAA,MAClB;AAEA,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mCAAA,EAAsC,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,IAChH;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,IAAA,EAAgC;AAC3C,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,EAAA,CAAG,IAAI,CAAA;AAC7B,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,KAAA,EAAO;AAGd,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,uBAAA,EAA0B,IAAI,CAAA,EAAA,EAAK,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA,CAAE,CAAA;AACxG,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AACF;AAKO,IAAM,uBAAN,MAAsD;AAAA,EACnD,MAAA,GAAS,qBAAA;AAAA,EAEjB,MAAM,MAAM,IAAA,EAAmC;AAC7C,IAAA,MAAM,IAAA,GAAO,UAAA,CAAW,MAAA,CAAO,IAAI,CAAC,CAAA;AACpC,IAAA,UAAA,CAAW,aAAa,OAAA,CAAQ,IAAA,CAAK,SAAS,IAAA,EAAM,UAAA,CAAW,IAAI,CAAC,CAAA;AACpE,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,SAAS,IAAA,EAAmC;AAChD,IAAA,MAAM,MAAM,UAAA,CAAW,YAAA,CAAa,OAAA,CAAQ,IAAA,CAAK,SAAS,IAAI,CAAA;AAC9D,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,OAAO,WAAW,GAAG,CAAA;AAAA,IACvB;AACA,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,IAAI,CAAA,CAAE,CAAA;AAAA,EAC3C;AAAA,EAEA,MAAM,OAAO,IAAA,EAAgC;AAC3C,IAAA,UAAA,CAAW,YAAA,CAAa,UAAA,CAAW,IAAA,CAAK,MAAA,GAAS,IAAI,CAAA;AACrD,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAMO,IAAM,yBAAN,MAA6B;AAAA,EAC1B,iBAAA;AAAA,EACA,eAAA;AAAA,EACA,eAAe,eAAA,EAAgB;AAAA,EAEvC,WAAA,CACE,iBACA,iBAAA,EACA;AACA,IAAA,IAAA,CAAK,eAAA,GAAkB,eAAA,IAAmB,IAAI,YAAA,EAAa;AAC3D,IAAA,IAAA,CAAK,iBAAA,GAAoB,iBAAA,IAAqB,IAAI,uBAAA,EAAwB;AAAA,EAC5E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAA,CACJ,IAAA,EACA,cAAA,EACA,eAAA,EAC4B;AAE5B,IAAA,IAAI,CAAC,IAAA,CAAK,YAAA,CAAa,SAAA,CAAU,qBAAqB,CAAA,EAAG;AACvD,MAAA,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAAA,IAC/C;AAGA,IAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,iBAAA,CAAkB,qBAAA;AAAA,MACnD,IAAA;AAAA,MACA,cAAA;AAAA,MACA;AAAA,KACF;AAGA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,wBAAA,CAAyB,eAAe,CAAA;AAGhE,IAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,eAAA,CAAgB,MAAM,UAAU,CAAA;AAGnE,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,iBAAA,CAAkB,eAAA,EAAiB,eAAe,CAAA;AAE3E,IAAA,OAAO;AAAA,MACL,WAAA;AAAA,MACA,eAAA,EAAiB,MAAA;AAAA,MACjB,eAAA;AAAA,MACA,kBAAA,EAAoB;AAAA,QAClB,OAAA,EAAS,gBAAgB,SAAA,CAAU,OAAA;AAAA,QACnC,SAAA,EAAW,gBAAgB,SAAA,CAAU,SAAA;AAAA,QACrC,SAAA,EAAW,gBAAgB,SAAA,CAAU;AAAA,OACvC;AAAA,MACA,MAAM,UAAA,CAAW,MAAA;AAAA,MACjB,WAAA,EAAa;AAAA,KACf;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAA,CACJ,SAAA,EACA,SAAA,EAIC;AAED,IAAA,MAAM,aAAa,MAAM,IAAA,CAAK,eAAA,CAAgB,QAAA,CAAS,UAAU,eAAe,CAAA;AAGhF,IAAA,MAAM,eAAe,IAAA,CAAK,iBAAA;AAAA,MACxB,IAAA,CAAK,2BAA2B,UAAU,CAAA;AAAA,MAC1C,SAAA,CAAU;AAAA,KACZ;AAEA,IAAA,IAAI,WAAW,YAAY,CAAA,KAAM,UAAA,CAAW,SAAA,CAAU,WAAW,CAAA,EAAG;AAClE,MAAA,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAAA,IAC/C;AAGA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,0BAAA,CAA2B,UAAU,CAAA;AAG3D,IAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,kBAAA;AAAA,MAChC,QAAA,CAAS,SAAA;AAAA,MACT;AAAA,KACF;AAEA,IAAA,MAAM,WAAA,GAAc,KAAK,KAAA,CAAM,IAAI,aAAY,CAAE,MAAA,CAAO,cAAc,CAAC,CAAA;AAEvE,IAAA,OAAO;AAAA,MACL,WAAA;AAAA,MACA,YAAY,QAAA,CAAS;AAAA,KACvB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAA,CACE,aACA,iBAAA,EACY;AACZ,IAAA,MAAM,QAAA,GAAW;AAAA,MACf,OAAA,EAAS,WAAA;AAAA,MACT,QAAA,EAAU;AAAA,QACR,IAAA,EAAM,UAAA,CAAW,iBAAA,CAAkB,WAAW,CAAA;AAAA,QAC9C,UAAU,iBAAA,CAAkB,eAAA;AAAA,QAC5B,UAAU,iBAAA,CAAkB;AAAA,OAC9B;AAAA,MACA,SAAA,EAAW,KAAK,GAAA;AAAI,KACtB;AAEA,IAAA,OAAO,MAAA,CAAO,IAAI,WAAA,EAAY,CAAE,OAAO,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAC,CAAC,CAAA;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WACJ,KAAA,EAK8B;AAC9B,IAAA,MAAM,UAA+B,EAAC;AAEtC,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,gBAAA;AAAA,QACxB,IAAA,CAAK,IAAA;AAAA,QACL,IAAA,CAAK,cAAA;AAAA,QACL,IAAA,CAAK;AAAA,OACP;AACA,MAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AAAA,IACrB;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAMQ,yBAAyB,QAAA,EAAuC;AACtE,IAAA,MAAM,IAAA,GAAO,KAAK,SAAA,CAAU;AAAA,MAC1B,SAAA,EAAW;AAAA,QACT,UAAA,EAAY;AAAA,UACV,YAAY,UAAA,CAAW,QAAA,CAAS,SAAA,CAAU,UAAA,CAAW,WAAW,UAAU,CAAA;AAAA,UAC1E,QAAQ,UAAA,CAAW,QAAA,CAAS,SAAA,CAAU,UAAA,CAAW,OAAO,MAAM;AAAA,SAChE;AAAA,QACA,SAAA,EAAW,UAAA,CAAW,QAAA,CAAS,SAAA,CAAU,SAAS,CAAA;AAAA,QAClD,UAAA,EAAY,UAAA,CAAW,QAAA,CAAS,SAAA,CAAU,UAAU,CAAA;AAAA,QACpD,SAAA,EAAW,SAAS,SAAA,CAAU,SAAA;AAAA,QAC9B,OAAA,EAAS,SAAS,SAAA,CAAU;AAAA,OAC9B;AAAA,MACA,QAAQ,QAAA,CAAS,MAAA;AAAA,MACjB,WAAA,EAAa,UAAA,CAAW,QAAA,CAAS,WAAW,CAAA;AAAA,MAC5C,UAAU,QAAA,CAAS;AAAA,KACpB,CAAA;AAED,IAAA,OAAO,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,IAAI,CAAA;AAAA,EACtC;AAAA,EAEQ,2BAA2B,IAAA,EAAmC;AACpE,IAAA,MAAM,IAAA,GAAO,KAAK,KAAA,CAAM,IAAI,aAAY,CAAE,MAAA,CAAO,IAAI,CAAC,CAAA;AAgBtD,IAAA,OAAO;AAAA,MACL,SAAA,EAAW;AAAA,QACT,UAAA,EAAY;AAAA,UACV,UAAA,EAAY;AAAA,YACV,UAAA,EAAY,UAAA,CAAW,IAAA,CAAK,SAAA,CAAU,WAAW,UAAU;AAAA,WAC7D;AAAA,UACA,MAAA,EAAQ;AAAA,YACN,MAAA,EAAQ,UAAA,CAAW,IAAA,CAAK,SAAA,CAAU,WAAW,MAAM;AAAA;AACrD,SACF;AAAA,QACA,SAAA,EAAW,UAAA,CAAW,IAAA,CAAK,SAAA,CAAU,SAAS,CAAA;AAAA,QAC9C,UAAA,EAAY,UAAA,CAAW,IAAA,CAAK,SAAA,CAAU,UAAU,CAAA;AAAA,QAChD,SAAA,EAAW,KAAK,SAAA,CAAU,SAAA;AAAA,QAC1B,OAAA,EAAS,KAAK,SAAA,CAAU;AAAA,OAC1B;AAAA,MACA,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,WAAA,EAAa,UAAA,CAAW,IAAA,CAAK,WAAW,CAAA;AAAA,MACxC,UAAU,IAAA,CAAK;AAAA,KACjB;AAAA,EACF;AAAA,EAEQ,iBAAA,CACN,UACA,eAAA,EACY;AACZ,IAAA,MAAM,IAAA,GAAO;AAAA,MACX,WAAA,EAAa,UAAA,CAAW,QAAA,CAAS,WAAW,CAAA;AAAA,MAC5C,eAAA;AAAA,MACA,UAAA,EAAY,UAAA,CAAW,QAAA,CAAS,SAAA,CAAU,UAAU,CAAA;AAAA,MACpD,SAAA,EAAW,SAAS,SAAA,CAAU;AAAA,KAChC;AAEA,IAAA,OAAO,MAAA,CAAO,IAAI,WAAA,EAAY,CAAE,OAAO,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAC,CAAA;AAAA,EAC9D;AAAA,EAEA,MAAc,kBAAA,CACZ,SAAA,EACA,SAAA,EACqB;AAIrB,IAAA,MAAM,kBAAkB,MAAM,IAAA,CAAK,iBAAA,CAAkB,aAAA,CAAc,WAAW,SAAS,CAAA;AACvF,IAAA,OAAO,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,IAAA,CAAK,SAAA,CAAU,EAAE,MAAA,EAAQ,eAAA,CAAgB,QAAA,EAAS,EAAG,CAAC,CAAA;AAAA,EACxF;AACF;AASO,IAAM,mBAAN,MAAuB;AAAA,EACpB,aAKF,EAAC;AAAA,EAEP,KAAA,CAAM,KAAA,EAAe,QAAA,EAA2C,KAAA,EAAsB;AACpF,IAAA,IAAA,CAAK,UAAA,CAAW,KAAK,EAAE,KAAA,EAAO,UAAU,KAAA,EAAO,SAAA,EAAW,OAAO,CAAA;AACjE,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,cAAA,CAAe,OAAe,UAAA,EAA8B;AAC1D,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK;AAAA,MACnB,KAAA;AAAA,MACA,QAAA,EAAU,IAAA;AAAA,MACV,KAAA,EAAO,UAAA;AAAA,MACP,SAAA,EAAW;AAAA,KACZ,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,OAAA,CACJ,OAAA,EACA,UAAA,EAC8B;AAG9B,IAAA,MAAM,UAA+B,EAAC;AAEtC,IAAA,KAAA,MAAW,OAAO,UAAA,EAAY;AAC5B,MAAA,IAAI,OAAA,GAAU,IAAA;AAEd,MAAA,KAAA,MAAW,SAAA,IAAa,KAAK,UAAA,EAAY;AACvC,QAAA,IAAI,UAAU,SAAA,EAAW;AAGvB,UAAA,IAAI,SAAA,CAAU,UAAU,YAAA,EAAc;AACpC,YAAA,MAAM,QAAQ,UAAA,CAAW,GAAA,CAAI,WAAW,CAAA,KAAM,UAAA,CAAW,UAAU,KAAmB,CAAA;AACtF,YAAA,IAAI,CAAC,KAAA,EAAO;AACV,cAAA,OAAA,GAAU,KAAA;AACV,cAAA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,OAAA,CAAQ,KAAK,GAAG,CAAA;AAAA,MAClB;AAAA,IACF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AACF;AASO,SAAS,mBAAA,CACd,UACA,QAAA,EAIA;AAGA,EAAA,IAAI,aAAa,MAAA,EAAQ;AACvB,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,MAAA,CAAO,MAAA,CAAO,QAAQ,IAAI,CAAC,CAAA;AAAA;AAAA,MACjC,QAAA,EAAU;AAAA,KACZ;AAAA,EACF,CAAA,MAAO;AACL,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,MAAA,CAAO,MAAA,CAAO,QAAQ,IAAI,EAAE,CAAA;AAAA;AAAA,MAClC,QAAA,EAAU;AAAA,KACZ;AAAA,EACF;AACF;AAaO,SAAS,qBAAA,CACd,SAAA,EACA,OAAA,GAAoC,EAAC,EACpB;AACjB,EAAA,OAAO;AAAA,IACL,SAAA;AAAA,IACA,gBAAA,EAAkB,QAAQ,gBAAA,IAAoB,SAAA;AAAA,IAC9C,eAAA,EAAiB,QAAQ,eAAA,IAAmB,MAAA;AAAA,IAC5C,iBAAiB,OAAA,CAAQ,eAAA;AAAA,IACzB,aAAA,EAAe,QAAQ,aAAA,IAAiB;AAAA,GAC1C;AACF;ACviBO,IAAM,aAAA,GAAgB;AAAA;AAAA,EAE3B,sBAAA,EAAwB,QAAQ,kCAAkC,CAAA;AAAA;AAAA,EAGlE,UAAA,EAAY,QAAQ,6CAA6C;AACnE;AAKA,IAAM,YAAA,GAAe,IAAI,EAAA,GAAK,GAAA;AAC9B,IAAM,iBAAA,GAAoB,GAAA;AA4B1B,IAAM,0BAAN,MAA8B;AAAA,EACpB,QAA0B,EAAC;AAAA,EAC3B,aAAuB,EAAC;AAAA;AAAA;AAAA;AAAA,EAKhC,IAAI,SAAA,EAAyC;AAC3C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA;AAInC,IAAA,IAAI,IAAA,CAAK,GAAA,EAAI,GAAI,MAAA,CAAO,cAAc,YAAA,EAAc;AAClD,MAAA,IAAA,CAAK,OAAO,SAAS,CAAA;AACrB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,GAAA,CAAI,WAAmB,MAAA,EAA6B;AAElD,IAAA,IAAA,CAAK,OAAO,SAAS,CAAA;AAGrB,IAAA,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA,GAAI,MAAA;AACxB,IAAA,IAAA,CAAK,UAAA,CAAW,KAAK,SAAS,CAAA;AAG9B,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,MAAA,GAAS,iBAAA,EAAmB;AAC9C,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,UAAA,CAAW,KAAA,EAAM;AACrC,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,OAAO,IAAA,CAAK,MAAM,MAAM,CAAA;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,SAAA,EAAyB;AAC9B,IAAA,OAAO,IAAA,CAAK,MAAM,SAAS,CAAA;AAC3B,IAAA,IAAA,CAAK,aAAa,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,CAAA,EAAA,KAAM,OAAO,SAAS,CAAA;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,QAAQ,EAAC;AACd,IAAA,IAAA,CAAK,aAAa,EAAC;AAAA,EACrB;AACF,CAAA;AAGA,IAAM,YAAA,GAAe,IAAI,uBAAA,EAAwB;AAajD,eAAsB,gBAAA,CACpB,KACA,WAAA,EACwB;AACxB,EAAA,MAAM,SAAA,GAAY,WAAA;AAGlB,EAAA,MAAM,MAAA,GAAS,YAAA,CAAa,GAAA,CAAI,SAAS,CAAA;AACzC,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI;AAEF,IAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,cAAA,CAAe,WAAA,EAAa,EAAE,QAAA,EAAU,QAAA,EAAU,CAAA,CAAE,IAAA,EAAK;AAGpF,IAAA,MAAM,cAAc,QAAA,CAAS,KAAA;AAC7B,IAAA,MAAM,YAAY,WAAA,KAAgB,IAAA;AAElC,IAAA,MAAM,MAAA,GAAwB;AAAA,MAC5B,SAAA;AAAA,MACA,WAAA,EAAa,KAAK,GAAA;AAAI,KACxB;AAGA,IAAA,IAAI,aAAa,IAAA,EAAM;AACrB,MAAA,IAAI;AAEF,QAAA,MAAM,UAAA,GAAa,OAAO,WAAA,CAAY,IAAA,KAAS,WAAW,WAAA,CAAY,IAAA,GAAO,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA;AAC/F,QAAA,MAAM,UAAA,GAAa,MAAA,CAAO,IAAA,CAAK,UAAA,EAAY,QAAQ,CAAA;AAGnD,QAAA,MAAM,cAAA,GAAiB,MAAA;AAAA,UACrB,UAAA,CAAW,gBAAgB,CAAC;AAAA,SAC9B;AACA,QAAA,MAAA,CAAO,cAAA,GAAiB,cAAA;AAAA,MAC1B,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAGA,IAAA,YAAA,CAAa,GAAA,CAAI,WAAW,MAAM,CAAA;AAElC,IAAA,OAAO,MAAA;AAAA,EACT,SAAS,KAAA,EAAO;AAEd,IAAA,MAAM,WAAA,GAA6B;AAAA,MACjC,SAAA,EAAW,KAAA;AAAA,MACX,WAAA,EAAa,KAAK,GAAA,EAAI;AAAA,MACtB,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,KAClD;AAEA,IAAA,YAAA,CAAa,GAAA,CAAI,WAAW,WAAW,CAAA;AAEvC,IAAA,OAAO,WAAA;AAAA,EACT;AACF;AAgFO,SAAS,qBAAA,GAA8B;AAC5C,EAAA,YAAA,CAAa,KAAA,EAAM;AACrB","file":"index.js","sourcesContent":["/**\n * GhostSpeak SDK - Production-Ready AI Agent Commerce Protocol\n * \n * Optimized for tree-shaking and minimal bundle size.\n * Import only what you need for the best performance.\n * \n * @packageDocumentation\n */\n\n// =====================================================\n// MAIN CLIENT EXPORT (Tree-shakeable)\n// =====================================================\n\n// Default export for convenience\nexport { default, sol, lamportsToSol } from './core/GhostSpeakClient.js'\n\n// Named export for explicit imports\nexport { GhostSpeakClient } from './core/GhostSpeakClient.js'\n\n// Re-export Solana kit functions for CLI\nexport { createSolanaRpc, createKeyPairSignerFromBytes, generateKeyPairSigner, address } from '@solana/kit'\n\n// =====================================================\n// CORE EXPORTS\n// =====================================================\n\n// Types\nexport * from './core/types.js'\n\n// Errors\nexport * from './core/errors.js'\n\n// Base classes (for advanced users)\nexport { BaseModule } from './core/BaseModule.js'\nexport { InstructionBuilder } from './core/InstructionBuilder.js'\nexport { RpcClient } from './core/rpc-client.js'\n\n// Cache and performance utilities\nexport { CacheManager, type CacheConfig } from './core/CacheManager.js'\nexport {\n batchGetAccounts,\n batchGetExistingAccounts,\n batchGetAndMap,\n batchGetAccountsWithRetry,\n createBatchFetcher,\n type BatchProgressCallback,\n type BatchFetchConfig\n} from './utils/batch-operations.js'\n\n// =====================================================\n// MODULE EXPORTS\n// =====================================================\n\n// Agent module\nexport { AgentModule } from './core/modules/AgentModule.js'\n\n// Authorization module - Trustless agent pre-authorization\nexport { AuthorizationModule } from './modules/authorization/index.js'\n\n// Escrow module\n\n\n// Channel module - REMOVED (use A2A for agent communication)\n\n// Marketplace module - REMOVED (use PayAI for discovery)\n\n// Governance module\nexport {\n GovernanceModule,\n type CreateProposalParams,\n type ProposalType,\n type ExecutionParams\n} from './modules/governance/index.js'\n\n// Multisig module\nexport { MultisigModule } from './modules/multisig/index.js'\n\n\n\n// Credential module\nexport {\n CredentialModule,\n CredentialKind,\n CredentialStatus,\n type W3CVerifiableCredential,\n type Credential,\n type CredentialTemplate\n} from './modules/credentials/CredentialModule.js'\n\n// DID module\nexport {\n DidModule,\n VerificationMethodType,\n VerificationRelationship,\n ServiceEndpointType,\n DidError,\n DidErrorClass,\n deriveDidDocumentPda,\n generateDidString,\n validateDidString,\n parseDidString,\n exportAsW3CDidDocument,\n createEd25519VerificationMethod,\n createServiceEndpoint,\n isDidActive,\n getMethodsForRelationship,\n canPerformAction,\n didDocumentToJson,\n getNetworkFromDid,\n getIdentifierFromDid,\n type DidDocument,\n type VerificationMethod,\n type ServiceEndpoint,\n type DidResolutionMetadata,\n type W3CDidDocument,\n type CreateDidDocumentParams,\n type UpdateDidDocumentParams,\n type DeactivateDidDocumentParams,\n type ResolveDidDocumentParams\n} from './modules/did/index.js'\n\n// Reputation module\nexport {\n ReputationModule,\n ReputationTier,\n BadgeType,\n REPUTATION_CONSTANTS,\n type ReputationData,\n type JobPerformance,\n type ReputationCalculationResult,\n type CategoryReputation,\n type PayAIReputationRecordInput,\n} from './modules/reputation/ReputationModule.js'\n\n// Reputation Tag Engine (Pillar 2: Granular Tags)\nexport { ReputationTagEngine } from './utils/reputation-tag-engine.js'\n\n// Indexer module - On-chain transaction polling for x402 payments\nexport {\n X402TransactionIndexer,\n type X402PaymentData,\n type SignatureInfo,\n type X402IndexerConfig,\n} from './modules/indexer/index.js'\n\n// Reputation tag types and enums\nexport {\n TagCategory,\n SkillTag,\n BehaviorTag,\n ComplianceTag,\n TAG_CONSTANTS,\n TagConfidenceLevel,\n DEFAULT_TAG_DECAY,\n type TagScore as TagScoreType,\n type TagCriteria,\n type TagEvaluation,\n type TagFilters,\n type TagUpdateRequest,\n type BulkTagUpdateRequest,\n type TagQueryResult,\n type TagDecayConfig,\n type ReputationMetrics as TagReputationMetrics,\n} from './types/reputation-tags.js'\n\n// Multi-Source Reputation Aggregator (Pillar 3: External Sources)\nexport {\n MultiSourceAggregator,\n type AggregatedReputation,\n type SourceScoreBreakdown,\n} from './modules/reputation/MultiSourceAggregator.js'\n\n// Reputation source adapters and types\nexport {\n ReputationSource,\n BaseReputationAdapter,\n type ReputationSourceAdapter,\n type ReputationSourceConfig,\n type SourceReputationData,\n} from './modules/reputation/adapters/ReputationSourceAdapter.js'\n\n// Privacy module\nexport {\n PrivacyModule,\n PrivacyMode,\n VisibilityLevel,\n ScoreRange,\n PrivacyPresets,\n PRIVACY_CONSTANTS,\n type MetricVisibility,\n type PrivacySettings,\n type PrivacyPreset,\n type VisibleReputation,\n type InitializePrivacyParams,\n type UpdatePrivacyModeParams,\n type SetMetricVisibilityParams,\n type GrantAccessParams,\n type RevokeAccessParams,\n type ApplyPresetParams,\n calculateVisibleScore,\n getReputationTier,\n getScoreRange,\n canViewerAccess,\n filterMetricsByVisibility,\n getDefaultMetricVisibility,\n validatePrivacySettings,\n getTierDisplayName,\n getRangeDisplayString,\n} from './modules/privacy/index.js'\n\nexport { \n UnifiedCredentialService, \n type UnifiedCredentialConfig,\n type IssuedCredentialResult\n} from './modules/credentials/UnifiedCredentialService.js'\n\nexport {\n CrossmintVCClient,\n type CrossmintClientOptions,\n type CredentialType as CrossmintCredentialType,\n type IssuedCredential as CrossmintIssuedCredential,\n GHOSTSPEAK_CREDENTIAL_TYPES\n} from './modules/credentials/CrossmintVCClient.js'\n\n// Work Order module removed - x402 payment protocol focus\n\n// H2A Communication module - removed (use A2A instructions for agent communication)\n\n// =====================================================\n// PROTOCOL EXPORTS (x402, A2A, H2A)\n// =====================================================\n\n// x402 Payment Protocol - Replaced by PayAI\n// See PayAI Integration section below\n// PaymentStreamingManager removed - use PayAI for payment flows\n\n// A2A (Agent-to-Agent) Protocol - REMOVED (messaging deprecated)\n\n// H2A (Human-to-Agent) Protocol - REMOVED (messaging deprecated)\n\n// =====================================================\n// PAYAI INTEGRATION (Recommended Payment Facilitator)\n// =====================================================\n\nexport {\n PayAIClient,\n createPayAIClient,\n payAIFetch,\n isPaymentRequired,\n extractPaymentRequirements,\n PayAIWebhookHandler,\n createPayAIWebhookHandler,\n generateTestWebhookSignature,\n createMockPayAIWebhook,\n // Agent Sync\n PayAIAgentSync,\n createPayAIAgentSync\n} from './payai/index.js'\n\nexport type {\n PayAIWebhookEventType,\n PayAIPaymentStatus,\n PayAINetwork,\n PayAIWebhookPayload,\n PayAIPaymentData,\n PayAIWebhookVerification,\n PayAIClientConfig,\n PayAIPaymentRequirement,\n PayAIPaymentResponse,\n PayAIReputationRecord,\n PayAIAgentRegistration,\n PayAIWebhookHandlerOptions,\n PayAIWebhookResult,\n // Agent Sync types\n PayAIAgentSyncConfig,\n AgentSyncResult,\n GhostSpeakAgentData\n} from './payai/index.js'\n\n// =====================================================\n// CRYPTO EXPORTS\n// =====================================================\n\n// Crypto exports with renamed TransferProof to avoid conflict\n// ZK proof exports removed - x402 payment protocol focus\nexport {\n generateKeypair,\n encrypt,\n decrypt,\n generateTransferProof,\n generateWithdrawProof,\n type ElGamalKeypair,\n type ElGamalCiphertext,\n type TransferProof as ElGamalTransferProof,\n type WithdrawProof,\n loadWasmModule,\n isWasmAvailable,\n type WasmModule,\n elgamal,\n wasmBridge\n} from './crypto/index.js'\n\n\n// Export TransactionSigner type from Solana kit\nexport type { TransactionSigner } from '@solana/kit'\n\n// =====================================================\n// GENERATED TYPES EXPORTS (for CLI)\n// =====================================================\n\n// Re-export essential enums and types for CLI usage\nexport { ProposalStatus } from './generated/types/proposalStatus.js'\n\n// Export discriminator validation and account migration utilities\nexport {\n safeDecodeAgent,\n validateAccountDiscriminator,\n createDiscriminatorErrorMessage,\n inspectAccountData,\n type DiscriminatorValidationResult,\n type AccountInspectionResult\n} from './utils/discriminator-validator.js'\n\nexport {\n createMigrationPlan,\n createMigrationReport,\n simulateMigration,\n getMigrationInstructions,\n extractLegacyData,\n type MigrationPlan,\n type MigrationResult,\n type LegacyAgentData\n} from './utils/account-migration.js'\n\nexport {\n runAccountDiagnostics,\n runBatchDiagnostics,\n diagnoseAccountFromChain,\n diagnoseBatchFromChain,\n exportDiagnosticReport,\n type DiagnosticReport,\n type BatchDiagnosticReport\n} from './utils/account-diagnostics.js'\n\n// Export all essential types and utilities\nexport type {\n GhostSpeakConfig,\n AgentWithAddress,\n AgentRegistrationData,\n AgentAccount,\n PricingModel,\n GhostSpeakError,\n RegisterAgentParams,\n RpcResponse,\n RpcAccountInfo,\n RpcProgramAccount,\n RpcProgramAccountsResponse,\n RpcAccountInfoResponse,\n RpcMultipleAccountsResponse,\n TransactionResponse,\n SimulatedTransactionResponse,\n SolanaRpcClient,\n EmergencyConfig,\n Commitment,\n RetryConfig,\n ExtendedRpcApi,\n RpcApi,\n RpcSubscriptionApi\n} from './types/index.js'\n\n// Export authorization types\nexport type {\n SolanaNetwork,\n ReputationAuthorization,\n AuthorizationMetadata,\n AuthorizationProof,\n AuthorizationInvalidReason,\n VerificationDetails,\n AuthorizationMessage,\n CreateAuthorizationParams,\n VerifyAuthorizationParams,\n AuthorizationUsage,\n AuthorizationStatus,\n AuthorizationWithStatus,\n BatchAuthorizationVerification,\n AuthorizationRevocation,\n AuthorizationFilter,\n} from './types/authorization/authorization-types.js'\n\nexport {\n deriveAgentPda,\n deriveUserRegistryPda,\n deriveAgentVerificationPda,\n findProgramDerivedAddress\n} from './utils/pda.js'\n\n// Export authorization signature utilities\nexport {\n createAuthorizationMessage,\n signAuthorizationMessage,\n verifyAuthorizationSignature,\n createSignedAuthorization,\n generateNonce,\n serializeAuthorization,\n deserializeAuthorization,\n getAuthorizationId,\n isAuthorizationExpired,\n isAuthorizationExhausted,\n validateAuthorizationNetwork,\n} from './utils/signature-verification.js'\n\n// Export enhanced error handling utilities\nexport {\n InstructionValidationError,\n isKnownInstruction,\n validateInstructionAccounts,\n createAccountMismatchError,\n getAccountRequirements,\n getRequiredSigners,\n getWritableAccounts,\n getPDAAccounts,\n enhanceErrorMessage,\n debugInstructionCall,\n getInstructionMapping,\n generateAccountValidationError,\n INSTRUCTION_MAPPINGS\n} from './utils/instruction-error-handler.js'\n\n// Export enhanced client error utilities\nexport {\n GhostSpeakSDKError,\n withEnhancedErrors,\n withEnhancedErrorsSync,\n enhanceTransactionError,\n logEnhancedError,\n createErrorContext,\n validatePreconditions,\n extractInstructionName\n} from './utils/enhanced-client-errors.js'\n\n// Export generated instruction functions and types with selective exports to avoid conflicts\nexport {\n // Instruction builders - these are the primary exports users need\n getRegisterAgentInstructionAsync,\n\n // ===== STAKING INSTRUCTIONS (GHOST Token Staking) =====\n getInitializeStakingConfigInstructionAsync,\n getStakeGhostInstructionAsync,\n getUnstakeGhostInstructionAsync,\n getSlashStakeInstructionAsync,\n\n // ===== GHOST PROTECT ESCROW INSTRUCTIONS (B2C Escrow) =====\n getCreateEscrowInstructionAsync,\n getSubmitDeliveryInstruction,\n getApproveDeliveryInstruction,\n getFileDisputeInstruction,\n getArbitrateDisputeInstruction,\n\n // ===== DID INSTRUCTIONS (W3C Decentralized Identifiers) =====\n getCreateDidDocumentInstructionAsync,\n getUpdateDidDocumentInstructionAsync,\n getDeactivateDidDocumentInstructionAsync,\n getResolveDidDocumentInstructionAsync,\n\n // ===== REPUTATION TAG INSTRUCTIONS =====\n getUpdateReputationTagsInstructionAsync,\n\n // ===== STAKING TYPES =====\n type SlashReason,\n type StakingAccount,\n type StakingConfig,\n type GhostStakedEvent,\n type GhostUnstakedEvent,\n type GhostSlashedEvent,\n\n // ===== GHOST PROTECT TYPES =====\n type ArbitratorDecision,\n type EscrowStatus,\n type GhostProtectEscrow,\n type EscrowCreatedEvent,\n type EscrowCompletedEvent,\n type DeliverySubmittedEvent,\n type DisputeFiledEvent,\n type DisputeResolvedEvent,\n\n // ===== REPUTATION TAG TYPES =====\n type TagScore,\n type ReputationTagsUpdatedEvent,\n type TagDecayAppliedEvent,\n\n // Other generated utilities\n GHOSTSPEAK_MARKETPLACE_PROGRAM_ADDRESS\n} from './generated/index.js'\n\n// Account decoders (exported specifically to avoid conflict with types)\nexport {\n getAgentDecoder,\n getStakingAccountDecoder,\n getStakingConfigDecoder,\n getGhostProtectEscrowDecoder,\n} from './generated/accounts/index.js'\n\n// Export program constants\nexport { GHOSTSPEAK_PROGRAM_ID } from './constants/index.js'\n\n// Export system addresses\nexport { \n NATIVE_MINT_ADDRESS,\n TOKEN_PROGRAM_ADDRESS,\n TOKEN_2022_PROGRAM_ADDRESS,\n ASSOCIATED_TOKEN_PROGRAM_ADDRESS \n} from './constants/system-addresses.js'\n\n// Export Token 2022 utilities\nexport {\n deriveAssociatedTokenAddress,\n deriveSplTokenAssociatedTokenAddress,\n deriveToken2022AssociatedTokenAddress,\n getAssociatedTokenAccount,\n detectTokenProgram,\n isToken2022Mint,\n getTokenProgramType,\n getAllAssociatedTokenAddresses,\n validateAssociatedTokenAddress,\n getTokenProgramAddress,\n getTokenProgramFromAddress,\n formatTokenAmount,\n parseTokenAmount,\n TokenProgram,\n TokenExtension,\n // New Token-2022 extension detection functions\n hasTransferFeeExtension,\n hasConfidentialTransferExtension,\n hasInterestBearingExtension,\n // New Token-2022 configuration retrieval functions\n getTransferFeeConfig,\n getConfidentialTransferConfig,\n getInterestBearingConfig,\n type AssociatedTokenAccount,\n type TransferFeeConfig,\n type ConfidentialTransferConfig,\n type InterestBearingConfig\n} from './utils/token-utils.js'\n\n\n\n// Export governance helpers\nexport { deriveMultisigPda, deriveProposalPda } from './utils/governance-helpers.js'\n\n// Export IPFS functionality for large content storage\nexport type {\n IPFSConfig,\n IPFSProviderConfig,\n IPFSUploadOptions,\n IPFSUploadResult,\n IPFSRetrievalOptions,\n IPFSRetrievalResult,\n IPFSPinResult,\n IPFSOperationResult,\n IPFSContentMetadata,\n FlexibleContent,\n ContentStorageResult,\n IPFSError\n} from './types/ipfs-types.js'\n\nexport {\n IPFSClient\n} from './utils/ipfs-client.js'\n\nexport {\n IPFSUtils,\n createIPFSUtils,\n createMetadataUri,\n determineStorageMethod,\n DEFAULT_IPFS_CONFIG\n} from './utils/ipfs-utils.js'\n\nexport {\n TEST_IPFS_CONFIG,\n createTestIPFSConfig\n} from './utils/test-ipfs-config.js'\n\nexport {\n IPFSOperationError,\n CircuitBreaker,\n RetryHandler,\n FallbackHandler,\n IPFSErrorHandler,\n createIPFSErrorHandler,\n isIPFSError,\n withIPFSErrorHandling,\n DEFAULT_RETRY_CONFIG\n} from './utils/ipfs-error-handling.js'\n\n\n// Export wallet funding utilities\nexport {\n WalletFundingService,\n fundWallet,\n ensureMinimumBalance,\n defaultFundingService,\n type FundingStrategyOptions,\n type FundingResult\n} from './utils/wallet-funding.js'\n\n// Export privacy and encryption utilities\nexport {\n ClientEncryptionService,\n generateLocalPrivacyProof,\n verifyLocalPrivacyProof,\n type EncryptedData,\n type PrivateMetadata,\n type ClientEncryptionOptions\n} from './utils/client-encryption.js'\n\nexport {\n PrivateMetadataStorage,\n IPFSProvider,\n LocalStorageProvider,\n PrivateDataQuery,\n estimateStorageCost,\n createPrivacyManifest,\n type StorageProvider,\n type StoredPrivateData,\n type PrivateDataReference,\n type PrivacyManifest\n} from './utils/private-metadata.js'\n\n// Confidential transfer removed - x402 payment protocol focus\n// export {\n// ConfidentialTransferManager,\n// type ConfidentialAccount,\n// type ConfigureAccountParams,\n// type DepositParams,\n// type WithdrawParams,\n// type TransferParams\n// } from './utils/confidential-transfer-manager.js'\n\nexport {\n getFeatureFlags,\n isFeatureEnabled,\n FeatureFlagManager,\n type FeatureFlags\n} from './utils/feature-flags.js'\n\nexport {\n checkFeatureGate,\n clearFeatureGateCache,\n FEATURE_GATES,\n type FeatureStatus\n} from './utils/feature-gate-detector.js'\n\n// ZK proof builder removed - x402 payment protocol focus\n// export {\n// generateRangeProofWithCommitment,\n// generateTransferProofWithInstruction,\n// isZkProgramAvailable,\n// getZkProgramStatus,\n// ProofMode,\n// type ProofGenerationOptions,\n// type ProofGenerationResult\n// } from './utils/zk-proof-builder.js'\n\n// Migration utilities removed - ZK program post-mortem\n// All necessary functionality is available through the modern client implementation above","/**\n * X402 Transaction Indexer\n *\n * Polls Solana blockchain for x402 payment transactions to eliminate\n * webhook dependency and enable historical reputation backfilling.\n *\n * x402 payments are SPL token transfers (USDC) to PayAI facilitator addresses.\n * This indexer discovers these transfers and extracts payment metadata.\n *\n * @module modules/indexer\n */\n\nimport type { Address, Signature } from '@solana/kit'\nimport type { Rpc, GetSignaturesForAddressApi, GetTransactionApi } from '@solana/rpc'\n\n// =====================================================\n// TYPES\n// =====================================================\n\n/**\n * Parsed x402 payment data from on-chain transaction\n */\nexport interface X402PaymentData {\n /** Transaction signature (on-chain proof) */\n signature: string\n /** Merchant (agent) receiving payment */\n merchant: Address\n /** Payer sending payment */\n payer: Address\n /** Payment amount in token base units (e.g., micro-USDC) */\n amount: string\n /** Payment success status */\n success: boolean\n /** Block timestamp */\n timestamp: Date\n /** Solana network */\n network: 'solana' | 'solana-devnet'\n /** Response time in milliseconds (if available from memo) */\n responseTimeMs?: number\n /** Additional metadata from transaction memo */\n metadata?: Record<string, unknown>\n}\n\n/**\n * Transaction signature with metadata\n */\nexport interface SignatureInfo {\n signature: Signature\n slot: bigint\n blockTime: bigint | null\n err: unknown | null\n}\n\n/**\n * Indexer configuration\n */\nexport interface X402IndexerConfig {\n /** Solana RPC client */\n rpc: Rpc<GetSignaturesForAddressApi & GetTransactionApi>\n /** PayAI facilitator address to monitor */\n facilitatorAddress: Address\n /** Network identifier */\n network?: 'solana' | 'solana-devnet'\n /** Maximum transactions per poll */\n batchSize?: number\n}\n\n// =====================================================\n// X402 TRANSACTION INDEXER\n// =====================================================\n\n/**\n * X402 Transaction Indexer\n *\n * Discovers x402 payments by monitoring SPL token transfers\n * to PayAI facilitator addresses on Solana.\n *\n * @example\n * ```typescript\n * const indexer = new X402TransactionIndexer({\n * rpc: createSolanaRpc('https://api.devnet.solana.com'),\n * facilitatorAddress: address('PayAI...'),\n * network: 'solana-devnet',\n * })\n *\n * // Poll for new transactions\n * const payments = await indexer.pollTransactions()\n * ```\n */\nexport class X402TransactionIndexer {\n private readonly rpc: Rpc<GetSignaturesForAddressApi & GetTransactionApi>\n private readonly facilitatorAddress: Address\n private readonly network: 'solana' | 'solana-devnet'\n private readonly batchSize: number\n\n constructor(config: X402IndexerConfig) {\n this.rpc = config.rpc\n this.facilitatorAddress = config.facilitatorAddress\n this.network = config.network || 'solana'\n this.batchSize = config.batchSize || 100\n }\n\n // =====================================================\n // PUBLIC METHODS\n // =====================================================\n\n /**\n * Poll for new x402 transactions since last sync\n *\n * @param lastSignature - Last processed signature (for pagination)\n * @param limit - Maximum transactions to fetch\n * @returns Array of parsed x402 payment data\n */\n async pollTransactions(\n lastSignature?: Signature,\n limit?: number\n ): Promise<X402PaymentData[]> {\n try {\n // 1. Fetch transaction signatures for facilitator address\n const signatures = await this.getSignatures(lastSignature, limit)\n\n if (signatures.length === 0) {\n return []\n }\n\n console.log(`[X402 Indexer] Found ${signatures.length} new transactions`)\n\n // 2. Parse each transaction to extract x402 payment data\n const payments: X402PaymentData[] = []\n\n for (const sig of signatures) {\n try {\n const payment = await this.parseTransaction(sig.signature)\n\n if (payment) {\n payments.push(payment)\n }\n } catch (error) {\n console.error(`[X402 Indexer] Failed to parse transaction ${sig.signature}:`, error)\n // Continue processing other transactions\n }\n }\n\n console.log(`[X402 Indexer] Parsed ${payments.length} x402 payments`)\n\n return payments\n } catch (error) {\n console.error('[X402 Indexer] Failed to poll transactions:', error)\n throw error\n }\n }\n\n /**\n * Parse a specific transaction signature\n *\n * @param signature - Transaction signature to parse\n * @returns Parsed x402 payment data or null if not an x402 payment\n */\n async parseTransaction(sig: Signature | string): Promise<X402PaymentData | null> {\n try {\n // Fetch full transaction data\n const txSignature = (typeof sig === 'string' ? sig : sig) as Signature\n const response = await this.rpc\n .getTransaction(txSignature, {\n maxSupportedTransactionVersion: 0,\n encoding: 'jsonParsed',\n })\n .send()\n\n if (!response || !response.transaction) {\n return null\n }\n\n // Check if this is an x402 payment (SPL token transfer)\n const isX402 = this.isX402Payment(response)\n if (!isX402) {\n return null\n }\n\n // Extract payment data from transaction\n return this.extractPaymentData(response, typeof sig === 'string' ? sig : String(sig))\n } catch (error) {\n console.error(`[X402 Indexer] Failed to fetch transaction ${sig}:`, error)\n return null\n }\n }\n\n // =====================================================\n // PRIVATE METHODS\n // =====================================================\n\n /**\n * Fetch transaction signatures for the facilitator address\n */\n private async getSignatures(\n before?: Signature,\n limit?: number\n ): Promise<SignatureInfo[]> {\n try {\n const config: { limit: number; before?: Signature } = {\n limit: limit || this.batchSize,\n }\n\n if (before) {\n config.before = before\n }\n\n const response = await this.rpc\n .getSignaturesForAddress(this.facilitatorAddress, config)\n .send()\n\n return response.map((sig) => ({\n signature: sig.signature,\n slot: sig.slot,\n blockTime: sig.blockTime,\n err: sig.err ?? null,\n }))\n } catch (error) {\n console.error('[X402 Indexer] Failed to fetch signatures:', error)\n throw error\n }\n }\n\n /**\n * Check if transaction is an x402 payment\n *\n * x402 payments are characterized by:\n * - SPL token transfer (TokenProgram or Token2022Program)\n * - Transfer TO the facilitator address\n * - Optional memo instruction with payment metadata\n */\n private isX402Payment(transaction: any): boolean {\n try {\n const instructions = transaction.transaction?.message?.instructions || []\n\n // Look for SPL token transfer instruction\n const hasTokenTransfer = instructions.some((ix: any) => {\n // Check if this is a token program instruction\n const programId = ix.programId?.toString()\n const isTokenProgram =\n programId === 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA' || // SPL Token\n programId === 'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb' // Token-2022\n\n if (!isTokenProgram) return false\n\n // Check if this is a transfer instruction\n const parsed = ix.parsed\n if (parsed?.type === 'transfer' || parsed?.type === 'transferChecked') {\n // Verify destination is the facilitator\n const destination = parsed.info?.destination\n return destination === this.facilitatorAddress.toString()\n }\n\n return false\n })\n\n return hasTokenTransfer\n } catch (error) {\n console.error('[X402 Indexer] Error checking if x402 payment:', error)\n return false\n }\n }\n\n /**\n * Extract payment data from transaction\n */\n private extractPaymentData(transaction: any, signature: string): X402PaymentData | null {\n try {\n const instructions = transaction.transaction?.message?.instructions || []\n\n // Find token transfer instruction\n const transferIx = instructions.find((ix: any) => {\n const parsed = ix.parsed\n return parsed?.type === 'transfer' || parsed?.type === 'transferChecked'\n })\n\n if (!transferIx) {\n return null\n }\n\n const transferInfo = transferIx.parsed.info\n\n // Extract basic payment data\n const merchant = transferInfo.destination as Address\n const payer = transferInfo.source as Address\n const amount = transferInfo.amount || transferInfo.tokenAmount?.amount || '0'\n const success = transaction.meta?.err === null\n\n // Extract timestamp from block time\n const blockTime = transaction.blockTime\n const timestamp = blockTime ? new Date(blockTime * 1000) : new Date()\n\n // Look for memo instruction (optional metadata)\n const memoIx = instructions.find((ix: any) =>\n ix.programId?.toString()?.includes('Memo')\n )\n\n let responseTimeMs: number | undefined\n let metadata: Record<string, unknown> | undefined\n\n if (memoIx && memoIx.data) {\n try {\n // Decode memo data\n const memoText = Buffer.from(memoIx.data, 'base64').toString('utf-8')\n const memoData = JSON.parse(memoText)\n\n responseTimeMs = memoData.responseTimeMs\n metadata = memoData\n } catch {\n // Memo is not JSON, ignore\n }\n }\n\n return {\n signature,\n merchant,\n payer,\n amount,\n success,\n timestamp,\n network: this.network,\n responseTimeMs,\n metadata,\n }\n } catch (error) {\n console.error('[X402 Indexer] Failed to extract payment data:', error)\n return null\n }\n }\n}\n","/**\n * PayAI Webhook Handler\n *\n * Handles incoming webhooks from PayAI facilitator for payment events.\n * Converts payment data to reputation records for GhostSpeak's\n * reputation system.\n *\n * @module payai/PayAIWebhookHandler\n * @see https://docs.payai.network/x402/introduction\n */\n\nimport { EventEmitter } from 'node:events'\nimport { createHmac, timingSafeEqual } from 'node:crypto'\nimport type { Address } from '@solana/addresses'\nimport type {\n PayAIWebhookPayload,\n PayAIWebhookHandlerOptions,\n PayAIWebhookResult,\n PayAIWebhookVerification,\n PayAIReputationRecord,\n PayAIPaymentData\n} from './PayAITypes.js'\nimport type { AuthorizationModule } from '../modules/authorization/AuthorizationModule.js'\n\n// =====================================================\n// CONSTANTS\n// =====================================================\n\n/** Default tolerance for webhook timestamp verification (5 minutes) */\nconst TIMESTAMP_TOLERANCE_MS = 5 * 60 * 1000\n\n/** PayAI webhook signature header name */\nconst SIGNATURE_HEADER = 'x-payai-signature'\n\n/** PayAI webhook timestamp header name */\nconst TIMESTAMP_HEADER = 'x-payai-timestamp'\n\n// =====================================================\n// WEBHOOK HANDLER CLASS\n// =====================================================\n\n/**\n * Events emitted by the webhook handler\n */\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\ninterface _PayAIWebhookHandlerEvents {\n 'payment:verified': (data: PayAIPaymentData) => void\n 'payment:settled': (data: PayAIPaymentData) => void\n 'payment:failed': (data: PayAIPaymentData) => void\n 'reputation:recorded': (record: PayAIReputationRecord) => void\n 'error': (error: Error) => void\n}\n\n/**\n * PayAI Webhook Handler\n *\n * Processes incoming PayAI webhooks and converts payment events\n * to reputation records for the GhostSpeak reputation system.\n *\n * @example\n * ```typescript\n * const handler = new PayAIWebhookHandler({\n * webhookSecret: process.env.PAYAI_WEBHOOK_SECRET,\n * onRecordReputation: async (record) => {\n * await reputationModule.recordPayAIPayment(record);\n * }\n * });\n *\n * // In your API route\n * const result = await handler.handleWebhook(request);\n * ```\n */\nexport class PayAIWebhookHandler extends EventEmitter {\n private readonly options: PayAIWebhookHandlerOptions\n private readonly verifySignatures: boolean\n private readonly authorizationModule?: AuthorizationModule\n private readonly payAIFacilitatorAddress?: Address\n\n constructor(\n options: PayAIWebhookHandlerOptions = {},\n authorizationModule?: AuthorizationModule,\n payAIFacilitatorAddress?: Address\n ) {\n super()\n this.options = options\n this.verifySignatures = options.verifySignatures ?? process.env.NODE_ENV === 'production'\n this.authorizationModule = authorizationModule\n this.payAIFacilitatorAddress = payAIFacilitatorAddress\n }\n\n // =====================================================\n // PUBLIC METHODS\n // =====================================================\n\n /**\n * Handle an incoming webhook request\n *\n * @param request - The incoming HTTP request (must have headers and body)\n * @returns Processing result\n */\n async handleWebhook(request: {\n headers: Headers | Record<string, string | undefined>\n body: string | PayAIWebhookPayload\n }): Promise<PayAIWebhookResult> {\n try {\n // Parse body if string\n const payload = typeof request.body === 'string'\n ? JSON.parse(request.body) as PayAIWebhookPayload\n : request.body\n\n // Verify signature if enabled\n if (this.verifySignatures && this.options.webhookSecret) {\n const bodyStr = typeof request.body === 'string'\n ? request.body\n : JSON.stringify(request.body)\n\n const verification = await this.verifySignature(\n request.headers,\n bodyStr\n )\n\n if (!verification.valid) {\n return {\n success: false,\n error: verification.error ?? 'Invalid signature'\n }\n }\n }\n\n // Process the webhook based on event type\n return await this.processPayload(payload)\n\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error'\n this.emit('error', new Error(`Webhook processing failed: ${errorMessage}`))\n\n return {\n success: false,\n error: errorMessage\n }\n }\n }\n\n /**\n * Verify webhook signature\n */\n async verifySignature(\n headers: Headers | Record<string, string | undefined>,\n body: string\n ): Promise<PayAIWebhookVerification> {\n const getHeader = (name: string): string | undefined => {\n if (headers instanceof Headers) {\n return headers.get(name) ?? undefined\n }\n return headers[name]\n }\n\n const signature = getHeader(SIGNATURE_HEADER)\n const timestamp = getHeader(TIMESTAMP_HEADER)\n\n if (!signature) {\n return { valid: false, error: 'Missing signature header' }\n }\n\n if (!timestamp) {\n return { valid: false, error: 'Missing timestamp header' }\n }\n\n // Verify timestamp is recent\n const timestampMs = parseInt(timestamp, 10)\n if (isNaN(timestampMs)) {\n return { valid: false, error: 'Invalid timestamp format' }\n }\n\n const now = Date.now()\n if (Math.abs(now - timestampMs) > TIMESTAMP_TOLERANCE_MS) {\n return { valid: false, error: 'Timestamp too old or too far in future' }\n }\n\n // Verify HMAC signature\n if (!this.options.webhookSecret) {\n return { valid: false, error: 'Webhook secret not configured' }\n }\n\n const expectedSignature = this.computeSignature(\n timestamp,\n body,\n this.options.webhookSecret\n )\n\n const signatureBuffer = Buffer.from(signature, 'hex')\n const expectedBuffer = Buffer.from(expectedSignature, 'hex')\n\n if (signatureBuffer.length !== expectedBuffer.length) {\n return { valid: false, error: 'Invalid signature' }\n }\n\n if (!timingSafeEqual(signatureBuffer, expectedBuffer)) {\n return { valid: false, error: 'Invalid signature' }\n }\n\n return { valid: true }\n }\n\n /**\n * Convert a PayAI payment to a reputation record\n */\n paymentToReputationRecord(data: PayAIPaymentData): PayAIReputationRecord {\n return {\n agentAddress: data.merchant as Address,\n paymentSignature: data.transactionSignature,\n amount: BigInt(data.amount),\n success: data.success ?? data.status === 'settled',\n responseTimeMs: data.responseTimeMs ?? 0,\n payerAddress: data.payer,\n timestamp: new Date(data.settledAt ?? data.verifiedAt ?? Date.now()),\n network: data.network\n }\n }\n\n // =====================================================\n // PRIVATE METHODS\n // =====================================================\n\n /**\n * Process a verified webhook payload\n */\n private async processPayload(payload: PayAIWebhookPayload): Promise<PayAIWebhookResult> {\n const { type, data } = payload\n\n // Emit event based on type\n switch (type) {\n case 'payment.verified':\n this.emit('payment:verified', data)\n await this.options.onPaymentVerified?.(data)\n break\n\n case 'payment.settled':\n this.emit('payment:settled', data)\n await this.options.onPaymentSettled?.(data)\n\n // Record to reputation on settlement\n if (this.options.onRecordReputation) {\n // Verify on-chain authorization if module is configured\n if (this.authorizationModule && this.payAIFacilitatorAddress) {\n const isAuthorized = await this.verifyOnChainAuthorization(data.merchant as Address)\n if (!isAuthorized) {\n return {\n success: false,\n eventType: type,\n paymentId: data.paymentId,\n error: 'Agent has not authorized PayAI facilitator to update reputation',\n reputationRecorded: false\n }\n }\n }\n\n const record = this.paymentToReputationRecord(data)\n await this.options.onRecordReputation(record)\n this.emit('reputation:recorded', record)\n\n return {\n success: true,\n eventType: type,\n paymentId: data.paymentId,\n reputationRecorded: true\n }\n }\n break\n\n case 'payment.failed':\n this.emit('payment:failed', data)\n await this.options.onPaymentFailed?.(data)\n\n // Record failed payment to reputation (negative signal)\n if (this.options.onRecordReputation) {\n const record = this.paymentToReputationRecord(data)\n record.success = false\n await this.options.onRecordReputation(record)\n this.emit('reputation:recorded', record)\n\n return {\n success: true,\n eventType: type,\n paymentId: data.paymentId,\n reputationRecorded: true\n }\n }\n break\n\n case 'payment.refunded':\n // Just emit, don't record to reputation\n break\n\n default:\n return {\n success: false,\n error: `Unknown event type: ${type}`\n }\n }\n\n return {\n success: true,\n eventType: type,\n paymentId: data.paymentId,\n reputationRecorded: false\n }\n }\n\n /**\n * Verify on-chain authorization for an agent\n *\n * Checks if the agent has pre-authorized the PayAI facilitator\n * to update their reputation on-chain.\n */\n private async verifyOnChainAuthorization(agentAddress: Address): Promise<boolean> {\n if (!this.authorizationModule || !this.payAIFacilitatorAddress) {\n // If authorization module is not configured, skip verification\n // (This maintains backwards compatibility)\n return true\n }\n\n try {\n // Fetch authorization from on-chain\n const authorization = await this.authorizationModule.fetchAuthorization(\n agentAddress,\n this.payAIFacilitatorAddress\n )\n\n if (!authorization) {\n return false\n }\n\n // Check if authorization is still valid\n const status = this.authorizationModule.getAuthorizationStatus(\n authorization,\n authorization.currentIndex\n )\n\n return status.isValid\n } catch (error) {\n // Log error but don't throw - authorization verification is optional\n console.error('Failed to verify on-chain authorization:', error)\n return false\n }\n }\n\n /**\n * Compute HMAC-SHA256 signature for a webhook payload\n */\n private computeSignature(timestamp: string, body: string, secret: string): string {\n const signedPayload = `${timestamp}.${body}`\n const hmac = createHmac('sha256', secret)\n hmac.update(signedPayload)\n return hmac.digest('hex')\n }\n}\n\n// =====================================================\n// FACTORY FUNCTION\n// =====================================================\n\n/**\n * Create a new PayAI webhook handler\n *\n * @param options - Handler configuration\n * @returns Configured webhook handler\n */\nexport function createPayAIWebhookHandler(\n options: PayAIWebhookHandlerOptions = {}\n): PayAIWebhookHandler {\n return new PayAIWebhookHandler(options)\n}\n\n// =====================================================\n// UTILITY FUNCTIONS\n// =====================================================\n\n/**\n * Generate a webhook signature for testing\n * (Useful for local development and testing)\n */\nexport function generateTestWebhookSignature(\n body: string,\n secret: string,\n timestamp?: number\n): { signature: string; timestamp: string } {\n const ts = (timestamp ?? Date.now()).toString()\n const signedPayload = `${ts}.${body}`\n const hmac = createHmac('sha256', secret)\n hmac.update(signedPayload)\n\n return {\n signature: hmac.digest('hex'),\n timestamp: ts\n }\n}\n\n/**\n * Create a mock PayAI webhook payload for testing\n */\nexport function createMockPayAIWebhook(\n overrides: Partial<PayAIPaymentData> = {}\n): PayAIWebhookPayload {\n return {\n id: `evt_${Date.now()}`,\n type: 'payment.settled',\n timestamp: new Date().toISOString(),\n data: {\n paymentId: `pay_${Date.now()}`,\n transactionSignature: `${Math.random().toString(36).slice(2)}${Math.random().toString(36).slice(2)}`,\n network: 'solana',\n payer: 'PayerWalletAddress111111111111111111111111',\n merchant: 'MerchantAgentAddress11111111111111111111',\n amount: '1000000', // 1 USDC\n asset: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v',\n assetSymbol: 'USDC',\n status: 'settled',\n resource: 'https://api.example.com/ai/generate',\n responseTimeMs: 250,\n httpStatusCode: 200,\n success: true,\n settledAt: new Date().toISOString(),\n ...overrides\n }\n }\n}\n","/**\n * PayAI Agent Sync\n *\n * Utility for syncing GhostSpeak agents with PayAI marketplace.\n * Allows agents registered in GhostSpeak to be discovered via\n * PayAI's facilitator network.\n *\n * @module payai/PayAIAgentSync\n */\n\nimport { EventEmitter } from 'node:events'\nimport type { Address } from '@solana/addresses'\nimport type { PayAIAgentRegistration, PayAINetwork } from './PayAITypes.js'\n\n// =====================================================\n// CONSTANTS\n// =====================================================\n\n/** Default PayAI marketplace API URL */\nconst DEFAULT_MARKETPLACE_URL = 'https://marketplace.payai.network/api'\n\n// =====================================================\n// TYPES\n// =====================================================\n\n/**\n * Agent sync configuration\n */\nexport interface PayAIAgentSyncConfig {\n /** PayAI marketplace API URL */\n marketplaceUrl?: string\n\n /** API key for PayAI marketplace (if required) */\n apiKey?: string\n\n /** Network to register agents on */\n network?: PayAINetwork\n\n /** Request timeout in milliseconds */\n timeout?: number\n}\n\n/**\n * Agent sync result\n */\nexport interface AgentSyncResult {\n success: boolean\n agentId?: string\n marketplaceUrl?: string\n error?: string\n}\n\n/**\n * Agent data from GhostSpeak\n */\nexport interface GhostSpeakAgentData {\n /** Agent's Solana address */\n address: Address\n\n /** Agent name */\n name: string\n\n /** Agent description */\n description?: string\n\n /** Service capabilities/tags */\n capabilities: string[]\n\n /** x402-enabled service endpoint */\n serviceEndpoint: string\n\n /** Accepted payment tokens (e.g., USDC, SOL) */\n acceptedTokens: string[]\n\n /** Pricing in USDC (min, max) */\n pricing?: {\n minPrice: string\n maxPrice: string\n currency: string\n }\n\n /** Agent logo URL */\n logo?: string\n\n /** Agent website */\n website?: string\n\n /** Reputation score (0-10000) */\n reputationScore?: number\n}\n\n// =====================================================\n// AGENT SYNC CLASS\n// =====================================================\n\n/**\n * PayAI Agent Sync Manager\n *\n * Synchronizes GhostSpeak agents with PayAI marketplace for discovery.\n */\nexport class PayAIAgentSync extends EventEmitter {\n private readonly config: Required<Omit<PayAIAgentSyncConfig, 'apiKey'>> & { apiKey?: string }\n\n constructor(config: PayAIAgentSyncConfig = {}) {\n super()\n this.config = {\n marketplaceUrl: config.marketplaceUrl ?? DEFAULT_MARKETPLACE_URL,\n apiKey: config.apiKey,\n network: config.network ?? 'solana',\n timeout: config.timeout ?? 30000,\n }\n }\n\n // =====================================================\n // PUBLIC METHODS\n // =====================================================\n\n /**\n * Register a GhostSpeak agent with PayAI marketplace\n *\n * @param agent - Agent data from GhostSpeak\n * @returns Registration result\n */\n async registerAgent(agent: GhostSpeakAgentData): Promise<AgentSyncResult> {\n try {\n const registration = this.toPayAIRegistration(agent)\n\n const response = await this.makeRequest('/merchants/register', {\n method: 'POST',\n body: JSON.stringify(registration),\n })\n\n if (!response.ok) {\n const error = await response.text()\n return {\n success: false,\n error: `Registration failed: ${error}`,\n }\n }\n\n const data = await response.json() as { agentId: string; url: string }\n\n this.emit('agent:registered', {\n agentAddress: agent.address,\n agentId: data.agentId,\n })\n\n return {\n success: true,\n agentId: data.agentId,\n marketplaceUrl: data.url,\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error'\n return {\n success: false,\n error: errorMessage,\n }\n }\n }\n\n /**\n * Update an agent's registration on PayAI marketplace\n *\n * @param agentId - PayAI agent ID\n * @param agent - Updated agent data\n * @returns Update result\n */\n async updateAgent(agentId: string, agent: Partial<GhostSpeakAgentData>): Promise<AgentSyncResult> {\n try {\n const response = await this.makeRequest(`/merchants/${agentId}`, {\n method: 'PATCH',\n body: JSON.stringify(agent),\n })\n\n if (!response.ok) {\n const error = await response.text()\n return {\n success: false,\n error: `Update failed: ${error}`,\n }\n }\n\n this.emit('agent:updated', { agentId })\n\n return {\n success: true,\n agentId,\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error'\n return {\n success: false,\n error: errorMessage,\n }\n }\n }\n\n /**\n * Remove an agent from PayAI marketplace\n *\n * @param agentId - PayAI agent ID\n * @returns Removal result\n */\n async removeAgent(agentId: string): Promise<AgentSyncResult> {\n try {\n const response = await this.makeRequest(`/merchants/${agentId}`, {\n method: 'DELETE',\n })\n\n if (!response.ok) {\n const error = await response.text()\n return {\n success: false,\n error: `Removal failed: ${error}`,\n }\n }\n\n this.emit('agent:removed', { agentId })\n\n return {\n success: true,\n agentId,\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error'\n return {\n success: false,\n error: errorMessage,\n }\n }\n }\n\n /**\n * Check if an agent is registered on PayAI marketplace\n *\n * @param agentAddress - Agent's Solana address\n * @returns Whether agent is registered\n */\n async isAgentRegistered(agentAddress: Address): Promise<boolean> {\n try {\n const response = await this.makeRequest(\n `/merchants/check?address=${agentAddress}&network=${this.config.network}`\n )\n\n if (!response.ok) {\n return false\n }\n\n const data = await response.json() as { registered: boolean }\n return data.registered\n } catch {\n return false\n }\n }\n\n /**\n * Get agent's PayAI marketplace listing\n *\n * @param agentAddress - Agent's Solana address\n * @returns Agent listing or null\n */\n async getAgentListing(agentAddress: Address): Promise<PayAIAgentRegistration | null> {\n try {\n const response = await this.makeRequest(\n `/merchants/by-address?address=${agentAddress}&network=${this.config.network}`\n )\n\n if (!response.ok) {\n return null\n }\n\n return response.json() as Promise<PayAIAgentRegistration>\n } catch {\n return null\n }\n }\n\n /**\n * Sync reputation score to PayAI marketplace\n *\n * Updates the agent's reputation score on PayAI based on\n * GhostSpeak reputation calculations.\n *\n * @param agentId - PayAI agent ID\n * @param reputationScore - New reputation score (0-10000)\n * @returns Update result\n */\n async syncReputationScore(agentId: string, reputationScore: number): Promise<AgentSyncResult> {\n try {\n const response = await this.makeRequest(`/merchants/${agentId}/reputation`, {\n method: 'POST',\n body: JSON.stringify({\n score: reputationScore,\n source: 'ghostspeak',\n timestamp: Date.now(),\n }),\n })\n\n if (!response.ok) {\n const error = await response.text()\n return {\n success: false,\n error: `Reputation sync failed: ${error}`,\n }\n }\n\n this.emit('reputation:synced', { agentId, reputationScore })\n\n return {\n success: true,\n agentId,\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error'\n return {\n success: false,\n error: errorMessage,\n }\n }\n }\n\n // =====================================================\n // PRIVATE METHODS\n // =====================================================\n\n /**\n * Convert GhostSpeak agent data to PayAI registration format\n */\n private toPayAIRegistration(agent: GhostSpeakAgentData): PayAIAgentRegistration {\n return {\n agentAddress: agent.address,\n serviceEndpoint: agent.serviceEndpoint,\n capabilities: agent.capabilities,\n acceptedTokens: agent.acceptedTokens,\n pricing: agent.pricing,\n metadata: {\n name: agent.name,\n description: agent.description,\n logo: agent.logo,\n website: agent.website,\n },\n }\n }\n\n /**\n * Make an authenticated request to PayAI marketplace\n */\n private async makeRequest(\n path: string,\n options: RequestInit = {}\n ): Promise<Response> {\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout)\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'X-Ghostspeak-Integration': '1.0',\n }\n\n if (this.config.apiKey) {\n headers['Authorization'] = `Bearer ${this.config.apiKey}`\n }\n\n try {\n const response = await fetch(`${this.config.marketplaceUrl}${path}`, {\n ...options,\n headers: {\n ...headers,\n ...options.headers as Record<string, string>,\n },\n signal: controller.signal,\n })\n\n return response\n } finally {\n clearTimeout(timeoutId)\n }\n }\n}\n\n// =====================================================\n// FACTORY FUNCTION\n// =====================================================\n\n/**\n * Create a PayAI agent sync manager\n *\n * @param config - Sync configuration\n * @returns Configured sync manager\n */\nexport function createPayAIAgentSync(config: PayAIAgentSyncConfig = {}): PayAIAgentSync {\n return new PayAIAgentSync(config)\n}\n","/**\n * Test IPFS configuration for beta testing and development\n */\n\nimport type { IPFSConfig } from '../types/ipfs-types.js'\n\n/**\n * Test IPFS configuration that uses the in-memory test provider\n * This configuration does not require any external services\n */\nexport const TEST_IPFS_CONFIG: IPFSConfig = {\n provider: {\n name: 'test',\n endpoint: 'http://localhost:8080' // Fake endpoint for testing\n },\n gateways: [\n 'http://localhost:8080',\n 'https://test.ipfs.io'\n ],\n autoPinning: true,\n sizeThreshold: 400, // Lower threshold for testing (400 bytes)\n maxRetries: 2,\n retryDelay: 500,\n enableCache: true,\n cacheTTL: 60000 // 1 minute for testing\n}\n\n/**\n * Create a test IPFS configuration with custom options\n */\nexport function createTestIPFSConfig(options?: Partial<IPFSConfig>): IPFSConfig {\n return {\n ...TEST_IPFS_CONFIG,\n ...options,\n provider: {\n ...TEST_IPFS_CONFIG.provider,\n ...(options?.provider ?? {})\n }\n }\n}","/**\n * Enhanced error handling and retry logic for IPFS operations in GhostSpeak\n */\n\nimport type { IPFSError, IPFSOperationResult } from '../types/ipfs-types.js'\n\n/**\n * IPFS-specific error class with enhanced context\n */\nexport class IPFSOperationError extends Error {\n constructor(\n public readonly type: IPFSError,\n message: string,\n public readonly provider?: string,\n public readonly retryCount?: number,\n public readonly originalError?: Error\n ) {\n super(message)\n this.name = 'IPFSOperationError'\n }\n}\n\n/**\n * Configuration for retry logic\n */\nexport interface RetryConfig {\n maxRetries: number\n baseDelay: number\n maxDelay: number\n backoffFactor: number\n retryableErrors: IPFSError[]\n}\n\n/**\n * Default retry configuration\n */\nexport const DEFAULT_RETRY_CONFIG: RetryConfig = {\n maxRetries: 3,\n baseDelay: 1000,\n maxDelay: 30000,\n backoffFactor: 2,\n retryableErrors: [\n 'NETWORK_ERROR',\n 'TIMEOUT_ERROR',\n 'PROVIDER_ERROR'\n ]\n}\n\n/**\n * Circuit breaker for preventing cascading failures\n */\nexport class CircuitBreaker {\n private failures = 0\n private lastFailureTime = 0\n private state: 'CLOSED' | 'OPEN' | 'HALF_OPEN' = 'CLOSED'\n\n constructor(\n private readonly failureThreshold = 5,\n private readonly recoveryTime = 30000\n ) {}\n\n async execute<T>(operation: () => Promise<T>): Promise<T> {\n if (this.state === 'OPEN') {\n if (Date.now() - this.lastFailureTime > this.recoveryTime) {\n this.state = 'HALF_OPEN'\n } else {\n throw new Error('Circuit breaker is OPEN - too many failures')\n }\n }\n\n try {\n const result = await operation()\n this.onSuccess()\n return result\n } catch (error) {\n this.onFailure()\n throw error\n }\n }\n\n private onSuccess(): void {\n this.failures = 0\n this.state = 'CLOSED'\n }\n\n private onFailure(): void {\n this.failures++\n this.lastFailureTime = Date.now()\n \n if (this.failures >= this.failureThreshold) {\n this.state = 'OPEN'\n }\n }\n\n getState(): { state: string; failures: number; lastFailureTime: number } {\n return {\n state: this.state,\n failures: this.failures,\n lastFailureTime: this.lastFailureTime\n }\n }\n\n reset(): void {\n this.failures = 0\n this.lastFailureTime = 0\n this.state = 'CLOSED'\n }\n}\n\n/**\n * Enhanced retry utility with exponential backoff\n */\nexport class RetryHandler {\n private circuitBreaker: CircuitBreaker\n\n constructor(\n private readonly config: RetryConfig = DEFAULT_RETRY_CONFIG\n ) {\n this.circuitBreaker = new CircuitBreaker()\n }\n\n async execute<T>(\n operation: () => Promise<T>,\n context?: string\n ): Promise<T> {\n return this.circuitBreaker.execute(async () => {\n let lastError: Error\n \n for (let attempt = 0; attempt <= this.config.maxRetries; attempt++) {\n try {\n const result = await operation()\n \n if (attempt > 0) {\n console.log(`✅ Operation succeeded after ${attempt} retries${context ? ` (${context})` : ''}`)\n }\n \n return result\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error))\n \n if (attempt === this.config.maxRetries) {\n break // Don't delay on the last attempt\n }\n\n const shouldRetry = this.shouldRetry(lastError, attempt)\n if (!shouldRetry) {\n console.log(`❌ Error not retryable${context ? ` (${context})` : ''}:`, lastError.message)\n break\n }\n\n const delay = this.calculateDelay(attempt)\n console.log(`⏳ Retrying in ${delay}ms... (attempt ${attempt + 1}/${this.config.maxRetries}${context ? `, ${context}` : ''})`)\n \n await new Promise(resolve => setTimeout(resolve, delay))\n }\n }\n \n throw new IPFSOperationError(\n this.categorizeError(lastError!),\n `Operation failed after ${this.config.maxRetries + 1} attempts${context ? ` (${context})` : ''}: ${lastError!.message}`,\n undefined,\n this.config.maxRetries\n )\n })\n }\n\n private shouldRetry(error: Error, attempt: number): boolean {\n if (attempt >= this.config.maxRetries) {\n return false\n }\n\n const errorType = this.categorizeError(error)\n return this.config.retryableErrors.includes(errorType)\n }\n\n private calculateDelay(attempt: number): number {\n const exponentialDelay = this.config.baseDelay * Math.pow(this.config.backoffFactor, attempt)\n const jitter = Math.random() * 0.1 * exponentialDelay // Add 10% jitter\n return Math.min(exponentialDelay + jitter, this.config.maxDelay)\n }\n\n private categorizeError(error: Error): IPFSError {\n const message = error.message.toLowerCase()\n \nif (message.includes('timeout')) {\n return 'TIMEOUT_ERROR'\n }\n \nif (message.includes('network')) {\n return 'NETWORK_ERROR'\n }\n \nif (message.includes('unauthorized')) {\n return 'AUTHENTICATION_FAILED'\n }\n \nif (message.includes('quota')) {\n return 'QUOTA_EXCEEDED'\n }\n \n if (message.includes('invalid') && message.includes('hash')) {\n return 'INVALID_HASH'\n }\n \nif (message.includes('too large')) {\n return 'CONTENT_TOO_LARGE'\n }\n \n return 'PROVIDER_ERROR'\n }\n\n getStats(): {\n circuitBreakerState: ReturnType<CircuitBreaker['getState']>\n config: RetryConfig\n } {\n return {\n circuitBreakerState: this.circuitBreaker.getState(),\n config: this.config\n }\n }\n\n reset(): void {\n this.circuitBreaker.reset()\n }\n}\n\n/**\n * Fallback handler for graceful degradation\n */\nexport class FallbackHandler {\n private fallbackStrategies: Map<IPFSError, (error: IPFSOperationError) => Promise<unknown>> = new Map()\n\n constructor() {\n this.setupDefaultFallbacks()\n }\n\n private setupDefaultFallbacks(): void {\n // Fallback for upload failures - compress and retry inline storage\n this.fallbackStrategies.set('UPLOAD_FAILED', async (error) => {\n console.log('🔄 Upload failed, attempting inline storage fallback...')\n throw error // Let caller handle inline storage\n })\n\n // Fallback for retrieval failures - try alternative gateways\n this.fallbackStrategies.set('RETRIEVAL_FAILED', async (error) => {\n console.log('🔄 Retrieval failed, trying alternative gateways...')\n throw error // Let caller try alternative gateways\n })\n\n // Fallback for quota exceeded - suggest cleanup or alternative storage\n this.fallbackStrategies.set('QUOTA_EXCEEDED', async (error) => {\n console.warn('⚠️ IPFS quota exceeded - consider upgrading plan or cleaning up old content')\n throw error\n })\n }\n\n async handleError<T>(error: IPFSOperationError, fallbackValue?: T): Promise<T> {\n const strategy = this.fallbackStrategies.get(error.type)\n \n if (strategy) {\n try {\n const result = await strategy(error)\n return result as T\n } catch (_fallbackError) {\n console.warn('Fallback strategy also failed:', _fallbackError instanceof Error ? _fallbackError.message : String(_fallbackError))\n }\n }\n\n if (fallbackValue !== undefined) {\n console.log('Using provided fallback value')\n return fallbackValue\n }\n\n throw error\n }\n\n registerFallback<T>(errorType: IPFSError, strategy: (error: IPFSOperationError) => Promise<T>): void {\n this.fallbackStrategies.set(errorType, strategy)\n }\n}\n\n/**\n * Comprehensive error handler that combines retry logic with fallback strategies\n */\nexport class IPFSErrorHandler {\n private retryHandler: RetryHandler\n private fallbackHandler: FallbackHandler\n\n constructor(retryConfig?: Partial<RetryConfig>) {\n this.retryHandler = new RetryHandler({ ...DEFAULT_RETRY_CONFIG, ...retryConfig })\n this.fallbackHandler = new FallbackHandler()\n }\n\n async executeWithErrorHandling<T>(\n operation: () => Promise<IPFSOperationResult<T>>,\n context?: string,\n fallbackValue?: T\n ): Promise<IPFSOperationResult<T>> {\n try {\n const result = await this.retryHandler.execute(async () => {\n const opResult = await operation()\n \n if (!opResult.success && opResult.error) {\n throw new IPFSOperationError(\n opResult.error,\n opResult.message ?? `IPFS operation failed: ${opResult.error}`\n )\n }\n \n return opResult\n }, context)\n\n return result\n } catch (error) {\n const ipfsError = error instanceof IPFSOperationError \n ? error \n : new IPFSOperationError('PROVIDER_ERROR', error instanceof Error ? error.message : String(error))\n\n try {\n const fallbackResult = await this.fallbackHandler.handleError(ipfsError, fallbackValue)\n return {\n success: true,\n data: fallbackResult,\n message: 'Operation succeeded using fallback strategy'\n }\n } catch {\n return {\n success: false,\n error: ipfsError.type,\n message: ipfsError.message,\n duration: 0\n }\n }\n }\n }\n\n /**\n * Register a custom fallback strategy\n */\n registerFallback<T>(errorType: IPFSError, strategy: (error: IPFSOperationError) => Promise<T>): void {\n this.fallbackHandler.registerFallback(errorType, strategy)\n }\n\n /**\n * Get error handler statistics\n */\n getStats(): {\n retryStats: ReturnType<RetryHandler['getStats']>\n registeredFallbacks: IPFSError[]\n } {\n return {\n retryStats: this.retryHandler.getStats(),\n registeredFallbacks: Array.from(this.fallbackHandler['fallbackStrategies'].keys())\n }\n }\n\n /**\n * Reset all error handling state\n */\n reset(): void {\n this.retryHandler.reset()\n }\n}\n\n/**\n * Utility function to create a configured error handler\n */\nexport function createIPFSErrorHandler(config?: {\n retryConfig?: Partial<RetryConfig>\n customFallbacks?: {\n errorType: IPFSError\n strategy: (error: IPFSOperationError) => Promise<unknown>\n }[]\n}): IPFSErrorHandler {\n const handler = new IPFSErrorHandler(config?.retryConfig)\n \n if (config?.customFallbacks) {\n for (const { errorType, strategy } of config.customFallbacks) {\n handler.registerFallback(errorType, strategy)\n }\n }\n \n return handler\n}\n\n/**\n * Type guard to check if an error is an IPFS error\n */\nexport function isIPFSError(error: unknown): error is IPFSOperationError {\n return error instanceof IPFSOperationError\n}\n\n/**\n * Helper function to wrap any IPFS operation with error handling\n */\nexport async function withIPFSErrorHandling<T>(\n operation: () => Promise<T>,\n context?: string,\n errorHandler?: IPFSErrorHandler\n): Promise<IPFSOperationResult<T>> {\n const handler = errorHandler ?? new IPFSErrorHandler()\n \n return handler.executeWithErrorHandling(\n async () => {\n try {\n const result = await operation()\n return { success: true, data: result }\n } catch (error) {\n const ipfsError = error instanceof IPFSOperationError \n ? error.type \n : 'PROVIDER_ERROR' as IPFSError\n \n return {\n success: false,\n error: ipfsError,\n message: error instanceof Error ? error.message : String(error)\n }\n }\n },\n context\n )\n}","const ANSI_BACKGROUND_OFFSET = 10;\n\nconst wrapAnsi16 = (offset = 0) => code => `\\u001B[${code + offset}m`;\n\nconst wrapAnsi256 = (offset = 0) => code => `\\u001B[${38 + offset};5;${code}m`;\n\nconst wrapAnsi16m = (offset = 0) => (red, green, blue) => `\\u001B[${38 + offset};2;${red};${green};${blue}m`;\n\nconst styles = {\n\tmodifier: {\n\t\treset: [0, 0],\n\t\t// 21 isn't widely supported and 22 does the same thing\n\t\tbold: [1, 22],\n\t\tdim: [2, 22],\n\t\titalic: [3, 23],\n\t\tunderline: [4, 24],\n\t\toverline: [53, 55],\n\t\tinverse: [7, 27],\n\t\thidden: [8, 28],\n\t\tstrikethrough: [9, 29],\n\t},\n\tcolor: {\n\t\tblack: [30, 39],\n\t\tred: [31, 39],\n\t\tgreen: [32, 39],\n\t\tyellow: [33, 39],\n\t\tblue: [34, 39],\n\t\tmagenta: [35, 39],\n\t\tcyan: [36, 39],\n\t\twhite: [37, 39],\n\n\t\t// Bright color\n\t\tblackBright: [90, 39],\n\t\tgray: [90, 39], // Alias of `blackBright`\n\t\tgrey: [90, 39], // Alias of `blackBright`\n\t\tredBright: [91, 39],\n\t\tgreenBright: [92, 39],\n\t\tyellowBright: [93, 39],\n\t\tblueBright: [94, 39],\n\t\tmagentaBright: [95, 39],\n\t\tcyanBright: [96, 39],\n\t\twhiteBright: [97, 39],\n\t},\n\tbgColor: {\n\t\tbgBlack: [40, 49],\n\t\tbgRed: [41, 49],\n\t\tbgGreen: [42, 49],\n\t\tbgYellow: [43, 49],\n\t\tbgBlue: [44, 49],\n\t\tbgMagenta: [45, 49],\n\t\tbgCyan: [46, 49],\n\t\tbgWhite: [47, 49],\n\n\t\t// Bright color\n\t\tbgBlackBright: [100, 49],\n\t\tbgGray: [100, 49], // Alias of `bgBlackBright`\n\t\tbgGrey: [100, 49], // Alias of `bgBlackBright`\n\t\tbgRedBright: [101, 49],\n\t\tbgGreenBright: [102, 49],\n\t\tbgYellowBright: [103, 49],\n\t\tbgBlueBright: [104, 49],\n\t\tbgMagentaBright: [105, 49],\n\t\tbgCyanBright: [106, 49],\n\t\tbgWhiteBright: [107, 49],\n\t},\n};\n\nexport const modifierNames = Object.keys(styles.modifier);\nexport const foregroundColorNames = Object.keys(styles.color);\nexport const backgroundColorNames = Object.keys(styles.bgColor);\nexport const colorNames = [...foregroundColorNames, ...backgroundColorNames];\n\nfunction assembleStyles() {\n\tconst codes = new Map();\n\n\tfor (const [groupName, group] of Object.entries(styles)) {\n\t\tfor (const [styleName, style] of Object.entries(group)) {\n\t\t\tstyles[styleName] = {\n\t\t\t\topen: `\\u001B[${style[0]}m`,\n\t\t\t\tclose: `\\u001B[${style[1]}m`,\n\t\t\t};\n\n\t\t\tgroup[styleName] = styles[styleName];\n\n\t\t\tcodes.set(style[0], style[1]);\n\t\t}\n\n\t\tObject.defineProperty(styles, groupName, {\n\t\t\tvalue: group,\n\t\t\tenumerable: false,\n\t\t});\n\t}\n\n\tObject.defineProperty(styles, 'codes', {\n\t\tvalue: codes,\n\t\tenumerable: false,\n\t});\n\n\tstyles.color.close = '\\u001B[39m';\n\tstyles.bgColor.close = '\\u001B[49m';\n\n\tstyles.color.ansi = wrapAnsi16();\n\tstyles.color.ansi256 = wrapAnsi256();\n\tstyles.color.ansi16m = wrapAnsi16m();\n\tstyles.bgColor.ansi = wrapAnsi16(ANSI_BACKGROUND_OFFSET);\n\tstyles.bgColor.ansi256 = wrapAnsi256(ANSI_BACKGROUND_OFFSET);\n\tstyles.bgColor.ansi16m = wrapAnsi16m(ANSI_BACKGROUND_OFFSET);\n\n\t// From https://github.com/Qix-/color-convert/blob/3f0e0d4e92e235796ccb17f6e85c72094a651f49/conversions.js\n\tObject.defineProperties(styles, {\n\t\trgbToAnsi256: {\n\t\t\tvalue(red, green, blue) {\n\t\t\t\t// We use the extended greyscale palette here, with the exception of\n\t\t\t\t// black and white. normal palette only has 4 greyscale shades.\n\t\t\t\tif (red === green && green === blue) {\n\t\t\t\t\tif (red < 8) {\n\t\t\t\t\t\treturn 16;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (red > 248) {\n\t\t\t\t\t\treturn 231;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn Math.round(((red - 8) / 247) * 24) + 232;\n\t\t\t\t}\n\n\t\t\t\treturn 16\n\t\t\t\t\t+ (36 * Math.round(red / 255 * 5))\n\t\t\t\t\t+ (6 * Math.round(green / 255 * 5))\n\t\t\t\t\t+ Math.round(blue / 255 * 5);\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToRgb: {\n\t\t\tvalue(hex) {\n\t\t\t\tconst matches = /[a-f\\d]{6}|[a-f\\d]{3}/i.exec(hex.toString(16));\n\t\t\t\tif (!matches) {\n\t\t\t\t\treturn [0, 0, 0];\n\t\t\t\t}\n\n\t\t\t\tlet [colorString] = matches;\n\n\t\t\t\tif (colorString.length === 3) {\n\t\t\t\t\tcolorString = [...colorString].map(character => character + character).join('');\n\t\t\t\t}\n\n\t\t\t\tconst integer = Number.parseInt(colorString, 16);\n\n\t\t\t\treturn [\n\t\t\t\t\t/* eslint-disable no-bitwise */\n\t\t\t\t\t(integer >> 16) & 0xFF,\n\t\t\t\t\t(integer >> 8) & 0xFF,\n\t\t\t\t\tinteger & 0xFF,\n\t\t\t\t\t/* eslint-enable no-bitwise */\n\t\t\t\t];\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToAnsi256: {\n\t\t\tvalue: hex => styles.rgbToAnsi256(...styles.hexToRgb(hex)),\n\t\t\tenumerable: false,\n\t\t},\n\t\tansi256ToAnsi: {\n\t\t\tvalue(code) {\n\t\t\t\tif (code < 8) {\n\t\t\t\t\treturn 30 + code;\n\t\t\t\t}\n\n\t\t\t\tif (code < 16) {\n\t\t\t\t\treturn 90 + (code - 8);\n\t\t\t\t}\n\n\t\t\t\tlet red;\n\t\t\t\tlet green;\n\t\t\t\tlet blue;\n\n\t\t\t\tif (code >= 232) {\n\t\t\t\t\tred = (((code - 232) * 10) + 8) / 255;\n\t\t\t\t\tgreen = red;\n\t\t\t\t\tblue = red;\n\t\t\t\t} else {\n\t\t\t\t\tcode -= 16;\n\n\t\t\t\t\tconst remainder = code % 36;\n\n\t\t\t\t\tred = Math.floor(code / 36) / 5;\n\t\t\t\t\tgreen = Math.floor(remainder / 6) / 5;\n\t\t\t\t\tblue = (remainder % 6) / 5;\n\t\t\t\t}\n\n\t\t\t\tconst value = Math.max(red, green, blue) * 2;\n\n\t\t\t\tif (value === 0) {\n\t\t\t\t\treturn 30;\n\t\t\t\t}\n\n\t\t\t\t// eslint-disable-next-line no-bitwise\n\t\t\t\tlet result = 30 + ((Math.round(blue) << 2) | (Math.round(green) << 1) | Math.round(red));\n\n\t\t\t\tif (value === 2) {\n\t\t\t\t\tresult += 60;\n\t\t\t\t}\n\n\t\t\t\treturn result;\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\trgbToAnsi: {\n\t\t\tvalue: (red, green, blue) => styles.ansi256ToAnsi(styles.rgbToAnsi256(red, green, blue)),\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToAnsi: {\n\t\t\tvalue: hex => styles.ansi256ToAnsi(styles.hexToAnsi256(hex)),\n\t\t\tenumerable: false,\n\t\t},\n\t});\n\n\treturn styles;\n}\n\nconst ansiStyles = assembleStyles();\n\nexport default ansiStyles;\n","import process from 'node:process';\nimport os from 'node:os';\nimport tty from 'node:tty';\n\n// From: https://github.com/sindresorhus/has-flag/blob/main/index.js\n/// function hasFlag(flag, argv = globalThis.Deno?.args ?? process.argv) {\nfunction hasFlag(flag, argv = globalThis.Deno ? globalThis.Deno.args : process.argv) {\n\tconst prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--');\n\tconst position = argv.indexOf(prefix + flag);\n\tconst terminatorPosition = argv.indexOf('--');\n\treturn position !== -1 && (terminatorPosition === -1 || position < terminatorPosition);\n}\n\nconst {env} = process;\n\nlet flagForceColor;\nif (\n\thasFlag('no-color')\n\t|| hasFlag('no-colors')\n\t|| hasFlag('color=false')\n\t|| hasFlag('color=never')\n) {\n\tflagForceColor = 0;\n} else if (\n\thasFlag('color')\n\t|| hasFlag('colors')\n\t|| hasFlag('color=true')\n\t|| hasFlag('color=always')\n) {\n\tflagForceColor = 1;\n}\n\nfunction envForceColor() {\n\tif ('FORCE_COLOR' in env) {\n\t\tif (env.FORCE_COLOR === 'true') {\n\t\t\treturn 1;\n\t\t}\n\n\t\tif (env.FORCE_COLOR === 'false') {\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn env.FORCE_COLOR.length === 0 ? 1 : Math.min(Number.parseInt(env.FORCE_COLOR, 10), 3);\n\t}\n}\n\nfunction translateLevel(level) {\n\tif (level === 0) {\n\t\treturn false;\n\t}\n\n\treturn {\n\t\tlevel,\n\t\thasBasic: true,\n\t\thas256: level >= 2,\n\t\thas16m: level >= 3,\n\t};\n}\n\nfunction _supportsColor(haveStream, {streamIsTTY, sniffFlags = true} = {}) {\n\tconst noFlagForceColor = envForceColor();\n\tif (noFlagForceColor !== undefined) {\n\t\tflagForceColor = noFlagForceColor;\n\t}\n\n\tconst forceColor = sniffFlags ? flagForceColor : noFlagForceColor;\n\n\tif (forceColor === 0) {\n\t\treturn 0;\n\t}\n\n\tif (sniffFlags) {\n\t\tif (hasFlag('color=16m')\n\t\t\t|| hasFlag('color=full')\n\t\t\t|| hasFlag('color=truecolor')) {\n\t\t\treturn 3;\n\t\t}\n\n\t\tif (hasFlag('color=256')) {\n\t\t\treturn 2;\n\t\t}\n\t}\n\n\t// Check for Azure DevOps pipelines.\n\t// Has to be above the `!streamIsTTY` check.\n\tif ('TF_BUILD' in env && 'AGENT_NAME' in env) {\n\t\treturn 1;\n\t}\n\n\tif (haveStream && !streamIsTTY && forceColor === undefined) {\n\t\treturn 0;\n\t}\n\n\tconst min = forceColor || 0;\n\n\tif (env.TERM === 'dumb') {\n\t\treturn min;\n\t}\n\n\tif (process.platform === 'win32') {\n\t\t// Windows 10 build 10586 is the first Windows release that supports 256 colors.\n\t\t// Windows 10 build 14931 is the first release that supports 16m/TrueColor.\n\t\tconst osRelease = os.release().split('.');\n\t\tif (\n\t\t\tNumber(osRelease[0]) >= 10\n\t\t\t&& Number(osRelease[2]) >= 10_586\n\t\t) {\n\t\t\treturn Number(osRelease[2]) >= 14_931 ? 3 : 2;\n\t\t}\n\n\t\treturn 1;\n\t}\n\n\tif ('CI' in env) {\n\t\tif (['GITHUB_ACTIONS', 'GITEA_ACTIONS', 'CIRCLECI'].some(key => key in env)) {\n\t\t\treturn 3;\n\t\t}\n\n\t\tif (['TRAVIS', 'APPVEYOR', 'GITLAB_CI', 'BUILDKITE', 'DRONE'].some(sign => sign in env) || env.CI_NAME === 'codeship') {\n\t\t\treturn 1;\n\t\t}\n\n\t\treturn min;\n\t}\n\n\tif ('TEAMCITY_VERSION' in env) {\n\t\treturn /^(9\\.(0*[1-9]\\d*)\\.|\\d{2,}\\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0;\n\t}\n\n\tif (env.COLORTERM === 'truecolor') {\n\t\treturn 3;\n\t}\n\n\tif (env.TERM === 'xterm-kitty') {\n\t\treturn 3;\n\t}\n\n\tif (env.TERM === 'xterm-ghostty') {\n\t\treturn 3;\n\t}\n\n\tif (env.TERM === 'wezterm') {\n\t\treturn 3;\n\t}\n\n\tif ('TERM_PROGRAM' in env) {\n\t\tconst version = Number.parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10);\n\n\t\tswitch (env.TERM_PROGRAM) {\n\t\t\tcase 'iTerm.app': {\n\t\t\t\treturn version >= 3 ? 3 : 2;\n\t\t\t}\n\n\t\t\tcase 'Apple_Terminal': {\n\t\t\t\treturn 2;\n\t\t\t}\n\t\t\t// No default\n\t\t}\n\t}\n\n\tif (/-256(color)?$/i.test(env.TERM)) {\n\t\treturn 2;\n\t}\n\n\tif (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) {\n\t\treturn 1;\n\t}\n\n\tif ('COLORTERM' in env) {\n\t\treturn 1;\n\t}\n\n\treturn min;\n}\n\nexport function createSupportsColor(stream, options = {}) {\n\tconst level = _supportsColor(stream, {\n\t\tstreamIsTTY: stream && stream.isTTY,\n\t\t...options,\n\t});\n\n\treturn translateLevel(level);\n}\n\nconst supportsColor = {\n\tstdout: createSupportsColor({isTTY: tty.isatty(1)}),\n\tstderr: createSupportsColor({isTTY: tty.isatty(2)}),\n};\n\nexport default supportsColor;\n","// TODO: When targeting Node.js 16, use `String.prototype.replaceAll`.\nexport function stringReplaceAll(string, substring, replacer) {\n\tlet index = string.indexOf(substring);\n\tif (index === -1) {\n\t\treturn string;\n\t}\n\n\tconst substringLength = substring.length;\n\tlet endIndex = 0;\n\tlet returnValue = '';\n\tdo {\n\t\treturnValue += string.slice(endIndex, index) + substring + replacer;\n\t\tendIndex = index + substringLength;\n\t\tindex = string.indexOf(substring, endIndex);\n\t} while (index !== -1);\n\n\treturnValue += string.slice(endIndex);\n\treturn returnValue;\n}\n\nexport function stringEncaseCRLFWithFirstIndex(string, prefix, postfix, index) {\n\tlet endIndex = 0;\n\tlet returnValue = '';\n\tdo {\n\t\tconst gotCR = string[index - 1] === '\\r';\n\t\treturnValue += string.slice(endIndex, (gotCR ? index - 1 : index)) + prefix + (gotCR ? '\\r\\n' : '\\n') + postfix;\n\t\tendIndex = index + 1;\n\t\tindex = string.indexOf('\\n', endIndex);\n\t} while (index !== -1);\n\n\treturnValue += string.slice(endIndex);\n\treturn returnValue;\n}\n","import ansiStyles from '#ansi-styles';\nimport supportsColor from '#supports-color';\nimport { // eslint-disable-line import/order\n\tstringReplaceAll,\n\tstringEncaseCRLFWithFirstIndex,\n} from './utilities.js';\n\nconst {stdout: stdoutColor, stderr: stderrColor} = supportsColor;\n\nconst GENERATOR = Symbol('GENERATOR');\nconst STYLER = Symbol('STYLER');\nconst IS_EMPTY = Symbol('IS_EMPTY');\n\n// `supportsColor.level` → `ansiStyles.color[name]` mapping\nconst levelMapping = [\n\t'ansi',\n\t'ansi',\n\t'ansi256',\n\t'ansi16m',\n];\n\nconst styles = Object.create(null);\n\nconst applyOptions = (object, options = {}) => {\n\tif (options.level && !(Number.isInteger(options.level) && options.level >= 0 && options.level <= 3)) {\n\t\tthrow new Error('The `level` option should be an integer from 0 to 3');\n\t}\n\n\t// Detect level if not set manually\n\tconst colorLevel = stdoutColor ? stdoutColor.level : 0;\n\tobject.level = options.level === undefined ? colorLevel : options.level;\n};\n\nexport class Chalk {\n\tconstructor(options) {\n\t\t// eslint-disable-next-line no-constructor-return\n\t\treturn chalkFactory(options);\n\t}\n}\n\nconst chalkFactory = options => {\n\tconst chalk = (...strings) => strings.join(' ');\n\tapplyOptions(chalk, options);\n\n\tObject.setPrototypeOf(chalk, createChalk.prototype);\n\n\treturn chalk;\n};\n\nfunction createChalk(options) {\n\treturn chalkFactory(options);\n}\n\nObject.setPrototypeOf(createChalk.prototype, Function.prototype);\n\nfor (const [styleName, style] of Object.entries(ansiStyles)) {\n\tstyles[styleName] = {\n\t\tget() {\n\t\t\tconst builder = createBuilder(this, createStyler(style.open, style.close, this[STYLER]), this[IS_EMPTY]);\n\t\t\tObject.defineProperty(this, styleName, {value: builder});\n\t\t\treturn builder;\n\t\t},\n\t};\n}\n\nstyles.visible = {\n\tget() {\n\t\tconst builder = createBuilder(this, this[STYLER], true);\n\t\tObject.defineProperty(this, 'visible', {value: builder});\n\t\treturn builder;\n\t},\n};\n\nconst getModelAnsi = (model, level, type, ...arguments_) => {\n\tif (model === 'rgb') {\n\t\tif (level === 'ansi16m') {\n\t\t\treturn ansiStyles[type].ansi16m(...arguments_);\n\t\t}\n\n\t\tif (level === 'ansi256') {\n\t\t\treturn ansiStyles[type].ansi256(ansiStyles.rgbToAnsi256(...arguments_));\n\t\t}\n\n\t\treturn ansiStyles[type].ansi(ansiStyles.rgbToAnsi(...arguments_));\n\t}\n\n\tif (model === 'hex') {\n\t\treturn getModelAnsi('rgb', level, type, ...ansiStyles.hexToRgb(...arguments_));\n\t}\n\n\treturn ansiStyles[type][model](...arguments_);\n};\n\nconst usedModels = ['rgb', 'hex', 'ansi256'];\n\nfor (const model of usedModels) {\n\tstyles[model] = {\n\t\tget() {\n\t\t\tconst {level} = this;\n\t\t\treturn function (...arguments_) {\n\t\t\t\tconst styler = createStyler(getModelAnsi(model, levelMapping[level], 'color', ...arguments_), ansiStyles.color.close, this[STYLER]);\n\t\t\t\treturn createBuilder(this, styler, this[IS_EMPTY]);\n\t\t\t};\n\t\t},\n\t};\n\n\tconst bgModel = 'bg' + model[0].toUpperCase() + model.slice(1);\n\tstyles[bgModel] = {\n\t\tget() {\n\t\t\tconst {level} = this;\n\t\t\treturn function (...arguments_) {\n\t\t\t\tconst styler = createStyler(getModelAnsi(model, levelMapping[level], 'bgColor', ...arguments_), ansiStyles.bgColor.close, this[STYLER]);\n\t\t\t\treturn createBuilder(this, styler, this[IS_EMPTY]);\n\t\t\t};\n\t\t},\n\t};\n}\n\nconst proto = Object.defineProperties(() => {}, {\n\t...styles,\n\tlevel: {\n\t\tenumerable: true,\n\t\tget() {\n\t\t\treturn this[GENERATOR].level;\n\t\t},\n\t\tset(level) {\n\t\t\tthis[GENERATOR].level = level;\n\t\t},\n\t},\n});\n\nconst createStyler = (open, close, parent) => {\n\tlet openAll;\n\tlet closeAll;\n\tif (parent === undefined) {\n\t\topenAll = open;\n\t\tcloseAll = close;\n\t} else {\n\t\topenAll = parent.openAll + open;\n\t\tcloseAll = close + parent.closeAll;\n\t}\n\n\treturn {\n\t\topen,\n\t\tclose,\n\t\topenAll,\n\t\tcloseAll,\n\t\tparent,\n\t};\n};\n\nconst createBuilder = (self, _styler, _isEmpty) => {\n\t// Single argument is hot path, implicit coercion is faster than anything\n\t// eslint-disable-next-line no-implicit-coercion\n\tconst builder = (...arguments_) => applyStyle(builder, (arguments_.length === 1) ? ('' + arguments_[0]) : arguments_.join(' '));\n\n\t// We alter the prototype because we must return a function, but there is\n\t// no way to create a function with a different prototype\n\tObject.setPrototypeOf(builder, proto);\n\n\tbuilder[GENERATOR] = self;\n\tbuilder[STYLER] = _styler;\n\tbuilder[IS_EMPTY] = _isEmpty;\n\n\treturn builder;\n};\n\nconst applyStyle = (self, string) => {\n\tif (self.level <= 0 || !string) {\n\t\treturn self[IS_EMPTY] ? '' : string;\n\t}\n\n\tlet styler = self[STYLER];\n\n\tif (styler === undefined) {\n\t\treturn string;\n\t}\n\n\tconst {openAll, closeAll} = styler;\n\tif (string.includes('\\u001B')) {\n\t\twhile (styler !== undefined) {\n\t\t\t// Replace any instances already present with a re-opening code\n\t\t\t// otherwise only the part of the string until said closing code\n\t\t\t// will be colored, and the rest will simply be 'plain'.\n\t\t\tstring = stringReplaceAll(string, styler.close, styler.open);\n\n\t\t\tstyler = styler.parent;\n\t\t}\n\t}\n\n\t// We can move both next actions out of loop, because remaining actions in loop won't have\n\t// any/visible effect on parts we add here. Close the styling before a linebreak and reopen\n\t// after next line to fix a bleed issue on macOS: https://github.com/chalk/chalk/pull/92\n\tconst lfIndex = string.indexOf('\\n');\n\tif (lfIndex !== -1) {\n\t\tstring = stringEncaseCRLFWithFirstIndex(string, closeAll, openAll, lfIndex);\n\t}\n\n\treturn openAll + string + closeAll;\n};\n\nObject.defineProperties(createChalk.prototype, styles);\n\nconst chalk = createChalk();\nexport const chalkStderr = createChalk({level: stderrColor ? stderrColor.level : 0});\n\nexport {\n\tmodifierNames,\n\tforegroundColorNames,\n\tbackgroundColorNames,\n\tcolorNames,\n\n\t// TODO: Remove these aliases in the next major version\n\tmodifierNames as modifiers,\n\tforegroundColorNames as foregroundColors,\n\tbackgroundColorNames as backgroundColors,\n\tcolorNames as colors,\n} from './vendor/ansi-styles/index.js';\n\nexport {\n\tstdoutColor as supportsColor,\n\tstderrColor as supportsColorStderr,\n};\n\nexport default chalk;\n","/**\n * Wallet Funding Utilities\n * \n * Provides robust wallet funding strategies that don't depend solely on unreliable devnet airdrops.\n * Supports multiple funding strategies with automatic fallback mechanisms.\n */\n\nimport type { \n Address, \n KeyPairSigner, \n Commitment\n} from '@solana/kit'\nimport { \n generateKeyPairSigner,\n createSolanaRpc,\n createKeyPairSignerFromBytes,\n pipe,\n createTransactionMessage,\n setTransactionMessageFeePayer,\n setTransactionMessageLifetimeUsingBlockhash,\n appendTransactionMessageInstructions,\n signTransactionMessageWithSigners,\n getBase64EncodedWireTransaction,\n lamports\n} from '@solana/kit'\nimport { getTransferSolInstruction } from '@solana-program/system'\nimport { promises as fs } from 'fs'\nimport chalk from 'chalk'\nimport bs58 from 'bs58'\n\n/**\n * Funding strategy options\n */\nexport interface FundingStrategyOptions {\n /** Target amount in lamports */\n amount: bigint\n /** Minimum amount required (if less, will try to top up) */\n minAmount?: bigint\n /** Maximum retries for airdrop */\n maxRetries?: number\n /** Delay between retries in ms */\n retryDelay?: number\n /** Use treasury wallet if available */\n useTreasury?: boolean\n /** Treasury wallet path or signer */\n treasuryWallet?: string | KeyPairSigner\n /** Additional funded wallets to try */\n fundedWallets?: (string | KeyPairSigner)[]\n /** Log funding attempts */\n verbose?: boolean\n}\n\n/**\n * Funding result\n */\nexport interface FundingResult {\n /** Whether funding was successful */\n success: boolean\n /** Final balance after funding */\n balance: bigint\n /** Funding method used */\n method: 'airdrop' | 'treasury' | 'funded-wallet' | 'existing'\n /** Number of attempts made */\n attempts: number\n /** Error if funding failed */\n error?: string\n /** Transaction signature if transfer was made */\n signature?: string\n}\n\n/**\n * Wallet funding utility with multiple strategies\n */\nexport class WalletFundingService {\n private rpc: ReturnType<typeof createSolanaRpc>\n private commitment: Commitment = 'confirmed'\n private isDevnetUrl: boolean\n\n constructor(rpcUrl: string, commitment: Commitment = 'confirmed') {\n // Check if this is a devnet URL\n this.isDevnetUrl = rpcUrl.includes('devnet')\n \n // Create RPC client\n this.rpc = createSolanaRpc(rpcUrl)\n \n this.commitment = commitment\n }\n\n /**\n * Fund a wallet using multiple strategies\n */\n async fundWallet(\n targetWallet: Address,\n options: FundingStrategyOptions\n ): Promise<FundingResult> {\n const {\n amount,\n minAmount = amount,\n maxRetries = 3,\n retryDelay = 2000,\n useTreasury = true,\n treasuryWallet,\n fundedWallets = [],\n verbose = false\n } = options\n\n const log = (message: string) => {\n if (verbose) {\n console.log(chalk.gray(`[WalletFunding] ${message}`))\n }\n }\n\n let attempts = 0\n\n try {\n // First check existing balance\n const currentBalance = await this.getBalance(targetWallet)\n log(`Current balance: ${this.formatSol(currentBalance)} SOL`)\n\n if (currentBalance >= minAmount) {\n log(`Wallet already has sufficient balance`)\n return {\n success: true,\n balance: currentBalance,\n method: 'existing',\n attempts: 0\n }\n }\n\n const needed = amount - currentBalance\n log(`Need to fund: ${this.formatSol(needed)} SOL`)\n\n // Strategy 1: Try devnet airdrop first\n if (this.isDevnetUrl && 'requestAirdrop' in this.rpc) {\n log(`Attempting devnet airdrop...`)\n const airdropResult = await this.tryAirdrop(\n targetWallet,\n needed,\n maxRetries,\n retryDelay,\n verbose\n )\n \n if (airdropResult.success) {\n const finalBalance = await this.getBalance(targetWallet)\n return {\n success: true,\n balance: finalBalance,\n method: 'airdrop',\n attempts: airdropResult.attempts,\n signature: airdropResult.signature\n }\n }\n \n attempts += airdropResult.attempts\n log(`Airdrop failed after ${airdropResult.attempts} attempts`)\n }\n\n // Strategy 2: Try treasury wallet\n if (useTreasury && treasuryWallet) {\n log(`Attempting treasury wallet funding...`)\n const treasuryResult = await this.tryTreasuryFunding(\n targetWallet,\n needed,\n treasuryWallet,\n verbose\n )\n \n if (treasuryResult.success) {\n const finalBalance = await this.getBalance(targetWallet)\n return {\n success: true,\n balance: finalBalance,\n method: 'treasury',\n attempts: attempts + 1,\n signature: treasuryResult.signature\n }\n }\n \n attempts++\n log(`Treasury funding failed: ${treasuryResult.error}`)\n }\n\n // Strategy 3: Try other funded wallets\n for (const fundedWallet of fundedWallets) {\n log(`Attempting funding from additional wallet...`)\n const fundedResult = await this.tryFundedWalletTransfer(\n targetWallet,\n needed,\n fundedWallet,\n verbose\n )\n \n if (fundedResult.success) {\n const finalBalance = await this.getBalance(targetWallet)\n return {\n success: true,\n balance: finalBalance,\n method: 'funded-wallet',\n attempts: attempts + 1,\n signature: fundedResult.signature\n }\n }\n \n attempts++\n log(`Funded wallet transfer failed: ${fundedResult.error}`)\n }\n\n // All strategies failed\n throw new Error('All funding strategies failed')\n\n } catch (error) {\n return {\n success: false,\n balance: await this.getBalance(targetWallet),\n method: 'airdrop',\n attempts,\n error: error instanceof Error ? error.message : 'Unknown error'\n }\n }\n }\n\n /**\n * Try to fund using devnet airdrop with retries\n */\n private async tryAirdrop(\n targetWallet: Address,\n amount: bigint,\n maxRetries: number,\n retryDelay: number,\n verbose: boolean\n ): Promise<{ success: boolean; attempts: number; signature?: string; error?: string }> {\n // Type guard to ensure we have a devnet RPC\n if (!('requestAirdrop' in this.rpc)) {\n return {\n success: false,\n attempts: 0,\n error: 'Airdrop not available on this network'\n }\n }\n\n let attempts = 0\n\n for (let i = 0; i < maxRetries; i++) {\n attempts++\n \n try {\n const airdropResponse = await this.rpc\n .requestAirdrop(targetWallet, lamports(amount), { commitment: this.commitment })\n .send()\n \n // The response is the signature directly\n const signature = airdropResponse\n \n if (verbose) {\n console.log(chalk.gray(`[WalletFunding] Airdrop requested: ${signature}`))\n }\n\n // Get latest blockhash for confirmation\n await this.rpc.getLatestBlockhash().send()\n\n // Wait for confirmation using getSignatureStatuses\n let confirmed = false\n const maxAttempts = 30\n for (let i = 0; i < maxAttempts; i++) {\n const statusResponse = await this.rpc\n .getSignatureStatuses([signature])\n .send()\n \n const status = statusResponse.value[0]\n if (status && status.confirmationStatus === 'confirmed') {\n confirmed = true\n break\n }\n \n await new Promise(resolve => setTimeout(resolve, 1000))\n }\n\n // Additional wait to ensure balance is updated\n await new Promise(resolve => setTimeout(resolve, 1000))\n\n if (!confirmed) {\n throw new Error('Airdrop confirmation timeout')\n }\n\n return {\n success: true,\n attempts,\n signature\n }\n } catch (error) {\n if (verbose) {\n console.log(chalk.gray(`[WalletFunding] Airdrop attempt ${attempts} failed: ${error}`))\n }\n \n if (i < maxRetries - 1) {\n await new Promise(resolve => setTimeout(resolve, retryDelay))\n }\n }\n }\n\n return {\n success: false,\n attempts,\n error: 'Max retries exceeded'\n }\n }\n\n /**\n * Try to fund from treasury wallet\n */\n private async tryTreasuryFunding(\n targetWallet: Address,\n amount: bigint,\n treasuryWallet: string | KeyPairSigner,\n verbose: boolean\n ): Promise<{ success: boolean; signature?: string; error?: string }> {\n try {\n const treasurySigner = await this.loadWallet(treasuryWallet)\n const treasuryBalance = await this.getBalance(treasurySigner.address)\n\n if (verbose) {\n console.log(chalk.gray(`[WalletFunding] Treasury balance: ${this.formatSol(treasuryBalance)} SOL`))\n }\n\n if (treasuryBalance < amount + BigInt(5000)) { // Keep 5000 lamports for fees\n return {\n success: false,\n error: 'Insufficient treasury balance'\n }\n }\n\n const signature = await this.transferSol(\n treasurySigner,\n targetWallet,\n amount,\n verbose\n )\n\n return {\n success: true,\n signature\n }\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error'\n }\n }\n }\n\n /**\n * Try to fund from another funded wallet\n */\n private async tryFundedWalletTransfer(\n targetWallet: Address,\n amount: bigint,\n fundedWallet: string | KeyPairSigner,\n verbose: boolean\n ): Promise<{ success: boolean; signature?: string; error?: string }> {\n try {\n const signer = await this.loadWallet(fundedWallet)\n const balance = await this.getBalance(signer.address)\n\n if (verbose) {\n console.log(chalk.gray(`[WalletFunding] Funded wallet balance: ${this.formatSol(balance)} SOL`))\n }\n\n if (balance < amount + BigInt(5000)) { // Keep 5000 lamports for fees\n return {\n success: false,\n error: 'Insufficient wallet balance'\n }\n }\n\n const signature = await this.transferSol(\n signer,\n targetWallet,\n amount,\n verbose\n )\n\n return {\n success: true,\n signature\n }\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error'\n }\n }\n }\n\n /**\n * Transfer SOL from one wallet to another\n */\n private async transferSol(\n from: KeyPairSigner,\n to: Address,\n amount: bigint,\n verbose: boolean\n ): Promise<string> {\n const { value: latestBlockhash } = await this.rpc.getLatestBlockhash().send()\n \n const transferInstruction = getTransferSolInstruction({\n source: from,\n destination: to,\n amount\n })\n\n const message = pipe(\n createTransactionMessage({ version: 0 }),\n tx => setTransactionMessageFeePayer(from.address, tx),\n tx => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, tx),\n tx => appendTransactionMessageInstructions([transferInstruction], tx)\n )\n\n const signedTransaction = await signTransactionMessageWithSigners(message)\n const base64Transaction = getBase64EncodedWireTransaction(signedTransaction)\n \n const sendResult = await this.rpc\n .sendTransaction(base64Transaction, { \n skipPreflight: false,\n preflightCommitment: this.commitment,\n maxRetries: BigInt(5)\n })\n .send()\n \n // sendTransaction returns the signature directly\n const signature = sendResult\n\n if (verbose) {\n console.log(chalk.gray(`[WalletFunding] Transfer sent: ${signature}`))\n }\n\n // Wait for confirmation using getSignatureStatuses\n let confirmed = false\n const maxAttempts = 30\n for (let i = 0; i < maxAttempts; i++) {\n const statusResponse = await this.rpc\n .getSignatureStatuses([signature])\n .send()\n \n const status = statusResponse.value[0]\n if (status && status.confirmationStatus === 'confirmed') {\n confirmed = true\n break\n }\n \n await new Promise(resolve => setTimeout(resolve, 1000))\n }\n \n if (!confirmed) {\n throw new Error('Transaction confirmation timeout')\n }\n\n return signature\n }\n\n /**\n * Load wallet from path or return existing signer\n */\n private async loadWallet(walletSource: string | KeyPairSigner): Promise<KeyPairSigner> {\n if (typeof walletSource !== 'string') {\n return walletSource\n }\n\n // Check if it's an environment variable\n const envValue = process.env[walletSource]\n if (envValue) {\n // Try to parse as JSON array\n try {\n const walletData = JSON.parse(envValue) as number[]\n return await createKeyPairSignerFromBytes(new Uint8Array(walletData))\n } catch {\n // Try as base58 private key\n try {\n const privateKeyBytes = bs58.decode(envValue)\n // Solana private keys can be 32 bytes (seed) or 64 bytes (full keypair)\n if (privateKeyBytes.length === 32 || privateKeyBytes.length === 64) {\n return await createKeyPairSignerFromBytes(privateKeyBytes)\n }\n throw new Error('Invalid base58 private key length')\n } catch (error) {\n throw new Error(`Failed to load wallet from base58 key: ${error instanceof Error ? error.message : 'Unknown error'}`)\n }\n }\n }\n\n // Load from file\n const walletData = JSON.parse(await fs.readFile(walletSource, 'utf-8')) as number[]\n return createKeyPairSignerFromBytes(new Uint8Array(walletData))\n }\n\n /**\n * Load wallet from base58 private key\n */\n static async loadWalletFromBase58(base58PrivateKey: string): Promise<KeyPairSigner> {\n try {\n const privateKeyBytes = bs58.decode(base58PrivateKey)\n // Solana private keys can be 32 bytes (seed) or 64 bytes (full keypair)\n if (privateKeyBytes.length === 32 || privateKeyBytes.length === 64) {\n return await createKeyPairSignerFromBytes(privateKeyBytes)\n }\n throw new Error(`Invalid private key length: ${privateKeyBytes.length} bytes. Expected 32 or 64 bytes.`)\n } catch (error) {\n if (error instanceof Error && error.message.includes('Invalid private key length')) {\n throw error\n }\n throw new Error(`Failed to decode base58 private key: ${error instanceof Error ? error.message : 'Unknown error'}`)\n }\n }\n\n /**\n * Get wallet balance\n */\n async getBalance(wallet: Address): Promise<bigint> {\n const response = await this.rpc\n .getBalance(wallet, { commitment: this.commitment })\n .send()\n return response.value\n }\n\n /**\n * Check if connected to devnet\n */\n private async isDevnet(): Promise<boolean> {\n try {\n const response = await this.rpc.getGenesisHash().send()\n // Devnet genesis hash - response is the hash string directly\n return await Promise.resolve(response === 'EtWTRABZaYq6iMfeYKouRu166VU2xqa1wcaWoxPkrZBG')\n } catch {\n return false\n }\n }\n\n /**\n * Format lamports as SOL\n */\n private formatSol(lamports: bigint): string {\n return (Number(lamports) / 1_000_000_000).toFixed(4)\n }\n\n /**\n * Create and fund multiple test wallets\n */\n async createAndFundTestWallets(\n count: number,\n amountPerWallet: bigint,\n options: Omit<FundingStrategyOptions, 'amount'>\n ): Promise<KeyPairSigner[]> {\n const wallets: KeyPairSigner[] = []\n\n console.log(chalk.cyan(`Creating and funding ${count} test wallets...`))\n\n for (let i = 0; i < count; i++) {\n const wallet = await generateKeyPairSigner()\n \n console.log(chalk.gray(`Wallet ${i + 1}: ${wallet.address}`))\n \n const result = await this.fundWallet(wallet.address, {\n ...options,\n amount: amountPerWallet\n })\n\n if (result.success) {\n wallets.push(wallet)\n console.log(chalk.green(`✅ Funded with ${this.formatSol(result.balance)} SOL via ${result.method}`))\n } else {\n console.log(chalk.red(`❌ Failed to fund: ${result.error}`))\n }\n }\n\n return wallets\n }\n\n /**\n * Ensure minimum balance for a wallet\n */\n async ensureMinimumBalance(\n wallet: Address,\n minBalance: bigint,\n options?: Partial<FundingStrategyOptions>\n ): Promise<FundingResult> {\n const currentBalance = await this.getBalance(wallet)\n \n if (currentBalance >= minBalance) {\n return {\n success: true,\n balance: currentBalance,\n method: 'existing',\n attempts: 0\n }\n }\n\n const needed = minBalance - currentBalance\n return this.fundWallet(wallet, {\n amount: needed,\n minAmount: minBalance,\n ...options\n })\n }\n}\n\n/**\n * Default funding service instance for devnet\n */\nexport const defaultFundingService = new WalletFundingService(\n process.env.GHOSTSPEAK_RPC_URL ?? 'https://api.devnet.solana.com'\n)\n\n/**\n * Quick helper to fund a wallet with default settings\n */\nexport async function fundWallet(\n wallet: Address,\n amountInSol: number,\n options?: Partial<FundingStrategyOptions>\n): Promise<FundingResult> {\n return defaultFundingService.fundWallet(wallet, {\n amount: BigInt(Math.floor(amountInSol * 1_000_000_000)),\n ...options\n })\n}\n\n/**\n * Quick helper to ensure minimum balance\n */\nexport async function ensureMinimumBalance(\n wallet: Address,\n minBalanceInSol: number,\n options?: Partial<FundingStrategyOptions>\n): Promise<FundingResult> {\n return defaultFundingService.ensureMinimumBalance(\n wallet,\n BigInt(Math.floor(minBalanceInSol * 1_000_000_000)),\n options\n )\n}","/**\n * Private Metadata Storage\n * \n * Handles off-chain storage of encrypted data with on-chain references.\n * Supports IPFS and other storage backends for private data while\n * maintaining on-chain integrity verification.\n */\n\nimport { sha256 } from '@noble/hashes/sha256'\nimport { bytesToHex, hexToBytes } from '@noble/curves/abstract/utils'\nimport type { Address } from '@solana/kit'\n\nimport {\n ClientEncryptionService,\n type EncryptedData,\n type PrivateMetadata\n} from './client-encryption.js'\n\nimport { getFeatureFlags } from './feature-flags.js'\n\n// =====================================================\n// TYPES\n// =====================================================\n\nexport interface StorageProvider {\n store(data: Uint8Array): Promise<string>\n retrieve(hash: string): Promise<Uint8Array>\n delete(hash: string): Promise<boolean>\n}\n\nexport interface StoredPrivateData {\n /** On-chain reference hash */\n onChainHash: Uint8Array\n \n /** Storage provider identifier */\n storageProvider: 'ipfs' | 'arweave' | 'custom'\n \n /** Storage location (IPFS hash, Arweave ID, etc) */\n storageLocation: string\n \n /** Encryption metadata */\n encryptionMetadata: {\n version: number\n publicKey: Uint8Array\n timestamp: number\n }\n \n /** Size of stored data */\n size: number\n \n /** Content type hint */\n contentType?: string\n}\n\nexport interface PrivateDataReference {\n /** Account storing the reference */\n account: Address\n \n /** Storage details */\n storage: StoredPrivateData\n \n /** Access control */\n accessControl: {\n owner: Address\n allowedReaders: Address[]\n expiresAt?: number\n }\n}\n\n// =====================================================\n// STORAGE PROVIDERS\n// =====================================================\n\n/**\n * Real IPFS storage provider using kubo-rpc-client (2025)\n * Connects to actual IPFS nodes for production use\n * \n * SECURITY NOTICE (Kluster MCP): \n * - All data stored is encrypted client-side before IPFS upload\n * - Use private IPFS networks for sensitive production data\n * - Implement proper key management and rotation policies\n * - Monitor for unauthorized access patterns\n */\nexport class IPFSProvider implements StorageProvider {\n private client: any\n private readonly isPrivateNetwork: boolean\n \n constructor(options?: { \n ipfsNodeUrl?: string; \n headers?: Record<string, string>;\n usePrivateNetwork?: boolean;\n }) {\n // Dynamic import to avoid bundling issues\n const createClient = require('kubo-rpc-client').create\n \n // Add null checks and validation for IPFS client options\n const ipfsNodeUrl = options?.ipfsNodeUrl || 'http://localhost:5001'\n const headers = options?.headers || {}\n this.isPrivateNetwork = options?.usePrivateNetwork || false\n \n // Validate IPFS node URL format\n try {\n new URL(ipfsNodeUrl)\n } catch (error) {\n throw new Error(`Invalid IPFS node URL provided: ${ipfsNodeUrl}`)\n }\n \n // Security validation for production use\n if (!this.isPrivateNetwork && ipfsNodeUrl.includes('localhost')) {\n console.warn('SECURITY WARNING: Using localhost IPFS node in production. Consider using a private IPFS network.')\n }\n \n // Validate headers object\n if (typeof headers !== 'object' || headers === null) {\n throw new Error('Headers must be a valid object')\n }\n \n this.client = createClient({\n url: ipfsNodeUrl,\n headers\n })\n \n if (!this.client) {\n throw new Error('Failed to create IPFS client - kubo-rpc-client returned null')\n }\n }\n \n async store(data: Uint8Array): Promise<string> {\n try {\n // Security check: Validate data size to prevent abuse\n if (data.length > 10 * 1024 * 1024) { // 10MB limit\n throw new Error('Data size exceeds maximum allowed limit (10MB)')\n }\n \n // Security check: Ensure data appears encrypted (basic validation)\n if (!this.isPrivateNetwork && this.isDataUnencrypted(data)) {\n console.warn('SECURITY WARNING: Data appears to be unencrypted. Ensure client-side encryption is applied.')\n }\n \n const result = await this.client.add(data, {\n pin: true, // Pin to ensure persistence\n cidVersion: 1 // Use CIDv1 for better compatibility\n })\n return result.cid.toString()\n } catch (error) {\n throw new Error(`Failed to store data to IPFS: ${error instanceof Error ? error.message : String(error)}`)\n }\n }\n \n /**\n * Basic heuristic to detect potentially unencrypted data\n * This is not foolproof but can catch obvious cases\n */\n private isDataUnencrypted(data: Uint8Array): boolean {\n // Check for common unencrypted patterns\n const text = new TextDecoder('utf-8', { fatal: false }).decode(data.slice(0, 100))\n const commonPatterns = ['{', '<', 'BEGIN', 'name', 'address', 'email', 'password']\n return commonPatterns.some(pattern => text.toLowerCase().includes(pattern.toLowerCase()))\n }\n \n async retrieve(hash: string): Promise<Uint8Array> {\n try {\n const chunks: Uint8Array[] = []\n for await (const chunk of this.client.cat(hash)) {\n chunks.push(chunk)\n }\n \n // Concatenate all chunks\n const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0)\n const result = new Uint8Array(totalLength)\n let offset = 0\n for (const chunk of chunks) {\n result.set(chunk, offset)\n offset += chunk.length\n }\n \n return result\n } catch (error) {\n throw new Error(`Failed to retrieve data from IPFS: ${error instanceof Error ? error.message : String(error)}`)\n }\n }\n \n async delete(hash: string): Promise<boolean> {\n try {\n await this.client.pin.rm(hash)\n return true\n } catch (error) {\n // Pin removal might fail if not pinned - this is a non-critical error\n // Log as warning but don't throw since the data might not have been pinned\n console.warn(`IPFS unpin warning for ${hash}: ${error instanceof Error ? error.message : String(error)}`)\n return false // Return false to indicate pin removal didn't happen, but don't fail\n }\n }\n}\n\n/**\n * Local storage provider (for development)\n */\nexport class LocalStorageProvider implements StorageProvider {\n private prefix = 'ghostspeak_private_'\n \n async store(data: Uint8Array): Promise<string> {\n const hash = bytesToHex(sha256(data))\n globalThis.localStorage.setItem(this.prefix + hash, bytesToHex(data))\n return hash\n }\n \n async retrieve(hash: string): Promise<Uint8Array> {\n const hex = globalThis.localStorage.getItem(this.prefix + hash)\n if (hex) {\n return hexToBytes(hex)\n }\n throw new Error(`Data not found: ${hash}`)\n }\n \n async delete(hash: string): Promise<boolean> {\n globalThis.localStorage.removeItem(this.prefix + hash)\n return true\n }\n}\n\n// =====================================================\n// PRIVATE METADATA STORAGE SERVICE\n// =====================================================\n\nexport class PrivateMetadataStorage {\n private encryptionService: ClientEncryptionService\n private storageProvider: StorageProvider\n private featureFlags = getFeatureFlags()\n \n constructor(\n storageProvider?: StorageProvider,\n encryptionService?: ClientEncryptionService\n ) {\n this.storageProvider = storageProvider ?? new IPFSProvider()\n this.encryptionService = encryptionService ?? new ClientEncryptionService()\n }\n \n /**\n * Store private data off-chain with on-chain reference\n */\n async storePrivateData(\n data: Record<string, unknown>,\n publicMetadata: Record<string, unknown>,\n recipientPubkey: Uint8Array\n ): Promise<StoredPrivateData> {\n // Check if IPFS storage is enabled\n if (!this.featureFlags.isEnabled('ENABLE_IPFS_STORAGE')) {\n throw new Error('IPFS storage is not enabled')\n }\n \n // Create private metadata\n const privateMetadata = await this.encryptionService.createPrivateMetadata(\n data,\n publicMetadata,\n recipientPubkey\n )\n \n // Serialize for storage\n const serialized = this.serializePrivateMetadata(privateMetadata)\n \n // Store in IPFS (or other provider)\n const storageLocation = await this.storageProvider.store(serialized)\n \n // Create on-chain reference\n const onChainHash = this.createOnChainHash(privateMetadata, storageLocation)\n \n return {\n onChainHash,\n storageProvider: 'ipfs',\n storageLocation,\n encryptionMetadata: {\n version: privateMetadata.encrypted.version,\n publicKey: privateMetadata.encrypted.publicKey,\n timestamp: privateMetadata.encrypted.timestamp\n },\n size: serialized.length,\n contentType: 'application/json'\n }\n }\n \n /**\n * Retrieve private data from off-chain storage\n */\n async retrievePrivateData(\n reference: StoredPrivateData,\n secretKey: Uint8Array\n ): Promise<{\n privateData: Record<string, unknown>\n publicData: Record<string, unknown>\n }> {\n // Retrieve from storage\n const serialized = await this.storageProvider.retrieve(reference.storageLocation)\n \n // Verify integrity\n const expectedHash = this.createOnChainHash(\n this.deserializePrivateMetadata(serialized),\n reference.storageLocation\n )\n \n if (bytesToHex(expectedHash) !== bytesToHex(reference.onChainHash)) {\n throw new Error('Data integrity check failed')\n }\n \n // Deserialize\n const metadata = this.deserializePrivateMetadata(serialized)\n \n // Decrypt private data\n const decryptedBytes = await this.decryptPrivateData(\n metadata.encrypted,\n secretKey\n )\n \n const privateData = JSON.parse(new TextDecoder().decode(decryptedBytes)) as Record<string, unknown>\n \n return {\n privateData,\n publicData: metadata.public\n }\n }\n \n /**\n * Create a verifiable link between on-chain and off-chain data\n */\n createVerifiableLink(\n onChainData: Record<string, unknown>,\n offChainReference: StoredPrivateData\n ): Uint8Array {\n const combined = {\n onChain: onChainData,\n offChain: {\n hash: bytesToHex(offChainReference.onChainHash),\n location: offChainReference.storageLocation,\n provider: offChainReference.storageProvider\n },\n timestamp: Date.now()\n }\n \n return sha256(new TextEncoder().encode(JSON.stringify(combined)))\n }\n \n /**\n * Batch store multiple private data items\n */\n async batchStore(\n items: {\n data: Record<string, unknown>\n publicMetadata: Record<string, unknown>\n recipientPubkey: Uint8Array\n }[]\n ): Promise<StoredPrivateData[]> {\n const results: StoredPrivateData[] = []\n \n for (const item of items) {\n const stored = await this.storePrivateData(\n item.data,\n item.publicMetadata,\n item.recipientPubkey\n )\n results.push(stored)\n }\n \n return results\n }\n \n // =====================================================\n // PRIVATE METHODS\n // =====================================================\n \n private serializePrivateMetadata(metadata: PrivateMetadata): Uint8Array {\n const json = JSON.stringify({\n encrypted: {\n ciphertext: {\n commitment: bytesToHex(metadata.encrypted.ciphertext.commitment.commitment),\n handle: bytesToHex(metadata.encrypted.ciphertext.handle.handle)\n },\n publicKey: bytesToHex(metadata.encrypted.publicKey),\n commitment: bytesToHex(metadata.encrypted.commitment),\n timestamp: metadata.encrypted.timestamp,\n version: metadata.encrypted.version\n },\n public: metadata.public,\n storageHash: bytesToHex(metadata.storageHash),\n ipfsHash: metadata.ipfsHash\n })\n \n return new TextEncoder().encode(json)\n }\n \n private deserializePrivateMetadata(data: Uint8Array): PrivateMetadata {\n const json = JSON.parse(new TextDecoder().decode(data)) as {\n encrypted: {\n ciphertext: {\n commitment: string\n handle: string\n }\n publicKey: string\n commitment: string\n timestamp: number\n version: number\n }\n public: Record<string, unknown>\n storageHash: string\n ipfsHash?: string\n }\n \n return {\n encrypted: {\n ciphertext: {\n commitment: {\n commitment: hexToBytes(json.encrypted.ciphertext.commitment)\n },\n handle: {\n handle: hexToBytes(json.encrypted.ciphertext.handle)\n }\n },\n publicKey: hexToBytes(json.encrypted.publicKey),\n commitment: hexToBytes(json.encrypted.commitment),\n timestamp: json.encrypted.timestamp,\n version: json.encrypted.version\n },\n public: json.public,\n storageHash: hexToBytes(json.storageHash),\n ipfsHash: json.ipfsHash\n }\n }\n \n private createOnChainHash(\n metadata: PrivateMetadata,\n storageLocation: string\n ): Uint8Array {\n const data = {\n storageHash: bytesToHex(metadata.storageHash),\n storageLocation,\n commitment: bytesToHex(metadata.encrypted.commitment),\n timestamp: metadata.encrypted.timestamp\n }\n \n return sha256(new TextEncoder().encode(JSON.stringify(data)))\n }\n \n private async decryptPrivateData(\n encrypted: EncryptedData,\n secretKey: Uint8Array\n ): Promise<Uint8Array> {\n // Full decryption pending encryption service support\n // For now, decrypt the amount and serialize it\n // This is a limitation of current ElGamal implementation which only supports amounts\n const decryptedAmount = await this.encryptionService.decryptAmount(encrypted, secretKey)\n return new TextEncoder().encode(JSON.stringify({ amount: decryptedAmount.toString() }))\n }\n}\n\n// =====================================================\n// PRIVACY-PRESERVING QUERIES\n// =====================================================\n\n/**\n * Query builder for private data\n */\nexport class PrivateDataQuery {\n private conditions: {\n field: string\n operator: 'eq' | 'gt' | 'lt' | 'contains'\n value: unknown\n encrypted: boolean\n }[] = []\n \n where(field: string, operator: 'eq' | 'gt' | 'lt' | 'contains', value: unknown): this {\n this.conditions.push({ field, operator, value, encrypted: false })\n return this\n }\n \n whereEncrypted(field: string, commitment: Uint8Array): this {\n this.conditions.push({\n field,\n operator: 'eq',\n value: commitment,\n encrypted: true\n })\n return this\n }\n \n /**\n * Execute query against encrypted data\n * Note: This is limited compared to on-chain queries\n */\n async execute(\n storage: PrivateMetadataStorage,\n references: StoredPrivateData[]\n ): Promise<StoredPrivateData[]> {\n // For encrypted fields, we can only match by commitment\n // This is a privacy-preserving but limited query capability\n const results: StoredPrivateData[] = []\n \n for (const ref of references) {\n let matches = true\n \n for (const condition of this.conditions) {\n if (condition.encrypted) {\n // Can only check commitments for encrypted data\n // Real implementation would be more sophisticated\n if (condition.field === 'commitment') {\n const match = bytesToHex(ref.onChainHash) === bytesToHex(condition.value as Uint8Array)\n if (!match) {\n matches = false\n break\n }\n }\n }\n }\n \n if (matches) {\n results.push(ref)\n }\n }\n \n return results\n }\n}\n\n// =====================================================\n// UTILITIES\n// =====================================================\n\n/**\n * Calculate storage cost estimate\n */\nexport function estimateStorageCost(\n dataSize: number,\n provider: 'ipfs' | 'arweave'\n): {\n cost: bigint\n currency: string\n} {\n // Mock cost calculation\n // In production, this would query actual storage costs\n if (provider === 'ipfs') {\n return {\n cost: BigInt(Number(dataSize) * 1), // 1 lamport per byte\n currency: 'lamports'\n }\n } else {\n return {\n cost: BigInt(Number(dataSize) * 10), // 10 lamports per byte\n currency: 'lamports'\n }\n }\n}\n\n/**\n * Create a privacy manifest for transparency\n */\nexport interface PrivacyManifest {\n dataTypes: string[]\n encryptionMethod: 'elgamal' | 'aes256'\n storageLocation: 'ipfs' | 'arweave' | 'on-chain'\n retentionPeriod?: number\n accessControl: 'owner-only' | 'public-read' | 'permissioned'\n}\n\nexport function createPrivacyManifest(\n dataTypes: string[],\n options: Partial<PrivacyManifest> = {}\n): PrivacyManifest {\n return {\n dataTypes,\n encryptionMethod: options.encryptionMethod ?? 'elgamal',\n storageLocation: options.storageLocation ?? 'ipfs',\n retentionPeriod: options.retentionPeriod,\n accessControl: options.accessControl ?? 'owner-only'\n }\n}","/**\n * Feature Gate Detector\n * \n * Runtime detection of Solana feature gates to determine which native\n * programs and features are available on the current network.\n * \n * This module specifically tracks feature gates\n * and provides caching to minimize RPC calls.\n */\n\nimport { address } from '@solana/addresses'\nimport type { Address } from '@solana/kit'\nimport type { Rpc, GetAccountInfoApi } from '@solana/rpc'\n\n// =====================================================\n// CONSTANTS\n// =====================================================\n\n/**\n * Known feature gate addresses\n */\nexport const FEATURE_GATES = {\n /** Confidential transfers feature (placeholder) */\n CONFIDENTIAL_TRANSFERS: address('11111111111111111111111111111111'),\n \n /** Token-2022 program (placeholder) */\n TOKEN_2022: address('TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb'),\n} as const\n\n/**\n * Cache configuration\n */\nconst CACHE_TTL_MS = 5 * 60 * 1000 // 5 minutes\nconst MAX_CACHE_ENTRIES = 100\n\n// =====================================================\n// TYPES\n// =====================================================\n\nexport interface FeatureStatus {\n /** Whether the feature is activated */\n activated: boolean\n \n /** When the status was last checked */\n lastChecked: number\n \n /** Optional activation slot if known */\n activationSlot?: bigint\n \n /** Error if status check failed */\n error?: string\n}\n\nexport interface FeatureGateCache {\n [featureId: string]: FeatureStatus\n}\n\n// =====================================================\n// CACHE IMPLEMENTATION\n// =====================================================\n\nclass FeatureGateCacheManager {\n private cache: FeatureGateCache = {}\n private cacheOrder: string[] = []\n \n /**\n * Get cached feature status\n */\n get(featureId: string): FeatureStatus | null {\n const cached = this.cache[featureId]\n // Cache found, continue\n \n // Check if cache is expired\n if (Date.now() - cached.lastChecked > CACHE_TTL_MS) {\n this.remove(featureId)\n return null\n }\n \n return cached\n }\n \n /**\n * Set feature status in cache\n */\n set(featureId: string, status: FeatureStatus): void {\n // Remove if already exists to update order\n this.remove(featureId)\n \n // Add to cache\n this.cache[featureId] = status\n this.cacheOrder.push(featureId)\n \n // Enforce max cache size\n if (this.cacheOrder.length > MAX_CACHE_ENTRIES) {\n const oldest = this.cacheOrder.shift()\n if (oldest) {\n delete this.cache[oldest]\n }\n }\n }\n \n /**\n * Remove from cache\n */\n remove(featureId: string): void {\n delete this.cache[featureId]\n this.cacheOrder = this.cacheOrder.filter(id => id !== featureId)\n }\n \n /**\n * Clear entire cache\n */\n clear(): void {\n this.cache = {}\n this.cacheOrder = []\n }\n}\n\n// Global cache instance\nconst featureCache = new FeatureGateCacheManager()\n\n// =====================================================\n// FEATURE DETECTION\n// =====================================================\n\n/**\n * Check if a feature gate is activated on the current network\n * \n * @param connection - Solana connection\n * @param featureGate - Feature gate public key to check\n * @returns Feature activation status\n */\nexport async function checkFeatureGate(\n rpc: Rpc<GetAccountInfoApi>,\n featureGate: Address\n): Promise<FeatureStatus> {\n const featureId = featureGate\n \n // Check cache first\n const cached = featureCache.get(featureId)\n if (cached) {\n return cached\n }\n \n try {\n // Check if the feature account exists\n const response = await rpc.getAccountInfo(featureGate, { encoding: 'base64' }).send()\n \n // Feature gates are special accounts - if they exist, the feature is active\n const accountInfo = response.value\n const activated = accountInfo !== null\n \n const status: FeatureStatus = {\n activated,\n lastChecked: Date.now(),\n }\n \n // If activated, try to get activation slot from account data\n if (accountInfo?.data) {\n try {\n // Decode base64 data\n const dataString = typeof accountInfo.data === 'string' ? accountInfo.data : accountInfo.data[0]\n const dataBuffer = Buffer.from(dataString, 'base64')\n \n // First 8 bytes of feature account data is the activation slot\n const activationSlot = BigInt(\n dataBuffer.readBigUInt64LE(0)\n )\n status.activationSlot = activationSlot\n } catch {\n // Ignore parsing errors\n }\n }\n \n // Cache the result\n featureCache.set(featureId, status)\n \n return status\n } catch (error) {\n // Cache error state to avoid repeated failures\n const errorStatus: FeatureStatus = {\n activated: false,\n lastChecked: Date.now(),\n error: error instanceof Error ? error.message : 'Unknown error',\n }\n \n featureCache.set(featureId, errorStatus)\n \n return errorStatus\n }\n}\n\n/**\n * Check multiple feature gates in parallel\n * \n * @param connection - Solana connection\n * @param featureGates - Array of feature gates to check\n * @returns Map of feature gate to status\n */\nexport async function checkMultipleFeatureGates(\n rpc: Rpc<GetAccountInfoApi>,\n featureGates: Address[]\n): Promise<Map<string, FeatureStatus>> {\n const results = await Promise.all(\n featureGates.map(gate => checkFeatureGate(rpc, gate))\n )\n \n const statusMap = new Map<string, FeatureStatus>()\n featureGates.forEach((gate, index) => {\n statusMap.set(gate, results[index])\n })\n \n return statusMap\n}\n\n/**\n * Monitor a feature gate for activation changes\n * \n * @param connection - Solana connection\n * @param featureGate - Feature gate to monitor\n * @param callback - Callback when status changes\n * @param intervalMs - Check interval (default 30 seconds)\n * @returns Function to stop monitoring\n */\nexport function monitorFeatureGate(\n rpc: Rpc<GetAccountInfoApi>,\n featureGate: Address,\n callback: (status: FeatureStatus) => void,\n intervalMs = 30_000\n): () => void {\n let lastStatus: FeatureStatus | null = null\n let intervalId: ReturnType<typeof setInterval> | null = null\n \n const check = async () => {\n try {\n const status = await checkFeatureGate(rpc, featureGate)\n \n // Check if status changed\n if (!lastStatus || lastStatus.activated !== status.activated) {\n callback(status)\n lastStatus = status\n }\n } catch (error) {\n console.error('Error monitoring feature gate:', error)\n }\n }\n \n // Initial check\n void check()\n \n // Set up interval\n intervalId = setInterval(check, intervalMs)\n \n // Return cleanup function\n return () => {\n if (intervalId) {\n clearInterval(intervalId)\n intervalId = null\n }\n }\n}\n\n// =====================================================\n// UTILITY FUNCTIONS\n// =====================================================\n\n/**\n * Clear the feature gate cache\n * Useful for testing or forcing fresh checks\n */\nexport function clearFeatureGateCache(): void {\n featureCache.clear()\n}\n\n/**\n * Convert feature gate public key to Address type\n */\nexport function featureGateToAddress(featureGate: Address): Address {\n return featureGate\n}\n\n// =====================================================\n// EXPORTS\n// =====================================================\n\nexport {\n FeatureGateCacheManager,\n featureCache as defaultFeatureCache,\n}"]}