@tokens-studio/tokenscript-interpreter 0.36.4 → 0.37.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (169) hide show
  1. package/dist/chunk-2EEKBDOX.js +5308 -0
  2. package/dist/chunk-2EEKBDOX.js.map +1 -0
  3. package/dist/chunk-2NMUBWBX.js +5861 -0
  4. package/dist/chunk-2NMUBWBX.js.map +1 -0
  5. package/dist/chunk-2OHE65GL.js +5779 -0
  6. package/dist/chunk-2OHE65GL.js.map +1 -0
  7. package/dist/chunk-2PZR6BQ6.js +5773 -0
  8. package/dist/chunk-2PZR6BQ6.js.map +1 -0
  9. package/dist/chunk-2QDDLPUW.js +5858 -0
  10. package/dist/chunk-2QDDLPUW.js.map +1 -0
  11. package/dist/chunk-4DUQBXYY.js +5762 -0
  12. package/dist/chunk-4DUQBXYY.js.map +1 -0
  13. package/dist/chunk-4SLJE4IW.js +5322 -0
  14. package/dist/chunk-4SLJE4IW.js.map +1 -0
  15. package/dist/chunk-6ABZOYUP.js +5802 -0
  16. package/dist/chunk-6ABZOYUP.js.map +1 -0
  17. package/dist/chunk-6HQZVWXZ.js +5341 -0
  18. package/dist/chunk-6HQZVWXZ.js.map +1 -0
  19. package/dist/chunk-6UY773C4.js +5292 -0
  20. package/dist/chunk-6UY773C4.js.map +1 -0
  21. package/dist/chunk-75Z55XEZ.js +5681 -0
  22. package/dist/chunk-75Z55XEZ.js.map +1 -0
  23. package/dist/chunk-7IWYKR22.js +5778 -0
  24. package/dist/chunk-7IWYKR22.js.map +1 -0
  25. package/dist/chunk-AVZUAMNS.js +5757 -0
  26. package/dist/chunk-AVZUAMNS.js.map +1 -0
  27. package/dist/chunk-BL7GZSRR.js +5724 -0
  28. package/dist/chunk-BL7GZSRR.js.map +1 -0
  29. package/dist/chunk-BMZ5NY7J.js +93 -0
  30. package/dist/chunk-BMZ5NY7J.js.map +1 -0
  31. package/dist/{chunk-AXH5N7KV.js → chunk-BNLQ6GCU.js} +2 -6
  32. package/dist/chunk-BNLQ6GCU.js.map +1 -0
  33. package/dist/chunk-BSJBGMCX.js +93 -0
  34. package/dist/{chunk-RI2BWY7D.js.map → chunk-BSJBGMCX.js.map} +1 -1
  35. package/dist/chunk-BUJRELXW.js +5342 -0
  36. package/dist/chunk-BUJRELXW.js.map +1 -0
  37. package/dist/chunk-DCOIGXSK.js +5763 -0
  38. package/dist/chunk-DCOIGXSK.js.map +1 -0
  39. package/dist/chunk-DZDZDYPO.js +5654 -0
  40. package/dist/chunk-DZDZDYPO.js.map +1 -0
  41. package/dist/{chunk-OCQX3WYJ.js → chunk-GAE7SZLZ.js} +111 -8
  42. package/dist/chunk-GAE7SZLZ.js.map +1 -0
  43. package/dist/chunk-HFLLWRRV.js +5791 -0
  44. package/dist/chunk-HFLLWRRV.js.map +1 -0
  45. package/dist/{lib/chunk-AEOBCHBK.js → chunk-JL4UU4PY.js} +2 -9
  46. package/dist/chunk-JL4UU4PY.js.map +1 -0
  47. package/dist/{chunk-CKLFRLH7.js → chunk-JUGNHFDN.js} +220 -338
  48. package/dist/chunk-JUGNHFDN.js.map +1 -0
  49. package/dist/{chunk-RI2BWY7D.js → chunk-K2OUSWUX.js} +2 -3
  50. package/dist/chunk-K2OUSWUX.js.map +1 -0
  51. package/dist/chunk-KOLA6XR5.js +5770 -0
  52. package/dist/chunk-KOLA6XR5.js.map +1 -0
  53. package/dist/{chunk-3ZOUTFP5.js → chunk-L77CTMYP.js} +169 -296
  54. package/dist/chunk-L77CTMYP.js.map +1 -0
  55. package/dist/chunk-LIXBSHBJ.js +99 -0
  56. package/dist/chunk-LIXBSHBJ.js.map +1 -0
  57. package/dist/chunk-LM5SZQV5.js +5763 -0
  58. package/dist/chunk-LM5SZQV5.js.map +1 -0
  59. package/dist/chunk-M76AGXPG.js +5772 -0
  60. package/dist/chunk-M76AGXPG.js.map +1 -0
  61. package/dist/{chunk-QP7M6WUR.js → chunk-OV2GMYVM.js} +221 -341
  62. package/dist/chunk-OV2GMYVM.js.map +1 -0
  63. package/dist/{chunk-33CDF4L4.js → chunk-P4VLJQEI.js} +235 -838
  64. package/dist/chunk-P4VLJQEI.js.map +1 -0
  65. package/dist/chunk-QLSMLF5S.js +5302 -0
  66. package/dist/chunk-QLSMLF5S.js.map +1 -0
  67. package/dist/chunk-QYTZHMUN.js +5831 -0
  68. package/dist/chunk-QYTZHMUN.js.map +1 -0
  69. package/dist/chunk-SBM4WTQW.js +5771 -0
  70. package/dist/chunk-SBM4WTQW.js.map +1 -0
  71. package/dist/chunk-UAQCLV6Y.js +5816 -0
  72. package/dist/chunk-UAQCLV6Y.js.map +1 -0
  73. package/dist/chunk-YIZGWYGL.js +5300 -0
  74. package/dist/chunk-YIZGWYGL.js.map +1 -0
  75. package/dist/{chunk-LZTXD3LN.js → chunk-Z437BNC5.js} +10 -3
  76. package/dist/chunk-Z437BNC5.js.map +1 -0
  77. package/dist/cli.js +138 -16
  78. package/dist/cli.js.map +1 -1
  79. package/dist/compliance-suite.js +3 -5
  80. package/dist/compliance-suite.js.map +1 -1
  81. package/dist/config-Bb9I9K-y.d.ts +1005 -0
  82. package/dist/config-Be-GTPYh.d.ts +976 -0
  83. package/dist/config-BkIqJNxv.d.ts +1009 -0
  84. package/dist/config-Cp5BqDfR.d.ts +731 -0
  85. package/dist/config-D36YRJGj.d.ts +1007 -0
  86. package/dist/{config-CFhN7-6U.d.ts → config-DB5rZBMx.d.ts} +109 -17
  87. package/dist/config-DQj8LHMT.d.ts +995 -0
  88. package/dist/{config-Bsd6DPFy.d.ts → config-Mw_Iq324.d.ts} +3 -1
  89. package/dist/{config-DtbN3iyg.d.ts → config-P6Ivo_zY.d.ts} +105 -26
  90. package/dist/config-RCpZF46f.d.ts +960 -0
  91. package/dist/lib/{chunk-K65UI6KX.cjs → chunk-EMRAAGPR.cjs} +102 -100
  92. package/dist/lib/chunk-EMRAAGPR.cjs.map +1 -0
  93. package/dist/lib/{chunk-UF6I25ED.cjs → chunk-JQKYSUJJ.cjs} +685 -567
  94. package/dist/lib/chunk-JQKYSUJJ.cjs.map +1 -0
  95. package/dist/lib/{chunk-S7WGJBSX.js → chunk-MD2DETZV.js} +5 -3
  96. package/dist/lib/chunk-MD2DETZV.js.map +1 -0
  97. package/dist/lib/chunk-SLITBMFB.js +114 -0
  98. package/dist/lib/chunk-SLITBMFB.js.map +1 -0
  99. package/dist/lib/{chunk-2BDFE7U4.js → chunk-VXZQQBEA.js} +132 -15
  100. package/dist/lib/chunk-VXZQQBEA.js.map +1 -0
  101. package/dist/lib/{chunk-KHF2VXWO.cjs → chunk-ZMMIYWFF.cjs} +10 -2
  102. package/dist/lib/chunk-ZMMIYWFF.cjs.map +1 -0
  103. package/dist/lib/index.cjs +99 -91
  104. package/dist/lib/index.d.cts +4 -4
  105. package/dist/lib/index.d.ts +4 -4
  106. package/dist/lib/index.js +3 -3
  107. package/dist/lib/{interpreter-DdF_Hj-J.d.ts → interpreter-ByrEtz7T.d.ts} +54 -4
  108. package/dist/lib/{interpreter-Cz_vWDDa.d.cts → interpreter-CG0Jw_k-.d.cts} +54 -4
  109. package/dist/lib/interpreter.cjs +81 -73
  110. package/dist/lib/interpreter.d.cts +7 -6
  111. package/dist/lib/interpreter.d.ts +7 -6
  112. package/dist/lib/interpreter.js +3 -3
  113. package/dist/lib/processor-node.cjs +12 -12
  114. package/dist/lib/processor-node.d.cts +3 -3
  115. package/dist/lib/processor-node.d.ts +3 -3
  116. package/dist/lib/processor-node.js +3 -3
  117. package/dist/lib/processor.cjs +17 -17
  118. package/dist/lib/processor.d.cts +4 -4
  119. package/dist/lib/processor.d.ts +4 -4
  120. package/dist/lib/processor.js +3 -3
  121. package/dist/lib/schema.cjs +5 -5
  122. package/dist/lib/schema.d.cts +1 -1
  123. package/dist/lib/schema.d.ts +1 -1
  124. package/dist/lib/schema.js +3 -3
  125. package/dist/lib/syntax-highlighting.cjs +15 -15
  126. package/dist/lib/syntax-highlighting.d.cts +1 -1
  127. package/dist/lib/syntax-highlighting.d.ts +1 -1
  128. package/dist/lib/syntax-highlighting.js +2 -2
  129. package/dist/lib/{types-DRpZJjkx.d.ts → types-BZAWM2oN.d.ts} +2 -2
  130. package/dist/lib/{types-6QQt-XVS.d.cts → types-BhyJ6plH.d.cts} +2 -2
  131. package/dist/lib/{types-CxQPMHn1.d.ts → types-DA9_CC7p.d.cts} +3 -1
  132. package/dist/lib/{types-CxQPMHn1.d.cts → types-DA9_CC7p.d.ts} +3 -1
  133. package/dist/lib/types.cjs +10 -6
  134. package/dist/lib/types.d.cts +1 -1
  135. package/dist/lib/types.d.ts +1 -1
  136. package/dist/lib/types.js +1 -1
  137. package/dist/processor/index.d.ts +1 -1
  138. package/dist/processor/index.js +18 -2
  139. package/dist/processor/index.js.map +1 -1
  140. package/dist/repl.d.ts +15 -3
  141. package/dist/repl.js +6 -8
  142. package/dist/repl.js.map +1 -1
  143. package/dist/token-schemas.js +414 -0
  144. package/dist/types.d.ts +1 -1
  145. package/dist/types.js +1 -1
  146. package/package.json +1 -1
  147. package/dist/chunk-33CDF4L4.js.map +0 -1
  148. package/dist/chunk-3ZOUTFP5.js.map +0 -1
  149. package/dist/chunk-5S3H4SYX.js +0 -6460
  150. package/dist/chunk-5S3H4SYX.js.map +0 -1
  151. package/dist/chunk-AXH5N7KV.js.map +0 -1
  152. package/dist/chunk-CKLFRLH7.js.map +0 -1
  153. package/dist/chunk-GJIOYGP6.js +0 -6446
  154. package/dist/chunk-GJIOYGP6.js.map +0 -1
  155. package/dist/chunk-HHCPY4WI.js +0 -6456
  156. package/dist/chunk-HHCPY4WI.js.map +0 -1
  157. package/dist/chunk-LZTXD3LN.js.map +0 -1
  158. package/dist/chunk-MXKGYBE4.js +0 -6457
  159. package/dist/chunk-MXKGYBE4.js.map +0 -1
  160. package/dist/chunk-NGG6MBER.js +0 -6452
  161. package/dist/chunk-NGG6MBER.js.map +0 -1
  162. package/dist/chunk-OCQX3WYJ.js.map +0 -1
  163. package/dist/chunk-QP7M6WUR.js.map +0 -1
  164. package/dist/lib/chunk-2BDFE7U4.js.map +0 -1
  165. package/dist/lib/chunk-AEOBCHBK.js.map +0 -1
  166. package/dist/lib/chunk-K65UI6KX.cjs.map +0 -1
  167. package/dist/lib/chunk-KHF2VXWO.cjs.map +0 -1
  168. package/dist/lib/chunk-S7WGJBSX.js.map +0 -1
  169. package/dist/lib/chunk-UF6I25ED.cjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/interpreter/tolerant/partial-nodes.ts","../../src/interpreter/ast.ts","../../src/interpreter/utils/references.ts","../../src/interpreter/lexer.ts","../../src/interpreter/tolerant/types.ts","../../src/interpreter/parser.ts","../../src/processor/builders/index.ts","../../src/processor/resolver/DependencyTracker.ts","../../src/processor/resolver/helpers.ts","../../src/processor/resolver/issue-helpers.ts","../../src/processor/resolver/PrefixExtractor.ts","../../src/processor/resolver/PrefixManager.ts","../../src/processor/resolver/ReadinessTracker.ts","../../src/processor/resolver/ResolutionNotifier.ts","../../src/interpreter/operations.ts","../../src/interpreter/symbolTable.ts","../../src/interpreter/interpreter.ts","../../src/processor/errors.ts","../../src/processor/resolver/TokenInterpreter.ts","../../src/processor/object-parsers/default-object-parsers.ts","../../src/processor/object-parsers/symbol-conversion.ts","../../src/processor/utils/DependencyGraph.ts","../../src/processor/utils/name-validation.ts","../../src/processor/utils/structured-tokens.ts","../../src/processor/utils/tokens.ts","../../src/processor/validator/types.ts","../../src/processor/resolver/TokenResolver.ts","../../src/processor/builders/MapBuilder.ts","../../src/processor/builders/base.ts","../../src/processor/builders/flatten.ts","../../src/processor/builders/ObjectBuilder.ts","../../src/processor/builders/StringMapBuilder.ts","../../src/processor/utils/theme-resolver.ts","../../src/processor/utils/set-processor.ts","../../src/processor/process.ts","../../src/lib/errors.ts","../../src/interpreter/config/managers/color/schema.ts","../../src/interpreter/config/managers/functions/schema.ts","../../src/utils/schema-fetcher.ts","../../src/utils/schema-uri.ts","../../src/interpreter/config/managers/base-manager.ts","../../src/interpreter/config/managers/color/manager.ts","../../src/interpreter/config/managers/functions/builtin/math.ts","../../src/interpreter/config/managers/functions/manager.ts","../../src/interpreter/config/managers/token/schema.ts","../../src/interpreter/config/managers/token/manager.ts","../../src/interpreter/config/managers/unit/schema.ts","../../src/interpreter/config/managers/unit/manager.ts","../../src/interpreter/config/config.ts","../../src/interpreter/config/managers/constants/schema.ts","../../src/lib/eval.ts","../../src/interpreter/tolerant/index.ts","../../src/lib/interpreter.ts"],"names":["__name","isSome","SupportedFormats","ReservedKeyword","LexerError","isSpace","isNumber","isAlpha","isAlphaNumeric","ParseState","IncompleteType","ParserError","__export","isLanguageError","DictionarySymbol","NullSymbol","isTokenscriptSymbol","StringSymbol","NumberWithUnitSymbol","NumberSymbol","InterpreterError","opA","opB","resultValue","BooleanSymbol","isNull","jsValueToSymbolType","ListSymbol","ColorSymbol","parseHexWithAlpha","UNINTERPRETED_KEYWORDS","typeName","basicSymbolTypes","typeEquals","ProcessorError","isObject","TokenSymbol","isArray","isString","getKeyAlt","ValidationSeverity","isNested","isBoolean","unresolved","dependencyError","tokenValue","serializeInterpreterResult","stringifyInterpreterResult","z","LanguageError","Color","Fn","ZodError","safeParseInt","spec","serializeError","ensureValidAlpha","formatHex8","isTransparent","nums","sum","firstUnitArg","Token","specName","Unit","Constants","getResultTypeName"],"mappings":";;;;;;;AAKO,IAAM,qBAAA,GAAN,MAAM,qBAAA,CAAwC;AAAA,EAGnD,WAAA,CAES,cACA,KAAA,EACP;AAFO,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AALT,IAAA,IAAA,CAAA,QAAA,GAAW,sBAAA;AAAA,EAMR;AACL,CAAA;AARqDA,wBAAA,CAAA,qBAAA,EAAA,sBAAA,CAAA;AAA9C,IAAM,oBAAA,GAAN;AAaA,IAAM,kBAAA,GAAN,MAAM,kBAAA,CAAqC;AAAA,EAGhD,WAAA,CAES,YAAA,EAEA,SAAA,EACA,KAAA,EACP;AAJO,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AAEA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAPT,IAAA,IAAA,CAAA,QAAA,GAAW,mBAAA;AAAA,EAQR;AACL,CAAA;AAVkDA,wBAAA,CAAA,kBAAA,EAAA,mBAAA,CAAA;AAA3C,IAAM,iBAAA,GAAN;AAeA,IAAM,wBAAA,GAAN,MAAM,wBAAA,CAA2C;AAAA,EAGtD,WAAA,CAES,IAAA,EAEA,IAAA,EACA,KAAA,EACP;AAJO,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAEA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAPT,IAAA,IAAA,CAAA,QAAA,GAAW,yBAAA;AAAA,EAQR;AACL,CAAA;AAVwDA,wBAAA,CAAA,wBAAA,EAAA,yBAAA,CAAA;AAAjD,IAAM,uBAAA,GAAN;AAeA,IAAM,iBAAA,GAAN,MAAM,iBAAA,CAAoC;AAAA,EAI/C,WAAA,CAES,MAEA,OAAA,EACP;AAHO,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAEA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAPT,IAAA,IAAA,CAAA,QAAA,GAAW,kBAAA;AAST,IAAA,IAAA,CAAK,KAAA,GAAQ,OAAA;AAAA,EACf;AAAA,EAEA,IAAI,EAAA,GAA6B;AAC/B,IAAA,OAAO,KAAK,OAAA,CAAQ,KAAA;AAAA,EACtB;AACF,CAAA;AAhBiDA,wBAAA,CAAA,iBAAA,EAAA,kBAAA,CAAA;AAA1C,IAAM,gBAAA,GAAN;AAqBA,IAAM,mBAAA,GAAN,MAAM,mBAAA,CAAsC;AAAA,EAIjD,YAES,OAAA,EACP;AADO,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AALT,IAAA,IAAA,CAAA,QAAA,GAAW,oBAAA;AAOT,IAAA,IAAA,CAAK,KAAA,GAAQ,OAAA;AAAA,EACf;AAAA,EAEA,IAAI,EAAA,GAAiB;AACnB,IAAA,OAAO,KAAK,OAAA,CAAQ,KAAA;AAAA,EACtB;AACF,CAAA;AAdmDA,wBAAA,CAAA,mBAAA,EAAA,oBAAA,CAAA;AAA5C,IAAM,kBAAA,GAAN;AAmBA,IAAM,iBAAA,GAAN,MAAM,iBAAA,CAAoC;AAAA,EAG/C,WAAA,CAES,MACA,KAAA,EACP;AAFO,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AALT,IAAA,IAAA,CAAA,QAAA,GAAW,kBAAA;AAAA,EAMR;AACL,CAAA;AARiDA,wBAAA,CAAA,iBAAA,EAAA,kBAAA,CAAA;AAA1C,IAAM,gBAAA,GAAN;;;AC3EA,IAAM,UAAA,GAAN,MAAM,UAAA,CAA6B;AAAA,EAExC,WAAA,CACS,IAAA,EACA,OAAA,EACA,KAAA,EACA,KAAA,EACP;AAJO,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AALT,IAAA,IAAA,CAAA,QAAA,GAAW,WAAA;AAOT,IAAA,IAAA,CAAK,KAAA,GAAQ,OAAA;AAAA,EACf;AAAA,EACA,IAAI,EAAA,GAA6B;AAC/B,IAAA,OAAO,KAAK,OAAA,CAAQ,KAAA;AAAA,EACtB;AACF,CAAA;AAb0CA,wBAAA,CAAA,UAAA,EAAA,WAAA,CAAA;AAAnC,IAAM,SAAA,GAAN,UAAA;AAeA,IAAM,QAAA,GAAN,MAAM,QAAA,CAA2B;AAAA,EAGtC,YAAmB,KAAA,EAAc;AAAd,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAFnB,IAAA,IAAA,CAAA,QAAA,GAAW,SAAA;AAGT,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA,EAAG;AAClC,MAAA,IAAA,CAAK,KAAA,GAAQ,MAAA,CAAO,UAAA,CAAW,IAAA,CAAK,MAAM,KAAK,CAAA;AAAA,IACjD,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,QAAQ,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,OAAO,EAAE,CAAA;AAAA,IACnD;AAAA,EACF;AACF,CAAA;AAVwCA,wBAAA,CAAA,QAAA,EAAA,SAAA,CAAA;AAAjC,IAAM,OAAA,GAAN,QAAA;AAYA,IAAM,WAAA,GAAN,MAAM,WAAA,CAA8B;AAAA,EAGzC,YAAmB,KAAA,EAAc;AAAd,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAFnB,IAAA,IAAA,CAAA,QAAA,GAAW,YAAA;AAGT,IAAA,IAAA,CAAK,QAAQ,KAAA,CAAM,KAAA;AAAA,EACrB;AACF,CAAA;AAN2CA,wBAAA,CAAA,WAAA,EAAA,YAAA,CAAA;AAApC,IAAM,UAAA,GAAN,WAAA;AAQA,IAAM,mBAAA,GAAN,MAAM,mBAAA,CAAsC;AAAA,EAEjD,WAAA,CACS,OACA,KAAA,EACP;AAFO,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAHT,IAAA,IAAA,CAAA,QAAA,GAAW,oBAAA;AAAA,EAIR;AACL,CAAA;AANmDA,wBAAA,CAAA,mBAAA,EAAA,oBAAA,CAAA;AAA5C,IAAM,kBAAA,GAAN,mBAAA;AAQA,IAAM,YAAA,GAAN,MAAM,YAAA,CAA+B;AAAA,EAE1C,WAAA,CACS,OAAA,EACA,IAAA,EACA,KAAA,EACP;AAHO,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAJT,IAAA,IAAA,CAAA,QAAA,GAAW,aAAA;AAMT,IAAA,IAAA,CAAK,KAAA,GAAQ,OAAA;AAAA,EACf;AAAA,EACA,IAAI,EAAA,GAAiB;AACnB,IAAA,OAAO,KAAK,OAAA,CAAQ,KAAA;AAAA,EACtB;AACF,CAAA;AAZ4CA,wBAAA,CAAA,YAAA,EAAA,aAAA,CAAA;AAArC,IAAM,WAAA,GAAN,YAAA;AAcA,IAAM,SAAA,GAAN,MAAM,SAAA,CAA4B;AAAA,EAEvC,WAAA,CACS,UACA,KAAA,EACP;AAFO,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAHT,IAAA,IAAA,CAAA,QAAA,GAAW,UAAA;AAAA,EAIR;AACL,CAAA;AANyCA,wBAAA,CAAA,SAAA,EAAA,UAAA,CAAA;AAAlC,IAAM,QAAA,GAAN,SAAA;AAQA,IAAM,iBAAA,GAAN,MAAM,iBAAA,SAAyB,QAAA,CAAS;AAAA,EAG7C,WAAA,CACS,UACA,KAAA,EACP;AACA,IAAA,KAAA,CAAM,UAAU,KAAK,CAAA;AAHd,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAJT,IAAA,IAAA,CAAS,QAAA,GAAW,kBAAA;AACpB,IAAA,IAAA,CAAO,UAAA,GAAa,IAAA;AAAA,EAMpB;AACF,CAAA;AAT+CA,wBAAA,CAAA,iBAAA,EAAA,kBAAA,CAAA;AAAxC,IAAM,gBAAA,GAAN,iBAAA;AAWA,IAAM,iBAAA,GAAN,MAAM,iBAAA,CAAoC;AAAA,EAG/C,WAAA,CACE,cAAA,EACO,IAAA,EACA,KAAA,EACP;AAFO,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AALT,IAAA,IAAA,CAAA,QAAA,GAAW,kBAAA;AAOT,IAAA,IAAA,CAAK,IAAA,GAAO,cAAA;AAAA,EACd;AACF,CAAA;AAViDA,wBAAA,CAAA,iBAAA,EAAA,kBAAA,CAAA;AAA1C,IAAM,gBAAA,GAAN,iBAAA;AAYA,IAAM,SAAA,GAAN,MAAM,SAAA,CAA4B;AAAA,EAEvC,YAAmB,KAAA,EAAe;AAAf,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AADnB,IAAA,IAAA,CAAA,QAAA,GAAW,UAAA;AAAA,EACwB;AACrC,CAAA;AAHyCA,wBAAA,CAAA,SAAA,EAAA,UAAA,CAAA;AAAlC,IAAM,QAAA,GAAN,SAAA;AAKA,IAAM,cAAA,GAAN,MAAM,cAAA,CAAiC;AAAA,EAG5C,YAAmB,KAAA,EAAc;AAAd,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAFnB,IAAA,IAAA,CAAA,QAAA,GAAW,eAAA;AAGT,IAAA,IAAA,CAAK,QAAQ,KAAA,CAAM,KAAA;AAAA,EACrB;AACF,CAAA;AAN8CA,wBAAA,CAAA,cAAA,EAAA,eAAA,CAAA;AAAvC,IAAM,aAAA,GAAN,cAAA;AAQA,IAAM,eAAA,GAAN,MAAM,eAAA,CAAkC;AAAA,EAG7C,YAAmB,KAAA,EAAc;AAAd,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAFnB,IAAA,IAAA,CAAA,QAAA,GAAW,gBAAA;AAGT,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,KAAA;AAAA,EACpB;AACF,CAAA;AAN+CA,wBAAA,CAAA,eAAA,EAAA,gBAAA,CAAA;AAAxC,IAAM,cAAA,GAAN,eAAA;AAQA,IAAM,aAAA,GAAN,MAAM,aAAA,CAAgC;AAAA,EAG3C,YAAmB,KAAA,EAAc;AAAd,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAFnB,IAAA,IAAA,CAAA,QAAA,GAAW,cAAA;AAGT,IAAA,IAAA,CAAK,QAAQ,KAAA,CAAM,KAAA;AAAA,EACrB;AACF,CAAA;AAN6CA,wBAAA,CAAA,aAAA,EAAA,cAAA,CAAA;AAAtC,IAAM,YAAA,GAAN,aAAA;AAQA,IAAM,YAAA,GAAN,MAAM,YAAA,CAA+B;AAAA,EAE1C,WAAA,CACS,OACA,KAAA,EACP;AAFO,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAHT,IAAA,IAAA,CAAA,QAAA,GAAW,aAAA;AAAA,EAIR;AACL,CAAA;AAN4CA,wBAAA,CAAA,YAAA,EAAA,aAAA,CAAA;AAArC,IAAM,WAAA,GAAN,YAAA;AAQA,IAAM,SAAA,GAAN,MAAM,SAAA,CAA4B;AAAA,EAEvC,YAAmB,KAAA,EAAe;AAAf,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AADnB,IAAA,IAAA,CAAA,QAAA,GAAW,UAAA;AAAA,EACwB;AACrC,CAAA;AAHyCA,wBAAA,CAAA,SAAA,EAAA,UAAA,CAAA;AAAlC,IAAM,QAAA,GAAN,SAAA;AAKA,IAAM,oBAAA,GAAN,MAAM,oBAAA,CAAuC;AAAA,EAGlD,WAAA,CACS,OAAA,EACP,cAAA,EACO,KAAA,EACP;AAHO,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAEA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AALT,IAAA,IAAA,CAAA,QAAA,GAAW,qBAAA;AAOT,IAAA,IAAA,CAAK,IAAA,GAAO,cAAA;AAAA,EACd;AACF,CAAA;AAVoDA,wBAAA,CAAA,oBAAA,EAAA,qBAAA,CAAA;AAA7C,IAAM,mBAAA,GAAN,oBAAA;AAYA,IAAM,WAAA,GAAN,MAAM,WAAA,CAA8B;AAAA,EAEzC,WAAA,CACS,OAAA,EACA,QAAA,EACA,cAAA,EACA,KAAA,EACP;AAJO,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,cAAA,GAAA,cAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AALT,IAAA,IAAA,CAAA,QAAA,GAAW,YAAA;AAAA,EAMR;AACL,CAAA;AAR2CA,wBAAA,CAAA,WAAA,EAAA,YAAA,CAAA;AAApC,IAAM,UAAA,GAAN,WAAA;AAUA,IAAM,aAAA,GAAN,MAAM,aAAA,CAAgC;AAAA;AAAA;AAAA,EAI3C,WAAA,CACS,QAAA,EACA,QAAA,EACA,KAAA,EACP;AAHO,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AANT,IAAA,IAAA,CAAA,QAAA,GAAW,cAAA;AAAA,EAOR;AAAA,EAEH,IAAA,GAAe;AACb,IAAA,IAAI,OAAA,GAAU,KAAK,QAAA,CAAS,IAAA;AAC5B,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG;AAC5B,MAAA,OAAA,IAAW,CAAA,CAAA,EAAI,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AAAA,IAC3D;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AACF,CAAA;AAjB6CA,wBAAA,CAAA,aAAA,EAAA,cAAA,CAAA;AAAtC,IAAM,YAAA,GAAN,aAAA;AAmBA,IAAM,qCAAqBA,wBAAA,CAAA,CAAC,KAAA,KAA4B,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA,EAA3C,oBAAA,CAAA;AAE3B,IAAM,wBAAA,mBAA2BA,wBAAA,CAAA,CAAC,KAAA,KACvC,kBAAA,CAAmB,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAC,CAAA,EADL,0BAAA,CAAA;AAGjC,IAAM,aAAA,GAAN,MAAM,aAAA,CAAgC;AAAA,EAE3C,WAAA,CACS,UAAA,EACA,KAAA,EACA,KAAA,EACP;AAHO,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAJT,IAAA,IAAA,CAAA,QAAA,GAAW,cAAA;AAAA,EAKR;AAAA,EACH,cAAA,GAAiC;AAC/B,IAAA,OAAO,KAAA,CAAM,QAAQ,IAAA,CAAK,UAAU,IAAI,IAAA,CAAK,UAAA,CAAW,CAAC,CAAA,GAAI,IAAA,CAAK,UAAA;AAAA,EACpE;AAAA,EACA,qBAAA,GAAiC;AAC/B,IAAA,OAAO,KAAA,CAAM,QAAQ,IAAA,CAAK,UAAU,KAAK,CAAC,CAAC,IAAA,CAAK,UAAA,CAAW,CAAC,CAAA;AAAA,EAC9D;AAAA,EACA,kBAAA,GAA6B;AAC3B,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,UAAU,IAAI,IAAA,CAAK,UAAA,GAAa,CAAC,IAAA,CAAK,UAAU,CAAA;AACjF,IAAA,OAAO,yBAAyB,KAAK,CAAA;AAAA,EACvC;AAAA,EACA,eAAA,GAAoC;AAClC,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,UAAU,CAAA,EAAG;AAClC,MAAA,OAAO,IAAA,CAAK,UAAA,CAAW,KAAA,CAAM,CAAC,CAAA;AAAA,IAChC,CAAA,MAAO;AACL,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA,EACA,qBAAA,GAAkC;AAChC,IAAA,OAAO,KAAK,eAAA,EAAgB,CAAE,IAAI,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AAAA,EACjD;AACF,CAAA;AA3B6CA,wBAAA,CAAA,aAAA,EAAA,cAAA,CAAA;AAAtC,IAAM,YAAA,GAAN,aAAA;AA6BA,IAAM,WAAA,GAAN,MAAM,WAAA,CAA8B;AAAA,EAEzC,WAAA,CACS,MACA,KAAA,EACP;AAFO,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAHT,IAAA,IAAA,CAAA,QAAA,GAAW,YAAA;AAAA,EAIR;AACL,CAAA;AAN2CA,wBAAA,CAAA,WAAA,EAAA,YAAA,CAAA;AAApC,IAAM,UAAA,GAAN,WAAA;AAQA,IAAM,UAAA,GAAN,MAAM,UAAA,CAA6B;AAAA,EAExC,WAAA,CACS,SAAA,EACA,IAAA,EACA,KAAA,EACP;AAHO,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAJT,IAAA,IAAA,CAAA,QAAA,GAAW,WAAA;AAAA,EAKR;AACL,CAAA;AAP0CA,wBAAA,CAAA,UAAA,EAAA,WAAA,CAAA;AAAnC,IAAM,SAAA,GAAN,UAAA;AASA,IAAM,YAAA,GAAN,MAAM,YAAA,CAA+B;AAAA,EAE1C,WAAA,CACS,OAAA,EACA,QAAA,EACA,UAAA,EACA,MACA,KAAA,EACP;AALO,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AANT,IAAA,IAAA,CAAA,QAAA,GAAW,aAAA;AAAA,EAOR;AACL,CAAA;AAT4CA,wBAAA,CAAA,YAAA,EAAA,aAAA,CAAA;AAArC,IAAM,WAAA,GAAN,YAAA;AAWA,IAAM,gBAAA,GAAN,MAAM,gBAAA,CAAmC;AAAA,EAE9C,WAAA,CACS,SAAA,EACA,IAAA,EACA,KAAA,EACP;AAHO,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAJT,IAAA,IAAA,CAAA,QAAA,GAAW,iBAAA;AAAA,EAKR;AACL,CAAA;AAPgDA,wBAAA,CAAA,gBAAA,EAAA,iBAAA,CAAA;AAAzC,IAAM,eAAA,GAAN,gBAAA;AASA,IAAM,OAAA,GAAN,MAAM,OAAA,CAA0B;AAAA,EAErC,WAAA,CACS,UAAA,EACA,QAAA,EACA,KAAA,EACP;AAHO,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAJT,IAAA,IAAA,CAAA,QAAA,GAAW,QAAA;AAAA,EAKR;AACL,CAAA;AAPuCA,wBAAA,CAAA,OAAA,EAAA,QAAA,CAAA;AAAhC,IAAM,MAAA,GAAN,OAAA;AASA,IAAM,UAAA,GAAN,MAAM,UAAA,CAA6B;AAAA,EAGxC,WAAA,CACS,YACA,KAAA,EACP;AAFO,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAHT;AAAA,IAAA,IAAA,CAAA,QAAA,GAAW,WAAA;AAAA,EAIR;AACL,CAAA;AAP0CA,wBAAA,CAAA,UAAA,EAAA,WAAA,CAAA;AAAnC,IAAM,SAAA,GAAN,UAAA;AASA,IAAM,kBAAA,GAAN,MAAM,kBAAA,CAAqC;AAAA,EAEhD,WAAA,CACS,YACA,KAAA,EACP;AAFO,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAHT,IAAA,IAAA,CAAA,QAAA,GAAW,mBAAA;AAAA,EAIR;AACL,CAAA;AANkDA,wBAAA,CAAA,kBAAA,EAAA,mBAAA,CAAA;AAA3C,IAAM,iBAAA,GAAN,kBAAA;AAQA,IAAM,oBAAA,GAAN,MAAM,oBAAA,CAAuC;AAAA;AAAA;AAAA,EAIlD,WAAA,CACS,IAAA,EACA,KAAA,EACA,KAAA,EACP;AAHO,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AANT,IAAA,IAAA,CAAA,QAAA,GAAW,qBAAA;AAAA,EAOR;AACL,CAAA;AAToDA,wBAAA,CAAA,oBAAA,EAAA,qBAAA,CAAA;AAA7C,IAAM,mBAAA,GAAN,oBAAA;AA8BA,SAAS,OAAA,CAAQ,MAAe,OAAA,EAAwC;AAC7E,EAAA,OAAA,CAAQ,IAAI,CAAA;AAEZ,EAAA,IAAI,gBAAgB,SAAA,EAAW;AAC7B,IAAA,OAAA,CAAQ,IAAA,CAAK,MAAM,OAAO,CAAA;AAC1B,IAAA,OAAA,CAAQ,IAAA,CAAK,OAAO,OAAO,CAAA;AAAA,EAC7B,CAAA,MAAA,IAAW,gBAAgB,WAAA,EAAa;AACtC,IAAA,OAAA,CAAQ,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,EAC5B,CAAA,MAAA,IAAW,IAAA,YAAgB,QAAA,IAAY,IAAA,YAAgB,gBAAA,EAAkB;AACvE,IAAA,KAAA,MAAW,OAAA,IAAW,KAAK,QAAA,EAAU;AACnC,MAAA,OAAA,CAAQ,SAAS,OAAO,CAAA;AAAA,IAC1B;AAAA,EACF,CAAA,MAAA,IAAW,gBAAgB,gBAAA,EAAkB;AAC3C,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,IAAA,EAAM;AAC3B,MAAA,OAAA,CAAQ,KAAK,OAAO,CAAA;AAAA,IACtB;AAAA,EACF,CAAA,MAAA,IAAW,gBAAgB,mBAAA,EAAqB;AAC9C,IAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,OAAO,CAAA;AAAA,EAC/B,CAAA,MAAA,IAAW,gBAAgB,UAAA,EAAY;AACrC,IAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,MAAA,OAAA,CAAQ,IAAA,CAAK,gBAAgB,OAAO,CAAA;AAAA,IACtC;AAAA,EACF,CAAA,MAAA,IAAW,gBAAgB,YAAA,EAAc;AACvC,IAAA,OAAA,CAAQ,IAAA,CAAK,OAAO,OAAO,CAAA;AAAA,EAC7B,CAAA,MAAA,IAAW,gBAAgB,UAAA,EAAY;AACrC,IAAA,OAAA,CAAQ,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,EAC5B,CAAA,MAAA,IAAW,gBAAgB,SAAA,EAAW;AACpC,IAAA,OAAA,CAAQ,IAAA,CAAK,WAAW,OAAO,CAAA;AAC/B,IAAA,OAAA,CAAQ,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,EAC5B,CAAA,MAAA,IAAW,gBAAgB,WAAA,EAAa;AACtC,IAAA,OAAA,CAAQ,IAAA,CAAK,YAAY,OAAO,CAAA;AAChC,IAAA,OAAA,CAAQ,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,EAC5B,CAAA,MAAA,IAAW,gBAAgB,eAAA,EAAiB;AAC1C,IAAA,OAAA,CAAQ,IAAA,CAAK,WAAW,OAAO,CAAA;AAC/B,IAAA,OAAA,CAAQ,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,EAC5B,CAAA,MAAA,IAAW,gBAAgB,MAAA,EAAQ;AACjC,IAAA,KAAA,MAAW,SAAA,IAAa,KAAK,UAAA,EAAY;AACvC,MAAA,OAAA,CAAQ,WAAW,OAAO,CAAA;AAAA,IAC5B;AACA,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,OAAA,CAAQ,IAAA,CAAK,UAAU,OAAO,CAAA;AAAA,IAChC;AAAA,EACF,CAAA,MAAA,IAAW,gBAAgB,SAAA,EAAW;AACpC,IAAA,OAAA,CAAQ,IAAA,CAAK,YAAY,OAAO,CAAA;AAAA,EAClC,CAAA,MAAA,IAAW,gBAAgB,iBAAA,EAAmB;AAC5C,IAAA,KAAA,MAAW,SAAA,IAAa,KAAK,UAAA,EAAY;AACvC,MAAA,OAAA,CAAQ,WAAW,OAAO,CAAA;AAAA,IAC5B;AAAA,EACF,CAAA,MAAA,IAAW,gBAAgB,kBAAA,EAAoB;AAC7C,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,KAAA,EAAO;AAC7B,MAAA,OAAA,CAAQ,MAAM,OAAO,CAAA;AAAA,IACvB;AAAA,EACF,CAAA,MAAA,IAAW,gBAAgB,mBAAA,EAAqB;AAC9C,IAAA,OAAA,CAAQ,IAAA,CAAK,MAAM,OAAO,CAAA;AAC1B,IAAA,IAAI,IAAA,CAAK,KAAA,YAAiB,gBAAA,IAAoB,IAAA,CAAK,iBAAiB,uBAAA,EAAyB;AAC3F,MAAA,OAAA,CAAQ,IAAA,CAAK,OAAO,OAAO,CAAA;AAAA,IAC7B;AAAA,EACF,CAAA,MAAA,IAES,gBAAgB,gBAAA,EAAkB;AACzC,IAAA,OAAA,CAAQ,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,EAC5B,CAAA,MAAA,IAAW,gBAAgB,kBAAA,EAAoB,CAE/C,MAAA,IAAW,gBAAgB,uBAAA,EAAyB;AAClD,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,IAAA,EAAM;AAC3B,MAAA,OAAA,CAAQ,KAAK,OAAO,CAAA;AAAA,IACtB;AAAA,EACF,CAAA,MAAA,IAAW,gBAAgB,gBAAA,EAAkB;AAC3C,IAAA,OAAA,CAAQ,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,EAC5B;AACF;AAtEgBA,wBAAA,CAAA,OAAA,EAAA,SAAA,CAAA;AAyFT,SAAS,SAAA,CACd,KACA,SAAA,EACK;AACL,EAAA,MAAM,UAAe,EAAC;AACtB,EAAA,OAAA,CAAQ,GAAA,EAAK,CAAC,IAAA,KAAS;AACrB,IAAA,IAAI,SAAA,CAAU,IAAI,CAAA,EAAG;AACnB,MAAA,OAAA,CAAQ,KAAK,IAAS,CAAA;AAAA,IACxB;AAAA,EACF,CAAC,CAAA;AACD,EAAA,OAAO,OAAA;AACT;AAXgBA,wBAAA,CAAA,SAAA,EAAA,WAAA,CAAA;AA4BT,SAAS,qBAAA,CAAsB,KAAc,UAAA,EAAsC;AACxF,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,OAAO,SAAA;AAAA,MACL,GAAA;AAAA,MACA,CAAC,IAAA,KAAS,IAAA,YAAgB,aAAA,IAAiB,KAAK,KAAA,KAAU;AAAA,KAC5D;AAAA,EACF;AACA,EAAA,OAAO,SAAA,CAAyB,GAAA,EAAK,CAAC,IAAA,KAAS,gBAAgB,aAAa,CAAA;AAC9E;AARgBA,wBAAA,CAAA,qBAAA,EAAA,uBAAA,CAAA;;;AC5YT,SAAS,gBAAA,CACd,aAAA,EACA,GAAA,EACA,SAAA,EACQ;AACR,EAAA,MAAM,YAAiC,EAAC;AAGxC,EAAA,KAAA,MAAW,CAAC,OAAA,EAAS,OAAO,KAAK,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,EAAG;AAC1D,IAAA,MAAM,UAAA,GAAa,qBAAA,CAAsB,GAAA,EAAK,OAAO,CAAA;AAErD,IAAA,KAAA,MAAW,OAAO,UAAA,EAAY;AAC5B,MAAA,IAAIC,wBAAA,CAAO,IAAI,KAAA,CAAM,GAAG,KAAKA,wBAAA,CAAO,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA,EAAG;AACrD,QAAA,SAAA,CAAU,IAAA,CAAK;AAAA,UACb,KAAA,EAAO,IAAI,KAAA,CAAM,GAAA;AAAA,UACjB,GAAA,EAAK,IAAI,KAAA,CAAM,MAAA;AAAA,UACf,OAAA;AAAA,UACA;AAAA,SACD,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAIA,EAAA,SAAA,CAAU,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAK,CAAA;AAG1C,EAAA,IAAI,MAAA,GAAS,aAAA;AACb,EAAA,KAAA,MAAW,OAAO,SAAA,EAAW;AAC3B,IAAA,MAAA,GAAS,MAAA,CAAO,SAAA,CAAU,CAAA,EAAG,GAAA,CAAI,KAAK,CAAA,GAAI,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA;AAAA,EAClF;AAEA,EAAA,OAAO,MAAA;AACT;AAlCgBD,wBAAA,CAAA,gBAAA,EAAA,kBAAA,CAAA;;;AC5BhB,IAAM,2BAA6D,EAAC;AACpE,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,MAAA,CAAOE,kCAAgB,CAAA,EAAe;AAC7D,EAAA,wBAAA,CAAyB,GAAA,CAAI,WAAA,EAAa,CAAA,GAAI,GAAA;AAChD;AAEA,IAAM,2BAA4D,EAAC;AACnE,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,MAAA,CAAOC,iCAAe,CAAA,EAAe;AAC5D,EAAA,wBAAA,CAAyB,GAAA,CAAI,WAAA,EAAa,CAAA,GAAI,GAAA;AAChD;AAaO,IAAM,MAAA,GAAN,MAAM,MAAA,CAAM;AAAA,EAkBjB,WAAA,CAAY,MAAc,OAAA,EAAwB;AAflD,IAAA,IAAA,CAAQ,GAAA,GAAM,CAAA;AACd,IAAA,IAAA,CAAQ,IAAA,GAAO,CAAA;AACf,IAAA,IAAA,CAAQ,MAAA,GAAS,CAAA;AASjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,IAAA,CAAQ,kBAAA,GAAmC,IAAA;AAE3C,IAAA,IAAA,CAAQ,kBAA2B,EAAC;AAGlC,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA,CAAK,GAAA,GAAM,IAAA,CAAK,IAAA,CAAK,SAAS,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,GAAI,IAAA;AACvE,IAAA,IAAA,CAAK,QAAA,GAAW,SAAS,QAAA,IAAY,KAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,sBAAsB,QAAA,EAA2B;AACvD,IAAA,OAAO,IAAA,CAAK,kBAAA,KAAuB,IAAA,IAAQ,IAAA,CAAK,mBAAmB,MAAA,KAAW,QAAA;AAAA,EAChF;AAAA,EAEQ,KAAA,CAAM,MAAsB,IAAA,EAAuC;AACzE,IAAA,MAAM,IAAIC,6BAAW,IAAA,EAAM;AAAA,MACzB,MAAM,IAAA,CAAK,IAAA;AAAA,MACX;AAAA,KACD,CAAA;AAAA,EACH;AAAA,EAEQ,OAAA,GAAgB;AACtB,IAAA,IAAI,IAAA,CAAK,gBAAgB,IAAA,EAAM;AAC7B,MAAA,IAAA,CAAK,IAAA,EAAA;AACL,MAAA,IAAA,CAAK,MAAA,GAAS,CAAA;AAAA,IAChB;AACA,IAAA,IAAA,CAAK,GAAA,EAAA;AACL,IAAA,IAAA,CAAK,MAAA,EAAA;AACL,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA,CAAK,GAAA,GAAM,IAAA,CAAK,IAAA,CAAK,SAAS,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,GAAI,IAAA;AAAA,EACzE;AAAA,EAEQ,IAAI,IAAA,EAAoB;AAC9B,IAAA,IAAI,IAAA,CAAK,gBAAgB,IAAA,EAAM;AAC7B,MAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,IACf,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,KAAA,CAAA,0BAAA,2BAAyC;AAAA,QAC5C,QAAA,EAAU,IAAA;AAAA,QACV,KAAK,IAAA,CAAK;AAAA,OACX,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,IAAA,CAAK,IAAI,CAAA,EAAkB;AACjC,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,GAAA,GAAM,CAAC,CAAA,IAAK,IAAA;AAAA,EACpC;AAAA,EAEQ,cAAA,GAAuB;AAC7B,IAAA,OAAOC,yBAAA,CAAQ,IAAA,CAAK,WAAW,CAAA,EAAG;AAChC,MAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,IACf;AAAA,EACF;AAAA,EAEQ,QAAA,GAAiB;AACvB,IAAA,OAAO,IAAA,CAAK,WAAA,KAAgB,IAAA,IAAQ,IAAA,CAAK,gBAAgB,IAAA,EAAM;AAC7D,MAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,IACf;AACA,IAAA,IAAI,IAAA,CAAK,gBAAgB,IAAA,EAAM;AAC7B,MAAA,IAAA,CAAK,IAAI,IAAI,CAAA;AAAA,IACf;AAAA,EACF;AAAA,EAEQ,SAAA,GAAqB;AAC3B,IAAA,OAAO,IAAA,CAAK,WAAA,KAAgB,GAAA,IAAO,IAAA,CAAK,MAAK,KAAM,GAAA;AAAA,EACrD;AAAA,EAEQ,MAAA,GAAgB;AACtB,IAAA,MAAM,WAAW,IAAA,CAAK,GAAA;AACtB,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,IAAI,eAAA,GAAkB,KAAA;AAGtB,IAAA,IAAI,IAAA,CAAK,gBAAgB,GAAA,EAAK;AAC5B,MAAA,MAAA,IAAU,GAAA;AAAA,IACZ;AAEA,IAAA,OAAOC,4BAAS,IAAA,CAAK,WAAW,CAAA,IAAK,IAAA,CAAK,gBAAgB,GAAA,EAAK;AAC7D,MAAA,IAAI,IAAA,CAAK,gBAAgB,GAAA,EAAK;AAE5B,QAAA,IAAI,CAACA,2BAAAA,CAAS,IAAA,CAAK,IAAA,EAAM,CAAA,EAAG;AAC1B,UAAA;AAAA,QACF;AAEA,QAAA,IAAI,eAAA,EAAiB;AACnB,UAAA,IAAA,CAAK,KAAA,CAAA,+BAAA,gCAA8C;AAAA,YACjD,KAAA,EAAO,SAAS,IAAA,CAAK;AAAA,WACtB,CAAA;AAAA,QACH;AACA,QAAA,eAAA,GAAkB,IAAA;AAAA,MACpB;AACA,MAAA,MAAA,IAAU,IAAA,CAAK,WAAA;AACf,MAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,IACf;AAEA,IAAA,MAAM,KAAA,GAAe;AAAA,MACnB,IAAA,EAAA,QAAA;AAAA,MACA,KAAA,EAAO,MAAA;AAAA,MACP,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,GAAA,EAAK,QAAA;AAAA,MACL,QAAQ,IAAA,CAAK;AAAA,KACf;AAEA,IAAA,IAAA,CAAK,kBAAA,GAAqB,KAAA;AAC1B,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA,EAGQ,OAAA,GAAmB;AACzB,IAAA,IAAI,IAAA,CAAK,WAAA,KAAgB,IAAA,EAAM,OAAO,KAAA;AACtC,IAAA,OAAOA,2BAAAA,CAAS,IAAA,CAAK,WAAW,CAAA,IAAM,IAAA,CAAK,gBAAgB,GAAA,IAAOA,2BAAAA,CAAS,IAAA,CAAK,IAAA,EAAM,CAAA;AAAA,EACxF;AAAA,EAEQ,uBAAuB,IAAA,EAA8B;AAC3D,IAAA,IAAI,IAAA,KAAS,MAAM,OAAO,KAAA;AAC1B,IAAA,IAAIC,yBAAA,CAAQ,IAAI,CAAA,EAAG,OAAO,IAAA;AAE1B,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,WAAA,CAAY,CAAC,CAAA,IAAK,CAAA;AAGlC,IAAA,IAAI,EAAA,IAAM,KAAK,OAAO,KAAA;AAGtB,IAAA,IAAI,+BAA+B,OAAO,KAAA;AAC1C,IAAA,IAAI,+BAAgC,OAAO,KAAA;AAE3C,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,qBAAqB,IAAA,EAA8B;AACzD,IAAA,IAAI,IAAA,KAAS,MAAM,OAAO,KAAA;AAC1B,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,WAAA,CAAY,CAAC,CAAA,IAAK,CAAA;AAClC,IAAA,OACEC,gCAAA,CAAe,IAAI,CAAA,IAAK,EAAA,KAAA,EAAA,iBAA2B,8BAA+B,EAAA,GAAK,GAAA;AAAA,EAE3F;AAAA,EAEQ,aAAA,GAAuB;AAC7B,IAAA,MAAM,WAAW,IAAA,CAAK,GAAA;AACtB,IAAA,IAAI,MAAA,GAAS,EAAA;AAEb,IAAA,OAAO,IAAA,CAAK,oBAAA,CAAqB,IAAA,CAAK,WAAW,CAAA,EAAG;AAClD,MAAA,MAAA,IAAU,IAAA,CAAK,WAAA;AACf,MAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,IACf;AAEA,IAAA,MAAM,gBAAA,GAAmB,OAAO,WAAA,EAAY;AAE5C,IAAA,MAAM,OAAA,GAAU,yBAAyB,gBAAgB,CAAA;AACzD,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAO;AAAA,QACL,IAAA,EAAA,kBAAA;AAAA,QACA,KAAA,EAAO,OAAA;AAAA,QACP,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,GAAA,EAAK,QAAA;AAAA,QACL,QAAQ,IAAA,CAAK;AAAA,OACf;AAAA,IACF;AAKA,IAAA,MAAM,MAAA,GAAS,yBAAyB,gBAAgB,CAAA;AACxD,IAAA,IAAI,MAAA,IAAU,IAAA,CAAK,qBAAA,CAAsB,QAAQ,CAAA,EAAG;AAClD,MAAA,OAAO;AAAA,QACL,IAAA,EAAA,QAAA;AAAA,QACA,KAAA,EAAO,MAAA;AAAA,QACP,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,GAAA,EAAK,QAAA;AAAA,QACL,QAAQ,IAAA,CAAK;AAAA,OACf;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,IAAA,EAAA,QAAA;AAAA,MACA,KAAA,EAAO,MAAA;AAAA,MACP,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,GAAA,EAAK,QAAA;AAAA,MACL,QAAQ,IAAA,CAAK;AAAA,KACf;AAAA,EACF;AAAA,EAEQ,SAAA,GAAmB;AACzB,IAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AAEZ,IAAA,MAAM,cAAc,IAAA,CAAK,GAAA;AACzB,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,OAAO,IAAA,CAAK,WAAA,KAAgB,IAAA,IAAQ,IAAA,CAAK,gBAAgB,GAAA,EAAK;AAC5D,MAAA,IAAI,IAAA,CAAK,gBAAgB,GAAA,EAAK;AAC5B,QAAA,IAAI,KAAK,QAAA,EAAU;AAEjB,UAAA;AAAA,QACF;AACA,QAAA,IAAA,CAAK,KAAA,CAAA,8BAAA,+BAA6C,EAAE,CAAA;AAAA,MACtD;AACA,MAAA,IAAIH,yBAAA,CAAQ,IAAA,CAAK,WAAW,CAAA,EAAG;AAC7B,QAAA,IAAA,CAAK,OAAA,EAAQ;AACb,QAAA;AAAA,MACF;AACA,MAAA,MAAA,IAAU,IAAA,CAAK,WAAA;AACf,MAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,IACf;AAEA,IAAA,IAAI,IAAA,CAAK,gBAAgB,IAAA,EAAM;AAC7B,MAAA,IAAI,KAAK,QAAA,EAAU;AAEjB,QAAA,OAAO;AAAA,UACL,IAAA,EAAA,mBAAA;AAAA,UACA,KAAA,EAAO,MAAA;AAAA,UACP,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,GAAA,EAAK,WAAA;AAAA,UACL,QAAQ,IAAA,CAAK;AAAA,SACf;AAAA,MACF;AACA,MAAA,IAAA,CAAK,KAAA,CAAA,8BAAA,+BAA6C,EAAE,CAAA;AAAA,IACtD;AAEA,IAAA,IAAI,WAAW,EAAA,EAAI;AACjB,MAAA,IAAI,KAAK,QAAA,EAAU;AAEjB,QAAA,OAAO;AAAA,UACL,IAAA,EAAA,mBAAA;AAAA,UACA,KAAA,EAAO,EAAA;AAAA,UACP,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,GAAA,EAAK,WAAA;AAAA,UACL,QAAQ,IAAA,CAAK;AAAA,SACf;AAAA,MACF;AACA,MAAA,IAAA,CAAK,KAAA,CAAA,2BAAA,4BAA0C,EAAE,CAAA;AAAA,IACnD;AAEA,IAAA,MAAM,YAAY,IAAA,CAAK,GAAA;AACvB,IAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AAEZ,IAAA,MAAM,KAAA,GAAe;AAAA,MACnB,IAAA,EAAA,WAAA;AAAA,MACA,KAAA,EAAO,MAAA;AAAA,MACP,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,GAAA,EAAK,WAAA;AAAA,MACL,MAAA,EAAQ;AAAA,KACV;AAEA,IAAA,IAAA,CAAK,qBAAqB,EAAE,GAAG,KAAA,EAAO,MAAA,EAAQ,KAAK,GAAA,EAAI;AACvD,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,eAAe,SAAA,EAA0B;AAC/C,IAAA,MAAM,WAAW,IAAA,CAAK,GAAA;AACtB,IAAA,IAAA,CAAK,IAAI,SAAS,CAAA;AAElB,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,OAAO,IAAA,CAAK,WAAA,KAAgB,IAAA,IAAQ,IAAA,CAAK,gBAAgB,SAAA,EAAW;AAClE,MAAA,MAAA,IAAU,IAAA,CAAK,WAAA;AACf,MAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,IACf;AAEA,IAAA,IAAI,IAAA,CAAK,gBAAgB,IAAA,EAAM;AAC7B,MAAA,IAAI,KAAK,QAAA,EAAU;AAEjB,QAAA,OAAO;AAAA,UACL,IAAA,EAAA,gBAAA;AAAA,UACA,KAAA,EAAO,MAAA;AAAA,UACP,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,GAAA,EAAK,QAAA;AAAA,UACL,QAAQ,IAAA,CAAK;AAAA,SACf;AAAA,MACF;AACA,MAAA,IAAA,CAAK,KAAA,CAAA,2BAAA,4BAA0C,EAAE,SAAA,EAAW,CAAA;AAAA,IAC9D;AAEA,IAAA,IAAA,CAAK,IAAI,SAAS,CAAA;AAElB,IAAA,OAAO;AAAA,MACL,IAAA,EAAA,iBAAA;AAAA,MACA,KAAA,EAAO,MAAA;AAAA,MACP,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,GAAA,EAAK,QAAA;AAAA,MACL,QAAQ,IAAA,CAAK;AAAA,KACf;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,cAAA,GAAwB;AAC9B,IAAA,MAAM,WAAW,IAAA,CAAK,GAAA;AACtB,IAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AAEZ,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,OAAO,IAAA,CAAK,WAAA,KAAgB,IAAA,IAAQ,IAAA,CAAK,gBAAgB,GAAA,EAAK;AAC5D,MAAA,IAAI,IAAA,CAAK,gBAAgB,IAAA,EAAM;AAC7B,QAAA,MAAM,IAAA,GAAO,KAAK,IAAA,EAAK;AACvB,QAAA,IAAI,SAAS,GAAA,IAAO,IAAA,KAAS,OAAO,IAAA,KAAS,GAAA,IAAO,SAAS,IAAA,EAAM;AACjE,UAAA,MAAA,IAAU,IAAA;AACV,UAAA,MAAA,IAAU,IAAA;AACV,UAAA,IAAA,CAAK,OAAA,EAAQ;AACb,UAAA,IAAA,CAAK,OAAA,EAAQ;AACb,UAAA;AAAA,QACF;AAAA,MACF;AACA,MAAA,MAAA,IAAU,IAAA,CAAK,WAAA;AACf,MAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,IACf;AAEA,IAAA,IAAI,IAAA,CAAK,gBAAgB,IAAA,EAAM;AAC7B,MAAA,IAAI,KAAK,QAAA,EAAU;AACjB,QAAA,OAAO;AAAA,UACL,IAAA,EAAA,iBAAA;AAAA,UACA,KAAA,EAAO,MAAA;AAAA,UACP,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,GAAA,EAAK,QAAA;AAAA,UACL,QAAQ,IAAA,CAAK;AAAA,SACf;AAAA,MACF;AACA,MAAA,IAAA,CAAK,KAAA,CAAA,oCAAA,qCAAmD,EAAE,CAAA;AAAA,IAC5D;AAEA,IAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AAEZ,IAAA,OAAO;AAAA,MACL,IAAA,EAAA,iBAAA;AAAA,MACA,KAAA,EAAO,MAAA;AAAA,MACP,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,GAAA,EAAK,QAAA;AAAA,MACL,QAAQ,IAAA,CAAK;AAAA,KACf;AAAA,EACF;AAAA,EAEQ,QAAA,GAAkB;AACxB,IAAA,MAAM,WAAW,IAAA,CAAK,GAAA;AACtB,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,OAAOE,yBAAA,CAAQ,KAAK,WAAW,CAAA,IAAK,KAAK,OAAA,EAAQ,IAAK,IAAA,CAAK,WAAA,KAAgB,GAAA,EAAK;AAC9E,MAAA,MAAA,IAAU,IAAA,CAAK,WAAA;AACf,MAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,IACf;AAEA,IAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,IAAK,MAAA,CAAO,MAAA,KAAW,CAAA,IAAK,MAAA,CAAO,MAAA,KAAW,CAAA,IAAK,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG;AAC5F,MAAA,IAAI,KAAK,QAAA,EAAU;AAEjB,QAAA,OAAO;AAAA,UACL,IAAA,EAAA,WAAA;AAAA,UACA,KAAA,EAAO,MAAA;AAAA,UACP,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,GAAA,EAAK,QAAA;AAAA,UACL,QAAQ,IAAA,CAAK;AAAA,SACf;AAAA,MACF;AACA,MAAA,IAAA,CAAK,KAAA,CAAA,gCAAA,iCAA+C;AAAA,QAClD,KAAA,EAAO,MAAA;AAAA,QACP,cAAA,EAAgB;AAAA,OACjB,CAAA;AAAA,IACH;AACA,IAAA,OAAO;AAAA,MACL,IAAA,EAAA,WAAA;AAAA,MACA,KAAA,EAAO,MAAA;AAAA,MACP,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,GAAA,EAAK,QAAA;AAAA,MACL,QAAQ,IAAA,CAAK;AAAA,KACf;AAAA,EACF;AAAA,EAEQ,aAAa,KAAA,EAAqB;AACxC,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,IAAA,CAAK,eAAA,CAAgB,KAAK,KAAK,CAAA;AAAA,IACjC;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEO,SAAA,GAAmB;AACxB,IAAA,OAAO,IAAA,CAAK,gBAAgB,IAAA,EAAM;AAChC,MAAA,IAAA,CAAK,cAAA,EAAe;AACpB,MAAA,IAAI,IAAA,CAAK,gBAAgB,IAAA,EAAM;AAE/B,MAAA,IAAI,IAAA,CAAK,WAAU,EAAG;AACpB,QAAA,IAAA,CAAK,QAAA,EAAS;AACd,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,IAAA,CAAK,SAAQ,EAAG;AAClB,QAAA,OAAO,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,MAAA,EAAQ,CAAA;AAAA,MACxC;AAEA,MAAA,IAAI,IAAA,CAAK,WAAA,KAAgB,GAAA,IAAO,IAAA,CAAK,gBAAgB,GAAA,EAAK;AACxD,QAAA,OAAO,KAAK,YAAA,CAAa,IAAA,CAAK,cAAA,CAAe,IAAA,CAAK,WAAW,CAAC,CAAA;AAAA,MAChE;AAEA,MAAA,IAAI,IAAA,CAAK,gBAAgB,GAAA,EAAK;AAC5B,QAAA,OAAO,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,cAAA,EAAgB,CAAA;AAAA,MAChD;AAEA,MAAA,IAAI,IAAA,CAAK,sBAAA,CAAuB,IAAA,CAAK,WAAW,CAAA,EAAG;AACjD,QAAA,OAAO,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,aAAA,EAAe,CAAA;AAAA,MAC/C;AAEA,MAAA,IAAI,IAAA,CAAK,gBAAgB,GAAA,EAAK;AAC5B,QAAA,OAAO,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,SAAA,EAAW,CAAA;AAAA,MAC3C;AACA,MAAA,IAAI,IAAA,CAAK,gBAAgB,GAAA,EAAK;AAC5B,QAAA,MAAM,WAAW,IAAA,CAAK,GAAA;AACtB,QAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AACZ,QAAA,OAAO,KAAK,YAAA,CAAa;AAAA,UACvB,IAAA,EAAA,QAAA;AAAA,UACA,KAAA,EAAO,GAAA;AAAA,UACP,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,GAAA,EAAK,QAAA;AAAA,UACL,QAAQ,IAAA,CAAK;AAAA,SACd,CAAA;AAAA,MACH;AACA,MAAA,IAAI,IAAA,CAAK,gBAAgB,GAAA,EAAK;AAC5B,QAAA,MAAM,WAAW,IAAA,CAAK,GAAA;AACtB,QAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AACZ,QAAA,OAAO,KAAK,YAAA,CAAa;AAAA,UACvB,IAAA,EAAA,QAAA;AAAA,UACA,KAAA,EAAO,GAAA;AAAA,UACP,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,GAAA,EAAK,QAAA;AAAA,UACL,QAAQ,IAAA,CAAK;AAAA,SACd,CAAA;AAAA,MACH;AACA,MAAA,IAAI,KAAK,WAAA,KAAgB,GAAA,IAAO,IAAA,CAAK,IAAA,OAAW,GAAA,EAAK;AACnD,QAAA,MAAM,WAAW,IAAA,CAAK,GAAA;AACtB,QAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AACZ,QAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AACZ,QAAA,OAAO,KAAK,YAAA,CAAa;AAAA,UACvB,IAAA,EAAA,WAAA;AAAA,UACA,KAAA,EAAO,IAAA;AAAA,UACP,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,GAAA,EAAK,QAAA;AAAA,UACL,QAAQ,IAAA,CAAK;AAAA,SACd,CAAA;AAAA,MACH;AACA,MAAA,IAAI,IAAA,CAAK,gBAAgB,GAAA,EAAK;AAC5B,QAAA,MAAM,WAAW,IAAA,CAAK,GAAA;AACtB,QAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AACZ,QAAA,OAAO,KAAK,YAAA,CAAa;AAAA,UACvB,IAAA,EAAA,WAAA;AAAA,UACA,KAAA,EAAA,GAAA;AAAA,UACA,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,GAAA,EAAK,QAAA;AAAA,UACL,QAAQ,IAAA,CAAK;AAAA,SACd,CAAA;AAAA,MACH;AACA,MAAA,IAAI,IAAA,CAAK,gBAAgB,GAAA,EAAK;AAC5B,QAAA,MAAM,WAAW,IAAA,CAAK,GAAA;AACtB,QAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AACZ,QAAA,OAAO,KAAK,YAAA,CAAa;AAAA,UACvB,IAAA,EAAA,WAAA;AAAA,UACA,KAAA,EAAA,GAAA;AAAA,UACA,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,GAAA,EAAK,QAAA;AAAA,UACL,QAAQ,IAAA,CAAK;AAAA,SACd,CAAA;AAAA,MACH;AACA,MAAA,IAAI,IAAA,CAAK,gBAAgB,GAAA,EAAK;AAC5B,QAAA,MAAM,WAAW,IAAA,CAAK,GAAA;AACtB,QAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AACZ,QAAA,OAAO,KAAK,YAAA,CAAa;AAAA,UACvB,IAAA,EAAA,WAAA;AAAA,UACA,KAAA,EAAA,GAAA;AAAA,UACA,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,GAAA,EAAK,QAAA;AAAA,UACL,QAAQ,IAAA,CAAK;AAAA,SACd,CAAA;AAAA,MACH;AACA,MAAA,IAAI,IAAA,CAAK,gBAAgB,GAAA,EAAK;AAC5B,QAAA,MAAM,WAAW,IAAA,CAAK,GAAA;AACtB,QAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AACZ,QAAA,OAAO,KAAK,YAAA,CAAa;AAAA,UACvB,IAAA,EAAA,WAAA;AAAA,UACA,KAAA,EAAA,GAAA;AAAA,UACA,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,GAAA,EAAK,QAAA;AAAA,UACL,QAAQ,IAAA,CAAK;AAAA,SACd,CAAA;AAAA,MACH;AACA,MAAA,IAAI,IAAA,CAAK,gBAAgB,GAAA,EAAK;AAC5B,QAAA,MAAM,WAAW,IAAA,CAAK,GAAA;AACtB,QAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AACZ,QAAA,OAAO,KAAK,YAAA,CAAa;AAAA,UACvB,IAAA,EAAA,WAAA;AAAA,UACA,KAAA,EAAA,GAAA;AAAA,UACA,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,GAAA,EAAK,QAAA;AAAA,UACL,QAAQ,IAAA,CAAK;AAAA,SACd,CAAA;AAAA,MACH;AACA,MAAA,IAAI,IAAA,CAAK,gBAAgB,GAAA,EAAK;AAC5B,QAAA,MAAM,WAAW,IAAA,CAAK,GAAA;AACtB,QAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AACZ,QAAA,OAAO,KAAK,YAAA,CAAa;AAAA,UACvB,IAAA,EAAA,WAAA;AAAA,UACA,KAAA,EAAA,GAAA;AAAA,UACA,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,GAAA,EAAK,QAAA;AAAA,UACL,QAAQ,IAAA,CAAK;AAAA,SACd,CAAA;AAAA,MACH;AACA,MAAA,IAAI,IAAA,CAAK,gBAAgB,GAAA,EAAK;AAC5B,QAAA,MAAM,WAAW,IAAA,CAAK,GAAA;AACtB,QAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AACZ,QAAA,OAAO,KAAK,YAAA,CAAa;AAAA,UACvB,IAAA,EAAA,QAAA;AAAA,UACA,KAAA,EAAO,GAAA;AAAA,UACP,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,GAAA,EAAK,QAAA;AAAA,UACL,QAAQ,IAAA,CAAK;AAAA,SACd,CAAA;AAAA,MACH;AACA,MAAA,IAAI,IAAA,CAAK,gBAAgB,GAAA,EAAK;AAC5B,QAAA,MAAM,WAAW,IAAA,CAAK,GAAA;AACtB,QAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AACZ,QAAA,MAAM,KAAA,GAAe;AAAA,UACnB,IAAA,EAAA,QAAA;AAAA,UACA,KAAA,EAAO,GAAA;AAAA,UACP,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,GAAA,EAAK,QAAA;AAAA,UACL,QAAQ,IAAA,CAAK;AAAA,SACf;AAEA,QAAA,IAAA,CAAK,kBAAA,GAAqB,KAAA;AAC1B,QAAA,OAAO,IAAA,CAAK,aAAa,KAAK,CAAA;AAAA,MAChC;AACA,MAAA,IAAI,IAAA,CAAK,gBAAgB,GAAA,EAAK;AAC5B,QAAA,MAAM,WAAW,IAAA,CAAK,GAAA;AACtB,QAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AACZ,QAAA,OAAO,KAAK,YAAA,CAAa;AAAA,UACvB,IAAA,EAAA,OAAA;AAAA,UACA,KAAA,EAAO,GAAA;AAAA,UACP,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,GAAA,EAAK,QAAA;AAAA,UACL,QAAQ,IAAA,CAAK;AAAA,SACd,CAAA;AAAA,MACH;AACA,MAAA,IAAI,IAAA,CAAK,gBAAgB,GAAA,EAAK;AAC5B,QAAA,IAAI,IAAA,CAAK,MAAK,KAAM,IAAA,IAAQD,4BAAS,IAAA,CAAK,IAAA,EAAM,CAAA,EAAG;AACjD,UAAA,OAAO,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,MAAA,EAAQ,CAAA;AAAA,QACxC;AACA,QAAA,MAAM,WAAW,IAAA,CAAK,GAAA;AACtB,QAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AACZ,QAAA,OAAO,KAAK,YAAA,CAAa;AAAA,UACvB,IAAA,EAAA,KAAA;AAAA,UACA,KAAA,EAAO,GAAA;AAAA,UACP,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,GAAA,EAAK,QAAA;AAAA,UACL,QAAQ,IAAA,CAAK;AAAA,SACd,CAAA;AAAA,MACH;AACA,MAAA,IAAI,IAAA,CAAK,gBAAgB,GAAA,EAAK;AAC5B,QAAA,OAAO,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,QAAA,EAAU,CAAA;AAAA,MAC1C;AACA,MAAA,IAAI,IAAA,CAAK,gBAAgB,GAAA,EAAK;AAC5B,QAAA,MAAM,WAAW,IAAA,CAAK,GAAA;AACtB,QAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AACZ,QAAA,OAAO,KAAK,YAAA,CAAa;AAAA,UACvB,IAAA,EAAA,QAAA;AAAA,UACA,KAAA,EAAA,GAAA;AAAA,UACA,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,GAAA,EAAK,QAAA;AAAA,UACL,QAAQ,IAAA,CAAK;AAAA,SACd,CAAA;AAAA,MACH;AACA,MAAA,IAAI,IAAA,CAAK,gBAAgB,GAAA,EAAK;AAC5B,QAAA,MAAM,WAAW,IAAA,CAAK,GAAA;AACtB,QAAA,IAAI,IAAA,CAAK,IAAA,EAAK,KAAM,GAAA,EAAK;AACvB,UAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AACZ,UAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AACZ,UAAA,OAAO,KAAK,YAAA,CAAa;AAAA,YACvB,IAAA,EAAA,OAAA;AAAA,YACA,KAAA,EAAO,IAAA;AAAA,YACP,MAAM,IAAA,CAAK,IAAA;AAAA,YACX,GAAA,EAAK,QAAA;AAAA,YACL,QAAQ,IAAA,CAAK;AAAA,WACd,CAAA;AAAA,QACH;AACA,QAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AACZ,QAAA,OAAO,KAAK,YAAA,CAAa;AAAA,UACvB,IAAA,EAAA,QAAA;AAAA,UACA,KAAA,EAAO,GAAA;AAAA,UACP,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,GAAA,EAAK,QAAA;AAAA,UACL,QAAQ,IAAA,CAAK;AAAA,SACd,CAAA;AAAA,MACH;AACA,MAAA,IAAI,IAAA,CAAK,gBAAgB,GAAA,EAAK;AAC5B,QAAA,MAAM,WAAW,IAAA,CAAK,GAAA;AACtB,QAAA,IAAI,IAAA,CAAK,IAAA,EAAK,KAAM,GAAA,EAAK;AACvB,UAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AACZ,UAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AACZ,UAAA,OAAO,KAAK,YAAA,CAAa;AAAA,YACvB,IAAA,EAAA,UAAA;AAAA,YACA,KAAA,EAAO,IAAA;AAAA,YACP,MAAM,IAAA,CAAK,IAAA;AAAA,YACX,GAAA,EAAK,QAAA;AAAA,YACL,QAAQ,IAAA,CAAK;AAAA,WACd,CAAA;AAAA,QACH;AACA,QAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AACZ,QAAA,OAAO,KAAK,YAAA,CAAa;AAAA,UACvB,IAAA,EAAA,IAAA;AAAA,UACA,KAAA,EAAO,GAAA;AAAA,UACP,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,GAAA,EAAK,QAAA;AAAA,UACL,QAAQ,IAAA,CAAK;AAAA,SACd,CAAA;AAAA,MACH;AACA,MAAA,IAAI,IAAA,CAAK,gBAAgB,GAAA,EAAK;AAC5B,QAAA,MAAM,WAAW,IAAA,CAAK,GAAA;AACtB,QAAA,IAAI,IAAA,CAAK,IAAA,EAAK,KAAM,GAAA,EAAK;AACvB,UAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AACZ,UAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AACZ,UAAA,OAAO,KAAK,YAAA,CAAa;AAAA,YACvB,IAAA,EAAA,UAAA;AAAA,YACA,KAAA,EAAO,IAAA;AAAA,YACP,MAAM,IAAA,CAAK,IAAA;AAAA,YACX,GAAA,EAAK,QAAA;AAAA,YACL,QAAQ,IAAA,CAAK;AAAA,WACd,CAAA;AAAA,QACH;AACA,QAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AACZ,QAAA,OAAO,KAAK,YAAA,CAAa;AAAA,UACvB,IAAA,EAAA,IAAA;AAAA,UACA,KAAA,EAAO,GAAA;AAAA,UACP,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,GAAA,EAAK,QAAA;AAAA,UACL,QAAQ,IAAA,CAAK;AAAA,SACd,CAAA;AAAA,MACH;AACA,MAAA,IAAI,IAAA,CAAK,gBAAgB,GAAA,EAAK;AAC5B,QAAA,MAAM,WAAW,IAAA,CAAK,GAAA;AACtB,QAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AACZ,QAAA,OAAO,KAAK,YAAA,CAAa;AAAA,UACvB,IAAA,EAAA,WAAA;AAAA,UACA,KAAA,EAAO,GAAA;AAAA,UACP,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,GAAA,EAAK,QAAA;AAAA,UACL,QAAQ,IAAA,CAAK;AAAA,SACd,CAAA;AAAA,MACH;AACA,MAAA,IAAI,KAAK,WAAA,KAAgB,GAAA,IAAO,IAAA,CAAK,IAAA,OAAW,GAAA,EAAK;AACnD,QAAA,MAAM,WAAW,IAAA,CAAK,GAAA;AACtB,QAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AACZ,QAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AACZ,QAAA,OAAO,KAAK,YAAA,CAAa;AAAA,UACvB,IAAA,EAAA,WAAA;AAAA,UACA,KAAA,EAAA,IAAA;AAAA,UACA,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,GAAA,EAAK,QAAA;AAAA,UACL,QAAQ,IAAA,CAAK;AAAA,SACd,CAAA;AAAA,MACH;AACA,MAAA,IAAI,KAAK,WAAA,KAAgB,GAAA,IAAO,IAAA,CAAK,IAAA,OAAW,GAAA,EAAK;AACnD,QAAA,MAAM,WAAW,IAAA,CAAK,GAAA;AACtB,QAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AACZ,QAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AACZ,QAAA,OAAO,KAAK,YAAA,CAAa;AAAA,UACvB,IAAA,EAAA,UAAA;AAAA,UACA,KAAA,EAAA,IAAA;AAAA,UACA,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,GAAA,EAAK,QAAA;AAAA,UACL,QAAQ,IAAA,CAAK;AAAA,SACd,CAAA;AAAA,MACH;AACA,MAAA,IAAI,IAAA,CAAK,gBAAgB,GAAA,EAAK;AAC5B,QAAA,MAAM,WAAW,IAAA,CAAK,GAAA;AACtB,QAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AACZ,QAAA,OAAO,KAAK,YAAA,CAAa;AAAA,UACvB,IAAA,EAAA,OAAA;AAAA,UACA,KAAA,EAAO,GAAA;AAAA,UACP,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,GAAA,EAAK,QAAA;AAAA,UACL,QAAQ,IAAA,CAAK;AAAA,SACd,CAAA;AAAA,MACH;AAGA,MAAA,IAAI,KAAK,QAAA,EAAU;AAEjB,QAAA,IAAA,CAAK,OAAA,EAAQ;AAEb,QAAA;AAAA,MACF;AACA,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,WAAA,KAAgB,IAAA,GAAO,iBAAiB,IAAA,CAAK,WAAA;AAC/D,MAAA,IAAA,CAAK,KAAA,CAAA,yBAAA,0BAAwC;AAAA,QAC3C,IAAA;AAAA,QACA,UAAU,IAAA,CAAK;AAAA,OAChB,CAAA;AAAA,IACH;AACA,IAAA,MAAM,QAAA,GAAkB;AAAA,MACtB,IAAA,EAAA,KAAA;AAAA,MACA,KAAA,EAAO,IAAA;AAAA,MACP,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK;AAAA,KACf;AACA,IAAA,OAAO,IAAA,CAAK,aAAa,QAAQ,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,YAAA,GAAwB;AAC7B,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,eAAe,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,WAAA,GAAuB;AAC5B,IAAA,MAAM,SAAkB,EAAC;AACzB,IAAA,IAAI,KAAA,GAAQ,KAAK,SAAA,EAAU;AAC3B,IAAA,OAAO,MAAM,IAAA,KAAA,KAAA,YAAwB;AACnC,MAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AACjB,MAAA,KAAA,GAAQ,KAAK,SAAA,EAAU;AAAA,IACzB;AACA,IAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AACjB,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,SAAA,GAA0B;AAExB,IAAA,MAAM,WAAW,IAAA,CAAK,GAAA;AACtB,IAAA,MAAM,YAAY,IAAA,CAAK,WAAA;AACvB,IAAA,MAAM,YAAY,IAAA,CAAK,IAAA;AACvB,IAAA,MAAM,cAAc,IAAA,CAAK,MAAA;AACzB,IAAA,MAAM,oBAAA,GAAuB,KAAK,eAAA,CAAgB,MAAA;AAElD,IAAA,MAAM,SAAA,GAAY,KAAK,SAAA,EAAU;AAGjC,IAAA,IAAA,CAAK,GAAA,GAAM,QAAA;AACX,IAAA,IAAA,CAAK,WAAA,GAAc,SAAA;AACnB,IAAA,IAAA,CAAK,IAAA,GAAO,SAAA;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,WAAA;AACd,IAAA,IAAA,CAAK,gBAAgB,MAAA,GAAS,oBAAA;AAE9B,IAAA,OAAO,SAAA,CAAU,2BAAyB,IAAA,GAAO,SAAA;AAAA,EACnD;AAAA,EAEA,WAAW,CAAA,EAA2B;AAEpC,IAAA,MAAM,WAAW,IAAA,CAAK,GAAA;AACtB,IAAA,MAAM,YAAY,IAAA,CAAK,WAAA;AACvB,IAAA,MAAM,YAAY,IAAA,CAAK,IAAA;AACvB,IAAA,MAAM,cAAc,IAAA,CAAK,MAAA;AACzB,IAAA,MAAM,oBAAA,GAAuB,KAAK,eAAA,CAAgB,MAAA;AAElD,IAAA,MAAM,SAAkB,EAAC;AACzB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,MAAA,MAAM,KAAA,GAAQ,KAAK,SAAA,EAAU;AAC7B,MAAA,IAAI,MAAM,IAAA,KAAA,KAAA,YAAwB;AAChC,QAAA;AAAA,MACF;AACA,MAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,IACnB;AAGA,IAAA,IAAA,CAAK,GAAA,GAAM,QAAA;AACX,IAAA,IAAA,CAAK,WAAA,GAAc,SAAA;AACnB,IAAA,IAAA,CAAK,IAAA,GAAO,SAAA;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,WAAA;AACd,IAAA,IAAA,CAAK,gBAAgB,MAAA,GAAS,oBAAA;AAE9B,IAAA,OAAO,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,MAAA,GAAS,IAAA;AAAA,EACtC;AAAA,EAEO,KAAA,GAAiB;AAEtB,IAAA,IAAI,UAAU,IAAA,CAAK,GAAA;AACnB,IAAA,IAAI,WAAW,IAAA,CAAK,WAAA;AAGpB,IAAA,OAAO,QAAA,KAAa,IAAA,IAAQ,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAA,EAAG;AAC/C,MAAA,OAAA,EAAA;AACA,MAAA,QAAA,GAAW,UAAU,IAAA,CAAK,IAAA,CAAK,SAAS,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA,GAAI,IAAA;AAAA,IAC/D;AAEA,IAAA,OAAO,QAAA,KAAa,IAAA;AAAA,EACtB;AAAA,EAEO,aAAA,GAA6E;AAClF,IAAA,OAAO;AAAA,MACL,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,QAAQ,IAAA,CAAK;AAAA,KACf;AAAA,EACF;AACF,CAAA;AAzyBmBN,wBAAA,CAAA,MAAA,EAAA,OAAA,CAAA;AAAZ,IAAM,KAAA,GAAN;;;ACpBA,IAAK,UAAA,qBAAAS,WAAAA,KAAL;AACL,EAAAA,YAAA,UAAA,CAAA,GAAW,UAAA;AACX,EAAAA,YAAA,YAAA,CAAA,GAAa,YAAA;AAFH,EAAA,OAAAA,WAAAA;AAAA,CAAA,EAAA,UAAA,IAAA,EAAA;AAQL,IAAK,cAAA,qBAAAC,eAAAA,KAAL;AAEL,EAAAA,gBAAA,oBAAA,CAAA,GAAqB,oBAAA;AAErB,EAAAA,gBAAA,iBAAA,CAAA,GAAkB,iBAAA;AAElB,EAAAA,gBAAA,gBAAA,CAAA,GAAiB,gBAAA;AAEjB,EAAAA,gBAAA,mBAAA,CAAA,GAAoB,mBAAA;AAEpB,EAAAA,gBAAA,iBAAA,CAAA,GAAkB,iBAAA;AAElB,EAAAA,gBAAA,cAAA,CAAA,GAAe,cAAA;AAZL,EAAA,OAAAA,eAAAA;AAAA,CAAA,EAAA,cAAA,IAAA,EAAA;;;ACuCL,IAAM,OAAA,GAAN,MAAM,OAAA,CAAO;AAAA,EAOlB,WAAA,CAAY,OAAc,OAAA,EAAyB;AAJnD,IAAA,IAAA,CAAO,kBAAA,uBAAsC,GAAA,EAAI;AAEjD,IAAA,IAAA,CAAQ,iBAAmC,EAAC;AAG1C,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,SAAA,EAAU;AACzC,IAAA,IAAA,CAAK,QAAA,GAAW,SAAS,QAAA,IAAY,KAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,wBAAA,CAAyB,MAAe,OAAA,EAAyC;AACvF,IAAA,IAAI,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,YAAA,CAAa,IAAA,KAAA,KAAA,YAAwB;AAC7D,MAAA,IAAA,CAAK,eAAe,IAAA,CAAK;AAAA,QACvB,IAAA,EAAA,iBAAA;AAAA,QACA,UAAU,OAAA,CAAQ,GAAA;AAAA,QAClB,QAAQ,OAAA,CAAQ;AAAA,OACjB,CAAA;AACD,MAAA,OAAO,IAAI,gBAAA,CAAiB,IAAA,EAAM,OAAO,CAAA;AAAA,IAC3C;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKO,aAAA,GAAyB;AAC9B,IAAA,OAAO,IAAA,CAAK,eAAe,MAAA,GAAS,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKO,aAAA,GAAkC;AACvC,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,cAAc,CAAA;AAAA,EAChC;AAAA,EAEQ,WAAA,CAAY,OAAA,EAAiB,KAAA,GAAe,IAAA,CAAK,YAAA,EAAsB;AAC7E,IAAA,MAAM;AAAA,MACJ,IAAA,EAAM,UAAA;AAAA,MACN,IAAA,EAAM,WAAA;AAAA,MACN,MAAA,EAAQ;AAAA,KACV,GAAI,IAAA,CAAK,KAAA,CAAM,aAAA,EAAc;AAC7B,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,KAAA,CAAM,IAAI,CAAA;AACnC,IAAA,MAAM,YAAY,KAAA,CAAM,IAAA;AACxB,IAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,SAAA,GAAY,CAAC,CAAA,IAAK,EAAA;AAG9C,IAAA,IAAI,MAAA,GAAS,CAAA;AAEb,IAAA,IAAI,gBAAgB,SAAA,EAAW;AAE7B,MAAA,MAAA,GAAS,aAAA;AAAA,IACX,CAAA,MAAO;AAEL,MAAA,MAAM,UAAA,GAAa,MAAA,CAAO,KAAA,CAAM,KAAA,IAAS,EAAE,CAAA;AAC3C,MAAA,MAAM,UAAA,GAAa,aAAA,CAAc,OAAA,CAAQ,UAAU,CAAA;AACnD,MAAA,IAAI,cAAc,CAAA,EAAG;AACnB,QAAA,MAAA,GAAS,UAAA,GAAa,CAAA;AAAA,MACxB;AAAA,IACF;AAGA,IAAA,MAAM,YAAA,GAAe,CAAA;AACrB,IAAA,MAAM,YAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,SAAA,GAAY,IAAI,YAAY,CAAA;AAC1D,IAAA,MAAM,OAAA,GAAU,KAAK,GAAA,CAAI,KAAA,CAAM,SAAS,CAAA,EAAG,SAAA,GAAY,IAAI,YAAY,CAAA;AAEvE,IAAA,IAAI,WAAA,GAAc,EAAA;AAClB,IAAA,KAAA,IAAS,CAAA,GAAI,SAAA,EAAW,CAAA,IAAK,OAAA,EAAS,CAAA,EAAA,EAAK;AACzC,MAAA,MAAM,UAAU,CAAA,GAAI,CAAA;AACpB,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,CAAC,CAAA,IAAK,EAAA;AAC7B,MAAA,MAAM,cAAc,OAAA,KAAY,SAAA;AAGhC,MAAA,MAAM,UAAA,GAAa,GAAG,OAAA,CAAQ,QAAA,GAAW,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,GAAA,CAAA;AACzD,MAAA,WAAA,IAAe,CAAA,EAAG,aAAa,QAAQ;AAAA,CAAA;AAGvC,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,MAAM,OAAA,GAAU,CAAA,EAAG,GAAA,CAAI,MAAA,CAAO,UAAA,CAAW,MAAA,GAAS,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,MAAA,GAAS,CAAC,CAAC,CAAC,CAAA,CAAA,CAAA;AAC9E,QAAA,WAAA,IAAe,GAAG,OAAO;AAAA,CAAA;AAAA,MAC3B;AAAA,IACF;AAEA,IAAA,OAAO,GAAG,OAAO;;AAAA,EAAO,WAAW,CAAA,CAAA;AAAA,EACrC;AAAA,EAEQ,WAAW,CAAA,EAA2B;AAC5C,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,UAAA,CAAW,CAAC,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,iBAAA,CAAkB,KAAA,GAAe,IAAA,CAAK,YAAA,EAAuB;AACnE,IAAA,OAAO,KAAA,CAAM,kCAA6B,KAAA,CAAM,IAAA,KAAA,QAAA;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,aAAA,GAAuB;AAC7B,IAAA,IAAI,IAAA,CAAK,mBAAkB,EAAG;AAC5B,MAAA,MAAM,QAAQ,IAAA,CAAK,YAAA;AACnB,MAAA,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,YAAA,CAAa,IAAI,CAAA;AAC/B,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,IAAA,CAAK,KAAA,CAAA,yBAAA,yBAAwC,EAAE,KAAA,EAAO,MAAA,CAAO,KAAK,YAAA,CAAa,KAAK,GAAG,CAAA;AAAA,EACzF;AAAA,EAEQ,KAAA,CAAM,MAAuB,IAAA,EAAuC;AAC1E,IAAA,MAAM,UAAU,IAAA,EAAM,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,GAAI,MAAA;AACvD,IAAA,MAAM,mBAAmB,IAAA,CAAK,WAAA;AAAA,MAC5B,OAAA,KAAY,wDAA0C,gBAAA,GAAmB,IAAA;AAAA,KAC3E;AACA,IAAA,MAAM,IAAIC,8BAAY,IAAA,EAAM;AAAA,MAC1B,OAAO,IAAA,CAAK,YAAA;AAAA,MACZ,IAAA,EAAM,EAAE,GAAG,IAAA,EAAM,SAAS,gBAAA;AAAiB,KAC5C,CAAA;AAAA,EACH;AAAA,EAEQ,IAAI,SAAA,EAA6B;AACvC,IAAA,MAAM,QAAQ,IAAA,CAAK,YAAA;AACnB,IAAA,IAAI,IAAA,CAAK,YAAA,CAAa,IAAA,KAAS,SAAA,EAAW;AACxC,MAAA,IAAA,CAAK,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,SAAA,EAAU;AAAA,IAC3C,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,KAAA,CAAA,4BAAA,4BAA2C;AAAA,QAC9C,QAAA,EAAU,SAAA;AAAA,QACV,GAAA,EAAK,KAAK,YAAA,CAAa;AAAA,OACxB,CAAA;AAAA,IACH;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,eAAA,GAAgC;AACtC,IAAA,MAAM,aAAA,GAAgB,KAAK,aAAA,EAAc;AACzC,IAAA,MAAM,QAAA,GAAW,IAAI,cAAA,CAAe,aAAa,CAAA;AAEjD,IAAA,MAAM,WAA6B,EAAC;AACpC,IAAA,OAAO,IAAA,CAAK,aAAa,IAAA,KAAA,KAAA,YAAwB;AAC/C,MAAA,IAAA,CAAK,GAAA,CAAA,KAAA,WAAiB;AACtB,MAAA,MAAM,YAAA,GAAe,KAAK,aAAA,EAAc;AACxC,MAAA,QAAA,CAAS,IAAA,CAAK,IAAI,cAAA,CAAe,YAAY,CAAC,CAAA;AAAA,IAChD;AACA,IAAA,OAAO,IAAI,YAAA,CAAa,QAAA,EAAU,QAAA,EAAU,aAAa,CAAA;AAAA,EAC3D;AAAA,EAEQ,cAAA,GAA8C;AACpD,IAAA,MAAM,aAAwB,EAAC;AAC/B,IAAA,MAAM,QAAQ,IAAA,CAAK,YAAA;AAEnB,IAAA,OACE,IAAA,CAAK,YAAA,CAAa,IAAA,KAAA,KAAA,cAClB,IAAA,CAAK,aAAa,IAAA,KAAA,QAAA,eAClB;AACA,MAAA,UAAA,CAAW,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,CAAA;AAChC,MAAA,IAAI,IAAA,CAAK,aAAa,IAAA,KAAA,WAAA,kBAA8B;AAClD,QAAA,IAAA,CAAK,GAAA,CAAA,WAAA,iBAAuB;AAAA,MAC9B,CAAA,MAAO;AACL,QAAA,IACG,IAAA,CAAK,YAAA,CAAa,IAAA,KAAA,KAAA,cAClB,IAAA,CAAK,aAAa,IAAA,KAAA,QAAA,eACnB;AACA,UAAA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,MAAA,OAAO,WAAW,CAAC,CAAA;AAAA,IACrB;AAEA,IAAA,OAAO,IAAI,iBAAA,CAAkB,UAAA,EAAY,KAAK,CAAA;AAAA,EAChD;AAAA,EAEQ,SAAA,GAAqB;AAC3B,IAAA,IAAI,IAAA,CAAK,aAAa,IAAA,KAAA,kBAAA,yBAAqC;AACzD,MAAA,QAAQ,IAAA,CAAK,aAAa,KAAA;AAAO,QAC/B,KAAA,QAAA;AACE,UAAA,OAAO,KAAK,eAAA,EAAgB;AAAA,QAC9B,KAAA,OAAA;AACE,UAAA,OAAO,KAAK,cAAA,EAAe;AAAA,QAC7B,KAAA,KAAA;AACE,UAAA,OAAO,KAAK,YAAA,EAAa;AAAA,QAC3B,KAAA,IAAA;AACE,UAAA,OAAO,KAAK,WAAA,EAAY;AAAA,QAC1B,KAAA,UAAA;AACE,UAAA,OAAO,KAAK,cAAA,EAAe;AAAA;AAC/B,IACF,CAAA,MAAA,IAAW,IAAA,CAAK,iBAAA,EAAkB,EAAG;AAEnC,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,UAAA,CAAW,CAAC,CAAA;AACpC,MAAA,IAAI,eAAe,IAAA,EAAM;AACvB,QAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,WAAW,MAAA,GAAS,CAAA,EAAG,KAAK,CAAA,EAAG;AACjD,UAAA,IAAI,UAAA,CAAW,CAAC,CAAA,CAAE,IAAA,KAAA,KAAA,cAA0B,IAAA,CAAK,kBAAkB,UAAA,CAAW,CAAA,GAAI,CAAC,CAAC,CAAA,EAAG;AACrF,YAAA,IAAI,CAAA,GAAI,IAAI,UAAA,CAAW,MAAA,IAAU,WAAW,CAAA,GAAI,CAAC,EAAE,IAAA,KAAA,QAAA,eAA2B;AAC5E,cAAA,MAAM,OAAO,IAAA,CAAK,YAAA;AAClB,cAAA,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,YAAA,CAAa,IAAI,CAAA;AAC/B,cAAA,OAAO,IAAA,CAAK,iBAAiB,IAAI,CAAA;AAAA,YACnC;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAGA,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,SAAA,EAAU;AACvC,MAAA,IAAI,SAAA,IAAa,UAAU,IAAA,KAAA,QAAA,eAA2B;AACpD,QAAA,OAAO,KAAK,gBAAA,EAAiB;AAAA,MAC/B;AAAA,IACF;AAEA,IAAA,OAAO,KAAK,QAAA,EAAS;AAAA,EACvB;AAAA,EAEQ,cAAA,GAA6B;AACnC,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAA,kBAAA,wBAA8B;AAEjD,IAAA,MAAM,YAAA,GAAe,KAAK,aAAA,EAAc;AACxC,IAAA,MAAM,OAAA,GAAU,IAAI,cAAA,CAAe,YAAY,CAAA;AAC/C,IAAA,IAAA,CAAK,GAAA,CAAA,OAAA,aAAmB;AAExB,IAAA,MAAM,QAAA,GAAW,KAAK,eAAA,EAAgB;AAEtC,IAAA,IAAI,IAAA,CAAK,aAAa,IAAA,KAAA,QAAA,eAA2B;AAC/C,MAAA,IAAA,CAAK,GAAA,CAAA,QAAA,cAAoB;AACzB,MAAA,MAAM,cAAA,GAAiB,KAAK,QAAA,EAAS;AACrC,MAAA,OAAO,IAAI,UAAA,CAAW,OAAA,EAAS,QAAA,EAAU,gBAAgB,KAAK,CAAA;AAAA,IAChE;AAEA,IAAA,OAAO,IAAI,UAAA,CAAW,OAAA,EAAS,QAAA,EAAU,MAAM,KAAK,CAAA;AAAA,EACtD;AAAA,EAEQ,iBAAiB,SAAA,EAAiC;AACxD,IAAA,MAAM,YAAA,GAAe,SAAA,IAAa,IAAA,CAAK,aAAA,EAAc;AACrD,IAAA,IAAI,IAAA,GAA0C,IAAI,cAAA,CAAe,YAAY,CAAA;AAE7E,IAAA,IAAI,IAAA,CAAK,aAAa,IAAA,KAAA,KAAA,YAAwB;AAC5C,MAAA,MAAM,KAAA,GAA0B,CAAC,IAAI,cAAA,CAAe,YAAY,CAAC,CAAA;AACjE,MAAA,OAAO,IAAA,CAAK,aAAa,IAAA,KAAA,KAAA,YAAwB;AAC/C,QAAA,IAAA,CAAK,GAAA,CAAA,KAAA,WAAiB;AACtB,QAAA,MAAM,aAAA,GAAgB,KAAK,aAAA,EAAc;AACzC,QAAA,KAAA,CAAM,IAAA,CAAK,IAAI,cAAA,CAAe,aAAa,CAAC,CAAA;AAAA,MAC9C;AACA,MAAA,IAAA,GAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAA,CAAK,GAAA,CAAA,QAAA,cAAoB;AAEzB,IAAA,MAAM,cAAA,GAAiB,KAAK,QAAA,EAAS;AAErC,IAAA,OAAO,IAAI,YAAA,CAAa,IAAA,EAAM,cAAA,EAAgB,YAAY,CAAA;AAAA,EAC5D;AAAA,EAEQ,SAAA,GAAqB;AAC3B,IAAA,MAAM,QAAQ,IAAA,CAAK,YAAA;AAGnB,IAAA,IAAI,MAAM,IAAA,KAAA,mBAAA,0BAAsC;AAC9C,MAAA,IAAA,CAAK,GAAA,CAAA,mBAAA,yBAA+B;AACpC,MAAA,IAAA,CAAK,eAAe,IAAA,CAAK;AAAA,QACvB,IAAA,EAAA,oBAAA;AAAA,QACA,UAAU,KAAA,CAAM,GAAA;AAAA,QAChB,QAAQ,KAAA,CAAM,MAAA;AAAA,QACd,cAAc,KAAA,CAAM;AAAA,OACrB,CAAA;AACD,MAAA,OAAO,IAAI,oBAAA,CAAqB,KAAA,CAAM,KAAA,EAAO,KAAK,CAAA;AAAA,IACpD;AAEA,IAAA,MAAM,IAAA,GAAO,IAAI,aAAA,CAAc,KAAK,CAAA;AACpC,IAAA,IAAA,CAAK,GAAA,CAAA,WAAA,iBAAuB;AAC5B,IAAA,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,IAAA,CAAK,KAAK,CAAA;AAEtC,IAAA,IAAI,IAAA,CAAK,aAAa,IAAA,KAAA,QAAA,eAA2B;AAC/C,MAAA,OAAO,IAAA,CAAK,OAAO,IAAI,CAAA;AAAA,IACzB;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGQ,IAAA,GAAgB;AACtB,IAAA,IAAI,IAAA,GAAO,KAAK,SAAA,EAAU;AAC1B,IAAA,OACE,IAAA,CAAK,YAAA,CAAa,IAAA,KAAA,WAAA,oBAClB,IAAA,CAAK,aAAa,IAAA,KAAA,UAAA,iBAClB;AACA,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,aAAa,IAAI,CAAA;AAC7C,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,wBAAA,CAAyB,IAAA,EAAM,KAAK,CAAA;AACzD,MAAA,IAAI,SAAS,OAAO,OAAA;AACpB,MAAA,IAAA,GAAO,IAAI,SAAA,CAAU,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,WAAW,CAAA;AAAA,IACpD;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,aAAA,GAAyB;AAC/B,IAAA,IAAI,IAAA,CAAK,aAAa,IAAA,KAAA,QAAA,eAA2B;AAC/C,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,SAAA,EAAU;AACvC,MAAA,IAAI,SAAA,IAAa,UAAU,IAAA,KAAA,QAAA,eAA2B;AACpD,QAAA,MAAM,IAAIA,6BAAA,CAAA,kCAAA,kCAAuD;AAAA,UAC/D,OAAO,IAAA,CAAK;AAAA,SACb,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,OAAO,KAAK,IAAA,EAAK;AAAA,EACnB;AAAA,EAEQ,eAAA,GAA8B;AACpC,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAA,kBAAA,wBAA8B;AACjD,IAAA,MAAM,IAAA,GAAO,KAAK,QAAA,EAAS;AAC3B,IAAA,OAAO,IAAI,UAAA,CAAW,IAAA,EAAM,KAAK,CAAA;AAAA,EACnC;AAAA,EAEQ,cAAA,GAA4B;AAClC,IAAA,MAAM,UAAA,GAAa,KAAK,GAAA,CAAA,kBAAA,wBAA8B;AACtD,IAAA,IAAA,CAAK,GAAA,CAAA,QAAA,cAAoB;AACzB,IAAA,MAAM,SAAA,GAAY,KAAK,aAAA,EAAc;AACrC,IAAA,IAAA,CAAK,GAAA,CAAA,QAAA,cAAoB;AACzB,IAAA,MAAM,IAAA,GAAO,KAAK,KAAA,EAAM;AACxB,IAAA,OAAO,IAAI,SAAA,CAAU,SAAA,EAAW,IAAA,CAAK,YAAiC,UAAU,CAAA;AAAA,EAClF;AAAA,EAEQ,YAAA,GAA4B;AAClC,IAAA,MAAM,QAAA,GAAW,KAAK,GAAA,CAAA,kBAAA,wBAA8B;AAGpD,IAAA,IAAI,CAAC,IAAA,CAAK,iBAAA,EAAkB,EAAG;AAC7B,MAAA,MAAM,IAAIA,6BAAA,CAAA,4BAAA,4BAAiD;AAAA,QACzD,OAAO,IAAA,CAAK,YAAA;AAAA,QACZ,MAAM,EAAE,YAAA,EAAc,cAAc,UAAA,EAAY,IAAA,CAAK,aAAa,IAAA;AAAK,OACxE,CAAA;AAAA,IACH;AACA,IAAA,MAAM,QAAA,GAAW,KAAK,YAAA,CAAa,KAAA;AACnC,IAAA,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,YAAA,CAAa,IAAI,CAAA;AAG/B,IAAA,IAAI,QAAA,GAA0B,IAAA;AAC9B,IAAA,IAAI,IAAA,CAAK,aAAa,IAAA,KAAA,OAAA,cAA0B;AAC9C,MAAA,IAAA,CAAK,GAAA,CAAA,OAAA,aAAmB;AACxB,MAAA,IAAI,CAAC,IAAA,CAAK,iBAAA,EAAkB,EAAG;AAC7B,QAAA,MAAM,IAAIA,6BAAA,CAAA,4BAAA,4BAAiD;AAAA,UACzD,OAAO,IAAA,CAAK,YAAA;AAAA,UACZ,MAAM,EAAE,YAAA,EAAc,cAAc,UAAA,EAAY,IAAA,CAAK,aAAa,IAAA;AAAK,SACxE,CAAA;AAAA,MACH;AACA,MAAA,QAAA,GAAW,KAAK,YAAA,CAAa,KAAA;AAC7B,MAAA,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,YAAA,CAAa,IAAI,CAAA;AAAA,IACjC;AAGA,IAAA,IAAI,CAAC,IAAA,CAAK,iBAAA,MAAuB,IAAA,CAAK,YAAA,CAAa,UAAU,IAAA,EAAM;AACjE,MAAA,MAAM,IAAIA,6BAAA,CAAA,4BAAA,4BAAiD;AAAA,QACzD,OAAO,IAAA,CAAK,YAAA;AAAA,QACZ,MAAM,EAAE,YAAA,EAAc,QAAQ,UAAA,EAAY,IAAA,CAAK,aAAa,KAAA;AAAM,OACnE,CAAA;AAAA,IACH;AACA,IAAA,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,YAAA,CAAa,IAAI,CAAA;AAG/B,IAAA,MAAM,UAAA,GAAa,KAAK,IAAA,EAAK;AAG7B,IAAA,MAAM,IAAA,GAAO,KAAK,KAAA,EAAM;AAGxB,IAAA,IAAI,IAAA,CAAK,aAAa,IAAA,KAAA,WAAA,kBAA8B;AAClD,MAAA,IAAA,CAAK,GAAA,CAAA,WAAA,iBAAuB;AAAA,IAC9B;AAEA,IAAA,OAAO,IAAI,WAAA;AAAA,MACT,QAAA;AAAA,MACA,QAAA;AAAA,MACA,UAAA;AAAA,MACA,IAAA,CAAK,UAAA;AAAA,MACL;AAAA,KACF;AAAA,EACF;AAAA,EAEQ,WAAA,GAAsB;AAC5B,IAAA,MAAM,OAAA,GAAU,KAAK,GAAA,CAAA,kBAAA,wBAA8B;AACnD,IAAA,IAAA,CAAK,GAAA,CAAA,QAAA,cAAoB;AACzB,IAAA,MAAM,SAAA,GAAY,KAAK,aAAA,EAAc;AACrC,IAAA,IAAA,CAAK,GAAA,CAAA,QAAA,cAAoB;AACzB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,EAAM,CAAE,UAAA;AAE5B,IAAA,MAAM,aAAa,CAAC,IAAI,gBAAgB,SAAA,EAAW,MAAA,EAAQ,OAAO,CAAC,CAAA;AAGnE,IAAA,OACE,IAAA,CAAK,YAAA,CAAa,IAAA,KAAA,kBAAA,2BAClB,IAAA,CAAK,aAAa,KAAA,KAAA,MAAA,aAClB;AACA,MAAA,IAAA,CAAK,GAAA,CAAA,kBAAA,wBAA8B;AACnC,MAAA,IAAA,CAAK,GAAA,CAAA,QAAA,cAAoB;AACzB,MAAA,MAAM,aAAA,GAAgB,KAAK,aAAA,EAAc;AACzC,MAAA,IAAA,CAAK,GAAA,CAAA,QAAA,cAAoB;AACzB,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,EAAM,CAAE,UAAA;AAC9B,MAAA,UAAA,CAAW,KAAK,IAAI,eAAA,CAAgB,aAAA,EAAe,QAAA,EAAU,OAAO,CAAC,CAAA;AAAA,IACvE;AAGA,IAAA,IAAI,QAAA,GAAqC,IAAA;AACzC,IAAA,IACE,IAAA,CAAK,YAAA,CAAa,IAAA,KAAA,kBAAA,2BAClB,IAAA,CAAK,aAAa,KAAA,KAAA,MAAA,aAClB;AACA,MAAA,IAAA,CAAK,GAAA,CAAA,kBAAA,wBAA8B;AACnC,MAAA,QAAA,GAAW,IAAA,CAAK,OAAM,CAAE,UAAA;AAAA,IAC1B;AAEA,IAAA,OAAO,IAAI,MAAA,CAAO,UAAA,EAAY,QAAA,EAAU,OAAO,CAAA;AAAA,EACjD;AAAA,EAEQ,KAAA,GAAmB;AACzB,IAAA,IAAA,CAAK,GAAA,CAAA,QAAA,cAAoB;AACzB,IAAA,MAAM,UAAA,GAAa,KAAK,cAAA,EAAe;AACvC,IAAA,IAAA,CAAK,GAAA,CAAA,QAAA,cAAoB;AACzB,IAAA,OAAO,IAAI,UAAU,UAAU,CAAA;AAAA,EACjC;AAAA;AAAA,EAGQ,YAAA,GAAyB;AAC/B,IAAA,MAAM,QAAQ,IAAA,CAAK,YAAA;AACnB,IAAA,IAAA,CAAK,GAAA,CAAA,QAAA,cAAoB;AAEzB,IAAA,MAAM,WAAsB,EAAC;AAE7B,IAAA,IAAI,IAAA,CAAK,aAAa,IAAA,KAAA,QAAA,eAA2B;AAC/C,MAAA,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,CAAA;AACzB,MAAA,OAAO,IAAA,CAAK,aAAa,IAAA,KAAA,OAAA,cAA0B;AACjD,QAAA,IAAA,CAAK,GAAA,CAAA,OAAA,aAAmB;AACxB,QAAA,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,CAAA;AAAA,MAC3B;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,GAAA,CAAA,QAAA,cAAoB;AACzB,IAAA,OAAO,IAAI,QAAA,CAAS,QAAA,EAAU,KAAK,CAAA;AAAA,EACrC;AAAA;AAAA,EAGQ,gBAAA,GAA4B;AAClC,IAAA,MAAM,QAAQ,IAAA,CAAK,YAAA;AACnB,IAAA,MAAM,QAAA,GAAsB,CAAC,IAAA,CAAK,IAAA,EAAM,CAAA;AAExC,IAAA,OACE,IAAA,CAAK,YAAA,CAAa,IAAA,KAAA,OAAA,gBAClB,IAAA,CAAK,YAAA,CAAa,IAAA,KAAA,QAAA,iBAClB,IAAA,CAAK,YAAA,CAAa,IAAA,KAAA,KAAA,cAClB,IAAA,CAAK,YAAA,CAAa,IAAA,KAAA,WAAA,kBAClB;AACA,MAAA,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,CAAA;AAAA,IAC3B;AAEA,IAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,SAAS,CAAC,CAAA;AAE5C,IAAA,OAAO,IAAI,gBAAA,CAAiB,QAAA,EAAU,KAAK,CAAA;AAAA,EAC7C;AAAA;AAAA,EAGQ,QAAA,GAAoB;AAC1B,IAAA,MAAM,aAAa,IAAA,CAAK,YAAA;AACxB,IAAA,MAAM,QAAA,GAAsB,CAAC,IAAA,CAAK,gBAAA,EAAkB,CAAA;AAEpD,IAAA,OAAO,IAAA,CAAK,aAAa,IAAA,KAAA,OAAA,cAA0B;AACjD,MAAA,IAAA,CAAK,GAAA,CAAA,OAAA,aAAmB;AACxB,MAAA,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,gBAAA,EAAkB,CAAA;AAAA,IACvC;AAEA,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,MAAA,OAAO,SAAS,CAAC,CAAA;AAAA,IACnB;AAEA,IAAA,OAAO,IAAI,QAAA,CAAS,QAAA,EAAU,UAAU,CAAA;AAAA,EAC1C;AAAA;AAAA,EAGQ,SAAA,GAAqB;AAC3B,IAAA,IAAI,IAAA,GAAO,KAAK,UAAA,EAAW;AAC3B,IAAA,OACE,KAAK,YAAA,CAAa,IAAA,KAAA,OAAA,gBAClB,IAAA,CAAK,YAAA,CAAa,wCAClB,IAAA,CAAK,YAAA,CAAa,IAAA,KAAA,IAAA,gBAClB,IAAA,CAAK,aAAa,IAAA,KAAA,IAAA,gBAClB,IAAA,CAAK,aAAa,IAAA,KAAA,UAAA,mBAClB,IAAA,CAAK,aAAa,IAAA,KAAA,UAAA,iBAClB;AACA,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,aAAa,IAAI,CAAA;AAC7C,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,wBAAA,CAAyB,IAAA,EAAM,KAAK,CAAA;AACzD,MAAA,IAAI,SAAS,OAAO,OAAA;AACpB,MAAA,IAAA,GAAO,IAAI,SAAA,CAAU,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,YAAY,CAAA;AAAA,IACrD;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA,EAIQ,UAAA,GAAsB;AAC5B,IAAA,IAAI,IAAA,GAAO,KAAK,IAAA,EAAK;AACrB,IAAA,OACE,IAAA,CAAK,aAAa,IAAA,KAAA,WAAA,qBACjB,IAAA,CAAK,aAAa,KAAA,KAAA,GAAA,cACjB,IAAA,CAAK,aAAa,KAAA,KAAA,GAAA,gBAAA,EACpB;AACA,MAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAA,WAAA,iBAAuB;AAC1C,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,wBAAA,CAAyB,IAAA,EAAM,KAAK,CAAA;AACzD,MAAA,IAAI,SAAS,OAAO,OAAA;AACpB,MAAA,IAAA,GAAO,IAAI,SAAA,CAAU,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,MAAM,CAAA;AAAA,IAC/C;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGQ,IAAA,GAAgB;AACtB,IAAA,IAAI,IAAA,GAAO,KAAK,KAAA,EAAM;AACtB,IAAA,OACE,IAAA,CAAK,aAAa,IAAA,KAAA,WAAA,qBACjB,IAAA,CAAK,aAAa,KAAA,KAAA,GAAA,mBACjB,IAAA,CAAK,aAAa,KAAA,KAAA,GAAA,cAAA,EACpB;AACA,MAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAA,WAAA,iBAAuB;AAC1C,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,wBAAA,CAAyB,IAAA,EAAM,KAAK,CAAA;AACzD,MAAA,IAAI,SAAS,OAAO,OAAA;AACpB,MAAA,IAAA,GAAO,IAAI,SAAA,CAAU,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,OAAO,CAAA;AAAA,IAChD;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGQ,KAAA,GAAiB;AACvB,IAAA,IAAI,IAAA,GAAO,KAAK,MAAA,EAAO;AACvB,IAAA,OACE,IAAA,CAAK,YAAA,CAAa,IAAA,KAAA,WAAA,oBAClB,IAAA,CAAK,aAAa,KAAA,KAAA,GAAA,cAClB;AACA,MAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAA,WAAA,iBAAuB;AAC1C,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,wBAAA,CAAyB,IAAA,EAAM,KAAK,CAAA;AACzD,MAAA,IAAI,SAAS,OAAO,OAAA;AACpB,MAAA,IAAA,GAAO,IAAI,SAAA,CAAU,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,QAAQ,CAAA;AAAA,IACjD;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,OAAO,IAAA,EAAwB;AACrC,IAAA,MAAM,cAAc,IAAA,CAAK,YAAA;AACzB,IAAA,IAAA,CAAK,GAAA,CAAA,QAAA,cAAoB;AACzB,IAAA,OAAO,IAAI,mBAAA,CAAoB,IAAA,EAAM,WAAA,CAAY,KAAK,CAAA;AAAA,EACxD;AAAA,EAEQ,MAAA,GAAkB;AACxB,IAAA,IAAI,IAAA,GAAgB,IAAI,OAAA,CAAQ,IAAA,CAAK,YAAY,CAAA;AACjD,IAAA,IAAA,CAAK,GAAA,CAAA,QAAA,cAAoB;AACzB,IAAA,IAAI,IAAA,CAAK,aAAa,IAAA,KAAA,QAAA,eAA2B;AAC/C,MAAA,OAAO,IAAA,CAAK,OAAO,IAAI,CAAA;AAAA,IACzB;AACA,IAAA,IAAA,GAAO,IAAA,CAAK,gBAAgB,IAAI,CAAA;AAChC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWQ,MAAA,GAAkB;AACxB,IAAA,MAAM,QAAQ,IAAA,CAAK,YAAA;AAGnB,IAAA,IAAI,MAAM,IAAA,KAAA,QAAA,eAA2B;AACnC,MAAA,IAAI,IAAA,GAAgB,KAAK,YAAA,EAAa;AACtC,MAAA,IAAA,GAAO,IAAA,CAAK,gBAAgB,IAAI,CAAA;AAChC,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,IACE,MAAM,IAAA,KAAA,WAAA,qBACL,KAAA,CAAM,2BACL,KAAA,CAAM,KAAA,KAAA,GAAA,mBACN,MAAM,KAAA,KAAA,GAAA,iBAAA,EACR;AACA,MAAA,IAAA,CAAK,GAAA,CAAA,WAAA,iBAAuB;AAC5B,MAAA,IAAI,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,YAAA,CAAa,IAAA,KAAA,KAAA,YAAwB;AAC7D,QAAA,IAAA,CAAK,eAAe,IAAA,CAAK;AAAA,UACvB,IAAA,EAAA,iBAAA;AAAA,UACA,UAAU,KAAA,CAAM,GAAA;AAAA,UAChB,QAAQ,KAAA,CAAM;AAAA,SACf,CAAA;AACD,QAAA,OAAO,IAAI,mBAAmB,KAAK,CAAA;AAAA,MACrC;AACA,MAAA,OAAO,IAAI,WAAA,CAAY,KAAA,EAAO,IAAA,CAAK,QAAQ,CAAA;AAAA,IAC7C;AAEA,IAAA,IACE,KAAA,CAAM,IAAA,KAAA,kBAAA,4BACL,KAAA,CAAM,KAAA,KAAA,MAAA,eAAkC,MAAM,KAAA,KAAA,OAAA,aAAA,EAC/C;AACA,MAAA,IAAA,CAAK,GAAA,CAAA,kBAAA,wBAA8B;AACnC,MAAA,IAAI,QAAA,GAAoB,IAAI,WAAA,CAAY,KAAA,CAAM,6BAAgC,KAAK,CAAA;AACnF,MAAA,QAAA,GAAW,IAAA,CAAK,gBAAgB,QAAQ,CAAA;AACxC,MAAA,OAAO,QAAA;AAAA,IACT;AAEA,IAAA,IAAI,KAAA,CAAM,IAAA,KAAA,kBAAA,2BAAuC,KAAA,CAAM,KAAA,KAAA,MAAA,aAAgC;AACrF,MAAA,IAAA,CAAK,GAAA,CAAA,kBAAA,wBAA8B;AACnC,MAAA,IAAI,QAAA,GAAoB,IAAI,QAAA,CAAS,KAAK,CAAA;AAC1C,MAAA,QAAA,GAAW,IAAA,CAAK,gBAAgB,QAAQ,CAAA;AACxC,MAAA,OAAO,QAAA;AAAA,IACT;AAEA,IAAA,IAAI,MAAM,IAAA,KAAA,QAAA,eAA2B;AACnC,MAAA,OAAO,KAAK,MAAA,EAAO;AAAA,IACrB;AAEA,IAAA,IAAI,MAAM,IAAA,KAAA,QAAA,eAA2B;AACnC,MAAA,MAAM,WAAA,GAAc,KAAA;AACpB,MAAA,IAAA,CAAK,GAAA,CAAA,QAAA,cAAoB;AAGzB,MAAA,IAAI,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,YAAA,CAAa,IAAA,KAAA,KAAA,YAAwB;AAC7D,QAAA,IAAA,CAAK,eAAe,IAAA,CAAK;AAAA,UACvB,IAAA,EAAA,gBAAA;AAAA,UACA,UAAU,WAAA,CAAY;AAAA,SACvB,CAAA;AAED,QAAA,OAAO,IAAI,gBAAA,CAAiB,IAAI,QAAA,CAAS,WAAW,GAAG,WAAW,CAAA;AAAA,MACpE;AAEA,MAAA,MAAM,IAAA,GAAO,KAAK,IAAA,EAAK;AAGvB,MAAA,IAAI,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,YAAA,CAAa,IAAA,KAAA,KAAA,YAAwB;AAC7D,QAAA,IAAA,CAAK,eAAe,IAAA,CAAK;AAAA,UACvB,IAAA,EAAA,gBAAA;AAAA,UACA,UAAU,WAAA,CAAY;AAAA,SACvB,CAAA;AACD,QAAA,OAAO,IAAI,gBAAA,CAAiB,IAAA,EAAM,WAAW,CAAA;AAAA,MAC/C;AAEA,MAAA,IAAA,CAAK,GAAA,CAAA,QAAA,cAAoB;AACzB,MAAA,IAAI,IAAA,CAAK,aAAa,IAAA,KAAA,QAAA,eAA2B;AAC/C,QAAA,OAAO,IAAA,CAAK,OAAO,IAAI,CAAA;AAAA,MACzB;AACA,MAAA,OAAO,IAAA,CAAK,gBAAgB,IAAI,CAAA;AAAA,IAClC;AAGA,IAAA,IAAI,MAAM,IAAA,KAAA,mBAAA,0BAAsC;AAC9C,MAAA,IAAI,IAAA,GAAO,KAAK,SAAA,EAAU;AAC1B,MAAA,IAAA,GAAO,IAAA,CAAK,gBAAgB,IAAI,CAAA;AAChC,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI,MAAM,IAAA,KAAA,WAAA,kBAA8B;AACtC,MAAA,IAAI,IAAA,GAAO,KAAK,SAAA,EAAU;AAE1B,MAAA,IAAA,GAAO,IAAA,CAAK,gBAAgB,IAAI,CAAA;AAChC,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI,MAAM,IAAA,KAAA,WAAA,kBAA8B;AACtC,MAAA,IAAA,CAAK,GAAA,CAAA,WAAA,iBAAuB;AAC5B,MAAA,IAAI,OAAA,GAAmB,IAAI,YAAA,CAAa,KAAK,CAAA;AAC7C,MAAA,OAAA,GAAU,IAAA,CAAK,gBAAgB,OAAO,CAAA;AACtC,MAAA,OAAO,OAAA;AAAA,IACT;AAGA,IAAA,IAAI,MAAM,IAAA,KAAA,gBAAA,uBAAmC;AAC3C,MAAA,IAAA,CAAK,GAAA,CAAA,gBAAA,sBAA4B;AACjC,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,aAAA,EAAc,CAAE,IAAA;AAC9C,MAAA,MAAM,SAAA,GAAY,UAAA,CAAW,KAAA,CAAM,GAAG,CAAA,IAAK,GAAA;AAC3C,MAAA,IAAA,CAAK,eAAe,IAAA,CAAK;AAAA,QACvB,IAAA,EAAA,iBAAA;AAAA,QACA,UAAU,KAAA,CAAM,GAAA;AAAA,QAChB,QAAQ,KAAA,CAAM,MAAA;AAAA,QACd,cAAc,KAAA,CAAM;AAAA,OACrB,CAAA;AACD,MAAA,OAAO,IAAI,iBAAA,CAAkB,KAAA,CAAM,KAAA,EAAO,WAAW,KAAK,CAAA;AAAA,IAC5D;AAIA,IAAA,IAAI,IAAA,CAAK,iBAAA,CAAkB,KAAK,CAAA,EAAG;AACjC,MAAA,IAAA,CAAK,GAAA,CAAI,MAAM,IAAI,CAAA;AACnB,MAAA,IAAI,IAAA;AAGJ,MAAA,IAAK,IAAA,CAAK,aAAa,IAAA,KAAA,QAAA,eAAyC;AAE9D,QAAA,IAAA,GAAO,IAAA,CAAK,aAAa,KAAK,CAAA;AAAA,MAChC,CAAA,MAAO;AAEL,QAAA,IAAA,GAAO,IAAI,eAAe,KAAK,CAAA;AAAA,MACjC;AAEA,MAAA,IAAA,GAAO,IAAA,CAAK,gBAAgB,IAAI,CAAA;AAChC,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,IAAI,MAAM,IAAA,KAAA,iBAAA,wBAAoC;AAC5C,MAAA,OAAO,KAAK,cAAA,EAAe;AAAA,IAC7B;AAEA,IAAA,IAAI,MAAM,IAAA,KAAA,iBAAA,wBAAoC;AAC5C,MAAA,IAAA,CAAK,GAAA,CAAA,iBAAA,uBAA6B;AAClC,MAAA,IAAI,IAAA,GAAgB,IAAI,UAAA,CAAW,KAAK,CAAA;AACxC,MAAA,IAAA,GAAO,IAAA,CAAK,gBAAgB,IAAI,CAAA;AAChC,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,IAAI,IAAA,CAAK,QAAA,IAAY,KAAA,CAAM,IAAA,KAAA,KAAA,YAAwB;AACjD,MAAA,OAAO,IAAI,SAAS,KAAK,CAAA;AAAA,IAC3B;AAEA,IAAA,IAAA,CAAK,wDAAwC,EAAE,KAAA,EAAO,OAAO,KAAA,CAAM,KAAK,GAAG,CAAA;AAAA,EAC7E;AAAA,EAEQ,gBAAgB,QAAA,EAA4B;AAClD,IAAA,IAAI,IAAA,GAAO,QAAA;AACX,IAAA,OAAO,IAAA,CAAK,aAAa,IAAA,KAAA,KAAA,YAAwB;AAC/C,MAAA,MAAM,QAAA,GAAW,KAAK,GAAA,CAAA,KAAA,WAAiB;AAIvC,MAAA,IAAI,IAAA,CAAK,QAAA,IAAa,IAAA,CAAK,YAAA,CAAa,IAAA,KAAA,KAAA,YAAsC;AAC5E,QAAA,IAAA,CAAK,eAAe,IAAA,CAAK;AAAA,UACvB,IAAA,EAAA,cAAA;AAAA,UACA,UAAU,QAAA,CAAS,GAAA;AAAA,UACnB,QAAQ,QAAA,CAAS;AAAA,SAClB,CAAA;AACD,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,IAAA,CAAK,mBAAkB,EAAG;AAC5B,QAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,SAAA,EAAU;AACvC,QAAA,IAAI,SAAA,IAAa,UAAU,IAAA,KAAA,QAAA,eAA2B;AAEpD,UAAA,MAAM,UAAA,GAAa,KAAK,YAAA,CAAa,KAAA;AACrC,UAAA,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,YAAA,CAAa,IAAI,CAAA;AAC/B,UAAA,MAAM,QAAA,GAAW,KAAK,YAAA,CAAa,EAAE,GAAG,IAAA,CAAK,YAAA,EAAc,KAAA,EAAO,UAAA,EAAqB,CAAA;AACvF,UAAA,IAAA,GAAO,IAAI,mBAAA,CAAoB,IAAA,EAAM,QAAQ,CAAA;AAAA,QAC/C,CAAA,MAAO;AAEL,UAAA,MAAM,YAAY,IAAA,CAAK,YAAA;AACvB,UAAA,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,YAAA,CAAa,IAAI,CAAA;AAC/B,UAAA,IAAA,GAAO,IAAI,mBAAA,CAAoB,IAAA,EAAM,IAAI,cAAA,CAAe,SAAS,CAAC,CAAA;AAAA,QACpE;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,aAAa,YAAA,EAAiE;AACpF,IAAA,IAAA,CAAK,GAAA,CAAA,QAAA,cAAoB;AACzB,IAAA,MAAM,OAAkB,EAAC;AACzB,IAAA,OAAO,IAAA,CAAK,aAAa,IAAA,KAAA,QAAA,eAA2B;AAElD,MAAA,IAAI,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,YAAA,CAAa,IAAA,KAAA,KAAA,YAAwB;AAC7D,QAAA,IAAA,CAAK,eAAe,IAAA,CAAK;AAAA,UACvB,IAAA,EAAA,mBAAA;AAAA,UACA,UAAU,YAAA,CAAa,GAAA;AAAA,UACvB,cAAc,YAAA,CAAa;AAAA,SAC5B,CAAA;AACD,QAAA,OAAO,IAAI,uBAAA,CAAwB,YAAA,CAAa,KAAA,EAAiB,MAAM,YAAY,CAAA;AAAA,MACrF;AACA,MAAA,IAAI,IAAA,CAAK,aAAa,IAAA,KAAA,OAAA,cAA0B;AAC9C,QAAA,IAAA,CAAK,GAAA,CAAA,OAAA,aAAmB;AAAA,MAC1B;AACA,MAAA,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,gBAAA,EAAkB,CAAA;AAAA,IACnC;AACA,IAAA,IAAA,CAAK,GAAA,CAAA,QAAA,cAAoB;AACzB,IAAA,OAAO,IAAI,gBAAA,CAAiB,YAAA,CAAa,KAAA,EAAiB,MAAM,YAAY,CAAA;AAAA,EAC9E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,cAAA,GAA0B;AAChC,IAAA,MAAM,QAAQ,IAAA,CAAK,YAAA;AACnB,IAAA,MAAM,MAAM,KAAA,CAAM,KAAA;AAClB,IAAA,IAAA,CAAK,GAAA,CAAA,iBAAA,uBAA6B;AAElC,IAAA,MAAM,QAAmB,EAAC;AAC1B,IAAA,IAAI,OAAA,GAAU,EAAA;AACd,IAAA,IAAI,CAAA,GAAI,CAAA;AAER,IAAA,MAAM,+BAAeX,wBAAA,CAAA,MAAM;AACzB,MAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,QAAA,KAAA,CAAM,IAAA,CAAK,IAAI,UAAA,CAAW,EAAE,GAAG,KAAA,EAAO,KAAA,EAAO,OAAA,EAAS,CAAC,CAAA;AACvD,QAAA,OAAA,GAAU,EAAA;AAAA,MACZ;AAAA,IACF,CAAA,EALqB,cAAA,CAAA;AAOrB,IAAA,OAAO,CAAA,GAAI,IAAI,MAAA,EAAQ;AACrB,MAAA,MAAM,EAAA,GAAK,IAAI,CAAC,CAAA;AAGhB,MAAA,IAAI,EAAA,KAAO,IAAA,IAAQ,CAAA,GAAI,CAAA,GAAI,IAAI,MAAA,EAAQ;AACrC,QAAA,MAAM,IAAA,GAAO,GAAA,CAAI,CAAA,GAAI,CAAC,CAAA;AACtB,QAAA,IAAI,IAAA,KAAS,GAAA,IAAO,IAAA,KAAS,GAAA,IAAO,SAAS,IAAA,EAAM;AACjD,UAAA,OAAA,IAAW,IAAA;AACX,UAAA,CAAA,IAAK,CAAA;AACL,UAAA;AAAA,QACF;AACA,QAAA,IAAI,SAAS,GAAA,EAAK;AAChB,UAAA,IAAI,CAAA,GAAI,IAAI,GAAA,CAAI,MAAA,IAAU,IAAI,CAAA,GAAI,CAAC,MAAM,GAAA,EAAK;AAE5C,YAAA,OAAA,IAAW,IAAA;AACX,YAAA,CAAA,IAAK,CAAA;AAAA,UACP,CAAA,MAAO;AAEL,YAAA,OAAA,IAAW,GAAA;AACX,YAAA,CAAA,IAAK,CAAA;AAAA,UACP;AACA,UAAA;AAAA,QACF;AAAA,MACF;AAGA,MAAA,IAAI,EAAA,KAAO,GAAA,IAAO,CAAA,GAAI,CAAA,GAAI,GAAA,CAAI,UAAU,GAAA,CAAI,CAAA,GAAI,CAAC,CAAA,KAAM,GAAA,EAAK;AAC1D,QAAA,YAAA,EAAa;AAEb,QAAA,MAAM,QAAQ,CAAA,GAAI,CAAA;AAClB,QAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,QAAA,IAAI,CAAA,GAAI,KAAA;AACR,QAAA,OAAO,CAAA,GAAI,GAAA,CAAI,MAAA,IAAU,KAAA,GAAQ,CAAA,EAAG;AAClC,UAAA,IAAI,GAAA,CAAI,CAAC,CAAA,KAAM,GAAA,EAAK;AAClB,YAAA,IAAA,CAAK,KAAA,CAAA,uBAAA,uBAAsC;AAAA,cACzC,OAAA,EAAS;AAAA,aACV,CAAA;AAAA,UACH;AACA,UAAA,IAAI,GAAA,CAAI,CAAC,CAAA,KAAM,GAAA,EAAK,KAAA,EAAA;AAAA,eAAA,IACX,GAAA,CAAI,CAAC,CAAA,KAAM,GAAA,EAAK,KAAA,EAAA;AACzB,UAAA,IAAI,QAAQ,CAAA,EAAG,CAAA,EAAA;AAAA,QACjB;AACA,QAAA,IAAI,UAAU,CAAA,EAAG;AACf,UAAA,IAAA,CAAK,KAAA,CAAA,uBAAA,uBAAsC;AAAA,YACzC,OAAA,EAAS;AAAA,WACV,CAAA;AAAA,QACH;AACA,QAAA,MAAM,OAAA,GAAU,GAAA,CAAI,KAAA,CAAM,KAAA,EAAO,CAAC,CAAA;AAClC,QAAA,MAAM,QAAA,GAAW,IAAI,KAAA,CAAM,OAAO,CAAA;AAClC,QAAA,MAAM,SAAA,GAAY,IAAI,OAAA,CAAO,QAAQ,CAAA;AACrC,QAAA,MAAM,QAAA,GAAW,UAAU,IAAA,EAAK;AAEhC,QAAA,KAAA,MAAW,GAAA,IAAO,UAAU,kBAAA,EAAoB;AAC9C,UAAA,IAAA,CAAK,kBAAA,CAAmB,IAAI,GAAG,CAAA;AAAA,QACjC;AACA,QAAA,KAAA,CAAM,KAAK,QAAQ,CAAA;AACnB,QAAA,CAAA,GAAI,CAAA,GAAI,CAAA;AACR,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,OAAO,GAAA,EAAK;AACd,QAAA,YAAA,EAAa;AACb,QAAA,MAAM,QAAQ,CAAA,GAAI,CAAA;AAClB,QAAA,IAAI,CAAA,GAAI,KAAA;AACR,QAAA,OAAO,IAAI,GAAA,CAAI,MAAA,IAAU,GAAA,CAAI,CAAC,MAAM,GAAA,EAAK;AACvC,UAAA,IAAI,GAAA,CAAI,CAAC,CAAA,KAAM,GAAA,EAAK;AAClB,YAAA,IAAA,CAAK,KAAA,CAAA,uBAAA,uBAAsC;AAAA,cACzC,OAAA,EAAS;AAAA,aACV,CAAA;AAAA,UACH;AACA,UAAA,CAAA,EAAA;AAAA,QACF;AACA,QAAA,IAAI,CAAA,IAAK,IAAI,MAAA,EAAQ;AACnB,UAAA,IAAA,CAAK,KAAA,CAAA,uBAAA,uBAAsC;AAAA,YACzC,OAAA,EAAS;AAAA,WACV,CAAA;AAAA,QACH;AACA,QAAA,IAAI,OAAA,GAAU,GAAA,CAAI,KAAA,CAAM,KAAA,EAAO,CAAC,CAAA;AAEhC,QAAA,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA;AACtC,QAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,UAAA,IAAA,CAAK,KAAA,CAAA,uBAAA,uBAAsC;AAAA,YACzC,OAAA,EAAS;AAAA,WACV,CAAA;AAAA,QACH;AACA,QAAA,IAAA,CAAK,kBAAA,CAAmB,IAAI,OAAO,CAAA;AACnC,QAAA,KAAA,CAAM,IAAA;AAAA,UACJ,IAAI,aAAA,CAAc;AAAA,YAChB,GAAG,KAAA;AAAA,YACH,IAAA,EAAA,WAAA;AAAA,YACA,KAAA,EAAO;AAAA,WACR;AAAA,SACH;AACA,QAAA,CAAA,GAAI,CAAA,GAAI,CAAA;AACR,QAAA;AAAA,MACF;AAGA,MAAA,OAAA,IAAW,EAAA;AACX,MAAA,CAAA,EAAA;AAAA,IACF;AAEA,IAAA,YAAA,EAAa;AAGb,IAAA,IAAI,MAAM,MAAA,KAAW,CAAA,IAAK,KAAA,CAAM,CAAC,aAAa,UAAA,EAAY;AACxD,MAAA,OAAO,MAAM,CAAC,CAAA;AAAA,IAChB;AAEA,IAAA,OAAO,IAAI,kBAAA,CAAmB,KAAA,EAAO,KAAK,CAAA;AAAA,EAC5C;AAAA,EAEO,KAAA,CAAM,aAAa,KAAA,EAAuB;AAC/C,IAAA,IAAI,IAAA,CAAK,QAAA,IAAY,CAAC,UAAA,EAAY;AAChC,MAAA,IAAA,CAAK,KAAA,CAAA,iCAAA,gCAA8C;AAAA,IACrD;AAEA,IAAA,IAAI,IAAA,CAAK,YAAA,CAAa,IAAA,KAAA,KAAA,YAAwB,OAAO,IAAA;AAErD,IAAA,IAAI,UAAA,EAAY,OAAO,IAAA,CAAK,QAAA,EAAS;AAErC,IAAA,MAAM,IAAA,GAAO,KAAK,cAAA,EAAe;AACjC,IAAA,IAAK,IAAA,CAAK,aAAa,IAAA,KAAA,KAAA,YAAsC;AAC3D,MAAA,IAAA,CAAK,KAAA,CAAA,uBAAA,uBAAsC;AAAA,QACzC,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,IACH;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACF,CAAA;AA/6BoBA,wBAAA,CAAA,OAAA,EAAA,QAAA,CAAA;AAAb,IAAM,MAAA,GAAN;AAu7BA,SAAS,gBAAgB,IAAA,EAAqC;AACnE,EAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAM,IAAI,CAAA;AAC5B,EAAA,MAAM,MAAA,GAAS,IAAI,MAAA,CAAO,KAAK,CAAA;AAC/B,EAAA,MAAM,GAAA,GAAM,OAAO,KAAA,EAAM;AAEzB,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACF;AACF;AAVgBA,wBAAA,CAAA,eAAA,EAAA,iBAAA,CAAA;;;AC3+BhB,IAAA,gBAAA,GAAA;AAAAY,0BAAA,CAAA,gBAAA,EAAA;AAAA,EAAA,iBAAA,EAAA,MAAA,iBAAA;AAAA,EAAA,UAAA,EAAA,MAAA,UAAA;AAAA,EAAA,mBAAA,EAAA,MAAA,mBAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,WAAA,EAAA,MAAA,WAAA;AAAA,EAAA,kBAAA,EAAA,MAAA,kBAAA;AAAA,EAAA,qBAAA,EAAA,MAAA;AAAA,CAAA,CAAA;;;ACMO,IAAM,kBAAA,GAAN,MAAM,kBAAA,CAAkB;AAAA,EAAxB,WAAA,GAAA;AACL,IAAA,IAAA,CAAiB,SAAA,uBAAgB,GAAA,EAAyB;AAC1D,IAAA,IAAA,CAAiB,WAAA,uBAAkB,GAAA,EAAyB;AAC5D,IAAA,IAAA,CAAiB,UAAA,uBAAiB,GAAA,EAAyB;AAC3D,IAAA,IAAA,CAAiB,iBAAA,uBAAwB,GAAA,EAAyB;AAAA,EAAA;AAAA,EAElE,kBAAA,CAAmB,WAAmB,UAAA,EAA0B;AAC9D,IAAA,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,SAAA,EAAW,SAAA,EAAW,UAAU,CAAA;AACtD,IAAA,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,WAAA,EAAa,UAAA,EAAY,SAAS,CAAA;AAAA,EAC1D;AAAA,EAEA,qBAAA,CAAsB,WAAmB,UAAA,EAA0B;AACjE,IAAA,IAAA,CAAK,gBAAA,CAAiB,IAAA,CAAK,SAAA,EAAW,SAAA,EAAW,UAAU,CAAA;AAC3D,IAAA,IAAA,CAAK,gBAAA,CAAiB,IAAA,CAAK,WAAA,EAAa,UAAA,EAAY,SAAS,CAAA;AAAA,EAC/D;AAAA,EAEA,mBAAA,CAAoB,WAAmB,MAAA,EAAsB;AAC3D,IAAA,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,UAAA,EAAY,SAAA,EAAW,MAAM,CAAA;AACnD,IAAA,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,iBAAA,EAAmB,MAAA,EAAQ,SAAS,CAAA;AAAA,EAC5D;AAAA,EAEA,sBAAA,CAAuB,WAAmB,MAAA,EAAsB;AAC9D,IAAA,IAAA,CAAK,gBAAA,CAAiB,IAAA,CAAK,UAAA,EAAY,SAAA,EAAW,MAAM,CAAA;AACxD,IAAA,IAAA,CAAK,gBAAA,CAAiB,IAAA,CAAK,iBAAA,EAAmB,MAAA,EAAQ,SAAS,CAAA;AAAA,EACjE;AAAA,EAEA,mBAAmB,KAAA,EAA4B;AAC7C,IAAA,OAAO,KAAK,QAAA,CAAS,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA,EAClD;AAAA,EAEA,2BAA2B,KAAA,EAAiC;AAC1D,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,KAAK,KAAK,EAAC;AAAA,EACzC;AAAA,EAEA,0BAA0B,MAAA,EAA6B;AACrD,IAAA,OAAO,KAAK,QAAA,CAAS,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA,EACzD;AAAA,EAEA,kCAAkC,MAAA,EAAkC;AAClE,IAAA,OAAO,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,MAAM,KAAK,EAAC;AAAA,EAChD;AAAA,EAEA,qBAAqB,KAAA,EAA4B;AAC/C,IAAA,OAAO,KAAK,QAAA,CAAS,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA,EAChD;AAAA,EAEA,sBAAsB,KAAA,EAA4B;AAChD,IAAA,OAAO,KAAK,QAAA,CAAS,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA,EACjD;AAAA,EAEA,aAAa,KAAA,EAAwB;AACnC,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA;AAC1C,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,KAAK,CAAA;AAC5C,IAAA,OAAA,CAAQ,CAAC,aAAa,SAAA,CAAU,IAAA,KAAS,OAAO,CAAC,UAAA,IAAc,WAAW,IAAA,KAAS,CAAA,CAAA;AAAA,EACrF;AAAA,EAEA,kBAAA,GAA8B;AAC5B,IAAA,OAAO,KAAK,SAAA,CAAU,IAAA,GAAO,CAAA,IAAK,IAAA,CAAK,WAAW,IAAA,GAAO,CAAA;AAAA,EAC3D;AAAA,EAEA,mBAAA,GAAgC;AAC9B,IAAA,MAAM,UAAA,uBAAiB,GAAA,EAAY;AACnC,IAAA,KAAA,MAAW,CAAC,KAAK,CAAA,IAAK,KAAK,SAAA,EAAW,UAAA,CAAW,IAAI,KAAK,CAAA;AAC1D,IAAA,KAAA,MAAW,CAAC,KAAK,CAAA,IAAK,KAAK,UAAA,EAAY,UAAA,CAAW,IAAI,KAAK,CAAA;AAC3D,IAAA,OAAO,KAAA,CAAM,KAAK,UAAU,CAAA;AAAA,EAC9B;AAAA,EAEQ,WAAA,CAAkB,GAAA,EAAqB,GAAA,EAAQ,KAAA,EAAgB;AACrE,IAAA,IAAI,GAAA,GAAM,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA;AACrB,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,GAAA,uBAAU,GAAA,EAAO;AACjB,MAAA,GAAA,CAAI,GAAA,CAAI,KAAK,GAAG,CAAA;AAAA,IAClB;AACA,IAAA,GAAA,CAAI,IAAI,KAAK,CAAA;AAAA,EACf;AAAA,EAEQ,gBAAA,CAAuB,GAAA,EAAqB,GAAA,EAAQ,KAAA,EAAgB;AAC1E,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA;AACvB,IAAA,IAAI,CAAC,GAAA,EAAK;AACV,IAAA,GAAA,CAAI,OAAO,KAAK,CAAA;AAChB,IAAA,IAAI,GAAA,CAAI,SAAS,CAAA,EAAG;AAClB,MAAA,GAAA,CAAI,OAAO,GAAG,CAAA;AAAA,IAChB;AAAA,EACF;AAAA,EAEQ,SAAS,MAAA,EAAmC;AAClD,IAAA,OAAO,SAAS,IAAI,GAAA,CAAI,MAAM,CAAA,uBAAQ,GAAA,EAAI;AAAA,EAC5C;AACF,CAAA;AAxF+BZ,wBAAA,CAAA,kBAAA,EAAA,mBAAA,CAAA;AAAxB,IAAM,iBAAA,GAAN,kBAAA;;;ACEA,SAAS,kBAAkB,MAAA,EAA4C;AAC5E,EAAA,IAAI,CAAC,MAAA,CAAO,UAAA,EAAY,KAAA,EAAO;AAC7B,IAAA,2BAAW,GAAA,EAAI;AAAA,EACjB;AACA,EAAA,OAAO,IAAI,IAAI,MAAA,CAAO,UAAA,CAAW,MAAM,QAAA,EAAS,CAAE,MAAM,CAAA;AAC1D;AALgBA,wBAAA,CAAA,iBAAA,EAAA,mBAAA,CAAA;AAWT,SAAS,oBAAoB,MAAA,EAA4C;AAC9E,EAAA,IAAI,CAAC,OAAO,MAAA,EAAQ;AAClB,IAAA,2BAAW,GAAA,EAAI;AAAA,EACjB;AAEA,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAa;AAEpC,EAAA,KAAA,MAAW,CAAC,SAAA,EAAW,MAAM,CAAA,IAAK,OAAO,MAAA,EAAQ;AAC/C,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAE1B,MAAA,IACEa,kCAAgB,KAAK,CAAA,KACpB,KAAA,CAAM,IAAA,KAAA,sBAAA,0BACL,MAAM,IAAA,KAAA,uBAAA,wBAAA,EACR;AACA,QAAA,UAAA,CAAW,IAAI,SAAS,CAAA;AACxB,QAAA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,UAAA;AACT;AAtBgBb,wBAAA,CAAA,mBAAA,EAAA,qBAAA,CAAA;AA4BT,SAAS,oBAAA,CACd,SACA,cAAA,EACc;AACd,EAAA,OAAO,cAAA;AACT;AALgBA,wBAAA,CAAA,oBAAA,EAAA,sBAAA,CAAA;AAWT,SAAS,qBAAA,CACd,WACA,MAAA,EACc;AACd,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAa;AAGlC,EAAA,MAAM,cAAA,GAAiB,kBAAkB,MAAM,CAAA;AAG/C,EAAA,KAAA,MAAW,aAAa,cAAA,EAAgB;AACtC,IAAA,MAAM,QAAA,GAAW,SAAA,CAAU,GAAA,CAAI,SAAS,CAAA;AACxC,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,SAAS,CAAA;AAG5C,IAAA,IAAI,aAAa,QAAA,EAAU;AACzB,MAAA,QAAA,CAAS,IAAI,SAAS,CAAA;AAAA,IACxB;AAAA,EACF;AAEA,EAAA,OAAO,QAAA;AACT;AArBgBA,wBAAA,CAAA,qBAAA,EAAA,uBAAA,CAAA;;;AC+CT,SAAS,aAAA,CAAc,QAA+B,SAAA,EAAsC;AACjG,EAAA,IAAI,CAAC,QAAQ,OAAO,MAAA;AACpB,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,GAAA,CAAI,SAAS,CAAA;AACxC,EAAA,IAAI,CAAC,aAAa,OAAO,MAAA;AACzB,EAAA,OAAO,WAAA,CAAY,IAAA,CAAK,CAAC,KAAA,KAAU,UAAU,KAAK,CAAA;AACpD;AALgBA,wBAAA,CAAA,aAAA,EAAA,eAAA,CAAA;;;ACjGT,IAAM,gBAAA,GAAN,MAAM,gBAAA,CAAgB;AAAA,EAAtB,WAAA,GAAA;AACL,IAAA,IAAA,CAAiB,WAAA,uBAAkB,GAAA,EAAuB;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ1D,gBAAgB,SAAA,EAA8B;AAC5C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,SAAS,CAAA;AAC7C,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,MAAM,WAAqB,EAAC;AAC5B,IAAA,IAAI,QAAA,GAAW,SAAA,CAAU,OAAA,CAAQ,GAAG,CAAA;AAEpC,IAAA,OAAO,aAAa,EAAA,EAAI;AACtB,MAAA,QAAA,CAAS,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAC,CAAA;AAC1C,MAAA,QAAA,GAAW,SAAA,CAAU,OAAA,CAAQ,GAAA,EAAK,QAAA,GAAW,CAAC,CAAA;AAAA,IAChD;AAEA,IAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,SAAA,EAAW,QAAQ,CAAA;AACxC,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,UAAA,GAAmB;AACjB,IAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AAAA,EACzB;AACF,CAAA;AA9B6BA,wBAAA,CAAA,gBAAA,EAAA,iBAAA,CAAA;AAAtB,IAAM,eAAA,GAAN,gBAAA;;;ACOA,IAAM,cAAA,GAAN,MAAM,cAAA,CAAc;AAAA,EAWzB,YAA6B,MAAA,EAAiB;AAAjB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAV7B,IAAA,IAAA,CAAiB,QAAA,uBAAe,GAAA,EAA0B;AAC1D,IAAA,IAAA,CAAiB,aAAA,uBAAoB,GAAA,EAA0B;AAC/D,IAAA,IAAA,CAAiB,cAAA,uBAAqB,GAAA,EAA0B;AAChE,IAAA,IAAA,CAAiB,eAAA,uBAAsB,GAAA,EAA2B;AAClE,IAAA,IAAA,CAAiB,eAAA,GAAkB,IAAI,eAAA,EAAgB;AAGvD;AAAA,IAAA,IAAA,CAAiB,mBAAA,uBAA0B,GAAA,EAAyB;AACpE,IAAA,IAAA,CAAiB,iBAAA,uBAAwB,GAAA,EAAkC;AAAA,EAE5B;AAAA,EAE/C,iBAAiB,SAAA,EAA0B;AACzC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,eAAA,CAAgB,eAAA,CAAgB,SAAS,CAAA;AAC/D,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AAE3B,IAAA,KAAA,MAAW,UAAU,QAAA,EAAU;AAC7B,MAAA,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,QAAA,EAAU,MAAA,EAAQ,SAAS,CAAA;AACjD,MAAA,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,aAAA,EAAe,SAAA,EAAW,MAAM,CAAA;AAGtD,MAAA,MAAM,SAAA,GAAY,OAAO,MAAA,GAAS,CAAA;AAClC,MAAA,MAAM,SAAA,GAAY,SAAA,CAAU,KAAA,CAAM,SAAS,CAAA;AAC3C,MAAA,IAAI,CAAC,SAAA,CAAU,QAAA,CAAS,GAAG,CAAA,EAAG;AAC5B,QAAA,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,mBAAA,EAAqB,MAAA,EAAQ,SAAS,CAAA;AAAA,MAC9D;AAAA,IACF;AAAA,EACF;AAAA,EAEA,UAAU,MAAA,EAAyB;AACjC,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA;AAAA,EACjC;AAAA,EAEA,eAAe,MAAA,EAAsB;AACnC,IAAA,IAAI,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,MAAM,CAAA,EAAG;AACrC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA;AACxC,IAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,IAAA,KAAS,CAAA,EAAG;AACpC,IAAA,IAAA,CAAK,eAAe,GAAA,CAAI,MAAA,EAAQ,IAAI,GAAA,CAAI,OAAO,CAAC,CAAA;AAAA,EAClD;AAAA,EAEA,kBAAkB,SAAA,EAA8B;AAC9C,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,SAAS,CAAA;AACjD,IAAA,IAAI,CAAC,QAAA,IAAY,QAAA,CAAS,IAAA,KAAS,CAAA,SAAU,EAAC;AAE9C,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,KAAA,MAAW,UAAU,QAAA,EAAU;AAC7B,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,MAAM,CAAA;AAC9C,MAAA,IAAI,CAAC,OAAA,EAAS;AACd,MAAA,OAAA,CAAQ,OAAO,SAAS,CAAA;AACxB,MAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,QAAA,IAAA,CAAK,cAAA,CAAe,OAAO,MAAM,CAAA;AACjC,QAAA,KAAA,CAAM,KAAK,MAAM,CAAA;AAAA,MACnB;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,aAAA,CAAc,OAAO,SAAS,CAAA;AACnC,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,qBAAA,CACE,QACA,cAAA,EAC8B;AAC9B,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,mBAAA,CAAoB,GAAA,CAAI,MAAM,CAAA;AAC1D,IAAA,IAAI,CAAC,cAAA,IAAkB,cAAA,CAAe,IAAA,KAAS,GAAG,OAAO,MAAA;AAEzD,IAAA,MAAM,iBAAA,uBAAwB,GAAA,EAAyB;AAEvD,IAAA,KAAA,MAAW,aAAa,cAAA,EAAgB;AACtC,MAAA,MAAM,SAAA,GAAY,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA;AACxC,MAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,GAAA,CAAI,SAAS,CAAA;AACnD,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,cAAc,CAAA;AAC3C,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,iBAAA,CAAkB,GAAA,CAAI,SAAA,EAAW,MAAA,CAAO,cAAA,EAAgB,CAAA;AAAA,MAC1D;AAAA,IACF;AAEA,IAAA,IAAI,iBAAA,CAAkB,IAAA,KAAS,CAAA,EAAG,OAAO,MAAA;AACzC,IAAA,OAAO,IAAIc,kCAAA,CAAiB,iBAAA,EAAmB,IAAA,CAAK,MAAM,CAAA;AAAA,EAC5D;AAAA,EAEA,eAAA,CAAgB,WAAoB,MAAA,EAA4C;AAC9E,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,SAAS,CAAA;AACnD,IAAA,IAAI,WAAW,MAAA,EAAW;AACxB,MAAA,OAAO,MAAA,KAAW,OAAO,MAAA,GAAY,MAAA;AAAA,IACvC;AAEA,IAAA,IAAI,YAAA,GAAe,SAAA,CAAU,WAAA,CAAY,GAAG,CAAA;AAC5C,IAAA,OAAO,eAAe,CAAA,EAAG;AACvB,MAAA,MAAM,SAAA,GAAY,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,YAAY,CAAA;AACjD,MAAA,IAAI,MAAA,CAAO,GAAA,CAAI,SAAS,CAAA,EAAG;AACzB,QAAA,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,SAAA,EAAW,SAAS,CAAA;AAC/C,QAAA,OAAO,SAAA;AAAA,MACT;AACA,MAAA,YAAA,GAAe,SAAA,CAAU,WAAA,CAAY,GAAA,EAAK,YAAA,GAAe,CAAC,CAAA;AAAA,IAC5D;AAEA,IAAA,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,SAAA,EAAW,IAA4B,CAAA;AAClE,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,eAAA,CAAgB,QAAiB,KAAA,EAAsB;AACrD,IAAA,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,eAAA,EAAiB,MAAA,EAAQ,KAAK,CAAA;AAAA,EACtD;AAAA,EAEA,mBAAmB,MAAA,EAA+B;AAChD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,MAAM,CAAA;AAChD,IAAA,OAAO,WAAW,IAAI,GAAA,CAAI,QAAQ,CAAA,uBAAQ,GAAA,EAAI;AAAA,EAChD;AAAA,EAEA,4BAA4B,MAAA,EAA+B;AACzD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,MAAM,CAAA;AAChD,IAAA,IAAI,CAAC,QAAA,EAAU,uBAAO,IAAI,GAAA,EAAI;AAC9B,IAAA,IAAA,CAAK,eAAA,CAAgB,OAAO,MAAM,CAAA;AAClC,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,sBAAsB,MAAA,EAAuB;AAC3C,IAAA,IAAA,CAAK,eAAA,CAAgB,OAAO,MAAM,CAAA;AAAA,EACpC;AAAA,EAEA,gBAAA,GAA6B;AAC3B,IAAA,OAAO,KAAA,CAAM,KAAK,IAAA,CAAK,cAAA,CAAe,MAAM,CAAA,CAAE,MAAA,CAAO,CAAC,MAAA,KAAW;AAC/D,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,MAAM,CAAA;AAC9C,MAAA,OAAO,OAAA,IAAW,QAAQ,IAAA,KAAS,CAAA;AAAA,IACrC,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,WAAA,GAAoB;AAClB,IAAA,IAAA,CAAK,oBAAoB,KAAA,EAAM;AAC/B,IAAA,IAAA,CAAK,kBAAkB,KAAA,EAAM;AAAA,EAC/B;AAAA,EAEQ,WAAA,CAAkB,GAAA,EAAqB,GAAA,EAAQ,KAAA,EAAgB;AACrE,IAAA,IAAI,GAAA,GAAM,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA;AACrB,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,GAAA,uBAAU,GAAA,EAAO;AACjB,MAAA,GAAA,CAAI,GAAA,CAAI,KAAK,GAAG,CAAA;AAAA,IAClB;AACA,IAAA,GAAA,CAAI,IAAI,KAAK,CAAA;AAAA,EACf;AAAA,EAEQ,SAAS,KAAA,EAA+D;AAC9E,IAAA,IAAI,KAAA,KAAU,QAAW,OAAO,MAAA;AAEhC,IAAA,IAAI,UAAU,IAAA,EAAM,OAAO,IAAIC,4BAAA,CAAW,KAAK,MAAM,CAAA;AACrD,IAAA,IAAIC,qCAAA,CAAoB,KAAK,CAAA,EAAG,OAAO,KAAA;AAEvC,IAAA,OAAO,IAAIC,8BAAA,CAAa,MAAA,CAAO,KAAK,CAAA,EAAG,KAAK,MAAM,CAAA;AAAA,EACpD;AACF,CAAA;AAvJ2BjB,wBAAA,CAAA,cAAA,EAAA,eAAA,CAAA;AAApB,IAAM,aAAA,GAAN,cAAA;;;ACLA,IAAM,iBAAA,GAAN,MAAM,iBAAA,CAAiB;AAAA,EAAvB,WAAA,GAAA;AACL,IAAA,IAAA,CAAiB,UAAA,uBAAiB,GAAA,EAAsB;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMxD,OAAA,CAAQ,WAAoB,iBAAA,EAA+C;AACzE,IAAA,IAAI,CAAC,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,SAAS,CAAA,EAAG;AACnC,MAAA,MAAM,KAAA,GAAQ,iBAAA,CAAkB,YAAA,CAAa,SAAS,CAAA;AACtD,MAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,SAAA,EAAW,KAAK,CAAA;AACpC,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,SAAS,CAAA;AAC5C,IAAA,OAAO,MAAA,IAAU,KAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,SAAA,EAA0B;AAClC,IAAA,IAAA,CAAK,UAAA,CAAW,OAAO,SAAS,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAAmB;AACjB,IAAA,IAAA,CAAK,WAAW,KAAA,EAAM;AAAA,EACxB;AACF,CAAA;AA9B8BA,wBAAA,CAAA,iBAAA,EAAA,kBAAA,CAAA;AAAvB,IAAM,gBAAA,GAAN,iBAAA;;;ACIA,IAAM,mBAAA,GAAN,MAAM,mBAAA,CAAmB;AAAA,EAC9B,YACmB,iBAAA,EACA,aAAA,EACA,kBACA,iBAAA,EACA,UAAA,EACA,iBACA,uBAAA,EAIjB;AAViB,IAAA,IAAA,CAAA,iBAAA,GAAA,iBAAA;AACA,IAAA,IAAA,CAAA,aAAA,GAAA,aAAA;AACA,IAAA,IAAA,CAAA,gBAAA,GAAA,gBAAA;AACA,IAAA,IAAA,CAAA,iBAAA,GAAA,iBAAA;AACA,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AACA,IAAA,IAAA,CAAA,eAAA,GAAA,eAAA;AACA,IAAA,IAAA,CAAA,uBAAA,GAAA,uBAAA;AAAA,EAIhB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOH,mBAAA,CACE,SAAA,EACA,SAAA,EACA,cAAA,EACM;AACN,IAAA,IAAA,CAAK,qBAAqB,SAAS,CAAA;AACnC,IAAA,IAAA,CAAK,kBAAA,CAAmB,WAAW,cAAc,CAAA;AAEjD,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,QAAA,IAAA,CAAK,qBAAqB,QAAQ,CAAA;AAClC,QAAA,IAAA,CAAK,kBAAA,CAAmB,UAAU,cAAc,CAAA;AAAA,MAClD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAAqB,IAAA,EAAqB;AAChD,IAAA,KAAA,MAAW,SAAA,IAAa,IAAA,CAAK,iBAAA,CAAkB,0BAAA,CAA2B,IAAI,CAAA,EAAG;AAC/E,MAAA,IAAI,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,SAAS,CAAA,EAAG;AAE3C,MAAA,IAAA,CAAK,iBAAA,CAAkB,qBAAA,CAAsB,SAAA,EAAW,IAAI,CAAA;AAC5D,MAAA,IAAA,CAAK,gBAAA,CAAiB,UAAU,SAAS,CAAA;AAEzC,MAAA,IAAI,KAAK,gBAAA,CAAiB,OAAA,CAAQ,SAAA,EAAW,IAAA,CAAK,iBAAiB,CAAA,EAAG;AACpE,QAAA,IAAA,CAAK,UAAA,CAAW,IAAI,SAAS,CAAA;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAA,CAAmB,MAAe,cAAA,EAAsD;AAC9F,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,aAAA,CAAc,iBAAA,CAAkB,IAAI,CAAA;AAC/D,IAAA,IAAI,aAAA,CAAc,WAAW,CAAA,EAAG;AAEhC,IAAA,KAAA,MAAW,UAAU,aAAA,EAAe;AAClC,MAAA,IAAA,CAAK,uBAAA,CAAwB,QAAQ,cAAc,CAAA;AAAA,IACrD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,uBAAA,CACN,QACA,cAAA,EACM;AAEN,IAAA,IAAA,CAAK,uBAAA,CAAwB,QAAQ,cAAc,CAAA;AAGnD,IAAA,KAAA,MAAW,SAAA,IAAa,IAAA,CAAK,iBAAA,CAAkB,iCAAA,CAAkC,MAAM,CAAA,EAAG;AACxF,MAAA,IAAI,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,SAAS,CAAA,EAAG;AAE3C,MAAA,IAAA,CAAK,iBAAA,CAAkB,sBAAA,CAAuB,SAAA,EAAW,MAAM,CAAA;AAC/D,MAAA,IAAA,CAAK,gBAAA,CAAiB,UAAU,SAAS,CAAA;AAEzC,MAAA,IAAI,KAAK,gBAAA,CAAiB,OAAA,CAAQ,SAAA,EAAW,IAAA,CAAK,iBAAiB,CAAA,EAAG;AACpE,QAAA,IAAA,CAAK,UAAA,CAAW,IAAI,SAAS,CAAA;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AACF,CAAA;AArFgCA,wBAAA,CAAA,mBAAA,EAAA,oBAAA,CAAA;AAAzB,IAAM,kBAAA,GAAN,mBAAA;;;ACGP,SAAS,cAAc,OAAA,EAGrB;AACA,EAAA,IAAI,mBAAmBkB,sCAAA,EAAsB;AAC3C,IAAA,OAAO,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAiB,IAAA,EAAM,QAAQ,IAAA,EAAK;AAAA,EAC9D;AACA,EAAA,IAAI,mBAAmBC,8BAAA,EAAc;AACnC,IAAA,OAAO,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAiB,MAAM,IAAA,EAAK;AAAA,EACtD;AACA,EAAA,MAAM,IAAIC,kCAAA,CAAA,6BAAA,iCAA+D;AAAA,IACvE,IAAA,EAAM,EAAE,IAAA,EAAO,OAAA,CAA2B,IAAA;AAAK,GAChD,CAAA;AACH;AAbSpB,wBAAA,CAAA,aAAA,EAAA,eAAA,CAAA;AAeT,SAAS,aAAA,CACP,KAAA,EACA,KAAA,EACA,OAAA,EACa;AACb,EAAA,MAAM,aAAa,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,MAAM,IAAI,CAAA;AACjD,EAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,IAAA,OAAO,IAAImB,+BAAa,KAAK,CAAA;AAAA,EAC/B;AACA,EAAA,IAAI,IAAI,GAAA,CAAI,UAAU,CAAA,CAAE,OAAO,CAAA,EAAG;AAChC,IAAA,MAAM,IAAIC,kCAAA,CAAA,qBAAA,yBAAuD;AAAA,MAC/D,IAAA,EAAM,EAAE,KAAA,EAAO,UAAA;AAAW,KAC3B,CAAA;AAAA,EACH;AACA,EAAA,OAAO,IAAIF,sCAAA,CAAqB,KAAA,EAAO,UAAA,CAAW,CAAC,CAAC,CAAA;AACtD;AAfSlB,wBAAA,CAAA,aAAA,EAAA,eAAA,CAAA;AAiBT,SAAS,YAAY,IAAA,EAA2D;AAC9E,EAAA,OAAO,CAAC,CAAA,EAAgB,CAAA,EAAgB,MAAA,KAAiC;AAEvE,IAAA,IAAI,QAAQ,WAAA,EAAa;AACvB,MAAA,IAAI;AACF,QAAA,MAAM,YAAY,MAAA,CAAO,WAAA,CAAY,sBAAsB,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AACjE,QAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,UAAA,MAAM,UAAA,GAAa,UAAU,CAAC,CAAA;AAC9B,UAAA,MAAM,UAAA,GAAa,UAAU,CAAC,CAAA;AAE9B,UAAA,MAAMqB,IAAAA,GAAM,cAAc,UAAU,CAAA;AACpC,UAAA,MAAMC,IAAAA,GAAM,cAAc,UAAU,CAAA;AAEpC,UAAA,MAAMC,YAAAA,GAAc,IAAA,CAAKF,IAAAA,CAAI,KAAA,EAAOC,KAAI,KAAK,CAAA;AAC7C,UAAA,OAAO,aAAA,CAAcC,cAAa,CAACF,IAAAA,CAAI,MAAMC,IAAAA,CAAI,IAAI,GAAG,MAAM,CAAA;AAAA,QAChE;AAAA,MACF,SAAS,MAAA,EAAQ;AAAA,MAEjB;AAAA,IACF;AAEA,IAAA,MAAM,GAAA,GAAM,cAAc,CAAC,CAAA;AAC3B,IAAA,MAAM,GAAA,GAAM,cAAc,CAAC,CAAA;AAE3B,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,IAAI,KAAK,CAAA;AAC7C,IAAA,OAAO,aAAA,CAAc,aAAa,CAAC,GAAA,CAAI,MAAM,GAAA,CAAI,IAAI,CAAS,CAAA;AAAA,EAChE,CAAA;AACF;AA3BStB,wBAAA,CAAA,WAAA,EAAA,aAAA,CAAA;AA6BT,SAAS,0BAA0B,EAAA,EAA2D;AAC5F,EAAA,OAAO,CAAC,GAAgB,CAAA,KAAkC;AACxD,IAAA,MAAM,gBAAA,GAAmB,CAAA,YAAae,4BAAA,IAAc,CAAA,YAAaA,4BAAA;AAEjE,IAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,MAAA,MAAM,UAAA,GAAa,CAAA,YAAaI,8BAAA,IAAgB,CAAA,YAAaD,sCAAA;AAC7D,MAAA,MAAM,UAAA,GAAa,CAAA,YAAaC,8BAAA,IAAgB,CAAA,YAAaD,sCAAA;AAC7D,MAAA,IAAI,UAAA,IAAc,CAAC,UAAA,EAAY;AAC7B,QAAA,MAAM,IAAIE,kCAAA,CAAA,uBAAA,2BAAyD;AAAA,UACjE,MAAM,EAAE,KAAA,EAAO,EAAE,IAAA,EAAM,KAAA,EAAO,EAAE,IAAA;AAAK,SACtC,CAAA;AAAA,MACH;AAEA,MAAA,MAAM,YAAY,CAAA,YAAaH,8BAAA;AAC/B,MAAA,MAAM,YAAY,CAAA,YAAaA,8BAAA;AAC/B,MAAA,IAAI,SAAA,IAAa,CAAC,SAAA,EAAW;AAC3B,QAAA,MAAM,IAAIG,kCAAA,CAAA,uBAAA,2BAAyD;AAAA,UACjE,MAAM,EAAE,KAAA,EAAO,EAAE,IAAA,EAAM,KAAA,EAAO,EAAE,IAAA;AAAK,SACtC,CAAA;AAAA,MACH;AAEA,MAAA,MAAM,aAAa,CAAA,YAAaI,+BAAA;AAChC,MAAA,MAAM,aAAa,CAAA,YAAaA,+BAAA;AAChC,MAAA,IAAI,UAAA,IAAc,CAAC,UAAA,EAAY;AAC7B,QAAA,MAAM,IAAIJ,kCAAA,CAAA,uBAAA,2BAAyD;AAAA,UACjE,MAAM,EAAE,KAAA,EAAO,EAAE,IAAA,EAAM,KAAA,EAAO,EAAE,IAAA;AAAK,SACtC,CAAA;AAAA,MACH;AAEA,MAAA,IACE,aAAaF,sCAAA,IACb,CAAA,YAAaA,0CACb,CAAA,CAAE,IAAA,KAAS,EAAE,IAAA,EACb;AACA,QAAA,MAAM,IAAIE,kCAAA,CAAA,yBAAA,6BAA2D;AAAA,UACnE,MAAM,EAAE,KAAA,EAAO,EAAE,IAAA,EAAM,KAAA,EAAO,EAAE,IAAA;AAAK,SACtC,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,OAAO,IAAII,+BAAA,CAAc,EAAA,CAAG,EAAE,KAAA,EAAO,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,EAC/C,CAAA;AACF;AA1CSxB,wBAAA,CAAA,yBAAA,EAAA,2BAAA,CAAA;AA4CT,SAAS,0BAA0B,EAAA,EAA2D;AAC5F,EAAA,OAAO,CAAC,GAAgB,CAAA,KAAkC;AACxD,IAAA,IAAI,CAAA,YAAae,4BAAA,IAAc,CAAA,YAAaA,4BAAA,IAAcU,wBAAA,CAAO,CAAA,CAAE,KAAK,CAAA,IAAKA,wBAAA,CAAO,CAAA,CAAE,KAAK,CAAA,EAAG;AAC5F,MAAA,MAAM,IAAIL,kCAAA,CAAA,uBAAA,0BAAuD;AAAA,IACnE;AAEA,IAAA,MAAM,UAAA,GAAa,CAAA,YAAaD,8BAAA,IAAgB,CAAA,YAAaD,sCAAA;AAC7D,IAAA,MAAM,UAAA,GAAa,CAAA,YAAaC,8BAAA,IAAgB,CAAA,YAAaD,sCAAA;AAC7D,IAAA,IAAI,UAAA,IAAc,CAAC,UAAA,EAAY;AAC7B,MAAA,MAAM,IAAIE,kCAAA,CAAA,uBAAA,2BAAyD;AAAA,QACjE,MAAM,EAAE,KAAA,EAAO,EAAE,IAAA,EAAM,KAAA,EAAO,EAAE,IAAA;AAAK,OACtC,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,YAAY,CAAA,YAAaH,8BAAA;AAC/B,IAAA,MAAM,YAAY,CAAA,YAAaA,8BAAA;AAC/B,IAAA,IAAI,SAAA,IAAa,CAAC,SAAA,EAAW;AAC3B,MAAA,MAAM,IAAIG,kCAAA,CAAA,uBAAA,2BAAyD;AAAA,QACjE,MAAM,EAAE,KAAA,EAAO,EAAE,IAAA,EAAM,KAAA,EAAO,EAAE,IAAA;AAAK,OACtC,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,aAAa,CAAA,YAAaI,+BAAA;AAChC,IAAA,MAAM,aAAa,CAAA,YAAaA,+BAAA;AAChC,IAAA,IAAI,UAAA,IAAc,CAAC,UAAA,EAAY;AAC7B,MAAA,MAAM,IAAIJ,kCAAA,CAAA,uBAAA,2BAAyD;AAAA,QACjE,MAAM,EAAE,KAAA,EAAO,EAAE,IAAA,EAAM,KAAA,EAAO,EAAE,IAAA;AAAK,OACtC,CAAA;AAAA,IACH;AAEA,IAAA,IACE,aAAaF,sCAAA,IACb,CAAA,YAAaA,0CACb,CAAA,CAAE,IAAA,KAAS,EAAE,IAAA,EACb;AACA,MAAA,MAAM,IAAIE,kCAAA,CAAA,yBAAA,6BAA2D;AAAA,QACnE,MAAM,EAAE,KAAA,EAAO,EAAE,IAAA,EAAM,KAAA,EAAO,EAAE,IAAA;AAAK,OACtC,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,IAAII,+BAAA,CAAc,EAAA,CAAG,EAAE,KAAA,EAAO,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,EAC/C,CAAA;AACF;AA1CSxB,wBAAA,CAAA,yBAAA,EAAA,2BAAA,CAAA;AA4CF,IAAM,+BAAA,GAA4E;AAAA,EACvF,CAAA,IAAA,mBAAwB,CAAC,CAAA,EAAgB,CAAA,KAAmB;AAC1D,IAAA,IAAI,EAAE,CAAA,YAAawB,+BAAA,CAAA,IAAkB,EAAE,CAAA,YAAaA,+BAAA,CAAA;AAClD,MAAA,MAAM,IAAIJ,kCAAA,CAAA,6BAAA,iCAA+D;AAAA,QACvE,IAAA,EAAM,EAAE,QAAA,EAAU,IAAA;AAAK,OACxB,CAAA;AACH,IAAA,OAAO,IAAII,+BAAA,CAAc,CAAA,CAAE,KAAA,IAAS,EAAE,KAAK,CAAA;AAAA,EAC7C,CAAA;AAAA,EACA,CAAA,IAAA,kBAAuB,CAAC,CAAA,EAAgB,CAAA,KAAmB;AACzD,IAAA,IAAI,EAAE,CAAA,YAAaA,+BAAA,CAAA,IAAkB,EAAE,CAAA,YAAaA,+BAAA,CAAA;AAClD,MAAA,MAAM,IAAIJ,kCAAA,CAAA,6BAAA,iCAA+D;AAAA,QACvE,IAAA,EAAM,EAAE,QAAA,EAAU,IAAA;AAAK,OACxB,CAAA;AACH,IAAA,OAAO,IAAII,+BAAA,CAAc,CAAA,CAAE,KAAA,IAAS,EAAE,KAAK,CAAA;AAAA,EAC7C;AACF,CAAA;AAEA,SAAS,aAAa,IAAA,EAA2D;AAC/E,EAAA,OAAO,CAAC,CAAA,EAAgB,CAAA,EAAgB,MAAA,KAAiC;AAEvE,IAAA,MAAM,GAAA,GAAM,cAAc,CAAC,CAAA;AAC3B,IAAA,MAAM,GAAA,GAAM,cAAc,CAAC,CAAA;AAG3B,IAAA,IAAI,GAAA,CAAI,IAAA,IAAQ,GAAA,CAAI,IAAA,EAAM;AACxB,MAAA,MAAM,IAAIJ,kCAAA,CAAA,gCAAA,oCAAkE;AAAA,QAC1E,MAAM,EAAE,KAAA,EAAO,IAAI,IAAA,EAAM,KAAA,EAAO,IAAI,IAAA;AAAK,OAC1C,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,IAAI,KAAK,CAAA;AAC7C,IAAA,OAAO,aAAA,CAAc,aAAa,CAAC,GAAA,CAAI,MAAM,GAAA,CAAI,IAAI,CAAS,CAAA;AAAA,EAChE,CAAA;AACF;AAhBSpB,wBAAA,CAAA,YAAA,EAAA,cAAA,CAAA;AAkBT,SAAS,sBAAsB,IAAA,EAA2D;AACxF,EAAA,OAAO,CAAC,CAAA,EAAgB,CAAA,EAAgB,MAAA,KAAiC;AAEvE,IAAA,IAAI,QAAQ,WAAA,EAAa;AAEvB,MAAA,MAAM,UAAA,GACJ,aAAakB,sCAAA,IACb,MAAA,CAAO,YAAY,gBAAA,CAAiB,CAAA,CAAE,IAAI,CAAA,EAAG,IAAA,KAAS,UAAA;AACxD,MAAA,MAAM,UAAA,GACJ,aAAaA,sCAAA,IACb,MAAA,CAAO,YAAY,gBAAA,CAAiB,CAAA,CAAE,IAAI,CAAA,EAAG,IAAA,KAAS,UAAA;AAExD,MAAA,IAAI,UAAA,IAAc,CAAC,UAAA,EAAY;AAE7B,QAAA,MAAM,cAAc,IAAA,CAAM,CAAA,CAAE,KAAA,GAAmB,GAAA,EAAK,EAAE,KAAe,CAAA;AACrE,QAAA,OAAO,CAAA,YAAaA,sCAAA,GAChB,IAAIA,sCAAA,CAAqB,WAAA,EAAa,EAAE,IAAI,CAAA,GAC5C,IAAIC,8BAAA,CAAa,WAAW,CAAA;AAAA,MAClC,CAAA,MAAA,IAAW,UAAA,IAAc,CAAC,UAAA,EAAY;AAEpC,QAAA,MAAM,cAAc,IAAA,CAAK,CAAA,CAAE,KAAA,EAAkB,CAAA,CAAE,QAAmB,GAAG,CAAA;AACrE,QAAA,OAAO,CAAA,YAAaD,sCAAA,GAChB,IAAIA,sCAAA,CAAqB,WAAA,EAAa,EAAE,IAAI,CAAA,GAC5C,IAAIC,8BAAA,CAAa,WAAW,CAAA;AAAA,MAClC;AAAA,IACF;AAGA,IAAA,OAAO,WAAA,CAAY,IAAI,CAAA,CAAE,CAAA,EAAG,GAAG,MAAM,CAAA;AAAA,EACvC,CAAA;AACF;AA9BSnB,wBAAA,CAAA,qBAAA,EAAA,uBAAA,CAAA;AAgCF,IAAM,oBAAA,GAA0D;AAAA,EACrE,iBAAkB,WAAA,CAAY,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,CAAC,CAAA;AAAA,EAC7C,sBAAuB,WAAA,CAAY,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,CAAC,CAAA;AAAA,EAClD,sBAAuB,qBAAA,CAAsB,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,CAAC,CAAA;AAAA,EAC5D,CAAA,GAAA,gBAAqB,qBAAA,CAAsB,CAAC,GAAG,CAAA,KAAM;AACnD,IAAA,IAAI,CAAA,KAAM,CAAA,EAAG,MAAM,IAAIoB,kCAAA,CAAA,qBAAA,wBAAqD;AAC5E,IAAA,OAAO,CAAA,GAAI,CAAA;AAAA,EACb,CAAC,CAAA;AAAA,EACD,mBAAoB,YAAA,CAAa,CAAC,CAAA,EAAG,CAAA,KAAM,KAAK,CAAC;AACnD,CAAA;AAGO,IAAM,0BAAA,GAAuE;AAAA,EAClF,OAAO,yBAAA,CAA0B,CAAC,CAAA,EAAG,CAAA,KAAM,MAAM,CAAC,CAAA;AAAA,EAClD,WAAW,yBAAA,CAA0B,CAAC,CAAA,EAAG,CAAA,KAAM,MAAM,CAAC,CAAA;AAAA,EACtD,IAAI,yBAAA,CAA0B,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,CAAC,CAAA;AAAA,EAC7C,IAAI,yBAAA,CAA0B,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,CAAC,CAAA;AAAA,EAC7C,UAAU,yBAAA,CAA0B,CAAC,CAAA,EAAG,CAAA,KAAM,KAAK,CAAC,CAAA;AAAA,EACpD,UAAU,yBAAA,CAA0B,CAAC,CAAA,EAAG,CAAA,KAAM,KAAK,CAAC;AACtD,CAAA;;;AC3PO,IAAM,YAAA,GAAN,MAAM,YAAA,CAAY;AAAA,EAGvB,WAAA,GAAc;AACZ,IAAA,IAAA,CAAK,UAAU,EAAC;AAAA,EAClB;AAAA,EAEA,IAAI,IAAA,EAAkC;AACpC,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,WAAA,EAAa,CAAA,IAAK,IAAA;AAAA,EAC7C;AAAA,EAEA,GAAA,CAAI,MAAc,KAAA,EAAiC;AACjD,IAAA,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,WAAA,EAAa,CAAA,GAAI,KAAA;AAAA,EACrC;AAAA,EAEA,UAAU,IAAA,EAAuB;AAC/B,IAAA,OAAO,CAAC,CAAC,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,aAAa,CAAA;AAAA,EAC1C;AAAA,EAEA,OAAO,IAAA,EAAoB;AACzB,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,WAAA,EAAa,CAAA;AAAA,EACxC;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,UAAU,EAAC;AAAA,EAClB;AACF,CAAA;AA1ByBpB,wBAAA,CAAA,YAAA,EAAA,aAAA,CAAA;AAAlB,IAAM,WAAA,GAAN,YAAA;;;ACoDP,IAAM,aAAA,GAAN,MAAM,aAAA,CAAa;AAAA,EACjB,YAAmB,KAAA,EAA2B;AAA3B,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAAA,EAA4B;AACjD,CAAA;AAFmBA,wBAAA,CAAA,aAAA,EAAA,cAAA,CAAA;AAAnB,IAAM,YAAA,GAAN,aAAA;AAMO,IAAM,YAAA,GAAN,MAAM,YAAA,CAAY;AAAA,EAOvB,WAAA,CACE,OACA,OAAA,EAKA;AAbF,IAAA,IAAA,CAAQ,MAAA,GAAwB,IAAA;AAEhC,IAAA,IAAA,CAAQ,UAAA,uBAA2C,GAAA,EAAI;AACvD,IAAA,IAAA,CAAQ,GAAA,GAAsB,IAAA;AAW5B,IAAA,IAAI,iBAAiB,MAAA,EAAQ;AAC3B,MAAA,IAAA,CAAK,MAAA,GAAS,KAAA;AAAA,IAChB,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,OAAO,KAAK,CAAA;AAAA,IACnB;AAEA,IAAA,IAAA,CAAK,WAAA,GAAc,OAAA,EAAS,WAAA,IAAe,IAAI,WAAA,EAAY;AAC3D,IAAA,IAAA,CAAK,MAAA,GAAS,OAAA,EAAS,MAAA,IAAU,IAAI,MAAA,EAAO;AAE5C,IAAA,IAAI,SAAS,UAAA,EAAY;AACvB,MAAA,IAAA,CAAK,gBAAA,CAAiB,QAAQ,UAAU,CAAA;AAAA,IAC1C;AAAA,EACF;AAAA;AAAA,EAIO,iBAAiB,UAAA,EAAuD;AAC7E,IAAA,IAAI,sBAAsB,GAAA,EAAK;AAC7B,MAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAAA,IACpB,WAAW,UAAA,EAAY;AACrB,MAAA,KAAA,MAAW,OAAO,UAAA,EAAY;AAC5B,QAAA,IAAA,CAAK,UAAA,CAAW,IAAI,GAAA,EAAK0B,qCAAA,CAAoB,WAAW,GAAG,CAAA,EAAG,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,MAC5E;AAAA,IACF,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,UAAA,uBAAiB,GAAA,EAAyB;AAAA,IACjD;AAAA,EACF;AAAA,EAEO,aAAa,GAAA,EAAsC;AACxD,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA;AAAA,EAChC;AAAA,EAEO,YAAA,CAAa,KAAa,KAAA,EAA0B;AACzD,IAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAAA,EAChC;AAAA;AAAA,EAIO,OAAO,GAAA,EAA2B;AACvC,IAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AACX,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AAAA,EAChB;AAAA,EAEO,gBAAA,GAAyB;AAC9B,IAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AAAA,EACzB;AAAA,EAEO,UAAU,IAAA,EAAkC;AACjD,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,IAAI,CAAA;AAAA,EAClC;AAAA,EAEO,SAAA,CAAU,MAAc,KAAA,EAA0B;AACvD,IAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,IAAA,EAAM,KAAK,CAAA;AAAA,EAClC;AAAA,EAEO,WAAA,CACL,mBACA,WAAA,EACyB;AACzB,IAAA,IAAI,WAAA,YAAuBX,8BAAY,OAAO,iBAAA;AAC9C,IAAA,IAAI,iBAAA,CAAkB,UAAA,CAAW,WAAW,CAAA,EAAG,OAAO,WAAA;AAAA,EACxD;AAAA;AAAA,EAIQ,MAAM,IAAA,EAA0C;AACtD,IAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,IAAA,MAAM,iBAAA,GAAoB,CAAA,KAAA,EAAQ,IAAA,CAAK,QAAQ,CAAA,CAAA;AAC/C,IAAA,IAAI,OAAQ,IAAA,CAAa,iBAAiB,CAAA,KAAM,UAAA,EAAY;AAC1D,MAAA,OAAQ,IAAA,CAAa,iBAAiB,CAAA,CAAE,IAAI,CAAA;AAAA,IAC9C;AAEA,IAAA,MAAM,IAAIK,kCAAA,CAAA,uBAAA,0BAAyD;AAAA,MACjE,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,IAAA,EAAM,EAAE,QAAA,EAAU,IAAA,CAAK,QAAA;AAAS,KACjC,CAAA;AAAA,EACH;AAAA,EAEQ,eAAe,IAAA,EAA8B;AACnD,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AACjC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA;AAEnC,IAAA,MAAM,KAAA,GAAQ,KAAK,OAAA,CAAQ,KAAA;AAC3B,IAAA,MAAM,MAAA,GAAS,KAAK,OAAA,CAAQ,IAAA;AAE5B,IAAA,MAAM,kBAAA,GAAgC,gCAAgC,KAAK,CAAA;AAC3E,IAAA,IAAI,kBAAA,EAAoB;AACtB,MAAA,OAAO,kBAAA,CAAmB,MAAM,KAAK,CAAA;AAAA,IACvC;AAEA,IAAA,MAAM,QAAA,GAAsB,qBAAqB,KAAK,CAAA;AACtD,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IACE,EAAA,CACG,gBAAgBD,8BAAA,IAAgB,IAAA,YAAgBD,4CAChD,KAAA,YAAiBC,8BAAA,IAAgB,iBAAiBD,sCAAA,CAAA,CAAA,EAErD;AACA,QAAA,MAAM,IAAIE,kCAAA,CAAA,gCAAA,mCAAkE;AAAA,UAC1E,OAAO,IAAA,CAAK,OAAA;AAAA,UACZ,IAAA,EAAM,EAAE,QAAA,EAAU,KAAA,EAAO,UAAU,IAAA,CAAK,IAAA,EAAM,SAAA,EAAW,KAAA,CAAM,IAAA;AAAK,SACrE,CAAA;AAAA,MACH;AAEA,MAAA,OAAO,QAAA,CAAS,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,MAAM,CAAA;AAAA,IAC1C;AAEA,IAAA,MAAM,cAAA,GAA4B,2BAA2B,MAAM,CAAA;AACnE,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,OAAO,cAAA,CAAe,MAAM,KAAK,CAAA;AAAA,IACnC;AAEA,IAAA,MAAM,IAAIA,kCAAA,CAAA,6BAAA,gCAA+D;AAAA,MACvE,OAAO,IAAA,CAAK,OAAA;AAAA,MACZ,IAAA,EAAM,EAAE,QAAA,EAAU,KAAA,EAAO,WAAW,MAAA;AAAO,KAC5C,CAAA;AAAA,EACH;AAAA,EAEQ,aAAa,IAAA,EAA6B;AAChD,IAAA,OAAO,IAAID,8BAAA,CAAa,IAAA,CAAK,KAAA,EAAO,KAAK,MAAM,CAAA;AAAA,EACjD;AAAA,EAEQ,gBAAgB,IAAA,EAAgC;AACtD,IAAA,OAAO,IAAIF,8BAAA,CAAa,IAAA,CAAK,KAAA,EAAO,KAAK,MAAM,CAAA;AAAA,EACjD;AAAA,EAEQ,wBAAwB,IAAA,EAAuC;AACrE,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AAC3B,MAAA,OAAO,IAAIA,8BAAA,CAAa,EAAA,EAAI,IAAA,CAAK,MAAM,CAAA;AAAA,IACzC;AAGA,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AAC3B,MAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AACpC,MAAA,IAAA,CAAK,qBAAA,CAAsB,KAAK,IAAI,CAAA;AACpC,MAAA,OAAO,GAAA;AAAA,IACT;AAGA,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,KAAA,EAAO;AAC7B,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC3B,MAAA,IAAA,CAAK,qBAAA,CAAsB,KAAK,IAAI,CAAA;AACpC,MAAA,MAAA,IAAU,IAAI,QAAA,EAAS;AAAA,IACzB;AACA,IAAA,OAAO,IAAIA,8BAAA,CAAa,MAAA,EAAQ,IAAA,CAAK,MAAM,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,qBAAA,CAAsB,KAAkB,IAAA,EAAgC;AAC9E,IAAA,IAAI,eAAeU,4BAAA,EAAY;AAC7B,MAAA,MAAM,IAAIP,kCAAA,CAAA,2BAAA,8BAA6D;AAAA,QACrE,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,IAAA,EAAM,EAAE,SAAA,EAAW,MAAA;AAAO,OAC3B,CAAA;AAAA,IACH;AACA,IAAA,IAAI,eAAeN,kCAAA,EAAkB;AACnC,MAAA,MAAM,IAAIM,kCAAA,CAAA,2BAAA,8BAA6D;AAAA,QACrE,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,IAAA,EAAM,EAAE,SAAA,EAAW,YAAA;AAAa,OACjC,CAAA;AAAA,IACH;AACA,IAAA,IAAI,GAAA,YAAeQ,6BAAA,IAAe,CAAC,GAAA,CAAI,OAAM,EAAG;AAC9C,MAAA,MAAM,IAAIR,kCAAA,CAAA,2BAAA,8BAA6D;AAAA,QACrE,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,MAAM,EAAE,SAAA,EAAW,CAAA,MAAA,EAAS,GAAA,CAAI,OAAO,CAAA,CAAA;AAAG,OAC3C,CAAA;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,oBAAoB,IAAA,EAAmC;AAC7D,IAAA,OACE,KAAK,WAAA,CAAY,GAAA,CAAI,IAAA,CAAK,IAAI,KAC9B,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,IAAI,KAC3B,IAAIH,8BAAA,CAAa,IAAA,CAAK,IAAA,EAAM,KAAK,MAAM,CAAA;AAAA,EAE3C;AAAA,EAEQ,iBAAiB,IAAA,EAAgC;AACvD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAEnC,IAAA,IAAI,KAAK,EAAA,KAAA,GAAA,iBAA4B;AACnC,MAAA,IAAI,kBAAkBE,8BAAA,EAAc;AAClC,QAAA,IAAI,MAAA,CAAO,UAAU,IAAA,EAAM;AACzB,UAAA,MAAM,IAAIC,kCAAA,CAAA,sBAAA,yBAAwD;AAAA,YAChE,OAAO,IAAA,CAAK,OAAA;AAAA,YACZ,IAAA,EAAM,EAAE,UAAA,EAAY,cAAA;AAAe,WACpC,CAAA;AAAA,QACH;AACA,QAAA,OAAO,IAAID,8BAAA,CAAa,CAAC,MAAA,CAAO,KAAA,EAAO,KAAK,MAAM,CAAA;AAAA,MACpD;AAEA,MAAA,IAAI,kBAAkBD,sCAAA,EAAsB;AAC1C,QAAA,IAAI,MAAA,CAAO,UAAU,IAAA,EAAM;AACzB,UAAA,MAAM,IAAIE,kCAAA,CAAA,sBAAA,yBAAwD;AAAA,YAChE,OAAO,IAAA,CAAK,OAAA;AAAA,YACZ,IAAA,EAAM,EAAE,UAAA,EAAY,sBAAA;AAAuB,WAC5C,CAAA;AAAA,QACH;AACA,QAAA,OAAO,IAAIF,uCAAqB,CAAC,MAAA,CAAO,OAAO,MAAA,CAAO,IAAA,EAAM,KAAK,MAAM,CAAA;AAAA,MACzE;AAEA,MAAA,MAAM,IAAIE,kCAAA,CAAA,2BAAA,8BAA6D;AAAA,QACrE,OAAO,IAAA,CAAK,OAAA;AAAA,QACZ,MAAM,EAAE,KAAA,EAAO,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA;AAAE,OACrC,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,KAAK,EAAA,KAAA,GAAA,YAAuB;AAC9B,MAAA,IAAI,MAAA,YAAkBD,8BAAA,IAAgB,MAAA,YAAkBD,sCAAA,EAAsB;AAC5E,QAAA,OAAO,MAAA;AAAA,MACT;AAEA,MAAA,MAAM,IAAIE,kCAAA,CAAA,2BAAA,8BAA6D;AAAA,QACrE,OAAO,IAAA,CAAK,OAAA;AAAA,QACZ,MAAM,EAAE,KAAA,EAAO,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA;AAAE,OACrC,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,KAAK,EAAA,KAAA,GAAA,kBAA6B;AACpC,MAAA,IAAI,kBAAkBI,+BAAA,EAAe;AACnC,QAAA,OAAO,IAAIA,+BAAA,CAAc,CAAC,MAAA,CAAO,KAAA,EAAO,KAAK,MAAM,CAAA;AAAA,MACrD;AAEA,MAAA,MAAM,IAAIJ,kCAAA,CAAA,2BAAA,8BAA6D;AAAA,QACrE,OAAO,IAAA,CAAK,OAAA;AAAA,QACZ,MAAM,EAAE,KAAA,EAAO,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA;AAAE,OACrC,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,IAAIA,kCAAA,CAAA,4BAAA,+BAA8D;AAAA,MACtE,OAAO,IAAA,CAAK,OAAA;AAAA,MACZ,IAAA,EAAM,EAAE,QAAA,EAAU,IAAA,CAAK,EAAA;AAAG,KAC3B,CAAA;AAAA,EACH;AAAA,EAEQ,cAAc,IAAA,EAA4B;AAChD,IAAA,OAAO,IAAIO,4BAAA;AAAA,MACT,IAAA,CAAK,SAAS,GAAA,CAAI,CAAC,OAAO,IAAA,CAAK,KAAA,CAAM,EAAE,CAAgB,CAAA;AAAA,MACvD,IAAA,YAAgB,gBAAA;AAAA,MAChB,IAAA,CAAK;AAAA,KACP;AAAA,EACF;AAAA,EAEQ,sBAAsB,IAAA,EAAoC;AAChE,IAAA,OAAO,IAAA,CAAK,cAAc,IAAI,CAAA;AAAA,EAChC;AAAA,EAEQ,mBAAmB,IAAA,EAAkC;AAC3D,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,KAAK,CAAA;AAE1C,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,MAAM,IAAIP,kCAAA,CAAA,uBAAA,0BAAyD;AAAA,QACjE,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,IAAA,EAAM,EAAE,SAAA,EAAW,IAAA,CAAK,KAAA;AAAM,OAC/B,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,kBAAkB,IAAA,EAAiC;AACzD,IAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAM,GAAIS,mCAAA,CAAkB,KAAK,KAAK,CAAA;AACrD,IAAA,OAAO,IAAID,6BAAA,CAAY,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAK,MAAM,CAAA;AAAA,EACzD;AAAA,EAEQ,iBAAiB,IAAA,EAAkC;AACzD,IAAA,OAAO,IAAIJ,+BAAA,CAAc,IAAA,CAAK,KAAA,EAAO,KAAK,MAAM,CAAA;AAAA,EAClD;AAAA,EAEQ,cAAc,KAAA,EAA6B;AACjD,IAAA,OAAO,IAAIT,4BAAA,CAAW,IAAA,CAAK,MAAM,CAAA;AAAA,EACnC;AAAA,EAEQ,yBAAyB,IAAA,EAAiD;AAChF,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA;AAC5C,IAAA,OAAO,IAAIG,sCAAA,CAAqB,YAAA,EAAc,OAAO,IAAA,CAAK,IAAA,EAAM,KAAK,MAAM,CAAA;AAAA,EAC7E;AAAA,EAEQ,sBAAsB,IAAA,EAAqC;AACjE,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,IAAA,CAAK,WAAA,EAAY;AACrC,IAAA,MAAM,IAAA,GAAO,KAAK,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAgB,CAAA;AAElE,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,gBAAA,CAAiB,WAAA,CAAY,MAAM,CAAA,EAAG;AACpD,MAAA,IAAA,CAAK,OAAO,gBAAA,CAAiB,oBAAA,CAAqB,MAAA,EAAQ,IAAA,EAAM,KAAK,KAAK,CAAA;AAC1E,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,gBAAA,CAAiB,YAAY,MAAM,CAAA;AAC1D,MAAA,IAAI,EAAA,EAAI;AACN,QAAA,OAAO,EAAA,CAAG,GAAG,IAAI,CAAA;AAAA,MACnB;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa,cAAA,CAAe,MAAM,CAAA,EAAG;AACnD,MAAA,OAAO,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa,kBAAA,CAAmB,QAAQ,IAAI,CAAA;AAAA,IACjE;AAEA,IAAA,IAAIY,wCAAA,CAAuB,QAAA,CAAS,MAAM,CAAA,EAAG;AAC3C,MAAA,MAAM,aAAa,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ,GAAA,CAAI,UAAU,CAAA;AACnD,MAAA,OAAO,IAAIb,8BAAA,CAAa,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,UAAA,CAAW,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA,EAAK,IAAA,CAAK,MAAM,CAAA;AAAA,IAC5E;AAEA,IAAA,MAAM,IAAIG,kCAAA,CAAA,sBAAA,yBAAwD;AAAA,MAChE,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,IAAA,EAAM,EAAE,YAAA,EAAc,IAAA,CAAK,IAAA;AAAK,KACjC,CAAA;AAAA,EACH;AAAA,EAEQ,gBAAgB,IAAA,EAAwB;AAC9C,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,CAAQ,IAAA;AAG1B,IAAA,IAAI,CAAC,GAAA,EAAK,GAAA,EAAK,GAAG,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,IAAA,CAAK,QAAA,CAAS,CAAC,CAAC,CAAA,EAAG;AACjD,MAAA,MAAM,IAAIA,kCAAA,CAAA,2BAAA,8BAA6D;AAAA,QACrE,KAAA,EAAO,KAAK,OAAA,CAAQ,KAAA;AAAA,QACpB,IAAA,EAAM,EAAE,IAAA;AAAK,OACd,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,IAAA,CAAK,WAAA,CAAY,SAAA,CAAU,IAAI,CAAA,EAAG;AACpC,MAAA,MAAM,IAAIA,kCAAA,CAAA,8BAAA,iCAAgE;AAAA,QACxE,KAAA,EAAO,KAAK,OAAA,CAAQ,KAAA;AAAA,QACpB,IAAA,EAAM,EAAE,IAAA;AAAK,OACd,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,QAAA,CAAS,IAAA;AACxC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,QAAA,CAAS,CAAC,CAAA,EAAG,IAAA;AAE3C,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,aAAA,CAAc,QAAA,EAAU,OAAO,CAAA,EAAG;AACjD,MAAA,MAAM,IAAIA,kCAAA,CAAA,2BAAA,8BAA6D;AAAA,QACrE,KAAA,EAAO,KAAK,OAAA,CAAQ,KAAA;AAAA,QACpB,IAAA,EAAM;AAAA,UACJ,QAAA,EAAUW,0BAAA,CAAS,QAAA,EAAU,OAAO,CAAA;AAAA,UACpC,YAAY,MAAA,CAAO,IAAA,CAAKC,kCAAgB,CAAA,CAAE,KAAK,IAAI;AAAA;AACrD,OACD,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,UAAU,OAAO,CAAA;AAE/D,IAAA,MAAM,cAA2B,IAAA,CAAK,cAAA,GACjC,KAAK,KAAA,CAAM,IAAA,CAAK,cAAc,CAAA,GAC/B,iBAAA;AAEJ,IAAA,MAAM,kBAAA,GAAqB,IAAA,CAAK,WAAA,CAAY,iBAAA,EAAmB,WAAW,CAAA;AAC1E,IAAA,IAAI,CAAC,kBAAA,EAAoB;AACvB,MAAA,MAAM,IAAIZ,kCAAA,CAAA,gCAAA,mCAAkE;AAAA,QAC1E,KAAA,EAAO,KAAK,OAAA,CAAQ,KAAA;AAAA,QACpB,IAAA,EAAM,EAAE,KAAA,EAAO,MAAA,CAAO,YAAY,KAAK,CAAA,EAAG,IAAA,EAAM,QAAA,EAAU,IAAA;AAAK,OAChE,CAAA;AAAA,IACH;AAEA,IAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,IAAA,EAAM,kBAAkB,CAAA;AAAA,EAC/C;AAAA,EAEQ,kBAAkB,IAAA,EAA0B;AAClD,IAAA,MAAM,cAAA,GAAiB,KAAK,cAAA,EAAe;AAE3C,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,eAAe,IAAI,CAAA;AAC5D,IAAA,IAAI,gBAAgB,IAAA,EAAM;AACxB,MAAA,MAAM,IAAIA,kCAAA,CAAA,wBAAA,2BAA0D;AAAA,QAClE,OAAO,cAAA,CAAe,KAAA;AAAA,QACtB,IAAA,EAAM,EAAE,IAAA,EAAM,cAAA,CAAe,IAAA;AAAK,OACnC,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA;AAEnC,IAAA,IAAI,UAAU,IAAA,EAAM;AAClB,MAAA,MAAM,IAAIA,kCAAA,CAAA,2BAAA,8BAA6D;AAAA,QACrE,KAAA,EAAQ,KAAK,KAAA,CAAc,KAAA;AAAA,QAC3B,IAAA,EAAM,EAAE,UAAA,EAAY,IAAA,CAAK,oBAAmB;AAAE,OAC/C,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,IAAA,CAAK,uBAAsB,EAAG;AAChC,MAAA,IAAI,uBAAuBQ,6BAAA,EAAa;AACtC,QAAA,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa,YAAA,CAAa,WAAA,EAAa,MAAM,KAAK,CAAA;AAAA,MAChE;AAAA,IACF,CAAA,MAAO;AACL,MAAA,IAAIK,4BAAA,CAAW,KAAA,CAAM,IAAA,EAAM,MAAM,CAAA,EAAG,WAEzB,CAACA,4BAAA,CAAW,YAAY,IAAA,EAAM,KAAA,CAAM,IAAI,CAAA,EAAG;AACpD,QAAA,MAAM,IAAIb,kCAAA,CAAA,mBAAA,sBAAqD;AAAA,UAC7D,OAAO,cAAA,CAAe,KAAA;AAAA,UACtB,IAAA,EAAM;AAAA,YACJ,KAAA,EAAO,OAAO,KAAK,CAAA;AAAA,YACnB,WAAW,KAAA,CAAM,IAAA;AAAA,YACjB,cAAc,WAAA,CAAY,IAAA;AAAA,YAC1B,UAAA,EAAY,KAAK,kBAAA;AAAmB;AACtC,SACD,CAAA;AAAA,MACH;AAEA,MAAA,IAAI,CAAC,WAAA,CAAY,UAAA,CAAW,KAAK,CAAA,EAAG;AAClC,QAAA,MAAM,IAAIA,kCAAA,CAAA,wBAAA,2BAA0D;AAAA,UAClE,KAAA,EAAQ,KAAK,KAAA,CAAc,KAAA;AAAA,UAC3B,IAAA,EAAM;AAAA,YACJ,WAAW,KAAA,CAAM,IAAA;AAAA,YACjB,UAAA,EAAY,KAAK,kBAAA,EAAmB;AAAA,YACpC,cAAc,WAAA,CAAY;AAAA;AAC5B,SACD,CAAA;AAAA,MACH;AAEA,MAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,cAAA,CAAe,IAAA,EAAM,KAAK,CAAA;AAAA,IACjD;AAAA,EACF;AAAA,EAEQ,yBAAyB,IAAA,EAAwC;AACvE,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AACjC,IAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AAEnB,IAAA,IAAI,OAAO,IAAA,CAAK,SAAA,KAAc,cAAc,OAAO,IAAA,CAAK,iBAAiB,UAAA,EAAY;AACnF,MAAA,IAAI,iBAAiB,gBAAA,EAAkB;AAErC,QAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAgB,CAAA;AACnE,QAAA,IAAI,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,IAAA,EAAM,IAAI,CAAA,EAAG;AACpC,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,UAAA,GAAa,KAAA,CAAM,MAAM,IAAI,CAAA;AACjD,UAAA,IAAI,MAAA,KAAW,IAAA,IAAQ,MAAA,KAAW,MAAA,EAAW;AAC3C,YAAA,MAAM,IAAIA,kCAAA,CAAA,0BAAA,6BAA4D;AAAA,cACpE,OAAO,IAAA,CAAK,KAAA;AAAA,cACZ,IAAA,EAAM,EAAE,UAAA,EAAY,KAAA,CAAM,IAAA;AAAK,aAChC,CAAA;AAAA,UACH;AACA,UAAA,OAAO,MAAA;AAAA,QACT;AACA,QAAA,MAAM,IAAIA,kCAAA,CAAA,sBAAA,yBAAwD;AAAA,UAChE,OAAO,IAAA,CAAK,KAAA;AAAA,UACZ,IAAA,EAAM,EAAE,UAAA,EAAY,KAAA,CAAM,IAAA,EAAM,KAAA,EAAO,MAAA,CAAO,IAAI,CAAA,EAAG,IAAA,EAAM,IAAA,CAAK,IAAA;AAAK,SACtE,CAAA;AAAA,MACH;AACA,MAAA,IAAI,iBAAiB,cAAA,EAAgB;AAEnC,QAAA,IAAI,IAAA,CAAK,YAAA,CAAa,KAAA,CAAM,IAAI,CAAA,EAAG;AACjC,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,YAAA,GAAe,KAAA,CAAM,IAAI,CAAA;AAC7C,UAAA,IAAI,MAAA,KAAW,IAAA,IAAQ,MAAA,KAAW,MAAA,EAAW;AAC3C,YAAA,MAAM,IAAIA,kCAAA,CAAA,6BAAA,gCAA+D;AAAA,cACvE,OAAO,IAAA,CAAK,KAAA;AAAA,cACZ,IAAA,EAAM,EAAE,aAAA,EAAe,KAAA,CAAM,IAAA;AAAK,aACnC,CAAA;AAAA,UACH;AACA,UAAA,OAAO,MAAA;AAAA,QACT;AACA,QAAA,MAAM,IAAIA,kCAAA,CAAA,yBAAA,4BAA2D;AAAA,UACnE,OAAO,IAAA,CAAK,KAAA;AAAA,UACZ,IAAA,EAAM;AAAA,YACJ,eAAe,KAAA,CAAM,IAAA;AAAA,YACrB,KAAA,EAAO,IAAA,YAAgBQ,6BAAA,GAAc,OAAA,GAAU,OAAO,IAAI,CAAA;AAAA,YAC1D,MAAM,IAAA,CAAK;AAAA;AACb,SACD,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,MAAM,IAAIR,kCAAA,CAAA,8BAAA,iCAAgE;AAAA,MACxE,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,IAAA,EAAM,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA;AAAK,KACzB,CAAA;AAAA,EACH;AAAA,EAEQ,uBAAuB,IAAA,EAA6C;AAC1E,IAAA,IAAI,MAAA,GAA6B,IAAA;AAEjC,IAAA,KAAA,MAAW,SAAA,IAAa,KAAK,UAAA,EAAY;AACvC,MAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA;AAC5C,MAAA,IAAI,eAAA,EAAiB;AACnB,QAAA,MAAA,GAAS,eAAA;AAAA,MACX;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,gBAAgB,IAAA,EAAwB;AAC9C,IAAA,MAAM,IAAI,YAAA,CAAa,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,EAC9C;AAAA,EAEQ,eAAe,IAAA,EAAuB;AAC5C,IAAA,IAAI,UAAA,GAAa,CAAA;AACjB,IAAA,OAAO,IAAA,EAAM;AACX,MAAA,UAAA,EAAA;AACA,MAAA,IAAI,UAAA,GAAa,IAAA,CAAK,MAAA,CAAO,eAAA,CAAgB,cAAA,EAAgB;AAC3D,QAAA,MAAM,IAAIA,kCAAA,CAAA,6BAAA,gCAA+D;AAAA,UACvE,OAAO,IAAA,CAAK;AAAA,SACb,CAAA;AAAA,MACH;AACA,MAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAS,CAAA;AAC/C,MAAA,IAAI,EAAE,yBAAyBI,+BAAA,CAAA,EAAgB;AAC7C,QAAA,MAAM,IAAIJ,kCAAA,CAAA,iCAAA,oCAAmE;AAAA,UAC3E,KAAA,EAAO,KAAK,SAAA,EAAW;AAAA,SACxB,CAAA;AAAA,MACH;AACA,MAAA,IAAI,CAAC,cAAc,KAAA,EAAO;AAE1B,MAAA,IAAA,CAAK,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,IACtB;AAAA,EACF;AAAA,EAEQ,iBAAiB,IAAA,EAAgC;AAEvD,IAAA,IAAI,IAAA,CAAK,WAAA,CAAY,SAAA,CAAU,IAAA,CAAK,OAAO,CAAA,EAAG;AAC5C,MAAA,MAAM,IAAIA,kCAAA,CAAA,8BAAA,iCAAgE;AAAA,QACxE,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,IAAA,EAAM,EAAE,IAAA,EAAM,IAAA,CAAK,OAAA;AAAQ,OAC5B,CAAA;AAAA,IACH;AACA,IAAA,IAAI,IAAA,CAAK,aAAa,IAAA,EAAM;AAC1B,MAAA,IAAI,IAAA,CAAK,QAAA,KAAa,IAAA,CAAK,OAAA,EAAS;AAClC,QAAA,MAAM,IAAIA,kCAAA,CAAA,6BAAA,gCAA+D;AAAA,UACvE,OAAO,IAAA,CAAK,KAAA;AAAA,UACZ,IAAA,EAAM,EAAE,IAAA,EAAM,IAAA,CAAK,OAAA;AAAQ,SAC5B,CAAA;AAAA,MACH;AACA,MAAA,IAAI,IAAA,CAAK,WAAA,CAAY,SAAA,CAAU,IAAA,CAAK,QAAQ,CAAA,EAAG;AAC7C,QAAA,MAAM,IAAIA,kCAAA,CAAA,8BAAA,iCAAgE;AAAA,UACxE,OAAO,IAAA,CAAK,KAAA;AAAA,UACZ,IAAA,EAAM,EAAE,IAAA,EAAM,IAAA,CAAK,QAAA;AAAS,SAC7B,CAAA;AAAA,MACH;AAAA,IACF;AAGA,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,UAAU,CAAA;AAChD,IAAA,IAAI,EAAE,yBAAyBO,4BAAA,CAAA,EAAa;AAC1C,MAAA,MAAM,IAAIP,kCAAA,CAAA,uBAAA,0BAAyD;AAAA,QACjE,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,IAAA,EAAM,EAAE,UAAA,EAAY,aAAA,EAAe,QAAQ,MAAA;AAAO,OACnD,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,WAAW,aAAA,CAAc,KAAA;AAC/B,IAAA,MAAM,UAAyB,EAAC;AAEhC,IAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,QAAA,CAAS,QAAQ,GAAA,EAAA,EAAO;AAC9C,MAAA,MAAM,IAAA,GAAO,SAAS,GAAG,CAAA;AAGzB,MAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AACvC,MAAA,IAAI,IAAA,CAAK,aAAa,IAAA,EAAM;AAC1B,QAAA,IAAA,CAAK,WAAA,CAAY,IAAI,IAAA,CAAK,QAAA,EAAU,IAAID,8BAAA,CAAa,GAAA,EAAK,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,MACxE;AAGA,MAAA,IAAI,UAAA,GAAiC,IAAA;AACrC,MAAA,IAAI;AACF,QAAA,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAAA,MACnC,SAAS,CAAA,EAAG;AAEV,QAAA,IAAI,aAAa,YAAA,EAAc;AAE7B,UAAA,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA;AACpC,UAAA,IAAI,IAAA,CAAK,aAAa,IAAA,EAAM;AAC1B,YAAA,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA;AAAA,UACvC;AACA,UAAA,MAAM,CAAA;AAAA,QACR;AACA,QAAA,MAAM,CAAA;AAAA,MACR;AAEA,MAAA,OAAA,CAAQ,KAAK,UAAA,IAAc,IAAIJ,4BAAA,CAAW,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,IACxD;AAGA,IAAA,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA;AACpC,IAAA,IAAI,IAAA,CAAK,aAAa,IAAA,EAAM;AAC1B,MAAA,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA;AAAA,IACvC;AAEA,IAAA,OAAO,IAAIY,4BAAA,CAAW,OAAA,EAAS,KAAA,EAAO,KAAK,MAAM,CAAA;AAAA,EACnD;AAAA,EAEQ,YAAY,IAAA,EAAkC;AAEpD,IAAA,KAAA,MAAW,aAAA,IAAiB,KAAK,UAAA,EAAY;AAC3C,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,aAAA,CAAc,SAAS,CAAA;AACpD,MAAA,IAAI,EAAE,qBAAqBH,+BAAA,CAAA,EAAgB;AACzC,QAAA,MAAM,IAAIJ,kCAAA,CAAA,8BAAA,iCAAgE;AAAA,UACxE,KAAA,EAAQ,cAAc,SAAA,CAAkB;AAAA,SACzC,CAAA;AAAA,MACH;AAEA,MAAA,IAAI,UAAU,KAAA,EAAO;AACnB,QAAA,OAAO,IAAA,CAAK,KAAA,CAAM,aAAA,CAAc,IAAI,CAAA;AAAA,MACtC;AAAA,IACF;AAGA,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA;AAAA,IACjC;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEO,SAAA,GAA+B;AACpC,IAAA,MAAM,IAAA,GAAO,KAAK,GAAA,KAAQ,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA,CAAO,OAAM,GAAI,IAAA,CAAA;AAC9D,IAAA,IAAI,CAAC,MAAM,OAAO,EAAA;AAElB,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAA,GAAS,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,IAC1B,SAAS,CAAA,EAAG;AACV,MAAA,IAAI,aAAa,YAAA,EAAc;AAC7B,QAAA,MAAA,GAAS,CAAA,CAAE,KAAA;AAAA,MACb,CAAA,MAAA,IAAW,aAAa,KAAA,EAAO;AAC7B,QAAA,MAAM,CAAA;AAAA,MACR,CAAA,MAAO;AACL,QAAA,MAAM,IAAIA,kCAAA,CAAA,mBAAA,qBAAmD;AAAA,MAC/D;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AACF,CAAA;AA5nByBpB,wBAAA,CAAA,YAAA,EAAA,aAAA,CAAA;AAAlB,IAAM,WAAA,GAAN;;;AChCA,SAAS,qBAAA,CACd,SAAA,EACA,cAAA,EACA,aAAA,EACgB;AAEhB,EAAA,MAAM,EAAE,KAAA,EAAO,SAAA,KAAc,qBAAA,CAAsB,SAAA,EAAW,gBAAgB,aAAa,CAAA;AAC3F,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,IAAA,CAAK,UAAK,CAAA;AAEjC,EAAA,OAAO,IAAIkC,gCAAA,CAAA,uBAAA,yBAAoD;AAAA,IAC7D,IAAA,EAAM;AAAA,MACJ,SAAA;AAAA,MACA,KAAA,EAAO,QAAA;AAAA,MACP,WAAW,SAAA,CAAU;AAAA;AACvB,GACD,CAAA;AACH;AAhBgBlC,wBAAA,CAAA,qBAAA,EAAA,uBAAA,CAAA;AAkBhB,SAAS,qBAAA,CACP,SAAA,EACA,cAAA,EACA,KAAA,EACuC;AAEvC,EAAA,IACE,iBAAiBkC,gCAAA,IACjB,KAAA,CAAM,IAAA,KAAA,uBAAA,2BACN,KAAA,CAAM,KAAK,KAAA,EACX;AAEA,IAAA,MAAM,gBAAgB,MAAA,CAAO,KAAA,CAAM,KAAK,KAAK,CAAA,CAAE,MAAM,UAAK,CAAA;AAC1D,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,CAAC,SAAA,EAAW,GAAG,aAAa,CAAA;AAAA,MACnC,WAAW,IAAI,KAAA,CAAM,OAAO,KAAA,CAAM,IAAA,CAAK,SAAS,CAAC;AAAA,KACnD;AAAA,EACF;AAGA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,CAAC,SAAA,EAAW,cAAc,CAAA;AAAA,IACjC,SAAA,EAAW;AAAA,GACb;AACF;AAxBSlC,wBAAA,CAAA,qBAAA,EAAA,uBAAA,CAAA;;;AC1BF,IAAM,iBAAA,GAAN,MAAM,iBAAA,CAAiB;AAAA,EAM5B,WAAA,CACmB,cAAA,EACA,MAAA,EACjB,OAAA,EACA;AAHiB,IAAA,IAAA,CAAA,cAAA,GAAA,cAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AANnB,IAAA,IAAA,CAAiB,QAAA,uBAA2B,GAAA,EAAI;AAChD,IAAA,IAAA,CAAiB,eAAA,uBAAgD,GAAA,EAAI;AAQnE,IAAA,IAAA,CAAK,sBAAA,GAAyB,SAAS,eAAA,IAAmB,IAAA;AAC1D,IAAA,IAAA,CAAK,WAAA,GAAc,IAAI,WAAA,CAAY,IAAA,EAAM;AAAA,MACvC,YAAY,IAAA,CAAK,cAAA;AAAA,MACjB,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AAED,IAAA,IAAI,KAAK,sBAAA,EAAwB;AAC/B,MAAA,IAAA,CAAK,cAAA,EAAe;AAAA,IACtB;AAAA,EACF;AAAA,EAEQ,cAAA,GAAuB;AAC7B,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAElB,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,QAAQ,CAAA,IAAK,IAAA,CAAK,OAAO,eAAA,EAAiB;AAC1D,MAAA,IAAI,OAAO,aAAa,QAAA,EAAU;AAChC,QAAA,IAAI;AACF,UAAA,MAAM,EAAE,GAAA,EAAI,GAAI,eAAA,CAAgB,QAAQ,CAAA;AACxC,UAAA,IAAI,GAAA,EAAK;AACP,YAAA,MAAM,eAAA,GAAkB,IAAI,WAAA,CAAY,GAAA,EAAK,EAAE,MAAA,EAAQ,IAAA,CAAK,QAAQ,CAAA;AACpE,YAAA,MAAM,MAAA,GAAS,gBAAgB,SAAA,EAAU;AACzC,YAAA,IAAI,MAAA,KAAW,IAAA,IAAQ,OAAO,MAAA,KAAW,QAAA,EAAU;AACjD,cAAA,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,IAAA,EAAM,MAAM,CAAA;AAAA,YACvC,CAAA,MAAA,IAAW,OAAO,MAAA,KAAW,QAAA,EAAU;AACrC,cAAA,IAAA,CAAK,gBAAgB,GAAA,CAAI,IAAA,EAAM0B,sCAAoB,MAAA,EAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,YACzE;AAAA,UACF;AAAA,QACF,CAAA,CAAA,MAAQ;AAEN,UAAA,IAAA,CAAK,gBAAgB,GAAA,CAAI,IAAA,EAAMA,sCAAoB,QAAA,EAAU,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,QAC3E;AAAA,MACF,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,gBAAgB,GAAA,CAAI,IAAA,EAAMA,sCAAoB,QAAA,EAAU,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,MAC3E;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,eAAA,GAAwB;AAC9B,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAK,CAAA,IAAK,KAAK,eAAA,EAAiB;AAChD,MAAA,IAAA,CAAK,WAAA,CAAY,SAAA,CAAU,IAAA,EAAM,KAAA,CAAM,gBAAgB,CAAA;AAAA,IACzD;AAAA,EACF;AAAA,EAEA,WAAA,CAAY,WAAoB,GAAA,EAAoB;AAClD,IAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAA,EAAW,GAAG,CAAA;AAAA,EAClC;AAAA,EAEA,YAAY,SAAA,EAAyC;AACnD,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA;AAAA,EACpC;AAAA,EAEA,cAAA,CAAe,WAAoB,aAAA,EAAoC;AACrE,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA;AAEvC,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,OAAO,aAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA,CAAK,qBAAA,CAAsB,SAAA,EAAW,GAAG,CAAA;AAAA,EAClD;AAAA,EAEA,qBAAA,CAAsB,YAAqB,GAAA,EAA2B;AACpE,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,YAAY,gBAAA,EAAiB;AAClC,MAAA,IAAI,KAAK,sBAAA,EAAwB;AAC/B,QAAA,IAAA,CAAK,eAAA,EAAgB;AAAA,MACvB;AACA,MAAA,IAAA,CAAK,WAAA,CAAY,OAAO,GAAG,CAAA;AAC3B,MAAA,OAAO,IAAA,CAAK,YAAY,SAAA,EAAU;AAAA,IACpC,SAAS,KAAA,EAAO;AACd,MAAA,IAAIb,iCAAA,CAAgB,KAAK,CAAA,EAAG;AAC1B,QAAA,OAAO,KAAA;AAAA,MACT;AACA,MAAA,OAAO,IAAI,KAAA,CAAM,2CAAA,EAA6C,EAAE,KAAA,EAAO,OAAO,CAAA;AAAA,IAChF;AAAA,EACF;AAAA,EAEA,oBAAA,CACE,SAAA,EACA,YAAA,EACA,QAAA,EACA,mBAAA,EAC4B;AAC5B,IAAA,KAAA,MAAW,OAAO,YAAA,EAAc;AAE9B,MAAA,MAAM,QAAA,GAAW,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA;AACjC,MAAA,IAAI,oBAAoB,KAAA,EAAO;AAC7B,QAAA,OAAO,qBAAA,CAAsB,SAAA,EAAW,GAAA,EAAK,QAAQ,CAAA;AAAA,MACvD;AAGA,MAAA,IAAI,mBAAA,EAAqB,GAAA,CAAI,GAAG,CAAA,EAAG;AACjC,QAAA,MAAM,KAAA,GAAQ,IAAIqB,gCAAA,CAAA,sBAAA,wBAAmD;AAAA,UACnE,IAAA,EAAM,EAAE,SAAA,EAAW,GAAA;AAAI,SACxB,CAAA;AACD,QAAA,OAAO,qBAAA,CAAsB,SAAA,EAAW,GAAA,EAAK,KAAK,CAAA;AAAA,MACpD;AAAA,IACF;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,wBAAA,CAAyB,WAAoB,KAAA,EAA+B;AAC1E,IAAA,IAAI,EAAE,KAAA,YAAiBpB,kCAAA,CAAA,IAAqB,CAAC,MAAM,KAAA,EAAO;AACxD,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,MAAM,iBAA4B,EAAC;AACnC,IAAA,MAAM,UAAU,KAAA,CAAM,KAAA;AAEtB,IAAA,KAAA,MAAW,CAAC,QAAA,EAAU,UAAU,CAAA,IAAK,OAAA,EAAS;AAC5C,MAAA,MAAM,YAAA,GAAe,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA;AAC7C,MAAA,MAAM,QAAQ,IAAA,CAAK,YAAA,CAAa,UAAU,CAAA,GAAI,UAAA,CAAW,gBAAe,GAAI,UAAA;AAC5E,MAAA,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,YAAA,EAAc,KAAK,CAAA;AAC3C,MAAA,cAAA,CAAe,KAAK,YAAY,CAAA;AAAA,IAClC;AAEA,IAAA,OAAO,cAAA;AAAA,EACT;AAAA,EAEA,oBAAA,CAAqB,WAAoB,KAAA,EAA0B;AACjE,IAAA,IAAI,iBAAiB,KAAA,EAAO;AAC5B,IAAA,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,SAAA,EAAW,KAAK,CAAA;AAAA,EAC1C;AAAA,EAEQ,aAAa,KAAA,EAAsC;AACzD,IAAA,OAAO,OAAA;AAAA,MACL,SACE,OAAO,KAAA,KAAU,QAAA,IACjB,OAAQ,MAAsB,cAAA,KAAmB;AAAA,KACrD;AAAA,EACF;AACF,CAAA;AA9I8Bd,wBAAA,CAAA,iBAAA,EAAA,kBAAA,CAAA;AAAvB,IAAM,gBAAA,GAAN,iBAAA;;;ACjBA,IAAM,uBAAuC,EAAC;;;ACU9C,SAAS,kBAAA,CACd,KAAA,EACA,MAAA,EACA,OAAA,GAA0B,oBAAA,EACH;AAEvB,EAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,IAAY,iBAAiB,KAAA,EAAO;AAChE,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,IAAI,MAAA,CAAO,SAAA,CAAU,KAAK,CAAA,EAAG;AAC3B,MAAA,OAAO,MAAA,CAAO,QAAA,CAAS,KAAA,EAAO,MAAM,CAAA;AAAA,IACtC;AAAA,EACF;AAGA,EAAA,OAAO0B,qCAAA,CAAoB,OAAO,MAAM,CAAA;AAC1C;AAnBgB1B,wBAAA,CAAA,kBAAA,EAAA,oBAAA,CAAA;AAqBT,SAAS,kBACd,KAAA,EACA,SAAA,GAAoB,WACpB,MAAA,EACA,OAAA,GAA0B,sBAC1B,QAAA,EACa;AACb,EAAA,IAAImC,0BAAA,CAAS,KAAK,CAAA,EAAG;AACnB,IAAA,MAAM,YAAyC,EAAC;AAChD,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,GAAG,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC9C,MAAA,SAAA,CAAU,GAAG,CAAA,GAAI,kBAAA,CAAmB,GAAA,EAAK,QAAQ,OAAO,CAAA;AAAA,IAC1D;AACA,IAAA,OAAO,IAAIC,6BAAA,CAAY,SAAA,EAAW,SAAA,EAAW,QAAQ,QAAQ,CAAA;AAAA,EAC/D;AAEA,EAAA,IAAIC,yBAAA,CAAQ,KAAK,CAAA,EAAG;AAClB,IAAA,MAAM,WAAA,GAAc,MAAM,GAAA,CAAI,CAAC,QAAQ,kBAAA,CAAmB,GAAA,EAAK,MAAA,EAAQ,OAAO,CAAgB,CAAA;AAC9F,IAAA,OAAO,IAAID,6BAAA,CAAY,SAAA,EAAW,WAAA,EAAa,QAAQ,QAAQ,CAAA;AAAA,EACjE;AAEA,EAAA,OAAO,IAAIA,6BAAA,CAAY,SAAA,EAAW,KAAA,EAA8B,QAAQ,QAAQ,CAAA;AAClF;AArBgBpC,wBAAA,CAAA,iBAAA,EAAA,mBAAA,CAAA;AAkChB,SAAS,6BACP,WAAA,EACA,aAAA,EACA,cAAA,EACA,MAAA,EACA,UAA0B,oBAAA,EACb;AAEb,EAAA,IAAI,cAAA,CAAe,GAAA,CAAI,WAAW,CAAA,EAAG;AACnC,IAAA,OAAO,cAAA,CAAe,IAAI,WAAW,CAAA;AAAA,EACvC;AAIA,EAAA,IAAImC,0BAAA,CAAS,aAAa,CAAA,EAAG;AAC3B,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,IAAI,MAAA,CAAO,SAAA,CAAU,aAAa,CAAA,EAAG;AACnC,QAAA,OAAO,MAAA,CAAO,QAAA,CAAS,aAAA,EAAe,MAAM,CAAA;AAAA,MAC9C;AAAA,IACF;AAIA,IAAA,MAAM,YAAyC,EAAC;AAChD,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,GAAG,KAAK,MAAA,CAAO,OAAA,CAAQ,aAAa,CAAA,EAAG;AACtD,MAAA,MAAM,SAAA,GAAY,CAAA,EAAG,WAAW,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA;AACvC,MAAA,SAAA,CAAU,GAAG,CAAA,GAAI,4BAAA;AAAA,QACf,SAAA;AAAA,QACA,GAAA;AAAA,QACA,cAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AACA,IAAA,OAAO,IAAIrB,kCAAA,CAAiB,SAAA,EAAW,MAAM,CAAA;AAAA,EAC/C;AAEA,EAAA,IAAIuB,yBAAA,CAAQ,aAAa,CAAA,EAAG;AAC1B,IAAA,MAAM,cAA6B,EAAC;AACpC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,aAAA,CAAc,QAAQ,CAAA,EAAA,EAAK;AAC7C,MAAA,MAAM,SAAA,GAAY,CAAA,EAAG,WAAW,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,CAAA;AACrC,MAAA,WAAA,CAAY,IAAA;AAAA,QACV,6BAA6B,SAAA,EAAW,aAAA,CAAc,CAAC,CAAA,EAAG,cAAA,EAAgB,QAAQ,OAAO;AAAA,OAC3F;AAAA,IACF;AACA,IAAA,OAAO,IAAIV,4BAAA,CAAW,WAAA,EAAa,KAAA,EAAO,MAAM,CAAA;AAAA,EAClD;AAGA,EAAA,OAAO,kBAAA,CAAmB,aAAA,EAAe,MAAA,EAAQ,OAAO,CAAA;AAC1D;AAlDS3B,wBAAA,CAAA,4BAAA,EAAA,8BAAA,CAAA;AAiEF,SAAS,mCAAA,CACd,WACA,cAAA,EACA,aAAA,EACA,YAAoB,SAAA,EACpB,MAAA,EACA,OAAA,GAA0B,oBAAA,EAC1B,QAAA,EACa;AACb,EAAA,IAAImC,0BAAA,CAAS,aAAa,CAAA,EAAG;AAC3B,IAAA,MAAM,YAAyC,EAAC;AAChD,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,GAAG,KAAK,MAAA,CAAO,OAAA,CAAQ,aAAa,CAAA,EAAG;AACtD,MAAA,MAAM,SAAA,GAAY,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA;AACrC,MAAA,SAAA,CAAU,GAAG,CAAA,GAAI,4BAAA;AAAA,QACf,SAAA;AAAA,QACA,GAAA;AAAA,QACA,cAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AACA,IAAA,OAAO,IAAIC,6BAAA,CAAY,SAAA,EAAW,SAAA,EAAW,QAAQ,QAAQ,CAAA;AAAA,EAC/D;AAEA,EAAA,IAAIC,yBAAA,CAAQ,aAAa,CAAA,EAAG;AAC1B,IAAA,MAAM,cAA6B,EAAC;AACpC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,aAAA,CAAc,QAAQ,CAAA,EAAA,EAAK;AAC7C,MAAA,MAAM,SAAA,GAAY,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,CAAA;AACnC,MAAA,WAAA,CAAY,IAAA;AAAA,QACV,6BAA6B,SAAA,EAAW,aAAA,CAAc,CAAC,CAAA,EAAG,cAAA,EAAgB,QAAQ,OAAO;AAAA,OAC3F;AAAA,IACF;AACA,IAAA,OAAO,IAAID,6BAAA,CAAY,SAAA,EAAW,WAAA,EAAa,QAAQ,QAAQ,CAAA;AAAA,EACjE;AAGA,EAAA,OAAO,IAAIA,6BAAA,CAAY,SAAA,EAAW,aAAA,EAAsC,QAAQ,QAAQ,CAAA;AAC1F;AArCgBpC,wBAAA,CAAA,mCAAA,EAAA,qCAAA,CAAA;;;AClIT,IAAM,gBAAA,GAAN,MAAM,gBAAA,CAA4B;AAAA,EAAlC,WAAA,GAAA;AACL,IAAA,IAAA,CAAQ,KAAA,uBAAY,GAAA,EAAe;AAAA,EAAA;AAAA,EAEnC,OAAA,CAAQ,IAAA,EAAS,YAAA,GAA6B,EAAC,EAAS;AACtD,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA,EAAG;AACzB,MAAA,IAAA,CAAK,MAAM,GAAA,CAAI,IAAA,EAAM,IAAI,GAAA,CAAI,YAAY,CAAC,CAAA;AAAA,IAC5C;AAAA,EACF;AAAA,EAEA,WAAW,IAAA,EAAe;AACxB,IAAA,IAAA,CAAK,KAAA,CAAM,OAAO,IAAI,CAAA;AAEtB,IAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,KAAA,CAAM,MAAA,EAAO,EAAG;AACtC,MAAA,IAAA,CAAK,OAAO,IAAI,CAAA;AAAA,IAClB;AAAA,EACF;AAAA,EAEA,QAAA,GAA2B;AACzB,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA;AAAA,EAGA,UAAA,GAAkB;AAChB,IAAA,MAAM,UAAe,EAAC;AACtB,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,IAAI,CAAA,IAAK,KAAK,KAAA,EAAO;AACrC,MAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACnB,QAAA,OAAA,CAAQ,KAAK,IAAI,CAAA;AAAA,MACnB;AAAA,IACF;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA,EAGQ,UAAU,cAAA,EAA0B;AAC1C,IAAA,MAAM,OAAA,uBAAc,GAAA,EAAO;AAC3B,IAAA,MAAM,cAAA,uBAAqB,GAAA,EAAO;AAClC,IAAA,MAAM,OAAY,EAAC;AAEnB,IAAA,MAAM,GAAA,6CAAO,IAAA,KAAqB;AAChC,MAAA,OAAA,CAAQ,IAAI,IAAI,CAAA;AAChB,MAAA,cAAA,CAAe,IAAI,IAAI,CAAA;AACvB,MAAA,IAAA,CAAK,KAAK,IAAI,CAAA;AAEd,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA;AAChC,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,UAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA,EAAG;AACrB,YAAA,IAAI,GAAA,CAAI,GAAG,CAAA,EAAG;AACZ,cAAA,OAAO,IAAA;AAAA,YACT;AAAA,UACF,CAAA,MAAA,IAAW,cAAA,CAAe,GAAA,CAAI,GAAG,CAAA,EAAG;AAClC,YAAA,OAAO,IAAA;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAEA,MAAA,IAAA,CAAK,GAAA,EAAI;AACT,MAAA,cAAA,CAAe,OAAO,IAAI,CAAA;AAC1B,MAAA,OAAO,KAAA;AAAA,IACT,CAAA,EArBY,KAAA,CAAA;AAuBZ,IAAA,KAAA,MAAW,QAAQ,cAAA,EAAgB;AACjC,MAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA,EAAG;AACtB,QAAA,IAAI,GAAA,CAAI,IAAI,CAAA,EAAG;AACb,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,cAAA;AAAA,EACT;AAAA;AAAA,EAGA,eAAA,GAAuB;AACrB,IAAA,MAAM,QAAA,uBAAe,GAAA,EAAe;AACpC,IAAA,MAAM,SAAc,EAAC;AAGrB,IAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,KAAA,CAAM,IAAA,EAAK,EAAG;AACpC,MAAA,QAAA,CAAS,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA,IACtB;AACA,IAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,KAAA,CAAM,MAAA,EAAO,EAAG;AACtC,MAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,QAAA,QAAA,CAAS,IAAI,GAAA,EAAA,CAAM,QAAA,CAAS,IAAI,GAAG,CAAA,IAAK,KAAK,CAAC,CAAA;AAAA,MAChD;AAAA,IACF;AAGA,IAAA,MAAM,QAAa,EAAC;AACpB,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,MAAM,CAAA,IAAK,QAAA,EAAU;AACrC,MAAA,IAAI,WAAW,CAAA,EAAG;AAChB,QAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,MACjB;AAAA,IACF;AAEA,IAAA,OAAO,KAAA,CAAM,SAAS,CAAA,EAAG;AACvB,MAAA,MAAM,IAAA,GAAO,MAAM,KAAA,EAAM;AACzB,MAAA,IAAI,SAAS,MAAA,EAAW;AACxB,MAAA,MAAA,CAAO,KAAK,IAAI,CAAA;AAGhB,MAAA,MAAM,OAAO,IAAA,CAAK,KAAA,CAAM,IAAI,IAAI,CAAA,wBAAS,GAAA,EAAI;AAC7C,MAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,QAAA,MAAM,SAAA,GAAA,CAAa,QAAA,CAAS,GAAA,CAAI,GAAG,KAAK,CAAA,IAAK,CAAA;AAC7C,QAAA,QAAA,CAAS,GAAA,CAAI,KAAK,SAAS,CAAA;AAC3B,QAAA,IAAI,cAAc,CAAA,EAAG;AACnB,UAAA,KAAA,CAAM,KAAK,GAAG,CAAA;AAAA,QAChB;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IAAI,MAAA,CAAO,MAAA,KAAW,IAAA,CAAK,KAAA,CAAM,IAAA,EAAM;AACrC,MAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAI,MAAM,CAAA;AAChC,MAAA,MAAM,iBAAsB,EAAC;AAC7B,MAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,KAAA,CAAM,IAAA,EAAK,EAAG;AACpC,QAAA,IAAI,CAAC,SAAA,CAAU,GAAA,CAAI,IAAI,CAAA,EAAG;AACxB,UAAA,cAAA,CAAe,KAAK,IAAI,CAAA;AAAA,QAC1B;AAAA,MACF;AACA,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,SAAA,CAAU,cAAc,CAAA;AAC3C,MAAA,MAAM,SAAS,CAAA,EAAG,KAAA,CAAM,IAAI,CAAC,CAAA,KAAM,OAAO,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,UAAK,CAAC,CAAA,QAAA,EAAM,OAAO,KAAA,CAAM,CAAC,CAAC,CAAC,CAAA,CAAA;AAC/E,MAAA,MAAM,IAAIkC,gCAAA,CAAA,0BAAA,4BAAuD;AAAA,QAC/D,IAAA,EAAM,EAAE,MAAA;AAAO,OAChB,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AACF,CAAA;AAjIyClC,wBAAA,CAAA,gBAAA,EAAA,iBAAA,CAAA;AAAlC,IAAM,eAAA,GAAN,gBAAA;;;ACOP,IAAM,wBAAA,GAA2B,kBAAA;AAG1B,SAAS,kBAAkB,IAAA,EAAuB;AACvD,EAAA,OAAO,KAAK,MAAA,GAAS,CAAA,IAAK,CAAC,wBAAA,CAAyB,KAAK,IAAI,CAAA;AAC/D;AAFgBA,wBAAA,CAAA,iBAAA,EAAA,mBAAA,CAAA;AAKT,SAAS,eAAe,IAAA,EAAwB;AACrD,EAAA,OAAO,IAAA,CAAK,MAAM,GAAG,CAAA;AACvB;AAFgBA,wBAAA,CAAA,cAAA,EAAA,gBAAA,CAAA;AAKT,SAAS,kBAAkB,IAAA,EAAuB;AACvD,EAAA,OAAO,cAAA,CAAe,IAAI,CAAA,CAAE,KAAA,CAAM,iBAAiB,CAAA;AACrD;AAFgBA,wBAAA,CAAA,iBAAA,EAAA,mBAAA,CAAA;;;ACfhB,SAAS,mBAAA,CAAoB,OAAgB,OAAA,EAAkC;AAC7E,EAAA,IAAI,CAACmC,0BAAA,CAAS,KAAK,CAAA,EAAG,OAAO,KAAA;AAC7B,EAAA,OAAO,QAAQ,IAAA,CAAK,CAAC,WAAW,MAAA,CAAO,SAAA,CAAU,KAAK,CAAC,CAAA;AACzD;AAHSnC,wBAAA,CAAA,mBAAA,EAAA,qBAAA,CAAA;AA6BF,SAAS,mBAAA,CACd,KAAA,EACA,UAAA,EACA,aAAA,GAAgC,oBAAA,EACX;AACrB,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAoB;AAEvC,EAAA,MAAM,YAAA,mBAAeA,wBAAA,CAAA,CAAC,GAAA,EAAc,IAAA,KAAiB;AACnD,IAAA,IAAIsC,0BAAA,CAAS,GAAG,CAAA,EAAG;AACjB,MAAA,MAAA,CAAO,GAAA,CAAI,MAAM,GAAG,CAAA;AAAA,IACtB,CAAA,MAAA,IAAWH,0BAAA,CAAS,GAAG,CAAA,EAAG;AAExB,MAAA,IAAI,mBAAA,CAAoB,GAAA,EAAK,aAAa,CAAA,EAAG;AAC3C,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,MAAA,GAAS,mBAAA,CAAoB,GAAA,EAAK,IAAA,EAAM,aAAa,CAAA;AAC3D,MAAA,KAAA,MAAW,CAAC,UAAA,EAAY,SAAS,CAAA,IAAK,MAAA,EAAQ;AAC5C,QAAA,MAAA,CAAO,GAAA,CAAI,YAAY,SAAS,CAAA;AAAA,MAClC;AAAA,IACF,CAAA,MAAA,IAAWE,yBAAA,CAAQ,GAAG,CAAA,EAAG;AAEvB,MAAA,MAAM,MAAA,GAAS,mBAAA,CAAoB,GAAA,EAAK,IAAA,EAAM,aAAa,CAAA;AAC3D,MAAA,KAAA,MAAW,CAAC,UAAA,EAAY,SAAS,CAAA,IAAK,MAAA,EAAQ;AAC5C,QAAA,MAAA,CAAO,GAAA,CAAI,YAAY,SAAS,CAAA;AAAA,MAClC;AAAA,IACF;AAAA,EACF,CAAA,EApBqB,cAAA,CAAA;AAsBrB,EAAA,IAAIF,0BAAA,CAAS,KAAK,CAAA,EAAG;AACnB,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,GAAG,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC9C,MAAA,YAAA,CAAa,GAAA,EAAK,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,GAAG,CAAA,CAAE,CAAA;AAAA,IAC1C;AAAA,EACF,CAAA,MAAA,IAAWE,yBAAA,CAAQ,KAAK,CAAA,EAAG;AACzB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,MAAA,YAAA,CAAa,MAAM,CAAC,CAAA,EAAG,GAAG,UAAU,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,IAC9C;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAxCgBrC,wBAAA,CAAA,mBAAA,EAAA,qBAAA,CAAA;;;ACnBT,SAAS,cAAc,IAAA,EAAmC;AAC/D,EAAA,OAAOsC,0BAAA,CAAS,IAAI,CAAA,GAAI,IAAA,GAAO,IAAA,CAAK,MAAA;AACtC;AAFgBtC,wBAAA,CAAA,aAAA,EAAA,eAAA,CAAA;AAIT,SAAS,cAAc,KAAA,EAAsC;AAClE,EAAA,OAAOsC,2BAAS,KAAK,CAAA,GAAI,EAAE,MAAA,EAAQ,OAAM,GAAI,KAAA;AAC/C;AAFgBtC,wBAAA,CAAA,aAAA,EAAA,eAAA,CAAA;AAoBT,SAAS,mBAAA,CACd,GAAA,EACA,iBAAA,GAAoB,EAAA,EACI;AACxB,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAuB;AAE1C,EAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AACjD,IAAA,IAAI,MAAA,CAAO,UAAA,CAAW,GAAG,CAAA,EAAG;AAC1B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAO,iBAAA,GAAoB,CAAA,EAAG,iBAAiB,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA,GAAK,MAAA;AAEpE,IAAA,IAAImC,0BAAA,CAAS,KAAK,CAAA,EAAG;AACnB,MAAA,MAAM,QAAA,GAAW,KAAA;AACjB,MAAA,MAAM,aAAaI,2BAAA,CAAU,CAAC,QAAA,EAAU,OAAO,GAAG,QAAQ,CAAA;AAE1D,MAAA,IAAI,eAAe,MAAA,EAAW;AAE5B,QAAA,MAAM,YAAY,QAAA,CAAS,KAAA;AAC3B,QAAA,MAAM,gBAAgB,QAAA,CAAS,SAAA;AAC/B,QAAA,MAAM,SAAA,GAAuB;AAAA,UAC3B,MAAA,EAAQ,UAAA;AAAA,UACR,GAAI,SAAA,KAAc,MAAA,IAAa,EAAE,KAAA,EAAO,MAAA,CAAO,SAAS,CAAA,EAAE;AAAA,UAC1D,GAAI,aAAA,KAAkB,MAAA,IAAa,EAAE,WAAW,aAAA;AAAc,SAChE;AACA,QAAA,MAAA,CAAO,GAAA,CAAI,MAAM,SAAS,CAAA;AAAA,MAC5B,CAAA,MAEK;AACH,QAAA,MAAM,MAAA,GAAS,mBAAA,CAAoB,QAAA,EAAU,IAAI,CAAA;AACjD,QAAA,KAAA,MAAW,CAAC,SAAA,EAAW,WAAW,CAAA,IAAK,MAAA,EAAQ;AAC7C,UAAA,MAAA,CAAO,GAAA,CAAI,WAAW,WAAW,CAAA;AAAA,QACnC;AAAA,MACF;AAAA,IACF,CAAA,MAEK;AACH,MAAA,MAAA,CAAO,GAAA,CAAI,IAAA,EAAM,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,IACpC;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AA3CgBvC,wBAAA,CAAA,mBAAA,EAAA,qBAAA,CAAA;AA6CT,SAAS,qBAAqB,KAAA,EAA2B;AAC9D,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,EAAE,QAAQ,KAAA,EAAM;AAAA,EACzB;AACA,EAAA,IAAImC,0BAAA,CAAS,KAAK,CAAA,IAAK,QAAA,IAAY,KAAA,EAAO;AACxC,IAAA,MAAM,GAAA,GAAM,KAAA;AACZ,IAAA,MAAM,WAAW,GAAA,CAAI,SAAA;AACrB,IAAA,OAAO;AAAA,MACL,QAAQ,GAAA,CAAI,MAAA;AAAA,MACZ,GAAIG,2BAAS,GAAA,CAAI,KAAK,KAAK,EAAE,KAAA,EAAO,IAAI,KAAA,EAAM;AAAA,MAC9C,GAAI,QAAA,KAAa,MAAA,IAAa,EAAE,WAAW,QAAA;AAAS,KACtD;AAAA,EACF;AACA,EAAA,OAAO,EAAE,QAAQ,KAAA,EAAM;AACzB;AAdgBtC,wBAAA,CAAA,oBAAA,EAAA,sBAAA,CAAA;AAgBT,SAAS,YAAY,MAAA,EAAyD;AACnF,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAuB;AACvC,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACjD,IAAA,GAAA,CAAI,GAAA,CAAI,GAAA,EAAK,oBAAA,CAAqB,KAAK,CAAC,CAAA;AAAA,EAC1C;AACA,EAAA,OAAO,GAAA;AACT;AANgBA,wBAAA,CAAA,WAAA,EAAA,aAAA,CAAA;AAQT,SAAS,SAAS,GAAA,EAAuC;AAC9D,EAAA,OAAO,OAAO,IAAA,CAAK,GAAG,CAAA,CAAE,IAAA,CAAK,CAAC,GAAA,KAAQ;AACpC,IAAA,MAAM,KAAA,GAAQ,IAAI,GAAG,CAAA;AACrB,IAAA,OAAOmC,2BAAS,KAAK,CAAA,IAAK,CAAC,GAAA,CAAI,WAAW,GAAG,CAAA;AAAA,EAC/C,CAAC,CAAA;AACH;AALgBnC,wBAAA,CAAA,QAAA,EAAA,UAAA,CAAA;;;AC5GT,IAAK,kBAAA,qBAAAwC,mBAAAA,KAAL;AACL,EAAAA,oBAAA,OAAA,CAAA,GAAQ,OAAA;AACR,EAAAA,oBAAA,SAAA,CAAA,GAAU,SAAA;AACV,EAAAA,oBAAA,MAAA,CAAA,GAAO,MAAA;AAHG,EAAA,OAAAA,mBAAAA;AAAA,CAAA,EAAA,kBAAA,IAAA,EAAA;;;ACgEZ,SAAS,2BAAA,CACP,MAAA,EACA,SAAA,EACA,SAAA,EACA,KAAA,EACmB;AACnB,EAAA,IAAI,CAAC,MAAA,EAAQ,YAAA,EAAc,OAAO,EAAC;AACnC,EAAA,IAAI,CAAC,MAAA,CAAO,YAAA,CAAa,cAAc,SAAS,CAAA,SAAU,EAAC;AAE3D,EAAA,IAAI,UAAU,IAAA,IAAQ,OAAO,KAAA,KAAU,QAAA,SAAiB,EAAC;AAEzD,EAAA,IAAI,eAAA;AAEJ,EAAA,IAAI,iBAAiBJ,6BAAA,EAAa;AAChC,IAAA,MAAM,aAAa,KAAA,CAAM,KAAA;AACzB,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,UAAU,CAAA,EAAG;AAC7B,MAAA,eAAA,GAAkB,IAAIT,4BAAA,CAAW,UAAA,EAAY,KAAA,EAAO,MAAM,CAAA;AAAA,IAC5D,CAAA,MAAA,IAAW,sBAAsB,GAAA,EAAK;AACpC,MAAA,eAAA,GAAkB,IAAIb,kCAAA,CAAiB,UAAA,EAAY,MAAM,CAAA;AAAA,IAC3D,CAAA,MAAO;AACL,MAAA,eAAA,GAAkB,KAAA;AAAA,IACpB;AAAA,EACF,WAAW,OAAO,KAAA,KAAU,YAAY,KAAA,KAAU,IAAA,IAAQ,UAAU,KAAA,EAAO;AACzE,IAAA,eAAA,GAAkB,KAAA;AAAA,EACpB,CAAA,MAAO;AACL,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,MAAM,iBAAA,GAAoB,MAAA,CAAO,YAAA,CAAa,QAAA,CAAS,WAAW,eAA8B,CAAA;AAEhG,EAAA,MAAM,SAA4B,EAAC;AACnC,EAAA,KAAA,MAAW,UAAU,iBAAA,EAAmB;AACtC,IAAA,IAAI,CAAC,MAAA,CAAO,KAAA,IAAS,MAAA,CAAO,KAAA,EAAO;AACjC,MAAA,MAAM2B,SAAAA,GAAW,MAAA,CAAO,IAAA,IAAQ,MAAA,CAAO,KAAK,MAAA,GAAS,CAAA;AACrD,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,MAAM,MAAA,CAAO,KAAA;AAAA,QACb,QAAA,EAAA,SAAA;AAAA,QACA,OAAA,EAASA,SAAAA,GACL,CAAA,qBAAA,EAAwB,MAAA,CAAO,MAAM,IAAA,CAAK,GAAG,CAAC,CAAA,EAAA,EAAK,MAAA,CAAO,KAAK,CAAA,CAAA,GAC/D,CAAA,yBAAA,EAA4B,OAAO,KAAK,CAAA,CAAA;AAAA,QAC5C,SAAA;AAAA,QACA,MAAM,MAAA,CAAO,IAAA;AAAA,QACb,IAAA,EAAMA,SAAAA,GACF,EAAE,SAAA,EAAW,MAAA,CAAO,WAAW,eAAA,EAAiB,SAAA,EAAU,GAC1D,EAAE,SAAA;AAAU,OACjB,CAAA;AAAA,IACH;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAjDSzC,wBAAA,CAAA,2BAAA,EAAA,6BAAA,CAAA;AAyDT,SAAS,eAAe,SAAA,EAAwC;AAC9D,EAAA,MAAM,SAA8B,EAAC;AACrC,EAAA,IAAI,SAAA,GAAY,SAAA;AAEhB,EAAA,OAAO,SAAA,CAAU,SAAS,CAAA,EAAG;AAE3B,IAAA,MAAM,UAAA,GAAa,SAAA,CAAU,KAAA,CAAM,YAAY,CAAA;AAC/C,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAA,CAAO,KAAK,QAAA,CAAS,UAAA,CAAW,CAAC,CAAA,EAAG,EAAE,CAAC,CAAA;AACvC,MAAA,SAAA,GAAY,SAAA,CAAU,SAAA,CAAU,UAAA,CAAW,CAAC,EAAE,MAAM,CAAA;AACpD,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,SAAA,GAAY,SAAA,CAAU,KAAA,CAAM,gBAAgB,CAAA;AAClD,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,MAAA,CAAO,IAAA,CAAK,SAAA,CAAU,CAAC,CAAC,CAAA;AACxB,MAAA,SAAA,GAAY,SAAA,CAAU,SAAA,CAAU,SAAA,CAAU,CAAC,EAAE,MAAM,CAAA;AACnD,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,SAAA,CAAU,UAAA,CAAW,GAAG,CAAA,EAAG;AAC7B,MAAA,SAAA,GAAY,SAAA,CAAU,UAAU,CAAC,CAAA;AACjC,MAAA;AAAA,IACF;AAGA,IAAA;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAhCSA,wBAAA,CAAA,cAAA,EAAA,gBAAA,CAAA;AAsCT,SAAS,sBAAA,CACP,KAAA,EACA,WAAA,EACA,IAAA,EACiB;AACjB,EAAA,OAAO;AAAA,IACL,MAAM,KAAA,CAAM,IAAA;AAAA,IACZ,QAAA,EAAA,OAAA;AAAA,IACA,OAAA,EAAS,IAAA,CAAK,MAAA,GAAS,CAAA,GAAI,CAAA,SAAA,EAAY,IAAA,CAAK,IAAA,CAAK,GAAG,CAAC,CAAA,EAAA,EAAK,KAAA,CAAM,OAAO,KAAK,KAAA,CAAM,OAAA;AAAA,IAClF,SAAA,EAAW,WAAA;AAAA,IACX,IAAA;AAAA,IACA,MAAM,KAAA,CAAM,IAAA;AAAA,IACZ,MAAM,KAAA,CAAM;AAAA,GACd;AACF;AAdSA,wBAAA,CAAA,sBAAA,EAAA,wBAAA,CAAA;AA6DF,SAAS,uBAAA,CACd,WACA,KAAA,EAIA;AAEA,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAA2B;AACnD,EAAA,MAAM,UAAA,GAAa,MAAM,QAAA,EAAS;AAElC,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,YAAY,CAAA,IAAK,UAAA,EAAY;AAC7C,IAAA,KAAA,MAAW,OAAO,YAAA,EAAc;AAC9B,MAAA,IAAI,CAAC,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA,EAAG;AACzB,QAAA,WAAA,CAAY,GAAA,CAAI,GAAA,kBAAK,IAAI,GAAA,EAAK,CAAA;AAAA,MAChC;AACA,MAAA,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA,EAAG,GAAA,CAAI,IAAI,CAAA;AAAA,IAChC;AAAA,EACF;AAGA,EAAA,MAAM,cAAA,uBAAqB,GAAA,EAAa;AACxC,EAAA,MAAM,KAAA,GAAmB,CAAC,SAAS,CAAA;AACnC,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAa;AAEjC,EAAA,OAAO,KAAA,CAAM,SAAS,CAAA,EAAG;AACvB,IAAA,MAAM,OAAA,GAAU,MAAM,KAAA,EAAM;AAC5B,IAAA,IAAI,OAAA,KAAY,MAAA,IAAa,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,EAAG;AAEnD,IAAA,OAAA,CAAQ,IAAI,OAAO,CAAA;AACnB,IAAA,cAAA,CAAe,IAAI,OAAO,CAAA;AAG1B,IAAA,MAAM,UAAA,GAAa,WAAA,CAAY,GAAA,CAAI,OAAO,CAAA;AAC1C,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,QAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA,EAAG;AAC3B,UAAA,KAAA,CAAM,KAAK,SAAS,CAAA;AAAA,QACtB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,QAAA,GAAW,IAAI,eAAA,EAAyB;AAC9C,EAAA,KAAA,MAAW,SAAS,cAAA,EAAgB;AAClC,IAAA,MAAM,YAAA,GAAe,UAAA,CAAW,GAAA,CAAI,KAAK,CAAA;AACzC,IAAA,IAAI,YAAA,EAAc;AAEhB,MAAA,MAAM,YAAA,uBAAmB,GAAA,EAAa;AACtC,MAAA,KAAA,MAAW,OAAO,YAAA,EAAc;AAC9B,QAAA,IAAI,cAAA,CAAe,GAAA,CAAI,GAAG,CAAA,EAAG;AAC3B,UAAA,YAAA,CAAa,IAAI,GAAG,CAAA;AAAA,QACtB;AAAA,MACF;AACA,MAAA,QAAA,CAAS,OAAA,CAAQ,OAAO,YAAY,CAAA;AAAA,IACtC,CAAA,MAAO;AACL,MAAA,QAAA,CAAS,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAAA,IAC5B;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,cAAA;AAAA,IACR;AAAA,GACF;AACF;AAjEgBA,wBAAA,CAAA,uBAAA,EAAA,yBAAA,CAAA;AAmEhB,IAAM,eAAA,GAAN,MAAM,eAAA,CAAe;AAAA,EAkCnB,YAA6B,MAAA,EAAwB;AAAxB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AA7B7B,IAAA,IAAA,CAAiB,KAAA,GAAQ,IAAI,eAAA,EAAyB;AACtD,IAAA,IAAA,CAAiB,QAAA,uBAA+B,GAAA,EAAI;AACpD,IAAA,IAAA,CAAiB,UAAA,uBAAqC,GAAA,EAAI;AAC1D,IAAA,IAAA,CAAiB,cAAA,uBAAuC,GAAA,EAAI;AAC5D,IAAA,IAAA,CAAiB,iBAAA,uBAAsC,GAAA,EAAI;AAC3D,IAAA,IAAA,CAAiB,UAAA,uBAA+B,GAAA,EAAI;AAYpD;AAAA,IAAA,IAAA,CAAiB,aAAA,uBAAkC,GAAA,EAAI;AACvD,IAAA,IAAA,CAAiB,gBAAA,uBAAqC,GAAA,EAAI;AAG1D;AAAA,IAAA,IAAA,CAAiB,MAAA,uBAAwB,GAAA,EAAI;AAG7C;AAAA,IAAA,IAAA,CAAQ,gBAA2B,EAAC;AAGpC;AAAA,IAAA,IAAA,CAAQ,mBAAA,uBAAwC,GAAA,EAAI;AAGlD,IAAA,MAAM,EAAE,MAAA,EAAQ,SAAA,EAAW,MAAA,EAAQ,eAAc,GAAI,MAAA;AAErD,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,aAAA,GAAgB,aAAA;AAGrB,IAAA,IAAA,CAAK,iBAAA,GAAoB,IAAI,iBAAA,EAAkB;AAC/C,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAI,aAAA,CAAc,MAAM,CAAA;AAC7C,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAI,gBAAA,CAAiB,IAAA,CAAK,gBAAgB,MAAM,CAAA;AAGxE,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAI,gBAAA,EAAiB;AAC7C,IAAA,IAAA,CAAK,WAAW,IAAI,kBAAA;AAAA,MAClB,IAAA,CAAK,iBAAA;AAAA,MACL,IAAA,CAAK,aAAA;AAAA,MACL,IAAA,CAAK,gBAAA;AAAA,MACL,IAAA,CAAK,iBAAA;AAAA,MACL,IAAA,CAAK,UAAA;AAAA,MACL,CAAC,SAAA,KAAc,IAAA,CAAK,kBAAA,CAAmB,SAAS,CAAA;AAAA,MAChD,CAAC,MAAA,EAAQ,KAAA,KAAU,IAAA,CAAK,qBAAA,CAAsB,QAAQ,KAAK;AAAA,KAC7D;AAAA,EACF;AAAA,EAEQ,QAAA,CAAS,WAAoB,KAAA,EAA2B;AAC9D,IAAA,MAAM,WAAW,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,SAAS,KAAK,EAAC;AAChD,IAAA,IAAA,CAAK,OAAO,GAAA,CAAI,SAAA,EAAW,CAAC,GAAG,QAAA,EAAU,KAAK,CAAC,CAAA;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,gBAAA,CAAiB,WAAA,EAAqB,SAAA,EAAmB,KAAA,EAA4B;AAC3F,IAAA,MAAM,IAAA,GAAO,eAAe,SAAS,CAAA;AACrC,IAAA,MAAM,KAAA,GAAQ,sBAAA,CAAuB,KAAA,EAAO,WAAA,EAAa,IAAI,CAAA;AAE7D,IAAA,IAAA,CAAK,QAAA,CAAS,aAAa,KAAK,CAAA;AAAA,EAClC;AAAA,EAEQ,oBAAoB,KAAA,EAA6B;AACvD,IAAA,IAAIa,iCAAA,CAAgB,KAAK,CAAA,EAAG;AAC1B,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAIqB,gCAAA,CAAA,4BAAA,8BAAyD;AAAA,MAClE,IAAA,EAAM,EAAE,KAAA,EAAO,KAAA,CAAM,OAAA;AAAQ,KAC9B,CAAA;AAAA,EACH;AAAA,EAEQ,YAAA,CAAa,OAAA,EAAkB,KAAA,EAAsB,KAAA,EAA8B;AAGzF,IAAA,MAAM,aAAA,GAAgB,KAAK,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA,IAAK,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,OAAO,CAAA;AAEhF,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,OAAA,EAAS,KAAK,CAAA;AAChC,MAAA,IAAA,CAAK,SAAA,EAAW,OAAA,GAAU,OAAA,EAAS,KAAA,EAAO,KAAK,CAAA;AAG/C,MAAA,IAAI,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,OAAO,CAAA,EAAG;AACnC,QAAA,MAAM,EAAE,WAAA,EAAa,SAAA,EAAU,GAAI,IAAA,CAAK,wBAAwB,OAAO,CAAA;AACvE,QAAA,IAAI,WAAA,EAAa;AACf,UAAA,IAAA,CAAK,gBAAA,CAAiB,WAAA,EAAa,SAAA,EAAW,KAAK,CAAA;AAAA,QACrD,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,QAAA,CAAS,SAAS,KAAK,CAAA;AAAA,QAC9B;AAAA,MACF,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,QAAA,CAAS,SAAS,KAAK,CAAA;AAAA,MAC9B;AAEA,MAAA,IAAA,CAAK,aAAA,CAAc,KAAK,OAAO,CAAA;AAC/B,MAAA,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAA;AAAA,IAChC;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,eAAA,CAAgB,WAAoB,KAAA,EAAgC;AAE1E,IAAA,IAAI,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,SAAS,CAAA,EAAG;AAEvC,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,SAAS,CAAA;AAC3C,IAAA,MAAM,SAAA,GACJ,aAAa,OAAO,SAAA,KAAc,YAAY,OAAA,IAAW,SAAA,GACrD,UAAU,KAAA,GACV,MAAA;AAGN,IAAA,IAAA,CAAK,iBAAA,CAAkB,SAAA,EAAW,SAAA,EAAW,KAAK,CAAA;AAAA,EACpD;AAAA,EAEQ,iBAAA,CACN,SAAA,EACA,SAAA,EACA,KAAA,EACM;AACN,IAAA,IAAI,CAAC,SAAA,EAAW;AAChB,IAAA,KAAA,MAAW,SAAS,2BAAA,CAA4B,IAAA,CAAK,QAAQ,SAAA,EAAW,SAAA,EAAW,KAAK,CAAA,EAAG;AACzF,MAAA,IAAA,CAAK,QAAA,CAAS,WAAW,KAAK,CAAA;AAAA,IAChC;AAAA,EACF;AAAA,EAEQ,0BAAA,CAA2B,WAAoB,KAAA,EAAgC;AACrF,IAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAA,EAAW,KAAK,CAAA;AAClC,IAAA,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,SAAA,EAAW,KAAK,CAAA;AACxC,IAAA,IAAA,CAAK,SAAA,EAAW,SAAA,GAAY,SAAA,EAAW,KAAK,CAAA;AAC5C,IAAA,IAAA,CAAK,eAAA,CAAgB,WAAW,KAAK,CAAA;AACrC,IAAA,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,SAAA,EAAW,EAAE,CAAA;AAChC,IAAA,IAAA,CAAK,aAAA,CAAc,KAAK,SAAS,CAAA;AAAA,EACnC;AAAA,EAEQ,kBAAA,CAAmB,SAAkB,KAAA,EAA8C;AACzF,IAAA,IAAI;AACF,MAAA,OAAO,gBAAgB,KAAK,CAAA;AAAA,IAC9B,SAAS,KAAA,EAAO;AACd,MAAA,IAAIrB,iCAAA,CAAgB,KAAK,CAAA,EAAG;AAC1B,QAAA,OAAO,IAAA,CAAK,YAAA,CAAa,OAAA,EAAS,KAAA,EAAO,KAAK,CAAA;AAAA,MAChD;AACA,MAAA,OAAO,IAAA,CAAK,YAAA;AAAA,QACV,OAAA;AAAA,QACA,IAAIqB,gCAAA,CAAA,4BAAA,8BAAyD;AAAA,UAC3D,IAAA,EAAM,EAAE,KAAA,EAAO,KAAA,YAAiB,QAAQ,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAA;AAAE,SACvE,CAAA;AAAA,QACD;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,kBAAA,CAAmB,SAAA,EAAoB,GAAA,EAAc,YAAA,EAAkC;AAC7F,IAAA,IAAA,CAAK,gBAAA,CAAiB,WAAA,CAAY,SAAA,EAAW,GAAG,CAAA;AAEhD,IAAA,IAAI,YAAA,CAAa,OAAO,CAAA,EAAG;AACzB,MAAA,IAAA,CAAK,WAAW,GAAA,CAAI,SAAA,EAAW,EAAE,GAAA,EAAK,cAAc,CAAA;AAAA,IACtD;AAEA,IAAA,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,SAAA,EAAW,YAAY,CAAA;AAE1C,IAAA,KAAA,MAAW,OAAO,YAAA,EAAc;AAC9B,MAAA,IAAI,IAAA,CAAK,aAAA,CAAc,SAAA,CAAU,GAAG,CAAA,IAAK,CAAC,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA,EAAG;AAC9D,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA,EAAG;AAE5B,MAAA,IAAA,CAAK,iBAAA,CAAkB,kBAAA,CAAmB,SAAA,EAAW,GAAG,CAAA;AAExD,MAAA,IAAI,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA,EAAG;AAE1B,MAAA,MAAM,cAAc,IAAA,CAAK,aAAA,CAAc,eAAA,CAAgB,GAAA,EAAK,KAAK,MAAM,CAAA;AACvE,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,IAAA,CAAK,aAAA,CAAc,eAAA,CAAgB,WAAA,EAAa,GAAG,CAAA;AACnD,QAAA;AAAA,MACF;AAIA,MAAA,IAAI,CAAC,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,GAAG,KAAK,CAAC,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA,IAAK,CAAC,KAAK,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA,EAAG;AACrF,QAAA,IAAA,CAAK,mBAAA,CAAoB,IAAI,GAAG,CAAA;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AAAA,EAEO,OAAA,GAA2B;AAChC,IAAA,IAAA,CAAK,kBAAA,EAAmB;AACxB,IAAA,IAAA,CAAK,qBAAA,EAAsB;AAC3B,IAAA,IAAA,CAAK,oBAAA,EAAqB;AAC1B,IAAA,IAAA,CAAK,2BAAA,EAA4B;AACjC,IAAA,IAAA,CAAK,kBAAA,EAAmB;AACxB,IAAA,OAAO;AAAA,MACL,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,QAAQ,IAAA,CAAK,MAAA,CAAO,IAAA,GAAO,CAAA,GAAI,KAAK,MAAA,GAAS;AAAA,KAC/C;AAAA,EACF;AAAA;AAAA,EAGO,QAAA,GAAqC;AAC1C,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA,EAEO,iBAAA,GAAoD;AACzD,IAAA,OAAO,IAAA,CAAK,cAAA;AAAA,EACd;AAAA,EAEO,mBAAA,GAAwC;AAC7C,IAAA,OAAO,IAAA,CAAK,gBAAA;AAAA,EACd;AAAA,EAEO,gBAAA,GAAiC;AACtC,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EACd;AAAA,EAEO,MAAM,SAAA,EAAoD;AAC/D,IAAA,MAAM,EAAE,MAAA,EAAQ,SAAA,EAAU,GAAI;AAAA,MAC5B,GAAG,IAAA,CAAK,MAAA;AAAA,MACR,GAAG;AAAA,KACL;AAEA,IAAA,MAAM,QAAA,GAAW,IAAI,eAAA,CAAe;AAAA,MAClC,MAAA;AAAA,MACA,SAAA;AAAA,MACA,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,eAAe,IAAA,CAAK;AAAA,KACrB,CAAA;AAED,IAAA,IAAI,SAAA,CAAU,YAAA,IAAgB,SAAA,CAAU,MAAA,EAAQ;AAC9C,MAAA,KAAA,MAAW,CAAC,SAAA,EAAW,KAAK,CAAA,IAAK,UAAU,YAAA,EAAc;AACvD,QAAA,IAAI,CAAC,SAAA,CAAU,MAAA,CAAO,GAAA,CAAI,SAAS,CAAA,EAAG;AACpC,UAAA,QAAA,CAAS,cAAA,CAAe,GAAA,CAAI,SAAA,EAAW,KAAK,CAAA;AAAA,QAC9C;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,kBAAA,GAA2B;AACjC,IAAA,IAAA,CAAK,gBAAgB,EAAC;AAEtB,IAAA,KAAA,MAAW,CAAC,SAAA,EAAW,SAAS,KAAK,IAAA,CAAK,MAAA,CAAO,SAAQ,EAAG;AAG1D,MAAA,IAAI,CAAC,iBAAA,CAAkB,SAAS,CAAA,EAAG;AACjC,QAAA,IAAA,CAAK,SAAS,SAAA,EAAW;AAAA,UACvB,IAAA,EAAM,oBAAA;AAAA,UACN,QAAA,EAAA,OAAA;AAAA,UACA,OAAA,EAAS,UAAU,SAAS,CAAA,mFAAA,CAAA;AAAA,UAC5B,SAAA;AAAA,UACA,IAAA,EAAM,EAAE,IAAA,EAAM,SAAA;AAAU,SACzB,CAAA;AAAA,MACH;AAEA,MAAA,MAAM,UAAA,GAAa,cAAc,SAAS,CAAA;AAG1C,MAAA,IAAII,2BAAS,UAAU,CAAA,IAAKR,wCAAA,CAAuB,QAAA,CAAS,UAAU,CAAA,EAAG;AACvE,QAAA,MAAM,MAAA,GAAS,IAAIb,8BAAA,CAAa,UAAA,EAAY,KAAK,MAAM,CAAA;AACvD,QAAA,IAAA,CAAK,0BAAA,CAA2B,WAAW,MAAM,CAAA;AACjD,QAAA;AAAA,MACF;AAEA,MAAA,IAAIX,0BAAA,CAAS,UAAU,CAAA,EAAG;AACxB,QAAA,IAAA,CAAK,2BAA2B,SAAA,EAAW,IAAIa,+BAAa,UAAA,EAAY,IAAA,CAAK,MAAM,CAAC,CAAA;AACpF,QAAA;AAAA,MACF;AAEA,MAAA,IAAIuB,2BAAA,CAAU,UAAU,CAAA,EAAG;AACzB,QAAA,IAAA,CAAK,2BAA2B,SAAA,EAAW,IAAIlB,gCAAc,UAAA,EAAY,IAAA,CAAK,MAAM,CAAC,CAAA;AACrF,QAAA;AAAA,MACF;AAEA,MAAA,IAAIC,wBAAA,CAAO,UAAU,CAAA,EAAG;AACtB,QAAA,IAAA,CAAK,2BAA2B,SAAA,EAAW,IAAIV,4BAAA,CAAW,IAAA,CAAK,MAAM,CAAC,CAAA;AACtE,QAAA;AAAA,MACF;AAEA,MAAA,IAAIoB,0BAAA,CAAS,UAAU,CAAA,IAAKE,yBAAA,CAAQ,UAAU,CAAA,EAAG;AAC/C,QAAA,IAAA,CAAK,qBAAA,CAAsB,SAAA,EAAW,aAAA,CAAc,SAAS,CAAC,CAAA;AAC9D,QAAA;AAAA,MACF;AAGA,MAAA,MAAM,aAAA,GAAgB,OAAO,UAAU,CAAA;AACvC,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,kBAAA,CAAmB,SAAA,EAAW,aAAa,CAAA;AACpE,MAAA,IAAI,uBAAuB,KAAA,EAAO;AAChC,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,EAAE,GAAA,EAAK,MAAA,EAAO,GAAI,WAAA;AACxB,MAAA,IAAI,CAAC,GAAA,EAAK;AACR,QAAA,IAAA,CAAK,0BAAA,CAA2B,WAAW,EAAE,CAAA;AAC7C,QAAA;AAAA,MACF;AAEA,MAAA,IAAA,CAAK,aAAA,CAAc,iBAAiB,SAAS,CAAA;AAC7C,MAAA,IAAA,CAAK,kBAAA,CAAmB,SAAA,EAAW,GAAA,EAAK,MAAA,CAAO,kBAAkB,CAAA;AAAA,IACnE;AAAA,EACF;AAAA,EAEQ,qBAAA,CAAsB,WAAoB,SAAA,EAA4B;AAC5E,IAAA,MAAM,aAAa,SAAA,CAAU,MAAA;AAG7B,IAAA,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,SAAA,EAAW,SAAS,CAAA;AAG9C,IAAA,MAAM,YAAA,GAAe,mBAAA;AAAA,MACnB,UAAA;AAAA,MACA,SAAA;AAAA,MACA,KAAK,aAAA,IAAiB;AAAA,KACxB;AAEA,IAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AAG3B,MAAA,MAAM,SAAA,GAAY,UAAU,KAAA,IAAS,SAAA;AACrC,MAAA,MAAM,WAAA,GAAc,iBAAA;AAAA,QAClB,UAAA;AAAA,QACA,SAAA;AAAA,QACA,IAAA,CAAK,MAAA;AAAA,QACL,IAAA,CAAK,aAAA;AAAA,QACL,SAAA,CAAU;AAAA,OACZ;AACA,MAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAA,EAAW,WAAW,CAAA;AACxC,MAAA,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,SAAA,EAAW,WAAW,CAAA;AAE9C,MAAA,IAAA,CAAK,SAAA,EAAW,SAAA,GAAY,SAAA,EAAW,WAAW,CAAA;AAClD,MAAA,IAAA,CAAK,eAAA,CAAgB,WAAW,WAAW,CAAA;AAC3C,MAAA,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,SAAA,EAAW,EAAE,CAAA;AAChC,MAAA,IAAA,CAAK,aAAA,CAAc,KAAK,SAAS,CAAA;AACjC,MAAA;AAAA,IACF;AAGA,IAAA,KAAA,MAAW,CAAC,SAAA,EAAW,UAAU,CAAA,IAAK,YAAA,EAAc;AAClD,MAAA,IAAA,CAAK,aAAA,CAAc,IAAI,SAAS,CAAA;AAEhC,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,kBAAA,CAAmB,SAAA,EAAW,UAAU,CAAA;AACjE,MAAA,IAAI,uBAAuB,KAAA,EAAO;AAChC,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,EAAE,GAAA,EAAK,MAAA,EAAO,GAAI,WAAA;AACxB,MAAA,IAAI,CAAC,GAAA,EAAK;AACR,QAAA,IAAA,CAAK,0BAAA,CAA2B,WAAW,EAAE,CAAA;AAC7C,QAAA;AAAA,MACF;AAEA,MAAA,IAAA,CAAK,kBAAA,CAAmB,SAAA,EAAW,GAAA,EAAK,MAAA,CAAO,kBAAkB,CAAA;AAAA,IACnE;AAGA,IAAA,MAAM,YAAA,GAAe,KAAA,CAAM,IAAA,CAAK,YAAA,CAAa,MAAM,CAAA;AACnD,IAAA,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,SAAA,EAAW,YAAY,CAAA;AAC1C,IAAA,KAAA,MAAW,OAAO,YAAA,EAAc;AAC9B,MAAA,IAAA,CAAK,iBAAA,CAAkB,kBAAA,CAAmB,SAAA,EAAW,GAAG,CAAA;AAAA,IAC1D;AACA,IAAA,IAAA,CAAK,UAAA,CAAW,IAAI,SAAA,EAAW;AAAA,MAC7B,GAAA,EAAK,IAAA;AAAA,MACL,YAAA,EAAc,IAAI,GAAA,CAAI,YAAY;AAAA,KACnC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,qBAAA,GAA8B;AACpC,IAAA,KAAA,MAAW,CAAC,SAAA,EAAW,UAAU,KAAK,IAAA,CAAK,UAAA,CAAW,SAAQ,EAAG;AAC/D,MAAA,KAAA,MAAW,GAAA,IAAO,WAAW,YAAA,EAAc;AACzC,QAAA,IAAI,IAAA,CAAK,aAAA,CAAc,SAAA,CAAU,GAAG,CAAA,IAAK,CAAC,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA,EAAG;AAC9D,UAAA,IAAA,CAAK,aAAA,CAAc,eAAe,GAAG,CAAA;AACrC,UAAA,IAAA,CAAK,iBAAA,CAAkB,mBAAA,CAAoB,SAAA,EAAW,GAAG,CAAA;AAAA,QAC3D;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,oBAAA,GAA6B;AACnC,IAAA,KAAA,MAAW,SAAA,IAAa,KAAK,aAAA,EAAe;AAC1C,MAAA,IAAA,CAAK,iBAAiB,SAAS,CAAA;AAAA,IACjC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,2BAAA,GAAoC;AAE1C,IAAA,MAAM,SAAA,mBAAY,IAAI,GAAA,CAAI,CAAC,GAAG,IAAA,CAAK,MAAA,CAAO,IAAA,EAAK,EAAG,GAAG,IAAA,CAAK,aAAa,CAAC,CAAA;AAExE,IAAA,KAAA,MAAW,aAAa,SAAA,EAAW;AACjC,MAAA,IAAI,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA,EAAG;AAElC,MAAA,IAAI,KAAK,gBAAA,CAAiB,OAAA,CAAQ,SAAA,EAAW,IAAA,CAAK,iBAAiB,CAAA,EAAG;AACpE,QAAA,IAAA,CAAK,UAAA,CAAW,IAAI,SAAS,CAAA;AAAA,MAC/B;AAAA,IACF;AAGA,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,IAAA,GAAO,CAAA,EAAG;AAC/B,MAAA,MAAM,YAAY,IAAA,CAAK,UAAA,CAAW,MAAA,EAAO,CAAE,MAAK,CAAE,KAAA;AAClD,MAAA,IAAA,CAAK,UAAA,CAAW,OAAO,SAAS,CAAA;AAChC,MAAA,IAAA,CAAK,mBAAmB,SAAS,CAAA;AAAA,IACnC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,wBAAwB,YAAA,EAG9B;AAEA,IAAA,KAAA,MAAW,CAAC,WAAW,CAAA,IAAK,IAAA,CAAK,gBAAA,EAAkB;AAEjD,MAAA,IACE,YAAA,CAAa,UAAA,CAAW,CAAA,EAAG,WAAW,CAAA,CAAA,CAAG,CAAA,IACzC,YAAA,CAAa,UAAA,CAAW,CAAA,EAAG,WAAW,CAAA,CAAA,CAAG,CAAA,EACzC;AACA,QAAA,MAAM,SAAA,GAAY,YAAA,CAAa,SAAA,CAAU,WAAA,CAAY,MAAM,CAAA;AAE3D,QAAA,MAAM,mBAAA,GAAsB,UAAU,UAAA,CAAW,GAAG,IAAI,SAAA,CAAU,SAAA,CAAU,CAAC,CAAA,GAAI,SAAA;AACjF,QAAA,OAAO,EAAE,WAAA,EAAa,SAAA,EAAW,mBAAA,EAAoB;AAAA,MACvD;AAAA,IACF;AAGA,IAAA,MAAM,YAAA,GAAe,YAAA,CAAa,WAAA,CAAY,GAAG,CAAA;AACjD,IAAA,IAAI,iBAAiB,EAAA,EAAI;AACvB,MAAA,OAAO;AAAA,QACL,WAAA,EAAa,YAAA,CAAa,SAAA,CAAU,CAAA,EAAG,YAAY,CAAA;AAAA,QACnD,SAAA,EAAW,YAAA,CAAa,SAAA,CAAU,YAAA,GAAe,CAAC;AAAA,OACpD;AAAA,IACF;AAGA,IAAA,OAAO,EAAE,WAAA,EAAa,EAAA,EAAI,SAAA,EAAW,YAAA,EAAa;AAAA,EACpD;AAAA,EAEQ,mBAAmB,SAAA,EAA0B;AACnD,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA,EAAG;AAGlC,IAAA,IAAA,CAAK,iBAAA,CAAkB,IAAI,SAAS,CAAA;AAGpC,IAAA,IAAI,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,SAAS,CAAA,EAAG;AACxC,MAAA,IAAA,CAAK,uBAAuB,SAAS,CAAA;AACrC,MAAA,IAAA,CAAK,iBAAA,CAAkB,OAAO,SAAS,CAAA;AACvC,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,SAAS,CAAA,EAAG;AAErC,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,gBAAA,CAAiB,WAAA,CAAY,SAAS,CAAA;AACvD,MAAA,IAAI,GAAA,EAAK;AACP,QAAA,MAAMM,WAAAA,GAAa,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,SAAS,CAAA;AAChD,QAAA,MAAMC,gBAAAA,GAAkBD,WAAAA,GACpB,IAAA,CAAK,gBAAA,CAAiB,oBAAA;AAAA,UACpB,SAAA;AAAA,UACAA,WAAAA,CAAW,YAAA;AAAA,UACX,IAAA,CAAK;AAAA,SACP,GACA,MAAA;AAEJ,QAAA,IAAIC,gBAAAA,EAAiB;AACnB,UAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAA,EAAWA,gBAAe,CAAA;AAE5C,UAAA,MAAM,EAAE,WAAA,EAAa,SAAA,EAAU,GAAI,IAAA,CAAK,wBAAwB,SAAS,CAAA;AACzE,UAAA,IAAA,CAAK,SAAA,EAAW,OAAA,GAAU,SAAA,EAAWA,gBAAAA,EAAiB,EAAA,EAAI;AAAA,YACxD,UAAA,EAAY,IAAA;AAAA,YACZ,WAAA;AAAA,YACA;AAAA,WACD,CAAA;AAED,UAAA,IAAI,WAAA,EAAa;AACf,YAAA,IAAA,CAAK,gBAAA,CAAiB,WAAA,EAAa,SAAA,EAAWA,gBAAe,CAAA;AAAA,UAC/D,CAAA,MAAO;AACL,YAAA,IAAA,CAAK,QAAA,CAAS,WAAWA,gBAAe,CAAA;AAAA,UAC1C;AAAA,QACF,CAAA,MAAO;AACL,UAAA,MAAMC,WAAAA,GAAa,IAAA,CAAK,gBAAA,CAAiB,qBAAA,CAAsB,WAAW,GAAG,CAAA;AAC7E,UAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAA,EAAWA,WAAU,CAAA;AAEvC,UAAA,IAAIA,uBAAsB,KAAA,EAAO;AAE/B,YAAA,MAAM,EAAE,WAAA,EAAa,SAAA,EAAU,GAAI,IAAA,CAAK,wBAAwB,SAAS,CAAA;AACzE,YAAA,IAAA,CAAK,SAAA,EAAW,OAAA,GAAU,SAAA,EAAWA,WAAAA,EAAY,EAAA,EAAI;AAAA,cACnD,UAAA,EAAY,IAAA;AAAA,cACZ,WAAA;AAAA,cACA;AAAA,aACD,CAAA;AAED,YAAA,MAAM,SAAA,GAAY,IAAA,CAAK,mBAAA,CAAoBA,WAAU,CAAA;AACrD,YAAA,IAAI,WAAA,EAAa;AACf,cAAA,IAAA,CAAK,gBAAA,CAAiB,WAAA,EAAa,SAAA,EAAW,SAAS,CAAA;AAAA,YACzD,CAAA,MAAO;AACL,cAAA,IAAA,CAAK,QAAA,CAAS,WAAW,SAAS,CAAA;AAAA,YACpC;AAAA,UACF,CAAA,MAAO;AAEL,YAAA,IAAA,CAAK,gBAAA,CAAiB,oBAAA,CAAqB,SAAA,EAAWA,WAAU,CAAA;AAAA,UAClE;AAAA,QACF;AAAA,MACF;AAEA,MAAA,IAAA,CAAK,UAAA,CAAW,OAAO,SAAS,CAAA;AAChC,MAAA,IAAA,CAAK,iBAAiB,SAAS,CAAA;AAC/B,MAAA,IAAA,CAAK,iBAAA,CAAkB,OAAO,SAAS,CAAA;AACvC,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,SAAS,CAAA;AAC/C,IAAA,IAAI,kBAAkB,MAAA,EAAW;AAGjC,IAAA,MAAM,aAAA,GAAwB,MAAA,CAAO,aAAA,CAAc,aAAa,CAAC,CAAA;AAEjE,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,SAAS,CAAA;AAChD,IAAA,MAAM,eAAA,GAAkB,UAAA,GACpB,IAAA,CAAK,gBAAA,CAAiB,oBAAA;AAAA,MACpB,SAAA;AAAA,MACA,UAAA,CAAW,YAAA;AAAA,MACX,IAAA,CAAK;AAAA,KACP,GACA,MAAA;AAEJ,IAAA,IAAI,UAAA;AAEJ,IAAA,IAAI,eAAA,EAAiB;AACnB,MAAA,UAAA,GAAa,eAAA;AACb,MAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAA,EAAW,eAAe,CAAA;AAC5C,MAAA,IAAA,CAAK,SAAA,EAAW,OAAA,GAAU,SAAA,EAAW,eAAA,EAAiB,aAAa,CAAA;AACnE,MAAA,IAAA,CAAK,QAAA,CAAS,WAAW,eAAe,CAAA;AAAA,IAC1C,CAAA,MAAO;AACL,MAAA,UAAA,GAAa,IAAA,CAAK,gBAAA,CAAiB,cAAA,CAAe,SAAA,EAAW,aAAa,CAAA;AAC1E,MAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAA,EAAW,UAAU,CAAA;AAEvC,MAAA,IAAI,sBAAsB,KAAA,EAAO;AAC/B,QAAA,IAAA,CAAK,SAAA,EAAW,OAAA,GAAU,SAAA,EAAW,UAAA,EAAY,aAAa,CAAA;AAC9D,QAAA,IAAA,CAAK,QAAA,CAAS,SAAA,EAAW,IAAA,CAAK,mBAAA,CAAoB,UAAU,CAAC,CAAA;AAAA,MAC/D,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,SAAA,EAAW,SAAA,GAAY,SAAA,EAAW,UAAU,CAAA;AACjD,QAAA,IAAA,CAAK,eAAA,CAAgB,WAAW,UAAU,CAAA;AAC1C,QAAA,IAAA,CAAK,gBAAA,CAAiB,oBAAA,CAAqB,SAAA,EAAW,UAAU,CAAA;AAAA,MAClE;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,gBAAA,CAAiB,wBAAA,CAAyB,WAAW,UAAU,CAAA;AACtF,IAAA,IAAA,CAAK,sBAAA,CAAuB,WAAW,SAAS,CAAA;AAChD,IAAA,IAAA,CAAK,gBAAA,CAAiB,WAAW,SAAS,CAAA;AAC1C,IAAA,IAAA,CAAK,UAAA,CAAW,OAAO,SAAS,CAAA;AAChC,IAAA,IAAA,CAAK,iBAAA,CAAkB,OAAO,SAAS,CAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKQ,uBAAuB,SAAA,EAA0B;AACvD,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,SAAS,CAAA;AACrD,IAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,IAAA,MAAM,gBAAgB,SAAA,CAAU,MAAA;AAGhC,IAAA,MAAM,YAAA,GAAe,mBAAA;AAAA,MACnB,aAAA;AAAA,MACA,SAAA;AAAA,MACA,KAAK,aAAA,IAAiB;AAAA,KACxB;AAGA,IAAA,MAAM,cAAA,uBAAqB,GAAA,EAA+B;AAC1D,IAAA,IAAI,QAAA,GAAW,KAAA;AAEf,IAAA,KAAA,MAAW,CAAC,SAAS,CAAA,IAAK,YAAA,EAAc;AACtC,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA;AAC9C,MAAA,IAAI,eAAe,MAAA,EAAW;AAE5B,QAAA,MAAM,KAAA,GAAQ,IAAIX,gCAAA,CAAA,6BAAA,+BAA0D;AAAA,UAC1E,IAAA,EAAM,EAAE,SAAA;AAAU,SACnB,CAAA;AACD,QAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAA,EAAW,KAAK,CAAA;AAClC,QAAA,IAAA,CAAK,SAAA,EAAW,OAAA,GAAU,SAAA,EAAW,KAAA,EAAO,aAAa,CAAA;AACzD,QAAA,IAAA,CAAK,QAAA,CAAS,WAAW,KAAK,CAAA;AAC9B,QAAA,QAAA,GAAW,IAAA;AACX,QAAA;AAAA,MACF;AACA,MAAA,IAAI,sBAAsB,KAAA,EAAO;AAE/B,QAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAA,EAAW,UAAU,CAAA;AACvC,QAAA,IAAA,CAAK,SAAA,EAAW,OAAA,GAAU,SAAA,EAAW,UAAA,EAAY,aAAa,CAAA;AAC9D,QAAA,IAAA,CAAK,QAAA,CAAS,SAAA,EAAW,IAAA,CAAK,mBAAA,CAAoB,UAAU,CAAC,CAAA;AAC7D,QAAA,QAAA,GAAW,IAAA;AACX,QAAA;AAAA,MACF;AACA,MAAA,cAAA,CAAe,GAAA,CAAI,WAAW,UAAU,CAAA;AAAA,IAC1C;AAEA,IAAA,IAAI,CAAC,QAAA,EAAU;AAEb,MAAA,MAAM,SAAA,GAAY,UAAU,KAAA,IAAS,SAAA;AACrC,MAAA,MAAM,WAAA,GAAc,mCAAA;AAAA,QAClB,SAAA;AAAA,QACA,cAAA;AAAA,QACA,aAAA;AAAA,QACA,SAAA;AAAA,QACA,IAAA,CAAK,MAAA;AAAA,QACL,IAAA,CAAK,aAAA;AAAA,QACL,SAAA,CAAU;AAAA,OACZ;AACA,MAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAA,EAAW,WAAW,CAAA;AACxC,MAAA,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,SAAA,EAAW,WAAW,CAAA;AAE9C,MAAA,IAAA,CAAK,SAAA,EAAW,SAAA,GAAY,SAAA,EAAW,WAAW,CAAA;AAClD,MAAA,IAAA,CAAK,eAAA,CAAgB,WAAW,WAAW,CAAA;AAAA,IAC7C;AAEA,IAAA,IAAA,CAAK,UAAA,CAAW,OAAO,SAAS,CAAA;AAChC,IAAA,IAAA,CAAK,iBAAiB,SAAS,CAAA;AAAA,EACjC;AAAA,EAEQ,sBAAA,CAAuB,QAAiB,SAAA,EAA4B;AAC1E,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,aAAA,CAAc,2BAAA,CAA4B,MAAM,CAAA;AACtE,IAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AAEzB,IAAA,MAAM,YAAY,SAAA,CAAU,MAAA,GAAS,IAAI,IAAI,GAAA,CAAI,SAAS,CAAA,GAAI,IAAA;AAC9D,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA;AAE5C,IAAA,KAAA,MAAW,SAAS,QAAA,EAAU;AAC5B,MAAA,IAAI,SAAA,EAAW,GAAA,CAAI,KAAK,CAAA,IAAK,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,KAAK,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,KAAK,CAAA,EAAG;AACvF,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,KAAA,GACJ,uBAAuB,KAAA,GACnB,qBAAA,CAAsB,OAAO,MAAA,EAAQ,WAAW,CAAA,GAChD,IAAIA,gCAAA,CAAA,sBAAA,wBAAmD;AAAA,QACrD,IAAA,EAAM,EAAE,SAAA,EAAW,KAAA;AAAM,OAC1B,CAAA;AAEP,MAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,KAAA,EAAO,KAAK,CAAA;AAC9B,MAAA,IAAA,CAAK,SAAA,EAAW,OAAA,GAAU,KAAA,EAAO,KAAA,EAAO,EAAE,CAAA;AAAA,IAC5C;AAAA,EACF;AAAA,EAEQ,gBAAA,CAAiB,MAAe,SAAA,EAA6B;AACnE,IAAA,IAAA,CAAK,QAAA,CAAS,mBAAA,CAAoB,IAAA,EAAM,SAAA,EAAW,KAAK,cAAc,CAAA;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAAA,CAAsB,QAAgB,KAAA,EAA6C;AACzF,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,aAAA,CAAc,qBAAA,CAAsB,QAAQ,KAAK,CAAA;AACzE,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,KAAA,CAAM,GAAA,CAAI,QAAQ,UAAU,CAAA;AAAA,IAC9B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,kBAAA,GAA2B;AACjC,IAAA,MAAM,mBAA8B,EAAC;AAGrC,IAAA,MAAM,SAAA,mBAAY,IAAI,GAAA,CAAI,CAAC,GAAG,IAAA,CAAK,MAAA,CAAO,IAAA,EAAK,EAAG,GAAG,IAAA,CAAK,aAAa,CAAC,CAAA;AAExE,IAAA,KAAA,MAAW,aAAa,SAAA,EAAW;AACjC,MAAA,IAAI,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA,EAAG;AAElC,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,SAAS,CAAA;AAEnD,MAAA,IAAI,aAAA,GAAgB,EAAA;AACpB,MAAA,IAAI,CAAC,UAAA,EAAY;AACf,QAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,SAAS,CAAA;AAC/C,QAAA,IAAI,kBAAkB,MAAA,EAAW;AACjC,QAAA,aAAA,GAAgB,MAAA,CAAO,aAAA,CAAc,aAAa,CAAC,CAAA;AAAA,MACrD;AAGA,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,SAAS,CAAA;AAChD,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAM,eAAA,GAAkB,KAAK,gBAAA,CAAiB,oBAAA;AAAA,UAC5C,SAAA;AAAA,UACA,UAAA,CAAW,YAAA;AAAA,UACX,IAAA,CAAK,QAAA;AAAA,UACL,IAAA,CAAK;AAAA,SACP;AACA,QAAA,IAAI,eAAA,EAAiB;AACnB,UAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAA,EAAW,eAAe,CAAA;AAE5C,UAAA,IAAI,UAAA,EAAY;AAEd,YAAA,MAAM,EAAE,WAAA,EAAa,SAAA,EAAU,GAAI,IAAA,CAAK,wBAAwB,SAAS,CAAA;AACzE,YAAA,IAAA,CAAK,SAAA,EAAW,OAAA,GAAU,SAAA,EAAW,eAAA,EAAiB,aAAA,EAAe;AAAA,cACnE,UAAA,EAAY,IAAA;AAAA,cACZ,WAAA;AAAA,cACA;AAAA,aACD,CAAA;AAED,YAAA,IAAI,WAAA,EAAa;AACf,cAAA,IAAA,CAAK,gBAAA,CAAiB,WAAA,EAAa,SAAA,EAAW,eAAe,CAAA;AAAA,YAC/D,CAAA,MAAO;AACL,cAAA,IAAA,CAAK,QAAA,CAAS,WAAW,eAAe,CAAA;AAAA,YAC1C;AAAA,UACF,CAAA,MAAO;AACL,YAAA,IAAA,CAAK,SAAA,EAAW,OAAA,GAAU,SAAA,EAAW,eAAA,EAAiB,aAAa,CAAA;AACnE,YAAA,IAAA,CAAK,QAAA,CAAS,WAAW,eAAe,CAAA;AAAA,UAC1C;AAEA,UAAA,IAAA,CAAK,sBAAA,CAAuB,SAAA,EAAW,EAAE,CAAA;AACzC,UAAA,IAAA,CAAK,iBAAiB,SAAS,CAAA;AAC/B,UAAA,IAAA,CAAK,UAAA,CAAW,OAAO,SAAS,CAAA;AAChC,UAAA;AAAA,QACF;AAAA,MACF;AAEA,MAAA,gBAAA,CAAiB,KAAK,SAAS,CAAA;AAAA,IACjC;AAGA,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,IAAA,GAAO,CAAA,EAAG;AAC/B,MAAA,MAAM,YAAY,IAAA,CAAK,UAAA,CAAW,MAAA,EAAO,CAAE,MAAK,CAAE,KAAA;AAClD,MAAA,IAAA,CAAK,UAAA,CAAW,OAAO,SAAS,CAAA;AAChC,MAAA,IAAA,CAAK,mBAAmB,SAAS,CAAA;AAAA,IACnC;AAGA,IAAA,MAAM,eAAA,GAAkB,gBAAA,CAAiB,MAAA,CAAO,CAAC,SAAA,KAAc,CAAC,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAS,CAAC,CAAA;AAG5F,IAAA,IAAI,eAAA,CAAgB,SAAS,CAAA,EAAG;AAE9B,MAAA,MAAM,qBAAA,uBAA4B,GAAA,EAAY;AAG9C,MAAA,KAAA,MAAW,aAAa,eAAA,EAAiB;AACvC,QAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,SAAS,CAAA;AACpD,QAAA,IAAI,cAAA,EAAgB;AAElB,UAAA,KAAA,MAAW,GAAA,IAAO,eAAe,YAAA,EAAc;AAC7C,YAAA,IAAI,IAAA,CAAK,mBAAA,CAAoB,GAAA,CAAI,GAAG,CAAA,EAAG;AACrC,cAAA,qBAAA,CAAsB,IAAI,SAAS,CAAA;AACnC,cAAA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,MAAA,KAAA,MAAW,aAAa,eAAA,EAAiB;AACvC,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,SAAS,CAAA;AAEnD,QAAA,IAAI,aAAA,GAAgB,EAAA;AACpB,QAAA,IAAI,CAAC,UAAA,EAAY;AACf,UAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,SAAS,CAAA;AAC/C,UAAA,IAAI,kBAAkB,MAAA,EAAW;AACjC,UAAA,aAAA,GAAgB,MAAA,CAAO,aAAA,CAAc,aAAa,CAAC,CAAA;AAAA,QACrD;AAIA,QAAA,MAAM,gBAAA,GAAmB,qBAAA,CAAsB,GAAA,CAAI,SAAS,CAAA;AAC5D,QAAA,MAAM,KAAA,GAAQ,gBAAA,GACV,IAAIA,gCAAA,CAAA,sBAAA,wBAAmD;AAAA,UACrD,IAAA,EAAM,EAAE,SAAA;AAAU,SACnB,CAAA,GACD,IAAIA,gCAAA,CAAA,0BAAA,4BAAuD;AAAA,UACzD,IAAA,EAAM,EAAE,MAAA,EAAQ,SAAA;AAAU,SAC3B,CAAA;AAEL,QAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAA,EAAW,KAAK,CAAA;AAElC,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,MAAM,EAAE,WAAA,EAAa,SAAA,EAAU,GAAI,IAAA,CAAK,wBAAwB,SAAS,CAAA;AACzE,UAAA,IAAA,CAAK,SAAA,EAAW,OAAA,GAAU,SAAA,EAAW,KAAA,EAAO,aAAA,EAAe;AAAA,YACzD,UAAA,EAAY,IAAA;AAAA,YACZ,WAAA;AAAA,YACA;AAAA,WACD,CAAA;AAED,UAAA,IAAI,WAAA,EAAa;AACf,YAAA,IAAA,CAAK,gBAAA,CAAiB,WAAA,EAAa,SAAA,EAAW,KAAK,CAAA;AAAA,UACrD,CAAA,MAAO;AACL,YAAA,IAAA,CAAK,QAAA,CAAS,WAAW,KAAK,CAAA;AAAA,UAChC;AAAA,QACF,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,SAAA,EAAW,OAAA,GAAU,SAAA,EAAW,KAAA,EAAO,aAAa,CAAA;AACzD,UAAA,IAAA,CAAK,QAAA,CAAS,WAAW,KAAK,CAAA;AAAA,QAChC;AAEA,QAAA,IAAA,CAAK,sBAAA,CAAuB,SAAA,EAAW,EAAE,CAAA;AACzC,QAAA,IAAA,CAAK,iBAAiB,SAAS,CAAA;AAC/B,QAAA,IAAA,CAAK,UAAA,CAAW,OAAO,SAAS,CAAA;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AACF,CAAA;AA30BqBlC,wBAAA,CAAA,eAAA,EAAA,gBAAA,CAAA;AAArB,IAAM,cAAA,GAAN,eAAA;AAw1BO,IAAM,cAAA,GAAN,MAAM,cAAA,CAAc;AAAA,EAMlB,aAAA,CACL,MAAA,EACA,SAAA,EACA,MAAA,EACA,aAAA,EACiB;AACjB,IAAA,MAAM,QAAA,GAAW,IAAI,cAAA,CAAe;AAAA,MAClC,MAAA;AAAA,MACA,SAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,OAAO,SAAS,OAAA,EAAQ;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBO,wBAAwB,SAAA,EAG7B;AACA,IAAA,IAAI,CAAC,KAAK,cAAA,EAAgB;AACxB,MAAA,MAAM,IAAIkC,gCAAA,CAAA,+BAAA,gCAA0D;AAAA,IACtE;AAEA,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,cAAA,CAAe,QAAA,EAAS;AAG3C,IAAA,MAAM,WAAA,uBAAkB,GAAA,EAA2B;AACnD,IAAA,MAAM,UAAA,GAAa,MAAM,QAAA,EAAS;AAElC,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,YAAY,CAAA,IAAK,UAAA,EAAY;AAC7C,MAAA,KAAA,MAAW,OAAO,YAAA,EAAc;AAC9B,QAAA,IAAI,CAAC,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA,EAAG;AACzB,UAAA,WAAA,CAAY,GAAA,CAAI,GAAA,kBAAK,IAAI,GAAA,EAAK,CAAA;AAAA,QAChC;AACA,QAAA,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA,EAAG,GAAA,CAAI,IAAI,CAAA;AAAA,MAChC;AAAA,IACF;AAGA,IAAA,MAAM,cAAA,uBAAqB,GAAA,EAAa;AACxC,IAAA,MAAM,KAAA,GAAmB,CAAC,SAAS,CAAA;AACnC,IAAA,MAAM,OAAA,uBAAc,GAAA,EAAa;AAEjC,IAAA,OAAO,KAAA,CAAM,SAAS,CAAA,EAAG;AACvB,MAAA,MAAM,OAAA,GAAU,MAAM,KAAA,EAAM;AAC5B,MAAA,IAAI,OAAA,KAAY,MAAA,IAAa,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,EAAG;AAEnD,MAAA,OAAA,CAAQ,IAAI,OAAO,CAAA;AACnB,MAAA,cAAA,CAAe,IAAI,OAAO,CAAA;AAG1B,MAAA,MAAM,UAAA,GAAa,WAAA,CAAY,GAAA,CAAI,OAAO,CAAA;AAC1C,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,UAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA,EAAG;AAC3B,YAAA,KAAA,CAAM,KAAK,SAAS,CAAA;AAAA,UACtB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,IAAA,MAAM,QAAA,GAAW,IAAI,eAAA,EAAyB;AAC9C,IAAA,KAAA,MAAW,SAAS,cAAA,EAAgB;AAClC,MAAA,MAAM,YAAA,GAAe,UAAA,CAAW,GAAA,CAAI,KAAK,CAAA;AACzC,MAAA,IAAI,YAAA,EAAc;AAEhB,QAAA,MAAM,YAAA,uBAAmB,GAAA,EAAa;AACtC,QAAA,KAAA,MAAW,OAAO,YAAA,EAAc;AAC9B,UAAA,IAAI,cAAA,CAAe,GAAA,CAAI,GAAG,CAAA,EAAG;AAC3B,YAAA,YAAA,CAAa,IAAI,GAAG,CAAA;AAAA,UACtB;AAAA,QACF;AACA,QAAA,QAAA,CAAS,OAAA,CAAQ,OAAO,YAAY,CAAA;AAAA,MACtC,CAAA,MAAO;AACL,QAAA,QAAA,CAAS,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAAA,MAC5B;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,cAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAAA,EAEO,KAAA,CACL,MAAA,EACA,MAAA,EACA,aAAA,EACiB;AACjB,IAAA,MAAM,MAAA,uBAA+B,GAAA,EAAI;AAEzC,IAAA,MAAM,SAAA,GAAgC;AAAA,MACpC,SAAA,kBAAWlC,wBAAA,CAAA,CAAC,SAAA,EAAW,KAAA,KAAU;AAC/B,QAAA,MAAA,CAAO,GAAA,CAAI,WAAW,KAAK,CAAA;AAAA,MAC7B,CAAA,EAFW,WAAA,CAAA;AAAA,MAGX,OAAA,kBAASA,wBAAA,CAAA,CAAC,SAAA,EAAW,MAAA,EAAQ,aAAA,KAAkB;AAG7C,QAAA,MAAA,CAAO,GAAA,CAAI,WAAW,aAAoB,CAAA;AAAA,MAE5C,CAAA,EALS,SAAA;AAAA,KAMX;AAGA,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAI,cAAA,CAAe;AAAA,MACvC,MAAA;AAAA,MACA,SAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,aAAA,GAAgB,aAAA;AAErB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,cAAA,CAAe,OAAA,EAAQ;AAG3C,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,cAAA,CAAe,gBAAA,EAAiB;AAC3D,IAAA,IAAI,aAAA,CAAc,OAAO,CAAA,EAAG;AAC1B,MAAA,KAAA,MAAW,gBAAgB,aAAA,EAAe;AACxC,QAAA,MAAA,CAAO,OAAO,YAAY,CAAA;AAC1B,QAAA,MAAA,CAAO,MAAA,EAAQ,OAAO,YAAY,CAAA;AAAA,MACpC;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,GAAG,MAAA;AAAA,MACH,MAAA,EAAQ,MAAA;AAAA,MACR,QAAA,EAAU,IAAA;AAAA,MACV,QAAQ,MAAA,CAAO;AAAA,KACjB;AAAA,EACF;AAAA,EAEQ,iBAAA,GAA0B;AAChC,IAAA,IAAI,CAAC,IAAA,CAAK,cAAA,IAAkB,CAAC,KAAK,MAAA,EAAQ;AACxC,MAAA,MAAM,IAAIkC,gCAAA,CAAA,+BAAA,gCAA0D;AAAA,IACtE;AAAA,EACF;AAAA,EAEQ,mBAAmB,SAAA,EAA8C;AACvE,IAAA,OAAO,SAAA,EAAW,MAAK,IAAK,EAAA;AAAA,EAC9B;AAAA,EAEQ,qBAAA,GAGN;AACA,IAAA,MAAM,MAAA,uBAA+B,GAAA,EAAI;AACzC,IAAA,MAAM,SAAA,GAAgC;AAAA,MACpC,SAAA,kBAAWlC,wBAAA,CAAA,CAAC,IAAA,EAAM,KAAA,KAAU;AAC1B,QAAA,MAAA,CAAO,GAAA,CAAI,MAAM,KAAK,CAAA;AAAA,MACxB,CAAA,EAFW,WAAA,CAAA;AAAA,MAGX,OAAA,kBAASA,wBAAA,CAAA,CAAC,KAAA,EAAO,MAAA,KAAW;AAAA,MAE5B,CAAA,EAFS,SAAA;AAAA,KAGX;AACA,IAAA,OAAO,EAAE,QAAQ,SAAA,EAAU;AAAA,EAC7B;AAAA,EAEQ,eAAA,CACN,aAAA,EACA,SAAA,EACA,gBAAA,EACiB;AACjB,IAAA,IAAI,CAAC,KAAK,cAAA,EAAgB;AACxB,MAAA,MAAM,IAAIkC,gCAAA,CAAA,+BAAA,gCAA0D;AAAA,IACtE;AAKA,IAAA,IAAI,WAAA,GAAkC,IAAA;AACtC,IAAA,IAAI,gBAAA,EAAkB;AACpB,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,cAAA,CAAe,QAAA,EAAS;AAC3C,MAAA,MAAM,EAAE,MAAA,EAAQ,QAAA,EAAS,GAAI,uBAAA,CAAwB,kBAAkB,KAAK,CAAA;AAC5E,MAAA,WAAA,GAAc,QAAA;AAAA,IAChB;AAEA,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,cAAA,CAAe,KAAA,CAAM;AAAA,MAC5C,MAAA,EAAQ,aAAA;AAAA,MACR;AAAA,KACD,CAAA;AAED,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,cAAA,CAAe,iBAAA,EAAkB;AACvD,IAAA,MAAM,QAAA,GAAW,YAAY,iBAAA,EAAkB;AAC/C,IAAA,KAAA,MAAW,CAAC,SAAA,EAAW,KAAK,CAAA,IAAK,QAAA,EAAU;AACzC,MAAA,IAAI,CAAC,aAAA,CAAc,GAAA,CAAI,SAAS,CAAA,EAAG;AACnC,MAAA,IAAI,WAAA,EAAa,GAAA,CAAI,SAAS,CAAA,EAAG;AACjC,MAAA,QAAA,CAAS,GAAA,CAAI,WAAW,KAAK,CAAA;AAAA,IAC/B;AAEA,IAAA,MAAM,MAAA,GAAS,YAAY,OAAA,EAAQ;AACnC,IAAA,IAAA,CAAK,cAAA,GAAiB,WAAA;AACtB,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEO,YAAY,MAAA,EAA8C;AAC/D,IAAA,IAAA,CAAK,iBAAA,EAAkB;AAEvB,IAAA,MAAM,EAAE,SAAA,EAAW,SAAA,EAAW,gBAAA,EAAkB,gBAAA,GAAmB,OAAM,GAAI,MAAA;AAC7E,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,kBAAA,CAAmB,SAAS,CAAA;AAClD,IAAA,MAAM,OAAA,GAAU,kBAAkB,IAAA,EAAK;AAEvC,IAAA,IAAI,CAAC,KAAK,MAAA,IAAU,CAAC,KAAK,MAAA,CAAO,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC9C,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,MAAM,YAAA,GAAe,KAAK,WAAA,CAAY;AAAA,UACpC,SAAA,EAAW,QAAA;AAAA,UACX;AAAA,SACD,CAAA;AACD,QAAA,OAAO;AAAA,UACL,GAAG,YAAA;AAAA,UACH,OAAA,EAAS;AAAA,SACX;AAAA,MACF;AACA,MAAA,MAAM,IAAIA,gCAAA,CAAA,sBAAA,wBAAmD;AAAA,QAC3D,IAAA,EAAM,EAAE,SAAA,EAAW,QAAA;AAAS,OAC7B,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,QAAQ,CAAA;AAC7C,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,MAAM,IAAIA,gCAAA,CAAA,sBAAA,wBAAmD;AAAA,QAC3D,IAAA,EAAM,EAAE,SAAA,EAAW,QAAA;AAAS,OAC7B,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,QAAA,GAAW,WAAW,OAAA,KAAY,QAAA;AAGxC,IAAA,IAAI,QAAA,IAAY,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA,EAAG;AACxC,MAAA,MAAM,IAAIA,gCAAA,CAAA,2BAAA,6BAAwD;AAAA,QAChE,IAAA,EAAM,EAAE,SAAA,EAAW,OAAA;AAAQ,OAC5B,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,CAAC,KAAK,cAAA,EAAgB;AACxB,MAAA,MAAM,IAAIA,gCAAA,CAAA,+BAAA,gCAA0D;AAAA,IACtE;AACA,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,cAAA,CAAe,QAAA,EAAS;AAClD,IAAA,MAAM,EAAE,MAAA,EAAQ,cAAA,EAAe,GAAI,uBAAA,CAAwB,UAAU,YAAY,CAAA;AACjF,IAAA,cAAA,CAAe,OAAO,QAAQ,CAAA;AAE9B,IAAA,MAAM,aAAA,GAAgB,IAAI,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA;AAGzC,IAAA,IAAI,QAAA,IAAY,gBAAA,IAAoB,cAAA,CAAe,IAAA,GAAO,CAAA,EAAG;AAC3D,MAAA,MAAM,SAAA,GAAY,EAAE,CAAC,QAAQ,GAAG,OAAA,EAAQ;AACxC,MAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,cAAA,CAAe,mBAAA,EAAoB;AAGjE,MAAA,KAAA,MAAW,kBAAkB,cAAA,EAAgB;AAC3C,QAAA,MAAM,kBAAA,GAAqB,aAAA,CAAc,GAAA,CAAI,cAAc,CAAA;AAC3D,QAAA,IAAI,CAAC,kBAAA,EAAoB;AAEzB,QAAA,MAAM,cAAA,GAAiB,cAAc,kBAAkB,CAAA;AACvD,QAAA,IAAI,CAACI,0BAAA,CAAS,cAAc,CAAA,EAAG;AAG/B,QAAA,MAAM,GAAA,GAAM,gBAAA,CAAiB,WAAA,CAAY,cAAc,CAAA;AACvD,QAAA,IAAI,CAAC,GAAA,EAAK;AAGV,QAAA,MAAM,YAAA,GAAe,gBAAA,CAAiB,cAAA,EAAgB,GAAA,EAAK,SAAS,CAAA;AAGpE,QAAA,IAAI,iBAAiB,cAAA,EAAgB;AACnC,UAAA,MAAM,gBAAA,GAAmB,EAAE,GAAG,kBAAA,EAAoB,QAAQ,YAAA,EAAa;AACvE,UAAA,aAAA,CAAc,GAAA,CAAI,gBAAgB,gBAAgB,CAAA;AAAA,QACpD;AAAA,MACF;AAAA,IACF;AAGA,IAAA,aAAA,CAAc,OAAO,QAAQ,CAAA;AAC7B,IAAA,MAAM,SAAA,GAAY,WAAW,OAAA,GAAU,QAAA;AACvC,IAAA,aAAA,CAAc,GAAA,CAAI,SAAA,EAAW,SAAA,IAAa,YAAY,CAAA;AACtD,IAAA,IAAA,CAAK,MAAA,GAAS,aAAA;AAEd,IAAA,MAAM,EAAE,MAAA,EAAQ,SAAA,EAAU,GAAI,KAAK,qBAAA,EAAsB;AACzD,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,eAAA,CAAgB,aAAA,EAAe,WAAW,QAAQ,CAAA;AAE9E,IAAA,IAAI,CAAC,KAAK,cAAA,EAAgB;AACxB,MAAA,MAAM,IAAIJ,gCAAA,CAAA,+BAAA,gCAA0D;AAAA,IACtE;AACA,IAAA,MAAM,EAAE,UAAS,GAAI,uBAAA,CAAwB,WAAW,IAAA,CAAK,cAAA,CAAe,UAAU,CAAA;AAEtF,IAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,GAAA,CAAI,SAAS,CAAA;AAE1C,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,MAAA;AAAA,MACR,QAAA,EAAU,aAAA;AAAA,MACV,QAAQ,cAAA,CAAe,MAAA;AAAA,MACvB,UAAA,EAAY,EAAE,KAAA,EAAO,QAAA,EAAS;AAAA,MAC9B,OAAA,EAAS;AAAA,KACX;AAAA,EACF;AAAA,EAEO,YAAY,MAAA,EAA8C;AAC/D,IAAA,IAAA,CAAK,iBAAA,EAAkB;AAEvB,IAAA,MAAM,EAAE,SAAA,EAAW,SAAA,EAAU,GAAI,MAAA;AACjC,IAAA,MAAM,mBAAA,GAAsB,IAAA,CAAK,kBAAA,CAAmB,SAAS,CAAA;AAE7D,IAAA,IAAI,IAAA,CAAK,MAAA,EAAQ,GAAA,CAAI,mBAAmB,CAAA,EAAG;AACzC,MAAA,MAAM,IAAIA,gCAAA,CAAA,2BAAA,6BAAwD;AAAA,QAChE,IAAA,EAAM,EAAE,SAAA,EAAW,mBAAA;AAAoB,OACxC,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,aAAA,GAAgB,IAAI,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA;AACzC,IAAA,aAAA,CAAc,GAAA,CAAI,qBAAqB,SAAS,CAAA;AAChD,IAAA,IAAA,CAAK,MAAA,GAAS,aAAA;AAEd,IAAA,MAAM,EAAE,MAAA,EAAQ,SAAA,EAAU,GAAI,KAAK,qBAAA,EAAsB;AACzD,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,eAAA,CAAgB,aAAA,EAAe,WAAW,mBAAmB,CAAA;AAEzF,IAAA,IAAI,CAAC,KAAK,cAAA,EAAgB;AACxB,MAAA,MAAM,IAAIA,gCAAA,CAAA,+BAAA,gCAA0D;AAAA,IACtE;AACA,IAAA,MAAM,EAAE,UAAS,GAAI,uBAAA;AAAA,MACnB,mBAAA;AAAA,MACA,IAAA,CAAK,eAAe,QAAA;AAAS,KAC/B;AAEA,IAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,GAAA,CAAI,mBAAmB,CAAA;AAEpD,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,MAAA;AAAA,MACR,QAAA,EAAU,aAAA;AAAA,MACV,QAAQ,cAAA,CAAe,MAAA;AAAA,MACvB,UAAA,EAAY,EAAE,KAAA,EAAO,QAAA,EAAS;AAAA,MAC9B,OAAA,EAAS;AAAA,KACX;AAAA,EACF;AAAA,EAEO,YAAY,MAAA,EAA8C;AAC/D,IAAA,IAAA,CAAK,iBAAA,EAAkB;AAEvB,IAAA,MAAM,EAAE,WAAU,GAAI,MAAA;AACtB,IAAA,MAAM,mBAAA,GAAsB,IAAA,CAAK,kBAAA,CAAmB,SAAS,CAAA;AAE7D,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,EAAQ,GAAA,CAAI,mBAAmB,CAAA,EAAG;AAC1C,MAAA,MAAM,IAAIA,gCAAA,CAAA,sBAAA,wBAAmD;AAAA,QAC3D,IAAA,EAAM,EAAE,SAAA,EAAW,mBAAA;AAAoB,OACxC,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,CAAC,KAAK,cAAA,EAAgB;AACxB,MAAA,MAAM,IAAIA,gCAAA,CAAA,+BAAA,gCAA0D;AAAA,IACtE;AACA,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,cAAA,CAAe,QAAA,EAAS;AAClD,IAAA,MAAM,EAAE,QAAA,EAAS,GAAI,uBAAA,CAAwB,qBAAqB,YAAY,CAAA;AAG9E,IAAA,QAAA,CAAS,WAAW,mBAAmB,CAAA;AAEvC,IAAA,MAAM,aAAA,GAAgB,IAAI,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA;AACzC,IAAA,aAAA,CAAc,OAAO,mBAAmB,CAAA;AACxC,IAAA,IAAA,CAAK,MAAA,GAAS,aAAA;AAEd,IAAA,MAAM,EAAE,MAAA,EAAQ,SAAA,EAAU,GAAI,KAAK,qBAAA,EAAsB;AACzD,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,eAAA,CAAgB,aAAA,EAAe,WAAW,mBAAmB,CAAA;AAEzF,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,MAAA;AAAA,MACR,QAAQ,cAAA,CAAe,MAAA;AAAA,MACvB,UAAA,EAAY,EAAE,KAAA,EAAO,QAAA;AAAS,KAChC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBO,aAAa,MAAA,EAAgD;AAClE,IAAA,IAAA,CAAK,iBAAA,EAAkB;AAEvB,IAAA,IAAI,CAAC,KAAK,cAAA,EAAgB;AACxB,MAAA,MAAM,IAAIA,gCAAA,CAAA,+BAAA,gCAA0D;AAAA,IACtE;AAEA,IAAA,MAAM,EAAE,KAAA,EAAO,IAAA,EAAM,QAAA,EAAS,GAAI,MAAA;AAClC,IAAA,MAAM,SAAyB,EAAC;AAEhC,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,IAAQ,UAAU,EAAA,EAAI;AACzD,MAAA,OAAO,EAAE,QAAA,EAAU,IAAA,EAAM,MAAA,EAAO;AAAA,IAClC;AAEA,IAAA,MAAM,QAAA,GAAW,OAAO,KAAK,CAAA;AAG7B,IAAA,IAAI,GAAA,GAAsB,IAAA;AAC1B,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,gBAAgB,QAAQ,CAAA;AACvC,MAAA,GAAA,GAAM,MAAA,CAAO,GAAA;AAAA,IACf,SAAS,KAAA,EAAO;AACd,MAAA,IAAIrB,iCAAA,CAAgB,KAAK,CAAA,EAAG;AAC1B,QAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AACjB,QAAA,OAAO,EAAE,QAAA,EAAU,IAAA,EAAM,MAAA,EAAO;AAAA,MAClC;AACA,MAAA,MAAM,KAAA;AAAA,IACR;AAEA,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,OAAO,EAAE,QAAA,EAAU,QAAA,EAAU,MAAA,EAAO;AAAA,IACtC;AAGA,IAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,cAAA,CAAe,mBAAA,EAAoB;AACjE,IAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,qBAAA,CAAsB,eAAA,EAAiB,GAAG,CAAA;AAE5E,IAAA,IAAI,oBAAoB,KAAA,EAAO;AAC7B,MAAA,IAAIA,iCAAA,CAAgB,QAAQ,CAAA,EAAG;AAC7B,QAAA,MAAA,CAAO,KAAK,QAAQ,CAAA;AAAA,MACtB;AACA,MAAA,OAAO,EAAE,QAAA,EAAU,IAAA,EAAM,MAAA,EAAO;AAAA,IAClC;AAEA,IAAA,IAAI,YAAY,IAAA,EAAM;AACpB,MAAA,MAAA,CAAO,IAAA,CAAK,GAAG,2BAAA,CAA4B,IAAA,CAAK,QAAQ,eAAA,EAAiB,IAAA,EAAM,QAAQ,CAAC,CAAA;AAAA,IAC1F;AAEA,IAAA,OAAO,EAAE,UAAU,MAAA,EAAO;AAAA,EAC5B;AACF,CAAA;AAxc2Bb,wBAAA,CAAA,cAAA,EAAA,eAAA,CAAA;AAApB,IAAM,aAAA,GAAN;;;ACtnCA,IAAM,WAAA,GAAN,MAAM,WAAA,CAA4E;AAAA,EAAlF,WAAA,GAAA;AACL,IAAA,IAAA,CAAS,IAAA,GAAO,KAAA;AAChB,IAAA,IAAA,CAAU,MAAA,uBAAsD,GAAA,EAAI;AACpE,IAAA,IAAA,CAAQ,oBAAA,uBAA2D,GAAA,EAAI;AAAA,EAAA;AAAA,EAEvE,SAAA,CAAU,WAAmB,KAAA,EAAgC;AAC3D,IAAA,IAAA,CAAK,oBAAA,CAAqB,GAAA,CAAI,SAAA,EAAW,KAAK,CAAA;AAC9C,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,SAAA,EAAW,KAAK,CAAA;AAAA,EAClC;AAAA,EAEA,OAAA,CAAQ,SAAA,EAAmB,MAAA,EAAe,aAAA,EAAuC;AAC/E,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,SAAA,EAAW,aAAuB,CAAA;AAAA,EACpD;AAAA,EAEA,SAAA,GAAqD;AACnD,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA,EAEA,iBAAA,GAAoD;AAClD,IAAA,OAAO,IAAA,CAAK,oBAAA;AAAA,EACd;AACF,CAAA;AArByFA,wBAAA,CAAA,WAAA,EAAA,YAAA,CAAA;AAAlF,IAAM,UAAA,GAAN,WAAA;;;ACkDA,SAAS,WAAA,CACd,QACA,OAAA,EAIA;AACA,EAAA,MAAM,EAAE,QAAQ,OAAA,GAAU,IAAI,YAAW,EAAG,aAAA,EAAc,GAAI,OAAA,IAAW,EAAC;AAG1E,EAAA,MAAM,mBAAmB,OAAA,CAAQ,WAAA,KAAgB,UAAA,GAAa,OAAA,GAAU,IAAI,UAAA,EAAW;AAKvF,EAAA,MAAM,SAAS,IAAI,aAAA,GAAgB,KAAA,CAAM,MAAA,EAAQ,QAAQ,aAAa,CAAA;AAItE,EAAA,KAAA,MAAW,CAAC,SAAA,EAAW,KAAK,CAAA,IAAK,OAAO,MAAA,EAAQ;AAC9C,IAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,MAAA,CAAO,MAAA,EAAQ,SAAS,CAAA;AAEpD,IAAA,IAAI,KAAA,EAAO;AAET,MAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,GAAA,CAAI,SAAS,CAAA;AAC1C,MAAA,MAAM,iBAAA,GACJ,OAAO,aAAA,KAAkB,QAAA,GAAW,gBAAgB,aAAA,EAAe,MAAA;AAErE,MAAA,OAAA,CAAQ,OAAA,CAAQ,SAAA,EAAW,KAAA,EAAO,iBAAiB,CAAA;AAEnD,MAAA,IAAI,QAAQ,WAAA,KAAgB,UAAA;AAC1B,QAAA,gBAAA,CAAiB,OAAA,CAAQ,SAAA,EAAW,KAAA,EAAO,iBAAiB,CAAA;AAAA,IAChE,CAAA,MAAO;AAEL,MAAA,OAAA,CAAQ,SAAA,CAAU,WAAW,KAAK,CAAA;AAElC,MAAA,IAAI,QAAQ,WAAA,KAAgB,UAAA,EAAY,gBAAA,CAAiB,SAAA,CAAU,WAAW,KAAK,CAAA;AAAA,IACrF;AAAA,EACF;AAEA,EAAA,MAAM,SAAA,GAAY,iBAAiB,SAAA,EAAU;AAC7C,EAAA,MAAM,aAAA,GAAgB,QAAQ,SAAA,EAAU;AACxC,EAAA,MAAM,SAAS,MAAA,CAAO,MAAA;AAEtB,EAAA,OAAO;AAAA,IACL,GAAG,MAAA;AAAA,IACH,MAAA,EAAQ,SAAA;AAAA,IACR,MAAA,EAAQ,aAAA;AAAA,IACR,MAAA;AAAA,IACA,UAAU,MAAA,CAAO;AAAA,GACnB;AACF;AAnDgBA,wBAAA,CAAA,WAAA,EAAA,aAAA,CAAA;;;ACnCT,SAAS,qBAAA,CACd,MAAA,EACA,MAAA,EACA,QAAA,EACM;AACN,EAAA,IAAI,kBAAkBc,kCAAA,EAAkB;AACtC,IAAA,kBAAA,CAAmB,MAAA,CAAO,KAAA,EAAO,MAAA,EAAQ,QAAQ,CAAA;AAAA,EACnD;AACF;AARgBd,wBAAA,CAAA,qBAAA,EAAA,uBAAA,CAAA;AAuBT,SAAS,kBAAA,CACd,GAAA,EACA,MAAA,EACA,QAAA,EACM;AACN,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,GAAA,CAAI,SAAQ,EAAG;AACxC,IAAA,MAAM,MAAA,GAAS,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA;AAE/B,IAAA,IAAI,OAAO,UAAU,WAAA,EAAa;AAChC,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,iBAAiBc,kCAAA,EAAkB;AACrC,MAAA,kBAAA,CAAmB,KAAA,CAAM,KAAA,EAAO,MAAA,EAAQ,QAAQ,CAAA;AAAA,IAClD,CAAA,MAAO;AACL,MAAA,QAAA,CAAS,QAAQ,KAAK,CAAA;AAAA,IACxB;AAAA,EACF;AACF;AAlBgBd,wBAAA,CAAA,kBAAA,EAAA,oBAAA,CAAA;;;ACnChB,SAAS,cAAA,CAAe,MAAA,EAAiC,IAAA,EAAc,KAAA,EAAsB;AAC3F,EAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,IAAA;AAAA,EACF;AACA,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC/B,EAAA,IAAI,MAAA,GAAkC,MAAA;AACtC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACxC,IAAA,MAAM,GAAA,GAAM,SAAS,CAAC,CAAA;AACtB,IAAA,MAAM,MAAA,GAAS,CAAA,KAAM,QAAA,CAAS,MAAA,GAAS,CAAA;AACvC,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,KAAA;AACd,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAACmC,0BAAA,CAAS,MAAA,CAAO,GAAG,CAAC,CAAA,EAAG;AAC1B,MAAA,MAAA,CAAO,GAAG,IAAI,EAAC;AAAA,IACjB;AACA,IAAA,MAAA,GAAS,OAAO,GAAG,CAAA;AAAA,EACrB;AACF;AAlBSnC,wBAAA,CAAA,cAAA,EAAA,gBAAA,CAAA;AA2BF,IAAM,oBAAA,GAAN,MAAM,oBAAA,CAAqE;AAAA,EAA3E,WAAA,GAAA;AACL,IAAA,IAAA,CAAS,IAAA,GAAO,QAAA;AAChB,IAAA,IAAA,CAAQ,SAAkC,EAAC;AAAA,EAAA;AAAA,EAE3C,SAAA,CAAU,WAAmB,KAAA,EAAgC;AAC3D,IAAA,MAAM,aAAa8C,4CAAA,CAA2B,KAAA,EAAO,EAAE,SAAA,EAAW,MAAM,CAAA;AACxE,IAAA,IAAI,OAAO,eAAe,WAAA,EAAa;AACrC,MAAA,cAAA,CAAe,IAAA,CAAK,MAAA,EAAQ,SAAA,EAAW,UAAU,CAAA;AAAA,IACnD;AAAA,EACF;AAAA,EAEA,OAAA,CAAQ,SAAA,EAAmB,MAAA,EAAe,aAAA,EAAuC;AAE/E,IAAA,cAAA,CAAe,IAAA,CAAK,MAAA,EAAQ,SAAA,EAAW,aAAa,CAAA;AAAA,EACtD;AAAA,EAEA,SAAA,GAAqC;AACnC,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AACF,CAAA;AAnBkF9C,wBAAA,CAAA,oBAAA,EAAA,qBAAA,CAAA;AAA3E,IAAM,mBAAA,GAAN,oBAAA;AA2BA,IAAM,kBAAA,GAAN,MAAM,kBAAA,CAAmE;AAAA,EAAzE,WAAA,GAAA;AACL,IAAA,IAAA,CAAS,IAAA,GAAO,MAAA;AAChB,IAAA,IAAA,CAAQ,SAAkC,EAAC;AAAA,EAAA;AAAA,EAE3C,SAAA,CAAU,WAAmB,KAAA,EAAgC;AAE3D,IAAA,IAAI,UAAA,GAAa,KAAA;AACjB,IAAA,qBAAA,CAAsB,KAAA,EAAO,SAAA,EAAW,CAAC,GAAA,EAAK,GAAA,KAAQ;AACpD,MAAA,UAAA,GAAa,IAAA;AACb,MAAA,IAAA,CAAK,MAAA,CAAO,GAAG,CAAA,GAAI8C,4CAAA,CAA2B,KAAK,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,IACxE,CAAC,CAAA;AAGD,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,MAAM,aAAaA,4CAAA,CAA2B,KAAA,EAAO,EAAE,SAAA,EAAW,MAAM,CAAA;AACxE,MAAA,IAAI,OAAO,eAAe,WAAA,EAAa;AACrC,QAAA,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA,GAAI,UAAA;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAA,CAAQ,SAAA,EAAmB,MAAA,EAAe,aAAA,EAAuC;AAE/E,IAAA,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA,GAAI,aAAA;AAAA,EAC3B;AAAA,EAEA,SAAA,GAAqC;AACnC,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AACF,CAAA;AA7BgF9C,wBAAA,CAAA,kBAAA,EAAA,mBAAA,CAAA;AAAzE,IAAM,iBAAA,GAAN,kBAAA;;;ACxDA,IAAM,iBAAA,GAAN,MAAM,iBAAA,SAAyB,UAAA,CAAW;AAAA,EAC/C,SAAA,CAAU,WAAmB,KAAA,EAAgC;AAC3D,IAAA,KAAA,CAAM,SAAA,CAAU,WAAW,KAAK,CAAA;AAChC,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,SAAA,EAAW+C,4CAAA,CAA2B,KAAK,CAAC,CAAA;AAAA,EAC9D;AAAA,EAEA,SAAA,GAAiC;AAC/B,IAAA,MAAM,SAAA,uBAAgB,GAAA,EAAoB;AAC1C,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,IAAA,CAAK,MAAA,CAAO,SAAQ,EAAG;AAChD,MAAA,SAAA,CAAU,GAAA,CAAI,KAAK,OAAO,KAAA,KAAU,WAAW,KAAA,GAAQA,4CAAA,CAA2B,KAAK,CAAC,CAAA;AAAA,IAC1F;AACA,IAAA,OAAO,SAAA;AAAA,EACT;AACF,CAAA;AAbiD/C,wBAAA,CAAA,iBAAA,EAAA,kBAAA,CAAA;AAA1C,IAAM,gBAAA,GAAN,iBAAA;ACaP,IAAM,iBAAiBgD,kBAAA,CAAE,IAAA,CAAK,CAAC,SAAA,EAAW,QAAQ,CAAC,CAAA;AACnD,IAAM,gCAAgCA,kBAAA,CAAE,MAAA,CAAOA,kBAAA,CAAE,MAAA,IAAU,cAAc,CAAA;AAGzE,IAAM,+BAA+BA,kBAAA,CAAE,KAAA;AAAA,EACrCA,mBAAE,MAAA,CAAO;AAAA,IACP,EAAA,EAAIA,mBAAE,MAAA,EAAO;AAAA,IACb,MAAA,EAAQ;AAAA,GACT;AACH,CAAA;AAGA,IAAM,uBAAA,GAA0BA,mBAAE,KAAA,CAAM;AAAA,EACtC,6BAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,IAAM,WAAA,GAAcA,mBAAE,MAAA,CAAO;AAAA,EAC3B,IAAA,EAAMA,mBAAE,MAAA,EAAO;AAAA,EACf,iBAAA,EAAmB,uBAAA;AAAA,EACnB,iBAAA,EAAmBA,kBAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACvC,WAAA,EAAaA,kBAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACjC,KAAA,EAAOA,kBAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AACpB,CAAC,CAAA;AAED,IAAM,iBAAA,GAAoBA,kBAAA,CAAE,KAAA,CAAM,WAAW,CAAA;AAuBtC,IAAM,WAAA,mBAAchD,wBAAA,CAAA,CAAC,MAAA,EAAqB,SAAA,KAAyC;AACxF,EAAA,OAAO,OAAO,IAAA,CAAK,CAAC,KAAA,KAAU,KAAA,CAAM,SAAS,SAAS,CAAA;AACxD,CAAA,EAF2B,aAAA,CAAA;AA+CpB,IAAM,aAAA,6CACX,SAAA,KACsC;AACtC,EAAA,MAAM,aAAa,SAAA,CAAU,OAAA;AAC7B,EAAA,IAAI,UAAA,EAAY;AAEd,IAAA,IAAImC,0BAAA,CAAS,UAAU,CAAA,IAAK,SAAA,IAAa,UAAA,EAAY;AACnD,MAAA,MAAM,KAAA,GAAQ,iBAAA,CAAkB,SAAA,CAAU,UAAA,CAAW,OAAO,CAAA;AAC5D,MAAA,IAAI,MAAM,OAAA,EAAS;AACjB,QAAA,OAAO,CAAC,SAAA,EAAW,KAAA,CAAM,IAAI,CAAA;AAAA,MAC/B;AAAA,IACF;AAGA,IAAA,MAAM,MAAA,GAAS,iBAAA,CAAkB,SAAA,CAAU,UAAU,CAAA;AACrD,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,OAAO,CAAC,SAAA,EAAW,MAAA,CAAO,IAAI,CAAA;AAAA,IAChC;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT,CAAA,EArB6B,eAAA,CAAA;AA0CtB,IAAM,eAAA,6CAAmB,iBAAA,KAAmD;AACjF,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,iBAAiB,CAAA,EAAG;AACpC,IAAA,OAAO,iBAAA,CAAkB,GAAA,CAAI,CAAC,GAAA,KAAQ,IAAI,EAAE,CAAA;AAAA,EAC9C;AACA,EAAA,OAAO,MAAA,CAAO,KAAK,iBAAiB,CAAA;AACtC,CAAA,EAL+B,iBAAA,CAAA;;;ACpJxB,SAAS,aAAA,CACd,SAAA,EACA,UAAA,EACA,WAAA,EACU;AACV,EAAA,IAAI,YAAY,OAAO,UAAA;AAEvB,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,MAAM,QAAA,GAAW,cAAc,SAAS,CAAA;AACxC,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAM,IAAID,gCAAA,CAAA,sBAAA,wBAAmD;AAAA,QAC3D,IAAA,EAAM,EAAE,SAAA,EAAW,WAAA;AAAY,OAChC,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,GAAG,MAAM,CAAA,GAAI,QAAA;AACnB,IAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,MAAA,EAAQ,WAAW,CAAA;AAE7C,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,MAAM,IAAIA,gCAAA,CAAA,sBAAA,wBAAmD;AAAA,QAC3D,IAAA,EAAM;AAAA,UACJ,SAAA,EAAW,WAAA;AAAA,UACX,iBAAiB,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,IAAI;AAAA;AAC3C,OACD,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,eAAA,CAAgB,MAAM,iBAAiB,CAAA;AAAA,EAChD;AAGA,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA;AAClC,EAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACnB,IAAA,MAAM,IAAIA,gCAAA,CAAA,iCAAA,mCAA8D;AAAA,MACtE,IAAA,EAAM,EAAE,QAAA,EAAU,IAAA;AAAK,KACxB,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,IAAIA,gCAAA,CAAA,yBAAA,0BAAoD;AAChE;AA5CgBlC,wBAAA,CAAA,aAAA,EAAA,eAAA,CAAA;AAkDhB,SAAS,aAAa,OAAA,EAA0C;AAC9D,EAAA,IAAI,mBAAmB,GAAA,EAAK;AAC1B,IAAA,OAAO,OAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAACmC,0BAAA,CAAS,OAAO,CAAA,EAAG;AACtB,IAAA,2BAAW,GAAA,EAAuB;AAAA,EACpC;AAEA,EAAA,IAAI,QAAA,CAAS,OAAO,CAAA,EAAG;AACrB,IAAA,OAAO,mBAAA,CAAoB,SAAS,EAAE,CAAA;AAAA,EACxC;AAEA,EAAA,OAAO,YAAY,OAAO,CAAA;AAC5B;AAdSnC,wBAAA,CAAA,YAAA,EAAA,cAAA,CAAA;AAwBF,SAAS,eAAA,CACd,MACA,QAAA,EACwB;AACxB,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAuB;AAG1C,EAAA,MAAM,OAAA,GACJ,IAAA,YAAgB,GAAA,GAAM,IAAA,CAAK,SAAQ,GAAI,QAAA,CAAS,GAAA,CAAI,CAAC,SAAS,CAAC,IAAA,EAAM,IAAA,CAAK,IAAI,CAAC,CAAU,CAAA;AAE3F,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,OAAO,CAAA,IAAK,OAAA,EAAS;AACpC,IAAA,IAAI,gBAAgB,GAAA,EAAK;AAEvB,MAAA,MAAA,CAAO,GAAA,CAAI,GAAA,EAAK,oBAAA,CAAqB,OAAO,CAAC,CAAA;AAAA,IAC/C,CAAA,MAAO;AAGL,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,MAAM,IAAIkC,gCAAA,CAAA,0BAAA,4BAAuD;AAAA,UAC/D,IAAA,EAAM,EAAE,OAAA,EAAS,GAAA;AAAI,SACtB,CAAA;AAAA,MACH;AAEA,MAAA,IAAI,CAACC,0BAAA,CAAS,OAAO,CAAA,IAAK,EAAE,mBAAmB,GAAA,CAAA,EAAM;AACnD,QAAA,MAAM,IAAID,gCAAA,CAAA,wBAAA,0BAAqD;AAAA,UAC7D,IAAA,EAAM,EAAE,OAAA,EAAS,GAAA;AAAI,SACtB,CAAA;AAAA,MACH;AAEA,MAAA,MAAM,SAAA,GAAY,aAAa,OAAO,CAAA;AAEtC,MAAA,KAAA,MAAW,CAAC,QAAA,EAAU,KAAK,CAAA,IAAK,SAAA,EAAW;AACzC,QAAA,MAAA,CAAO,GAAA,CAAI,QAAA,EAAU,oBAAA,CAAqB,KAAK,CAAC,CAAA;AAAA,MAClD;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAtCgBlC,wBAAA,CAAA,eAAA,EAAA,iBAAA,CAAA;;;AC9DT,SAAS,aAAA,CACd,QACA,OAAA,EACkB;AAClB,EAAA,MAAM,YAAA,GACJ,MAAA,YAAkB,GAAA,GAAM,eAAA,CAAgB,QAAQ,EAAE,CAAA,GAAI,eAAA,CAAgB,EAAE,MAAA,EAAO,EAAG,CAAC,QAAQ,CAAC,CAAA;AAE9F,EAAA,OAAO,WAAA,CAAY,cAAc,OAAO,CAAA;AAC1C;AARgBA,wBAAA,CAAA,aAAA,EAAA,eAAA,CAAA;AAaT,SAAS,gBAAA,CACd,iBACA,OAAA,EACkB;AAClB,EAAA,MAAM,EAAE,UAAA,EAAY,WAAA,EAAY,GAAI,WAAW,EAAC;AAEhD,EAAA,MAAM,QAAA,GAAW,aAAA,CAAc,eAAA,EAAiB,UAAA,EAAY,WAAW,CAAA;AAEvE,EAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,eAAA,EAAiB,QAAQ,CAAA;AAExD,EAAA,OAAO,WAAA,CAAY,QAAQ,OAAO,CAAA;AACpC;AAXgBA,wBAAA,CAAA,gBAAA,EAAA,kBAAA,CAAA;;;ACtBT,IAAM,YAAA,GAAe;AAAA,iBAC1BiD,+BAAA;AAAA,cACA7C,4BAAA;AAAA,eACAO,6BAAA;AAAA,oBACAS,kCAAA;AAAA,kBACAc;AACF;AAEO,IAAM,YAAA,GAAe;AAAA,EAC1B;AACF;ACwBO,IAAM,iBAAwDgB,sBAAA,CAAM,cAAA;AAOzEA,sBAAA,CAAM;AAQD,IAAM,2BAAkEA,sBAAA,CAAM;AAW9E,IAAM,gBAAA,GAAmB,CAAC,QAAA,EAAU,QAAA,EAAU,OAAO,CAAA;AAKrD,IAAM,WAAiDA,sBAAA,CAAM,QAAA;ACxC7D,IAAM,oBAA8DC,mBAAA,CAAG,iBAAA;AAO5EA,mBAAA,CAAG;AAQE,IAAM,8BACXA,mBAAA,CAAG;AAK4DA,mBAAA,CAAG;ACtBpE,SAAS,cAAc,CAAA,EAA0C;AAC/D,EAAA,OAAO,OAAO,MAAM,QAAA,IAAY,CAAA,KAAM,QAAQ,CAAC,KAAA,CAAM,QAAQ,CAAC,CAAA;AAChE;AAFSnD,wBAAA,CAAA,aAAA,EAAA,eAAA,CAAA;AAIT,SAAS,kBAAkB,GAAA,EAAuB;AAChD,EAAA,OAAO,IAAI,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAG,EAAE,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,IAAK,QAAQ,CAAA,EAAA,EAAK,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA,CAAE,KAAK,IAAI,CAAA;AACzF;AAFSA,wBAAA,CAAA,iBAAA,EAAA,mBAAA,CAAA;AAUT,SAAS,+BAA+B,IAAA,EAA0C;AAChF,EAAA,IAAI,CAAC,aAAA,CAAc,IAAI,CAAA,EAAG;AACxB,IAAA,MAAM,IAAI,MAAM,8CAA8C,CAAA;AAAA,EAChE;AAEA,EAAA,MAAM,aAAA,6CAAiB,GAAA,KAAwB;AAC7C,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAG,CAAA;AACtB,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uDAAA,EAA0D,GAAG,CAAA,CAAA,CAAG,CAAA;AAAA,IAClF;AACA,IAAA,OAAO,KAAA;AAAA,EACT,CAAA,EANsB,eAAA,CAAA;AAQtB,EAAA,MAAM,EAAA,GAAK,cAAc,IAAI,CAAA;AAC7B,EAAA,MAAM,IAAA,GAAO,cAAc,MAAM,CAAA;AACjC,EAAA,MAAM,MAAA,GAAS,cAAc,QAAQ,CAAA;AACrC,EAAA,MAAM,IAAA,GAAO,cAAc,MAAM,CAAA;AACjC,EAAA,MAAM,OAAA,GAAU,cAAc,SAAS,CAAA;AAEvC,EAAA,IAAI,EAAE,aAAa,IAAA,CAAA,EAAO;AACxB,IAAA,MAAM,IAAI,MAAM,mDAAmD,CAAA;AAAA,EACrE;AACA,EAAA,MAAM,aAAa,IAAA,CAAK,OAAA;AACxB,EAAA,IAAI,CAAC,aAAA,CAAc,UAAU,CAAA,EAAG;AAC9B,IAAA,MAAM,IAAI,MAAM,uDAAuD,CAAA;AAAA,EACzE;AAEA,EAAA,MAAM,cAAc,UAAA,CAAW,IAAA;AAC/B,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI;AACF,IAAA,IAAI,gBAAgB,OAAA,EAAS;AAC3B,MAAA,OAAA,GAAU,eAAe,UAAU,CAAA;AAAA,IACrC,CAAA,MAAA,IAAW,gBAAgB,UAAA,EAAY;AACrC,MAAA,OAAA,GAAU,kBAAkB,UAAU,CAAA;AAAA,IACxC,CAAA,MAAO;AACL,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,0BAAA,EAA6B,MAAA,CAAO,WAAW,CAAC,CAAA,uCAAA;AAAA,OAClD;AAAA,IACF;AAAA,EACF,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,MAAA,GACJ,GAAA,YAAeoD,yBAAA,GACX,iBAAA,CAAkB,GAAG,CAAA,GACrB,GAAA,YAAe,KAAA,GACb,GAAA,CAAI,OAAA,GACJ,MAAA,CAAO,GAAG,CAAA;AAClB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mCAAA,EAAsC,MAAM,CAAA,CAAE,CAAA;AAAA,EAChE;AAEA,EAAA,IAAI,YAAA;AACJ,EAAA,IAAI,kBAAkB,IAAA,EAAM;AAC1B,IAAA,MAAM,MAAM,IAAA,CAAK,YAAA;AACjB,IAAA,IAAI,QAAQ,IAAA,IAAQ,GAAA,KAAQ,MAAA,IAAa,OAAO,QAAQ,QAAA,EAAU;AAChE,MAAA,MAAM,IAAI,MAAM,mEAAmE,CAAA;AAAA,IACrF;AACA,IAAA,YAAA,GAAe,GAAA;AAAA,EACjB;AAEA,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,QAAQ,IAAA,EAAM,OAAA,EAAS,SAAS,YAAA,EAAa;AAClE;AA3DSpD,wBAAA,CAAA,8BAAA,EAAA,gCAAA,CAAA;AA6DT,eAAsB,sBAAA,CACpB,SAAA,EACA,OAAA,GAAgC,EAAC,EACG;AACpC,EAAA,MAAM,EAAE,OAAA,GAAU,GAAA,EAAO,UAAU,EAAC,EAAG,QAAO,GAAI,OAAA;AAElD,EAAA,MAAM,aAAa,MAAA,GAAS,IAAI,eAAA,EAAgB,GAAI,IAAI,eAAA,EAAgB;AACxE,EAAA,MAAM,YAAY,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,IAAS,OAAO,CAAA;AAE9D,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,MAAA,CAAO,gBAAA,CAAiB,OAAA,EAAS,MAAM,UAAA,CAAW,OAAO,CAAA;AAAA,EAC3D;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,SAAA,EAAW;AAAA,MACtC,QAAQ,UAAA,CAAW,MAAA;AAAA,MACnB,OAAA,EAAS;AAAA,QACP,MAAA,EAAQ,kBAAA;AAAA,QACR,YAAA,EAAc,6BAAA;AAAA,QACd,GAAG;AAAA;AACL,KACD,CAAA;AAED,IAAA,YAAA,CAAa,SAAS,CAAA;AAEtB,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,MAAM,CAAA,oBAAA,EAAuB,QAAA,CAAS,MAAM,CAAA,GAAA,EAAM,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,IACnF;AAEA,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,IAAA,OAAO,+BAA+B,IAAI,CAAA;AAAA,EAC5C,SAAS,KAAA,EAAO;AACd,IAAA,YAAA,CAAa,SAAS,CAAA;AAEtB,IAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,MAAA,IAAI,KAAA,CAAM,SAAS,YAAA,EAAc;AAC/B,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,OAAO,CAAA,EAAA,CAAI,CAAA;AAAA,MAC3D;AAEA,MAAA,IACE,KAAA,CAAM,QAAQ,UAAA,CAAW,0BAA0B,KACnD,KAAA,CAAM,OAAA,CAAQ,UAAA,CAAW,YAAY,CAAA,EACrC;AACA,QAAA,MAAM,KAAA;AAAA,MACR;AACA,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2B,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,IAC5D;AAEA,IAAA,MAAM,IAAI,MAAM,8CAA8C,CAAA;AAAA,EAChE;AACF;AAlDsBA,wBAAA,CAAA,sBAAA,EAAA,wBAAA,CAAA;AAoDtB,eAAsB,uBAAA,CACpB,YACA,MAAA,EACiB;AACjB,EAAA,MAAM,cAAA,GAAiB,MAAA,IAAU,IAAI,MAAA,EAAO;AAE5C,EAAA,IAAI,CAAC,UAAA,IAAc,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG;AAC1C,IAAA,OAAO,cAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,GAAA;AAAA,IAC5B,UAAA,CAAW,GAAA,CAAI,OAAO,GAAA,KAAQ;AAC5B,MAAA,MAAM,cAAA,GAAiB,MAAM,sBAAA,CAAuB,GAAG,CAAA;AACvD,MAAA,OAAO;AAAA,QACL,GAAA;AAAA,QACA,QAAQ,cAAA,CAAe;AAAA,OACzB;AAAA,IACF,CAAC;AAAA,GACH;AAEA,EAAA,OAAO,cAAA,CAAe,gBAAgB,OAAO,CAAA;AAC/C;AArBsBA,wBAAA,CAAA,uBAAA,EAAA,yBAAA,CAAA;;;AC1If,IAAM,oBAAA,GAAuB,kDAAA;AAE7B,IAAM,gBAAA,GAAmB,SAAA;AAEzB,SAAS,sBAAsB,aAAA,EAA+C;AACnF,EAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,KAAA,CAAM,GAAG,CAAA;AACrC,EAAA,MAAM,UAAoB,EAAC;AAE3B,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,GAAA,GAAMqD,+BAAa,IAAI,CAAA;AAC7B,IAAA,IAAI,GAAA,KAAQ,MAAM,OAAO,IAAA;AACzB,IAAA,OAAA,CAAQ,KAAK,GAAG,CAAA;AAAA,EAClB;AAEA,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,KAAA,CAAM,MAAA,EAAQ,OAAO,IAAA;AAE5C,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,IAAA,OAAO,EAAE,KAAA,EAAO,OAAA,CAAQ,CAAC,CAAA,EAAG,KAAA,EAAO,OAAA,CAAQ,CAAC,CAAA,EAAG,KAAA,EAAO,OAAA,CAAQ,CAAC,CAAA,EAAE;AAAA,EACnE;AAEA,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,IAAA,OAAO,EAAE,OAAO,OAAA,CAAQ,CAAC,GAAG,KAAA,EAAO,OAAA,CAAQ,CAAC,CAAA,EAAE;AAAA,EAChD;AAEA,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,IAAA,OAAO,EAAE,KAAA,EAAO,OAAA,CAAQ,CAAC,CAAA,EAAE;AAAA,EAC7B;AAEA,EAAA,OAAO,IAAA;AACT;AAzBgBrD,wBAAA,CAAA,qBAAA,EAAA,uBAAA,CAAA;AA2BT,SAAS,mBAAmB,aAAA,EAAsC;AACvE,EAAA,OAAO,aAAA,KAAkB,QAAA,GAAW,QAAA,GAAW,qBAAA,CAAsB,aAAa,CAAA;AACpF;AAFgBA,wBAAA,CAAA,kBAAA,EAAA,oBAAA,CAAA;AAIT,SAAS,eAAe,OAAA,EAA4C;AACzE,EAAA,IAAI,YAAY,MAAA,EAAW;AACzB,IAAA,OAAO,QAAA;AAAA,EACT;AACA,EAAA,IAAImC,0BAAA,CAAS,OAAO,CAAA,EAAG;AACrB,IAAA,IAAI,OAAA,IAAW,OAAA,EAAS,OAAO,CAAA,EAAG,OAAA,CAAQ,KAAK,CAAA,CAAA,EAAI,OAAA,CAAQ,KAAK,CAAA,CAAA,EAAI,OAAA,CAAQ,KAAK,CAAA,CAAA;AACjF,IAAA,IAAI,OAAA,IAAW,SAAS,OAAO,CAAA,EAAG,QAAQ,KAAK,CAAA,CAAA,EAAI,QAAQ,KAAK,CAAA,CAAA;AAChE,IAAA,OAAO,CAAA,EAAG,QAAQ,KAAK,CAAA,CAAA;AAAA,EACzB;AACA,EAAA,OAAO,QAAA;AACT;AAVgBnC,wBAAA,CAAA,cAAA,EAAA,gBAAA,CAAA;AAYT,SAAS,eACd,MAAA,EACQ;AACR,EAAA,MAAM,EAAE,OAAA,EAAS,QAAA,EAAU,IAAA,EAAM,SAAQ,GAAI,MAAA;AAE7C,EAAA,MAAM,aAAA,GAAgB,eAAe,OAAO,CAAA;AAE5C,EAAA,MAAM,gBAAA,GAAmB,OAAA,KAAY,MAAA,GAAY,oBAAA,GAAuB,OAAA;AAExE,EAAA,IAAI,qBAAqB,EAAA,EAAI;AAC3B,IAAA,OAAO,GAAG,gBAAgB,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,EAAI,IAAI,IAAI,aAAa,CAAA,CAAA,CAAA;AAAA,EACjE;AAEA,EAAA,OAAO,CAAA,EAAG,gBAAgB,CAAA,EAAG,gBAAgB,IAAI,QAAQ,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,aAAa,CAAA,CAAA,CAAA;AACpF;AAdgBA,wBAAA,CAAA,cAAA,EAAA,gBAAA,CAAA;AA0BT,SAAS,eAAe,GAAA,EAAyC;AACtE,EAAA,IAAI,OAAA,GAAU,EAAA;AACd,EAAA,IAAI,QAAA,GAAW,GAAA;AAGf,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,GAAG,CAAA;AACvB,IAAA,OAAA,GAAU,CAAA,EAAG,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK,IAAI,IAAI,CAAA,CAAA;AACtC,IAAA,QAAA,GAAW,GAAA,CAAI,QAAA;AAAA,EACjB,CAAA,CAAA,MAAQ;AAGN,IAAA,IAAI,GAAA,CAAI,QAAA,CAAS,KAAK,CAAA,EAAG;AACvB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,QAAA,GAAW,GAAA;AAAA,EACb;AAGA,EAAA,MAAM,SAAA,GAAY,SAAS,KAAA,CAAM,GAAG,EAAE,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,KAAS,EAAE,CAAA;AAGlE,EAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,SAAA,CAAU,CAAC,CAAA,KAAM,KAAA,IAAS,CAAC,UAAU,CAAC,CAAA,CAAE,UAAA,CAAW,GAAG,CAAA,EAAG;AAC3D,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAA,GAAW,UAAU,CAAC,CAAA;AAC5B,EAAA,IAAI,QAAA,KAAa,QAAA,IAAY,QAAA,KAAa,MAAA,IAAU,aAAa,UAAA,EAAY;AAC3E,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,IAAA,GAAO,UAAU,CAAC,CAAA;AACxB,EAAA,MAAM,OAAA,GAAU,kBAAA,CAAmB,SAAA,CAAU,CAAC,CAAC,CAAA;AAE/C,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,QAAA;AAAA,IACA,IAAA;AAAA,IACA;AAAA,GACF;AACF;AA9CgBA,wBAAA,CAAA,cAAA,EAAA,gBAAA,CAAA;AA0DT,SAAS,WAAW,GAAA,EAAqB;AAC9C,EAAA,MAAM,UAAA,GAAa,eAAe,GAAG,CAAA;AAErC,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,OAAO,GAAA;AAAA,EACT;AAEA,EAAA,MAAM,EAAE,OAAA,EAAS,QAAA,EAAU,IAAA,EAAK,GAAI,UAAA;AAEpC,EAAA,IAAI,YAAY,EAAA,EAAI;AAClB,IAAA,OAAO,CAAA,EAAG,gBAAgB,CAAA,CAAA,EAAI,QAAQ,IAAI,IAAI,CAAA,CAAA,CAAA;AAAA,EAChD;AAEA,EAAA,OAAO,GAAG,OAAO,CAAA,EAAG,gBAAgB,CAAA,CAAA,EAAI,QAAQ,IAAI,IAAI,CAAA,CAAA,CAAA;AAC1D;AAdgBA,wBAAA,CAAA,UAAA,EAAA,YAAA,CAAA;AA+BT,SAAS,mBAAmB,GAAA,EAAqC;AACtE,EAAA,MAAM,UAAA,GAAa,eAAe,GAAG,CAAA;AACrC,EAAA,IAAI,CAAC,UAAA,IAAc,UAAA,CAAW,YAAY,QAAA,IAAY,UAAA,CAAW,YAAY,IAAA,EAAM;AACjF,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,UAAA,CAAW,OAAA;AACpB;AANgBA,wBAAA,CAAA,kBAAA,EAAA,oBAAA,CAAA;AAeT,SAAS,0BAA0B,GAAA,EAAuB;AAC/D,EAAA,MAAM,UAAA,GAAa,eAAe,GAAG,CAAA;AACrC,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,OAAO,CAAC,GAAG,CAAA;AAAA,EACb;AAEA,EAAA,MAAM,aAAuB,EAAC;AAG9B,EAAA,UAAA,CAAW,KAAK,GAAG,CAAA;AAGnB,EAAA,IAAI,UAAA,CAAW,OAAA,KAAY,QAAA,IAAY,UAAA,CAAW,YAAY,IAAA,EAAM;AAClE,IAAA,OAAO,UAAA;AAAA,EACT;AAGA,EAAA,IAAI,OAAA,IAAW,WAAW,OAAA,EAAS;AAEjC,IAAA,UAAA,CAAW,IAAA;AAAA,MACT,cAAA,CAAe;AAAA,QACb,GAAG,UAAA;AAAA,QACH,OAAA,EAAS,EAAE,KAAA,EAAO,UAAA,CAAW,QAAQ,KAAA,EAAO,KAAA,EAAO,UAAA,CAAW,OAAA,CAAQ,KAAA;AAAM,OAC7E;AAAA,KACH;AAAA,EACF;AAEA,EAAA,IAAI,OAAA,IAAW,WAAW,OAAA,EAAS;AAEjC,IAAA,UAAA,CAAW,IAAA;AAAA,MACT,cAAA,CAAe;AAAA,QACb,GAAG,UAAA;AAAA,QACH,OAAA,EAAS,EAAE,KAAA,EAAO,UAAA,CAAW,QAAQ,KAAA;AAAM,OAC5C;AAAA,KACH;AAAA,EACF;AAGA,EAAA,UAAA,CAAW,IAAA;AAAA,IACT,cAAA,CAAe;AAAA,MACb,GAAG,UAAA;AAAA,MACH,OAAA,EAAS;AAAA,KACV;AAAA,GACH;AAEA,EAAA,OAAO,UAAA;AACT;AA9CgBA,wBAAA,CAAA,yBAAA,EAAA,2BAAA,CAAA;AAoDT,SAAS,eAAA,CAAgB,IAAqB,EAAA,EAA6B;AAChF,EAAA,IAAI,GAAG,KAAA,KAAU,EAAA,CAAG,OAAO,OAAO,EAAA,CAAG,QAAQ,EAAA,CAAG,KAAA;AAEhD,EAAA,MAAM,OAAA,GAAU,OAAA,IAAW,EAAA,GAAK,EAAA,CAAG,KAAA,GAAQ,CAAA;AAC3C,EAAA,MAAM,OAAA,GAAU,OAAA,IAAW,EAAA,GAAK,EAAA,CAAG,KAAA,GAAQ,CAAA;AAC3C,EAAA,IAAI,OAAA,KAAY,OAAA,EAAS,OAAO,OAAA,GAAU,OAAA;AAE1C,EAAA,MAAM,OAAA,GAAU,OAAA,IAAW,EAAA,GAAK,EAAA,CAAG,KAAA,GAAQ,CAAA;AAC3C,EAAA,MAAM,OAAA,GAAU,OAAA,IAAW,EAAA,GAAK,EAAA,CAAG,KAAA,GAAQ,CAAA;AAC3C,EAAA,OAAO,OAAA,GAAU,OAAA;AACnB;AAVgBA,wBAAA,CAAA,eAAA,EAAA,iBAAA,CAAA;AAkHT,SAAS,YAAA,CAAa,MAAc,IAAA,EAAuB;AAChE,EAAA,MAAM,WAAA,GAAc,eAAe,IAAI,CAAA;AACvC,EAAA,MAAM,WAAA,GAAc,eAAe,IAAI,CAAA;AAEvC,EAAA,IAAI,CAAC,WAAA,IAAe,CAAC,WAAA,EAAa;AAEhC,IAAA,MAAM,KAAA,GAAQ,WAAW,IAAI,CAAA;AAC7B,IAAA,MAAM,KAAA,GAAQ,WAAW,IAAI,CAAA;AAC7B,IAAA,OAAO,KAAA,KAAU,KAAA;AAAA,EACnB;AAEA,EAAA,OACE,WAAA,CAAY,OAAA,KAAY,WAAA,CAAY,OAAA,IACpC,WAAA,CAAY,aAAa,WAAA,CAAY,QAAA,IACrC,WAAA,CAAY,IAAA,KAAS,WAAA,CAAY,IAAA;AAErC;AAhBgBA,wBAAA,CAAA,YAAA,EAAA,cAAA,CAAA;;;AC3VT,IAAe,YAAA,GAAf,MAAe,YAAA,CAAoC;AAAA,EAAnD,WAAA,GAAA;AACL,IAAA,IAAA,CAAU,KAAA,uBAA6B,GAAA,EAAI;AAC3C,IAAA,IAAA,CAAU,SAAA,uBAAoC,GAAA,EAAI;AAClD,IAAA,IAAA,CAAU,WAAA,uBAAkE,GAAA,EAAI;AAAA,EAAA;AAAA,EAGtE,qBAAqB,GAAA,EAAe;AAC5C,IAAA,OAAO,WAAiB,GAAG,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKU,eAAA,CAAgB,MAAW,IAAA,EAAoB;AACvD,IAAA,OAAO,YAAA,CAAa,MAAM,IAAI,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMU,mBAAmB,GAAA,EAAkC;AAC7D,IAAA,OAAO,mBAAmB,GAAG,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMU,WAAW,GAAA,EAAe;AAClC,IAAA,OAAO,WAAiB,GAAG,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMU,0BAA0B,GAAA,EAAiB;AACnD,IAAA,OAAO,0BAAgC,GAAG,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKU,kBAAkB,GAAA,EAAsB;AAChD,IAAA,MAAM,MAAA,GAAS,eAAe,GAAG,CAAA;AACjC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI,aAAA,GAAwC,IAAA;AAC5C,IAAA,IAAI,SAAA,GAAwB,IAAA;AAE5B,IAAA,KAAA,MAAW,CAAC,OAAO,CAAA,IAAK,IAAA,CAAK,KAAA,EAAO;AAClC,MAAA,MAAM,MAAA,GAAS,eAAe,OAAO,CAAA;AACrC,MAAA,IACE,MAAA,IACA,MAAA,CAAO,OAAA,KAAY,MAAA,CAAO,OAAA,IAC1B,MAAA,CAAO,QAAA,KAAa,MAAA,CAAO,QAAA,IAC3B,MAAA,CAAO,IAAA,KAAS,MAAA,CAAO,IAAA,EACvB;AACA,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,kBAAA,CAAmB,OAAO,CAAA;AAC/C,QAAA,IAAI,MAAA,CAAO,WAAW,OAAA,EAAS;AAC7B,UAAA,IAAI,CAAC,aAAA,IAAiB,eAAA,CAAsB,OAAA,EAAS,aAAa,IAAI,CAAA,EAAG;AACvE,YAAA,aAAA,GAAgB,OAAA;AAChB,YAAA,SAAA,GAAY,OAAA;AAAA,UACd;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,SAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKU,kBAAkB,GAAA,EAAsB;AAEhD,IAAA,IAAI,GAAA,CAAI,QAAA,CAAS,UAAU,CAAA,EAAG;AAC5B,MAAA,OAAO,IAAA,CAAK,kBAAkB,GAAG,CAAA;AAAA,IACnC;AAEA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,yBAAA,CAA0B,GAAG,CAAA;AAErD,IAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,SAAS,CAAA,EAAG;AAC7B,QAAA,OAAO,SAAA;AAAA,MACT;AAGA,MAAA,IAAI,SAAA,CAAU,QAAA,CAAS,UAAU,CAAA,EAAG;AAClC,QAAA,MAAM,SAAA,GAAY,IAAA,CAAK,iBAAA,CAAkB,SAAS,CAAA;AAClD,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,OAAO,SAAA;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKU,kBAAA,CAAmB,WAAgB,SAAA,EAAuB;AAClE,IAAA,IAAI,IAAA,CAAK,eAAA,CAAgB,SAAA,EAAW,SAAS,CAAA,EAAG;AAC9C,MAAA,OAAO,CAAC,SAAS,CAAA;AAAA,IACnB;AAEA,IAAA,MAAM,OAAA,uBAAc,GAAA,EAAS;AAC7B,IAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,UAAA,CAAW,SAAS,CAAA;AAClD,IAAA,OAAA,CAAQ,IAAI,gBAAgB,CAAA;AAE5B,IAAA,MAAM,QAA6B,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAA;AAE5D,IAAA,OAAO,KAAA,CAAM,SAAS,CAAA,EAAG;AACvB,MAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,EAAM;AAC1B,MAAA,IAAI,CAAC,KAAA,EAAO;AACZ,MAAA,MAAM,CAAC,OAAA,EAAS,IAAI,CAAA,GAAI,KAAA;AAExB,MAAA,MAAM,eAAA,GAAyB,CAAC,OAAO,CAAA;AAEvC,MAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,iBAAA,CAAkB,OAAO,CAAA;AACtD,MAAA,IAAI,eAAA,IAAmB,oBAAoB,OAAA,EAAS;AAClD,QAAA,eAAA,CAAgB,KAAK,eAAe,CAAA;AAAA,MACtC;AAGA,MAAA,KAAA,MAAW,CAAC,gBAAgB,CAAA,IAAK,IAAA,CAAK,WAAA,EAAa;AACjD,QAAA,MAAM,wBAAA,GAA2B,IAAA,CAAK,iBAAA,CAAkB,gBAAgB,CAAA;AACxE,QAAA,IAAI,wBAAA,KAA6B,OAAA,IAAW,gBAAA,KAAqB,OAAA,EAAS;AACxE,UAAA,eAAA,CAAgB,KAAK,gBAAgB,CAAA;AAAA,QACvC;AAAA,MACF;AAEA,MAAA,KAAA,MAAW,aAAA,IAAiB,IAAI,GAAA,CAAI,eAAe,CAAA,EAAG;AACpD,QAAA,MAAM,oBAAA,GAAuB,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,aAAa,CAAA;AAC/D,QAAA,IAAI,CAAC,oBAAA,EAAsB;AAE3B,QAAA,KAAA,MAAW,GAAA,IAAO,oBAAA,CAAqB,IAAA,EAAK,EAAG;AAC7C,UAAA,IAAI,IAAA,CAAK,eAAA,CAAgB,GAAA,EAAK,SAAS,CAAA,EAAG;AACxC,YAAA,OAAO,CAAC,GAAG,IAAA,EAAM,GAAG,CAAA;AAAA,UACtB;AAGA,UAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA;AAC1C,UAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA,EAAG;AAChC,YAAA,OAAA,CAAQ,IAAI,cAAc,CAAA;AAC1B,YAAA,KAAA,CAAM,IAAA,CAAK,CAAC,GAAA,EAAK,CAAC,GAAG,IAAA,EAAM,GAAG,CAAC,CAAC,CAAA;AAAA,UAClC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,EAAC;AAAA,EACV;AAAA;AAAA;AAAA;AAAA,EAKO,aAAA,CAAc,WAAgB,SAAA,EAAyB;AAE5D,IAAA,IAAI,KAAK,WAAA,CAAY,GAAA,CAAI,SAAS,CAAA,EAAG,GAAA,CAAI,SAAS,CAAA,EAAG;AACnD,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,iBAAA,CAAkB,SAAS,CAAA,IAAK,SAAA;AAC/D,IAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,iBAAA,CAAkB,SAAS,CAAA,IAAK,SAAA;AAG/D,IAAA,IAAI,KAAK,WAAA,CAAY,GAAA,CAAI,iBAAiB,CAAA,EAAG,GAAA,CAAI,iBAAiB,CAAA,EAAG;AACnE,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,iBAAiB,CAAA;AAChE,IAAA,IAAI,iBAAA,EAAmB;AACrB,MAAA,KAAA,MAAW,mBAAA,IAAuB,iBAAA,CAAkB,IAAA,EAAK,EAAG;AAE1D,QAAA,MAAM,wBAAA,GACJ,IAAA,CAAK,iBAAA,CAAkB,mBAAmB,CAAA,IAAK,mBAAA;AACjD,QAAA,IAAI,6BAA6B,iBAAA,EAAmB;AAClD,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,kBAAA,CAAmB,iBAAA,EAAmB,iBAAiB,CAAA;AACnF,IAAA,OAAO,eAAe,MAAA,GAAS,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKO,QAAQ,GAAA,EAA6B;AAE1C,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AACrC,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,OAAO,UAAA;AAAA,IACT;AAGA,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,iBAAA,CAAkB,GAAG,CAAA;AAC9C,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,WAAW,CAAA;AAAA,IACnC;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKU,kBAAA,CAAmB,KAAA,EAAe,SAAA,EAAgB,SAAA,EAAyB;AAEnF,IAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,iBAAA,CAAkB,SAAS,CAAA,IAAK,SAAA;AAC/D,IAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,iBAAA,CAAkB,SAAS,CAAA,IAAK,SAAA;AAE/D,IAAA,IAAI,sBAAsB,iBAAA,EAAmB;AAC3C,MAAA,OAAO,KAAA;AAAA,IACT;AAGA,IAAA,MAAM,qBAAqB,IAAA,CAAK,WAAA,CAAY,IAAI,iBAAiB,CAAA,EAAG,IAAI,iBAAiB,CAAA;AACzF,IAAA,IAAI,kBAAA,EAAoB;AACtB,MAAA,OAAO,mBAAmB,KAAK,CAAA;AAAA,IACjC;AAGA,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,kBAAA,CAAmB,iBAAA,EAAmB,iBAAiB,CAAA;AACnF,IAAA,IAAI,cAAA,CAAe,WAAW,CAAA,EAAG;AAC/B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,+BAAA,EAAkC,SAAS,CAAA,MAAA,EAAS,SAAS,CAAA,CAAA,CAAG,CAAA;AAAA,IAClF;AAGA,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,cAAA,CAAe,MAAA,GAAS,GAAG,CAAA,EAAA,EAAK;AAClD,MAAA,MAAM,OAAA,GAAU,eAAe,CAAC,CAAA;AAChC,MAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,CAAA,GAAI,CAAC,CAAA;AAGlC,MAAA,IAAI,eAAe,IAAA,CAAK,WAAA,CAAY,IAAI,OAAO,CAAA,EAAG,IAAI,KAAK,CAAA;AAE3D,MAAA,IAAI,CAAC,YAAA,EAAc;AAEjB,QAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,iBAAA,CAAkB,OAAO,CAAA,IAAK,OAAA;AAC3D,QAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,iBAAA,CAAkB,KAAK,CAAA,IAAK,KAAA;AAEvD,QAAA,YAAA,GAAe,KAAK,WAAA,CAAY,GAAA,CAAI,eAAe,CAAA,EAAG,IAAI,aAAa,CAAA;AAEvE,QAAA,IAAI,CAAC,YAAA,EAAc;AAEjB,UAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,eAAe,CAAA;AAC5D,UAAA,IAAI,eAAA,EAAiB;AACnB,YAAA,KAAA,MAAW,CAAC,eAAA,EAAiB,YAAY,CAAA,IAAK,eAAA,EAAiB;AAC7D,cAAA,MAAM,oBAAA,GACJ,IAAA,CAAK,iBAAA,CAAkB,eAAe,CAAA,IAAK,eAAA;AAC7C,cAAA,IAAI,yBAAyB,aAAA,EAAe;AAC1C,gBAAA,YAAA,GAAe,YAAA;AACf,gBAAA;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAGA,UAAA,IAAI,CAAC,YAAA,EAAc;AACjB,YAAA,KAAA,MAAW,CAAC,iBAAA,EAAmB,WAAW,CAAA,IAAK,KAAK,WAAA,EAAa;AAC/D,cAAA,MAAM,sBAAA,GACJ,IAAA,CAAK,iBAAA,CAAkB,iBAAiB,CAAA,IAAK,iBAAA;AAC/C,cAAA,IAAI,2BAA2B,eAAA,EAAiB;AAC9C,gBAAA,KAAA,MAAW,CAAC,eAAA,EAAiB,YAAY,CAAA,IAAK,WAAA,EAAa;AACzD,kBAAA,MAAM,oBAAA,GACJ,IAAA,CAAK,iBAAA,CAAkB,eAAe,CAAA,IAAK,eAAA;AAC7C,kBAAA,IAAI,yBAAyB,aAAA,EAAe;AAC1C,oBAAA,YAAA,GAAe,YAAA;AACf,oBAAA;AAAA,kBACF;AAAA,gBACF;AACA,gBAAA,IAAI,YAAA,EAAc;AAAA,cACpB;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,8BAAA,EAAiC,OAAO,CAAA,MAAA,EAAS,KAAK,CAAA,oBAAA;AAAA,SACxD;AAAA,MACF;AAEA,MAAA,OAAA,GAAU,aAAa,OAAO,CAAA;AAAA,IAChC;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKU,0BAAA,CACR,SAAA,EACA,SAAA,EACA,YAAA,EACM;AACN,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,SAAS,CAAA,EAAG;AACpC,MAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,SAAA,kBAAW,IAAI,KAAK,CAAA;AAAA,IAC3C;AAEA,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,SAAS,CAAA;AAChD,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,SAAA,CAAU,GAAA,CAAI,WAAW,YAAY,CAAA;AAAA,IACvC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAcO,gBAAgB,MAAA,EAAgB;AACrC,IAAA,IAAA,CAAK,YAAA,GAAe,MAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKO,eAAA,GAAkB;AACvB,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMU,wBAAwB,UAAA,EAGhC;AACA,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,MAAA,OAAO,EAAE,UAAA,EAAW;AAAA,IACtB;AAGA,IAAA,OAAO;AAAA,MACL,UAAA;AAAA,MACA,QAAQ,IAAA,CAAK;AAAA,KACf;AAAA,EACF;AACF,CAAA;AArW0DA,wBAAA,CAAA,YAAA,EAAA,aAAA,CAAA;AAAnD,IAAe,WAAA,GAAf,YAAA;;;ACcA,IAAM,gBAAA,uBAA8B,GAAA,CAAI;AAAA,EAC7C;AAAA,IACE,cAAA,CAAe,EAAE,QAAA,EAAU,MAAA,EAAQ,IAAA,EAAM,aAAa,OAAA,EAAS,kBAAA,CAAmB,GAAG,CAAA,EAAG,CAAA;AAAA,IACxF;AAAA,MACE,IAAA,EAAM,KAAA;AAAA,MACN,IAAA,EAAM,OAAA;AAAA,MACN,WAAA,EAAa,qCAAA;AAAA,MACb,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,KAAA,EAAO;AAAA,YACL,IAAA,EAAM;AAAA;AACR;AACF,OACF;AAAA,MACA,YAAA,EAAc;AAAA,QACZ;AAAA,UACE,KAAA,EAAO,uBAAA;AAAA,UACP,OAAA,EAAS,KAAA;AAAA,UACT,MAAA,EAAQ;AAAA,YACN,IAAA,EAAM,wFAAA;AAAA,YACN,MAAA,EAAQ;AAAA;AACV;AACF,OACF;AAAA,MACA,aAAa;AAAC;AAChB;AAEJ,CAAC,CAAA;AAIM,IAAM,aAAA,GAAN,MAAM,aAAA,SAAqB,WAAA,CAA0D;AAAA,EAG1F,WAAA,CAAY,eAAe,gBAAA,EAAkB;AAC3C,IAAA,KAAA,EAAM;AAHR,IAAA,IAAA,CAAQ,YAAA,uBAA8E,GAAA,EAAI;AAIxF,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,IAAI,CAAA,IAAK,YAAA,EAAc;AACtC,MAAA,IAAA,CAAK,QAAA,CAAS,KAAK,IAAI,CAAA;AAAA,IACzB;AAAA,EACF;AAAA,EAEU,YAAY,IAAA,EAAkC;AACtD,IAAA,OAAO,SAAS,IAAI,CAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,KAAA,GAAc;AACnB,IAAA,MAAM,YAAA,GAAe,IAAI,aAAA,iBAAa,IAAI,KAAK,CAAA;AAC/C,IAAA,YAAA,CAAa,QAAQ,IAAA,CAAK,KAAA;AAC1B,IAAA,YAAA,CAAa,YAAY,IAAA,CAAK,SAAA;AAC9B,IAAA,YAAA,CAAa,eAAe,IAAA,CAAK,YAAA;AACjC,IAAA,YAAA,CAAa,cAAc,IAAA,CAAK,WAAA;AAChC,IAAA,OAAO,YAAA;AAAA,EACT;AAAA,EAEO,wBAAA,CAAyB,MAAe,IAAA,EAA0B;AACvE,IAAA,IAAA,CAAK,YAAA,CAAa,OAAA,CAAQ,CAACsD,KAAAA,KAAS;AAClC,MAAA,IAAI;AACF,QAAA,MAAM,EAAE,GAAA,EAAI,GAAI,eAAA,CAAgBA,KAAAA,CAAK,OAAO,MAAM,CAAA;AAClD,QAAA,MAAM,EAAA,6CAAM,IAAA,KAA0C;AACpD,UAAA,MAAM,SAAS,IAAA,CAAK,uBAAA,CAAwB,EAAE,KAAA,EAAO,MAAM,CAAA;AAC3D,UAAA,MAAM,SAAS,IAAI,WAAA,CAAY,GAAA,EAAK,MAAM,EAAE,SAAA,EAAU;AACtD,UAAA,IAAI,EAAE,kBAAkB1B,6BAAA,CAAA,EAAc;AACpC,YAAA,MAAM,IAAIR,kCAAA,CAAA,2BAAA,2BAAmD;AAAA,UAC/D;AACA,UAAA,OAAO,MAAA;AAAA,QACT,CAAA,EAPW,IAAA,CAAA;AAQX,QAAA,IAAA,CAAK,aAAa,GAAA,CAAIkC,KAAAA,CAAK,OAAA,CAAQ,WAAA,IAAe,EAAE,CAAA;AAAA,MACtD,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,IAAIlC,kCAAA,CAAA,oCAAA,qCAA8D;AAAA,UACtE,IAAA,EAAM;AAAA,YACJ,OAAOP,iCAAA,CAAgB,KAAK,CAAA,GAAI,KAAA,GAAQ0C,iCAAe,KAAK;AAAA;AAC9D,SACD,CAAA;AAAA,MACH;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA,EAEO,mBAAA,CAAoB,KAAc,IAAA,EAA0B;AACjE,IAAA,IAAA,CAAK,WAAA,CAAY,OAAA,CAAQ,CAAC,UAAA,KAAe;AAEvC,MAAA,MAAM,SAAA,GAAY,UAAA,CAAW,MAAA,KAAW,OAAA,GAAU,MAAM,UAAA,CAAW,MAAA;AACnE,MAAA,MAAM,SAAA,GAAY,UAAA,CAAW,MAAA,KAAW,OAAA,GAAU,MAAM,UAAA,CAAW,MAAA;AAEnE,MAAA,MAAM,EAAE,GAAA,EAAI,GAAI,eAAA,CAAgB,UAAA,CAAW,OAAO,MAAM,CAAA;AACxD,MAAA,MAAM,EAAA,6CAAM,KAAA,KAAoC;AAC9C,QAAA,MAAM,oBAAoB,IAAA,CAAK,uBAAA,CAAwB,EAAE,KAAA,EAAO,OAAO,CAAA;AACvE,QAAA,MAAM,SAAS,IAAI,WAAA,CAAY,GAAA,EAAK,iBAAiB,EAAE,SAAA,EAAU;AACjE,QAAA,IAAI,EAAE,kBAAkB3B,6BAAA,CAAA,EAAc;AAEpC,UAAA,MAAM,UAAA,GAAa,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA;AACzC,UAAA,IAAI,CAAC,UAAA,EAAY;AACf,YAAA,MAAM,IAAIR,kCAAA,CAAA,mCAAA,oCAA6D;AAAA,cACrE,IAAA,EAAM,EAAE,SAAA;AAAU,aACnB,CAAA;AAAA,UACH;AACA,UAAA,MAAM,QAAQ,OAAO,MAAA,KAAW,QAAA,GAAW,MAAA,GAAU,QAAQ,KAAA,IAAS,IAAA;AACtE,UAAA,OAAO,IAAIQ,6BAAA,CAAY,KAAA,EAAO,WAAW,IAAA,EAAM,IAAA,EAAM,KAAK,YAAY,CAAA;AAAA,QACxE;AACA,QAAA,OAAO,MAAA;AAAA,MACT,CAAA,EAfW,IAAA,CAAA;AAkBX,MAAA,IAAA,CAAK,0BAAA,CAA2B,SAAA,EAAW,SAAA,EAAW,EAAE,CAAA;AAAA,IAC1D,CAAC,CAAA;AAAA,EACH;AAAA,EAEO,QAAA,CAAS,KAAc,IAAA,EAAuD;AACnF,IAAA,IAAI,UAAA;AAEJ,IAAA,IAAI;AACF,MAAA,MAAM,QAAQ,OAAO,IAAA,KAAS,WAAW,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,GAAI,IAAA;AAC5D,MAAA,UAAA,GAAa,eAAe,KAAK,CAAA;AAAA,IACnC,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,OAAA,GACJ,GAAA,YAAewB,yBAAAA,GACX,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAG,CAAA,CAAE,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,IAAK,QAAQ,CAAA,EAAA,EAAK,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,GAChF,GAAA,YAAe,KAAA,GACb,GAAA,CAAI,OAAA,GACJ,MAAA,CAAO,GAAG,CAAA;AAClB,MAAA,MAAM,UAAA,GAAa,OAAO,IAAA,KAAS,QAAA,GAAW;;AAAA;AAAA,EAAc,IAAI,CAAA,CAAA,GAAK,EAAA;AACrE,MAAA,MAAM,IAAI,MAAM,CAAA,oCAAA,EAAuC,GAAG,KAAK,OAAO,CAAA,EAAG,UAAU,CAAA,CAAE,CAAA;AAAA,IACvF;AAEA,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAA,EAAK,UAAU,CAAA;AAC9B,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,QAAA,CAAS,UAAU,GAAG,GAAG,CAAA;AAE5C,IAAA,IAAA,CAAK,wBAAA,CAAyB,KAAK,UAAU,CAAA;AAC7C,IAAA,IAAA,CAAK,mBAAA,CAAoB,KAAK,UAAU,CAAA;AAExC,IAAA,OAAO,UAAA;AAAA,EACT;AAAA,EAEO,cAAc,IAAA,EAA8C;AACjE,IAAA,MAAM,MAAM,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,IAAA,CAAK,aAAa,CAAA;AACjD,IAAA,IAAI,CAAC,GAAA,EAAK;AACV,IAAA,OAAO,IAAA,CAAK,QAAQ,GAAG,CAAA;AAAA,EACzB;AAAA,EAEO,iBAAiB,KAAA,EAAoD;AAC1E,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,OAAA,EAAS,WAAA,EAAY;AACvC,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,OAAO,IAAA,CAAK,cAAc,GAAG,CAAA;AAAA,IAC/B;AAAA,EACF;AAAA,EAEO,eAAe,OAAA,EAA0B;AAC9C,IAAA,OAAO,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,OAAA,CAAQ,aAAa,CAAA;AAAA,EACpD;AAAA,EAEO,kBAAA,CAAmB,SAAiB,IAAA,EAAuC;AAChF,IAAA,MAAM,SAAS,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,OAAA,CAAQ,aAAa,CAAA;AAC1D,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAIhC,kCAAA,CAAA,6BAAA,8BAAuD;AAAA,QAC/D,IAAA,EAAM,EAAE,OAAA;AAAQ,OACjB,CAAA;AAAA,IACH;AACA,IAAA,OAAO,OAAO,IAAI,CAAA;AAAA,EACpB;AAAA,EAEO,mBAAA,CAAoB,YAAoB,UAAA,EAA6B;AAC1E,IAAA,MAAM,YAAY,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,UAAA,CAAW,aAAa,CAAA;AAC7D,IAAA,MAAM,YAAY,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,UAAA,CAAW,aAAa,CAAA;AAE7D,IAAA,IAAI,CAAC,SAAA,IAAa,CAAC,SAAA,EAAW;AAC5B,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,SAAA,EAAW,SAAS,CAAA;AAAA,EAChD;AAAA,EAEO,SAAA,CAAU,OAAoB,SAAA,EAAgC;AACnE,IAAA,MAAM,SAAA,GAAY,KAAK,SAAA,CAAU,GAAA,CAAI,MAAM,OAAA,EAAS,WAAA,MAAiB,EAAE,CAAA;AAEvE,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,MAAM,IAAIA,kCAAA,CAAA,4BAAA,6BAAsD;AAAA,QAC9D,IAAA,EAAM,EAAE,SAAA,EAAW,KAAA,CAAM,WAAW,SAAA;AAAU,OAC/C,CAAA;AAAA,IACH;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,kBAAA,CAAmB,KAAA,EAAO,WAAW,SAAS,CAAA;AAClE,MAAA,MAAA,CAAO,QAAQ,KAAA,CAAM,KAAA;AACrB,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAIA,kCAAA,CAAA,wBAAA,yBAAkD;AAAA,QAC1D,IAAA,EAAM;AAAA,UACJ,OAAOP,iCAAA,CAAgB,KAAK,CAAA,GAAI,KAAA,GAAQ0C,iCAAe,KAAK;AAAA;AAC9D,OACD,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEO,eAAA,CAAgB,OAAoB,UAAA,EAAiC;AAE1E,IAAA,IAAI,MAAM,OAAA,EAAS,WAAA,EAAY,KAAM,UAAA,CAAW,aAAY,EAAG;AAC7D,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,MAAM,YAAY,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,UAAA,CAAW,aAAa,CAAA;AAE7D,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,MAAM,IAAInC,kCAAA,CAAA,4BAAA,6BAAsD;AAAA,QAC9D,IAAA,EAAM,EAAE,SAAA,EAAW,UAAA;AAAW,OAC/B,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,SAAS,CAAA;AAAA,EACxC;AAAA,EAEA,YAAA,CAAa,KAAA,EAAoB,IAAA,EAAoB,cAAA,EAA0C;AAC7F,IAAA,MAAM,UAAA,GAAa,KAAK,qBAAA,EAAsB;AAE9C,IAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,MAAA,MAAM,IAAIA,kCAAA,CAAA,gCAAA,iCAA0D;AAAA,QAClE,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,IAAA,EAAM;AAAA,UACJ,UAAA,EAAY,mBAAmB,UAAU,CAAA;AAAA,UACzC,UAAA,EAAY,KAAK,kBAAA,EAAmB;AAAA,UACpC,SAAA,EAAW,MAAM,OAAA,IAAW;AAAA;AAC9B,OACD,CAAA;AAAA,IACH;AACA,IAAA,MAAM,IAAA,GAAO,WAAW,CAAC,CAAA;AAGzB,IAAA,IAAI,SAAS,OAAA,EAAS;AACpB,MAAA,IAAI,cAAA,CAAe,IAAA,KAAS,QAAA,IAAY,cAAA,CAAe,SAAS,MAAA,EAAQ;AACtE,QAAA,MAAM,IAAIA,kCAAA,CAAA,8BAAA,+BAAwD;AAAA,UAChE,OAAO,IAAA,CAAK,KAAA;AAAA,UACZ,IAAA,EAAM;AAAA,YACJ,eAAe,cAAA,CAAe,IAAA;AAAA,YAC9B,UAAA,EAAY;AAAA;AACd,SACD,CAAA;AAAA,MACH;AACA,MAAA,MAAM,aAAa,cAAA,CAAe,KAAA;AAClC,MAAAoC,kCAAA,CAAiB,UAAU,CAAA;AAC3B,MAAA,KAAA,CAAM,KAAA,GAAQ,UAAA;AACd,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAI,OAAO,KAAA,CAAM,KAAA,KAAU,QAAA,EAAU;AACnC,MAAA,MAAM,IAAIpC,kCAAA,CAAA,+BAAA,gCAAyD;AAAA,QACjE,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,IAAA,EAAM;AAAA,UACJ,UAAA,EAAY,mBAAmB,UAAU,CAAA;AAAA,UACzC,UAAA,EAAY,KAAK,kBAAA,EAAmB;AAAA,UACpC,SAAA,EAAW,MAAM,OAAA,IAAW;AAAA;AAC9B,OACD,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,gBAAA,CAAiB,KAAK,CAAA;AACxC,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,MAAM,IAAIA,kCAAA,CAAA,oBAAA,qBAA8C;AAAA,QACtD,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,IAAA,EAAM;AAAA,UACJ,UAAA,EAAY,KAAK,kBAAA,EAAmB;AAAA,UACpC,SAAA,EAAW,MAAM,OAAA,IAAW;AAAA;AAC9B,OACD,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,MAAM,IAAIA,kCAAA,CAAA,sBAAA,uBAAgD;AAAA,QACxD,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,IAAA,EAAM,EAAE,SAAA,EAAW,KAAA,CAAM,WAAW,SAAA;AAAU,OAC/C,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAC9C,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,MAAM,IAAIA,kCAAA,CAAA,gCAAA,iCAA0D;AAAA,QAClE,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,IAAA,EAAM;AAAA,UACJ,SAAA,EAAW,IAAA;AAAA,UACX,UAAA,EAAY,KAAK,kBAAA,EAAmB;AAAA,UACpC,SAAA,EAAW,MAAM,OAAA,IAAW;AAAA;AAC9B,OACD,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,CAACa,4BAAA,CAAW,UAAA,CAAW,IAAA,EAAM,cAAA,CAAe,IAAI,CAAA,EAAG;AACrD,MAAA,MAAM,IAAIb,kCAAA,CAAA,8BAAA,+BAAwD;AAAA,QAChE,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,IAAA,EAAM;AAAA,UACJ,eAAe,cAAA,CAAe,IAAA;AAAA,UAC9B,UAAA,EAAY,gBAAA,CAAiB,IAAA,CAAK,IAAI;AAAA;AACxC,OACD,CAAA;AAAA,IACH;AAGA,IAAA,MAAM,KAAA,GAAS,KAAA,CAAM,KAAA,IAAS,EAAC;AAC/B,IAAA,KAAA,CAAM,IAAI,CAAA,GAAI,cAAA;AACd,IAAA,KAAA,CAAM,KAAA,GAAQ,KAAA;AAEd,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,YAAA,CAAa,KAAA,EAAe,aAAA,EAAuB,mBAAA,EAAsC;AAC/F,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,aAAa,CAAC,CAAA;AACnD,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,OAAA,CAAQ,aAAa,CAAA;AAE/C,IAAA,IAAI,mBAAA,EAAqB;AAEvB,MAAA,OAAO,SAAA,CAAU,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA;AAAA,IACvC;AAEA,IAAA,OAAO,SAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA6BA,iBAAA,CAAkB,KAAA,EAAoB,IAAA,GAA2B,EAAC,EAAW;AAC3E,IAAA,MAAM,EAAE,aAAA,GAAgB,CAAA,EAAG,mBAAA,GAAsB,MAAK,GAAI,IAAA;AAE1D,IAAA,IAAI,OAAO,KAAA,CAAM,KAAA,KAAU,QAAA,EAAU;AAEnC,MAAA,IAAI,KAAA,CAAM,UAAU,IAAA,EAAM;AACxB,QAAA,OAAOqC,4BAAA,CAAW,KAAA,CAAM,KAAA,EAAO,KAAA,CAAM,KAAK,CAAA;AAAA,MAC5C;AACA,MAAA,OAAO,KAAA,CAAM,KAAA;AAAA,IACf;AAEA,IAAA,IAAI,OAAO,MAAM,KAAA,KAAU,QAAA,IAAY,MAAM,KAAA,KAAU,IAAA,IAAQ,MAAM,OAAA,EAAS;AAC5E,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,gBAAA,CAAiB,KAAK,CAAA;AACxC,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,OAAO,EAAA;AAAA,MACT;AAGA,MAAA,MAAM,KAAA,GACJ,IAAA,CAAK,MAAA,EAAQ,KAAA,IAAS,KAAK,MAAA,CAAO,KAAA,CAAM,MAAA,GAAS,CAAA,GAC7C,KAAK,MAAA,CAAO,KAAA,GACZ,MAAA,CAAO,IAAA,CAAK,MAAM,KAA4B,CAAA;AAGpD,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,GAAA,CAAI,CAAC,GAAA,KAAQ;AAChC,QAAA,MAAM,MAAA,GAAU,KAAA,CAAM,KAAA,CAA8B,GAAG,CAAA;AACvD,QAAA,MAAM,QAAQ,MAAA,EAAQ,KAAA;AACtB,QAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,UAAA,OAAO,IAAA,CAAK,YAAA,CAAa,KAAA,EAAO,aAAA,EAAe,mBAAmB,CAAA;AAAA,QACpE;AACA,QAAA,OAAO,KAAA,EAAO,UAAS,IAAK,GAAA;AAAA,MAC9B,CAAC,CAAA;AAKD,MAAA,IAAIC,+BAAA,CAAc,KAAA,CAAM,KAAK,CAAA,EAAG;AAC9B,QAAA,MAAA,CAAO,KAAK,IAAA,CAAK,YAAA,CAAa,MAAM,KAAA,EAAO,aAAA,EAAe,mBAAmB,CAAC,CAAA;AAAA,MAChF;AAGA,MAAA,MAAM,YAAA,GAAe,KAAA,CAAM,OAAA,CAAQ,WAAA,EAAY;AAC/C,MAAA,OAAO,GAAG,YAAY,CAAA,CAAA,EAAI,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,IAC7C;AAEA,IAAA,OAAO,EAAA;AAAA,EACT;AAAA,EAEO,eAAA,GAAmD;AACxD,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AACF,CAAA;AAnX4F1D,wBAAA,CAAA,aAAA,EAAA,cAAA,CAAA;AAArF,IAAM,YAAA,GAAN;;;AChDP,SAAS,aAAA,CAAc,KAAkB,YAAA,EAA8B;AACrE,EAAA,IAAI,GAAA,KAAQ,MAAA,IAAa,GAAA,KAAQ,IAAA,EAAM;AACrC,IAAA,MAAM,IAAIoB,kCAAA,CAAA,6BAAA,iCAA8D;AAAA,MACtE,IAAA,EAAM,EAAE,YAAA;AAAa,KACtB,CAAA;AAAA,EACH;AACA,EAAA,IAAI,GAAA,YAAeD,8BAAA,EAAc,OAAO,GAAA,CAAI,KAAA;AAC5C,EAAA,IAAI,GAAA,YAAeD,sCAAA,EAAsB,OAAO,GAAA,CAAI,KAAA;AACpD,EAAA,IAAI,OAAO,GAAA,CAAI,KAAA,KAAU,QAAA,SAAiB,GAAA,CAAI,KAAA;AAC9C,EAAA,MAAM,IAAIE,kCAAA,CAAA,6BAAA,iCAA8D;AAAA,IACtE,IAAA,EAAM,EAAE,YAAA;AAAa,GACtB,CAAA;AACH;AAZSpB,wBAAA,CAAA,aAAA,EAAA,eAAA,CAAA;AAiBT,SAAS,IAAA,CACP,GAAA,EACA,EAAA,EACA,YAAA,EACqC;AACrC,EAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,GAAA,EAAK,YAAY,CAAA;AAC7C,EAAA,MAAM,MAAA,GAAS,GAAG,KAAK,CAAA;AACvB,EAAA,IAAI,eAAekB,sCAAA,EAAsB;AACvC,IAAA,OAAO,IAAIA,sCAAA,CAAqB,MAAA,EAAQ,GAAA,CAAI,IAAI,CAAA;AAAA,EAClD;AACA,EAAA,OAAO,IAAIC,+BAAa,MAAM,CAAA;AAChC;AAXSnB,wBAAA,CAAA,IAAA,EAAA,MAAA,CAAA;AAiBT,SAAS,OAAA,CACP,CAAA,EACA,CAAA,EACA,EAAA,EACA,YAAA,EACqC;AACrC,EAAA,MAAM,IAAA,GAAO,aAAA,CAAc,CAAA,EAAG,YAAY,CAAA;AAC1C,EAAA,MAAM,IAAA,GAAO,aAAA,CAAc,CAAA,EAAG,YAAY,CAAA;AAC1C,EAAA,MAAM,MAAA,GAAS,EAAA,CAAG,IAAA,EAAM,IAAI,CAAA;AAC5B,EAAA,IAAI,aAAakB,sCAAA,EAAsB;AACrC,IAAA,OAAO,IAAIA,sCAAA,CAAqB,MAAA,EAAQ,CAAA,CAAE,IAAI,CAAA;AAAA,EAChD;AACA,EAAA,OAAO,IAAIC,+BAAa,MAAM,CAAA;AAChC;AAbSnB,wBAAA,CAAA,OAAA,EAAA,SAAA,CAAA;AAmBT,SAAS,QAAA,CACP,IAAA,EACA,EAAA,EACA,YAAA,EACA,OAAA,EACqC;AACrC,EAAA,IAAI,OAAA,KAAY,MAAA,IAAa,IAAA,CAAK,MAAA,GAAS,OAAA,EAAS;AAClD,IAAA,MAAM,IAAIoB,kCAAA,CAAA,2BAAA,+BAA4D;AAAA,MACpE,IAAA,EAAM,EAAE,YAAA,EAAc,OAAA;AAAQ,KAC/B,CAAA;AAAA,EACH;AACA,EAAA,MAAM,IAAA,GAAO,KAAK,GAAA,CAAI,CAAC,QAAQ,aAAA,CAAc,GAAA,EAAK,YAAY,CAAC,CAAA;AAC/D,EAAA,MAAM,MAAA,GAAS,GAAG,IAAI,CAAA;AACtB,EAAA,MAAM,eAAe,IAAA,CAAK,IAAA,CAAK,CAAC,GAAA,KAAQ,eAAeF,sCAAoB,CAAA;AAG3E,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,OAAO,IAAIA,sCAAA,CAAqB,MAAA,EAAQ,YAAA,CAAa,IAAI,CAAA;AAAA,EAC3D;AACA,EAAA,OAAO,IAAIC,+BAAa,MAAM,CAAA;AAChC;AApBSnB,wBAAA,CAAA,QAAA,EAAA,UAAA,CAAA;AA0BF,SAAS,kBAAkB,cAAA,EAA8D;AAC9F,EAAA,OAAO,IAAI,IAAA,KAAqC;AAC9C,IAAA,IAAI,KAAK,MAAA,GAAS,CAAA;AAChB,MAAA,MAAM,IAAIoB,kCAAA,CAAA,2BAAA,+BAA4D;AAAA,QACpE,IAAA,EAAM,EAAE,YAAA,EAAc,KAAA,EAAO,SAAS,CAAA;AAAE,OACzC,CAAA;AAEH,IAAA,MAAM,WAAW,IAAA,CAAK,IAAA,CAAK,CAAC,GAAA,KAAQ,eAAeF,sCAAoB,CAAA;AAEvE,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAMyC,KAAAA,GAAO,KAAK,GAAA,CAAI,CAAC,QAAQ,aAAA,CAAc,GAAA,EAAK,KAAK,CAAC,CAAA;AACxD,MAAA,OAAO,IAAIxC,8BAAA,CAAawC,KAAAA,CAAK,MAAA,CAAO,CAAC,KAAK,GAAA,KAAQ,GAAA,GAAM,GAAA,EAAK,CAAC,CAAC,CAAA;AAAA,IACjE;AAEA,IAAA,MAAM,cAAc,IAAA,CAAK,MAAA;AAAA,MACvB,CAAC,GAAA,KAAQ,GAAA,YAAexC,8BAAA,IAAgB,GAAA,YAAeD;AAAA,KACzD;AAEA,IAAA,IAAI,WAAA,CAAY,MAAA,KAAW,IAAA,CAAK,MAAA,EAAQ;AACtC,MAAA,MAAM,IAAIE,kCAAA,CAAA,6BAAA,iCAA8D;AAAA,QACtE,IAAA,EAAM,EAAE,YAAA,EAAc,KAAA;AAAM,OAC7B,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,cAAc,cAAA,IAAiB;AACrC,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,IAAI;AACF,QAAA,MAAM,SAAA,GAAY,WAAA,CAAY,qBAAA,CAAsB,WAAW,CAAA;AAC/D,QAAA,MAAMwC,IAAAA,GAAM,UAAU,MAAA,CAAO,CAAC,KAAK,GAAA,KAAQ,GAAA,GAAO,GAAA,CAAI,KAAA,EAAkB,CAAC,CAAA;AAEzE,QAAA,MAAMC,gBAAe,SAAA,CAAU,IAAA;AAAA,UAC7B,CAAC,QAAQ,GAAA,YAAe3C;AAAA,SAC1B;AAEA,QAAA,IAAI2C,aAAAA,EAAc;AAChB,UAAA,OAAO,IAAI3C,sCAAA,CAAqB0C,IAAAA,EAAKC,aAAAA,CAAa,IAAI,CAAA;AAAA,QACxD;AACA,QAAA,OAAO,IAAI1C,+BAAayC,IAAG,CAAA;AAAA,MAC7B,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,IAAIxC,kCAAA,CAAA,2BAAA,+BAA4D;AAAA,UACpE,IAAA,EAAM;AAAA,YACJ,YAAA,EAAc,KAAA;AAAA,YACd,OAAOP,iCAAA,CAAgB,KAAK,CAAA,GAAI,KAAA,GAAQ0C,iCAAe,KAAK;AAAA;AAC9D,SACD,CAAA;AAAA,MACH;AAAA,IACF;AAGA,IAAA,MAAM,eAAe,IAAA,CAAK,IAAA;AAAA,MACxB,CAAC,QAAQ,GAAA,YAAerC;AAAA,KAC1B;AAEA,IAAA,MAAM,IAAA,GAAO,KAAK,GAAA,CAAI,CAAC,QAAQ,aAAA,CAAc,GAAA,EAAK,KAAK,CAAC,CAAA;AACxD,IAAA,MAAM,GAAA,GAAM,KAAK,MAAA,CAAO,CAAC,KAAK,GAAA,KAAQ,GAAA,GAAM,KAAK,CAAC,CAAA;AAElD,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,OAAO,IAAIA,sCAAA,CAAqB,GAAA,EAAK,YAAA,CAAa,IAAI,CAAA;AAAA,IACxD;AACA,IAAA,OAAO,IAAIC,+BAAa,GAAG,CAAA;AAAA,EAC7B,CAAA;AACF;AA7DgBnB,wBAAA,CAAA,iBAAA,EAAA,mBAAA,CAAA;AA+DT,IAAM,aAAA,GAA8C;AAAA,EACzD,GAAA,kBAAKA,wBAAA,CAAA,CAAA,GAAI,IAAA,KAAwB,QAAA,CAAS,MAAM,CAAC,IAAA,KAAS,IAAA,CAAK,GAAA,CAAI,GAAG,IAAI,CAAA,EAAG,KAAA,EAAO,CAAC,CAAA,EAAhF,KAAA,CAAA;AAAA,EAEL,GAAA,kBAAKA,wBAAA,CAAA,CAAA,GAAI,IAAA,KAAwB,QAAA,CAAS,MAAM,CAAC,IAAA,KAAS,IAAA,CAAK,GAAA,CAAI,GAAG,IAAI,CAAA,EAAG,KAAA,EAAO,CAAC,CAAA,EAAhF,KAAA,CAAA;AAAA,EAEL,GAAA,kBAAKA,wBAAA,CAAA,CAAC,CAAA,EAAgB,CAAA,KACpB,OAAA;AAAA,IACE,CAAA;AAAA,IACA,CAAA;AAAA,IACA,CAAC,MAAM,IAAA,KAAS;AACd,MAAA,IAAI,IAAA,KAAS,CAAA;AACX,QAAA,MAAM,IAAIoB,kCAAA,CAAA,qBAAA,yBAAsD;AAAA,UAC9D,IAAA,EAAM,EAAE,YAAA,EAAc,KAAA;AAAM,SAC7B,CAAA;AACH,MAAA,OAAA,CAAS,IAAA,GAAO,OAAQ,IAAA,IAAQ,IAAA;AAAA,IAClC,CAAA;AAAA,IACA;AAAA,GACF,EAZG,KAAA,CAAA;AAAA,EAcL,OAAA,+CAAa,IAAA,KACX,QAAA,CAAS,MAAM,CAAC,IAAA,KAAS,KAAK,MAAA,CAAO,CAAC,KAAK,GAAA,KAAQ,GAAA,GAAM,KAAK,CAAC,CAAA,GAAI,KAAK,MAAA,EAAQ,SAAA,EAAW,CAAC,CAAA,EADrF,SAAA,CAAA;AAAA,EAGT,KAAA,4CAAQ,GAAA,KAAqB,IAAA,CAAK,KAAK,IAAA,CAAK,KAAA,EAAO,OAAO,CAAA,EAAnD,OAAA,CAAA;AAAA,EACP,GAAA,4CAAM,GAAA,KAAqB,IAAA,CAAK,KAAK,IAAA,CAAK,GAAA,EAAK,KAAK,CAAA,EAA/C,KAAA,CAAA;AAAA,EACL,IAAA,4CAAO,GAAA,KAAqB,IAAA,CAAK,KAAK,IAAA,CAAK,IAAA,EAAM,MAAM,CAAA,EAAjD,MAAA,CAAA;AAAA,EACN,KAAA,4CAAQ,GAAA,KAAqB,IAAA,CAAK,KAAK,IAAA,CAAK,KAAA,EAAO,OAAO,CAAA,EAAnD,OAAA,CAAA;AAAA,EACP,IAAA,4CAAO,GAAA,KAAqB,IAAA,CAAK,KAAK,IAAA,CAAK,IAAA,EAAM,MAAM,CAAA,EAAjD,MAAA,CAAA;AAAA,EACN,IAAA,4CAAO,GAAA,KAAqB,IAAA,CAAK,KAAK,IAAA,CAAK,IAAA,EAAM,MAAM,CAAA,EAAjD,MAAA,CAAA;AAAA,EACN,IAAA,kBAAMpB,wBAAA,CAAA,CAAC,GAAA,KAAqB,IAAImB,8BAAA,CAAa,IAAA,CAAK,IAAA,CAAK,aAAA,CAAc,GAAA,EAAK,MAAM,CAAC,CAAC,CAAA,EAA5E,MAAA,CAAA;AAAA,EACN,KAAA,4CAAQ,GAAA,KAAqB,IAAA,CAAK,KAAK,IAAA,CAAK,KAAA,EAAO,OAAO,CAAA,EAAnD,OAAA,CAAA;AAAA,EACP,GAAA,4CAAM,GAAA,KAAqB,IAAA,CAAK,KAAK,IAAA,CAAK,GAAA,EAAK,KAAK,CAAA,EAA/C,KAAA,CAAA;AAAA,EACL,KAAA,4CAAQ,GAAA,KAAqB,IAAA,CAAK,KAAK,IAAA,CAAK,KAAA,EAAO,OAAO,CAAA,EAAnD,OAAA,CAAA;AAAA,EAEP,GAAA,kBAAKnB,wBAAA,CAAA,CAAC,IAAA,EAAmB,GAAA,KAAqB,OAAA,CAAQ,IAAA,EAAM,GAAA,EAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,IAAK,CAAA,EAAG,KAAK,CAAA,EAAnF,KAAA,CAAA;AAAA,EAEL,QAAA,kBAAUA,wBAAA,CAAA,CAAC,KAAA,EAAoB,SAAA,KAA4B;AACzD,IAAA,MAAM,iBAAiB,SAAA,KAAc,MAAA,GAAY,aAAA,CAAc,SAAA,EAAW,UAAU,CAAA,GAAI,CAAA;AACxF,IAAA,MAAM,KACJ,cAAA,KAAmB,CAAA,GACf,IAAA,CAAK,KAAA,GACL,CAAC,CAAA,KAAc;AACb,MAAA,MAAM,SAAS,EAAA,IAAM,cAAA;AACrB,MAAA,OAAO,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,MAAM,CAAA,GAAI,MAAA;AAAA,IAClC,CAAA;AACN,IAAA,OAAO,IAAA,CAAK,KAAA,EAAO,EAAA,EAAI,UAAU,CAAA;AAAA,EACnC,CAAA,EAVU,UAAA,CAAA;AAAA,EAYV,KAAA,kBAAOA,wBAAA,CAAA,CAAA,GAAI,IAAA,KAAwB,QAAA,CAAS,MAAM,CAAC,IAAA,KAAS,IAAA,CAAK,KAAA,CAAM,GAAG,IAAI,CAAA,EAAG,OAAA,EAAS,CAAC,CAAA,EAApF,OAAA,CAAA;AAAA,EAEP,SAAA,kBAAWA,wBAAA,CAAA,CAAC,CAAA,EAAgB,CAAA,KAC1B,OAAA;AAAA,IACE,CAAA;AAAA,IACA,CAAA;AAAA,IACA,CAAC,MAAM,IAAA,KAAS;AACd,MAAA,IAAI,IAAA,KAAS,CAAA;AACX,QAAA,MAAM,IAAIoB,kCAAA,CAAA,qBAAA,yBAAsD;AAAA,UAC9D,IAAA,EAAM,EAAE,YAAA,EAAc,WAAA;AAAY,SACnC,CAAA;AACH,MAAA,OAAO,IAAA,GAAO,IAAA;AAAA,IAChB,CAAA;AAAA,IACA;AAAA,GACF,EAZS,WAAA,CAAA;AAAA;AAAA,EAeX,GAAA,4CAAM,GAAA,KAAqB,IAAA,CAAK,KAAK,IAAA,CAAK,GAAA,EAAK,KAAK,CAAA,EAA/C,KAAA,CAAA;AAAA,EACL,GAAA,4CAAM,GAAA,KAAqB,IAAA,CAAK,KAAK,IAAA,CAAK,GAAA,EAAK,KAAK,CAAA,EAA/C,KAAA,CAAA;AAAA,EACL,GAAA,4CAAM,GAAA,KAAqB,IAAA,CAAK,KAAK,IAAA,CAAK,GAAA,EAAK,KAAK,CAAA,EAA/C,KAAA,CAAA;AAAA,EACL,IAAA,4CAAO,GAAA,KAAqB,IAAA,CAAK,KAAK,IAAA,CAAK,IAAA,EAAM,MAAM,CAAA,EAAjD,MAAA,CAAA;AAAA,EAEN,IAAA,4CAAO,GAAA,KAAqB;AAC1B,IAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,GAAA,EAAK,MAAM,CAAA;AACvC,IAAA,IAAI,KAAA,GAAQ,MAAM,KAAA,GAAQ,CAAA;AACxB,MAAA,MAAM,IAAIA,kCAAA,CAAA,0BAAA,8BAA2D;AAAA,QACnE,IAAA,EAAM,EAAE,YAAA,EAAc,MAAA,EAAQ,YAAY,kBAAA;AAAmB,OAC9D,CAAA;AACH,IAAA,OAAO,IAAA,CAAK,GAAA,EAAK,IAAA,CAAK,IAAA,EAAM,MAAM,CAAA;AAAA,EACpC,CAAA,EAPM,MAAA,CAAA;AAAA,EASN,IAAA,4CAAO,GAAA,KAAqB;AAC1B,IAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,GAAA,EAAK,MAAM,CAAA;AACvC,IAAA,IAAI,KAAA,GAAQ,MAAM,KAAA,GAAQ,CAAA;AACxB,MAAA,MAAM,IAAIA,kCAAA,CAAA,0BAAA,8BAA2D;AAAA,QACnE,IAAA,EAAM,EAAE,YAAA,EAAc,MAAA,EAAQ,YAAY,kBAAA;AAAmB,OAC9D,CAAA;AACH,IAAA,OAAO,IAAA,CAAK,GAAA,EAAK,IAAA,CAAK,IAAA,EAAM,MAAM,CAAA;AAAA,EACpC,CAAA,EAPM,MAAA,CAAA;AAAA,EASN,KAAA,kBAAOpB,wBAAA,CAAA,CAAC,CAAA,EAAgB,CAAA,KAAiC;AACvD,IAAA,MAAM,IAAA,GAAO,aAAA,CAAc,CAAA,EAAG,OAAO,CAAA;AACrC,IAAA,MAAM,IAAA,GAAO,aAAA,CAAc,CAAA,EAAG,OAAO,CAAA;AACrC,IAAA,OAAO,IAAImB,8BAAA,CAAa,IAAA,CAAK,KAAA,CAAM,IAAA,EAAM,IAAI,CAAC,CAAA;AAAA,EAChD,CAAA,EAJO,OAAA,CAAA;AAAA;AAAA,EAOP,IAAA,4CAAO,GAAA,KAAqB,IAAA,CAAK,KAAK,IAAA,CAAK,IAAA,EAAM,MAAM,CAAA,EAAjD,MAAA,CAAA;AAAA,EACN,IAAA,4CAAO,GAAA,KAAqB,IAAA,CAAK,KAAK,IAAA,CAAK,IAAA,EAAM,MAAM,CAAA,EAAjD,MAAA,CAAA;AAAA,EACN,IAAA,4CAAO,GAAA,KAAqB,IAAA,CAAK,KAAK,IAAA,CAAK,IAAA,EAAM,MAAM,CAAA,EAAjD,MAAA,CAAA;AAAA,EACN,KAAA,4CAAQ,GAAA,KAAqB,IAAA,CAAK,KAAK,IAAA,CAAK,KAAA,EAAO,OAAO,CAAA,EAAnD,OAAA,CAAA;AAAA,EAEP,KAAA,4CAAQ,GAAA,KAAqB;AAC3B,IAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,GAAA,EAAK,OAAO,CAAA;AACxC,IAAA,IAAI,QAAQ,CAAA,EAAG;AACb,MAAA,MAAM,IAAIC,kCAAA,CAAA,0BAAA,8BAA2D;AAAA,QACnE,IAAA,EAAM;AAAA,UACJ,YAAA,EAAc,OAAA;AAAA,UACd,UAAA,EAAY;AAAA;AACd,OACD,CAAA;AAAA,IACH;AACA,IAAA,OAAO,IAAA,CAAK,GAAA,EAAK,IAAA,CAAK,KAAA,EAAO,OAAO,CAAA;AAAA,EACtC,CAAA,EAXO,OAAA,CAAA;AAAA,EAaP,KAAA,4CAAQ,GAAA,KAAqB;AAC3B,IAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,GAAA,EAAK,OAAO,CAAA;AACxC,IAAA,IAAI,KAAA,IAAS,EAAA,IAAM,KAAA,IAAS,CAAA,EAAG;AAC7B,MAAA,MAAM,IAAIA,kCAAA,CAAA,0BAAA,8BAA2D;AAAA,QACnE,IAAA,EAAM;AAAA,UACJ,YAAA,EAAc,OAAA;AAAA,UACd,UAAA,EAAY;AAAA;AACd,OACD,CAAA;AAAA,IACH;AACA,IAAA,OAAO,IAAA,CAAK,GAAA,EAAK,IAAA,CAAK,KAAA,EAAO,OAAO,CAAA;AAAA,EACtC,CAAA,EAXO,OAAA,CAAA;AAAA;AAAA,EAcP,GAAA,kBAAKpB,wBAAA,CAAA,CAAC,GAAA,EAAkB,IAAA,KAA4D;AAClF,IAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,GAAA,EAAK,KAAK,CAAA;AACtC,IAAA,IAAI,KAAA,IAAS,CAAA;AACX,MAAA,MAAM,IAAIoB,kCAAA,CAAA,0BAAA,8BAA2D;AAAA,QACnE,IAAA,EAAM,EAAE,YAAA,EAAc,KAAA,EAAO,YAAY,UAAA;AAAW,OACrD,CAAA;AACH,IAAA,IAAI,SAAS,MAAA,EAAW;AACtB,MAAA,OAAO,IAAA,CAAK,GAAA,EAAK,IAAA,CAAK,GAAA,EAAK,KAAK,CAAA;AAAA,IAClC;AACA,IAAA,MAAM,SAAA,GAAY,aAAA,CAAc,IAAA,EAAM,KAAK,CAAA;AAC3C,IAAA,IAAI,SAAA,IAAa,KAAK,SAAA,KAAc,CAAA;AAClC,MAAA,MAAM,IAAIA,kCAAA,CAAA,iBAAA,qBAAkD;AAAA,QAC1D,IAAA,EAAM;AAAA,UACJ,YAAA,EAAc,KAAA;AAAA,UACd,UAAA,EAAY;AAAA;AACd,OACD,CAAA;AACH,IAAA,OAAO,IAAA,CAAK,GAAA,EAAK,CAAC,CAAA,KAAM,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA,EAAG,KAAK,CAAA;AAAA,EAClE,CAAA,EAlBK,KAAA,CAAA;AAAA,EAoBL,EAAA,4CAAK,GAAA,KAAqB;AACxB,IAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,GAAA,EAAK,IAAI,CAAA;AACrC,IAAA,IAAI,SAAS,CAAA,EAAG;AACd,MAAA,MAAM,IAAIA,kCAAA,CAAA,0BAAA,8BAA2D;AAAA,QACnE,IAAA,EAAM,EAAE,YAAA,EAAc,IAAA,EAAM,YAAY,UAAA;AAAW,OACpD,CAAA;AAAA,IACH;AACA,IAAA,OAAO,IAAA,CAAK,GAAA,EAAK,IAAA,CAAK,GAAA,EAAK,IAAI,CAAA;AAAA,EACjC,CAAA,EARI,IAAA,CAAA;AAAA,EAUJ,KAAA,4CAAQ,GAAA,KAAqB;AAC3B,IAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,GAAA,EAAK,OAAO,CAAA;AACxC,IAAA,IAAI,SAAS,CAAA,EAAG;AACd,MAAA,MAAM,IAAIA,kCAAA,CAAA,0BAAA,8BAA2D;AAAA,QACnE,IAAA,EAAM,EAAE,YAAA,EAAc,OAAA,EAAS,YAAY,UAAA;AAAW,OACvD,CAAA;AAAA,IACH;AACA,IAAA,OAAO,IAAA,CAAK,GAAA,EAAK,IAAA,CAAK,KAAA,EAAO,OAAO,CAAA;AAAA,EACtC,CAAA,EARO,OAAA,CAAA;AAAA,EAUP,IAAA,4CAAO,GAAA,KAAqB;AAC1B,IAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,GAAA,EAAK,MAAM,CAAA;AACvC,IAAA,IAAI,SAAS,CAAA,EAAG;AACd,MAAA,MAAM,IAAIA,kCAAA,CAAA,0BAAA,8BAA2D;AAAA,QACnE,IAAA,EAAM,EAAE,YAAA,EAAc,MAAA,EAAQ,YAAY,UAAA;AAAW,OACtD,CAAA;AAAA,IACH;AACA,IAAA,OAAO,IAAA,CAAK,GAAA,EAAK,IAAA,CAAK,IAAA,EAAM,MAAM,CAAA;AAAA,EACpC,CAAA,EARM,MAAA,CAAA;AAAA,EAUN,KAAA,4CAAQ,GAAA,KAAqB;AAC3B,IAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,GAAA,EAAK,OAAO,CAAA;AACxC,IAAA,IAAI,QAAQ,EAAA,EAAI;AACd,MAAA,MAAM,IAAIA,kCAAA,CAAA,0BAAA,8BAA2D;AAAA,QACnE,IAAA,EAAM;AAAA,UACJ,YAAA,EAAc,OAAA;AAAA,UACd,UAAA,EAAY;AAAA;AACd,OACD,CAAA;AAAA,IACH;AACA,IAAA,OAAO,IAAA,CAAK,GAAA,EAAK,IAAA,CAAK,KAAA,EAAO,OAAO,CAAA;AAAA,EACtC,CAAA,EAXO,OAAA,CAAA;AAAA;AAAA,EAcP,oBAAIpB,wBAAA,CAAA,MAAoB,IAAImB,8BAAA,CAAa,IAAA,CAAK,EAAE,CAAA,EAA5C,IAAA;AACN,CAAA;;;ACxUO,IAAM,iBAAA,GAAN,MAAM,iBAAA,SAAyB,WAAA,CAIpC;AAAA,EAGA,WAAA,GAAc;AACZ,IAAA,KAAA,EAAM;AAHR,IAAA,IAAA,CAAQ,WAAA,uBAAmD,GAAA,EAAI;AAI7D,IAAA,IAAA,CAAK,qBAAA,EAAsB;AAAA,EAC7B;AAAA,EAEU,YAAY,IAAA,EAAqC;AACzD,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA,EAEO,KAAA,GAAc;AACnB,IAAA,MAAM,gBAAA,GAAmB,IAAI,iBAAA,EAAiB;AAC9C,IAAA,gBAAA,CAAiB,QAAQ,IAAA,CAAK,KAAA;AAC9B,IAAA,gBAAA,CAAiB,YAAY,IAAA,CAAK,SAAA;AAClC,IAAA,gBAAA,CAAiB,cAAc,IAAA,CAAK,WAAA;AACpC,IAAA,gBAAA,CAAiB,cAAc,IAAA,CAAK,WAAA;AACpC,IAAA,OAAO,gBAAA;AAAA,EACT;AAAA,EAEO,QAAA,CAAS,MAAoB,IAAA,EAA6D;AAC/F,IAAA,IAAI,UAAA;AAEJ,IAAA,IAAI;AACF,MAAA,MAAM,QAAQ,OAAO,IAAA,KAAS,WAAW,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,GAAI,IAAA;AAC5D,MAAA,UAAA,GAAa,kBAAkB,KAAK,CAAA;AAAA,IACtC,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,OAAA,GACJ,GAAA,YAAeiC,yBAAAA,GACX,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAG,CAAA,CAAE,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,IAAK,QAAQ,CAAA,EAAA,EAAK,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,GAChF,GAAA,YAAe,KAAA,GACb,GAAA,CAAI,OAAA,GACJ,MAAA,CAAO,GAAG,CAAA;AAClB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mCAAA,EAAsC,IAAI,CAAA,EAAA,EAAK,OAAO,CAAA,CAAE,CAAA;AAAA,IAC1E;AAEA,IAAA,MAAM,YAAA,GAAe,UAAA,CAAW,OAAA,CAAQ,WAAA,EAAY;AACpD,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,YAAA,EAAc,UAAU,CAAA;AACvC,IAAA,IAAA,CAAK,UAAU,GAAA,CAAI,UAAA,CAAW,IAAA,CAAK,WAAA,IAAe,YAAY,CAAA;AAG9D,IAAA,IAAA,CAAK,wBAAwB,UAAU,CAAA;AAEvC,IAAA,OAAO,UAAA;AAAA,EACT;AAAA,EAEQ,qBAAA,GAA8B;AAEpC,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,IAAI,KAAK,MAAA,CAAO,OAAA,CAAQ,aAAa,CAAA,EAAG;AACxD,MAAA,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAI,CAAA;AAAA,IAClC;AAGA,IAAA,IAAA,CAAK,gBAAA;AAAA,MACH,KAAA;AAAA,MACA,iBAAA,CAAkB,MAAM,IAAA,CAAK,YAAA,EAAc,WAAW;AAAA,KACxD;AAGA,IAAA,IAAA,CAAK,gBAAA;AAAA,MACH,WAAA;AAAA,MACA,CAAC,WAAwB,UAAA,KAA2C;AAClE,QAAA,IAAI,EAAE,SAAA,YAAqBnC,8BAAA,CAAA;AACzB,UAAA,MAAM,IAAIG,kCAAA,CAAA,0BAAA,8BAA2D;AAAA,YACnE,MAAM,EAAE,YAAA,EAAc,aAAa,YAAA,EAAc,QAAA,EAAU,kBAAkB,OAAA;AAAQ,WACtF,CAAA;AACH,QAAA,MAAM,IAAA,GAAO,UAAA,YAAsBD,8BAAA,GAAgB,UAAA,CAAW,KAAA,GAAmB,EAAA;AACjF,QAAA,MAAM,MAAA,GAAS,MAAA,CAAO,QAAA,CAAS,SAAA,CAAU,OAAiB,IAAI,CAAA;AAC9D,QAAA,IAAI,MAAA,CAAO,MAAM,MAAM,CAAA;AACrB,UAAA,MAAM,IAAIC,kCAAA,CAAA,gBAAA,oBAAiD;AAAA,YACzD,IAAA,EAAM,EAAE,YAAA,EAAc,WAAA,EAAa,OAAO,MAAA,CAAO,SAAA,CAAU,KAAK,CAAA,EAAG,IAAA;AAAK,WACzE,CAAA;AACH,QAAA,OAAO,IAAID,+BAAa,MAAM,CAAA;AAAA,MAChC;AAAA,KACF;AAEA,IAAA,IAAA,CAAK,gBAAA,CAAiB,iBAAA,EAAmB,CAAA,GAAI,IAAA,KAAsC;AACjF,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ,IAAI,QAAA,EAAU,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAC9D,MAAA,OAAO,IAAIF,8BAAA,CAAa,CAAA,gBAAA,EAAmB,UAAU,CAAA,CAAA,CAAG,CAAA;AAAA,IAC1D,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,gBAAA,CAAiB,MAAA,EAAQ,CAAC,GAAA,KAAmC;AAChE,MAAA,MAAMc,SAAAA,GAAW,IAAI,WAAA,EAAY;AAEjC,MAAA,IAAIA,SAAAA,CAAS,QAAA,CAAS,GAAG,CAAA,EAAG;AAC1B,QAAA,MAAM,KAAA,GAAQA,SAAAA,CAAS,KAAA,CAAM,GAAG,CAAA;AAChC,QAAA,OAAO,IAAId,+BAAa,KAAA,CAAM,KAAA,CAAM,SAAS,CAAC,CAAA,CAAE,aAAa,CAAA;AAAA,MAC/D;AAEA,MAAA,OAAO,IAAIA,8BAAA,CAAac,SAAAA,CAAS,WAAA,EAAa,CAAA;AAAA,IAChD,CAAC,CAAA;AAGD,IAAA,IAAA,CAAK,gBAAA,CAAiB,SAAA,EAAW,CAAC,GAAA,KAAoC;AACpE,MAAA,OAAO,IAAIP,+BAAA,CAAc,GAAA,CAAI,IAAA,KAAS,MAAM,CAAA;AAAA,IAC9C,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,gBAAA,CAAiB,WAAA,EAAa,CAAC,GAAA,KAAoC;AACtE,MAAA,OAAO,IAAIA,+BAAA,CAAc,GAAA,CAAI,IAAA,KAAS,QAAQ,CAAA;AAAA,IAChD,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,gBAAA,CAAiB,WAAA,EAAa,CAAC,GAAA,KAAoC;AACtE,MAAA,OAAO,IAAIA,+BAAA,CAAc,GAAA,CAAI,IAAA,KAAS,QAAQ,CAAA;AAAA,IAChD,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,gBAAA,CAAiB,YAAA,EAAc,CAAC,GAAA,KAAoC;AACvE,MAAA,OAAO,IAAIA,+BAAA,CAAc,GAAA,CAAI,IAAA,KAAS,SAAS,CAAA;AAAA,IACjD,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,gBAAA,CAAiB,SAAA,EAAW,CAAC,GAAA,KAAoC;AACpE,MAAA,OAAO,IAAIA,+BAAA,CAAc,GAAA,CAAI,IAAA,KAAS,MAAM,CAAA;AAAA,IAC9C,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,gBAAA,CAAiB,qBAAA,EAAuB,CAAC,GAAA,KAAoC;AAChF,MAAA,OAAO,IAAIA,+BAAA,CAAc,GAAA,CAAI,IAAA,KAAS,gBAAgB,CAAA;AAAA,IACxD,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,gBAAA,CAAiB,eAAA,EAAiB,CAAC,GAAA,KAAoC;AAC1E,MAAA,OAAO,IAAIA,+BAAA,CAAc,GAAA,CAAI,IAAA,KAAS,YAAY,CAAA;AAAA,IACpD,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,gBAAA,CAAiB,UAAA,EAAY,CAAC,GAAA,KAAoC;AACrE,MAAA,OAAO,IAAIA,+BAAA,CAAc,GAAA,CAAI,IAAA,KAAS,OAAO,CAAA;AAAA,IAC/C,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,gBAAA,CAAiB,UAAA,EAAY,CAAC,GAAA,KAAoC;AACrE,MAAA,OAAO,IAAIA,+BAAA,CAAc,GAAA,CAAI,IAAA,KAAS,OAAO,CAAA;AAAA,IAC/C,CAAC,CAAA;AAGD,IAAA,IAAA,CAAK,gBAAA,CAAiB,OAAA,EAAS,CAAA,GAAI,IAAA,KAAoC;AACrE,MAAA,IAAI,IAAA,CAAK,MAAA,GAAS,CAAA,IAAK,IAAA,CAAK,SAAS,CAAA,EAAG;AACtC,QAAA,MAAM,IAAIJ,kCAAA,CAAA,2BAAA,+BAA4D;AAAA,UACpE,IAAA,EAAM,EAAE,YAAA,EAAc,OAAA,EAAS,SAAS,CAAA;AAAE,SAC3C,CAAA;AAAA,MACH;AAEA,MAAA,IAAI,KAAA;AACJ,MAAA,IAAI,GAAA;AAEJ,MAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AAErB,QAAA,IAAI,EAAE,IAAA,CAAK,CAAC,CAAA,YAAaD,8BAAA,CAAA,EAAe;AACtC,UAAA,MAAM,IAAIC,kCAAA,CAAA,0BAAA,8BAA2D;AAAA,YACnE,MAAM,EAAE,YAAA,EAAc,SAAS,YAAA,EAAc,QAAA,EAAU,kBAAkB,OAAA;AAAQ,WAClF,CAAA;AAAA,QACH;AACA,QAAA,MAAM,CAAA,GAAI,IAAA,CAAK,CAAC,CAAA,CAAE,KAAA;AAClB,QAAA,IAAI,MAAM,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,IAAK,OAAO,KAAA,CAAM,CAAC,CAAA,IAAK,CAAC,OAAO,QAAA,CAAS,CAAC,KAAK,CAAA,GAAI,CAAA,IAAK,IAAI,GAAA,EAAK;AACrF,UAAA,MAAM,IAAIA,kCAAA,CAAA,0BAAA,8BAA2D;AAAA,YACnE,IAAA,EAAM;AAAA,cACJ,YAAA,EAAc,OAAA;AAAA,cACd,UAAA,EAAY,wDAAwD,CAAC,CAAA;AAAA;AACvE,WACD,CAAA;AAAA,QACH;AACA,QAAA,KAAA,GAAQ,CAAA;AACR,QAAA,GAAA,GAAM,CAAA;AAAA,MACR,CAAA,MAAO;AAEL,QAAA,IAAI,EAAE,IAAA,CAAK,CAAC,CAAA,YAAaD,8BAAA,CAAA,EAAe;AACtC,UAAA,MAAM,IAAIC,kCAAA,CAAA,0BAAA,8BAA2D;AAAA,YACnE,MAAM,EAAE,YAAA,EAAc,SAAS,YAAA,EAAc,QAAA,EAAU,kBAAkB,OAAA;AAAQ,WAClF,CAAA;AAAA,QACH;AACA,QAAA,IAAI,EAAE,IAAA,CAAK,CAAC,CAAA,YAAaD,8BAAA,CAAA,EAAe;AACtC,UAAA,MAAM,IAAIC,kCAAA,CAAA,0BAAA,8BAA2D;AAAA,YACnE,MAAM,EAAE,YAAA,EAAc,SAAS,YAAA,EAAc,QAAA,EAAU,kBAAkB,QAAA;AAAS,WACnF,CAAA;AAAA,QACH;AACA,QAAA,MAAM,EAAA,GAAK,IAAA,CAAK,CAAC,CAAA,CAAE,KAAA;AACnB,QAAA,MAAM,EAAA,GAAK,IAAA,CAAK,CAAC,CAAA,CAAE,KAAA;AACnB,QAAA,IACE,EAAA,KAAO,IAAA,CAAK,KAAA,CAAM,EAAE,CAAA,IACpB,EAAA,KAAO,IAAA,CAAK,KAAA,CAAM,EAAE,CAAA,IACpB,MAAA,CAAO,KAAA,CAAM,EAAE,CAAA,IACf,MAAA,CAAO,KAAA,CAAM,EAAE,CAAA,IACf,CAAC,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA,IACnB,CAAC,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA,EACnB;AACA,UAAA,MAAM,IAAIA,kCAAA,CAAA,0BAAA,8BAA2D;AAAA,YACnE,IAAA,EAAM;AAAA,cACJ,YAAA,EAAc,OAAA;AAAA,cACd,UAAA,EAAY,CAAA,gCAAA,EAAmC,EAAE,CAAA,KAAA,EAAQ,EAAE,CAAA;AAAA;AAC7D,WACD,CAAA;AAAA,QACH;AACA,QAAA,IAAI,EAAA,GAAK,KAAK,GAAA,EAAK;AACjB,UAAA,MAAM,IAAIA,kCAAA,CAAA,0BAAA,8BAA2D;AAAA,YACnE,IAAA,EAAM;AAAA,cACJ,YAAA,EAAc,OAAA;AAAA,cACd,UAAA,EAAY,CAAA,kCAAA,EAAqC,EAAA,GAAK,EAAE,CAAA;AAAA;AAC1D,WACD,CAAA;AAAA,QACH;AACA,QAAA,KAAA,GAAQ,EAAA;AACR,QAAA,GAAA,GAAM,EAAA;AAAA,MACR;AAEA,MAAA,IAAI,MAAM,KAAA,EAAO;AACf,QAAA,OAAO,IAAIO,4BAAA,CAAW,EAAC,EAAG,KAAK,CAAA;AAAA,MACjC;AAEA,MAAA,MAAM,WAA2B,EAAC;AAClC,MAAA,KAAA,IAAS,CAAA,GAAI,KAAA,EAAO,CAAA,GAAI,GAAA,EAAK,CAAA,EAAA,EAAK;AAChC,QAAA,QAAA,CAAS,IAAA,CAAK,IAAIR,8BAAA,CAAa,CAAC,CAAC,CAAA;AAAA,MACnC;AACA,MAAA,OAAO,IAAIQ,4BAAA,CAAW,QAAA,EAAU,KAAK,CAAA;AAAA,IACvC,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,gBAAA,CAAiB,MAAc,IAAA,EAA0B;AAC/D,IAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,IAAA,CAAK,WAAA,IAAe,IAAI,CAAA;AAAA,EAC/C;AAAA,EAEQ,wBAAwB,IAAA,EAAmC;AACjE,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,OAAA,CAAQ,WAAA,EAAY;AAC9C,IAAA,MAAM,MAAA,GAAS,KAAK,MAAA,CAAO,MAAA;AAE3B,IAAA,MAAM,IAAA,gDAAyB,IAAA,KAAqC;AAClE,MAAA,IAAI;AAEF,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,YAAA,EAAc,KAAA,EAAM;AACxC,QAAA,IAAI,CAAC,MAAA,EAAQ;AACX,UAAA,MAAM,IAAIP,kCAAA,CAAA,wBAAA,4BAAyD;AAAA,YACjE,IAAA,EAAM,EAAE,YAAA;AAAa,WACtB,CAAA;AAAA,QACH;AAGA,QAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAM,CAAA;AAC9B,QAAA,MAAM,GAAA,GAAM,IAAI,MAAA,CAAO,KAAK,EAAE,KAAA,EAAM;AACpC,QAAA,MAAM,WAAA,GAAc,IAAI,WAAA,CAAY,GAAA,EAAK;AAAA,UACvC,UAAA,EAAY,EAAE,KAAA,EAAO,IAAA,EAAK;AAAA,UAC1B;AAAA,SACD,CAAA;AAED,QAAA,MAAM,MAAA,GAAS,YAAY,SAAA,EAAU;AACrC,QAAA,IAAI,WAAW,IAAA,EAAM;AACnB,UAAA,MAAM,IAAIA,kCAAA,CAAA,2BAAA,+BAA4D;AAAA,YACpE,IAAA,EAAM,EAAE,YAAA;AAAa,WACtB,CAAA;AAAA,QACH;AAGA,QAAA,IAAI,OAAO,WAAW,QAAA,EAAU;AAC9B,UAAA,OAAO,IAAIH,+BAAa,MAAM,CAAA;AAAA,QAChC;AAEA,QAAA,OAAO,MAAA;AAAA,MACT,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,IAAIG,kCAAA,CAAA,oBAAA,wBAAqD;AAAA,UAC7D,IAAA,EAAM;AAAA,YACJ,YAAA;AAAA,YACA,OAAOP,iCAAA,CAAgB,KAAK,CAAA,GAAI,KAAA,GAAQ0C,iCAAe,KAAK;AAAA;AAC9D,SACD,CAAA;AAAA,MACH;AAAA,IACF,CAAA,EAvC2B,MAAA,CAAA;AAyC3B,IAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,YAAA,EAAc,IAAI,CAAA;AAAA,EACzC;AAAA,EAEO,YAAY,IAAA,EAAwC;AACzD,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,IAAA,CAAK,aAAa,CAAA;AAAA,EAChD;AAAA,EAEO,YAAY,IAAA,EAAuB;AACxC,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,IAAA,CAAK,aAAa,CAAA;AAAA,EAChD;AAAA,EAEO,gBAAA,GAA6B;AAClC,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA;AAAA,EAC3C;AAAA,EAEO,kBAAA,GAAyD;AAC9D,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,oBAAA,CAAqB,IAAA,EAAc,IAAA,EAAqB,KAAA,EAAqB;AAClF,IAAA,MAAM,MAAA,GAAS,KAAK,WAAA,EAAY;AAChC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,MAAM,CAAA;AAElC,IAAA,IAAI,CAAC,IAAA,EAAM,KAAA,EAAO,UAAA,EAAY;AAE9B,IAAA,MAAM,gBAAgB,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,CAAE,MAAA;AAAA,MACzD,CAAC,IAAA,KAAc,CAAC,IAAA,EAAM;AAAA,KACxB,CAAE,MAAA;AACF,IAAA,IAAI,IAAA,CAAK,SAAS,aAAA,EAAe;AAC/B,MAAA,MAAM,IAAInC,kCAAA,CAAA,2BAAA,+BAA4D;AAAA,QACpE,KAAA;AAAA,QACA,IAAA,EAAM,EAAE,YAAA,EAAc,IAAA,EAAM,SAAS,aAAA;AAAc,OACpD,CAAA;AAAA,IACH;AAAA,EACF;AACF,CAAA;AA7SEpB,wBAAA,CAAA,iBAAA,EAAA,kBAAA,CAAA;AAJK,IAAM,gBAAA,GAAN;AC6BA,IAAM,iBAAwD8D,sBAAA,CAAM,cAAA;AAOzEA,sBAAA,CAAM;AAQuEA,sBAAA,CAAM;AAkB9E,IAAMC,YAAiDD,sBAAA,CAAM,QAAA;;;AC/CpE,IAAM,oBAAA,GAAuB,EAAA;AAEtB,IAAM,aAAA,GAAN,MAAM,aAAA,SAAqB,WAAA,CAA0D;AAAA,EAArF,WAAA,GAAA;AAAA,IAAA,KAAA,CAAA,GAAA,SAAA,CAAA;AAML;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,IAAA,CAAQ,iBAAA,uBAA6C,GAAA,EAAI;AAMzD;AAAA;AAAA;AAAA;AAAA,IAAA,IAAA,CAAQ,kBAAA,uBAAyB,GAAA,EAA4B;AAM7D;AAAA;AAAA;AAAA;AAAA,IAAA,IAAA,CAAQ,0BAAA,uBAAiC,GAAA,EAAyB;AAAA,EAAA;AAAA,EAExD,YAAY,IAAA,EAAkC;AACtD,IAAA,OAAOC,UAAS,IAAI,CAAA;AAAA,EACtB;AAAA,EAEO,cAAc,IAAA,EAA8C;AACjE,IAAA,MAAM,MAAM,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,IAAA,CAAK,aAAa,CAAA;AACjD,IAAA,IAAI,CAAC,GAAA,EAAK;AACV,IAAA,OAAO,IAAA,CAAK,QAAQ,GAAG,CAAA;AAAA,EACzB;AAAA,EAEO,KAAA,GAAc;AACnB,IAAA,MAAM,YAAA,GAAe,IAAI,aAAA,EAAa;AACtC,IAAA,YAAA,CAAa,KAAA,GAAQ,IAAI,GAAA,CAAI,IAAA,CAAK,KAAK,CAAA;AACvC,IAAA,YAAA,CAAa,SAAA,GAAY,IAAI,GAAA,CAAI,IAAA,CAAK,SAAS,CAAA;AAC/C,IAAA,YAAA,CAAa,WAAA,GAAc,IAAI,GAAA,CAAI,IAAA,CAAK,WAAW,CAAA;AACnD,IAAA,YAAA,CAAa,iBAAA,GAAoB,IAAI,GAAA,CAAI,IAAA,CAAK,iBAAiB,CAAA;AAC/D,IAAA,YAAA,CAAa,kBAAA,GAAqB,IAAI,GAAA,CAAI,IAAA,CAAK,kBAAkB,CAAA;AACjE,IAAA,YAAA,CAAa,0BAAA,GAA6B,IAAI,GAAA,CAAI,IAAA,CAAK,0BAA0B,CAAA;AACjF,IAAA,OAAO,YAAA;AAAA,EACT;AAAA,EAEO,QAAA,CAAS,KAAc,IAAA,EAAuD;AACnF,IAAA,IAAI,UAAA;AAEJ,IAAA,IAAI;AACF,MAAA,MAAM,QAAQ,OAAO,IAAA,KAAS,WAAW,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,GAAI,IAAA;AAC5D,MAAA,UAAA,GAAa,eAAe,KAAK,CAAA;AAAA,IACnC,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,OAAA,GACJ,GAAA,YAAeX,yBAAAA,GACX,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAG,CAAA,CAAE,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,IAAK,QAAQ,CAAA,EAAA,EAAK,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,GAChF,GAAA,YAAe,KAAA,GACb,GAAA,CAAI,OAAA,GACJ,MAAA,CAAO,GAAG,CAAA;AAClB,MAAA,MAAM,UAAA,GAAa,OAAO,IAAA,KAAS,QAAA,GAAW;AAAA;AAAA,EAAY,IAAI,CAAA,CAAA,GAAK,EAAA;AACnE,MAAA,MAAM,IAAI,MAAM,CAAA,oCAAA,EAAuC,GAAG,KAAK,OAAO,CAAA,EAAG,UAAU,CAAA,CAAE,CAAA;AAAA,IACvF;AAEA,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAA,EAAK,UAAU,CAAA;AAC9B,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAIW,SAAAA,CAAS,UAAU,GAAG,GAAG,CAAA;AAG5C,IAAA,IAAI,WAAW,UAAA,EAAY;AACzB,MAAA,IAAA,CAAK,kBAAA,CAAmB,UAAA,CAAW,IAAA,EAAM,UAAA,CAAW,UAAU,CAAA;AAAA,IAChE;AAEA,IAAA,OAAO,UAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,kBAAA,CACL,WACA,UAAA,EACM;AACN,IAAA,MAAM,cAAA,GAAiB,UAAU,WAAA,EAAY;AAE7C,IAAA,MAAM,MAAA,GAAS,OAAO,UAAA,KAAe,QAAA,GAAW,aAAa,UAAA,CAAW,MAAA;AACxE,IAAA,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,cAAA,EAAgB,MAAM,CAAA;AAEjD,IAAA,IAAA,CAAK,kBAAA,CAAmB,OAAO,cAAc,CAAA;AAC7C,IAAA,IAAA,CAAK,0BAAA,CAA2B,OAAO,cAAc,CAAA;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKO,cAAc,SAAA,EAAuC;AAC1D,IAAA,OAAO,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,SAAA,CAAU,aAAa,CAAA;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,qBAAqB,SAAA,EAA8B;AACxD,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,OAAO,IAAA,CAAK,yBAAyB,SAAS,CAAA;AAAA,IAChD;AAGA,IAAA,MAAM,SAAA,uBAAgB,GAAA,EAAY;AAClC,IAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,iBAAA,CAAkB,IAAA,EAAK,EAAG;AAChD,MAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,wBAAA,CAAyB,IAAI,CAAA,EAAG;AACvD,QAAA,SAAA,CAAU,IAAI,KAAK,CAAA;AAAA,MACrB;AAAA,IACF;AACA,IAAA,OAAO,KAAA,CAAM,KAAK,SAAS,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,yBAAyB,SAAA,EAA6B;AAC5D,IAAA,MAAM,cAAA,GAAiB,UAAU,WAAA,EAAY;AAC7C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,cAAc,CAAA;AACxD,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO,EAAC;AAAA,IACV;AAGA,IAAA,IAAI,GAAA,GAAM,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,cAAc,CAAA;AACpD,IAAA,IAAI,QAAQ,MAAA,EAAW;AACrB,MAAA,IAAI;AACF,QAAA,GAAA,GAAM,IAAI,MAAA,CAAO,IAAI,MAAM,MAAM,CAAC,EAAE,KAAA,EAAM;AAC1C,QAAA,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,cAAA,EAAgB,GAAG,CAAA;AAAA,MACjD,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO,EAAC;AAAA,MACV;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,OAAO,EAAC;AAAA,IACV;AAGA,IAAA,MAAM,cAAc,SAAA,CAAsB,GAAA,EAAK,CAAC,IAAA,KAAS,gBAAgB,UAAU,CAAA;AACnF,IAAA,MAAM,aAAuB,EAAC;AAE9B,IAAA,KAAA,MAAW,cAAc,WAAA,EAAa;AACpC,MAAA,IAAI,UAAA,CAAW,gBAAgB,UAAA,EAAY;AACzC,QAAA,UAAA,CAAW,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,KAAK,CAAA;AAAA,MACvC;AAAA,IACF;AAEA,IAAA,OAAO,UAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaO,QAAA,CACL,SAAA,EACA,KAAA,EACA,WAAA,mBAA2B,IAAI,GAAA,EAAI,EACnC,QAAA,GAAgC,EAAC,EACjC,KAAA,GAAgB,CAAA,EACI;AAEpB,IAAA,IAAI,QAAQ,oBAAA,EAAsB;AAChC,MAAA,OAAO;AAAA,QACL;AAAA,UACE,KAAA,EAAO,KAAA;AAAA,UACP,KAAA,EAAO,+BAAA;AAAA,UACP,SAAA;AAAA,UACA,IAAA,EAAM,QAAA,CAAS,MAAA,GAAS,CAAA,GAAI,QAAA,GAAW;AAAA;AACzC,OACF;AAAA,IACF;AAEA,IAAA,MAAM,UAA8B,EAAC;AAGrC,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,mBAAA,CAAoB,SAAA,EAAW,OAAO,QAAQ,CAAA;AAC1E,IAAA,IAAI,CAAC,eAAe,KAAA,EAAO;AACzB,MAAA,OAAA,CAAQ,KAAK,cAAc,CAAA;AAC3B,MAAA,OAAO,OAAA;AAAA,IACT;AAGA,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,aAAA,CAAc,SAAS,CAAA;AACzC,IAAA,IAAI,CAAC,MAAM,MAAA,EAAQ;AACjB,MAAA,OAAO,CAAC,EAAE,KAAA,EAAO,IAAA,EAAM,WAAW,CAAA;AAAA,IACpC;AAGA,IAAA,IAAI,KAAK,MAAA,CAAO,IAAA,KAAS,MAAA,IAAU,IAAA,CAAK,OAAO,KAAA,EAAO;AACpD,MAAA,MAAM,cAAc,IAAA,CAAK,iBAAA;AAAA,QACvB,KAAA;AAAA,QACA,KAAK,MAAA,CAAO,KAAA;AAAA,QACZ,WAAA;AAAA,QACA,QAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,OAAA,CAAQ,IAAA,CAAK,GAAG,WAAW,CAAA;AAE3B,MAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,QAAA,OAAO,OAAA;AAAA,MACT;AACA,MAAA,OAAO,CAAC,EAAE,KAAA,EAAO,IAAA,EAAM,WAAW,CAAA;AAAA,IACpC;AAGA,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,UAAA,EAAY;AAC3B,MAAA,OAAO,CAAC,EAAE,KAAA,EAAO,IAAA,EAAM,WAAW,CAAA;AAAA,IACpC;AAGA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,KAAK,CAAA;AACvC,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,OAAO,CAAC,EAAE,KAAA,EAAO,IAAA,EAAM,WAAW,CAAA;AAAA,IACpC;AAGA,IAAA,MAAM,cAAc,IAAA,CAAK,wBAAA;AAAA,MACvB,QAAA;AAAA,MACA,KAAK,MAAA,CAAO,UAAA;AAAA,MACZ,WAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,OAAA,CAAQ,IAAA,CAAK,GAAG,WAAW,CAAA;AAG3B,IAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,MAAA,OAAO,OAAA;AAAA,IACT;AACA,IAAA,OAAO,CAAC,EAAE,KAAA,EAAO,IAAA,EAAM,WAAW,CAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,iBAAA,CACN,KAAA,EACA,SAAA,EACA,WAAA,EACA,UACA,KAAA,EACoB;AACpB,IAAA,MAAM,UAA8B,EAAC;AAGrC,IAAA,IAAI,EAAE,iBAAiBpC,4BAAA,CAAA,EAAa;AAClC,MAAA,OAAO,OAAA;AAAA,IACT;AAEA,IAAA,MAAM,QAAQ,KAAA,CAAM,KAAA;AAGpB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,MAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AACpB,MAAA,MAAM,QAAA,GAAW,CAAC,GAAG,QAAA,EAAU,CAAC,CAAA;AAGhC,MAAA,IAAI,SAAA,CAAU,IAAA,KAAS,QAAA,IAAY,SAAA,CAAU,UAAA,EAAY;AACvD,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA;AACrC,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,MAAM,cAAc,IAAA,CAAK,wBAAA;AAAA,YACvB,OAAA;AAAA,YACA,SAAA,CAAU,UAAA;AAAA,YACV,WAAA;AAAA,YACA,QAAA;AAAA,YACA,KAAA,GAAQ;AAAA,WACV;AACA,UAAA,OAAA,CAAQ,IAAA,CAAK,GAAG,WAAW,CAAA;AAAA,QAC7B;AAAA,MACF;AAGA,MAAA,IAAI,SAAA,CAAU,IAAA,KAAS,OAAA,IAAW,SAAA,CAAU,GAAA,EAAK;AAC/C,QAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,GAAG,CAAA;AACjD,QAAA,IAAI,cAAA,EAAgB;AAClB,UAAA,MAAM,UAAA,GAAa,IAAI,GAAA,CAAI,WAAW,CAAA;AACtC,UAAA,UAAA,CAAW,GAAA,CAAI,UAAU,GAAG,CAAA;AAE5B,UAAA,MAAM,gBAAgB,IAAA,CAAK,QAAA;AAAA,YACzB,cAAA,CAAe,IAAA;AAAA,YACf,IAAA;AAAA,YACA,UAAA;AAAA,YACA,QAAA;AAAA,YACA,KAAA,GAAQ;AAAA,WACV;AAEA,UAAA,KAAA,MAAW,UAAU,aAAA,EAAe;AAClC,YAAA,IAAI,CAAC,OAAO,KAAA,EAAO;AACjB,cAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AAAA,YACrB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,wBAAA,CACN,QAAA,EACA,UAAA,EACA,WAAA,EACA,UACA,KAAA,EACoB;AACpB,IAAA,MAAM,UAA8B,EAAC;AAErC,IAAA,KAAA,MAAW,CAAC,QAAA,EAAU,QAAQ,KAAK,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,EAAG;AAC7D,MAAA,MAAM,aAAA,GAAgB,QAAA;AACtB,MAAA,IAAI,aAAA,CAAc,IAAA,KAAS,OAAA,IAAW,CAAC,cAAc,GAAA,EAAK;AACxD,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,WAAA,CAAY,GAAA,CAAI,aAAA,CAAc,GAAG,CAAA,EAAG;AACtC,QAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,UACX,KAAA,EAAO,KAAA;AAAA,UACP,KAAA,EAAO,oBAAA;AAAA,UACP,WAAW,aAAA,CAAc,GAAA;AAAA,UACzB,IAAA,EAAM,CAAC,GAAG,QAAA,EAAU,QAAQ;AAAA,SAC7B,CAAA;AACD,QAAA;AAAA,MACF;AAGA,MAAA,MAAM,SAAA,GAAY,QAAA,CAAS,GAAA,CAAI,QAAQ,CAAA;AACvC,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA;AAAA,MACF;AAGA,MAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,GAAG,CAAA;AACrD,MAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,QAAA;AAAA,MACF;AAGA,MAAA,MAAM,UAAA,GAAa,IAAI,GAAA,CAAI,WAAW,CAAA;AACtC,MAAA,UAAA,CAAW,GAAA,CAAI,cAAc,GAAG,CAAA;AAEhC,MAAA,MAAM,gBAAgB,IAAA,CAAK,QAAA;AAAA,QACzB,cAAA,CAAe,IAAA;AAAA,QACf,SAAA;AAAA,QACA,UAAA;AAAA,QACA,CAAC,GAAG,QAAA,EAAU,QAAQ,CAAA;AAAA,QACtB,KAAA,GAAQ;AAAA,OACV;AAGA,MAAA,KAAA,MAAW,UAAU,aAAA,EAAe;AAClC,QAAA,IAAI,CAAC,OAAO,KAAA,EAAO;AACjB,UAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,mBAAA,CACN,SAAA,EACA,KAAA,EACA,IAAA,GAA4B,EAAC,EACX;AAClB,IAAA,MAAM,cAAA,GAAiB,UAAU,WAAA,EAAY;AAC7C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,SAAS,CAAA;AAC3C,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,SAAA,EAAU;AAAA,IAClC;AAEA,IAAA,IAAI;AAEF,MAAA,IAAI,WAAA,GAAc,IAAA,CAAK,0BAAA,CAA2B,GAAA,CAAI,cAAc,CAAA;AAEpE,MAAA,IAAI,CAAC,WAAA,EAAa;AAEhB,QAAA,IAAI,GAAA,GAAM,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,cAAc,CAAA;AACpD,QAAA,IAAI,QAAQ,KAAA,CAAA,EAAW;AACrB,UAAA,GAAA,GAAM,IAAI,MAAA,CAAO,IAAI,MAAM,MAAM,CAAC,EAAE,KAAA,EAAM;AAC1C,UAAA,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,cAAA,EAAgB,GAAG,CAAA;AAAA,QACjD;AAGA,QAAA,WAAA,GAAc,IAAI,YAAY,GAAA,EAAK;AAAA,UACjC,MAAA,EAAQ,KAAK,YAAA,IAAgB,KAAA;AAAA,SAC9B,CAAA;AACD,QAAA,IAAA,CAAK,0BAAA,CAA2B,GAAA,CAAI,cAAA,EAAgB,WAAW,CAAA;AAAA,MACjE;AAGA,MAAA,WAAA,CAAY,gBAAA,EAAiB;AAC7B,MAAA,WAAA,CAAY,YAAA,CAAa,SAAS,KAAK,CAAA;AAEvC,MAAA,MAAM,MAAA,GAAS,YAAY,SAAA,EAAU;AAErC,MAAA,IAAI,MAAA,YAAkBH,+BAAA,IAAiB,MAAA,CAAO,KAAA,KAAU,IAAA,EAAM;AAC5D,QAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,SAAA,EAAU;AAAA,MAClC;AACA,MAAA,IAAI,kBAAkBP,8BAAA,EAAc;AAClC,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,KAAA;AAAA,UACP,OAAO,MAAA,CAAO,KAAA;AAAA,UACd,SAAA;AAAA,UACA,IAAA,EAAM,IAAA,CAAK,MAAA,GAAS,CAAA,GAAI,IAAA,GAAO,KAAA;AAAA,SACjC;AAAA,MACF;AACA,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,KAAA;AAAA,QACP,KAAA,EAAO,2BAAA;AAAA,QACP,SAAA;AAAA,QACA,IAAA,EAAM,IAAA,CAAK,MAAA,GAAS,CAAA,GAAI,IAAA,GAAO,KAAA;AAAA,OACjC;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,KAAA;AAAA,QACP,KAAA,EAAO,qBAAqB,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA;AAAA,QAClF,SAAA;AAAA,QACA,IAAA,EAAM,IAAA,CAAK,MAAA,GAAS,CAAA,GAAI,IAAA,GAAO;AAAA,OACjC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAY,KAAA,EAAqD;AACvE,IAAA,IAAI,iBAAiBH,kCAAA,EAAkB;AACrC,MAAA,OAAO,KAAA,CAAM,KAAA;AAAA,IACf;AACA,IAAA,IAAI,KAAA,YAAiBsB,6BAAA,IAAe,KAAA,CAAM,KAAA,YAAiB,GAAA,EAAK;AAC9D,MAAA,OAAO,KAAA,CAAM,KAAA;AAAA,IACf;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACF,CAAA;AAxc4FpC,wBAAA,CAAA,aAAA,EAAA,cAAA,CAAA;AAArF,IAAM,YAAA,GAAN,aAAA;ACGA,IAAM,gBAAsDgE,qBAAA,CAAK,aAAA;AAOtEA,qBAAA,CAAK;AAQA,IAAM,0BAAgEA,qBAAA,CAAK;AAgB3E,IAAMD,YAAgDC,qBAAA,CAAK,QAAA;;;AClDlE,IAAM,aAAa,cAAA,CAAe;AAAA,EAChC,QAAA,EAAU,MAAA;AAAA,EACV,IAAA,EAAM,SAAA;AAAA,EACN,OAAA,EAAS,mBAAmB,GAAG;AACjC,CAAC,CAAA;AAED,IAAM,eAAe,cAAA,CAAe;AAAA,EAClC,QAAA,EAAU,MAAA;AAAA,EACV,IAAA,EAAM,cAAA;AAAA,EACN,OAAA,EAAS,mBAAmB,GAAG;AACjC,CAAC,CAAA;AAED,IAAM,gBAAA,uBAA8B,GAAA,CAAI;AAAA,EACtC;AAAA,IACE,YAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAM,SAAA;AAAA,MACN,IAAA,EAAM,UAAA;AAAA,MACN,OAAA,EAAS,GAAA;AAAA,MACT,WAAA,EAAa,qCAAA;AAAA,MACb,aAAa;AAAC;AAChB,GACF;AAAA,EACA;AAAA,IACE,cAAA,CAAe,EAAE,QAAA,EAAU,MAAA,EAAQ,IAAA,EAAM,WAAW,OAAA,EAAS,kBAAA,CAAmB,GAAG,CAAA,EAAG,CAAA;AAAA,IACtF;AAAA,MACE,IAAA,EAAM,cAAA;AAAA,MACN,IAAA,EAAM,UAAA;AAAA,MACN,OAAA,EAAS,IAAA;AAAA,MACT,WAAA,EAAa,0CAAA;AAAA,MACb,WAAA,EAAa;AAAA,QACX;AAAA,UACE,MAAA,EAAQ,OAAA;AAAA,UACR,MAAA,EAAQ,YAAA;AAAA,UACR,MAAA,EAAQ;AAAA,YACN,MAAA,EAAQ;AAAA,WACV;AAAA,UACA,WAAA,EAAa;AAAA,SACf;AAAA,QACA;AAAA,UACE,MAAA,EAAQ,YAAA;AAAA,UACR,MAAA,EAAQ,OAAA;AAAA,UACR,MAAA,EAAQ;AAAA,YACN,MAAA,EAAQ;AAAA,WACV;AAAA,UACA,WAAA,EAAa;AAAA;AACf;AACF;AACF,GACF;AAAA,EACA;AAAA,IACE,UAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAM,OAAA;AAAA,MACN,IAAA,EAAM,UAAA;AAAA,MACN,OAAA,EAAS,IAAA;AAAA,MACT,WAAA,EAAa,mDAAA;AAAA,MACb,aAAa;AAAC;AAChB,GACF;AAAA,EACA;AAAA,IACE,cAAA,CAAe,EAAE,QAAA,EAAU,MAAA,EAAQ,IAAA,EAAM,YAAY,OAAA,EAAS,kBAAA,CAAmB,GAAG,CAAA,EAAG,CAAA;AAAA,IACvF;AAAA,MACE,IAAA,EAAM,SAAA;AAAA,MACN,IAAA,EAAM,UAAA;AAAA,MACN,OAAA,EAAS,KAAA;AAAA,MACT,WAAA,EAAa,iDAAA;AAAA,MACb,WAAA,EAAa;AAAA,QACX;AAAA,UACE,MAAA,EAAQ,OAAA;AAAA,UACR,MAAA,EAAQ,UAAA;AAAA,UACR,MAAA,EAAQ;AAAA,YACN,MAAA,EAAQ;AAAA,WACV;AAAA,UACA,WAAA,EAAa;AAAA,SACf;AAAA,QACA;AAAA,UACE,MAAA,EAAQ,UAAA;AAAA,UACR,MAAA,EAAQ,OAAA;AAAA,UACR,MAAA,EAAQ;AAAA,YACN,MAAA,EAAQ;AAAA,WACV;AAAA,UACA,WAAA,EAAa;AAAA;AACf;AACF;AACF,GACF;AAAA,EACA;AAAA,IACE,8EAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAM,SAAA;AAAA,MACN,IAAA,EAAM,UAAA;AAAA,MACN,OAAA,EAAS,GAAA;AAAA,MACT,WAAA,EAAa,oDAAA;AAAA,MACb,WAAA,EAAa;AAAA,QACX,MAAA,EAAQ;AAAA,OACV;AAAA,MACA,aAAa;AAAC;AAChB,GACF;AAAA,EACA;AAAA,IACE,cAAA,CAAe,EAAE,QAAA,EAAU,MAAA,EAAQ,IAAA,EAAM,WAAW,OAAA,EAAS,kBAAA,CAAmB,GAAG,CAAA,EAAG,CAAA;AAAA,IACtF;AAAA,MACE,IAAA,EAAM,WAAA;AAAA,MACN,IAAA,EAAM,UAAA;AAAA,MACN,OAAA,EAAS,IAAA;AAAA,MACT,WAAA,EAAa,mEAAA;AAAA,MACb,aAAa;AAAC;AAChB;AAEJ,CAAC,CAAA;AAIM,IAAM,YAAA,GAAN,MAAM,YAAA,SAAoB,WAAA,CAI/B;AAAA,EAGA,WAAA,CAAY,eAAe,gBAAA,EAAkB;AAC3C,IAAA,KAAA,EAAM;AAHR,IAAA,IAAA,CAAQ,YAAA,uBAA0C,GAAA,EAAI;AAIpD,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,IAAI,CAAA,IAAK,YAAA,EAAc;AACtC,MAAA,IAAA,CAAK,QAAA,CAAS,KAAK,IAAI,CAAA;AAAA,IACzB;AAAA,EACF;AAAA,EAEU,YAAY,IAAA,EAAiC;AACrD,IAAA,OAAOD,UAAS,IAAI,CAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,KAAA,GAAc;AACnB,IAAA,MAAM,WAAA,GAAc,IAAI,YAAA,iBAAY,IAAI,KAAK,CAAA;AAC7C,IAAA,WAAA,CAAY,QAAQ,IAAA,CAAK,KAAA;AACzB,IAAA,WAAA,CAAY,YAAY,IAAA,CAAK,SAAA;AAC7B,IAAA,WAAA,CAAY,cAAc,IAAA,CAAK,WAAA;AAC/B,IAAA,WAAA,CAAY,eAAe,IAAA,CAAK,YAAA;AAChC,IAAA,OAAO,WAAA;AAAA,EACT;AAAA,EAEO,mBAAA,CAAoB,KAAc,IAAA,EAAyB;AAChE,IAAA,IAAA,CAAK,WAAA,EAAa,OAAA,CAAQ,CAAC,UAAA,KAAe;AAExC,MAAA,MAAM,SAAA,GAAY,UAAA,CAAW,MAAA,KAAW,OAAA,GAAU,MAAM,UAAA,CAAW,MAAA;AACnE,MAAA,MAAM,SAAA,GAAY,UAAA,CAAW,MAAA,KAAW,OAAA,GAAU,MAAM,UAAA,CAAW,MAAA;AAEnE,MAAA,MAAM,EAAE,GAAA,EAAI,GAAI,eAAA,CAAgB,UAAA,CAAW,OAAO,MAAM,CAAA;AACxD,MAAA,MAAM,EAAA,6CAAM,IAAA,KAAqD;AAC/D,QAAA,MAAM,SAAS,IAAA,CAAK,uBAAA,CAAwB,EAAE,KAAA,EAAO,MAAM,CAAA;AAC3D,QAAA,MAAM,SAAS,IAAI,WAAA,CAAY,GAAA,EAAK,MAAM,EAAE,SAAA,EAAU;AACtD,QAAA,IAAI,EAAE,kBAAkB7C,sCAAA,CAAA,EAAuB;AAC7C,UAAA,MAAM,IAAIE,kCAAA,CAAA,yBAAA,2BAAmD;AAAA,YAC3D,IAAA,EAAM,EAAE,KAAA,EAAO,6DAAA;AAA8D,WAC9E,CAAA;AAAA,QACH;AACA,QAAA,OAAO,MAAA;AAAA,MACT,CAAA,EATW,IAAA,CAAA;AAWX,MAAA,IAAA,CAAK,0BAAA,CAA2B,SAAA,EAAW,SAAA,EAAW,EAAE,CAAA;AAAA,IAC1D,CAAC,CAAA;AAAA,EACH;AAAA,EAEO,QAAA,CAAS,KAAc,IAAA,EAAqD;AACjF,IAAA,IAAI,UAAA;AAEJ,IAAA,IAAI;AACF,MAAA,MAAM,QAAQ,OAAO,IAAA,KAAS,WAAW,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,GAAI,IAAA;AAC5D,MAAA,UAAA,GAAa,cAAc,KAAK,CAAA;AAAA,IAClC,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,OAAA,GACJ,GAAA,YAAegC,yBAAAA,GACX,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAG,CAAA,CAAE,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,IAAK,QAAQ,CAAA,EAAA,EAAK,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,GAChF,GAAA,YAAe,KAAA,GACb,GAAA,CAAI,OAAA,GACJ,MAAA,CAAO,GAAG,CAAA;AAClB,MAAA,MAAM,UAAA,GAAa,OAAO,IAAA,KAAS,QAAA,GAAW;;AAAA;AAAA,EAAc,IAAI,CAAA,CAAA,GAAK,EAAA;AACrE,MAAA,MAAM,IAAI,MAAM,CAAA,mCAAA,EAAsC,GAAG,KAAK,OAAO,CAAA,EAAG,UAAU,CAAA,CAAE,CAAA;AAAA,IACtF;AAEA,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAA,EAAK,UAAU,CAAA;AAC9B,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAIW,SAAAA,CAAS,UAAU,GAAG,GAAG,CAAA;AAC5C,IAAA,IAAA,CAAK,aAAa,GAAA,CAAI,UAAA,CAAW,OAAA,CAAQ,WAAA,IAAe,GAAG,CAAA;AAE3D,IAAA,IAAA,CAAK,mBAAA,CAAoB,KAAK,UAAU,CAAA;AAExC,IAAA,OAAO,UAAA;AAAA,EACT;AAAA,EAEO,iBAAiB,OAAA,EAAiD;AACvE,IAAA,MAAM,MAAM,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,OAAA,CAAQ,aAAa,CAAA;AACvD,IAAA,IAAI,CAAC,GAAA,EAAK;AACV,IAAA,OAAO,IAAA,CAAK,QAAQ,GAAG,CAAA;AAAA,EACzB;AAAA,EAEO,gBAAgB,OAAA,EAAsC;AAC3D,IAAA,OAAO,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,OAAA,CAAQ,aAAa,CAAA;AAAA,EACpD;AAAA,EAEO,SAAA,CAAU,MAA4B,SAAA,EAA0C;AACrF,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA;AAChD,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,MAAM,IAAI3C,kCAAA,CAAA,2BAAA,6BAAqD;AAAA,QAC7D,IAAA,EAAM,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA;AAAK,OACzB,CAAA;AAAA,IACH;AAEA,IAAA,IAAI;AACF,MAAA,OAAO,IAAA,CAAK,kBAAA,CAAmB,IAAA,EAAM,SAAA,EAAW,SAAS,CAAA;AAAA,IAC3D,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAIA,kCAAA,CAAA,yBAAA,2BAAmD;AAAA,QAC3D,IAAA,EAAM;AAAA,UACJ,OAAOP,iCAAA,CAAgB,KAAK,CAAA,GAAI,KAAA,GAAQ0C,iCAAe,KAAK;AAAA;AAC9D,OACD,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,oBAAoB,MAAA,EAA6D;AACvF,IAAA,IAAI,aAAA,GAAgB,CAAA;AACpB,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,IAAI,iBAAiBrC,sCAAA,EAAsB;AACzC,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,gBAAA,CAAiB,KAAA,CAAM,IAAI,CAAA;AAC7C,QAAA,IAAI,IAAA,EAAM,SAAS,UAAA,EAAY;AAC7B,UAAA,aAAA,EAAA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO,aAAA,KAAkB,CAAA;AAAA,EAC3B;AAAA,EAEQ,gBACN,OAAA,EAC4C;AAC5C,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,MAAA,MAAM,IAAIE,kCAAA,CAAA,oCAAA,qCAA4D;AAAA,IACxE;AAEA,IAAA,IAAI,WAAA,GAA2C,IAAA;AAC/C,IAAA,IAAI,OAAA,GAAsD,IAAA;AAC1D,IAAA,IAAI,aAAA,GAAgB,EAAA;AAEpB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACvC,MAAA,MAAM,GAAA,GAAM,QAAQ,CAAC,CAAA;AACrB,MAAA,IAAI,eAAeF,sCAAA,EAAsB;AACvC,QAAA,MAAMoC,KAAAA,GAAO,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,IAAI,CAAA;AAC3C,QAAA,IAAIA,KAAAA,EAAM,SAAS,UAAA,EAAY;AAC7B,UAAA,IAAI,gBAAgB,IAAA,EAAM;AAExB,YAAA,OAAO,OAAA;AAAA,UACT;AACA,UAAA,WAAA,GAAc,GAAA;AACd,UAAA,aAAA,GAAgB,CAAA;AAAA,QAClB,CAAA,MAAO;AACL,UAAA,OAAA,GAAU,GAAA;AAAA,QACZ;AAAA,MACF,CAAA,MAAO;AACL,QAAA,OAAA,GAAU,GAAA;AAAA,MACZ;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,WAAA,IAAe,CAAC,OAAA,EAAS;AAC5B,MAAA,OAAO,OAAA;AAAA,IACT;AAEA,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,gBAAA,CAAiB,WAAA,CAAY,IAAI,CAAA;AACnD,IAAA,IAAI,CAAC,MAAM,WAAA,EAAa;AACtB,MAAA,MAAM,IAAIlC,kCAAA,CAAA,4BAAA,8BAAsD;AAAA,QAC9D,IAAA,EAAM,EAAE,IAAA,EAAM,WAAA,CAAY,IAAA;AAAK,OAChC,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,EAAE,GAAA,EAAI,GAAI,eAAA,CAAgB,IAAA,CAAK,YAAY,MAAM,CAAA;AACvD,IAAA,MAAM,mBAAA,GAAsB,IAAID,8BAAA,CAAa,WAAA,CAAY,KAAe,CAAA;AACxE,IAAA,MAAM,gBAAA,GAAmB,IAAIA,8BAAA,CAAa,OAAA,CAAQ,KAAe,CAAA;AACjE,IAAA,MAAM,MAAA,GAAS,IAAI,WAAA,CAAY,GAAA,EAAK;AAAA,MAClC,UAAA,EAAY;AAAA,QACV,cAAA,EAAgB,mBAAA;AAAA,QAChB,WAAA,EAAa;AAAA;AACf,KACD,EAAE,SAAA,EAAU;AAEb,IAAA,IAAI,cAAA;AACJ,IAAA,IAAI,kBAAkBA,8BAAA,EAAc;AAClC,MAAA,cAAA,GAAiB,MAAA,CAAO,KAAA;AAAA,IAC1B,CAAA,MAAA,IAAW,OAAO,MAAA,KAAW,QAAA,EAAU;AACrC,MAAA,cAAA,GAAiB,MAAA;AAAA,IACnB,CAAA,MAAO;AACL,MAAA,MAAM,IAAIC,kCAAA,CAAA,qCAAA,sCAA6D;AAAA,IACzE;AAGA,IAAA,IAAI,MAAA,CAAO,SAAA,CAAU,cAAc,CAAA,EAAG;AACpC,MAAA,cAAA,GAAiB,IAAA,CAAK,MAAM,cAAc,CAAA;AAAA,IAC5C;AAEA,IAAA,IAAI,YAAA;AACJ,IAAA,IAAI,mBAAmBF,sCAAA,EAAsB;AAC3C,MAAA,YAAA,GAAe,IAAIA,sCAAA,CAAqB,cAAA,EAAgB,OAAA,CAAQ,IAAI,CAAA;AAAA,IACtE,CAAA,MAAO;AACL,MAAA,YAAA,GAAe,IAAIC,+BAAa,cAAc,CAAA;AAAA,IAChD;AAEA,IAAA,MAAM,aAAA,GAAgB,CAAC,GAAG,OAAO,CAAA;AACjC,IAAA,aAAA,CAAc,aAAa,CAAA,GAAI,YAAA;AAC/B,IAAA,OAAO,aAAA;AAAA,EACT;AAAA,EAEO,sBACL,MAAA,EAC4C;AAC5C,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,MAAM,kBAAkB,MAAA,CAAO,MAAA;AAAA,MAC7B,CAAC,QAAQ,GAAA,YAAeD;AAAA,KAC1B;AAEA,IAAA,IAAI,eAAA,CAAgB,SAAS,CAAA,EAAG;AAC9B,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,mBAAA,CAAoB,MAAM,CAAA;AAClD,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,QAAA,MAAM,IAAIE,kCAAA,CAAA,uCAAA,wCAA+D;AAAA,MAC3E;AACA,MAAA,OAAO,IAAA,CAAK,gBAAgB,MAAM,CAAA;AAAA,IACpC;AAGA,IAAA,MAAM,WAAA,GAAc,KAAA,CAAM,IAAA,CAAK,IAAI,IAAI,eAAA,CAAgB,GAAA,CAAI,CAAC,GAAA,KAAQ,GAAA,CAAI,IAAA,CAAK,WAAA,EAAa,CAAC,CAAC,CAAA;AAE5F,IAAA,MAAM,oBAAgF,EAAC;AAEvF,IAAA,KAAA,MAAW,QAAQ,WAAA,EAAa;AAC9B,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,eAAA,CAAgB,IAAI,CAAA;AACzC,MAAA,IAAI,CAAC,OAAA,EAAS;AAEd,MAAA,iBAAA,CAAkB,OAAO,IAAI,EAAC;AAC9B,MAAA,IAAI,UAAA,GAAa,IAAA;AAEjB,MAAA,KAAA,MAAW,OAAO,MAAA,EAAQ;AACxB,QAAA,IAAI,EAAE,eAAeF,sCAAA,CAAA,EAAuB;AAC1C,UAAA,iBAAA,CAAkB,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AACnC,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,IAAI,CAAA;AAC9C,QAAA,IAAI,CAAC,QAAA,EAAU;AACb,UAAA,UAAA,GAAa,KAAA;AACb,UAAA;AAAA,QACF;AAEA,QAAA,IAAI,aAAa,OAAA,EAAS;AACxB,UAAA,iBAAA,CAAkB,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AACnC,UAAA;AAAA,QACF;AAEA,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,kBAAA,CAAmB,GAAA,EAAK,UAAU,OAAO,CAAA;AAC7D,UAAA,iBAAA,CAAkB,OAAO,CAAA,CAAE,IAAA,CAAK,MAAM,CAAA;AAAA,QACxC,CAAA,CAAA,MAAQ;AACN,UAAA,UAAA,GAAa,KAAA;AACb,UAAA;AAAA,QACF;AAAA,MACF;AAEA,MAAA,IAAI,CAAC,UAAA,EAAY;AACf,QAAA,OAAO,kBAAkB,OAAO,CAAA;AAAA,MAClC;AAAA,IACF;AAGA,IAAA,MAAM,YAAoC,EAAC;AAC3C,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,OAAO,KAAK,MAAA,CAAO,OAAA,CAAQ,iBAAiB,CAAA,EAAG;AAC9D,MAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC1B,MAAA,MAAM,WAAW,IAAA,CAAK,GAAA;AAAA,QACpB,GAAG,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,KAAW,KAAK,GAAA,CAAK,MAAA,CAAO,KAAA,IAAoB,CAAC,CAAC;AAAA,OACpE;AACA,MAAA,SAAA,CAAU,GAAG,CAAA,GAAI,QAAA;AAAA,IACnB;AAEA,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,CAAE,WAAW,CAAA,EAAG;AACvC,MAAA,MAAM,IAAIE,kCAAA,CAAA,+BAAA,gCAAuD;AAAA,IACnE;AAEA,IAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,CAAE,MAAA;AAAA,MAAO,CAAC,GAAG,CAAA,KACtD,SAAA,CAAU,CAAC,CAAA,GAAI,SAAA,CAAU,CAAC,CAAA,GAAI,CAAA,GAAI;AAAA,KACpC;AAEA,IAAA,OAAO,iBAAA,CAAkB,aAAa,CAAA,IAAK,EAAC;AAAA,EAC9C;AACF,CAAA;AAxREpB,wBAAA,CAAA,YAAA,EAAA,aAAA,CAAA;AAJK,IAAM,WAAA,GAAN;;;AChHA,IAAM,wBAAA,GAA4C;AAAA,EACvD,cAAA,EAAgB;AAClB;AAEO,IAAM,OAAA,GAAN,MAAM,OAAA,CAAO;AAAA,EAQlB,YAAY,OAAA,EAAyB;AAFrC,IAAA,IAAA,CAAQ,gBAAA,uBAA+D,GAAA,EAAI;AAGzE,IAAA,IAAA,CAAK,eAAA,GAAkB;AAAA,MACrB,GAAG,wBAAA;AAAA,MACH,GAAG,OAAA,EAAS;AAAA,KACd;AACA,IAAA,IAAA,CAAK,YAAA,GAAe,OAAA,EAAS,YAAA,IAAgB,IAAI,YAAA,EAAa;AAC9D,IAAA,IAAA,CAAK,WAAA,GAAc,OAAA,EAAS,WAAA,IAAe,IAAI,WAAA,EAAY;AAC3D,IAAA,IAAA,CAAK,gBAAA,GAAmB,OAAA,EAAS,gBAAA,IAAoB,IAAI,gBAAA,EAAiB;AAC1E,IAAA,IAAA,CAAK,YAAA,GAAe,OAAA,EAAS,YAAA,IAAgB,IAAI,YAAA,EAAa;AAI9D,IAAA,IAAI,CAAC,IAAA,CAAK,YAAA,CAAa,eAAA,EAAgB,EAAG;AACxC,MAAA,IAAA,CAAK,YAAA,CAAa,gBAAgB,IAAI,CAAA;AAAA,IACxC;AACA,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,CAAY,eAAA,EAAgB,EAAG;AACvC,MAAA,IAAA,CAAK,WAAA,CAAY,gBAAgB,IAAI,CAAA;AAAA,IACvC;AACA,IAAA,IAAI,CAAC,IAAA,CAAK,gBAAA,CAAiB,eAAA,EAAgB,EAAG;AAC5C,MAAA,IAAA,CAAK,gBAAA,CAAiB,gBAAgB,IAAI,CAAA;AAAA,IAC5C;AACA,IAAA,IAAI,CAAC,IAAA,CAAK,YAAA,CAAa,eAAA,EAAgB,EAAG;AACxC,MAAA,IAAA,CAAK,YAAA,CAAa,gBAAgB,IAAI,CAAA;AAAA,IACxC;AAAA,EACF;AAAA,EAEA,OAAA,CAAQ,UAAkB,OAAA,EAA+B;AACvD,IAAA,MAAM,aAAA,GAAgB,SAAS,WAAA,EAAY;AAE3C,IAAA,IAAI,kBAAkB,OAAA,EAAS;AAC7B,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,IAAI,CAAC,IAAA,CAAK,YAAA,CAAa,aAAA,CAAc,OAAO,CAAA,EAAG;AAC7C,UAAA,MAAM,IAAIoB,kCAAA,CAAA,mBAAA,sBAAgD;AAAA,YACxD,IAAA,EAAM,EAAE,QAAA,EAAU,OAAA;AAAQ,WAC3B,CAAA;AAAA,QACH;AACA,QAAA,OAAO,IAAIQ,6BAAA,CAAY,IAAA,EAAM,OAAA,EAAS,MAAM,IAAI,CAAA;AAAA,MAClD;AACA,MAAA,OAAO,IAAIA,6BAAA,CAAY,IAAA,EAAM,MAAA,EAAW,MAAM,IAAI,CAAA;AAAA,IACpD;AAEA,IAAA,MAAM,sBAAA,GAAyBI,kCAAA,CAAiB,QAAA,CAAS,WAAA,EAAa,CAAA;AACtE,IAAA,IAAI,CAAC,sBAAA,EAAwB;AAC3B,MAAA,MAAM,IAAIZ,kCAAA,CAAA,mBAAA,sBAAgD;AAAA,QACxD,IAAA,EAAM,EAAE,QAAA,EAAU,QAAA;AAAS,OAC5B,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,uBAAuB,KAAA,EAAM;AAAA,EACtC;AAAA,EAEA,aAAA,CAAc,UAAkB,OAAA,EAA2B;AACzD,IAAA,MAAM,aAAA,GAAgB,SAAS,WAAA,EAAY;AAC3C,IAAA,IAAI,kBAAkB,OAAA,EAAS;AAC7B,MAAA,IAAI,SAAS,OAAO,CAAC,CAAC,IAAA,CAAK,YAAA,CAAa,cAAc,OAAO,CAAA;AAE7D,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI,SAAS,OAAO,KAAA;AAEpB,IAAA,OAAO,CAAC,CAACY,kCAAA,CAAiB,aAAa,CAAA;AAAA,EACzC;AAAA,EAEA,IAAI,eAAA,GAA0D;AAC5D,IAAA,OAAO,IAAA,CAAK,gBAAA;AAAA,EACd;AAAA,EAEA,KAAA,GAAgB;AACd,IAAA,OAAO,IAAI,OAAA,CAAO;AAAA,MAChB,eAAA,EAAiB,EAAE,GAAG,IAAA,CAAK,eAAA,EAAgB;AAAA,MAC3C,YAAA,EAAc,IAAA,CAAK,YAAA,CAAa,KAAA,EAAM;AAAA,MACtC,WAAA,EAAa,IAAA,CAAK,WAAA,CAAY,KAAA,EAAM;AAAA,MACpC,gBAAA,EAAkB,IAAA,CAAK,gBAAA,CAAiB,KAAA,EAAM;AAAA,MAC9C,YAAA,EAAc,IAAA,CAAK,YAAA,CAAa,KAAA;AAAM,KACvC,CAAA;AAAA,EACH;AAAA,EAEA,gBACE,OAAA,EAQQ;AACR,IAAA,KAAA,MAAW,EAAE,GAAA,EAAK,MAAA,EAAO,IAAK,OAAA,EAAS;AACrC,MAAA,QAAQ,OAAO,IAAA;AAAM,QACnB,KAAK,OAAA;AACH,UAAA,IAAA,CAAK,YAAA,CAAa,QAAA,CAAS,GAAA,EAAK,MAA4B,CAAA;AAC5D,UAAA;AAAA,QACF,KAAK,UAAA;AACH,UAAA,IAAA,CAAK,gBAAA,CAAiB,QAAA;AAAA,YACnB,MAAA,CAAiC,OAAA;AAAA,YAClC;AAAA,WACF;AACA,UAAA;AAAA,QACF,KAAK,OAAA;AACH,UAAA,IAAA,CAAK,YAAA,CAAa,QAAA,CAAS,GAAA,EAAK,MAA4B,CAAA;AAC5D,UAAA;AAAA,QACF,KAAK,WAAA,EAAa;AAChB,UAAA,MAAM,IAAA,GAAO,MAAA;AACb,UAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAClB,UAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA,EAAG;AACtD,YAAA,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAAA,UACtC;AACA,UAAA;AAAA,QACF;AAAA;AACF,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACF,CAAA;AA1HoBhC,wBAAA,CAAA,OAAA,EAAA,QAAA,CAAA;AAAb,IAAM,MAAA,GAAN;ACSLiE,0BAAA,CAAU;AAQwCA,0BAAA,CAAU;AAQvD,IAAM,+BACXA,0BAAA,CAAU;AAKsDA,0BAAA,CAAU;;;ACxBrE,SAAS,kBAAA,CAAmB,UAAA,EAAoB,OAAA,GAAuB,EAAC,EAAe;AAC5F,EAAA,MAAM,EAAE,UAAA,GAAa,IAAI,MAAA,EAAQ,eAAA,GAAkB,OAAM,GAAI,OAAA;AAC7D,EAAA,MAAM,SAAA,GAAY,YAAY,GAAA,EAAI;AAElC,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAM,UAAU,CAAA;AAClC,IAAA,MAAM,MAAA,GAAS,IAAI,MAAA,CAAO,KAAK,CAAA;AAC/B,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,KAAA,CAAM,eAAe,CAAA;AAExC,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,MAAA,EAAQ,IAAA;AAAA,QACR,YAAA,EAAc,MAAA;AAAA,QACd,IAAA,EAAM,MAAA;AAAA,QACN,aAAA,EAAe,WAAA,CAAY,GAAA,EAAI,GAAI;AAAA,OACrC;AAAA,IACF;AAEA,IAAA,MAAM,cAAc,IAAI,WAAA,CAAY,KAAK,EAAE,UAAA,EAAY,QAAQ,CAAA;AAC/D,IAAA,MAAM,MAAA,GAA4B,YAAY,SAAA,EAAU;AAExD,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,MAAA,EAAQnB,6CAA2B,MAAM,CAAA;AAAA,MACzC,YAAA,EAAcC,6CAA2B,MAAM,CAAA;AAAA,MAC/C,IAAA,EAAM/B,sCAAoB,MAAM,CAAA,GAAI,OAAO,WAAA,EAAY,GAAIkD,oCAAkB,MAAM,CAAA;AAAA,MACnF,aAAA,EAAe,WAAA,CAAY,GAAA,EAAI,GAAI;AAAA,KACrC;AAAA,EACF,SAAS,KAAA,EAAgB;AACvB,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA;AAAA,MACA,aAAA,EAAe,WAAA,CAAY,GAAA,EAAI,GAAI;AAAA,KACrC;AAAA,EACF;AACF;AApCgBlE,wBAAA,CAAA,kBAAA,EAAA,oBAAA,CAAA;;;ACQT,SAAS,gBAAgB,IAAA,EAAmC;AACjE,EAAA,MAAM,QAAQ,IAAI,KAAA,CAAM,MAAM,EAAE,QAAA,EAAU,MAAM,CAAA;AAEhD,EAAA,IAAI;AACF,IAAA,MAAM,SAAS,IAAI,MAAA,CAAO,OAAO,EAAE,QAAA,EAAU,MAAM,CAAA;AACnD,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAC7B,IAAA,MAAM,UAAA,GAAa,OAAO,aAAA,EAAc;AAExC,IAAA,OAAO;AAAA,MACL,GAAA;AAAA,MACA,KAAA,EAAO,WAAW,MAAA,GAAS,CAAA,GAAA,YAAA,oBAAA,UAAA;AAAA,MAC3B,UAAA;AAAA,MACA,MAAA,EAAQ,MAAM,YAAA;AAAa,KAC7B;AAAA,EACF,SAAS,CAAA,EAAG;AAGV,IAAA,OAAO;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,KAAA,EAAA,YAAA;AAAA,MACA,YAAY,EAAC;AAAA,MACb,MAAA,EAAQ,MAAM,YAAA,EAAa;AAAA,MAC3B,KAAA,EAAO,aAAa,KAAA,GAAQ,CAAA,GAAI,IAAI,KAAA,CAAM,MAAA,CAAO,CAAC,CAAC;AAAA,KACrD;AAAA,EACF;AACF;AAzBgBA,wBAAA,CAAA,eAAA,EAAA,iBAAA,CAAA;AAuCT,SAAS,mBAAmB,IAAA,EAAuB;AACxD,EAAA,MAAM,QAAQ,IAAI,KAAA,CAAM,MAAM,EAAE,QAAA,EAAU,MAAM,CAAA;AAChD,EAAA,OAAO,MAAM,WAAA,EAAY;AAC3B;AAHgBA,wBAAA,CAAA,kBAAA,EAAA,oBAAA,CAAA;AAiCT,SAAS,qBAAqB,GAAA,EAAsC;AACzE,EAAA,IAAI,CAAC,GAAA,EAAK,OAAO,EAAC;AAElB,EAAA,MAAM,OAAwB,EAAC;AAC/B,EAAA,OAAA,CAAQ,GAAA,EAAK,CAAC,IAAA,KAAS;AACrB,IAAA,IAAI,gBAAgB,aAAA,EAAe;AACjC,MAAA,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,IAAA,CAAK,OAAO,SAAA,EAAW,KAAA,EAAO,MAAM,CAAA;AAAA,IACxD,CAAA,MAAA,IAAW,gBAAgB,oBAAA,EAAsB;AAC/C,MAAA,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,IAAA,CAAK,cAAc,SAAA,EAAW,IAAA,EAAM,MAAM,CAAA;AAAA,IAC9D;AAAA,EACF,CAAC,CAAA;AACD,EAAA,OAAO,IAAA;AACT;AAZgBA,wBAAA,CAAA,oBAAA,EAAA,sBAAA,CAAA;AAchB,IAAM,aAAA,GAAgB,OAAO,eAAe,CAAA;AAKrC,SAAS,gBAAgB,GAAA,EAA8B;AAC5D,EAAA,IAAI,CAAC,KAAK,OAAO,KAAA;AAEjB,EAAA,IAAI;AACF,IAAA,OAAA,CAAQ,GAAA,EAAK,CAAC,IAAA,KAAS;AACrB,MAAA,IAAI,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,SAAS,CAAA,EAAG;AACvC,QAAA,MAAM,aAAA;AAAA,MACR;AAAA,IACF,CAAC,CAAA;AACD,IAAA,OAAO,KAAA;AAAA,EACT,SAAS,CAAA,EAAG;AACV,IAAA,IAAI,CAAA,KAAM,eAAe,OAAO,IAAA;AAChC,IAAA,MAAM,CAAA;AAAA,EACR;AACF;AAdgBA,wBAAA,CAAA,eAAA,EAAA,iBAAA,CAAA;;;ACpHT,IAAM,QAAA,GAAW;AAAA,EACtB,SAAA;AAAA,EACA,gBAAA;AAAA,EACA,gBAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,aAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF","file":"chunk-UF6I25ED.cjs","sourcesContent":["import type { ASTNode, Operations, Token, TokenType } from \"@src/types\";\n\n/**\n * Partial reference node - represents an incomplete reference like {color without closing }\n */\nexport class PartialReferenceNode implements ASTNode {\n nodeType = \"PartialReferenceNode\";\n\n constructor(\n /** The partial reference name typed so far (e.g., \"color\" or \"foo.bar\") */\n public partialValue: string,\n public token: Token,\n ) {}\n}\n\n/**\n * Partial string node - represents an incomplete string like \"hello without closing quote\n */\nexport class PartialStringNode implements ASTNode {\n nodeType = \"PartialStringNode\";\n\n constructor(\n /** The partial string value typed so far */\n public partialValue: string,\n /** The quote type used (' or \") */\n public quoteType: string,\n public token: Token,\n ) {}\n}\n\n/**\n * Partial function call node - represents an incomplete function call like func(1, 2 without closing )\n */\nexport class PartialFunctionCallNode implements ASTNode {\n nodeType = \"PartialFunctionCallNode\";\n\n constructor(\n /** The function name */\n public name: string,\n /** Arguments parsed so far */\n public args: ASTNode[],\n public token: Token,\n ) {}\n}\n\n/**\n * Partial binary operation node - represents an incomplete binary operation like 1 + without right operand\n */\nexport class PartialBinOpNode implements ASTNode {\n nodeType = \"PartialBinOpNode\";\n public token: Token;\n\n constructor(\n /** The left operand */\n public left: ASTNode,\n /** The operator token */\n public opToken: Token,\n ) {\n this.token = opToken;\n }\n\n get op(): Operations | TokenType {\n return this.opToken.value as Operations | TokenType;\n }\n}\n\n/**\n * Partial unary operation node - represents an incomplete unary operation like - without operand\n */\nexport class PartialUnaryOpNode implements ASTNode {\n nodeType = \"PartialUnaryOpNode\";\n public token: Token;\n\n constructor(\n /** The operator token */\n public opToken: Token,\n ) {\n this.token = opToken;\n }\n\n get op(): Operations {\n return this.opToken.value as Operations;\n }\n}\n\n/**\n * Partial parenthesized expression - represents an incomplete parenthesized expression like (1 + 2 without closing )\n */\nexport class PartialParenNode implements ASTNode {\n nodeType = \"PartialParenNode\";\n\n constructor(\n /** The expression inside the parentheses (may itself be partial) */\n public expr: ASTNode,\n public token: Token,\n ) {}\n}\n","import type { ASTNode, Operations, SupportedFormats, Token, TokenType } from \"@src/types\";\nimport {\n PartialBinOpNode,\n PartialFunctionCallNode,\n PartialParenNode,\n PartialUnaryOpNode,\n} from \"./tolerant/partial-nodes\";\n\n// Re-export ASTNode for external consumers\nexport type { ASTNode } from \"@src/types\";\n\n// Nodes -----------------------------------------------------------------------\n\nexport class BinOpNode implements ASTNode {\n nodeType = \"BinOpNode\";\n constructor(\n public left: ASTNode,\n public opToken: Token,\n public right: ASTNode,\n public token?: Token,\n ) {\n this.token = opToken;\n }\n get op(): Operations | TokenType {\n return this.opToken.value as Operations | TokenType;\n }\n}\n\nexport class NumNode implements ASTNode {\n nodeType = \"NumNode\";\n public value: number;\n constructor(public token: Token) {\n if (this.token.value.includes(\".\")) {\n this.value = Number.parseFloat(this.token.value);\n } else {\n this.value = Number.parseInt(this.token.value, 10);\n }\n }\n}\n\nexport class StringNode implements ASTNode {\n nodeType = \"StringNode\";\n public value: string;\n constructor(public token: Token) {\n this.value = token.value;\n }\n}\n\nexport class TemplateStringNode implements ASTNode {\n nodeType = \"TemplateStringNode\";\n constructor(\n public parts: ASTNode[],\n public token?: Token,\n ) {}\n}\n\nexport class UnaryOpNode implements ASTNode {\n nodeType = \"UnaryOpNode\";\n constructor(\n public opToken: Token,\n public expr: ASTNode,\n public token?: Token,\n ) {\n this.token = opToken;\n }\n get op(): Operations {\n return this.opToken.value as Operations;\n }\n}\n\nexport class ListNode implements ASTNode {\n nodeType = \"ListNode\";\n constructor(\n public elements: ASTNode[],\n public token?: Token,\n ) {}\n}\n\nexport class ImplicitListNode extends ListNode {\n override nodeType = \"ImplicitListNode\";\n public isImplicit = true;\n constructor(\n public elements: ASTNode[],\n public token?: Token,\n ) {\n super(elements, token);\n }\n}\n\nexport class FunctionCallNode implements ASTNode {\n nodeType = \"FunctionCallNode\";\n public name: string;\n constructor(\n nameTokenValue: string,\n public args: ASTNode[],\n public token?: Token,\n ) {\n this.name = nameTokenValue;\n }\n}\n\nexport class NoOpNode implements ASTNode {\n nodeType = \"NoOpNode\";\n constructor(public token?: Token) {}\n}\n\nexport class ReferenceNode implements ASTNode {\n nodeType = \"ReferenceNode\";\n public value: string;\n constructor(public token: Token) {\n this.value = token.value;\n }\n}\n\nexport class IdentifierNode implements ASTNode {\n nodeType = \"IdentifierNode\";\n public name: string;\n constructor(public token: Token) {\n this.name = token.value;\n }\n}\n\nexport class HexColorNode implements ASTNode {\n nodeType = \"HexColorNode\";\n public value: string;\n constructor(public token: Token) {\n this.value = token.value;\n }\n}\n\nexport class BooleanNode implements ASTNode {\n nodeType = \"BooleanNode\";\n constructor(\n public value: boolean,\n public token?: Token,\n ) {}\n}\n\nexport class NullNode implements ASTNode {\n nodeType = \"NullNode\";\n constructor(public token?: Token) {}\n}\n\nexport class ElementWithUnitNode implements ASTNode {\n nodeType = \"ElementWithUnitNode\";\n public unit: SupportedFormats;\n constructor(\n public astNode: ASTNode,\n unitTokenValue: SupportedFormats,\n public token?: Token,\n ) {\n this.unit = unitTokenValue;\n }\n}\n\nexport class AssignNode implements ASTNode {\n nodeType = \"AssignNode\";\n constructor(\n public varName: IdentifierNode,\n public typeDecl: TypeDeclNode, // Represents the full type string like 'Color.RGB' or 'String'\n public assignmentExpr: ASTNode | null, // Null if no assignment\n public token?: Token,\n ) {}\n}\n\nexport class TypeDeclNode implements ASTNode {\n nodeType = \"TypeDeclNode\";\n // baseType: e.g. \"Color\", \"List\"\n // subTypes: e.g. [\"RGB\"] for \"Color.RGB\", or [\"String\"] for \"List.String\" (hypothetical)\n constructor(\n public baseType: IdentifierNode,\n public subTypes: IdentifierNode[],\n public token?: Token,\n ) {}\n\n name(): string {\n let typeStr = this.baseType.name;\n if (this.subTypes.length > 0) {\n typeStr += `.${this.subTypes.map((s) => s.name).join(\".\")}`;\n }\n return typeStr;\n }\n}\n\nexport const attributesToString = (attrs: string[]): string => attrs.join(\".\");\n\nexport const identifiersChainToString = (attrs: IdentifierNode[]): string =>\n attributesToString(attrs.map((x) => x.name));\n\nexport class ReassignNode implements ASTNode {\n nodeType = \"ReassignNode\";\n constructor(\n public identifier: IdentifierNode | IdentifierNode[],\n public value: ASTNode,\n public token?: Token,\n ) {}\n baseIdentifier(): IdentifierNode {\n return Array.isArray(this.identifier) ? this.identifier[0] : this.identifier;\n }\n isAttributeAssignment(): boolean {\n return Array.isArray(this.identifier) && !!this.identifier[1];\n }\n identifierToString(): string {\n const parts = Array.isArray(this.identifier) ? this.identifier : [this.identifier];\n return identifiersChainToString(parts);\n }\n attributesChain(): IdentifierNode[] {\n if (Array.isArray(this.identifier)) {\n return this.identifier.slice(1);\n } else {\n return [];\n }\n }\n attributesStringChain(): string[] {\n return this.attributesChain().map((x) => x.name);\n }\n}\n\nexport class ReturnNode implements ASTNode {\n nodeType = \"ReturnNode\";\n constructor(\n public expr: ASTNode,\n public token?: Token,\n ) {}\n}\n\nexport class WhileNode implements ASTNode {\n nodeType = \"WhileNode\";\n constructor(\n public condition: ASTNode,\n public body: StatementListNode,\n public token?: Token,\n ) {}\n}\n\nexport class ForEachNode implements ASTNode {\n nodeType = \"ForEachNode\";\n constructor(\n public itemVar: string,\n public indexVar: string | null,\n public collection: ASTNode,\n public body: StatementListNode,\n public token?: Token,\n ) {}\n}\n\nexport class IfConditionNode implements ASTNode {\n nodeType = \"IfConditionNode\";\n constructor(\n public condition: ASTNode,\n public body: StatementListNode,\n public token?: Token,\n ) {}\n}\n\nexport class IfNode implements ASTNode {\n nodeType = \"IfNode\";\n constructor(\n public conditions: IfConditionNode[],\n public elseBody: StatementListNode | null,\n public token?: Token,\n ) {}\n}\n\nexport class BlockNode implements ASTNode {\n // Represents the [...] block\n nodeType = \"BlockNode\";\n constructor(\n public statements: StatementListNode,\n public token?: Token,\n ) {}\n}\n\nexport class StatementListNode implements ASTNode {\n nodeType = \"StatementListNode\";\n constructor(\n public statements: ASTNode[],\n public token?: Token,\n ) {}\n}\n\nexport class AttributeAccessNode implements ASTNode {\n nodeType = \"AttributeAccessNode\";\n // 'left' is the object, 'right' is the attribute (IdentifierNode) or method (FunctionCallNode)\n // In tolerant mode, 'right' may also be a PartialFunctionCallNode\n constructor(\n public left: ASTNode,\n public right: IdentifierNode | FunctionCallNode | PartialFunctionCallNode,\n public token?: Token,\n ) {}\n}\n\n// Utilities -------------------------------------------------------------------\n\n/**\n * Walk the AST and call the visit function on each node\n *\n * @param node - The AST node to traverse\n * @param onVisit - Function called for each node during traversal\n *\n * @example\n * // Print all node types\n * walk(ast, (node) => console.log(node.nodeType));\n *\n * @example\n * // Collect all reference nodes\n * const refs: ReferenceNode[] = [];\n * walk(ast, (node) => {\n * if (node instanceof ReferenceNode) refs.push(node);\n * });\n */\nexport function walkAST(node: ASTNode, onVisit: (node: ASTNode) => void): void {\n onVisit(node);\n\n if (node instanceof BinOpNode) {\n walkAST(node.left, onVisit);\n walkAST(node.right, onVisit);\n } else if (node instanceof UnaryOpNode) {\n walkAST(node.expr, onVisit);\n } else if (node instanceof ListNode || node instanceof ImplicitListNode) {\n for (const element of node.elements) {\n walkAST(element, onVisit);\n }\n } else if (node instanceof FunctionCallNode) {\n for (const arg of node.args) {\n walkAST(arg, onVisit);\n }\n } else if (node instanceof ElementWithUnitNode) {\n walkAST(node.astNode, onVisit);\n } else if (node instanceof AssignNode) {\n if (node.assignmentExpr) {\n walkAST(node.assignmentExpr, onVisit);\n }\n } else if (node instanceof ReassignNode) {\n walkAST(node.value, onVisit);\n } else if (node instanceof ReturnNode) {\n walkAST(node.expr, onVisit);\n } else if (node instanceof WhileNode) {\n walkAST(node.condition, onVisit);\n walkAST(node.body, onVisit);\n } else if (node instanceof ForEachNode) {\n walkAST(node.collection, onVisit);\n walkAST(node.body, onVisit);\n } else if (node instanceof IfConditionNode) {\n walkAST(node.condition, onVisit);\n walkAST(node.body, onVisit);\n } else if (node instanceof IfNode) {\n for (const condition of node.conditions) {\n walkAST(condition, onVisit);\n }\n if (node.elseBody) {\n walkAST(node.elseBody, onVisit);\n }\n } else if (node instanceof BlockNode) {\n walkAST(node.statements, onVisit);\n } else if (node instanceof StatementListNode) {\n for (const statement of node.statements) {\n walkAST(statement, onVisit);\n }\n } else if (node instanceof TemplateStringNode) {\n for (const part of node.parts) {\n walkAST(part, onVisit);\n }\n } else if (node instanceof AttributeAccessNode) {\n walkAST(node.left, onVisit);\n if (node.right instanceof FunctionCallNode || node.right instanceof PartialFunctionCallNode) {\n walkAST(node.right, onVisit);\n }\n }\n // Handle partial nodes from tolerant parsing\n else if (node instanceof PartialBinOpNode) {\n walkAST(node.left, onVisit);\n } else if (node instanceof PartialUnaryOpNode) {\n // No child nodes to walk\n } else if (node instanceof PartialFunctionCallNode) {\n for (const arg of node.args) {\n walkAST(arg, onVisit);\n }\n } else if (node instanceof PartialParenNode) {\n walkAST(node.expr, onVisit);\n }\n}\n\n/**\n * Walk the AST and collect all nodes that match the predicate into a flat list\n *\n * @param ast - The AST node to traverse\n * @param predicate - Function to test each node\n * @returns Flat array of matching nodes\n *\n * @example\n * // Find all reference nodes\n * const refs = filterAST(ast, (node) => node instanceof ReferenceNode);\n *\n * @example\n * // Find references to a specific token\n * const refs = filterAST(ast, (node) =>\n * node instanceof ReferenceNode && node.value === \"color.primary\"\n * );\n */\nexport function filterAST<T extends ASTNode>(\n ast: ASTNode,\n predicate: (node: ASTNode) => boolean,\n): T[] {\n const results: T[] = [];\n walkAST(ast, (node) => {\n if (predicate(node)) {\n results.push(node as T);\n }\n });\n return results;\n}\n\n/**\n * Collect all reference nodes from the AST\n *\n * @param ast - The AST node to traverse\n * @param targetName - Optional: only collect references matching this name\n * @returns Array of reference nodes\n *\n * @example\n * // Get all references\n * const refs = collectReferenceNodes(ast);\n *\n * @example\n * // Get references to a specific token\n * const refs = collectReferenceNodes(ast, \"color.primary\");\n */\nexport function collectReferenceNodes(ast: ASTNode, targetName?: string): ReferenceNode[] {\n if (targetName) {\n return filterAST<ReferenceNode>(\n ast,\n (node) => node instanceof ReferenceNode && node.value === targetName,\n );\n }\n return filterAST<ReferenceNode>(ast, (node) => node instanceof ReferenceNode);\n}\n\n/**\n * Get the last statement from an AST node.\n * If the node is a StatementListNode, returns the last statement.\n * Otherwise, returns the node itself.\n */\nexport function getLastStatement(ast: ASTNode): ASTNode {\n if (ast instanceof StatementListNode) {\n const statements = ast.statements;\n if (statements && statements.length > 0) {\n return statements[statements.length - 1];\n }\n }\n return ast;\n}\n\n/**\n * Check if an AST node or its last statement is an AssignNode with an assignment expression.\n * This is useful for determining if a REPL should print the assigned value.\n *\n * Returns the variable name and whether it has an assignment expression:\n * - `variable foo: String;` -> { varName: \"foo\", hasAssignment: false }\n * - `variable foo: String = \"bar\";` -> { varName: \"foo\", hasAssignment: true }\n * - Other nodes -> null\n */\nexport function getAssignmentInfo(ast: ASTNode): {\n varName: string;\n hasAssignment: boolean;\n} | null {\n const lastStatement = getLastStatement(ast);\n\n if (lastStatement instanceof AssignNode) {\n return {\n varName: lastStatement.varName.name,\n hasAssignment: lastStatement.assignmentExpr !== null,\n };\n }\n\n return null;\n}\n\n/**\n * Check if an AST node or its last statement is a ReassignNode.\n * This is useful for determining if a REPL should print the reassigned value.\n *\n * Returns the variable name:\n * - `a = 1 + 1` -> { varName: \"a\" }\n * - Other nodes -> null\n */\nexport function getReassignmentInfo(ast: ASTNode): { varName: string } | null {\n const lastStatement = getLastStatement(ast);\n\n if (lastStatement instanceof ReassignNode) {\n return {\n varName: lastStatement.baseIdentifier().name,\n };\n }\n\n return null;\n}\n","import type { ASTNode } from \"@interpreter/ast\";\nimport { collectReferenceNodes } from \"@interpreter/ast\";\nimport { isSome } from \"./type\";\n\n/**\n * Position of a reference in the original string\n */\ntype ReferencePosition = {\n start: number;\n end: number;\n oldName: string;\n newName: string;\n};\n\n/**\n * Rename references in a token value string using an AST and rename map\n *\n * @param originalValue - The original token value string\n * @param ast - The parsed AST of the token value\n * @param renameMap - Map of old names to new names { \"old.name\": \"new.name\" }\n * @returns The updated token value string with renamed references\n *\n * @example\n * const renameMap = { \"color.primary\": \"color.main\" };\n * const updated = renameReferences(\"{color.primary}\", ast, renameMap);\n * // Returns: \"{color.main}\"\n *\n * @example\n * const renameMap = { \"a\": \"x\", \"b\": \"y\" };\n * const updated = renameReferences(\"{a} + {b}\", ast, renameMap);\n * // Returns: \"{x} + {y}\"\n */\nexport function renameReferences(\n originalValue: string,\n ast: ASTNode,\n renameMap: Record<string, string>,\n): string {\n const positions: ReferencePosition[] = [];\n\n // Collect positions for all references that need to be renamed\n for (const [oldName, newName] of Object.entries(renameMap)) {\n const references = collectReferenceNodes(ast, oldName);\n\n for (const ref of references) {\n if (isSome(ref.token.pos) && isSome(ref.token.endPos)) {\n positions.push({\n start: ref.token.pos,\n end: ref.token.endPos,\n oldName,\n newName,\n });\n }\n }\n }\n\n // Sort in reverse order for safe replacement (replace from end to start)\n // This way, earlier positions remain valid as we make replacements\n positions.sort((a, b) => b.start - a.start);\n\n // Apply replacements\n let result = originalValue;\n for (const pos of positions) {\n result = result.substring(0, pos.start) + pos.newName + result.substring(pos.end);\n }\n\n return result;\n}\n","import { Operations, ReservedKeyword, SupportedFormats, type Token, TokenType } from \"@src/types\";\nimport { LexerError, LexerErrorCode } from \"./errors\";\nimport { CodePoint, isAlpha, isAlphaNumeric, isNumber, isSpace } from \"./utils/string\";\n\nconst SUPPORTED_FORMAT_STRINGS: Record<string, SupportedFormats> = {};\nfor (const val of Object.values(SupportedFormats) as string[]) {\n SUPPORTED_FORMAT_STRINGS[val.toLowerCase()] = val as SupportedFormats;\n}\n\nconst RESERVED_KEYWORD_STRINGS: Record<string, ReservedKeyword> = {};\nfor (const val of Object.values(ReservedKeyword) as string[]) {\n RESERVED_KEYWORD_STRINGS[val.toLowerCase()] = val as ReservedKeyword;\n}\n\n/**\n * Options for the Lexer\n */\nexport interface LexerOptions {\n /**\n * If true, the lexer will not throw errors on incomplete input.\n * Instead, it will return partial tokens where appropriate.\n */\n tolerant?: boolean;\n}\n\nexport class Lexer {\n private text: string;\n private currentChar: string | null;\n private pos = 0;\n private line = 1;\n private column = 1;\n /**\n * Track the last NUMBER, RPAREN, or REFERENCE token for FORMAT adjacency detection.\n * FORMAT tokens (units like 'px', 's', 'ms') are only valid when immediately adjacent\n * to these tokens (no whitespace). This prevents conflicts where unit keywords\n * could be confused with identifiers (e.g., 's' for saturation vs seconds).\n *\n * @see docs/tokenscript/edge-cases/format-unit-parsing.md\n */\n private _lastUnitableToken: Token | null = null;\n private tolerant: boolean;\n private collectedTokens: Token[] = [];\n\n constructor(text: string, options?: LexerOptions) {\n this.text = text;\n this.currentChar = this.pos < this.text.length ? this.text[this.pos] : null;\n this.tolerant = options?.tolerant ?? false;\n }\n\n /**\n * Check if a FORMAT token (unit suffix) is valid at the given position.\n * FORMAT is only valid when immediately adjacent to a NUMBER or RPAREN.\n * e.g., '3s' (number with unit), '(3px + 4px)rem' (unit conversion)\n */\n private isValidFormatPosition(startPos: number): boolean {\n return this._lastUnitableToken !== null && this._lastUnitableToken.endPos === startPos;\n }\n\n private error(code: LexerErrorCode, data?: Record<string, unknown>): never {\n throw new LexerError(code, {\n line: this.line,\n data,\n });\n }\n\n private advance(): void {\n if (this.currentChar === \"\\n\") {\n this.line++;\n this.column = 0;\n }\n this.pos++;\n this.column++;\n this.currentChar = this.pos < this.text.length ? this.text[this.pos] : null;\n }\n\n private eat(char: string): void {\n if (this.currentChar === char) {\n this.advance();\n } else {\n this.error(LexerErrorCode.EXPECTED_CHARACTER, {\n expected: char,\n got: this.currentChar,\n });\n }\n }\n\n private peek(n = 1): string | null {\n return this.text[this.pos + n] ?? null;\n }\n\n private skipWhitespace(): void {\n while (isSpace(this.currentChar)) {\n this.advance();\n }\n }\n\n private skipLine(): void {\n while (this.currentChar !== null && this.currentChar !== \"\\n\") {\n this.advance();\n }\n if (this.currentChar === \"\\n\") {\n this.eat(\"\\n\");\n }\n }\n\n private isComment(): boolean {\n return this.currentChar === \"/\" && this.peek() === \"/\";\n }\n\n private number(): Token {\n const startPos = this.pos;\n let result = \"\";\n let hasDecimalPoint = false;\n\n // Prepend 0 to digits like \".5\"\n if (this.currentChar === \".\") {\n result += \"0\";\n }\n\n while (isNumber(this.currentChar) || this.currentChar === \".\") {\n if (this.currentChar === \".\") {\n // Dot not followed by a digit is a method-call dot (e.g. 1.to_string())\n if (!isNumber(this.peek())) {\n break;\n }\n // Second dot followed by a digit is genuinely malformed (e.g. 3.3.3)\n if (hasDecimalPoint) {\n this.error(LexerErrorCode.MULTIPLE_DECIMAL_POINTS, {\n value: result + this.currentChar,\n });\n }\n hasDecimalPoint = true;\n }\n result += this.currentChar;\n this.advance();\n }\n\n const token: Token = {\n type: TokenType.NUMBER,\n value: result,\n line: this.line,\n pos: startPos,\n endPos: this.pos,\n };\n // Track for FORMAT adjacency detection (e.g., '3s', '3.5ms')\n this._lastUnitableToken = token;\n return token;\n }\n\n // Python like isdigit, that allows numbers starting with '.'\n private isDigit(): boolean {\n if (this.currentChar === null) return false;\n return isNumber(this.currentChar) || (this.currentChar === \".\" && isNumber(this.peek()));\n }\n\n private isValidIdentifierStart(char: string | null): boolean {\n if (char === null) return false;\n if (isAlpha(char)) return true;\n\n const cp = char.codePointAt(0) ?? 0;\n\n // Support emoji range\n if (cp <= 127) return false;\n\n // Disallowed Characters\n if (cp === CodePoint.FORWARD_TICK) return false;\n if (cp === CodePoint.BACKWARD_TICK) return false;\n\n return true;\n }\n\n private isValidStringElement(char: string | null): boolean {\n if (char === null) return false;\n const cp = char.codePointAt(0) ?? 0;\n return (\n isAlphaNumeric(char) || cp === CodePoint.HYPHEN || cp === CodePoint.UNDERSCORE || cp > 127 // Support emoji range\n );\n }\n\n private stringElement(): Token {\n const startPos = this.pos;\n let result = \"\";\n\n while (this.isValidStringElement(this.currentChar)) {\n result += this.currentChar;\n this.advance();\n }\n\n const normalizedResult = result.toLowerCase();\n\n const keyword = RESERVED_KEYWORD_STRINGS[normalizedResult];\n if (keyword) {\n return {\n type: TokenType.RESERVED_KEYWORD,\n value: keyword,\n line: this.line,\n pos: startPos,\n endPos: this.pos,\n };\n }\n\n // FORMAT tokens (units like 'px', 's', 'ms') are only valid immediately after NUMBER or RPAREN\n // e.g., '3s' (number with unit), '(3px + 4px)rem' (unit conversion)\n // In other contexts (with whitespace or other tokens between), treat as STRING (identifier)\n const format = SUPPORTED_FORMAT_STRINGS[normalizedResult];\n if (format && this.isValidFormatPosition(startPos)) {\n return {\n type: TokenType.FORMAT,\n value: format,\n line: this.line,\n pos: startPos,\n endPos: this.pos,\n };\n }\n\n return {\n type: TokenType.STRING,\n value: result,\n line: this.line,\n pos: startPos,\n endPos: this.pos,\n };\n }\n\n private reference(): Token {\n this.eat(\"{\");\n\n const refStartPos = this.pos;\n let result = \"\";\n while (this.currentChar !== null && this.currentChar !== \"}\") {\n if (this.currentChar === \"{\") {\n if (this.tolerant) {\n // In tolerant mode, treat nested { as end of partial reference\n break;\n }\n this.error(LexerErrorCode.UNTERMINATED_REFERENCE, {});\n }\n if (isSpace(this.currentChar)) {\n this.advance();\n continue;\n }\n result += this.currentChar;\n this.advance();\n }\n\n if (this.currentChar === null) {\n if (this.tolerant) {\n // In tolerant mode, return a partial reference token\n return {\n type: TokenType.PARTIAL_REFERENCE,\n value: result,\n line: this.line,\n pos: refStartPos,\n endPos: this.pos,\n };\n }\n this.error(LexerErrorCode.UNTERMINATED_REFERENCE, {});\n }\n\n if (result === \"\") {\n if (this.tolerant) {\n // In tolerant mode, return empty partial reference\n return {\n type: TokenType.PARTIAL_REFERENCE,\n value: \"\",\n line: this.line,\n pos: refStartPos,\n endPos: this.pos,\n };\n }\n this.error(LexerErrorCode.EMPTY_VARIABLE_NAME, {});\n }\n\n const refEndPos = this.pos;\n this.eat(\"}\");\n\n const token: Token = {\n type: TokenType.REFERENCE,\n value: result,\n line: this.line,\n pos: refStartPos,\n endPos: refEndPos,\n };\n // Track for FORMAT adjacency - use actual position after closing brace\n this._lastUnitableToken = { ...token, endPos: this.pos };\n return token;\n }\n\n private explicitString(quoteType: string): Token {\n const startPos = this.pos;\n this.eat(quoteType);\n\n let result = \"\";\n while (this.currentChar !== null && this.currentChar !== quoteType) {\n result += this.currentChar;\n this.advance();\n }\n\n if (this.currentChar === null) {\n if (this.tolerant) {\n // In tolerant mode, return a partial string token\n return {\n type: TokenType.PARTIAL_STRING,\n value: result,\n line: this.line,\n pos: startPos,\n endPos: this.pos,\n };\n }\n this.error(LexerErrorCode.UNTERMINATED_STRING, { quoteType });\n }\n\n this.eat(quoteType);\n\n return {\n type: TokenType.EXPLICIT_STRING,\n value: result,\n line: this.line,\n pos: startPos,\n endPos: this.pos,\n };\n }\n\n /**\n * Read a backtick-delimited template string.\n * Supports escape sequences: \\{ \\$ \\` \\\\\n * The raw content (with escapes preserved) is stored as the token value.\n * The parser handles splitting into segments.\n */\n private templateString(): Token {\n const startPos = this.pos;\n this.eat(\"`\");\n\n let result = \"\";\n while (this.currentChar !== null && this.currentChar !== \"`\") {\n if (this.currentChar === \"\\\\\") {\n const next = this.peek();\n if (next === \"{\" || next === \"$\" || next === \"`\" || next === \"\\\\\") {\n result += \"\\\\\";\n result += next;\n this.advance(); // consume backslash\n this.advance(); // consume escaped char\n continue;\n }\n }\n result += this.currentChar;\n this.advance();\n }\n\n if (this.currentChar === null) {\n if (this.tolerant) {\n return {\n type: TokenType.TEMPLATE_STRING,\n value: result,\n line: this.line,\n pos: startPos,\n endPos: this.pos,\n };\n }\n this.error(LexerErrorCode.UNTERMINATED_TEMPLATE_STRING, {});\n }\n\n this.eat(\"`\");\n\n return {\n type: TokenType.TEMPLATE_STRING,\n value: result,\n line: this.line,\n pos: startPos,\n endPos: this.pos,\n };\n }\n\n private hexColor(): Token {\n const startPos = this.pos;\n let result = \"\";\n while (isAlpha(this.currentChar) || this.isDigit() || this.currentChar === \"#\") {\n result += this.currentChar;\n this.advance();\n }\n // Support #RGB (4), #RGBA (5), #RRGGBB (7), #RRGGBBAA (9)\n if (result.length !== 4 && result.length !== 5 && result.length !== 7 && result.length !== 9) {\n if (this.tolerant) {\n // In tolerant mode, accept partial hex colors\n return {\n type: TokenType.HEX_COLOR,\n value: result,\n line: this.line,\n pos: startPos,\n endPos: this.pos,\n };\n }\n this.error(LexerErrorCode.INVALID_HEX_COLOR_FORMAT, {\n value: result,\n expectedLength: \"#RGB, #RGBA, #RRGGBB, or #RRGGBBAA\",\n });\n }\n return {\n type: TokenType.HEX_COLOR,\n value: result,\n line: this.line,\n pos: startPos,\n endPos: this.pos,\n };\n }\n\n private collectToken(token: Token): Token {\n if (this.tolerant) {\n this.collectedTokens.push(token);\n }\n return token;\n }\n\n public nextToken(): Token {\n while (this.currentChar !== null) {\n this.skipWhitespace();\n if (this.currentChar === null) break;\n\n if (this.isComment()) {\n this.skipLine();\n continue;\n }\n\n if (this.isDigit()) {\n return this.collectToken(this.number());\n }\n\n if (this.currentChar === \"'\" || this.currentChar === '\"') {\n return this.collectToken(this.explicitString(this.currentChar));\n }\n\n if (this.currentChar === \"`\") {\n return this.collectToken(this.templateString());\n }\n\n if (this.isValidIdentifierStart(this.currentChar)) {\n return this.collectToken(this.stringElement());\n }\n\n if (this.currentChar === \"{\") {\n return this.collectToken(this.reference());\n }\n if (this.currentChar === \"[\") {\n const startPos = this.pos;\n this.eat(\"[\");\n return this.collectToken({\n type: TokenType.LBLOCK,\n value: \"[\",\n line: this.line,\n pos: startPos,\n endPos: this.pos,\n });\n }\n if (this.currentChar === \"]\") {\n const startPos = this.pos;\n this.eat(\"]\");\n return this.collectToken({\n type: TokenType.RBLOCK,\n value: \"]\",\n line: this.line,\n pos: startPos,\n endPos: this.pos,\n });\n }\n if (this.currentChar === \"!\" && this.peek() === \"=\") {\n const startPos = this.pos;\n this.eat(\"!\");\n this.eat(\"=\");\n return this.collectToken({\n type: TokenType.IS_NOT_EQ,\n value: \"!=\",\n line: this.line,\n pos: startPos,\n endPos: this.pos,\n });\n }\n if (this.currentChar === \"+\") {\n const startPos = this.pos;\n this.eat(\"+\");\n return this.collectToken({\n type: TokenType.OPERATION,\n value: Operations.ADD,\n line: this.line,\n pos: startPos,\n endPos: this.pos,\n });\n }\n if (this.currentChar === \"-\") {\n const startPos = this.pos;\n this.eat(\"-\");\n return this.collectToken({\n type: TokenType.OPERATION,\n value: Operations.SUBTRACT,\n line: this.line,\n pos: startPos,\n endPos: this.pos,\n });\n }\n if (this.currentChar === \"*\") {\n const startPos = this.pos;\n this.eat(\"*\");\n return this.collectToken({\n type: TokenType.OPERATION,\n value: Operations.MULTIPLY,\n line: this.line,\n pos: startPos,\n endPos: this.pos,\n });\n }\n if (this.currentChar === \"/\") {\n const startPos = this.pos;\n this.eat(\"/\");\n return this.collectToken({\n type: TokenType.OPERATION,\n value: Operations.DIVIDE,\n line: this.line,\n pos: startPos,\n endPos: this.pos,\n });\n }\n if (this.currentChar === \"^\") {\n const startPos = this.pos;\n this.eat(\"^\");\n return this.collectToken({\n type: TokenType.OPERATION,\n value: Operations.POWER,\n line: this.line,\n pos: startPos,\n endPos: this.pos,\n });\n }\n if (this.currentChar === \"!\") {\n const startPos = this.pos;\n this.eat(\"!\");\n return this.collectToken({\n type: TokenType.OPERATION,\n value: Operations.LOGIC_NOT,\n line: this.line,\n pos: startPos,\n endPos: this.pos,\n });\n }\n if (this.currentChar === \"(\") {\n const startPos = this.pos;\n this.eat(\"(\");\n return this.collectToken({\n type: TokenType.LPAREN,\n value: \"(\",\n line: this.line,\n pos: startPos,\n endPos: this.pos,\n });\n }\n if (this.currentChar === \")\") {\n const startPos = this.pos;\n this.eat(\")\");\n const token: Token = {\n type: TokenType.RPAREN,\n value: \")\",\n line: this.line,\n pos: startPos,\n endPos: this.pos,\n };\n // Track for FORMAT adjacency detection (e.g., '(3px + 4px)rem')\n this._lastUnitableToken = token;\n return this.collectToken(token);\n }\n if (this.currentChar === \",\") {\n const startPos = this.pos;\n this.eat(\",\");\n return this.collectToken({\n type: TokenType.COMMA,\n value: \",\",\n line: this.line,\n pos: startPos,\n endPos: this.pos,\n });\n }\n if (this.currentChar === \".\") {\n if (this.peek() !== null && isNumber(this.peek())) {\n return this.collectToken(this.number());\n }\n const startPos = this.pos;\n this.eat(\".\");\n return this.collectToken({\n type: TokenType.DOT,\n value: \".\",\n line: this.line,\n pos: startPos,\n endPos: this.pos,\n });\n }\n if (this.currentChar === \"#\") {\n return this.collectToken(this.hexColor());\n }\n if (this.currentChar === \"%\") {\n const startPos = this.pos;\n this.eat(\"%\");\n return this.collectToken({\n type: TokenType.FORMAT,\n value: SupportedFormats.PERCENTAGE,\n line: this.line,\n pos: startPos,\n endPos: this.pos,\n });\n }\n if (this.currentChar === \"=\") {\n const startPos = this.pos;\n if (this.peek() === \"=\") {\n this.eat(\"=\");\n this.eat(\"=\");\n return this.collectToken({\n type: TokenType.IS_EQ,\n value: \"==\",\n line: this.line,\n pos: startPos,\n endPos: this.pos,\n });\n }\n this.eat(\"=\");\n return this.collectToken({\n type: TokenType.ASSIGN,\n value: \"=\",\n line: this.line,\n pos: startPos,\n endPos: this.pos,\n });\n }\n if (this.currentChar === \">\") {\n const startPos = this.pos;\n if (this.peek() === \"=\") {\n this.eat(\">\");\n this.eat(\"=\");\n return this.collectToken({\n type: TokenType.IS_GT_EQ,\n value: \">=\",\n line: this.line,\n pos: startPos,\n endPos: this.pos,\n });\n }\n this.eat(\">\");\n return this.collectToken({\n type: TokenType.IS_GT,\n value: \">\",\n line: this.line,\n pos: startPos,\n endPos: this.pos,\n });\n }\n if (this.currentChar === \"<\") {\n const startPos = this.pos;\n if (this.peek() === \"=\") {\n this.eat(\"<\");\n this.eat(\"=\");\n return this.collectToken({\n type: TokenType.IS_LT_EQ,\n value: \"<=\",\n line: this.line,\n pos: startPos,\n endPos: this.pos,\n });\n }\n this.eat(\"<\");\n return this.collectToken({\n type: TokenType.IS_LT,\n value: \"<\",\n line: this.line,\n pos: startPos,\n endPos: this.pos,\n });\n }\n if (this.currentChar === \";\") {\n const startPos = this.pos;\n this.eat(\";\");\n return this.collectToken({\n type: TokenType.SEMICOLON,\n value: \";\",\n line: this.line,\n pos: startPos,\n endPos: this.pos,\n });\n }\n if (this.currentChar === \"&\" && this.peek() === \"&\") {\n const startPos = this.pos;\n this.eat(\"&\");\n this.eat(\"&\");\n return this.collectToken({\n type: TokenType.LOGIC_AND,\n value: Operations.LOGIC_AND,\n line: this.line,\n pos: startPos,\n endPos: this.pos,\n });\n }\n if (this.currentChar === \"|\" && this.peek() === \"|\") {\n const startPos = this.pos;\n this.eat(\"|\");\n this.eat(\"|\");\n return this.collectToken({\n type: TokenType.LOGIC_OR,\n value: Operations.LOGIC_OR,\n line: this.line,\n pos: startPos,\n endPos: this.pos,\n });\n }\n if (this.currentChar === \":\") {\n const startPos = this.pos;\n this.eat(\":\");\n return this.collectToken({\n type: TokenType.COLON,\n value: \":\",\n line: this.line,\n pos: startPos,\n endPos: this.pos,\n });\n }\n\n // If we reach here, the character is not valid\n if (this.tolerant) {\n // In tolerant mode, skip invalid characters\n this.advance();\n // Continue to next iteration to try to find a valid token\n continue;\n }\n const char = this.currentChar === null ? \"end of input\" : this.currentChar;\n this.error(LexerErrorCode.INVALID_CHARACTER, {\n char,\n position: this.pos,\n });\n }\n const eofToken: Token = {\n type: TokenType.EOF,\n value: null,\n line: this.line,\n pos: this.pos,\n endPos: this.pos,\n };\n return this.collectToken(eofToken);\n }\n\n /**\n * Get all tokens that have been collected during tokenization.\n * This is useful for tolerant parsing to get all tokens including partial ones.\n */\n public getAllTokens(): Token[] {\n return [...this.collectedTokens];\n }\n\n /**\n * Tokenize the entire input and return all tokens.\n * This is a convenience method for tolerant parsing.\n */\n public tokenizeAll(): Token[] {\n const tokens: Token[] = [];\n let token = this.nextToken();\n while (token.type !== TokenType.EOF) {\n tokens.push(token);\n token = this.nextToken();\n }\n tokens.push(token); // Include EOF\n return tokens;\n }\n\n peekToken(): Token | null {\n // Save current state\n const savedPos = this.pos;\n const savedChar = this.currentChar;\n const savedLine = this.line;\n const savedColumn = this.column;\n const savedCollectedLength = this.collectedTokens.length;\n\n const nextToken = this.nextToken();\n\n // Restore state (including collectedTokens to avoid duplicates in tolerant mode)\n this.pos = savedPos;\n this.currentChar = savedChar;\n this.line = savedLine;\n this.column = savedColumn;\n this.collectedTokens.length = savedCollectedLength;\n\n return nextToken.type === TokenType.EOF ? null : nextToken;\n }\n\n peekTokens(n: number): Token[] | null {\n // Save current state\n const savedPos = this.pos;\n const savedChar = this.currentChar;\n const savedLine = this.line;\n const savedColumn = this.column;\n const savedCollectedLength = this.collectedTokens.length;\n\n const tokens: Token[] = [];\n for (let i = 0; i < n; i++) {\n const token = this.nextToken();\n if (token.type === TokenType.EOF) {\n break;\n }\n tokens.push(token);\n }\n\n // Restore state (including collectedTokens to avoid duplicates in tolerant mode)\n this.pos = savedPos;\n this.currentChar = savedChar;\n this.line = savedLine;\n this.column = savedColumn;\n this.collectedTokens.length = savedCollectedLength;\n\n return tokens.length > 0 ? tokens : null;\n }\n\n public isEOF(): boolean {\n // Check if we're at the end of input or only have whitespace remaining\n let tempPos = this.pos;\n let tempChar = this.currentChar;\n\n // Skip whitespace\n while (tempChar !== null && /\\s/.test(tempChar)) {\n tempPos++;\n tempChar = tempPos < this.text.length ? this.text[tempPos] : null;\n }\n\n return tempChar === null;\n }\n\n public getSourceInfo(): { text: string; pos: number; line: number; column: number } {\n return {\n text: this.text,\n pos: this.pos,\n line: this.line,\n column: this.column,\n };\n }\n}\n","import type { ASTNode, Token } from \"@src/types\";\n\n/**\n * Parse state indicating whether the input was complete or incomplete\n */\nexport enum ParseState {\n COMPLETE = \"complete\",\n INCOMPLETE = \"incomplete\",\n}\n\n/**\n * Types of incomplete constructs that can be detected\n */\nexport enum IncompleteType {\n /** Missing closing } in reference like {color */\n UNCLOSED_REFERENCE = \"unclosed_reference\",\n /** Missing closing quote in string like \"hello */\n UNCLOSED_STRING = \"unclosed_string\",\n /** Missing closing ) in expression like (1 + 2 */\n UNCLOSED_PAREN = \"unclosed_paren\",\n /** Missing closing ) in function call like func(1, 2 */\n UNCLOSED_FUNCTION = \"unclosed_function\",\n /** Missing right operand in binary operation like 1 + */\n MISSING_OPERAND = \"missing_operand\",\n /** Trailing dot without property name like {ref}. */\n TRAILING_DOT = \"trailing_dot\",\n}\n\n/**\n * Information about an incomplete construct in the input\n */\nexport interface IncompleteInfo {\n /** Type of incomplete construct */\n type: IncompleteType;\n /** Start position in the input string */\n startPos: number;\n /** End position in the input string */\n endPos?: number;\n /** Partial value that was parsed (e.g., the reference name so far) */\n partialValue?: string;\n}\n\n/**\n * Result from tolerant parsing\n */\nexport interface TolerantParseResult {\n /** The parsed AST (may contain partial nodes if incomplete) */\n ast: ASTNode | null;\n /** Whether the input was complete or incomplete */\n state: ParseState;\n /** List of incomplete constructs found */\n incomplete: IncompleteInfo[];\n /** All tokens parsed (including partial tokens) */\n tokens: Token[];\n /** Error that occurred during parsing, if any slipped through tolerant mode */\n error?: Error;\n}\n","import { type ASTNode, Operations, ReservedKeyword, type Token, TokenType } from \"@src/types\";\nimport {\n AssignNode,\n AttributeAccessNode,\n BinOpNode,\n BlockNode,\n BooleanNode,\n ElementWithUnitNode,\n ForEachNode,\n FunctionCallNode,\n HexColorNode,\n IdentifierNode,\n IfConditionNode,\n IfNode,\n ImplicitListNode,\n ListNode,\n NullNode,\n NumNode,\n ReassignNode,\n ReferenceNode,\n ReturnNode,\n StatementListNode,\n StringNode,\n TemplateStringNode,\n TypeDeclNode,\n UnaryOpNode,\n WhileNode,\n} from \"./ast\";\nimport { ParserError, ParserErrorCode } from \"./errors\";\nimport { Lexer } from \"./lexer\";\nimport {\n PartialBinOpNode,\n PartialFunctionCallNode,\n PartialParenNode,\n PartialReferenceNode,\n PartialStringNode,\n PartialUnaryOpNode,\n} from \"./tolerant/partial-nodes\";\nimport type { IncompleteInfo } from \"./tolerant/types\";\nimport { IncompleteType } from \"./tolerant/types\";\n\n/**\n * Options for the Parser\n */\nexport interface ParserOptions {\n /**\n * If true, the parser will not throw errors on incomplete input.\n * Instead, it will return partial AST nodes where appropriate.\n */\n tolerant?: boolean;\n}\n\nexport class Parser {\n private lexer: Lexer;\n private currentToken: Token;\n public requiredReferences: Set<string> = new Set();\n private tolerant: boolean;\n private incompleteInfo: IncompleteInfo[] = [];\n\n constructor(lexer: Lexer, options?: ParserOptions) {\n this.lexer = lexer;\n this.currentToken = this.lexer.nextToken();\n this.tolerant = options?.tolerant ?? false;\n }\n\n /**\n * In tolerant mode, check if the current token is EOF after consuming an operator.\n * If so, record the incomplete info and return a PartialBinOpNode.\n * Returns null if not at EOF or not in tolerant mode.\n */\n private tryRecoverMissingOperand(left: ASTNode, opToken: Token): PartialBinOpNode | null {\n if (this.tolerant && this.currentToken.type === TokenType.EOF) {\n this.incompleteInfo.push({\n type: IncompleteType.MISSING_OPERAND,\n startPos: opToken.pos,\n endPos: opToken.endPos,\n });\n return new PartialBinOpNode(left, opToken);\n }\n return null;\n }\n\n /**\n * Check if the parser encountered any incomplete constructs\n */\n public hasIncomplete(): boolean {\n return this.incompleteInfo.length > 0;\n }\n\n /**\n * Get information about incomplete constructs\n */\n public getIncomplete(): IncompleteInfo[] {\n return [...this.incompleteInfo];\n }\n\n private formatError(message: string, token: Token = this.currentToken): string {\n const {\n text: sourceText,\n line: currentLine,\n column: currentColumn,\n } = this.lexer.getSourceInfo();\n const lines = sourceText.split(\"\\n\");\n const tokenLine = token.line;\n const errorLineText = lines[tokenLine - 1] || \"\";\n\n // Find the column position of the token\n let column = 1;\n\n if (currentLine === tokenLine) {\n // If we're on the same line, use the current column position\n column = currentColumn;\n } else {\n // If token is from a previous line, estimate the column by finding the token value\n const tokenValue = String(token.value || \"\");\n const tokenIndex = errorLineText.indexOf(tokenValue);\n if (tokenIndex >= 0) {\n column = tokenIndex + 1;\n }\n }\n\n // Show context lines (2 before, 2 after)\n const contextLines = 2;\n const startLine = Math.max(0, tokenLine - 1 - contextLines);\n const endLine = Math.min(lines.length - 1, tokenLine - 1 + contextLines);\n\n let contextText = \"\";\n for (let i = startLine; i <= endLine; i++) {\n const lineNum = i + 1;\n const lineText = lines[i] || \"\";\n const isErrorLine = lineNum === tokenLine;\n\n // Add line number prefix\n const linePrefix = `${lineNum.toString().padStart(3, \" \")} | `;\n contextText += `${linePrefix + lineText}\\n`;\n\n // Add pointer line for the error line\n if (isErrorLine) {\n const pointer = `${\" \".repeat(linePrefix.length - 1 + Math.max(0, column - 1))}^`;\n contextText += `${pointer}\\n`;\n }\n }\n\n return `${message}\\n\\n${contextText}`;\n }\n\n private peekTokens(n: number): Token[] | null {\n return this.lexer.peekTokens(n);\n }\n\n /**\n * Check if the current token can be treated as an identifier.\n * FORMAT tokens (like 's', 'ms') are valid identifiers in most contexts\n * (variable names, attribute names, type names).\n */\n private isIdentifierToken(token: Token = this.currentToken): boolean {\n return token.type === TokenType.STRING || token.type === TokenType.FORMAT;\n }\n\n /**\n * Eat an identifier token (STRING or FORMAT).\n * FORMAT tokens can be valid identifiers in contexts like variable names,\n * attribute names, and type names.\n */\n private eatIdentifier(): Token {\n if (this.isIdentifierToken()) {\n const token = this.currentToken;\n this.eat(this.currentToken.type);\n return token;\n }\n this.error(ParserErrorCode.UNEXPECTED_TOKEN, { token: String(this.currentToken.value) });\n }\n\n private error(code: ParserErrorCode, data?: Record<string, unknown>): never {\n const message = data?.message ? String(data.message) : undefined;\n const formattedMessage = this.formatError(\n message || (code === ParserErrorCode.INVALID_SYNTAX ? \"Invalid syntax\" : code),\n );\n throw new ParserError(code, {\n token: this.currentToken,\n data: { ...data, message: formattedMessage },\n });\n }\n\n private eat(tokenType: TokenType): Token {\n const token = this.currentToken;\n if (this.currentToken.type === tokenType) {\n this.currentToken = this.lexer.nextToken();\n } else {\n this.error(ParserErrorCode.EXPECTED_TOKEN_TYPE, {\n expected: tokenType,\n got: this.currentToken.type,\n });\n }\n return token;\n }\n\n private typeDeclaration(): TypeDeclNode {\n const baseTypeToken = this.eatIdentifier();\n const baseType = new IdentifierNode(baseTypeToken);\n\n const subTypes: IdentifierNode[] = [];\n while (this.currentToken.type === TokenType.DOT) {\n this.eat(TokenType.DOT);\n const subTypeToken = this.eatIdentifier();\n subTypes.push(new IdentifierNode(subTypeToken));\n }\n return new TypeDeclNode(baseType, subTypes, baseTypeToken);\n }\n\n private statementsList(): ASTNode | StatementListNode {\n const statements: ASTNode[] = [];\n const token = this.currentToken;\n\n while (\n this.currentToken.type !== TokenType.EOF &&\n this.currentToken.type !== TokenType.RBLOCK\n ) {\n statements.push(this.statement());\n if (this.currentToken.type === TokenType.SEMICOLON) {\n this.eat(TokenType.SEMICOLON);\n } else {\n if (\n (this.currentToken.type as TokenType) === TokenType.EOF ||\n (this.currentToken.type as TokenType) === TokenType.RBLOCK\n ) {\n break;\n }\n }\n }\n\n if (statements.length === 1) {\n return statements[0];\n }\n\n return new StatementListNode(statements, token);\n }\n\n private statement(): ASTNode {\n if (this.currentToken.type === TokenType.RESERVED_KEYWORD) {\n switch (this.currentToken.value) {\n case ReservedKeyword.RETURN:\n return this.returnStatement();\n case ReservedKeyword.WHILE:\n return this.whileStatement();\n case ReservedKeyword.FOR:\n return this.forStatement();\n case ReservedKeyword.IF:\n return this.ifStatement();\n case ReservedKeyword.VARIABLE:\n return this.assignVariable();\n }\n } else if (this.isIdentifierToken()) {\n // Look ahead to check the token sequence for property reassignment (e.g., output.s = ...)\n const nextTokens = this.peekTokens(4); // Get next 4 tokens\n if (nextTokens !== null) {\n for (let i = 0; i < nextTokens.length - 1; i += 2) {\n if (nextTokens[i].type === TokenType.DOT && this.isIdentifierToken(nextTokens[i + 1])) {\n if (i + 2 < nextTokens.length && nextTokens[i + 2].type === TokenType.ASSIGN) {\n const name = this.currentToken;\n this.eat(this.currentToken.type);\n return this.reassignVariable(name);\n }\n }\n }\n }\n\n // Check for simple variable reassignment (var = ...)\n const nextToken = this.lexer.peekToken();\n if (nextToken && nextToken.type === TokenType.ASSIGN) {\n return this.reassignVariable();\n }\n }\n\n return this.listExpr();\n }\n\n private assignVariable(): AssignNode {\n const token = this.eat(TokenType.RESERVED_KEYWORD);\n\n const varNameToken = this.eatIdentifier();\n const varName = new IdentifierNode(varNameToken);\n this.eat(TokenType.COLON);\n\n const typeDecl = this.typeDeclaration();\n\n if (this.currentToken.type === TokenType.ASSIGN) {\n this.eat(TokenType.ASSIGN);\n const assignmentExpr = this.listExpr();\n return new AssignNode(varName, typeDecl, assignmentExpr, token);\n }\n\n return new AssignNode(varName, typeDecl, null, token);\n }\n\n private reassignVariable(nameToken?: Token): ReassignNode {\n const varNameToken = nameToken || this.eatIdentifier();\n let name: IdentifierNode | IdentifierNode[] = new IdentifierNode(varNameToken);\n\n if (this.currentToken.type === TokenType.DOT) {\n const names: IdentifierNode[] = [new IdentifierNode(varNameToken)];\n while (this.currentToken.type === TokenType.DOT) {\n this.eat(TokenType.DOT);\n const propertyToken = this.eatIdentifier();\n names.push(new IdentifierNode(propertyToken));\n }\n name = names;\n }\n\n this.eat(TokenType.ASSIGN);\n\n const assignmentExpr = this.listExpr();\n\n return new ReassignNode(name, assignmentExpr, varNameToken);\n }\n\n private reference(): ASTNode {\n const token = this.currentToken;\n\n // Handle partial reference tokens (from tolerant lexer)\n if (token.type === TokenType.PARTIAL_REFERENCE) {\n this.eat(TokenType.PARTIAL_REFERENCE);\n this.incompleteInfo.push({\n type: IncompleteType.UNCLOSED_REFERENCE,\n startPos: token.pos,\n endPos: token.endPos,\n partialValue: token.value,\n });\n return new PartialReferenceNode(token.value, token);\n }\n\n const node = new ReferenceNode(token);\n this.eat(TokenType.REFERENCE);\n this.requiredReferences.add(node.value);\n\n if (this.currentToken.type === TokenType.FORMAT) {\n return this.format(node);\n }\n return node;\n }\n\n // logic_term ((AND | OR) logic_term)*\n private expr(): ASTNode {\n let node = this.logicTerm();\n while (\n this.currentToken.type === TokenType.LOGIC_AND ||\n this.currentToken.type === TokenType.LOGIC_OR\n ) {\n const token = this.eat(this.currentToken.type);\n const partial = this.tryRecoverMissingOperand(node, token);\n if (partial) return partial;\n node = new BinOpNode(node, token, this.logicTerm());\n }\n return node;\n }\n\n private conditionExpr(): ASTNode {\n if (this.currentToken.type === TokenType.STRING) {\n const nextToken = this.lexer.peekToken();\n if (nextToken && nextToken.type === TokenType.ASSIGN) {\n throw new ParserError(ParserErrorCode.CONDITION_MUST_BE_BOOLEAN, {\n token: this.currentToken,\n });\n }\n }\n\n return this.expr();\n }\n\n private returnStatement(): ReturnNode {\n const token = this.eat(TokenType.RESERVED_KEYWORD); // 'return'\n const expr = this.listExpr();\n return new ReturnNode(expr, token);\n }\n\n private whileStatement(): WhileNode {\n const whileToken = this.eat(TokenType.RESERVED_KEYWORD); // 'while'\n this.eat(TokenType.LPAREN);\n const condition = this.conditionExpr();\n this.eat(TokenType.RPAREN);\n const body = this.block();\n return new WhileNode(condition, body.statements as StatementListNode, whileToken);\n }\n\n private forStatement(): ForEachNode {\n const forToken = this.eat(TokenType.RESERVED_KEYWORD); // 'for'\n\n // First identifier: item variable\n if (!this.isIdentifierToken()) {\n throw new ParserError(ParserErrorCode.EXPECTED_TOKEN_TYPE, {\n token: this.currentToken,\n data: { expectedType: \"identifier\", actualType: this.currentToken.type },\n });\n }\n const firstVar = this.currentToken.value as string;\n this.eat(this.currentToken.type);\n\n // Check for comma → item, index\n let indexVar: string | null = null;\n if (this.currentToken.type === TokenType.COMMA) {\n this.eat(TokenType.COMMA);\n if (!this.isIdentifierToken()) {\n throw new ParserError(ParserErrorCode.EXPECTED_TOKEN_TYPE, {\n token: this.currentToken,\n data: { expectedType: \"identifier\", actualType: this.currentToken.type },\n });\n }\n indexVar = this.currentToken.value as string;\n this.eat(this.currentToken.type);\n }\n\n // Expect contextual 'in' — parsed as STRING token with value \"in\"\n if (!this.isIdentifierToken() || this.currentToken.value !== \"in\") {\n throw new ParserError(ParserErrorCode.EXPECTED_TOKEN_TYPE, {\n token: this.currentToken,\n data: { expectedType: \"'in'\", actualType: this.currentToken.value },\n });\n }\n this.eat(this.currentToken.type);\n\n // Parse collection expression (e.g., [1, 2, 3], range(3), myList).\n const collection = this.expr();\n\n // Parse body block\n const body = this.block();\n\n // Consume optional trailing semicolon\n if (this.currentToken.type === TokenType.SEMICOLON) {\n this.eat(TokenType.SEMICOLON);\n }\n\n return new ForEachNode(\n firstVar,\n indexVar,\n collection,\n body.statements as StatementListNode,\n forToken,\n );\n }\n\n private ifStatement(): IfNode {\n const ifToken = this.eat(TokenType.RESERVED_KEYWORD); // 'if'\n this.eat(TokenType.LPAREN);\n const condition = this.conditionExpr();\n this.eat(TokenType.RPAREN);\n const ifBody = this.block().statements as StatementListNode;\n\n const conditions = [new IfConditionNode(condition, ifBody, ifToken)];\n\n // Handle elif clauses\n while (\n this.currentToken.type === TokenType.RESERVED_KEYWORD &&\n this.currentToken.value === ReservedKeyword.ELIF\n ) {\n this.eat(TokenType.RESERVED_KEYWORD); // 'elif'\n this.eat(TokenType.LPAREN);\n const elifCondition = this.conditionExpr();\n this.eat(TokenType.RPAREN);\n const elifBody = this.block().statements as StatementListNode;\n conditions.push(new IfConditionNode(elifCondition, elifBody, ifToken));\n }\n\n // Check for 'else' block\n let elseBody: StatementListNode | null = null;\n if (\n this.currentToken.type === TokenType.RESERVED_KEYWORD &&\n this.currentToken.value === ReservedKeyword.ELSE\n ) {\n this.eat(TokenType.RESERVED_KEYWORD); // 'else'\n elseBody = this.block().statements as StatementListNode;\n }\n\n return new IfNode(conditions, elseBody, ifToken);\n }\n\n private block(): BlockNode {\n this.eat(TokenType.LBLOCK);\n const statements = this.statementsList() as StatementListNode;\n this.eat(TokenType.RBLOCK);\n return new BlockNode(statements);\n }\n\n // Explicit list literal: [expr, expr, ...]\n private explicitList(): ListNode {\n const token = this.currentToken;\n this.eat(TokenType.LBLOCK);\n\n const elements: ASTNode[] = [];\n\n if (this.currentToken.type !== TokenType.RBLOCK) {\n elements.push(this.expr());\n while (this.currentToken.type === TokenType.COMMA) {\n this.eat(TokenType.COMMA);\n elements.push(this.expr());\n }\n }\n\n this.eat(TokenType.RBLOCK);\n return new ListNode(elements, token);\n }\n\n // implicit_list_expr : factor ((COMMA) factor)*\n private implicitListExpr(): ASTNode {\n const token = this.currentToken;\n const elements: ASTNode[] = [this.expr()];\n\n while (\n this.currentToken.type !== TokenType.COMMA &&\n this.currentToken.type !== TokenType.RPAREN &&\n this.currentToken.type !== TokenType.EOF &&\n this.currentToken.type !== TokenType.SEMICOLON\n ) {\n elements.push(this.expr());\n }\n\n if (elements.length === 1) return elements[0];\n\n return new ImplicitListNode(elements, token);\n }\n\n // factor ((COMMA) factor)\n private listExpr(): ASTNode {\n const firstToken = this.currentToken;\n const elements: ASTNode[] = [this.implicitListExpr()];\n\n while (this.currentToken.type === TokenType.COMMA) {\n this.eat(TokenType.COMMA);\n elements.push(this.implicitListExpr());\n }\n\n if (elements.length === 1) {\n return elements[0];\n }\n\n return new ListNode(elements, firstToken);\n }\n\n // comparison ((IS_EQ | IS_NOT_EQ | IS_GT | IS_LT | IS_GT_EQ | IS_LT_EQ) comparison)*\n private logicTerm(): ASTNode {\n let node = this.comparison();\n while (\n this.currentToken.type === TokenType.IS_EQ ||\n this.currentToken.type === TokenType.IS_NOT_EQ ||\n this.currentToken.type === TokenType.IS_GT ||\n this.currentToken.type === TokenType.IS_LT ||\n this.currentToken.type === TokenType.IS_GT_EQ ||\n this.currentToken.type === TokenType.IS_LT_EQ\n ) {\n const token = this.eat(this.currentToken.type);\n const partial = this.tryRecoverMissingOperand(node, token);\n if (partial) return partial;\n node = new BinOpNode(node, token, this.comparison());\n }\n return node;\n }\n\n // term ((ADD | SUBTRACT) term)*\n // Arithmetic addition/subtraction binds tighter than comparison operators.\n private comparison(): ASTNode {\n let node = this.term();\n while (\n this.currentToken.type === TokenType.OPERATION &&\n (this.currentToken.value === Operations.ADD ||\n this.currentToken.value === Operations.SUBTRACT)\n ) {\n const token = this.eat(TokenType.OPERATION);\n const partial = this.tryRecoverMissingOperand(node, token);\n if (partial) return partial;\n node = new BinOpNode(node, token, this.term());\n }\n return node;\n }\n\n // Term = Power ((\"*\" | \"/\") Power)*\n private term(): ASTNode {\n let node = this.power();\n while (\n this.currentToken.type === TokenType.OPERATION &&\n (this.currentToken.value === Operations.MULTIPLY ||\n this.currentToken.value === Operations.DIVIDE)\n ) {\n const token = this.eat(TokenType.OPERATION);\n const partial = this.tryRecoverMissingOperand(node, token);\n if (partial) return partial;\n node = new BinOpNode(node, token, this.power());\n }\n return node;\n }\n\n // factor (POWER factor)*\n private power(): ASTNode {\n let node = this.factor();\n while (\n this.currentToken.type === TokenType.OPERATION &&\n this.currentToken.value === Operations.POWER\n ) {\n const token = this.eat(TokenType.OPERATION);\n const partial = this.tryRecoverMissingOperand(node, token);\n if (partial) return partial;\n node = new BinOpNode(node, token, this.factor());\n }\n return node;\n }\n\n private format(node: ASTNode): ASTNode {\n const formatToken = this.currentToken;\n this.eat(TokenType.FORMAT);\n return new ElementWithUnitNode(node, formatToken.value);\n }\n\n private number(): ASTNode {\n let node: ASTNode = new NumNode(this.currentToken);\n this.eat(TokenType.NUMBER);\n if (this.currentToken.type === TokenType.FORMAT) {\n return this.format(node);\n }\n node = this.attributeAccess(node);\n return node;\n }\n\n // factor : PLUS factor\n // | MINUS factor\n // | NOT factor\n // | NUMBER (FORMAT)?\n // | LPAREN expr RPAREN (FORMAT)?\n // | REFERENCE (DOT (STRING | function))*\n // | STRING (LPAREN args RPAREN)? (DOT (STRING | function))*\n // | EXPLICIT_STRING (DOT (STRING | function))*\n // | HEX_COLOR\n private factor(): ASTNode {\n const token = this.currentToken;\n\n // Explicit list literal: [expr, expr, ...]\n if (token.type === TokenType.LBLOCK) {\n let node: ASTNode = this.explicitList();\n node = this.attributeAccess(node);\n return node;\n }\n\n // Handle unary operators\n if (\n token.type === TokenType.OPERATION &&\n (token.value === Operations.ADD ||\n token.value === Operations.SUBTRACT ||\n token.value === Operations.LOGIC_NOT)\n ) {\n this.eat(TokenType.OPERATION);\n if (this.tolerant && this.currentToken.type === TokenType.EOF) {\n this.incompleteInfo.push({\n type: IncompleteType.MISSING_OPERAND,\n startPos: token.pos,\n endPos: token.endPos,\n });\n return new PartialUnaryOpNode(token);\n }\n return new UnaryOpNode(token, this.factor());\n }\n\n if (\n token.type === TokenType.RESERVED_KEYWORD &&\n (token.value === ReservedKeyword.TRUE || token.value === ReservedKeyword.FALSE)\n ) {\n this.eat(TokenType.RESERVED_KEYWORD);\n let boolNode: ASTNode = new BooleanNode(token.value === ReservedKeyword.TRUE, token);\n boolNode = this.attributeAccess(boolNode);\n return boolNode;\n }\n\n if (token.type === TokenType.RESERVED_KEYWORD && token.value === ReservedKeyword.NULL) {\n this.eat(TokenType.RESERVED_KEYWORD);\n let nullNode: ASTNode = new NullNode(token);\n nullNode = this.attributeAccess(nullNode);\n return nullNode;\n }\n\n if (token.type === TokenType.NUMBER) {\n return this.number();\n }\n\n if (token.type === TokenType.LPAREN) {\n const lparenToken = token;\n this.eat(TokenType.LPAREN);\n\n // In tolerant mode, handle EOF or empty paren\n if (this.tolerant && this.currentToken.type === TokenType.EOF) {\n this.incompleteInfo.push({\n type: IncompleteType.UNCLOSED_PAREN,\n startPos: lparenToken.pos,\n });\n // Return a partial node with null expression\n return new PartialParenNode(new NullNode(lparenToken), lparenToken);\n }\n\n const node = this.expr();\n\n // In tolerant mode, handle missing closing paren\n if (this.tolerant && this.currentToken.type === TokenType.EOF) {\n this.incompleteInfo.push({\n type: IncompleteType.UNCLOSED_PAREN,\n startPos: lparenToken.pos,\n });\n return new PartialParenNode(node, lparenToken);\n }\n\n this.eat(TokenType.RPAREN);\n if (this.currentToken.type === TokenType.FORMAT) {\n return this.format(node);\n }\n return this.attributeAccess(node);\n }\n\n // Handle partial reference tokens\n if (token.type === TokenType.PARTIAL_REFERENCE) {\n let node = this.reference();\n node = this.attributeAccess(node);\n return node;\n }\n\n if (token.type === TokenType.REFERENCE) {\n let node = this.reference();\n // Handle attribute access like {ref}.property or {ref}.method()\n node = this.attributeAccess(node);\n return node;\n }\n\n if (token.type === TokenType.HEX_COLOR) {\n this.eat(TokenType.HEX_COLOR);\n let hexNode: ASTNode = new HexColorNode(token);\n hexNode = this.attributeAccess(hexNode);\n return hexNode;\n }\n\n // Handle partial string tokens\n if (token.type === TokenType.PARTIAL_STRING) {\n this.eat(TokenType.PARTIAL_STRING);\n const sourceText = this.lexer.getSourceInfo().text;\n const quoteType = sourceText[token.pos] ?? '\"';\n this.incompleteInfo.push({\n type: IncompleteType.UNCLOSED_STRING,\n startPos: token.pos,\n endPos: token.endPos,\n partialValue: token.value,\n });\n return new PartialStringNode(token.value, quoteType, token);\n }\n\n // Identifier or function call\n // FORMAT tokens (like 's', 'ms') can be used as identifiers/function names\n if (this.isIdentifierToken(token)) {\n this.eat(token.type);\n let node: ASTNode;\n // After eating the identifier, currentToken is updated.\n // This comparison (this.currentToken.type as TokenType) === TokenType.LPAREN is valid.\n if ((this.currentToken.type as TokenType) === TokenType.LPAREN) {\n // Function call\n node = this.functionCall(token);\n } else {\n // Identifier\n node = new IdentifierNode(token);\n }\n // Handle attribute access like ident.property or ident.method()\n node = this.attributeAccess(node);\n return node;\n }\n if (token.type === TokenType.TEMPLATE_STRING) {\n return this.templateString();\n }\n\n if (token.type === TokenType.EXPLICIT_STRING) {\n this.eat(TokenType.EXPLICIT_STRING);\n let node: ASTNode = new StringNode(token);\n node = this.attributeAccess(node); // For string methods like \"hello\".length()\n return node;\n }\n\n // In tolerant mode, handle EOF gracefully\n if (this.tolerant && token.type === TokenType.EOF) {\n return new NullNode(token);\n }\n\n this.error(ParserErrorCode.UNEXPECTED_TOKEN, { token: String(token.value) });\n }\n\n private attributeAccess(leftNode: ASTNode): ASTNode {\n let node = leftNode;\n while (this.currentToken.type === TokenType.DOT) {\n const dotToken = this.eat(TokenType.DOT);\n // In tolerant mode, handle trailing dot without property name\n // Cast needed: TS narrows currentToken.type after the while(DOT) guard,\n // but eat() replaces currentToken so it can now be EOF.\n if (this.tolerant && (this.currentToken.type as TokenType) === TokenType.EOF) {\n this.incompleteInfo.push({\n type: IncompleteType.TRAILING_DOT,\n startPos: dotToken.pos,\n endPos: dotToken.endPos,\n });\n break;\n }\n // Accept STRING or FORMAT as valid identifier in attribute position\n // FORMAT tokens (like 's', 'ms') can still be valid attribute names\n if (this.isIdentifierToken()) {\n const nextToken = this.lexer.peekToken();\n if (nextToken && nextToken.type === TokenType.LPAREN) {\n // It's a method call\n const methodName = this.currentToken.value as string;\n this.eat(this.currentToken.type);\n const funcCall = this.functionCall({ ...this.currentToken, value: methodName } as Token);\n node = new AttributeAccessNode(node, funcCall);\n } else {\n // It's a property access\n const attrToken = this.currentToken;\n this.eat(this.currentToken.type);\n node = new AttributeAccessNode(node, new IdentifierNode(attrToken));\n }\n }\n }\n return node;\n }\n\n private functionCall(functionName: Token): FunctionCallNode | PartialFunctionCallNode {\n this.eat(TokenType.LPAREN);\n const args: ASTNode[] = [];\n while (this.currentToken.type !== TokenType.RPAREN) {\n // In tolerant mode, handle EOF before closing paren\n if (this.tolerant && this.currentToken.type === TokenType.EOF) {\n this.incompleteInfo.push({\n type: IncompleteType.UNCLOSED_FUNCTION,\n startPos: functionName.pos,\n partialValue: functionName.value as string,\n });\n return new PartialFunctionCallNode(functionName.value as string, args, functionName);\n }\n if (this.currentToken.type === TokenType.COMMA) {\n this.eat(TokenType.COMMA);\n }\n args.push(this.implicitListExpr());\n }\n this.eat(TokenType.RPAREN);\n return new FunctionCallNode(functionName.value as string, args, functionName);\n }\n\n /**\n * Parse a TEMPLATE_STRING token into a TemplateStringNode.\n * Scans the raw content for:\n * - {ref.path} → ReferenceNode\n * - ${expression} → parsed sub-expression\n * - \\{ \\${ \\` \\\\ → escaped literals (backslash removed)\n * - everything else → literal StringNode segments\n */\n private templateString(): ASTNode {\n const token = this.currentToken;\n const raw = token.value as string;\n this.eat(TokenType.TEMPLATE_STRING);\n\n const parts: ASTNode[] = [];\n let literal = \"\";\n let i = 0;\n\n const flushLiteral = () => {\n if (literal.length > 0) {\n parts.push(new StringNode({ ...token, value: literal }));\n literal = \"\";\n }\n };\n\n while (i < raw.length) {\n const ch = raw[i];\n\n // Escape sequences: \\{ \\${ \\$ \\` \\\\\n if (ch === \"\\\\\" && i + 1 < raw.length) {\n const next = raw[i + 1];\n if (next === \"{\" || next === \"`\" || next === \"\\\\\") {\n literal += next;\n i += 2;\n continue;\n }\n if (next === \"$\") {\n if (i + 2 < raw.length && raw[i + 2] === \"{\") {\n // \\${ → literal \"${\", prevents expression interpolation\n literal += \"${\";\n i += 3;\n } else {\n // \\$ → literal \"$\"\n literal += \"$\";\n i += 2;\n }\n continue;\n }\n }\n\n // Expression interpolation: ${...}\n if (ch === \"$\" && i + 1 < raw.length && raw[i + 1] === \"{\") {\n flushLiteral();\n // Find matching closing brace (tracking nesting, rejecting backticks)\n const start = i + 2;\n let depth = 1;\n let j = start;\n while (j < raw.length && depth > 0) {\n if (raw[j] === \"`\") {\n this.error(ParserErrorCode.INVALID_SYNTAX, {\n message: \"Nested template strings are not allowed inside ${...}\",\n });\n }\n if (raw[j] === \"{\") depth++;\n else if (raw[j] === \"}\") depth--;\n if (depth > 0) j++;\n }\n if (depth !== 0) {\n this.error(ParserErrorCode.INVALID_SYNTAX, {\n message: \"Unterminated ${...} in template string\",\n });\n }\n const exprStr = raw.slice(start, j);\n const subLexer = new Lexer(exprStr);\n const subParser = new Parser(subLexer);\n const exprNode = subParser.expr();\n // Collect references from the sub-expression\n for (const ref of subParser.requiredReferences) {\n this.requiredReferences.add(ref);\n }\n parts.push(exprNode);\n i = j + 1; // skip past closing }\n continue;\n }\n\n // Reference interpolation: {ref.path}\n if (ch === \"{\") {\n flushLiteral();\n const start = i + 1;\n let j = start;\n while (j < raw.length && raw[j] !== \"}\") {\n if (raw[j] === \"{\") {\n this.error(ParserErrorCode.INVALID_SYNTAX, {\n message: \"Nested braces in template reference\",\n });\n }\n j++;\n }\n if (j >= raw.length) {\n this.error(ParserErrorCode.INVALID_SYNTAX, {\n message: \"Unterminated {ref} in template string\",\n });\n }\n let refPath = raw.slice(start, j);\n // Strip whitespace inside reference (same as lexer behavior)\n refPath = refPath.replace(/[ \\t]/g, \"\");\n if (refPath.length === 0) {\n this.error(ParserErrorCode.INVALID_SYNTAX, {\n message: \"Empty reference in template string\",\n });\n }\n this.requiredReferences.add(refPath);\n parts.push(\n new ReferenceNode({\n ...token,\n type: TokenType.REFERENCE,\n value: refPath,\n }),\n );\n i = j + 1; // skip past closing }\n continue;\n }\n\n // Regular character\n literal += ch;\n i++;\n }\n\n flushLiteral();\n\n // Optimization: if the template has zero interpolations, return a plain StringNode\n if (parts.length === 1 && parts[0] instanceof StringNode) {\n return parts[0];\n }\n\n return new TemplateStringNode(parts, token);\n }\n\n public parse(inlineMode = false): ASTNode | null {\n if (this.tolerant && !inlineMode) {\n this.error(ParserErrorCode.TOLERANT_REQUIRES_INLINE);\n }\n\n if (this.currentToken.type === TokenType.EOF) return null;\n\n if (inlineMode) return this.listExpr();\n\n const node = this.statementsList();\n if ((this.currentToken.type as TokenType) !== TokenType.EOF) {\n this.error(ParserErrorCode.INVALID_SYNTAX, {\n message: \"Unexpected token at the end of input.\",\n });\n }\n return node;\n }\n}\n\nexport interface ParseExpressionResult {\n lexer: Lexer;\n parser: Parser;\n ast: ASTNode | null;\n}\n\nexport function parseExpression(text: string): ParseExpressionResult {\n const lexer = new Lexer(text);\n const parser = new Parser(lexer);\n const ast = parser.parse();\n\n return {\n lexer,\n parser,\n ast,\n };\n}\n","export { type BuildTokensOptions, buildTokens, type TokenDataMap } from \"./base\";\nexport { type FlattenCallback, flattenChildrenMap, flattenChildrenObject } from \"./flatten\";\nexport { MapBuilder } from \"./MapBuilder\";\nexport { FlatObjectBuilder, NestedObjectBuilder } from \"./ObjectBuilder\";\nexport { StringMapBuilder } from \"./StringMapBuilder\";\nexport type { BuilderFormat, TokenBuilder } from \"./types\";\n","/**\n * Tracks token and prefix dependencies required for prefix resolution.\n *\n * Maintains bidirectional maps for both token and prefix dependencies,\n * enabling efficient lookups in both directions and readiness checking.\n */\nexport class DependencyTracker {\n private readonly tokenDeps = new Map<string, Set<string>>();\n private readonly reverseDeps = new Map<string, Set<string>>();\n private readonly prefixDeps = new Map<string, Set<string>>();\n private readonly prefixReverseDeps = new Map<string, Set<string>>();\n\n addTokenDependency(dependent: string, dependency: string): void {\n this.addToSetMap(this.tokenDeps, dependent, dependency);\n this.addToSetMap(this.reverseDeps, dependency, dependent);\n }\n\n removeTokenDependency(dependent: string, dependency: string): void {\n this.removeFromSetMap(this.tokenDeps, dependent, dependency);\n this.removeFromSetMap(this.reverseDeps, dependency, dependent);\n }\n\n addPrefixDependency(dependent: string, prefix: string): void {\n this.addToSetMap(this.prefixDeps, dependent, prefix);\n this.addToSetMap(this.prefixReverseDeps, prefix, dependent);\n }\n\n removePrefixDependency(dependent: string, prefix: string): void {\n this.removeFromSetMap(this.prefixDeps, dependent, prefix);\n this.removeFromSetMap(this.prefixReverseDeps, prefix, dependent);\n }\n\n getTokenDependents(token: string): Set<string> {\n return this.cloneSet(this.reverseDeps.get(token));\n }\n\n getTokenDependentsIterable(token: string): Iterable<string> {\n return this.reverseDeps.get(token) ?? [];\n }\n\n getTokensWaitingForPrefix(prefix: string): Set<string> {\n return this.cloneSet(this.prefixReverseDeps.get(prefix));\n }\n\n getTokensWaitingForPrefixIterable(prefix: string): Iterable<string> {\n return this.prefixReverseDeps.get(prefix) ?? [];\n }\n\n getTokenDependencies(token: string): Set<string> {\n return this.cloneSet(this.tokenDeps.get(token));\n }\n\n getPrefixDependencies(token: string): Set<string> {\n return this.cloneSet(this.prefixDeps.get(token));\n }\n\n isTokenReady(token: string): boolean {\n const tokenDeps = this.tokenDeps.get(token);\n const prefixDeps = this.prefixDeps.get(token);\n return (!tokenDeps || tokenDeps.size === 0) && (!prefixDeps || prefixDeps.size === 0);\n }\n\n hasAnyDependencies(): boolean {\n return this.tokenDeps.size > 0 || this.prefixDeps.size > 0;\n }\n\n getUnresolvedTokens(): string[] {\n const unresolved = new Set<string>();\n for (const [token] of this.tokenDeps) unresolved.add(token);\n for (const [token] of this.prefixDeps) unresolved.add(token);\n return Array.from(unresolved);\n }\n\n private addToSetMap<K, V>(map: Map<K, Set<V>>, key: K, value: V): void {\n let set = map.get(key);\n if (!set) {\n set = new Set<V>();\n map.set(key, set);\n }\n set.add(value);\n }\n\n private removeFromSetMap<K, V>(map: Map<K, Set<V>>, key: K, value: V): void {\n const set = map.get(key);\n if (!set) return;\n set.delete(value);\n if (set.size === 0) {\n map.delete(key);\n }\n }\n\n private cloneSet(values?: Set<string>): Set<string> {\n return values ? new Set(values) : new Set();\n }\n}\n","import { isLanguageError } from \"@interpreter/errors\";\nimport { ProcessorErrorCode } from \"@interpreter/errors/codes/processor\";\nimport type { RefPath, TokenOperationResult } from \"./types\";\n\n/**\n * Get all affected token paths from the dependants graph.\n * Returns the set of all tokens that depend on the changed token.\n */\nexport function getAffectedTokens(result: TokenOperationResult): Set<RefPath> {\n if (!result.dependants?.graph) {\n return new Set();\n }\n return new Set(result.dependants.graph.getNodes().keys());\n}\n\n/**\n * Get broken references from issues.\n * Filters issues for TOKEN_NOT_FOUND or DEPENDENCY_ERROR codes.\n */\nexport function getBrokenReferences(result: TokenOperationResult): Set<RefPath> {\n if (!result.issues) {\n return new Set();\n }\n\n const brokenRefs = new Set<RefPath>();\n\n for (const [tokenPath, issues] of result.issues) {\n for (const issue of issues) {\n // Check for ProcessorError with TOKEN_NOT_FOUND or DEPENDENCY_ERROR code\n if (\n isLanguageError(issue) &&\n (issue.code === ProcessorErrorCode.TOKEN_NOT_FOUND ||\n issue.code === ProcessorErrorCode.DEPENDENCY_ERROR)\n ) {\n brokenRefs.add(tokenPath);\n break;\n }\n }\n }\n\n return brokenRefs;\n}\n\n/**\n * For rename operations: get tokens whose references were updated.\n * Pass the set of tokens that were modified during rename.\n */\nexport function getRenamedReferences(\n _result: TokenOperationResult,\n modifiedTokens: Set<RefPath>,\n): Set<RefPath> {\n return modifiedTokens;\n}\n\n/**\n * Get tokens from the dependants graph whose values actually changed.\n * Compares the old token values with the new result to filter only modified tokens.\n */\nexport function getModifiedDependants(\n oldTokens: Map<RefPath, any>,\n result: TokenOperationResult,\n): Set<RefPath> {\n const modified = new Set<RefPath>();\n\n // Get all dependants from the graph\n const affectedTokens = getAffectedTokens(result);\n\n // Filter to only those whose values actually changed\n for (const tokenPath of affectedTokens) {\n const oldValue = oldTokens.get(tokenPath);\n const newValue = result.tokens.get(tokenPath);\n\n // Compare values - if they differ, the token was modified\n if (oldValue !== newValue) {\n modified.add(tokenPath);\n }\n }\n\n return modified;\n}\n","import type { ProcessorErrorCode } from \"@interpreter/errors\";\nimport type { IssuesMap } from \"./types\";\n\n/**\n * Check if issues map contains an error with the specified code.\n * Useful for checking if any token has a specific type of error.\n *\n * @example\n * ```typescript\n * const result = resolver.updateToken({ ... });\n * if (hasIssueWithCode(result.issues, ProcessorErrorCode.CIRCULAR_DEPENDENCY)) {\n * console.error(\"Circular dependency detected\");\n * }\n * ```\n */\nexport function hasIssueWithCode(issues: IssuesMap | undefined, code: ProcessorErrorCode): boolean {\n if (!issues) return false;\n return Array.from(issues.entries()).some(([_tokenName, issueList]) =>\n issueList.some((issue) => \"code\" in issue && issue.code === code),\n );\n}\n\n/**\n * Check if a specific token has an issue with the specified code.\n *\n * @example\n * ```typescript\n * const result = resolver.updateToken({ tokenPath: \"foo\", ... });\n * if (tokenHasIssueWithCode(result.issues, \"foo\", ProcessorErrorCode.CIRCULAR_DEPENDENCY)) {\n * console.error(\"Token 'foo' has a circular dependency\");\n * }\n * ```\n */\nexport function tokenHasIssueWithCode(\n issues: IssuesMap | undefined,\n tokenName: string,\n code: ProcessorErrorCode,\n): boolean {\n if (!issues) return false;\n const tokenIssues = issues.get(tokenName);\n if (!tokenIssues) return false;\n return tokenIssues.some((issue) => \"code\" in issue && issue.code === code);\n}\n\n/**\n * Get all tokens that have issues of any kind.\n *\n * @example\n * ```typescript\n * const result = resolver.build(tokens);\n * const tokensWithIssues = getTokensWithIssues(result.issues);\n * console.log(`${tokensWithIssues.size} tokens have issues`);\n * ```\n */\nexport function getTokensWithIssues(issues: IssuesMap | undefined): Set<string> {\n if (!issues) return new Set();\n return new Set(issues.keys());\n}\n\n/**\n * Check if there are any issues at all.\n *\n * @example\n * ```typescript\n * const result = resolver.build(tokens);\n * if (hasAnyIssues(result.issues)) {\n * console.error(\"There are issues with the tokens\");\n * }\n * ```\n */\nexport function hasAnyIssues(issues: IssuesMap | undefined): boolean {\n return issues !== undefined && issues.size > 0;\n}\n\n/**\n * Check if a specific token has any error (not lint issue).\n * Errors have a `code` property, while lint issues do not.\n *\n * @example\n * ```typescript\n * const result = resolver.build(tokens);\n * const tokenIssues = result.issues?.get(\"foo\");\n * if (tokenHasError(tokenIssues)) {\n * console.error(\"Token 'foo' has an error\");\n * }\n * ```\n */\nexport function tokenHasError(tokenIssues: Array<{ message: string }> | undefined): boolean {\n if (!tokenIssues) return false;\n return tokenIssues.some((issue) => \"code\" in issue);\n}\n\n/**\n * Get the first error from a token's issues (if any).\n * Returns undefined if there are no errors (only lint issues).\n *\n * @example\n * ```typescript\n * const result = resolver.build(tokens);\n * const error = getTokenError(result.issues, \"foo\");\n * if (error) {\n * console.error(\"Token 'foo' has error:\", error.message);\n * }\n * ```\n */\nexport function getTokenError(issues: IssuesMap | undefined, tokenName: string): Error | undefined {\n if (!issues) return undefined;\n const tokenIssues = issues.get(tokenName);\n if (!tokenIssues) return undefined;\n return tokenIssues.find((issue) => \"code\" in issue) as Error | undefined;\n}\n","import type { RefPath } from \"./types\";\n\n/**\n * Optimizes prefix extraction by caching results.\n *\n * Instead of repeatedly computing prefix paths by scanning for dots,\n * this class caches the computed results to avoid redundant string operations.\n */\nexport class PrefixExtractor {\n private readonly prefixCache = new Map<RefPath, string[]>();\n\n /**\n * Extract all prefix paths for a token reference.\n *\n * Example: \"a.b.c\" returns [\"a\", \"a.b\"]\n * Cached after first call for the same token.\n */\n extractPrefixes(tokenName: RefPath): string[] {\n const cached = this.prefixCache.get(tokenName);\n if (cached) {\n return cached;\n }\n\n const prefixes: string[] = [];\n let dotIndex = tokenName.indexOf(\".\");\n\n while (dotIndex !== -1) {\n prefixes.push(tokenName.slice(0, dotIndex));\n dotIndex = tokenName.indexOf(\".\", dotIndex + 1);\n }\n\n this.prefixCache.set(tokenName, prefixes);\n return prefixes;\n }\n\n clearCache(): void {\n this.prefixCache.clear();\n }\n}\n","import type { Config } from \"@interpreter/config\";\nimport type { InterpreterResult } from \"@interpreter/interpreter\";\nimport {\n DictionarySymbol,\n isTokenscriptSymbol,\n NullSymbol,\n StringSymbol,\n} from \"@interpreter/symbols\";\nimport type { ISymbolType } from \"@src/types\";\nimport { PrefixExtractor } from \"./PrefixExtractor\";\nimport type { RefPath, ResolvedValueMap, TokenInputMap } from \"./types\";\n\n/**\n * Handles prefix bookkeeping, dictionary construction, and virtual child tracking.\n */\nexport class PrefixManager {\n private readonly prefixes = new Map<string, Set<RefPath>>();\n private readonly tokenPrefixes = new Map<RefPath, Set<string>>();\n private readonly activePrefixes = new Map<string, Set<RefPath>>();\n private readonly virtualChildren = new Map<RefPath, Set<RefPath>>();\n private readonly prefixExtractor = new PrefixExtractor();\n\n // Optimization caches\n private readonly directChildrenCache = new Map<string, Set<string>>();\n private readonly parentLookupCache = new Map<RefPath, RefPath | undefined>();\n\n constructor(private readonly config?: Config) {}\n\n addTokenToPrefix(tokenName: RefPath): void {\n const prefixes = this.prefixExtractor.extractPrefixes(tokenName);\n if (prefixes.length === 0) return;\n\n for (const prefix of prefixes) {\n this.addToSetMap(this.prefixes, prefix, tokenName);\n this.addToSetMap(this.tokenPrefixes, tokenName, prefix);\n\n // Cache direct children for this prefix\n const prefixLen = prefix.length + 1;\n const shortName = tokenName.slice(prefixLen);\n if (!shortName.includes(\".\")) {\n this.addToSetMap(this.directChildrenCache, prefix, shortName);\n }\n }\n }\n\n hasPrefix(prefix: string): boolean {\n return this.prefixes.has(prefix);\n }\n\n activatePrefix(prefix: string): void {\n if (this.activePrefixes.has(prefix)) return;\n const members = this.prefixes.get(prefix);\n if (!members || members.size === 0) return;\n this.activePrefixes.set(prefix, new Set(members));\n }\n\n markTokenResolved(tokenName: RefPath): string[] {\n const prefixes = this.tokenPrefixes.get(tokenName);\n if (!prefixes || prefixes.size === 0) return [];\n\n const ready: string[] = [];\n for (const prefix of prefixes) {\n const pending = this.activePrefixes.get(prefix);\n if (!pending) continue;\n pending.delete(tokenName);\n if (pending.size === 0) {\n this.activePrefixes.delete(prefix);\n ready.push(prefix);\n }\n }\n\n this.tokenPrefixes.delete(tokenName);\n return ready;\n }\n\n buildPrefixDictionary(\n prefix: string,\n referenceCache: ResolvedValueMap,\n ): DictionarySymbol | undefined {\n const directChildren = this.directChildrenCache.get(prefix);\n if (!directChildren || directChildren.size === 0) return undefined;\n\n const dictionaryEntries = new Map<string, ISymbolType>();\n\n for (const shortName of directChildren) {\n const tokenName = `${prefix}.${shortName}`;\n const referenceValue = referenceCache.get(tokenName);\n const symbol = this.toSymbol(referenceValue);\n if (symbol) {\n dictionaryEntries.set(shortName, symbol.cloneIfMutable());\n }\n }\n\n if (dictionaryEntries.size === 0) return undefined;\n return new DictionarySymbol(dictionaryEntries, this.config);\n }\n\n findParentToken(reference: RefPath, tokens: TokenInputMap): RefPath | undefined {\n const cached = this.parentLookupCache.get(reference);\n if (cached !== undefined) {\n return cached === null ? undefined : cached;\n }\n\n let lastDotIndex = reference.lastIndexOf(\".\");\n while (lastDotIndex > 0) {\n const candidate = reference.slice(0, lastDotIndex);\n if (tokens.has(candidate)) {\n this.parentLookupCache.set(reference, candidate);\n return candidate;\n }\n lastDotIndex = reference.lastIndexOf(\".\", lastDotIndex - 1);\n }\n\n this.parentLookupCache.set(reference, null as unknown as undefined);\n return undefined;\n }\n\n addVirtualChild(parent: RefPath, child: RefPath): void {\n this.addToSetMap(this.virtualChildren, parent, child);\n }\n\n getVirtualChildren(parent: RefPath): Set<RefPath> {\n const children = this.virtualChildren.get(parent);\n return children ? new Set(children) : new Set();\n }\n\n getAndRemoveVirtualChildren(parent: RefPath): Set<RefPath> {\n const children = this.virtualChildren.get(parent);\n if (!children) return new Set();\n this.virtualChildren.delete(parent);\n return children;\n }\n\n removeVirtualChildren(parent: RefPath): void {\n this.virtualChildren.delete(parent);\n }\n\n getReadyPrefixes(): string[] {\n return Array.from(this.activePrefixes.keys()).filter((prefix) => {\n const pending = this.activePrefixes.get(prefix);\n return pending && pending.size === 0;\n });\n }\n\n clearCaches(): void {\n this.directChildrenCache.clear();\n this.parentLookupCache.clear();\n }\n\n private addToSetMap<K, V>(map: Map<K, Set<V>>, key: K, value: V): void {\n let set = map.get(key);\n if (!set) {\n set = new Set<V>();\n map.set(key, set);\n }\n set.add(value);\n }\n\n private toSymbol(value: InterpreterResult | undefined): ISymbolType | undefined {\n if (value === undefined) return undefined;\n\n if (value === null) return new NullSymbol(this.config);\n if (isTokenscriptSymbol(value)) return value;\n\n return new StringSymbol(String(value), this.config);\n }\n}\n","import type { DependencyTracker } from \"./DependencyTracker\";\nimport type { RefPath } from \"./types\";\n\n/**\n * Optimizes readiness checking by caching results.\n *\n * Readiness checking (whether all dependencies are resolved) can be expensive\n * when done repeatedly. This class caches the state and invalidates intelligently\n * when dependencies change.\n */\nexport class ReadinessTracker {\n private readonly readyCache = new Map<RefPath, boolean>();\n\n /**\n * Check if a token is ready to be resolved.\n * Results are cached until marked dirty.\n */\n isReady(tokenName: RefPath, dependencyTracker: DependencyTracker): boolean {\n if (!this.readyCache.has(tokenName)) {\n const ready = dependencyTracker.isTokenReady(tokenName);\n this.readyCache.set(tokenName, ready);\n return ready;\n }\n const cached = this.readyCache.get(tokenName);\n return cached ?? false;\n }\n\n /**\n * Mark a token's readiness state as dirty after a dependency change\n */\n markDirty(tokenName: RefPath): void {\n this.readyCache.delete(tokenName);\n }\n\n /**\n * Clear all cached state (e.g., for testing)\n */\n clearCache(): void {\n this.readyCache.clear();\n }\n}\n","import type { InterpreterResult } from \"@interpreter/interpreter\";\nimport type { DependencyTracker } from \"./DependencyTracker\";\nimport type { PrefixManager } from \"./PrefixManager\";\nimport type { ReadinessTracker } from \"./ReadinessTracker\";\nimport type { RefPath } from \"./types\";\n\n/**\n * Centralizes dependency and prefix release notification logic with cascade resolution.\n *\n * Eliminates repeated patterns for:\n * - Releasing token dependencies\n * - Releasing prefix constraints\n * - Cascade resolving dependents when they become ready\n */\nexport class ResolutionNotifier {\n constructor(\n private readonly dependencyTracker: DependencyTracker,\n private readonly prefixManager: PrefixManager,\n private readonly readinessTracker: ReadinessTracker,\n private readonly pendingResolution: Set<RefPath>,\n private readonly readyQueue: Set<RefPath>,\n private readonly resolveCallback: (tokenName: RefPath) => void,\n private readonly buildDictionaryCallback: (\n prefix: string,\n referenceCache: Map<string, InterpreterResult>,\n ) => void,\n ) {}\n\n /**\n * Release all dependencies and prefixes for a token and its flattened children.\n * This is called after a token has been successfully resolved.\n * Triggers cascade resolution of any newly-ready dependents.\n */\n releaseDependencies(\n tokenName: RefPath,\n flattened: RefPath[] | undefined,\n referenceCache: Map<string, InterpreterResult>,\n ): void {\n this.releaseDependentsFor(tokenName);\n this.releasePrefixesFor(tokenName, referenceCache);\n\n if (flattened) {\n for (const flatName of flattened) {\n this.releaseDependentsFor(flatName);\n this.releasePrefixesFor(flatName, referenceCache);\n }\n }\n }\n\n /**\n * Release dependents waiting for a specific token and add to ready queue\n */\n private releaseDependentsFor(name: RefPath): void {\n for (const dependent of this.dependencyTracker.getTokenDependentsIterable(name)) {\n if (this.pendingResolution.has(dependent)) continue;\n\n this.dependencyTracker.removeTokenDependency(dependent, name);\n this.readinessTracker.markDirty(dependent);\n\n if (this.readinessTracker.isReady(dependent, this.dependencyTracker)) {\n this.readyQueue.add(dependent);\n }\n }\n }\n\n /**\n * Release prefixes that may now be complete after a token resolution\n */\n private releasePrefixesFor(name: RefPath, referenceCache: Map<string, InterpreterResult>): void {\n const readyPrefixes = this.prefixManager.markTokenResolved(name);\n if (readyPrefixes.length === 0) return;\n\n for (const prefix of readyPrefixes) {\n this.releasePrefixDependents(prefix, referenceCache);\n }\n }\n\n /**\n * Release tokens waiting for a specific prefix and add to ready queue\n */\n private releasePrefixDependents(\n prefix: string,\n referenceCache: Map<string, InterpreterResult>,\n ): void {\n // Build dictionary for this prefix\n this.buildDictionaryCallback(prefix, referenceCache);\n\n // Release tokens waiting for this prefix\n for (const tokenName of this.dependencyTracker.getTokensWaitingForPrefixIterable(prefix)) {\n if (this.pendingResolution.has(tokenName)) continue;\n\n this.dependencyTracker.removePrefixDependency(tokenName, prefix);\n this.readinessTracker.markDirty(tokenName);\n\n if (this.readinessTracker.isReady(tokenName, this.dependencyTracker)) {\n this.readyQueue.add(tokenName);\n }\n }\n }\n}\n","import { type ISymbolType, Operations, type SupportedFormats } from \"@src/types\";\nimport type { Config } from \"./config/config\";\nimport { InterpreterError, OperationsErrorCode } from \"./errors\";\nimport {\n type BaseSymbolType,\n BooleanSymbol,\n NullSymbol,\n NumberSymbol,\n NumberWithUnitSymbol,\n StringSymbol,\n} from \"./symbols\";\nimport { isNull } from \"./utils/type\";\n\ntype MathOperand = NumberSymbol | NumberWithUnitSymbol;\ntype OperationFunction = (a: MathOperand, b: MathOperand, config?: Config) => MathOperand;\ntype BooleanOperationFunction = (a: ISymbolType, b: ISymbolType) => BooleanSymbol;\n\nfunction decomposeUnit(operand: MathOperand): {\n value: number;\n unit: SupportedFormats | null;\n} {\n if (operand instanceof NumberWithUnitSymbol) {\n return { value: operand.value as number, unit: operand.unit };\n }\n if (operand instanceof NumberSymbol) {\n return { value: operand.value as number, unit: null };\n }\n throw new InterpreterError(OperationsErrorCode.UNSUPPORTED_OPERAND_TYPE, {\n data: { type: (operand as BaseSymbolType).type },\n });\n}\n\nfunction recomposeUnit(\n value: number,\n units: (SupportedFormats | null)[],\n _config?: Config,\n): MathOperand {\n const validUnits = units.filter((u) => u !== null) as SupportedFormats[];\n if (validUnits.length === 0) {\n return new NumberSymbol(value);\n }\n if (new Set(validUnits).size > 1) {\n throw new InterpreterError(OperationsErrorCode.CANNOT_MIX_UNITS, {\n data: { units: validUnits },\n });\n }\n return new NumberWithUnitSymbol(value, validUnits[0]);\n}\n\nfunction mathWrapper(func: (a: number, b: number) => number): OperationFunction {\n return (a: MathOperand, b: MathOperand, config?: Config): MathOperand => {\n // If we have a config with unit manager, try to convert to common format\n if (config?.unitManager) {\n try {\n const converted = config.unitManager.convertToCommonFormat([a, b]);\n if (converted.length === 2) {\n const convertedA = converted[0] as MathOperand;\n const convertedB = converted[1] as MathOperand;\n\n const opA = decomposeUnit(convertedA);\n const opB = decomposeUnit(convertedB);\n\n const resultValue = func(opA.value, opB.value);\n return recomposeUnit(resultValue, [opA.unit, opB.unit], config);\n }\n } catch (_error) {\n // Fall back to original behavior if unit conversion fails\n }\n }\n\n const opA = decomposeUnit(a);\n const opB = decomposeUnit(b);\n\n const resultValue = func(opA.value, opB.value);\n return recomposeUnit(resultValue, [opA.unit, opB.unit], config);\n };\n}\n\nfunction equalityComparisonWrapper(fn: (a: any, b: any) => boolean): BooleanOperationFunction {\n return (a: ISymbolType, b: ISymbolType): BooleanSymbol => {\n const isNullComparison = a instanceof NullSymbol || b instanceof NullSymbol;\n\n if (!isNullComparison) {\n const isNumericA = a instanceof NumberSymbol || a instanceof NumberWithUnitSymbol;\n const isNumericB = b instanceof NumberSymbol || b instanceof NumberWithUnitSymbol;\n if (isNumericA && !isNumericB) {\n throw new InterpreterError(OperationsErrorCode.INCOMPATIBLE_TYPES, {\n data: { typeA: a.type, typeB: b.type },\n });\n }\n\n const isStringA = a instanceof StringSymbol;\n const isStringB = b instanceof StringSymbol;\n if (isStringA && !isStringB) {\n throw new InterpreterError(OperationsErrorCode.INCOMPATIBLE_TYPES, {\n data: { typeA: a.type, typeB: b.type },\n });\n }\n\n const isBooleanA = a instanceof BooleanSymbol;\n const isBooleanB = b instanceof BooleanSymbol;\n if (isBooleanA && !isBooleanB) {\n throw new InterpreterError(OperationsErrorCode.INCOMPATIBLE_TYPES, {\n data: { typeA: a.type, typeB: b.type },\n });\n }\n\n if (\n a instanceof NumberWithUnitSymbol &&\n b instanceof NumberWithUnitSymbol &&\n a.unit !== b.unit\n ) {\n throw new InterpreterError(OperationsErrorCode.CANNOT_COMPARE_UNITS, {\n data: { unitA: a.unit, unitB: b.unit },\n });\n }\n }\n\n return new BooleanSymbol(fn(a.value, b.value));\n };\n}\n\nfunction orderingComparisonWrapper(fn: (a: any, b: any) => boolean): BooleanOperationFunction {\n return (a: ISymbolType, b: ISymbolType): BooleanSymbol => {\n if (a instanceof NullSymbol || b instanceof NullSymbol || isNull(a.value) || isNull(b.value)) {\n throw new InterpreterError(OperationsErrorCode.ORDERING_WITH_NULL);\n }\n\n const isNumericA = a instanceof NumberSymbol || a instanceof NumberWithUnitSymbol;\n const isNumericB = b instanceof NumberSymbol || b instanceof NumberWithUnitSymbol;\n if (isNumericA && !isNumericB) {\n throw new InterpreterError(OperationsErrorCode.INCOMPATIBLE_TYPES, {\n data: { typeA: a.type, typeB: b.type },\n });\n }\n\n const isStringA = a instanceof StringSymbol;\n const isStringB = b instanceof StringSymbol;\n if (isStringA && !isStringB) {\n throw new InterpreterError(OperationsErrorCode.INCOMPATIBLE_TYPES, {\n data: { typeA: a.type, typeB: b.type },\n });\n }\n\n const isBooleanA = a instanceof BooleanSymbol;\n const isBooleanB = b instanceof BooleanSymbol;\n if (isBooleanA && !isBooleanB) {\n throw new InterpreterError(OperationsErrorCode.INCOMPATIBLE_TYPES, {\n data: { typeA: a.type, typeB: b.type },\n });\n }\n\n if (\n a instanceof NumberWithUnitSymbol &&\n b instanceof NumberWithUnitSymbol &&\n a.unit !== b.unit\n ) {\n throw new InterpreterError(OperationsErrorCode.CANNOT_COMPARE_UNITS, {\n data: { unitA: a.unit, unitB: b.unit },\n });\n }\n\n return new BooleanSymbol(fn(a.value, b.value));\n };\n}\n\nexport const LOGICAL_BOOLEAN_IMPLEMENTATIONS: Record<string, BooleanOperationFunction> = {\n [Operations.LOGIC_AND]: (a: ISymbolType, b: ISymbolType) => {\n if (!(a instanceof BooleanSymbol) || !(b instanceof BooleanSymbol))\n throw new InterpreterError(OperationsErrorCode.LOGICAL_REQUIRES_BOOLEAN, {\n data: { operator: \"&&\" },\n });\n return new BooleanSymbol(a.value && b.value);\n },\n [Operations.LOGIC_OR]: (a: ISymbolType, b: ISymbolType) => {\n if (!(a instanceof BooleanSymbol) || !(b instanceof BooleanSymbol))\n throw new InterpreterError(OperationsErrorCode.LOGICAL_REQUIRES_BOOLEAN, {\n data: { operator: \"||\" },\n });\n return new BooleanSymbol(a.value || b.value);\n },\n};\n\nfunction powerWrapper(func: (a: number, b: number) => number): OperationFunction {\n return (a: MathOperand, b: MathOperand, config?: Config): MathOperand => {\n // Power operations should not allow unit conversion as it doesn't make dimensional sense\n const opA = decomposeUnit(a);\n const opB = decomposeUnit(b);\n\n // Reject if both operands have units\n if (opA.unit && opB.unit) {\n throw new InterpreterError(OperationsErrorCode.UNIT_EXPONENT_NOT_SUPPORTED, {\n data: { unitA: opA.unit, unitB: opB.unit },\n });\n }\n\n const resultValue = func(opA.value, opB.value);\n return recomposeUnit(resultValue, [opA.unit, opB.unit], config);\n };\n}\n\nfunction multiplyDivideWrapper(func: (a: number, b: number) => number): OperationFunction {\n return (a: MathOperand, b: MathOperand, config?: Config): MathOperand => {\n // For multiplication/division, handle percentages specially\n if (config?.unitManager) {\n // Check if one operand is a percentage\n const aIsPercent =\n a instanceof NumberWithUnitSymbol &&\n config.unitManager.getSpecByKeyword(a.unit)?.type === \"relative\";\n const bIsPercent =\n b instanceof NumberWithUnitSymbol &&\n config.unitManager.getSpecByKeyword(b.unit)?.type === \"relative\";\n\n if (aIsPercent && !bIsPercent) {\n // a% * b = (a/100) * b with b's unit (if any)\n const resultValue = func((a.value as number) / 100, b.value as number);\n return b instanceof NumberWithUnitSymbol\n ? new NumberWithUnitSymbol(resultValue, b.unit)\n : new NumberSymbol(resultValue);\n } else if (bIsPercent && !aIsPercent) {\n // a * b% = a * (b/100) with a's unit (if any)\n const resultValue = func(a.value as number, (b.value as number) / 100);\n return a instanceof NumberWithUnitSymbol\n ? new NumberWithUnitSymbol(resultValue, a.unit)\n : new NumberSymbol(resultValue);\n }\n }\n\n // Fall back to standard unit conversion for non-percentage cases\n return mathWrapper(func)(a, b, config);\n };\n}\n\nexport const MATH_IMPLEMENTATIONS: Record<string, OperationFunction> = {\n [Operations.ADD]: mathWrapper((a, b) => a + b),\n [Operations.SUBTRACT]: mathWrapper((a, b) => a - b),\n [Operations.MULTIPLY]: multiplyDivideWrapper((a, b) => a * b),\n [Operations.DIVIDE]: multiplyDivideWrapper((a, b) => {\n if (b === 0) throw new InterpreterError(OperationsErrorCode.DIVISION_BY_ZERO);\n return a / b;\n }),\n [Operations.POWER]: powerWrapper((a, b) => a ** b),\n};\n\n// Comparison operations map to TokenType values directly\nexport const COMPARISON_IMPLEMENTATIONS: Record<string, BooleanOperationFunction> = {\n IS_EQ: equalityComparisonWrapper((a, b) => a === b),\n IS_NOT_EQ: equalityComparisonWrapper((a, b) => a !== b),\n GT: orderingComparisonWrapper((a, b) => a > b),\n LT: orderingComparisonWrapper((a, b) => a < b),\n IS_GT_EQ: orderingComparisonWrapper((a, b) => a >= b),\n IS_LT_EQ: orderingComparisonWrapper((a, b) => a <= b),\n};\n","import type { ISymbolType } from \"@src/types\";\nexport class SymbolTable {\n private symbols: Record<string, ISymbolType | null>;\n\n constructor() {\n this.symbols = {};\n }\n\n get(name: string): ISymbolType | null {\n return this.symbols[name.toLowerCase()] || null;\n }\n\n set(name: string, value: ISymbolType | null): void {\n this.symbols[name.toLowerCase()] = value;\n }\n\n isDefined(name: string): boolean {\n return !!this.symbols[name.toLowerCase()];\n }\n\n delete(name: string): void {\n delete this.symbols[name.toLowerCase()];\n }\n\n reset(): void {\n this.symbols = {};\n }\n}\n","import {\n type ASTNode,\n type ISymbolType,\n Operations,\n type ReferenceRecord,\n UNINTERPRETED_KEYWORDS,\n} from \"@src/types\";\nimport {\n type AssignNode,\n type AttributeAccessNode,\n type BinOpNode,\n type BooleanNode,\n type ElementWithUnitNode,\n type ForEachNode,\n FunctionCallNode,\n type HexColorNode,\n IdentifierNode,\n type IfNode,\n ImplicitListNode,\n type ListNode,\n type NullNode,\n type NumNode,\n type ReassignNode,\n type ReferenceNode,\n type ReturnNode,\n type StatementListNode,\n type StringNode,\n type TemplateStringNode,\n type UnaryOpNode,\n type WhileNode,\n} from \"./ast\";\nimport { Config } from \"./config/config\";\nimport { InterpreterError, InterpreterErrorCode } from \"./errors\";\nimport * as operations from \"./operations\";\nimport { Parser } from \"./parser\";\n\nimport {\n BooleanSymbol,\n basicSymbolTypes,\n ColorSymbol,\n DictionarySymbol,\n jsValueToSymbolType,\n ListSymbol,\n NullSymbol,\n NumberSymbol,\n NumberWithUnitSymbol,\n StringSymbol,\n typeEquals,\n typeName,\n} from \"./symbols\";\nimport { SymbolTable } from \"./symbolTable\";\nimport { parseHexWithAlpha } from \"./utils/color\";\n\nclass ReturnSignal {\n constructor(public value: ISymbolType | null) {}\n}\n\nexport type InterpreterResult = ISymbolType | string | null;\n\nexport class Interpreter {\n private parser: Parser | null = null; // Null if created with pre-parsed AST\n private symbolTable: SymbolTable;\n private references: Map<string, ISymbolType> = new Map();\n private ast: ASTNode | null = null;\n public config: Config;\n\n constructor(\n input: Parser | ASTNode | null,\n options?: {\n references?: ReferenceRecord | Map<string, any>;\n symbolTable?: SymbolTable;\n config?: Config;\n },\n ) {\n if (input instanceof Parser) {\n this.parser = input;\n } else {\n this.setAst(input);\n }\n\n this.symbolTable = options?.symbolTable || new SymbolTable();\n this.config = options?.config || new Config();\n\n if (options?.references) {\n this.importReferences(options.references);\n }\n }\n\n // References ------------------------------------------------------------------\n\n public importReferences(references?: ReferenceRecord | Map<string, any>): void {\n if (references instanceof Map) {\n this.references = references;\n } else if (references) {\n for (const key in references) {\n this.references.set(key, jsValueToSymbolType(references[key], this.config));\n }\n } else {\n this.references = new Map<string, ISymbolType>();\n }\n }\n\n public getReference(key: string): ISymbolType | undefined {\n return this.references.get(key);\n }\n\n public setReference(key: string, value: ISymbolType): void {\n this.references.set(key, value);\n }\n\n // Utilities -------------------------------------------------------------------\n\n public setAst(ast: ASTNode | null): void {\n this.ast = ast;\n this.parser = null; // Clear parser since we're using pre-parsed AST\n }\n\n public resetSymbolTable(): void {\n this.symbolTable.reset();\n }\n\n public getSymbol(name: string): ISymbolType | null {\n return this.symbolTable.get(name);\n }\n\n public setSymbol(name: string, value: ISymbolType): void {\n this.symbolTable.set(name, value);\n }\n\n public coerceValue(\n constructorSymbol: ISymbolType,\n valueSymbol: ISymbolType,\n ): ISymbolType | undefined {\n if (valueSymbol instanceof NullSymbol) return constructorSymbol;\n if (constructorSymbol.typeEquals(valueSymbol)) return valueSymbol;\n }\n\n // Visit Functions -------------------------------------------------------------\n\n private visit(node: ASTNode | null): ISymbolType | null {\n if (!node) return null;\n\n const visitorMethodName = `visit${node.nodeType}` as keyof this;\n if (typeof (this as any)[visitorMethodName] === \"function\") {\n return (this as any)[visitorMethodName](node);\n }\n\n throw new InterpreterError(InterpreterErrorCode.UNKNOWN_NODE_TYPE, {\n token: node.token,\n data: { nodeType: node.nodeType },\n });\n }\n\n private visitBinOpNode(node: BinOpNode): ISymbolType {\n const left = this.visit(node.left) as ISymbolType;\n const right = this.visit(node.right) as ISymbolType;\n\n const opVal = node.opToken.value as string;\n const opType = node.opToken.type;\n\n const logicalBooleanImpl = operations.LOGICAL_BOOLEAN_IMPLEMENTATIONS[opVal];\n if (logicalBooleanImpl) {\n return logicalBooleanImpl(left, right);\n }\n\n const mathImpl = operations.MATH_IMPLEMENTATIONS[opVal];\n if (mathImpl) {\n if (\n !(\n (left instanceof NumberSymbol || left instanceof NumberWithUnitSymbol) &&\n (right instanceof NumberSymbol || right instanceof NumberWithUnitSymbol)\n )\n ) {\n throw new InterpreterError(InterpreterErrorCode.ARITHMETIC_REQUIRES_NUMBER, {\n token: node.opToken,\n data: { operator: opVal, leftType: left.type, rightType: right.type },\n });\n }\n\n return mathImpl(left, right, this.config);\n }\n\n const comparisonImpl = operations.COMPARISON_IMPLEMENTATIONS[opType];\n if (comparisonImpl) {\n return comparisonImpl(left, right);\n }\n\n throw new InterpreterError(InterpreterErrorCode.UNKNOWN_BINARY_OPERATOR, {\n token: node.opToken,\n data: { operator: opVal, tokenType: opType },\n });\n }\n\n private visitNumNode(node: NumNode): NumberSymbol {\n return new NumberSymbol(node.value, this.config);\n }\n\n private visitStringNode(node: StringNode): StringSymbol {\n return new StringSymbol(node.value, this.config);\n }\n\n private visitTemplateStringNode(node: TemplateStringNode): ISymbolType {\n if (node.parts.length === 0) {\n return new StringSymbol(\"\", this.config);\n }\n\n // Single non-string part: evaluate, validate, and return as-is (preserves type)\n if (node.parts.length === 1) {\n const val = this.visit(node.parts[0]) as ISymbolType;\n this.validateTemplateValue(val, node);\n return val;\n }\n\n // Multiple parts: evaluate each, validate, and concatenate as strings\n let result = \"\";\n for (const part of node.parts) {\n const val = this.visit(part) as ISymbolType;\n this.validateTemplateValue(val, node);\n result += val.toString();\n }\n return new StringSymbol(result, this.config);\n }\n\n /**\n * Validate that a value is a primitive type allowed in template string interpolation.\n * Lists, Dictionaries, and non-hex Colors are rejected.\n */\n private validateTemplateValue(val: ISymbolType, node: TemplateStringNode): void {\n if (val instanceof ListSymbol) {\n throw new InterpreterError(InterpreterErrorCode.TEMPLATE_INVALID_TYPE, {\n token: node.token,\n data: { valueType: \"List\" },\n });\n }\n if (val instanceof DictionarySymbol) {\n throw new InterpreterError(InterpreterErrorCode.TEMPLATE_INVALID_TYPE, {\n token: node.token,\n data: { valueType: \"Dictionary\" },\n });\n }\n if (val instanceof ColorSymbol && !val.isHex()) {\n throw new InterpreterError(InterpreterErrorCode.TEMPLATE_INVALID_TYPE, {\n token: node.token,\n data: { valueType: `Color.${val.subType}` },\n });\n }\n }\n\n /**\n * Bare identifiers are treated as string literals if not found as variables\n * Check symbol table first (variables override references), then references\n */\n private visitIdentifierNode(node: IdentifierNode): ISymbolType {\n return (\n this.symbolTable.get(node.name) ||\n this.getReference(node.name) ||\n new StringSymbol(node.name, this.config)\n );\n }\n\n private visitUnaryOpNode(node: UnaryOpNode): ISymbolType {\n const result = this.visit(node.expr) as ISymbolType;\n\n if (node.op === Operations.SUBTRACT) {\n if (result instanceof NumberSymbol) {\n if (result.value === null) {\n throw new InterpreterError(InterpreterErrorCode.UNARY_MINUS_NULL, {\n token: node.opToken,\n data: { symbolType: \"NumberSymbol\" },\n });\n }\n return new NumberSymbol(-result.value, this.config);\n }\n\n if (result instanceof NumberWithUnitSymbol) {\n if (result.value === null) {\n throw new InterpreterError(InterpreterErrorCode.UNARY_MINUS_NULL, {\n token: node.opToken,\n data: { symbolType: \"NumberWithUnitSymbol\" },\n });\n }\n return new NumberWithUnitSymbol(-result.value, result.unit, this.config);\n }\n\n throw new InterpreterError(InterpreterErrorCode.UNARY_PLUS_NON_NUMBER, {\n token: node.opToken,\n data: { value: String(result.value) },\n });\n }\n\n if (node.op === Operations.ADD) {\n if (result instanceof NumberSymbol || result instanceof NumberWithUnitSymbol) {\n return result;\n }\n\n throw new InterpreterError(InterpreterErrorCode.UNARY_PLUS_NON_NUMBER, {\n token: node.opToken,\n data: { value: String(result.value) },\n });\n }\n\n if (node.op === Operations.LOGIC_NOT) {\n if (result instanceof BooleanSymbol) {\n return new BooleanSymbol(!result.value, this.config);\n }\n\n throw new InterpreterError(InterpreterErrorCode.UNARY_NOT_NON_BOOLEAN, {\n token: node.opToken,\n data: { value: String(result.value) },\n });\n }\n\n throw new InterpreterError(InterpreterErrorCode.UNKNOWN_UNARY_OPERATOR, {\n token: node.opToken,\n data: { operator: node.op },\n });\n }\n\n private visitListNode(node: ListNode): ListSymbol {\n return new ListSymbol(\n node.elements.map((el) => this.visit(el) as ISymbolType),\n node instanceof ImplicitListNode,\n this.config,\n );\n }\n\n private visitImplicitListNode(node: ImplicitListNode): ListSymbol {\n return this.visitListNode(node);\n }\n\n private visitReferenceNode(node: ReferenceNode): ISymbolType {\n const value = this.getReference(node.value);\n\n if (!value) {\n throw new InterpreterError(InterpreterErrorCode.UNKNOWN_REFERENCE, {\n token: node.token,\n data: { reference: node.value },\n });\n }\n\n return value as ISymbolType;\n }\n\n private visitHexColorNode(node: HexColorNode): ColorSymbol {\n const { color, alpha } = parseHexWithAlpha(node.value);\n return new ColorSymbol(color, \"Hex\", alpha, this.config);\n }\n\n private visitBooleanNode(node: BooleanNode): BooleanSymbol {\n return new BooleanSymbol(node.value, this.config);\n }\n\n private visitNullNode(_node: NullNode): NullSymbol {\n return new NullSymbol(this.config);\n }\n\n private visitElementWithUnitNode(node: ElementWithUnitNode): NumberWithUnitSymbol {\n const valNodeVisit = this.visit(node.astNode);\n return new NumberWithUnitSymbol(valNodeVisit?.value, node.unit, this.config);\n }\n\n private visitFunctionCallNode(node: FunctionCallNode): ISymbolType {\n const fnName = node.name.toLowerCase();\n const args = node.args.map((arg) => this.visit(arg) as ISymbolType);\n\n if (this.config.functionsManager.hasFunction(fnName)) {\n this.config.functionsManager.validateFunctionArgs(fnName, args, node.token);\n const fn = this.config.functionsManager.getFunction(fnName);\n if (fn) {\n return fn(...args);\n }\n }\n\n if (this.config.colorManager.hasInitializer(fnName)) {\n return this.config.colorManager.executeInitializer(fnName, args);\n }\n\n if (UNINTERPRETED_KEYWORDS.includes(fnName)) {\n const argStrings = args.map((arg) => arg.toString());\n return new StringSymbol(`${fnName}(${argStrings.join(\", \")})`, this.config);\n }\n\n throw new InterpreterError(InterpreterErrorCode.UNKNOWN_FUNCTION, {\n token: node.token,\n data: { functionName: node.name },\n });\n }\n\n private visitAssignNode(node: AssignNode): void {\n const name = node.varName.name;\n\n // Variable name validation\n if ([\".\", \"[\", \"-\"].some((c) => name.includes(c))) {\n throw new InterpreterError(InterpreterErrorCode.INVALID_VARIABLE_NAME, {\n token: node.varName.token,\n data: { name },\n });\n }\n\n if (this.symbolTable.isDefined(name)) {\n throw new InterpreterError(InterpreterErrorCode.VARIABLE_ALREADY_DEFINED, {\n token: node.varName.token,\n data: { name },\n });\n }\n\n const baseType = node.typeDecl.baseType.name;\n const subType = node.typeDecl.subTypes[0]?.name;\n\n if (!this.config.isTypeDefined(baseType, subType)) {\n throw new InterpreterError(InterpreterErrorCode.INVALID_VARIABLE_TYPE, {\n token: node.varName.token,\n data: {\n typeName: typeName(baseType, subType),\n validTypes: Object.keys(basicSymbolTypes).join(\", \"),\n },\n });\n }\n\n const constructorSymbol = this.config.getType(baseType, subType);\n\n const valueSymbol: ISymbolType = node.assignmentExpr\n ? (this.visit(node.assignmentExpr) as ISymbolType)\n : constructorSymbol;\n\n const coercedValueSymbol = this.coerceValue(constructorSymbol, valueSymbol);\n if (!coercedValueSymbol) {\n throw new InterpreterError(InterpreterErrorCode.INVALID_VALUE_FOR_VARIABLE, {\n token: node.varName.token,\n data: { value: String(valueSymbol.value), type: baseType, name },\n });\n }\n\n this.symbolTable.set(name, coercedValueSymbol);\n }\n\n private visitReassignNode(node: ReassignNode): void {\n const baseIdentifier = node.baseIdentifier();\n\n const existingVar = this.symbolTable.get(baseIdentifier.name);\n if (existingVar === null) {\n throw new InterpreterError(InterpreterErrorCode.VARIABLE_NOT_FOUND, {\n token: baseIdentifier.token,\n data: { name: baseIdentifier.name },\n });\n }\n\n const value = this.visit(node.value);\n\n if (value === null) {\n throw new InterpreterError(InterpreterErrorCode.ASSIGNMENT_VALUE_NULL, {\n token: (node.value as any).token,\n data: { identifier: node.identifierToString() },\n });\n }\n\n if (node.isAttributeAssignment()) {\n if (existingVar instanceof ColorSymbol) {\n this.config.colorManager.setAttribute(existingVar, node, value);\n }\n } else {\n if (typeEquals(value.type, \"list\")) {\n // TODO Implement list type-checking\n } else if (!typeEquals(existingVar.type, value.type)) {\n throw new InterpreterError(InterpreterErrorCode.TYPE_MISMATCH, {\n token: baseIdentifier.token,\n data: {\n value: String(value),\n foundType: value.type,\n expectedType: existingVar.type,\n identifier: node.identifierToString(),\n },\n });\n }\n\n if (!existingVar.validValue(value)) {\n throw new InterpreterError(InterpreterErrorCode.CANNOT_ASSIGN_TYPE, {\n token: (node.value as any).token,\n data: {\n valueType: value.type,\n identifier: node.identifierToString(),\n variableType: existingVar.type,\n },\n });\n }\n\n this.symbolTable.set(baseIdentifier.name, value);\n }\n }\n\n private visitAttributeAccessNode(node: AttributeAccessNode): ISymbolType {\n const left = this.visit(node.left) as ISymbolType;\n const right = node.right;\n\n if (typeof left.hasMethod === \"function\" && typeof left.hasAttribute === \"function\") {\n if (right instanceof FunctionCallNode) {\n // Handle method calls (e.g., str.lower(), color.hex())\n const args = right.args.map((arg) => this.visit(arg) as ISymbolType);\n if (left.hasMethod(right.name, args)) {\n const result = left.callMethod?.(right.name, args);\n if (result === null || result === undefined) {\n throw new InterpreterError(InterpreterErrorCode.METHOD_RETURNED_NULL, {\n token: node.token,\n data: { methodName: right.name },\n });\n }\n return result;\n }\n throw new InterpreterError(InterpreterErrorCode.METHOD_NOT_FOUND, {\n token: node.token,\n data: { methodName: right.name, value: String(left), type: left.type },\n });\n }\n if (right instanceof IdentifierNode) {\n // Handle property access (e.g., str.length, color.to)\n if (left.hasAttribute(right.name)) {\n const result = left.getAttribute?.(right.name);\n if (result === null || result === undefined) {\n throw new InterpreterError(InterpreterErrorCode.ATTRIBUTE_RETURNED_NULL, {\n token: node.token,\n data: { attributeName: right.name },\n });\n }\n return result;\n }\n throw new InterpreterError(InterpreterErrorCode.ATTRIBUTE_NOT_FOUND, {\n token: node.token,\n data: {\n attributeName: right.name,\n value: left instanceof ColorSymbol ? \"Color\" : String(left),\n type: left.type,\n },\n });\n }\n }\n\n throw new InterpreterError(InterpreterErrorCode.CANNOT_ACCESS_ATTRIBUTES, {\n token: node.token,\n data: { type: left.type },\n });\n }\n\n private visitStatementListNode(node: StatementListNode): ISymbolType | null {\n let result: ISymbolType | null = null;\n\n for (const statement of node.statements) {\n const statementResult = this.visit(statement);\n if (statementResult) {\n result = statementResult;\n }\n }\n\n return result;\n }\n\n private visitReturnNode(node: ReturnNode): void {\n throw new ReturnSignal(this.visit(node.expr));\n }\n\n private visitWhileNode(node: WhileNode): void {\n let iterations = 0;\n while (true) {\n iterations++;\n if (iterations > this.config.languageOptions.MAX_ITERATIONS) {\n throw new InterpreterError(InterpreterErrorCode.MAX_ITERATIONS_EXCEEDED, {\n token: node.token,\n });\n }\n const conditionNode = this.visit(node.condition);\n if (!(conditionNode instanceof BooleanSymbol)) {\n throw new InterpreterError(InterpreterErrorCode.WHILE_CONDITION_NOT_BOOLEAN, {\n token: node.condition?.token,\n });\n }\n if (!conditionNode.value) break;\n\n this.visit(node.body);\n }\n }\n\n private visitForEachNode(node: ForEachNode): ISymbolType {\n // ADR-005: check for shadowing — loop variables must not shadow existing variables\n if (this.symbolTable.isDefined(node.itemVar)) {\n throw new InterpreterError(InterpreterErrorCode.FOR_EACH_VARIABLE_SHADOW, {\n token: node.token,\n data: { name: node.itemVar },\n });\n }\n if (node.indexVar !== null) {\n if (node.indexVar === node.itemVar) {\n throw new InterpreterError(InterpreterErrorCode.FOR_EACH_DUPLICATE_VARS, {\n token: node.token,\n data: { name: node.itemVar },\n });\n }\n if (this.symbolTable.isDefined(node.indexVar)) {\n throw new InterpreterError(InterpreterErrorCode.FOR_EACH_VARIABLE_SHADOW, {\n token: node.token,\n data: { name: node.indexVar },\n });\n }\n }\n\n // Evaluate collection\n const collectionVal = this.visit(node.collection);\n if (!(collectionVal instanceof ListSymbol)) {\n throw new InterpreterError(InterpreterErrorCode.FOR_EACH_NOT_LIST, {\n token: node.token,\n data: { actualType: collectionVal?.type ?? \"null\" },\n });\n }\n\n const elements = collectionVal.value as ISymbolType[];\n const results: ISymbolType[] = [];\n\n for (let idx = 0; idx < elements.length; idx++) {\n const item = elements[idx];\n\n // Bind loop variables\n this.symbolTable.set(node.itemVar, item);\n if (node.indexVar !== null) {\n this.symbolTable.set(node.indexVar, new NumberSymbol(idx, this.config));\n }\n\n // Execute body\n let bodyResult: ISymbolType | null = null;\n try {\n bodyResult = this.visit(node.body);\n } catch (e) {\n // Catch ReturnSignal — propagate it out after cleanup\n if (e instanceof ReturnSignal) {\n // Clean up loop variables\n this.symbolTable.delete(node.itemVar);\n if (node.indexVar !== null) {\n this.symbolTable.delete(node.indexVar);\n }\n throw e;\n }\n throw e;\n }\n\n results.push(bodyResult ?? new NullSymbol(this.config));\n }\n\n // Clean up loop variables — they should not leak to outer scope\n this.symbolTable.delete(node.itemVar);\n if (node.indexVar !== null) {\n this.symbolTable.delete(node.indexVar);\n }\n\n return new ListSymbol(results, false, this.config);\n }\n\n private visitIfNode(node: IfNode): ISymbolType | null {\n // Process each condition in order (if, elif, elif, ...)\n for (const conditionNode of node.conditions) {\n const condition = this.visit(conditionNode.condition);\n if (!(condition instanceof BooleanSymbol)) {\n throw new InterpreterError(InterpreterErrorCode.IF_CONDITION_NOT_BOOLEAN, {\n token: (conditionNode.condition as any).token,\n });\n }\n\n if (condition.value) {\n return this.visit(conditionNode.body);\n }\n }\n\n // If no conditions were true, execute else body if it exists\n if (node.elseBody) {\n return this.visit(node.elseBody);\n }\n\n return null;\n }\n\n public interpret(): InterpreterResult {\n const tree = this.ast || (this.parser ? this.parser.parse() : null);\n if (!tree) return \"\";\n\n let result: ISymbolType | null;\n try {\n result = this.visit(tree);\n } catch (e) {\n if (e instanceof ReturnSignal) {\n result = e.value;\n } else if (e instanceof Error) {\n throw e;\n } else {\n throw new InterpreterError(InterpreterErrorCode.UNKNOWN_ERROR);\n }\n }\n\n return result;\n }\n}\n","import { ProcessorError, ProcessorErrorCode } from \"@interpreter/errors\";\n\nexport function collectErrors(result: {\n issues?: Map<string, Array<{ message: string }>>;\n tokens: Map<string, any>;\n}): Record<string, { message: string; originalValue: string }> {\n const errors: Record<string, { message: string; originalValue: string }> = {};\n if (!result.issues) return errors;\n\n for (const [tokenName, issueList] of result.issues) {\n const originalValue = result.tokens.get(tokenName);\n // Get the first error issue\n const error = issueList.find((issue) => \"code\" in issue);\n if (error) {\n errors[tokenName] = {\n message: error.message,\n originalValue: String(originalValue),\n };\n }\n }\n return errors;\n}\n\n/**\n * Create a ProcessorError for dependency-related failures.\n * Builds the dependency chain and extracts the root cause.\n */\nexport function createDependencyError(\n tokenName: string,\n dependencyName: string,\n originalError: Error,\n): ProcessorError {\n // Extract chain and root error\n const { chain, rootError } = extractDependencyInfo(tokenName, dependencyName, originalError);\n const chainStr = chain.join(\" → \");\n\n return new ProcessorError(ProcessorErrorCode.DEPENDENCY_ERROR, {\n data: {\n tokenName,\n chain: chainStr,\n rootCause: rootError.message,\n },\n });\n}\n\nfunction extractDependencyInfo(\n tokenName: string,\n dependencyName: string,\n error: Error,\n): { chain: string[]; rootError: Error } {\n // Check if it's already a dependency error\n if (\n error instanceof ProcessorError &&\n error.code === ProcessorErrorCode.DEPENDENCY_ERROR &&\n error.data.chain\n ) {\n // Parse the chain from the existing error\n const existingChain = String(error.data.chain).split(\" → \");\n return {\n chain: [tokenName, ...existingChain],\n rootError: new Error(String(error.data.rootCause)),\n };\n }\n\n // Otherwise, it's a new chain\n return {\n chain: [tokenName, dependencyName],\n rootError: error,\n };\n}\n","import type { ASTNode } from \"@interpreter/ast\";\nimport type { Config } from \"@interpreter/config\";\nimport { isLanguageError, ProcessorError, ProcessorErrorCode } from \"@interpreter/errors\";\nimport { Interpreter } from \"@interpreter/interpreter\";\nimport { parseExpression } from \"@interpreter/parser\";\nimport { DictionarySymbol, jsValueToSymbolType } from \"@interpreter/symbols\";\nimport type { ISymbolType } from \"@src/types\";\nimport { createDependencyError } from \"../errors\";\nimport type { ASTNodeMap, RefPath, ResolvedValueMap, TokenResult, TokenResultMap } from \"./types\";\n\n/**\n * Handles token interpretation and dependency error checking.\n * Manages the interpreter instance and AST execution.\n */\nexport interface TokenInterpreterOptions {\n /** Whether to inject inline constants into the symbol table before evaluation. Defaults to true. */\n inlineConstants?: boolean;\n}\n\nexport class TokenInterpreter {\n private readonly interpreter: Interpreter;\n private readonly astNodes: ASTNodeMap = new Map();\n private readonly parsedConstants: Map<string, ISymbolType> = new Map();\n private readonly inlineConstantsEnabled: boolean;\n\n constructor(\n private readonly referenceCache: ResolvedValueMap,\n private readonly config?: Config,\n options?: TokenInterpreterOptions,\n ) {\n this.inlineConstantsEnabled = options?.inlineConstants ?? true;\n this.interpreter = new Interpreter(null, {\n references: this.referenceCache as Map<string, any>,\n config: this.config,\n });\n\n if (this.inlineConstantsEnabled) {\n this.parseConstants();\n }\n }\n\n private parseConstants(): void {\n if (!this.config) return;\n\n for (const [name, rawValue] of this.config.inlineConstants) {\n if (typeof rawValue === \"string\") {\n try {\n const { ast } = parseExpression(rawValue);\n if (ast) {\n const tempInterpreter = new Interpreter(ast, { config: this.config });\n const result = tempInterpreter.interpret();\n if (result !== null && typeof result !== \"string\") {\n this.parsedConstants.set(name, result);\n } else if (typeof result === \"string\") {\n this.parsedConstants.set(name, jsValueToSymbolType(result, this.config));\n }\n }\n } catch {\n // If parsing fails, store as string symbol\n this.parsedConstants.set(name, jsValueToSymbolType(rawValue, this.config));\n }\n } else {\n this.parsedConstants.set(name, jsValueToSymbolType(rawValue, this.config));\n }\n }\n }\n\n private injectConstants(): void {\n for (const [name, value] of this.parsedConstants) {\n this.interpreter.setSymbol(name, value.cloneIfMutable());\n }\n }\n\n setTokenAST(tokenName: RefPath, ast: ASTNode): void {\n this.astNodes.set(tokenName, ast);\n }\n\n getTokenAST(tokenName: RefPath): ASTNode | undefined {\n return this.astNodes.get(tokenName);\n }\n\n interpretToken(tokenName: RefPath, originalValue: string): TokenResult {\n const ast = this.astNodes.get(tokenName);\n\n if (!ast) {\n return originalValue;\n }\n\n return this.interpretTokenWithAST(tokenName, ast);\n }\n\n interpretTokenWithAST(_tokenName: RefPath, ast: ASTNode): TokenResult {\n try {\n this.interpreter.resetSymbolTable();\n if (this.inlineConstantsEnabled) {\n this.injectConstants();\n }\n this.interpreter.setAst(ast);\n return this.interpreter.interpret();\n } catch (error) {\n if (isLanguageError(error)) {\n return error;\n }\n return new Error(\"Unknown error during token interpretation\", { cause: error });\n }\n }\n\n buildDependencyError(\n tokenName: RefPath,\n dependencies: Set<RefPath>,\n resolved: TokenResultMap,\n missingDependencies?: Set<RefPath>,\n ): ProcessorError | undefined {\n for (const dep of dependencies) {\n // Check resolved map first\n const depValue = resolved.get(dep);\n if (depValue instanceof Error) {\n return createDependencyError(tokenName, dep, depValue);\n }\n\n // Check if it's a missing dependency (explicitly marked as missing)\n if (missingDependencies?.has(dep)) {\n const error = new ProcessorError(ProcessorErrorCode.TOKEN_NOT_FOUND, {\n data: { tokenName: dep },\n });\n return createDependencyError(tokenName, dep, error);\n }\n }\n return undefined;\n }\n\n flattenDictionaryToCache(tokenName: RefPath, value: TokenResult): RefPath[] {\n if (!(value instanceof DictionarySymbol) || !value.value) {\n return [];\n }\n\n const flattenedNames: RefPath[] = [];\n const entries = value.value;\n\n for (const [childKey, childValue] of entries) {\n const flattenedKey = `${tokenName}.${childKey}`;\n const clone = this.isSymbolType(childValue) ? childValue.cloneIfMutable() : childValue;\n this.referenceCache.set(flattenedKey, clone);\n flattenedNames.push(flattenedKey);\n }\n\n return flattenedNames;\n }\n\n updateReferenceCache(tokenName: RefPath, value: TokenResult): void {\n if (value instanceof Error) return;\n this.referenceCache.set(tokenName, value);\n }\n\n private isSymbolType(value: unknown): value is ISymbolType {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n typeof (value as ISymbolType).cloneIfMutable === \"function\",\n );\n }\n}\n","import type { ObjectParser } from \".\";\n\nexport const defaultObjectParsers: ObjectParser[] = [];\n","import type { Config } from \"@interpreter/config\";\nimport type { InterpreterResult } from \"@interpreter/interpreter\";\nimport {\n DictionarySymbol,\n jsValueToSymbolType,\n ListSymbol,\n TokenSymbol,\n} from \"@interpreter/symbols\";\nimport { isArray, isObject } from \"@interpreter/utils/type\";\nimport type { ISymbolType, SymbolMetadata } from \"@src/types\";\nimport { defaultObjectParsers, type ObjectParser } from \".\";\n\nexport function parseValueToSymbol(\n value: unknown,\n config?: Config,\n parsers: ObjectParser[] = defaultObjectParsers,\n): ISymbolType | unknown {\n // If already a symbol, return as-is\n if (value && typeof value === \"object\" && \"getTypeName\" in value) {\n return value;\n }\n\n // Try custom object parsers first\n for (const parser of parsers) {\n if (parser.predicate(value)) {\n return parser.toSymbol(value, config);\n }\n }\n\n // Fallback to default jsValueToSymbolType for primitives, objects, and arrays\n return jsValueToSymbolType(value, config);\n}\n\nexport function createTokenSymbol(\n value: unknown,\n tokenType: string = \"unknown\",\n config?: Config,\n parsers: ObjectParser[] = defaultObjectParsers,\n metadata?: SymbolMetadata,\n): TokenSymbol {\n if (isObject(value)) {\n const symbolMap: Record<string, ISymbolType> = {};\n for (const [key, val] of Object.entries(value)) {\n symbolMap[key] = parseValueToSymbol(val, config, parsers) as ISymbolType;\n }\n return new TokenSymbol(tokenType, symbolMap, config, metadata);\n }\n\n if (isArray(value)) {\n const symbolArray = value.map((val) => parseValueToSymbol(val, config, parsers) as ISymbolType);\n return new TokenSymbol(tokenType, symbolArray, config, metadata);\n }\n\n return new TokenSymbol(tokenType, value as Record<string, any>, config, metadata);\n}\n\n/**\n * Helper function to recursively build values from resolved fields.\n * Handles nested objects and arrays.\n *\n * @param currentPath - The current path being processed\n * @param originalValue - The original value at this path\n * @param resolvedFields - Map of field paths to resolved values\n * @param config - Optional config\n * @param parsers - Optional custom object parsers\n * @returns ISymbolType representation of the value\n */\nfunction buildValueFromResolvedFields(\n currentPath: string,\n originalValue: unknown,\n resolvedFields: Map<string, InterpreterResult>,\n config?: Config,\n parsers: ObjectParser[] = defaultObjectParsers,\n): ISymbolType {\n // If this exact path is resolved, use it\n if (resolvedFields.has(currentPath)) {\n return resolvedFields.get(currentPath) as ISymbolType;\n }\n\n // Check if this value matches an object parser (e.g., { value: 8, unit: \"px\" })\n // before recursively processing it\n if (isObject(originalValue)) {\n for (const parser of parsers) {\n if (parser.predicate(originalValue)) {\n return parser.toSymbol(originalValue, config) as ISymbolType;\n }\n }\n\n // No parser matched, recurse into object fields\n // Wrap in DictionarySymbol for TokenScript compatibility\n const symbolMap: Record<string, ISymbolType> = {};\n for (const [key, val] of Object.entries(originalValue)) {\n const fieldPath = `${currentPath}.${key}`;\n symbolMap[key] = buildValueFromResolvedFields(\n fieldPath,\n val,\n resolvedFields,\n config,\n parsers,\n );\n }\n return new DictionarySymbol(symbolMap, config);\n }\n\n if (isArray(originalValue)) {\n const symbolArray: ISymbolType[] = [];\n for (let i = 0; i < originalValue.length; i++) {\n const fieldPath = `${currentPath}[${i}]`;\n symbolArray.push(\n buildValueFromResolvedFields(fieldPath, originalValue[i], resolvedFields, config, parsers),\n );\n }\n return new ListSymbol(symbolArray, false, config);\n }\n\n // Primitive values - convert to symbol\n return parseValueToSymbol(originalValue, config, parsers) as ISymbolType;\n}\n\n/**\n * Create a TokenSymbol from resolved fields and original structured value.\n * This combines the original value with resolved fields to build the final TokenSymbol.\n * Handles nested objects and arrays recursively.\n *\n * @param tokenName - The parent token name\n * @param resolvedFields - Map of field paths to resolved values\n * @param originalValue - The original structured value\n * @param tokenType - The token type\n * @param config - Optional config\n * @param parsers - Optional custom object parsers\n * @returns TokenSymbol with resolved values\n */\nexport function createTokenSymbolFromResolvedFields(\n tokenName: string,\n resolvedFields: Map<string, InterpreterResult>,\n originalValue: unknown,\n tokenType: string = \"unknown\",\n config?: Config,\n parsers: ObjectParser[] = defaultObjectParsers,\n metadata?: SymbolMetadata,\n): TokenSymbol {\n if (isObject(originalValue)) {\n const symbolMap: Record<string, ISymbolType> = {};\n for (const [key, val] of Object.entries(originalValue)) {\n const fieldPath = `${tokenName}.${key}`;\n symbolMap[key] = buildValueFromResolvedFields(\n fieldPath,\n val,\n resolvedFields,\n config,\n parsers,\n );\n }\n return new TokenSymbol(tokenType, symbolMap, config, metadata);\n }\n\n if (isArray(originalValue)) {\n const symbolArray: ISymbolType[] = [];\n for (let i = 0; i < originalValue.length; i++) {\n const fieldPath = `${tokenName}[${i}]`;\n symbolArray.push(\n buildValueFromResolvedFields(fieldPath, originalValue[i], resolvedFields, config, parsers),\n );\n }\n return new TokenSymbol(tokenType, symbolArray, config, metadata);\n }\n\n // Fallback for other types\n return new TokenSymbol(tokenType, originalValue as Record<string, any>, config, metadata);\n}\n","import { ProcessorError, ProcessorErrorCode } from \"@interpreter/errors\";\n\nexport class DependencyGraph<N = string> {\n private nodes = new Map<N, Set<N>>();\n\n addNode(node: N, dependencies: N[] | Set<N> = []): void {\n if (!this.nodes.has(node)) {\n this.nodes.set(node, new Set(dependencies));\n }\n }\n\n removeNode(node: N): void {\n this.nodes.delete(node);\n // Also remove this node from all dependency sets\n for (const deps of this.nodes.values()) {\n deps.delete(node);\n }\n }\n\n getNodes(): Map<N, Set<N>> {\n return this.nodes;\n }\n\n // Find nodes with no dependencies\n entryNodes(): N[] {\n const entries: N[] = [];\n for (const [node, deps] of this.nodes) {\n if (deps.size === 0) {\n entries.push(node);\n }\n }\n return entries;\n }\n\n // Find a cycle in the graph starting from the given nodes\n private findCycle(candidateNodes: N[]): N[] {\n const visited = new Set<N>();\n const recursionStack = new Set<N>();\n const path: N[] = [];\n\n const dfs = (node: N): boolean => {\n visited.add(node);\n recursionStack.add(node);\n path.push(node);\n\n const deps = this.nodes.get(node);\n if (deps) {\n for (const dep of deps) {\n if (!visited.has(dep)) {\n if (dfs(dep)) {\n return true;\n }\n } else if (recursionStack.has(dep)) {\n return true;\n }\n }\n }\n\n path.pop();\n recursionStack.delete(node);\n return false;\n };\n\n for (const node of candidateNodes) {\n if (!visited.has(node)) {\n if (dfs(node)) {\n return path;\n }\n }\n }\n\n return candidateNodes;\n }\n\n // Topological sort using Kahn's algorithm\n topologicalSort(): N[] {\n const inDegree = new Map<N, number>();\n const result: N[] = [];\n\n // Calculate in-degrees\n for (const node of this.nodes.keys()) {\n inDegree.set(node, 0);\n }\n for (const deps of this.nodes.values()) {\n for (const dep of deps) {\n inDegree.set(dep, (inDegree.get(dep) || 0) + 1);\n }\n }\n\n // Queue nodes with no dependencies\n const queue: N[] = [];\n for (const [node, degree] of inDegree) {\n if (degree === 0) {\n queue.push(node);\n }\n }\n\n while (queue.length > 0) {\n const node = queue.shift();\n if (node === undefined) break;\n result.push(node);\n\n // Reduce in-degree for dependents\n const deps = this.nodes.get(node) || new Set();\n for (const dep of deps) {\n const newDegree = (inDegree.get(dep) || 0) - 1;\n inDegree.set(dep, newDegree);\n if (newDegree === 0) {\n queue.push(dep);\n }\n }\n }\n\n // If result doesn't contain all nodes, there's a cycle\n if (result.length !== this.nodes.size) {\n const resultSet = new Set(result);\n const remainingNodes: N[] = [];\n for (const node of this.nodes.keys()) {\n if (!resultSet.has(node)) {\n remainingNodes.push(node);\n }\n }\n const cycle = this.findCycle(remainingNodes);\n const tokens = `${cycle.map((n) => String(n)).join(\" → \")} → ${String(cycle[0])}`;\n throw new ProcessorError(ProcessorErrorCode.CIRCULAR_DEPENDENCY, {\n data: { tokens },\n });\n }\n\n return result;\n }\n}\n","/**\n * Token name validation.\n *\n * Must stay in sync with the Go and Ruby versions. The shared fixture\n * at tokenscript/test-suites/token-name-validation.json proves they agree.\n * Uses explicit whitespace chars (not \\s) to ensure identical behavior\n * across Go/JS/Ruby regex engines.\n */\n\nconst INVALID_TOKEN_NAME_CHARS = /[ \\t\\n\\r\\f{}[\\]]/;\n\n/** Returns true if a single name segment is valid: non-empty and contains no whitespace, braces, or brackets. */\nexport function validateTokenName(name: string): boolean {\n return name.length > 0 && !INVALID_TOKEN_NAME_CHARS.test(name);\n}\n\n/** Splits a dot-delimited token path into its name segments. */\nexport function splitTokenPath(path: string): string[] {\n return path.split(\".\");\n}\n\n/** Returns true if every segment of a dot-delimited token path is a valid token name. */\nexport function validateTokenPath(path: string): boolean {\n return splitTokenPath(path).every(validateTokenName);\n}\n","import { isArray, isObject, isString } from \"@interpreter/utils/type\";\nimport { defaultObjectParsers, type ObjectParser } from \"../object-parsers\";\n\n/**\n * Check if a value matches any object parser predicate.\n * Object parsers handle special object structures like { value: 8, unit: \"px\" }.\n */\nfunction matchesObjectParser(value: unknown, parsers: ObjectParser[]): boolean {\n if (!isObject(value)) return false;\n return parsers.some((parser) => parser.predicate(value));\n}\n\n/**\n * Extract string fields from a structured value (object or array).\n * Returns a map of field paths to their string values.\n * Recursively extracts from nested objects and arrays, but skips objects\n * that match an object parser (e.g., { value: 8, unit: \"px\" }).\n *\n * @param value - The structured value to extract from\n * @param parentPath - The parent token path\n * @param objectParsers - Optional array of object parsers to check against\n * @returns Map of field paths to string values\n *\n * @example\n * extractStringFields({ offsetX: \"{base}\", offsetY: 4 }, \"shadow\")\n * => Map { \"shadow.offsetX\" => \"{base}\" }\n *\n * @example\n * extractStringFields([{ blur: \"{size}\", color: \"red\" }], \"shadow\")\n * => Map { \"shadow[0].blur\" => \"{size}\" }\n *\n * @example\n * // Object parsers prevent extraction from parsed objects\n * extractStringFields({ small: { value: 8, unit: \"px\" } }, \"spacing\", parsers)\n * => Map {} // empty, because { value, unit } matches NumberWithUnit parser\n */\nexport function extractStringFields(\n value: unknown,\n parentPath: string,\n objectParsers: ObjectParser[] = defaultObjectParsers,\n): Map<string, string> {\n const result = new Map<string, string>();\n\n const processValue = (val: unknown, path: string) => {\n if (isString(val)) {\n result.set(path, val);\n } else if (isObject(val)) {\n // Skip objects that match an object parser (they'll be handled as atomic values)\n if (matchesObjectParser(val, objectParsers)) {\n return;\n }\n // Recurse into nested objects\n const nested = extractStringFields(val, path, objectParsers);\n for (const [nestedPath, nestedVal] of nested) {\n result.set(nestedPath, nestedVal);\n }\n } else if (isArray(val)) {\n // Recurse into arrays\n const nested = extractStringFields(val, path, objectParsers);\n for (const [nestedPath, nestedVal] of nested) {\n result.set(nestedPath, nestedVal);\n }\n }\n };\n\n if (isObject(value)) {\n for (const [key, val] of Object.entries(value)) {\n processValue(val, `${parentPath}.${key}`);\n }\n } else if (isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n processValue(value[i], `${parentPath}[${i}]`);\n }\n }\n\n return result;\n}\n","import type { SymbolMetadata } from \"@src/types\";\nimport { getKeyAlt, isObject, isString } from \"@/src/interpreter/utils/type\";\n\n/**\n * Structured token data containing value and optional type information\n */\nexport interface TokenData {\n $value: unknown;\n $type?: string;\n /**\n * Optional metadata attached to the token.\n * This is passed through to the TokenSymbol and preserved during cloning.\n * Not accessible to the tokenscript language.\n */\n $metadata?: SymbolMetadata;\n}\n\nexport function getTokenValue(data: string | TokenData): unknown {\n return isString(data) ? data : data.$value;\n}\n\nexport function setTokenValue(value: string | TokenData): TokenData {\n return isString(value) ? { $value: value } : value;\n}\n\n/**\n * Flattens a nested tokens object structure into a flat key-value map with dot-separated paths.\n * Now preserves structured values and captures $type information.\n *\n * @param obj - The nested object to flatten\n * @param prefixAccumulator - Recursion prefix accumulator\n * @returns Flat map of token paths to TokenData\n *\n * @example\n * Input: { color: { red: { $value: \"#FF0000\" } } }\n * Output: Map { \"color.red\" => { $value: \"#FF0000\" } }\n *\n * @example\n * Input: { shadow: { $type: \"shadow\", $value: { offsetX: 0, offsetY: 4 } } }\n * Output: Map { \"shadow\" => { $value: { offsetX: 0, offsetY: 4 }, $type: \"shadow\" } }\n */\nexport function flattenTokensObject(\n obj: Record<string, unknown>,\n prefixAccumulator = \"\",\n): Map<string, TokenData> {\n const result = new Map<string, TokenData>();\n\n for (const [prefix, value] of Object.entries(obj)) {\n if (prefix.startsWith(\"$\")) {\n continue;\n }\n\n const path = prefixAccumulator ? `${prefixAccumulator}.${prefix}` : prefix;\n\n if (isObject(value)) {\n const objValue = value as Record<string, unknown>;\n const tokenValue = getKeyAlt([\"$value\", \"value\"], objValue);\n\n if (tokenValue !== undefined) {\n // Capture $type and $metadata if present\n const tokenType = objValue.$type;\n const tokenMetadata = objValue.$metadata as SymbolMetadata | undefined;\n const tokenData: TokenData = {\n $value: tokenValue,\n ...(tokenType !== undefined && { $type: String(tokenType) }),\n ...(tokenMetadata !== undefined && { $metadata: tokenMetadata }),\n };\n result.set(path, tokenData);\n }\n // Recurse into structure\n else {\n const nested = flattenTokensObject(objValue, path);\n for (const [nestedKey, nestedValue] of nested) {\n result.set(nestedKey, nestedValue);\n }\n }\n }\n // Primitive values are stored directly\n else {\n result.set(path, { $value: value });\n }\n }\n\n return result;\n}\n\nexport function normalizeToTokenData(value: unknown): TokenData {\n if (typeof value === \"string\") {\n return { $value: value };\n }\n if (isObject(value) && \"$value\" in value) {\n const obj = value as Record<string, unknown>;\n const metadata = obj.$metadata as SymbolMetadata | undefined;\n return {\n $value: obj.$value,\n ...(isString(obj.$type) && { $type: obj.$type }),\n ...(metadata !== undefined && { $metadata: metadata }),\n };\n }\n return { $value: value };\n}\n\nexport function recordToMap(record: Record<string, unknown>): Map<string, TokenData> {\n const map = new Map<string, TokenData>();\n for (const [key, value] of Object.entries(record)) {\n map.set(key, normalizeToTokenData(value));\n }\n return map;\n}\n\nexport function isNested(obj: Record<string, unknown>): boolean {\n return Object.keys(obj).some((key) => {\n const value = obj[key];\n return isObject(value) && !key.startsWith(\"$\");\n });\n}\n","import type { RefPath } from \"../resolver/types\";\n\nexport enum ValidationSeverity {\n ERROR = \"error\",\n WARNING = \"warning\",\n INFO = \"info\",\n}\n\n/**\n * A validation issue found during token type validation.\n *\n * @property code - Unique error code for this specific issue type\n * @property severity - Severity level (ERROR, WARNING, INFO)\n * @property message - Human-readable description of the issue\n * @property tokenName - The token where the issue was found\n * @property path - Path to the specific field within a structured token (e.g., [\"fontSize\"] or [0, \"blur\"] for arrays)\n * @property line - Optional line number in the source\n * @property data - Additional structured data for debugging\n */\nexport interface ValidationIssue {\n code: string;\n severity: ValidationSeverity;\n message: string;\n tokenName: RefPath;\n path?: (string | number)[];\n line?: number;\n data?: Record<string, unknown>;\n}\n","import type { ASTNode } from \"@interpreter/ast\";\nimport type { Config } from \"@interpreter/config\";\nimport {\n isLanguageError,\n type LanguageError,\n ProcessorError,\n ProcessorErrorCode,\n} from \"@interpreter/errors\";\nimport type { InterpreterResult } from \"@interpreter/interpreter\";\nimport { type ParseExpressionResult, parseExpression } from \"@interpreter/parser\";\nimport {\n BooleanSymbol,\n DictionarySymbol,\n ListSymbol,\n NullSymbol,\n NumberSymbol,\n StringSymbol,\n TokenSymbol,\n} from \"@interpreter/symbols\";\nimport { renameReferences } from \"@interpreter/utils/references\";\nimport { isArray, isBoolean, isNull, isNumber, isObject, isString } from \"@interpreter/utils/type\";\nimport { type ISymbolType, UNINTERPRETED_KEYWORDS } from \"@src/types\";\nimport { createDependencyError } from \"../errors\";\nimport {\n createTokenSymbol,\n createTokenSymbolFromResolvedFields,\n type ObjectParser,\n} from \"../object-parsers\";\nimport { DependencyGraph } from \"../utils/DependencyGraph\";\nimport { validateTokenPath } from \"../utils/name-validation\";\nimport { extractStringFields } from \"../utils/structured-tokens\";\nimport { getTokenValue, setTokenValue, type TokenData } from \"../utils/tokens\";\nimport type { ValidationIssue } from \"../validator\";\nimport { ValidationSeverity } from \"../validator\";\nimport { DependencyTracker } from \"./DependencyTracker\";\nimport { PrefixManager } from \"./PrefixManager\";\nimport { ReadinessTracker } from \"./ReadinessTracker\";\nimport { ResolutionNotifier } from \"./ResolutionNotifier\";\nimport { TokenInterpreter } from \"./TokenInterpreter\";\nimport type {\n CreateTokenParams,\n CreateTokenResult,\n DeleteTokenParams,\n DeleteTokenResult,\n IssuesMap,\n RefPath,\n ResolvedValueMap,\n ResolveIssue,\n ResolveValueParams,\n ResolveValueResult,\n TokenDataMap,\n TokenInputMap,\n TokenResult,\n TokenResultMap,\n UnresolvedTokenMap,\n UpdateTokenParams,\n UpdateTokenResult,\n} from \"./types\";\n\n/**\n * Validate a resolved value against a registered token type spec.\n * Returns an array of ValidationIssue for any failures.\n *\n * Shared between PrefixResolver (full resolution) and TokenResolver.resolveValue\n * (lightweight preview resolution).\n */\nfunction collectTypeValidationIssues(\n config: Config | undefined,\n tokenName: RefPath,\n tokenType: string,\n value: InterpreterResult,\n): ValidationIssue[] {\n if (!config?.tokenManager) return [];\n if (!config.tokenManager.getSpecByType(tokenType)) return [];\n\n if (value === null || typeof value === \"string\") return [];\n\n let valueToValidate: ListSymbol | DictionarySymbol | typeof value;\n\n if (value instanceof TokenSymbol) {\n const innerValue = value.value;\n if (Array.isArray(innerValue)) {\n valueToValidate = new ListSymbol(innerValue, false, config);\n } else if (innerValue instanceof Map) {\n valueToValidate = new DictionarySymbol(innerValue, config);\n } else {\n valueToValidate = value;\n }\n } else if (typeof value === \"object\" && value !== null && \"type\" in value) {\n valueToValidate = value;\n } else {\n return [];\n }\n\n const validationResults = config.tokenManager.validate(tokenType, valueToValidate as ISymbolType);\n\n const issues: ValidationIssue[] = [];\n for (const result of validationResults) {\n if (!result.valid && result.error) {\n const isNested = result.path && result.path.length > 0;\n issues.push({\n code: result.error,\n severity: ValidationSeverity.WARNING,\n message: isNested\n ? `Validation failed at ${result.path?.join(\".\")}: ${result.error}`\n : `Token validation failed: ${result.error}`,\n tokenName,\n path: result.path,\n data: isNested\n ? { tokenType: result.tokenType, parentTokenType: tokenType }\n : { tokenType },\n });\n }\n }\n return issues;\n}\n\n/**\n * Parse a field path string into an array of path segments.\n * E.g., \"[0].blur\" -> [0, \"blur\"]\n * E.g., \"offsetX\" -> [\"offsetX\"]\n * E.g., \"[0][1].color\" -> [0, 1, \"color\"]\n */\nfunction parseFieldPath(fieldPath: string): (string | number)[] {\n const result: (string | number)[] = [];\n let remaining = fieldPath;\n\n while (remaining.length > 0) {\n // Check for array index: [n]\n const arrayMatch = remaining.match(/^\\[(\\d+)\\]/);\n if (arrayMatch) {\n result.push(parseInt(arrayMatch[1], 10));\n remaining = remaining.substring(arrayMatch[0].length);\n continue;\n }\n\n // Check for property access: .name or name (at start)\n const propMatch = remaining.match(/^\\.?([^.[\\]]+)/);\n if (propMatch) {\n result.push(propMatch[1]);\n remaining = remaining.substring(propMatch[0].length);\n continue;\n }\n\n // Skip leading dot\n if (remaining.startsWith(\".\")) {\n remaining = remaining.substring(1);\n continue;\n }\n\n // Unknown format, break to avoid infinite loop\n break;\n }\n\n return result;\n}\n\n/**\n * Convert a LanguageError to a ValidationIssue for uniform interface.\n * This allows sub-field errors to be in the same format as validation issues.\n */\nfunction errorToValidationIssue(\n error: LanguageError,\n parentToken: RefPath,\n path: (string | number)[],\n): ValidationIssue {\n return {\n code: error.code,\n severity: ValidationSeverity.ERROR,\n message: path.length > 0 ? `Error at ${path.join(\".\")}: ${error.message}` : error.message,\n tokenName: parentToken,\n path,\n line: error.line,\n data: error.data as Record<string, unknown>,\n };\n}\n\nexport type ProcessorResult = {\n graph: DependencyGraph<RefPath>;\n resolved: TokenResultMap;\n issues?: IssuesMap;\n};\n\nexport type ProcessorCallbacks = {\n onResolve?: (tokenName: RefPath, value: InterpreterResult) => void;\n onError?: (\n tokenName: RefPath,\n error: Error,\n originalValue: string | unknown,\n metadata?: { isSubField: boolean; parentToken?: string; fieldPath?: string },\n ) => void;\n};\n\nexport type ProcessorOutput = ProcessorResult & {\n tokens: ResolvedValueMap;\n resolver: TokenResolver;\n issues?: IssuesMap;\n};\n\nexport type ResolverParams = {\n tokens: TokenInputMap;\n callbacks?: ProcessorCallbacks;\n config?: Config;\n objectParsers?: ObjectParser[];\n initialCache?: ResolvedValueMap;\n};\n\n/**\n * Find all tokens affected by a change to the given token.\n *\n * Uses BFS traversal on the reverse dependency graph to identify\n * the changed token plus all tokens that transitively depend on it.\n *\n * @param tokenName - The token that changed\n * @param graph - The dependency graph from ProcessorResult\n * @returns Object containing affected tokens and a subgraph showing their relationships\n *\n * @example\n * const { tokens, subgraph } = getTokenDependencyGraph(\"color.primary\", processorResult.graph);\n * console.log(tokens); // Set(['color.primary', 'button.background', ...])\n * console.log(subgraph.getNodes()); // Map showing dependency relationships\n */\nexport function getTokenDependencyGraph(\n tokenName: RefPath,\n graph: DependencyGraph<RefPath>,\n): {\n tokens: Set<RefPath>;\n subgraph: DependencyGraph<RefPath>;\n} {\n // Build reverse dependency graph to find dependents\n const reverseDeps = new Map<RefPath, Set<RefPath>>();\n const graphNodes = graph.getNodes();\n\n for (const [node, dependencies] of graphNodes) {\n for (const dep of dependencies) {\n if (!reverseDeps.has(dep)) {\n reverseDeps.set(dep, new Set());\n }\n reverseDeps.get(dep)?.add(node);\n }\n }\n\n // Find all tokens transitively affected by this change using BFS\n const affectedTokens = new Set<RefPath>();\n const queue: RefPath[] = [tokenName];\n const visited = new Set<RefPath>();\n\n while (queue.length > 0) {\n const current = queue.shift();\n if (current === undefined || visited.has(current)) continue;\n\n visited.add(current);\n affectedTokens.add(current);\n\n // Add all tokens that depend on this one\n const dependents = reverseDeps.get(current);\n if (dependents) {\n for (const dependent of dependents) {\n if (!visited.has(dependent)) {\n queue.push(dependent);\n }\n }\n }\n }\n\n // Build subgraph containing only affected tokens and their relationships\n const subgraph = new DependencyGraph<RefPath>();\n for (const token of affectedTokens) {\n const dependencies = graphNodes.get(token);\n if (dependencies) {\n // Only include dependencies that are also in the affected set\n const affectedDeps = new Set<RefPath>();\n for (const dep of dependencies) {\n if (affectedTokens.has(dep)) {\n affectedDeps.add(dep);\n }\n }\n subgraph.addNode(token, affectedDeps);\n } else {\n subgraph.addNode(token, []);\n }\n }\n\n return {\n tokens: affectedTokens,\n subgraph,\n };\n}\n\nclass PrefixResolver {\n private readonly tokens: TokenInputMap;\n private readonly callbacks?: ProcessorCallbacks;\n private readonly config?: Config;\n private readonly objectParsers?: ObjectParser[];\n private readonly graph = new DependencyGraph<RefPath>();\n private readonly resolved: TokenResultMap = new Map();\n private readonly unresolved: UnresolvedTokenMap = new Map();\n private readonly referenceCache: ResolvedValueMap = new Map();\n private readonly pendingResolution: Set<RefPath> = new Set();\n private readonly readyQueue: Set<RefPath> = new Set();\n\n // Core components\n private readonly dependencyTracker: DependencyTracker;\n private readonly prefixManager: PrefixManager;\n private readonly tokenInterpreter: TokenInterpreter;\n\n // Phase 3: Optimization components\n private readonly notifier: ResolutionNotifier;\n private readonly readinessTracker: ReadinessTracker;\n\n // Structured tokens tracking\n private readonly subFieldPaths: Set<RefPath> = new Set();\n private readonly structuredTokens: TokenDataMap = new Map();\n\n // Issues collection (errors and lint issues)\n private readonly issues: IssuesMap = new Map();\n\n // Phase state\n private earlyResolved: RefPath[] = [];\n\n // Track missing dependencies that were referenced but don't exist\n private missingDependencies: Set<RefPath> = new Set();\n\n constructor(private readonly params: ResolverParams) {\n const { tokens, callbacks, config, objectParsers } = params;\n\n this.tokens = tokens;\n this.callbacks = callbacks;\n this.config = config;\n this.objectParsers = objectParsers;\n\n // Initialize components\n this.dependencyTracker = new DependencyTracker();\n this.prefixManager = new PrefixManager(config);\n this.tokenInterpreter = new TokenInterpreter(this.referenceCache, config);\n\n // Initialize Phase 3 optimization components\n this.readinessTracker = new ReadinessTracker();\n this.notifier = new ResolutionNotifier(\n this.dependencyTracker,\n this.prefixManager,\n this.readinessTracker,\n this.pendingResolution,\n this.readyQueue,\n (tokenName) => this.resolveSingleToken(tokenName),\n (prefix, cache) => this.buildPrefixDictionary(prefix, cache),\n );\n }\n\n private addIssue(tokenName: RefPath, issue: ResolveIssue): void {\n const existing = this.issues.get(tokenName) || [];\n this.issues.set(tokenName, [...existing, issue]);\n }\n\n /**\n * Add an issue for a sub-field, converting the error to a ValidationIssue.\n * This ensures all issues have a uniform interface (same as validation issues).\n */\n private addSubFieldIssue(parentToken: string, fieldPath: string, error: LanguageError): void {\n const path = parseFieldPath(fieldPath);\n const issue = errorToValidationIssue(error, parentToken, path);\n // Store under parent token name for uniform access\n this.addIssue(parentToken, issue);\n }\n\n private ensureLanguageError(error: Error): LanguageError {\n if (isLanguageError(error)) {\n return error;\n }\n // Wrap unknown errors as ProcessorError\n return new ProcessorError(ProcessorErrorCode.UNKNOWN_PARSING_ERROR, {\n data: { error: error.message },\n });\n }\n\n private resolveError(refPath: RefPath, error: LanguageError, value: string): LanguageError {\n // When a token references a missing dependency (e.g., `bar = \"{foo}\"` where `foo` doesn't exist),\n // we should only report the error on `bar`, not create a phantom entry for `foo` in the output.\n const isActualToken = this.tokens.has(refPath) || this.subFieldPaths.has(refPath);\n\n if (isActualToken) {\n this.resolved.set(refPath, error);\n this.callbacks?.onError?.(refPath, error, value);\n\n // For sub-fields, add issue under parent token with path for uniform interface\n if (this.subFieldPaths.has(refPath)) {\n const { parentToken, fieldPath } = this.extractSubFieldMetadata(refPath);\n if (parentToken) {\n this.addSubFieldIssue(parentToken, fieldPath, error);\n } else {\n this.addIssue(refPath, error);\n }\n } else {\n this.addIssue(refPath, error);\n }\n\n this.earlyResolved.push(refPath);\n this.graph.addNode(refPath, []);\n }\n\n return error;\n }\n\n private lintTokenResult(tokenName: RefPath, value: InterpreterResult): void {\n // Skip linting sub-fields (internal tokens for structured token resolution)\n if (this.subFieldPaths.has(tokenName)) return;\n\n const tokenData = this.tokens.get(tokenName);\n const tokenType =\n tokenData && typeof tokenData === \"object\" && \"$type\" in tokenData\n ? tokenData.$type\n : undefined;\n\n // Run token type validation\n this.validateTokenType(tokenName, tokenType, value);\n }\n\n private validateTokenType(\n tokenName: RefPath,\n tokenType: string | undefined,\n value: InterpreterResult,\n ): void {\n if (!tokenType) return;\n for (const issue of collectTypeValidationIssues(this.config, tokenName, tokenType, value)) {\n this.addIssue(tokenName, issue);\n }\n }\n\n private earlyResolvePrimitiveToken(tokenName: RefPath, value: InterpreterResult): void {\n this.resolved.set(tokenName, value);\n this.referenceCache.set(tokenName, value);\n this.callbacks?.onResolve?.(tokenName, value);\n this.lintTokenResult(tokenName, value);\n this.graph.addNode(tokenName, []);\n this.earlyResolved.push(tokenName);\n }\n\n private tryParseExpression(refPath: RefPath, value: string): ParseExpressionResult | Error {\n try {\n return parseExpression(value);\n } catch (error) {\n if (isLanguageError(error)) {\n return this.resolveError(refPath, error, value);\n }\n return this.resolveError(\n refPath,\n new ProcessorError(ProcessorErrorCode.UNKNOWN_PARSING_ERROR, {\n data: { error: error instanceof Error ? error.message : String(error) },\n }),\n value,\n );\n }\n }\n\n private processParsedToken(tokenName: RefPath, ast: ASTNode, dependencies: Set<RefPath>): void {\n this.tokenInterpreter.setTokenAST(tokenName, ast);\n\n if (dependencies.size > 0) {\n this.unresolved.set(tokenName, { ast, dependencies });\n }\n\n this.graph.addNode(tokenName, dependencies);\n\n for (const dep of dependencies) {\n if (this.prefixManager.hasPrefix(dep) && !this.tokens.has(dep)) {\n continue;\n }\n\n if (this.resolved.has(dep)) continue;\n\n this.dependencyTracker.addTokenDependency(tokenName, dep);\n\n if (this.tokens.has(dep)) continue;\n\n const parentToken = this.prefixManager.findParentToken(dep, this.tokens);\n if (parentToken) {\n this.prefixManager.addVirtualChild(parentToken, dep);\n continue;\n }\n\n // Track missing dependencies that aren't actual tokens\n // The error will be reported on the token that references it\n if (!this.referenceCache.has(dep) && !this.resolved.has(dep) && !this.tokens.has(dep)) {\n this.missingDependencies.add(dep);\n }\n }\n }\n\n public resolve(): ProcessorResult {\n this.parseAndBuildGraph();\n this.mapPrefixDependencies();\n this.releaseEarlyResolved();\n this.resolveDependencyFreeTokens();\n this.finalizeResolution();\n return {\n graph: this.graph,\n resolved: this.resolved,\n issues: this.issues.size > 0 ? this.issues : undefined,\n };\n }\n\n // Expose internal state for incremental updates\n public getGraph(): DependencyGraph<RefPath> {\n return this.graph;\n }\n\n public getReferenceCache(): Map<string, InterpreterResult> {\n return this.referenceCache;\n }\n\n public getTokenInterpreter(): TokenInterpreter {\n return this.tokenInterpreter;\n }\n\n public getSubFieldPaths(): Set<RefPath> {\n return this.subFieldPaths;\n }\n\n public clone(overrides: Partial<ResolverParams>): PrefixResolver {\n const { tokens, callbacks } = {\n ...this.params,\n ...overrides,\n };\n\n const resolver = new PrefixResolver({\n tokens,\n callbacks,\n config: this.config,\n objectParsers: this.objectParsers,\n });\n\n if (overrides.initialCache && overrides.tokens) {\n for (const [tokenName, value] of overrides.initialCache) {\n if (!overrides.tokens.has(tokenName)) {\n resolver.referenceCache.set(tokenName, value);\n }\n }\n }\n\n return resolver;\n }\n\n /**\n * Phase 1: Parse and build graph (ResolutionPhase.PARSE_AND_BUILD_GRAPH)\n * - Parse all token values into ASTs\n * - Build dependency graph\n * - Identify and mark early-resolved tokens\n * - Detect missing token dependencies\n * - Handle primitive and structured tokens\n */\n private parseAndBuildGraph(): void {\n this.earlyResolved = [];\n\n for (const [tokenName, tokenData] of this.tokens.entries()) {\n // Validate token name: each dot-separated segment must not contain\n // spaces, braces, or brackets.\n if (!validateTokenPath(tokenName)) {\n this.addIssue(tokenName, {\n code: \"INVALID_TOKEN_NAME\",\n severity: ValidationSeverity.ERROR,\n message: `token \"${tokenName}\" contains invalid characters in name (spaces, braces, or brackets are not allowed)`,\n tokenName,\n data: { path: tokenName },\n });\n }\n\n const tokenValue = getTokenValue(tokenData);\n\n // Handle uninterpreted keywords\n if (isString(tokenValue) && UNINTERPRETED_KEYWORDS.includes(tokenValue)) {\n const symbol = new StringSymbol(tokenValue, this.config);\n this.earlyResolvePrimitiveToken(tokenName, symbol);\n continue;\n }\n\n if (isNumber(tokenValue)) {\n this.earlyResolvePrimitiveToken(tokenName, new NumberSymbol(tokenValue, this.config));\n continue;\n }\n\n if (isBoolean(tokenValue)) {\n this.earlyResolvePrimitiveToken(tokenName, new BooleanSymbol(tokenValue, this.config));\n continue;\n }\n\n if (isNull(tokenValue)) {\n this.earlyResolvePrimitiveToken(tokenName, new NullSymbol(this.config));\n continue;\n }\n\n if (isObject(tokenValue) || isArray(tokenValue)) {\n this.handleStructuredToken(tokenName, setTokenValue(tokenData));\n continue;\n }\n\n // Handle string values (may contain references)\n const tokenValueStr = String(tokenValue);\n const parseResult = this.tryParseExpression(tokenName, tokenValueStr);\n if (parseResult instanceof Error) {\n continue;\n }\n\n const { ast, parser } = parseResult;\n if (!ast) {\n this.earlyResolvePrimitiveToken(tokenName, \"\");\n continue;\n }\n\n this.prefixManager.addTokenToPrefix(tokenName);\n this.processParsedToken(tokenName, ast, parser.requiredReferences);\n }\n }\n\n private handleStructuredToken(tokenName: RefPath, tokenData: TokenData): void {\n const tokenValue = tokenData.$value;\n\n // Store for later assembly\n this.structuredTokens.set(tokenName, tokenData);\n\n // Extract string fields that may contain references\n const stringFields = extractStringFields(\n tokenValue,\n tokenName,\n this.objectParsers || undefined,\n );\n\n if (stringFields.size === 0) {\n // No string fields to resolve, token is ready\n // Create TokenSymbol and store it in both resolved and reference cache\n const tokenType = tokenData.$type || \"unknown\";\n const tokenSymbol = createTokenSymbol(\n tokenValue,\n tokenType,\n this.config,\n this.objectParsers,\n tokenData.$metadata,\n );\n this.resolved.set(tokenName, tokenSymbol);\n this.referenceCache.set(tokenName, tokenSymbol);\n\n this.callbacks?.onResolve?.(tokenName, tokenSymbol);\n this.lintTokenResult(tokenName, tokenSymbol);\n this.graph.addNode(tokenName, []);\n this.earlyResolved.push(tokenName);\n return;\n }\n\n // Add string fields as virtual tokens\n for (const [fieldPath, fieldValue] of stringFields) {\n this.subFieldPaths.add(fieldPath);\n\n const parseResult = this.tryParseExpression(fieldPath, fieldValue);\n if (parseResult instanceof Error) {\n continue;\n }\n\n const { ast, parser } = parseResult;\n if (!ast) {\n this.earlyResolvePrimitiveToken(fieldPath, \"\");\n continue;\n }\n\n this.processParsedToken(fieldPath, ast, parser.requiredReferences);\n }\n\n // Parent token depends on all its sub-fields\n const subFieldDeps = Array.from(stringFields.keys());\n this.graph.addNode(tokenName, subFieldDeps);\n for (const dep of subFieldDeps) {\n this.dependencyTracker.addTokenDependency(tokenName, dep);\n }\n this.unresolved.set(tokenName, {\n ast: null as any,\n dependencies: new Set(subFieldDeps),\n });\n }\n\n /**\n * Phase 2: Map prefix dependencies (ResolutionPhase.MAP_PREFIX_DEPENDENCIES)\n * - Identify which tokens depend on prefixes\n * - Activate prefix resolution tracking\n * - Mark prefix dependencies for later resolution\n */\n private mapPrefixDependencies(): void {\n for (const [tokenName, unresolved] of this.unresolved.entries()) {\n for (const dep of unresolved.dependencies) {\n if (this.prefixManager.hasPrefix(dep) && !this.tokens.has(dep)) {\n this.prefixManager.activatePrefix(dep);\n this.dependencyTracker.addPrefixDependency(tokenName, dep);\n }\n }\n }\n }\n\n /**\n * Phase 3: Release early resolved (ResolutionPhase.RELEASE_EARLY_RESOLVED)\n * - Notify dependents of early-resolved tokens\n * - Release prefix dependencies waiting for these tokens\n * - Trigger cascade resolution of dependent tokens\n */\n private releaseEarlyResolved(): void {\n for (const tokenName of this.earlyResolved) {\n this.notifyResolution(tokenName);\n }\n }\n\n /**\n * Phase 4: Resolve dependency-free tokens (ResolutionPhase.RESOLVE_DEPENDENCY_FREE)\n * - Seed ready queue with initially dependency-free tokens\n * - Process queue in event-driven manner (cascade resolution)\n * - Queue is populated by ResolutionNotifier when dependencies are released\n */\n private resolveDependencyFreeTokens(): void {\n // Seed ready queue with initially dependency-free tokens (including sub-fields)\n const allTokens = new Set([...this.tokens.keys(), ...this.subFieldPaths]);\n\n for (const tokenName of allTokens) {\n if (this.resolved.has(tokenName)) continue;\n\n if (this.readinessTracker.isReady(tokenName, this.dependencyTracker)) {\n this.readyQueue.add(tokenName);\n }\n }\n\n // Process ready queue (event-driven cascade resolution)\n while (this.readyQueue.size > 0) {\n const tokenName = this.readyQueue.values().next().value as RefPath;\n this.readyQueue.delete(tokenName);\n this.resolveSingleToken(tokenName);\n }\n }\n\n /**\n * Extract parent token and field path from a sub-field token name.\n * Example: \"shadow.card.offsetY\" -> { parentToken: \"shadow.card\", fieldPath: \"offsetY\" }\n * Example: \"shadow[0].blur\" -> { parentToken: \"shadow\", fieldPath: \"[0].blur\" }\n */\n private extractSubFieldMetadata(subFieldPath: RefPath): {\n parentToken: string;\n fieldPath: string;\n } {\n // Find the parent token by checking which structured token this sub-field belongs to\n for (const [parentToken] of this.structuredTokens) {\n // Check for both dot notation (shadow.offsetX) and bracket notation (shadow[0].blur)\n if (\n subFieldPath.startsWith(`${parentToken}.`) ||\n subFieldPath.startsWith(`${parentToken}[`)\n ) {\n const fieldPath = subFieldPath.substring(parentToken.length);\n // Remove leading dot if present (for dot notation like \"shadow.offsetX\" -> \"offsetX\")\n const normalizedFieldPath = fieldPath.startsWith(\".\") ? fieldPath.substring(1) : fieldPath;\n return { parentToken, fieldPath: normalizedFieldPath };\n }\n }\n\n // Fallback: split on last dot\n const lastDotIndex = subFieldPath.lastIndexOf(\".\");\n if (lastDotIndex !== -1) {\n return {\n parentToken: subFieldPath.substring(0, lastDotIndex),\n fieldPath: subFieldPath.substring(lastDotIndex + 1),\n };\n }\n\n // No parent found\n return { parentToken: \"\", fieldPath: subFieldPath };\n }\n\n private resolveSingleToken(tokenName: RefPath): void {\n if (this.resolved.has(tokenName)) return;\n\n // Prevent re-entrant resolution during cascade\n this.pendingResolution.add(tokenName);\n\n // Check if this is a structured token\n if (this.structuredTokens.has(tokenName)) {\n this.resolveStructuredToken(tokenName);\n this.pendingResolution.delete(tokenName);\n return;\n }\n\n // Check if this is a sub-field (virtual token)\n if (this.subFieldPaths.has(tokenName)) {\n // Sub-fields are resolved via TokenInterpreter\n const ast = this.tokenInterpreter.getTokenAST(tokenName);\n if (ast) {\n const unresolved = this.unresolved.get(tokenName);\n const dependencyError = unresolved\n ? this.tokenInterpreter.buildDependencyError(\n tokenName,\n unresolved.dependencies,\n this.resolved,\n )\n : undefined;\n\n if (dependencyError) {\n this.resolved.set(tokenName, dependencyError);\n // Call onError for sub-field with metadata\n const { parentToken, fieldPath } = this.extractSubFieldMetadata(tokenName);\n this.callbacks?.onError?.(tokenName, dependencyError, \"\", {\n isSubField: true,\n parentToken,\n fieldPath,\n });\n // Add issue under parent token with path for uniform interface\n if (parentToken) {\n this.addSubFieldIssue(parentToken, fieldPath, dependencyError);\n } else {\n this.addIssue(tokenName, dependencyError);\n }\n } else {\n const tokenValue = this.tokenInterpreter.interpretTokenWithAST(tokenName, ast);\n this.resolved.set(tokenName, tokenValue);\n\n if (tokenValue instanceof Error) {\n // Call onError for sub-field with metadata\n const { parentToken, fieldPath } = this.extractSubFieldMetadata(tokenName);\n this.callbacks?.onError?.(tokenName, tokenValue, \"\", {\n isSubField: true,\n parentToken,\n fieldPath,\n });\n // Add issue under parent token with path for uniform interface\n const langError = this.ensureLanguageError(tokenValue);\n if (parentToken) {\n this.addSubFieldIssue(parentToken, fieldPath, langError);\n } else {\n this.addIssue(tokenName, langError);\n }\n } else {\n // Don't call onResolve for sub-fields\n this.tokenInterpreter.updateReferenceCache(tokenName, tokenValue);\n }\n }\n }\n\n this.unresolved.delete(tokenName);\n this.notifyResolution(tokenName);\n this.pendingResolution.delete(tokenName);\n return;\n }\n\n // For regular tokens\n const originalValue = this.tokens.get(tokenName);\n if (originalValue === undefined) return;\n\n // For string/primitive tokens\n const tokenValueStr: string = String(getTokenValue(originalValue));\n\n const unresolved = this.unresolved.get(tokenName);\n const dependencyError = unresolved\n ? this.tokenInterpreter.buildDependencyError(\n tokenName,\n unresolved.dependencies,\n this.resolved,\n )\n : undefined;\n\n let tokenValue: TokenResult;\n\n if (dependencyError) {\n tokenValue = dependencyError;\n this.resolved.set(tokenName, dependencyError);\n this.callbacks?.onError?.(tokenName, dependencyError, tokenValueStr);\n this.addIssue(tokenName, dependencyError);\n } else {\n tokenValue = this.tokenInterpreter.interpretToken(tokenName, tokenValueStr);\n this.resolved.set(tokenName, tokenValue);\n\n if (tokenValue instanceof Error) {\n this.callbacks?.onError?.(tokenName, tokenValue, tokenValueStr);\n this.addIssue(tokenName, this.ensureLanguageError(tokenValue));\n } else {\n this.callbacks?.onResolve?.(tokenName, tokenValue);\n this.lintTokenResult(tokenName, tokenValue);\n this.tokenInterpreter.updateReferenceCache(tokenName, tokenValue);\n }\n }\n\n const flattened = this.tokenInterpreter.flattenDictionaryToCache(tokenName, tokenValue);\n this.resolveVirtualChildren(tokenName, flattened);\n this.notifyResolution(tokenName, flattened);\n this.unresolved.delete(tokenName);\n this.pendingResolution.delete(tokenName);\n }\n\n /**\n * Resolve a structured token by assembling resolved sub-fields\n */\n private resolveStructuredToken(tokenName: RefPath): void {\n const tokenData = this.structuredTokens.get(tokenName);\n if (!tokenData) return;\n\n const originalValue = tokenData.$value;\n\n // Extract string fields\n const stringFields = extractStringFields(\n originalValue,\n tokenName,\n this.objectParsers || undefined,\n );\n\n // Check for dependency errors in sub-fields\n const resolvedFields = new Map<string, InterpreterResult>();\n let hasError = false;\n\n for (const [fieldPath] of stringFields) {\n const fieldValue = this.resolved.get(fieldPath);\n if (fieldValue === undefined) {\n // Sub-field not resolved yet (shouldn't happen if dependencies are correct)\n const error = new ProcessorError(ProcessorErrorCode.SUB_FIELD_NOT_RESOLVED, {\n data: { fieldPath },\n });\n this.resolved.set(tokenName, error);\n this.callbacks?.onError?.(tokenName, error, originalValue);\n this.addIssue(tokenName, error);\n hasError = true;\n break;\n }\n if (fieldValue instanceof Error) {\n // Sub-field has error, propagate to parent\n this.resolved.set(tokenName, fieldValue);\n this.callbacks?.onError?.(tokenName, fieldValue, originalValue);\n this.addIssue(tokenName, this.ensureLanguageError(fieldValue));\n hasError = true;\n break;\n }\n resolvedFields.set(fieldPath, fieldValue);\n }\n\n if (!hasError) {\n // Create TokenSymbol directly from resolved fields and original value\n const tokenType = tokenData.$type || \"unknown\";\n const tokenSymbol = createTokenSymbolFromResolvedFields(\n tokenName,\n resolvedFields,\n originalValue,\n tokenType,\n this.config,\n this.objectParsers,\n tokenData.$metadata,\n );\n this.resolved.set(tokenName, tokenSymbol);\n this.referenceCache.set(tokenName, tokenSymbol);\n\n this.callbacks?.onResolve?.(tokenName, tokenSymbol);\n this.lintTokenResult(tokenName, tokenSymbol);\n }\n\n this.unresolved.delete(tokenName);\n this.notifyResolution(tokenName);\n }\n\n private resolveVirtualChildren(parent: RefPath, flattened: RefPath[]): void {\n const children = this.prefixManager.getAndRemoveVirtualChildren(parent);\n if (children.size === 0) return;\n\n const satisfied = flattened.length > 0 ? new Set(flattened) : null;\n const parentValue = this.resolved.get(parent);\n\n for (const child of children) {\n if (satisfied?.has(child) || this.referenceCache.has(child) || this.resolved.has(child)) {\n continue;\n }\n\n const error =\n parentValue instanceof Error\n ? createDependencyError(child, parent, parentValue)\n : new ProcessorError(ProcessorErrorCode.TOKEN_NOT_FOUND, {\n data: { tokenName: child },\n });\n\n this.resolved.set(child, error);\n this.callbacks?.onError?.(child, error, \"\");\n }\n }\n\n private notifyResolution(name: RefPath, flattened?: RefPath[]): void {\n this.notifier.releaseDependencies(name, flattened, this.referenceCache);\n }\n\n /**\n * Helper for ResolutionNotifier to build prefix dictionaries\n */\n private buildPrefixDictionary(prefix: string, cache: Map<string, InterpreterResult>): void {\n const dictionary = this.prefixManager.buildPrefixDictionary(prefix, cache);\n if (dictionary) {\n cache.set(prefix, dictionary);\n }\n }\n\n /**\n * Phase 5: Finalize resolution (ResolutionPhase.FINALIZE)\n * - Handle any true stragglers not caught by event-driven phase\n * - Generate errors for unresolved tokens with dependency issues\n * - Check for circular dependencies\n */\n private finalizeResolution(): void {\n const unresolvedTokens: RefPath[] = [];\n\n // Handle unresolved tokens (both regular tokens and sub-fields)\n const allTokens = new Set([...this.tokens.keys(), ...this.subFieldPaths]);\n\n for (const tokenName of allTokens) {\n if (this.resolved.has(tokenName)) continue;\n\n const isSubField = this.subFieldPaths.has(tokenName);\n\n let tokenValueStr = \"\";\n if (!isSubField) {\n const originalValue = this.tokens.get(tokenName);\n if (originalValue === undefined) continue;\n tokenValueStr = String(getTokenValue(originalValue));\n }\n\n // Check for dependency errors\n const unresolved = this.unresolved.get(tokenName);\n if (unresolved) {\n const dependencyError = this.tokenInterpreter.buildDependencyError(\n tokenName,\n unresolved.dependencies,\n this.resolved,\n this.missingDependencies,\n );\n if (dependencyError) {\n this.resolved.set(tokenName, dependencyError);\n\n if (isSubField) {\n // Call onError for sub-field with metadata\n const { parentToken, fieldPath } = this.extractSubFieldMetadata(tokenName);\n this.callbacks?.onError?.(tokenName, dependencyError, tokenValueStr, {\n isSubField: true,\n parentToken,\n fieldPath,\n });\n // Add issue under parent token with path for uniform interface\n if (parentToken) {\n this.addSubFieldIssue(parentToken, fieldPath, dependencyError);\n } else {\n this.addIssue(tokenName, dependencyError);\n }\n } else {\n this.callbacks?.onError?.(tokenName, dependencyError, tokenValueStr);\n this.addIssue(tokenName, dependencyError);\n }\n\n this.resolveVirtualChildren(tokenName, []);\n this.notifyResolution(tokenName);\n this.unresolved.delete(tokenName);\n continue;\n }\n }\n\n unresolvedTokens.push(tokenName);\n }\n\n // Process any tokens that became ready during dependency error resolution\n while (this.readyQueue.size > 0) {\n const tokenName = this.readyQueue.values().next().value as RefPath;\n this.readyQueue.delete(tokenName);\n this.resolveSingleToken(tokenName);\n }\n\n // Filter out tokens that were resolved during the ready queue processing\n const stillUnresolved = unresolvedTokens.filter((tokenName) => !this.resolved.has(tokenName));\n\n // Handle remaining unresolved tokens\n if (stillUnresolved.length > 0) {\n // Build a set of tokens that depend on missing dependencies\n const tokensWithMissingDeps = new Set<string>();\n\n // Check each unresolved token to see if it depends on missing tokens\n for (const tokenName of stillUnresolved) {\n const unresolvedData = this.unresolved.get(tokenName);\n if (unresolvedData) {\n // Check if any of its dependencies are missing\n for (const dep of unresolvedData.dependencies) {\n if (this.missingDependencies.has(dep)) {\n tokensWithMissingDeps.add(tokenName);\n break;\n }\n }\n }\n }\n\n for (const tokenName of stillUnresolved) {\n const isSubField = this.subFieldPaths.has(tokenName);\n\n let tokenValueStr = \"\";\n if (!isSubField) {\n const originalValue = this.tokens.get(tokenName);\n if (originalValue === undefined) continue;\n tokenValueStr = String(getTokenValue(originalValue));\n }\n\n // If token depends on missing dependencies, it's not a circular dependency\n // Otherwise, if it's still unresolved, it must be part of a cycle\n const dependsOnMissing = tokensWithMissingDeps.has(tokenName);\n const error = dependsOnMissing\n ? new ProcessorError(ProcessorErrorCode.TOKEN_NOT_FOUND, {\n data: { tokenName },\n })\n : new ProcessorError(ProcessorErrorCode.CIRCULAR_DEPENDENCY, {\n data: { tokens: tokenName },\n });\n\n this.resolved.set(tokenName, error);\n\n if (isSubField) {\n const { parentToken, fieldPath } = this.extractSubFieldMetadata(tokenName);\n this.callbacks?.onError?.(tokenName, error, tokenValueStr, {\n isSubField: true,\n parentToken,\n fieldPath,\n });\n // Add issue under parent token with path for uniform interface\n if (parentToken) {\n this.addSubFieldIssue(parentToken, fieldPath, error);\n } else {\n this.addIssue(tokenName, error);\n }\n } else {\n this.callbacks?.onError?.(tokenName, error, tokenValueStr);\n this.addIssue(tokenName, error);\n }\n\n this.resolveVirtualChildren(tokenName, []);\n this.notifyResolution(tokenName);\n this.unresolved.delete(tokenName);\n }\n }\n }\n}\n\n/**\n * TokenResolver - Resolves tokens with dependencies using prefix-aware resolution\n *\n * @example\n * const processor = new TokenResolver();\n * const tokens = new Map([\n * [\"a\", { $value: \"10\" }],\n * [\"b\", { $value: \"{a} * 2\" }],\n * ]);\n * const result = processor.build(tokens);\n */\nexport class TokenResolver {\n private prefixResolver?: PrefixResolver;\n private tokens?: TokenDataMap;\n private config?: Config;\n private objectParsers?: ObjectParser[];\n\n public processTokens(\n tokens: TokenInputMap,\n callbacks?: ProcessorCallbacks,\n config?: Config,\n objectParsers?: ObjectParser[],\n ): ProcessorResult {\n const resolver = new PrefixResolver({\n tokens,\n callbacks,\n config,\n objectParsers,\n });\n return resolver.resolve();\n }\n\n /**\n * Find all tokens affected by a change to the given token.\n *\n * Uses BFS traversal on the reverse dependency graph to identify\n * the changed token plus all tokens that transitively depend on it.\n *\n * @param tokenName - The token that changed\n * @returns Object containing affected tokens and a subgraph showing their relationships\n *\n * @example\n * const { resolver } = new TokenResolver().build(tokens);\n * const { tokens, subgraph } = resolver.getTokenDependencyGraph(\"color.primary\");\n * console.log(tokens); // Set(['color.primary', 'button.background', ...])\n */\n public getTokenDependencyGraph(tokenName: RefPath): {\n tokens: Set<RefPath>;\n subgraph: DependencyGraph<RefPath>;\n } {\n if (!this.prefixResolver) {\n throw new ProcessorError(ProcessorErrorCode.RESOLVER_NOT_INITIALIZED);\n }\n\n const graph = this.prefixResolver.getGraph();\n\n // Build reverse dependency graph to find dependents\n const reverseDeps = new Map<RefPath, Set<RefPath>>();\n const graphNodes = graph.getNodes();\n\n for (const [node, dependencies] of graphNodes) {\n for (const dep of dependencies) {\n if (!reverseDeps.has(dep)) {\n reverseDeps.set(dep, new Set());\n }\n reverseDeps.get(dep)?.add(node);\n }\n }\n\n // Find all tokens transitively affected by this change using BFS\n const affectedTokens = new Set<RefPath>();\n const queue: RefPath[] = [tokenName];\n const visited = new Set<RefPath>();\n\n while (queue.length > 0) {\n const current = queue.shift();\n if (current === undefined || visited.has(current)) continue;\n\n visited.add(current);\n affectedTokens.add(current);\n\n // Add all tokens that depend on this one\n const dependents = reverseDeps.get(current);\n if (dependents) {\n for (const dependent of dependents) {\n if (!visited.has(dependent)) {\n queue.push(dependent);\n }\n }\n }\n }\n\n // Build subgraph containing only affected tokens and their relationships\n const subgraph = new DependencyGraph<RefPath>();\n for (const token of affectedTokens) {\n const dependencies = graphNodes.get(token);\n if (dependencies) {\n // Only include dependencies that are also in the affected set\n const affectedDeps = new Set<RefPath>();\n for (const dep of dependencies) {\n if (affectedTokens.has(dep)) {\n affectedDeps.add(dep);\n }\n }\n subgraph.addNode(token, affectedDeps);\n } else {\n subgraph.addNode(token, []);\n }\n }\n\n return {\n tokens: affectedTokens,\n subgraph,\n };\n }\n\n public build(\n tokens: TokenDataMap,\n config?: Config,\n objectParsers?: ObjectParser[],\n ): ProcessorOutput {\n const output: ResolvedValueMap = new Map();\n\n const callbacks: ProcessorCallbacks = {\n onResolve: (tokenName, value) => {\n output.set(tokenName, value);\n },\n onError: (tokenName, _error, originalValue) => {\n // Store the original value in output for tokens with errors\n // Cast to any since originalValue can be an object for structured tokens\n output.set(tokenName, originalValue as any);\n // Errors are tracked in the issues map\n },\n };\n\n // Create and store the resolver for future updates\n this.prefixResolver = new PrefixResolver({\n tokens,\n callbacks,\n config,\n objectParsers,\n });\n this.tokens = tokens;\n this.config = config;\n this.objectParsers = objectParsers;\n\n const result = this.prefixResolver.resolve();\n\n // Filter out sub-field paths from output and issues\n const subFieldPaths = this.prefixResolver.getSubFieldPaths();\n if (subFieldPaths.size > 0) {\n for (const subFieldPath of subFieldPaths) {\n output.delete(subFieldPath);\n result.issues?.delete(subFieldPath);\n }\n }\n\n return {\n ...result,\n tokens: output,\n resolver: this,\n issues: result.issues,\n };\n }\n\n private ensureInitialized(): void {\n if (!this.prefixResolver || !this.tokens) {\n throw new ProcessorError(ProcessorErrorCode.RESOLVER_NOT_INITIALIZED);\n }\n }\n\n private normalizeTokenPath(tokenPath: string | null | undefined): string {\n return tokenPath?.trim() || \"\";\n }\n\n private createOutputCallbacks(): {\n output: ResolvedValueMap;\n callbacks: ProcessorCallbacks;\n } {\n const output: ResolvedValueMap = new Map();\n const callbacks: ProcessorCallbacks = {\n onResolve: (name, value) => {\n output.set(name, value);\n },\n onError: (_name, _error) => {\n // Errors are already tracked in the PrefixResolver's issues map\n },\n };\n return { output, callbacks };\n }\n\n private rebuildResolver(\n updatedTokens: TokenDataMap,\n callbacks: ProcessorCallbacks,\n changedTokenPath?: string,\n ): ProcessorResult {\n if (!this.prefixResolver) {\n throw new ProcessorError(ProcessorErrorCode.RESOLVER_NOT_INITIALIZED);\n }\n\n // Use the dependency graph to find tokens affected by the change.\n // Only unaffected tokens get their cached values seeded — affected tokens\n // (and deleted tokens) must be re-resolved from scratch.\n let dirtyTokens: Set<string> | null = null;\n if (changedTokenPath) {\n const graph = this.prefixResolver.getGraph();\n const { tokens: affected } = getTokenDependencyGraph(changedTokenPath, graph);\n dirtyTokens = affected;\n }\n\n const newResolver = this.prefixResolver.clone({\n tokens: updatedTokens,\n callbacks,\n });\n\n const oldCache = this.prefixResolver.getReferenceCache();\n const newCache = newResolver.getReferenceCache();\n for (const [tokenName, value] of oldCache) {\n if (!updatedTokens.has(tokenName)) continue; // deleted token\n if (dirtyTokens?.has(tokenName)) continue; // affected by change\n newCache.set(tokenName, value);\n }\n\n const result = newResolver.resolve();\n this.prefixResolver = newResolver;\n return result;\n }\n\n public updateToken(params: UpdateTokenParams): UpdateTokenResult {\n this.ensureInitialized();\n\n const { tokenPath, tokenData, tokenPathRenamed, updateReferences = false } = params;\n const prevPath = this.normalizeTokenPath(tokenPath);\n const newPath = tokenPathRenamed?.trim();\n\n if (!this.tokens || !this.tokens.has(prevPath)) {\n if (tokenData) {\n const createResult = this.createToken({\n tokenPath: prevPath,\n tokenData,\n });\n return {\n ...createResult,\n updated: false,\n };\n }\n throw new ProcessorError(ProcessorErrorCode.TOKEN_NOT_FOUND, {\n data: { tokenName: prevPath },\n });\n }\n\n const oldTokenData = this.tokens.get(prevPath);\n if (!oldTokenData) {\n throw new ProcessorError(ProcessorErrorCode.TOKEN_NOT_FOUND, {\n data: { tokenName: prevPath },\n });\n }\n\n const isRename = newPath && newPath !== prevPath;\n\n // Validate newPath doesn't already exist when renaming\n if (isRename && this.tokens.has(newPath)) {\n throw new ProcessorError(ProcessorErrorCode.TOKEN_ALREADY_EXISTS, {\n data: { tokenName: newPath },\n });\n }\n\n if (!this.prefixResolver) {\n throw new ProcessorError(ProcessorErrorCode.RESOLVER_NOT_INITIALIZED);\n }\n const currentGraph = this.prefixResolver.getGraph();\n const { tokens: affectedTokens } = getTokenDependencyGraph(prevPath, currentGraph);\n affectedTokens.delete(prevPath);\n\n const updatedTokens = new Map(this.tokens);\n\n // Handle rename with reference updates if requested\n if (isRename && updateReferences && affectedTokens.size > 0) {\n const renameMap = { [prevPath]: newPath };\n const tokenInterpreter = this.prefixResolver.getTokenInterpreter();\n\n // Update references in all dependent tokens\n for (const dependentToken of affectedTokens) {\n const dependentTokenData = updatedTokens.get(dependentToken);\n if (!dependentTokenData) continue;\n\n const dependentValue = getTokenValue(dependentTokenData);\n if (!isString(dependentValue)) continue;\n\n // Get cached AST instead of reparsing\n const ast = tokenInterpreter.getTokenAST(dependentToken);\n if (!ast) continue;\n\n // Rename references using the utility function\n const updatedValue = renameReferences(dependentValue, ast, renameMap);\n\n // Only update if there was an actual change\n if (updatedValue !== dependentValue) {\n const updatedTokenData = { ...dependentTokenData, $value: updatedValue };\n updatedTokens.set(dependentToken, updatedTokenData);\n }\n }\n }\n\n // Update/rename the token itself\n updatedTokens.delete(prevPath);\n const finalPath = isRename ? newPath : prevPath;\n updatedTokens.set(finalPath, tokenData || oldTokenData);\n this.tokens = updatedTokens;\n\n const { output, callbacks } = this.createOutputCallbacks();\n const resolverResult = this.rebuildResolver(updatedTokens, callbacks, prevPath);\n\n if (!this.prefixResolver) {\n throw new ProcessorError(ProcessorErrorCode.RESOLVER_NOT_INITIALIZED);\n }\n const { subgraph } = getTokenDependencyGraph(finalPath, this.prefixResolver.getGraph());\n\n const resolvedValue = output.get(finalPath);\n\n return {\n tokens: output,\n resolved: resolvedValue,\n issues: resolverResult.issues,\n dependants: { graph: subgraph },\n updated: true,\n };\n }\n\n public createToken(params: CreateTokenParams): CreateTokenResult {\n this.ensureInitialized();\n\n const { tokenPath, tokenData } = params;\n const normalizedTokenPath = this.normalizeTokenPath(tokenPath);\n\n if (this.tokens?.has(normalizedTokenPath)) {\n throw new ProcessorError(ProcessorErrorCode.TOKEN_ALREADY_EXISTS, {\n data: { tokenName: normalizedTokenPath },\n });\n }\n\n const updatedTokens = new Map(this.tokens);\n updatedTokens.set(normalizedTokenPath, tokenData);\n this.tokens = updatedTokens;\n\n const { output, callbacks } = this.createOutputCallbacks();\n const resolverResult = this.rebuildResolver(updatedTokens, callbacks, normalizedTokenPath);\n\n if (!this.prefixResolver) {\n throw new ProcessorError(ProcessorErrorCode.RESOLVER_NOT_INITIALIZED);\n }\n const { subgraph } = getTokenDependencyGraph(\n normalizedTokenPath,\n this.prefixResolver.getGraph(),\n );\n\n const resolvedValue = output.get(normalizedTokenPath);\n\n return {\n tokens: output,\n resolved: resolvedValue,\n issues: resolverResult.issues,\n dependants: { graph: subgraph },\n created: true,\n };\n }\n\n public deleteToken(params: DeleteTokenParams): DeleteTokenResult {\n this.ensureInitialized();\n\n const { tokenPath } = params;\n const normalizedTokenPath = this.normalizeTokenPath(tokenPath);\n\n if (!this.tokens?.has(normalizedTokenPath)) {\n throw new ProcessorError(ProcessorErrorCode.TOKEN_NOT_FOUND, {\n data: { tokenName: normalizedTokenPath },\n });\n }\n\n if (!this.prefixResolver) {\n throw new ProcessorError(ProcessorErrorCode.RESOLVER_NOT_INITIALIZED);\n }\n const currentGraph = this.prefixResolver.getGraph();\n const { subgraph } = getTokenDependencyGraph(normalizedTokenPath, currentGraph);\n\n // Remove the deleted token from the subgraph (it no longer exists)\n subgraph.removeNode(normalizedTokenPath);\n\n const updatedTokens = new Map(this.tokens);\n updatedTokens.delete(normalizedTokenPath);\n this.tokens = updatedTokens;\n\n const { output, callbacks } = this.createOutputCallbacks();\n const resolverResult = this.rebuildResolver(updatedTokens, callbacks, normalizedTokenPath);\n\n return {\n tokens: output,\n issues: resolverResult.issues,\n dependants: { graph: subgraph },\n };\n }\n\n /**\n * Resolve a single value expression against the existing warm cache.\n * No cloning, no graph rebuild, no re-parsing of other tokens.\n * Use this for lightweight preview resolution (e.g. live form input).\n *\n * **Important:** This method reads from the resolver's current cache and\n * shares its interpreter instance. It is intended for development-time\n * previews only. Callers that need isolation (e.g. speculative resolution\n * that must not observe or affect other operations) should clone the\n * `TokenResolver` first via `build()` on a copy of the token map.\n *\n * Must not be called concurrently with `updateToken`, `createToken`,\n * or `deleteToken` — those methods rebuild the internal resolver and\n * the shared interpreter state would conflict.\n */\n public resolveValue(params: ResolveValueParams): ResolveValueResult {\n this.ensureInitialized();\n\n if (!this.prefixResolver) {\n throw new ProcessorError(ProcessorErrorCode.RESOLVER_NOT_INITIALIZED);\n }\n\n const { value, type, validate } = params;\n const issues: ResolveIssue[] = [];\n\n if (value === undefined || value === null || value === \"\") {\n return { resolved: null, issues };\n }\n\n const valueStr = String(value);\n\n // Parse the expression — LanguageErrors are thrown on syntax errors\n let ast: ASTNode | null = null;\n try {\n const result = parseExpression(valueStr);\n ast = result.ast;\n } catch (error) {\n if (isLanguageError(error)) {\n issues.push(error);\n return { resolved: null, issues };\n }\n throw error;\n }\n\n if (!ast) {\n return { resolved: valueStr, issues };\n }\n\n // Interpret against the warm reference cache — no clone, no rebuild\n const tokenInterpreter = this.prefixResolver.getTokenInterpreter();\n const resolved = tokenInterpreter.interpretTokenWithAST(\"\\0__preview__\", ast);\n\n if (resolved instanceof Error) {\n if (isLanguageError(resolved)) {\n issues.push(resolved);\n }\n return { resolved: null, issues };\n }\n\n if (validate && type) {\n issues.push(...collectTypeValidationIssues(this.config, \"\\0__preview__\", type, resolved));\n }\n\n return { resolved, issues };\n }\n}\n","import type { InterpreterResult } from \"@interpreter/interpreter\";\nimport type { TokenBuilder } from \"./types\";\n\nexport class MapBuilder implements TokenBuilder<Map<string, string | InterpreterResult>> {\n readonly name = \"map\";\n protected result: Map<string, string | InterpreterResult> = new Map();\n private successfullyResolved: Map<string, InterpreterResult> = new Map();\n\n onResolve(tokenName: string, value: InterpreterResult): void {\n this.successfullyResolved.set(tokenName, value);\n this.result.set(tokenName, value);\n }\n\n onError(tokenName: string, _error: Error, originalValue: string | unknown): void {\n this.result.set(tokenName, originalValue as string);\n }\n\n getResult(): Map<string, string | InterpreterResult> {\n return this.result;\n }\n\n getResolvedTokens(): Map<string, InterpreterResult> {\n return this.successfullyResolved;\n }\n}\n","import type { Config } from \"@interpreter/config\";\nimport type { InterpreterResult } from \"@interpreter/interpreter\";\nimport {\n isTokenscriptSymbol,\n serializeInterpreterResult,\n stringifyInterpreterResult,\n} from \"@interpreter/symbols\";\nimport type { ObjectParser } from \"../object-parsers\";\nimport { getTokenError } from \"../resolver\";\nimport { type ProcessorOutput, TokenResolver } from \"../resolver/TokenResolver\";\nimport type { IssuesMap } from \"../resolver/types\";\nimport type { TokenData } from \"../utils/tokens\";\nimport { MapBuilder } from \"./MapBuilder\";\nimport type { TokenBuilder } from \"./types\";\n\nexport { serializeInterpreterResult, stringifyInterpreterResult };\n\nexport type TokenDataMap = Map<string, TokenData>;\n\nexport function toJsonObject(value: unknown): unknown {\n if (value instanceof Map) return Object.fromEntries(value);\n if (isTokenscriptSymbol(value)) return value.toJs({ stringify: true });\n return value;\n}\n\nexport function stringifyAsJson(output: unknown, indent = 2): string {\n return JSON.stringify(output, (_key, value) => toJsonObject(value), indent);\n}\n\nexport interface BuildTokensOptions<T> {\n builder?: TokenBuilder<T>;\n config?: Config;\n objectParsers?: ObjectParser[];\n}\n\n/**\n * Builds tokens from a normalized TokenDataMap.\n *\n * This is the core token processing function. For most use cases, call this directly\n * rather than using the higher-level processTokens/processTokenSets wrappers.\n *\n * @param tokens - Map of token names to TokenData. Must be pre-normalized to TokenData format.\n * @param options - Build options (all optional):\n * - builder: Custom token builder (default: MapBuilder)\n * - config: Interpreter config\n * - objectParsers: Array of object parsers\n * - linter: Lint runner\n * @returns ProcessorOutput with resolved tokens, output, and optional lint results.\n *\n * @remarks\n * Consumers must normalize input to Map<string, TokenData> before calling this function.\n * Use processTokens/processTokenSets for automatic normalization of Records and Maps.\n */\nexport function buildTokens<T = Map<string, InterpreterResult>>(\n tokens: TokenDataMap,\n options?: BuildTokensOptions<T>,\n): ProcessorOutput & {\n output: T;\n issues?: IssuesMap;\n} {\n const { config, builder = new MapBuilder(), objectParsers } = options ?? {};\n\n // Always create a MapBuilder for the tokens map output\n const tokensMapBuilder = builder.constructor === MapBuilder ? builder : new MapBuilder();\n\n // Use build() to properly initialize the resolver for CRUD operations.\n // build() stores the PrefixResolver in the TokenResolver instance, enabling\n // updateToken, createToken, and deleteToken to work on the returned resolver.\n const result = new TokenResolver().build(tokens, config, objectParsers);\n\n // Process all tokens - both successful and failed\n // Errors are now tracked in issues map\n for (const [tokenName, value] of result.tokens) {\n const error = getTokenError(result.issues, tokenName);\n\n if (error) {\n // Token has an error - get original value (keep objects as-is)\n const originalValue = tokens.get(tokenName);\n const originalValueData =\n typeof originalValue === \"string\" ? originalValue : originalValue?.$value;\n\n builder.onError(tokenName, error, originalValueData);\n\n if (builder.constructor !== MapBuilder)\n tokensMapBuilder.onError(tokenName, error, originalValueData);\n } else {\n // Token resolved successfully\n builder.onResolve(tokenName, value);\n\n if (builder.constructor !== MapBuilder) tokensMapBuilder.onResolve(tokenName, value);\n }\n }\n\n const tokensMap = tokensMapBuilder.getResult();\n const builderOutput = builder.getResult();\n const issues = result.issues;\n\n return {\n ...result,\n tokens: tokensMap,\n output: builderOutput as T,\n issues,\n resolver: result.resolver,\n };\n}\n","import type { InterpreterResult } from \"@interpreter/interpreter\";\nimport { DictionarySymbol } from \"@interpreter/symbols\";\n\nexport type FlattenCallback<T> = (key: string, value: InterpreterResult) => T;\n\n/**\n * Flatten a DictionarySymbol into key-value pairs\n *\n * @param result - The InterpreterResult to flatten (only DictionarySymbol will be flattened)\n * @param prefix - The prefix to prepend to keys\n * @param callback - Callback function that receives each flattened key-value pair\n *\n * @example\n * const result: Record<string, unknown> = {};\n * flattenChildrenObject(dictionarySymbol, \"root\", (key, value) => {\n * result[key] = value;\n * });\n */\nexport function flattenChildrenObject<T>(\n result: InterpreterResult,\n prefix: string,\n callback: FlattenCallback<T>,\n): void {\n if (result instanceof DictionarySymbol) {\n flattenChildrenMap(result.value, prefix, callback);\n }\n}\n\n/**\n * Flatten a Map structure into key-value pairs\n *\n * @param map - The map to flatten (from Dictionary.value)\n * @param prefix - The prefix to prepend to keys\n * @param callback - Callback function that receives each flattened key-value pair\n *\n * @example\n * const result = new Map<string, unknown>();\n * flattenChildrenMap(dictionarySymbol.value, \"root\", (key, value) => {\n * result.set(key, value);\n * });\n */\nexport function flattenChildrenMap<T>(\n map: Map<string, InterpreterResult>,\n prefix: string,\n callback: FlattenCallback<T>,\n): void {\n for (const [key, value] of map.entries()) {\n const newKey = `${prefix}.${key}`;\n\n if (typeof value === \"undefined\") {\n continue;\n }\n\n if (value instanceof DictionarySymbol) {\n flattenChildrenMap(value.value, newKey, callback);\n } else {\n callback(newKey, value);\n }\n }\n}\n","import type { InterpreterResult } from \"@interpreter/interpreter\";\nimport { isObject } from \"@/src/interpreter/utils/type\";\nimport { serializeInterpreterResult } from \"./base\";\nimport { flattenChildrenObject } from \"./flatten\";\nimport type { TokenBuilder } from \"./types\";\n\nfunction setNestedValue(target: Record<string, unknown>, path: string, value: unknown): void {\n if (path.length === 0) {\n return;\n }\n const segments = path.split(\".\");\n let cursor: Record<string, unknown> = target;\n for (let i = 0; i < segments.length; i++) {\n const key = segments[i];\n const isLast = i === segments.length - 1;\n if (isLast) {\n cursor[key] = value;\n return;\n }\n if (!isObject(cursor[key])) {\n cursor[key] = {};\n }\n cursor = cursor[key] as Record<string, unknown>;\n }\n}\n\n/**\n * Nested Object Builder\n *\n * Builds a nested object structure incrementally as tokens are resolved.\n * Converts flat token paths to nested structure.\n * Example: \"color.primary\" -> { color: { primary: value } }\n */\nexport class NestedObjectBuilder implements TokenBuilder<Record<string, unknown>> {\n readonly name = \"nested\";\n private result: Record<string, unknown> = {};\n\n onResolve(tokenName: string, value: InterpreterResult): void {\n const serialized = serializeInterpreterResult(value, { stringify: true });\n if (typeof serialized !== \"undefined\") {\n setNestedValue(this.result, tokenName, serialized);\n }\n }\n\n onError(tokenName: string, _error: Error, originalValue: string | unknown): void {\n // Store original value for failed tokens\n setNestedValue(this.result, tokenName, originalValue);\n }\n\n getResult(): Record<string, unknown> {\n return this.result;\n }\n}\n\n/**\n * Flat Object Builder\n *\n * Builds a flat key-value object incrementally as tokens are resolved.\n * Example: \"color.primary\" -> { \"color.primary\": value }\n */\nexport class FlatObjectBuilder implements TokenBuilder<Record<string, unknown>> {\n readonly name = \"flat\";\n private result: Record<string, unknown> = {};\n\n onResolve(tokenName: string, value: InterpreterResult): void {\n // First try to flatten the InterpreterResult directly (handles Dictionary symbols)\n let didFlatten = false;\n flattenChildrenObject(value, tokenName, (key, val) => {\n didFlatten = true;\n this.result[key] = serializeInterpreterResult(val, { stringify: true });\n });\n\n // If nothing was flattened, serialize and store the value directly\n if (!didFlatten) {\n const serialized = serializeInterpreterResult(value, { stringify: true });\n if (typeof serialized !== \"undefined\") {\n this.result[tokenName] = serialized;\n }\n }\n }\n\n onError(tokenName: string, _error: Error, originalValue: string | unknown): void {\n // Store original value for failed tokens\n this.result[tokenName] = originalValue;\n }\n\n getResult(): Record<string, unknown> {\n return this.result;\n }\n}\n","import type { InterpreterResult } from \"@interpreter/interpreter\";\nimport { stringifyInterpreterResult } from \"./base\";\nimport { MapBuilder } from \"./MapBuilder\";\n\nexport class StringMapBuilder extends MapBuilder {\n onResolve(tokenName: string, value: InterpreterResult): void {\n super.onResolve(tokenName, value);\n this.result.set(tokenName, stringifyInterpreterResult(value));\n }\n\n getResult(): Map<string, string> {\n const stringMap = new Map<string, string>();\n for (const [key, value] of this.result.entries()) {\n stringMap.set(key, typeof value === \"string\" ? value : stringifyInterpreterResult(value));\n }\n return stringMap;\n }\n}\n","import { z } from \"@tokens-studio/schema-validation\";\nimport { isObject } from \"@/src/interpreter/utils/type\";\n\n/**\n * Validation for the `$themes.json` file format used by Figma Tokens\n * Studio. NOT part of the schema language; this is application config\n * that travels alongside token sets.\n *\n * The `$themes.json` data carries many extra fields beyond what this\n * resolver consumes (`id`, `$figmaStyleReferences`,\n * `$figmaCollectionVariableIds`, etc. — Figma plugin bookkeeping).\n * The schemas below are intentionally LOOSE on every object level: in\n * zod v4 `z.object()` strips unknown keys silently rather than\n * failing, which matches what real `$themes.json` files need.\n */\n\n// Old object format: { \"core\": \"enabled\", \"semantic\": \"source\" }\nconst TokenSetStatus = z.enum([\"enabled\", \"source\"]);\nconst SelectedTokenSetsObjectSchema = z.record(z.string(), TokenSetStatus);\n\n// New array format: [{ id: \"core\", status: \"enabled\" }]\nconst SelectedTokenSetsArraySchema = z.array(\n z.object({\n id: z.string(),\n status: TokenSetStatus,\n }),\n);\n\n// Either format is accepted.\nconst SelectedTokenSetsSchema = z.union([\n SelectedTokenSetsObjectSchema,\n SelectedTokenSetsArraySchema,\n]);\n\nconst ThemeSchema = z.object({\n name: z.string(),\n selectedTokenSets: SelectedTokenSetsSchema,\n figmaCollectionId: z.string().optional(),\n figmaModeId: z.string().optional(),\n group: z.string().optional(),\n});\n\nconst ThemesArraySchema = z.array(ThemeSchema);\n\nexport type ThemesArray = z.infer<typeof ThemesArraySchema>;\nexport type Theme = z.infer<typeof ThemeSchema>;\nexport type SelectedTokenSets = z.infer<typeof SelectedTokenSetsSchema>;\nexport type SelectedTokenSetsObject = z.infer<typeof SelectedTokenSetsObjectSchema>;\nexport type SelectedTokenSetsArray = z.infer<typeof SelectedTokenSetsArraySchema>;\n\n/**\n * Selects a theme by name from an array of themes.\n *\n * @param themes - Array of themes to search through\n * @param themeName - Name of the theme to find\n * @returns The matching theme or undefined if not found\n *\n * @example\n * const themes = [\n * { name: \"light\", selectedTokenSets: { core: \"enabled\" } },\n * { name: \"dark\", selectedTokenSets: { core: \"enabled\" } },\n * ];\n * const darkTheme = selectTheme(themes, \"dark\");\n * // => { name: \"dark\", selectedTokenSets: { core: \"enabled\" } }\n */\nexport const selectTheme = (themes: ThemesArray, themeName: string): Theme | undefined => {\n return themes.find((theme) => theme.name === themeName);\n};\n\n/**\n * Selects a theme by name, or returns the first theme if no name is provided.\n *\n * @param themes - Array of themes to search through\n * @param themeName - Optional name of the theme to find\n * @returns The matching theme, first theme, or undefined if array is empty\n *\n * @example\n * const themes = [\n * { name: \"light\", selectedTokenSets: { core: \"enabled\" } },\n * { name: \"dark\", selectedTokenSets: { core: \"enabled\" } },\n * ];\n * const theme = selectThemeOrFirst(themes, \"dark\");\n * // => { name: \"dark\", selectedTokenSets: { core: \"enabled\" } }\n *\n * const defaultTheme = selectThemeOrFirst(themes);\n * // => { name: \"light\", selectedTokenSets: { core: \"enabled\" } }\n */\nexport const selectThemeOrFirst = (themes: ThemesArray, themeName?: string): Theme | undefined => {\n if (!themeName) {\n return themes[0];\n }\n\n const theme = selectTheme(themes, themeName);\n return theme ?? themes[0];\n};\n\n/**\n * Resolves themes from collected json.\n *\n * Validates the structure with zod (via the schema-validation\n * library's `z` re-export):\n * - Each theme must have a `name` string property\n * - Each theme must have a `selectedTokenSets` property in either\n * the old object format (`{ name: \"enabled\" | \"source\" }`) or the\n * new array format (`[{ id, status }]`)\n * - Optional properties: figmaCollectionId, figmaModeId, group\n * - Extra fields are silently passed through (real-world\n * `$themes.json` files carry Figma plugin bookkeeping fields).\n *\n * @param jsonFiles - Record of collected jsons from file-collector\n * @returns Tuple of [path, themes array] or undefined if no valid themes found\n */\nexport const resolveThemes = (\n jsonFiles: Record<string, unknown>,\n): [string, ThemesArray] | undefined => {\n const themesFile = jsonFiles.$themes;\n if (themesFile) {\n // First try as an object with $themes property\n if (isObject(themesFile) && \"$themes\" in themesFile) {\n const inner = ThemesArraySchema.safeParse(themesFile.$themes);\n if (inner.success) {\n return [\"$themes\", inner.data];\n }\n }\n\n // Then try as a direct array of themes\n const direct = ThemesArraySchema.safeParse(themesFile);\n if (direct.success) {\n return [\"$themes\", direct.data];\n }\n }\n\n return undefined;\n};\n\n/**\n * Extracts an ordered array of set names from selectedTokenSets.\n *\n * Handles both object and array formats:\n * - Object format: { \"core\": \"enabled\", \"semantic\": \"source\" } => [\"core\", \"semantic\"]\n * - Array format: [{ id: \"core\", status: \"enabled\" }] => [\"core\"]\n *\n * @param selectedTokenSets - The selectedTokenSets from a theme\n * @returns Array of set names in order\n *\n * @example\n * const sets = { core: \"enabled\", semantic: \"source\" };\n * const names = extractSetNames(sets);\n * // => [\"core\", \"semantic\"]\n *\n * const setsArray = [{ id: \"core\", status: \"enabled\" }];\n * const namesFromArray = extractSetNames(setsArray);\n * // => [\"core\"]\n */\nexport const extractSetNames = (selectedTokenSets: SelectedTokenSets): string[] => {\n if (Array.isArray(selectedTokenSets)) {\n return selectedTokenSets.map((set) => set.id);\n }\n return Object.keys(selectedTokenSets);\n};\n","import { ProcessorError, ProcessorErrorCode } from \"../../interpreter/errors\";\nimport { isObject } from \"../../interpreter/utils/type\";\nimport { extractSetNames, resolveThemes, selectTheme } from \"./theme-resolver\";\nimport type { TokenData } from \"./tokens\";\nimport { flattenTokensObject, isNested, normalizeToTokenData, recordToMap } from \"./tokens\";\n\nexport function determineSets(\n jsonFiles: Record<string, unknown>,\n activeSets?: string[],\n activeTheme?: string,\n): string[] {\n if (activeSets) return activeSets;\n\n if (activeTheme) {\n const resolved = resolveThemes(jsonFiles);\n if (!resolved) {\n throw new ProcessorError(ProcessorErrorCode.NO_THEMES_FOUND, {\n data: { themeName: activeTheme },\n });\n }\n\n const [, themes] = resolved;\n const theme = selectTheme(themes, activeTheme);\n\n if (!theme) {\n throw new ProcessorError(ProcessorErrorCode.THEME_NOT_FOUND, {\n data: {\n themeName: activeTheme,\n availableThemes: themes.map((t) => t.name),\n },\n });\n }\n\n return extractSetNames(theme.selectedTokenSets);\n }\n\n // Default: if normalized to single entry, use it\n const keys = Object.keys(jsonFiles);\n if (keys.length === 1) {\n return keys;\n }\n\n // If normalized to multiple entries but no selection made, we can't proceed\n if (keys.length > 1) {\n throw new ProcessorError(ProcessorErrorCode.MULTIPLE_SETS_NO_SELECTION, {\n data: { setNames: keys },\n });\n }\n\n throw new ProcessorError(ProcessorErrorCode.NO_SETS_TO_PROCESS);\n}\n\n/**\n * Converts setData to a Map of TokenData.\n * Handles Map, nested objects, and flat records.\n */\nfunction getSetTokens(setData: unknown): Map<string, TokenData> {\n if (setData instanceof Map) {\n return setData;\n }\n\n if (!isObject(setData)) {\n return new Map<string, TokenData>();\n }\n\n if (isNested(setData)) {\n return flattenTokensObject(setData, \"\");\n }\n\n return recordToMap(setData);\n}\n\n/**\n * Flattens token sets or Map inputs to a normalized TokenDataMap.\n * Handles normalization of string values to TokenData format.\n *\n * @param sets - Record of token sets or a Map of tokens\n * @param setNames - Names of sets to process (ignored if sets is a Map)\n * @returns Normalized Map<string, TokenData>\n */\nexport function flattenToTokens(\n sets: Record<string, unknown> | Map<string, unknown>,\n setNames: string[],\n): Map<string, TokenData> {\n const tokens = new Map<string, TokenData>();\n\n // For Map input, iterate directly; for Record, iterate through setNames\n const entries =\n sets instanceof Map ? sets.entries() : setNames.map((name) => [name, sets[name]] as const);\n\n for (const [key, setData] of entries) {\n if (sets instanceof Map) {\n // Direct Map entry - key is token name, setData is the value\n tokens.set(key, normalizeToTokenData(setData));\n } else {\n // Record entry - key is setName, setData is the set content\n // Check if set exists (only needed for Record lookups)\n if (!setData) {\n throw new ProcessorError(ProcessorErrorCode.TOKEN_SET_NOT_FOUND, {\n data: { setName: key },\n });\n }\n\n if (!isObject(setData) && !(setData instanceof Map)) {\n throw new ProcessorError(ProcessorErrorCode.TOKEN_SET_INVALID, {\n data: { setName: key },\n });\n }\n\n const setTokens = getSetTokens(setData);\n\n for (const [tokenKey, value] of setTokens) {\n tokens.set(tokenKey, normalizeToTokenData(value));\n }\n }\n }\n\n return tokens;\n}\n","import type { InterpreterResult } from \"../interpreter/interpreter\";\nimport { buildTokens } from \"./builders/base\";\nimport type { ProcessOptions, ProcessResult, ProcessSetsOptions } from \"./types\";\nimport { determineSets, flattenToTokens } from \"./utils/set-processor\";\nimport type { TokenData } from \"./utils/tokens\";\n\n// Main ------------------------------------------------------------------------\n\n/**\n * Process flat token collection.\n *\n * @param tokens - Token input in various formats (Map or Record)\n * @param options - Processing options\n * @returns Processed tokens with resolved values\n *\n * @note Performance optimization: If you already have a `Map<string, TokenData>`,\n * you can skip this function and call `buildTokens` directly to avoid unnecessary flattening.\n */\nexport function processTokens<T = Map<string, string | InterpreterResult>>(\n tokens: Map<string, TokenData> | Map<string, string> | Record<string, any>,\n options?: ProcessOptions,\n): ProcessResult<T> {\n const tokenDataMap =\n tokens instanceof Map ? flattenToTokens(tokens, []) : flattenToTokens({ tokens }, [\"tokens\"]);\n\n return buildTokens(tokenDataMap, options) as ProcessResult<T>;\n}\n\n/**\n * Process token sets with theme or set selection.\n */\nexport function processTokenSets<T = Map<string, string | InterpreterResult>>(\n normalizedFiles: Record<string, unknown>,\n options?: ProcessSetsOptions,\n): ProcessResult<T> {\n const { activeSets, activeTheme } = options ?? {};\n\n const setNames = determineSets(normalizedFiles, activeSets, activeTheme);\n\n const tokens = flattenToTokens(normalizedFiles, setNames);\n\n return buildTokens(tokens, options) as ProcessResult<T>;\n}\n","import {\n InterpreterError,\n LanguageError,\n LexerError,\n ParserError,\n ProcessorError,\n} from \"@src/interpreter/errors\";\nimport { createDependencyError } from \"@src/processor\";\n\nexport const errorClasses = {\n LanguageError,\n LexerError,\n ParserError,\n InterpreterError,\n ProcessorError,\n};\n\nexport const errorHelpers = {\n createDependencyError,\n};\n","// Color-kind schema shim.\n//\n// Re-exports the typed shapes from @tokens-studio/schema-validation so\n// that the rest of the interpreter can continue importing from\n// \"@interpreter/config/managers/color/schema\". The schema-validation\n// package is the cross-language source of truth for the schema language\n// (TS / Go / Ruby).\n//\n// Aliases preserve the historical interpreter names (`SpecProperty`,\n// `ColorSpecificationSchema`, `validSchemaTypes`,\n// `MINIMAL_COLOR_SPECIFICATION`) so consumer code does not have to\n// change.\n\nimport { Color, type z } from \"@tokens-studio/schema-validation\";\n\n// Types -----------------------------------------------------------------------\n\nexport type ColorSpecification = Color.ColorSpecification;\n\n/**\n * A property of a color schema (typically a channel like r/g/b/a).\n * Historical alias for the `ColorProperty` type from the\n * schema-validation library.\n */\nexport type SpecProperty = Color.ColorProperty;\n\n// Validation API --------------------------------------------------------------\n//\n// Explicit type annotations on these re-exports are required because\n// tsup's DTS bundling (rollup-plugin-dts) can't construct a public path\n// for the internal types that transitively appear in the inferred\n// return types of `Color.parseColorSpec` etc. Without the annotation\n// the DTS emit fails with TS4023 / TS2742.\n\n/**\n * Validate and parse a JSON value as a color specification. Throws a\n * `ZodError` with a structured field-by-field error report on failure.\n *\n * Strictness:\n * - Top level: unknown fields are tolerated (silently stripped).\n * - Nested shapes (ColorSchema, ColorProperty, Initializer, Conversion,\n * ColorScriptBlock): unknown fields and unsupported enum values fail.\n */\nexport const parseColorSpec: (json: unknown) => ColorSpecification = Color.parseColorSpec;\n\n/**\n * Like `parseColorSpec` but returns a `{ success, data | error }`\n * discriminated union instead of throwing.\n */\nexport const safeParseColorSpec: (json: unknown) => z.ZodSafeParseResult<ColorSpecification> =\n Color.safeParseColorSpec;\n\n/**\n * Historical compatibility alias for `parseColorSpec`. Wrap a call in a\n * `try { ... } catch (err) { ... }` to handle validation failures.\n *\n * @deprecated Prefer `parseColorSpec` / `safeParseColorSpec`.\n */\nexport const ColorSpecificationSchema: (json: unknown) => ColorSpecification = Color.parseColorSpec;\n\n// Constants -------------------------------------------------------------------\n\n/**\n * The set of valid `type` values for a color schema property.\n *\n * Hand-spelled (rather than reading `.options` off the zod enum)\n * because tsup's DTS bundling drops the value side of namespaced\n * re-exports.\n */\nexport const validSchemaTypes = [\"number\", \"string\", \"color\"] as const;\n\n// Helpers ---------------------------------------------------------------------\n\n/** Lowercased lookup name for a color spec. */\nexport const specName: (spec: ColorSpecification) => string = Color.specName;\n\n// Defaults --------------------------------------------------------------------\n\n/**\n * Minimal viable ColorSpecification for testing and defaults.\n *\n * Always passes `parseColorSpec` — see the schema-minimal regression\n * test in tests/interpreter/color/schema-minimal.test.ts.\n */\nexport const MINIMAL_COLOR_SPECIFICATION: ColorSpecification = {\n name: \"MinimalColor\",\n type: \"color\" as const,\n schema: {\n type: \"object\",\n properties: {\n value: {\n type: \"string\",\n },\n },\n },\n initializers: [\n {\n keyword: \"minimal\",\n script: {\n type: \"https://schema.example.com/tokenscript/0/\",\n script: \"return {input};\",\n },\n },\n ],\n conversions: [],\n};\n","// Function-kind schema shim.\n//\n// Re-exports the typed shapes from @tokens-studio/schema-validation so\n// that the rest of the interpreter can continue importing from\n// \"@interpreter/config/managers/functions/schema\". The schema-validation\n// package is the cross-language source of truth for the schema language\n// (TS / Go / Ruby).\n//\n// The historical alias `FunctionSpecificationSchema` is preserved for\n// consumer code that still uses the callable form.\n\nimport { Fn, type z } from \"@tokens-studio/schema-validation\";\n\n// Types -----------------------------------------------------------------------\n\nexport type FunctionSpecification = Fn.FunctionSpecification;\n\n// Validation API --------------------------------------------------------------\n//\n// Explicit type annotations on these re-exports are required because\n// tsup's DTS bundling (rollup-plugin-dts) can't construct a public path\n// for the internal types that transitively appear in the inferred\n// return types of `Fn.parseFunctionSpec` etc. Without the annotation\n// the DTS emit fails with TS4023 / TS2742.\n\n/**\n * Validate and parse a JSON value as a function specification. Throws a\n * `ZodError` with a structured field-by-field error report on failure.\n *\n * Strictness:\n * - Top level: unknown fields are tolerated (silently stripped).\n * - Nested shapes (FunctionInput, FunctionScriptBlock): unknown\n * fields are rejected.\n */\nexport const parseFunctionSpec: (json: unknown) => FunctionSpecification = Fn.parseFunctionSpec;\n\n/**\n * Like `parseFunctionSpec` but returns a `{ success, data | error }`\n * discriminated union instead of throwing.\n */\nexport const safeParseFunctionSpec: (json: unknown) => z.ZodSafeParseResult<FunctionSpecification> =\n Fn.safeParseFunctionSpec;\n\n/**\n * Historical compatibility alias for `parseFunctionSpec`. Wrap a call in\n * a `try { ... } catch (err) { ... }` to handle validation failures.\n *\n * @deprecated Prefer `parseFunctionSpec` / `safeParseFunctionSpec`.\n */\nexport const FunctionSpecificationSchema: (json: unknown) => FunctionSpecification =\n Fn.parseFunctionSpec;\n\n// Helpers ---------------------------------------------------------------------\n\n/** Lowercased lookup name for a function spec. */\nexport const specName: (spec: FunctionSpecification) => string = Fn.specName;\n","import { Config } from \"@interpreter/config\";\nimport { type ColorSpecification, parseColorSpec } from \"@interpreter/config/managers/color/schema\";\nimport {\n type FunctionSpecification,\n parseFunctionSpec,\n} from \"@interpreter/config/managers/functions/schema\";\nimport { ZodError } from \"@tokens-studio/schema-validation\";\n\n// The TokenScript schema-server response envelope. The inner `content`\n// is the actual schema specification (color or function); everything else\n// is registry metadata.\n//\n// Validated by hand here rather than via the schema-validation library\n// because the envelope is registry-server specific and not part of the\n// schema language itself. The library handles the inner `content` field.\nexport interface TokenScriptSchemaResponse {\n id: string;\n type: string;\n schema: string;\n slug: string;\n version: string;\n content: TokenScriptSchemaContent;\n license_name?: string | null;\n}\n\nexport type TokenScriptSchemaContent = ColorSpecification | FunctionSpecification;\n\nexport interface SchemaFetcherOptions {\n timeout?: number;\n headers?: Record<string, string>;\n signal?: AbortSignal;\n}\n\nfunction isPlainObject(v: unknown): v is Record<string, unknown> {\n return typeof v === \"object\" && v !== null && !Array.isArray(v);\n}\n\nfunction summarizeZodError(err: ZodError): string {\n return err.issues.map((i) => `${i.path.join(\".\") || \"<root>\"}: ${i.message}`).join(\"; \");\n}\n\n/**\n * Validate a parsed JSON value as a TokenScriptSchemaResponse envelope\n * and parse the inner `content` as a color or function specification.\n *\n * Throws an `Error` describing the first violation on failure.\n */\nfunction parseTokenScriptSchemaResponse(data: unknown): TokenScriptSchemaResponse {\n if (!isPlainObject(data)) {\n throw new Error(\"Invalid schema structure: expected an object\");\n }\n\n const requireString = (key: string): string => {\n const value = data[key];\n if (typeof value !== \"string\") {\n throw new Error(`Invalid schema structure: missing or non-string field \"${key}\"`);\n }\n return value;\n };\n\n const id = requireString(\"id\");\n const type = requireString(\"type\");\n const schema = requireString(\"schema\");\n const slug = requireString(\"slug\");\n const version = requireString(\"version\");\n\n if (!(\"content\" in data)) {\n throw new Error('Invalid schema structure: missing field \"content\"');\n }\n const rawContent = data.content;\n if (!isPlainObject(rawContent)) {\n throw new Error('Invalid schema structure: \"content\" must be an object');\n }\n\n const contentType = rawContent.type;\n let content: TokenScriptSchemaContent;\n try {\n if (contentType === \"color\") {\n content = parseColorSpec(rawContent);\n } else if (contentType === \"function\") {\n content = parseFunctionSpec(rawContent);\n } else {\n throw new Error(\n `Unsupported content.type \"${String(contentType)}\" — expected \"color\" or \"function\"`,\n );\n }\n } catch (err) {\n const detail =\n err instanceof ZodError\n ? summarizeZodError(err)\n : err instanceof Error\n ? err.message\n : String(err);\n throw new Error(`Invalid schema structure: content: ${detail}`);\n }\n\n let license_name: string | null | undefined;\n if (\"license_name\" in data) {\n const raw = data.license_name;\n if (raw !== null && raw !== undefined && typeof raw !== \"string\") {\n throw new Error('Invalid schema structure: \"license_name\" must be a string or null');\n }\n license_name = raw as string | null | undefined;\n }\n\n return { id, type, schema, slug, version, content, license_name };\n}\n\nexport async function fetchTokenScriptSchema(\n schemaUri: string,\n options: SchemaFetcherOptions = {},\n): Promise<TokenScriptSchemaResponse> {\n const { timeout = 10000, headers = {}, signal } = options;\n\n const controller = signal ? new AbortController() : new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n if (signal) {\n signal.addEventListener(\"abort\", () => controller.abort());\n }\n\n try {\n const response = await fetch(schemaUri, {\n signal: controller.signal,\n headers: {\n Accept: \"application/json\",\n \"User-Agent\": \"TokenScript-Interpreter/1.0\",\n ...headers,\n },\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status} - ${response.statusText}`);\n }\n\n const data = await response.json();\n return parseTokenScriptSchemaResponse(data);\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof Error) {\n if (error.name === \"AbortError\") {\n throw new Error(`Schema fetch timeout after ${timeout}ms`);\n }\n // Validation errors are already wrapped with \"Invalid schema structure\".\n if (\n error.message.startsWith(\"Invalid schema structure\") ||\n error.message.startsWith(\"HTTP error\")\n ) {\n throw error;\n }\n throw new Error(`Failed to fetch schema: ${error.message}`);\n }\n\n throw new Error(\"Unknown error occurred while fetching schema\");\n }\n}\n\nexport async function fetchAndRegisterSchemas(\n schemaUris: string[],\n config?: Config,\n): Promise<Config> {\n const configInstance = config || new Config();\n\n if (!schemaUris || schemaUris.length === 0) {\n return configInstance;\n }\n\n const schemas = await Promise.all(\n schemaUris.map(async (uri) => {\n const schemaResponse = await fetchTokenScriptSchema(uri);\n return {\n uri,\n schema: schemaResponse.content as ColorSpecification | FunctionSpecification,\n };\n }),\n );\n\n return configInstance.registerSchemas(schemas);\n}\n","/**\n * Utilities for working with TokenScript schema URIs\n *\n * Handles URI construction, parsing, and manipulation for the TokenScript schema registry.\n */\n\nimport { isObject, safeParseInt } from \"../interpreter/utils/type.js\";\n\nexport type SemanticVersion =\n | { major: number }\n | { major: number; minor: number }\n | { major: number; minor: number; patch: number };\n\ntype SchemaVersion = \"latest\" | SemanticVersion | null;\n\nexport interface SchemaUriComponents {\n baseUrl: string;\n category: \"schema\" | \"core\" | \"function\";\n name: string;\n version: SchemaVersion;\n}\n\nexport const DEFAULT_REGISTRY_URL = \"https://schema.tokenscript.dev.gcp.tokens.studio\";\n\nexport const DEFAULT_API_PATH = \"/api/v1\";\n\nexport function parseSemverFromString(versionString: string): SemanticVersion | null {\n const parts = versionString.split(\".\");\n const numbers: number[] = [];\n\n for (const part of parts) {\n const num = safeParseInt(part);\n if (num === null) return null;\n numbers.push(num);\n }\n\n if (numbers.length !== parts.length) return null;\n\n if (numbers.length === 3) {\n return { major: numbers[0], minor: numbers[1], patch: numbers[2] };\n }\n\n if (numbers.length === 2) {\n return { major: numbers[0], minor: numbers[1] };\n }\n\n if (numbers.length === 1) {\n return { major: numbers[0] };\n }\n\n return null;\n}\n\nexport function parseVersionString(versionString: string): SchemaVersion {\n return versionString === \"latest\" ? \"latest\" : parseSemverFromString(versionString);\n}\n\nexport function semverToString(version: SchemaVersion | undefined): string {\n if (version === undefined) {\n return \"latest\";\n }\n if (isObject(version)) {\n if (\"patch\" in version) return `${version.major}.${version.minor}.${version.patch}`;\n if (\"minor\" in version) return `${version.major}.${version.minor}`;\n return `${version.major}`;\n }\n return \"latest\";\n}\n\nexport function buildSchemaUri(\n params: Partial<SchemaUriComponents> & { category: string; name: string },\n): string {\n const { baseUrl, category, name, version } = params;\n\n const versionString = semverToString(version);\n\n const effectiveBaseUrl = baseUrl === undefined ? DEFAULT_REGISTRY_URL : baseUrl;\n\n if (effectiveBaseUrl === \"\") {\n return `${DEFAULT_API_PATH}/${category}/${name}/${versionString}/`;\n }\n\n return `${effectiveBaseUrl}${DEFAULT_API_PATH}/${category}/${name}/${versionString}/`;\n}\n\n/**\n * Parse a schema URI into its components\n *\n * @example\n * parseSchemaUri(\"https://schema.tokenscript.dev.gcp.tokens.studio/api/v1/schema/rgb-color/0.0.1/\")\n * // => { baseUrl: \"...\", category: \"schema\", name: \"rgb-color\", version: \"0.0.1\" }\n *\n * parseSchemaUri(\"/api/v1/schema/rgb-color/0.0.1/\")\n * // => { baseUrl: \"\", category: \"schema\", name: \"rgb-color\", version: \"0.0.1\" }\n */\nexport function parseSchemaUri(uri: string): SchemaUriComponents | null {\n let baseUrl = \"\";\n let pathname = uri;\n\n // Try parsing as full URL first\n try {\n const url = new URL(uri);\n baseUrl = `${url.protocol}//${url.host}`;\n pathname = url.pathname;\n } catch {\n // If URL parsing fails, treat as relative path\n // Check if it starts with a protocol (incomplete URL)\n if (uri.includes(\"://\")) {\n return null;\n }\n // It's a relative path, use as-is\n pathname = uri;\n }\n\n // Parse pathname: /api/v1/schema/rgb-color/0.0.1/\n const pathParts = pathname.split(\"/\").filter((part) => part !== \"\");\n\n // Expected format: [api, v1, category, name, version]\n if (pathParts.length < 5) {\n return null;\n }\n\n // Check if it starts with api/vN\n if (pathParts[0] !== \"api\" || !pathParts[1].startsWith(\"v\")) {\n return null;\n }\n\n const category = pathParts[2];\n if (category !== \"schema\" && category !== \"core\" && category !== \"function\") {\n return null;\n }\n\n const name = pathParts[3];\n const version = parseVersionString(pathParts[4]);\n\n return {\n baseUrl,\n category: category as \"schema\" | \"core\" | \"function\",\n name,\n version,\n };\n}\n\n/**\n * Extract the base URI without version\n *\n * @example\n * getBaseUri(\"https://.../api/v1/schema/rgb-color/0.0.1/\")\n * // => \"https://.../api/v1/schema/rgb-color/\"\n *\n * getBaseUri(\"/api/v1/schema/rgb-color/0.0.1/\")\n * // => \"/api/v1/schema/rgb-color/\"\n */\nexport function getBaseUri(uri: string): string {\n const components = parseSchemaUri(uri);\n\n if (!components) {\n return uri;\n }\n\n const { baseUrl, category, name } = components;\n\n if (baseUrl === \"\") {\n return `${DEFAULT_API_PATH}/${category}/${name}/`;\n }\n\n return `${baseUrl}${DEFAULT_API_PATH}/${category}/${name}/`;\n}\n\n/**\n * Remove version from URI (for backward compatibility)\n * Same as getBaseUri\n */\nexport function removeVersionFromUri(uri: string): string {\n return getBaseUri(uri);\n}\n\n/**\n * Parse semantic version from URI\n *\n * @example\n * parseSemverFromUri(\"https://.../api/v1/schema/rgb-color/0.0.1/\")\n * // => { major: 0, minor: 0, patch: 1 }\n */\nexport function parseSemverFromUri(uri: string): SemanticVersion | null {\n const components = parseSchemaUri(uri);\n if (!components || components.version === \"latest\" || components.version === null) {\n return null;\n }\n return components.version;\n}\n\n/**\n * Generate version resolution candidates from most specific to least specific\n *\n * @example\n * generateVersionCandidates(\"https://.../schema/rgb-color/0.0.1/\")\n * // => [\"https://.../schema/rgb-color/0.0.1/\", \"https://.../schema/rgb-color/0.0/\", ...]\n */\nexport function generateVersionCandidates(uri: string): string[] {\n const components = parseSchemaUri(uri);\n if (!components) {\n return [uri];\n }\n\n const candidates: string[] = [];\n\n // First try the original URI as-is\n candidates.push(uri);\n\n // If it's already a /latest/ URI or null, only try that\n if (components.version === \"latest\" || components.version === null) {\n return candidates;\n }\n\n // Version is a SemanticVersion object - generate less specific versions\n if (\"patch\" in components.version) {\n // Try major.minor (without patch)\n candidates.push(\n buildSchemaUri({\n ...components,\n version: { major: components.version.major, minor: components.version.minor },\n }),\n );\n }\n\n if (\"minor\" in components.version) {\n // Try major only\n candidates.push(\n buildSchemaUri({\n ...components,\n version: { major: components.version.major },\n }),\n );\n }\n\n // Finally try /latest/\n candidates.push(\n buildSchemaUri({\n ...components,\n version: \"latest\",\n }),\n );\n\n return candidates;\n}\n\n/**\n * Compare two semantic versions\n * @returns positive if v1 > v2, negative if v1 < v2, 0 if equal\n */\nexport function compareVersions(v1: SemanticVersion, v2: SemanticVersion): number {\n if (v1.major !== v2.major) return v1.major - v2.major;\n\n const v1Minor = \"minor\" in v1 ? v1.minor : 0;\n const v2Minor = \"minor\" in v2 ? v2.minor : 0;\n if (v1Minor !== v2Minor) return v1Minor - v2Minor;\n\n const v1Patch = \"patch\" in v1 ? v1.patch : 0;\n const v2Patch = \"patch\" in v2 ? v2.patch : 0;\n return v1Patch - v2Patch;\n}\n\n/**\n * Build a fetch URL for a schema (with format query parameter)\n *\n * @example\n * buildFetchUrl(\"rgb-color\", \"latest\")\n * // => \"https://.../api/v1/schema/rgb-color/latest?format=json\"\n */\nexport function buildFetchUrl(\n name: string,\n version: \"latest\" | SemanticVersion | string,\n options?: {\n baseUrl?: string;\n category?: \"schema\" | \"core\" | \"function\";\n format?: string;\n },\n): string {\n const { baseUrl = DEFAULT_REGISTRY_URL, category = \"schema\", format = \"json\" } = options || {};\n\n const versionParam = typeof version === \"string\" ? parseVersionString(version) : version;\n\n const uri = buildSchemaUri({ baseUrl, category, name, version: versionParam });\n return `${uri}?format=${format}`;\n}\n\n/**\n * Extract schema name from URI\n *\n * @example\n * extractSchemaName(\"https://.../api/v1/schema/rgb-color/0.0.1/\")\n * // => \"rgb-color\"\n */\nexport function extractSchemaName(uri: string): string | null {\n const components = parseSchemaUri(uri);\n return components?.name || null;\n}\n\n/**\n * Extract version from URI\n *\n * @example\n * extractVersion(\"https://.../api/v1/schema/rgb-color/0.0.1/\")\n * // => { major: 0, minor: 0, patch: 1 }\n */\nexport function extractVersion(uri: string): \"latest\" | SemanticVersion | null {\n const components = parseSchemaUri(uri);\n return components?.version || null;\n}\n\n/**\n * Check if URI is a core type (hex-color, tokenscript, etc)\n */\nexport function isCoreType(uri: string): boolean {\n const components = parseSchemaUri(uri);\n return components?.category === \"core\";\n}\n\n/**\n * Check if URI is a function\n */\nexport function isFunctionType(uri: string): boolean {\n const components = parseSchemaUri(uri);\n return components?.category === \"function\";\n}\n\n/**\n * Check if URI is a schema\n */\nexport function isSchemaType(uri: string): boolean {\n const components = parseSchemaUri(uri);\n return components?.category === \"schema\";\n}\n\n/**\n * Update version in existing URI\n *\n * @example\n * updateVersion(\"https://.../schema/rgb-color/0.0.1/\", \"1.0.0\")\n * // => \"https://.../schema/rgb-color/1.0.0/\"\n */\nexport function updateVersion(uri: string, newVersion: string): string {\n const components = parseSchemaUri(uri);\n if (!components) {\n throw new Error(`Invalid schema URI: ${uri}`);\n }\n\n return buildSchemaUri({ ...components, version: parseVersionString(newVersion) });\n}\n\n/**\n * Normalize URI to ensure it ends with trailing slash\n */\nexport function normalizeUri(uri: string): string {\n return uri.endsWith(\"/\") ? uri : `${uri}/`;\n}\n\n/**\n * Check if two URIs point to the same schema (ignoring version)\n *\n * @example\n * isSameSchema(\"https://.../schema/rgb-color/0.0.1/\", \"https://.../schema/rgb-color/1.0.0/\")\n * // => true\n */\nexport function isSameSchema(uri1: string, uri2: string): boolean {\n const components1 = parseSchemaUri(uri1);\n const components2 = parseSchemaUri(uri2);\n\n if (!components1 || !components2) {\n // Fallback to string comparison without version for non-parseable URIs\n const base1 = getBaseUri(uri1);\n const base2 = getBaseUri(uri2);\n return base1 === base2;\n }\n\n return (\n components1.baseUrl === components2.baseUrl &&\n components1.category === components2.category &&\n components1.name === components2.name\n );\n}\n","import {\n compareVersions as compareSchemaVersions,\n generateVersionCandidates as generateSchemaVersionCandidates,\n getBaseUri as getSchemaBaseUri,\n isSameSchema,\n parseSchemaUri,\n parseSemverFromUri as parseSchemaVersion,\n type SemanticVersion,\n} from \"@src/utils/schema-uri\";\nimport type { Config } from \"../config\";\n\ntype uri = string;\ntype specType = string;\n\n/**\n * Base manager class that provides common functionality for managing specifications,\n * conversions, and BFS-based conversion path resolution.\n */\nexport abstract class BaseManager<TSpec, TInput, TOutput> {\n protected specs: Map<uri, TSpec> = new Map();\n protected specTypes: Map<uri, specType> = new Map();\n protected conversions: Map<uri, Map<uri, (input: TInput) => TOutput>> = new Map();\n protected parentConfig?: Config;\n\n protected removeVersionFromUri(uri: uri): uri {\n return getSchemaBaseUri(uri);\n }\n\n /**\n * Check if two URIs point to the same schema (ignoring version)\n */\n protected isSameSchemaUri(uri1: uri, uri2: uri): boolean {\n return isSameSchema(uri1, uri2);\n }\n\n /**\n * Parse semantic version from URI\n * Example: \"/api/v1/schema/srgb-color/0.0.1/\" -> { major: 0, minor: 0, patch: 1 }\n */\n protected parseSemverFromUri(uri: uri): SemanticVersion | null {\n return parseSchemaVersion(uri);\n }\n\n /**\n * Get base URI without version\n * Example: \"/api/v1/schema/srgb-color/0.0.1/\" -> \"/api/v1/schema/srgb-color/\"\n */\n protected getBaseUri(uri: uri): uri {\n return getSchemaBaseUri(uri);\n }\n\n /**\n * Generate version resolution candidates from most specific to least specific\n * Example: \"0.0.1\" -> [\"0.0.1\", \"0.0\", \"0\", \"latest\"]\n */\n protected generateVersionCandidates(uri: uri): uri[] {\n return generateSchemaVersionCandidates(uri);\n }\n\n /**\n * Find the latest (highest) semantic version for a URI\n */\n protected findLatestVersion(uri: uri): uri | null {\n const source = parseSchemaUri(uri);\n if (!source) {\n return null;\n }\n\n let latestVersion: SemanticVersion | null = null;\n let latestUri: uri | null = null;\n\n for (const [specUri] of this.specs) {\n const target = parseSchemaUri(specUri);\n if (\n target &&\n target.baseUrl === source.baseUrl &&\n target.category === source.category &&\n target.name === source.name\n ) {\n const version = this.parseSemverFromUri(specUri);\n if (target.version && version) {\n if (!latestVersion || compareSchemaVersions(version, latestVersion) > 0) {\n latestVersion = version;\n latestUri = specUri;\n }\n }\n }\n }\n\n return latestUri;\n }\n\n /**\n * Resolve URI by trying version candidates from most specific to least specific\n */\n protected resolveVersionUri(uri: uri): uri | null {\n // Handle /latest/ URIs specifically\n if (uri.includes(\"/latest/\")) {\n return this.findLatestVersion(uri);\n }\n\n const candidates = this.generateVersionCandidates(uri);\n\n for (const candidate of candidates) {\n if (this.specs.has(candidate)) {\n return candidate;\n }\n\n // If we hit a /latest/ candidate, resolve it\n if (candidate.includes(\"/latest/\")) {\n const latestUri = this.findLatestVersion(candidate);\n if (latestUri) {\n return latestUri;\n }\n }\n }\n\n return null;\n }\n\n /**\n * Find a conversion path from source to target format using BFS with version resolution\n */\n protected findConversionPath(sourceUri: uri, targetUri: uri): uri[] {\n if (this.isSameSchemaUri(sourceUri, targetUri)) {\n return [sourceUri];\n }\n\n const visited = new Set<uri>();\n const normalizedSource = this.getBaseUri(sourceUri);\n visited.add(normalizedSource);\n\n const queue: Array<[uri, uri[]]> = [[sourceUri, [sourceUri]]];\n\n while (queue.length > 0) {\n const first = queue.shift();\n if (!first) break;\n const [current, path] = first;\n\n const possibleSources: uri[] = [current];\n\n const resolvedCurrent = this.resolveVersionUri(current);\n if (resolvedCurrent && resolvedCurrent !== current) {\n possibleSources.push(resolvedCurrent);\n }\n\n // Also check if there are registered conversions that could resolve TO our current URI\n for (const [registeredSource] of this.conversions) {\n const registeredSourceResolved = this.resolveVersionUri(registeredSource);\n if (registeredSourceResolved === current || registeredSource === current) {\n possibleSources.push(registeredSource);\n }\n }\n\n for (const sourceToCheck of new Set(possibleSources)) {\n const availableConversions = this.conversions.get(sourceToCheck);\n if (!availableConversions) continue;\n\n for (const uri of availableConversions.keys()) {\n if (this.isSameSchemaUri(uri, targetUri)) {\n return [...path, uri];\n }\n\n // Continue BFS\n const normalizedNext = this.getBaseUri(uri);\n if (!visited.has(normalizedNext)) {\n visited.add(normalizedNext);\n queue.push([uri, [...path, uri]]);\n }\n }\n }\n }\n\n return [];\n }\n\n /**\n * Check if a conversion path exists between source and target URIs with version resolution\n */\n public hasConversion(sourceUri: uri, targetUri: uri): boolean {\n // Try exact URIs first\n if (this.conversions.get(sourceUri)?.has(targetUri)) {\n return true;\n }\n\n const resolvedSourceUri = this.resolveVersionUri(sourceUri) || sourceUri;\n const resolvedTargetUri = this.resolveVersionUri(targetUri) || targetUri;\n\n // Try with resolved URIs\n if (this.conversions.get(resolvedSourceUri)?.has(resolvedTargetUri)) {\n return true;\n }\n\n // Check if there's a conversion from the resolved source to any URI that could resolve to our target\n const sourceConversions = this.conversions.get(resolvedSourceUri);\n if (sourceConversions) {\n for (const registeredTargetUri of sourceConversions.keys()) {\n // Check if the registered conversion target resolves to the same URI as our requested target\n const resolvedRegisteredTarget =\n this.resolveVersionUri(registeredTargetUri) || registeredTargetUri;\n if (resolvedRegisteredTarget === resolvedTargetUri) {\n return true;\n }\n }\n }\n\n const conversionPath = this.findConversionPath(resolvedSourceUri, resolvedTargetUri);\n return conversionPath.length > 0;\n }\n\n /**\n * Get a specification by its URI with version resolution\n */\n public getSpec(uri: uri): TSpec | undefined {\n // First try exact match\n const exactMatch = this.specs.get(uri);\n if (exactMatch) {\n return exactMatch;\n }\n\n // Try version resolution\n const resolvedUri = this.resolveVersionUri(uri);\n if (resolvedUri) {\n return this.specs.get(resolvedUri);\n }\n\n return undefined;\n }\n\n /**\n * Convert input through a chain of conversions to reach the target URI with version resolution\n */\n protected convertThroughPath(input: TInput, sourceUri: uri, targetUri: uri): TOutput {\n // Resolve URIs with version fallback\n const resolvedSourceUri = this.resolveVersionUri(sourceUri) || sourceUri;\n const resolvedTargetUri = this.resolveVersionUri(targetUri) || targetUri;\n\n if (resolvedSourceUri === resolvedTargetUri) {\n return input as unknown as TOutput;\n }\n\n // Try direct conversion first with resolved URIs\n const directConversionFn = this.conversions.get(resolvedSourceUri)?.get(resolvedTargetUri);\n if (directConversionFn) {\n return directConversionFn(input);\n }\n\n // If no direct conversion, find a path through intermediate conversions\n const conversionPath = this.findConversionPath(resolvedSourceUri, resolvedTargetUri);\n if (conversionPath.length === 0) {\n throw new Error(`No conversion path found from '${sourceUri}' to '${targetUri}'`);\n }\n\n // Execute the conversion chain with version resolution\n let current = input;\n for (let i = 0; i < conversionPath.length - 1; i++) {\n const fromUri = conversionPath[i];\n const toUri = conversionPath[i + 1];\n\n // Try to find conversion function using version resolution\n let conversionFn = this.conversions.get(fromUri)?.get(toUri);\n\n if (!conversionFn) {\n // Try with resolved URIs\n const resolvedFromUri = this.resolveVersionUri(fromUri) || fromUri;\n const resolvedToUri = this.resolveVersionUri(toUri) || toUri;\n\n conversionFn = this.conversions.get(resolvedFromUri)?.get(resolvedToUri);\n\n if (!conversionFn) {\n // Try to find conversion by checking all registered conversions that could match\n const fromConversions = this.conversions.get(resolvedFromUri);\n if (fromConversions) {\n for (const [registeredToUri, registeredFn] of fromConversions) {\n const resolvedRegisteredTo =\n this.resolveVersionUri(registeredToUri) || registeredToUri;\n if (resolvedRegisteredTo === resolvedToUri) {\n conversionFn = registeredFn;\n break;\n }\n }\n }\n\n // If still not found, check if there are conversions from other URIs that resolve to our fromUri\n if (!conversionFn) {\n for (const [registeredFromUri, conversions] of this.conversions) {\n const resolvedRegisteredFrom =\n this.resolveVersionUri(registeredFromUri) || registeredFromUri;\n if (resolvedRegisteredFrom === resolvedFromUri) {\n for (const [registeredToUri, registeredFn] of conversions) {\n const resolvedRegisteredTo =\n this.resolveVersionUri(registeredToUri) || registeredToUri;\n if (resolvedRegisteredTo === resolvedToUri) {\n conversionFn = registeredFn;\n break;\n }\n }\n if (conversionFn) break;\n }\n }\n }\n }\n }\n\n if (!conversionFn) {\n throw new Error(\n `Missing conversion step from '${fromUri}' to '${toUri}' in conversion path`,\n );\n }\n\n current = conversionFn(current) as unknown as TInput;\n }\n\n return current as unknown as TOutput;\n }\n\n /**\n * Register a conversion function between two URIs\n */\n protected registerConversionFunction(\n sourceUri: uri,\n targetUri: uri,\n conversionFn: (input: TInput) => TOutput,\n ): void {\n if (!this.conversions.has(sourceUri)) {\n this.conversions.set(sourceUri, new Map());\n }\n\n const sourceMap = this.conversions.get(sourceUri);\n if (sourceMap) {\n sourceMap.set(targetUri, conversionFn);\n }\n }\n\n public abstract register(uri: uri, spec: TSpec | specType): TSpec;\n\n protected abstract getSpecName(spec: TSpec): string;\n\n /**\n * Abstract method for creating a clone of the manager\n */\n public abstract clone(): this;\n\n /**\n * Set the parent config reference\n */\n public setParentConfig(config: Config) {\n this.parentConfig = config;\n }\n\n /**\n * Get the parent config reference\n */\n public getParentConfig() {\n return this.parentConfig;\n }\n\n /**\n * Creates interpreter configuration with full context for conversion functions and initializers.\n * Uses parent config if available to provide access to all managers and registrations.\n */\n protected createInterpreterConfig(references: Record<string, any>): {\n references: Record<string, any>;\n config?: Config;\n } {\n if (!this.parentConfig) {\n return { references };\n }\n\n // Use the parent config directly to ensure all registrations are available\n return {\n references,\n config: this.parentConfig,\n };\n }\n}\n","import { attributesToString, type ReassignNode } from \"@interpreter/ast\";\nimport {\n ColorErrorCode,\n InterpreterError,\n isLanguageError,\n serializeError,\n} from \"@interpreter/errors\";\nimport { parseExpression } from \"@interpreter/parser\";\nimport { ColorSymbol, type dynamicColorValue, typeEquals } from \"@interpreter/symbols\";\nimport { ensureValidAlpha, formatHex8, isTransparent } from \"@interpreter/utils/color\";\nimport { Interpreter } from \"@src/lib\";\nimport type { ISymbolType } from \"@src/types\";\nimport { buildSchemaUri, parseVersionString } from \"@src/utils/schema-uri\";\nimport { ZodError } from \"@tokens-studio/schema-validation\";\nimport { BaseManager } from \"../base-manager\";\nimport { type ColorSpecification, parseColorSpec, specName, validSchemaTypes } from \"./schema\";\n\n// Types -----------------------------------------------------------------------\n\ntype uriType = string;\n\ntype colorName = string;\n\ntype Specs = Map<uriType, ColorSpecification>;\n\ninterface FormatColorOptions {\n decimalPlaces?: number;\n removeTrailingZeros?: boolean;\n}\n\n// Defaults --------------------------------------------------------------------\n\nexport const defaultTypeSpecs: Specs = new Map([\n [\n buildSchemaUri({ category: \"core\", name: \"hex-color\", version: parseVersionString(\"0\") }),\n {\n name: \"Hex\",\n type: \"color\",\n description: \"A color in hex format, e.g. #ff0000\",\n schema: {\n type: \"object\",\n properties: {\n value: {\n type: \"string\",\n },\n },\n },\n initializers: [\n {\n title: \"Hex Color Initializer\",\n keyword: \"hex\",\n script: {\n type: \"https://schema.tokenscript.dev.gcp.tokens.studio/api/v1/core/tokenscript/0/initializer\",\n script: \"variable c: Color.Hex;\\n c.value = {input};\\nreturn c;\",\n },\n },\n ],\n conversions: [],\n },\n ],\n]);\n\n// ColorManager ----------------------------------------------------------------\n\nexport class ColorManager extends BaseManager<ColorSpecification, ColorSymbol, ColorSymbol> {\n private initializers: Map<colorName, (args: Array<ISymbolType>) => ColorSymbol> = new Map();\n\n constructor(defaultSpecs = defaultTypeSpecs) {\n super();\n for (const [uri, spec] of defaultSpecs) {\n this.register(uri, spec);\n }\n }\n\n protected getSpecName(spec: ColorSpecification): string {\n return specName(spec);\n }\n\n /**\n * Creates a clone of this class to be passed down to initializers and conversion functions\n * Links properties to the parent config.\n */\n public clone(): this {\n const colorManager = new ColorManager(new Map());\n colorManager.specs = this.specs;\n colorManager.specTypes = this.specTypes;\n colorManager.initializers = this.initializers;\n colorManager.conversions = this.conversions;\n return colorManager as this;\n }\n\n public registerRootInitializers(_uri: uriType, spec: ColorSpecification) {\n spec.initializers.forEach((spec) => {\n try {\n const { ast } = parseExpression(spec.script.script);\n const fn = (args: Array<ISymbolType>): ColorSymbol => {\n const config = this.createInterpreterConfig({ input: args });\n const result = new Interpreter(ast, config).interpret();\n if (!(result instanceof ColorSymbol)) {\n throw new InterpreterError(ColorErrorCode.INITIALIZER_CRASHED);\n }\n return result as ColorSymbol;\n };\n this.initializers.set(spec.keyword.toLowerCase(), fn);\n } catch (error) {\n throw new InterpreterError(ColorErrorCode.INITIALIZER_CONSTRUCT_FAILED, {\n data: {\n error: isLanguageError(error) ? error : serializeError(error),\n },\n });\n }\n });\n }\n\n public registerConversions(uri: uriType, spec: ColorSpecification) {\n spec.conversions.forEach((conversion) => {\n // $self replacement\n const sourceUri = conversion.source === \"$self\" ? uri : conversion.source;\n const targetUri = conversion.target === \"$self\" ? uri : conversion.target;\n\n const { ast } = parseExpression(conversion.script.script);\n const fn = (color: ColorSymbol): ColorSymbol => {\n const interpreterConfig = this.createInterpreterConfig({ input: color });\n const result = new Interpreter(ast, interpreterConfig).interpret();\n if (!(result instanceof ColorSymbol)) {\n // If the result is not a ColorSymbol, wrap it in one with the target type\n const targetSpec = this.getSpec(targetUri);\n if (!targetSpec) {\n throw new InterpreterError(ColorErrorCode.CONVERSION_TARGET_NOT_FOUND, {\n data: { targetUri },\n });\n }\n const value = typeof result === \"string\" ? result : (result?.value ?? null);\n return new ColorSymbol(value, targetSpec.name, null, this.parentConfig);\n }\n return result as ColorSymbol;\n };\n\n // Set the conversion function\n this.registerConversionFunction(sourceUri, targetUri, fn);\n });\n }\n\n public register(uri: uriType, spec: ColorSpecification | string): ColorSpecification {\n let parsedSpec: ColorSpecification;\n\n try {\n const input = typeof spec === \"string\" ? JSON.parse(spec) : spec;\n parsedSpec = parseColorSpec(input);\n } catch (err) {\n const summary =\n err instanceof ZodError\n ? err.issues.map((i) => `${i.path.join(\".\") || \"<root>\"}: ${i.message}`).join(\"; \")\n : err instanceof Error\n ? err.message\n : String(err);\n const jsonSuffix = typeof spec === \"string\" ? `\\n\\nJson:\\n${spec}` : \"\";\n throw new Error(`Invalid color specification for URI ${uri}: ${summary}${jsonSuffix}`);\n }\n\n this.specs.set(uri, parsedSpec);\n this.specTypes.set(specName(parsedSpec), uri);\n\n this.registerRootInitializers(uri, parsedSpec);\n this.registerConversions(uri, parsedSpec);\n\n return parsedSpec;\n }\n\n public getSpecByType(type: string): ColorSpecification | undefined {\n const uri = this.specTypes.get(type.toLowerCase());\n if (!uri) return;\n return this.getSpec(uri);\n }\n\n public getSpecFromColor(color: ColorSymbol): ColorSpecification | undefined {\n const key = color.subType?.toLowerCase();\n if (key) {\n return this.getSpecByType(key);\n }\n }\n\n public hasInitializer(keyword: string): boolean {\n return this.initializers.has(keyword.toLowerCase());\n }\n\n public executeInitializer(keyword: string, args: Array<ISymbolType>): ColorSymbol {\n const initFn = this.initializers.get(keyword.toLowerCase());\n if (!initFn) {\n throw new InterpreterError(ColorErrorCode.INITIALIZER_NOT_FOUND, {\n data: { keyword },\n });\n }\n return initFn(args);\n }\n\n public hasConversionByType(sourceType: string, targetType: string): boolean {\n const sourceUri = this.specTypes.get(sourceType.toLowerCase());\n const targetUri = this.specTypes.get(targetType.toLowerCase());\n\n if (!sourceUri || !targetUri) {\n return false;\n }\n\n return this.hasConversion(sourceUri, targetUri);\n }\n\n public convertTo(color: ColorSymbol, targetUri: string): ColorSymbol {\n const sourceUri = this.specTypes.get(color.subType?.toLowerCase() || \"\");\n\n if (!sourceUri) {\n throw new InterpreterError(ColorErrorCode.SOURCE_URI_NOT_FOUND, {\n data: { colorType: color.subType || \"unknown\" },\n });\n }\n\n try {\n const result = this.convertThroughPath(color, sourceUri, targetUri);\n result.alpha = color.alpha;\n return result;\n } catch (error) {\n throw new InterpreterError(ColorErrorCode.CONVERSION_ERROR, {\n data: {\n error: isLanguageError(error) ? error : serializeError(error),\n },\n });\n }\n }\n\n public convertToByType(color: ColorSymbol, targetType: string): ColorSymbol {\n // Identity conversion - return original instance without cloning\n if (color.subType?.toLowerCase() === targetType.toLowerCase()) {\n return color;\n }\n\n const targetUri = this.specTypes.get(targetType.toLowerCase());\n\n if (!targetUri) {\n throw new InterpreterError(ColorErrorCode.TARGET_URI_NOT_FOUND, {\n data: { colorType: targetType },\n });\n }\n\n return this.convertTo(color, targetUri);\n }\n\n setAttribute(color: ColorSymbol, node: ReassignNode, attributeValue: ISymbolType): ColorSymbol {\n const attributes = node.attributesStringChain();\n\n if (attributes.length !== 1) {\n throw new InterpreterError(ColorErrorCode.ATTRIBUTE_CHAIN_TOO_LONG, {\n token: node.token,\n data: {\n attributes: attributesToString(attributes),\n identifier: node.identifierToString(),\n colorType: color.subType || \"unknown\",\n },\n });\n }\n const attr = attributes[0];\n\n // alpha attribute\n if (attr === \"alpha\") {\n if (attributeValue.type !== \"Number\" && attributeValue.type !== \"Null\") {\n throw new InterpreterError(ColorErrorCode.INVALID_ATTRIBUTE_TYPE, {\n token: node.token,\n data: {\n attributeType: attributeValue.type,\n validTypes: \"Number or Null\",\n },\n });\n }\n const alphaValue = attributeValue.value as number | null;\n ensureValidAlpha(alphaValue);\n color.alpha = alphaValue;\n return color;\n }\n\n if (typeof color.value === \"string\") {\n throw new InterpreterError(ColorErrorCode.STRING_VALUE_ASSIGNMENT, {\n token: node.token,\n data: {\n attributes: attributesToString(attributes),\n identifier: node.identifierToString(),\n colorType: color.subType || \"unknown\",\n },\n });\n }\n\n const spec = this.getSpecFromColor(color);\n if (!spec) {\n throw new InterpreterError(ColorErrorCode.MISSING_SPEC, {\n token: node.token,\n data: {\n identifier: node.identifierToString(),\n colorType: color.subType || \"unknown\",\n },\n });\n }\n\n if (!spec.schema) {\n throw new InterpreterError(ColorErrorCode.MISSING_SCHEMA, {\n token: node.token,\n data: { colorType: color.subType || \"unknown\" },\n });\n }\n\n const attrSchema = spec.schema.properties[attr];\n if (!attrSchema) {\n throw new InterpreterError(ColorErrorCode.MISSING_ATTRIBUTE_SCHEMA, {\n token: node.token,\n data: {\n attribute: attr,\n identifier: node.identifierToString(),\n colorType: color.subType || \"unknown\",\n },\n });\n }\n\n if (!typeEquals(attrSchema.type, attributeValue.type)) {\n throw new InterpreterError(ColorErrorCode.INVALID_ATTRIBUTE_TYPE, {\n token: node.token,\n data: {\n attributeType: attributeValue.type,\n validTypes: validSchemaTypes.join(\", \"),\n },\n });\n }\n\n // Update the value by mutation\n const value = (color.value || {}) as dynamicColorValue;\n value[attr] = attributeValue;\n color.value = value;\n\n return color;\n }\n\n /**\n * Formats a number value, rounding to specified decimal places and optionally removing trailing zeros.\n *\n * @param value - The numeric value to format\n * @param decimalPlaces - Number of decimal places to round to\n * @param removeTrailingZeros - Whether to remove trailing zeros\n * @returns Formatted number string\n */\n private formatNumber(value: number, decimalPlaces: number, removeTrailingZeros: boolean): string {\n const rounded = Number(value.toFixed(decimalPlaces));\n const formatted = rounded.toFixed(decimalPlaces);\n\n if (removeTrailingZeros) {\n // Remove trailing zeros and decimal point if not needed\n return formatted.replace(/\\.?0+$/, \"\");\n }\n\n return formatted;\n }\n\n /**\n * Formats a ColorSymbol as a string representation using the appropriate schema-defined format.\n *\n * For hex colors (string values), returns the hex string as-is.\n * For dynamic colors (object values), uses the schema's `order` property to determine\n * parameter order and formats as a function call (e.g., \"hsl(0, 100, 50.0)\").\n * If alpha is set and less than 1, it is included as the fourth parameter.\n *\n * @param color - The ColorSymbol to format\n * @param opts - Formatting options for numeric values\n * @returns Formatted string representation of the color, or empty string if formatting fails\n *\n * @example\n * ```typescript\n * // Hex color\n * const hexColor = new ColorSymbol(\"#ff0000\", \"Hex\");\n * manager.formatColorMethod(hexColor); // \"#ff0000\"\n *\n * // HSL color with schema order [\"h\", \"s\", \"l\"]\n * const hslColor = new ColorSymbol({ h: 0, s: 100, l: 50.123456 }, \"HSL\");\n * manager.formatColorMethod(hslColor); // \"hsl(0, 100, 50.12)\"\n *\n * // RGB color with alpha\n * const rgbColor = new ColorSymbol({ r: 255, g: 0, b: 0 }, \"RGB\", undefined, 0.5);\n * manager.formatColorMethod(rgbColor); // \"rgb(255, 0, 0, 0.5)\"\n * ```\n */\n formatColorMethod(color: ColorSymbol, opts: FormatColorOptions = {}): string {\n const { decimalPlaces = 2, removeTrailingZeros = true } = opts;\n\n if (typeof color.value === \"string\") {\n // For hex colors with alpha, output hex8 format\n if (color.alpha !== null) {\n return formatHex8(color.value, color.alpha);\n }\n return color.value;\n }\n\n if (typeof color.value === \"object\" && color.value !== null && color.subType) {\n const spec = this.getSpecFromColor(color);\n if (!spec) {\n return \"\";\n }\n\n // Use schema order if available, otherwise fall back to object keys order\n const order =\n spec.schema?.order && spec.schema.order.length > 0\n ? spec.schema.order\n : Object.keys(color.value as Record<string, any>);\n\n // Extract values in the specified order\n const values = order.map((key) => {\n const valObj = (color.value as Record<string, any>)[key];\n const value = valObj?.value;\n if (typeof value === \"number\") {\n return this.formatNumber(value, decimalPlaces, removeTrailingZeros);\n }\n return value?.toString() || \"0\";\n });\n\n // Include alpha only when set and not fully opaque (< 1)\n // This follows CSS convention where alpha=1 (fully opaque) is omitted\n // Alpha=0 (fully transparent) is included to distinguish from no alpha\n if (isTransparent(color.alpha)) {\n values.push(this.formatNumber(color.alpha, decimalPlaces, removeTrailingZeros));\n }\n\n // Format as function call with the subtype name\n const functionName = color.subType.toLowerCase();\n return `${functionName}(${values.join(\", \")})`;\n }\n\n return \"\";\n }\n\n public getColorSchemas(): Map<string, ColorSpecification> {\n return this.specs;\n }\n}\n","import {\n FunctionsErrorCode,\n InterpreterError,\n isLanguageError,\n serializeError,\n} from \"@interpreter/errors\";\nimport { NumberSymbol, NumberWithUnitSymbol } from \"@interpreter/symbols\";\nimport type { ISymbolType } from \"@src/types\";\nimport type { UnitManager } from \"../unit/manager\";\n\ntype FunctionImpl = (...args: ISymbolType[]) => ISymbolType;\n\n/**\n * Extracts a numeric value from a symbol.\n * Accepts NumberSymbol, NumberWithUnitSymbol, or any symbol with a numeric value.\n */\nfunction extractNumber(arg: ISymbolType, functionName: string): number {\n if (arg === undefined || arg === null) {\n throw new InterpreterError(FunctionsErrorCode.EXPECTS_NUMBER_ARGUMENTS, {\n data: { functionName },\n });\n }\n if (arg instanceof NumberSymbol) return arg.value as number;\n if (arg instanceof NumberWithUnitSymbol) return arg.value as number;\n if (typeof arg.value === \"number\") return arg.value as number;\n throw new InterpreterError(FunctionsErrorCode.EXPECTS_NUMBER_ARGUMENTS, {\n data: { functionName },\n });\n}\n\n/**\n * Applies a function over the numeric value, preserving NumberWithUnitSymbol wrapper.\n */\nfunction over(\n arg: ISymbolType,\n fn: (value: number) => number,\n functionName: string,\n): NumberSymbol | NumberWithUnitSymbol {\n const value = extractNumber(arg, functionName);\n const result = fn(value);\n if (arg instanceof NumberWithUnitSymbol) {\n return new NumberWithUnitSymbol(result, arg.unit);\n }\n return new NumberSymbol(result);\n}\n\n/**\n * Applies a binary function over two numeric values.\n * Preserves the unit from the first argument if it's a NumberWithUnitSymbol.\n */\nfunction overTwo(\n a: ISymbolType,\n b: ISymbolType,\n fn: (aVal: number, bVal: number) => number,\n functionName: string,\n): NumberSymbol | NumberWithUnitSymbol {\n const aVal = extractNumber(a, functionName);\n const bVal = extractNumber(b, functionName);\n const result = fn(aVal, bVal);\n if (a instanceof NumberWithUnitSymbol) {\n return new NumberWithUnitSymbol(result, a.unit);\n }\n return new NumberSymbol(result);\n}\n\n/**\n * Applies a reducer function over multiple numeric values.\n * Preserves the unit from the first NumberWithUnitSymbol argument.\n */\nfunction overMany(\n args: ISymbolType[],\n fn: (nums: number[]) => number,\n functionName: string,\n minArgs?: number,\n): NumberSymbol | NumberWithUnitSymbol {\n if (minArgs !== undefined && args.length < minArgs) {\n throw new InterpreterError(FunctionsErrorCode.REQUIRES_MIN_ARGUMENTS, {\n data: { functionName, minArgs },\n });\n }\n const nums = args.map((arg) => extractNumber(arg, functionName));\n const result = fn(nums);\n const firstUnitArg = args.find((arg) => arg instanceof NumberWithUnitSymbol) as\n | NumberWithUnitSymbol\n | undefined;\n if (firstUnitArg) {\n return new NumberWithUnitSymbol(result, firstUnitArg.unit);\n }\n return new NumberSymbol(result);\n}\n\n/**\n * Creates a sum function with optional unit manager getter for unit conversion.\n * Uses a getter to allow lazy access to the unit manager.\n */\nexport function createSumFunction(getUnitManager?: () => UnitManager | undefined): FunctionImpl {\n return (...args: ISymbolType[]): ISymbolType => {\n if (args.length < 2)\n throw new InterpreterError(FunctionsErrorCode.REQUIRES_MIN_ARGUMENTS, {\n data: { functionName: \"sum\", minArgs: 2 },\n });\n\n const hasUnits = args.some((arg) => arg instanceof NumberWithUnitSymbol);\n\n if (!hasUnits) {\n const nums = args.map((arg) => extractNumber(arg, \"sum\"));\n return new NumberSymbol(nums.reduce((acc, val) => acc + val, 0));\n }\n\n const numericArgs = args.filter(\n (arg) => arg instanceof NumberSymbol || arg instanceof NumberWithUnitSymbol,\n ) as Array<NumberSymbol | NumberWithUnitSymbol>;\n\n if (numericArgs.length !== args.length) {\n throw new InterpreterError(FunctionsErrorCode.EXPECTS_NUMBER_ARGUMENTS, {\n data: { functionName: \"sum\" },\n });\n }\n\n const unitManager = getUnitManager?.();\n if (unitManager) {\n try {\n const converted = unitManager.convertToCommonFormat(numericArgs);\n const sum = converted.reduce((acc, arg) => acc + (arg.value as number), 0);\n\n const firstUnitArg = converted.find(\n (arg) => arg instanceof NumberWithUnitSymbol,\n ) as NumberWithUnitSymbol;\n\n if (firstUnitArg) {\n return new NumberWithUnitSymbol(sum, firstUnitArg.unit);\n }\n return new NumberSymbol(sum);\n } catch (error) {\n throw new InterpreterError(FunctionsErrorCode.UNIT_CONVERSION_FAILED, {\n data: {\n functionName: \"sum\",\n error: isLanguageError(error) ? error : serializeError(error),\n },\n });\n }\n }\n\n // Fallback: sum without conversion\n const firstUnitArg = args.find(\n (arg) => arg instanceof NumberWithUnitSymbol,\n ) as NumberWithUnitSymbol;\n\n const nums = args.map((arg) => extractNumber(arg, \"sum\"));\n const sum = nums.reduce((acc, val) => acc + val, 0);\n\n if (firstUnitArg) {\n return new NumberWithUnitSymbol(sum, firstUnitArg.unit);\n }\n return new NumberSymbol(sum);\n };\n}\n\nexport const mathFunctions: Record<string, FunctionImpl> = {\n min: (...args: ISymbolType[]) => overMany(args, (nums) => Math.min(...nums), \"min\", 1),\n\n max: (...args: ISymbolType[]) => overMany(args, (nums) => Math.max(...nums), \"max\", 1),\n\n mod: (a: ISymbolType, b: ISymbolType) =>\n overTwo(\n a,\n b,\n (aVal, bVal) => {\n if (bVal === 0)\n throw new InterpreterError(FunctionsErrorCode.DIVISION_BY_ZERO, {\n data: { functionName: \"mod\" },\n });\n return ((aVal % bVal) + bVal) % bVal;\n },\n \"mod\",\n ),\n\n average: (...args: ISymbolType[]) =>\n overMany(args, (nums) => nums.reduce((acc, val) => acc + val, 0) / nums.length, \"average\", 1),\n\n round: (arg: ISymbolType) => over(arg, Math.round, \"round\"),\n abs: (arg: ISymbolType) => over(arg, Math.abs, \"abs\"),\n sqrt: (arg: ISymbolType) => over(arg, Math.sqrt, \"sqrt\"),\n floor: (arg: ISymbolType) => over(arg, Math.floor, \"floor\"),\n ceil: (arg: ISymbolType) => over(arg, Math.ceil, \"ceil\"),\n cbrt: (arg: ISymbolType) => over(arg, Math.cbrt, \"cbrt\"),\n sign: (arg: ISymbolType) => new NumberSymbol(Math.sign(extractNumber(arg, \"sign\"))),\n trunc: (arg: ISymbolType) => over(arg, Math.trunc, \"trunc\"),\n exp: (arg: ISymbolType) => over(arg, Math.exp, \"exp\"),\n expm1: (arg: ISymbolType) => over(arg, Math.expm1, \"expm1\"),\n\n pow: (base: ISymbolType, exp: ISymbolType) => overTwo(base, exp, (b, e) => b ** e, \"pow\"),\n\n round_to: (value: ISymbolType, precision?: ISymbolType) => {\n const precisionValue = precision !== undefined ? extractNumber(precision, \"round_to\") : 0;\n const fn =\n precisionValue === 0\n ? Math.round\n : (v: number) => {\n const factor = 10 ** precisionValue;\n return Math.round(v * factor) / factor;\n };\n return over(value, fn, \"round_to\");\n },\n\n hypot: (...args: ISymbolType[]) => overMany(args, (nums) => Math.hypot(...nums), \"hypot\", 1),\n\n remainder: (a: ISymbolType, b: ISymbolType) =>\n overTwo(\n a,\n b,\n (aVal, bVal) => {\n if (bVal === 0)\n throw new InterpreterError(FunctionsErrorCode.DIVISION_BY_ZERO, {\n data: { functionName: \"remainder\" },\n });\n return aVal % bVal;\n },\n \"remainder\",\n ),\n\n // Trigonometric functions\n sin: (arg: ISymbolType) => over(arg, Math.sin, \"sin\"),\n cos: (arg: ISymbolType) => over(arg, Math.cos, \"cos\"),\n tan: (arg: ISymbolType) => over(arg, Math.tan, \"tan\"),\n atan: (arg: ISymbolType) => over(arg, Math.atan, \"atan\"),\n\n asin: (arg: ISymbolType) => {\n const value = extractNumber(arg, \"asin\");\n if (value < -1 || value > 1)\n throw new InterpreterError(FunctionsErrorCode.ARGUMENT_OUT_OF_RANGE, {\n data: { functionName: \"asin\", constraint: \"between -1 and 1\" },\n });\n return over(arg, Math.asin, \"asin\");\n },\n\n acos: (arg: ISymbolType) => {\n const value = extractNumber(arg, \"acos\");\n if (value < -1 || value > 1)\n throw new InterpreterError(FunctionsErrorCode.ARGUMENT_OUT_OF_RANGE, {\n data: { functionName: \"acos\", constraint: \"between -1 and 1\" },\n });\n return over(arg, Math.acos, \"acos\");\n },\n\n atan2: (y: ISymbolType, x: ISymbolType): NumberSymbol => {\n const yVal = extractNumber(y, \"atan2\");\n const xVal = extractNumber(x, \"atan2\");\n return new NumberSymbol(Math.atan2(yVal, xVal));\n },\n\n // Hyperbolic functions\n sinh: (arg: ISymbolType) => over(arg, Math.sinh, \"sinh\"),\n cosh: (arg: ISymbolType) => over(arg, Math.cosh, \"cosh\"),\n tanh: (arg: ISymbolType) => over(arg, Math.tanh, \"tanh\"),\n asinh: (arg: ISymbolType) => over(arg, Math.asinh, \"asinh\"),\n\n acosh: (arg: ISymbolType) => {\n const value = extractNumber(arg, \"acosh\");\n if (value < 1) {\n throw new InterpreterError(FunctionsErrorCode.ARGUMENT_OUT_OF_RANGE, {\n data: {\n functionName: \"acosh\",\n constraint: \"greater than or equal to 1\",\n },\n });\n }\n return over(arg, Math.acosh, \"acosh\");\n },\n\n atanh: (arg: ISymbolType) => {\n const value = extractNumber(arg, \"atanh\");\n if (value <= -1 || value >= 1) {\n throw new InterpreterError(FunctionsErrorCode.ARGUMENT_OUT_OF_RANGE, {\n data: {\n functionName: \"atanh\",\n constraint: \"between -1 and 1 (exclusive)\",\n },\n });\n }\n return over(arg, Math.atanh, \"atanh\");\n },\n\n // Logarithmic functions\n log: (arg: ISymbolType, base?: ISymbolType): NumberSymbol | NumberWithUnitSymbol => {\n const value = extractNumber(arg, \"log\");\n if (value <= 0)\n throw new InterpreterError(FunctionsErrorCode.ARGUMENT_OUT_OF_RANGE, {\n data: { functionName: \"log\", constraint: \"positive\" },\n });\n if (base === undefined) {\n return over(arg, Math.log, \"log\");\n }\n const baseValue = extractNumber(base, \"log\");\n if (baseValue <= 0 || baseValue === 1)\n throw new InterpreterError(FunctionsErrorCode.INVALID_BASE, {\n data: {\n functionName: \"log\",\n constraint: \"positive and not equal to 1\",\n },\n });\n return over(arg, (v) => Math.log(v) / Math.log(baseValue), \"log\");\n },\n\n ln: (arg: ISymbolType) => {\n const value = extractNumber(arg, \"ln\");\n if (value <= 0) {\n throw new InterpreterError(FunctionsErrorCode.ARGUMENT_OUT_OF_RANGE, {\n data: { functionName: \"ln\", constraint: \"positive\" },\n });\n }\n return over(arg, Math.log, \"ln\");\n },\n\n log10: (arg: ISymbolType) => {\n const value = extractNumber(arg, \"log10\");\n if (value <= 0) {\n throw new InterpreterError(FunctionsErrorCode.ARGUMENT_OUT_OF_RANGE, {\n data: { functionName: \"log10\", constraint: \"positive\" },\n });\n }\n return over(arg, Math.log10, \"log10\");\n },\n\n log2: (arg: ISymbolType) => {\n const value = extractNumber(arg, \"log2\");\n if (value <= 0) {\n throw new InterpreterError(FunctionsErrorCode.ARGUMENT_OUT_OF_RANGE, {\n data: { functionName: \"log2\", constraint: \"positive\" },\n });\n }\n return over(arg, Math.log2, \"log2\");\n },\n\n log1p: (arg: ISymbolType) => {\n const value = extractNumber(arg, \"log1p\");\n if (value < -1) {\n throw new InterpreterError(FunctionsErrorCode.ARGUMENT_OUT_OF_RANGE, {\n data: {\n functionName: \"log1p\",\n constraint: \"greater than or equal to -1\",\n },\n });\n }\n return over(arg, Math.log1p, \"log1p\");\n },\n\n // Constants\n pi: (): NumberSymbol => new NumberSymbol(Math.PI),\n};\n","import {\n FunctionsErrorCode,\n InterpreterError,\n isLanguageError,\n serializeError,\n} from \"@interpreter/errors\";\nimport { Interpreter } from \"@interpreter/interpreter\";\nimport { Lexer } from \"@interpreter/lexer\";\nimport { Parser } from \"@interpreter/parser\";\nimport { BooleanSymbol, ListSymbol, NumberSymbol, StringSymbol } from \"@interpreter/symbols\";\nimport type { ISymbolType, Token } from \"@src/types\";\nimport { ZodError } from \"@tokens-studio/schema-validation\";\nimport { BaseManager } from \"../base-manager\";\n\nimport { createSumFunction, mathFunctions } from \"./builtin/math\";\n\nimport { type FunctionSpecification, parseFunctionSpec } from \"./schema\";\n\ntype functionName = string;\ntype FunctionImpl = (...args: ISymbolType[]) => ISymbolType;\n\nexport class FunctionsManager extends BaseManager<\n FunctionSpecification,\n ISymbolType[],\n ISymbolType\n> {\n private functionMap: Map<functionName, FunctionImpl> = new Map();\n\n constructor() {\n super();\n this.setupBuiltinFunctions();\n }\n\n protected getSpecName(spec: FunctionSpecification): string {\n return spec.keyword;\n }\n\n public clone(): this {\n const functionsManager = new FunctionsManager();\n functionsManager.specs = this.specs;\n functionsManager.specTypes = this.specTypes;\n functionsManager.functionMap = this.functionMap;\n functionsManager.conversions = this.conversions;\n return functionsManager as this;\n }\n\n public register(name: functionName, spec: FunctionSpecification | string): FunctionSpecification {\n let parsedSpec: FunctionSpecification;\n\n try {\n const input = typeof spec === \"string\" ? JSON.parse(spec) : spec;\n parsedSpec = parseFunctionSpec(input);\n } catch (err) {\n const summary =\n err instanceof ZodError\n ? err.issues.map((i) => `${i.path.join(\".\") || \"<root>\"}: ${i.message}`).join(\"; \")\n : err instanceof Error\n ? err.message\n : String(err);\n throw new Error(`Invalid function specification for ${name}: ${summary}`);\n }\n\n const functionName = parsedSpec.keyword.toLowerCase();\n this.specs.set(functionName, parsedSpec);\n this.specTypes.set(parsedSpec.name.toLowerCase(), functionName);\n\n // Register the dynamic function implementation\n this.registerDynamicFunction(parsedSpec);\n\n return parsedSpec;\n }\n\n private setupBuiltinFunctions(): void {\n // Register all math functions\n for (const [name, impl] of Object.entries(mathFunctions)) {\n this.registerFunction(name, impl);\n }\n\n // Register sum with unit manager access (lazy getter for deferred resolution)\n this.registerFunction(\n \"sum\",\n createSumFunction(() => this.parentConfig?.unitManager),\n );\n\n // Utility functions\n this.registerFunction(\n \"parse_int\",\n (strSymbol: ISymbolType, baseSymbol?: ISymbolType): NumberSymbol => {\n if (!(strSymbol instanceof StringSymbol))\n throw new InterpreterError(FunctionsErrorCode.EXPECTS_TYPE_ARGUMENT, {\n data: { functionName: \"parse_int\", expectedType: \"string\", argumentPosition: \"first\" },\n });\n const base = baseSymbol instanceof NumberSymbol ? (baseSymbol.value as number) : 10;\n const parsed = Number.parseInt(strSymbol.value as string, base);\n if (Number.isNaN(parsed))\n throw new InterpreterError(FunctionsErrorCode.PARSE_ERROR, {\n data: { functionName: \"parse_int\", value: String(strSymbol.value), base },\n });\n return new NumberSymbol(parsed);\n },\n );\n\n this.registerFunction(\"linear-gradient\", (...args: ISymbolType[]): StringSymbol => {\n const stringArgs = args.map((arg) => arg.toString()).join(\", \");\n return new StringSymbol(`linear-gradient(${stringArgs})`);\n });\n\n this.registerFunction(\"type\", (arg: ISymbolType): StringSymbol => {\n const typeName = arg.getTypeName();\n\n if (typeName.includes(\".\")) {\n const parts = typeName.split(\".\");\n return new StringSymbol(parts[parts.length - 1].toLowerCase());\n }\n\n return new StringSymbol(typeName.toLowerCase());\n });\n\n // Type predicate functions\n this.registerFunction(\"is_null\", (arg: ISymbolType): BooleanSymbol => {\n return new BooleanSymbol(arg.type === \"Null\");\n });\n\n this.registerFunction(\"is_number\", (arg: ISymbolType): BooleanSymbol => {\n return new BooleanSymbol(arg.type === \"Number\");\n });\n\n this.registerFunction(\"is_string\", (arg: ISymbolType): BooleanSymbol => {\n return new BooleanSymbol(arg.type === \"String\");\n });\n\n this.registerFunction(\"is_boolean\", (arg: ISymbolType): BooleanSymbol => {\n return new BooleanSymbol(arg.type === \"Boolean\");\n });\n\n this.registerFunction(\"is_list\", (arg: ISymbolType): BooleanSymbol => {\n return new BooleanSymbol(arg.type === \"List\");\n });\n\n this.registerFunction(\"is_number_with_unit\", (arg: ISymbolType): BooleanSymbol => {\n return new BooleanSymbol(arg.type === \"NumberWithUnit\");\n });\n\n this.registerFunction(\"is_dictionary\", (arg: ISymbolType): BooleanSymbol => {\n return new BooleanSymbol(arg.type === \"Dictionary\");\n });\n\n this.registerFunction(\"is_token\", (arg: ISymbolType): BooleanSymbol => {\n return new BooleanSymbol(arg.type === \"Token\");\n });\n\n this.registerFunction(\"is_color\", (arg: ISymbolType): BooleanSymbol => {\n return new BooleanSymbol(arg.type === \"Color\");\n });\n\n // range(count) or range(start, end) — generate list of integers\n this.registerFunction(\"range\", (...args: ISymbolType[]): ListSymbol => {\n if (args.length < 1 || args.length > 2) {\n throw new InterpreterError(FunctionsErrorCode.REQUIRES_MIN_ARGUMENTS, {\n data: { functionName: \"range\", minArgs: 1 },\n });\n }\n\n let start: number;\n let end: number;\n\n if (args.length === 1) {\n // range(count) → [0, 1, ..., count-1]\n if (!(args[0] instanceof NumberSymbol)) {\n throw new InterpreterError(FunctionsErrorCode.EXPECTS_TYPE_ARGUMENT, {\n data: { functionName: \"range\", expectedType: \"Number\", argumentPosition: \"first\" },\n });\n }\n const v = args[0].value as number;\n if (v !== Math.trunc(v) || Number.isNaN(v) || !Number.isFinite(v) || v < 0 || v > 1e6) {\n throw new InterpreterError(FunctionsErrorCode.ARGUMENT_OUT_OF_RANGE, {\n data: {\n functionName: \"range\",\n constraint: `count must be a non-negative integer <= 1000000, got ${v}`,\n },\n });\n }\n start = 0;\n end = v;\n } else {\n // range(start, end) → [start, start+1, ..., end-1]\n if (!(args[0] instanceof NumberSymbol)) {\n throw new InterpreterError(FunctionsErrorCode.EXPECTS_TYPE_ARGUMENT, {\n data: { functionName: \"range\", expectedType: \"Number\", argumentPosition: \"first\" },\n });\n }\n if (!(args[1] instanceof NumberSymbol)) {\n throw new InterpreterError(FunctionsErrorCode.EXPECTS_TYPE_ARGUMENT, {\n data: { functionName: \"range\", expectedType: \"Number\", argumentPosition: \"second\" },\n });\n }\n const sv = args[0].value as number;\n const ev = args[1].value as number;\n if (\n sv !== Math.trunc(sv) ||\n ev !== Math.trunc(ev) ||\n Number.isNaN(sv) ||\n Number.isNaN(ev) ||\n !Number.isFinite(sv) ||\n !Number.isFinite(ev)\n ) {\n throw new InterpreterError(FunctionsErrorCode.ARGUMENT_OUT_OF_RANGE, {\n data: {\n functionName: \"range\",\n constraint: `arguments must be integers, got ${sv} and ${ev}`,\n },\n });\n }\n if (ev - sv > 1e6) {\n throw new InterpreterError(FunctionsErrorCode.ARGUMENT_OUT_OF_RANGE, {\n data: {\n functionName: \"range\",\n constraint: `size exceeds limit (1000000), got ${ev - sv}`,\n },\n });\n }\n start = sv;\n end = ev;\n }\n\n if (end < start) {\n return new ListSymbol([], false);\n }\n\n const elements: NumberSymbol[] = [];\n for (let i = start; i < end; i++) {\n elements.push(new NumberSymbol(i));\n }\n return new ListSymbol(elements, false);\n });\n }\n\n private registerFunction(name: string, impl: FunctionImpl): void {\n this.functionMap.set(name.toLowerCase(), impl);\n }\n\n private registerDynamicFunction(spec: FunctionSpecification): void {\n const functionName = spec.keyword.toLowerCase();\n const script = spec.script.script;\n\n const impl: FunctionImpl = (...args: ISymbolType[]): ISymbolType => {\n try {\n // Create a config instance for the dynamic function execution\n const config = this.parentConfig?.clone();\n if (!config) {\n throw new InterpreterError(FunctionsErrorCode.NO_CONFIG_AVAILABLE, {\n data: { functionName },\n });\n }\n\n // Parse and execute the script\n const lexer = new Lexer(script);\n const ast = new Parser(lexer).parse();\n const interpreter = new Interpreter(ast, {\n references: { input: args },\n config,\n });\n\n const result = interpreter.interpret();\n if (result === null) {\n throw new InterpreterError(FunctionsErrorCode.FUNCTION_RETURNED_NULL, {\n data: { functionName },\n });\n }\n\n // Handle string results by converting them to StringSymbol\n if (typeof result === \"string\") {\n return new StringSymbol(result);\n }\n\n return result;\n } catch (error) {\n throw new InterpreterError(FunctionsErrorCode.EXECUTION_ERROR, {\n data: {\n functionName,\n error: isLanguageError(error) ? error : serializeError(error),\n },\n });\n }\n };\n\n this.functionMap.set(functionName, impl);\n }\n\n public getFunction(name: string): FunctionImpl | undefined {\n return this.functionMap.get(name.toLowerCase());\n }\n\n public hasFunction(name: string): boolean {\n return this.functionMap.has(name.toLowerCase());\n }\n\n public getFunctionNames(): string[] {\n return Array.from(this.functionMap.keys());\n }\n\n public getFunctionSchemas(): Map<string, FunctionSpecification> {\n return this.specs;\n }\n\n /**\n * Validate that a function call has the correct number of arguments\n * based on its schema spec. Only validates schema-registered functions\n * (not builtins which handle their own argument validation).\n */\n public validateFunctionArgs(name: string, args: ISymbolType[], token?: Token): void {\n const fnName = name.toLowerCase();\n const spec = this.specs.get(fnName);\n\n if (!spec?.input?.properties) return;\n\n const requiredCount = Object.values(spec.input.properties).filter(\n (prop: any) => !prop?.optional,\n ).length;\n if (args.length < requiredCount) {\n throw new InterpreterError(FunctionsErrorCode.REQUIRES_MIN_ARGUMENTS, {\n token,\n data: { functionName: name, minArgs: requiredCount },\n });\n }\n }\n}\n","// Token-kind schema shim.\n//\n// Re-exports the typed shapes from @tokens-studio/schema-validation so that\n// the rest of the interpreter can continue importing from\n// \"@interpreter/config/managers/token/schema\". The schema-validation\n// package is the cross-language source of truth for the schema language\n// (TS / Go / Ruby).\n//\n// Aliases preserve the historical interpreter names (`SpecProperty`,\n// `SpecItemsType`, `TokenSpecificationSchema`) so consumer code does not\n// have to change.\n\nimport { Token, type z } from \"@tokens-studio/schema-validation\";\n\n// Types -----------------------------------------------------------------------\n\nexport type TokenSpecification = Token.TokenSpecification;\n\n/**\n * A property of a token's structural schema. Historical alias for the\n * recursive `Property` type from the schema-validation library; the\n * `z.infer` form is needed because tsup's DTS bundling drops the\n * type side of the value+type merged export through `* as Token`.\n */\nexport type SpecProperty = z.infer<typeof Token.Property>;\n\n/**\n * The shape of items inside a list-typed property/schema. Historical\n * alias for the `ItemsSpec` type from the schema-validation library;\n * see {@link SpecProperty} for why `z.infer` is needed.\n */\nexport type SpecItemsType = z.infer<typeof Token.ItemsSpec>;\n\n// Validation API --------------------------------------------------------------\n//\n// Explicit type annotations on these re-exports are required because\n// tsup's DTS bundling (rollup-plugin-dts) can't construct a public path\n// for the internal `Property` / `ItemsSpec` / zod types that transitively\n// appear in the inferred return types of `Token.parseTokenSpec` etc.\n// Without the annotation the DTS emit fails with TS4023 / TS2742.\n\n/**\n * Validate and parse a JSON value as a token specification. Throws a\n * `ZodError` with a structured field-by-field error report on failure.\n *\n * Strictness:\n * - Top level: unknown fields are tolerated (silently stripped).\n * - Nested shapes (Schema, Property, ItemsSpec, ScriptBlock):\n * unknown fields and unsupported enum values fail.\n */\nexport const parseTokenSpec: (json: unknown) => TokenSpecification = Token.parseTokenSpec;\n\n/**\n * Like `parseTokenSpec` but returns a `{ success, data | error }`\n * discriminated union instead of throwing.\n */\nexport const safeParseTokenSpec: (json: unknown) => z.ZodSafeParseResult<TokenSpecification> =\n Token.safeParseTokenSpec;\n\n/**\n * Historical compatibility alias for `parseTokenSpec`. Wrap a call in a\n * `try { ... } catch (err) { ... }` to handle validation failures.\n *\n * @deprecated Prefer `parseTokenSpec` / `safeParseTokenSpec`.\n */\nexport const TokenSpecificationSchema: (json: unknown) => TokenSpecification = Token.parseTokenSpec;\n\n// Constants -------------------------------------------------------------------\n\n/**\n * The set of valid `type` values for a token schema.\n *\n * Mirrored as a plain array for use in error messages and for backwards\n * compatibility with the previous arktype declaration. Hand-spelled\n * (rather than reading `.options` off the zod enum) because tsup's DTS\n * bundling drops the value side of namespaced re-exports — see\n * {@link SpecProperty} for the same workaround.\n */\nexport const validSchemaTypes = [\"number\", \"string\", \"token\", \"object\", \"list\"] as const;\n\n// Helpers ---------------------------------------------------------------------\n\n/** Lowercased lookup name for a token spec. */\nexport const specName: (spec: TokenSpecification) => string = Token.specName;\n","import { filterAST, ReturnNode, StringNode } from \"@interpreter/ast\";\nimport { Interpreter } from \"@interpreter/interpreter\";\nimport { Lexer } from \"@interpreter/lexer\";\nimport { Parser } from \"@interpreter/parser\";\nimport {\n BooleanSymbol,\n DictionarySymbol,\n ListSymbol,\n StringSymbol,\n TokenSymbol,\n} from \"@interpreter/symbols\";\nimport type { ASTNode, ISymbolType } from \"@src/types\";\nimport { ZodError } from \"@tokens-studio/schema-validation\";\nimport { BaseManager } from \"../base-manager\";\nimport {\n parseTokenSpec,\n type SpecItemsType,\n type SpecProperty,\n specName,\n type TokenSpecification,\n} from \"./schema\";\n\ntype uriType = string;\n\n/**\n * Result of validating a token value.\n * For nested validation failures, path indicates where the error occurred.\n */\nexport interface ValidationResult {\n valid: boolean;\n error?: string;\n tokenType?: string;\n path?: (string | number)[]; // Path for nested errors, e.g., [\"fontSize\"] or [\"shadows\", 0, \"blur\"]\n}\n\n/** Maximum depth for nested token validation to prevent stack overflow */\nconst MAX_VALIDATION_DEPTH = 10;\n\nexport class TokenManager extends BaseManager<TokenSpecification, TokenSymbol, TokenSymbol> {\n /**\n * TokenScript validation scripts by token type.\n * The script receives {input} as the value to validate.\n * Should return true if valid, or a string error code if invalid.\n */\n private validationScripts: Map<string, string> = new Map();\n\n /**\n * Cached parsed ASTs for validation scripts.\n * Avoids re-parsing the same script on every validation call.\n */\n private validationAstCache = new Map<string, ASTNode | null>();\n\n /**\n * Cached Interpreter instances for validation scripts.\n * Reusing interpreters avoids recreating Config, SymbolTable, etc.\n */\n private validationInterpreterCache = new Map<string, Interpreter>();\n\n protected getSpecName(spec: TokenSpecification): string {\n return specName(spec);\n }\n\n public getSpecByType(type: string): TokenSpecification | undefined {\n const uri = this.specTypes.get(type.toLowerCase());\n if (!uri) return;\n return this.getSpec(uri);\n }\n\n public clone(): this {\n const tokenManager = new TokenManager();\n tokenManager.specs = new Map(this.specs);\n tokenManager.specTypes = new Map(this.specTypes);\n tokenManager.conversions = new Map(this.conversions);\n tokenManager.validationScripts = new Map(this.validationScripts);\n tokenManager.validationAstCache = new Map(this.validationAstCache);\n tokenManager.validationInterpreterCache = new Map(this.validationInterpreterCache);\n return tokenManager as this;\n }\n\n public register(uri: uriType, spec: TokenSpecification | string): TokenSpecification {\n let parsedSpec: TokenSpecification;\n\n try {\n const input = typeof spec === \"string\" ? JSON.parse(spec) : spec;\n parsedSpec = parseTokenSpec(input);\n } catch (err) {\n const summary =\n err instanceof ZodError\n ? err.issues.map((i) => `${i.path.join(\".\") || \"<root>\"}: ${i.message}`).join(\"; \")\n : err instanceof Error\n ? err.message\n : String(err);\n const jsonSuffix = typeof spec === \"string\" ? `\\nJson:\\n${spec}` : \"\";\n throw new Error(`Invalid token specification for URI ${uri}: ${summary}${jsonSuffix}`);\n }\n\n this.specs.set(uri, parsedSpec);\n this.specTypes.set(specName(parsedSpec), uri);\n\n // Auto-register validation script if present in spec\n if (parsedSpec.validation) {\n this.registerValidation(parsedSpec.name, parsedSpec.validation);\n }\n\n return parsedSpec;\n }\n\n /**\n * Register a TokenScript validation script for a token type.\n * The script receives {input} as the value to validate.\n * Accepts either a string (direct script) or an object with type and script properties (built schema).\n */\n public registerValidation(\n tokenType: string,\n validation: string | { type: string; script: string },\n ): void {\n const normalizedType = tokenType.toLowerCase();\n // If validation is an object with script property (from built schema), extract the script\n const script = typeof validation === \"string\" ? validation : validation.script;\n this.validationScripts.set(normalizedType, script);\n // Invalidate caches when script changes\n this.validationAstCache.delete(normalizedType);\n this.validationInterpreterCache.delete(normalizedType);\n }\n\n /**\n * Get validation script for a token type.\n */\n public getValidation(tokenType: string): string | undefined {\n return this.validationScripts.get(tokenType.toLowerCase());\n }\n\n /**\n * Get possible error codes from validation scripts by walking the AST.\n * Finds all return statements that return string literals (error codes).\n *\n * @param tokenType - Optional token type to get errors for. If omitted, returns all error types.\n * @returns Array of error code strings\n */\n public validationErrorTypes(tokenType?: string): string[] {\n if (tokenType) {\n return this.extractErrorTypesFromAST(tokenType);\n }\n\n // Get all error types from all registered validation scripts\n const allErrors = new Set<string>();\n for (const type of this.validationScripts.keys()) {\n for (const error of this.extractErrorTypesFromAST(type)) {\n allErrors.add(error);\n }\n }\n return Array.from(allErrors);\n }\n\n /**\n * Extract error codes from a validation script's AST.\n * Walks the tree and returns string values from return statements.\n */\n private extractErrorTypesFromAST(tokenType: string): string[] {\n const normalizedType = tokenType.toLowerCase();\n const script = this.validationScripts.get(normalizedType);\n if (!script) {\n return [];\n }\n\n // Use cached AST if available, otherwise parse and cache\n let ast = this.validationAstCache.get(normalizedType);\n if (ast === undefined) {\n try {\n ast = new Parser(new Lexer(script)).parse();\n this.validationAstCache.set(normalizedType, ast);\n } catch {\n return [];\n }\n }\n\n if (!ast) {\n return [];\n }\n\n // Find all return statements and extract string literals\n const returnNodes = filterAST<ReturnNode>(ast, (node) => node instanceof ReturnNode);\n const errorTypes: string[] = [];\n\n for (const returnNode of returnNodes) {\n if (returnNode.expr instanceof StringNode) {\n errorTypes.push(returnNode.expr.value);\n }\n }\n\n return errorTypes;\n }\n\n /**\n * Validate a token value against its type using TokenScript.\n * Automatically performs deep validation for nested token properties.\n * Returns an array of validation results (empty or single valid result if all pass).\n *\n * @param tokenType - The token type name (e.g., \"typography\", \"color\")\n * @param value - The symbol value to validate\n * @param visitedUrls - Set of URLs already visited (for circular reference detection)\n * @param basePath - Path prefix for nested validation errors\n * @param depth - Current nesting depth (for max depth protection)\n */\n public validate(\n tokenType: string,\n value: ISymbolType,\n visitedUrls: Set<string> = new Set(),\n basePath: (string | number)[] = [],\n depth: number = 0,\n ): ValidationResult[] {\n // Check max depth to prevent stack overflow\n if (depth > MAX_VALIDATION_DEPTH) {\n return [\n {\n valid: false,\n error: \"MAX_VALIDATION_DEPTH_EXCEEDED\",\n tokenType,\n path: basePath.length > 0 ? basePath : undefined,\n },\n ];\n }\n\n const results: ValidationResult[] = [];\n\n // 1. Run top-level validation script\n const topLevelResult = this.runValidationScript(tokenType, value, basePath);\n if (!topLevelResult.valid) {\n results.push(topLevelResult);\n return results; // Early return on top-level failure\n }\n\n // 2. Get the spec for this token type to check for nested properties\n const spec = this.getSpecByType(tokenType);\n if (!spec?.schema) {\n return [{ valid: true, tokenType }]; // No schema\n }\n\n // 3. Handle list types with items\n if (spec.schema.type === \"list\" && spec.schema.items) {\n const listResults = this.validateListItems(\n value,\n spec.schema.items,\n visitedUrls,\n basePath,\n depth,\n );\n results.push(...listResults);\n\n if (results.length > 0) {\n return results;\n }\n return [{ valid: true, tokenType }];\n }\n\n // 4. Handle object types with properties\n if (!spec.schema.properties) {\n return [{ valid: true, tokenType }]; // No nested properties\n }\n\n // 5. Get the value map for nested property access\n const valueMap = this.getValueMap(value);\n if (!valueMap) {\n return [{ valid: true, tokenType }];\n }\n\n // 6. Validate nested token properties\n const propResults = this.validateObjectProperties(\n valueMap,\n spec.schema.properties,\n visitedUrls,\n basePath,\n depth,\n );\n results.push(...propResults);\n\n // Return failures or single valid result\n if (results.length > 0) {\n return results;\n }\n return [{ valid: true, tokenType }];\n }\n\n /**\n * Validate items in a list against an items schema.\n * Each item is validated and errors include the index in the path.\n */\n private validateListItems(\n value: ISymbolType,\n itemsSpec: SpecItemsType,\n visitedUrls: Set<string>,\n basePath: (string | number)[],\n depth: number,\n ): ValidationResult[] {\n const results: ValidationResult[] = [];\n\n // Get the list\n if (!(value instanceof ListSymbol)) {\n return results; // Not a list, validation script should have caught this\n }\n\n const items = value.value;\n\n // Validate each item\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n const itemPath = [...basePath, i];\n\n // Handle object items with properties\n if (itemsSpec.type === \"object\" && itemsSpec.properties) {\n const itemMap = this.getValueMap(item);\n if (itemMap) {\n const propResults = this.validateObjectProperties(\n itemMap,\n itemsSpec.properties,\n visitedUrls,\n itemPath,\n depth + 1,\n );\n results.push(...propResults);\n }\n }\n\n // Handle token items (direct reference to another token type)\n if (itemsSpec.type === \"token\" && itemsSpec.url) {\n const referencedSpec = this.getSpec(itemsSpec.url);\n if (referencedSpec) {\n const newVisited = new Set(visitedUrls);\n newVisited.add(itemsSpec.url);\n\n const nestedResults = this.validate(\n referencedSpec.name,\n item,\n newVisited,\n itemPath,\n depth + 1,\n );\n\n for (const result of nestedResults) {\n if (!result.valid) {\n results.push(result);\n }\n }\n }\n }\n }\n\n return results;\n }\n\n /**\n * Validate properties of an object against a properties schema.\n */\n private validateObjectProperties(\n valueMap: Map<string, ISymbolType>,\n properties: Record<string, SpecProperty>,\n visitedUrls: Set<string>,\n basePath: (string | number)[],\n depth: number,\n ): ValidationResult[] {\n const results: ValidationResult[] = [];\n\n for (const [propName, propSpec] of Object.entries(properties)) {\n const typedPropSpec = propSpec as SpecProperty;\n if (typedPropSpec.type !== \"token\" || !typedPropSpec.url) {\n continue;\n }\n\n // Circular reference detection\n if (visitedUrls.has(typedPropSpec.url)) {\n results.push({\n valid: false,\n error: \"CIRCULAR_REFERENCE\",\n tokenType: typedPropSpec.url,\n path: [...basePath, propName],\n });\n continue;\n }\n\n // Get the property value\n const propValue = valueMap.get(propName);\n if (!propValue) {\n continue; // Property not present, skip\n }\n\n // Look up referenced spec\n const referencedSpec = this.getSpec(typedPropSpec.url);\n if (!referencedSpec) {\n continue; // Spec not registered, skip\n }\n\n // Recursively validate with updated visited set, path, and depth\n const newVisited = new Set(visitedUrls);\n newVisited.add(typedPropSpec.url);\n\n const nestedResults = this.validate(\n referencedSpec.name,\n propValue,\n newVisited,\n [...basePath, propName],\n depth + 1,\n );\n\n // Collect any failures\n for (const result of nestedResults) {\n if (!result.valid) {\n results.push(result);\n }\n }\n }\n\n return results;\n }\n\n /**\n * Run the validation script for a token type.\n * Internal method used by validate().\n * Uses cached Interpreter when available to avoid recreation overhead.\n */\n private runValidationScript(\n tokenType: string,\n value: ISymbolType,\n path: (string | number)[] = [],\n ): ValidationResult {\n const normalizedType = tokenType.toLowerCase();\n const script = this.getValidation(tokenType);\n if (!script) {\n return { valid: true, tokenType };\n }\n\n try {\n // Get or create cached interpreter for this token type\n let interpreter = this.validationInterpreterCache.get(normalizedType);\n\n if (!interpreter) {\n // Parse AST (use cached if available)\n let ast = this.validationAstCache.get(normalizedType);\n if (ast === undefined) {\n ast = new Parser(new Lexer(script)).parse();\n this.validationAstCache.set(normalizedType, ast);\n }\n\n // Create and cache interpreter\n interpreter = new Interpreter(ast, {\n config: this.parentConfig ?? undefined,\n });\n this.validationInterpreterCache.set(normalizedType, interpreter);\n }\n\n // Reset state and set new input reference\n interpreter.resetSymbolTable();\n interpreter.setReference(\"input\", value);\n\n const result = interpreter.interpret();\n\n if (result instanceof BooleanSymbol && result.value === true) {\n return { valid: true, tokenType };\n }\n if (result instanceof StringSymbol) {\n return {\n valid: false,\n error: result.value as string,\n tokenType,\n path: path.length > 0 ? path : undefined,\n };\n }\n return {\n valid: false,\n error: \"VALIDATION_INVALID_RESULT\",\n tokenType,\n path: path.length > 0 ? path : undefined,\n };\n } catch (error) {\n return {\n valid: false,\n error: `VALIDATION_ERROR: ${error instanceof Error ? error.message : String(error)}`,\n tokenType,\n path: path.length > 0 ? path : undefined,\n };\n }\n }\n\n /**\n * Extract a Map from various symbol types that can contain key-value pairs.\n */\n private getValueMap(value: ISymbolType): Map<string, ISymbolType> | null {\n if (value instanceof DictionarySymbol) {\n return value.value;\n }\n if (value instanceof TokenSymbol && value.value instanceof Map) {\n return value.value;\n }\n return null;\n }\n}\n","// Unit-kind schema shim.\n//\n// Re-exports the typed shapes from @tokens-studio/schema-validation so\n// that the rest of the interpreter can continue importing from\n// \"@interpreter/config/managers/unit/schema\". The schema-validation\n// package is the cross-language source of truth for the schema language\n// (TS / Go / Ruby).\n//\n// Aliases preserve the historical interpreter names (`ScriptBlock`,\n// `Conversion`, `UnitSpecificationSchema`, `validUnitTypes`) so consumer\n// code does not have to change.\n\nimport { Unit, type z } from \"@tokens-studio/schema-validation\";\n\n// Types -----------------------------------------------------------------------\n\nexport type UnitSpecification = Unit.UnitSpecification;\nexport type Conversion = Unit.Conversion;\nexport type ScriptBlock = Unit.UnitScriptBlock;\n\n// Validation API --------------------------------------------------------------\n//\n// Explicit type annotations on these re-exports are required because\n// tsup's DTS bundling (rollup-plugin-dts) can't construct a public path\n// for the internal types that transitively appear in the inferred\n// return types of `Unit.parseUnitSpec` etc. Without the annotation\n// the DTS emit fails with TS4023 / TS2742.\n\n/**\n * Validate and parse a JSON value as a unit specification. Throws a\n * `ZodError` with a structured field-by-field error report on failure.\n *\n * Strictness:\n * - Top level: unknown fields are tolerated (silently stripped).\n * - Nested shapes (Conversion, UnitScriptBlock): unknown fields are\n * rejected.\n *\n * Note: unit Conversions have NO `lossless` field — unit conversions\n * are mathematical and treated as information-preserving. This is a\n * deliberate cross-kind asymmetry with color Conversions.\n */\nexport const parseUnitSpec: (json: unknown) => UnitSpecification = Unit.parseUnitSpec;\n\n/**\n * Like `parseUnitSpec` but returns a `{ success, data | error }`\n * discriminated union instead of throwing.\n */\nexport const safeParseUnitSpec: (json: unknown) => z.ZodSafeParseResult<UnitSpecification> =\n Unit.safeParseUnitSpec;\n\n/**\n * Historical compatibility alias for `parseUnitSpec`. Wrap a call in a\n * `try { ... } catch (err) { ... }` to handle validation failures.\n *\n * @deprecated Prefer `parseUnitSpec` / `safeParseUnitSpec`.\n */\nexport const UnitSpecificationSchema: (json: unknown) => UnitSpecification = Unit.parseUnitSpec;\n\n// Constants -------------------------------------------------------------------\n\n/**\n * The set of valid `type` values for a unit specification.\n *\n * Hand-spelled because tsup's DTS bundling drops the value side of\n * namespaced re-exports — `Unit.UnitType` is reachable as a TYPE but\n * not as the underlying zod enum value.\n */\nexport const validUnitTypes = [\"absolute\", \"relative\"] as const;\n\n// Helpers ---------------------------------------------------------------------\n\n/** Lowercased lookup name for a unit spec. */\nexport const specName: (spec: UnitSpecification) => string = Unit.specName;\n","import {\n InterpreterError,\n isLanguageError,\n serializeError,\n UnitErrorCode,\n} from \"@interpreter/errors\";\nimport { parseExpression } from \"@interpreter/parser\";\nimport { NumberSymbol, NumberWithUnitSymbol } from \"@interpreter/symbols\";\nimport { Interpreter } from \"@src/lib\";\nimport { buildSchemaUri, parseVersionString } from \"@src/utils/schema-uri\";\nimport { ZodError } from \"@tokens-studio/schema-validation\";\nimport { BaseManager } from \"../base-manager\";\nimport { parseUnitSpec, specName, type UnitSpecification } from \"./schema\";\n\n// Types -----------------------------------------------------------------------\n\ntype uriType = string;\ntype unitKey = string;\ntype Specs = Map<uriType, UnitSpecification>;\n\n// Default Units ---------------------------------------------------------------\n\nconst PIXEL_UNIT = buildSchemaUri({\n category: \"core\",\n name: \"px-unit\",\n version: parseVersionString(\"0\"),\n});\n\nconst SECONDS_UNIT = buildSchemaUri({\n category: \"core\",\n name: \"seconds-unit\",\n version: parseVersionString(\"0\"),\n});\n\nconst defaultUnitSpecs: Specs = new Map([\n [\n SECONDS_UNIT,\n {\n name: \"seconds\",\n type: \"absolute\",\n keyword: \"s\",\n description: \"A unit of time equal to one second.\",\n conversions: [],\n },\n ],\n [\n buildSchemaUri({ category: \"core\", name: \"ms-unit\", version: parseVersionString(\"0\") }),\n {\n name: \"milliseconds\",\n type: \"absolute\",\n keyword: \"ms\",\n description: \"A unit of time equal to one millisecond.\",\n conversions: [\n {\n source: \"$self\",\n target: SECONDS_UNIT,\n script: {\n script: \"return ({input} / 1000)s;\",\n },\n description: \"Convert milliseconds to seconds.\",\n },\n {\n source: SECONDS_UNIT,\n target: \"$self\",\n script: {\n script: \"return ({input} * 1000)ms;\",\n },\n description: \"Convert seconds to milliseconds.\",\n },\n ],\n },\n ],\n [\n PIXEL_UNIT,\n {\n name: \"pixel\",\n type: \"absolute\",\n keyword: \"px\",\n description: \"A pixel unit, typically used in digital displays.\",\n conversions: [],\n },\n ],\n [\n buildSchemaUri({ category: \"core\", name: \"rem-unit\", version: parseVersionString(\"0\") }),\n {\n name: \"root em\",\n type: \"absolute\",\n keyword: \"rem\",\n description: \"A root em unit, relative to the root font size.\",\n conversions: [\n {\n source: \"$self\",\n target: PIXEL_UNIT,\n script: {\n script: \"return ({input} * 16)px;\",\n },\n description: \"Convert rem to pixel based on a root font size of 16px.\",\n },\n {\n source: PIXEL_UNIT,\n target: \"$self\",\n script: {\n script: \"return ({input} / 16)rem;\",\n },\n description: \"Convert pixel to rem based on a root font size of 16px.\",\n },\n ],\n },\n ],\n [\n \"https://schema.tokenscript.dev.gcp.tokens.studio/api/v1/core/percent-unit/0/\",\n {\n name: \"percent\",\n type: \"relative\",\n keyword: \"%\",\n description: \"A percentage unit, representing a fraction of 100.\",\n to_absolute: {\n script: \"return {other_value} * ({relative_value} / 100);\",\n },\n conversions: [],\n },\n ],\n [\n buildSchemaUri({ category: \"core\", name: \"ch-unit\", version: parseVersionString(\"0\") }),\n {\n name: \"character\",\n type: \"absolute\",\n keyword: \"ch\",\n description: \"Relative to the width of the '0' character in the element's font.\",\n conversions: [],\n },\n ],\n]);\n\n// Unit Manager ----------------------------------------------------------------\n\nexport class UnitManager extends BaseManager<\n UnitSpecification,\n NumberWithUnitSymbol,\n NumberWithUnitSymbol\n> {\n private unitKeywords: Map<unitKey, uriType> = new Map();\n\n constructor(defaultSpecs = defaultUnitSpecs) {\n super();\n for (const [uri, spec] of defaultSpecs) {\n this.register(uri, spec);\n }\n }\n\n protected getSpecName(spec: UnitSpecification): string {\n return specName(spec);\n }\n\n /**\n * Creates a clone of this class to be passed down to initializers and conversion functions\n * Links properties to the parent config.\n */\n public clone(): this {\n const unitManager = new UnitManager(new Map());\n unitManager.specs = this.specs;\n unitManager.specTypes = this.specTypes;\n unitManager.conversions = this.conversions;\n unitManager.unitKeywords = this.unitKeywords;\n return unitManager as this;\n }\n\n public registerConversions(uri: uriType, spec: UnitSpecification) {\n spec.conversions?.forEach((conversion) => {\n // $self replacement\n const sourceUri = conversion.source === \"$self\" ? uri : conversion.source;\n const targetUri = conversion.target === \"$self\" ? uri : conversion.target;\n\n const { ast } = parseExpression(conversion.script.script);\n const fn = (unit: NumberWithUnitSymbol): NumberWithUnitSymbol => {\n const config = this.createInterpreterConfig({ input: unit });\n const result = new Interpreter(ast, config).interpret();\n if (!(result instanceof NumberWithUnitSymbol)) {\n throw new InterpreterError(UnitErrorCode.CONVERSION_CRASHED, {\n data: { error: \"Unit conversion function must return a NumberWithUnitSymbol\" },\n });\n }\n return result as NumberWithUnitSymbol;\n };\n\n this.registerConversionFunction(sourceUri, targetUri, fn);\n });\n }\n\n public register(uri: uriType, spec: UnitSpecification | string): UnitSpecification {\n let parsedSpec: UnitSpecification;\n\n try {\n const input = typeof spec === \"string\" ? JSON.parse(spec) : spec;\n parsedSpec = parseUnitSpec(input);\n } catch (err) {\n const summary =\n err instanceof ZodError\n ? err.issues.map((i) => `${i.path.join(\".\") || \"<root>\"}: ${i.message}`).join(\"; \")\n : err instanceof Error\n ? err.message\n : String(err);\n const jsonSuffix = typeof spec === \"string\" ? `\\n\\nJson:\\n${spec}` : \"\";\n throw new Error(`Invalid unit specification for URI ${uri}: ${summary}${jsonSuffix}`);\n }\n\n this.specs.set(uri, parsedSpec);\n this.specTypes.set(specName(parsedSpec), uri);\n this.unitKeywords.set(parsedSpec.keyword.toUpperCase(), uri);\n\n this.registerConversions(uri, parsedSpec);\n\n return parsedSpec;\n }\n\n public getSpecByKeyword(keyword: unitKey): UnitSpecification | undefined {\n const uri = this.unitKeywords.get(keyword.toUpperCase());\n if (!uri) return;\n return this.getSpec(uri);\n }\n\n public getUriByKeyword(keyword: unitKey): string | undefined {\n return this.unitKeywords.get(keyword.toUpperCase());\n }\n\n public convertTo(unit: NumberWithUnitSymbol, targetUri: uriType): NumberWithUnitSymbol {\n const sourceUri = this.getUriByKeyword(unit.unit);\n if (!sourceUri) {\n throw new InterpreterError(UnitErrorCode.SOURCE_URI_NOT_FOUND, {\n data: { unit: unit.unit },\n });\n }\n\n try {\n return this.convertThroughPath(unit, sourceUri, targetUri);\n } catch (error) {\n throw new InterpreterError(UnitErrorCode.CONVERSION_CRASHED, {\n data: {\n error: isLanguageError(error) ? error : serializeError(error),\n },\n });\n }\n }\n\n private isOneNumberRelative(inputs: Array<NumberSymbol | NumberWithUnitSymbol>): boolean {\n let relativeCount = 0;\n for (const input of inputs) {\n if (input instanceof NumberWithUnitSymbol) {\n const spec = this.getSpecByKeyword(input.unit);\n if (spec?.type === \"relative\") {\n relativeCount++;\n }\n }\n }\n return relativeCount === 1;\n }\n\n private convertRelative(\n numbers: Array<NumberSymbol | NumberWithUnitSymbol>,\n ): Array<NumberSymbol | NumberWithUnitSymbol> {\n if (numbers.length !== 2) {\n throw new InterpreterError(UnitErrorCode.RELATIVE_REQUIRES_TWO_NUMBERS);\n }\n\n let relativeNum: NumberWithUnitSymbol | null = null;\n let baseNum: NumberSymbol | NumberWithUnitSymbol | null = null;\n let relativeIndex = -1;\n\n for (let i = 0; i < numbers.length; i++) {\n const num = numbers[i];\n if (num instanceof NumberWithUnitSymbol) {\n const spec = this.getSpecByKeyword(num.unit);\n if (spec?.type === \"relative\") {\n if (relativeNum !== null) {\n // Multiple relative numbers - return as is\n return numbers;\n }\n relativeNum = num;\n relativeIndex = i;\n } else {\n baseNum = num;\n }\n } else {\n baseNum = num;\n }\n }\n\n if (!relativeNum || !baseNum) {\n return numbers;\n }\n\n const spec = this.getSpecByKeyword(relativeNum.unit);\n if (!spec?.to_absolute) {\n throw new InterpreterError(UnitErrorCode.NO_TO_ABSOLUTE_SCRIPT, {\n data: { unit: relativeNum.unit },\n });\n }\n\n const { ast } = parseExpression(spec.to_absolute.script);\n const relativeValueSymbol = new NumberSymbol(relativeNum.value as number);\n const otherValueSymbol = new NumberSymbol(baseNum.value as number);\n const result = new Interpreter(ast, {\n references: {\n relative_value: relativeValueSymbol,\n other_value: otherValueSymbol,\n },\n }).interpret();\n\n let convertedValue: number;\n if (result instanceof NumberSymbol) {\n convertedValue = result.value as number;\n } else if (typeof result === \"number\") {\n convertedValue = result;\n } else {\n throw new InterpreterError(UnitErrorCode.TO_ABSOLUTE_MUST_RETURN_NUMBER);\n }\n\n // Convert to int if it's a whole number\n if (Number.isInteger(convertedValue)) {\n convertedValue = Math.trunc(convertedValue);\n }\n\n let convertedNum: NumberSymbol | NumberWithUnitSymbol;\n if (baseNum instanceof NumberWithUnitSymbol) {\n convertedNum = new NumberWithUnitSymbol(convertedValue, baseNum.unit);\n } else {\n convertedNum = new NumberSymbol(convertedValue);\n }\n\n const resultNumbers = [...numbers];\n resultNumbers[relativeIndex] = convertedNum;\n return resultNumbers;\n }\n\n public convertToCommonFormat(\n inputs: Array<NumberSymbol | NumberWithUnitSymbol>,\n ): Array<NumberSymbol | NumberWithUnitSymbol> {\n if (inputs.length === 0) {\n return [];\n }\n\n const numberWithUnits = inputs.filter(\n (inp) => inp instanceof NumberWithUnitSymbol,\n ) as NumberWithUnitSymbol[];\n\n if (numberWithUnits.length < 1) {\n return inputs;\n }\n\n const isRelative = this.isOneNumberRelative(inputs);\n if (isRelative) {\n if (inputs.length > 2) {\n throw new InterpreterError(UnitErrorCode.CANNOT_CONVERT_MULTIPLE_RELATIVE);\n }\n return this.convertRelative(inputs);\n }\n\n // Find unique units from the inputs\n const uniqueUnits = Array.from(new Set(numberWithUnits.map((inp) => inp.unit.toUpperCase())));\n\n const conversionResults: Record<string, Array<NumberSymbol | NumberWithUnitSymbol>> = {};\n\n for (const unit of uniqueUnits) {\n const unitUri = this.getUriByKeyword(unit);\n if (!unitUri) continue;\n\n conversionResults[unitUri] = [];\n let canConvert = true;\n\n for (const inp of inputs) {\n if (!(inp instanceof NumberWithUnitSymbol)) {\n conversionResults[unitUri].push(inp);\n continue;\n }\n\n const inputUri = this.getUriByKeyword(inp.unit);\n if (!inputUri) {\n canConvert = false;\n break;\n }\n\n if (inputUri === unitUri) {\n conversionResults[unitUri].push(inp);\n continue;\n }\n\n try {\n const result = this.convertThroughPath(inp, inputUri, unitUri);\n conversionResults[unitUri].push(result);\n } catch {\n canConvert = false;\n break;\n }\n }\n\n if (!canConvert) {\n delete conversionResults[unitUri];\n }\n }\n\n // Find the unit with the maximum absolute value\n const maxPerUri: Record<string, number> = {};\n for (const [uri, results] of Object.entries(conversionResults)) {\n if (results.length === 0) continue;\n const maxValue = Math.max(\n ...results.map((result) => Math.abs((result.value as number) || 0)),\n );\n maxPerUri[uri] = maxValue;\n }\n\n if (Object.keys(maxPerUri).length === 0) {\n throw new InterpreterError(UnitErrorCode.NO_VALID_CONVERSION_PATH);\n }\n\n const commonUnitUri = Object.keys(maxPerUri).reduce((a, b) =>\n maxPerUri[a] > maxPerUri[b] ? a : b,\n );\n\n return conversionResults[commonUnitUri] || [];\n }\n}\n","import type { ISymbolType } from \"@src/types\";\nimport { ConfigErrorCode, InterpreterError } from \"../errors\";\nimport { basicSymbolTypes, ColorSymbol } from \"../symbols\";\nimport { ColorManager } from \"./managers/color/manager\";\nimport type { ColorSpecification } from \"./managers/color/schema\";\nimport type { ConstantsSpecification } from \"./managers/constants/schema\";\nimport { FunctionsManager } from \"./managers/functions/manager\";\nimport type { FunctionSpecification } from \"./managers/functions/schema\";\nimport { TokenManager } from \"./managers/token/manager\";\nimport type { TokenSpecification } from \"./managers/token/schema\";\nimport { UnitManager } from \"./managers/unit/manager\";\n\nexport interface LanguageOptions {\n MAX_ITERATIONS: number;\n}\n\nexport interface ConfigOptions {\n languageOptions?: LanguageOptions;\n colorManager?: ColorManager;\n unitManager?: UnitManager;\n functionsManager?: FunctionsManager;\n tokenManager?: TokenManager;\n}\n\nexport const DEFAULT_LANGUAGE_OPTIONS: LanguageOptions = {\n MAX_ITERATIONS: 1000,\n};\n\nexport class Config {\n public languageOptions: LanguageOptions;\n public colorManager: ColorManager;\n public unitManager: UnitManager;\n public functionsManager: FunctionsManager;\n public tokenManager: TokenManager;\n private _inlineConstants: Map<string, string | number | boolean> = new Map();\n\n constructor(options?: ConfigOptions) {\n this.languageOptions = {\n ...DEFAULT_LANGUAGE_OPTIONS,\n ...options?.languageOptions,\n };\n this.colorManager = options?.colorManager || new ColorManager();\n this.unitManager = options?.unitManager || new UnitManager();\n this.functionsManager = options?.functionsManager || new FunctionsManager();\n this.tokenManager = options?.tokenManager || new TokenManager();\n\n // Set parent config reference to avoid recursion issues\n // Only set if not already set to prevent overriding existing parent references\n if (!this.colorManager.getParentConfig()) {\n this.colorManager.setParentConfig(this);\n }\n if (!this.unitManager.getParentConfig()) {\n this.unitManager.setParentConfig(this);\n }\n if (!this.functionsManager.getParentConfig()) {\n this.functionsManager.setParentConfig(this);\n }\n if (!this.tokenManager.getParentConfig()) {\n this.tokenManager.setParentConfig(this);\n }\n }\n\n getType(baseType: string, subType?: string): ISymbolType {\n const lowerBaseType = baseType.toLowerCase();\n\n if (lowerBaseType === \"color\") {\n if (subType) {\n if (!this.colorManager.getSpecByType(subType)) {\n throw new InterpreterError(ConfigErrorCode.NO_SPEC_FOUND, {\n data: { specName: subType },\n });\n }\n return new ColorSymbol(null, subType, null, this);\n }\n return new ColorSymbol(null, undefined, null, this);\n }\n\n const basicSymbolConstructor = basicSymbolTypes[baseType.toLowerCase()];\n if (!basicSymbolConstructor) {\n throw new InterpreterError(ConfigErrorCode.NO_TYPE_FOUND, {\n data: { typeName: baseType },\n });\n }\n\n return basicSymbolConstructor.empty();\n }\n\n isTypeDefined(baseType: string, subType?: string): boolean {\n const lowerBaseType = baseType.toLowerCase();\n if (lowerBaseType === \"color\") {\n if (subType) return !!this.colorManager.getSpecByType(subType);\n // Color may be defined without subType\n return true;\n }\n // Nothing else implements subType other than color\n if (subType) return false;\n\n return !!basicSymbolTypes[lowerBaseType];\n }\n\n get inlineConstants(): Map<string, string | number | boolean> {\n return this._inlineConstants;\n }\n\n clone(): Config {\n return new Config({\n languageOptions: { ...this.languageOptions },\n colorManager: this.colorManager.clone(),\n unitManager: this.unitManager.clone(),\n functionsManager: this.functionsManager.clone(),\n tokenManager: this.tokenManager.clone(),\n });\n }\n\n registerSchemas(\n schemas: Array<{\n uri: string;\n schema:\n | ColorSpecification\n | FunctionSpecification\n | TokenSpecification\n | ConstantsSpecification;\n }>,\n ): Config {\n for (const { uri, schema } of schemas) {\n switch (schema.type) {\n case \"color\":\n this.colorManager.register(uri, schema as ColorSpecification);\n break;\n case \"function\":\n this.functionsManager.register(\n (schema as FunctionSpecification).keyword,\n schema as FunctionSpecification,\n );\n break;\n case \"token\":\n this.tokenManager.register(uri, schema as TokenSpecification);\n break;\n case \"constants\": {\n const spec = schema as ConstantsSpecification;\n if (!spec.inline) break;\n for (const [key, value] of Object.entries(spec.values)) {\n this._inlineConstants.set(key, value);\n }\n break;\n }\n }\n }\n return this;\n }\n}\n","// Constants-kind schema shim.\n//\n// Re-exports the typed shapes from @tokens-studio/schema-validation so\n// that the rest of the interpreter can continue importing from\n// \"@interpreter/config/managers/constants/schema\". The schema-validation\n// package is the cross-language source of truth for the schema language\n// (TS / Go / Ruby).\n//\n// The historical alias `ConstantsSpecificationSchema` is preserved for\n// public API compatibility but is currently not called from anywhere\n// inside the interpreter (Constants are dispatched in\n// `Config.registerSchemas` without separate validation).\n\nimport { Constants, type z } from \"@tokens-studio/schema-validation\";\n\n// Types -----------------------------------------------------------------------\n\nexport type ConstantsSpecification = Constants.ConstantsSpecification;\n\n// Validation API --------------------------------------------------------------\n//\n// Explicit type annotations on these re-exports are required because\n// tsup's DTS bundling (rollup-plugin-dts) can't construct a public path\n// for the internal types that transitively appear in the inferred\n// return types of `Constants.parseConstantsSpec` etc. Without the\n// annotation the DTS emit fails with TS4023 / TS2742.\n\n/**\n * Validate and parse a JSON value as a constants specification. Throws\n * a `ZodError` with a structured field-by-field error report on failure.\n *\n * Strictness:\n * - Top level: unknown fields are tolerated (silently stripped).\n * - `values` entries: must be `string | number | boolean`. Object,\n * array, and `null` values are rejected.\n */\nexport const parseConstantsSpec: (json: unknown) => ConstantsSpecification =\n Constants.parseConstantsSpec;\n\n/**\n * Like `parseConstantsSpec` but returns a `{ success, data | error }`\n * discriminated union instead of throwing.\n */\nexport const safeParseConstantsSpec: (\n json: unknown,\n) => z.ZodSafeParseResult<ConstantsSpecification> = Constants.safeParseConstantsSpec;\n\n/**\n * Historical compatibility alias for `parseConstantsSpec`. Wrap a call\n * in a `try { ... } catch (err) { ... }` to handle validation failures.\n *\n * @deprecated Prefer `parseConstantsSpec` / `safeParseConstantsSpec`.\n */\nexport const ConstantsSpecificationSchema: (json: unknown) => ConstantsSpecification =\n Constants.parseConstantsSpec;\n\n// Helpers ---------------------------------------------------------------------\n\n/** Lowercased lookup name for a constants spec. */\nexport const specName: (spec: ConstantsSpecification) => string = Constants.specName;\n","import type { Config } from \"@interpreter/config\";\nimport type { LanguageError } from \"@interpreter/errors\";\nimport { Interpreter, type InterpreterResult } from \"@interpreter/interpreter\";\nimport { Lexer } from \"@interpreter/lexer\";\nimport { Parser } from \"@interpreter/parser\";\nimport {\n getResultTypeName,\n isTokenscriptSymbol,\n serializeInterpreterResult,\n stringifyInterpreterResult,\n} from \"@interpreter/symbols\";\nimport type { ReferenceRecord } from \"@src/types\";\n\nexport interface EvalOptions {\n references?: ReferenceRecord;\n config?: Config;\n allowStatements?: boolean;\n}\n\nexport interface EvalSuccess {\n success: true;\n result: unknown;\n resultString: string;\n type: string;\n executionTime: number;\n}\n\nexport interface EvalError {\n success: false;\n error: LanguageError;\n executionTime: number;\n}\n\nexport type EvalResult = EvalSuccess | EvalError;\n\nexport function evaluateExpression(expression: string, options: EvalOptions = {}): EvalResult {\n const { references = {}, config, allowStatements = false } = options;\n const startTime = performance.now();\n\n try {\n const lexer = new Lexer(expression);\n const parser = new Parser(lexer);\n const ast = parser.parse(allowStatements);\n\n if (!ast) {\n return {\n success: true,\n result: null,\n resultString: \"null\",\n type: \"Null\",\n executionTime: performance.now() - startTime,\n };\n }\n\n const interpreter = new Interpreter(ast, { references, config });\n const result: InterpreterResult = interpreter.interpret();\n\n return {\n success: true,\n result: serializeInterpreterResult(result),\n resultString: stringifyInterpreterResult(result),\n type: isTokenscriptSymbol(result) ? result.getTypeName() : getResultTypeName(result),\n executionTime: performance.now() - startTime,\n };\n } catch (error: unknown) {\n return {\n success: false,\n error: error as LanguageError,\n executionTime: performance.now() - startTime,\n };\n }\n}\n","/**\n * Tolerant Parser for Tokenscript\n *\n * This module provides a tolerant parsing mode that can handle incomplete tokenscript\n * values while the user is typing. Instead of throwing errors on incomplete input,\n * the parser returns partial AST nodes with metadata about what's incomplete.\n *\n * Use cases:\n * - Syntax highlighting for incomplete references (e.g., `{color` highlighted as partial)\n * - Autocomplete suggestions (e.g., `{foo.ba|` - suggest completions)\n * - Live color display for incomplete color functions (e.g., `rgb(255, 128`)\n */\n\nimport type { ASTNode, Token } from \"@src/types\";\nimport { ReferenceNode, walkAST } from \"../ast\";\nimport { Lexer } from \"../lexer\";\nimport { Parser } from \"../parser\";\nimport { PartialReferenceNode } from \"./partial-nodes\";\nimport { ParseState, type TolerantParseResult } from \"./types\";\n\n// Re-export types and partial nodes\nexport * from \"./partial-nodes\";\nexport * from \"./types\";\n\n/**\n * Parse tokenscript input tolerantly, returning partial AST nodes for incomplete input.\n *\n * @param text - The tokenscript text to parse\n * @returns Parse result containing AST, state, and incomplete info\n *\n * @example\n * ```typescript\n * // Parse incomplete reference\n * const result = parseTolerantly(\"{color\");\n * if (result.state === ParseState.INCOMPLETE) {\n * console.log(\"Incomplete reference:\", result.ast);\n * }\n *\n * // Parse incomplete function call\n * const result2 = parseTolerantly(\"rgb(255, 128\");\n * // result2.ast will be a PartialFunctionCallNode\n * ```\n */\nexport function parseTolerantly(text: string): TolerantParseResult {\n const lexer = new Lexer(text, { tolerant: true });\n\n try {\n const parser = new Parser(lexer, { tolerant: true });\n const ast = parser.parse(true);\n const incomplete = parser.getIncomplete();\n\n return {\n ast,\n state: incomplete.length > 0 ? ParseState.INCOMPLETE : ParseState.COMPLETE,\n incomplete,\n tokens: lexer.getAllTokens(),\n };\n } catch (e) {\n // Even in tolerant mode, some errors might slip through\n // Return what we have so far, with the error attached for debugging\n return {\n ast: null,\n state: ParseState.INCOMPLETE,\n incomplete: [],\n tokens: lexer.getAllTokens(),\n error: e instanceof Error ? e : new Error(String(e)),\n };\n }\n}\n\n/**\n * Tokenize input tolerantly and return all tokens including partial ones.\n *\n * @param text - The tokenscript text to tokenize\n * @returns Array of tokens\n *\n * @example\n * ```typescript\n * const tokens = tokenizeTolerantly(\"{color\");\n * // tokens[0] will be a PARTIAL_REFERENCE token\n * ```\n */\nexport function tokenizeTolerantly(text: string): Token[] {\n const lexer = new Lexer(text, { tolerant: true });\n return lexer.tokenizeAll();\n}\n\n/**\n * Reference information extracted from an AST\n */\nexport interface ReferenceInfo {\n /** The reference name (e.g., \"color.primary\") */\n name: string;\n /** Whether this is a partial/incomplete reference */\n isPartial: boolean;\n /** The AST node */\n node: ReferenceNode | PartialReferenceNode;\n}\n\n/**\n * Collect all references from a tolerant parse result, including partial references.\n *\n * @param ast - The AST node to search\n * @returns Array of reference information\n *\n * @example\n * ```typescript\n * const result = parseTolerantly(\"{color} + {foo\");\n * const refs = collectAllReferences(result.ast);\n * // refs = [\n * // { name: \"color\", isPartial: false, node: ReferenceNode },\n * // { name: \"foo\", isPartial: true, node: PartialReferenceNode }\n * // ]\n * ```\n */\nexport function collectAllReferences(ast: ASTNode | null): ReferenceInfo[] {\n if (!ast) return [];\n\n const refs: ReferenceInfo[] = [];\n walkAST(ast, (node) => {\n if (node instanceof ReferenceNode) {\n refs.push({ name: node.value, isPartial: false, node });\n } else if (node instanceof PartialReferenceNode) {\n refs.push({ name: node.partialValue, isPartial: true, node });\n }\n });\n return refs;\n}\n\nconst PARTIAL_FOUND = Symbol(\"PARTIAL_FOUND\");\n\n/**\n * Check if an AST contains any partial/incomplete nodes\n */\nexport function hasPartialNodes(ast: ASTNode | null): boolean {\n if (!ast) return false;\n\n try {\n walkAST(ast, (node) => {\n if (node.nodeType.startsWith(\"Partial\")) {\n throw PARTIAL_FOUND;\n }\n });\n return false;\n } catch (e) {\n if (e === PARTIAL_FOUND) return true;\n throw e;\n }\n}\n","// TokenScript interpreter with configuration (no processors)\n// Use this if you want just the interpreter without tokenset processing utilities\n\n// AST -------------------------------------------------------------------------\n\nimport type { ASTNode } from \"@interpreter/ast\";\nimport {\n BinOpNode,\n FunctionCallNode,\n ImplicitListNode,\n ListNode,\n NoOpNode,\n NumNode,\n ReferenceNode,\n StringNode,\n UnaryOpNode,\n} from \"@interpreter/ast\";\n\nexport const ASTNodes = {\n BinOpNode,\n FunctionCallNode,\n ImplicitListNode,\n ListNode,\n NoOpNode,\n NumNode,\n ReferenceNode,\n StringNode,\n UnaryOpNode,\n};\nexport type { ASTNode };\nexport { collectReferenceNodes, filterAST, walkAST } from \"@interpreter/ast\";\nexport { renameReferences } from \"@interpreter/utils/references\";\n\n// Configuration ---------------------------------------------------------------\n\nexport type { ConfigOptions, LanguageOptions } from \"@interpreter/config\";\nexport { Config, DEFAULT_LANGUAGE_OPTIONS } from \"@interpreter/config\";\n\n// Config Managers -------------------------------------------------------------\n\nexport { ColorManager } from \"@interpreter/config/managers/color/manager\";\nexport {\n type ColorSpecification,\n ColorSpecificationSchema,\n} from \"@interpreter/config/managers/color/schema\";\nexport {\n type ConstantsSpecification,\n ConstantsSpecificationSchema,\n} from \"@interpreter/config/managers/constants/schema\";\nexport { FunctionsManager } from \"@interpreter/config/managers/functions/manager\";\nexport {\n type FunctionSpecification,\n FunctionSpecificationSchema,\n} from \"@interpreter/config/managers/functions/schema\";\nexport { UnitManager } from \"@interpreter/config/managers/unit/manager\";\nexport {\n type UnitSpecification,\n UnitSpecificationSchema,\n} from \"@interpreter/config/managers/unit/schema\";\nexport * from \"@interpreter/errors\";\n\n// Interpreter Core ------------------------------------------------------------\n\nexport { Interpreter, type InterpreterResult } from \"@interpreter/interpreter\";\nexport { Lexer } from \"@interpreter/lexer\";\nexport { Parser, parseExpression } from \"@interpreter/parser\";\n\n// Symbols ---------------------------------------------------------------------\n\nexport {\n BaseSymbolType,\n BooleanSymbol,\n ColorSymbol,\n DictionarySymbol,\n getResultTypeName,\n type JsValue,\n jsValueToSymbolType,\n ListSymbol,\n NullSymbol,\n NumberSymbol,\n NumberWithUnitSymbol,\n StringSymbol,\n TokenSymbol,\n} from \"@interpreter/symbols\";\n\n// Types -----------------------------------------------------------------------\n\nexport * from \"@src/types\";\n\n// Eval Utilities --------------------------------------------------------------\n\nexport {\n type EvalError,\n type EvalOptions,\n type EvalResult,\n type EvalSuccess,\n evaluateExpression,\n} from \"./eval\";\n\n// Tolerant Parsing ------------------------------------------------------------\n\nexport {\n // Utilities\n collectAllReferences,\n hasPartialNodes,\n // Types\n type IncompleteInfo,\n IncompleteType,\n ParseState,\n // Partial Nodes\n PartialBinOpNode,\n PartialFunctionCallNode,\n PartialParenNode,\n PartialReferenceNode,\n PartialStringNode,\n PartialUnaryOpNode,\n // Main API\n parseTolerantly,\n type ReferenceInfo,\n type TolerantParseResult,\n tokenizeTolerantly,\n} from \"@interpreter/tolerant\";\n"]}