schematex 0.5.2 → 0.6.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.
- package/README.md +75 -1
- package/dist/ai/ai-sdk.cjs +22 -22
- package/dist/ai/ai-sdk.d.cts +3 -3
- package/dist/ai/ai-sdk.d.ts +3 -3
- package/dist/ai/ai-sdk.js +17 -17
- package/dist/ai/index.cjs +34 -26
- package/dist/ai/index.d.cts +4 -4
- package/dist/ai/index.d.ts +4 -4
- package/dist/ai/index.js +17 -17
- package/dist/{api-Cr_MxttI.d.ts → api-XWHHAhQI.d.ts} +3 -40
- package/dist/{api-C5SECOxZ.d.cts → api-qVDutqXH.d.cts} +3 -40
- package/dist/browser.cjs +23 -23
- package/dist/browser.d.cts +3 -3
- package/dist/browser.d.ts +3 -3
- package/dist/browser.js +17 -17
- package/dist/{chunk-4QPDZJAL.cjs → chunk-25ZON47K.cjs} +11484 -9030
- package/dist/chunk-25ZON47K.cjs.map +1 -0
- package/dist/{chunk-N7W5KZK7.cjs → chunk-2L4YXZAZ.cjs} +4 -4
- package/dist/{chunk-N7W5KZK7.cjs.map → chunk-2L4YXZAZ.cjs.map} +1 -1
- package/dist/{chunk-ZYRCPSBU.js → chunk-3IE7KZY4.js} +4 -4
- package/dist/{chunk-ZYRCPSBU.js.map → chunk-3IE7KZY4.js.map} +1 -1
- package/dist/{chunk-ZX74KJPM.js → chunk-3VB5AT4R.js} +3 -3
- package/dist/{chunk-ZX74KJPM.js.map → chunk-3VB5AT4R.js.map} +1 -1
- package/dist/{chunk-S2KJRHDZ.cjs → chunk-4UFR2LB6.cjs} +13 -13
- package/dist/{chunk-S2KJRHDZ.cjs.map → chunk-4UFR2LB6.cjs.map} +1 -1
- package/dist/{chunk-QTNPMIO2.cjs → chunk-6JI6FWLZ.cjs} +341 -35
- package/dist/chunk-6JI6FWLZ.cjs.map +1 -0
- package/dist/{chunk-OK5ZS3LU.js → chunk-7AFW2J6J.js} +11445 -8998
- package/dist/chunk-7AFW2J6J.js.map +1 -0
- package/dist/{chunk-UFTYX73U.js → chunk-7F76AWOI.js} +339 -35
- package/dist/chunk-7F76AWOI.js.map +1 -0
- package/dist/{chunk-BW4KGTV7.cjs → chunk-C5C5EF3W.cjs} +4 -4
- package/dist/{chunk-BW4KGTV7.cjs.map → chunk-C5C5EF3W.cjs.map} +1 -1
- package/dist/{chunk-VJGMEGMR.js → chunk-DOK7LKLO.js} +125 -13
- package/dist/chunk-DOK7LKLO.js.map +1 -0
- package/dist/{chunk-3M6WB62Y.cjs → chunk-ECD5XHBM.cjs} +139 -7
- package/dist/chunk-ECD5XHBM.cjs.map +1 -0
- package/dist/{chunk-L3CTXXVZ.js → chunk-FBS3PACU.js} +3 -3
- package/dist/{chunk-L3CTXXVZ.js.map → chunk-FBS3PACU.js.map} +1 -1
- package/dist/{chunk-QUKVGHN4.cjs → chunk-FKJBXGWP.cjs} +4 -4
- package/dist/{chunk-QUKVGHN4.cjs.map → chunk-FKJBXGWP.cjs.map} +1 -1
- package/dist/{chunk-SZK376QB.js → chunk-H4MT5TJP.js} +3 -3
- package/dist/{chunk-SZK376QB.js.map → chunk-H4MT5TJP.js.map} +1 -1
- package/dist/{chunk-3M6T7KB4.js → chunk-HAZALB7U.js} +3 -3
- package/dist/{chunk-3M6T7KB4.js.map → chunk-HAZALB7U.js.map} +1 -1
- package/dist/{chunk-VFZOPRQP.cjs → chunk-HWVBHU3O.cjs} +5 -5
- package/dist/{chunk-VFZOPRQP.cjs.map → chunk-HWVBHU3O.cjs.map} +1 -1
- package/dist/{chunk-D7EHZFK4.cjs → chunk-L7POWM5B.cjs} +138 -2
- package/dist/chunk-L7POWM5B.cjs.map +1 -0
- package/dist/{chunk-6OSUNBZY.js → chunk-LGABFD3L.js} +135 -7
- package/dist/chunk-LGABFD3L.js.map +1 -0
- package/dist/{chunk-2VNMKOUO.js → chunk-LRI4RH2N.js} +135 -3
- package/dist/chunk-LRI4RH2N.js.map +1 -0
- package/dist/{chunk-VDSYMSUY.js → chunk-MVIEIKOI.js} +3 -3
- package/dist/{chunk-VDSYMSUY.js.map → chunk-MVIEIKOI.js.map} +1 -1
- package/dist/{chunk-ZL5RB4UV.js → chunk-N5B242WY.js} +3 -3
- package/dist/{chunk-ZL5RB4UV.js.map → chunk-N5B242WY.js.map} +1 -1
- package/dist/{chunk-VKPCR7BG.js → chunk-P63S7P6N.js} +770 -12
- package/dist/chunk-P63S7P6N.js.map +1 -0
- package/dist/{chunk-YLEVMOK2.cjs → chunk-R66QG3XT.cjs} +5 -4
- package/dist/{chunk-YLEVMOK2.cjs.map → chunk-R66QG3XT.cjs.map} +1 -1
- package/dist/{chunk-I55HO32M.js → chunk-RJMCWT7Z.js} +3 -3
- package/dist/{chunk-I55HO32M.js.map → chunk-RJMCWT7Z.js.map} +1 -1
- package/dist/{chunk-TZTCIAYW.cjs → chunk-S3RMAXH5.cjs} +137 -25
- package/dist/chunk-S3RMAXH5.cjs.map +1 -0
- package/dist/{chunk-IBRW3UOA.js → chunk-TWLKXV2O.js} +3 -3
- package/dist/{chunk-IBRW3UOA.js.map → chunk-TWLKXV2O.js.map} +1 -1
- package/dist/{chunk-VCH7RI5H.js → chunk-UWA5MWCI.js} +4 -4
- package/dist/chunk-UWA5MWCI.js.map +1 -0
- package/dist/{chunk-RYVV5UVI.cjs → chunk-V4GILQR6.cjs} +4 -4
- package/dist/{chunk-RYVV5UVI.cjs.map → chunk-V4GILQR6.cjs.map} +1 -1
- package/dist/{chunk-QMTWG6JL.cjs → chunk-V4RO5KYY.cjs} +6 -4
- package/dist/chunk-V4RO5KYY.cjs.map +1 -0
- package/dist/{chunk-VZ5LDNHK.cjs → chunk-VTSH4YPT.cjs} +12 -12
- package/dist/{chunk-VZ5LDNHK.cjs.map → chunk-VTSH4YPT.cjs.map} +1 -1
- package/dist/{chunk-UUBNQV2T.cjs → chunk-WQDIZH2Z.cjs} +12 -12
- package/dist/{chunk-UUBNQV2T.cjs.map → chunk-WQDIZH2Z.cjs.map} +1 -1
- package/dist/{chunk-EGSUMHCS.cjs → chunk-YB4XJY5L.cjs} +12 -12
- package/dist/{chunk-EGSUMHCS.cjs.map → chunk-YB4XJY5L.cjs.map} +1 -1
- package/dist/{chunk-JHDR56XO.js → chunk-YS6CGUNH.js} +3 -3
- package/dist/{chunk-JHDR56XO.js.map → chunk-YS6CGUNH.js.map} +1 -1
- package/dist/{chunk-HK56GQQP.cjs → chunk-YVDUEUFV.cjs} +773 -13
- package/dist/chunk-YVDUEUFV.cjs.map +1 -0
- package/dist/{types-WTr9W5Ud.d.ts → diagnostics-DRxhodP6.d.cts} +74 -2
- package/dist/{types-WTr9W5Ud.d.cts → diagnostics-DRxhodP6.d.ts} +74 -2
- package/dist/diagrams/blockdiagram/index.d.cts +1 -1
- package/dist/diagrams/blockdiagram/index.d.ts +1 -1
- package/dist/diagrams/circuit/index.cjs +8 -8
- package/dist/diagrams/circuit/index.d.cts +1 -1
- package/dist/diagrams/circuit/index.d.ts +1 -1
- package/dist/diagrams/circuit/index.js +2 -2
- package/dist/diagrams/ecomap/index.cjs +7 -7
- package/dist/diagrams/ecomap/index.d.cts +1 -1
- package/dist/diagrams/ecomap/index.d.ts +1 -1
- package/dist/diagrams/ecomap/index.js +2 -2
- package/dist/diagrams/entity/index.cjs +6 -6
- package/dist/diagrams/entity/index.d.cts +1 -1
- package/dist/diagrams/entity/index.d.ts +1 -1
- package/dist/diagrams/entity/index.js +2 -2
- package/dist/diagrams/fishbone/index.cjs +8 -8
- package/dist/diagrams/fishbone/index.d.cts +1 -1
- package/dist/diagrams/fishbone/index.d.ts +1 -1
- package/dist/diagrams/fishbone/index.js +2 -2
- package/dist/diagrams/flowchart/index.cjs +8 -8
- package/dist/diagrams/flowchart/index.d.cts +2 -2
- package/dist/diagrams/flowchart/index.d.ts +2 -2
- package/dist/diagrams/flowchart/index.js +2 -2
- package/dist/diagrams/genogram/index.cjs +9 -9
- package/dist/diagrams/genogram/index.d.cts +1 -1
- package/dist/diagrams/genogram/index.d.ts +1 -1
- package/dist/diagrams/genogram/index.js +2 -2
- package/dist/diagrams/ladder/index.cjs +6 -6
- package/dist/diagrams/ladder/index.d.cts +1 -1
- package/dist/diagrams/ladder/index.d.ts +1 -1
- package/dist/diagrams/ladder/index.js +2 -2
- package/dist/diagrams/logic/index.cjs +6 -6
- package/dist/diagrams/logic/index.d.cts +1 -1
- package/dist/diagrams/logic/index.d.ts +1 -1
- package/dist/diagrams/logic/index.js +2 -2
- package/dist/diagrams/orgchart/index.cjs +7 -7
- package/dist/diagrams/orgchart/index.d.cts +1 -1
- package/dist/diagrams/orgchart/index.d.ts +1 -1
- package/dist/diagrams/orgchart/index.js +2 -2
- package/dist/diagrams/pedigree/index.cjs +7 -7
- package/dist/diagrams/pedigree/index.d.cts +1 -1
- package/dist/diagrams/pedigree/index.d.ts +1 -1
- package/dist/diagrams/pedigree/index.js +2 -2
- package/dist/diagrams/phylo/index.cjs +7 -7
- package/dist/diagrams/phylo/index.d.cts +1 -1
- package/dist/diagrams/phylo/index.d.ts +1 -1
- package/dist/diagrams/phylo/index.js +2 -2
- package/dist/diagrams/sld/index.cjs +14 -6
- package/dist/diagrams/sld/index.d.cts +14 -2
- package/dist/diagrams/sld/index.d.ts +14 -2
- package/dist/diagrams/sld/index.js +2 -2
- package/dist/diagrams/sociogram/index.cjs +6 -6
- package/dist/diagrams/sociogram/index.d.cts +1 -1
- package/dist/diagrams/sociogram/index.d.ts +1 -1
- package/dist/diagrams/sociogram/index.js +2 -2
- package/dist/diagrams/timing/index.d.cts +1 -1
- package/dist/diagrams/timing/index.d.ts +1 -1
- package/dist/diagrams/venn/index.cjs +9 -9
- package/dist/diagrams/venn/index.d.cts +1 -1
- package/dist/diagrams/venn/index.d.ts +1 -1
- package/dist/diagrams/venn/index.js +2 -2
- package/dist/{index-C30zQWZI.d.ts → index-BRIkOPnd.d.cts} +60 -2
- package/dist/{index-BD2yDfQM.d.cts → index-C7SN-FB3.d.ts} +60 -2
- package/dist/index.cjs +342 -54
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +38 -4
- package/dist/index.d.ts +38 -4
- package/dist/index.js +283 -16
- package/dist/index.js.map +1 -1
- package/dist/react.cjs +17 -17
- package/dist/react.d.cts +2 -2
- package/dist/react.d.ts +2 -2
- package/dist/react.js +16 -16
- package/dist/{tools-BHWaJPOl.d.ts → tools-BVeUNdsU.d.ts} +12 -4
- package/dist/{tools-DlpuE76u.d.cts → tools-DdhP1kWY.d.cts} +12 -4
- package/package.json +1 -1
- package/dist/chunk-2VNMKOUO.js.map +0 -1
- package/dist/chunk-3M6WB62Y.cjs.map +0 -1
- package/dist/chunk-4QPDZJAL.cjs.map +0 -1
- package/dist/chunk-6OSUNBZY.js.map +0 -1
- package/dist/chunk-D7EHZFK4.cjs.map +0 -1
- package/dist/chunk-HK56GQQP.cjs.map +0 -1
- package/dist/chunk-OK5ZS3LU.js.map +0 -1
- package/dist/chunk-QMTWG6JL.cjs.map +0 -1
- package/dist/chunk-QTNPMIO2.cjs.map +0 -1
- package/dist/chunk-TZTCIAYW.cjs.map +0 -1
- package/dist/chunk-UFTYX73U.js.map +0 -1
- package/dist/chunk-VCH7RI5H.js.map +0 -1
- package/dist/chunk-VJGMEGMR.js.map +0 -1
- package/dist/chunk-VKPCR7BG.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/diagrams/decisiontree/parser.ts","../src/diagrams/decisiontree/layout.ts","../src/diagrams/decisiontree/renderer.ts","../src/diagrams/decisiontree/index.ts","../src/diagrams/timeline/dates.ts","../src/diagrams/timeline/parser.ts","../src/diagrams/timeline/layout.ts","../src/diagrams/timeline/renderer.ts","../src/diagrams/timeline/index.ts","../src/diagrams/state/parser.ts","../src/diagrams/state/layout.ts","../src/diagrams/state/renderer.ts","../src/diagrams/state/index.ts","../src/diagrams/pid/parser.ts","../src/diagrams/pid/symbols.ts","../src/diagrams/pid/layout.ts","../src/diagrams/pid/renderer.ts","../src/diagrams/pid/lint.ts","../src/diagrams/pid/index.ts","../src/diagrams/prisma/parser.ts","../src/diagrams/prisma/layout.ts","../src/diagrams/prisma/renderer.ts","../src/diagrams/prisma/index.ts","../src/diagrams/usecase/parser.ts","../src/diagrams/usecase/layout.ts","../src/diagrams/usecase/renderer.ts","../src/diagrams/usecase/index.ts","../src/diagrams/pert/parser.ts","../src/diagrams/pert/scheduler.ts","../src/diagrams/pert/aoa.ts","../src/diagrams/pert/layout.ts","../src/diagrams/pert/renderer.ts","../src/diagrams/pert/index.ts","../src/diagrams/sequence/parser.ts","../src/diagrams/sequence/layout.ts","../src/diagrams/sequence/renderer.ts","../src/diagrams/sequence/index.ts","../src/diagrams/petri/parser.ts","../src/diagrams/petri/layout.ts","../src/diagrams/petri/renderer.ts","../src/diagrams/petri/index.ts","../src/diagrams/network/parser.ts","../src/diagrams/network/symbols.ts","../src/diagrams/network/layout.ts","../src/diagrams/network/renderer.ts","../src/diagrams/network/index.ts","../src/core/diagnostics.ts","../src/diagrams/mindmap/inline.ts","../src/diagrams/mindmap/parser.ts","../src/diagrams/mindmap/layout.ts","../src/diagrams/mindmap/renderer.ts","../src/diagrams/mindmap/index.ts","../src/diagrams/matrix/templates.ts","../src/diagrams/matrix/parser.ts","../src/diagrams/matrix/layout.ts","../src/diagrams/matrix/renderer.ts","../src/diagrams/matrix/index.ts","../src/diagrams/erd/parser.ts","../src/diagrams/erd/layout.ts","../src/diagrams/erd/renderer.ts","../src/diagrams/erd/index.ts","../src/diagrams/breadboard/parser.ts","../src/diagrams/breadboard/parts.ts","../src/diagrams/breadboard/layout.ts","../src/diagrams/breadboard/renderer.ts","../src/diagrams/breadboard/index.ts","../src/diagrams/bpmn/parser.ts","../src/diagrams/bpmn/layout.ts","../src/diagrams/bpmn/renderer.ts","../src/diagrams/bpmn/index.ts","../src/diagrams/fbd/blocks.ts","../src/diagrams/fbd/parser.ts","../src/diagrams/fbd/layout.ts","../src/diagrams/fbd/renderer.ts","../src/diagrams/fbd/index.ts","../src/diagrams/sfc/parser.ts","../src/diagrams/sfc/layout.ts","../src/diagrams/sfc/renderer.ts","../src/diagrams/sfc/index.ts","../src/core/api.ts"],"names":["line","text","title","stub","startX","startY","endX","endY","PADDING","rect","circle","polygon","path","group","resolveBaseTheme","desc","el","svgRoot","escapeXml","preprocess","nextId","parsed","x","ERA_BAND_HEIGHT","resolveTimelineTheme","defs","cssCustomProperties","wrapText","unquote","node","layoutFlowchart","sign","activityText","STYLE","renderLayout","arrow","buildCss","state","stripQuotes","C","minY","maxY","legPaths","arrowKind","classForEdge","renderEdge","markers","round","START","routeEdge","sx","sy","tx","ty","mid","d","layoutSwimlane","renderBox","renderEdgeLabel","renderAxis","matchQuotedTitle","lineClass","renderNote","tokenize","j","buf","sizeOf","pid","dx","dy","resolvePetriTheme","stripComment","bw","bh","y","layoutNetwork","r2","resolveNetworkTheme","idCounter","ln","height","renderLine","renderNode","underlineY","resolveMindmapTheme","readQuoted","parseNumberList","parseProperties","parseHeader","CHAR_W","renderLegend","declRaw","id","name","attributes","lex","KIND_ALIASES","PITCH","stripY","pins","labelText","fmt","multilineText","network","buildGraph","renderNetwork","tokenizeLines","parseVarDecl","parseAttrs","totalW","maxH","totalH","STYLES","arrowMarker","genogram","ecomap","pedigree","phylo","sociogram","timing","logic","circuit","blockdiagram","ladder","sld","entity","fishbone","venn","flowchart","orgchart","parseFrontmatter"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAUO,IAAM,eAAA,GAAN,cAA8B,KAAA,CAAM;AAAA,EACzC,WAAA,CACE,OAAA,EACOA,KAAAA,EACA,MAAA,EACA,MAAA,EACP;AACA,IAAA,KAAA,CAAMA,UAAS,MAAA,GAAY,CAAA,KAAA,EAAQA,KAAI,CAAA,EAAA,EAAK,OAAO,KAAK,OAAO,CAAA;AAJxD,IAAA,IAAA,CAAA,IAAA,GAAAA,KAAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAGP,IAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AAAA,EACd;AAAA,EANS,IAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAKX,CAAA;AAQA,SAAS,WAAW,GAAA,EAAwB;AAC1C,EAAA,MAAM,MAAiB,EAAC;AACxB,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA;AAC/B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,GAAA,GAAM,MAAM,CAAC,CAAA;AACnB,IAAA,IAAI,QAAQ,MAAA,EAAW;AACvB,IAAA,IAAI,CAAC,GAAA,CAAI,IAAA,EAAK,IAAK,IAAI,IAAA,EAAK,CAAE,UAAA,CAAW,GAAG,KAAK,GAAA,CAAI,IAAA,EAAK,CAAE,UAAA,CAAW,IAAI,CAAA,EAAG;AAC9E,IAAA,MAAM,eAAe,GAAA,CAAI,MAAA,GAAS,IAAI,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA,CAAE,MAAA;AAC1D,IAAA,GAAA,CAAI,IAAA,CAAK,EAAE,MAAA,EAAQ,IAAA,CAAK,MAAM,YAAA,GAAe,CAAC,CAAA,EAAG,IAAA,EAAM,IAAI,IAAA,EAAK,EAAG,IAAA,EAAM,CAAA,GAAI,GAAG,CAAA;AAAA,EAClF;AACA,EAAA,OAAO,GAAA;AACT;AAIA,SAAS,SAAS,CAAA,EAAqB;AACrC,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,OAAO,CAAA,GAAI,EAAE,MAAA,EAAQ;AACnB,IAAA,MAAM,EAAA,GAAK,EAAE,CAAC,CAAA;AACd,IAAA,IAAI,IAAA,CAAK,IAAA,CAAK,EAAE,CAAA,EAAG;AAAE,MAAA,CAAA,EAAA;AAAK,MAAA;AAAA,IAAU;AACpC,IAAA,IAAI,OAAO,GAAA,EAAK;AACd,MAAA,MAAM,GAAA,GAAM,CAAA,CAAE,OAAA,CAAQ,GAAA,EAAK,IAAI,CAAC,CAAA;AAChC,MAAA,IAAI,MAAM,CAAA,EAAG,MAAM,IAAI,eAAA,CAAgB,CAAA,qBAAA,EAAwB,CAAC,CAAA,CAAE,CAAA;AAClE,MAAA,MAAA,CAAO,KAAK,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,GAAA,GAAM,CAAC,CAAC,CAAA;AAC/B,MAAA,CAAA,GAAI,GAAA,GAAM,CAAA;AACV,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAA,GAAI,CAAA;AACR,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,OAAO,CAAA,GAAI,EAAE,MAAA,EAAQ;AACnB,MAAA,MAAM,CAAA,GAAI,EAAE,CAAC,CAAA;AACb,MAAA,IAAI,MAAM,GAAA,EAAK,OAAA,EAAA;AAAA,WAAA,IACN,MAAM,GAAA,EAAK,OAAA,EAAA;AAAA,WAAA,IACX,OAAA,KAAY,CAAA,IAAK,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,EAAG;AAAA,WAAA,IAC/B,OAAA,KAAY,CAAA,IAAK,CAAA,KAAM,GAAA,EAAK;AACrC,MAAA,CAAA,EAAA;AAAA,IACF;AACA,IAAA,MAAA,CAAO,IAAA,CAAK,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA;AACzB,IAAA,CAAA,GAAI,CAAA;AAAA,EACN;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,QAAQ,CAAA,EAAmB;AAClC,EAAA,IAAI,CAAA,CAAE,UAAA,CAAW,GAAG,CAAA,IAAK,CAAA,CAAE,QAAA,CAAS,GAAG,CAAA,EAAG,OAAO,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAC9D,EAAA,OAAO,CAAA;AACT;AAEA,SAAS,QAAQ,MAAA,EAAsF;AACrG,EAAA,MAAM,OAA+B,EAAC;AACtC,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,OAAiB,EAAC;AACxB,EAAA,KAAA,MAAW,OAAO,MAAA,EAAQ;AACxB,IAAA,IAAI,IAAI,UAAA,CAAW,GAAG,KAAK,GAAA,CAAI,QAAA,CAAS,GAAG,CAAA,EAAG;AAC5C,MAAA,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAC,CAAA;AAAA,IAC1B,CAAA,MAAA,IAAW,GAAA,CAAI,QAAA,CAAS,GAAG,CAAA,EAAG;AAC5B,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAA;AAC3B,MAAA,MAAM,CAAA,GAAI,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA;AAC1B,MAAA,MAAM,CAAA,GAAI,GAAA,CAAI,KAAA,CAAM,GAAA,GAAM,CAAC,CAAA;AAC3B,MAAA,IAAA,CAAK,CAAC,CAAA,GAAI,CAAA;AAAA,IACZ,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,KAAK,GAAG,CAAA;AAAA,IACf;AAAA,EACF;AACA,EAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAK;AAC9B;AAEA,SAAS,gBAAgB,CAAA,EAAqB;AAC5C,EAAA,MAAM,KAAA,GAAQ,EAAE,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA,CAAE,OAAA,CAAQ,OAAO,EAAE,CAAA;AACpD,EAAA,OAAO,KAAA,CAAM,MAAM,GAAG,CAAA,CAAE,IAAI,CAAC,CAAA,KAAM,OAAO,CAAA,CAAE,IAAA,EAAM,CAAC,CAAA,CAAE,OAAO,CAAC,CAAA,KAAM,CAAC,MAAA,CAAO,KAAA,CAAM,CAAC,CAAC,CAAA;AACrF;AAIA,IAAI,SAAA,GAAY,CAAA;AAChB,SAAS,MAAA,CAAO,SAAS,GAAA,EAAa;AACpC,EAAA,SAAA,EAAA;AACA,EAAA,OAAO,CAAA,EAAG,MAAM,CAAA,EAAG,SAAS,CAAA,CAAA;AAC9B;AAOA,SAAS,iBAAA,CAAkB,MAAA,EAAkB,IAAA,EAAoB,OAAA,EAA4B;AAG3F,EAAA,IAAI,GAAA,GAAM,CAAA;AACV,EAAA,IAAI,cAAA;AACJ,EAAA,IAAI,YAAA;AAEJ,EAAA,IAAI,MAAA,CAAO,GAAG,CAAA,KAAM,QAAA,EAAU;AAC5B,IAAA,GAAA,EAAA;AACA,IAAA,MAAM,IAAA,GAAO,OAAO,GAAG,CAAA;AACvB,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG,MAAM,IAAI,eAAA,CAAgB,CAAA,yBAAA,CAAA,EAA6B,OAAO,CAAA;AAClG,IAAA,cAAA,GAAiB,QAAQ,IAAI,CAAA;AAC7B,IAAA,GAAA,EAAA;AAEA,IAAA,IAAI,GAAA,IAAO,OAAO,MAAA,EAAQ;AACxB,MAAA,OAAO;AAAA,QACL,IAAI,MAAA,EAAO;AAAA,QACX,IAAA,EAAM,UAAA;AAAA;AAAA,QACN,KAAA,EAAO,EAAA;AAAA,QACP,UAAU,EAAC;AAAA,QACX,cAAA;AAAA;AAAA,QAEA,QAAA,EAAU;AAAA,OACZ;AAAA,IACF;AAAA,EACF,CAAA,MAAA,IAAW,MAAA,CAAO,GAAG,CAAA,KAAM,MAAA,EAAQ;AACjC,IAAA,GAAA,EAAA;AACA,IAAA,MAAM,CAAA,GAAI,MAAA,CAAO,MAAA,CAAO,GAAG,CAAC,CAAA;AAC5B,IAAA,IAAI,MAAA,CAAO,MAAM,CAAC,CAAA,QAAS,IAAI,eAAA,CAAgB,yCAAyC,OAAO,CAAA;AAC/F,IAAA,YAAA,GAAe,CAAA;AACf,IAAA,GAAA,EAAA;AAAA,EACF;AAEA,EAAA,MAAM,EAAA,GAAK,OAAO,GAAG,CAAA;AACrB,EAAA,IAAI,CAAC,EAAA,EAAI,MAAM,IAAI,eAAA,CAAgB,qBAAqB,OAAO,CAAA;AAC/D,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,GAAA,GAAM,CAAC,CAAA;AACjC,EAAA,MAAM,MAAA,GAAS,QAAQ,IAAI,CAAA;AAE3B,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,EAAA,KAAO,YAAY,IAAA,GAAO,UAAA;AAAA,OAAA,IACrB,EAAA,KAAO,UAAU,IAAA,GAAO,QAAA;AAAA,OAAA,IACxB,EAAA,KAAO,KAAA,IAAS,EAAA,KAAO,SAAA,EAAW,IAAA,GAAO,KAAA;AAAA,aACvC,IAAI,eAAA,CAAgB,CAAA,mBAAA,EAAsB,EAAE,sBAAsB,OAAO,CAAA;AAEpF,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,IAAK,EAAA;AAClC,EAAA,MAAM,SAAA,GAAY,OAAO,IAAA,CAAK,MAAA;AAC9B,EAAA,MAAM,MAAA,GAAS,SAAA,KAAc,MAAA,GAAY,MAAA,CAAO,SAAS,CAAA,GAAI,MAAA;AAE7D,EAAA,OAAO;AAAA,IACL,IAAI,MAAA,EAAO;AAAA,IACX,IAAA;AAAA,IACA,KAAA;AAAA,IACA,UAAU,EAAC;AAAA,IACX,cAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,WAAA,CAAY,MAAA,EAAkB,GAAA,EAAmB,OAAA,EAA4B;AAEpF,EAAA,IAAI,GAAA,GAAM,CAAA;AACV,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI,OAAO,GAAG,CAAA,KAAM,UAAU,MAAA,CAAO,GAAG,MAAM,OAAA,EAAS;AACrD,IAAA,QAAA,GAAW,OAAO,GAAG,CAAA;AACrB,IAAA,GAAA,EAAA;AAAA,EACF;AAEA,EAAA,MAAM,EAAA,GAAK,OAAO,GAAG,CAAA;AACrB,EAAA,IAAI,CAAC,EAAA,EAAI,MAAM,IAAI,eAAA,CAAgB,wBAAwB,OAAO,CAAA;AAClE,EAAA,GAAA,EAAA;AACA,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA;AAC7B,EAAA,MAAM,MAAA,GAAS,QAAQ,IAAI,CAAA;AAE3B,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,EAAA,KAAO,SAAS,IAAA,GAAO,OAAA;AAAA,OAAA,IAClB,EAAA,KAAO,QAAQ,IAAA,GAAO,MAAA;AAAA,aACpB,IAAI,eAAA,CAAgB,CAAA,sBAAA,EAAyB,EAAE,KAAK,OAAO,CAAA;AAEtE,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,IAAK,EAAA;AAClC,EAAA,MAAM,IAAI,MAAA,CAAO,IAAA;AAEjB,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI,CAAA,CAAE,UAAU,MAAA,EAAW;AACzB,IAAA,IAAI,CAAA,CAAE,MAAM,UAAA,CAAW,GAAG,GAAG,KAAA,GAAQ,eAAA,CAAgB,EAAE,KAAK,CAAA;AAAA,SACvD,KAAA,GAAQ,MAAA,CAAO,CAAA,CAAE,KAAK,CAAA;AAAA,EAC7B;AACA,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,GAAA,CAAI,UAAA,GAAa,IAAA;AAGhD,EAAA,IAAI,QAAA;AACJ,EAAA,KAAA,MAAW,UAAU,CAAC,MAAA,EAAQ,WAAW,KAAA,EAAO,MAAA,EAAQ,UAAU,CAAA,EAAG;AACnE,IAAA,IAAI,CAAA,CAAE,MAAM,CAAA,KAAM,MAAA,EAAW;AAC3B,MAAA,QAAA,GAAW,MAAA,CAAO,CAAA,CAAE,MAAM,CAAC,CAAA;AAC3B,MAAA;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAI,MAAA,EAAO;AAAA,IACX,IAAA;AAAA,IACA,KAAA;AAAA,IACA,UAAU,EAAC;AAAA,IACX,SAAS,CAAA,CAAE,OAAA;AAAA,IACX,IAAI,CAAA,CAAE,EAAA;AAAA,IACN,WAAW,CAAA,CAAE,SAAA,KAAc,MAAA,GAAa,MAAA,CAAO,MAAM,MAAA,CAAO,CAAA,CAAE,SAAS,CAAC,IAAI,CAAA,CAAE,SAAA,GAAY,MAAA,CAAO,CAAA,CAAE,SAAS,CAAA,GAAK,MAAA;AAAA,IACjH,SAAS,CAAA,CAAE,OAAA,KAAY,SAAY,MAAA,CAAO,CAAA,CAAE,OAAO,CAAA,GAAI,MAAA;AAAA,IACvD,KAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAW,CAAA,CAAE;AAAA,GACf;AACF;AAEA,SAAS,iBAAA,CAAkB,MAAA,EAAkB,IAAA,EAAoB,OAAA,EAA4B;AAU3F,EAAA,IAAI,GAAA,GAAM,CAAA;AACV,EAAA,IAAI,WAAA;AAEJ,EAAA,IAAI,OAAO,GAAG,CAAA,KAAM,UAAU,MAAA,CAAO,GAAG,MAAM,KAAA,EAAO;AACnD,IAAA,WAAA,GAAc,MAAA,CAAO,GAAG,CAAA,CAAG,OAAA,CAAQ,KAAK,EAAE,CAAA;AAC1C,IAAA,GAAA,EAAA;AAAA,EACF,CAAA,MAAA,IAAW,MAAA,CAAO,GAAG,CAAA,KAAM,OAAA,EAAS;AAClC,IAAA,GAAA,EAAA;AACA,IAAA,MAAM,GAAA,GAAM,OAAO,GAAG,CAAA;AACtB,IAAA,IAAI,CAAC,GAAA,IAAO,CAAC,GAAA,CAAI,UAAA,CAAW,GAAG,CAAA,EAAG,MAAM,IAAI,eAAA,CAAgB,CAAA,gCAAA,CAAA,EAAoC,OAAO,CAAA;AAEvG,IAAA,WAAA,GAAc,OAAA,CAAQ,GAAA,CAAI,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAC,CAAA;AAE9C,IAAA,IAAI,GAAA,CAAI,QAAA,CAAS,IAAI,CAAA,EAAG;AACxB,IAAA,GAAA,EAAA;AACA,IAAA,IAAI,MAAA,CAAO,GAAG,CAAA,KAAM,GAAA,EAAK,GAAA,EAAA;AAAA,EAC3B;AAEA,EAAA,MAAM,EAAA,GAAK,OAAO,GAAG,CAAA;AACrB,EAAA,IAAI,CAAC,EAAA,EAAI,MAAM,IAAI,eAAA,CAAgB,8BAA8B,OAAO,CAAA;AACxE,EAAA,GAAA,EAAA;AACA,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA;AAC7B,EAAA,MAAM,MAAA,GAAS,QAAQ,IAAI,CAAA;AAE3B,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,EAAA,KAAO,GAAA,IAAO,EAAA,KAAO,UAAA,EAAY,IAAA,GAAO,UAAA;AAAA,OAAA,IACnC,OAAO,GAAA,IAAO,EAAA,KAAO,QAAA,IAAY,EAAA,KAAO,QAAQ,IAAA,GAAO,QAAA;AAAA,aACrD,IAAI,eAAA,CAAgB,CAAA,4BAAA,EAA+B,EAAE,KAAK,OAAO,CAAA;AAE5E,EAAA,OAAO;AAAA,IACL,IAAI,MAAA,EAAO;AAAA,IACX,IAAA;AAAA,IACA,KAAA,EAAO,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,IAAK,EAAA;AAAA,IAC3B,UAAU,EAAC;AAAA,IACX;AAAA,GACF;AACF;AAEA,SAAS,aAAA,CAAcC,KAAAA,EAAc,IAAA,EAAiB,GAAA,EAAmB,OAAA,EAA4B;AAGnG,EAAA,MAAM,UAAA,GAAaA,KAAAA,CAAK,OAAA,CAAQ,WAAA,EAAa,MAAM,CAAA;AACnD,EAAA,MAAM,MAAA,GAAS,SAAS,UAAU,CAAA,CAAE,OAAO,CAAC,CAAA,KAAM,MAAM,GAAG,CAAA;AAC3D,EAAA,IAAI,SAAS,UAAA,EAAY,OAAO,iBAAA,CAAkB,MAAA,EAAQ,KAAK,OAAO,CAAA;AACtE,EAAA,IAAI,SAAS,IAAA,EAAM,OAAO,WAAA,CAAY,MAAA,EAAQ,KAAK,OAAO,CAAA;AAC1D,EAAA,OAAO,iBAAA,CAAkB,MAAA,EAAQ,GAAA,EAAK,OAAO,CAAA;AAC/C;AAEA,SAAS,SAAA,CAAU,KAAA,EAAkB,IAAA,EAAiB,GAAA,EAA8B;AAClF,EAAA,IAAI,MAAM,MAAA,KAAW,CAAA,EAAG,MAAM,IAAI,gBAAgB,cAAc,CAAA;AAChE,EAAA,MAAM,CAAC,KAAA,EAAO,GAAG,IAAI,CAAA,GAAI,KAAA;AACzB,EAAA,IAAI,CAAC,KAAA,EAAO,MAAM,IAAI,gBAAgB,cAAc,CAAA;AACpD,EAAA,MAAM,OAAO,aAAA,CAAc,KAAA,CAAM,MAAM,IAAA,EAAM,GAAA,EAAK,MAAM,IAAI,CAAA;AAC5D,EAAA,MAAM,KAAA,GAAoD,CAAC,EAAE,IAAA,EAAM,MAAM,MAAA,EAAQ,KAAA,CAAM,QAAQ,CAAA;AAE/F,EAAA,KAAA,MAAWD,SAAQ,IAAA,EAAM;AACvB,IAAA,MAAM,OAAO,aAAA,CAAcA,KAAAA,CAAK,MAAM,IAAA,EAAM,GAAA,EAAKA,MAAK,IAAI,CAAA;AAC1D,IAAA,OAAO,KAAA,CAAM,MAAA,GAAS,CAAA,IAAK,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,CAAG,MAAA,IAAUA,KAAAA,CAAK,MAAA,EAAQ,KAAA,CAAM,GAAA,EAAI;AACrF,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AACrC,IAAA,IAAI,CAAC,MAAA,EAAQ,MAAM,IAAI,eAAA,CAAgB,6BAA6BA,KAAAA,CAAK,IAAI,CAAA,CAAA,EAAIA,KAAAA,CAAK,IAAI,CAAA;AAC1F,IAAA,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AAC9B,IAAA,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,MAAA,EAAQA,KAAAA,CAAK,QAAQ,CAAA;AAAA,EAC1C;AAEA,EAAA,OAAO,iBAAiB,IAAI,CAAA;AAC9B;AAGA,SAAS,iBAAiB,IAAA,EAA4B;AACpD,EAAA,IAAA,CAAK,QAAA,GAAW,KAAK,QAAA,CAAS,GAAA,CAAI,gBAAgB,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,KAAM;AACjE,IAAA,MAAM,IAAA,GAAO,CAAA;AACb,IAAA,IAAI,IAAA,CAAK,aAAa,QAAA,EAAU;AAC9B,MAAA,OAAO,CAAA,CAAE,QAAA,CAAS,GAAA,CAAI,CAAC,EAAA,MAAQ,EAAE,GAAG,EAAA,EAAI,cAAA,EAAgB,CAAA,CAAE,cAAA,EAAe,CAAE,CAAA;AAAA,IAC7E;AACA,IAAA,OAAO,CAAC,CAAC,CAAA;AAAA,EACX,CAAC,CAAA;AACD,EAAA,OAAO,IAAA;AACT;AAIA,SAAS,UAAU,IAAA,EAAuB;AACxC,EAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,QAAA,EAAU,SAAA,CAAU,CAAC,CAAA;AAC1C,EAAA,IAAI,IAAA,CAAK,SAAS,KAAA,EAAO;AACvB,IAAA,IAAA,CAAK,EAAA,GAAK,KAAK,MAAA,IAAU,CAAA;AACzB,IAAA;AAAA,EACF;AACA,EAAA,IAAI,IAAA,CAAK,SAAS,QAAA,EAAU;AAC1B,IAAA,IAAI,GAAA,GAAM,CAAA;AACV,IAAA,KAAA,MAAW,CAAA,IAAK,KAAK,QAAA,EAAU,GAAA,IAAA,CAAQ,EAAE,YAAA,IAAgB,CAAA,KAAM,EAAE,EAAA,IAAM,CAAA,CAAA;AACvE,IAAA,IAAA,CAAK,EAAA,GAAK,GAAA;AACV,IAAA;AAAA,EACF;AACA,EAAA,IAAI,IAAA,CAAK,SAAS,UAAA,EAAY;AAC5B,IAAA,IAAI,IAAA,GAAO,CAAA,QAAA;AACX,IAAA,KAAA,MAAW,CAAA,IAAK,KAAK,QAAA,EAAU;AAC7B,MAAA,IAAA,CAAK,EAAE,EAAA,IAAM,CAAA,QAAA,IAAa,IAAA,EAAM,IAAA,GAAO,EAAE,EAAA,IAAM,CAAA,QAAA;AAAA,IACjD;AACA,IAAA,IAAA,CAAK,EAAA,GAAK,IAAA;AACV,IAAA,KAAA,MAAW,CAAA,IAAK,KAAK,QAAA,EAAU;AAC7B,MAAA,IAAA,CAAK,CAAA,CAAE,EAAA,IAAM,CAAA,QAAA,MAAe,IAAA,IAAQ,OAAA,GAAU,IAAA;AAAA,IAChD;AACA,IAAA;AAAA,EACF;AACF;AAEA,SAAS,gBAAA,CAAiB,MAAiB,OAAA,EAAoC;AAC7E,EAAA,IAAI,KAAK,IAAA,KAAS,QAAA,IAAY,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA,EAAG;AACtD,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,IAAK,CAAA,CAAE,YAAA,IAAgB,CAAA,CAAA,EAAI,CAAC,CAAA;AACvE,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,GAAA,GAAM,CAAC,IAAI,IAAA,EAAM;AAC5B,MAAA,MAAM,IAAI,eAAA;AAAA,QACR,WAAW,IAAA,CAAK,KAAK,0CAA0C,GAAA,CAAI,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA;AAAA,OAC/E;AAAA,IACF;AAAA,EACF;AACA,EAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,QAAA,EAAU,gBAAA,CAAiB,CAAU,CAAA;AAC5D;AAIO,SAAS,kBAAkB,GAAA,EAAuB;AACvD,EAAA,SAAA,GAAY,CAAA;AACZ,EAAA,MAAM,KAAA,GAAQ,WAAW,GAAG,CAAA;AAC5B,EAAA,IAAI,MAAM,MAAA,KAAW,CAAA,EAAG,MAAM,IAAI,gBAAgB,aAAa,CAAA;AAG/D,EAAA,MAAM,MAAA,GAAS,MAAM,KAAA,EAAM;AAC3B,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,gDAAgD,CAAA;AACtF,EAAA,IAAI,CAAC,WAAA,EAAa,MAAM,IAAI,eAAA,CAAgB,mBAAmB,MAAA,CAAO,IAAI,CAAA,CAAA,EAAI,MAAA,CAAO,IAAI,CAAA;AACzF,EAAA,MAAM,OAAA,GAAA,CAAW,WAAA,CAAY,CAAC,CAAA,IAAK,YAAY,WAAA,EAAY;AAC3D,EAAA,MAAM,IAAA,GACJ,YAAY,UAAA,IAAc,OAAA,KAAY,OAAO,UAAA,GAC3C,OAAA,KAAY,OAAO,IAAA,GACnB,UAAA;AACJ,EAAA,MAAME,MAAAA,GAAQ,YAAY,CAAC,CAAA;AAI3B,EAAA,MAAM,YAAA,uBAAmB,GAAA,CAAI;AAAA,IAC3B,UAAA;AAAA,IAAY,QAAA;AAAA,IAAU,KAAA;AAAA,IAAO,SAAA;AAAA,IAAW,QAAA;AAAA,IAAU,MAAA;AAAA,IAClD,OAAA;AAAA,IAAS,MAAA;AAAA,IAAQ,MAAA;AAAA,IAAQ,OAAA;AAAA,IACzB,GAAA;AAAA,IAAK,UAAA;AAAA,IAAY,GAAA;AAAA,IAAK,QAAA;AAAA,IAAU,MAAA;AAAA,IAAQ,KAAA;AAAA,IAAO;AAAA,GAChD,CAAA;AACD,EAAA,MAAM,SAAiC,EAAC;AACxC,EAAA,OAAO,KAAA,CAAM,SAAS,CAAA,EAAG;AACvB,IAAA,MAAM,CAAA,GAAI,MAAM,CAAC,CAAA;AACjB,IAAA,MAAM,WAAW,CAAA,CAAE,IAAA,CAAK,KAAA,CAAM,KAAK,EAAE,CAAC,CAAA;AACtC,IAAA,IAAI,YAAA,CAAa,GAAA,CAAI,QAAQ,CAAA,EAAG;AAChC,IAAA,MAAM,CAAA,GAAI,CAAA,CAAE,IAAA,CAAK,KAAA,CAAM,+BAA+B,CAAA;AACtD,IAAA,IAAI,CAAC,CAAA,EAAG;AACR,IAAA,MAAA,CAAO,EAAE,CAAC,CAAE,IAAI,CAAA,CAAE,CAAC,EAAG,IAAA,EAAK;AAC3B,IAAA,KAAA,CAAM,KAAA,EAAM;AAAA,EACd;AAEA,EAAA,IAAI,SAAA,GAA4B,UAAA;AAChC,EAAA,IAAI,OAAO,SAAA,KAAc,YAAA,IAAgB,MAAA,CAAO,SAAA,KAAc,MAAM,SAAA,GAAY,YAAA;AAChF,EAAA,IAAI,IAAA,KAAS,UAAA,IAAc,CAAC,MAAA,CAAO,WAAW,SAAA,GAAY,YAAA;AAE1D,EAAA,MAAM,UAAU,MAAA,CAAO,OAAA,GACnB,MAAA,CAAO,OAAA,CAAQ,MAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,GAC7D,MAAA;AAEJ,EAAA,IAAI,YAAA;AACJ,EAAA,IAAI,OAAO,QAAA,EAAU;AACnB,IAAA,MAAM,CAAA,GAAI,MAAA,CAAO,QAAA,CAAS,WAAA,EAAY;AACtC,IAAA,IAAI,CAAA,KAAM,UAAU,CAAA,KAAM,SAAA,IAAa,MAAM,KAAA,IAAS,CAAA,KAAM,QAAQ,YAAA,GAAe,CAAA;AAAA,EACrF;AAEA,EAAA,MAAM,YAAA,GACJ,OAAO,YAAA,KAAiB,UAAA,IAAc,OAAO,eAAe,CAAA,KAAM,aAAa,UAAA,GAAa,SAAA;AAE9F,EAAA,MAAM,mBAAmB,MAAA,CAAO,YAAA,KAAiB,aAAA,IAAiB,MAAA,CAAO,eAAe,CAAA,KAAM,aAAA;AAE9F,EAAA,IAAI,SAAA;AACJ,EAAA,MAAM,MAAM,MAAA,CAAO,SAAA,IAAa,OAAO,YAAY,CAAA,IAAK,IAAI,WAAA,EAAY;AACxE,EAAA,IAAI,OAAO,UAAA,IAAc,EAAA,KAAO,YAAA,IAAgB,EAAA,KAAO,WAAW,SAAA,GAAY,EAAA;AAE9E,EAAA,MAAM,GAAA,GAAoB,EAAQ,UAAA,EAAY,KAAA,EAAM;AACpD,EAAA,MAAM,IAAA,GAAO,SAAA,CAAU,KAAA,EAAO,IAAA,EAAM,GAAG,CAAA;AAEvC,EAAA,IAAI,SAAS,UAAA,EAAY;AACvB,IAAA,gBAAA,CAAiB,IAAe,CAAA;AAChC,IAAA,SAAA,CAAU,IAAI,CAAA;AAAA,EAChB;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,cAAA;AAAA,IACN,IAAA;AAAA,IACA,KAAA,EAAAA,MAAAA;AAAA,IACA,SAAA;AAAA,IACA,OAAA;AAAA,IACA,YAAA,EAAc,YAAA,KAAiB,IAAA,KAAS,IAAA,GAAO,MAAA,GAAS,MAAA,CAAA;AAAA,IACxD,YAAA;AAAA,IACA,gBAAA;AAAA,IACA,SAAA;AAAA,IACA,YAAY,GAAA,CAAI,UAAA;AAAA,IAChB;AAAA,GACF;AACF;;;AC1aA,SAAS,MAAA,CAAO,MAAiB,IAAA,EAAkC;AACjE,EAAA,IAAI,SAAS,UAAA,EAAY;AACvB,IAAA,IAAI,IAAA,CAAK,SAAS,UAAA,EAAY,OAAO,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA,EAAG;AACpD,IAAA,IAAI,IAAA,CAAK,SAAS,QAAA,EAAU,OAAO,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA,EAAG;AAClD,IAAA,OAAO,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAG;AAAA,EACxB;AACA,EAAA,IAAI,SAAS,IAAA,EAAM;AACjB,IAAA,IAAI,IAAA,CAAK,SAAS,OAAA,EAAS,OAAO,EAAE,CAAA,EAAG,GAAA,EAAK,GAAG,GAAA,EAAI;AACnD,IAAA,OAAO,EAAE,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,EAAA,EAAG;AAAA,EACzB;AACA,EAAA,OAAO,EAAE,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,EAAA,EAAG;AACzB;AAcA,SAAS,IAAA,CAAK,IAAA,EAAiB,IAAA,EAAwB,KAAA,EAAe,MAAA,EAAiB;AACrF,EAAA,MAAM,CAAA,GAAQ;AAAA,IACZ,IAAA;AAAA,IAAM,IAAA,EAAM,MAAA,CAAO,IAAA,EAAM,IAAI,CAAA;AAAA,IAAG,KAAA;AAAA,IAAO,MAAA;AAAA,IACvC,UAAU,EAAC;AAAA,IAAG,MAAA,EAAQ,CAAA;AAAA,IAAG,GAAA,EAAK,CAAA;AAAA,IAAG,MAAA,EAAQ,CAAA;AAAA,IAAG,MAAA,EAAQ;AAAA,GACtD;AACA,EAAA,CAAA,CAAE,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,CAAA,EAAG,IAAA,EAAM,KAAA,GAAQ,CAAA,EAAG,CAAC,CAAC,CAAA;AACjE,EAAA,OAAO,CAAA;AACT;AAEA,SAAS,OAAA,CAAQ,GAAO,GAAA,EAAiB;AAAE,EAAA,GAAA,CAAI,KAAK,CAAC,CAAA;AAAG,EAAA,KAAA,MAAW,CAAA,IAAK,CAAA,CAAE,QAAA,EAAU,OAAA,CAAQ,GAAG,GAAG,CAAA;AAAG;AAGrG,SAAS,SAAA,CAAU,GAAO,IAAA,EAAuB;AAC/C,EAAA,OAAO,IAAA,GAAO,CAAA,CAAE,IAAA,CAAK,CAAA,GAAI,EAAE,IAAA,CAAK,CAAA;AAClC;AAQA,SAAS,mBAAA,CAAoB,CAAA,EAAO,IAAA,EAAe,IAAA,EAAc,SAAiB,MAAA,EAA6B;AAC7G,EAAA,IAAI,CAAA,CAAE,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AAC3B,IAAA,CAAA,CAAE,SAAS,MAAA,CAAO,CAAA;AAClB,IAAA,MAAM,MAAA,GAAS,SAAA,CAAU,CAAA,EAAG,IAAI,CAAA;AAChC,IAAA,MAAA,CAAO,CAAA,IAAK,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,IAAI,CAAA,GAAI,OAAA;AACrC,IAAA;AAAA,EACF;AACA,EAAA,KAAA,MAAW,CAAA,IAAK,EAAE,QAAA,EAAU,mBAAA,CAAoB,GAAG,IAAA,EAAM,IAAA,EAAM,SAAS,MAAM,CAAA;AAC9E,EAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,QAAA,CAAS,CAAC,CAAA,CAAG,MAAA;AAC7B,EAAA,MAAM,OAAO,CAAA,CAAE,QAAA,CAAS,EAAE,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA,CAAG,MAAA;AAChD,EAAA,CAAA,CAAE,MAAA,GAAA,CAAU,QAAQ,IAAA,IAAQ,CAAA;AAC9B;AAGA,SAAS,eAAA,CAAgB,GAAO,IAAA,EAA2C;AACzE,EAAA,MAAM,CAAA,GAAI,SAAA,CAAU,CAAA,EAAG,IAAI,CAAA;AAC3B,EAAA,IAAI,EAAA,GAAK,CAAA,CAAE,MAAA,GAAS,CAAA,GAAI,CAAA;AACxB,EAAA,IAAI,EAAA,GAAK,CAAA,CAAE,MAAA,GAAS,CAAA,GAAI,CAAA;AACxB,EAAA,KAAA,MAAW,CAAA,IAAK,EAAE,QAAA,EAAU;AAC1B,IAAA,MAAM,EAAA,GAAK,eAAA,CAAgB,CAAA,EAAG,IAAI,CAAA;AAClC,IAAA,IAAI,EAAA,CAAG,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAA,CAAG,EAAA;AACxB,IAAA,IAAI,EAAA,CAAG,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAA,CAAG,EAAA;AAAA,EAC1B;AACA,EAAA,OAAO,EAAE,IAAI,EAAA,EAAG;AAClB;AAMA,SAAS,aAAA,CAAc,CAAA,EAAO,IAAA,EAAe,MAAA,EAAsB;AACjE,EAAA,KAAA,MAAW,KAAK,CAAA,CAAE,QAAA,EAAU,aAAA,CAAc,CAAA,EAAG,MAAM,MAAM,CAAA;AACzD,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AAC1C,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,QAAA,CAAS,CAAA,GAAI,CAAC,CAAA;AAC7B,IAAA,MAAM,GAAA,GAAM,CAAA,CAAE,QAAA,CAAS,CAAC,CAAA;AACxB,IAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,IAAA,EAAM,IAAI,CAAA;AACxC,IAAA,MAAM,IAAA,GAAO,eAAA,CAAgB,GAAA,EAAK,IAAI,CAAA;AACtC,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,EAAA,GAAK,KAAA,CAAM,EAAA;AAC5B,IAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,MAAA,YAAA,CAAa,GAAA,EAAK,SAAS,GAAG,CAAA;AAAA,IAChC;AAAA,EACF;AACA,EAAA,IAAI,CAAA,CAAE,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG;AACzB,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,QAAA,CAAS,CAAC,CAAA,CAAG,MAAA;AAC7B,IAAA,MAAM,OAAO,CAAA,CAAE,QAAA,CAAS,EAAE,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA,CAAG,MAAA;AAChD,IAAA,CAAA,CAAE,MAAA,GAAA,CAAU,QAAQ,IAAA,IAAQ,CAAA;AAAA,EAC9B;AACF;AAEA,SAAS,YAAA,CAAa,GAAO,EAAA,EAAkB;AAC7C,EAAA,CAAA,CAAE,MAAA,IAAU,EAAA;AACZ,EAAA,KAAA,MAAW,CAAA,IAAK,CAAA,CAAE,QAAA,EAAU,YAAA,CAAa,GAAG,EAAE,CAAA;AAChD;AAEA,SAAS,mBAAA,CAAoB,IAAA,EAAU,IAAA,EAAe,QAAA,EAA4B;AAChF,EAAA,MAAM,aAAuB,EAAC;AAC9B,EAAA,MAAM,MAAY,EAAC;AACnB,EAAA,OAAA,CAAQ,MAAM,GAAG,CAAA;AACjB,EAAA,KAAA,MAAW,KAAK,GAAA,EAAK;AACnB,IAAA,MAAM,QAAQ,IAAA,GAAO,CAAA,CAAE,IAAA,CAAK,CAAA,GAAI,EAAE,IAAA,CAAK,CAAA;AACvC,IAAA,UAAA,CAAW,CAAA,CAAE,KAAK,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,WAAW,CAAA,CAAE,KAAK,CAAA,IAAK,CAAA,EAAG,KAAK,CAAA;AAAA,EAChE;AACA,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,IAAI,GAAA,GAAM,CAAA;AACV,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,UAAA,CAAW,QAAQ,CAAA,EAAA,EAAK;AAC1C,IAAA,IAAI,CAAA,KAAM,GAAG,GAAA,GAAM,CAAA;AAAA,SACd,GAAA,IAAQ,WAAW,CAAA,GAAI,CAAC,IAAK,CAAA,GAAK,QAAA,GAAY,UAAA,CAAW,CAAC,CAAA,GAAK,CAAA;AACpE,IAAA,OAAA,CAAQ,KAAK,GAAG,CAAA;AAAA,EAClB;AACA,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,QAAA,CAAS,CAAA,EAAO,IAAA,EAAe,YAAA,EAA8B;AACpE,EAAA,MAAM,CAAA,GAAI,YAAA,CAAa,CAAA,CAAE,KAAK,CAAA,IAAK,CAAA;AACnC,EAAA,IAAI,IAAA,EAAM;AAAE,IAAA,CAAA,CAAE,SAAS,CAAA,CAAE,MAAA;AAAQ,IAAA,CAAA,CAAE,MAAA,GAAS,CAAA;AAAA,EAAG,CAAA,MAC1C;AAAE,IAAA,CAAA,CAAE,MAAA,GAAS,CAAA;AAAG,IAAA,CAAA,CAAE,SAAS,CAAA,CAAE,MAAA;AAAA,EAAQ;AAC1C,EAAA,KAAA,MAAW,KAAK,CAAA,CAAE,QAAA,EAAU,QAAA,CAAS,CAAA,EAAG,MAAM,YAAY,CAAA;AAC5D;AAWA,SAAS,SAAA,CACP,KAAA,EACA,IAAA,EACA,CAAA,EACA,GACA,IAAA,EACU;AACV,EAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,EAAG,EAAA,GAAK,CAAA,CAAE,GAAG,EAAA,GAAK,CAAA,CAAE,CAAA,EAAG,EAAA,GAAK,CAAA,CAAE,CAAA;AAC3C,EAAA,IAAI,MAAA,EAAgB,QAAgB,IAAA,EAAc,IAAA;AAClD,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,MAAA,GAAS,EAAA;AAAI,IAAA,MAAA,GAAS,EAAA,GAAK,EAAE,MAAA,GAAS,CAAA;AACtC,IAAA,IAAA,GAAO,EAAA;AAAI,IAAA,IAAA,GAAO,EAAA,GAAK,EAAE,MAAA,GAAS,CAAA;AAAA,EACpC,CAAA,MAAO;AACL,IAAA,MAAA,GAAS,EAAA,GAAK,EAAE,KAAA,GAAQ,CAAA;AAAG,IAAA,MAAA,GAAS,EAAA;AACpC,IAAA,IAAA,GAAO,EAAA,GAAK,EAAE,KAAA,GAAQ,CAAA;AAAG,IAAA,IAAA,GAAO,EAAA;AAAA,EAClC;AAEA,EAAA,IAAI,UAAU,UAAA,EAAY;AAExB,IAAA,MAAM,MAAA,GAAS,IAAA;AACf,IAAA,MAAM,EAAA,GAAK,MAAA,GAAA,CAAU,IAAA,GAAO,MAAA,IAAU,MAAA;AACtC,IAAA,MAAM,EAAA,GAAK,MAAA,GAAA,CAAU,IAAA,GAAO,MAAA,IAAU,MAAA;AACtC,IAAA,MAAM,KAAK,IAAA,GAAO,MAAA;AAClB,IAAA,MAAM,KAAK,IAAA,GAAO,MAAA;AAClB,IAAA,IAAI,QAAS,IAAA,CAAK,KAAA,CAAM,IAAI,EAAE,CAAA,GAAI,MAAO,IAAA,CAAK,EAAA;AAC9C,IAAA,IAAI,KAAA,GAAQ,IAAI,KAAA,IAAS,GAAA;AACzB,IAAA,IAAI,KAAA,GAAQ,KAAK,KAAA,IAAS,GAAA;AAC1B,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,KAAK,MAAM,CAAA,CAAA,EAAI,MAAM,CAAA,GAAA,EAAM,IAAI,IAAI,IAAI,CAAA,CAAA;AAAA,MAC7C,MAAA,EAAQ,EAAA;AAAA,MACR,MAAA,EAAQ,EAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI,UAAU,SAAA,EAAW;AAEvB,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,MAAMC,KAAAA,GAAO,KAAK,GAAA,CAAI,EAAA,EAAI,KAAK,GAAA,CAAI,IAAA,GAAO,MAAM,CAAA,GAAI,IAAI,CAAA;AACxD,MAAA,MAAM,SAAS,MAAA,GAASA,KAAAA;AACxB,MAAA,MAAM,IAAA,GAAA,CAAQ,SAAS,IAAA,IAAQ,CAAA;AAC/B,MAAA,MAAM,IAAA,GAAA,CAAQ,SAAS,IAAA,IAAQ,CAAA;AAC/B,MAAA,MAAM,KAAA,GAAS,KAAK,KAAA,CAAM,IAAA,GAAO,QAAQ,IAAA,GAAO,MAAM,CAAA,GAAI,GAAA,GAAO,IAAA,CAAK,EAAA;AACtE,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,CAAA,EAAA,EAAK,MAAM,CAAA,CAAA,EAAI,MAAM,CAAA,GAAA,EAAM,MAAM,CAAA,CAAA,EAAI,MAAM,CAAA,GAAA,EAAM,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AAAA,QACnE,MAAA,EAAQ,IAAA;AAAA,QACR,MAAA,EAAQ,IAAA;AAAA,QACR,KAAA,EAAO,QAAQ,EAAA,GAAK,KAAA,GAAQ,MAAM,KAAA,GAAQ,GAAA,GAAM,QAAQ,GAAA,GAAM;AAAA,OAChE;AAAA,IACF;AACA,IAAA,MAAM,IAAA,GAAO,KAAK,GAAA,CAAI,EAAA,EAAI,KAAK,GAAA,CAAI,IAAA,GAAO,MAAM,CAAA,GAAI,IAAI,CAAA;AACxD,IAAA,MAAM,SAAS,MAAA,GAAS,IAAA;AACxB,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,CAAA,EAAA,EAAK,MAAM,CAAA,CAAA,EAAI,MAAM,CAAA,GAAA,EAAM,MAAM,CAAA,CAAA,EAAI,MAAM,CAAA,GAAA,EAAM,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AAAA,MACnE,MAAA,EAAA,CAAS,SAAS,IAAA,IAAQ,CAAA;AAAA,MAC1B,MAAA,EAAA,CAAS,SAAS,IAAA,IAAQ,CAAA;AAAA,MAC1B,KAAA,EAAQ,KAAK,KAAA,CAAM,IAAA,GAAO,QAAQ,IAAA,GAAO,MAAM,CAAA,GAAI,GAAA,GAAO,IAAA,CAAK;AAAA,KACjE;AAAA,EACF;AAGA,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,MAAM,KAAA,GAAQ,IAAA,IAAA,CAAS,MAAA,GAAS,IAAA,IAAQ,CAAA;AACxC,IAAA,OAAO;AAAA,MACL,MAAM,CAAA,EAAA,EAAK,MAAM,CAAA,CAAA,EAAI,MAAM,MAAM,MAAM,CAAA,CAAA,EAAI,KAAK,CAAA,GAAA,EAAM,IAAI,CAAA,CAAA,EAAI,KAAK,CAAA,GAAA,EAAM,IAAI,IAAI,IAAI,CAAA,CAAA;AAAA,MACrF,MAAA,EAAA,CAAS,SAAS,IAAA,IAAQ,CAAA;AAAA,MAC1B,MAAA,EAAQ,KAAA;AAAA,MACR,KAAA,EAAO;AAAA,KACT;AAAA,EACF;AACA,EAAA,MAAM,KAAA,GAAQ,IAAA,IAAA,CAAS,MAAA,GAAS,IAAA,IAAQ,CAAA;AACxC,EAAA,OAAO;AAAA,IACL,MAAM,CAAA,EAAA,EAAK,MAAM,CAAA,CAAA,EAAI,MAAM,MAAM,KAAK,CAAA,CAAA,EAAI,MAAM,CAAA,GAAA,EAAM,KAAK,CAAA,CAAA,EAAI,IAAI,CAAA,GAAA,EAAM,IAAI,IAAI,IAAI,CAAA,CAAA;AAAA,IACrF,MAAA,EAAQ,KAAA;AAAA,IACR,MAAA,EAAA,CAAS,SAAS,IAAA,IAAQ,CAAA;AAAA,IAC1B,KAAA,EAAO;AAAA,GACT;AACF;AAQA,SAAS,eAAA,CAAgB,IAAA,EAAe,CAAA,EAAoB,CAAA,EAA8B;AACxF,EAAA,IAAI,IAAA,EAAM;AAER,IAAA,MAAMC,UAAS,CAAA,CAAE,CAAA,EAAGC,UAAS,CAAA,CAAE,CAAA,GAAI,EAAE,MAAA,GAAS,CAAA;AAC9C,IAAA,MAAMC,QAAO,CAAA,CAAE,CAAA,EAAGC,QAAO,CAAA,CAAE,CAAA,GAAI,EAAE,MAAA,GAAS,CAAA;AAC1C,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,KAAKH,OAAM,CAAA,CAAA,EAAIC,OAAM,CAAA,GAAA,EAAMC,KAAI,IAAIC,KAAI,CAAA,CAAA;AAAA,MAC7C,MAAA,EAAA,CAASH,UAASE,KAAAA,IAAQ,CAAA;AAAA,MAAG,MAAA,EAAA,CAASD,UAASE,KAAAA,IAAQ,CAAA;AAAA,MAAG,KAAA,EAAO;AAAA,KACnE;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAAS,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,KAAA,GAAQ,CAAA;AAC/B,EAAA,MAAM,SAAS,CAAA,CAAE,CAAA;AACjB,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,KAAA,GAAQ,CAAA;AAC7B,EAAA,MAAM,OAAO,CAAA,CAAE,CAAA;AAEf,EAAA,MAAM,SAAA,GAAY,CAAA,CAAE,QAAA,IAAY,CAAA,CAAE,CAAA;AAClC,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,SAAA,EAAW,SAAS,EAAE,CAAA;AAC7C,EAAA,MAAM,KAAK,KAAA,GAAQ,MAAA;AACnB,EAAA,MAAM,KAAK,IAAA,GAAO,MAAA;AAClB,EAAA,IAAI,QAAS,IAAA,CAAK,KAAA,CAAM,IAAI,EAAE,CAAA,GAAI,MAAO,IAAA,CAAK,EAAA;AAC9C,EAAA,IAAI,KAAA,GAAQ,IAAI,KAAA,IAAS,GAAA;AACzB,EAAA,IAAI,KAAA,GAAQ,KAAK,KAAA,IAAS,GAAA;AAE1B,EAAA,MAAM,CAAA,GAAI,GAAA;AACV,EAAA,MAAM,MAAA,GAAS,MAAA,GAAA,CAAU,KAAA,GAAQ,MAAA,IAAU,CAAA;AAC3C,EAAA,MAAM,MAAA,GAAS,MAAA,GAAA,CAAU,IAAA,GAAO,MAAA,IAAU,CAAA;AAC1C,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,CAAA,EAAA,EAAK,MAAM,CAAA,CAAA,EAAI,MAAM,CAAA,GAAA,EAAM,KAAK,CAAA,CAAA,EAAI,IAAI,CAAA,GAAA,EAAM,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AAAA,IAChE,MAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACF;AACF;AAIO,SAAS,mBAAmB,GAAA,EAAkC;AACnE,EAAA,MAAM,IAAA,GAAO,IAAI,SAAA,KAAc,UAAA;AAC/B,EAAA,MAAM,OAAO,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,GAAA,CAAI,MAAM,CAAC,CAAA;AAGvC,EAAA,MAAM,MAAY,EAAC;AAAG,EAAA,OAAA,CAAQ,MAAM,GAAG,CAAA;AAIvC,EAAA,MAAM,oBAA8B,EAAC;AACrC,EAAA,KAAA,MAAW,KAAK,GAAA,EAAK;AACnB,IAAA,MAAM,IAAI,IAAA,GAAO,CAAA,CAAE,IAAA,CAAK,CAAA,GAAI,EAAE,IAAA,CAAK,CAAA;AACnC,IAAA,iBAAA,CAAkB,CAAA,CAAE,KAAK,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,kBAAkB,CAAA,CAAE,KAAK,CAAA,IAAK,CAAA,EAAG,CAAC,CAAA;AAAA,EAC1E;AACA,EAAA,KAAA,MAAW,KAAK,GAAA,EAAK;AACnB,IAAA,MAAM,MAAA,GAAS,iBAAA,CAAkB,CAAA,CAAE,KAAK,CAAA;AACxC,IAAA,IAAI,IAAA,EAAM,CAAA,CAAE,IAAA,CAAK,CAAA,GAAI,MAAA;AAAA,SAChB,CAAA,CAAE,KAAK,CAAA,GAAI,MAAA;AAAA,EAClB;AAEA,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,GAAA,CAAI,GAAG,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA,KAAM,SAAA,CAAU,CAAA,EAAG,IAAI,CAAC,CAAC,CAAA;AAEnE,EAAA,IAAI,SAAiB,QAAA,EAAkB,MAAA;AACvC,EAAA,IAAI,GAAA,CAAI,SAAS,IAAA,EAAM;AAAE,IAAA,OAAA,GAAU,EAAA;AAAI,IAAA,QAAA,GAAW,EAAA;AAAI,IAAA,MAAA,GAAS,EAAA;AAAA,EAAI,CAAA,MAAA,IAC1D,GAAA,CAAI,IAAA,KAAS,UAAA,EAAY;AAAE,IAAA,OAAA,GAAU,OAAO,EAAA,GAAK,EAAA;AAAI,IAAA,QAAA,GAAW,OAAO,EAAA,GAAK,GAAA;AAAK,IAAA,MAAA,GAAS,EAAA;AAAA,EAAI,CAAA,MAClG;AAAE,IAAA,OAAA,GAAU,OAAO,EAAA,GAAK,EAAA;AAAI,IAAA,QAAA,GAAW,OAAO,EAAA,GAAK,EAAA;AAAI,IAAA,MAAA,GAAS,EAAA;AAAA,EAAI;AAEzE,EAAA,MAAM,OAAO,IAAA,CAAK,GAAA,CAAI,YAAA,EAAc,IAAA,GAAO,MAAM,EAAE,CAAA;AACnD,EAAA,MAAM,MAAA,GAAS,EAAE,CAAA,EAAG,CAAA,EAAE;AACtB,EAAA,mBAAA,CAAoB,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,OAAA,EAAS,MAAM,CAAA;AACrD,EAAA,aAAA,CAAc,IAAA,EAAM,MAAM,MAAM,CAAA;AAEhC,EAAA,MAAM,YAAA,GAAe,mBAAA,CAAoB,IAAA,EAAM,IAAA,EAAM,QAAQ,CAAA;AAC7D,EAAA,QAAA,CAAS,IAAA,EAAM,MAAM,YAAY,CAAA;AAGjC,EAAA,MAAMC,QAAAA,GAAU,EAAA;AAChB,EAAA,MAAM,YAAY,GAAA,CAAI,IAAA,KAAS,UAAA,IAAc,CAAC,OAAO,GAAA,GAAM,CAAA;AAC3D,EAAA,IAAI,OAAO,QAAA,EAAU,IAAA,GAAO,QAAA,EAAU,IAAA,GAAO,WAAW,IAAA,GAAO,CAAA,QAAA;AAC/D,EAAA,KAAA,MAAW,KAAK,GAAA,EAAK;AACnB,IAAA,IAAA,GAAO,IAAA,CAAK,IAAI,IAAA,EAAM,CAAA,CAAE,SAAS,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAC7C,IAAA,IAAA,GAAO,IAAA,CAAK,IAAI,IAAA,EAAM,CAAA,CAAE,SAAS,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAC7C,IAAA,IAAA,GAAO,IAAA,CAAK,IAAI,IAAA,EAAM,CAAA,CAAE,SAAS,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAC7C,IAAA,IAAA,GAAO,IAAA,CAAK,IAAI,IAAA,EAAM,CAAA,CAAE,SAAS,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,EAC/C;AAGA,EAAA,MAAM,cAAA,GAAiB,GAAA,CAAI,IAAA,KAAS,UAAA,IAAc,CAAC,IAAA;AACnD,EAAA,MAAM,YAAA,GAAe,iBAAiB,GAAA,GAAM,CAAA;AAC5C,EAAA,MAAM,aAAa,cAAA,GAAiB,GAAA,GAAM,GAAA,CAAI,IAAA,KAAS,aAAa,GAAA,GAAM,EAAA;AAI1E,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAoB;AAC5C,EAAA,KAAA,MAAW,CAAA,IAAK,KAAK,WAAA,CAAY,GAAA,CAAI,EAAE,IAAA,CAAK,EAAA,EAAI,EAAE,MAAM,CAAA;AAGxD,EAAA,IAAI,cAAA,EAAgB;AAClB,IAAA,IAAI,OAAA,GAAU,CAAA,QAAA;AACd,IAAA,KAAA,MAAW,CAAA,IAAK,GAAA,EAAK,IAAI,CAAA,CAAE,IAAA,CAAK,IAAA,KAAS,KAAA,EAAO,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,CAAA,CAAE,MAAM,CAAA;AACpF,IAAA,KAAA,MAAW,CAAA,IAAK,KAAK,IAAI,CAAA,CAAE,KAAK,IAAA,KAAS,KAAA,IAAS,MAAA,GAAS,OAAA;AAE3D,IAAA,IAAA,GAAO,QAAA;AAAU,IAAA,IAAA,GAAO,CAAA,QAAA;AACxB,IAAA,KAAA,MAAW,KAAK,GAAA,EAAK;AACnB,MAAA,IAAA,GAAO,IAAA,CAAK,IAAI,IAAA,EAAM,CAAA,CAAE,SAAS,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAC7C,MAAA,IAAA,GAAO,IAAA,CAAK,IAAI,IAAA,EAAM,CAAA,CAAE,SAAS,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,IAC/C;AAAA,EACF;AAEA,EAAA,MAAM,OAAA,GAAUA,WAAU,SAAA,GAAY,IAAA;AACtC,EAAA,MAAM,UAAUA,QAAAA,GAAU,IAAA;AAE1B,EAAA,MAAM,WAAA,GAAiC,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IACrD,MAAM,CAAA,CAAE,IAAA;AAAA,IACR,CAAA,EAAG,EAAE,MAAA,GAAS,OAAA;AAAA,IACd,CAAA,EAAG,EAAE,MAAA,GAAS,OAAA;AAAA,IACd,KAAA,EAAO,EAAE,IAAA,CAAK,CAAA;AAAA,IACd,MAAA,EAAQ,EAAE,IAAA,CAAK,CAAA;AAAA,IACf,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,QAAA,EAAA,CAAW,YAAY,GAAA,CAAI,CAAA,CAAE,KAAK,EAAE,CAAA,IAAK,EAAE,MAAA,IAAU,OAAA;AAAA,IACrD,QAAA,EAAU,EAAE,MAAA,GAAS;AAAA,GACvB,CAAE,CAAA;AAEF,EAAA,MAAM,QAAA,GAAW,IAAI,GAAA,CAAI,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,IAAA,CAAK,EAAA,EAAI,CAAC,CAAC,CAAC,CAAA;AAG/D,EAAA,MAAM,YACJ,GAAA,CAAI,SAAA,KAAc,GAAA,CAAI,IAAA,KAAS,aAAa,UAAA,GAAa,YAAA,CAAA;AAI3D,EAAA,MAAM,aAAuB,EAAC;AAC9B,EAAA,IAAI,cAAc,YAAA,EAAc;AAE9B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,iBAAA,CAAkB,QAAQ,CAAA,EAAA,EAAK;AACjD,MAAA,MAAM,UAAA,GAAA,CAAc,aAAa,CAAA,GAAI,CAAC,KAAK,CAAA,IAAM,iBAAA,CAAkB,CAAA,GAAI,CAAC,CAAA,GAAK,CAAA;AAC7E,MAAA,MAAM,aAAa,YAAA,CAAa,CAAC,KAAK,CAAA,IAAM,iBAAA,CAAkB,CAAC,CAAA,GAAK,CAAA;AACpE,MAAA,UAAA,CAAW,CAAC,CAAA,GAAA,CAAK,UAAA,GAAa,SAAA,IAAa,CAAA,IAAK,OAAO,OAAA,GAAU,OAAA,CAAA;AAAA,IACnE;AAAA,EACF;AAEA,EAAA,MAAM,eAAwE,EAAC;AAC/E,EAAA,MAAM,QAA2B,EAAC;AAClC,EAAA,KAAA,MAAW,KAAK,GAAA,EAAK;AACnB,IAAA,KAAA,MAAW,CAAA,IAAK,EAAE,QAAA,EAAU;AAC1B,MAAA,MAAM,EAAA,GAAK,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,KAAK,EAAE,CAAA;AACjC,MAAA,MAAM,EAAA,GAAK,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,KAAK,EAAE,CAAA;AAGjC,MAAA,MAAM,UAAA,GAAa,cAAA,IAAkB,CAAA,CAAE,IAAA,CAAK,SAAS,KAAA,IAAS,EAAA,CAAG,QAAA,KAAa,MAAA,IAAa,KAAK,GAAA,CAAI,EAAA,CAAG,QAAA,GAAW,EAAA,CAAG,CAAC,CAAA,GAAI,CAAA;AAC1H,MAAA,MAAM,IAAA,GAAO,UAAA,GACT,eAAA,CAAgB,IAAA,EAAM,IAAI,EAAE,CAAA,GAC5B,SAAA,CAAU,SAAA,EAAW,MAAM,EAAA,EAAI,EAAA,EAAI,UAAA,CAAW,CAAA,CAAE,KAAK,CAAC,CAAA;AAE1D,MAAA,MAAM,SAAA,GAAY,CAAA,CAAE,IAAA,CAAK,OAAA,KAAY,IAAA;AACrC,MAAA,IAAI,WAAA,GAAc,GAAA;AAClB,MAAA,IAAI,WAAW,WAAA,GAAc,CAAA;AAC7B,MAAA,IAAI,GAAA,CAAI,gBAAA,IAAoB,CAAA,CAAE,IAAA,CAAK,iBAAiB,MAAA,EAAW;AAC7D,QAAA,WAAA,GAAc,CAAA,GAAI,CAAA,CAAE,IAAA,CAAK,YAAA,GAAe,GAAA;AAAA,MAC1C;AAEA,MAAA,IAAI,KAAA;AACJ,MAAA,IAAI,GAAA,CAAI,SAAS,UAAA,EAAY;AAC3B,QAAA,IAAI,EAAE,IAAA,CAAK,cAAA,KAAmB,MAAA,EAAW,KAAA,GAAQ,EAAE,IAAA,CAAK,cAAA;AAAA,aAAA,IAC/C,CAAA,CAAE,KAAK,YAAA,KAAiB,MAAA,UAAmB,UAAA,CAAW,CAAA,CAAE,KAAK,YAAY,CAAA;AAAA,MACpF,CAAA,MAAA,IAAW,GAAA,CAAI,IAAA,KAAS,IAAA,EAAM;AAC5B,QAAA,IAAI,CAAA,CAAE,KAAK,QAAA,EAAU;AACnB,UAAA,IAAI,GAAA,CAAI,iBAAiB,UAAA,IAAc,CAAA,CAAE,KAAK,EAAA,IAAM,CAAA,CAAE,IAAA,CAAK,SAAA,KAAc,MAAA,EAAW;AAClF,YAAA,MAAM,EAAA,GAAK,CAAA,CAAE,IAAA,CAAK,QAAA,KAAa,MAAA,GAAS,CAAA,CAAE,IAAA,CAAK,EAAA,GAAK,MAAA,CAAO,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AACpE,YAAA,KAAA,GAAQ,CAAA,EAAG,EAAE,CAAA,CAAA,EAAI,CAAA,CAAE,KAAK,SAAS,CAAA,CAAA;AAAA,UACnC,CAAA,MAAO;AACL,YAAA,KAAA,GAAQ,CAAA,CAAE,IAAA,CAAK,QAAA,KAAa,MAAA,GAAS,MAAA,GAAS,OAAA;AAAA,UAChD;AAAA,QACF;AAAA,MACF,CAAA,MAAO;AACL,QAAA,IAAI,CAAA,CAAE,IAAA,CAAK,WAAA,EAAa,KAAA,GAAQ,EAAE,IAAA,CAAK,WAAA;AAAA,MACzC;AAEA,MAAA,YAAA,CAAa,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA,GAAI,EAAE,CAAA,EAAG,IAAA,CAAK,MAAA,EAAQ,CAAA,EAAG,IAAA,CAAK,MAAA,EAAQ,KAAA,EAAO,KAAK,KAAA,EAAM;AAE9E,MAAA,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,CAAA,CAAE,IAAA,CAAK,IAAI,EAAA,EAAI,CAAA,CAAE,IAAA,CAAK,EAAA,EAAI,MAAM,IAAA,CAAK,IAAA,EAAM,KAAA,EAAO,SAAA,EAAW,aAAa,CAAA;AAAA,IAC/F;AAAA,EACF;AAGA,EAAA,IAAI,aAAA;AACJ,EAAA,IAAI,cAAA,EAAgB;AAClB,IAAA,IAAI,IAAA,GAAO,CAAA;AACX,IAAA,KAAA,MAAW,CAAA,IAAK,WAAA,EAAa,IAAI,CAAA,CAAE,KAAK,IAAA,KAAS,KAAA,EAAO,IAAA,GAAO,IAAA,CAAK,IAAI,IAAA,EAAM,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,QAAQ,CAAC,CAAA;AAC/F,IAAA,aAAA,GAAgB,IAAA,GAAO,YAAA;AAAA,EACzB;AAEA,EAAA,MAAM,KAAA,GAAQ,KAAK,IAAA,CAAK,IAAA,GAAO,OAAOA,QAAAA,GAAU,CAAA,GAAI,aAAa,SAAS,CAAA;AAC1E,EAAA,MAAM,SAAS,IAAA,CAAK,IAAA,CAAK,IAAA,GAAO,IAAA,GAAOA,WAAU,CAAC,CAAA;AAElD,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,MAAA;AAAA,IACA,KAAA,EAAO,WAAA;AAAA,IACP,KAAA;AAAA,IACA,UAAA,EAAY,SAAA,KAAc,YAAA,GAAe,UAAA,GAAa,MAAA;AAAA,IACtD,OAAO,GAAA,CAAI,KAAA;AAAA,IACX,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,WAAW,GAAA,CAAI,SAAA;AAAA,IACf,SAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,OAAO,EAAA,EAAoB;AAClC,EAAA,IAAI,EAAA,KAAO,MAAM,OAAO,GAAA;AACxB,EAAA,IAAI,EAAA,KAAO,KAAK,OAAO,IAAA;AACvB,EAAA,IAAI,EAAA,KAAO,MAAM,OAAO,GAAA;AACxB,EAAA,IAAI,EAAA,KAAO,KAAK,OAAO,IAAA;AACvB,EAAA,OAAO,EAAA;AACT;AAEA,SAAS,WAAW,CAAA,EAAmB;AACrC,EAAA,IAAI,CAAA,IAAK,IAAA,IAAQ,CAAA,IAAK,IAAA,EAAM;AAC1B,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAG,CAAA;AAC9B,IAAA,IAAI,IAAA,CAAK,IAAI,CAAA,GAAI,GAAA,GAAM,GAAG,CAAA,GAAI,IAAA,EAAM,OAAO,CAAA,EAAA,EAAK,GAAG,CAAA,CAAA,CAAA;AAAA,EACrD;AACA,EAAA,OAAO,KAAK,CAAC,CAAA,CAAA;AACf;;;AClbA,IAAM,aAAA,GAAgB;AAAA,EACpB,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EAC5C,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW;AAC9C,CAAA;AAEA,SAAS,SAAS,CAAA,EAAsB;AACtC,EAAA,OAAO;AAAA;AAAA,mDAAA,EAE4C,EAAE,IAAI,CAAA;AAAA,qCAAA,EACpB,EAAE,MAAM,CAAA;AAAA,6CAAA,EACA,EAAE,QAAQ,CAAA;AAAA,4CAAA,EACX,EAAE,MAAM,CAAA;AAAA,wDAAA,EACI,EAAE,IAAI,CAAA;AAAA,8DAAA,EACA,EAAE,SAAS,CAAA;AAAA,gCAAA,EACzC,EAAE,EAAE,CAAA;AAAA;AAAA;AAAA,2CAAA,EAGO,EAAE,MAAM,CAAA;AAAA,wDAAA,EACK,EAAE,IAAI,CAAA;AAAA,0DAAA,EACJ,EAAE,SAAS,CAAA;AAAA,kEAAA,EACH,EAAE,QAAQ,CAAA;AAAA,8DAAA,EACd,EAAE,IAAI,CAAA;AAAA,kEAAA,EACF,CAAA,CAAE,YAAY,SAAS,CAAA;AAAA,4BAAA,EAC7D,EAAE,MAAM,CAAA;AAAA,uDAAA,EACmB,EAAE,IAAI,CAAA;AAAA,2DAAA,EACF,EAAE,SAAS,CAAA;AAAA,+DAAA,EACP,EAAE,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA,yDAAA,EAIjB,EAAE,IAAI,CAAA;AAAA,CAAA,CAC/D,IAAA,EAAK;AACP;AAIA,SAAS,kBAAA,CAAmB,IAAqB,MAAA,EAAmC;AAClF,EAAA,MAAM,IAAI,EAAA,CAAG,IAAA;AACb,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,IAAA,GAAO,OAAO,SAAA,KAAc,UAAA;AAElC,EAAA,IAAI,CAAA,CAAE,SAAS,UAAA,EAAY;AACzB,IAAA,KAAA,CAAM,KAAKC,sBAAA,CAAK;AAAA,MACd,CAAA,EAAG,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,KAAA,GAAQ,CAAA;AAAA,MACrB,CAAA,EAAG,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,MAAA,GAAS,CAAA;AAAA,MACtB,OAAO,EAAA,CAAG,KAAA;AAAA,MACV,QAAQ,EAAA,CAAG,MAAA;AAAA,MACX,EAAA,EAAI,CAAA;AAAA,MACJ,EAAA,EAAI,CAAA;AAAA,MACJ,KAAA,EAAO;AAAA,KACR,CAAC,CAAA;AACF,IAAA,IAAI,EAAE,KAAA,EAAO;AAEX,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,KAAA,CAAM,KAAKR,sBAAA,CAAO;AAAA,UAChB,GAAG,EAAA,CAAG,CAAA;AAAA,UAAG,CAAA,EAAG,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,SAAS,CAAA,GAAI,CAAA;AAAA,UACnC,KAAA,EAAO,qBAAA;AAAA,UAAuB,aAAA,EAAe;AAAA,SAC/C,EAAG,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,MACb,CAAA,MAAO;AACL,QAAA,KAAA,CAAM,KAAKA,sBAAA,CAAO;AAAA,UAChB,CAAA,EAAG,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,QAAQ,CAAA,GAAI,CAAA;AAAA,UAAG,CAAA,EAAG,GAAG,CAAA,GAAI,CAAA;AAAA,UACtC,KAAA,EAAO,qBAAA;AAAA,UAAuB,aAAA,EAAe;AAAA,SAC/C,EAAG,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,MACb;AAAA,IACF;AACA,IAAA,IAAI,CAAA,CAAE,OAAO,MAAA,EAAW;AACtB,MAAA,KAAA,CAAM,KAAKA,sBAAA,CAAO;AAAA,QAChB,GAAG,EAAA,CAAG,CAAA;AAAA,QAAG,CAAA,EAAG,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,SAAS,CAAA,GAAI,EAAA;AAAA,QACnC,KAAA,EAAO,aAAA;AAAA,QAAe,aAAA,EAAe;AAAA,SACpC,CAAA,GAAA,EAAM,SAAA,CAAU,EAAE,EAAE,CAAC,EAAE,CAAC,CAAA;AAAA,IAC7B;AAAA,EACF,CAAA,MAAA,IAAW,CAAA,CAAE,IAAA,KAAS,QAAA,EAAU;AAC9B,IAAA,KAAA,CAAM,KAAKS,wBAAA,CAAO;AAAA,MAChB,IAAI,EAAA,CAAG,CAAA;AAAA,MAAG,IAAI,EAAA,CAAG,CAAA;AAAA,MAAG,CAAA,EAAG,GAAG,KAAA,GAAQ,CAAA;AAAA,MAClC,KAAA,EAAO;AAAA,KACR,CAAC,CAAA;AACF,IAAA,IAAI,EAAE,KAAA,EAAO;AACX,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,KAAA,CAAM,KAAKT,sBAAA,CAAO;AAAA,UAChB,GAAG,EAAA,CAAG,CAAA;AAAA,UAAG,CAAA,EAAG,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,SAAS,CAAA,GAAI,CAAA;AAAA,UACnC,KAAA,EAAO,qBAAA;AAAA,UAAuB,aAAA,EAAe;AAAA,SAC/C,EAAG,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,MACb,CAAA,MAAO;AACL,QAAA,KAAA,CAAM,KAAKA,sBAAA,CAAO;AAAA,UAChB,GAAG,EAAA,CAAG,CAAA;AAAA,UAAG,CAAA,EAAG,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,SAAS,CAAA,GAAI,CAAA;AAAA,UACnC,KAAA,EAAO,qBAAA;AAAA,UAAuB,aAAA,EAAe;AAAA,SAC/C,EAAG,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,MACb;AAAA,IACF;AACA,IAAA,IAAI,CAAA,CAAE,OAAO,MAAA,EAAW;AACtB,MAAA,KAAA,CAAM,KAAKA,sBAAA,CAAO;AAAA,QAChB,GAAG,EAAA,CAAG,CAAA;AAAA,QAAG,CAAA,EAAG,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,SAAS,CAAA,GAAI,EAAA;AAAA,QACnC,KAAA,EAAO,CAAA,CAAE,OAAA,GAAU,qBAAA,GAAwB,aAAA;AAAA,QAC3C,aAAA,EAAe;AAAA,SACd,CAAA,GAAA,EAAM,SAAA,CAAU,EAAE,EAAE,CAAC,EAAE,CAAC,CAAA;AAAA,IAC7B;AAAA,EACF,CAAA,MAAA,IAAW,CAAA,CAAE,IAAA,KAAS,KAAA,EAAO;AAE3B,IAAA,MAAM,KAAA,GAAQ,GAAG,KAAA,GAAQ,CAAA;AACzB,IAAA,MAAM,KAAA,GAAQ,GAAG,MAAA,GAAS,CAAA;AAC1B,IAAA,MAAM,GAAA,GAAM;AAAA,MACV,GAAG,EAAA,CAAG,CAAA,GAAI,KAAK,CAAA,CAAA,EAAI,EAAA,CAAG,IAAI,KAAK,CAAA,CAAA;AAAA,MAC/B,GAAG,EAAA,CAAG,CAAA,GAAI,KAAK,CAAA,CAAA,EAAI,GAAG,CAAC,CAAA,CAAA;AAAA,MACvB,GAAG,EAAA,CAAG,CAAA,GAAI,KAAK,CAAA,CAAA,EAAI,EAAA,CAAG,IAAI,KAAK,CAAA;AAAA,KACjC,CAAE,KAAK,GAAG,CAAA;AACV,IAAA,KAAA,CAAM,IAAA,CAAKU,0BAAQ,EAAE,MAAA,EAAQ,KAAK,KAAA,EAAO,kBAAA,EAAoB,CAAC,CAAA;AAG9D,IAAA,MAAM,OAAO,MAAA,CAAO,aAAA;AACpB,IAAA,MAAM,IAAA,GAAO,GAAG,CAAA,GAAI,KAAA;AACpB,IAAA,MAAM,KAAA,GAAQ,GAAG,CAAA,GAAI,CAAA;AACrB,IAAA,MAAM,YAAY,CAAA,CAAE,MAAA,KAAW,UAAa,CAAA,CAAE,MAAA,GAAS,IAAI,qBAAA,GAAwB,iBAAA;AACnF,IAAA,MAAM,YAAY,CAAA,CAAE,MAAA,KAAW,SAAY,YAAA,CAAa,CAAA,CAAE,MAAM,CAAA,GAAI,EAAA;AAEpE,IAAA,IAAI,IAAA,KAAS,MAAA,IAAa,IAAA,GAAO,IAAA,GAAO,EAAA,EAAI;AAE1C,MAAA,KAAA,CAAM,KAAKC,sBAAA,CAAO;AAAA,QAChB,CAAA,EAAG,CAAA,EAAA,EAAK,IAAA,GAAO,CAAC,CAAA,CAAA,EAAI,EAAA,CAAG,CAAC,CAAA,GAAA,EAAM,IAAA,GAAO,CAAC,CAAA,CAAA,EAAI,EAAA,CAAG,CAAC,CAAA,CAAA;AAAA,QAC9C,KAAA,EAAO;AAAA,OACR,CAAC,CAAA;AAEF,MAAA,IAAI,EAAE,KAAA,EAAO;AACX,QAAA,KAAA,CAAM,KAAKX,sBAAA,CAAO;AAAA,UAChB,CAAA,EAAA,CAAI,OAAO,IAAA,IAAQ,CAAA;AAAA,UAAG,CAAA,EAAG,GAAG,CAAA,GAAI,CAAA;AAAA,UAChC,KAAA,EAAO,qBAAA;AAAA,UAAuB,aAAA,EAAe;AAAA,SAC/C,EAAG,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,MACb;AACA,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,KAAA,CAAM,KAAKA,sBAAA,CAAO;AAAA,UAChB,CAAA,EAAG,IAAA;AAAA,UAAM,CAAA,EAAG,KAAA;AAAA,UAAO,KAAA,EAAO,SAAA;AAAA,UAAW,aAAA,EAAe;AAAA,SACtD,EAAG,SAAS,CAAC,CAAA;AAAA,MACf;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAM,aAAuB,EAAC;AAC9B,MAAA,IAAI,SAAA,EAAW,UAAA,CAAW,IAAA,CAAK,SAAS,CAAA;AACxC,MAAA,IAAI,CAAA,CAAE,KAAA,EAAO,UAAA,CAAW,IAAA,CAAK,EAAE,KAAK,CAAA;AACpC,MAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,QAAA,KAAA,CAAM,KAAKA,sBAAA,CAAO;AAAA,UAChB,GAAG,IAAA,GAAO,CAAA;AAAA,UAAG,CAAA,EAAG,KAAA;AAAA,UAAO,KAAA,EAAO;AAAA,SAChC,EAAG,UAAA,CAAW,IAAA,CAAK,QAAK,CAAC,CAAC,CAAA;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAOY,uBAAA,CAAM;AAAA,IACX,gBAAgB,CAAA,CAAE,EAAA;AAAA,IAClB,kBAAkB,CAAA,CAAE,IAAA;AAAA,IACpB,WAAW,CAAA,CAAE,EAAA,KAAO,SAAY,MAAA,CAAO,CAAA,CAAE,EAAE,CAAA,GAAI;AAAA,KAC9C,KAAK,CAAA;AACV;AAEA,SAAS,UAAU,CAAA,EAAmB;AACpC,EAAA,IAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,IAAK,GAAA,EAAO,OAAO,CAAA,CAAE,cAAA,CAAe,MAAA,EAAW,EAAE,qBAAA,EAAuB,CAAA,EAAG,CAAA;AACzF,EAAA,IAAI,OAAO,SAAA,CAAU,CAAC,CAAA,EAAG,OAAO,OAAO,CAAC,CAAA;AACxC,EAAA,OAAO,CAAA,CAAE,QAAQ,CAAC,CAAA;AACpB;AAEA,SAAS,aAAa,CAAA,EAAmB;AACvC,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA;AACtB,EAAA,MAAM,IAAA,GAAO,CAAA,GAAI,CAAA,GAAI,GAAA,GAAM,EAAA;AAC3B,EAAA,IAAI,GAAA,IAAO,GAAA,EAAS,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAA,CAAK,GAAA,GAAM,GAAA,EAAS,OAAA,CAAQ,GAAA,IAAO,GAAA,GAAW,CAAA,GAAI,CAAC,CAAC,CAAA,CAAA,CAAA;AACtF,EAAA,IAAI,GAAA,IAAO,KAAM,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,GAAA,CAAI,gBAAgB,CAAA,CAAA;AACvD,EAAA,OAAO,OAAO,CAAC,CAAA;AACjB;AAIA,SAAS,WAAW,CAAA,EAAmB;AAAE,EAAA,OAAO,aAAA,CAAc,CAAA,GAAI,aAAA,CAAc,MAAM,CAAA;AAAI;AAE1F,SAAS,gBAAgB,CAAA,EAAgC;AACvD,EAAA,IAAI,CAAC,MAAM,OAAA,CAAQ,CAAA,CAAE,KAAK,CAAA,EAAG,OAAO,EAAE,IAAA,EAAM,SAAA,EAAU;AACtD,EAAA,MAAM,MAAM,CAAA,CAAE,KAAA;AACd,EAAA,MAAM,GAAA,GAAM,IAAI,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,GAAG,CAAC,CAAA;AACzC,EAAA,IAAI,GAAA,KAAQ,CAAA,EAAG,OAAO,EAAE,MAAM,SAAA,EAAU;AACxC,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,MAAA,EAAQ,CAAA,EAAA,EAAK,IAAI,GAAA,CAAI,CAAC,CAAA,GAAK,GAAA,CAAI,MAAM,GAAI,MAAA,GAAS,CAAA;AAC1E,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,MAAM,CAAA,GAAK,GAAA;AAC9B,EAAA,MAAM,WAAW,GAAA,CAAI,MAAA;AACrB,EAAA,MAAM,YAAY,CAAA,GAAI,QAAA;AACtB,EAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,IAAA,EAAM,OAAO,GAAA,IAAA,CAAQ,MAAA,GAAS,SAAA,KAAc,CAAA,GAAI,SAAA,CAAA,CAAW,CAAA;AAClF,EAAA,OAAO,EAAE,IAAA,EAAM,YAAA,CAAa,WAAW,MAAM,CAAA,EAAG,KAAK,CAAA,EAAE;AACzD;AAEA,SAAS,YAAA,CAAa,KAAa,KAAA,EAAuB;AACxD,EAAA,OAAO,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,GAAG,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAA;AACnE;AAEA,SAAS,YAAA,CAAa,IAAqB,GAAA,EAAuB;AAChE,EAAA,MAAM,IAAI,EAAA,CAAG,IAAA;AACb,EAAA,MAAM,EAAE,IAAA,EAAK,GAAI,eAAA,CAAgB,CAAC,CAAA;AAClC,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,CAAA,GAAI,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,KAAA,GAAQ,CAAA;AAC5B,EAAA,MAAM,CAAA,GAAI,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,MAAA,GAAS,CAAA;AAE7B,EAAA,KAAA,CAAM,KAAKJ,sBAAA,CAAK;AAAA,IACd,CAAA;AAAA,IAAG,CAAA;AAAA,IAAG,OAAO,EAAA,CAAG,KAAA;AAAA,IAAO,QAAQ,EAAA,CAAG,MAAA;AAAA,IAAQ,EAAA,EAAI,CAAA;AAAA,IAAG,EAAA,EAAI,CAAA;AAAA,IACrD,IAAA;AAAA,IAAM,KAAA,EAAO;AAAA,GACd,CAAC,CAAA;AAEF,EAAA,MAAM,QAAQ,EAAA,CAAG,CAAA;AACjB,EAAA,IAAI,QAAQ,CAAA,GAAI,EAAA;AAChB,EAAA,MAAM,KAAA,GAAQ,EAAA;AAEd,EAAA,IAAI,CAAA,CAAE,IAAA,KAAS,OAAA,IAAW,CAAA,CAAE,OAAA,EAAS;AACnC,IAAA,MAAM,MAAA,GAAS,OAAO,CAAA,CAAE,SAAA,KAAc,QAAA,GAAW,UAAU,CAAA,CAAE,SAAS,CAAA,GAAI,CAAA,CAAE,SAAA,IAAa,EAAA;AACzF,IAAA,KAAA,CAAM,IAAA,CAAKR,sBAAA;AAAA,MAAO,EAAE,GAAG,KAAA,EAAO,CAAA,EAAG,OAAO,KAAA,EAAO,oBAAA,EAAsB,eAAe,QAAA,EAAS;AAAA,MAC3F,CAAA,EAAG,EAAE,OAAO,CAAA,CAAA,EAAI,EAAE,EAAA,IAAM,EAAE,IAAI,MAAM,CAAA;AAAA,KAAG,CAAA;AACzC,IAAA,KAAA,IAAS,KAAA;AAAA,EACX,CAAA,MAAA,IAAW,EAAE,KAAA,EAAO;AAClB,IAAA,KAAA,CAAM,IAAA,CAAKA,sBAAA,CAAO,EAAE,CAAA,EAAG,OAAO,CAAA,EAAG,KAAA,EAAO,KAAA,EAAO,oBAAA,EAAsB,aAAA,EAAe,QAAA,EAAS,EAAG,CAAA,CAAE,KAAK,CAAC,CAAA;AACxG,IAAA,KAAA,IAAS,KAAA;AAAA,EACX;AACA,EAAA,IAAI,CAAA,CAAE,aAAa,MAAA,EAAW;AAC5B,IAAA,MAAM,OAAA,GAAU,IAAI,YAAA,IAAgB,MAAA;AACpC,IAAA,KAAA,CAAM,IAAA,CAAKA,sBAAA;AAAA,MAAO,EAAE,GAAG,KAAA,EAAO,CAAA,EAAG,OAAO,KAAA,EAAO,wBAAA,EAA0B,eAAe,QAAA,EAAS;AAAA,MAC/F,GAAG,OAAO,CAAA,GAAA,EAAM,SAAA,CAAU,CAAA,CAAE,QAAQ,CAAC,CAAA;AAAA,KAAG,CAAA;AAC1C,IAAA,KAAA,IAAS,KAAA;AAAA,EACX;AACA,EAAA,IAAI,CAAA,CAAE,YAAY,MAAA,EAAW;AAC3B,IAAA,KAAA,CAAM,IAAA,CAAKA,sBAAA;AAAA,MAAO,EAAE,GAAG,KAAA,EAAO,CAAA,EAAG,OAAO,KAAA,EAAO,wBAAA,EAA0B,eAAe,QAAA,EAAS;AAAA,MAC/F,CAAA,UAAA,EAAa,EAAE,OAAO,CAAA;AAAA,KAAG,CAAA;AAC3B,IAAA,KAAA,IAAS,KAAA;AAAA,EACX;AACA,EAAA,IAAI,CAAA,CAAE,UAAU,MAAA,EAAW;AACzB,IAAA,MAAM,OAAO,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,KAAK,IAC9B,CAAA,SAAA,EAAY,CAAA,CAAE,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA,GAC9B,WAAW,SAAA,CAAU,CAAA,CAAE,KAAK,CAAC,CAAA,CAAA;AACjC,IAAA,KAAA,CAAM,IAAA,CAAKA,sBAAA,CAAO,EAAE,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,KAAA,EAAO,kBAAA,EAAoB,aAAA,EAAe,QAAA,EAAS,EAAG,IAAI,CAAC,CAAA;AACnG,IAAA,KAAA,IAAS,KAAA;AAAA,EACX;AACA,EAAA,IAAI,EAAE,SAAA,EAAW;AACf,IAAA,IAAI,QAAA,GAAW,CAAA;AACf,IAAA,IAAI,IAAI,OAAA,EAAS;AACf,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,OAAA,CAAQ,OAAA,CAAQ,EAAE,SAAS,CAAA;AAC3C,MAAA,IAAI,GAAA,IAAO,GAAG,QAAA,GAAW,GAAA;AAAA,IAC3B;AACA,IAAA,KAAA,CAAM,IAAA,CAAKA,sBAAA;AAAA,MAAO,EAAE,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,KAAA,EAAO,mBAAA,EAAqB,aAAA,EAAe,QAAA,EAAU,IAAA,EAAM,UAAA,CAAW,QAAQ,CAAA,EAAE;AAAA,MACtH,CAAA,QAAA,EAAW,EAAE,SAAS,CAAA;AAAA,KAAG,CAAA;AAC3B,IAAA,KAAA,IAAS,KAAA;AAAA,EACX,CAAA,MAAA,IAAW,OAAO,CAAA,CAAE,KAAA,KAAU,QAAA,EAAU;AACtC,IAAA,KAAA,CAAM,IAAA,CAAKA,sBAAA;AAAA,MAAO,EAAE,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,OAAO,mBAAA,EAAqB,aAAA,EAAe,QAAA,EAAU,IAAA,EAAM,SAAA,EAAU;AAAA,MAC3G,CAAA,YAAA,EAAe,SAAA,CAAU,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,KAAG,CAAA;AACtC,IAAA,KAAA,IAAS,KAAA;AAAA,EACX;AAEA,EAAA,IAAI,MAAM,OAAA,CAAQ,CAAA,CAAE,KAAK,CAAA,IAAK,IAAI,OAAA,EAAS;AACzC,IAAA,MAAM,MAAM,CAAA,CAAE,KAAA;AACd,IAAA,MAAM,GAAA,GAAM,IAAI,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,GAAG,CAAC,CAAA;AACzC,IAAA,IAAI,MAAM,CAAA,EAAG;AACX,MAAA,MAAM,IAAA,GAAO,CAAA,GAAI,EAAA,CAAG,MAAA,GAAS,EAAA;AAC7B,MAAA,MAAM,OAAO,CAAA,GAAI,EAAA;AACjB,MAAA,MAAM,IAAA,GAAO,GAAG,KAAA,GAAQ,EAAA;AACxB,MAAA,IAAI,MAAA,GAAS,IAAA;AACb,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACnC,QAAA,MAAM,GAAA,GAAO,GAAA,CAAI,CAAC,CAAA,GAAK,GAAA,GAAO,IAAA;AAC9B,QAAA,IAAI,MAAM,CAAA,EAAG;AACX,UAAA,KAAA,CAAM,KAAKQ,sBAAA,CAAK,EAAE,GAAG,MAAA,EAAQ,CAAA,EAAG,MAAM,KAAA,EAAO,GAAA,EAAK,MAAA,EAAQ,CAAA,EAAG,MAAM,UAAA,CAAW,CAAC,GAAG,MAAA,EAAQ,MAAA,EAAQ,CAAC,CAAA;AAAA,QACrG;AACA,QAAA,MAAA,IAAU,GAAA;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAOI,uBAAA,CAAM;AAAA,IACX,gBAAgB,CAAA,CAAE,EAAA;AAAA,IAClB,kBAAkB,CAAA,CAAE,IAAA;AAAA,IACpB,gBAAgB,CAAA,CAAE,OAAA,KAAY,SAAY,MAAA,CAAO,CAAA,CAAE,OAAO,CAAA,GAAI,EAAA;AAAA,IAC9D,YAAA,EAAc,EAAE,SAAA,IAAa;AAAA,KAC5B,KAAK,CAAA;AACV;AAIA,SAAS,mBAAmB,EAAA,EAA6B;AACvD,EAAA,MAAM,IAAI,EAAA,CAAG,IAAA;AACb,EAAA,MAAM,SAAS,CAAA,CAAE,IAAA,KAAS,QAAA,IAAY,CAAA,CAAE,SAAS,MAAA,KAAW,CAAA;AAC5D,EAAA,MAAM,GAAA,GAAM,SAAS,qBAAA,GAAwB,gBAAA;AAE7C,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,CAAM,KAAKJ,sBAAA,CAAK;AAAA,IACd,CAAA,EAAG,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,KAAA,GAAQ,CAAA;AAAA,IACrB,CAAA,EAAG,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,MAAA,GAAS,CAAA;AAAA,IACtB,OAAO,EAAA,CAAG,KAAA;AAAA,IACV,QAAQ,EAAA,CAAG,MAAA;AAAA,IACX,EAAA,EAAI,CAAA;AAAA,IACJ,EAAA,EAAI,CAAA;AAAA,IACJ,KAAA,EAAO;AAAA,GACR,CAAC,CAAA;AAEF,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,EAAE,CAAA;AAClC,EAAA,MAAM,MAAA,GAAS,MAAM,MAAA,GAAS,EAAA;AAC9B,EAAA,IAAI,EAAA,GAAK,EAAA,CAAG,CAAA,GAAI,MAAA,GAAS,CAAA,GAAI,EAAA;AAC7B,EAAA,KAAA,MAAWT,SAAQ,KAAA,EAAO;AACxB,IAAA,KAAA,CAAM,IAAA,CAAKC,sBAAA,CAAO,EAAE,CAAA,EAAG,EAAA,CAAG,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,KAAA,EAAO,sBAAA,EAAuB,EAAGD,KAAI,CAAC,CAAA;AAC1E,IAAA,EAAA,IAAM,EAAA;AAAA,EACR;AAEA,EAAA,OAAOa,uBAAA,CAAM;AAAA,IACX,gBAAgB,CAAA,CAAE,EAAA;AAAA,IAClB,kBAAkB,CAAA,CAAE,IAAA;AAAA,IACpB,WAAA,EAAa,SAAS,MAAA,GAAS;AAAA,KAC9B,KAAK,CAAA;AACV;AAEA,SAAS,QAAA,CAASZ,OAAc,QAAA,EAA4B;AAC1D,EAAA,IAAIA,KAAAA,CAAK,MAAA,IAAU,QAAA,EAAU,OAAO,CAACA,KAAI,CAAA;AACzC,EAAA,MAAM,KAAA,GAAQA,KAAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAC9B,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,IAAI,CAAC,KAAK,GAAA,GAAM,CAAA;AAAA,SAAA,IAAA,CACN,GAAA,GAAM,GAAA,GAAM,CAAA,EAAG,MAAA,GAAS,QAAA,EAAU;AAAE,MAAA,KAAA,CAAM,KAAK,GAAG,CAAA;AAAG,MAAA,GAAA,GAAM,CAAA;AAAA,IAAG,CAAA,MACnE,GAAA,GAAM,GAAA,GAAM,GAAA,GAAM,CAAA;AACvB,IAAA,IAAI,KAAA,CAAM,MAAA,IAAU,CAAA,IAAK,GAAA,CAAI,UAAU,QAAA,EAAU;AAAE,MAAA,KAAA,CAAM,KAAK,GAAG,CAAA;AAAG,MAAA,GAAA,GAAM,EAAA;AAAI,MAAA;AAAA,IAAO;AAAA,EACvF;AACA,EAAA,IAAI,GAAA,EAAK,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA;AACvB,EAAA,OAAO,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AACzB;AAIO,SAAS,kBAAA,CAAmB,KAAe,MAAA,EAA+B;AAC/E,EAAA,MAAM,CAAA,GAAIa,kCAAA,CAAiB,MAAA,EAAQ,KAAA,IAAS,SAAS,CAAA;AACrD,EAAA,MAAM,MAAA,GAAS,mBAAmB,GAAG,CAAA;AAErC,EAAA,MAAM,WAAA,GAAc,GAAA,CAAI,KAAA,GAAQ,EAAA,GAAK,EAAA;AACrC,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AACpC,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,SAAS,WAAW,CAAA;AAEpD,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,QAAA,CAAS,IAAA,CAAKZ,uBAAA,CAAQ,GAAA,CAAI,KAAA,IAAS,eAAe,CAAC,CAAA;AACnD,EAAA,QAAA,CAAS,IAAA,CAAKa,sBAAA,CAAK,CAAA,eAAA,EAAkB,GAAA,CAAI,IAAI,CAAA,YAAA,EAAe,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA,WAAA,EAAc,MAAA,CAAO,KAAA,CAAM,MAAM,QAAQ,CAAC,CAAA;AACzH,EAAA,QAAA,CAAS,IAAA,CAAKC,qBAAG,OAAA,EAAS,IAAI,QAAA,CAAS,CAAC,CAAC,CAAC,CAAA;AAE1C,EAAA,IAAI,IAAI,KAAA,EAAO;AACb,IAAA,QAAA,CAAS,IAAA,CAAKf,sBAAA,CAAO,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,KAAA,EAAO,gBAAA,EAAiB,EAAG,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA,EAC5E;AAEA,EAAA,MAAM,QAAkB,EAAC;AAGzB,EAAA,KAAA,MAAW,CAAA,IAAK,OAAO,KAAA,EAAO;AAC5B,IAAA,MAAM,GAAA,GAAM,CAAA,CAAE,SAAA,GAAY,uBAAA,GAA0B,eAAA;AACpD,IAAA,MAAM,KAAA,GAAyC,EAAE,CAAA,EAAG,CAAA,CAAE,MAAM,KAAA,EAAO,GAAA,EAAK,WAAA,EAAa,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,EAAA,EAAK,CAAA,CAAE,EAAE,CAAA,CAAA,EAAG;AAC1G,IAAA,IAAI,CAAA,CAAE,gBAAgB,MAAA,IAAa,CAAC,EAAE,SAAA,EAAW,KAAA,CAAM,cAAc,CAAA,GAAI,CAAA,CAAE,WAAA;AAC3E,IAAA,KAAA,CAAM,IAAA,CAAKW,sBAAA,CAAO,KAAK,CAAC,CAAA;AAAA,EAC1B;AAGA,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,YAAA,IAAgB,EAAC;AACxC,EAAA,KAAA,MAAW,CAAA,IAAK,OAAO,KAAA,EAAO;AAC5B,IAAA,IAAI,CAAC,EAAE,KAAA,EAAO;AACd,IAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,CAAA,CAAE,EAAE,CAAA;AACtB,IAAA,IAAI,CAAC,CAAA,EAAG;AAGR,IAAA,MAAM,SAAS,GAAA,CAAI,IAAA,KAAS,cAAc,MAAA,CAAO,IAAA,CAAK,EAAE,KAAK,CAAA;AAC7D,IAAA,MAAM,UAAA,GAAa,SAAS,oBAAA,GAAuB,qBAAA;AAGnD,IAAA,IAAI,KAAK,CAAA,CAAE,CAAA;AACX,IAAA,IAAI,KAAK,CAAA,CAAE,CAAA;AACX,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,KAAK,CAAA;AACjC,IAAA,MAAM,aAAa,MAAA,CAAO,SAAA,KAAc,cAAc,MAAA,CAAO,SAAA,KAAc,YAAY,CAAA,GAAI,CAAA;AAC3F,IAAA,IAAI,UAAA,GAAa,CAAA,IAAK,QAAA,GAAW,CAAA,IAAK,WAAW,EAAA,EAAI;AAEnD,MAAA,MAAM,GAAA,GAAO,CAAA,CAAE,KAAA,GAAQ,IAAA,CAAK,EAAA,GAAM,GAAA;AAClC,MAAA,MAAM,EAAA,GAAK,CAAC,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AACxB,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AAEvB,MAAA,MAAM,IAAA,GAAO,EAAA,GAAK,CAAA,GAAI,EAAA,GAAK,CAAA;AAC3B,MAAA,EAAA,IAAM,KAAK,UAAA,GAAa,IAAA;AACxB,MAAA,EAAA,IAAM,KAAK,UAAA,GAAa,IAAA;AAAA,IAC1B;AAEA,IAAA,MAAM,KAAA,GAAQ,SAAS,GAAA,GAAM,GAAA;AAC7B,IAAA,MAAM,CAAA,GAAI,KAAK,GAAA,CAAI,CAAA,CAAE,MAAM,MAAA,GAAS,KAAA,GAAQ,IAAI,EAAE,CAAA;AAClD,IAAA,MAAM,CAAA,GAAI,EAAA;AACV,IAAA,KAAA,CAAM,KAAKH,sBAAA,CAAK;AAAA,MACd,CAAA,EAAG,KAAK,CAAA,GAAI,CAAA;AAAA,MAAG,CAAA,EAAG,KAAK,CAAA,GAAI,CAAA;AAAA,MAAG,KAAA,EAAO,CAAA;AAAA,MAAG,MAAA,EAAQ,CAAA;AAAA,MAChD,KAAA,EAAO,wBAAA;AAAA,MAA0B,EAAA,EAAI,CAAA;AAAA,MAAG,EAAA,EAAI;AAAA,KAC7C,CAAC,CAAA;AACF,IAAA,KAAA,CAAM,IAAA,CAAKR,sBAAA,CAAO,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,KAAA,EAAO,UAAA,EAAW,EAAG,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,EACjE;AAGA,EAAA,KAAA,MAAW,EAAA,IAAM,OAAO,KAAA,EAAO;AAC7B,IAAA,IAAI,GAAA,CAAI,SAAS,UAAA,EAAY,KAAA,CAAM,KAAK,kBAAA,CAAmB,EAAA,EAAI,MAAM,CAAC,CAAA;AAAA,SAAA,IAC7D,GAAA,CAAI,SAAS,IAAA,EAAM,KAAA,CAAM,KAAK,YAAA,CAAa,EAAA,EAAI,GAAG,CAAC,CAAA;AAAA,SACvD,KAAA,CAAM,IAAA,CAAK,kBAAA,CAAmB,EAAE,CAAC,CAAA;AAAA,EACxC;AAEA,EAAA,QAAA,CAAS,IAAA,CAAKY,uBAAA,CAAM,EAAE,SAAA,EAAW,CAAA,aAAA,EAAgB,WAAW,CAAA,CAAA,CAAA,EAAK,WAAA,EAAa,GAAA,CAAI,IAAA,EAAK,EAAG,KAAK,CAAC,CAAA;AAEhG,EAAA,OAAOI,yBAAA,CAAQ;AAAA,IACb,KAAA,EAAO,UAAA;AAAA,IACP,IAAA,EAAM,KAAA;AAAA,IACN,cAAcC,2BAAA,CAAU,GAAA,CAAI,SAAS,CAAA,eAAA,EAAkB,GAAA,CAAI,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,IAClE,KAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA,EAAS,CAAA,IAAA,EAAO,KAAK,CAAA,CAAA,EAAI,MAAM,CAAA;AAAA,KAC9B,QAAQ,CAAA;AACb;;;AChaO,IAAM,YAAA,GAA8B;AAAA,EACzC,IAAA,EAAM,cAAA;AAAA,EACN,OAAOjB,KAAAA,EAAM;AACX,IAAA,OAAO,qBAAA,CAAsB,KAAKA,KAAI,CAAA;AAAA,EACxC,CAAA;AAAA,EACA,KAAA,EAAO,iBAAA;AAAA,EAEP,MAAA,CAAOA,OAAM,MAAA,EAAuB;AAClC,IAAA,MAAM,GAAA,GAAM,kBAAkBA,KAAI,CAAA;AAClC,IAAA,OAAO,kBAAA,CAAmB,KAAK,MAAM,CAAA;AAAA,EACvC;AACF;;;ACFO,SAAS,UAAU,GAAA,EAA2B;AACnD,EAAA,MAAM,CAAA,GAAI,IAAI,IAAA,EAAK;AAGnB,EAAA,MAAM,IAAA,GAAO,mCAAA,CAAoC,IAAA,CAAK,CAAC,CAAA;AACvD,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,MAAM,CAAA,GAAI,UAAA,CAAW,IAAA,CAAK,CAAC,CAAE,CAAA;AAC7B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,CAAC,CAAA,CAAG,WAAA,EAAY;AAClC,IAAA,MAAM,OAAO,IAAA,KAAS,IAAA,GAAO,GAAA,GAAM,IAAA,KAAS,OAAO,GAAA,GAAM,GAAA;AACzD,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,OAAO,CAAA,GAAI,IAAA;AAAA,MAClB,GAAA,EAAK,CAAA;AAAA,MACL,SAAA,EAAW;AAAA,KACb;AAAA,EACF;AAGA,EAAA,MAAM,GAAA,GAAM,qBAAA,CAAsB,IAAA,CAAK,CAAC,CAAA;AACxC,EAAA,IAAI,GAAA,EAAK;AACP,IAAA,OAAO,EAAE,KAAA,EAAO,CAAC,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,EAAI,EAAE,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,SAAA,EAAW,MAAA,EAAO;AAAA,EACpE;AAGA,EAAA,MAAM,IAAA,GAAO,mCAAA,CAAoC,IAAA,CAAK,CAAC,CAAA;AACvD,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,IAAA,CAAK,CAAC,GAAI,EAAE,CAAA;AAC/B,IAAA,MAAM,EAAA,GAAK,QAAA,CAAS,IAAA,CAAK,CAAC,GAAI,EAAE,CAAA;AAChC,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,IAAA,CAAK,CAAC,GAAI,EAAE,CAAA;AAC/B,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAK,SAAA,CAAU,CAAA,EAAG,IAAI,CAAC,CAAA,GAAI,CAAA,IAAK,UAAA,CAAW,CAAC,CAAA;AAAA,MACnD,GAAA,EAAK,CAAA;AAAA,MACL,SAAA,EAAW;AAAA,KACb;AAAA,EACF;AAGA,EAAA,MAAM,GAAA,GAAM,yBAAA,CAA0B,IAAA,CAAK,CAAC,CAAA;AAC5C,EAAA,IAAI,GAAA,EAAK;AACP,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,GAAA,CAAI,CAAC,GAAI,EAAE,CAAA;AAC9B,IAAA,MAAM,EAAA,GAAK,QAAA,CAAS,GAAA,CAAI,CAAC,GAAI,EAAE,CAAA;AAC/B,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,CAAA,GAAA,CAAK,EAAA,GAAK,CAAA,IAAK,EAAA;AAAA,MACtB,GAAA,EAAK,CAAA;AAAA,MACL,SAAA,EAAW;AAAA,KACb;AAAA,EACF;AAGA,EAAA,MAAM,GAAA,GAAM,0BAAA,CAA2B,IAAA,CAAK,CAAC,CAAA;AAC7C,EAAA,IAAI,GAAA,EAAK;AACP,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,GAAA,CAAI,CAAC,GAAI,EAAE,CAAA;AAC9B,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,GAAA,CAAI,CAAC,GAAI,EAAE,CAAA;AAC9B,IAAA,OAAO,EAAE,OAAO,CAAA,GAAA,CAAK,CAAA,GAAI,KAAK,IAAA,EAAM,GAAA,EAAK,CAAA,EAAG,SAAA,EAAW,OAAA,EAAQ;AAAA,EACjE;AAGA,EAAA,MAAM,EAAA,GAAK,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA;AAC7B,EAAA,IAAI,EAAA,EAAI;AACN,IAAA,OAAO,EAAE,KAAA,EAAO,QAAA,CAAS,EAAA,CAAG,CAAC,CAAA,EAAI,EAAE,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,SAAA,EAAW,MAAA,EAAO;AAAA,EAClE;AAEA,EAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,GAAG,CAAA,CAAA,CAAG,CAAA;AAC/C;AAQO,SAAS,aAAa,GAAA,EAAkC;AAC7D,EAAA,IAAI;AACF,IAAA,OAAO,UAAU,GAAG,CAAA;AAAA,EACtB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,SAAS,WAAW,CAAA,EAAmB;AACrC,EAAA,MAAM,IAAA,GAAQ,IAAI,CAAA,KAAM,CAAA,IAAK,IAAI,GAAA,KAAQ,CAAA,IAAM,IAAI,GAAA,KAAQ,CAAA;AAC3D,EAAA,OAAO,OAAO,GAAA,GAAM,GAAA;AACtB;AAEA,SAAS,SAAA,CAAU,CAAA,EAAW,CAAA,EAAW,CAAA,EAAmB;AAC1D,EAAA,MAAM,GAAA,GAAM,CAAC,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,IAAI,EAAE,CAAA;AAC3D,EAAA,IAAK,CAAA,GAAI,CAAA,KAAM,CAAA,IAAK,CAAA,GAAI,GAAA,KAAQ,CAAA,IAAM,CAAA,GAAI,GAAA,KAAQ,CAAA,EAAG,GAAA,CAAI,CAAC,CAAA,GAAI,EAAA;AAC9D,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,KAAA,IAAS,CAAA,GAAI,GAAG,CAAA,GAAI,CAAA,GAAI,GAAG,CAAA,EAAA,EAAK,KAAA,IAAS,IAAI,CAAC,CAAA;AAC9C,EAAA,OAAO,KAAA;AACT;AAKO,SAAS,UAAA,CAAW,OAAe,IAAA,EAAsB;AAC9D,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAC1B,EAAA,IAAI,IAAA,IAAQ,KAAK,OAAO,CAAA,EAAG,KAAK,KAAA,CAAA,CAAO,IAAA,GAAO,KAAA,IAAS,GAAG,CAAC,CAAA,GAAA,CAAA;AAC3D,EAAA,IAAI,IAAA,IAAQ,GAAA,EAAM,OAAO,CAAA,GAAI,CAAA,GAAI,GAAG,CAAC,CAAC,CAAA,GAAA,CAAA,GAAQ,CAAA,EAAG,CAAC,CAAA,CAAA;AAClD,EAAA,IAAI,IAAA,IAAQ,EAAA,EAAI,OAAO,CAAA,GAAI,CAAA,GAAI,GAAG,CAAC,CAAC,CAAA,GAAA,CAAA,GAAQ,CAAA,EAAG,CAAC,CAAA,CAAA;AAEhD,EAAA,OAAO,IAAI,CAAA,GAAI,CAAA,EAAG,CAAC,CAAC,CAAA,GAAA,CAAA,GAAQ,GAAG,CAAC,CAAA,CAAA;AAClC;;;ACpGO,IAAM,kBAAA,GAAN,cAAiC,KAAA,CAAM;AAAA,EAC5C,WAAA,CACE,OAAA,EACOD,KAAAA,EACA,MAAA,EACA,MAAA,EACP;AACA,IAAA,KAAA,CAAMA,UAAS,MAAA,GAAY,CAAA,KAAA,EAAQA,KAAI,CAAA,EAAA,EAAK,OAAO,KAAK,OAAO,CAAA;AAJxD,IAAA,IAAA,CAAA,IAAA,GAAAA,KAAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAGP,IAAA,IAAA,CAAK,IAAA,GAAO,oBAAA;AAAA,EACd;AAAA,EANS,IAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAKX,CAAA;AAQA,SAASmB,YAAW,GAAA,EAAwB;AAC1C,EAAA,MAAM,MAAiB,EAAC;AACxB,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA;AAC/B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,GAAA,GAAM,MAAM,CAAC,CAAA;AACnB,IAAA,IAAI,QAAQ,MAAA,EAAW;AACvB,IAAA,MAAM,OAAA,GAAU,IAAI,IAAA,EAAK;AACzB,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,IAAI,QAAQ,UAAA,CAAW,GAAG,KAAK,OAAA,CAAQ,UAAA,CAAW,IAAI,CAAA,EAAG;AACzD,IAAA,MAAM,SAAS,GAAA,CAAI,MAAA,GAAS,IAAI,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA,CAAE,MAAA;AACpD,IAAA,GAAA,CAAI,IAAA,CAAK,EAAE,MAAA,EAAQ,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,EAAG,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,CAAA,GAAI,GAAG,CAAA;AAAA,EACzE;AACA,EAAA,OAAO,GAAA;AACT;AAGA,SAAS,UAAA,CAAW,GAAW,OAAA,EAAmC;AAChE,EAAA,MAAM,CAAA,GAAI,EAAE,SAAA,EAAU;AACtB,EAAA,IAAI,CAAC,CAAA,CAAE,UAAA,CAAW,GAAG,CAAA,EAAG;AACtB,IAAA,MAAM,IAAI,kBAAA,CAAmB,CAAA,6BAAA,EAAgC,CAAC,IAAI,OAAO,CAAA;AAAA,EAC3E;AACA,EAAA,MAAM,GAAA,GAAM,CAAA,CAAE,OAAA,CAAQ,GAAA,EAAK,CAAC,CAAA;AAC5B,EAAA,IAAI,GAAA,GAAM,GAAG,MAAM,IAAI,mBAAmB,CAAA,qBAAA,EAAwB,CAAC,IAAI,OAAO,CAAA;AAC9E,EAAA,OAAO,CAAC,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,GAAG,GAAG,CAAA,CAAE,KAAA,CAAM,GAAA,GAAM,CAAC,CAAC,CAAA;AAC3C;AAGA,SAAS,eAAA,CAAgB,GAAW,OAAA,EAAkE;AACpG,EAAA,MAAM,CAAA,GAAI,EAAE,OAAA,EAAQ;AACpB,EAAA,IAAI,CAAC,CAAA,CAAE,QAAA,CAAS,GAAG,CAAA,EAAG,OAAO,EAAE,KAAA,EAAO,EAAC,EAAG,IAAA,EAAM,CAAA,EAAE;AAClD,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,WAAA,CAAY,GAAG,CAAA;AAC9B,EAAA,IAAI,IAAA,GAAO,GAAG,OAAO,EAAE,OAAO,EAAC,EAAG,MAAM,CAAA,EAAE;AAC1C,EAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,KAAA,CAAM,IAAA,GAAO,GAAG,EAAE,CAAA;AAClC,EAAA,MAAM,QAAgC,EAAC;AACvC,EAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,KAAA,EAAO,GAAG,CAAA;AACtC,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,MAAM,EAAA,GAAK,EAAE,IAAA,EAAK;AAClB,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,MAAM,GAAA,GAAM,EAAA,CAAG,OAAA,CAAQ,GAAG,CAAA;AAC1B,IAAA,IAAI,MAAM,CAAA,EAAG;AACX,MAAA,MAAM,IAAI,kBAAA,CAAmB,CAAA,gCAAA,EAAmC,EAAE,IAAI,OAAO,CAAA;AAAA,IAC/E;AACA,IAAA,MAAM,IAAI,EAAA,CAAG,KAAA,CAAM,CAAA,EAAG,GAAG,EAAE,IAAA,EAAK;AAChC,IAAA,IAAI,IAAI,EAAA,CAAG,KAAA,CAAM,GAAA,GAAM,CAAC,EAAE,IAAA,EAAK;AAC/B,IAAA,IAAI,CAAA,CAAE,UAAA,CAAW,GAAG,CAAA,IAAK,CAAA,CAAE,QAAA,CAAS,GAAG,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAC3D,IAAA,KAAA,CAAM,CAAC,CAAA,GAAI,CAAA;AAAA,EACb;AACA,EAAA,OAAO,EAAE,OAAO,IAAA,EAAM,CAAA,CAAE,MAAM,CAAA,EAAG,IAAI,CAAA,CAAE,OAAA,EAAQ,EAAE;AACnD;AAEA,SAAS,aAAA,CAAc,GAAW,GAAA,EAAuB;AACvD,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,QAAQ,CAAA,EAAA,EAAK;AACjC,IAAA,MAAM,EAAA,GAAK,EAAE,CAAC,CAAA;AACd,IAAA,IAAI,EAAA,KAAO,GAAA,EAAK,OAAA,GAAU,CAAC,OAAA;AAC3B,IAAA,IAAI,OAAA,EAAS;AACb,IAAA,IAAI,EAAA,KAAO,GAAA,IAAO,EAAA,KAAO,GAAA,EAAK,KAAA,EAAA;AAAA,SAAA,IACrB,EAAA,KAAO,GAAA,IAAO,EAAA,KAAO,GAAA,EAAK,KAAA,EAAA;AAAA,SAAA,IAC1B,EAAA,KAAO,GAAA,IAAO,KAAA,KAAU,CAAA,EAAG;AAClC,MAAA,GAAA,CAAI,IAAA,CAAK,CAAA,CAAE,KAAA,CAAM,KAAA,EAAO,CAAC,CAAC,CAAA;AAC1B,MAAA,KAAA,GAAQ,CAAA,GAAI,CAAA;AAAA,IACd;AAAA,EACF;AACA,EAAA,GAAA,CAAI,IAAA,CAAK,CAAA,CAAE,KAAA,CAAM,KAAK,CAAC,CAAA;AACvB,EAAA,OAAO,GAAA;AACT;AASA,SAAS,gBAAA,CAAiB,GAAW,OAAA,EAA+D;AAMlG,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,IAAI,KAAA,GAAQ,EAAA;AACZ,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,QAAQ,CAAA,EAAA,EAAK;AACjC,IAAA,MAAM,CAAA,GAAI,EAAE,CAAC,CAAA;AACb,IAAA,IAAI,CAAA,KAAM,GAAA,EAAK,OAAA,GAAU,CAAC,OAAA;AAC1B,IAAA,IAAI,OAAA,EAAS;AACb,IAAA,IAAI,MAAM,GAAA,EAAK;AACb,MAAA,MAAM,QAAA,GAAW,CAAA,KAAM,CAAA,IAAK,CAAA,CAAE,CAAA,GAAI,CAAC,CAAA,KAAM,GAAA,IAAO,CAAA,CAAE,CAAA,GAAI,CAAC,CAAA,KAAM,GAAA;AAC7D,MAAA,MAAM,QAAA,GAAW,CAAA,KAAM,CAAA,CAAE,MAAA,GAAS,CAAA,IAAK,CAAA,CAAE,CAAA,GAAI,CAAC,CAAA,KAAM,GAAA,IAAO,CAAA,CAAE,CAAA,GAAI,CAAC,CAAA,KAAM,GAAA;AACxE,MAAA,IAAI,YAAY,QAAA,EAAU;AAAE,QAAA,KAAA,GAAQ,CAAA;AAAG,QAAA;AAAA,MAAO;AAAA,IAChD;AAAA,EACF;AACA,EAAA,IAAI,QAAQ,CAAA,EAAG;AAEb,IAAA,OAAA,GAAU,KAAA;AACV,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,QAAQ,CAAA,EAAA,EAAK;AACjC,MAAA,MAAM,CAAA,GAAI,EAAE,CAAC,CAAA;AACb,MAAA,IAAI,CAAA,KAAM,GAAA,EAAK,OAAA,GAAU,CAAC,OAAA;AAC1B,MAAA,IAAI,OAAA,EAAS;AACb,MAAA,IAAI,MAAM,GAAA,EAAK;AAAE,QAAA,KAAA,GAAQ,CAAA;AAAG,QAAA;AAAA,MAAO;AAAA,IACrC;AAAA,EACF;AACA,EAAA,IAAI,KAAA,GAAQ,GAAG,MAAM,IAAI,mBAAmB,CAAA,yBAAA,EAA4B,CAAC,IAAI,OAAO,CAAA;AACpF,EAAA,MAAM,WAAW,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,KAAK,EAAE,IAAA,EAAK;AACxC,EAAA,MAAM,OAAO,CAAA,CAAE,KAAA,CAAM,KAAA,GAAQ,CAAC,EAAE,IAAA,EAAK;AAGrC,EAAA,MAAM,EAAA,GAAK,QAAA,CAAS,OAAA,CAAQ,IAAI,CAAA;AAChC,EAAA,IAAI,KAAK,CAAA,EAAG;AACV,IAAA,OAAO;AAAA,MACL,MAAM,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,EAAE,EAAE,IAAA,EAAK;AAAA,MACjC,KAAK,QAAA,CAAS,KAAA,CAAM,EAAA,GAAK,CAAC,EAAE,IAAA,EAAK;AAAA,MACjC;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA;AACjC,EAAA,IAAI,KAAA,IAAS,KAAA,CAAM,KAAA,GAAQ,CAAA,EAAG;AAC5B,IAAA,OAAO;AAAA,MACL,MAAM,QAAA,CAAS,KAAA,CAAM,GAAG,KAAA,CAAM,KAAK,EAAE,IAAA,EAAK;AAAA,MAC1C,KAAK,QAAA,CAAS,KAAA,CAAM,MAAM,KAAA,GAAQ,CAAC,EAAE,IAAA,EAAK;AAAA,MAC1C;AAAA,KACF;AAAA,EACF;AACA,EAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAK;AAChC;AAEO,SAAS,cAAc,GAAA,EAA0B;AACtD,EAAA,MAAM,KAAA,GAAQA,YAAW,GAAG,CAAA;AAC5B,EAAA,IAAI,CAAC,KAAA,CAAM,MAAA,EAAQ,MAAM,IAAI,mBAAmB,gBAAgB,CAAA;AAEhE,EAAA,MAAM,GAAA,GAAmB;AAAA,IACvB,IAAA,EAAM,UAAA;AAAA,IACN,KAAA,EAAO,MAAA;AAAA,IACP,KAAA,EAAO,UAAA;AAAA,IACP,WAAA,EAAa,YAAA;AAAA,IACb,KAAA,EAAO,cAAA;AAAA,IACP,IAAA,EAAM,QAAA;AAAA,IACN,QAAQ,EAAC;AAAA,IACT,MAAM,EAAC;AAAA,IACP,QAAQ;AAAC,GACX;AAEA,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,MAAMC,UAAS,CAAC,MAAA,KAAmB,GAAG,MAAM,CAAA,CAAA,EAAI,EAAE,MAAM,CAAA,CAAA;AAGxD,EAAA,MAAM,OAAA,GAAU,EAAE,KAAA,EAAO,CAAA,EAAE;AAG3B,EAAA,MAAM,KAAA,GAAQ,MAAM,CAAC,CAAA;AACrB,EAAA,IAAI,cAAA,CAAe,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,EAAG;AACnC,IAAA,MAAM,OAAO,KAAA,CAAM,IAAA,CAAK,QAAQ,cAAA,EAAgB,EAAE,EAAE,IAAA,EAAK;AACzD,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,IAAI,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AACxB,QAAA,MAAM,CAAClB,MAAK,CAAA,GAAI,UAAA,CAAW,IAAA,EAAM,MAAM,IAAI,CAAA;AAC3C,QAAA,GAAA,CAAI,KAAA,GAAQA,MAAAA;AAAA,MACd,CAAA,MAAO;AACL,QAAA,GAAA,CAAI,KAAA,GAAQ,IAAA;AAAA,MACd;AAAA,IACF;AACA,IAAA,CAAA,GAAI,CAAA;AAAA,EACN;AAEA,EAAA,OAAO,CAAA,GAAI,MAAM,MAAA,EAAQ;AACvB,IAAA,MAAM,CAAA,GAAI,MAAM,CAAC,CAAA;AACjB,IAAA,MAAMD,QAAO,CAAA,CAAE,IAAA;AAGf,IAAA,IAAI,cAAA,CAAe,IAAA,CAAKA,KAAI,CAAA,EAAG;AAC7B,MAAA,MAAM,IAAA,GAAOA,KAAAA,CAAK,OAAA,CAAQ,iBAAA,EAAmB,EAAE,CAAA;AAC/C,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AAC3B,MAAA,IAAI,EAAA,GAAK,GAAG,MAAM,IAAI,mBAAmB,CAAA,kCAAA,EAAqCA,KAAI,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA;AAC5F,MAAA,MAAM,IAAI,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,EAAE,IAAA,EAAK;AACjC,MAAA,MAAM,IAAI,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,CAAC,EAAE,IAAA,EAAK;AAClC,MAAA,WAAA,CAAY,GAAA,EAAK,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA;AAC7B,MAAA,CAAA,EAAA;AACA,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,SAAA,CAAU,IAAA,CAAKA,KAAI,CAAA,EAAG;AACxB,MAAA,MAAM,IAAA,GAAOA,KAAAA,CAAK,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAA;AACxC,MAAA,MAAM,EAAE,KAAA,EAAO,IAAA,KAAS,eAAA,CAAgB,IAAA,EAAM,EAAE,IAAI,CAAA;AACpD,MAAA,MAAM,EAAE,MAAM,GAAA,EAAK,IAAA,EAAM,WAAU,GAAI,gBAAA,CAAiB,IAAA,EAAM,CAAA,CAAE,IAAI,CAAA;AACpE,MAAA,IAAI,CAAC,KAAK,MAAM,IAAI,mBAAmB,CAAA,2BAAA,EAA8BA,KAAI,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA;AACnF,MAAA,MAAM,CAAC,KAAK,CAAA,GAAI,UAAA,CAAW,SAAA,EAAW,EAAE,IAAI,CAAA;AAC5C,MAAA,MAAM,GAAA,GAAmB;AAAA,QACvB,EAAA,EAAImB,QAAO,KAAK,CAAA;AAAA,QAChB,KAAA;AAAA,QACA,KAAA,EAAO,aAAA,CAAc,IAAA,EAAM,CAAA,CAAE,IAAI,CAAA;AAAA,QACjC,GAAA,EAAK,aAAA,CAAc,GAAA,EAAK,CAAA,CAAE,IAAI,CAAA;AAAA,QAC9B,KAAA,EAAO,MAAM,OAAO;AAAA,OACtB;AACA,MAAA,GAAA,CAAI,IAAA,CAAK,KAAK,GAAG,CAAA;AACjB,MAAA,CAAA,EAAA;AACA,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,OAAA,GAAU,WAAA,CAAY,IAAA,CAAKnB,KAAI,CAAA;AACrC,IAAA,MAAM,SAAA,GAAY,aAAA,CAAc,IAAA,CAAKA,KAAI,CAAA;AACzC,IAAA,IAAI,WAAW,SAAA,EAAW;AACxB,MAAA,MAAM,OAAA,GAAU,UAAU,OAAA,GAAU,SAAA;AACpC,MAAA,MAAM,IAAA,GAAOA,KAAAA,CAAK,OAAA,CAAQ,IAAI,MAAA,CAAO,IAAI,OAAO,CAAA,IAAA,CAAA,EAAQ,GAAG,CAAA,EAAG,EAAE,CAAA;AAChE,MAAA,IAAI,IAAA;AACJ,MAAA,IAAI,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AACxB,QAAA,MAAM,CAAC,CAAC,CAAA,GAAI,UAAA,CAAW,IAAA,EAAM,EAAE,IAAI,CAAA;AACnC,QAAA,IAAA,GAAO,CAAA;AAAA,MACT,CAAA,MAAO;AAEL,QAAA,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,OAAA,EAAS,EAAE,EAAE,IAAA,EAAK;AACtC,QAAA,IAAI,CAAC,IAAA,EAAM;AACT,UAAA,MAAM,IAAI,kBAAA,CAAmB,CAAA,qBAAA,EAAwB,OAAO,CAAA,CAAA,CAAA,EAAK,EAAE,IAAI,CAAA;AAAA,QACzE;AAAA,MACF;AACA,MAAA,MAAM,OAAA,GAAUmB,QAAO,OAAO,CAAA;AAC9B,MAAA,GAAA,CAAI,OAAO,IAAA,CAAK,EAAE,IAAI,OAAA,EAAS,KAAA,EAAO,MAAM,CAAA;AAC5C,MAAA,CAAA,EAAA;AAGA,MAAA,MAAM,aAAa,CAAA,CAAE,MAAA;AACrB,MAAA,OAAO,CAAA,GAAI,MAAM,MAAA,EAAQ;AACvB,QAAA,MAAM,KAAA,GAAQ,MAAM,CAAC,CAAA;AACrB,QAAA,IAAI,MAAM,MAAA,IAAU,UAAA,IAAc,sBAAsB,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,EAAG;AAC1E,QAAA,IAAI,OAAA,IAAW,KAAA,CAAM,MAAA,IAAU,UAAA,EAAY;AAC3C,QAAA,IAAI,YAAA,CAAa,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,EAAG;AAAE,UAAA,CAAA,EAAA;AAAK,UAAA;AAAA,QAAU;AACpD,QAAA,MAAMC,UAAS,cAAA,CAAe,KAAA,CAAM,MAAM,KAAA,CAAM,IAAA,EAAMD,SAAQ,OAAO,CAAA;AACrE,QAAA,IAAI,CAACC,OAAAA,EAAQ,MAAM,IAAI,kBAAA,CAAmB,CAAA,qBAAA,EAAwB,OAAO,CAAA,EAAA,EAAK,KAAA,CAAM,IAAI,CAAA,CAAA,EAAI,KAAA,CAAM,IAAI,CAAA;AACtG,QAAAA,OAAAA,CAAO,MAAM,OAAA,GAAU,OAAA;AACvB,QAAA,GAAA,CAAI,MAAA,CAAO,IAAA,CAAKA,OAAAA,CAAO,KAAK,CAAA;AAC5B,QAAA,CAAA,EAAA;AACA,QAAA,IAAI,CAAA,GAAI,KAAA,CAAM,MAAA,IAAU,YAAA,CAAa,KAAK,KAAA,CAAM,CAAC,CAAA,CAAG,IAAI,KAAK,KAAA,CAAM,CAAC,CAAA,CAAG,MAAA,GAAS,MAAM,MAAA,EAAQ;AAC5F,UAAA,MAAM,WAAW,KAAA,CAAM,CAAC,EAAG,IAAA,CAAK,OAAA,CAAQ,iBAAiB,EAAE,CAAA;AAC3D,UAAA,MAAM,CAAC,IAAI,CAAA,GAAI,UAAA,CAAW,UAAU,KAAA,CAAM,CAAC,EAAG,IAAI,CAAA;AAClD,UAAAA,OAAAA,CAAO,MAAM,IAAA,GAAO,IAAA;AACpB,UAAA,CAAA,EAAA;AAAA,QACF;AAAA,MACF;AACA,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,SAAS,cAAA,CAAepB,KAAAA,EAAM,CAAA,CAAE,IAAA,EAAMmB,SAAQ,OAAO,CAAA;AAC3D,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AAC5B,MAAA,CAAA,EAAA;AAEA,MAAA,IAAI,CAAA,GAAI,KAAA,CAAM,MAAA,IAAU,YAAA,CAAa,KAAK,KAAA,CAAM,CAAC,CAAA,CAAG,IAAI,KAAK,KAAA,CAAM,CAAC,CAAA,CAAG,MAAA,GAAS,EAAE,MAAA,EAAQ;AACxF,QAAA,MAAM,WAAW,KAAA,CAAM,CAAC,EAAG,IAAA,CAAK,OAAA,CAAQ,iBAAiB,EAAE,CAAA;AAC3D,QAAA,MAAM,CAAC,IAAI,CAAA,GAAI,UAAA,CAAW,UAAU,KAAA,CAAM,CAAC,EAAG,IAAI,CAAA;AAClD,QAAA,MAAA,CAAO,MAAM,IAAA,GAAO,IAAA;AACpB,QAAA,CAAA,EAAA;AAAA,MACF;AACA,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAI,kBAAA,CAAmB,CAAA,mBAAA,EAAsBnB,KAAI,CAAA,CAAA,EAAI,EAAE,IAAI,CAAA;AAAA,EACnE;AAEA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,aAAA,CAAc,KAAaD,KAAAA,EAA4B;AAC9D,EAAA,IAAI;AACF,IAAA,OAAO,UAAU,GAAG,CAAA;AAAA,EACtB,SAAS,CAAA,EAAG;AACV,IAAA,MAAM,MAAM,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,OAAO,CAAC,CAAA;AACrD,IAAA,MAAM,IAAI,kBAAA,CAAmB,GAAA,EAAKA,KAAI,CAAA;AAAA,EACxC;AACF;AAQA,SAAS,WAAA,CACP,KACA,OAAA,EACc;AACd,EAAA,MAAM,MAAA,GAAS,aAAa,GAAG,CAAA;AAC/B,EAAA,IAAI,QAAQ,OAAO,MAAA;AACnB,EAAA,OAAA,CAAQ,KAAA,IAAS,CAAA;AACjB,EAAA,OAAO;AAAA,IACL,OAAO,OAAA,CAAQ,KAAA;AAAA,IACf,GAAA;AAAA,IACA,SAAA,EAAW;AAAA,GACb;AACF;AAEA,SAAS,WAAA,CAAY,GAAA,EAAkB,CAAA,EAAW,CAAA,EAAWA,KAAAA,EAAoB;AAC/E,EAAA,QAAQ,CAAA;AAAG,IACT,KAAK,OAAA,EAAS;AACZ,MAAA,MAAM,UAAA,GAAa,CAAA,KAAM,eAAA,GAAkB,OAAA,GAAU,CAAA;AACrD,MAAA,IAAI,UAAA,KAAe,UAAA,IAAc,UAAA,KAAe,OAAA,IAAW,eAAe,UAAA,EAAY;AACpF,QAAA,MAAM,IAAI,kBAAA,CAAmB,CAAA,eAAA,EAAkB,CAAC,IAAIA,KAAI,CAAA;AAAA,MAC1D;AACA,MAAA,GAAA,CAAI,KAAA,GAAQ,UAAA;AACZ,MAAA;AAAA,IACF;AAAA,IACA,KAAK,aAAA;AACH,MAAA,IAAI,CAAA,KAAM,YAAA,IAAgB,CAAA,KAAM,UAAA,EAAY;AAC1C,QAAA,MAAM,IAAI,kBAAA,CAAmB,CAAA,qBAAA,EAAwB,CAAC,IAAIA,KAAI,CAAA;AAAA,MAChE;AACA,MAAA,GAAA,CAAI,WAAA,GAAc,CAAA;AAClB,MAAA;AAAA,IACF,KAAK,OAAA;AACH,MAAA,IAAI,CAAA,KAAM,cAAA,IAAkB,CAAA,KAAM,aAAA,IAAiB,MAAM,KAAA,EAAO;AAC9D,QAAA,MAAM,IAAI,kBAAA,CAAmB,CAAA,eAAA,EAAkB,CAAC,IAAIA,KAAI,CAAA;AAAA,MAC1D;AACA,MAAA,GAAA,CAAI,KAAA,GAAQ,CAAA;AACZ,MAAA;AAAA,IACF,KAAK,MAAA;AACH,MAAA,IAAI,CAAA,KAAM,QAAA,IAAY,CAAA,KAAM,QAAA,EAAU;AACpC,QAAA,MAAM,IAAI,kBAAA,CAAmB,CAAA,cAAA,EAAiB,CAAC,IAAIA,KAAI,CAAA;AAAA,MACzD;AACA,MAAA,GAAA,CAAI,IAAA,GAAO,CAAA;AACX,MAAA;AAAA,IACF;AACE,MAAA,CAAC,GAAA,CAAI,QAAA,KAAa,EAAC,EAAG,CAAC,CAAA,GAAI,CAAA;AAAA;AAEjC;AAMA,SAAS,cAAA,CACPC,KAAAA,EACAD,KAAAA,EACAoB,OAAAA,EACA,OAAA,EACmD;AACnD,EAAA,MAAM,EAAE,KAAA,EAAO,IAAA,EAAK,GAAI,eAAA,CAAgBnB,OAAMD,KAAI,CAAA;AAClD,EAAA,MAAM,EAAE,IAAA,EAAM,GAAA,EAAK,MAAK,GAAI,gBAAA,CAAiB,MAAMA,KAAI,CAAA;AAKvD,EAAA,IAAI,IAAA,GAAwC,MAAM,OAAA,GAAU,OAAA;AAC5D,EAAA,IAAI,KAAA,GAAQ,KAAK,IAAA,EAAK;AACtB,EAAA,IAAI,eAAA,CAAgB,IAAA,CAAK,KAAK,CAAA,EAAG;AAC/B,IAAA,IAAA,GAAO,WAAA;AACP,IAAA,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,gBAAA,EAAkB,EAAE,CAAA;AAAA,EAC5C;AACA,EAAA,IAAI,CAAC,KAAA,CAAM,UAAA,CAAW,GAAG,GAAG,OAAO,IAAA;AACnC,EAAA,MAAM,CAAC,KAAK,CAAA,GAAI,UAAA,CAAW,OAAOA,KAAI,CAAA;AAEtC,EAAA,MAAM,OAAA,GAAU,MAAM,MAAM,CAAA;AAC5B,EAAA,MAAM,IAAA,GACJ,OAAA,KAAY,OAAA,IAAW,OAAA,KAAY,UAAU,OAAA,GAAU,MAAA;AAEzD,EAAA,MAAM,EAAA,GAAoB;AAAA,IACxB,EAAA,EAAIoB,QAAO,IAAI,CAAA;AAAA,IACf,KAAA;AAAA,IACA,IAAA;AAAA,IACA,KAAA,EAAO,WAAA,CAAY,IAAA,EAAM,OAAO,CAAA;AAAA,IAChC,GAAA,EAAK,GAAA,GAAM,WAAA,CAAY,GAAA,EAAK,OAAO,CAAA,GAAI,MAAA;AAAA,IACvC,IAAA,EAAM,MAAM,MAAM,CAAA;AAAA,IAClB,KAAA,EAAO,MAAM,OAAO,CAAA;AAAA,IACpB,KAAA,EAAO,MAAM,OAAO,CAAA;AAAA,IACpB,QAAA,EAAU,MAAM,UAAU,CAAA;AAAA,IAC1B;AAAA,GACF;AACA,EAAA,OAAO,EAAE,KAAA,EAAO,EAAA,EAAI,OAAA,EAAS,KAAA,EAAM;AACrC;;;AClYA,IAAM,YAAA,GAAe,GAAA;AACrB,IAAM,oBAAA,GAAuB,GAAA;AAC7B,IAAM,kBAAA,GAAqB,EAAA;AAC3B,IAAM,SAAA,GAAY,EAAA;AAClB,IAAM,YAAA,GAAe,EAAA;AACrB,IAAM,eAAA,GAAkB,EAAA;AACxB,IAAM,WAAA,GAAc,EAAA;AACpB,IAAM,iBAAA,GAAoB,EAAA;AAC1B,IAAM,iBAAA,GAAoB,EAAA;AAC1B,IAAM,QAAA,GAAW,CAAA;AAKjB,IAAM,wBAAA,GAA2B;AAAA,EAC/B,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EACjC,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW;AACnC,CAAA;AAEO,SAAS,eAAe,GAAA,EAAwC;AACrE,EAAA,QAAQ,IAAI,KAAA;AAAO,IACjB,KAAK,OAAA;AAAY,MAAA,OAAO,YAAY,GAAG,CAAA;AAAA,IACvC,KAAK,UAAA;AAAY,MAAA,OAAO,eAAe,GAAG,CAAA;AAAA,IAC1C,KAAK,UAAA;AAAA,IACL;AAAiB,MAAA,OAAO,eAAe,GAAG,CAAA;AAAA;AAE9C;AAIA,SAAS,WAAW,GAAA,EAA8D;AAChF,EAAA,MAAM,MAAA,GAAS;AAAA,IACb,GAAG,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,MAAM,KAAK,CAAA;AAAA,IACpC,GAAG,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,MAAM,KAAK;AAAA,GACpC;AACA,EAAA,MAAM,IAAA,GAAO;AAAA,IACX,GAAG,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,GAAA,EAAK,KAAA,IAAS,CAAA,CAAE,KAAA,CAAM,KAAK,CAAA;AAAA,IACpD,GAAG,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAI,KAAK;AAAA,GAClC;AACA,EAAA,IAAI,CAAC,MAAA,CAAO,MAAA,EAAQ,OAAO,EAAE,KAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,IAAA,EAAM,CAAA,EAAE;AACrD,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,GAAG,MAAM,CAAA;AAC9B,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,GAAG,IAAI,CAAA;AAC5B,EAAA,MAAM,IAAA,GAAO,MAAM,GAAA,IAAO,CAAA;AAC1B,EAAA,OAAO,EAAE,GAAA,EAAK,GAAA,EAAK,IAAA,EAAK;AAC1B;AAEA,SAAS,WACP,IAAA,EACA,MAAA,EACA,IAAA,EACA,IAAA,EACA,OACA,KAAA,EACuB;AACvB,EAAA,IAAI,SAAS,aAAA,EAAe;AAC1B,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,KAAA,EAAM,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,KAAA,CAAM,KAAA,GAAQ,CAAA,CAAE,MAAM,KAAK,CAAA;AAC1E,IAAA,MAAM,CAAA,GAAI,OAAO,MAAA,IAAU,CAAA;AAC3B,IAAA,MAAM,YAAA,uBAAmB,GAAA,EAAoB;AAC7C,IAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM,YAAA,CAAa,IAAI,CAAA,CAAE,KAAA,CAAM,KAAA,EAAO,CAAC,CAAC,CAAA;AAC3D,IAAA,OAAO,CAAC,CAAA,KAAc;AACpB,MAAA,MAAM,GAAA,GAAM,YAAA,CAAa,GAAA,CAAI,CAAC,CAAA;AAC9B,MAAA,IAAI,QAAQ,MAAA,EAAW;AACrB,QAAA,OAAO,SAAS,CAAA,KAAM,CAAA,GAAI,QAAQ,CAAA,GAAK,GAAA,IAAO,IAAI,CAAA,CAAA,GAAM,KAAA,CAAA;AAAA,MAC1D;AACA,MAAA,OAAO,KAAA,GAAA,CAAU,CAAA,GAAI,IAAA,KAAS,IAAA,GAAO,IAAA,CAAA,GAAS,KAAA;AAAA,IAChD,CAAA;AAAA,EACF;AACA,EAAA,IAAI,SAAS,KAAA,EAAO;AAClB,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,CAAC,CAAA;AAC5B,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAc,IAAA,CAAK,IAAI,CAAA,EAAG,GAAA,GAAM,IAAI,CAAC,CAAA;AACpD,IAAA,MAAM,MAAA,GAAS,MAAM,IAAI,CAAA;AACzB,IAAA,MAAM,MAAA,GAAS,MAAM,IAAI,CAAA;AACzB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AAChC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AAChC,IAAA,MAAM,KAAA,GAAQ,SAAS,MAAA,IAAU,CAAA;AACjC,IAAA,OAAO,CAAC,CAAA,KAAc;AACpB,MAAA,MAAM,QAAQ,MAAA,GAAS,IAAA,CAAK,MAAM,KAAA,CAAM,CAAC,CAAC,CAAA,IAAK,KAAA;AAC/C,MAAA,OAAO,QAAQ,IAAA,GAAO,KAAA;AAAA,IACxB,CAAA;AAAA,EACF;AACA,EAAA,MAAM,IAAA,GAAO,OAAO,IAAA,IAAQ,CAAA;AAC5B,EAAA,OAAO,CAAC,CAAA,KAAc,KAAA,GAAA,CAAU,CAAA,GAAI,QAAQ,IAAA,GAAQ,KAAA;AACtD;AAEA,SAAS,YAAY,IAAA,EAAwD;AAC3E,EAAA,IAAI,CAAC,KAAK,MAAA,EAAQ,OAAO,EAAE,IAAA,EAAM,CAAA,EAAG,KAAA,EAAO,EAAC,EAAE;AAC9C,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACvC,MAAA,IAAI,OAAA,CAAQ,CAAC,CAAA,IAAM,CAAA,CAAE,MAAM,KAAA,EAAO;AAAE,QAAA,MAAA,GAAS,CAAA;AAAG,QAAA;AAAA,MAAO;AAAA,IACzD;AACA,IAAA,IAAI,SAAS,CAAA,EAAG;AACd,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,CAAE,GAAA,CAAI,KAAK,CAAA;AACxB,MAAA,MAAA,GAAS,QAAQ,MAAA,GAAS,CAAA;AAAA,IAC5B,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,MAAM,CAAA,GAAI,CAAA,CAAE,GAAA,CAAI,KAAA;AAAA,IAC1B;AACA,IAAA,KAAA,CAAM,KAAK,MAAM,CAAA;AAAA,EACnB;AACA,EAAA,OAAO,EAAE,IAAA,EAAM,OAAA,CAAQ,MAAA,EAAQ,KAAA,EAAM;AACvC;AAEA,SAAS,aAAA,CACP,IAAA,EACA,IAAA,EACA,IAAA,EACA,QACA,IAAA,EACgB;AAChB,EAAA,MAAM,QAAwB,EAAC;AAE/B,EAAA,IAAI,SAAS,KAAA,EAAO;AAClB,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,CAAC,CAAA;AAC5B,IAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAA,GAAM,OAAO,CAAC,CAAA;AACzC,IAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAA,GAAM,OAAO,CAAC,CAAA;AACzC,IAAA,MAAM,SAAS,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,MAAM,CAAC,CAAA;AAC5C,IAAA,MAAM,SAAS,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,MAAM,CAAC,CAAA;AAC3C,IAAA,KAAA,IAAS,CAAA,GAAI,MAAA,EAAQ,CAAA,IAAK,MAAA,EAAQ,CAAA,EAAA,EAAK;AACrC,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,CAAC,CAAA;AAC1B,MAAA,MAAM,IAAI,GAAA,GAAM,GAAA;AAChB,MAAA,IAAI,CAAA,GAAI,IAAA,IAAQ,CAAA,GAAI,IAAA,EAAM;AAC1B,MAAA,MAAM,KAAA,GAAQ,GAAA,IAAO,GAAA,GAAM,CAAA,EAAG,MAAM,GAAG,CAAA,GAAA,CAAA,GAAQ,GAAA,IAAO,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,GAAG,CAAA,GAAA,CAAA,GAAQ,GAAG,GAAG,CAAA,GAAA,CAAA;AACtF,MAAA,KAAA,CAAM,IAAA,CAAK,EAAE,KAAA,EAAO,CAAA,EAAG,CAAA,EAAG,MAAA,CAAO,CAAC,CAAA,EAAG,KAAA,EAAO,KAAA,EAAO,IAAA,EAAM,CAAA;AAAA,IAC3D;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,IAAA,GAAO,SAAS,IAAI,CAAA;AAC1B,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,IAAA,GAAO,IAAI,CAAA,GAAI,IAAA;AACvC,EAAA,KAAA,IAAS,CAAA,GAAI,KAAA,EAAO,CAAA,IAAK,IAAA,EAAM,KAAK,IAAA,EAAM;AACxC,IAAA,KAAA,CAAM,IAAA,CAAK,EAAE,KAAA,EAAO,CAAA,EAAG,GAAG,MAAA,CAAO,CAAC,CAAA,EAAG,KAAA,EAAO,WAAW,CAAA,EAAG,IAAI,CAAA,EAAG,KAAA,EAAO,MAAM,CAAA;AAAA,EAChF;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,SAAS,IAAA,EAAsB;AACtC,EAAA,MAAM,UAAA,GAAa;AAAA,IACjB,IAAA;AAAA,IAAM,IAAA;AAAA,IAAM,IAAA;AAAA,IAAM,GAAA;AAAA,IAAK,IAAA;AAAA,IAAM,GAAA;AAAA,IAAK,CAAA;AAAA,IAAG,CAAA;AAAA,IAAG,CAAA;AAAA,IAAG,EAAA;AAAA,IAAI,EAAA;AAAA,IAAI,EAAA;AAAA,IAAI,EAAA;AAAA,IACvD,GAAA;AAAA,IAAK,GAAA;AAAA,IAAK,GAAA;AAAA,IAAK,GAAA;AAAA,IAAM,GAAA;AAAA,IAAM,GAAA;AAAA,IAAM,GAAA;AAAA,IAAO,GAAA;AAAA,IAAO,GAAA;AAAA,IAAQ,GAAA;AAAA,IAAQ;AAAA,GACjE;AACA,EAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAC1B,IAAA,IAAI,IAAA,GAAO,CAAA,IAAK,EAAA,EAAI,OAAO,CAAA;AAAA,EAC7B;AACA,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAA,CAAK,IAAA,CAAK,KAAK,KAAA,CAAM,IAAA,GAAO,EAAE,CAAC,CAAC,CAAA;AACtD;AAEA,SAAS,kBAAA,CAAmB,OAAe,IAAA,EAAuB;AAChE,EAAA,MAAM,KAAA,GAAQ,OAAO,EAAA,GAAK,CAAA;AAC1B,EAAA,OAAO,GAAA,GAAM,KAAA,CAAM,MAAA,GAAS,KAAA,GAAQ,CAAA;AACtC;AAIA,SAAS,eAAe,GAAA,EAAwC;AAC9D,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,MAAA,CAAO,KAAA,GAAQ,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,KAAA,CAAM,KAAA,GAAQ,CAAA,CAAE,MAAM,KAAK,CAAA;AAC9E,EAAA,MAAM,SAAA,GAAY,aAAA,CAAc,GAAA,EAAK,MAAM,CAAA;AAC3C,EAAA,gBAAA,CAAiB,QAAQ,SAAS,CAAA;AAElC,EAAA,MAAM,EAAE,KAAK,QAAA,EAAU,GAAA,EAAK,QAAQ,IAAA,EAAK,GAAI,WAAW,GAAG,CAAA;AAC3D,EAAA,MAAM,WAAA,GAAc,WAAW,IAAA,GAAO,IAAA;AACtC,EAAA,MAAM,SAAA,GAAY,SAAS,IAAA,GAAO,IAAA;AAElC,EAAA,MAAM,cAAA,GAAiB,GAAA,CAAI,MAAA,CAAO,MAAA,GAAS,CAAA;AAC3C,EAAA,MAAM,KAAA,GAAQ,iBAAiB,oBAAA,GAAuB,kBAAA;AACtD,EAAA,MAAM,YAAY,YAAA,GAAe,SAAA;AACjC,EAAA,MAAM,QAAQ,SAAA,GAAY,KAAA;AAE1B,EAAA,MAAM,MAAA,GAAS,WAAW,GAAA,CAAI,KAAA,EAAO,QAAQ,WAAA,EAAa,SAAA,EAAW,OAAO,KAAK,CAAA;AAEjF,EAAA,MAAM,OAAA,GAAU,WAAA,CAAY,GAAA,CAAI,IAAI,CAAA;AACpC,EAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,IAAA,IAAQ,eAAA,GAAkB,CAAA,CAAA;AAEvD,EAAA,MAAM,WAAA,GAAc,GAAA,CAAI,KAAA,GAAQ,EAAA,GAAK,CAAA;AACrC,EAAA,MAAM,KAAA,GAAQ,eAAe,WAAA,GAAc,YAAA;AAE3C,EAAA,MAAM,QAA8B,EAAC;AACrC,EAAA,IAAI,UAAU,KAAA,GAAQ,CAAA;AACtB,EAAA,KAAA,MAAW,KAAK,SAAA,EAAW;AACzB,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,YAAY,CAAA,CAAE,EAAA,IAAM,CAAA,CAAE,IAAA,KAAS,OAAO,CAAA;AAC1E,IAAA,MAAM,CAAA,GAAI,WAAW,iBAAA,GAAoB,iBAAA;AACzC,IAAA,KAAA,CAAM,IAAA,CAAK,EAAE,OAAA,EAAS,CAAA,CAAE,EAAA,EAAI,KAAA,EAAO,CAAA,CAAE,KAAA,EAAO,CAAA,EAAG,OAAA,EAAS,MAAA,EAAQ,CAAA,EAAG,CAAA;AACnE,IAAA,OAAA,IAAW,CAAA,GAAI,QAAA;AAAA,EACjB;AACA,EAAA,MAAM,QAAQ,OAAA,GAAU,KAAA;AACxB,EAAA,MAAM,QAAQ,OAAA,GAAU,CAAA;AACxB,EAAA,MAAM,MAAA,GAAS,QAAQ,WAAA,GAAc,EAAA;AAErC,EAAA,MAAM,aAAkC,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,CAAC,GAAG,GAAA,MAAS;AAAA,IAChE,GAAA,EAAK,CAAA;AAAA,IACL,CAAA,EAAG,MAAA,CAAO,CAAA,CAAE,KAAA,CAAM,KAAK,CAAA;AAAA,IACvB,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,MAAA,CAAO,CAAA,CAAE,GAAA,CAAI,KAAK,CAAA,GAAI,MAAA,CAAO,CAAA,CAAE,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,IAC9D,OAAA,EAAS,OAAA,CAAQ,KAAA,CAAM,GAAG;AAAA,GAC5B,CAAE,CAAA;AAEF,EAAA,MAAM,WAAA,GAAc,IAAI,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,CAAA,CAAA,KAAK,CAAC,CAAA,CAAE,OAAA,EAAS,CAAC,CAAC,CAAC,CAAA;AAC1D,EAAA,MAAM,eAAsC,EAAC;AAC7C,EAAA,MAAM,aAA2D,EAAC;AAClE,EAAA,KAAA,MAAW,MAAM,MAAA,EAAQ;AACvB,IAAA,MAAM,IAAA,GAAO,WAAA,CAAY,GAAA,CAAI,EAAA,CAAG,OAAQ,CAAA;AACxC,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,IAAI,EAAA,CAAG,SAAS,OAAA,EAAS;AACvB,MAAA,MAAM,CAAA,GAAI,MAAA,CAAO,EAAA,CAAG,KAAA,CAAM,KAAK,CAAA;AAC/B,MAAA,MAAM,EAAA,GAAK,MAAA,CAAO,EAAA,CAAG,GAAA,CAAK,KAAK,CAAA;AAC/B,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,CAAC,CAAA;AAC5B,MAAA,YAAA,CAAa,IAAA,CAAK;AAAA,QAChB,KAAA,EAAO,EAAA;AAAA,QACP,CAAA;AAAA,QACA,CAAA;AAAA,QACA,CAAA,EAAG,KAAK,CAAA,GAAI,CAAA;AAAA,QACZ,CAAA,EAAG,KAAK,MAAA,GAAS,EAAA;AAAA,QACjB,MAAA,EAAQ,IAAI,CAAA,GAAI,CAAA;AAAA,QAChB,MAAA,EAAQ,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,SAAS,CAAA,GAAI,CAAA;AAAA,QACnC,WAAA,EAAa;AAAA,OACd,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,MAAM,CAAA,GAAI,MAAA,CAAO,EAAA,CAAG,KAAA,CAAM,KAAK,CAAA;AAC/B,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,CAAA;AAClC,MAAA,MAAM,MAAA,GAAS,kBAAA,CAAmB,EAAA,CAAG,KAAA,EAAO,GAAG,IAAI,CAAA;AAGnD,MAAA,MAAM,UAAA,GAAa;AAAA,QACjB,EAAA,GAAK,EAAA;AAAA,QAAI,EAAA,GAAK,EAAA;AAAA,QAAI,EAAA,GAAK,EAAA;AAAA,QAAI,EAAA,GAAK,EAAA;AAAA,QAChC,EAAA,GAAK,EAAA;AAAA,QAAI,EAAA,GAAK,EAAA;AAAA,QAAI,EAAA,GAAK,EAAA;AAAA,QAAI,EAAA,GAAK;AAAA,OAClC;AACA,MAAA,IAAI,MAAA,GAAS,WAAW,CAAC,CAAA;AACzB,MAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAC1B,QAAA,MAAM,GAAA,GAAM,EAAE,EAAA,EAAI,CAAA,GAAI,MAAA,GAAS,GAAG,EAAA,EAAI,CAAA,GAAI,MAAA,GAAS,CAAA,EAAG,CAAA,EAAE;AACxD,QAAA,MAAM,UAAU,UAAA,CAAW,IAAA,CAAK,OAAK,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,GAAI,EAAA,IAAM,EAAE,EAAA,GAAK,GAAA,CAAI,MAAM,CAAA,CAAE,EAAA,GAAK,IAAI,EAAE,CAAA;AACjG,QAAA,IAAI,CAAC,OAAA,EAAS;AAAE,UAAA,MAAA,GAAS,CAAA;AAAG,UAAA,UAAA,CAAW,KAAK,GAAG,CAAA;AAAG,UAAA;AAAA,QAAO;AAAA,MAC3D;AACA,MAAA,YAAA,CAAa,IAAA,CAAK;AAAA,QAChB,KAAA,EAAO,EAAA;AAAA,QACP,CAAA;AAAA,QACA,CAAA,EAAG,EAAA;AAAA,QACH,CAAA,EAAG,iBAAA;AAAA,QACH,MAAA,EAAQ,CAAA;AAAA,QACR,MAAA;AAAA,QACA,WAAA,EAAa,QAAA;AAAA,QACb,KAAA,EAAO,EAAA,CAAG,IAAA,GAAO,CAAA,GAAI,EAAA,GAAK,MAAA;AAAA,QAC1B,KAAA,EAAO,EAAA,CAAG,IAAA,GAAO,EAAA,GAAK,EAAA,GAAK;AAAA,OAC5B,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,YAAA;AAAA,IACP,MAAA;AAAA,IACA,KAAA,EAAO,UAAA;AAAA,IACP,KAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA,MAAA,EAAQ,YAAA;AAAA,IACR,IAAA,EAAM,UAAA;AAAA,IACN,OAAO,aAAA,CAAc,WAAA,EAAa,WAAW,IAAA,EAAM,MAAA,EAAQ,IAAI,KAAK,CAAA,CACjE,OAAO,CAAA,CAAA,KAAK,CAAA,CAAE,KAAK,KAAA,GAAQ,CAAA,IAAK,EAAE,CAAA,IAAK,KAAA,GAAQ,QAAQ,CAAC,CAAA;AAAA,IAC3D,KAAA;AAAA,IACA,OAAO,GAAA,CAAI;AAAA,GACb;AACF;AAEA,SAAS,aAAA,CAAc,KAAkB,MAAA,EAA0C;AACjF,EAAA,MAAM,QAAA,GAAW,IAAI,GAAA,CAAI,GAAA,CAAI,OAAO,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,EAAE,CAAC,CAAA;AAClD,EAAA,MAAM,MAAA,GAA0B,GAAA,CAAI,MAAA,CAAO,KAAA,EAAM;AACjD,EAAA,KAAA,MAAW,MAAM,MAAA,EAAQ;AACvB,IAAA,IAAI,GAAG,OAAA,IAAW,CAAC,SAAS,GAAA,CAAI,EAAA,CAAG,OAAO,CAAA,EAAG;AAC3C,MAAA,EAAA,CAAG,OAAA,GAAU,MAAA;AAAA,IACf;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,gBAAA,CAAiB,QAAyB,MAAA,EAA+B;AAChF,EAAA,MAAM,aAAa,MAAA,CAAO,MAAA,CAAO,CAAA,CAAA,KAAK,CAAC,EAAE,OAAO,CAAA;AAChD,EAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAE7B,EAAA,MAAM,aAAa,UAAA,CAAW,KAAA,CAAM,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,OAAO,CAAA;AAE3D,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,IAAI,OAAO,MAAA,CAAO,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,iBAAiB,CAAA;AACtD,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,IAAA,GAAO,EAAE,EAAA,EAAI,iBAAA,EAAmB,KAAA,EAAO,EAAA,EAAG;AAC1C,MAAA,MAAA,CAAO,KAAK,IAAI,CAAA;AAAA,IAClB;AACA,IAAA,KAAA,MAAW,EAAA,IAAM,UAAA,EAAY,EAAA,CAAG,OAAA,GAAU,IAAA,CAAK,EAAA;AAC/C,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,SAA8C,EAAC;AACrD,EAAA,MAAM,SAAA,GAA2B,EAAE,EAAA,EAAI,iBAAA,EAAmB,OAAO,EAAA,EAAG;AACpE,EAAA,MAAM,cAA+B,EAAC;AAEtC,EAAA,KAAA,MAAW,MAAM,UAAA,EAAY;AAC3B,IAAA,IAAI,EAAA,CAAG,SAAS,OAAA,EAAS;AACvB,MAAA,WAAA,CAAY,KAAK,EAAE,CAAA;AACnB,MAAA;AAAA,IACF;AACA,IAAA,IAAI,MAAA,GAAS,KAAA;AACb,IAAA,KAAA,MAAW,QAAQ,MAAA,EAAQ;AACzB,MAAA,IAAI,EAAA,CAAG,KAAA,CAAM,KAAA,IAAS,IAAA,CAAK,IAAA,EAAM;AAC/B,QAAA,EAAA,CAAG,UAAU,IAAA,CAAK,EAAA;AAClB,QAAA,IAAA,CAAK,IAAA,GAAO,GAAG,GAAA,CAAK,KAAA;AACpB,QAAA,MAAA,GAAS,IAAA;AACT,QAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,EAAA,GAAK,CAAA,OAAA,EAAU,MAAA,CAAO,MAAM,CAAA,EAAA,CAAA;AAClC,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,EAAA,EAAI,KAAA,EAAO,IAAI,CAAA;AAC7B,MAAA,MAAA,CAAO,KAAK,EAAE,EAAA,EAAI,MAAM,EAAA,CAAG,GAAA,CAAK,OAAO,CAAA;AACvC,MAAA,EAAA,CAAG,OAAA,GAAU,EAAA;AAAA,IACf;AAAA,EACF;AACA,EAAA,IAAI,YAAY,MAAA,EAAQ;AACtB,IAAA,MAAA,CAAO,KAAK,SAAS,CAAA;AACrB,IAAA,KAAA,MAAW,EAAA,IAAM,WAAA,EAAa,EAAA,CAAG,OAAA,GAAU,SAAA,CAAU,EAAA;AAAA,EACvD;AACF;AAIA,IAAM,cAAA,GAAiB,EAAA;AACvB,IAAM,YAAA,GAAe,EAAA;AACrB,IAAM,cAAA,GAAiB,GAAA;AAEvB,SAAS,YAAY,GAAA,EAAwC;AAC3D,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,MAAA,CAAO,KAAA,GAAQ,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,KAAA,CAAM,KAAA,GAAQ,CAAA,CAAE,MAAM,KAAK,CAAA;AAC9E,EAAA,MAAM,EAAE,KAAK,QAAA,EAAU,GAAA,EAAK,QAAQ,IAAA,EAAK,GAAI,WAAW,GAAG,CAAA;AAC3D,EAAA,MAAM,UAAU,IAAA,GAAO,IAAA;AACvB,EAAA,MAAM,cAAc,QAAA,GAAW,OAAA;AAC/B,EAAA,MAAM,YAAY,MAAA,GAAS,OAAA;AAG3B,EAAA,MAAM,aAAuB,EAAC;AAC9B,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAChC,EAAA,KAAA,MAAW,MAAM,MAAA,EAAQ;AACvB,IAAA,MAAM,CAAA,GAAI,EAAA,CAAG,QAAA,KAAa,EAAA,CAAG,SAAS,OAAA,GAAU,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,OAAK,CAAA,CAAE,EAAA,KAAO,EAAA,CAAG,OAAO,GAAG,KAAA,GAAQ,MAAA,CAAA;AACnG,IAAA,IAAI,CAAA,IAAK,CAAC,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,EAAG;AAAE,MAAA,OAAA,CAAQ,IAAI,CAAC,CAAA;AAAG,MAAA,UAAA,CAAW,KAAK,CAAC,CAAA;AAAA,IAAG;AAAA,EAClE;AAEA,EAAA,IAAI,CAAC,WAAW,MAAA,IAAU,MAAA,CAAO,KAAK,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,KAAS,OAAO,CAAA,EAAG;AAC9D,IAAA,UAAA,CAAW,KAAK,OAAO,CAAA;AAAA,EACzB;AAEA,EAAA,MAAM,SAAA,GAAY,WAAW,MAAA,GAAS,CAAA;AACtC,EAAA,MAAM,KAAA,GAAQ,SAAA,GAAY,oBAAA,GAAuB,EAAA,GAAK,kBAAA;AACtD,EAAA,MAAM,SAAA,GAAY,YAAA,IAAgB,SAAA,GAAY,cAAA,GAAiB,EAAA,GAAK,SAAA,CAAA;AACpE,EAAA,MAAM,QAAQ,SAAA,GAAY,KAAA;AAE1B,EAAA,MAAM,MAAA,GAAS,WAAW,GAAA,CAAI,KAAA,EAAO,QAAQ,WAAA,EAAa,SAAA,EAAW,OAAO,KAAK,CAAA;AAEjF,EAAA,MAAM,OAAA,GAAU,WAAA,CAAY,GAAA,CAAI,IAAI,CAAA;AACpC,EAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,IAAA,IAAQ,eAAA,GAAkB,CAAA,CAAA;AAEvD,EAAA,MAAM,WAAA,GAAc,GAAA,CAAI,KAAA,GAAQ,EAAA,GAAK,CAAA;AACrC,EAAA,MAAM,UAAA,GAAa,eAAe,WAAA,GAAc,YAAA;AAChD,EAAA,MAAM,gBAAgB,UAAA,GAAa,cAAA;AACnC,EAAA,MAAM,KAAA,GAAQ,aAAA;AAEd,EAAA,MAAM,KAAA,GAA8B,UAAA,CAAW,GAAA,CAAI,CAAC,GAAG,CAAA,MAAO;AAAA,IAC5D,OAAA,EAAS,SAAS,CAAC,CAAA,EAAA,CAAA;AAAA,IACnB,KAAA,EAAO,CAAA;AAAA,IACP,CAAA,EAAG,KAAA,GAAQ,EAAA,GAAK,CAAA,GAAI,YAAA;AAAA,IACpB,QAAQ,YAAA,GAAe;AAAA,GACzB,CAAE,CAAA;AAEF,EAAA,MAAM,KAAA,GAAQ,UAAA;AACd,EAAA,MAAM,KAAA,GAAS,KAAA,CAAM,MAAA,GAAU,KAAA,CAAM,MAAM,MAAA,GAAS,CAAC,CAAA,CAAG,CAAA,GAAI,MAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,CAAG,SAAS,KAAA,GAAS,cAAA;AACvG,EAAA,MAAM,SAAU,KAAA,CAAM,MAAA,GAAS,KAAA,CAAM,KAAA,CAAM,SAAS,CAAC,CAAA,CAAG,CAAA,GAAI,KAAA,CAAM,MAAM,MAAA,GAAS,CAAC,CAAA,CAAG,MAAA,GAAS,KAAK,KAAA,GAAQ,EAAA;AAE3G,EAAA,MAAM,OAAA,GAAU,wBAAA;AAChB,EAAA,MAAM,QAAA,GAAW,CAAC,GAAA,KAAoC;AACpD,IAAA,IAAI,CAAC,GAAA,EAAK,OAAO,OAAA,CAAQ,CAAC,CAAA;AAC1B,IAAA,MAAM,GAAA,GAAM,UAAA,CAAW,OAAA,CAAQ,GAAG,CAAA;AAClC,IAAA,OAAO,SAAS,GAAA,GAAM,CAAA,GAAI,CAAA,GAAI,GAAA,IAAO,QAAQ,MAAM,CAAA;AAAA,EACrD,CAAA;AAEA,EAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,CAAA,CAAA,KAAK,CAAC,CAAA,CAAE,KAAA,EAAO,CAAC,CAAC,CAAC,CAAA;AAGtD,EAAA,MAAM,OAA4B,EAAC;AACnC,EAAA,MAAM,eAAsC,EAAC;AAG7C,EAAA,MAAM,WAAyD,EAAC;AAChE,EAAA,KAAA,MAAW,MAAM,MAAA,EAAQ;AACvB,IAAA,IAAI,EAAA,CAAG,SAAS,OAAA,EAAS;AACvB,MAAA,MAAM,GAAA,GAAM,GAAG,QAAA,IAAY,OAAA;AAC3B,MAAA,MAAM,OAAO,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA,IAAK,MAAM,CAAC,CAAA;AAC1C,MAAA,IAAI,CAAC,IAAA,EAAM;AACX,MAAA,MAAME,EAAAA,GAAI,MAAA,CAAO,EAAA,CAAG,KAAA,CAAM,KAAK,CAAA;AAC/B,MAAA,MAAM,EAAA,GAAK,MAAA,CAAO,EAAA,CAAG,GAAA,CAAK,KAAK,CAAA;AAC/B,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAKA,EAAC,CAAA;AAC5B,MAAA,YAAA,CAAa,IAAA,CAAK;AAAA,QAChB,KAAA,EAAO,EAAA;AAAA,QACP,CAAA,EAAAA,EAAAA;AAAA,QACA,CAAA;AAAA,QACA,CAAA,EAAG,KAAK,CAAA,GAAI,CAAA;AAAA,QACZ,CAAA,EAAG,KAAK,MAAA,GAAS,CAAA;AAAA,QACjB,MAAA,EAAQA,KAAI,CAAA,GAAI,CAAA;AAAA,QAChB,MAAA,EAAQ,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,SAAS,CAAA,GAAI,CAAA;AAAA,QACnC,WAAA,EAAa;AAAA,OACd,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,CAAA,GAAI,MAAA,CAAO,EAAA,CAAG,KAAA,CAAM,KAAK,CAAA;AAC/B,IAAA,MAAM,MAAA,GAAS,kBAAA,CAAmB,EAAA,CAAG,KAAA,EAAO,GAAG,IAAI,CAAA;AACnD,IAAA,IAAI,SAAS,UAAA,GAAa,EAAA;AAC1B,IAAA,IAAI,IAAA,GAAO,CAAA;AACX,IAAA,OAAO,OAAO,CAAA,EAAG;AACf,MAAA,MAAM,GAAA,GAAM,EAAE,EAAA,EAAI,CAAA,GAAI,MAAA,GAAS,CAAA,EAAG,EAAA,EAAI,CAAA,GAAI,MAAA,GAAS,CAAA,EAAG,CAAA,EAAG,MAAA,EAAO;AAChE,MAAA,MAAM,UAAU,QAAA,CAAS,IAAA,CAAK,OAAK,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,GAAI,EAAA,IAAM,EAAE,EAAA,GAAK,GAAA,CAAI,MAAM,CAAA,CAAE,EAAA,GAAK,IAAI,EAAE,CAAA;AAC/F,MAAA,IAAI,CAAC,OAAA,EAAS;AAAE,QAAA,QAAA,CAAS,KAAK,GAAG,CAAA;AAAG,QAAA;AAAA,MAAO;AAC3C,MAAA,MAAA,IAAU,EAAA;AACV,MAAA,IAAA,EAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,IAAA,CAAK;AAAA,MACR,KAAA,EAAO,EAAA;AAAA,MACP,CAAA;AAAA,MACA,MAAA;AAAA,MACA,KAAA;AAAA,MACA,KAAA,EAAO,QAAA,CAAS,EAAA,CAAG,QAAQ;AAAA,KAC5B,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,aAAkC,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,CAAC,GAAG,GAAA,MAAS;AAAA,IAChE,GAAA,EAAK,CAAA;AAAA,IACL,CAAA,EAAG,MAAA,CAAO,CAAA,CAAE,KAAA,CAAM,KAAK,CAAA;AAAA,IACvB,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,MAAA,CAAO,CAAA,CAAE,GAAA,CAAI,KAAK,CAAA,GAAI,MAAA,CAAO,CAAA,CAAE,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,IAC9D,OAAA,EAAS,OAAA,CAAQ,KAAA,CAAM,GAAG;AAAA,GAC5B,CAAE,CAAA;AAEF,EAAA,MAAM,MAAA,GAA+B,UAAA,CAAW,GAAA,CAAI,CAAA,CAAA,MAAM,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,QAAA,CAAS,CAAC,CAAA,EAAE,CAAE,CAAA;AAE3F,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,YAAA;AAAA,IACP,MAAA;AAAA,IACA,KAAA,EAAO,OAAA;AAAA,IACP,KAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA,MAAA,EAAQ,YAAA;AAAA,IACR,IAAA,EAAM,UAAA;AAAA,IACN,OAAO,aAAA,CAAc,WAAA,EAAa,WAAW,IAAA,EAAM,MAAA,EAAQ,IAAI,KAAK,CAAA,CACjE,OAAO,CAAA,CAAA,KAAK,CAAA,CAAE,KAAK,KAAA,GAAQ,CAAA,IAAK,EAAE,CAAA,IAAK,KAAA,GAAQ,QAAQ,CAAC,CAAA;AAAA,IAC3D,KAAA;AAAA,IACA,OAAO,GAAA,CAAI,KAAA;AAAA,IACX,IAAA;AAAA,IACA,MAAA,EAAQ,YAAY,MAAA,GAAS;AAAA,GAC/B;AACF;AAIA,IAAM,eAAA,GAAkB,GAAA;AACxB,IAAM,eAAA,GAAkB,EAAA;AACxB,IAAM,kBAAA,GAAqB,EAAA;AAC3B,IAAM,mBAAA,GAAsB,EAAA;AAE5B,SAAS,eAAe,GAAA,EAAwC;AAC9D,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,MAAA,CAAO,KAAA,GAAQ,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,KAAA,CAAM,KAAA,GAAQ,CAAA,CAAE,MAAM,KAAK,CAAA;AAI9E,EAAA,MAAM,UAAU,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,MAAM,KAAK,CAAA;AAC7C,EAAA,MAAM,KAAA,GAAQ,OAAO,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,GAAA,EAAK,KAAA,IAAS,CAAA,CAAE,KAAA,CAAM,KAAK,CAAA;AAC3D,EAAA,MAAM,SAAS,OAAA,CAAQ,MAAA,GAAS,KAAK,GAAA,CAAI,GAAG,OAAO,CAAA,GAAI,CAAA;AACvD,EAAA,MAAM,OAAO,KAAA,CAAM,MAAA,GAAS,KAAK,GAAA,CAAI,GAAG,KAAK,CAAA,GAAI,CAAA;AACjD,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,OAAO,MAAM,CAAA;AACzC,EAAA,MAAM,UAAU,IAAA,GAAO,IAAA;AACvB,EAAA,MAAM,cAAc,MAAA,GAAS,OAAA;AAC7B,EAAA,MAAM,YAAY,IAAA,GAAO,OAAA;AAEzB,EAAA,MAAM,QAAQ,kBAAA,GAAqB,EAAA;AACnC,EAAA,MAAM,SAAA,GAAY,eAAe,SAAA,GAAY,EAAA;AAC7C,EAAA,MAAM,QAAQ,SAAA,GAAY,KAAA;AAG1B,EAAA,MAAM,YAAY,eAAA,GAAkB,CAAA;AACpC,EAAA,MAAM,YAAY,SAAA,GAAY,CAAA;AAC9B,EAAA,MAAM,YAAY,KAAA,GAAQ,SAAA;AAC1B,EAAA,MAAM,UAAU,SAAA,GAAY,SAAA;AAC5B,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,UAAU,SAAS,CAAA;AAE7C,EAAA,MAAM,QAAA,GAAW,WAAW,GAAA,CAAI,KAAA,EAAO,QAAQ,WAAA,EAAa,SAAA,EAAW,WAAW,KAAK,CAAA;AACvF,EAAA,MAAM,MAAA,GAAS,CAAC,CAAA,KAAc,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,SAAA,EAAW,QAAA,CAAS,CAAC,CAAC,CAAC,CAAA;AAE9E,EAAA,MAAM,OAAA,GAAU,WAAA,CAAY,GAAA,CAAI,IAAI,CAAA;AACpC,EAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,IAAA,IAAQ,eAAA,GAAkB,CAAA,CAAA;AAEvD,EAAA,MAAM,WAAA,GAAc,GAAA,CAAI,KAAA,GAAQ,EAAA,GAAK,CAAA;AAErC,EAAA,MAAM,KAAA,GAAQ,eAAe,WAAA,GAAc,YAAA;AAG3C,EAAA,MAAM,QAA8B,EAAC;AACrC,EAAA,IAAI,GAAA,GAAoB,OAAA;AACxB,EAAA,MAAM,OAAA,GAAU,wBAAA;AAGhB,EAAA,MAAM,YAAsB,EAAC;AAC7B,EAAA,MAAM,YAAsB,EAAC;AAE7B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,IAAA,MAAM,EAAA,GAAK,OAAO,CAAC,CAAA;AACnB,IAAA,IAAI,EAAA,CAAG,SAAS,OAAA,EAAS;AACzB,IAAA,MAAM,IAAA,GAAqB,GAAG,IAAA,IAAQ,GAAA;AACtC,IAAA,IAAI,CAAC,EAAA,CAAG,IAAA,EAAM,GAAA,GAAM,GAAA,KAAQ,UAAU,OAAA,GAAU,OAAA;AAEhD,IAAA,MAAM,CAAA,GAAI,MAAA,CAAO,EAAA,CAAG,KAAA,CAAM,KAAK,CAAA;AAC/B,IAAA,MAAM,KAAA,GAAQ,IAAI,eAAA,GAAkB,CAAA;AACpC,IAAA,MAAM,YAAY,KAAA,GAAQ,eAAA;AAC1B,IAAA,MAAM,IAAA,GAAO,IAAA,KAAS,OAAA,GAAU,SAAA,GAAY,SAAA;AAK5C,IAAA,IAAI,GAAA,GAAM,CAAA;AACV,IAAA,OAAO,GAAA,GAAM,IAAA,CAAK,MAAA,EAAQ,GAAA,EAAA,EAAO;AAC/B,MAAA,IAAI,IAAA,CAAK,GAAG,CAAA,IAAM,KAAA,GAAQ,CAAA,EAAG;AAAE,QAAA,IAAA,CAAK,GAAG,CAAA,GAAI,SAAA;AAAW,QAAA;AAAA,MAAO;AAAA,IAC/D;AACA,IAAA,IAAI,GAAA,KAAQ,KAAK,MAAA,EAAQ;AAAE,MAAA,IAAA,CAAK,KAAK,SAAS,CAAA;AAAA,IAAG;AAEjD,IAAA,MAAM,OAAA,GAAU,qBAAqB,GAAA,GAAM,mBAAA;AAE3C,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,KAAA,EAAO,EAAA;AAAA,MACP,CAAA;AAAA,MACA,KAAA,EAAO,CAAA;AAAA;AAAA,MACP,IAAA;AAAA,MACA,KAAA;AAAA,MACA,KAAA,EAAO,CAAA;AAAA,MACP,KAAA,EAAO,eAAA;AAAA,MACP,KAAA,EAAO,eAAA;AAAA,MACP,MAAA,EAAQ,CAAA;AAAA,MACR,MAAA,EAAQ,CAAA;AAAA,MACR,OAAO,EAAA,CAAG,KAAA,IAAS,OAAA,CAAQ,CAAA,GAAI,QAAQ,MAAM,CAAA;AAAA,MAC7C,KAAA,EAAO;AAAA,KACR,CAAA;AAED,IAAC,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,EAAsC,QAAA,GAAW,OAAA;AAAA,EAC1E;AAEA,EAAA,MAAM,gBAAgB,SAAA,CAAU,MAAA;AAChC,EAAA,MAAM,gBAAgB,SAAA,CAAU,MAAA;AAChC,EAAA,MAAM,SAAA,GAAY,kBAAkB,kBAAA,GAAqB,IAAA,CAAK,IAAI,CAAA,EAAG,aAAA,GAAgB,CAAC,CAAA,GAAI,mBAAA;AAC1F,EAAA,MAAM,SAAA,GAAY,QAAQ,SAAA,GAAY,EAAA;AACtC,EAAA,MAAM,YAAA,GAAe,kBAAkB,kBAAA,GAAqB,IAAA,CAAK,IAAI,CAAA,EAAG,aAAA,GAAgB,CAAC,CAAA,GAAI,mBAAA;AAC7F,EAAA,MAAM,MAAA,GAAS,YAAY,YAAA,GAAe,EAAA;AAG1C,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,MAAM,OAAA,GAAW,EAAsC,QAAA,IAAY,kBAAA;AACnE,IAAA,CAAA,CAAE,KAAA,GAAQ,SAAA;AACV,IAAA,IAAI,CAAA,CAAE,SAAS,OAAA,EAAS;AACtB,MAAA,CAAA,CAAE,SAAS,SAAA,GAAY,CAAA;AACvB,MAAA,CAAA,CAAE,SAAS,SAAA,GAAY,OAAA;AACvB,MAAA,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,MAAA,GAAS,CAAA,CAAE,KAAA;AAAA,IACzB,CAAA,MAAO;AACL,MAAA,CAAA,CAAE,SAAS,SAAA,GAAY,CAAA;AACvB,MAAA,CAAA,CAAE,SAAS,SAAA,GAAY,OAAA;AACvB,MAAA,CAAA,CAAE,QAAQ,CAAA,CAAE,MAAA;AAAA,IACd;AACA,IAAA,OAAQ,CAAA,CAAuC,QAAA;AAAA,EACjD;AAGA,EAAA,MAAM,eAAsC,EAAC;AAC7C,EAAA,KAAA,MAAW,MAAM,MAAA,EAAQ;AACvB,IAAA,IAAI,EAAA,CAAG,SAAS,OAAA,EAAS;AACzB,IAAA,MAAM,CAAA,GAAI,MAAA,CAAO,EAAA,CAAG,KAAA,CAAM,KAAK,CAAA;AAC/B,IAAA,MAAM,EAAA,GAAK,MAAA,CAAO,EAAA,CAAG,GAAA,CAAK,KAAK,CAAA;AAC/B,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,CAAC,CAAA;AAC5B,IAAA,YAAA,CAAa,IAAA,CAAK;AAAA,MAChB,KAAA,EAAO,EAAA;AAAA,MACP,CAAA;AAAA,MACA,CAAA;AAAA,MACA,GAAG,SAAA,GAAY,CAAA;AAAA,MACf,CAAA,EAAG,EAAA;AAAA,MACH,MAAA,EAAQ,IAAI,CAAA,GAAI,CAAA;AAAA,MAChB,QAAQ,SAAA,GAAY,EAAA;AAAA,MACpB,WAAA,EAAa;AAAA,KACd,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,aAAkC,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,CAAC,GAAG,GAAA,MAAS;AAAA,IAChE,GAAA,EAAK,CAAA;AAAA,IACL,CAAA,EAAG,MAAA,CAAO,CAAA,CAAE,KAAA,CAAM,KAAK,CAAA;AAAA,IACvB,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,MAAA,CAAO,CAAA,CAAE,GAAA,CAAI,KAAK,CAAA,GAAI,MAAA,CAAO,CAAA,CAAE,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,IAC9D,OAAA,EAAS,OAAA,CAAQ,KAAA,CAAM,GAAG;AAAA,GAC5B,CAAE,CAAA;AAIF,EAAA,MAAM,gBAAA,uBAAuB,GAAA,EAAoB;AACjD,EAAA,MAAM,iBAAA,uBAAwB,GAAA,EAAoB;AAClD,EAAA,UAAA,CAAW,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM;AAC3B,IAAA,MAAM,IAAA,GAAO,gBAAA,CAAiB,GAAA,CAAI,CAAA,CAAE,OAAO,CAAA;AAC3C,IAAA,IAAI,IAAA,KAAS,MAAA,IAAa,CAAA,CAAE,CAAA,GAAI,UAAA,CAAW,IAAI,CAAA,CAAG,CAAA,EAAG,gBAAA,CAAiB,GAAA,CAAI,CAAA,CAAE,OAAA,EAAS,CAAC,CAAA;AACtF,IAAA,MAAM,IAAA,GAAO,iBAAA,CAAkB,GAAA,CAAI,CAAA,CAAE,OAAO,CAAA;AAC5C,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,KAAA;AACtB,IAAA,IAAI,IAAA,KAAS,MAAA,IAAa,KAAA,GAAQ,UAAA,CAAW,IAAI,EAAG,CAAA,GAAI,UAAA,CAAW,IAAI,CAAA,CAAG,KAAA,EAAO;AAC/E,MAAA,iBAAA,CAAkB,GAAA,CAAI,CAAA,CAAE,OAAA,EAAS,CAAC,CAAA;AAAA,IACpC;AAAA,EACF,CAAC,CAAA;AACD,EAAA,KAAA,MAAW,GAAG,CAAC,CAAA,IAAK,gBAAA,EAAkB;AACpC,IAAA,MAAM,CAAA,GAAI,WAAW,CAAC,CAAA;AACtB,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,KAAA;AACtB,IAAA,CAAA,CAAE,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,GAAG,KAAK,CAAA;AACzB,IAAA,CAAA,CAAE,KAAA,GAAQ,QAAQ,CAAA,CAAE,CAAA;AAAA,EACtB;AACA,EAAA,KAAA,MAAW,GAAG,CAAC,CAAA,IAAK,iBAAA,EAAmB;AACrC,IAAA,MAAM,CAAA,GAAI,WAAW,CAAC,CAAA;AACtB,IAAA,CAAA,CAAE,QAAQ,IAAA,CAAK,GAAA,CAAI,EAAE,KAAA,EAAO,SAAA,GAAY,EAAE,CAAC,CAAA;AAAA,EAC7C;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,YAAA;AAAA,IACP,MAAA;AAAA,IACA,KAAA,EAAO,UAAA;AAAA,IACP,KAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA,EAAO,SAAS,KAAA,GAAQ,EAAA;AAAA,IACxB,OAAO,EAAC;AAAA,IACR,MAAA,EAAQ,YAAA;AAAA,IACR,IAAA,EAAM,UAAA;AAAA,IACN,OAAO,aAAA,CAAc,WAAA,EAAa,WAAW,IAAA,EAAM,MAAA,EAAQ,IAAI,KAAK,CAAA,CACjE,OAAO,CAAA,CAAA,KAAK,CAAA,CAAE,KAAK,KAAA,GAAQ,CAAA,IAAK,EAAE,CAAA,IAAK,KAAA,GAAQ,QAAQ,CAAC,CAAA;AAAA,IAC3D,KAAA,EAAO,SAAA;AAAA,IACP,OAAO,GAAA,CAAI,KAAA;AAAA,IACX;AAAA,GACF;AACF;;;ACloBA,IAAMC,gBAAAA,GAAkB,EAAA;AACxB,IAAM,WAAA,GAAc,CAAA;AAEb,SAAS,cAAA,CAAe,KAAa,MAAA,EAA+B;AACzE,EAAA,MAAM,GAAA,GAAM,cAAc,GAAG,CAAA;AAC7B,EAAA,MAAM,MAAA,GAAS,eAAe,GAAG,CAAA;AACjC,EAAA,MAAM,KAAA,GAAQC,sCAAA,CAAqB,MAAA,EAAQ,KAAA,IAAS,SAAS,CAAA;AAE7D,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,KAAA,EAAO,MAAA,EAAQ,UAAU,CAAA;AAE1D,EAAA,MAAM,QAAA,GAAqB;AAAA,IACzBtB,wBAAQ,GAAA,CAAI,KAAA,GAAQ,mBAAc,GAAA,CAAI,KAAK,KAAK,UAAU,CAAA;AAAA,IAC1Da,uBAAO,4BAA4B,CAAA;AAAA,IACnCU,sBAAA,CAAK,CAAC,CAAA,OAAA,EAAU,UAAU,UAAU,CAAC;AAAA,GACvC;AAEA,EAAA,IAAI,IAAI,KAAA,EAAO;AACb,IAAA,QAAA,CAAS,IAAA;AAAA,MACPxB,sBAAA;AAAA,QACE,EAAE,CAAA,EAAG,MAAA,CAAO,KAAA,GAAQ,CAAA,EAAG,GAAG,EAAA,EAAI,aAAA,EAAe,QAAA,EAAU,KAAA,EAAO,UAAA,EAAW;AAAA,QACzE,GAAA,CAAI;AAAA;AACN,KACF;AAAA,EACF;AAEA,EAAA,QAAA,CAAS,IAAA,CAAK,UAAA,CAAW,MAAA,EAAQ,KAAK,CAAC,CAAA;AAEvC,EAAA,QAAQ,OAAO,KAAA;AAAO,IACpB,KAAK,OAAA;AACH,MAAA,QAAA,CAAS,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,KAAK,CAAC,CAAA;AACxC,MAAA;AAAA,IACF,KAAK,UAAA;AACH,MAAA,QAAA,CAAS,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,KAAK,CAAC,CAAA;AAC3C,MAAA;AAAA,IACF,KAAK,UAAA;AAAA,IACL;AACE,MAAA,QAAA,CAAS,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,KAAK,CAAC,CAAA;AAC3C,MAAA;AAAA;AAGJ,EAAA,QAAA,CAAS,IAAA,CAAK,UAAA,CAAW,MAAM,CAAC,CAAA;AAEhC,EAAA,OAAOgB,yBAAA;AAAA,IACL;AAAA,MACE,SAAS,CAAA,IAAA,EAAO,MAAA,CAAO,KAAK,CAAA,CAAA,EAAI,OAAO,MAAM,CAAA,CAAA;AAAA,MAC7C,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,KAAA,EAAO,CAAA,wBAAA,EAA2B,MAAA,CAAO,KAAK,CAAA,CAAA;AAAA,MAC9C,mBAAA,EAAqB,UAAA;AAAA,MACrB,cAAc,MAAA,CAAO,KAAA;AAAA,MACrB,IAAA,EAAM;AAAA,KACR;AAAA,IACA;AAAA,GACF;AACF;AAIA,SAAS,aAAA,CAAc,OAAc,UAAA,EAA6B;AAChE,EAAA,MAAM,OAAO,UAAA,IAAc,sCAAA;AAC3B,EAAA,OAAO;AAAA,mBAAA,EACYS,qCAAA,CAAoB,KAAK,CAAC;AAAA,iBAAA,EAC5B,MAAM,IAAI,CAAA;AAAA,uBAAA,EACJ,MAAM,SAAS,CAAA;AAAA,sBAAA,EAChB,MAAM,QAAQ,CAAA;AAAA,wBAAA,EACZ,MAAM,UAAU,CAAA;AAAA,wBAAA,EAChB,MAAM,UAAU,CAAA;AAAA,wBAAA,EAChB,MAAM,UAAU,CAAA;AAAA,2BAAA,EACb,MAAM,aAAa,CAAA;AAAA,sBAAA,EACxB,MAAM,QAAQ,CAAA;AAAA,oBAAA,EAChB,MAAM,MAAM,CAAA;AAAA,wBAAA,EACR,MAAM,UAAU,CAAA;AAAA,sBAAA,EAClB,MAAM,QAAQ,CAAA;AAAA,sBAAA,EACd,MAAM,QAAQ,CAAA;AAAA,0BAAA,EACV,MAAM,YAAY,CAAA;AAAA,mBAAA,EACzB,IAAI,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAAA,EAKK,MAAM,UAAU,CAAA;AAAA,6BAAA,EACf,MAAM,cAAc,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4DAAA,EASW,MAAM,iBAAiB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAsBrF;AAIA,SAAS,UAAA,CAAW,QAA8B,KAAA,EAAsB;AACtE,EAAA,IAAI,CAAC,MAAA,CAAO,IAAA,CAAK,MAAA,EAAQ,OAAO,EAAA;AAChC,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,KAAA,GAAQ,EAAA,GAAK,EAAA;AACpC,EAAA,MAAM,UAAU,KAAA,CAAM,OAAA;AAGtB,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAAoB;AAC9C,EAAA,MAAM,cAAA,uBAAqB,GAAA,EAAoB;AAC/C,EAAA,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM;AAC5B,IAAA,MAAM,CAAA,GAAI,aAAA,CAAc,GAAA,CAAI,CAAA,CAAE,OAAO,CAAA;AACrC,IAAA,IAAI,CAAA,KAAM,MAAA,IAAa,CAAA,CAAE,CAAA,GAAI,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,CAAG,CAAA,EAAG,aAAA,CAAc,GAAA,CAAI,CAAA,CAAE,SAAS,CAAC,CAAA;AAC9E,IAAA,MAAM,CAAA,GAAI,cAAA,CAAe,GAAA,CAAI,CAAA,CAAE,OAAO,CAAA;AACtC,IAAA,IAAI,CAAA,KAAM,UAAa,CAAA,CAAE,CAAA,GAAI,EAAE,KAAA,GAAQ,MAAA,CAAO,KAAK,CAAC,CAAA,CAAG,IAAI,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,CAAG,KAAA,iBAAsB,GAAA,CAAI,CAAA,CAAE,SAAS,CAAC,CAAA;AAAA,EACnH,CAAC,CAAA;AACD,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,KAAA,GAAQ,MAAA,CAAO,KAAA;AAEtC,EAAA,MAAM,QAAQ,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAG,CAAA,KAAM;AACtC,IAAA,MAAM,CAAA,GAAI,OAAA,GAAU,CAAA,CAAE,OAAA,IAAWH,gBAAAA,GAAkB,WAAA,CAAA;AACnD,IAAA,MAAM,OAAO,CAAA,CAAE,GAAA,CAAI,SAAS,OAAA,CAAQ,CAAA,GAAI,QAAQ,MAAM,CAAA;AACtD,IAAA,MAAM,MAAA,GAAS,EAAE,CAAA,GAAI,CAAA;AAIrB,IAAA,MAAM,UAAA,GAAa,aAAA,CAAc,GAAA,CAAI,CAAA,CAAE,OAAO,CAAA,KAAM,CAAA;AACpD,IAAA,MAAM,WAAA,GAAc,cAAA,CAAe,GAAA,CAAI,CAAA,CAAE,OAAO,CAAA,KAAM,CAAA;AACtD,IAAA,MAAM,MAAA,GAAS,aAAa,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,EAAG,MAAA,CAAO,KAAK,CAAA,GAAI,CAAA,CAAE,CAAA;AAC5D,IAAA,MAAM,QAAA,GAAW,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,KAAA,EAAO,OAAO,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,KAAA;AAC1E,IAAA,OAAO;AAAA,MACLd,sBAAA,CAAK;AAAA,QACH,GAAG,CAAA,CAAE,CAAA;AAAA,QACL,CAAA;AAAA,QACA,OAAO,CAAA,CAAE,KAAA;AAAA,QACT,MAAA,EAAQc,gBAAAA;AAAA,QACR,IAAA;AAAA,QACA,KAAA,EAAO,aAAA;AAAA,QACP,aAAA,EAAe,EAAE,GAAA,CAAI;AAAA,OACtB,CAAA;AAAA,MACDd,sBAAA,CAAK;AAAA,QACH,CAAA,EAAG,MAAA;AAAA,QACH,GAAG,MAAA,CAAO,KAAA;AAAA,QACV,OAAO,QAAA,GAAW,MAAA;AAAA,QAClB,QAAQ,MAAA,CAAO,KAAA;AAAA,QACf,IAAA;AAAA,QACA,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,MACDR,sBAAA;AAAA,QACE,EAAE,CAAA,EAAG,MAAA,EAAQ,GAAG,CAAA,GAAI,EAAA,EAAI,OAAO,cAAA,EAAe;AAAA,QAC9C,QAAA,CAAS,CAAA,CAAE,GAAA,CAAI,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,KAAA,GAAQ,CAAC,CAAC,CAAC;AAAA;AAC5D,KACF,CAAE,KAAK,EAAE,CAAA;AAAA,EACX,CAAC,CAAA;AACD,EAAA,OAAOY,uBAAA,CAAM,EAAE,KAAA,EAAO,SAAA,IAAa,KAAK,CAAA;AAC1C;AAEA,SAAS,WAAW,MAAA,EAAsC;AACxD,EAAA,MAAM,KAAK,MAAA,CAAO,KAAA;AAClB,EAAA,MAAM,KAAA,GAAkB;AAAA,IACtBb,uBAAK,EAAE,EAAA,EAAI,MAAA,CAAO,KAAA,EAAO,IAAI,EAAA,EAAI,EAAA,EAAI,MAAA,CAAO,KAAA,GAAQ,OAAO,KAAA,EAAO,EAAA,EAAI,EAAA,EAAI,KAAA,EAAO,gBAAgB;AAAA,GACnG;AACA,EAAA,KAAA,MAAW,CAAA,IAAK,OAAO,KAAA,EAAO;AAC5B,IAAA,KAAA,CAAM,KAAKA,sBAAA,CAAK,EAAE,EAAA,EAAI,CAAA,CAAE,GAAG,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,CAAA,CAAE,GAAG,EAAA,EAAI,EAAA,GAAK,GAAG,KAAA,EAAO,cAAA,EAAgB,CAAC,CAAA;AAChF,IAAA,KAAA,CAAM,KAAKC,sBAAA,CAAO,EAAE,CAAA,EAAG,CAAA,CAAE,GAAG,CAAA,EAAG,EAAA,GAAK,EAAA,EAAI,aAAA,EAAe,UAAU,KAAA,EAAO,eAAA,EAAgB,EAAG,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,EACrG;AACA,EAAA,OAAOY,uBAAA,CAAM,EAAE,KAAA,EAAO,SAAA,IAAa,KAAK,CAAA;AAC1C;AAIA,SAAS,cAAA,CAAe,QAA8B,KAAA,EAAsB;AAC1E,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,CAAM,IAAA,CAAK,iBAAA,CAAkB,MAAM,CAAC,CAAA;AACpC,EAAA,KAAA,CAAM,IAAA,CAAK,iBAAA,CAAkB,MAAM,CAAC,CAAA;AACpC,EAAA,KAAA,CAAM,IAAA,CAAK,oBAAA,CAAqB,MAAA,EAAQ,KAAK,CAAC,CAAA;AAC9C,EAAA,KAAA,CAAM,IAAA,CAAK,oBAAA,CAAqB,MAAA,EAAQ,KAAK,CAAC,CAAA;AAC9C,EAAA,KAAA,CAAM,IAAA,CAAK,YAAA,CAAa,MAAM,CAAC,CAAA;AAC/B,EAAA,KAAA,CAAM,IAAA,CAAK,WAAA,CAAY,MAAM,CAAC,CAAA;AAC9B,EAAA,OAAO,KAAA,CAAM,KAAK,EAAE,CAAA;AACtB;AAEA,SAAS,kBAAkB,MAAA,EAAsC;AAC/D,EAAA,MAAM,KAAA,GAAQ,OAAO,KAAA,CAClB,MAAA,CAAO,OAAK,CAAA,CAAE,KAAK,CAAA,CACnB,GAAA,CAAI,CAAA,CAAA,KAAKZ,sBAAA;AAAA,IACR,EAAE,CAAA,EAAG,MAAA,CAAO,KAAA,GAAQ,IAAI,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,SAAS,CAAA,GAAI,CAAA,EAAG,aAAA,EAAe,KAAA,EAAO,OAAO,gBAAA,EAAiB;AAAA,IACjG,CAAA,CAAE;AAAA,GACH,CAAA;AACH,EAAA,OAAOY,uBAAA,CAAM,EAAE,KAAA,EAAO,iBAAA,IAAqB,KAAK,CAAA;AAClD;AAEA,SAAS,kBAAkB,MAAA,EAAsC;AAC/D,EAAA,MAAM,QAAQ,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,CAAC,GAAG,CAAA,KAAM;AACvC,IAAA,IAAI,CAAA,GAAI,CAAA,KAAM,CAAA,EAAG,OAAO,EAAA;AACxB,IAAA,OAAOJ,sBAAA,CAAK;AAAA,MACV,GAAG,MAAA,CAAO,KAAA;AAAA,MACV,GAAG,CAAA,CAAE,CAAA;AAAA,MACL,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,QAAQ,CAAA,CAAE,MAAA;AAAA,MACV,KAAA,EAAO;AAAA,KACR,CAAA;AAAA,EACH,CAAC,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA;AACjB,EAAA,OAAOI,uBAAA,CAAM,EAAE,KAAA,EAAO,UAAA,IAAc,KAAK,CAAA;AAC3C;AAEA,SAAS,oBAAA,CAAqB,QAA8B,KAAA,EAAsB;AAChF,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,MAAM,aAAa,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,OAAO,CAAA;AAClD,EAAA,MAAM,UAAU,KAAA,CAAM,eAAA;AACtB,EAAA,KAAA,MAAW,EAAA,IAAM,OAAO,MAAA,EAAQ;AAC9B,IAAA,IAAI,EAAA,CAAG,KAAA,CAAM,IAAA,KAAS,OAAA,EAAS;AAC/B,IAAA,MAAM,GAAA,GAAM,UAAA,CAAW,OAAA,CAAQ,EAAA,CAAG,MAAM,OAAQ,CAAA;AAChD,IAAA,MAAM,IAAA,GAAO,EAAA,CAAG,KAAA,CAAM,KAAA,IAAS,OAAA,CAAA,CAAS,MAAM,CAAA,GAAI,CAAA,GAAI,GAAA,IAAO,OAAA,CAAQ,MAAM,CAAA;AAC3E,IAAA,KAAA,CAAM,KAAKJ,sBAAA,CAAK;AAAA,MACd,GAAG,EAAA,CAAG,CAAA;AAAA,MACN,GAAG,EAAA,CAAG,CAAA;AAAA,MACN,KAAA,EAAO,GAAG,CAAA,IAAK,CAAA;AAAA,MACf,QAAQ,EAAA,CAAG,CAAA;AAAA,MACX,EAAA,EAAI,CAAA;AAAA,MACJ,EAAA,EAAI,CAAA;AAAA,MACJ,IAAA;AAAA,MACA,KAAA,EAAO,cAAA;AAAA,MACP,eAAA,EAAiB,GAAG,KAAA,CAAM;AAAA,KAC3B,CAAC,CAAA;AACF,IAAA,MAAM,CAAA,GAAI,GAAG,CAAA,IAAK,CAAA;AAClB,IAAA,IAAI,KAAK,EAAA,EAAI;AACX,MAAA,KAAA,CAAM,IAAA,CAAKR,sBAAA;AAAA,QACT,EAAE,CAAA,EAAG,EAAA,CAAG,MAAA,EAAQ,CAAA,EAAG,GAAG,MAAA,EAAQ,aAAA,EAAe,QAAA,EAAU,KAAA,EAAO,gBAAA,EAAiB;AAAA,QAC/E,QAAA,CAAS,GAAG,KAAA,CAAM,KAAA,EAAO,KAAK,KAAA,CAAM,CAAA,GAAI,CAAC,CAAC;AAAA,OAC3C,CAAA;AAAA,IACH,CAAA,MAAA,IAAW,IAAI,CAAA,EAAG;AAChB,MAAA,KAAA,CAAM,IAAA,CAAKA,sBAAA;AAAA,QACT,EAAE,CAAA,EAAG,EAAA,CAAG,CAAA,GAAI,CAAA,GAAI,CAAA,EAAG,CAAA,EAAG,EAAA,CAAG,MAAA,EAAQ,aAAA,EAAe,OAAA,EAAS,KAAA,EAAO,gBAAA,EAAiB;AAAA,QACjF,GAAG,KAAA,CAAM;AAAA,OACV,CAAA;AAAA,IACH;AAAA,EACF;AACA,EAAA,OAAOY,uBAAA,CAAM,EAAE,KAAA,EAAO,WAAA,IAAe,KAAK,CAAA;AAC5C;AAEA,SAAS,oBAAA,CAAqB,QAA8B,KAAA,EAAsB;AAChF,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,EAAA,IAAM,OAAO,MAAA,EAAQ;AAC9B,IAAA,IAAI,EAAA,CAAG,KAAA,CAAM,IAAA,KAAS,OAAA,EAAS;AAC/B,IAAA,MAAM,WAAA,GAAc,EAAA,CAAG,KAAA,CAAM,IAAA,KAAS,WAAA;AACtC,IAAA,MAAM,QAAQ,EAAA,CAAG,KAAA,CAAM,UAAU,WAAA,GAAc,KAAA,CAAM,gBAAgB,KAAA,CAAM,UAAA,CAAA;AAC3E,IAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,KAAA,CAAM,KAAA,KAAU,cAAc,MAAA,GAAS,QAAA,CAAA;AACxD,IAAA,KAAA,CAAM,KAAK,YAAA,CAAa,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,WAAW,CAAC,CAAA;AAAA,EACxD;AACA,EAAA,OAAOA,uBAAA,CAAM,EAAE,KAAA,EAAO,WAAA,IAAe,KAAK,CAAA;AAC5C;AAEA,SAAS,YAAA,CACP,EAAA,EACA,KAAA,EACA,KAAA,EACA,WAAA,EACQ;AACR,EAAA,MAAM,IAAI,EAAA,CAAG,CAAA;AACb,EAAA,MAAM,IAAI,EAAA,CAAG,CAAA;AACb,EAAA,MAAM,CAAA,GAAI,cAAc,CAAA,GAAI,CAAA;AAC5B,EAAA,MAAM,KAAA,GAAQ,cAAc,cAAA,GAAiB,cAAA;AAC7C,EAAA,QAAQ,KAAA;AAAO,IACb,KAAK,QAAA;AACH,MAAA,OAAOJ,sBAAA,CAAK,EAAE,CAAA,EAAG,CAAA,GAAI,GAAG,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,KAAA,EAAO,CAAA,GAAI,CAAA,EAAG,QAAQ,CAAA,GAAI,CAAA,EAAG,MAAM,KAAA,EAAO,KAAA,EAAO,OAAO,eAAA,EAAiB,EAAA,CAAG,KAAA,CAAM,EAAA,EAAI,CAAA;AAAA,IAC1H,KAAK,SAAA;AACH,MAAA,OAAOG,sBAAA,CAAK,EAAE,CAAA,EAAG,CAAA,EAAA,EAAK,CAAC,CAAA,CAAA,EAAI,CAAA,GAAI,CAAC,CAAA,GAAA,EAAM,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,CAAC,MAAM,CAAC,CAAA,CAAA,EAAI,CAAA,GAAI,CAAC,CAAA,GAAA,EAAM,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,EAAA,CAAA,EAAM,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,eAAA,EAAiB,EAAA,CAAG,KAAA,CAAM,IAAI,CAAA;AAAA,IACjJ,KAAK,MAAA;AACH,MAAA,OAAOA,sBAAA,CAAK,EAAE,CAAA,EAAG,QAAA,CAAS,GAAG,CAAA,EAAG,CAAA,GAAI,IAAI,CAAA,GAAI,CAAA,IAAK,KAAK,CAAC,CAAA,EAAG,MAAM,KAAA,EAAO,KAAA,EAAO,OAAO,eAAA,EAAiB,EAAA,CAAG,KAAA,CAAM,EAAA,EAAI,CAAA;AAAA,IACrH,KAAK,MAAA;AACH,MAAA,OAAOA,uBAAK,EAAE,CAAA,EAAG,CAAA,EAAA,EAAK,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,CAAA,GAAI,CAAC,CAAA,GAAA,EAAM,IAAI,CAAC,CAAA,CAAA,EAAI,IAAI,CAAA,GAAI,CAAC,MAAM,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,IAAI,CAAA,GAAI,CAAC,MAAM,CAAA,GAAI,CAAC,IAAI,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,IAAA,EAAM,OAAO,KAAA,EAAO,KAAA,EAAO,iBAAiB,EAAA,CAAG,KAAA,CAAM,IAAI,CAAA;AAAA,IAC3K,KAAK,QAAA;AAAA,IACL;AACE,MAAA,OAAOF,wBAAA,CAAO,EAAE,EAAA,EAAI,CAAA,EAAG,IAAI,CAAA,EAAG,CAAA,EAAG,IAAA,EAAM,KAAA,EAAO,OAAO,KAAA,EAAO,eAAA,EAAiB,EAAA,CAAG,KAAA,CAAM,IAAI,CAAA;AAAA;AAEhG;AAEA,SAAS,aAAa,MAAA,EAAsC;AAC1D,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,EAAA,IAAM,OAAO,MAAA,EAAQ;AAC9B,IAAA,IAAI,EAAA,CAAG,KAAA,CAAM,IAAA,KAAS,OAAA,EAAS;AAC/B,IAAA,MAAM,GAAA,GAAM,EAAA,CAAG,KAAA,CAAM,IAAA,KAAS,cAAc,oBAAA,GAAuB,gBAAA;AACnE,IAAA,MAAMT,KAAAA,GAAO,EAAA,CAAG,KAAA,CAAM,IAAA,GAClB,GAAG,EAAA,CAAG,KAAA,CAAM,IAAI,CAAA,CAAA,EAAI,EAAA,CAAG,KAAA,CAAM,KAAK,CAAA,CAAA,GAClC,GAAG,KAAA,CAAM,KAAA;AAEb,IAAA,MAAM,EAAA,GAAK,EAAA,CAAG,MAAA,GAAS,EAAA,CAAG,CAAA;AAC1B,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,GAAI,EAAA,EAAI;AACrB,MAAA,MAAM,KAAK,EAAA,GAAK,CAAA,GAAI,GAAG,CAAA,GAAI,CAAA,GAAI,GAAG,CAAA,GAAI,CAAA;AACtC,MAAA,MAAM,KAAK,EAAA,GAAK,CAAA,GAAI,GAAG,MAAA,GAAS,CAAA,GAAI,GAAG,MAAA,GAAS,EAAA;AAChD,MAAA,KAAA,CAAM,IAAA,CAAKD,sBAAA,CAAK,EAAE,EAAA,EAAI,GAAG,CAAA,EAAG,EAAA,EAAI,EAAA,EAAI,EAAA,CAAG,CAAA,EAAG,EAAA,EAAI,KAAA,EAAO,iBAAA,EAAmB,CAAC,CAAA;AAAA,IAC3E;AACA,IAAA,KAAA,CAAM,IAAA,CAAKC,sBAAA;AAAA,MACT,EAAE,CAAA,EAAG,EAAA,CAAG,MAAA,EAAQ,CAAA,EAAG,EAAA,CAAG,MAAA,EAAQ,aAAA,EAAe,EAAA,CAAG,WAAA,EAAa,KAAA,EAAO,GAAA,EAAI;AAAA,MACxEA;AAAA,KACD,CAAA;AAAA,EACH;AACA,EAAA,OAAOY,uBAAA,CAAM,EAAE,KAAA,EAAO,WAAA,IAAe,KAAK,CAAA;AAC5C;AAEA,SAAS,YAAY,MAAA,EAAsC;AACzD,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,EAAA,IAAM,OAAO,MAAA,EAAQ;AAC9B,IAAA,IAAI,CAAC,EAAA,CAAG,KAAA,CAAM,IAAA,EAAM;AACpB,IAAA,MAAM,IAAI,EAAA,CAAG,CAAA;AACb,IAAA,MAAM,EAAA,GAAM,EAAA,CAAG,KAAA,IAAS,EAAA,CAAG,CAAA,GAAI,EAAA;AAC/B,IAAA,MAAM,EAAA,GAAM,EAAA,CAAG,KAAA,IAAS,CAAA,GAAI,EAAA;AAC5B,IAAA,MAAM,OAAA,GAAUc,SAAAA,CAAS,EAAA,CAAG,KAAA,CAAM,MAAM,EAAE,CAAA;AAC1C,IAAA,KAAA,CAAM,IAAA,CAAKf,sBAAA,CAAK,EAAE,CAAA,EAAG,CAAA,EAAA,EAAK,CAAC,CAAA,CAAA,EAAI,EAAA,CAAG,CAAA,GAAI,CAAC,CAAA,GAAA,EAAM,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,EAAA,GAAK,CAAC,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,KAAA,EAAO,iBAAA,EAAmB,CAAC,CAAA;AACvG,IAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,EAAA,EAAI,CAAA,KAAM;AACzB,MAAA,KAAA,CAAM,IAAA,CAAKX,sBAAA;AAAA,QACT,EAAE,GAAG,EAAA,EAAI,CAAA,EAAG,KAAK,CAAA,GAAI,EAAA,EAAI,OAAO,iBAAA,EAAkB;AAAA,QAClD;AAAA,OACD,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH;AACA,EAAA,OAAOY,uBAAA,CAAM,EAAE,KAAA,EAAO,UAAA,IAAc,KAAK,CAAA;AAC3C;AAIA,SAAS,WAAA,CAAY,QAA8B,KAAA,EAAsB;AACvE,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,KAAA,CAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,CAAC,CAAA;AAEnC,EAAA,KAAA,CAAM,IAAA,CAAK,eAAA,CAAgB,MAAA,EAAQ,KAAK,CAAC,CAAA;AAEzC,EAAA,KAAA,CAAM,IAAA,CAAK,eAAA,CAAgB,MAAM,CAAC,CAAA;AAElC,EAAA,IAAI,MAAA,CAAO,MAAA,IAAU,MAAA,CAAO,MAAA,CAAO,MAAA,EAAQ;AACzC,IAAA,KAAA,CAAM,IAAA,CAAK,YAAA,CAAa,MAAM,CAAC,CAAA;AAAA,EACjC;AACA,EAAA,OAAO,KAAA,CAAM,KAAK,EAAE,CAAA;AACtB;AAEA,SAAS,iBAAiB,MAAA,EAAsC;AAC9D,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM;AAC7B,IAAA,IAAI,CAAA,GAAI,MAAM,CAAA,EAAG;AACf,MAAA,KAAA,CAAM,KAAKJ,sBAAA,CAAK;AAAA,QACd,GAAG,MAAA,CAAO,KAAA;AAAA,QACV,GAAG,CAAA,CAAE,CAAA;AAAA,QACL,OAAO,MAAA,CAAO,KAAA;AAAA,QACd,QAAQ,CAAA,CAAE,MAAA;AAAA,QACV,KAAA,EAAO;AAAA,OACR,CAAC,CAAA;AAAA,IACJ;AACA,IAAA,KAAA,CAAM,KAAKR,sBAAA,CAAO;AAAA,MAChB,CAAA,EAAG,OAAO,KAAA,GAAQ,EAAA;AAAA,MAClB,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,SAAS,CAAA,GAAI,CAAA;AAAA,MACxB,aAAA,EAAe,KAAA;AAAA,MACf,KAAA,EAAO;AAAA,KACT,EAAG,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,EACb,CAAC,CAAA;AACD,EAAA,OAAOY,uBAAA,CAAM,EAAE,KAAA,EAAO,gBAAA,IAAoB,KAAK,CAAA;AACjD;AAEA,SAAS,eAAA,CAAgB,QAA8B,KAAA,EAAsB;AAC3E,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,CAAA,CAAA,KAAK,CAAC,CAAA,CAAE,KAAA,EAAO,CAAC,CAAC,CAAC,CAAA;AAC7D,EAAA,MAAM,aAAA,GAAgB,IAAI,GAAA,CAAA,CAAK,MAAA,CAAO,UAAU,EAAC,EAAG,GAAA,CAAI,CAAA,CAAA,KAAK,CAAC,CAAA,CAAE,KAAA,EAAO,CAAA,CAAE,KAAK,CAAC,CAAC,CAAA;AAChF,EAAA,KAAA,MAAW,EAAA,IAAM,OAAO,MAAA,EAAQ;AAC9B,IAAA,IAAI,EAAA,CAAG,KAAA,CAAM,IAAA,KAAS,OAAA,EAAS;AAC/B,IAAA,MAAM,GAAA,GAAM,GAAG,KAAA,CAAM,QAAA,IAAY,OAAO,KAAA,CAAM,CAAC,GAAG,KAAA,IAAS,EAAA;AAC3D,IAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,KAAA,CAAM,KAAA,IAAS,aAAA,CAAc,IAAI,GAAG,CAAA,IAAK,KAAA,CAAM,eAAA,CAAgB,CAAC,CAAA;AACjF,IAAA,MAAM,CAAA,GAAI,GAAG,CAAA,IAAK,CAAA;AAClB,IAAA,KAAA,CAAM,KAAKJ,sBAAA,CAAK;AAAA,MACd,GAAG,EAAA,CAAG,CAAA;AAAA,MACN,GAAG,EAAA,CAAG,CAAA;AAAA,MACN,KAAA,EAAO,CAAA;AAAA,MACP,QAAQ,EAAA,CAAG,CAAA;AAAA,MACX,EAAA,EAAI,CAAA;AAAA,MACJ,EAAA,EAAI,CAAA;AAAA,MACJ,IAAA,EAAM,KAAA;AAAA,MACN,KAAA,EAAO,cAAA;AAAA,MACP,eAAA,EAAiB,GAAG,KAAA,CAAM,EAAA;AAAA,MAC1B,eAAA,EAAiB;AAAA,KAClB,CAAC,CAAA;AACF,IAAA,IAAI,KAAK,EAAA,EAAI;AACX,MAAA,KAAA,CAAM,IAAA,CAAKR,sBAAA;AAAA,QACT,EAAE,CAAA,EAAG,EAAA,CAAG,MAAA,EAAQ,CAAA,EAAG,GAAG,MAAA,EAAQ,aAAA,EAAe,QAAA,EAAU,KAAA,EAAO,gBAAA,EAAiB;AAAA,QAC/E,QAAA,CAAS,GAAG,KAAA,CAAM,KAAA,EAAO,KAAK,KAAA,CAAM,CAAA,GAAI,CAAC,CAAC;AAAA,OAC3C,CAAA;AAAA,IACH,CAAA,MAAA,IAAW,IAAI,CAAA,EAAG;AAChB,MAAA,MAAM,IAAA,GAAO,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA;AAC9B,MAAA,MAAM,EAAA,GAAK,OAAO,IAAA,CAAK,CAAA,GAAI,KAAK,MAAA,GAAS,CAAA,GAAI,IAAI,EAAA,CAAG,MAAA;AACpD,MAAA,KAAA,CAAM,IAAA,CAAKA,sBAAA;AAAA,QACT,EAAE,CAAA,EAAG,EAAA,CAAG,CAAA,GAAI,CAAA,GAAI,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,aAAA,EAAe,OAAA,EAAS,KAAA,EAAO,gBAAA,EAAiB;AAAA,QAC1E,GAAG,KAAA,CAAM;AAAA,OACV,CAAA;AAAA,IACH;AAAA,EACF;AACA,EAAA,OAAOY,uBAAA,CAAM,EAAE,KAAA,EAAO,eAAA,IAAmB,KAAK,CAAA;AAChD;AAEA,SAAS,gBAAgB,MAAA,EAAsC;AAC7D,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,IAAQ,EAAC;AAC7B,EAAA,IAAI,CAAC,IAAA,CAAK,MAAA,EAAQ,OAAO,EAAA;AACzB,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,IAAA,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,CAAC,CAAC,CAAA;AAAA,EACzB;AACA,EAAA,OAAOA,uBAAA,CAAM,EAAE,KAAA,EAAO,eAAA,IAAmB,KAAK,CAAA;AAChD;AAEA,SAAS,UAAU,CAAA,EAA8B;AAC/C,EAAA,MAAM,WAAA,GAAc,CAAA,CAAE,KAAA,CAAM,IAAA,KAAS,WAAA;AACrC,EAAA,MAAM,QAAQD,sBAAA,CAAK;AAAA,IACjB,CAAA,EAAG,CAAA,EAAA,EAAK,CAAA,CAAE,CAAC,IAAI,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA,GAAA,EAAM,CAAA,CAAE,CAAC,CAAA,CAAA,EAAI,CAAA,CAAE,QAAQ,CAAC,CAAA,CAAA;AAAA,IACnD,KAAA,EAAO;AAAA,GACR,CAAA;AACD,EAAA,MAAM,IAAA,GAAO,cACTA,sBAAA,CAAK;AAAA,IACH,CAAA,EAAG,SAAS,CAAA,CAAE,CAAA,EAAG,EAAE,KAAA,GAAQ,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAA,IACrC,MAAM,CAAA,CAAE,KAAA;AAAA,IACR,KAAA,EAAO,aAAA;AAAA,IACP,eAAA,EAAiB,EAAE,KAAA,CAAM;AAAA,GAC1B,IACDF,wBAAA,CAAO;AAAA,IACL,IAAI,CAAA,CAAE,CAAA;AAAA,IACN,EAAA,EAAI,EAAE,KAAA,GAAQ,CAAA;AAAA,IACd,CAAA,EAAG,CAAA;AAAA,IACH,MAAM,CAAA,CAAE,KAAA;AAAA,IACR,KAAA,EAAO,aAAA;AAAA,IACP,eAAA,EAAiB,EAAE,KAAA,CAAM;AAAA,GAC1B,CAAA;AACL,EAAA,MAAM,GAAA,GAAM,CAAA,CAAE,KAAA,CAAM,IAAA,GAAO,GAAG,CAAA,CAAE,KAAA,CAAM,IAAI,CAAA,CAAA,EAAI,CAAA,CAAE,KAAA,CAAM,KAAK,CAAA,CAAA,GAAK,EAAE,KAAA,CAAM,KAAA;AACxE,EAAA,MAAM,KAAA,GAAQT,sBAAA;AAAA,IACZ,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,EAAE,MAAA,EAAQ,aAAA,EAAe,QAAA,EAAU,KAAA,EAAO,cAAA,EAAe;AAAA,IACtE;AAAA,GACF;AACA,EAAA,OAAO,QAAQ,IAAA,GAAO,KAAA;AACxB;AAEA,SAAS,aAAa,MAAA,EAAsC;AAC1D,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,IAAU,EAAC;AACjC,EAAA,IAAI,CAAC,MAAA,CAAO,MAAA,EAAQ,OAAO,EAAA;AAC3B,EAAA,MAAM,IAAA,GAAO,GAAA;AACb,EAAA,MAAM,OAAA,GAAU,EAAA;AAChB,EAAA,MAAM,IAAA,GAAO,EAAA;AACb,EAAA,MAAM,CAAA,GAAI,OAAA,GAAU,CAAA,GAAI,EAAA,GAAK,OAAO,MAAA,GAAS,IAAA;AAC7C,EAAA,MAAM,CAAA,GAAI,MAAA,CAAO,KAAA,GAAQ,IAAA,GAAO,EAAA;AAChC,EAAA,MAAM,IAAI,MAAA,CAAO,KAAA;AACjB,EAAA,MAAM,KAAA,GAAkB;AAAA,IACtBQ,sBAAA,CAAK,EAAE,CAAA,EAAG,CAAA,EAAG,OAAO,IAAA,EAAM,MAAA,EAAQ,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,KAAA,EAAO,iBAAiB,CAAA;AAAA,IAC3ER,sBAAA,CAAO,EAAE,CAAA,EAAG,CAAA,GAAI,OAAA,EAAS,CAAA,EAAG,CAAA,GAAI,OAAA,GAAU,EAAA,EAAI,KAAA,EAAO,iBAAA,EAAkB,EAAG,OAAO;AAAA,GACnF;AACA,EAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,EAAA,EAAI,CAAA,KAAM;AACxB,IAAA,MAAM,IAAA,GAAO,CAAA,GAAI,OAAA,GAAU,EAAA,GAAK,IAAI,IAAA,GAAO,CAAA;AAC3C,IAAA,KAAA,CAAM,IAAA,CAAKQ,uBAAK,EAAE,CAAA,EAAG,IAAI,OAAA,EAAS,CAAA,EAAG,OAAO,CAAA,EAAG,KAAA,EAAO,IAAI,MAAA,EAAQ,EAAA,EAAI,IAAI,CAAA,EAAG,EAAA,EAAI,GAAG,IAAA,EAAM,EAAA,CAAG,KAAA,EAAO,CAAC,CAAA;AACrG,IAAA,KAAA,CAAM,KAAKR,sBAAA,CAAO,EAAE,GAAG,CAAA,GAAI,OAAA,GAAU,IAAI,CAAA,EAAG,IAAA,GAAO,CAAA,EAAG,KAAA,EAAO,mBAAkB,EAAG,QAAA,CAAS,GAAG,KAAA,EAAO,EAAE,CAAC,CAAC,CAAA;AAAA,EAC3G,CAAC,CAAA;AACD,EAAA,OAAOY,uBAAA,CAAM,EAAE,KAAA,EAAO,WAAA,IAAe,KAAK,CAAA;AAC5C;AAIA,SAAS,cAAA,CAAe,QAA8B,KAAA,EAAsB;AAC1E,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,KAAA,CAAM,IAAA,CAAK,oBAAA,CAAqB,MAAA,EAAQ,KAAK,CAAC,CAAA;AAE9C,EAAA,KAAA,CAAM,IAAA,CAAK,mBAAA,CAAoB,MAAA,EAAQ,KAAK,CAAC,CAAA;AAC7C,EAAA,OAAO,KAAA,CAAM,KAAK,EAAE,CAAA;AACtB;AAEA,SAAS,oBAAA,CAAqB,QAA8B,KAAA,EAAsB;AAChF,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,EAAA,IAAM,OAAO,MAAA,EAAQ;AAC9B,IAAA,IAAI,EAAA,CAAG,KAAA,CAAM,IAAA,KAAS,OAAA,EAAS;AAC/B,IAAA,MAAM,QAAQ,EAAA,CAAG,KAAA,CAAM,KAAA,IAAS,KAAA,CAAM,gBAAgB,CAAC,CAAA;AACvD,IAAA,KAAA,CAAM,KAAKJ,sBAAA,CAAK;AAAA,MACd,GAAG,EAAA,CAAG,CAAA;AAAA,MACN,GAAG,EAAA,CAAG,CAAA;AAAA,MACN,KAAA,EAAO,GAAG,CAAA,IAAK,CAAA;AAAA,MACf,QAAQ,EAAA,CAAG,CAAA;AAAA,MACX,EAAA,EAAI,CAAA;AAAA,MACJ,EAAA,EAAI,CAAA;AAAA,MACJ,IAAA,EAAM,KAAA;AAAA,MACN,KAAA,EAAO,cAAA;AAAA,MACP,eAAA,EAAiB,GAAG,KAAA,CAAM;AAAA,KAC3B,CAAC,CAAA;AAAA,EACJ;AACA,EAAA,OAAOI,uBAAA,CAAM,EAAE,KAAA,EAAO,cAAA,IAAkB,KAAK,CAAA;AAC/C;AAEA,SAAS,mBAAA,CAAoB,QAA8B,KAAA,EAAsB;AAC/E,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,IAAS,EAAC;AAC/B,EAAA,IAAI,CAAC,KAAA,CAAM,MAAA,EAAQ,OAAO,EAAA;AAC1B,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,KAAA,CAAM,IAAA,CAAK,kBAAA,CAAmB,CAAA,EAAG,KAAK,CAAC,CAAA;AAAA,EACzC;AACA,EAAA,OAAOA,uBAAA,CAAM,EAAE,KAAA,EAAO,aAAA,IAAiB,KAAK,CAAA;AAC9C;AAEA,SAAS,kBAAA,CAAmB,GAAuB,KAAA,EAAsB;AACvE,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,KAAA,CAAM,IAAA,CAAKD,uBAAK,EAAE,CAAA,EAAG,KAAK,CAAA,CAAE,CAAC,IAAI,CAAA,CAAE,MAAM,MAAM,CAAA,CAAE,CAAC,IAAI,CAAA,CAAE,MAAM,IAAI,KAAA,EAAO,SAAA,EAAW,CAAC,CAAA;AAErF,EAAA,KAAA,CAAM,IAAA,CAAKF,yBAAO,EAAE,EAAA,EAAI,EAAE,CAAA,EAAG,EAAA,EAAI,EAAE,KAAA,EAAO,CAAA,EAAG,GAAG,IAAA,EAAM,KAAA,CAAM,YAAY,MAAA,EAAQ,CAAA,CAAE,OAAO,KAAA,EAAO,mBAAA,EAAqB,CAAC,CAAA;AACtH,EAAA,KAAA,CAAM,KAAKA,wBAAA,CAAO,EAAE,EAAA,EAAI,CAAA,CAAE,GAAG,EAAA,EAAI,CAAA,CAAE,KAAA,EAAO,CAAA,EAAG,KAAK,IAAA,EAAM,CAAA,CAAE,OAAO,KAAA,EAAO,mBAAA,EAAqB,CAAC,CAAA;AAE9F,EAAA,KAAA,CAAM,KAAKD,sBAAA,CAAK;AAAA,IACd,GAAG,CAAA,CAAE,KAAA;AAAA,IACL,GAAG,CAAA,CAAE,KAAA;AAAA,IACL,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,QAAQ,CAAA,CAAE,KAAA;AAAA,IACV,EAAA,EAAI,CAAA;AAAA,IACJ,EAAA,EAAI,CAAA;AAAA,IACJ,KAAA,EAAO;AAAA,GACR,CAAC,CAAA;AAEF,EAAA,KAAA,CAAM,KAAKA,sBAAA,CAAK;AAAA,IACd,GAAG,CAAA,CAAE,KAAA;AAAA,IACL,GAAG,CAAA,CAAE,KAAA;AAAA,IACL,KAAA,EAAO,CAAA;AAAA,IACP,QAAQ,CAAA,CAAE,KAAA;AAAA,IACV,EAAA,EAAI,CAAA;AAAA,IACJ,EAAA,EAAI,CAAA;AAAA,IACJ,MAAM,CAAA,CAAE;AAAA,GACT,CAAC,CAAA;AACF,EAAA,MAAM,IAAA,GAAO,EAAE,KAAA,GAAQ,EAAA;AACvB,EAAA,MAAM,SAAA,GAAY,CAAA,CAAE,KAAA,CAAM,IAAA,GAAO,GAAG,CAAA,CAAE,KAAA,CAAM,IAAI,CAAA,EAAA,EAAK,CAAA,CAAE,KAAA,CAAM,KAAK,CAAA,CAAA,GAAK,EAAE,KAAA,CAAM,KAAA;AAC/E,EAAA,KAAA,CAAM,IAAA,CAAKR,sBAAA;AAAA,IACT,EAAE,GAAG,IAAA,EAAM,CAAA,EAAG,EAAE,KAAA,GAAQ,EAAA,EAAI,OAAO,eAAA,EAAgB;AAAA,IACnD,QAAA,CAAS,WAAW,EAAE;AAAA,GACvB,CAAA;AACD,EAAA,KAAA,CAAM,IAAA,CAAKA,sBAAA;AAAA,IACT,EAAE,GAAG,IAAA,EAAM,CAAA,EAAG,EAAE,KAAA,GAAQ,EAAA,EAAI,OAAO,cAAA,EAAe;AAAA,IAClD,CAAA,CAAE,MAAM,KAAA,CAAM;AAAA,GACf,CAAA;AACD,EAAA,OAAO,KAAA,CAAM,KAAK,EAAE,CAAA;AACtB;AAIA,SAAS,QAAA,CAAS,GAAW,QAAA,EAA0B;AACrD,EAAA,IAAI,CAAA,CAAE,MAAA,IAAU,QAAA,EAAU,OAAO,CAAA;AACjC,EAAA,IAAI,QAAA,GAAW,GAAG,OAAO,EAAA;AACzB,EAAA,OAAO,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,QAAA,GAAW,CAAC,CAAA,GAAI,QAAA;AACpC;AAEA,SAAS0B,SAAAA,CAAS,GAAW,GAAA,EAAuB;AAClD,EAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,KAAA,CAAM,KAAK,CAAA;AAC3B,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,IAAA,CAAK,MAAM,GAAA,GAAM,CAAA,EAAG,IAAA,EAAK,CAAE,SAAS,GAAA,EAAK;AACvC,MAAA,IAAI,GAAA,EAAK,GAAA,CAAI,IAAA,CAAK,GAAG,CAAA;AACrB,MAAA,GAAA,GAAM,CAAA;AAAA,IACR,CAAA,MAAO;AACL,MAAA,GAAA,GAAA,CAAO,GAAA,GAAM,GAAA,GAAM,GAAA,GAAM,EAAA,IAAM,CAAA;AAAA,IACjC;AAAA,EACF;AACA,EAAA,IAAI,GAAA,EAAK,GAAA,CAAI,IAAA,CAAK,GAAG,CAAA;AACrB,EAAA,OAAO,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AACvB;AAEA,SAAS,QAAA,CAAS,EAAA,EAAY,EAAA,EAAY,MAAA,EAAgB,QAAgB,MAAA,EAAwB;AAChG,EAAA,MAAM,IAAA,GAAO,KAAK,EAAA,GAAK,MAAA;AACvB,EAAA,IAAI,CAAA,GAAI,EAAA;AACR,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,GAAS,GAAG,CAAA,EAAA,EAAK;AACnC,IAAA,MAAM,CAAA,GAAI,CAAA,GAAI,CAAA,KAAM,CAAA,GAAI,MAAA,GAAS,MAAA;AACjC,IAAA,MAAM,CAAA,GAAI,CAAA,GAAI,IAAA,GAAO,IAAA,CAAK,EAAA,GAAK,CAAA;AAC/B,IAAA,MAAM,CAAA,GAAI,EAAA,GAAK,CAAA,GAAI,IAAA,CAAK,IAAI,CAAC,CAAA;AAC7B,IAAA,MAAM,CAAA,GAAI,EAAA,GAAK,CAAA,GAAI,IAAA,CAAK,IAAI,CAAC,CAAA;AAC7B,IAAA,CAAA,IAAA,CAAM,CAAA,KAAM,CAAA,GAAI,GAAA,GAAM,GAAA,IAAO,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,GAAI,GAAA,GAAM,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,GAAI,GAAA;AAAA,EACnE;AACA,EAAA,OAAO,CAAA,GAAI,GAAA;AACb;;;ACrlBO,IAAM,QAAA,GAA0B;AAAA,EACrC,IAAA,EAAM,UAAA;AAAA,EACN,OAAO1B,KAAAA,EAAM;AACX,IAAA,OAAO,iBAAA,CAAkB,KAAKA,KAAI,CAAA;AAAA,EACpC,CAAA;AAAA,EACA,KAAA,EAAO,aAAA;AAAA,EACP,MAAA,CAAOA,OAAM,MAAA,EAAuB;AAClC,IAAA,OAAO,cAAA,CAAeA,OAAM,MAAM,CAAA;AAAA,EACpC;AACF;;;ACHO,IAAM,eAAA,GAAN,cAA8B,KAAA,CAAM;AAAA,EACzC,WAAA,CAAY,SAAwBD,KAAAA,EAAe;AACjD,IAAA,KAAA,CAAMA,UAAS,MAAA,GAAY,CAAA,KAAA,EAAQA,KAAI,CAAA,EAAA,EAAK,OAAO,KAAK,OAAO,CAAA;AAD7B,IAAA,IAAA,CAAA,IAAA,GAAAA,KAAAA;AAElC,IAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AAAA,EACd;AAAA,EAHoC,IAAA;AAItC,CAAA;AAQA,IAAM,eAAA,GAAmD;AAAA,EACvD,OAAA,EAAS,SAAA;AAAA,EACT,KAAA,EAAO,OAAA;AAAA,EACP,MAAA,EAAQ,QAAA;AAAA,EACR,QAAA,EAAU,UAAA;AAAA,EACV,IAAA,EAAM,MAAA;AAAA,EACN,IAAA,EAAM,MAAA;AAAA,EACN,OAAA,EAAS,SAAA;AAAA,EACT,QAAA,EAAU,UAAA;AAAA,EACV,SAAA,EAAW,WAAA;AAAA,EACX,WAAA,EAAa,aAAA;AAAA,EACb,UAAA,EAAY;AACd,CAAA;AAGA,IAAM,kBAAA,GAAsD;AAAA,EAC1D,MAAA,EAAQ,QAAA;AAAA,EACR,IAAA,EAAM,MAAA;AAAA,EACN,IAAA,EAAM,MAAA;AAAA,EACN,GAAA,EAAK;AACP,CAAA;AAEA,SAASmB,YAAW,GAAA,EAAwB;AAC1C,EAAA,MAAM,MAAiB,EAAC;AACxB,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA;AAC/B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,GAAA,GAAM,MAAM,CAAC,CAAA;AACnB,IAAA,IAAI,QAAQ,MAAA,EAAW;AACvB,IAAA,MAAM,OAAA,GAAU,IAAI,IAAA,EAAK;AACzB,IAAA,IAAI,CAAC,OAAA,EAAS;AAEd,IAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,IAAK,OAAA,CAAQ,UAAA,CAAW,IAAI,CAAA,IAAK,OAAA,CAAQ,UAAA,CAAW,IAAI,CAAA,EAAG;AACrF,IAAA,MAAM,SAAS,GAAA,CAAI,MAAA,GAAS,IAAI,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA,CAAE,MAAA;AACpD,IAAA,GAAA,CAAI,IAAA,CAAK,EAAE,MAAA,EAAQ,IAAA,EAAM,SAAS,IAAA,EAAM,CAAA,GAAI,GAAG,CAAA;AAAA,EACjD;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAASS,SAAQ,CAAA,EAAmB;AAClC,EAAA,IAAI,CAAA,CAAE,MAAA,IAAU,CAAA,IAAK,CAAA,CAAE,UAAA,CAAW,GAAG,CAAA,IAAK,CAAA,CAAE,QAAA,CAAS,GAAG,CAAA,EAAG;AACzD,IAAA,OAAO,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,EACtB;AACA,EAAA,OAAO,CAAA;AACT;AAEA,SAAS,WAAW,CAAA,EAAmC;AAErD,EAAA,MAAM,MAA8B,EAAC;AACrC,EAAA,MAAM,KAAA,GAAQ,EAAE,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA,CAAE,OAAA,CAAQ,OAAO,EAAE,CAAA;AACpD,EAAA,IAAI,CAAC,KAAA,CAAM,IAAA,EAAK,EAAG,OAAO,GAAA;AAC1B,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA,EAAG;AACnC,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AAC5B,IAAA,IAAI,MAAM,CAAA,EAAG;AACb,IAAA,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,GAAG,EAAE,IAAA,EAAM,CAAA,GAAIA,QAAAA,CAAQ,KAAK,KAAA,CAAM,GAAA,GAAM,CAAC,CAAA,CAAE,MAAM,CAAA;AAAA,EACrE;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,qBAAqB,KAAA,EAI5B;AACA,EAAA,MAAM,MAA6D,EAAC;AACpE,EAAA,IAAI,IAAA,GAAO,MAAM,IAAA,EAAK;AACtB,EAAA,IAAI,CAAC,MAAM,OAAO,GAAA;AAElB,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,QAAA,GAAW,EAAA;AACf,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,CAAA,GAAI,KAAK,CAAC,CAAA;AAChB,IAAA,IAAI,MAAM,GAAA,EAAK,KAAA,EAAA;AAAA,SAAA,IACN,MAAM,GAAA,EAAK,KAAA,EAAA;AAAA,SAAA,IACX,CAAA,KAAM,GAAA,IAAO,KAAA,KAAU,CAAA,EAAG;AACjC,MAAA,QAAA,GAAW,CAAA;AACX,MAAA;AAAA,IACF;AAAA,EACF;AACA,EAAA,IAAI,YAAY,CAAA,EAAG;AACjB,IAAA,GAAA,CAAI,SAAS,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,CAAC,EAAE,IAAA,EAAK;AAC3C,IAAA,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,QAAQ,EAAE,IAAA,EAAK;AAAA,EACtC;AAEA,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,6CAA6C,CAAA;AACvE,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,GAAA,CAAI,KAAA,GAAQ,MAAA,CAAO,MAAA,CAAO,KAAA,CAAM,IAAA,EAAK;AACrC,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,IAAA,EAAK;AACrC,IAAA,IAAI,IAAA,MAAU,OAAA,GAAU,IAAA;AAAA,EAC1B,CAAA,MAAA,IAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,GAAA,CAAI,OAAA,GAAU,IAAA;AAAA,EAChB;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,kBAAkB3B,KAAAA,EAAyC;AAClE,EAAA,MAAM,KAAA,GAAQA,KAAAA,CAAK,KAAA,CAAM,+BAA+B,CAAA;AACxD,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,OAAO,EAAE,IAAA,EAAM,KAAA,CAAM,CAAC,CAAA,EAA8B,QAAQ,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,EAAK,EAAE;AAAA,EAC9E;AACA,EAAA,MAAM,MAAA,GAAS,qBAAqBA,KAAI,CAAA;AACxC,EAAA,IAAI,CAAC,OAAO,OAAA,IAAW,CAAC,OAAO,KAAA,IAAS,CAAC,MAAA,CAAO,MAAA,EAAQ,OAAO,MAAA;AAC/D,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,UAAA;AAAA,IACN,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,QAAQ,MAAA,CAAO;AAAA,GACjB;AACF;AAcA,SAAS,WAAA,CAAY,KAAmB,IAAA,EAA+B;AACrE,EAAA,GAAA,CAAI,aAAA,IAAiB,CAAA;AACrB,EAAA,OAAO,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA,EAAI,GAAA,CAAI,aAAa,CAAA,CAAA;AACvC;AAEA,SAAS,kBAAA,CAAmB,KAAmB,MAAA,EAA+B;AAC5E,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,IAAI,IAAI,YAAA,EAAc;AACpB,MAAA,MAAM,QAAA,GAAW,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,IAAI,YAAY,CAAA;AAC9C,MAAA,IAAI,UAAU,OAAO,QAAA;AAAA,IACvB;AACA,IAAA,MAAM4B,KAAAA,GAAkB;AAAA,MACtB,EAAA,EAAI,WAAA,CAAY,GAAA,EAAK,SAAS,CAAA;AAAA,MAC9B,KAAA,EAAO,EAAA;AAAA,MACP,IAAA,EAAM,QAAA;AAAA,MACN,UAAA,EAAY,SAAA;AAAA,MACZ,YAAY,EAAC;AAAA,MACb,UAAU;AAAC,KACb;AACA,IAAA,GAAA,CAAI,eAAeA,KAAAA,CAAK,EAAA;AACxB,IAAA,GAAA,CAAI,IAAA,CAAK,GAAA,CAAIA,KAAAA,CAAK,EAAA,EAAIA,KAAI,CAAA;AAC1B,IAAA,GAAA,CAAI,MAAA,CAAO,KAAKA,KAAI,CAAA;AACpB,IAAA,OAAOA,KAAAA;AAAA,EACT;AACA,EAAA,KAAA,MAAW,KAAA,IAAS,OAAO,QAAA,EAAU;AACnC,IAAA,IAAI,KAAA,CAAM,GAAG,UAAA,CAAW,YAAY,KAAK,KAAA,CAAM,KAAA,KAAU,IAAI,OAAO,KAAA;AAAA,EACtE;AACA,EAAA,MAAM,IAAA,GAAkB;AAAA,IACtB,EAAA,EAAI,WAAA,CAAY,GAAA,EAAK,SAAS,CAAA;AAAA,IAC9B,KAAA,EAAO,EAAA;AAAA,IACP,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY,SAAA;AAAA,IACZ,YAAY,EAAC;AAAA,IACb,UAAU,EAAC;AAAA,IACX,QAAQ,MAAA,CAAO;AAAA,GACjB;AACA,EAAA,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,IAAI,CAAA;AAC1B,EAAA,MAAA,CAAO,QAAA,CAAS,KAAK,IAAI,CAAA;AACzB,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,gBAAA,CAAiB,KAAmB,MAAA,EAA+B;AAC1E,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,IAAI,IAAI,UAAA,EAAY;AAClB,MAAA,MAAM,QAAA,GAAW,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,IAAI,UAAU,CAAA;AAC5C,MAAA,IAAI,UAAU,OAAO,QAAA;AAAA,IACvB;AACA,IAAA,MAAMA,KAAAA,GAAkB;AAAA,MACtB,EAAA,EAAI,WAAA,CAAY,GAAA,EAAK,OAAO,CAAA;AAAA,MAC5B,KAAA,EAAO,EAAA;AAAA,MACP,IAAA,EAAM,QAAA;AAAA,MACN,UAAA,EAAY,OAAA;AAAA,MACZ,YAAY,EAAC;AAAA,MACb,UAAU;AAAC,KACb;AACA,IAAA,GAAA,CAAI,aAAaA,KAAAA,CAAK,EAAA;AACtB,IAAA,GAAA,CAAI,IAAA,CAAK,GAAA,CAAIA,KAAAA,CAAK,EAAA,EAAIA,KAAI,CAAA;AAC1B,IAAA,GAAA,CAAI,MAAA,CAAO,KAAKA,KAAI,CAAA;AACpB,IAAA,OAAOA,KAAAA;AAAA,EACT;AACA,EAAA,KAAA,MAAW,KAAA,IAAS,OAAO,QAAA,EAAU;AACnC,IAAA,IAAI,KAAA,CAAM,GAAG,UAAA,CAAW,UAAU,KAAK,KAAA,CAAM,KAAA,KAAU,IAAI,OAAO,KAAA;AAAA,EACpE;AACA,EAAA,MAAM,IAAA,GAAkB;AAAA,IACtB,EAAA,EAAI,WAAA,CAAY,GAAA,EAAK,OAAO,CAAA;AAAA,IAC5B,KAAA,EAAO,EAAA;AAAA,IACP,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY,OAAA;AAAA,IACZ,YAAY,EAAC;AAAA,IACb,UAAU,EAAC;AAAA,IACX,QAAQ,MAAA,CAAO;AAAA,GACjB;AACA,EAAA,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,IAAI,CAAA;AAC1B,EAAA,MAAA,CAAO,QAAA,CAAS,KAAK,IAAI,CAAA;AACzB,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,iBAAA,CACP,GAAA,EACA,EAAA,EACA,MAAA,EACW;AACX,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AAChC,EAAA,IAAI,UAAU,OAAO,QAAA;AACrB,EAAA,MAAM,IAAA,GAAkB;AAAA,IACtB,EAAA;AAAA,IACA,KAAA,EAAO,EAAA;AAAA,IACP,IAAA,EAAM,QAAA;AAAA,IACN,YAAY,EAAC;AAAA,IACb,UAAU,EAAC;AAAA,IACX,QAAQ,MAAA,EAAQ;AAAA,GAClB;AACA,EAAA,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAI,CAAA;AACrB,EAAA,IAAI,MAAA,EAAQ,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AAAA,OAChC,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AACzB,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,QAAQ,GAAA,EAAsB;AACrC,EAAA,OAAO,0BAAA,CAA2B,KAAK,GAAG,CAAA;AAC5C;AAmBO,SAAS,kBAAkB,GAAA,EAA8B;AAC9D,EAAA,MAAM,KAAA,GAAQV,YAAW,GAAG,CAAA;AAC5B,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,MAAM,IAAI,gBAAgB,gBAAgB,CAAA;AAAA,EAC5C;AAGA,EAAA,MAAM,MAAA,GAAS,MAAM,CAAC,CAAA;AACtB,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,0CAA0C,CAAA;AAC9E,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,MAAM,IAAI,eAAA;AAAA,MACR,CAAA,gDAAA,EAAmD,OAAO,IAAI,CAAA,CAAA,CAAA;AAAA,MAC9D,MAAA,CAAO;AAAA,KACT;AAAA,EACF;AAEA,EAAA,IAAIjB,MAAAA;AACJ,EAAA,IAAI,SAAA,GAA4B,IAAA;AAEhC,EAAA,MAAM,UAAA,GAAa,OAAO,IAAA,CAAK,KAAA,CAAM,UAAU,CAAC,CAAA,CAAE,MAAM,CAAA,CAAE,IAAA,EAAK;AAE/D,EAAA,MAAM,UAAA,GAAa,UAAA,CAAW,KAAA,CAAM,gBAAgB,CAAA;AACpD,EAAA,IAAI,WAAA,GAAc,UAAA;AAClB,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,UAAA,CAAW,CAAC,CAAC,CAAA;AACtC,IAAA,IAAI,MAAM,SAAA,KAAc,IAAA,IAAQ,MAAM,SAAA,KAAc,IAAA,cAAkB,KAAA,CAAM,SAAA;AAC5E,IAAA,WAAA,GAAc,WAAW,KAAA,CAAM,CAAA,EAAG,UAAA,CAAW,KAAK,EAAE,IAAA,EAAK;AAAA,EAC3D;AACA,EAAA,IAAI,YAAY,UAAA,CAAW,GAAG,GAAGA,MAAAA,GAAQ0B,SAAQ,WAAW,CAAA;AAAA,OAAA,IACnD,WAAA,CAAY,MAAA,GAAS,CAAA,EAAG1B,MAAAA,GAAQ,WAAA;AAEzC,EAAA,MAAM,GAAA,GAAoB;AAAA,IACxB,QAAQ,EAAC;AAAA,IACT,aAAa,EAAC;AAAA,IACd,OAAO,EAAC;AAAA,IACR,aAAA,EAAe,CAAA;AAAA,IACf,WAAA,EAAa,CAAA;AAAA,IACb,YAAA,EAAc,CAAA;AAAA,IACd,IAAA,sBAAU,GAAA;AAAI,GAChB;AAGA,EAAA,MAAM,iBAGD,CAAC,EAAE,QAAQ,MAAA,EAAW,UAAA,EAAY,OAAO,CAAA;AAE9C,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,OAAO,CAAA,GAAI,MAAM,MAAA,EAAQ;AACvB,IAAA,MAAM,EAAA,GAAK,MAAM,CAAC,CAAA;AAClB,IAAA,MAAMD,QAAO,EAAA,CAAG,IAAA;AAEhB,IAAA,MAAM,MAAA,GAAS,cAAA,CAAe,cAAA,CAAe,MAAA,GAAS,CAAC,CAAA;AACvD,IAAA,MAAM,SAAS,MAAA,CAAO,MAAA;AAGtB,IAAA,IAAIA,UAAS,GAAA,EAAK;AAChB,MAAA,IAAI,cAAA,CAAe,UAAU,CAAA,EAAG;AAC9B,QAAA,MAAM,IAAI,eAAA,CAAgB,gBAAA,EAAkB,EAAA,CAAG,IAAI,CAAA;AAAA,MACrD;AACA,MAAA,cAAA,CAAe,GAAA,EAAI;AACnB,MAAA,CAAA,EAAA;AACA,MAAA;AAAA,IACF;AAGA,IAAA,IAAIA,KAAAA,KAAS,KAAA,IAASA,KAAAA,KAAS,IAAA,EAAM;AACnC,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,MAAM,IAAI,eAAA;AAAA,UACR,kDAAA;AAAA,UACA,EAAA,CAAG;AAAA,SACL;AAAA,MACF;AACA,MAAA,MAAA,CAAO,UAAA,GAAa,IAAA;AACpB,MAAA,IAAI,CAAC,MAAA,CAAO,OAAA,EAAS,MAAA,CAAO,UAAU,EAAC;AACvC,MAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,CAAA,CAAE,MAAA,EAAQ,CAAC,CAAA;AAC/D,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,QAAA,CAAS,KAAA,CAAM,OAAO,CAAA;AAC3C,MAAA,MAAA,CAAO,OAAA,CAAQ,KAAK,KAAK,CAAA;AACzB,MAAA,CAAA,EAAA;AACA,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,QAAA,GAAWA,KAAAA,CAAK,KAAA,CAAM,gCAAgC,CAAA;AAC5D,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,CAAA,GAAI,SAAS,CAAC,CAAA;AACpB,MAAA,SAAA,GAAY,CAAA,KAAM,IAAA,GAAO,IAAA,GAAO,CAAA,KAAM,OAAO,IAAA,GAAQ,CAAA;AACrD,MAAA,CAAA,EAAA;AACA,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,SAAA,GAAYA,KAAAA,CAAK,KAAA,CAAM,2DAA2D,CAAA;AACxF,IAAA,MAAM,oBAAA,GAAuB,SAAA,IAAaA,KAAAA,CAAK,QAAA,CAAS,GAAG,CAAA;AAC3D,IAAA,IAAI,oBAAA,EAAsB;AACxB,MAAA,MAAM,EAAA,GAAK,UAAW,CAAC,CAAA;AACvB,MAAA,MAAM,IAAA,GAAO,iBAAA,CAAkB,GAAA,EAAK,EAAA,EAAI,MAAM,CAAA;AAC9C,MAAA,IAAA,CAAK,IAAA,GAAO,WAAA;AACZ,MAAA,cAAA,CAAe,KAAK,EAAE,MAAA,EAAQ,IAAA,EAAM,UAAA,EAAY,OAAO,CAAA;AACvD,MAAA,CAAA,EAAA;AACA,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,UAAA,GAAaA,KAAAA,CAAK,KAAA,CAAM,wDAAwD,CAAA;AACtF,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAM,OAAO,iBAAA,CAAkB,GAAA,EAAK,UAAA,CAAW,CAAC,GAAG,MAAM,CAAA;AACzD,MAAA,IAAA,CAAK,KAAA,GAAQ,WAAW,CAAC,CAAA;AACzB,MAAA,CAAA,EAAA;AACA,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,WAAA,GAAcA,KAAAA,CAAK,KAAA,CAAM,0EAA0E,CAAA;AACzG,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,MAAM,EAAA,GAAK,YAAY,CAAC,CAAA;AACxB,MAAA,MAAM,IAAA,GAAO,kBAAA,CAAmB,WAAA,CAAY,CAAC,CAAC,CAAA;AAC9C,MAAA,MAAM,IAAA,GAAkB;AAAA,QACtB,EAAA;AAAA,QACA,KAAA,EAAO,EAAA;AAAA,QACP,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY,IAAA;AAAA,QACZ,YAAY,EAAC;AAAA,QACb,UAAU,EAAC;AAAA,QACX,QAAQ,MAAA,EAAQ;AAAA,OAClB;AACA,MAAA,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAI,CAAA;AACrB,MAAA,IAAI,MAAA,EAAQ,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AAAA,WAChC,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AACzB,MAAA,CAAA,EAAA;AACA,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,eAAA,GAAkBA,KAAAA,CAAK,KAAA,CAAM,+CAA+C,CAAA;AAClF,IAAA,IAAI,eAAA,EAAiB;AACnB,MAAA,MAAM,OAAO,iBAAA,CAAkB,GAAA,EAAK,eAAA,CAAgB,CAAC,GAAG,MAAM,CAAA;AAC9D,MAAA,IAAA,CAAK,QAAQ2B,QAAAA,CAAQ,eAAA,CAAgB,CAAC,CAAA,CAAE,MAAM,CAAA;AAC9C,MAAA,CAAA,EAAA;AACA,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,cAAc3B,KAAAA,CAAK,KAAA;AAAA,MACvB;AAAA,KACF;AACA,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,MAAM,MAAA,GAAS,YAAY,CAAC,CAAA;AAC5B,MAAA,MAAM,EAAA,GAAK,YAAY,CAAC,CAAA;AACxB,MAAA,MAAM,KAAA,GAAQ,gBAAgB,MAAM,CAAA;AACpC,MAAA,MAAM,IAAA,GAAkB;AAAA,QACtB,EAAA;AAAA,QACA,KAAA,EAAO,EAAA;AAAA,QACP,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY,KAAA;AAAA,QACZ,YAAY,EAAC;AAAA,QACb,UAAU,EAAC;AAAA,QACX,QAAQ,MAAA,EAAQ;AAAA,OAClB;AACA,MAAA,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAI,CAAA;AACrB,MAAA,IAAI,MAAA,EAAQ,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AAAA,WAChC,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AACzB,MAAA,CAAA,EAAA;AACA,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,QAAA,GAAW,kBAAkBA,KAAI,CAAA;AACvC,MAAA,IAAI,QAAA,KAAa,SAAS,IAAA,KAAS,OAAA,IAAW,SAAS,IAAA,KAAS,MAAA,IAAU,QAAA,CAAS,IAAA,KAAS,IAAA,CAAA,EAAO;AACjG,QAAA,MAAA,CAAO,UAAA,CAAW,KAAK,QAAQ,CAAA;AAC/B,QAAA,CAAA,EAAA;AACA,QAAA;AAAA,MACF;AAAA,IACF;AAIA,IAAA,MAAM,aAAaA,KAAAA,CAAK,KAAA;AAAA,MACtB;AAAA,KACF;AACA,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAM,OAAO,UAAA,CAAW,CAAC,EAAE,UAAA,CAAW,MAAM,IAAI,MAAA,GAAS,OAAA;AACzD,MAAA,MAAM,MAAA,GAAS,WAAW,CAAC,CAAA;AAC3B,MAAA,GAAA,CAAI,WAAA,IAAe,CAAA;AACnB,MAAA,GAAA,CAAI,MAAM,IAAA,CAAK;AAAA,QACb,EAAA,EAAI,CAAA,OAAA,EAAU,GAAA,CAAI,WAAW,CAAA,CAAA;AAAA,QAC7B,MAAA;AAAA,QACA,IAAA;AAAA,QACA,IAAA,EAAM,UAAA,CAAW,CAAC,CAAA,CAAE,IAAA;AAAK,OAC1B,CAAA;AACD,MAAA,CAAA,EAAA;AACA,MAAA;AAAA,IACF;AAIA,IAAA,MAAM,mBAAmBA,KAAAA,CAAK,KAAA;AAAA,MAC5B;AAAA,KACF;AACA,IAAA,IAAI,gBAAA,EAAkB;AACpB,MAAA,MAAM,OAAO,gBAAA,CAAiB,CAAC,EAAE,UAAA,CAAW,MAAM,IAAI,MAAA,GAAS,OAAA;AAC/D,MAAA,MAAM,MAAA,GAAS,iBAAiB,CAAC,CAAA;AACjC,MAAA,MAAM,MAAgB,EAAC;AACvB,MAAA,CAAA,EAAA;AACA,MAAA,OAAO,CAAA,GAAI,MAAM,MAAA,EAAQ;AACvB,QAAA,MAAM,CAAA,GAAI,KAAA,CAAM,CAAC,CAAA,CAAG,IAAA;AACpB,QAAA,IAAI,CAAA,KAAM,UAAA,IAAc,CAAA,KAAM,GAAA,EAAK;AACnC,QAAA,GAAA,CAAI,KAAK,CAAC,CAAA;AACV,QAAA,CAAA,EAAA;AAAA,MACF;AACA,MAAA,IAAI,CAAA,IAAK,MAAM,MAAA,EAAQ;AACrB,QAAA,MAAM,IAAI,eAAA,CAAgB,yBAAA,EAA2B,EAAA,CAAG,IAAI,CAAA;AAAA,MAC9D;AACA,MAAA,CAAA,EAAA;AACA,MAAA,GAAA,CAAI,WAAA,IAAe,CAAA;AACnB,MAAA,GAAA,CAAI,MAAM,IAAA,CAAK;AAAA,QACb,EAAA,EAAI,CAAA,OAAA,EAAU,GAAA,CAAI,WAAW,CAAA,CAAA;AAAA,QAC7B,MAAA;AAAA,QACA,IAAA;AAAA,QACA,IAAA,EAAM,GAAA,CAAI,IAAA,CAAK,IAAI;AAAA,OACpB,CAAA;AACD,MAAA;AAAA,IACF;AACA,IAAA,MAAM,qBAAqBA,KAAAA,CAAK,KAAA;AAAA,MAC9B;AAAA,KACF;AACA,IAAA,IAAI,kBAAA,EAAoB;AACtB,MAAA,MAAM,OAAO,kBAAA,CAAmB,CAAC,GAAG,UAAA,CAAW,MAAM,IAAI,MAAA,GAAS,OAAA;AAClE,MAAA,MAAM,MAAA,GAAS,mBAAmB,CAAC,CAAA;AACnC,MAAA,MAAM,MAAgB,EAAC;AACvB,MAAA,CAAA,EAAA;AACA,MAAA,OAAO,IAAI,KAAA,CAAM,MAAA,IAAU,MAAM,CAAC,CAAA,CAAG,SAAS,GAAA,EAAK;AACjD,QAAA,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,CAAG,IAAI,CAAA;AACvB,QAAA,CAAA,EAAA;AAAA,MACF;AACA,MAAA,IAAI,CAAA,IAAK,MAAM,MAAA,EAAQ;AACrB,QAAA,MAAM,IAAI,eAAA,CAAgB,yBAAA,EAA2B,EAAA,CAAG,IAAI,CAAA;AAAA,MAC9D;AACA,MAAA,CAAA,EAAA;AACA,MAAA,GAAA,CAAI,WAAA,IAAe,CAAA;AACnB,MAAA,GAAA,CAAI,MAAM,IAAA,CAAK;AAAA,QACb,EAAA,EAAI,CAAA,OAAA,EAAU,GAAA,CAAI,WAAW,CAAA,CAAA;AAAA,QAC7B,MAAA;AAAA,QACA,IAAA;AAAA,QACA,IAAA,EAAM,GAAA,CAAI,IAAA,CAAK,IAAI;AAAA,OACpB,CAAA;AACD,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,aAAaA,KAAAA,CAAK,KAAA;AAAA,MACtB;AAAA,KACF;AACA,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAM,OAAA,GAAU,WAAW,CAAC,CAAA;AAC5B,MAAA,MAAM,KAAA,GAAQ,WAAW,CAAC,CAAA;AAC1B,MAAA,MAAM,QAAA,GAAW,WAAW,CAAC,CAAA;AAE7B,MAAA,MAAM,UAAA,GAAa,CACjB,GAAA,EACA,QAAA,KACW;AACX,QAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,UAAA,IAAI,aAAa,MAAA,EAAQ,OAAO,kBAAA,CAAmB,GAAA,EAAK,MAAM,CAAA,CAAE,EAAA;AAChE,UAAA,OAAO,gBAAA,CAAiB,GAAA,EAAK,MAAM,CAAA,CAAE,EAAA;AAAA,QACvC;AACA,QAAA,OAAO,iBAAA,CAAkB,GAAA,EAAK,GAAA,EAAK,MAAM,CAAA,CAAE,EAAA;AAAA,MAC7C,CAAA;AAEA,MAAA,MAAM,MAAA,GAAS,UAAA,CAAW,OAAA,EAAS,MAAM,CAAA;AACzC,MAAA,MAAM,IAAA,GAAO,UAAA,CAAW,KAAA,EAAO,IAAI,CAAA;AAEnC,MAAA,GAAA,CAAI,YAAA,IAAgB,CAAA;AACpB,MAAA,MAAM,GAAA,GAAM,CAAA,CAAA,EAAI,GAAA,CAAI,YAAY,CAAA,CAAA;AAChC,MAAA,MAAM,WAAA,GAAc,QAAA,GAAW,oBAAA,CAAqB,QAAQ,IAAI,EAAC;AACjE,MAAA,GAAA,CAAI,YAAY,IAAA,CAAK;AAAA,QACnB,EAAA,EAAI,GAAA;AAAA,QACJ,IAAA,EAAM,MAAA;AAAA,QACN,EAAA,EAAI,IAAA;AAAA,QACJ,SAAS,WAAA,CAAY,OAAA;AAAA,QACrB,OAAO,WAAA,CAAY,KAAA;AAAA,QACnB,QAAQ,WAAA,CAAY;AAAA,OACrB,CAAA;AACD,MAAA,CAAA,EAAA;AACA,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,cAAA,GAAiBA,KAAAA,CAAK,KAAA,CAAM,uCAAuC,CAAA;AACzE,IAAA,IAAI,cAAA,IAAkB,OAAA,CAAQ,cAAA,CAAe,CAAC,CAAC,CAAA,EAAG;AAChD,MAAA,MAAM,OAAO,iBAAA,CAAkB,GAAA,EAAK,cAAA,CAAe,CAAC,GAAG,MAAM,CAAA;AAC7D,MAAA,IAAA,CAAK,QAAQ2B,QAAAA,CAAQ,cAAA,CAAe,CAAC,CAAA,CAAE,MAAM,CAAA;AAC7C,MAAA,CAAA,EAAA;AACA,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,SAAA,GAAY3B,KAAAA,CAAK,KAAA,CAAM,+BAA+B,CAAA;AAC5D,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,iBAAA,CAAkB,GAAA,EAAK,SAAA,CAAU,CAAC,CAAA,EAAG,MAAM,CAAA;AAC3C,MAAA,CAAA,EAAA;AACA,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAI,eAAA,CAAgB,CAAA,kBAAA,EAAqBA,KAAI,CAAA,CAAA,EAAI,GAAG,IAAI,CAAA;AAAA,EAChE;AAEA,EAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAC7B,IAAA,MAAM,IAAI,gBAAgB,yCAAyC,CAAA;AAAA,EACrE;AAEA,EAAA,SAAS,gBAAgB,IAAA,EAAiB;AACxC,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,CAAA,CAAE,MAAA,EAAQ,CAAC,CAAA;AAC9D,MAAA,IAAI,IAAA,CAAK,QAAA,CAAS,MAAA,GAAS,QAAA,EAAU;AACnC,QAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,QAAQ,CAAC,CAAA;AAAA,MACjD;AAAA,IACF;AACA,IAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,QAAA,EAAU,eAAA,CAAgB,KAAK,CAAA;AAAA,EAC1D;AACA,EAAA,KAAA,MAAW,CAAA,IAAK,GAAA,CAAI,MAAA,EAAQ,eAAA,CAAgB,CAAC,CAAA;AAE7C,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,OAAA;AAAA,IACN,KAAA,EAAAC,MAAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAQ,GAAA,CAAI,MAAA;AAAA,IACZ,aAAa,GAAA,CAAI,WAAA;AAAA,IACjB,OAAO,GAAA,CAAI;AAAA,GACb;AACF;;;AChjBA,IAAM,WAAA,GAAc;AAAA,EAClB,OAAA,EAAS,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA,EAAG;AAAA,EACxB,KAAA,EAAO,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA,EAAG;AAAA,EACtB,MAAA,EAAQ,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA,EAAG;AAAA,EACvB,QAAA,EAAU,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA,EAAG;AAAA,EACzB,IAAA,EAAM,EAAE,CAAA,EAAG,GAAA,EAAK,GAAG,CAAA,EAAE;AAAA;AAAA,EACrB,IAAA,EAAM,EAAE,CAAA,EAAG,GAAA,EAAK,GAAG,CAAA,EAAE;AAAA,EACrB,OAAA,EAAS,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA,EAAG;AAAA,EACxB,QAAA,EAAU,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA,EAAG;AAAA,EACzB,SAAA,EAAW,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA,EAAG;AAAA,EAC1B,WAAA,EAAa,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA,EAAG;AAAA,EAC5B,UAAA,EAAY,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA;AAC1B,CAAA;AAEA,IAAM,MAAA,GAAS,GAAA;AACf,IAAM,WAAA,GAAc,EAAA;AAUpB,SAAS,cAAc,IAAA,EAAiC;AACtD,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,QAAA,EAAU,OAAO,OAAA;AACnC,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,WAAA,EAAa,OAAO,OAAA;AAEtC,EAAA,QAAQ,KAAK,UAAA;AAAY,IACvB,KAAK,SAAA;AAAA,IACL,KAAK,OAAA;AAAA,IACL,KAAK,UAAA;AAAA,IACL,KAAK,SAAA;AAAA,IACL,KAAK,UAAA;AAAA,IACL,KAAK,WAAA;AAAA,IACL,KAAK,aAAA;AAAA,IACL,KAAK,YAAA;AACH,MAAA,OAAO,QAAA;AAAA,IACT,KAAK,QAAA;AACH,MAAA,OAAO,SAAA;AAAA,IACT,KAAK,MAAA;AAAA,IACL,KAAK,MAAA;AACH,MAAA,OAAO,MAAA;AAAA,IACT;AACE,MAAA,OAAO,OAAA;AAAA;AAEb;AAEA,SAAS,WAAW,CAAA,EAAwC;AAC1D,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,IAAI,CAAA,CAAE,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,EAAE,OAAO,CAAA;AACnC,EAAA,IAAI,EAAE,KAAA,EAAO,KAAA,CAAM,KAAK,CAAA,CAAA,EAAI,CAAA,CAAE,KAAK,CAAA,CAAA,CAAG,CAAA;AACtC,EAAA,IAAI,CAAA,GAAI,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA;AACtB,EAAA,IAAI,CAAA,CAAE,MAAA,EAAQ,CAAA,GAAI,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA,GAAA,EAAM,CAAA,CAAE,MAAM,CAAA,CAAA,GAAK,CAAA,EAAA,EAAK,CAAA,CAAE,MAAM,CAAA,CAAA;AAC1D,EAAA,OAAO,CAAA,CAAE,MAAK,IAAK,MAAA;AACrB;AAEA,SAAS,mBAAmB,GAAA,EAAwC;AAClE,EAAA,MAAM,UAA2B,EAAC;AAClC,EAAA,MAAM,cAAmC,EAAC;AAC1C,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAsC;AAE9D,EAAA,MAAM,iBAAA,uBAAwB,GAAA,EAAoB;AAClD,EAAA,MAAM,gBAAA,uBAAuB,GAAA,EAAoB;AAEjD,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,EAAc,QAAA,KAA4B;AACvD,IAAA,IAAI,CAAA,CAAE,SAAS,WAAA,EAAa;AAI1B,MAAA,MAAM,WAAqB,EAAC;AAC5B,MAAA,MAAM,aAAuB,EAAC;AAC9B,MAAA,KAAA,MAAW,KAAA,IAAS,EAAE,QAAA,EAAU;AAC9B,QAAA,IAAI,MAAM,IAAA,KAAS,WAAA,EAAa,UAAA,CAAW,IAAA,CAAK,MAAM,EAAE,CAAA;AAAA,aACnD,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,EAAE,CAAA;AAAA,MAC7B;AACA,MAAA,IAAI,UAAA;AACJ,MAAA,IAAI,SAAA;AACJ,MAAA,KAAA,MAAW,KAAA,IAAS,EAAE,QAAA,EAAU;AAC9B,QAAA,IAAI,MAAM,IAAA,KAAS,QAAA,IAAY,MAAM,UAAA,KAAe,SAAA,IAAa,CAAC,UAAA,EAAY;AAC5E,UAAA,UAAA,GAAa,KAAA,CAAM,EAAA;AAAA,QACrB;AACA,QAAA,IAAI,KAAA,CAAM,IAAA,KAAS,QAAA,IAAY,KAAA,CAAM,eAAe,OAAA,EAAS;AAC3D,UAAA,SAAA,GAAY,KAAA,CAAM,EAAA;AAAA,QACpB;AAAA,MACF;AACA,MAAA,IAAI,CAAC,UAAA,EAAY,UAAA,GAAa,CAAA,CAAE,QAAA,CAAS,CAAC,CAAA,EAAG,EAAA;AAC7C,MAAA,IAAI,CAAC,WAAW,SAAA,GAAY,CAAA,CAAE,SAAS,CAAA,CAAE,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA,EAAG,EAAA;AAC/D,MAAA,IAAI,UAAA,EAAY,iBAAA,CAAkB,GAAA,CAAI,CAAA,CAAE,IAAI,UAAU,CAAA;AACtD,MAAA,IAAI,SAAA,EAAW,gBAAA,CAAiB,GAAA,CAAI,CAAA,CAAE,IAAI,SAAS,CAAA;AAEnD,MAAA,WAAA,CAAY,IAAA,CAAK;AAAA,QACf,IAAI,CAAA,CAAE,EAAA;AAAA,QACN,KAAA,EAAO,CAAA,CAAE,KAAA,IAAS,CAAA,CAAE,EAAA;AAAA,QACpB,WAAW,GAAA,CAAI,SAAA;AAAA,QACf,QAAA,EAAU,QAAA;AAAA,QACV,SAAA,EAAW;AAAA,OACZ,CAAA;AACD,MAAA,KAAA,MAAW,SAAS,CAAA,CAAE,QAAA,EAAU,KAAA,CAAM,KAAA,EAAO,EAAE,EAAE,CAAA;AACjD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,GAAsB;AAAA,MAC1B,IAAI,CAAA,CAAE,EAAA;AAAA,MACN,KAAA,EAAO,kBAAkB,CAAC,CAAA;AAAA,MAC1B,KAAA,EAAO,cAAc,CAAC,CAAA;AAAA,MACtB,MAAA,EAAQ;AAAA,KACV;AACA,IAAA,OAAA,CAAQ,KAAK,IAAI,CAAA;AACjB,IAAA,IAAI,CAAA,CAAE,IAAA,KAAS,QAAA,IAAY,CAAA,CAAE,UAAA,EAAY;AACvC,MAAA,WAAA,CAAY,GAAA,CAAI,EAAE,EAAA,EAAI,EAAE,GAAG,WAAA,CAAY,CAAA,CAAE,UAAU,CAAA,EAAG,CAAA;AAAA,IACxD;AAAA,EACF,CAAA;AAEA,EAAA,KAAA,MAAW,CAAA,IAAK,GAAA,CAAI,MAAA,EAAQ,KAAA,CAAM,GAAG,MAAS,CAAA;AAM9C,EAAA,MAAM,OAAA,GAA2B,GAAA,CAAI,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,KAAM;AAC1D,IAAA,IAAI,OAAO,CAAA,CAAE,IAAA;AACb,IAAA,IAAI,KAAK,CAAA,CAAE,EAAA;AACX,IAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA;AAC5C,IAAA,IAAI,UAAU,IAAA,GAAO,QAAA;AACrB,IAAA,MAAM,OAAA,GAAU,iBAAA,CAAkB,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA;AAC1C,IAAA,IAAI,SAAS,EAAA,GAAK,OAAA;AAClB,IAAA,OAAO;AAAA,MACL,IAAI,CAAA,CAAE,EAAA;AAAA,MACN,IAAA;AAAA,MACA,EAAA;AAAA,MACA,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,WAAW,CAAC;AAAA,KACrB;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,EAAA,GAAmB;AAAA,IACvB,IAAA,EAAM,WAAA;AAAA,IACN,OAAO,GAAA,CAAI,KAAA;AAAA,IACX,SAAA,EAAW,GAAA,CAAI,SAAA,KAAc,IAAA,GAAO,IAAA,GAAQ,IAAA;AAAA,IAC5C,KAAA,EAAO,OAAA;AAAA,IACP,KAAA,EAAO,OAAA;AAAA,IACP,SAAA,EAAW,WAAA;AAAA,IACX,WAAW,EAAC;AAAA,IACZ,UAAA,sBAAgB,GAAA;AAAI,GACtB;AACA,EAAA,OAAO,EAAE,GAAA,EAAK,EAAA,EAAI,WAAA,EAAY;AAChC;AAWA,SAAS,kBAAkB,CAAA,EAAsB;AAC/C,EAAA,IAAI,CAAA,CAAE,IAAA,KAAS,QAAA,EAAU,OAAO,EAAA;AAEhC,EAAA,IAAI,EAAE,UAAA,CAAW,MAAA,KAAW,GAAG,OAAO,CAAA,CAAE,SAAS,CAAA,CAAE,EAAA;AAGnD,EAAA,MAAM,aAAA,GAAgB,EAAE,UAAA,CACrB,GAAA,CAAI,CAAC,CAAA,KAAM,YAAA,CAAa,CAAC,CAAA,CAAE,MAAM,EACjC,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,IAAA,CAAK,IAAI,CAAA,EAAG,CAAC,GAAG,CAAC,CAAA;AACrC,EAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,KAAA,IAAS,CAAA,CAAE,EAAA;AAC3B,EAAA,OAAO,MAAM,MAAA,IAAU,aAAA,GAAgB,KAAA,GAAQ,GAAA,CAAI,OAAO,aAAa,CAAA;AACzE;AAEA,SAAS,aAAa,CAAA,EAAgF;AACpG,EAAA,IAAI,CAAA,CAAE,SAAS,OAAA,IAAW,CAAA,CAAE,SAAS,MAAA,IAAU,CAAA,CAAE,SAAS,IAAA,EAAM;AAC9D,IAAA,OAAO,GAAG,CAAA,CAAE,IAAI,CAAA,GAAA,EAAM,CAAA,CAAE,UAAU,EAAE,CAAA,CAAA;AAAA,EACtC;AACA,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,IAAI,CAAA,CAAE,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,EAAE,OAAO,CAAA;AACnC,EAAA,IAAI,EAAE,KAAA,EAAO,KAAA,CAAM,KAAK,CAAA,CAAA,EAAI,CAAA,CAAE,KAAK,CAAA,CAAA,CAAG,CAAA;AACtC,EAAA,IAAI,CAAA,GAAI,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA;AACtB,EAAA,IAAI,CAAA,CAAE,MAAA,EAAQ,CAAA,GAAI,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA,GAAA,EAAM,CAAA,CAAE,MAAM,CAAA,CAAA,GAAK,CAAA,EAAA,EAAK,CAAA,CAAE,MAAM,CAAA,CAAA;AAC1D,EAAA,OAAO,CAAA;AACT;AAIA,SAAS,YAAA,CAAaD,KAAAA,EAAc,YAAA,GAAe,EAAA,EAAc;AAC/D,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,KAAA,MAAW,IAAA,IAAQA,KAAAA,CAAK,KAAA,CAAM,IAAI,CAAA,EAAG;AACnC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAC9B,IAAA,IAAI,GAAA,GAAM,EAAA;AACV,IAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,MAAA,IAAI,CAAC,KAAK,GAAA,GAAM,CAAA;AAAA,WAAA,IACP,GAAA,CAAI,SAAS,CAAA,CAAE,MAAA,GAAS,KAAK,YAAA,EAAc,GAAA,IAAO,IAAI,CAAC,CAAA,CAAA;AAAA,WAC3D;AACH,QAAA,GAAA,CAAI,KAAK,GAAG,CAAA;AACZ,QAAA,GAAA,GAAM,CAAA;AAAA,MACR;AAAA,IACF;AACA,IAAA,IAAI,GAAA,EAAK,GAAA,CAAI,IAAA,CAAK,GAAG,CAAA;AACrB,IAAA,IAAI,IAAA,KAAS,EAAA,EAAI,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA;AAAA,EAC9B;AACA,EAAA,OAAO,GAAA,CAAI,MAAA,GAAS,GAAA,GAAM,CAAC,EAAE,CAAA;AAC/B;AAIA,SAAS,YAAA,CACP,EAAA,EACA,EAAA,EACA,CAAA,EACA,CAAA,EACkD;AAGlD,EAAA,MAAM,MAAA,GAAS,KAAK,CAAA,GAAI,CAAA;AACxB,EAAA,MAAM,MAAA,GAAS,KAAK,CAAA,GAAI,IAAA;AACxB,EAAA,MAAM,IAAA,GAAO,KAAK,CAAA,GAAI,IAAA;AACtB,EAAA,MAAM,IAAA,GAAO,KAAK,CAAA,GAAI,CAAA;AACtB,EAAA,MAAM,MAAM,MAAA,GAAS,EAAA;AACrB,EAAA,MAAM,MAAM,MAAA,GAAS,EAAA;AACrB,EAAA,MAAM,MAAM,IAAA,GAAO,EAAA;AACnB,EAAA,MAAM,MAAM,IAAA,GAAO,EAAA;AACnB,EAAA,MAAMW,QAAO,CAAA,EAAA,EAAK,MAAM,CAAA,CAAA,EAAI,MAAM,MAAM,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,EAAA,EAAK,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,EAAA,EAAK,IAAI,IAAI,IAAI,CAAA,CAAA;AAClF,EAAA,OAAO,EAAE,MAAAA,KAAAA,EAAM,MAAA,EAAQ,SAAS,EAAA,EAAI,MAAA,EAAQ,SAAS,EAAA,EAAG;AAC1D;AAIO,SAAS,mBAAmB,GAAA,EAAyC;AAC1E,EAAA,MAAM,EAAE,GAAA,EAAK,KAAA,EAAO,WAAA,EAAY,GAAI,mBAAmB,GAAG,CAAA;AAK1D,EAAA,MAAM,YAA+B,EAAC;AACtC,EAAA,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM;AACtC,IAAA,IAAI,CAAA,CAAE,IAAA,KAAS,CAAA,CAAE,EAAA,EAAI;AACnB,MAAA,MAAM,CAAA,GAAI,IAAI,WAAA,CAAY,IAAA,CAAK,CAAC,EAAA,KAAO,EAAA,CAAG,EAAA,KAAO,CAAA,CAAE,EAAE,CAAA;AACrD,MAAA,IAAI,CAAA,EAAG,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA;AACvB,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAC,CAAA;AAED,EAAA,MAAM,QAAA,GAAWkB,kCAAgB,KAAK,CAAA;AAGtC,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAuB;AAC7C,EAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAAuB;AAC5C,IAAA,SAAA,CAAU,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,CAAC,CAAA;AACrB,IAAA,KAAA,MAAW,CAAA,IAAK,CAAA,CAAE,QAAA,EAAU,aAAA,CAAc,CAAC,CAAA;AAAA,EAC7C,CAAA;AACA,EAAA,KAAA,MAAW,CAAA,IAAK,GAAA,CAAI,MAAA,EAAQ,aAAA,CAAc,CAAC,CAAA;AAK3C,EAAA,MAAM,aAAgC,EAAC;AACvC,EAAA,KAAA,MAAW,MAAA,IAAU,SAAS,KAAA,EAAO;AACnC,IAAA,IAAI,OAAO,OAAA,EAAS;AACpB,IAAA,MAAM,CAAA,GAAI,SAAA,CAAU,GAAA,CAAI,MAAA,CAAO,KAAK,EAAE,CAAA;AACtC,IAAA,IAAI,CAAC,CAAA,EAAG;AACR,IAAA,IAAI,CAAA,CAAE,SAAS,WAAA,EAAa;AAE5B,IAAA,MAAM,EAAA,GAAK,MAAA,CAAO,CAAA,GAAI,MAAA,CAAO,KAAA,GAAQ,CAAA;AACrC,IAAA,MAAM,EAAA,GAAK,MAAA,CAAO,CAAA,GAAI,MAAA,CAAO,MAAA,GAAS,CAAA;AAEtC,IAAA,IAAI,IAAI,MAAA,CAAO,KAAA;AACf,IAAA,IAAI,IAAI,MAAA,CAAO,MAAA;AACf,IAAA,IAAI,CAAA,CAAE,IAAA,KAAS,QAAA,IAAY,CAAA,CAAE,UAAA,EAAY;AACvC,MAAA,MAAM,EAAA,GAAK,WAAA,CAAY,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA;AAC/B,MAAA,IAAI,EAAA,EAAI;AAEN,QAAA,IAAA,CAAK,CAAA,CAAE,eAAe,MAAA,IAAU,CAAA,CAAE,eAAe,MAAA,KAAW,GAAA,CAAI,cAAc,IAAA,EAAM;AAClF,UAAA,CAAA,GAAI,CAAA;AACJ,UAAA,CAAA,GAAI,GAAA;AAAA,QACN,CAAA,MAAO;AACL,UAAA,CAAA,GAAI,EAAA,CAAG,CAAA;AACP,UAAA,CAAA,GAAI,EAAA,CAAG,CAAA;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAEA,IAAA,UAAA,CAAW,IAAA,CAAK;AAAA,MACd,IAAI,CAAA,CAAE,EAAA;AAAA,MACN,CAAA,EAAG,KAAK,CAAA,GAAI,CAAA;AAAA,MACZ,CAAA,EAAG,KAAK,CAAA,GAAI,CAAA;AAAA,MACZ,KAAA,EAAO,CAAA;AAAA,MACP,MAAA,EAAQ,CAAA;AAAA,MACR,EAAA;AAAA,MACA,EAAA;AAAA,MACA,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,IAAA,EAAM,CAAA;AAAA,MACN,QAAQ,CAAA,CAAE;AAAA,KACX,CAAA;AAAA,EACH;AAGA,EAAA,MAAM,QAAA,GAAiC,QAAA,CAAS,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM;AAClE,IAAA,MAAM,CAAA,GAAI,SAAA,CAAU,GAAA,CAAI,CAAA,CAAE,SAAS,EAAE,CAAA;AACrC,IAAA,IAAI,CAAC,CAAA,EAAG;AACN,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,EAAE,QAAA,CAAS,EAAA;AAAA,QACf,OAAO,EAAE,EAAA,EAAI,CAAA,CAAE,QAAA,CAAS,IAAI,KAAA,EAAO,CAAA,CAAE,QAAA,CAAS,KAAA,EAAO,MAAM,WAAA,EAAa,UAAA,EAAY,EAAC,EAAG,QAAA,EAAU,EAAC,EAAE;AAAA,QACrG,GAAG,CAAA,CAAE,CAAA;AAAA,QACL,GAAG,CAAA,CAAE,CAAA;AAAA,QACL,OAAO,CAAA,CAAE,KAAA;AAAA,QACT,QAAQ,CAAA,CAAE;AAAA,OACZ;AAAA,IACF;AACA,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,EAAE,QAAA,CAAS,EAAA;AAAA,MACf,KAAA,EAAO,CAAA;AAAA,MACP,GAAG,CAAA,CAAE,CAAA;AAAA,MACL,GAAG,CAAA,CAAE,CAAA;AAAA,MACL,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,QAAQ,CAAA,CAAE;AAAA,KACZ;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,MAAM,UAAA,GAAa,IAAI,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,EAAA,EAAI,CAAC,CAAU,CAAC,CAAA;AACpE,EAAA,MAAM,aAAgC,EAAC;AACvC,EAAA,KAAA,MAAW,MAAA,IAAU,SAAS,KAAA,EAAO;AACnC,IAAA,MAAM,CAAA,GAAI,GAAA,CAAI,WAAA,CAAY,IAAA,CAAK,CAAC,OAAO,EAAA,CAAG,EAAA,KAAO,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA;AAC/D,IAAA,IAAI,CAAC,CAAA,EAAG;AAMR,IAAA,IAAIlB,QAAO,MAAA,CAAO,IAAA;AAClB,IAAA,MAAM,UAAA,GAAa,UAAA,CAAW,GAAA,CAAI,MAAA,CAAO,KAAK,IAAI,CAAA;AAClD,IAAA,MAAM,UAAA,GAAa,UAAA,CAAW,GAAA,CAAI,MAAA,CAAO,KAAK,EAAE,CAAA;AAChD,IAAA,IAAI,UAAA,IAAc,UAAA,CAAW,IAAA,CAAK,IAAA,KAAS,QAAA,EAAU;AACnD,MAAAA,KAAAA,GAAO,cAAcA,KAAAA,EAAM,UAAA,CAAW,IAAI,UAAA,CAAW,EAAA,EAAI,YAAA,CAAa,UAAU,CAAC,CAAA;AAAA,IACnF;AACA,IAAA,IAAI,UAAA,IAAc,UAAA,CAAW,IAAA,CAAK,IAAA,KAAS,QAAA,EAAU;AACnD,MAAAA,KAAAA,GAAO,YAAYA,KAAAA,EAAM,UAAA,CAAW,IAAI,UAAA,CAAW,EAAA,EAAI,YAAA,CAAa,UAAU,CAAC,CAAA;AAAA,IACjF;AACA,IAAA,UAAA,CAAW,IAAA,CAAK;AAAA,MACd,IAAI,CAAA,CAAE,EAAA;AAAA,MACN,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,IAAI,CAAA,CAAE,EAAA;AAAA,MACN,IAAA,EAAAA,KAAAA;AAAA,MACA,KAAA,EAAO,WAAW,CAAC,CAAA;AAAA,MACnB,MAAA,EAAQ,MAAA,CAAO,WAAA,EAAa,CAAA,IAAK,CAAA;AAAA,MACjC,MAAA,EAAQ,MAAA,CAAO,WAAA,EAAa,CAAA,IAAK,CAAA;AAAA,MACjC,WAAA,EAAa,MAAA,CAAO,WAAA,EAAa,UAAA,IAAc;AAAA,KAChD,CAAA;AAAA,EACH;AAGA,EAAA,KAAA,MAAW,MAAM,SAAA,EAAW;AAC1B,IAAA,MAAM,IAAA,GAAO,UAAA,CAAW,GAAA,CAAI,EAAA,CAAG,IAAI,CAAA;AACnC,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,EAAE,IAAA,EAAAA,KAAAA,EAAM,MAAA,EAAQ,QAAO,GAAI,YAAA,CAAa,IAAA,CAAK,EAAA,EAAI,IAAA,CAAK,EAAA,EAAI,IAAA,CAAK,KAAA,EAAO,KAAK,MAAM,CAAA;AACvF,IAAA,UAAA,CAAW,IAAA,CAAK;AAAA,MACd,IAAI,EAAA,CAAG,EAAA;AAAA,MACP,MAAM,EAAA,CAAG,IAAA;AAAA,MACT,IAAI,EAAA,CAAG,EAAA;AAAA,MACP,IAAA,EAAAA,KAAAA;AAAA,MACA,KAAA,EAAO,WAAW,EAAE,CAAA;AAAA,MACpB,MAAA;AAAA,MACA,MAAA;AAAA,MACA,WAAA,EAAa,OAAA;AAAA,MACb,QAAA,EAAU;AAAA,KACX,CAAA;AAAA,EACH;AAGA,EAAA,MAAM,QAA2B,EAAC;AAClC,EAAA,KAAA,MAAW,IAAA,IAAQ,IAAI,KAAA,EAAO;AAC5B,IAAA,MAAM,MAAA,GAAS,UAAA,CAAW,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA;AACzC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA;AACpC,IAAA,MAAM,CAAA,GAAI,MAAA;AACV,IAAA,MAAM,CAAA,GAAI,KAAA,CAAM,MAAA,GAAS,WAAA,GAAc,EAAA;AACvC,IAAA,IAAI,CAAA;AACJ,IAAA,IAAI,CAAA;AACJ,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,MAAA,CAAA,GAAI,MAAA,CAAO,IAAI,CAAA,GAAI,EAAA;AACnB,MAAA,CAAA,GAAI,MAAA,CAAO,KAAK,CAAA,GAAI,CAAA;AACpB,MAAA,QAAA,GAAW,MAAA,CAAO,CAAA;AAClB,MAAA,QAAA,GAAW,CAAA,GAAI,CAAA;AAAA,IACjB,CAAA,MAAO;AACL,MAAA,CAAA,GAAI,MAAA,CAAO,CAAA,GAAI,MAAA,CAAO,KAAA,GAAQ,EAAA;AAC9B,MAAA,CAAA,GAAI,MAAA,CAAO,KAAK,CAAA,GAAI,CAAA;AACpB,MAAA,QAAA,GAAW,MAAA,CAAO,IAAI,MAAA,CAAO,KAAA;AAC7B,MAAA,QAAA,GAAW,CAAA;AAAA,IACb;AACA,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,IAAA;AAAA,MACA,CAAA;AAAA,MACA,CAAA;AAAA,MACA,KAAA,EAAO,CAAA;AAAA,MACP,MAAA,EAAQ,CAAA;AAAA,MACR,KAAA;AAAA,MACA,MAAA,EAAQ,EAAE,EAAA,EAAI,QAAA,EAAU,EAAA,EAAI,MAAA,CAAO,EAAA,EAAI,EAAA,EAAI,QAAA,EAAU,EAAA,EAAI,CAAA,GAAI,CAAA,GAAI,CAAA;AAAE,KACpE,CAAA;AAAA,EACH;AAKA,EAAA,IAAI,OAAO,QAAA,CAAS,KAAA;AACpB,EAAA,IAAI,OAAO,QAAA,CAAS,MAAA;AACpB,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,IAAA,GAAO,KAAK,GAAA,CAAI,IAAA,EAAM,EAAE,CAAA,GAAI,CAAA,CAAE,QAAQ,CAAC,CAAA;AACvC,IAAA,IAAA,GAAO,KAAK,GAAA,CAAI,IAAA,EAAM,EAAE,CAAA,GAAI,CAAA,CAAE,SAAS,CAAC,CAAA;AACxC,IAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,EAC/B;AACA,EAAA,IAAI,OAAO,CAAA,EAAG;AACZ,IAAA,MAAM,KAAK,CAAC,IAAA;AACZ,IAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAC1B,MAAA,CAAA,CAAE,CAAA,IAAK,EAAA;AACP,MAAA,CAAA,CAAE,EAAA,IAAM,EAAA;AAAA,IACV;AACA,IAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,MAAA,CAAA,CAAE,CAAA,IAAK,EAAA;AAAA,IACT;AACA,IAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAC1B,MAAA,CAAA,CAAE,IAAA,GAAO,UAAA,CAAW,CAAA,CAAE,IAAA,EAAM,EAAE,CAAA;AAC9B,MAAA,CAAA,CAAE,MAAA,IAAU,EAAA;AAAA,IACd;AACA,IAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,MAAA,CAAA,CAAE,CAAA,IAAK,EAAA;AACP,MAAA,CAAA,CAAE,OAAO,EAAA,IAAM,EAAA;AACf,MAAA,CAAA,CAAE,OAAO,EAAA,IAAM,EAAA;AAAA,IACjB;AACA,IAAA,IAAA,IAAQ,EAAA;AAAA,EACV;AACA,EAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAC1B,IAAA,IAAI,CAAC,EAAE,QAAA,EAAU;AACjB,IAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,CAAA,CAAE,SAAS,EAAE,CAAA;AACnC,IAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,CAAA,CAAE,SAAS,EAAE,CAAA;AAAA,EACrC;AAGA,EAAA,MAAM,WAAA,GAAc,GAAA,CAAI,KAAA,GAAQ,EAAA,GAAK,CAAA;AACrC,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAC1B,MAAA,CAAA,CAAE,CAAA,IAAK,WAAA;AACP,MAAA,CAAA,CAAE,EAAA,IAAM,WAAA;AAAA,IACV;AACA,IAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,MAAA,CAAA,CAAE,CAAA,IAAK,WAAA;AAAA,IACT;AACA,IAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAC1B,MAAA,CAAA,CAAE,IAAA,GAAO,UAAA,CAAW,CAAA,CAAE,IAAA,EAAM,WAAW,CAAA;AACvC,MAAA,CAAA,CAAE,MAAA,IAAU,WAAA;AAAA,IACd;AACA,IAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,MAAA,CAAA,CAAE,CAAA,IAAK,WAAA;AACP,MAAA,CAAA,CAAE,OAAO,EAAA,IAAM,WAAA;AACf,MAAA,CAAA,CAAE,OAAO,EAAA,IAAM,WAAA;AAAA,IACjB;AACA,IAAA,IAAA,IAAQ,WAAA;AAAA,EACV;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,IAAA;AAAA,IACP,MAAA,EAAQ,IAAA;AAAA,IACR,KAAA,EAAO,UAAA;AAAA,IACP,KAAA,EAAO,UAAA;AAAA,IACP,QAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAO,GAAA,CAAI,KAAA;AAAA,IACX,WAAW,GAAA,CAAI;AAAA,GACjB;AACF;AASA,SAAS,aAAa,IAAA,EAA+B;AACnD,EAAA,MAAM,CAAA,GAAI,KAAK,IAAA,CAAK,UAAA;AACpB,EAAA,QAAQ,CAAA;AAAG,IACT,KAAK,SAAA;AAAW,MAAA,OAAO,CAAA;AAAA,IACvB,KAAK,OAAA;AAAS,MAAA,OAAO,EAAA;AAAA,IACrB,KAAK,QAAA;AAAU,MAAA,OAAO,EAAA;AAAA,IACtB,KAAK,UAAA;AAAY,MAAA,OAAO,CAAA;AAAA,IACxB,KAAK,SAAA;AAAW,MAAA,OAAO,EAAA;AAAA,IACvB,KAAK,UAAA;AAAY,MAAA,OAAO,EAAA;AAAA,IACxB,KAAK,WAAA;AAAa,MAAA,OAAO,CAAA;AAAA,IACzB,KAAK,aAAA;AAAA,IACL,KAAK,YAAA;AAAc,MAAA,OAAO,CAAA;AAAA,IAC1B,KAAK,MAAA;AAAA,IACL,KAAK,MAAA;AAEH,MAAA,OAAO,KAAK,GAAA,CAAI,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,MAAM,CAAA,GAAI,CAAA;AAAA,IAC7C;AAAS,MAAA,OAAO,KAAK,GAAA,CAAI,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,MAAM,CAAA,GAAI,CAAA;AAAA;AAExD;AAIA,SAAS,gBAAgB,CAAA,EAA+B;AAGtD,EAAA,IAAI,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,EAAG,OAAO,IAAA;AAC9B,EAAA,MAAM,MAAA,GAAS,CAAA,CAAE,KAAA,CAAM,+CAA+C,KAAK,EAAC;AAC5E,EAAA,MAAM,MAAmB,EAAC;AAC1B,EAAA,KAAA,MAAW,OAAO,MAAA,EAAQ;AACxB,IAAA,MAAM,CAAA,GAAI,GAAA,CAAI,KAAA,CAAM,8CAA8C,CAAA;AAClE,IAAA,IAAI,CAAC,CAAA,EAAG;AACR,IAAA,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,EAAG,UAAA,CAAW,EAAE,CAAC,CAAC,CAAA,EAAG,CAAA,EAAG,UAAA,CAAW,CAAA,CAAE,CAAC,CAAC,GAAG,CAAA;AAAA,EACvD;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,aAAa,GAAA,EAA0B;AAC9C,EAAA,IAAI,GAAA,CAAI,MAAA,KAAW,CAAA,EAAG,OAAO,EAAA;AAC7B,EAAA,MAAM,IAAA,GAAO,CAAA,EAAA,EAAK,GAAA,CAAI,CAAC,CAAA,CAAG,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,CAAC,CAAA,CAAG,CAAC,CAAA,CAAA;AACxC,EAAA,MAAM,OAAO,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA,CAAE,IAAI,CAAC,CAAA,KAAM,CAAA,EAAA,EAAK,CAAA,CAAE,CAAC,CAAA,CAAA,EAAI,CAAA,CAAE,CAAC,CAAA,CAAE,CAAA,CAAE,KAAK,GAAG,CAAA;AAChE,EAAA,OAAO,IAAA,GAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,GAAK,IAAA;AACpC;AAOA,SAAS,aAAA,CAAc,CAAA,EAAW,EAAA,EAAY,EAAA,EAAY,CAAA,EAAmB;AAC3E,EAAA,MAAM,GAAA,GAAM,gBAAgB,CAAC,CAAA;AAC7B,EAAA,IAAI,CAAC,GAAA,IAAO,GAAA,CAAI,MAAA,GAAS,GAAG,OAAO,CAAA;AACnC,EAAA,MAAM,EAAA,GAAK,IAAI,CAAC,CAAA;AAChB,EAAA,MAAM,EAAA,GAAK,IAAI,CAAC,CAAA;AAChB,EAAA,MAAM,QAAQ,kBAAA,CAAmB,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,IAAI,CAAC,CAAA;AAClD,EAAA,GAAA,CAAI,CAAC,CAAA,GAAI,KAAA;AACT,EAAA,OAAO,aAAa,GAAG,CAAA;AACzB;AAEA,SAAS,WAAA,CAAY,CAAA,EAAW,EAAA,EAAY,EAAA,EAAY,CAAA,EAAmB;AACzE,EAAA,MAAM,GAAA,GAAM,gBAAgB,CAAC,CAAA;AAC7B,EAAA,IAAI,CAAC,GAAA,IAAO,GAAA,CAAI,MAAA,GAAS,GAAG,OAAO,CAAA;AACnC,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA;AAC/B,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA;AAC/B,EAAA,MAAM,UAAU,kBAAA,CAAmB,IAAA,EAAM,IAAA,EAAM,EAAA,EAAI,IAAI,CAAC,CAAA;AACxD,EAAA,GAAA,CAAI,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA,GAAI,OAAA;AACtB,EAAA,OAAO,aAAa,GAAG,CAAA;AACzB;AAOA,SAAS,kBAAA,CACP,QAAA,EACA,QAAA,EACA,EAAA,EACA,IACA,CAAA,EACW;AACX,EAAA,MAAM,EAAA,GAAK,QAAA,CAAS,CAAA,GAAI,QAAA,CAAS,CAAA;AACjC,EAAA,MAAM,EAAA,GAAK,QAAA,CAAS,CAAA,GAAI,QAAA,CAAS,CAAA;AACjC,EAAA,IAAI,KAAK,GAAA,CAAI,EAAE,IAAI,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,EAAG;AAE/B,IAAA,MAAMmB,KAAAA,GAAO,EAAA,IAAM,CAAA,GAAI,CAAA,GAAI,EAAA;AAC3B,IAAA,OAAO,EAAE,CAAA,EAAG,EAAA,GAAKA,KAAAA,GAAO,CAAA,EAAG,GAAG,EAAA,EAAG;AAAA,EACnC;AAEA,EAAA,MAAM,IAAA,GAAO,EAAA,IAAM,CAAA,GAAI,CAAA,GAAI,EAAA;AAC3B,EAAA,OAAO,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,GAAK,OAAO,CAAA,EAAE;AACnC;AAEA,SAAS,UAAA,CAAW,GAAW,EAAA,EAAoB;AACjD,EAAA,OAAO,EAAE,OAAA,CAAQ,0DAAA,EAA4D,CAAC,CAAA,EAAG,KAAK,IAAA,KAAS;AAC7F,IAAA,MAAM,IAAA,GAAO,KAAK,IAAA,EAAK,CAAE,MAAM,KAAK,CAAA,CAAE,IAAI,MAAM,CAAA;AAChD,IAAA,MAAM,MAAgB,EAAC;AACvB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,MAAA,GAAA,CAAI,IAAA,CAAK,CAAA,GAAI,CAAA,KAAM,CAAA,GAAI,IAAA,CAAK,CAAC,CAAA,GAAI,EAAA,GAAK,IAAA,CAAK,CAAC,CAAC,CAAA;AAAA,IAC/C;AACA,IAAA,OAAO,GAAG,GAAG,CAAA,CAAA,EAAI,GAAA,CAAI,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AAAA,EAChC,CAAC,CAAA;AACH;AAEA,SAAS,UAAA,CAAW,GAAW,EAAA,EAAoB;AAGjD,EAAA,OAAO,EAAE,OAAA,CAAQ,0DAAA,EAA4D,CAAC,CAAA,EAAG,KAAK,IAAA,KAAS;AAC7F,IAAA,MAAM,IAAA,GAAO,KAAK,IAAA,EAAK,CAAE,MAAM,KAAK,CAAA,CAAE,IAAI,MAAM,CAAA;AAChD,IAAA,MAAM,MAAgB,EAAC;AACvB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AAEpC,MAAA,GAAA,CAAI,IAAA,CAAK,CAAA,GAAI,CAAA,KAAM,CAAA,GAAI,IAAA,CAAK,CAAC,CAAA,GAAI,EAAA,GAAK,IAAA,CAAK,CAAC,CAAC,CAAA;AAAA,IAC/C;AACA,IAAA,OAAO,GAAG,GAAG,CAAA,CAAA,EAAI,GAAA,CAAI,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AAAA,EAChC,CAAC,CAAA;AACH;;;AC1mBA,IAAM,eAAA,GAAkB,gBAAA;AAExB,IAAM,KAAA,GAAQ;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,CAAA;AAkCd,SAAS,iBAAA,GAA4B;AACnC,EAAA,OAAOf,oBAAA;AAAA,IACL,QAAA;AAAA,IACA;AAAA,MACE,EAAA,EAAI,eAAA;AAAA,MACJ,WAAA,EAAa,EAAA;AAAA,MACb,YAAA,EAAc,EAAA;AAAA,MACd,IAAA,EAAM,CAAA;AAAA,MACN,IAAA,EAAM,CAAA;AAAA,MACN,MAAA,EAAQ,MAAA;AAAA,MACR,WAAA,EAAa;AAAA,KACf;AAAA,IACA,CAACL,0BAAQ,EAAE,MAAA,EAAQ,gBAAgB,IAAA,EAAM,SAAA,EAAW,CAAC;AAAA,GACvD;AACF;AAIA,SAASqB,cAAa,CAAA,EAA0B;AAC9C,EAAA,IAAI,CAAA,CAAE,SAAS,OAAA,IAAW,CAAA,CAAE,SAAS,MAAA,IAAU,CAAA,CAAE,SAAS,IAAA,EAAM;AAC9D,IAAA,OAAO,GAAG,CAAA,CAAE,IAAI,CAAA,GAAA,EAAM,CAAA,CAAE,UAAU,EAAE,CAAA,CAAA;AAAA,EACtC;AACA,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,IAAI,CAAA,CAAE,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,EAAE,OAAO,CAAA;AACnC,EAAA,IAAI,EAAE,KAAA,EAAO,KAAA,CAAM,KAAK,CAAA,CAAA,EAAI,CAAA,CAAE,KAAK,CAAA,CAAA,CAAG,CAAA;AACtC,EAAA,IAAI,CAAA,GAAI,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA;AACtB,EAAA,IAAI,CAAA,CAAE,MAAA,EAAQ,CAAA,GAAI,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA,GAAA,EAAM,CAAA,CAAE,MAAM,CAAA,CAAA,GAAK,CAAA,EAAA,EAAK,CAAA,CAAE,MAAM,CAAA,CAAA;AAC1D,EAAA,OAAO,CAAA;AACT;AAIA,SAAS,aAAa,IAAA,EAA+B;AACnD,EAAA,MAAM,EAAE,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,QAAO,GAAI,IAAA;AAChC,EAAA,MAAM,QAAA,GAAqB;AAAA,IACzBvB,sBAAA,CAAK,EAAE,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,MAAA,EAAQ,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,KAAA,EAAO,eAAA,EAAiB;AAAA,GACpE;AACA,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,KAAA,IAAS,IAAA,CAAK,EAAA;AAEtC,EAAA,IAAI,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG;AACrC,IAAA,QAAA,CAAS,IAAA;AAAA,MACPR,sBAAA;AAAA,QACE,EAAE,CAAA,EAAG,CAAA,GAAI,KAAA,GAAQ,CAAA,EAAG,CAAA,EAAG,CAAA,GAAI,MAAA,GAAS,CAAA,GAAI,CAAA,EAAG,aAAA,EAAe,QAAA,EAAU,OAAO,eAAA,EAAgB;AAAA,QAC3F;AAAA;AACF,KACF;AAAA,EACF,CAAA,MAAO;AACL,IAAA,QAAA,CAAS,IAAA;AAAA,MACPA,sBAAA;AAAA,QACE,EAAE,CAAA,EAAG,CAAA,GAAI,KAAA,GAAQ,CAAA,EAAG,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,aAAA,EAAe,QAAA,EAAU,KAAA,EAAO,eAAA,EAAgB;AAAA,QAC/E;AAAA;AACF,KACF;AACA,IAAA,QAAA,CAAS,IAAA;AAAA,MACPD,sBAAA,CAAK,EAAE,EAAA,EAAI,CAAA,EAAG,IAAI,CAAA,GAAI,EAAA,EAAI,EAAA,EAAI,CAAA,GAAI,OAAO,EAAA,EAAI,CAAA,GAAI,EAAA,EAAI,KAAA,EAAO,gBAAgB;AAAA,KAC9E;AACA,IAAA,IAAI,KAAK,CAAA,GAAI,EAAA;AACb,IAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,IAAA,CAAK,UAAA,EAAY;AACpC,MAAA,QAAA,CAAS,IAAA,CAAKC,sBAAA,CAAK,EAAE,CAAA,EAAG,IAAI,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,KAAA,EAAO,mBAAA,EAAoB,EAAG+B,aAAAA,CAAa,CAAC,CAAC,CAAC,CAAA;AACpF,MAAA,EAAA,IAAM,EAAA;AAAA,IACR;AAAA,EACF;AACA,EAAA,OAAOnB,uBAAA,CAAM,EAAE,KAAA,EAAO,oBAAA,EAAsB,WAAW,IAAA,CAAK,EAAA,IAAM,QAAQ,CAAA;AAC5E;AAIA,SAAS,gBAAgB,CAAA,EAA+B;AACtD,EAAA,MAAM,EAAE,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,QAAO,GAAI,CAAA;AAChC,EAAA,MAAM,SAAA,GAAY,EAAA;AAClB,EAAA,MAAM,IAAA,GAAO,EAAE,KAAA,CAAM,UAAA;AACrB,EAAA,MAAM,QAAQ,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,MAAA,GAAS,KAAK,CAAA,GAAI,CAAA;AAEnD,EAAA,MAAM,KAAA,GAAkB;AAAA,IACtBJ,sBAAA,CAAK,EAAE,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,MAAA,EAAQ,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,KAAA,EAAO,mBAAA,EAAqB,CAAA;AAAA;AAAA,IAExEG,sBAAA,CAAK;AAAA,MACH,CAAA,EAAG,CAAA,EAAA,EAAK,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,CAAA,GAAI,SAAS,CAAA,GAAA,EAAM,CAAA,GAAI,KAAA,GAAQ,CAAC,CAAA,CAAA,EAAI,IAAI,SAAS,CAAA,CAAA;AAAA,MAClE,KAAA,EAAO;AAAA,KACR,CAAA;AAAA,IACDX,sBAAA;AAAA,MACE,EAAE,GAAG,CAAA,GAAI,EAAA,EAAI,GAAG,CAAA,GAAI,EAAA,EAAI,OAAO,oBAAA,EAAqB;AAAA,MACpD,CAAA,CAAE,KAAA,CAAM,KAAA,IAAS,CAAA,CAAE,KAAA,CAAM;AAAA;AAC3B,GACF;AAGA,EAAA,IAAI,KAAK,MAAA,EAAQ;AACf,IAAA,IAAI,EAAA,GAAK,IAAI,SAAA,GAAY,EAAA;AACzB,IAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,MAAA,KAAA,CAAM,IAAA,CAAKA,sBAAA,CAAK,EAAE,CAAA,EAAG,IAAI,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,KAAA,EAAO,mBAAA,EAAoB,EAAG+B,aAAAA,CAAa,CAAC,CAAC,CAAC,CAAA;AAClF,MAAA,EAAA,IAAM,EAAA;AAAA,IACR;AACA,IAAA,KAAA,CAAM,IAAA;AAAA,MACJpB,sBAAA,CAAK;AAAA,QACH,CAAA,EAAG,CAAA,EAAA,EAAK,CAAA,GAAI,CAAC,IAAI,CAAA,GAAI,SAAA,GAAY,KAAK,CAAA,GAAA,EAAM,IAAI,KAAA,GAAQ,CAAC,CAAA,CAAA,EAAI,CAAA,GAAI,YAAY,KAAK,CAAA,CAAA;AAAA,QAClF,KAAA,EAAO;AAAA,OACR;AAAA,KACH;AAAA,EACF;AAGA,EAAA,IAAI,EAAE,cAAA,EAAgB;AACpB,IAAA,KAAA,MAAW,EAAA,IAAM,EAAE,cAAA,EAAgB;AACjC,MAAA,KAAA,CAAM,IAAA;AAAA,QACJZ,sBAAA,CAAK,EAAE,EAAA,EAAI,CAAA,GAAI,GAAG,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,CAAA,GAAI,QAAQ,CAAA,EAAG,EAAA,EAAI,EAAA,EAAI,KAAA,EAAO,iBAAiB;AAAA,OAC/E;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAOa,uBAAA;AAAA,IACL,EAAE,KAAA,EAAO,uBAAA,EAAyB,SAAA,EAAW,EAAE,EAAA,EAAG;AAAA,IAClD;AAAA,GACF;AACF;AAIA,SAAS,aAAa,IAAA,EAA+B;AACnD,EAAA,MAAM,KAAK,IAAA,CAAK,EAAA;AAChB,EAAA,MAAM,KAAK,IAAA,CAAK,EAAA;AAChB,EAAA,MAAM,CAAA,GAAI,KAAK,IAAA,CAAK,UAAA;AACpB,EAAA,QAAQ,CAAA;AAAG,IACT,KAAK,SAAA;AACH,MAAA,OAAOA,uBAAA;AAAA,QACL,EAAE,KAAA,EAAO,oBAAA,EAAsB,WAAW,IAAA,CAAK,EAAA,EAAI,aAAa,SAAA,EAAU;AAAA,QAC1E,CAACH,wBAAA,CAAO,EAAE,EAAA,EAAI,EAAA,EAAI,GAAG,CAAA,EAAG,KAAA,EAAO,eAAA,EAAiB,CAAC;AAAA,OACnD;AAAA,IACF,KAAK,OAAA;AACH,MAAA,OAAOG,uBAAA;AAAA,QACL,EAAE,KAAA,EAAO,oBAAA,EAAsB,WAAW,IAAA,CAAK,EAAA,EAAI,aAAa,OAAA,EAAQ;AAAA,QACxE;AAAA,UACEH,wBAAA,CAAO,EAAE,EAAA,EAAI,EAAA,EAAI,GAAG,EAAA,EAAI,KAAA,EAAO,qBAAqB,CAAA;AAAA,UACpDA,wBAAA,CAAO,EAAE,EAAA,EAAI,EAAA,EAAI,GAAG,CAAA,EAAG,KAAA,EAAO,qBAAqB;AAAA;AACrD,OACF;AAAA,IACF,KAAK,QAAA,EAAU;AACb,MAAA,MAAM,CAAA,GAAI,EAAA;AACV,MAAA,OAAOG,uBAAA;AAAA,QACL,EAAE,KAAA,EAAO,oBAAA,EAAsB,WAAW,IAAA,CAAK,EAAA,EAAI,aAAa,QAAA,EAAS;AAAA,QACzE;AAAA,UACEF,yBAAA,CAAQ;AAAA,YACN,MAAA,EAAQ,GAAG,EAAE,CAAA,CAAA,EAAI,KAAK,CAAC,CAAA,CAAA,EAAI,KAAK,CAAC,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,EAAE,IAAI,EAAA,GAAK,CAAC,IAAI,EAAA,GAAK,CAAC,IAAI,EAAE,CAAA,CAAA;AAAA,YACvE,KAAA,EAAO;AAAA,WACR;AAAA;AACH,OACF;AAAA,IACF;AAAA,IACA,KAAK,UAAA;AACH,MAAA,OAAOE,uBAAA;AAAA,QACL,EAAE,KAAA,EAAO,oBAAA,EAAsB,WAAW,IAAA,CAAK,EAAA,EAAI,aAAa,UAAA,EAAW;AAAA,QAC3E,CAACH,wBAAA,CAAO,EAAE,EAAA,EAAI,EAAA,EAAI,GAAG,CAAA,EAAG,KAAA,EAAO,gBAAA,EAAkB,CAAC;AAAA,OACpD;AAAA,IACF,KAAK,MAAA;AAAA,IACL,KAAK,MAAA;AACH,MAAA,OAAOG,uBAAA;AAAA,QACL,EAAE,KAAA,EAAO,oBAAA,EAAsB,WAAW,IAAA,CAAK,EAAA,EAAI,aAAa,CAAA,EAAE;AAAA,QAClE,CAACJ,uBAAK,EAAE,CAAA,EAAG,KAAK,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,CAAA,EAAG,KAAA,EAAO,IAAA,CAAK,OAAO,MAAA,EAAQ,IAAA,CAAK,QAAQ,EAAA,EAAI,CAAA,EAAG,IAAI,CAAA,EAAG,KAAA,EAAO,WAAA,EAAa,CAAC;AAAA,OAC3G;AAAA,IACF,KAAK,SAAA;AACH,MAAA,OAAOI,uBAAA;AAAA,QACL,EAAE,KAAA,EAAO,oBAAA,EAAsB,WAAW,IAAA,CAAK,EAAA,EAAI,aAAa,SAAA,EAAU;AAAA,QAC1E;AAAA,UACEH,wBAAA,CAAO,EAAE,EAAA,EAAI,EAAA,EAAI,GAAG,EAAA,EAAI,KAAA,EAAO,sBAAsB,CAAA;AAAA,UACrDT,sBAAA,CAAK,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,GAAK,CAAA,EAAG,aAAA,EAAe,QAAA,EAAU,KAAA,EAAO,oBAAA,EAAqB,EAAG,GAAG;AAAA;AACtF,OACF;AAAA,IACF,KAAK,UAAA;AACH,MAAA,OAAOY,uBAAA;AAAA,QACL,EAAE,KAAA,EAAO,oBAAA,EAAsB,WAAW,IAAA,CAAK,EAAA,EAAI,aAAa,UAAA,EAAW;AAAA,QAC3E;AAAA,UACEH,wBAAA,CAAO,EAAE,EAAA,EAAI,EAAA,EAAI,GAAG,EAAA,EAAI,KAAA,EAAO,sBAAsB,CAAA;AAAA,UACrDT,sBAAA,CAAK,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,GAAK,CAAA,EAAG,aAAA,EAAe,QAAA,EAAU,KAAA,EAAO,oBAAA,EAAqB,EAAG,IAAI;AAAA;AACvF,OACF;AAAA,IACF,KAAK,WAAA;AACH,MAAA,OAAOY,uBAAA;AAAA,QACL,EAAE,KAAA,EAAO,oBAAA,EAAsB,WAAW,IAAA,CAAK,EAAA,EAAI,aAAa,WAAA,EAAY;AAAA,QAC5E;AAAA,UACEb,uBAAK,EAAE,EAAA,EAAI,EAAA,GAAK,CAAA,EAAG,IAAI,EAAA,GAAK,CAAA,EAAG,EAAA,EAAI,EAAA,GAAK,GAAG,EAAA,EAAI,EAAA,GAAK,CAAA,EAAG,KAAA,EAAO,mBAAmB,CAAA;AAAA,UACjFA,uBAAK,EAAE,EAAA,EAAI,EAAA,GAAK,CAAA,EAAG,IAAI,EAAA,GAAK,CAAA,EAAG,EAAA,EAAI,EAAA,GAAK,GAAG,EAAA,EAAI,EAAA,GAAK,CAAA,EAAG,KAAA,EAAO,mBAAmB;AAAA;AACnF,OACF;AAAA,IACF,KAAK,aAAA;AACH,MAAA,OAAOa,uBAAA;AAAA,QACL,EAAE,KAAA,EAAO,oBAAA,EAAsB,WAAW,IAAA,CAAK,EAAA,EAAI,aAAa,aAAA,EAAc;AAAA,QAC9E,CAACH,wBAAA,CAAO,EAAE,EAAA,EAAI,EAAA,EAAI,GAAG,CAAA,EAAG,KAAA,EAAO,kBAAA,EAAoB,CAAC;AAAA,OACtD;AAAA,IACF,KAAK,YAAA;AACH,MAAA,OAAOG,uBAAA;AAAA,QACL,EAAE,KAAA,EAAO,oBAAA,EAAsB,WAAW,IAAA,CAAK,EAAA,EAAI,aAAa,YAAA,EAAa;AAAA,QAC7E;AAAA,UACEH,wBAAA,CAAO,EAAE,EAAA,EAAI,EAAA,EAAI,GAAG,CAAA,EAAG,KAAA,EAAO,mBAAmB,CAAA;AAAA,UACjDV,uBAAK,EAAE,EAAA,EAAI,EAAA,GAAK,CAAA,EAAG,IAAI,EAAA,GAAK,CAAA,EAAG,EAAA,EAAI,EAAA,GAAK,GAAG,EAAA,EAAI,EAAA,GAAK,CAAA,EAAG,KAAA,EAAO,mBAAmB,CAAA;AAAA,UACjFA,uBAAK,EAAE,EAAA,EAAI,EAAA,GAAK,CAAA,EAAG,IAAI,EAAA,GAAK,CAAA,EAAG,EAAA,EAAI,EAAA,GAAK,GAAG,EAAA,EAAI,EAAA,GAAK,CAAA,EAAG,KAAA,EAAO,mBAAmB;AAAA;AACnF,OACF;AAAA,IACF;AACE,MAAA,OAAO,EAAA;AAAA;AAEb;AAEA,SAAS,WAAW,IAAA,EAA+B;AACjD,EAAA,IAAI,KAAK,IAAA,CAAK,IAAA,KAAS,QAAA,EAAU,OAAO,aAAa,IAAI,CAAA;AACzD,EAAA,OAAO,aAAa,IAAI,CAAA;AAC1B;AAIA,SAAS,WAAW,IAAA,EAA+B;AACjD,EAAA,MAAM,KAAA,GAAkB;AAAA,IACtBY,sBAAA,CAAK;AAAA,MACH,GAAG,IAAA,CAAK,IAAA;AAAA,MACR,KAAA,EAAO,eAAA;AAAA,MACP,YAAA,EAAc,QAAQ,eAAe,CAAA,CAAA,CAAA;AAAA,MACrC,aAAa,IAAA,CAAK,IAAA;AAAA,MAClB,WAAW,IAAA,CAAK;AAAA,KACjB;AAAA,GACH;AACA,EAAA,IAAI,KAAK,KAAA,EAAO;AACd,IAAA,MAAM,CAAA,GAAI,KAAK,GAAA,CAAI,EAAA,EAAI,KAAK,KAAA,CAAM,MAAA,GAAS,MAAM,CAAC,CAAA;AAClD,IAAA,MAAM,MAAA,GAAS,KAAK,WAAA,IAAe,QAAA;AACnC,IAAA,MAAM,EAAA,GAAK,WAAW,OAAA,GAAU,CAAA,GAAI,WAAW,KAAA,GAAQ,CAAC,CAAA,GAAI,CAAC,CAAA,GAAI,CAAA;AACjE,IAAA,KAAA,CAAM,IAAA;AAAA,MACJH,sBAAA,CAAK;AAAA,QACH,CAAA,EAAG,KAAK,MAAA,GAAS,EAAA;AAAA,QACjB,CAAA,EAAG,KAAK,MAAA,GAAS,EAAA;AAAA,QACjB,KAAA,EAAO,CAAA;AAAA,QACP,MAAA,EAAQ,EAAA;AAAA,QACR,EAAA,EAAI,CAAA;AAAA,QACJ,EAAA,EAAI,CAAA;AAAA,QACJ,KAAA,EAAO;AAAA,OACR;AAAA,KACH;AACA,IAAA,KAAA,CAAM,IAAA;AAAA,MACJR,sBAAA;AAAA,QACE;AAAA,UACE,GAAG,IAAA,CAAK,MAAA;AAAA,UACR,GAAG,IAAA,CAAK,MAAA;AAAA,UACR,aAAA,EAAe,MAAA;AAAA,UACf,KAAA,EAAO;AAAA,SACT;AAAA,QACA,IAAA,CAAK;AAAA;AACP,KACF;AAAA,EACF;AACA,EAAA,OAAOY,uBAAA,CAAM,EAAE,KAAA,EAAO,SAAA,EAAW,gBAAgB,IAAA,CAAK,EAAA,IAAM,KAAK,CAAA;AACnE;AAEA,SAAS,WAAW,CAAA,EAA4B;AAC9C,EAAA,MAAM,KAAA,GAAkB;AAAA,IACtBb,sBAAA,CAAK;AAAA,MACH,EAAA,EAAI,EAAE,MAAA,CAAO,EAAA;AAAA,MACb,EAAA,EAAI,EAAE,MAAA,CAAO,EAAA;AAAA,MACb,EAAA,EAAI,EAAE,MAAA,CAAO,EAAA;AAAA,MACb,EAAA,EAAI,EAAE,MAAA,CAAO,EAAA;AAAA,MACb,KAAA,EAAO;AAAA,KACR,CAAA;AAAA,IACDS,sBAAA,CAAK,EAAE,CAAA,EAAG,CAAA,CAAE,GAAG,CAAA,EAAG,CAAA,CAAE,GAAG,KAAA,EAAO,CAAA,CAAE,OAAO,MAAA,EAAQ,CAAA,CAAE,QAAQ,EAAA,EAAI,CAAA,EAAG,IAAI,CAAA,EAAG,KAAA,EAAO,gBAAgB;AAAA,GAChG;AACA,EAAA,IAAI,EAAA,GAAK,EAAE,CAAA,GAAI,EAAA;AACf,EAAA,KAAA,MAAW,EAAA,IAAM,EAAE,KAAA,EAAO;AACxB,IAAA,KAAA,CAAM,IAAA,CAAKR,sBAAA,CAAK,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,KAAA,EAAO,cAAA,EAAe,EAAG,EAAE,CAAC,CAAA;AACjE,IAAA,EAAA,IAAM,EAAA;AAAA,EACR;AACA,EAAA,OAAOY,uBAAA,CAAM,EAAE,KAAA,EAAO,SAAA,EAAW,eAAe,CAAA,CAAE,IAAA,CAAK,MAAA,EAAO,EAAG,KAAK,CAAA;AACxE;AAIO,SAAS,kBAAA,CACd,KACA,OAAA,EACQ;AACR,EAAA,MAAM,MAAA,GAAS,mBAAmB,GAAG,CAAA;AACrC,EAAA,OAAO,aAAa,MAAM,CAAA;AAC5B;AAOA,SAAS,aAAa,MAAA,EAAmC;AACvD,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,KAAA,GACrBZ,sBAAA,CAAK,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,KAAA,EAAO,UAAA,EAAW,EAAG,MAAA,CAAO,KAAK,CAAA,GACtD,EAAA;AAEJ,EAAA,OAAOgB,yBAAA;AAAA,IACL;AAAA,MACE,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,SAAS,CAAA,IAAA,EAAO,MAAA,CAAO,KAAK,CAAA,CAAA,EAAI,OAAO,MAAM,CAAA,CAAA;AAAA,MAC7C,KAAA,EAAO,UAAA;AAAA,MACP,mBAAA,EAAqB;AAAA,KACvB;AAAA,IACA;AAAA,MACED,oBAAA,CAAG,OAAA,EAAS,EAAC,EAAGE,2BAAA,CAAU,CAAA,aAAA,EAAgB,MAAA,CAAO,KAAA,GAAQ,UAAA,GAAQ,MAAA,CAAO,KAAA,GAAQ,EAAE,EAAE,CAAC,CAAA;AAAA,MACrFF,oBAAA,CAAG,MAAA,EAAQ,EAAC,EAAG,kDAAkD,CAAA;AAAA,MACjES,sBAAA,CAAK,CAAC,iBAAA,EAAkB,EAAGT,oBAAA,CAAG,SAAS,EAAC,EAAG,KAAK,CAAC,CAAC,CAAA;AAAA,MAClD,SAAA;AAAA;AAAA,MAEAH,uBAAA,CAAM,EAAE,KAAA,EAAO,aAAA,IAAiB,MAAA,CAAO,QAAA,CAAS,GAAA,CAAI,eAAe,CAAC,CAAA;AAAA,MACpEA,uBAAA,CAAM,EAAE,KAAA,EAAO,iBAAA,IAAqB,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,UAAU,CAAC,CAAA;AAAA,MAChEA,uBAAA,CAAM,EAAE,KAAA,EAAO,UAAA,IAAc,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,UAAU,CAAC,CAAA;AAAA,MACzDA,uBAAA,CAAM,EAAE,KAAA,EAAO,UAAA,IAAc,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,UAAU,CAAC;AAAA;AAC3D,GACF;AACF;;;AClWO,IAAM,KAAA,GAAuB;AAAA,EAClC,IAAA,EAAM,OAAA;AAAA,EACN,OAAOZ,KAAAA,EAAM;AACX,IAAA,OAAO,yCAAA,CAA0C,KAAKA,KAAI,CAAA;AAAA,EAC5D,CAAA;AAAA,EACA,KAAA,EAAO,iBAAA;AAAA,EACP,MAAA,CAAOA,OAAM,MAAA,EAAuB;AAClC,IAAA,MAAM,GAAA,GAAM,kBAAkBA,KAAI,CAAA;AAClC,IAAA,OAAO,kBAAA,CAAmB,GAAW,CAAA;AAAA,EACvC;AACF;;;ACFO,IAAM,aAAA,GAAN,cAA4B,KAAA,CAAM;AAAA,EACvC,WAAA,CAAY,SAAwBD,KAAAA,EAAe;AACjD,IAAA,KAAA,CAAMA,UAAS,MAAA,GAAY,CAAA,KAAA,EAAQA,KAAI,CAAA,EAAA,EAAK,OAAO,KAAK,OAAO,CAAA;AAD7B,IAAA,IAAA,CAAA,IAAA,GAAAA,KAAAA;AAElC,IAAA,IAAA,CAAK,IAAA,GAAO,eAAA;AAAA,EACd;AAAA,EAHoC,IAAA;AAItC,CAAA;AAEA,IAAM,WAAA,uBAAkB,GAAA,CAAkB;AAAA,EACxC,UAAA;AAAA,EAAY,gBAAA;AAAA,EACZ,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,QAAA;AAAA,EACxB,aAAA;AAAA,EAAe,eAAA;AAAA,EACf,eAAA;AAAA,EAAiB,eAAA;AAAA,EAAiB,UAAA;AAAA,EAAY,WAAA;AAAA,EAC9C,kBAAA;AAAA,EAAoB,SAAA;AAAA,EACpB,YAAA;AAAA,EAAc,QAAA;AAAA,EACd,cAAA;AAAA,EAAgB,aAAA;AAAA,EAChB,QAAA;AAAA,EAAU,SAAA;AAAA,EAAW,OAAA;AAAA,EAAS,eAAA;AAAA,EAC9B,YAAA;AAAA,EAAc,YAAA;AAAA,EAAc,aAAA;AAAA,EAAe,iBAAA;AAAA,EAC3C,aAAA;AAAA,EAAe,eAAA;AAAA,EAAiB;AAClC,CAAC,CAAA;AAED,IAAM,UAAA,uBAAiB,GAAA,CAAiB;AAAA,EACtC,SAAA;AAAA,EAAW,eAAA;AAAA,EAAiB,WAAA;AAAA,EAAa,UAAA;AAAA,EACzC,WAAA;AAAA,EAAa,WAAA;AAAA,EAAa,UAAA;AAAA,EAAY;AACxC,CAAC,CAAA;AAED,IAAM,eAAA,uBAAsB,GAAA,CAA2B;AAAA,EACrD,gBAAA;AAAA,EAAkB,cAAA;AAAA,EAAgB,gBAAA;AAAA,EAAkB,WAAA;AAAA,EACpD,aAAA;AAAA,EAAe,WAAA;AAAA,EAAa,aAAA;AAAA,EAAe,QAAA;AAAA,EAC3C,gBAAA;AAAA,EAAkB;AACpB,CAAC,CAAA;AAQD,SAASmB,YAAW,GAAA,EAAwB;AAC1C,EAAA,MAAM,MAAiB,EAAC;AACxB,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA;AAC/B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,GAAA,GAAM,MAAM,CAAC,CAAA;AACnB,IAAA,IAAI,QAAQ,MAAA,EAAW;AACvB,IAAA,IAAI,QAAA,GAAW,EAAA;AACf,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,KAAA,MAAW,MAAM,GAAA,EAAK;AACpB,MAAA,IAAI,EAAA,KAAO,GAAA,EAAK,OAAA,GAAU,CAAC,OAAA;AAC3B,MAAA,IAAI,EAAA,KAAO,GAAA,IAAO,CAAC,OAAA,EAAS;AAC5B,MAAA,QAAA,IAAY,EAAA;AAAA,IACd;AACA,IAAA,MAAM,OAAA,GAAU,SAAS,IAAA,EAAK;AAC9B,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,MAAM,SAAS,QAAA,CAAS,MAAA,GAAS,SAAS,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA,CAAE,MAAA;AAC9D,IAAA,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,OAAA,EAAS,QAAQ,IAAA,EAAM,CAAA,GAAI,GAAG,CAAA;AAAA,EACjD;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAASS,SAAQ,CAAA,EAAmB;AAClC,EAAA,MAAM,CAAA,GAAI,EAAE,IAAA,EAAK;AACjB,EAAA,IAAI,CAAA,CAAE,MAAA,IAAU,CAAA,IAAK,CAAA,CAAE,UAAA,CAAW,GAAG,CAAA,IAAK,CAAA,CAAE,QAAA,CAAS,GAAG,CAAA,EAAG;AAEzD,IAAA,OAAO,EAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CAAE,OAAA,CAAQ,QAAQ,GAAG,CAAA;AAAA,EAC3C;AACA,EAAA,OAAO,CAAA;AACT;AAEA,SAAS,cAAc,MAAA,EAAwC;AAC7D,EAAA,MAAM,MAA8B,EAAC;AACrC,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,KAAA,MAAW,MAAM,MAAA,EAAQ;AACvB,IAAA,IAAI,EAAA,KAAO,GAAA,EAAK,OAAA,GAAU,CAAC,OAAA;AAC3B,IAAA,IAAI,CAAC,OAAA,IAAW,EAAA,KAAO,GAAA,EAAK,KAAA,EAAA;AAC5B,IAAA,IAAI,CAAC,OAAA,IAAW,EAAA,KAAO,GAAA,EAAK,KAAA,EAAA;AAC5B,IAAA,IAAI,CAAC,OAAA,IAAW,KAAA,KAAU,CAAA,IAAK,OAAO,GAAA,EAAK;AACzC,MAAA,KAAA,CAAM,KAAK,GAAG,CAAA;AACd,MAAA,GAAA,GAAM,EAAA;AAAA,IACR,CAAA,MAAO;AACL,MAAA,GAAA,IAAO,EAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,IAAI,GAAA,CAAI,IAAA,EAAK,EAAG,KAAA,CAAM,KAAK,GAAG,CAAA;AAC9B,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,MAAM,GAAA,GAAM,CAAA,CAAE,OAAA,CAAQ,GAAG,CAAA;AACzB,IAAA,IAAI,MAAM,CAAA,EAAG;AACb,IAAA,MAAM,MAAM,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,GAAG,EAAE,IAAA,EAAK;AACjC,IAAA,MAAM,GAAA,GAAMA,SAAQ,CAAA,CAAE,KAAA,CAAM,MAAM,CAAC,CAAA,CAAE,MAAM,CAAA;AAC3C,IAAA,GAAA,CAAI,GAAG,CAAA,GAAI,GAAA;AAAA,EACb;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,aAAa3B,KAAAA,EAA+D;AAEnF,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,IAAI,OAAA,GAAU,EAAA;AACd,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAIA,KAAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,EAAA,GAAKA,MAAK,CAAC,CAAA;AACjB,IAAA,IAAI,EAAA,KAAO,GAAA,EAAK,OAAA,GAAU,CAAC,OAAA;AAC3B,IAAA,IAAI,OAAA,EAAS;AACb,IAAA,IAAI,OAAO,GAAA,EAAK;AACd,MAAA,IAAI,KAAA,KAAU,GAAG,OAAA,GAAU,CAAA;AAC3B,MAAA,KAAA,EAAA;AAAA,IACF,CAAA,MAAA,IAAW,OAAO,GAAA,EAAK;AACrB,MAAA,KAAA,EAAA;AACA,MAAA,IAAI,KAAA,KAAU,CAAA,IAAK,CAAA,KAAMA,KAAAA,CAAK,SAAS,CAAA,EAAG;AACxC,QAAA,MAAM,MAAA,GAASA,KAAAA,CAAK,KAAA,CAAM,OAAA,GAAU,GAAG,CAAC,CAAA;AACxC,QAAA,OAAO;AAAA,UACL,MAAMA,KAAAA,CAAK,KAAA,CAAM,CAAA,EAAG,OAAO,EAAE,IAAA,EAAK;AAAA,UAClC,KAAA,EAAO,cAAc,MAAM;AAAA,SAC7B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,EAAE,IAAA,EAAMA,KAAAA,EAAM,KAAA,EAAO,EAAC,EAAE;AACjC;AAEA,SAAS,YAAY,GAAA,EAAwB;AAC3C,EAAA,MAAM,GAAA,GAAM,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAA;AAC3B,EAAA,IAAI,GAAA,GAAM,CAAA,EAAG,OAAO,EAAE,IAAI,GAAA,EAAI;AAC9B,EAAA,OAAO,EAAE,EAAA,EAAI,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,EAAG,IAAA,EAAM,GAAA,CAAI,KAAA,CAAM,GAAA,GAAM,CAAC,CAAA,EAAE;AAC3D;AA8BO,SAAS,SAAS,GAAA,EAAqB;AAC5C,EAAA,MAAM,KAAA,GAAQkB,YAAW,GAAG,CAAA;AAC5B,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,MAAM,IAAI,cAAc,gBAAgB,CAAA;AAAA,EAC1C;AAEA,EAAA,MAAM,MAAA,GAAS,MAAM,CAAC,CAAA;AACtB,EAAA,IAAI,CAAC,SAAA,CAAU,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA,EAAG;AAChC,IAAA,MAAM,IAAI,aAAA,CAAc,CAAA,4BAAA,EAA+B,OAAO,IAAI,CAAA,CAAA,CAAA,EAAK,OAAO,IAAI,CAAA;AAAA,EACpF;AAEA,EAAA,IAAIjB,MAAAA;AACJ,EAAA,IAAI,SAAA,GAA0B,IAAA;AAG9B,EAAA,MAAM,aAAa,MAAA,CAAO,IAAA,CAAK,QAAQ,SAAA,EAAW,EAAE,EAAE,IAAA,EAAK;AAC3D,EAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAO,WAAA,EAAY,GAAI,aAAa,UAAU,CAAA;AAC5D,EAAA,IAAI,WAAA,CAAY,SAAA,KAAc,IAAA,EAAM,SAAA,GAAY,IAAA;AAChD,EAAA,IAAI,WAAA,CAAY,SAAA,KAAc,IAAA,EAAM,SAAA,GAAY,IAAA;AAChD,EAAA,IAAI,IAAA,EAAMA,MAAAA,GAAQ0B,QAAAA,CAAQ,IAAI,CAAA;AAE9B,EAAA,MAAM,YAA4B,EAAC;AACnC,EAAA,MAAM,WAAsB,EAAC;AAC7B,EAAA,MAAM,cAA+B,EAAC;AAKtC,EAAA,IAAI,WAAA;AAEJ,EAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,KAAA,CAAM,QAAQ,GAAA,EAAA,EAAO;AAC3C,IAAA,MAAM,EAAA,GAAK,MAAM,GAAG,CAAA;AACpB,IAAA,MAAM3B,QAAO,EAAA,CAAG,IAAA;AAGhB,IAAA,MAAM,aAAA,GAAgBA,KAAAA,CAAK,KAAA,CAAM,mBAAmB,CAAA;AACpD,IAAA,IAAI,iBAAiB,WAAA,EAAa;AAChC,MAAA,WAAA,CAAY,QAAA,GAAW,aAAA,CAAc,CAAC,CAAA,CAAE,IAAA,EAAK;AAC7C,MAAA;AAAA,IACF;AACA,IAAA,MAAM,aAAA,GAAgBA,KAAAA,CAAK,KAAA,CAAM,mBAAmB,CAAA;AACpD,IAAA,IAAI,iBAAiB,WAAA,EAAa;AAChC,MAAA,WAAA,CAAY,QAAA,GAAW,aAAA,CAAc,CAAC,CAAA,CAAE,IAAA,EAAK;AAC7C,MAAA;AAAA,IACF;AAEA,IAAA,WAAA,GAAc,MAAA;AAGd,IAAA,MAAM,UAAA,GAAaA,KAAAA,CAAK,KAAA,CAAM,+CAA+C,CAAA;AAC7E,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAM,EAAA,GAAK,WAAW,CAAC,CAAA;AACvB,MAAA,MAAM,IAAA,GAAO,WAAW,CAAC,CAAA;AACzB,MAAA,MAAM,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAM,GAAI,aAAa,IAAI,CAAA;AACnD,MAAA,MAAM,SAAA,GAAY,SAAS,IAAA,EAAK;AAChC,MAAA,IAAI,CAAC,WAAA,CAAY,GAAA,CAAI,SAAS,CAAA,EAAG;AAC/B,QAAA,MAAM,IAAI,aAAA,CAAc,CAAA,wBAAA,EAA2B,SAAS,CAAA,CAAA,CAAA,EAAK,GAAG,IAAI,CAAA;AAAA,MAC1E;AACA,MAAA,SAAA,CAAU,IAAA,CAAK;AAAA,QACb,EAAA;AAAA,QACA,SAAA;AAAA,QACA,GAAA,EAAK,MAAM,GAAA,IAAO,EAAA;AAAA,QAClB;AAAA,OACD,CAAA;AACD,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,SAAA,GAAYA,KAAAA,CAAK,KAAA,CAAM,8DAA8D,CAAA;AAC3F,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,MAAM,EAAA,GAAK,UAAU,CAAC,CAAA;AACtB,MAAA,MAAM,OAAA,GAAU,UAAU,CAAC,CAAA;AAC3B,MAAA,MAAM,KAAA,GAAQ,UAAU,CAAC,CAAA;AACzB,MAAA,MAAM,IAAA,GAAO,UAAU,CAAC,CAAA;AACxB,MAAA,MAAM,EAAE,KAAA,EAAM,GAAI,YAAA,CAAa,IAAI,CAAA;AACnC,MAAA,MAAM,EAAA,GAAM,MAAM,IAAA,IAAQ,SAAA;AAC1B,MAAA,IAAI,CAAC,UAAA,CAAW,GAAA,CAAI,EAAE,CAAA,EAAG;AACvB,QAAA,MAAM,IAAI,aAAA,CAAc,CAAA,mBAAA,EAAsB,EAAE,CAAA,CAAA,CAAA,EAAK,GAAG,IAAI,CAAA;AAAA,MAC9D;AACA,MAAA,QAAA,CAAS,IAAA,CAAK;AAAA,QACZ,EAAA;AAAA,QACA,IAAA,EAAM,YAAY,OAAO,CAAA;AAAA,QACzB,EAAA,EAAI,YAAY,KAAK,CAAA;AAAA,QACrB,QAAA,EAAU,EAAA;AAAA,QACV,KAAK,KAAA,CAAM,GAAA;AAAA,QACX,MAAM,KAAA,CAAM,IAAA;AAAA,QACZ,SAAS,KAAA,CAAM,OAAA;AAAA,QACf;AAAA,OACD,CAAA;AAED,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,SAAA,GAAYA,KAAAA,CAAK,KAAA,CAAM,mDAAmD,CAAA;AAChF,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,MAAM,GAAA,GAAM,UAAU,CAAC,CAAA;AACvB,MAAA,MAAM,EAAE,MAAM,OAAA,EAAS,KAAA,KAAU,YAAA,CAAa,SAAA,CAAU,CAAC,CAAC,CAAA;AAC1D,MAAA,MAAM,QAAA,GAAW,QAAQ,IAAA,EAAK;AAC9B,MAAA,IAAI,CAAC,eAAA,CAAgB,GAAA,CAAI,QAAQ,CAAA,EAAG;AAClC,QAAA,MAAM,IAAI,aAAA,CAAc,CAAA,6BAAA,EAAgC,QAAQ,CAAA,CAAA,CAAA,EAAK,GAAG,IAAI,CAAA;AAAA,MAC9E;AACA,MAAA,MAAM,IAAA,GAAsB;AAAA,QAC1B,GAAA;AAAA,QACA,QAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,WAAA,CAAY,KAAK,IAAI,CAAA;AACrB,MAAA,WAAA,GAAc,IAAA;AACd,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAI,aAAA,CAAc,CAAA,kBAAA,EAAqBA,KAAI,CAAA,CAAA,EAAI,GAAG,IAAI,CAAA;AAAA,EAC9D;AAMA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,KAAA;AAAA,IACN,KAAA,EAAAC,MAAAA;AAAA,IACA,SAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA,EAAO,QAAA;AAAA,IACP;AAAA,GACF;AACF;;;AC9QO,IAAM,QAAA,GAAiD;AAAA;AAAA,EAE5D,QAAA,EAAU;AAAA,IACR,KAAA,EAAO,EAAA;AAAA,IACP,MAAA,EAAQ,EAAA;AAAA,IACR,KAAA,EAAO;AAAA,MACL,GAAA,EAAK,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,GAAA,EAAI;AAAA,MACpB,MAAA,EAAQ,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,EAAA,EAAG;AAAA,MACtB,IAAA,EAAM,EAAE,CAAA,EAAG,GAAA,EAAK,GAAG,CAAA,EAAE;AAAA,MACrB,KAAA,EAAO,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,CAAA,EAAE;AAAA,MACrB,EAAA,EAAI,EAAE,CAAA,EAAG,GAAA,EAAK,GAAG,CAAA,EAAE;AAAA,MACnB,GAAA,EAAK,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,CAAA;AAAE;AACrB,GACF;AAAA,EACA,cAAA,EAAgB;AAAA,IACd,KAAA,EAAO,EAAA;AAAA,IACP,MAAA,EAAQ,GAAA;AAAA,IACR,KAAA,EAAO;AAAA,MACL,GAAA,EAAK,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,GAAA,EAAI;AAAA,MACpB,MAAA,EAAQ,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,EAAA,EAAG;AAAA,MACtB,IAAA,EAAM,EAAE,CAAA,EAAG,GAAA,EAAK,GAAG,CAAA,EAAE;AAAA,MACrB,KAAA,EAAO,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,CAAA;AAAE;AACvB,GACF;AAAA,EACA,QAAA,EAAU;AAAA,IACR,KAAA,EAAO,EAAA;AAAA,IACP,MAAA,EAAQ,GAAA;AAAA,IACR,KAAA,EAAO;AAAA,MACL,GAAA,EAAK,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,GAAA,EAAI;AAAA,MACpB,MAAA,EAAQ,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,EAAA,EAAG;AAAA,MACtB,IAAA,EAAM,EAAE,CAAA,EAAG,GAAA,EAAK,GAAG,CAAA,EAAE;AAAA,MACrB,KAAA,EAAO,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,CAAA,EAAE;AAAA,MACrB,EAAA,EAAI,EAAE,CAAA,EAAG,GAAA,EAAK,GAAG,GAAA,EAAI;AAAA,MACrB,GAAA,EAAK,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA;AAAG;AACtB,GACF;AAAA,EACA,QAAA,EAAU;AAAA,IACR,KAAA,EAAO,GAAA;AAAA,IACP,MAAA,EAAQ,EAAA;AAAA,IACR,KAAA,EAAO;AAAA,MACL,GAAA,EAAK,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,GAAA,EAAI;AAAA,MACpB,MAAA,EAAQ,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,EAAA,EAAG;AAAA,MACtB,IAAA,EAAM,EAAE,CAAA,EAAG,GAAA,EAAK,GAAG,CAAA,EAAE;AAAA,MACrB,KAAA,EAAO,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,CAAA,EAAE;AAAA,MACrB,EAAA,EAAI,EAAE,CAAA,EAAG,GAAA,EAAK,GAAG,CAAA,EAAE;AAAA,MACnB,GAAA,EAAK,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,CAAA;AAAE;AACrB,GACF;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,KAAA,EAAO,EAAA;AAAA,IACP,MAAA,EAAQ,EAAA;AAAA,IACR,KAAA,EAAO;AAAA,MACL,GAAA,EAAK,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,GAAA,EAAI;AAAA,MACpB,MAAA,EAAQ,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,EAAA,EAAG;AAAA,MACtB,IAAA,EAAM,EAAE,CAAA,EAAG,GAAA,EAAK,GAAG,CAAA,EAAE;AAAA,MACrB,KAAA,EAAO,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,CAAA;AAAE;AACvB,GACF;AAAA,EACA,WAAA,EAAa;AAAA,IACX,KAAA,EAAO,EAAA;AAAA,IACP,MAAA,EAAQ,GAAA;AAAA,IACR,KAAA,EAAO;AAAA,MACL,GAAA,EAAK,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,GAAA,EAAI;AAAA,MACpB,MAAA,EAAQ,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,EAAA,EAAG;AAAA,MACtB,IAAA,EAAM,EAAE,CAAA,EAAG,GAAA,EAAK,GAAG,CAAA,EAAE;AAAA,MACrB,MAAA,EAAQ,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,GAAA,EAAI;AAAA,MACvB,aAAA,EAAe,EAAE,CAAA,EAAG,GAAA,EAAK,GAAG,EAAA,EAAG;AAAA,MAC/B,SAAA,EAAW,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,GAAA,EAAI;AAAA,MAC1B,UAAA,EAAY,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,EAAA;AAAG;AAC5B,GACF;AAAA,EACA,aAAA,EAAe;AAAA,IACb,KAAA,EAAO,EAAA;AAAA,IACP,MAAA,EAAQ,GAAA;AAAA,IACR,KAAA,EAAO;AAAA,MACL,GAAA,EAAK,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,GAAA,EAAI;AAAA,MACpB,MAAA,EAAQ,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,EAAA,EAAG;AAAA,MACtB,IAAA,EAAM,EAAE,CAAA,EAAG,GAAA,EAAK,GAAG,CAAA;AAAE;AACvB,GACF;AAAA,EACA,aAAA,EAAe;AAAA,IACb,KAAA,EAAO,GAAA;AAAA,IACP,MAAA,EAAQ,EAAA;AAAA,IACR,KAAA,EAAO;AAAA,MACL,QAAA,EAAU,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,GAAA,EAAI;AAAA,MACzB,SAAA,EAAW,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,EAAA,EAAG;AAAA,MACzB,OAAA,EAAS,EAAE,CAAA,EAAG,GAAA,EAAK,GAAG,CAAA,EAAE;AAAA,MACxB,QAAA,EAAU,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,CAAA,EAAE;AAAA,MACxB,EAAA,EAAI,EAAE,CAAA,EAAG,GAAA,EAAK,GAAG,CAAA,EAAE;AAAA,MACnB,GAAA,EAAK,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,CAAA;AAAE;AACrB,GACF;AAAA,EACA,aAAA,EAAe;AAAA,IACb,KAAA,EAAO,GAAA;AAAA,IACP,MAAA,EAAQ,EAAA;AAAA,IACR,KAAA,EAAO;AAAA,MACL,EAAA,EAAI,EAAE,CAAA,EAAG,GAAA,EAAK,GAAG,EAAA,EAAG;AAAA,MACpB,GAAA,EAAK,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA;AAAG;AACtB,GACF;AAAA,EACA,QAAA,EAAU;AAAA,IACR,KAAA,EAAO,GAAA;AAAA,IACP,MAAA,EAAQ,EAAA;AAAA,IACR,KAAA,EAAO;AAAA,MACL,EAAA,EAAI,EAAE,CAAA,EAAG,GAAA,EAAK,GAAG,CAAA,EAAE;AAAA,MACnB,GAAA,EAAK,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,CAAA,EAAE;AAAA,MACnB,MAAA,EAAQ,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,EAAA;AAAG;AACxB,GACF;AAAA,EACA,SAAA,EAAW;AAAA,IACT,KAAA,EAAO,GAAA;AAAA,IACP,MAAA,EAAQ,EAAA;AAAA,IACR,KAAA,EAAO;AAAA,MACL,QAAA,EAAU,EAAE,CAAA,EAAG,GAAA,EAAK,GAAG,GAAA,EAAI;AAAA,MAC3B,SAAA,EAAW,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA,EAAG;AAAA,MAC1B,OAAA,EAAS,EAAE,CAAA,EAAG,GAAA,EAAK,GAAG,CAAA,EAAE;AAAA,MACxB,QAAA,EAAU,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,CAAA,EAAE;AAAA,MACxB,EAAA,EAAI,EAAE,CAAA,EAAG,GAAA,EAAK,GAAG,CAAA,EAAE;AAAA,MACnB,GAAA,EAAK,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,CAAA;AAAE;AACrB,GACF;AAAA,EACA,gBAAA,EAAkB;AAAA,IAChB,KAAA,EAAO,EAAA;AAAA,IACP,MAAA,EAAQ,EAAA;AAAA,IACR,KAAA,EAAO;AAAA,MACL,EAAA,EAAI,EAAE,CAAA,EAAG,GAAA,EAAK,GAAG,CAAA,EAAE;AAAA,MACnB,GAAA,EAAK,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,GAAA,EAAI;AAAA,MACrB,GAAA,EAAK,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,GAAA,EAAI;AAAA,MACrB,IAAA,EAAM,EAAE,CAAA,EAAG,GAAA,EAAK,GAAG,CAAA,EAAE;AAAA,MACrB,KAAA,EAAO,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,GAAA;AAAI;AACzB,GACF;AAAA,EACA,OAAA,EAAS;AAAA,IACP,KAAA,EAAO,EAAA;AAAA,IACP,MAAA,EAAQ,EAAA;AAAA,IACR,KAAA,EAAO;AAAA,MACL,EAAA,EAAI,EAAE,CAAA,EAAG,GAAA,EAAK,GAAG,CAAA,EAAE;AAAA,MACnB,GAAA,EAAK,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,CAAA;AAAE;AACrB,GACF;AAAA,EACA,UAAA,EAAY;AAAA,IACV,KAAA,EAAO,EAAA;AAAA,IACP,MAAA,EAAQ,EAAA;AAAA,IACR,KAAA,EAAO;AAAA,MACL,EAAA,EAAI,EAAE,CAAA,EAAG,GAAA,EAAK,GAAG,CAAA,EAAE;AAAA,MACnB,GAAA,EAAK,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,CAAA;AAAE;AACrB,GACF;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,KAAA,EAAO,EAAA;AAAA,IACP,MAAA,EAAQ,EAAA;AAAA,IACR,KAAA,EAAO;AAAA,MACL,EAAA,EAAI,EAAE,CAAA,EAAG,GAAA,EAAK,GAAG,CAAA,EAAE;AAAA,MACnB,GAAA,EAAK,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,CAAA;AAAE;AACrB,GACF;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,KAAA,EAAO,EAAA;AAAA,IACP,MAAA,EAAQ,GAAA;AAAA,IACR,KAAA,EAAO;AAAA,MACL,GAAA,EAAK,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,GAAA,EAAI;AAAA,MACpB,MAAA,EAAQ,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,EAAA,EAAG;AAAA,MACtB,EAAA,EAAI,EAAE,CAAA,EAAG,GAAA,EAAK,GAAG,GAAA,EAAI;AAAA,MACrB,GAAA,EAAK,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,EAAA;AAAG;AACrB,GACF;AAAA,EACA,WAAA,EAAa;AAAA,IACX,KAAA,EAAO,GAAA;AAAA,IACP,MAAA,EAAQ,EAAA;AAAA,IACR,KAAA,EAAO;AAAA,MACL,EAAA,EAAI,EAAE,CAAA,EAAG,GAAA,EAAK,GAAG,CAAA,EAAE;AAAA,MACnB,GAAA,EAAK,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,CAAA;AAAE;AACrB,GACF;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,KAAA,EAAO,EAAA;AAAA,IACP,MAAA,EAAQ,EAAA;AAAA,IACR,KAAA,EAAO;AAAA,MACL,EAAA,EAAI,EAAE,CAAA,EAAG,GAAA,EAAK,GAAG,CAAA,EAAE;AAAA,MACnB,GAAA,EAAK,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,CAAA;AAAE;AACrB,GACF;AAAA,EACA,OAAA,EAAS;AAAA,IACP,KAAA,EAAO,EAAA;AAAA,IACP,MAAA,EAAQ,GAAA;AAAA,IACR,KAAA,EAAO;AAAA,MACL,GAAA,EAAK,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,GAAA,EAAI;AAAA,MACpB,EAAA,EAAI,EAAE,CAAA,EAAG,GAAA,EAAK,GAAG,GAAA,EAAI;AAAA,MACrB,MAAA,EAAQ,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,EAAA,EAAG;AAAA,MACtB,GAAA,EAAK,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,GAAA;AAAI;AACtB,GACF;AAAA,EACA,KAAA,EAAO;AAAA,IACL,KAAA,EAAO,EAAA;AAAA,IACP,MAAA,EAAQ,GAAA;AAAA,IACR,KAAA,EAAO;AAAA,MACL,GAAA,EAAK,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,GAAA,EAAI;AAAA,MACpB,MAAA,EAAQ,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,EAAA,EAAG;AAAA,MACtB,EAAA,EAAI,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,EAAA;AAAG;AACpB,GACF;AAAA,EACA,aAAA,EAAe;AAAA,IACb,KAAA,EAAO,GAAA;AAAA,IACP,MAAA,EAAQ,EAAA;AAAA,IACR,KAAA,EAAO;AAAA,MACL,GAAA,EAAK,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,GAAA,EAAI;AAAA,MACpB,EAAA,EAAI,EAAE,CAAA,EAAG,GAAA,EAAK,GAAG,CAAA,EAAE;AAAA,MACnB,GAAA,EAAK,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,CAAA;AAAE;AACrB,GACF;AAAA;AAAA,EAGA,UAAA,EAAY;AAAA,IACV,KAAA,EAAO,EAAA;AAAA,IACP,MAAA,EAAQ,EAAA;AAAA,IACR,KAAA,EAAO,EAAE,EAAA,EAAI,EAAE,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,CAAA,EAAE,EAAG,GAAA,EAAK,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,CAAA,EAAE,EAAG,IAAA,EAAM,EAAE,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,CAAA,EAAE,EAAG,KAAA,EAAO,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,GAAE;AAAE,GACtG;AAAA,EACA,UAAA,EAAY;AAAA,IACV,KAAA,EAAO,EAAA;AAAA,IACP,MAAA,EAAQ,EAAA;AAAA,IACR,KAAA,EAAO,EAAE,EAAA,EAAI,EAAE,GAAG,GAAA,EAAK,CAAA,EAAG,CAAA,EAAE,EAAG,KAAK,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,GAAE;AAAE,GACtD;AAAA,EACA,WAAA,EAAa;AAAA,IACX,KAAA,EAAO,EAAA;AAAA,IACP,MAAA,EAAQ,EAAA;AAAA,IACR,KAAA,EAAO,EAAE,EAAA,EAAI,EAAE,GAAG,GAAA,EAAK,CAAA,EAAG,CAAA,EAAE,EAAG,KAAK,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,GAAE;AAAE,GACtD;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,KAAA,EAAO,EAAA;AAAA,IACP,MAAA,EAAQ,EAAA;AAAA,IACR,KAAA,EAAO,EAAE,EAAA,EAAI,EAAE,GAAG,GAAA,EAAK,CAAA,EAAG,CAAA,EAAE,EAAG,KAAK,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,GAAE;AAAE,GACtD;AAAA,EACA,WAAA,EAAa;AAAA,IACX,KAAA,EAAO,EAAA;AAAA,IACP,MAAA,EAAQ,EAAA;AAAA,IACR,KAAA,EAAO,EAAE,EAAA,EAAI,EAAE,GAAG,GAAA,EAAK,CAAA,EAAG,CAAA,EAAE,EAAG,KAAK,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,GAAE;AAAE,GACtD;AAAA,EACA,aAAA,EAAe;AAAA,IACb,KAAA,EAAO,EAAA;AAAA,IACP,MAAA,EAAQ,EAAA;AAAA,IACR,KAAA,EAAO,EAAE,EAAA,EAAI,EAAE,GAAG,GAAA,EAAK,CAAA,EAAG,EAAA,EAAG,EAAG,GAAA,EAAK,EAAE,GAAG,EAAA,EAAI,CAAA,EAAG,IAAG,EAAG,GAAA,EAAK,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAA,EAAI;AAAE,GAC/E;AAAA,EACA,SAAA,EAAW;AAAA,IACT,KAAA,EAAO,EAAA;AAAA,IACP,MAAA,EAAQ,EAAA;AAAA,IACR,KAAA,EAAO,EAAE,EAAA,EAAI,EAAE,GAAG,GAAA,EAAK,CAAA,EAAG,EAAA,EAAG,EAAG,KAAK,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,IAAG;AAAE;AAE1D;AAIA,IAAM,YAAA,GAAe,SAAA;AACrB,IAAM,UAAA,GAAa,SAAA;AAEnB,SAAS,MAAA,GAAiB;AAExB,EAAA,OAAOS,yBAAA,CAAQ;AAAA,IACb,MAAA,EAAQ,qCAAA;AAAA,IACR,KAAA,EAAO;AAAA,GACR,CAAA;AACH;AAEO,SAAS,WAAA,CAAY,MAAoB,KAAA,EAAuB;AACrE,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,UAAA,EAAY;AACf,MAAA,MAAM,CAAA,GAAI,EAAA;AACV,MAAA,MAAM,CAAA,GAAI,EAAA;AACV,MAAA,MAAM,MAAA,GAAS,CAAC,CAAA,GAAI,CAAA,GAAI,EAAA;AACxB,MAAA,MAAM,KAAA,GAAQ;AAAA;AAAA,QAEZC,sBAAA,CAAK;AAAA,UACH,CAAA,EAAG,CAAA,EAAA,EAAK,CAAC,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,MAAM,CAAA,GAAA,EAAM,CAAA,GAAI,CAAC,CAAA,UAAA,EAAa,CAAA,GAAI,CAAC,IAAI,MAAM,CAAA,CAAA;AAAA,UAC/D,KAAA,EAAO;AAAA,SACR,CAAA;AAAA;AAAA,QAEDH,sBAAA,CAAK;AAAA,UACH,CAAA,EAAG,CAAC,CAAA,GAAI,CAAA;AAAA,UACR,CAAA,EAAG,MAAA;AAAA,UACH,KAAA,EAAO,CAAA;AAAA,UACP,QAAQ,CAAA,GAAI,EAAA;AAAA,UACZ,KAAA,EAAO;AAAA,SACR,CAAA;AAAA;AAAA,QAEDR,sBAAA;AAAA,UACE,EAAE,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,aAAA,EAAe,QAAA,EAAU,OAAO,kBAAA,EAAmB;AAAA,UACjE;AAAA;AACF,OACF;AACA,MAAA,OAAOY,uBAAA,CAAM,EAAE,KAAA,EAAO,oBAAA,IAAwB,KAAK,CAAA;AAAA,IACrD;AAAA,IACA,KAAK,gBAAA,EAAkB;AACrB,MAAA,MAAM,CAAA,GAAI,EAAA;AACV,MAAA,MAAM,CAAA,GAAI,GAAA;AACV,MAAA,MAAM,KAAA,GAAQ,EAAA;AACd,MAAA,MAAM,GAAA,GAAM,CAAC,CAAA,GAAI,CAAA;AACjB,MAAA,OAAOA,uBAAA,CAAM,EAAC,EAAG;AAAA,QACfF,yBAAA,CAAQ;AAAA,UACN,MAAA,EAAQ,CAAA,EAAG,CAAC,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,GAAA,GAAM,KAAK,CAAA,GAAA,EAAM,GAAG,CAAA,CAAA,EAAI,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,MAAM,KAAK,CAAA,CAAA;AAAA,UACjE,KAAA,EAAO;AAAA,SACR,CAAA;AAAA,QACDF,sBAAA,CAAK;AAAA,UACH,CAAA,EAAG,CAAC,CAAA,GAAI,CAAA;AAAA,UACR,GAAG,GAAA,GAAM,KAAA;AAAA,UACT,KAAA,EAAO,CAAA;AAAA,UACP,QAAQ,CAAA,GAAI,KAAA;AAAA,UACZ,KAAA,EAAO;AAAA,SACR,CAAA;AAAA,QACDR,sBAAA,CAAK,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,aAAA,EAAe,QAAA,EAAU,KAAA,EAAO,kBAAA,EAAmB,EAAG,KAAK;AAAA,OAC/E,CAAA;AAAA,IACH;AAAA,IACA,KAAK,UAAA,EAAY;AACf,MAAA,MAAM,CAAA,GAAI,EAAA;AACV,MAAA,MAAM,CAAA,GAAI,GAAA;AACV,MAAA,MAAM,KAAA,GAAQ,EAAA;AACd,MAAA,MAAM,GAAA,GAAM,CAAC,CAAA,GAAI,CAAA;AACjB,MAAA,MAAM,MAAM,CAAA,GAAI,CAAA;AAChB,MAAA,OAAOY,uBAAA,CAAM,EAAC,EAAG;AAAA,QACfD,sBAAA,CAAK;AAAA,UACH,GAAG,CAAA,EAAA,EAAK,CAAC,IAAI,CAAC,CAAA,CAAA,EAAI,MAAM,KAAK;AAAA,gBAAA,EACrB,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,KAAK,UAAU,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,GAAA,GAAM,KAAK;AAAA,gBAAA,EAC5C,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,GAAA,GAAM,KAAK;AAAA,gBAAA,EACpB,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,KAAK,CAAA,OAAA,EAAU,CAAC,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,GAAA,GAAM,KAAK;AAAA,eAAA,CAAA;AAAA,UAErD,KAAA,EAAO;AAAA,SACR,CAAA;AAAA,QACDX,sBAAA;AAAA,UACE,EAAE,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,aAAA,EAAe,QAAA,EAAU,OAAO,kBAAA,EAAmB;AAAA,UACjE;AAAA;AACF,OACD,CAAA;AAAA,IACH;AAAA,IACA,KAAK,UAAA,EAAY;AACf,MAAA,MAAM,CAAA,GAAI,GAAA;AACV,MAAA,MAAM,CAAA,GAAI,EAAA;AACV,MAAA,MAAM,KAAA,GAAQ,EAAA;AACd,MAAA,MAAM,IAAA,GAAO,CAAC,CAAA,GAAI,CAAA;AAClB,MAAA,MAAM,QAAQ,CAAA,GAAI,CAAA;AAClB,MAAA,OAAOY,uBAAA,CAAM,EAAC,EAAG;AAAA,QACfD,sBAAA,CAAK;AAAA,UACH,GAAG,CAAA,EAAA,EAAK,IAAA,GAAO,KAAK,CAAA,CAAA,EAAI,CAAC,IAAI,CAAC;AAAA,gBAAA,EACtB,KAAA,GAAQ,KAAK,CAAA,CAAA,EAAI,CAAC,IAAI,CAAC;AAAA,gBAAA,EACvB,KAAK,IAAI,CAAA,GAAI,CAAC,UAAU,KAAA,GAAQ,KAAK,CAAA,CAAA,EAAI,CAAA,GAAI,CAAC;AAAA,gBAAA,EAC9C,IAAA,GAAO,KAAK,CAAA,CAAA,EAAI,CAAA,GAAI,CAAC;AAAA,gBAAA,EACrB,KAAK,CAAA,CAAA,EAAI,CAAA,GAAI,CAAC,CAAA,OAAA,EAAU,OAAO,KAAK,CAAA,CAAA,EAAI,CAAC,CAAA,GAAI,CAAC;AAAA,eAAA,CAAA;AAAA,UAEtD,KAAA,EAAO;AAAA,SACR,CAAA;AAAA,QACDX,sBAAA;AAAA,UACE,EAAE,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,aAAA,EAAe,QAAA,EAAU,OAAO,kBAAA,EAAmB;AAAA,UACjE;AAAA;AACF,OACD,CAAA;AAAA,IACH;AAAA,IACA,KAAK,QAAA,EAAU;AACb,MAAA,OAAOY,uBAAA,CAAM,EAAC,EAAG;AAAA,QACfH,wBAAA,CAAO,EAAE,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,GAAG,CAAA,EAAG,EAAA,EAAI,KAAA,EAAO,cAAA,EAAgB,CAAA;AAAA,QACrDT,sBAAA,CAAK,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,aAAA,EAAe,QAAA,EAAU,KAAA,EAAO,kBAAA,EAAmB,EAAG,KAAK;AAAA,OAC/E,CAAA;AAAA,IACH;AAAA,IACA,KAAK,aAAA,EAAe;AAClB,MAAA,MAAM,CAAA,GAAI,EAAA;AACV,MAAA,MAAM,CAAA,GAAI,GAAA;AACV,MAAA,MAAM,KAAA,GAAQ,EAAA;AACd,MAAA,MAAM,KAAA,GAAQ,EAAA;AACd,MAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,GAAQ,CAAA;AAC1B,MAAA,MAAM,WAAA,GAAc,SAAS,KAAA,GAAQ,CAAA,CAAA;AACrC,MAAA,MAAM,YAAsB,EAAC;AAC7B,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,KAAA,EAAO,CAAA,EAAA,EAAK;AAC/B,QAAA,MAAM,CAAA,GAAI,CAAC,CAAA,GAAI,CAAA,GAAI,QAAQ,WAAA,GAAc,CAAA;AACzC,QAAA,SAAA,CAAU,IAAA;AAAA,UACRD,sBAAA,CAAK;AAAA,YACH,EAAA,EAAI,CAAC,CAAA,GAAI,CAAA,GAAI,CAAA;AAAA,YACb,EAAA,EAAI,CAAA;AAAA,YACJ,EAAA,EAAI,IAAI,CAAA,GAAI,CAAA;AAAA,YACZ,EAAA,EAAI,CAAA;AAAA,YACJ,KAAA,EAAO;AAAA,WACR;AAAA,SACH;AAAA,MACF;AACA,MAAA,OAAOa,uBAAA,CAAM,EAAC,EAAG;AAAA,QACfD,sBAAA,CAAK;AAAA,UACH,CAAA,EAAG,KAAK,CAAC,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,GAAI,CAAA,GAAI,KAAK;AAAA,gBAAA,EACxB,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,KAAK,CAAA,OAAA,EAAU,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,GAAI,CAAA,GAAI,KAAK;AAAA,gBAAA,EAC/C,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,CAAA,GAAI,IAAI,KAAK;AAAA,gBAAA,EACtB,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,KAAK,CAAA,OAAA,EAAU,CAAC,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,CAAA,GAAI,CAAA,GAAI,KAAK;AAAA,eAAA,CAAA;AAAA,UAEvD,KAAA,EAAO;AAAA,SACR,CAAA;AAAA,QACD,GAAG,SAAA;AAAA,QACHX,sBAAA;AAAA,UACE;AAAA,YACE,CAAA,EAAG,CAAA;AAAA,YACH,CAAA,EAAG,CAAC,CAAA,GAAI,CAAA,GAAI,CAAA;AAAA,YACZ,aAAA,EAAe,QAAA;AAAA,YACf,KAAA,EAAO;AAAA,WACT;AAAA,UACA;AAAA;AACF,OACD,CAAA;AAAA,IACH;AAAA,IACA,KAAK,eAAA,EAAiB;AACpB,MAAA,MAAM,CAAA,GAAI,EAAA;AACV,MAAA,MAAM,CAAA,GAAI,GAAA;AACV,MAAA,MAAM,KAAA,GAAQ,EAAA;AAEd,MAAA,MAAM,UAAUW,sBAAA,CAAK;AAAA,QACnB,CAAA,EAAG,CAAA,EAAA,EAAK,CAAC,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,GAAI,CAAA,GAAI,KAAA,GAAQ,CAAC;AAAA,cAAA,EAChC,IAAI,CAAA,GAAI,CAAC,IAAI,CAAA,GAAI,CAAA,GAAI,QAAQ,CAAC;AAAA,cAAA,EAC9B,CAAA,GAAI,IAAI,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,GAAI,CAAA,GAAI,QAAQ,CAAC;AAAA,cAAA,EAC/B,CAAC,IAAI,CAAA,GAAI,CAAC,IAAI,CAAA,GAAI,CAAA,GAAI,QAAQ,CAAC,CAAA,CAAA;AAAA,QACvC,KAAA,EAAO;AAAA,OACR,CAAA;AACD,MAAA,OAAOC,uBAAA,CAAM,EAAC,EAAG;AAAA,QACfD,sBAAA,CAAK;AAAA,UACH,CAAA,EAAG,KAAK,CAAC,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,GAAI,CAAA,GAAI,KAAK;AAAA,gBAAA,EACxB,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,KAAK,CAAA,OAAA,EAAU,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,GAAI,CAAA,GAAI,KAAK;AAAA,gBAAA,EAC/C,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,CAAA,GAAI,IAAI,KAAK;AAAA,gBAAA,EACtB,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,KAAK,CAAA,OAAA,EAAU,CAAC,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,CAAA,GAAI,CAAA,GAAI,KAAK;AAAA,eAAA,CAAA;AAAA,UAEvD,KAAA,EAAO;AAAA,SACR,CAAA;AAAA,QACD,OAAA;AAAA,QACAX,sBAAA;AAAA,UACE;AAAA,YACE,CAAA,EAAG,CAAA;AAAA,YACH,CAAA,EAAG,CAAC,CAAA,GAAI,CAAA,GAAI,CAAA;AAAA,YACZ,aAAA,EAAe,QAAA;AAAA,YACf,KAAA,EAAO;AAAA,WACT;AAAA,UACA;AAAA;AACF,OACD,CAAA;AAAA,IACH;AAAA,IACA,KAAK,eAAA,EAAiB;AACpB,MAAA,MAAM,CAAA,GAAI,GAAA;AACV,MAAA,MAAM,CAAA,GAAI,EAAA;AACV,MAAA,MAAM,KAAA,GAAQ,EAAA;AACd,MAAA,MAAM,IAAA,GAAO,CAAC,CAAA,GAAI,CAAA;AAClB,MAAA,MAAM,QAAQ,CAAA,GAAI,CAAA;AAClB,MAAA,MAAM,QAAkB,EAAC;AACzB,MAAA,KAAA,IAAS,EAAA,GAAK,CAAC,CAAA,GAAI,CAAA,GAAI,EAAA,EAAI,MAAM,CAAA,GAAI,CAAA,GAAI,EAAA,EAAI,EAAA,IAAM,CAAA,EAAG;AACpD,QAAA,KAAA,CAAM,IAAA;AAAA,UACJD,sBAAA,CAAK;AAAA,YACH,EAAA,EAAI,OAAO,KAAA,GAAQ,CAAA;AAAA,YACnB,EAAA,EAAI,EAAA;AAAA,YACJ,EAAA,EAAI,QAAQ,KAAA,GAAQ,CAAA;AAAA,YACpB,EAAA,EAAI,EAAA;AAAA,YACJ,KAAA,EAAO;AAAA,WACR;AAAA,SACH;AAAA,MACF;AACA,MAAA,OAAOa,uBAAA,CAAM,EAAC,EAAG;AAAA,QACfD,sBAAA,CAAK;AAAA,UACH,GAAG,CAAA,EAAA,EAAK,IAAA,GAAO,KAAK,CAAA,CAAA,EAAI,CAAC,IAAI,CAAC;AAAA,gBAAA,EACtB,KAAA,GAAQ,KAAK,CAAA,CAAA,EAAI,CAAC,IAAI,CAAC;AAAA,gBAAA,EACvB,KAAK,IAAI,CAAA,GAAI,CAAC,UAAU,KAAA,GAAQ,KAAK,CAAA,CAAA,EAAI,CAAA,GAAI,CAAC;AAAA,gBAAA,EAC9C,IAAA,GAAO,KAAK,CAAA,CAAA,EAAI,CAAA,GAAI,CAAC;AAAA,gBAAA,EACrB,KAAK,CAAA,CAAA,EAAI,CAAA,GAAI,CAAC,CAAA,OAAA,EAAU,OAAO,KAAK,CAAA,CAAA,EAAI,CAAC,CAAA,GAAI,CAAC;AAAA,eAAA,CAAA;AAAA,UAEtD,KAAA,EAAO;AAAA,SACR,CAAA;AAAA,QACD,GAAG,KAAA;AAAA,QACHX,sBAAA;AAAA,UACE;AAAA,YACE,CAAA,EAAG,CAAA;AAAA,YACH,CAAA,EAAG,IAAI,CAAA,GAAI,EAAA;AAAA,YACX,aAAA,EAAe,QAAA;AAAA,YACf,KAAA,EAAO;AAAA,WACT;AAAA,UACA;AAAA;AACF,OACD,CAAA;AAAA,IACH;AAAA,IACA,KAAK,eAAA,EAAiB;AACpB,MAAA,MAAM,CAAA,GAAI,GAAA;AACV,MAAA,MAAM,CAAA,GAAI,EAAA;AACV,MAAA,OAAOY,uBAAA,CAAM,EAAC,EAAG;AAAA,QACfJ,sBAAA,CAAK;AAAA,UACH,CAAA,EAAG,CAAC,CAAA,GAAI,CAAA;AAAA,UACR,CAAA,EAAG,CAAC,CAAA,GAAI,CAAA,GAAI,EAAA;AAAA,UACZ,KAAA,EAAO,CAAA;AAAA,UACP,QAAQ,CAAA,GAAI,EAAA;AAAA,UACZ,KAAA,EAAO;AAAA,SACR,CAAA;AAAA,QACDC,wBAAA,CAAO,EAAE,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAC,CAAA,GAAI,CAAA,GAAI,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,KAAA,EAAO,gBAAgB,CAAA;AAAA;AAAA,QAE/DE,sBAAA,CAAK;AAAA,UACH,CAAA,EAAG,CAAA,IAAA,EAAO,CAAC,CAAA,GAAI,CAAA,GAAI,EAAE,CAAA,MAAA,EAAS,CAAC,CAAA,GAAI,CAAA,GAAI,CAAC;AAAA,kBAAA,EAC9B,CAAC,IAAI,CAAA,GAAI,EAAE,UAAU,CAAC,CAAA,GAAI,IAAI,CAAC;AAAA,kBAAA,EAC/B,CAAC,IAAI,CAAA,GAAI,EAAE,QAAQ,CAAC,CAAA,GAAI,IAAI,EAAE,CAAA,CAAA;AAAA,UACxC,KAAA,EAAO;AAAA,SACR,CAAA;AAAA,QACDX,sBAAA;AAAA,UACE,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,GAAI,IAAI,EAAA,EAAI,aAAA,EAAe,QAAA,EAAU,KAAA,EAAO,kBAAA,EAAmB;AAAA,UAC1E;AAAA;AACF,OACD,CAAA;AAAA,IACH;AAAA,IACA,KAAK,UAAA,EAAY;AACf,MAAA,MAAM,CAAA,GAAI,GAAA;AACV,MAAA,MAAM,CAAA,GAAI,EAAA;AACV,MAAA,MAAM,KAAA,GAAQ,EAAA;AACd,MAAA,OAAOY,uBAAA,CAAM,EAAC,EAAG;AAAA,QACfD,sBAAA,CAAK;AAAA,UACH,CAAA,EAAG,KAAK,CAAC,CAAA,GAAI,IAAI,KAAK,CAAA,CAAA,EAAI,CAAC,CAAA,GAAI,CAAC;AAAA,gBAAA,EACxB,IAAI,CAAA,GAAI,KAAK,CAAA,CAAA,EAAI,CAAC,IAAI,CAAC;AAAA,gBAAA,EACvB,KAAK,CAAA,CAAA,EAAI,CAAA,GAAI,CAAC,CAAA,OAAA,EAAU,IAAI,CAAA,GAAI,KAAK,CAAA,CAAA,EAAI,CAAA,GAAI,CAAC;AAAA,gBAAA,EAC9C,CAAC,CAAA,GAAI,CAAA,GAAI,KAAK,CAAA,CAAA,EAAI,IAAI,CAAC;AAAA,gBAAA,EACvB,KAAK,CAAA,CAAA,EAAI,CAAA,GAAI,CAAC,CAAA,OAAA,EAAU,CAAC,CAAA,GAAI,CAAA,GAAI,KAAK,CAAA,CAAA,EAAI,CAAC,CAAA,GAAI,CAAC;AAAA,eAAA,CAAA;AAAA,UAExD,KAAA,EAAO;AAAA,SACR,CAAA;AAAA,QACDZ,sBAAA,CAAK;AAAA,UACH,EAAA,EAAI,CAAC,CAAA,GAAI,CAAA,GAAI,KAAA,GAAQ,CAAA;AAAA,UACrB,EAAA,EAAI,GAAA;AAAA,UACJ,EAAA,EAAI,CAAA,GAAI,CAAA,GAAI,KAAA,GAAQ,CAAA;AAAA,UACpB,EAAA,EAAI,GAAA;AAAA,UACJ,KAAA,EAAO;AAAA,SACR,CAAA;AAAA,QACDA,sBAAA,CAAK;AAAA,UACH,EAAA,EAAI,CAAC,CAAA,GAAI,CAAA,GAAI,KAAA,GAAQ,CAAA;AAAA,UACrB,EAAA,EAAI,CAAA;AAAA,UACJ,EAAA,EAAI,CAAA,GAAI,CAAA,GAAI,KAAA,GAAQ,CAAA;AAAA,UACpB,EAAA,EAAI,CAAA;AAAA,UACJ,KAAA,EAAO;AAAA,SACR,CAAA;AAAA,QACDA,sBAAA,CAAK;AAAA,UACH,EAAA,EAAI,CAAC,CAAA,GAAI,CAAA,GAAI,KAAA,GAAQ,CAAA;AAAA,UACrB,EAAA,EAAI,EAAA;AAAA,UACJ,EAAA,EAAI,CAAA,GAAI,CAAA,GAAI,KAAA,GAAQ,CAAA;AAAA,UACpB,EAAA,EAAI,EAAA;AAAA,UACJ,KAAA,EAAO;AAAA,SACR,CAAA;AAAA,QACDC,sBAAA,CAAK,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,GAAI,CAAA,GAAI,EAAA,EAAI,aAAA,EAAe,QAAA,EAAU,KAAA,EAAO,kBAAA,IAAsB,KAAK;AAAA,OACxF,CAAA;AAAA,IACH;AAAA,IACA,KAAK,WAAA,EAAa;AAEhB,MAAA,MAAM,CAAA,GAAI,GAAA;AACV,MAAA,MAAM,CAAA,GAAI,EAAA;AACV,MAAA,MAAM,KAAA,GAAQ,EAAA;AACd,MAAA,MAAM,IAAA,GAAO,CAAC,CAAA,GAAI,CAAA;AAClB,MAAA,MAAM,QAAQ,CAAA,GAAI,CAAA;AAClB,MAAA,MAAM,QAAkB,EAAC;AACzB,MAAA,KAAA,IAAS,EAAA,GAAK,CAAC,CAAA,GAAI,CAAA,GAAI,EAAA,EAAI,MAAM,CAAA,GAAI,CAAA,GAAI,EAAA,EAAI,EAAA,IAAM,EAAA,EAAI;AACrD,QAAA,KAAA,CAAM,IAAA;AAAA,UACJD,sBAAA,CAAK;AAAA,YACH,EAAA,EAAI,OAAO,KAAA,GAAQ,CAAA;AAAA,YACnB,EAAA,EAAI,EAAA;AAAA,YACJ,EAAA,EAAI,QAAQ,KAAA,GAAQ,CAAA;AAAA,YACpB,EAAA,EAAI,EAAA;AAAA,YACJ,KAAA,EAAO;AAAA,WACR;AAAA,SACH;AAAA,MACF;AACA,MAAA,OAAOa,uBAAA,CAAM,EAAC,EAAG;AAAA,QACfD,sBAAA,CAAK;AAAA,UACH,GAAG,CAAA,EAAA,EAAK,IAAA,GAAO,KAAK,CAAA,CAAA,EAAI,CAAC,IAAI,CAAC;AAAA,gBAAA,EACtB,KAAA,GAAQ,KAAK,CAAA,CAAA,EAAI,CAAC,IAAI,CAAC;AAAA,gBAAA,EACvB,KAAK,IAAI,CAAA,GAAI,CAAC,UAAU,KAAA,GAAQ,KAAK,CAAA,CAAA,EAAI,CAAA,GAAI,CAAC;AAAA,gBAAA,EAC9C,IAAA,GAAO,KAAK,CAAA,CAAA,EAAI,CAAA,GAAI,CAAC;AAAA,gBAAA,EACrB,KAAK,CAAA,CAAA,EAAI,CAAA,GAAI,CAAC,CAAA,OAAA,EAAU,OAAO,KAAK,CAAA,CAAA,EAAI,CAAC,CAAA,GAAI,CAAC;AAAA,eAAA,CAAA;AAAA,UAEtD,KAAA,EAAO;AAAA,SACR,CAAA;AAAA,QACD,GAAG,KAAA;AAAA,QACHX,sBAAA,CAAK,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,GAAI,CAAA,GAAI,EAAA,EAAI,aAAA,EAAe,QAAA,EAAU,KAAA,EAAO,kBAAA,IAAsB,KAAK;AAAA,OACxF,CAAA;AAAA,IACH;AAAA,IACA,KAAK,kBAAA,EAAoB;AAEvB,MAAA,MAAM,CAAA,GAAI,EAAA;AACV,MAAA,OAAOY,uBAAA,CAAM,EAAC,EAAG;AAAA,QACfH,wBAAA,CAAO,EAAE,EAAA,EAAI,CAAA,EAAG,IAAI,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,cAAA,EAAgB,CAAA;AAAA,QACjDC,yBAAA,CAAQ;AAAA,UACN,QAAQ,CAAA,EAAG,CAAA,GAAI,GAAG,CAAA,CAAA,EAAI,CAAC,IAAI,GAAG,CAAA,CAAA,EAAI,IAAI,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,GAAI,GAAG,IAAI,CAAA,GAAI,GAAG,IAAI,CAAC,CAAA,CAAA;AAAA,UACnE,KAAA,EAAO;AAAA,SACR,CAAA;AAAA,QACDV,sBAAA;AAAA,UACE,EAAE,GAAG,CAAA,EAAG,CAAA,EAAG,IAAI,EAAA,EAAI,aAAA,EAAe,QAAA,EAAU,KAAA,EAAO,kBAAA,EAAmB;AAAA,UACtE;AAAA;AACF,OACD,CAAA;AAAA,IACH;AAAA,IACA,KAAK,SAAA,EAAW;AACd,MAAA,MAAM,CAAA,GAAI,EAAA;AACV,MAAA,OAAOY,uBAAA,CAAM,EAAC,EAAG;AAAA,QACfH,wBAAA,CAAO,EAAE,EAAA,EAAI,CAAA,EAAG,IAAI,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,cAAA,EAAgB,CAAA;AAAA,QACjDA,wBAAA,CAAO,EAAE,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,kBAAA,EAAoB,IAAA,EAAM,MAAA,EAAQ,CAAA;AAAA,QACvEA,wBAAA,CAAO,EAAE,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,kBAAA,EAAoB,IAAA,EAAM,MAAA,EAAQ,CAAA;AAAA,QACtET,sBAAA;AAAA,UACE,EAAE,GAAG,CAAA,EAAG,CAAA,EAAG,IAAI,EAAA,EAAI,aAAA,EAAe,QAAA,EAAU,KAAA,EAAO,kBAAA,EAAmB;AAAA,UACtE;AAAA;AACF,OACD,CAAA;AAAA,IACH;AAAA,IACA,KAAK,YAAA,EAAc;AAEjB,MAAA,OAAOY,uBAAA,CAAM,EAAC,EAAG;AAAA,QACfF,yBAAA,CAAQ;AAAA,UACN,MAAA,EAAQ,6BAAA;AAAA,UACR,KAAA,EAAO;AAAA,SACR,CAAA;AAAA,QACDV,sBAAA,CAAK,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,aAAA,EAAe,QAAA,EAAU,KAAA,EAAO,kBAAA,EAAmB,EAAG,KAAK;AAAA,OAChF,CAAA;AAAA,IACH;AAAA,IACA,KAAK,QAAA,EAAU;AACb,MAAA,MAAM,CAAA,GAAI,EAAA;AACV,MAAA,OAAOY,uBAAA,CAAM,EAAC,EAAG;AAAA,QACfH,wBAAA,CAAO,EAAE,EAAA,EAAI,CAAA,EAAG,IAAI,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,cAAA,EAAgB,CAAA;AAAA,QACjDE,sBAAA,CAAK;AAAA,UACH,GAAG,CAAA,QAAA,EAAW,CAAA,GAAI,GAAG,CAAA,CAAA,EAAI,CAAC,IAAI,GAAG,CAAA,SAAA,EAAY,CAAC,CAAA,GAAI,GAAG,CAAA,CAAA,EAAI,CAAC,IAAI,GAAG,CAAA,WAAA,EAAc,IAAI,GAAG,CAAA,CAAA;AAAA,UACtF,KAAA,EAAO;AAAA,SACR,CAAA;AAAA,QACDX,sBAAA,CAAK,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,aAAA,EAAe,QAAA,EAAU,KAAA,EAAO,kBAAA,EAAmB,EAAG,KAAK;AAAA,OACpF,CAAA;AAAA,IACH;AAAA,IACA,KAAK,cAAA,EAAgB;AACnB,MAAA,MAAM,CAAA,GAAI,EAAA;AACV,MAAA,MAAM,CAAA,GAAI,GAAA;AACV,MAAA,MAAM,KAAA,GAAQ,EAAA;AACd,MAAA,MAAM,GAAA,GAAM,CAAC,CAAA,GAAI,CAAA;AACjB,MAAA,MAAM,MAAM,CAAA,GAAI,CAAA;AAChB,MAAA,OAAOY,uBAAA,CAAM,EAAC,EAAG;AAAA,QACfD,sBAAA,CAAK;AAAA,UACH,GAAG,CAAA,EAAA,EAAK,CAAC,IAAI,CAAC,CAAA,CAAA,EAAI,MAAM,KAAK;AAAA,gBAAA,EACrB,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,KAAK,UAAU,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,GAAA,GAAM,KAAK;AAAA,gBAAA,EAC5C,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,GAAA,GAAM,KAAK;AAAA,gBAAA,EACpB,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,KAAK,CAAA,OAAA,EAAU,CAAC,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,GAAA,GAAM,KAAK;AAAA,eAAA,CAAA;AAAA,UAErD,KAAA,EAAO;AAAA,SACR,CAAA;AAAA;AAAA,QAEDZ,sBAAA,CAAK,EAAE,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,GAAA,GAAM,EAAA,EAAI,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,KAAA,EAAO,oBAAoB,CAAA;AAAA,QACrES,sBAAA,CAAK,EAAE,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,CAAA,EAAG,KAAA,EAAO,cAAA,EAAgB,CAAA;AAAA,QAClER,sBAAA;AAAA,UACE,EAAE,GAAG,CAAA,EAAG,CAAA,EAAG,MAAM,EAAA,EAAI,aAAA,EAAe,QAAA,EAAU,KAAA,EAAO,kBAAA,EAAmB;AAAA,UACxE;AAAA;AACF,OACD,CAAA;AAAA,IACH;AAAA,IACA,KAAK,aAAA,EAAe;AAClB,MAAA,MAAM,CAAA,GAAI,GAAA;AACV,MAAA,MAAM,CAAA,GAAI,EAAA;AACV,MAAA,MAAM,KAAA,GAAQ,EAAA;AACd,MAAA,MAAM,IAAA,GAAO,CAAC,CAAA,GAAI,CAAA;AAClB,MAAA,MAAM,QAAQ,CAAA,GAAI,CAAA;AAElB,MAAA,MAAM,OAAiB,EAAC;AACxB,MAAA,KAAA,IAAS,EAAA,GAAK,OAAO,KAAA,GAAQ,CAAA,EAAG,MAAM,KAAA,GAAQ,KAAA,GAAQ,CAAA,EAAG,EAAA,IAAM,EAAA,EAAI;AACjE,QAAA,KAAA,IAAS,EAAA,GAAK,CAAC,CAAA,GAAI,CAAA,GAAI,EAAA,EAAI,MAAM,CAAA,GAAI,CAAA,GAAI,CAAA,EAAG,EAAA,IAAM,EAAA,EAAI;AACpD,UAAA,IAAA,CAAK,IAAA,CAAKS,wBAAA,CAAO,EAAE,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,CAAA,EAAG,GAAA,EAAK,IAAA,EAAM,YAAA,EAAc,CAAC,CAAA;AAAA,QAClE;AAAA,MACF;AACA,MAAA,OAAOG,uBAAA,CAAM,EAAC,EAAG;AAAA,QACfD,sBAAA,CAAK;AAAA,UACH,GAAG,CAAA,EAAA,EAAK,IAAA,GAAO,KAAK,CAAA,CAAA,EAAI,CAAC,IAAI,CAAC;AAAA,gBAAA,EACtB,KAAA,GAAQ,KAAK,CAAA,CAAA,EAAI,CAAC,IAAI,CAAC;AAAA,gBAAA,EACvB,KAAK,IAAI,CAAA,GAAI,CAAC,UAAU,KAAA,GAAQ,KAAK,CAAA,CAAA,EAAI,CAAA,GAAI,CAAC;AAAA,gBAAA,EAC9C,IAAA,GAAO,KAAK,CAAA,CAAA,EAAI,CAAA,GAAI,CAAC;AAAA,gBAAA,EACrB,KAAK,CAAA,CAAA,EAAI,CAAA,GAAI,CAAC,CAAA,OAAA,EAAU,OAAO,KAAK,CAAA,CAAA,EAAI,CAAC,CAAA,GAAI,CAAC;AAAA,eAAA,CAAA;AAAA,UAEtD,KAAA,EAAO;AAAA,SACR,CAAA;AAAA,QACD,GAAG,IAAA;AAAA,QACHX,sBAAA,CAAK,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,GAAI,CAAA,GAAI,EAAA,EAAI,aAAA,EAAe,QAAA,EAAU,KAAA,EAAO,kBAAA,IAAsB,KAAK;AAAA,OACxF,CAAA;AAAA,IACH;AAAA,IACA,KAAK,QAAA,EAAU;AACb,MAAA,MAAM,CAAA,GAAI,EAAA;AACV,MAAA,MAAM,CAAA,GAAI,EAAA;AAEV,MAAA,OAAOY,uBAAA,CAAM,EAAC,EAAG;AAAA,QACfJ,uBAAK,EAAE,CAAA,EAAG,CAAC,CAAA,GAAI,GAAG,CAAA,EAAG,CAAC,CAAA,GAAI,CAAA,EAAG,OAAO,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,KAAA,EAAO,gBAAgB,CAAA;AAAA,QACzET,sBAAA,CAAK,EAAE,EAAA,EAAI,CAAC,IAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,IAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,KAAA,EAAO,oBAAoB,CAAA;AAAA,QACvEA,sBAAA,CAAK,EAAE,EAAA,EAAI,CAAC,IAAI,CAAA,GAAI,CAAA,EAAG,IAAI,CAAC,CAAA,GAAI,IAAI,CAAA,EAAG,EAAA,EAAI,IAAI,CAAA,GAAI,CAAA,EAAG,IAAI,EAAA,EAAI,KAAA,EAAO,oBAAoB,CAAA;AAAA,QACzFA,uBAAK,EAAE,EAAA,EAAI,CAAC,CAAA,GAAI,CAAA,GAAI,GAAG,EAAA,EAAI,CAAA,EAAG,IAAI,CAAA,GAAI,CAAA,GAAI,GAAG,EAAA,EAAI,CAAA,GAAI,IAAI,CAAA,EAAG,KAAA,EAAO,oBAAoB,CAAA;AAAA,QACvFC,sBAAA,CAAK,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,GAAI,CAAA,GAAI,EAAA,EAAI,aAAA,EAAe,QAAA,EAAU,KAAA,EAAO,kBAAA,IAAsB,KAAK;AAAA,OACxF,CAAA;AAAA,IACH;AAAA,IACA,KAAK,SAAA,EAAW;AACd,MAAA,MAAM,CAAA,GAAI,EAAA;AACV,MAAA,MAAM,CAAA,GAAI,GAAA;AACV,MAAA,MAAM,GAAA,GAAM,EAAA;AACZ,MAAA,OAAOY,uBAAA,CAAM,EAAC,EAAG;AAAA,QACfD,sBAAA,CAAK;AAAA,UACH,CAAA,EAAG,KAAK,CAAC,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,CAAC,IAAI,CAAC;AAAA,gBAAA,EAChB,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,CAAC,IAAI,CAAC;AAAA,gBAAA,EACf,IAAI,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,GAAI,IAAI,GAAG;AAAA,kBAAA,EACnB,IAAI,CAAC;AAAA,gBAAA,EACP,CAAC,CAAA,GAAI,CAAC,IAAI,CAAC,CAAA,GAAI,IAAI,GAAG;AAAA,eAAA,CAAA;AAAA,UAE9B,KAAA,EAAO;AAAA,SACR,CAAA;AAAA,QACDX,sBAAA,CAAK,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,GAAI,CAAA,GAAI,EAAA,EAAI,aAAA,EAAe,QAAA,EAAU,KAAA,EAAO,kBAAA,IAAsB,KAAK;AAAA,OACxF,CAAA;AAAA,IACH;AAAA,IACA,KAAK,OAAA,EAAS;AACZ,MAAA,MAAM,CAAA,GAAI,EAAA;AACV,MAAA,MAAM,CAAA,GAAI,GAAA;AACV,MAAA,OAAOY,uBAAA,CAAM,EAAC,EAAG;AAAA,QACfJ,uBAAK,EAAE,CAAA,EAAG,CAAC,CAAA,GAAI,GAAG,CAAA,EAAG,CAAC,CAAA,GAAI,CAAA,EAAG,OAAO,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,KAAA,EAAO,gBAAgB,CAAA;AAAA,QACzEE,yBAAA,CAAQ;AAAA,UACN,QAAQ,CAAA,EAAG,GAAE,CAAA,CAAA,EAAI,CAAC,IAAI,CAAA,GAAI,CAAC,CAAA,GAAA,EAAM,CAAC,IAAI,CAAA,GAAI,EAAE,MAAM,CAAC,CAAA,GAAI,IAAI,CAAC,CAAA,CAAA;AAAA,UAC5D,IAAA,EAAM,SAAA;AAAA,UACN,MAAA,EAAQ;AAAA,SACT,CAAA;AAAA,QACDV,sBAAA,CAAK,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,GAAI,CAAA,GAAI,EAAA,EAAI,aAAA,EAAe,QAAA,EAAU,KAAA,EAAO,kBAAA,IAAsB,KAAK;AAAA,OACxF,CAAA;AAAA,IACH;AAAA,IACA,KAAK,eAAA,EAAiB;AACpB,MAAA,MAAM,CAAA,GAAI,GAAA;AACV,MAAA,MAAM,CAAA,GAAI,EAAA;AACV,MAAA,OAAOY,uBAAA,CAAM,EAAC,EAAG;AAAA,QACfD,sBAAA,CAAK;AAAA,UACH,CAAA,EAAG,KAAK,CAAC,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,CAAC,IAAI,CAAC;AAAA,gBAAA,EAChB,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,CAAC,IAAI,CAAC;AAAA,gBAAA,EACf,IAAI,CAAC,CAAA;AAAA,gBAAA,EACL,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,CAAA,GAAI,CAAC;AAAA,gBAAA,EACd,CAAC,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,IAAI,CAAC;AAAA,gBAAA,EACf,CAAC,IAAI,CAAC,CAAA;AAAA,eAAA,CAAA;AAAA,UAEd,KAAA,EAAO;AAAA,SACR,CAAA;AAAA,QACDX,sBAAA,CAAK,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,GAAI,CAAA,GAAI,EAAA,EAAI,aAAA,EAAe,QAAA,EAAU,KAAA,EAAO,kBAAA,IAAsB,KAAK;AAAA,OACxF,CAAA;AAAA,IACH;AAAA;AAAA,IAGA,KAAK,YAAA;AACH,MAAA,OAAOY,uBAAA,CAAM,EAAC,EAAG;AAAA,QACf,MAAA,EAAO;AAAA,QACPZ,sBAAA,CAAK,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,aAAA,EAAe,QAAA,EAAU,KAAA,EAAO,kBAAA,EAAmB,EAAG,KAAK;AAAA,OAChF,CAAA;AAAA,IACH,KAAK,YAAA;AACH,MAAA,OAAOY,uBAAA,CAAM,EAAC,EAAG;AAAA,QACf,MAAA,EAAO;AAAA,QACPH,wBAAA,CAAO,EAAE,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,GAAG,CAAA,EAAG,CAAA,EAAG,IAAA,EAAM,YAAA,EAAc,CAAA;AAAA,QACjDT,sBAAA,CAAK,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,aAAA,EAAe,QAAA,EAAU,KAAA,EAAO,kBAAA,EAAmB,EAAG,KAAK;AAAA,OAChF,CAAA;AAAA,IACH,KAAK,aAAA;AACH,MAAA,OAAOY,uBAAA,CAAM,EAAC,EAAG;AAAA,QACf,MAAA,EAAO;AAAA,QACPH,wBAAA,CAAO,EAAE,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,EAAA,EAAI,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,mBAAA,EAAqB,IAAA,EAAM,UAAA,EAAY,CAAA;AAAA,QAC5ET,sBAAA,CAAK,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,aAAA,EAAe,QAAA,EAAU,KAAA,EAAO,kBAAA,EAAmB,EAAG,KAAK;AAAA,OAChF,CAAA;AAAA,IACH,KAAK,iBAAA;AACH,MAAA,OAAOY,uBAAA,CAAM,EAAC,EAAG;AAAA,QACf,MAAA,EAAO;AAAA,QACPb,sBAAA,CAAK,EAAE,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,GAAA,EAAK,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,EAAA,EAAI,KAAA,EAAO,kBAAA,EAAoB,CAAA;AAAA,QACjEC,sBAAA,CAAK,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,aAAA,EAAe,QAAA,EAAU,KAAA,EAAO,kBAAA,EAAmB,EAAG,KAAK;AAAA,OAChF,CAAA;AAAA,IACH,KAAK,aAAA;AACH,MAAA,OAAOY,uBAAA,CAAM,EAAC,EAAG;AAAA,QACf,MAAA,EAAO;AAAA,QACPD,sBAAA,CAAK,EAAE,CAAA,EAAG,8BAAA,EAAgC,OAAO,kBAAA,EAAoB,IAAA,EAAM,QAAQ,CAAA;AAAA,QACnFX,sBAAA,CAAK,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,aAAA,EAAe,QAAA,EAAU,KAAA,EAAO,kBAAA,EAAmB,EAAG,KAAK;AAAA,OAChF,CAAA;AAAA,IACH,KAAK,eAAA;AACH,MAAA,OAAOY,uBAAA,CAAM,EAAC,EAAG;AAAA,QACf,MAAA,EAAO;AAAA;AAAA,QAEPb,sBAAA,CAAK,EAAE,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,GAAA,EAAK,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,GAAA,EAAK,KAAA,EAAO,kBAAA,EAAoB,CAAA;AAAA,QAClEY,uBAAK,EAAE,CAAA,EAAG,2CAAA,EAA6C,KAAA,EAAO,gBAAgB,CAAA;AAAA,QAC9EX,sBAAA,CAAK,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,aAAA,EAAe,QAAA,EAAU,KAAA,EAAO,kBAAA,EAAmB,EAAG,KAAK;AAAA,OAChF,CAAA;AAAA,IACH,KAAK,WAAA;AACH,MAAA,OAAOY,uBAAA,CAAM,EAAC,EAAG;AAAA,QACf,MAAA,EAAO;AAAA;AAAA,QAEPb,sBAAA,CAAK;AAAA,UACH,EAAA,EAAI,EAAA;AAAA,UAAI,EAAA,EAAI,GAAA;AAAA,UACZ,EAAA,EAAI,EAAA;AAAA,UAAI,EAAA,EAAI,GAAA;AAAA,UACZ,KAAA,EAAO;AAAA,SACR,CAAA;AAAA;AAAA,QAEDY,sBAAA,CAAK;AAAA,UACH,CAAA,EAAG,gDAAA;AAAA,UACH,KAAA,EAAO,kBAAA;AAAA,UACP,IAAA,EAAM;AAAA,SACP,CAAA;AAAA,QACDX,sBAAA,CAAK,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,aAAA,EAAe,QAAA,EAAU,KAAA,EAAO,kBAAA,EAAmB,EAAG,KAAK;AAAA,OAChF,CAAA;AAAA,IAEH;AACE,MAAA,OAAOY,uBAAA,CAAM,EAAC,EAAG;AAAA,QACfJ,sBAAA,CAAK,EAAE,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,EAAA,EAAI,KAAA,EAAO,cAAA,EAAgB,CAAA;AAAA,QACrER,sBAAA,CAAK,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,aAAA,EAAe,QAAA,EAAU,KAAA,EAAO,kBAAA,EAAmB,EAAG,KAAK;AAAA,OAC/E,CAAA;AAAA;AAEP;AAIO,SAAS,gBAAA,CACd,QAAA,EACA,UAAA,EACA,UAAA,EACQ;AACR,EAAA,MAAM,CAAA,GAAI,EAAA;AAEV,EAAA,MAAM,UAAA,GAAa,QAAA,CAAS,QAAA,CAAS,UAAU,CAAA;AAC/C,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,QAAA,CAAS,KAAK,CAAA;AACrC,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,QAAA,CAAS,QAAQ,CAAA;AAC3C,EAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,UAAA,CAAW,KAAK,CAAA;AAC/C,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,UAAA,CAAW,QAAQ,CAAA;AAE5C,EAAA,MAAM,QAAkB,EAAC;AAGzB,EAAA,IAAI,UAAA,EAAY;AAEd,IAAA,KAAA,CAAM,IAAA,CAAKS,wBAAA,CAAO,EAAE,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,cAAA,EAAgB,CAAC,CAAA;AAC7D,IAAA,KAAA,CAAM,IAAA;AAAA,MACJC,yBAAA,CAAQ;AAAA,QACN,MAAA,EAAQ,CAAA,EAAA,EAAK,CAAC,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,CAAA,GAAI,CAAC,CAAA,KAAA,EAAQ,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,IAAQ,CAAA,EAAA,CAAA;AAAA,QACrD,KAAA,EAAO,cAAA;AAAA,QACP,IAAA,EAAM;AAAA,OACP;AAAA,KACH;AAAA,EACF,WAAW,KAAA,EAAO;AAEhB,IAAA,KAAA,CAAM,IAAA,CAAKD,wBAAA,CAAO,EAAE,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,cAAA,EAAgB,CAAC,CAAA;AAC7D,IAAA,MAAM,IAAA,GAAO,CAAA,GAAI,IAAA,CAAK,OAAA,GAAU,CAAA,GAAI,CAAA;AACpC,IAAA,KAAA,CAAM,IAAA;AAAA,MACJD,sBAAA,CAAK;AAAA,QACH,CAAA,EAAG,CAAC,IAAA,GAAO,CAAA;AAAA,QACX,CAAA,EAAG,CAAC,IAAA,GAAO,CAAA;AAAA,QACX,KAAA,EAAO,IAAA;AAAA,QACP,MAAA,EAAQ,IAAA;AAAA,QACR,KAAA,EAAO,cAAA;AAAA,QACP,IAAA,EAAM;AAAA,OACP;AAAA,KACH;AAAA,EACF,WAAW,QAAA,EAAU;AAEnB,IAAA,KAAA,CAAM,IAAA,CAAKC,wBAAA,CAAO,EAAE,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,cAAA,EAAgB,CAAC,CAAA;AAC7D,IAAA,MAAM,MAAgB,EAAC;AACvB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,MAAA,MAAM,IAAK,IAAA,CAAK,EAAA,GAAK,CAAA,GAAK,CAAA,GAAI,KAAK,EAAA,GAAK,CAAA;AACxC,MAAA,GAAA,CAAI,IAAA,CAAK,CAAA,EAAA,CAAI,CAAA,GAAI,CAAA,IAAK,KAAK,GAAA,CAAI,CAAC,CAAC,CAAA,CAAA,EAAA,CAAK,IAAI,CAAA,IAAK,IAAA,CAAK,GAAA,CAAI,CAAC,CAAC,CAAA,CAAE,CAAA;AAAA,IAC9D;AACA,IAAA,KAAA,CAAM,IAAA;AAAA,MACJC,yBAAA,CAAQ;AAAA,QACN,MAAA,EAAQ,GAAA,CAAI,IAAA,CAAK,GAAG,CAAA;AAAA,QACpB,KAAA,EAAO,cAAA;AAAA,QACP,IAAA,EAAM;AAAA,OACP;AAAA,KACH;AAAA,EACF,CAAA,MAAO;AAEL,IAAA,KAAA,CAAM,IAAA,CAAKD,wBAAA,CAAO,EAAE,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,cAAA,EAAgB,CAAC,CAAA;AAAA,EAC/D;AAGA,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,KAAA,CAAM,IAAA,CAAKV,sBAAA,CAAK,EAAE,EAAA,EAAI,CAAC,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA,EAAI,CAAA,EAAG,KAAA,EAAO,iBAAA,EAAmB,CAAC,CAAA;AAAA,EAC5E,WAAW,OAAA,EAAS;AAClB,IAAA,KAAA,CAAM,IAAA,CAAKA,sBAAA,CAAK,EAAE,EAAA,EAAI,CAAC,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA,EAAI,CAAA,EAAG,KAAA,EAAO,oBAAA,EAAsB,CAAC,CAAA;AAAA,EAC/E;AAGA,EAAA,KAAA,CAAM,IAAA;AAAA,IACJC,sBAAA;AAAA,MACE;AAAA,QACE,CAAA,EAAG,CAAA;AAAA,QACH,CAAA,EAAG,EAAA;AAAA,QACH,aAAA,EAAe,QAAA;AAAA,QACf,KAAA,EAAO;AAAA,OACT;AAAA,MACA;AAAA;AACF,GACF;AACA,EAAA,KAAA,CAAM,IAAA;AAAA,IACJA,sBAAA;AAAA,MACE;AAAA,QACE,CAAA,EAAG,CAAA;AAAA,QACH,CAAA,EAAG,CAAA;AAAA,QACH,aAAA,EAAe,QAAA;AAAA,QACf,KAAA,EAAO;AAAA,OACT;AAAA,MACA;AAAA;AACF,GACF;AAEA,EAAA,OAAOY,uBAAA,CAAM,EAAE,KAAA,EAAO,gBAAA,IAAoB,KAAK,CAAA;AACjD;;;ACn4BA,IAAM,OAAA,GAAU,EAAA;AAChB,IAAM,UAAA,GAAa,EAAA;AACnB,IAAM,WAAA,GAAc,EAAA;AACpB,IAAM,WAAA,GAAc,EAAA;AACpB,IAAM,WAAA,GAAc,EAAA;AASpB,SAAS,WAAA,CAAY,WAAyB,KAAA,EAA6B;AAEzE,EAAA,IAAI,KAAA,CAAM,SAAA,KAAc,UAAA,IAAc,KAAA,CAAM,cAAc,gBAAA,EAAkB;AAC1E,IAAA,OAAO,SAAA,KAAc,QAAQ,QAAA,GAAW,KAAA;AAAA,EAC1C;AACA,EAAA,IAAI,KAAA,CAAM,cAAc,UAAA,IAAc,KAAA,CAAM,cAAc,aAAA,IAAiB,KAAA,CAAM,cAAc,eAAA,EAAiB;AAC9G,IAAA,OAAO,SAAA,KAAc,QAAQ,QAAA,GAAW,KAAA;AAAA,EAC1C;AACA,EAAA,OAAO,SAAA,KAAc,QAAQ,KAAA,GAAQ,IAAA;AACvC;AAEA,SAAS,YAAY,IAAA,EAAmD;AACtE,EAAA,IAAI,SAAS,KAAA,IAAS,IAAA,KAAS,WAAA,IAAe,IAAA,KAAS,UAAU,OAAO,KAAA;AACxE,EAAA,IAAI,SAAS,QAAA,IAAY,IAAA,KAAS,YAAA,IAAgB,IAAA,KAAS,iBAAiB,OAAO,QAAA;AACnF,EAAA,IAAI,IAAA,KAAS,MAAA,IAAU,IAAA,KAAS,IAAA,IAAQ,IAAA,KAAS,UAAU,IAAA,KAAS,SAAA,IAAa,IAAA,KAAS,UAAA,EAAY,OAAO,MAAA;AAC7G,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,SAAA,CACP,QAAA,EACA,IAAA,EACA,QAAA,EACa;AACb,EAAA,MAAM,QAAQ,QAAA,CAAS,KAAA;AACvB,EAAA,IAAI,GAAA,GAAM,IAAA;AACV,EAAA,IAAI,CAAC,GAAA,IAAO,EAAE,GAAA,IAAO,KAAA,CAAA,EAAQ;AAC3B,IAAA,GAAA,GAAM,WAAA,CAAY,QAAA,EAAU,QAAA,CAAS,KAAK,CAAA;AAAA,EAC5C;AACA,EAAA,MAAM,CAAA,GAAI,KAAA,CAAM,GAAG,CAAA,IAAK,KAAA,CAAM,SAAS,KAAA,CAAM,GAAA,IAAO,KAAA,CAAM,IAAA,IAAQ,KAAA,CAAM,EAAA;AACxE,EAAA,IAAI,CAAC,CAAA,EAAG,OAAO,EAAE,CAAA,EAAG,QAAA,CAAS,EAAA,EAAI,CAAA,EAAG,QAAA,CAAS,EAAA,EAAI,IAAA,EAAM,OAAA,EAAQ;AAC/D,EAAA,OAAO,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,IAAA,EAAM,WAAA,CAAY,GAAA,IAAO,OAAO,CAAA,EAAE;AAC7D;AAEA,SAAS,cACP,KAAA,EACA,KAAA,EACA,QAAA,EACA,GAAA,EACA,KACA,MAAA,EAC2C;AAI3C,EAAA,MAAM,OAAA,GAAU,QAAA,KAAa,MAAA,IAAU,QAAA,KAAa,OAAA;AACpD,EAAA,MAAM,KAAA,GAAQ,MAAA,KAAW,MAAA,IAAU,MAAA,KAAW,OAAA;AAE9C,EAAA,IAAI,WAAW,KAAA,EAAO;AACpB,IAAA,MAAM,IAAA,GAAA,CAAQ,QAAQ,GAAA,IAAO,CAAA;AAC7B,IAAA,OAAO;AAAA,MACL,GAAG,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,EAAI,KAAK,MAAM,IAAI,CAAA,CAAA,EAAI,KAAK,CAAA,GAAA,EAAM,IAAI,CAAA,CAAA,EAAI,GAAG,CAAA,GAAA,EAAM,GAAG,IAAI,GAAG,CAAA,CAAA;AAAA,MAC1E,IAAA;AAAA,MACA,IAAA,EAAA,CAAO,QAAQ,GAAA,IAAO;AAAA,KACxB;AAAA,EACF;AACA,EAAA,IAAI,CAAC,OAAA,IAAW,CAAC,KAAA,EAAO;AACtB,IAAA,MAAM,IAAA,GAAA,CAAQ,QAAQ,GAAA,IAAO,CAAA;AAC7B,IAAA,OAAO;AAAA,MACL,GAAG,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,EAAI,KAAK,MAAM,KAAK,CAAA,CAAA,EAAI,IAAI,CAAA,GAAA,EAAM,GAAG,CAAA,CAAA,EAAI,IAAI,CAAA,GAAA,EAAM,GAAG,IAAI,GAAG,CAAA,CAAA;AAAA,MAC1E,IAAA,EAAA,CAAO,QAAQ,GAAA,IAAO,CAAA;AAAA,MACtB;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAO;AAAA,MACL,CAAA,EAAG,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,EAAI,KAAK,CAAA,GAAA,EAAM,GAAG,CAAA,CAAA,EAAI,KAAK,CAAA,GAAA,EAAM,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA;AAAA,MACxD,IAAA,EAAM,GAAA;AAAA,MACN,IAAA,EAAA,CAAO,QAAQ,GAAA,IAAO;AAAA,KACxB;AAAA,EACF;AACA,EAAA,OAAO;AAAA,IACL,CAAA,EAAG,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,EAAI,KAAK,CAAA,GAAA,EAAM,KAAK,CAAA,CAAA,EAAI,GAAG,CAAA,GAAA,EAAM,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA;AAAA,IACxD,IAAA,EAAA,CAAO,QAAQ,GAAA,IAAO,CAAA;AAAA,IACtB,IAAA,EAAM;AAAA,GACR;AACF;AAEO,SAAS,UAAU,GAAA,EAA8B;AAEtD,EAAA,MAAM,YAAkC,EAAC;AACzC,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAgC;AAGtD,EAAA,MAAM,OAAA,GAAU,GAAA,CAAI,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,SAAS,CAAA,EAAG,MAAA,IAAU,EAAE,CAAA;AAC5E,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,GAAG,SAAS,CAAC,CAAA;AACnC,EAAA,MAAM,IAAA,GAAO,OAAA,GAAU,UAAA,GAAa,IAAA,GAAO,CAAA,GAAI,EAAA;AAE/C,EAAA,IAAI,UAAU,OAAA,GAAU,EAAA;AAExB,EAAA,KAAA,MAAW,KAAA,IAAS,IAAI,SAAA,EAAW;AACjC,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,KAAA,CAAM,SAAS,CAAA,IAAK,EAAE,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,EAAA,EAAI,KAAA,EAAO,EAAC,EAAE;AAC5E,IAAA,MAAM,EAAA,GAAK,OAAA,GAAU,GAAA,CAAI,KAAA,GAAQ,CAAA;AACjC,IAAA,MAAM,EAAA,GAAK,IAAA;AACX,IAAA,MAAM,CAAA,GAAI,EAAA,GAAK,GAAA,CAAI,KAAA,GAAQ,CAAA;AAC3B,IAAA,MAAM,CAAA,GAAI,EAAA,GAAK,GAAA,CAAI,MAAA,GAAS,CAAA;AAE5B,IAAA,MAAM,QAAkD,EAAC;AACzD,IAAA,KAAA,MAAW,CAAC,MAAM,CAAC,CAAA,IAAK,OAAO,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA,EAAG;AACjD,MAAA,KAAA,CAAM,IAAI,CAAA,GAAI,EAAE,CAAA,EAAG,EAAA,GAAK,EAAE,CAAA,EAAG,CAAA,EAAG,EAAA,GAAK,CAAA,CAAE,CAAA,EAAE;AAAA,IAC3C;AAEA,IAAA,MAAM,QAAA,GAA+B;AAAA,MACnC,KAAA;AAAA,MACA,CAAA;AAAA,MACA,CAAA;AAAA,MACA,OAAO,GAAA,CAAI,KAAA;AAAA,MACX,QAAQ,GAAA,CAAI,MAAA;AAAA,MACZ,EAAA;AAAA,MACA,EAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,SAAA,CAAU,KAAK,QAAQ,CAAA;AACvB,IAAA,SAAA,CAAU,GAAA,CAAI,KAAA,CAAM,EAAA,EAAI,QAAQ,CAAA;AAChC,IAAA,OAAA,IAAW,IAAI,KAAA,GAAQ,WAAA;AAAA,EACzB;AAKA,EAAA,MAAM,cAAqC,EAAC;AAC5C,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAiC;AAEtD,EAAA,MAAM,OAAA,GAAU,UAAU,UAAA,GAAa,EAAA;AAEvC,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,KAAA,MAAW,IAAA,IAAQ,IAAI,WAAA,EAAa;AAClC,IAAA,IAAI,EAAA,GAAK,CAAA;AACT,IAAA,IAAI,EAAA,GAAK,CAAA;AACT,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,KAAK,CAAA,EAAG;AAEnC,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,QAAA,IAAY,EAAA;AAC9C,MAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA;AAC/B,MAAA,EAAA,GAAK,QAAQ,KAAA,CAAM,EAAA,GAAK,UAAU,EAAA,GAAK,MAAA,IAAU,cAAc,CAAA,GAAI,EAAA,CAAA;AACnE,MAAA,EAAA,GAAK,OAAA;AACL,MAAA,MAAA,IAAU,CAAA;AAAA,IACZ,CAAA,MAAA,IAAW,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC7C,MAAA,EAAA,GAAK,IAAA,GAAO,IAAA,GAAO,CAAA,GAAI,WAAA,GAAc,WAAA;AACrC,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,QAAA,IAAY,EAAA;AAC9C,MAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA;AAC/B,MAAA,EAAA,GAAK,KAAA,GAAQ,KAAA,CAAM,EAAA,GAAK,OAAA,GAAU,EAAA;AAAA,IACpC,CAAA,MAAO;AAEL,MAAA,EAAA,GAAK,IAAA,GAAO,OAAO,CAAA,GAAI,WAAA;AACvB,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,QAAA,IAAY,EAAA;AAC9C,MAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA;AAC/B,MAAA,EAAA,GAAK,KAAA,GAAQ,KAAA,CAAM,EAAA,GAAK,OAAA,GAAU,EAAA;AAAA,IACpC;AAEA,IAAA,MAAM,GAAA,GAA2B;AAAA,MAC/B,IAAA;AAAA,MACA,EAAA;AAAA,MACA,EAAA;AAAA,MACA,CAAA,EAAG;AAAA,KACL;AACA,IAAA,WAAA,CAAY,KAAK,GAAG,CAAA;AACpB,IAAA,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,GAAA,EAAK,GAAG,CAAA;AAAA,EAC5B;AAGA,EAAA,MAAM,OAAA,GAAU,CAAC,CAAA,EAAwB,CAAA,KACvC,KAAK,GAAA,CAAI,CAAA,CAAE,KAAK,CAAA,CAAE,EAAE,IAAI,WAAA,IAAe,IAAA,CAAK,IAAI,CAAA,CAAE,EAAA,GAAK,EAAE,EAAE,CAAA,GAAI,cAAc,CAAA,GAAI,CAAA;AACnF,EAAA,MAAM,SAAA,GAAY,CAAC,GAAG,WAAW,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,EAAA,GAAK,CAAA,CAAE,EAAE,CAAA;AAC7D,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,SAAA,CAAU,QAAQ,CAAA,EAAA,EAAK;AACzC,IAAA,MAAM,IAAA,GAAO,SAAA,CAAU,CAAA,GAAI,CAAC,CAAA;AAC5B,IAAA,MAAM,GAAA,GAAM,UAAU,CAAC,CAAA;AACvB,IAAA,IAAI,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAA,EAAG;AACtB,MAAA,GAAA,CAAI,EAAA,GAAK,IAAA,CAAK,EAAA,GAAK,WAAA,GAAc,CAAA,GAAI,EAAA;AAAA,IACvC;AAAA,EACF;AAGA,EAAA,MAAM,QAAyB,EAAC;AAChC,EAAA,KAAA,MAAW,EAAA,IAAM,IAAI,KAAA,EAAO;AAC1B,IAAA,MAAMD,KAAAA,GAAO,SAAA,CAAU,EAAA,EAAI,SAAA,EAAW,QAAQ,CAAA;AAC9C,IAAA,IAAIA,KAAAA,EAAM,KAAA,CAAM,IAAA,CAAKA,KAAI,CAAA;AAAA,EAC3B;AAGA,EAAA,MAAM,OAAiB,EAAC;AACxB,EAAA,MAAM,OAAiB,EAAC;AACxB,EAAA,KAAA,MAAW,KAAK,SAAA,EAAW;AAGzB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,CAAA,EAAA,CAAA,CAAK,EAAE,KAAA,CAAM,GAAA,IAAO,CAAA,CAAE,KAAA,CAAM,IAAI,MAAA,GAAS,GAAA,GAAM,CAAA,CAAE,KAAA,IAAS,IAAI,CAAC,CAAA;AACvF,IAAA,IAAA,CAAK,IAAA,CAAK,EAAE,CAAA,GAAI,MAAA,EAAQ,EAAE,CAAA,GAAI,CAAA,CAAE,QAAQ,MAAM,CAAA;AAC9C,IAAA,IAAA,CAAK,KAAK,CAAA,CAAE,CAAA,EAAG,EAAE,CAAA,GAAI,CAAA,CAAE,SAAS,EAAE,CAAA;AAAA,EACpC;AACA,EAAA,KAAA,MAAW,KAAK,WAAA,EAAa;AAC3B,IAAA,IAAA,CAAK,IAAA,CAAK,EAAE,EAAA,GAAK,CAAA,CAAE,GAAG,CAAA,CAAE,EAAA,GAAK,EAAE,CAAC,CAAA;AAChC,IAAA,IAAA,CAAK,IAAA,CAAK,EAAE,EAAA,GAAK,CAAA,CAAE,GAAG,CAAA,CAAE,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,EAAE,CAAA;AAAA,EACvC;AACA,EAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AAAE,IAAA,IAAA,CAAK,IAAA,CAAK,GAAG,GAAG,CAAA;AAAG,IAAA,IAAA,CAAK,IAAA,CAAK,GAAG,GAAG,CAAA;AAAA,EAAG;AAC/D,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,GAAG,IAAI,CAAA;AAC7B,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,GAAG,IAAI,CAAA;AAE7B,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,IAAA,GAAO,SAAS,GAAG,CAAA;AAAA,IACnC,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,IAAA,GAAO,SAAS,GAAG,CAAA;AAAA,IACpC,SAAA;AAAA,IACA,WAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAO,GAAA,CAAI;AAAA,GACb;AACF;AAEA,SAAS,SAAA,CACP,EAAA,EACA,SAAA,EACA,QAAA,EAC2B;AAC3B,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,EAAA,CAAG,IAAA,CAAK,EAAA,EAAI,GAAG,IAAA,CAAK,IAAA,EAAM,KAAA,EAAO,SAAA,EAAW,QAAQ,CAAA;AACrF,EAAA,MAAM,QAAA,GAAW,aAAA,CAAc,EAAA,CAAG,EAAA,CAAG,EAAA,EAAI,GAAG,EAAA,CAAG,IAAA,EAAM,IAAA,EAAM,SAAA,EAAW,QAAQ,CAAA;AAC9E,EAAA,IAAI,CAAC,UAAA,IAAc,CAAC,QAAA,EAAU,OAAO,MAAA;AAErC,EAAA,MAAM,EAAE,CAAA,EAAG,IAAA,EAAM,IAAA,EAAK,GAAI,aAAA;AAAA,IACxB,UAAA,CAAW,CAAA;AAAA,IACX,UAAA,CAAW,CAAA;AAAA,IACX,UAAA,CAAW,IAAA;AAAA,IACX,QAAA,CAAS,CAAA;AAAA,IACT,QAAA,CAAS,CAAA;AAAA,IACT,QAAA,CAAS;AAAA,GACX;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,EAAA;AAAA,IACN,IAAA,EAAM,CAAA;AAAA,IACN,IAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,aAAA,CACP,EAAA,EACA,IAAA,EACA,QAAA,EACA,WACA,QAAA,EACyB;AACzB,EAAA,MAAM,EAAA,GAAK,SAAA,CAAU,GAAA,CAAI,EAAE,CAAA;AAC3B,EAAA,IAAI,EAAA,EAAI,OAAO,SAAA,CAAU,EAAA,EAAI,MAAM,QAAQ,CAAA;AAE3C,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AAC5B,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,OAAO;AAAA,MACL,GAAG,IAAA,CAAK,EAAA;AAAA,MACR,GAAG,IAAA,CAAK,EAAA;AAAA,MACR,IAAA,EAAM,QAAA,KAAa,KAAA,GAAQ,OAAA,GAAU;AAAA,KACvC;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;;;AC7QA,IAAMqB,MAAAA,GAAQ;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA,CAAA;AA4Bd,IAAM,QAAA,GAAW,cAAA;AAEjB,SAAS,UAAU,CAAA,EAA8C;AAC/D,EAAA,OAAO,CAAA,OAAA,EAAU,CAAA,CAAE,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAC,CAAA,CAAA;AACtC;AAEA,SAAS,WAAW,CAAA,EAA0B;AAC5C,EAAA,MAAM,GAAA,GAAM,SAAA,CAAU,CAAA,CAAE,IAAA,CAAK,QAAQ,CAAA;AACrC,EAAA,MAAM,KAAA,GAAkB;AAAA,IACtBrB,sBAAA,CAAO;AAAA,MACL,GAAG,CAAA,CAAE,IAAA;AAAA,MACL,KAAA,EAAO,GAAA;AAAA,MACP,cAAA,EAAgB,EAAE,IAAA,CAAK,EAAA;AAAA,MACvB,cAAA,EAAgB,CAAA,CAAE,IAAA,CAAK,OAAA,IAAW;AAAA,KACnC;AAAA,GACH;AAGA,EAAA,IAAI,CAAA,CAAE,IAAA,CAAK,QAAA,KAAa,WAAA,EAAa;AACnC,IAAA,KAAA,CAAM,IAAA,CAAK,GAAG,cAAA,CAAe,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,EACtC;AAGA,EAAA,IAAI,CAAA,CAAE,KAAK,GAAA,EAAK;AACd,IAAA,MAAM,CAAA,GAAI,KAAK,GAAA,CAAI,EAAA,EAAI,EAAE,IAAA,CAAK,GAAA,CAAI,SAAS,CAAC,CAAA;AAC5C,IAAA,KAAA,CAAM,IAAA;AAAA,MACJH,sBAAA,CAAK;AAAA,QACH,CAAA,EAAG,CAAA,CAAE,IAAA,GAAO,CAAA,GAAI,CAAA;AAAA,QAChB,CAAA,EAAG,EAAE,IAAA,GAAO,CAAA;AAAA,QACZ,KAAA,EAAO,CAAA;AAAA,QACP,MAAA,EAAQ,EAAA;AAAA,QACR,EAAA,EAAI,CAAA;AAAA,QACJ,EAAA,EAAI,CAAA;AAAA,QACJ,KAAA,EAAO;AAAA,OACR;AAAA,KACH;AACA,IAAA,KAAA,CAAM,IAAA;AAAA,MACJR,sBAAA;AAAA,QACE;AAAA,UACE,GAAG,CAAA,CAAE,IAAA;AAAA,UACL,CAAA,EAAG,EAAE,IAAA,GAAO,CAAA;AAAA,UACZ,aAAA,EAAe,QAAA;AAAA,UACf,KAAA,EAAO;AAAA,SACT;AAAA,QACA,EAAE,IAAA,CAAK;AAAA;AACT,KACF;AAAA,EACF;AAEA,EAAA,OAAOY,uBAAA,CAAM,EAAE,KAAA,EAAO,aAAA,EAAe,WAAW,CAAA,CAAE,IAAA,CAAK,EAAA,EAAG,EAAG,KAAK,CAAA;AACpE;AAEA,SAAS,eAAe,CAAA,EAAqB;AAE3C,EAAA,MAAM,MAAA,GAAS,CAAA,CAAE,KAAA,CAAM,kDAAkD,KAAK,EAAC;AAC/E,EAAA,MAAM,SAA0C,EAAC;AACjD,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,MAAM,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,+CAA+C,CAAA;AACjE,IAAA,IAAI,CAAC,CAAA,EAAG;AACR,IAAA,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA,EAAG,UAAA,CAAW,EAAE,CAAC,CAAC,CAAA,EAAG,CAAA,EAAG,UAAA,CAAW,CAAA,CAAE,CAAC,CAAC,GAAG,CAAA;AAAA,EAC1D;AACA,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,IAAA,MAAM,CAAA,GAAI,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA;AACtB,IAAA,MAAM,CAAA,GAAI,OAAO,CAAC,CAAA;AAClB,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA;AACnB,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA;AACnB,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,EAAA,EAAI,EAAE,CAAA;AAC7B,IAAA,IAAI,MAAM,EAAA,EAAI;AACd,IAAA,MAAM,KAAK,EAAA,GAAK,GAAA;AAChB,IAAA,MAAM,KAAK,EAAA,GAAK,GAAA;AAEhB,IAAA,MAAM,KAAK,CAAC,EAAA;AACZ,IAAA,MAAM,EAAA,GAAK,EAAA;AACX,IAAA,KAAA,IAAS,CAAA,GAAI,EAAA,EAAI,CAAA,GAAI,GAAA,EAAK,KAAK,EAAA,EAAI;AACjC,MAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,EAAA,GAAK,CAAA;AACtB,MAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,EAAA,GAAK,CAAA;AACtB,MAAA,KAAA,CAAM,IAAA;AAAA,QACJb,sBAAA,CAAO;AAAA,UACL,EAAA,EAAI,EAAA,GAAK,EAAA,GAAK,CAAA,GAAI,EAAA,GAAK,CAAA;AAAA,UACvB,EAAA,EAAI,EAAA,GAAK,EAAA,GAAK,CAAA,GAAI,EAAA,GAAK,CAAA;AAAA,UACvB,EAAA,EAAI,EAAA,GAAK,EAAA,GAAK,CAAA,GAAI,EAAA,GAAK,CAAA;AAAA,UACvB,EAAA,EAAI,EAAA,GAAK,EAAA,GAAK,CAAA,GAAI,EAAA,GAAK,CAAA;AAAA,UACvB,KAAA,EAAO;AAAA,SACR;AAAA,OACH;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,YAAA,CAAa,KAAa,OAAA,EAAgC;AACxE,EAAA,MAAM,MAAA,GAAS,UAAU,GAAG,CAAA;AAC5B,EAAA,OAAOkC,cAAa,MAAM,CAAA;AAC5B;AAOA,SAASA,cAAa,MAAA,EAAiC;AACrD,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,SAAA,CAAU,GAAA,CAAI,CAAC,EAAA,KAAO;AAC9C,IAAA,MAAM,MAAA,GAAS,WAAA,CAAY,EAAA,CAAG,KAAA,CAAM,SAAA,EAAW,GAAG,KAAA,CAAM,GAAA,IAAO,EAAA,CAAG,KAAA,CAAM,EAAE,CAAA;AAC1E,IAAA,OAAOrB,uBAAA;AAAA,MACL;AAAA,QACE,KAAA,EAAO,mBAAA;AAAA,QACP,SAAA,EAAW,GAAG,KAAA,CAAM,EAAA;AAAA,QACpB,WAAA,EAAa,GAAG,KAAA,CAAM,SAAA;AAAA,QACtB,WAAW,CAAA,UAAA,EAAa,EAAA,CAAG,EAAE,CAAA,CAAA,EAAI,GAAG,EAAE,CAAA,CAAA;AAAA,OACxC;AAAA,MACA,CAAC,MAAM;AAAA,KACT;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,KAAM;AAC9C,IAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,KAAW,QAAA,CAAS,CAAA,CAAE,KAAK,GAAG,CAAA;AAC9C,IAAA,OAAOA,uBAAA;AAAA,MACL;AAAA,QACE,KAAA,EAAO,SAAA;AAAA,QACP,UAAA,EAAY,EAAE,IAAA,CAAK,GAAA;AAAA,QACnB,eAAA,EAAiB,EAAE,IAAA,CAAK,QAAA;AAAA,QACxB,WAAW,CAAA,UAAA,EAAa,CAAA,CAAE,EAAE,CAAA,CAAA,EAAI,EAAE,EAAE,CAAA,CAAA;AAAA,OACtC;AAAA,MACA,CAAC,gBAAA,CAAiB,CAAA,CAAE,KAAK,QAAA,EAAU,MAAA,EAAQ,MAAM,CAAC;AAAA,KACpD;AAAA,EACF,CAAC,CAAA;AAKD,EAAA,MAAM,cAAwB,EAAC;AAC/B,EAAA,KAAA,MAAW,CAAA,IAAK,OAAO,WAAA,EAAa;AAClC,IAAA,IAAI,CAAA,CAAE,KAAK,QAAA,EAAU;AACnB,MAAA,MAAM,EAAA,GAAK,MAAA,CAAO,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,CAAM,EAAA,KAAO,CAAA,CAAE,IAAA,CAAK,QAAQ,CAAA;AACtE,MAAA,IAAI,EAAA,EAAI;AACN,QAAA,MAAM,KAAK,CAAA,CAAE,EAAA;AACb,QAAA,MAAM,KAAK,CAAA,CAAE,EAAA;AACb,QAAA,MAAM,KAAK,EAAA,CAAG,EAAA;AACd,QAAA,MAAM,EAAA,GAAK,EAAA,CAAG,EAAA,GAAK,EAAA,CAAG,MAAA,GAAS,CAAA;AAC/B,QAAA,WAAA,CAAY,IAAA;AAAA,UACVD,sBAAA,CAAO;AAAA,YACL,GAAG,CAAA,EAAA,EAAK,EAAE,IAAI,EAAE,CAAA,GAAA,EAAM,EAAE,CAAA,CAAA,EAAI,EAAA,GAAK,CAAC,CAAA,GAAA,EAAM,EAAE,CAAA,CAAA,EAAI,EAAA,GAAK,CAAC,CAAA,GAAA,EAAM,EAAE,IAAI,EAAE,CAAA,CAAA;AAAA,YAClE,KAAA,EAAO;AAAA,WACR;AAAA,SACH;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAI,CAAA,CAAE,KAAK,QAAA,EAAU;AACnB,MAAA,MAAM,EAAA,GAAK,MAAA,CAAO,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,CAAM,EAAA,KAAO,CAAA,CAAE,IAAA,CAAK,QAAQ,CAAA;AACtE,MAAA,IAAI,EAAA,EAAI;AACN,QAAA,MAAM,KAAK,CAAA,CAAE,EAAA;AACb,QAAA,MAAM,EAAA,GAAK,CAAA,CAAE,EAAA,GAAK,CAAA,CAAE,CAAA;AACpB,QAAA,MAAM,KAAK,EAAA,CAAG,EAAA;AACd,QAAA,MAAM,KAAK,EAAA,CAAG,CAAA;AACd,QAAA,WAAA,CAAY,IAAA;AAAA,UACVA,sBAAA,CAAO;AAAA,YACL,CAAA,EAAG,CAAA,EAAA,EAAK,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,GAAA,EAAM,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,GAAA,EAAM,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA;AAAA,YAC5C,KAAA,EAAO;AAAA,WACR;AAAA,SACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,KAAA,GACrBX,sBAAA,CAAO,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,KAAA,EAAO,cAAA,EAAe,EAAG,MAAA,CAAO,KAAK,CAAA,GAC5D,EAAA;AAEJ,EAAA,OAAOgB,yBAAA;AAAA,IACL;AAAA,MACE,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,SAAS,CAAA,IAAA,EAAO,MAAA,CAAO,KAAK,CAAA,CAAA,EAAI,OAAO,MAAM,CAAA,CAAA;AAAA,MAC7C,KAAA,EAAO,QAAA;AAAA,MACP,mBAAA,EAAqB;AAAA,KACvB;AAAA,IACA;AAAA,MACED,oBAAA,CAAG,OAAA,EAAS,EAAC,EAAGE,2BAAA,CAAU,CAAA,IAAA,EAAO,MAAA,CAAO,KAAA,GAAQ,UAAA,GAAQ,MAAA,CAAO,KAAA,GAAQ,EAAE,EAAE,CAAC,CAAA;AAAA,MAC5EF,oBAAA,CAAG,MAAA,EAAQ,EAAC,EAAG,gDAAgD,CAAA;AAAA,MAC/DS,sBAAA,CAAK;AAAA,QACHT,oBAAA;AAAA,UACE,QAAA;AAAA,UACA;AAAA,YACE,EAAA,EAAI,QAAA;AAAA,YACJ,WAAA,EAAa,EAAA;AAAA,YACb,YAAA,EAAc,EAAA;AAAA,YACd,IAAA,EAAM,CAAA;AAAA,YACN,IAAA,EAAM,CAAA;AAAA,YACN,MAAA,EAAQ,MAAA;AAAA,YACR,WAAA,EAAa;AAAA,WACf;AAAA,UACA,CAACL,0BAAQ,EAAE,MAAA,EAAQ,gBAAgB,IAAA,EAAM,SAAA,EAAW,CAAC;AAAA,SACvD;AAAA,QACAK,oBAAA,CAAG,OAAA,EAAS,EAAC,EAAGiB,MAAK;AAAA,OACtB,CAAA;AAAA,MACD,SAAA;AAAA,MACApB,uBAAA,CAAM,EAAE,KAAA,EAAO,kBAAA,IAAsB,UAAU,CAAA;AAAA,MAC/CA,uBAAA,CAAM,EAAE,KAAA,EAAO,cAAA,IAAkB,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,UAAU,CAAC,CAAA;AAAA,MAC7DA,uBAAA,CAAM,EAAE,KAAA,EAAO,gBAAA,IAAoB,WAAW,CAAA;AAAA,MAC9CA,uBAAA,CAAM,EAAE,KAAA,EAAO,oBAAA,IAAwB,SAAS;AAAA;AAClD,GACF;AACF;AAEA,SAAS,SAAS,GAAA,EAAiD;AACjE,EAAA,MAAM,GAAA,GAAM,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAA;AAC3B,EAAA,IAAI,MAAM,CAAA,EAAG,OAAO,EAAE,MAAA,EAAQ,GAAA,EAAK,QAAQ,EAAA,EAAG;AAC9C,EAAA,OAAO,EAAE,MAAA,EAAQ,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,EAAG,MAAA,EAAQ,GAAA,CAAI,KAAA,CAAM,GAAA,GAAM,CAAC,CAAA,EAAE;AACjE;;;AClOO,SAAS,QAAQZ,KAAAA,EAAqC;AAC3D,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI;AACF,IAAA,GAAA,GAAM,SAASA,KAAI,CAAA;AAAA,EACrB,CAAA,CAAA,MAAQ;AAEN,IAAA,OAAO,EAAC;AAAA,EACV;AACA,EAAA,OAAO,WAAW,GAAG,CAAA;AACvB;AAGA,IAAM,YAAA,uBAAmB,GAAA,CAAiB;AAAA,EACxC,WAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAC,CAAA;AAGD,SAAS,UAAU,GAAA,EAAqB;AACtC,EAAA,MAAM,OAAO,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,GAAA;AAClC,EAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,YAAA,EAAc,EAAE,EAAE,WAAA,EAAY;AACpD;AAGA,SAAS,aAAa,GAAA,EAAsB;AAC1C,EAAA,OAAO,UAAU,GAAG,CAAA,CAAE,MAAM,CAAC,CAAA,CAAE,SAAS,GAAG,CAAA;AAC7C;AAGA,SAAS,cAAc,GAAA,EAAsB;AAC3C,EAAA,OAAO,UAAU,GAAG,CAAA,CAAE,MAAM,CAAC,CAAA,CAAE,SAAS,GAAG,CAAA;AAC7C;AAEO,SAAS,WAAW,GAAA,EAAoC;AAC7D,EAAA,MAAM,MAA6B,EAAC;AAEpC,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAA2B;AACjD,EAAA,KAAA,MAAW,QAAQ,GAAA,CAAI,WAAA,YAAuB,GAAA,CAAI,IAAA,CAAK,KAAK,IAAI,CAAA;AAEhE,EAAA,MAAM,kBAAkB,IAAI,GAAA;AAAA,IAC1B,GAAA,CAAI,SAAA,CAAU,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAA,KAAc,eAAe,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,EAAE;AAAA,GAC9E;AAGA,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAyB;AAC/C,EAAA,MAAM,OAAA,GAAU,CAAC,CAAA,EAAW,CAAA,KAAc;AACxC,IAAA,IAAI,CAAC,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,YAAa,GAAA,CAAI,CAAA,kBAAG,IAAI,GAAA,EAAK,CAAA;AACjD,IAAA,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,CAAG,GAAA,CAAI,CAAC,CAAA;AAAA,EACzB,CAAA;AACA,EAAA,KAAA,MAAW,EAAA,IAAM,IAAI,KAAA,EAAO;AAC1B,IAAA,IAAI,CAAC,YAAA,CAAa,GAAA,CAAI,EAAA,CAAG,QAAQ,CAAA,EAAG;AACpC,IAAA,MAAM,CAAA,GAAI,GAAG,IAAA,CAAK,EAAA;AAClB,IAAA,MAAM,CAAA,GAAI,GAAG,EAAA,CAAG,EAAA;AAChB,IAAA,IAAI,UAAU,GAAA,CAAI,CAAC,KAAK,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,EAAG;AACxC,MAAA,OAAA,CAAQ,GAAG,CAAC,CAAA;AACZ,MAAA,OAAA,CAAQ,GAAG,CAAC,CAAA;AAAA,IACd;AAAA,EACF;AAEA,EAAA,MAAM,kBAAA,GAAqB,CAAC,KAAA,KAA2B;AACrD,IAAA,MAAM,IAAA,mBAAO,IAAI,GAAA,CAAY,CAAC,KAAK,CAAC,CAAA;AACpC,IAAA,MAAM,KAAA,GAAQ,CAAC,KAAK,CAAA;AACpB,IAAA,OAAO,MAAM,MAAA,EAAQ;AACnB,MAAA,MAAM,GAAA,GAAM,MAAM,KAAA,EAAM;AACxB,MAAA,IAAI,GAAA,KAAQ,KAAA,IAAS,YAAA,CAAa,GAAG,GAAG,OAAO,IAAA;AAC/C,MAAA,KAAA,MAAW,OAAO,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA,IAAK,EAAC,EAAG;AAC1C,QAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG;AAClB,UAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AACZ,UAAA,KAAA,CAAM,KAAK,GAAG,CAAA;AAAA,QAChB;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO,KAAA;AAAA,EACT,CAAA;AAGA,EAAA,KAAA,MAAW,IAAA,IAAQ,IAAI,WAAA,EAAa;AAGlC,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,IAAY,YAAA,CAAa,IAAA,CAAK,GAAG,CAAA,EAAG;AAC9C,IAAA,IAAI,CAAC,kBAAA,CAAmB,IAAA,CAAK,GAAG,CAAA,EAAG;AACjC,MAAA,GAAA,CAAI,IAAA,CAAK;AAAA,QACP,QAAA,EAAU,SAAA;AAAA,QACV,IAAA,EAAM,qBAAA;AAAA,QACN,OAAA,EAAS,CAAA,gBAAA,EAAmB,IAAA,CAAK,GAAG,CAAA,mCAAA,CAAA;AAAA,QACpC,IAAA,EAAM,GAAG,IAAA,CAAK,GAAG,cAAc,IAAA,CAAK,QAAQ,CAAA,oKAAA,EAAkK,IAAA,CAAK,GAAG,CAAA,mBAAA,CAAA;AAAA,QACtN,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,EAAA,IAAM,IAAI,KAAA,EAAO;AAC1B,IAAA,IAAI,CAAC,YAAA,CAAa,GAAA,CAAI,EAAA,CAAG,QAAQ,CAAA,EAAG;AACpC,IAAA,MAAM,CAAA,GAAI,GAAG,IAAA,CAAK,EAAA;AAClB,IAAA,MAAM,CAAA,GAAI,GAAG,EAAA,CAAG,EAAA;AAChB,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA;AAC7B,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA;AAG7B,IAAA,MAAM,QAAA,GACH,SAAS,aAAA,CAAc,CAAC,KAAK,CAAC,YAAA,CAAa,CAAC,CAAA,IAAK,KAAA,IAAS,YAAA,CAAa,CAAC,CAAA,IACxE,KAAA,IAAS,aAAA,CAAc,CAAC,CAAA,IAAK,CAAC,aAAa,CAAC,CAAA,IAAK,KAAA,IAAS,YAAA,CAAa,CAAC,CAAA;AAC3E,IAAA,IAAI,QAAA,IAAY,EAAA,CAAG,QAAA,KAAa,UAAA,EAAY;AAC1C,MAAA,GAAA,CAAI,IAAA,CAAK;AAAA,QACP,QAAA,EAAU,SAAA;AAAA,QACV,IAAA,EAAM,0BAAA;AAAA,QACN,SAAS,CAAA,YAAA,EAAe,CAAC,SAAI,CAAC,CAAA,KAAA,EAAQ,GAAG,QAAQ,CAAA,+EAAA,CAAA;AAAA,QACjD,IAAA,EAAM,CAAA,mIAAA,CAAA;AAAA,QACN,KAAA,EAAO;AAAA,OACR,CAAA;AACD,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,WAAA,GACH,KAAA,IAAS,YAAA,CAAa,CAAC,KAAK,eAAA,CAAgB,GAAA,CAAI,CAAC,CAAA,IACjD,SAAS,YAAA,CAAa,CAAC,CAAA,IAAK,eAAA,CAAgB,IAAI,CAAC,CAAA;AACpD,IAAA,IAAI,WAAA,IAAe,EAAA,CAAG,QAAA,KAAa,WAAA,EAAa;AAC9C,MAAA,GAAA,CAAI,IAAA,CAAK;AAAA,QACP,QAAA,EAAU,SAAA;AAAA,QACV,IAAA,EAAM,0BAAA;AAAA,QACN,SAAS,CAAA,YAAA,EAAe,CAAC,SAAI,CAAC,CAAA,KAAA,EAAQ,GAAG,QAAQ,CAAA,kFAAA,CAAA;AAAA,QACjD,IAAA,EAAM,CAAA,uGAAA,CAAA;AAAA,QACN,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,OAAO,GAAA;AACT;;;ACnJO,IAAM,GAAA,GAAqB;AAAA,EAChC,IAAA,EAAM,KAAA;AAAA,EACN,OAAOA,KAAAA,EAAM;AACX,IAAA,OAAO,YAAA,CAAa,KAAKA,KAAI,CAAA;AAAA,EAC/B,CAAA;AAAA,EACA,KAAA,EAAO,QAAA;AAAA,EACP,IAAA,EAAM,OAAA;AAAA,EACN,MAAA,CAAOA,OAAM,MAAA,EAAuB;AAClC,IAAA,MAAM,GAAA,GAAM,SAASA,KAAI,CAAA;AACzB,IAAA,OAAO,YAAA,CAAa,GAAW,CAAA;AAAA,EACjC;AACF;;;ACOO,IAAM,gBAAA,GAAN,cAA+B,KAAA,CAAM;AAAA,EAC1C,WAAA,CACE,SACOD,KAAAA,EACP;AACA,IAAA,KAAA,CAAMA,UAAS,MAAA,GAAY,CAAA,KAAA,EAAQA,KAAI,CAAA,EAAA,EAAK,OAAO,KAAK,OAAO,CAAA;AAFxD,IAAA,IAAA,CAAA,IAAA,GAAAA,KAAAA;AAGP,IAAA,IAAA,CAAK,IAAA,GAAO,kBAAA;AAAA,EACd;AAAA,EAJS,IAAA;AAKX,CAAA;AAQA,SAASmB,YAAW,GAAA,EAAwB;AAC1C,EAAA,MAAM,MAAiB,EAAC;AACxB,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA;AAC9B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,CAAC,CAAA,IAAK,EAAA;AAEvB,IAAA,MAAM,QAAA,GAAW,aAAa,GAAG,CAAA;AACjC,IAAA,IAAI,CAAC,QAAA,CAAS,IAAA,EAAK,EAAG;AACtB,IAAA,MAAM,eAAe,QAAA,CAAS,MAAA,GAAS,SAAS,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA,CAAE,MAAA;AACpE,IAAA,GAAA,CAAI,IAAA,CAAK;AAAA,MACP,MAAA,EAAQ,IAAA,CAAK,KAAA,CAAM,YAAA,GAAe,CAAC,CAAA;AAAA,MACnC,IAAA,EAAM,SAAS,IAAA,EAAK;AAAA,MACpB,MAAM,CAAA,GAAI;AAAA,KACX,CAAA;AAAA,EACH;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,aAAa,GAAA,EAAqB;AAEzC,EAAA,MAAM,CAAA,GAAI,IAAI,SAAA,EAAU;AACxB,EAAA,IAAI,CAAA,CAAE,WAAW,GAAG,CAAA,IAAK,EAAE,UAAA,CAAW,IAAI,GAAG,OAAO,EAAA;AAEpD,EAAA,IAAI,GAAA,GAAM,KAAA;AACV,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACnC,IAAA,MAAM,CAAA,GAAI,IAAI,CAAC,CAAA;AACf,IAAA,IAAI,CAAA,KAAM,GAAA,EAAK,GAAA,GAAM,CAAC,GAAA;AAAA,SAAA,IACb,CAAC,OAAO,CAAA,KAAM,GAAA,SAAY,GAAA,CAAI,KAAA,CAAM,GAAG,CAAC,CAAA;AAAA,EACnD;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,UAAA,CAAW,GAAW,OAAA,EAAyB;AACtD,EAAA,MAAM,OAAA,GAAU,CAAA,CAAE,OAAA,CAAQ,SAAA,EAAW,EAAE,CAAA;AACvC,EAAA,IAAI,CAAC,SAAA,CAAU,IAAA,CAAK,OAAO,CAAA,EAAG;AAC5B,IAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,uBAAA,EAA0B,CAAC,KAAK,OAAO,CAAA;AAAA,EACpE;AACA,EAAA,OAAO,MAAA,CAAO,QAAA,CAAS,OAAA,EAAS,EAAE,CAAA;AACpC;AAEA,SAAS,OAAA,CAAQlB,OAAc,OAAA,EAAiD;AAC9E,EAAA,MAAM,KAAA,GAAQA,KAAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AAC9B,EAAA,IAAI,KAAA,GAAQ,GAAG,MAAM,IAAI,iBAAiB,CAAA,4BAAA,EAA+BA,KAAI,KAAK,OAAO,CAAA;AACzF,EAAA,OAAO;AAAA,IACL,GAAA,EAAKA,MAAK,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA,CAAE,IAAA,GAAO,WAAA,EAAY;AAAA,IAC7C,OAAOA,KAAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,CAAC,EAAE,IAAA;AAAK,GACpC;AACF;AAMA,SAAS,UAAA,CAAW,OAAe,OAAA,EAAyD;AAC1F,EAAA,MAAM,MAA8C,EAAC;AACrD,EAAA,IAAI,CAAC,KAAA,CAAM,IAAA,EAAK,EAAG,OAAO,GAAA;AAC1B,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,IAAI,GAAA,GAAM,KAAA;AACV,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,CAAA,GAAI,MAAM,CAAC,CAAA;AACjB,IAAA,IAAI,MAAM,GAAA,EAAK;AAAE,MAAA,GAAA,GAAM,CAAC,GAAA;AAAK,MAAA,GAAA,IAAO,CAAA;AAAG,MAAA;AAAA,IAAU;AACjD,IAAA,IAAI,CAAC,GAAA,IAAO,CAAA,KAAM,GAAA,EAAK;AACrB,MAAA,IAAI,IAAI,IAAA,EAAK,SAAU,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA;AACtC,MAAA,GAAA,GAAM,EAAA;AACN,MAAA;AAAA,IACF;AACA,IAAA,GAAA,IAAO,CAAA;AAAA,EACT;AACA,EAAA,IAAI,IAAI,IAAA,EAAK,SAAU,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA;AAEtC,EAAA,KAAA,MAAW,OAAO,MAAA,EAAQ;AACxB,IAAA,MAAM,EAAA,GAAK,GAAA,CAAI,WAAA,CAAY,GAAG,CAAA;AAC9B,IAAA,IAAI,KAAK,CAAA,EAAG;AACV,MAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,4BAAA,EAA+B,GAAG,KAAK,OAAO,CAAA;AAAA,IAC3E;AACA,IAAA,IAAI,OAAO,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,EAAE,EAAE,IAAA,EAAK;AACjC,IAAA,MAAM,WAAW,GAAA,CAAI,KAAA,CAAM,EAAA,GAAK,CAAC,EAAE,IAAA,EAAK;AACxC,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,EAAG,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AACvE,IAAA,IAAI,CAAC,MAAM,MAAM,IAAI,iBAAiB,CAAA,oBAAA,EAAuB,GAAG,KAAK,OAAO,CAAA;AAC5E,IAAA,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,KAAA,EAAO,WAAW,QAAA,EAAU,OAAO,GAAG,CAAA;AAAA,EACzD;AACA,EAAA,OAAO,GAAA;AACT;AAMA,SAAS,YAAA,CACP,KAAA,EACA,MAAA,EACA,YAAA,EACW;AACX,EAAA,MAAM,MAAiB,EAAC;AACxB,EAAA,OAAO,MAAA,CAAO,CAAA,GAAI,KAAA,CAAM,MAAA,EAAQ;AAC9B,IAAA,MAAM,CAAA,GAAI,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA;AACxB,IAAA,IAAI,CAAA,CAAE,UAAU,YAAA,EAAc;AAC9B,IAAA,GAAA,CAAI,KAAK,CAAC,CAAA;AACV,IAAA,MAAA,CAAO,CAAA,EAAA;AAAA,EACT;AACA,EAAA,OAAO,GAAA;AACT;AAGA,SAAS,cAAc,KAAA,EAAyE;AAC9F,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAsD;AACtE,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,GAAA;AAC/B,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,CAAC,CAAA,CAAG,MAAA;AAC7B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,CAAA,GAAI,MAAM,CAAC,CAAA;AACjB,IAAA,IAAI,CAAA,CAAE,WAAW,UAAA,EAAY;AAC3B,MAAA,MAAM,IAAI,gBAAA;AAAA,QACR,wCAAwC,UAAA,GAAa,CAAC,CAAA,aAAA,EAAgB,CAAA,CAAE,SAAS,CAAC,CAAA,CAAA,CAAA;AAAA,QAClF,CAAA,CAAE;AAAA,OACJ;AAAA,IACF;AACA,IAAA,MAAM,EAAE,KAAK,KAAA,EAAM,GAAI,QAAQ,CAAA,CAAE,IAAA,EAAM,EAAE,IAAI,CAAA;AAE7C,IAAA,MAAM,SAAoB,EAAC;AAC3B,IAAA,IAAI,IAAI,CAAA,GAAI,CAAA;AACZ,IAAA,OAAO,IAAI,KAAA,CAAM,MAAA,IAAU,MAAM,CAAC,CAAA,CAAG,SAAS,UAAA,EAAY;AACxD,MAAA,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAE,CAAA;AACrB,MAAA,CAAA,EAAA;AAAA,IACF;AAEA,IAAA,GAAA,CAAI,GAAA,CAAI,KAAK,EAAE,MAAA,EAAQ,EAAE,GAAG,CAAA,EAAG,MAAM,KAAA,GAAQ,CAAA,EAAG,GAAG,CAAA,EAAA,EAAK,KAAK,KAAK,CAAA,EAAG,GAAG,KAAI,EAAG,QAAA,EAAU,QAAQ,CAAA;AACjG,IAAA,CAAA,GAAI,CAAA,GAAI,CAAA;AAAA,EACV;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,UAAA,CAAW,KAA4D,GAAA,EAA0D;AACxI,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA;AACzB,EAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AACnB,EAAA,IAAI,KAAA,CAAM,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG;AAC7B,IAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,CAAA,EAAI,GAAG,CAAA,0CAAA,CAAA,EAA8C,KAAA,CAAM,OAAO,IAAI,CAAA;AAAA,EACnG;AACA,EAAA,MAAM,EAAE,OAAM,GAAI,OAAA,CAAQ,MAAM,MAAA,CAAO,IAAA,EAAM,KAAA,CAAM,MAAA,CAAO,IAAI,CAAA;AAC9D,EAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,KAAA,CAAM,OAAO,IAAA,EAAK;AAC1C;AAEA,SAAS,OAAA,CAAQ,KAA4D,GAAA,EAAiC;AAC5G,EAAA,MAAM,CAAA,GAAI,UAAA,CAAW,GAAA,EAAK,GAAG,CAAA;AAC7B,EAAA,IAAI,CAAA,KAAM,QAAW,OAAO,MAAA;AAC5B,EAAA,OAAO,UAAA,CAAW,CAAA,CAAE,KAAA,EAAO,CAAA,CAAE,IAAI,CAAA;AACnC;AAEA,SAAS,WAAA,CAAY,KAA4D,GAAA,EAAyC;AACxH,EAAA,MAAM,CAAA,GAAI,UAAA,CAAW,GAAA,EAAK,GAAG,CAAA;AAC7B,EAAA,IAAI,CAAA,KAAM,QAAW,OAAO,MAAA;AAC5B,EAAA,OAAO,UAAA,CAAW,CAAA,CAAE,KAAA,EAAO,CAAA,CAAE,IAAI,CAAA;AACnC;AAEA,SAAS,WAAA,CAAY,KAA4D,GAAA,EAAyC;AACxH,EAAA,MAAM,CAAA,GAAI,UAAA,CAAW,GAAA,EAAK,GAAG,CAAA;AAC7B,EAAA,IAAI,CAAA,KAAM,QAAW,OAAO,MAAA;AAC5B,EAAA,OAAO,UAAA,CAAW,CAAA,CAAE,KAAA,EAAO,CAAA,CAAE,IAAI,CAAA;AACnC;AAEA,SAAS,SAAA,CAAU,KAA4D,GAAA,EAAoC;AACjH,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA;AACzB,EAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AACnB,EAAA,OAAO,KAAA,CAAM,QAAA;AACf;AAEA,SAAS,UAAA,CACP,GAAA,EACA,GAAA,EACA,WAAA,EACA,OAAA,EACQ;AACR,EAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAA;AAC1B,EAAA,IAAI,MAAM,MAAA,EAAW;AACnB,IAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,EAAG,OAAO,CAAA,4BAAA,EAA+B,GAAG,KAAK,WAAW,CAAA;AAAA,EACzF;AACA,EAAA,OAAO,CAAA;AACT;AAEA,IAAM,gBAAA,uBAAuB,GAAA,CAAI;AAAA,EAC/B,GAAA;AAAA,EACA,SAAA;AAAA,EACA,oBAAA;AAAA,EACA,uBAAA;AAAA,EACA;AACF,CAAC,CAAA;AACD,IAAM,sCAAsB,IAAI,GAAA,CAAI,CAAC,GAAA,EAAK,SAAS,CAAC,CAAA;AACpD,IAAM,iBAAA,uBAAwB,GAAA,CAAI;AAAA,EAChC,kBAAA;AAAA,EACA,UAAA;AAAA,EACA,gBAAA;AAAA,EACA;AACF,CAAC,CAAA;AACD,IAAM,sCAAsB,IAAI,GAAA,CAAI,CAAC,oBAAA,EAAsB,UAAU,CAAC,CAAA;AACtE,IAAM,mCAAmB,IAAI,GAAA,CAAI,CAAC,SAAA,EAAW,SAAA,EAAW,cAAc,CAAC,CAAA;AACvE,IAAM,mCAAmB,IAAI,GAAA,CAAI,CAAC,GAAA,EAAK,SAAS,CAAC,CAAA;AACjD,IAAM,mCAAmB,IAAI,GAAA,CAAI,CAAC,GAAA,EAAK,SAAA,EAAW,SAAS,CAAC,CAAA;AAC5D,IAAM,oCAAoB,IAAI,GAAA,CAAI,CAAC,WAAA,EAAa,OAAO,CAAC,CAAA;AAExD,SAAS,UAAA,CACP,GAAA,EACA,OAAA,EACA,OAAA,EACM;AACN,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,KAAK,CAAA,IAAK,GAAA,CAAI,SAAQ,EAAG;AACtC,IAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,EAAG;AACnB,MAAA,MAAM,IAAI,iBAAiB,CAAA,aAAA,EAAgB,CAAC,QAAQ,OAAO,CAAA,CAAA,EAAI,KAAA,CAAM,MAAA,CAAO,IAAI,CAAA;AAAA,IAClF;AAAA,EACF;AACF;AAEA,SAAS,cAAA,CAAe,OAAkB,WAAA,EAAsC;AAC9E,EAAA,MAAM,GAAA,GAAM,cAAc,KAAK,CAAA;AAC/B,EAAA,UAAA,CAAW,GAAA,EAAK,kBAAkB,UAAU,CAAA;AAC5C,EAAA,MAAM,CAAA,GAAI,UAAA,CAAW,GAAA,EAAK,GAAA,EAAK,aAAa,UAAU,CAAA;AACtD,EAAA,MAAM,OAAA,GAAU,WAAA,CAAY,GAAA,EAAK,SAAS,CAAA;AAC1C,EAAA,OAAO,UAAU,EAAE,CAAA,EAAG,OAAA,EAAQ,GAAI,EAAE,CAAA,EAAE;AACxC;AAEA,SAAS,kBAAA,CAAmB,OAAkB,WAAA,EAA4C;AACxF,EAAA,MAAM,GAAA,GAAM,cAAc,KAAK,CAAA;AAC/B,EAAA,UAAA,CAAW,GAAA,EAAK,kBAAkB,kBAAkB,CAAA;AACpD,EAAA,MAAM,CAAA,GAAI,UAAA,CAAW,GAAA,EAAK,GAAA,EAAK,aAAa,kBAAkB,CAAA;AAC9D,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,GAAA,EAAK,SAAS,CAAA;AACtC,EAAA,MAAM,OAAA,GAAU,WAAA,CAAY,GAAA,EAAK,SAAS,CAAA;AAC1C,EAAA,MAAM,GAAA,GAA6B,EAAE,CAAA,EAAE;AACvC,EAAA,IAAI,OAAA,KAAY,MAAA,EAAW,GAAA,CAAI,OAAA,GAAU,OAAA;AACzC,EAAA,IAAI,OAAA,MAAa,OAAA,GAAU,OAAA;AAC3B,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,4BAAA,CAA6B,OAAkB,WAAA,EAAoD;AAC1G,EAAA,MAAM,GAAA,GAAM,cAAc,KAAK,CAAA;AAC/B,EAAA,UAAA,CAAW,GAAA,EAAK,kBAAkB,0BAA0B,CAAA;AAC5D,EAAA,MAAM,CAAA,GAAI,UAAA,CAAW,GAAA,EAAK,GAAA,EAAK,aAAa,0BAA0B,CAAA;AACtE,EAAA,MAAM,OAAA,GAAU,WAAA,CAAY,GAAA,EAAK,SAAS,CAAA;AAC1C,EAAA,MAAM,iBAAA,GAAoB,OAAA,CAAQ,GAAA,EAAK,oBAAoB,CAAA;AAC3D,EAAA,MAAM,oBAAA,GAAuB,OAAA,CAAQ,GAAA,EAAK,uBAAuB,CAAA;AACjE,EAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,GAAA,EAAK,eAAe,CAAA;AACjD,EAAA,MAAM,GAAA,GAAqC,EAAE,CAAA,EAAE;AAC/C,EAAA,IAAI,OAAA,MAAa,OAAA,GAAU,OAAA;AAC3B,EAAA,IAAI,iBAAA,KAAsB,MAAA,EAAW,GAAA,CAAI,iBAAA,GAAoB,iBAAA;AAC7D,EAAA,IAAI,oBAAA,KAAyB,MAAA,EAAW,GAAA,CAAI,oBAAA,GAAuB,oBAAA;AACnE,EAAA,IAAI,YAAA,KAAiB,MAAA,EAAW,GAAA,CAAI,YAAA,GAAe,YAAA;AACnD,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,wBAAA,CAAyB,OAAkB,WAAA,EAAgD;AAClG,EAAA,MAAM,GAAA,GAAM,cAAc,KAAK,CAAA;AAC/B,EAAA,UAAA,CAAW,GAAA,EAAK,qBAAqB,sBAAsB,CAAA;AAC3D,EAAA,MAAM,CAAA,GAAI,UAAA,CAAW,GAAA,EAAK,GAAA,EAAK,aAAa,sBAAsB,CAAA;AAClE,EAAA,MAAM,OAAA,GAAU,WAAA,CAAY,GAAA,EAAK,SAAS,CAAA;AAC1C,EAAA,OAAO,UAAU,EAAE,CAAA,EAAG,OAAA,EAAQ,GAAI,EAAE,CAAA,EAAE;AACxC;AAEA,SAAS,cAAA,CAAe,OAAkB,WAAA,EAAsC;AAC9E,EAAA,MAAM,GAAA,GAAM,cAAc,KAAK,CAAA;AAC/B,EAAA,UAAA,CAAW,GAAA,EAAK,mBAAmB,WAAW,CAAA;AAC9C,EAAA,MAAM,eAAA,GAAkB,UAAA,CAAW,GAAA,EAAK,kBAAA,EAAoB,aAAa,WAAW,CAAA;AACpF,EAAA,MAAM,aAAA,GAAgB,SAAA,CAAU,GAAA,EAAK,UAAU,CAAA;AAC/C,EAAA,IAAI,CAAC,aAAA,IAAiB,aAAA,CAAc,MAAA,KAAW,CAAA,EAAG;AAChD,IAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,+CAAA,CAAA,EAAmD,WAAW,CAAA;AAAA,EAC3F;AACA,EAAA,MAAM,QAAA,GAAW,eAAe,aAAA,EAAe,GAAA,CAAI,IAAI,UAAU,CAAA,CAAG,OAAO,IAAI,CAAA;AAC/E,EAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,GAAA,EAAK,gBAAgB,CAAA;AACnD,EAAA,MAAM,mBAAA,GAAsB,OAAA,CAAQ,GAAA,EAAK,uBAAuB,CAAA;AAChE,EAAA,MAAM,GAAA,GAAuB,EAAE,eAAA,EAAiB,QAAA,EAAS;AACzD,EAAA,IAAI,aAAA,KAAkB,MAAA,EAAW,GAAA,CAAI,aAAA,GAAgB,aAAA;AACrD,EAAA,IAAI,mBAAA,KAAwB,MAAA,EAAW,GAAA,CAAI,mBAAA,GAAsB,mBAAA;AACjE,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,gBAAA,CAAiB,OAAkB,WAAA,EAAwC;AAClF,EAAA,MAAM,GAAA,GAAM,cAAc,KAAK,CAAA;AAC/B,EAAA,UAAA,CAAW,GAAA,EAAK,qBAAqB,aAAa,CAAA;AAClD,EAAA,MAAM,gBAAA,GAAmB,UAAA,CAAW,GAAA,EAAK,oBAAA,EAAsB,aAAa,aAAa,CAAA;AACzF,EAAA,MAAM,aAAA,GAAgB,SAAA,CAAU,GAAA,EAAK,UAAU,CAAA;AAC/C,EAAA,IAAI,CAAC,aAAA,IAAiB,aAAA,CAAc,MAAA,KAAW,CAAA,EAAG;AAChD,IAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,iDAAA,CAAA,EAAqD,WAAW,CAAA;AAAA,EAC7F;AACA,EAAA,MAAM,QAAA,GAAW,eAAe,aAAA,EAAe,GAAA,CAAI,IAAI,UAAU,CAAA,CAAG,OAAO,IAAI,CAAA;AAC/E,EAAA,OAAO,EAAE,kBAAkB,QAAA,EAAS;AACtC;AAEA,SAAS,aAAA,CAAc,OAAkB,WAAA,EAAqC;AAC5E,EAAA,MAAM,GAAA,GAAM,cAAc,KAAK,CAAA;AAC/B,EAAA,UAAA,CAAW,GAAA,EAAK,kBAAkB,UAAU,CAAA;AAC5C,EAAA,MAAM,OAAA,GAAU,UAAA,CAAW,GAAA,EAAK,SAAA,EAAW,aAAa,UAAU,CAAA;AAClE,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,GAAA,EAAK,SAAS,CAAA;AACtC,EAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,GAAA,EAAK,cAAc,CAAA;AAChD,EAAA,MAAM,GAAA,GAAsB,EAAE,OAAA,EAAQ;AACtC,EAAA,IAAI,OAAA,KAAY,MAAA,EAAW,GAAA,CAAI,OAAA,GAAU,OAAA;AACzC,EAAA,IAAI,YAAA,KAAiB,MAAA,EAAW,GAAA,CAAI,YAAA,GAAe,YAAA;AACnD,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,SAAA,CAAU,OAAeD,KAAAA,EAA0B;AAC1D,EAAA,MAAM,CAAA,GAAI,KAAA,CAAM,IAAA,EAAK,CAAE,WAAA,EAAY;AACnC,EAAA,IAAI,MAAM,aAAA,IAAiB,CAAA,KAAM,WAAA,IAAe,CAAA,KAAM,QAAQ,OAAO,CAAA;AACrE,EAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,cAAA,EAAiB,KAAK,qDAAgDA,KAAI,CAAA;AACvG;AAEA,SAAS,SAAA,CAAU,OAAeA,KAAAA,EAA0B;AAC1D,EAAA,MAAM,CAAA,GAAI,KAAA,CAAM,IAAA,EAAK,CAAE,WAAA,EAAY;AACnC,EAAA,IAAI,CAAA,KAAM,uBAAuB,CAAA,KAAM,gBAAA,IAAoB,MAAM,KAAA,IAAS,CAAA,KAAM,OAAO,OAAO,CAAA;AAC9F,EAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,cAAA,EAAiB,KAAK,oEAA+DA,KAAI,CAAA;AACtH;AAEA,SAAS,aAAA,CAAc,OAAeA,KAAAA,EAAoC;AACxE,EAAA,MAAM,CAAA,GAAI,KAAA,CAAM,IAAA,EAAK,CAAE,WAAA,EAAY;AACnC,EAAA,IAAI,MAAM,QAAA,IAAY,CAAA,KAAM,MAAA,IAAU,CAAA,KAAM,OAAO,OAAO,CAAA;AAC1D,EAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,8CAAA,EAAiD,KAAK,KAAKA,KAAI,CAAA;AAC5F;AAEA,IAAM,UAAA,uBAAiB,GAAA,CAAI;AAAA,EACzB,kBAAA;AAAA,EACA,gBAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAC,CAAA;AAEM,SAAS,YAAY,GAAA,EAAwB;AAClD,EAAA,MAAM,KAAA,GAAQmB,YAAW,GAAG,CAAA;AAC5B,EAAA,IAAI,MAAM,MAAA,KAAW,CAAA,EAAG,MAAM,IAAI,iBAAiB,aAAa,CAAA;AAEhE,EAAA,MAAM,MAAA,GAAS,MAAM,KAAA,EAAM;AAC3B,EAAA,IAAI,OAAO,MAAA,KAAW,CAAA,IAAK,OAAO,IAAA,CAAK,WAAA,OAAkB,QAAA,EAAU;AACjE,IAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,4CAAA,EAA+C,OAAO,IAAI,CAAA,CAAA,CAAA,EAAK,OAAO,IAAI,CAAA;AAAA,EACvG;AAGA,EAAA,IAAI,IAAA,GAAmB,aAAA;AACvB,EAAA,IAAI,IAAA,GAAmB,mBAAA;AACvB,EAAA,IAAI,cAAA,GAAuC,MAAA;AAC3C,EAAA,IAAIjB,MAAAA;AACJ,EAAA,IAAI,QAAA;AAEJ,EAAA,OAAO,MAAM,MAAA,GAAS,CAAA,IAAK,MAAM,CAAC,CAAA,CAAG,WAAW,CAAA,EAAG;AACjD,IAAA,MAAM,CAAA,GAAI,MAAM,CAAC,CAAA;AACjB,IAAA,MAAM,QAAA,GAAW,CAAA,CAAE,IAAA,CAAK,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA,CAAG,IAAA,EAAK,CAAE,WAAA,EAAY;AAC1D,IAAA,IAAI,UAAA,CAAW,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC9B,IAAA,MAAM,EAAE,KAAK,KAAA,EAAM,GAAI,QAAQ,CAAA,CAAE,IAAA,EAAM,EAAE,IAAI,CAAA;AAC7C,IAAA,QAAQ,GAAA;AAAK,MACX,KAAK,MAAA;AACH,QAAA,IAAA,GAAO,SAAA,CAAU,KAAA,EAAO,CAAA,CAAE,IAAI,CAAA;AAC9B,QAAA;AAAA,MACF,KAAK,MAAA;AAAA,MACL,KAAK,aAAA;AACH,QAAA,IAAA,GAAO,SAAA,CAAU,KAAA,EAAO,CAAA,CAAE,IAAI,CAAA;AAC9B,QAAA;AAAA,MACF,KAAK,iBAAA;AACH,QAAA,cAAA,GAAiB,aAAA,CAAc,KAAA,EAAO,CAAA,CAAE,IAAI,CAAA;AAC5C,QAAA;AAAA,MACF,KAAK,OAAA;AACH,QAAAA,MAAAA,GAAQ0B,SAAQ,KAAK,CAAA;AACrB,QAAA;AAAA,MACF,KAAK,WAAA;AACH,QAAA,QAAA,GAAWA,SAAQ,KAAK,CAAA;AACxB,QAAA;AAAA,MACF,KAAK,WAAA;AACH,QAAA,IAAI,CAAC,YAAA,CAAa,IAAA,CAAK,KAAA,CAAM,IAAA,EAAM,CAAA,EAAG;AACpC,UAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,oEAAA,CAAA,EAAwE,CAAA,CAAE,IAAI,CAAA;AAAA,QAC3G;AACA,QAAA;AAAA,MACF;AACE,QAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,kBAAA,EAAqB,GAAG,CAAA,CAAA,CAAA,EAAK,EAAE,IAAI,CAAA;AAAA;AAElE,IAAA,KAAA,CAAM,KAAA,EAAM;AAAA,EACd;AAGA,EAAA,MAAM,MAAA,GAAS,EAAE,CAAA,EAAG,CAAA,EAAE;AACtB,EAAA,IAAI,eAAA;AACJ,EAAA,IAAI,cAAA;AACJ,EAAA,IAAI,mBAAA;AACJ,EAAA,IAAI,SAAA;AACJ,EAAA,IAAI,WAAA;AACJ,EAAA,IAAI,QAAA;AAEJ,EAAA,OAAO,MAAA,CAAO,CAAA,GAAI,KAAA,CAAM,MAAA,EAAQ;AAC9B,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA;AAC3B,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,MAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,wCAAA,EAA2C,KAAK,IAAI,CAAA,CAAA,CAAA,EAAK,KAAK,IAAI,CAAA;AAAA,IAC/F;AACA,IAAA,MAAM,EAAE,GAAA,EAAI,GAAI,QAAQ,IAAA,CAAK,IAAA,EAAM,KAAK,IAAI,CAAA;AAC5C,IAAA,MAAA,CAAO,CAAA,EAAA;AACP,IAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,KAAA,EAAO,MAAA,EAAQ,KAAK,MAAM,CAAA;AACrD,IAAA,QAAQ,GAAA;AAAK,MACX,KAAK,kBAAA;AACH,QAAA,eAAA,GAAkB,kBAAA,CAAmB,KAAA,EAAO,IAAA,CAAK,IAAI,CAAA;AACrD,QAAA;AAAA,MACF,KAAK,gBAAA,EAAkB;AACrB,QAAA,MAAM,GAAA,GAAM,cAAc,KAAK,CAAA;AAC/B,QAAA,UAAA,CAAW,GAAA,EAAK,mBAAmB,gBAAgB,CAAA;AACnD,QAAA,MAAM,OAAA,GAAU,SAAA,CAAU,GAAA,EAAK,WAAW,CAAA;AAC1C,QAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AACpC,UAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,qDAAA,CAAA,EAAyD,IAAA,CAAK,IAAI,CAAA;AAAA,QAC/F;AACA,QAAA,cAAA,GAAiB,6BAA6B,OAAA,EAAS,GAAA,CAAI,IAAI,WAAW,CAAA,CAAG,OAAO,IAAI,CAAA;AACxF,QAAA,MAAM,UAAA,GAAa,SAAA,CAAU,GAAA,EAAK,OAAO,CAAA;AACzC,QAAA,IAAI,UAAA,IAAc,UAAA,CAAW,MAAA,GAAS,CAAA,EAAG;AACvC,UAAA,mBAAA,GAAsB,yBAAyB,UAAA,EAAY,GAAA,CAAI,IAAI,OAAO,CAAA,CAAG,OAAO,IAAI,CAAA;AAAA,QAC1F;AACA,QAAA;AAAA,MACF;AAAA,MACA,KAAK,WAAA;AACH,QAAA,SAAA,GAAY,cAAA,CAAe,KAAA,EAAO,IAAA,CAAK,IAAI,CAAA;AAC3C,QAAA;AAAA,MACF,KAAK,aAAA;AACH,QAAA,WAAA,GAAc,gBAAA,CAAiB,KAAA,EAAO,IAAA,CAAK,IAAI,CAAA;AAC/C,QAAA;AAAA,MACF,KAAK,UAAA;AACH,QAAA,QAAA,GAAW,aAAA,CAAc,KAAA,EAAO,IAAA,CAAK,IAAI,CAAA;AACzC,QAAA;AAAA,MACF;AACE,QAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,eAAA,EAAkB,GAAG,CAAA,CAAA,CAAA,EAAK,KAAK,IAAI,CAAA;AAAA;AAClE,EACF;AAEA,EAAA,IAAI,CAAC,cAAA,EAAgB,MAAM,IAAI,iBAAiB,CAAA,0CAAA,CAA4C,CAAA;AAC5F,EAAA,IAAI,CAAC,SAAA,EAAW,MAAM,IAAI,iBAAiB,CAAA,qCAAA,CAAuC,CAAA;AAClF,EAAA,IAAI,CAAC,WAAA,EAAa,MAAM,IAAI,iBAAiB,CAAA,uCAAA,CAAyC,CAAA;AACtF,EAAA,IAAI,CAAC,QAAA,EAAU,MAAM,IAAI,iBAAiB,CAAA,oCAAA,CAAsC,CAAA;AAIhF,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,IAAI,IAAA,KAAS,WAAA,IAAe,CAAC,mBAAA,EAAqB;AAChD,IAAA,QAAA,CAAS,KAAK,CAAA,8FAAA,CAA2F,CAAA;AACzG,IAAA,IAAA,GAAO,aAAA;AAAA,EACT,CAAA,MAAA,IAAW,IAAA,KAAS,WAAA,IAAe,mBAAA,EAAqB;AACtD,IAAA,QAAA,CAAS,KAAK,CAAA,qFAAA,CAAkF,CAAA;AAChG,IAAA,IAAA,GAAO,WAAA;AAAA,EACT;AAEA,EAAA,MAAM,GAAA,GAAiB;AAAA,IACrB,IAAA,EAAM,QAAA;AAAA,IACN,IAAA;AAAA,IACA,IAAA;AAAA,IACA,cAAA;AAAA,IACA,cAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,IAAI1B,MAAAA,KAAU,MAAA,EAAW,GAAA,CAAI,KAAA,GAAQA,MAAAA;AACrC,EAAA,IAAI,QAAA,KAAa,MAAA,EAAW,GAAA,CAAI,QAAA,GAAW,QAAA;AAC3C,EAAA,IAAI,eAAA,MAAqB,eAAA,GAAkB,eAAA;AAC3C,EAAA,IAAI,mBAAA,MAAyB,mBAAA,GAAsB,mBAAA;AAEnD,EAAA,uBAAA,CAAwB,GAAG,CAAA;AAE3B,EAAA,OAAO,GAAA;AACT;AAEA,SAAS0B,SAAQ,CAAA,EAAmB;AAClC,EAAA,MAAM,CAAA,GAAI,EAAE,IAAA,EAAK;AACjB,EAAA,IAAI,CAAA,CAAE,UAAA,CAAW,GAAG,CAAA,IAAK,CAAA,CAAE,QAAA,CAAS,GAAG,CAAA,EAAG,OAAO,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAC9D,EAAA,OAAO,CAAA;AACT;AAIA,SAAS,wBAAwB,GAAA,EAAsB;AACrD,EAAA,IAAI,GAAA,CAAI,mBAAmB,KAAA,EAAO;AAElC,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,KAAK,GAAA,CAAI,cAAA;AACf,EAAA,MAAM,QAAQ,GAAA,CAAI,mBAAA;AAElB,EAAA,MAAM,eAAA,GACJ,EAAA,CAAG,CAAA,IAAK,KAAA,GAAQ,MAAM,CAAA,GAAI,CAAA,CAAA;AAC5B,EAAA,MAAM,sBAAA,GAAA,CACH,GAAG,iBAAA,IAAqB,CAAA,KACxB,GAAG,oBAAA,IAAwB,CAAA,CAAA,IAC3B,GAAG,YAAA,IAAgB,CAAA,CAAA;AACtB,EAAA,MAAM,mBAAmB,eAAA,GAAkB,sBAAA;AAC3C,EAAA,MAAM,cAAA,GAAiB,IAAI,SAAA,CAAU,eAAA;AACrC,EAAA,IAAI,qBAAqB,cAAA,EAAgB;AACvC,IAAA,MAAA,CAAO,IAAA;AAAA,MACL,CAAA,0BAAA,EAA6B,QAAQ,gBAAgB,CAAC,gBACrC,OAAA,CAAQ,eAAe,CAAC,CAAA,gBAAA,EAAc,OAAA,CAAQ,sBAAsB,CAAC,CAAA,OAAA,EAC7E,QAAQ,cAAc,CAAC,YAAY,OAAA,CAAQ,cAAA,GAAiB,gBAAgB,CAAC,CAAA,CAAA;AAAA,KACxF;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAW,IAAI,SAAA,CAAU,eAAA;AAC/B,EAAA,MAAM,gBAAA,GAAmB,GAAA,CAAI,SAAA,CAAU,QAAA,CAAS,CAAA;AAChD,EAAA,MAAM,iBAAiB,QAAA,GAAW,gBAAA;AAElC,EAAA,MAAM,MAAA,GAAS,IAAI,SAAA,CAAU,aAAA;AAC7B,EAAA,MAAM,YAAA,GAAe,GAAA,CAAI,SAAA,CAAU,mBAAA,IAAuB,CAAA;AAC1D,EAAA,MAAM,QAAA,GAAW,IAAI,WAAA,CAAY,gBAAA;AACjC,EAAA,IAAI,WAAW,MAAA,EAAW;AACxB,IAAA,IAAI,WAAW,cAAA,EAAgB;AAC7B,MAAA,MAAA,CAAO,IAAA;AAAA,QACL,CAAA,wBAAA,EAA2B,OAAA,CAAQ,cAAc,CAAC,cACnC,OAAA,CAAQ,QAAQ,CAAC,CAAA,iBAAA,EAAe,QAAQ,gBAAgB,CAAC,CAAA,OAAA,EAAU,OAAA,CAAQ,MAAM,CAAC,CAAA;AAAA,OACnG;AAAA,IACF;AACA,IAAA,IAAI,QAAA,KAAa,SAAS,YAAA,EAAc;AACtC,MAAA,MAAA,CAAO,IAAA;AAAA,QACL,+BAA+B,OAAA,CAAQ,MAAA,GAAS,YAAY,CAAC,oBACxC,OAAA,CAAQ,MAAM,CAAC,CAAA,sBAAA,EAAoB,QAAQ,YAAY,CAAC,CAAA,OAAA,EAAU,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAAA,OAC1G;AAAA,IACF;AAAA,EACF,CAAA,MAAO;AACL,IAAA,IAAI,aAAa,cAAA,EAAgB;AAC/B,MAAA,MAAA,CAAO,IAAA;AAAA,QACL,CAAA,4BAAA,EAA+B,OAAA,CAAQ,cAAc,CAAC,cACvC,OAAA,CAAQ,QAAQ,CAAC,CAAA,iBAAA,EAAe,QAAQ,gBAAgB,CAAC,CAAA,OAAA,EAAU,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAAA,OACrG;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,YAAA,GAAe,GAAA,CAAI,WAAA,CAAY,QAAA,CAAS,CAAA;AAC9C,EAAA,MAAM,mBAAmB,QAAA,GAAW,YAAA;AACpC,EAAA,MAAM,OAAA,GAAU,GAAA,CAAI,QAAA,CAAS,OAAA,IAAW,IAAI,QAAA,CAAS,OAAA;AACrD,EAAA,IAAI,UAAU,gBAAA,EAAkB;AAC9B,IAAA,MAAA,CAAO,IAAA;AAAA,MACL,6BAA6B,OAAA,CAAQ,OAAO,CAAC,CAAA,2DAAA,EAAyD,OAAA,CAAQ,gBAAgB,CAAC,CAAA,CAAA;AAAA,KACjI;AAAA,EACF;AAGA,EAAA,IAAI,EAAA,CAAG,OAAA,IAAW,EAAA,CAAG,OAAA,CAAQ,SAAS,CAAA,EAAG;AACvC,IAAA,MAAM,GAAA,GAAM,EAAA,CAAG,OAAA,CAAQ,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,CAAA,CAAE,KAAA,EAAO,CAAC,CAAA;AACtD,IAAA,IAAI,GAAA,KAAQ,GAAG,CAAA,EAAG;AAChB,MAAA,MAAA,CAAO,IAAA;AAAA,QACL,CAAA,wCAAA,EAA2C,OAAA,CAAQ,GAAG,CAAC,YAAY,OAAA,CAAQ,EAAA,CAAG,CAAC,CAAC,CAAA,SAAA,EAAY,OAAA,CAAQ,GAAA,GAAM,EAAA,CAAG,CAAC,CAAC,CAAA,CAAA;AAAA,OACjH;AAAA,IACF;AAAA,EACF;AACA,EAAA,IAAI,SAAS,KAAA,CAAM,OAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtD,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,CAAA,CAAE,KAAA,EAAO,CAAC,CAAA;AACzD,IAAA,IAAI,GAAA,KAAQ,MAAM,CAAA,EAAG;AACnB,MAAA,MAAA,CAAO,IAAA;AAAA,QACL,CAAA,oCAAA,EAAuC,QAAQ,GAAG,CAAC,YAAY,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,OACjF;AAAA,IACF;AAAA,EACF;AACA,EAAA,IAAI,GAAA,CAAI,UAAU,QAAA,CAAS,OAAA,IAAW,IAAI,SAAA,CAAU,QAAA,CAAS,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG;AAC/E,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,SAAA,CAAU,QAAA,CAAS,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAA,CAAE,KAAA,EAAO,CAAC,CAAA;AAC1E,IAAA,IAAI,QAAQ,gBAAA,EAAkB;AAC5B,MAAA,MAAA,CAAO,IAAA;AAAA,QACL,qCAAqC,OAAA,CAAQ,GAAG,CAAC,CAAA,SAAA,EAAY,OAAA,CAAQ,gBAAgB,CAAC,CAAA;AAAA,OACxF;AAAA,IACF;AAAA,EACF;AACA,EAAA,IAAI,GAAA,CAAI,YAAY,QAAA,CAAS,OAAA,IAAW,IAAI,WAAA,CAAY,QAAA,CAAS,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG;AACnF,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,WAAA,CAAY,QAAA,CAAS,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAA,CAAE,KAAA,EAAO,CAAC,CAAA;AAC5E,IAAA,IAAI,QAAQ,YAAA,EAAc;AACxB,MAAA,MAAA,CAAO,IAAA;AAAA,QACL,uCAAuC,OAAA,CAAQ,GAAG,CAAC,CAAA,SAAA,EAAY,OAAA,CAAQ,YAAY,CAAC,CAAA;AAAA,OACtF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AAEzB,EAAA,IAAI,GAAA,CAAI,mBAAmB,QAAA,EAAU;AACnC,IAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA;AAAA,IAAA,EAA4C,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAE,CAAA;AAAA,EAChG;AACA,EAAA,GAAA,CAAI,QAAA,CAAS,IAAA,CAAK,GAAG,MAAM,CAAA;AAC7B;AAEA,SAAS,QAAQ,CAAA,EAAmB;AAClC,EAAA,OAAO,CAAA,CAAE,eAAe,OAAO,CAAA;AACjC;;;ACnkBO,IAAM,YAAA,GAAe;AAAA,EAC1B,OAAA,EAAS,EAAA;AAAA;AAAA;AAAA,EAGT,cAAA,EAAgB,EAAA;AAAA,EAChB,OAAA,EAAS,EAAA;AAAA,EACK;AAAA,EACd,WAAA,EAAa,EAAA;AAAA,EACb,aAAA,EAAe,EAAA;AAAA,EACf,gBAAA,EAAkB,EAAA;AAAA,EAClB,YAAA,EAAc,EAAA;AAAA;AAAA,EACd,mBAAA,EAAqB,EAAA;AAAA,EAErB,SAAA,EAAW,EAAA;AAAA,EACX,SAAA,EAAW,EAAA;AAAA,EACX,WAAA,EAAa,EAAA;AAAA,EACb,iBAAA,EAAmB,EAAA;AAAA,EACnB,iBAAA,EAAmB,EAAA;AAAA,EACnB,UAAA,EAAY,CAAA;AAAA,EAIZ,cAAA,EAAgB,GAAA;AAAA,EAChB,cAAA,EAAgB,GAAA;AAAA,EAChB,cAAA,EAAgB,GAAA;AAAA,EAChB,cAAA,EAAgB,GAAA;AAAA,EAEhB,aAAA,EAAe,CAAA;AAAA;AAAA,EAGf,YAAA,EAAc,CAAA;AAAA;AAAA,EACd,WAAA,EAAa,GAAA;AAAA;AAAA,EACb,eAAA,EAAiB,CAAA;AAAA;AAAA,EAGjB,gBAAA,EAAkB,CAAA;AAAA;AAAA,EAGlB,eAAA,EAAiB,EAAA;AAAA,EACjB,aAAA,EAAe,EAAA;AAAA;AAAA;AAAA;AAAA,EAIf,sBAAA,EAAwB,EAAA;AAAA,EACxB,gBAAA,EAAkB,CAAA;AAAA,EAClB,gBAAA,EAAkB,EAAA;AAAA,EAClB,cAAA,EAAgB,EAAA;AAAA,EAChB,aAAA,EAAe;AAAA;AACjB,CAAA;AAYA,SAAS,MAAM,IAAA,EAAkB;AAC/B,EAAA,MAAM,UAAU,IAAA,KAAS,gBAAA;AACzB,EAAA,OAAO;AAAA,IACL,oBAAA,EAAsB,UAAU,uDAAA,GAA0D,uDAAA;AAAA,IAC1F,yBAAA,EAA2B,UAAU,6CAAA,GAAgD,6CAAA;AAAA,IACrF,iBAAA,EAAmB,UAAU,0BAAA,GAA6B,0BAAA;AAAA,IAC1D,mBAAA,EAAqB,UAAU,kCAAA,GAAqC,kCAAA;AAAA,IACpE,eAAA,EAAiB,2BAAA;AAAA,IACjB,eAAA,EAAiB,kDAAA;AAAA,IACjB,iBAAA,EAAmB,mCAAA;AAAA,IACnB,eAAA,EAAiB,UAAU,kBAAA,GAAqB,kBAAA;AAAA,IAChD,eAAA,EAAiB,UAAU,kBAAA,GAAqB,kBAAA;AAAA,IAChD,aAAA,EAAe,8BAAA;AAAA,IACf,mBAAA,EAAqB,uBAAA;AAAA,IACrB,gBAAA,EAAkB,UAAU,kCAAA,GAAqC,kCAAA;AAAA,IACjE,eAAA,EAAiB,UAAU,iCAAA,GAAoC,iCAAA;AAAA,IAC/D,cAAA,EAAgB,UAAU,wCAAA,GAA2C,4BAAA;AAAA,IACrE,YAAA,EAAc,UAAU,8BAAA,GAAiC,kBAAA;AAAA,IACzD,YAAA,EAAc,UAAU,6BAAA,GAAgC,6BAAA;AAAA,IACxD,iBAAA,EAAmB,kCAAA;AAAA,IACnB,cAAA,EAAgB,UAAU,kBAAA,GAAqB;AAAA,GACjD;AACF;AAIA,SAAS,iBAAiB,OAAA,EAAmF;AAC3G,EAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,EAAE,KAAA,EAAO,EAAC,EAAG,SAAA,EAAW,CAAA,EAAE;AACvE,EAAA,IAAI,OAAA,CAAQ,UAAU,YAAA,CAAa,gBAAA,SAAyB,EAAE,KAAA,EAAO,OAAA,EAAS,SAAA,EAAW,CAAA,EAAE;AAC3F,EAAA,MAAM,MAAA,GAAS,CAAC,GAAG,OAAO,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,KAAK,CAAA;AAC5D,EAAA,MAAM,OAAO,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,YAAA,CAAa,mBAAmB,CAAC,CAAA;AAC9D,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,YAAA,CAAa,mBAAmB,CAAC,CAAA;AAC3D,EAAA,MAAM,QAAA,GAAW,KAAK,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,CAAA,CAAE,KAAA,EAAO,CAAC,CAAA;AACrD,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,CAAC,GAAG,IAAA,EAAM,EAAE,IAAA,EAAM,CAAA,OAAA,EAAU,IAAA,CAAK,MAAM,CAAA,SAAA,CAAA,EAAa,KAAA,EAAO,QAAA,EAAU,CAAA;AAAA,IAC5E,WAAW,IAAA,CAAK;AAAA,GAClB;AACF;AAIA,SAAS,KAAK,CAAA,EAAmB;AAC/B,EAAA,OAAO,CAAA,CAAE,eAAe,OAAO,CAAA;AACjC;AAEA,SAAS,gBAAA,CAAiB,MAA6B,IAAA,EAA2B;AAChF,EAAA,MAAM,CAAA,GAAI,MAAM,IAAI,CAAA;AACpB,EAAA,MAAM,KAAA,GAA0B;AAAA,IAC9B,EAAE,IAAA,EAAM,CAAA,CAAE,cAAA,EAAgB,OAAO,OAAA,EAAQ;AAAA,IACzC,EAAE,MAAM,CAAA,aAAA,EAAgB,IAAA,CAAK,KAAK,CAAC,CAAC,CAAA,CAAA,CAAA,EAAK,KAAA,EAAO,OAAA;AAAQ,GAC1D;AACA,EAAA,IAAI,IAAA,CAAK,YAAY,MAAA,EAAW;AAC9B,IAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA,aAAA,EAAgB,IAAA,CAAK,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,CAAA,EAAK,KAAA,EAAO,OAAA,EAAS,CAAA;AAAA,EAC5E;AACA,EAAA,IAAI,KAAK,OAAA,EAAS;AAChB,IAAA,KAAA,MAAW,CAAA,IAAK,KAAK,OAAA,EAAS;AAC5B,MAAA,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,MAAA,EAAS,IAAA,CAAK,CAAA,CAAE,KAAK,CAAC,CAAA,CAAA,CAAA,EAAK,KAAA,EAAO,QAAA,EAAU,MAAA,EAAQ,GAAG,CAAA;AAAA,IACrF;AAAA,EACF;AACA,EAAA,OAAO,EAAE,IAAA,EAAM,UAAA,EAAY,OAAA,EAAS,UAAA,EAAY,KAAA,EAAO,QAAA,EAAU,YAAA,CAAa,cAAA,EAAgB,QAAA,EAAU,YAAA,CAAa,cAAA,EAAe;AACtI;AAEA,SAAS,+BAAA,CACP,IACA,IAAA,EACS;AACT,EAAA,MAAM,CAAA,GAAI,MAAM,IAAI,CAAA;AACpB,EAAA,MAAM,QAA0B,EAAC;AACjC,EAAA,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,EAAE,iBAAA,EAAmB,KAAA,EAAO,SAAS,CAAA;AACxD,EAAA,IAAI,EAAA,CAAG,OAAA,IAAW,EAAA,CAAG,OAAA,CAAQ,SAAS,CAAA,EAAG;AACvC,IAAA,KAAA,MAAW,CAAA,IAAK,GAAG,OAAA,EAAS;AAC1B,MAAA,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,MAAA,EAAS,IAAA,CAAK,CAAA,CAAE,KAAK,CAAC,CAAA,CAAA,CAAA,EAAK,KAAA,EAAO,QAAA,EAAU,MAAA,EAAQ,GAAG,CAAA;AAAA,IACrF;AAAA,EACF;AACA,EAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA,WAAA,EAAc,IAAA,CAAK,EAAA,CAAG,CAAC,CAAC,CAAA,CAAA,CAAA,EAAK,KAAA,EAAO,OAAA,EAAS,CAAA;AAChE,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,cAAA;AAAA,IACN,OAAA,EAAS,MAAA;AAAA,IACT,KAAA;AAAA,IACA,UAAU,YAAA,CAAa,cAAA;AAAA,IACvB,UAAU,YAAA,CAAa;AAAA,GACzB;AACF;AAKA,SAAS,6BAAA,CACP,IACA,IAAA,EACgB;AAChB,EAAA,MAAM,CAAA,GAAI,MAAM,IAAI,CAAA;AACpB,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,IAAI,EAAA,CAAG,iBAAA,KAAsB,MAAA,IAAa,EAAA,CAAG,oBAAoB,CAAA,EAAG;AAClE,IAAA,OAAA,CAAQ,KAAK,CAAA,+BAAA,EAAkC,IAAA,CAAK,EAAA,CAAG,iBAAiB,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,EAC9E;AACA,EAAA,IAAI,EAAA,CAAG,oBAAA,KAAyB,MAAA,IAAa,EAAA,CAAG,uBAAuB,CAAA,EAAG;AACxE,IAAA,OAAA,CAAQ,KAAK,CAAA,qCAAA,EAAwC,IAAA,CAAK,EAAA,CAAG,oBAAoB,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,EACvF;AACA,EAAA,IAAI,EAAA,CAAG,YAAA,KAAiB,MAAA,IAAa,EAAA,CAAG,eAAe,CAAA,EAAG;AACxD,IAAA,OAAA,CAAQ,KAAK,CAAA,+BAAA,EAAkC,IAAA,CAAK,EAAA,CAAG,YAAY,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,EACzE;AACA,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AACjC,EAAA,MAAM,KAAA,GAA0B,CAAC,EAAE,IAAA,EAAM,EAAE,mBAAA,EAAqB,KAAA,EAAO,SAAS,CAAA;AAChF,EAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,IAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA,EAAG,OAAO,QAAA,EAAU,MAAA,EAAQ,GAAG,CAAA;AAAA,EACpD;AACA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,YAAA;AAAA,IACN,OAAA,EAAS,WAAA;AAAA,IACT,KAAA;AAAA,IACA,UAAU,YAAA,CAAa,cAAA;AAAA,IACvB,UAAU,YAAA,CAAa;AAAA,GACzB;AACF;AAEA,SAAS,2BAAA,CAA4B,OAAkC,IAAA,EAA2B;AAChG,EAAA,MAAM,CAAA,GAAI,MAAM,IAAI,CAAA;AACpB,EAAA,MAAM,QAA0B,EAAC;AACjC,EAAA,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,EAAE,yBAAA,EAA2B,KAAA,EAAO,SAAS,CAAA;AAChE,EAAA,IAAI,KAAA,CAAM,OAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA,EAAG;AAC7C,IAAA,KAAA,MAAW,CAAA,IAAK,MAAM,OAAA,EAAS;AAC7B,MAAA,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,MAAA,EAAS,IAAA,CAAK,CAAA,CAAE,KAAK,CAAC,CAAA,CAAA,CAAA,EAAK,KAAA,EAAO,QAAA,EAAU,MAAA,EAAQ,GAAG,CAAA;AAAA,IACrF;AAAA,EACF;AACA,EAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA,WAAA,EAAc,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA,CAAA,EAAK,KAAA,EAAO,OAAA,EAAS,CAAA;AACnE,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,UAAA;AAAA,IACN,OAAA,EAAS,MAAA;AAAA,IACT,KAAA;AAAA,IACA,UAAU,YAAA,CAAa,cAAA;AAAA,IACvB,UAAU,YAAA,CAAa;AAAA,GACzB;AACF;AAEA,SAAS,iBAAA,CACP,eAAA,EACA,aAAA,EACA,mBAAA,EACA,IAAA,EACS;AACT,EAAA,MAAM,CAAA,GAAI,MAAM,IAAI,CAAA;AACpB,EAAA,MAAM,KAAA,GAA0B;AAAA,IAC9B,EAAE,IAAA,EAAM,CAAA,CAAE,eAAA,EAAiB,OAAO,OAAA,EAAQ;AAAA,IAC1C,EAAE,MAAM,CAAA,IAAA,EAAO,IAAA,CAAK,eAAe,CAAC,CAAA,CAAA,EAAI,OAAO,OAAA;AAAQ,GACzD;AACA,EAAA,IAAI,kBAAkB,MAAA,EAAW;AAC/B,IAAA,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,EAAE,aAAA,EAAe,KAAA,EAAO,YAAY,CAAA;AACvD,IAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA,IAAA,EAAO,IAAA,CAAK,aAAa,CAAC,CAAA,CAAA,EAAI,KAAA,EAAO,OAAA,EAAS,CAAA;AAAA,EACnE;AACA,EAAA,IAAI,wBAAwB,MAAA,EAAW;AACrC,IAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA,EAAG,CAAA,CAAE,mBAAmB,CAAA,MAAA,EAAS,IAAA,CAAK,mBAAmB,CAAC,CAAA,CAAA,CAAA,EAAK,KAAA,EAAO,UAAU,CAAA;AAAA,EACrG;AACA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,WAAA;AAAA,IACN,OAAA,EAAS,MAAA;AAAA,IACT,KAAA;AAAA,IACA,UAAU,YAAA,CAAa,cAAA;AAAA,IACvB,UAAU,YAAA,CAAa;AAAA,GACzB;AACF;AAEA,SAAS,yBAAA,CAA0B,CAAA,EAAW,OAAA,EAAqC,IAAA,EAA2B;AAC5G,EAAA,MAAM,CAAA,GAAI,MAAM,IAAI,CAAA;AACpB,EAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAM,GAAI,iBAAiB,OAAO,CAAA;AACjD,EAAA,MAAM,GAAA,GAAwB;AAAA,IAC5B,EAAE,IAAA,EAAM,CAAA,CAAE,eAAA,EAAiB,OAAO,OAAA,EAAQ;AAAA,IAC1C,EAAE,MAAM,CAAA,IAAA,EAAO,IAAA,CAAK,CAAC,CAAC,CAAA,CAAA,EAAI,OAAO,OAAA;AAAQ,GAC3C;AACA,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,GAAA,CAAI,KAAK,EAAE,IAAA,EAAM,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,MAAA,EAAS,IAAA,CAAK,CAAA,CAAE,KAAK,CAAC,CAAA,CAAA,CAAA,EAAK,KAAA,EAAO,QAAA,EAAU,MAAA,EAAQ,GAAG,CAAA;AAAA,EACnF;AACA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,oBAAA;AAAA,IACN,OAAA,EAAS,WAAA;AAAA,IACT,KAAA,EAAO,GAAA;AAAA,IACP,UAAU,YAAA,CAAa,cAAA;AAAA,IACvB,UAAU,YAAA,CAAa;AAAA,GACzB;AACF;AAEA,SAAS,mBAAA,CAAoB,kBAA0B,IAAA,EAA2B;AAChF,EAAA,MAAM,CAAA,GAAI,MAAM,IAAI,CAAA;AACpB,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,aAAA;AAAA,IACN,OAAA,EAAS,MAAA;AAAA,IACT,KAAA,EAAO;AAAA,MACL,EAAE,IAAA,EAAM,CAAA,CAAE,gBAAA,EAAkB,OAAO,OAAA,EAAQ;AAAA,MAC3C,EAAE,MAAM,CAAA,IAAA,EAAO,IAAA,CAAK,gBAAgB,CAAC,CAAA,CAAA,EAAI,OAAO,OAAA;AAAQ,KAC1D;AAAA,IACA,UAAU,YAAA,CAAa,cAAA;AAAA,IACvB,UAAU,YAAA,CAAa;AAAA,GACzB;AACF;AAEA,SAAS,2BAAA,CAA4B,CAAA,EAAW,OAAA,EAAqC,IAAA,EAA2B;AAC9G,EAAA,MAAM,CAAA,GAAI,MAAM,IAAI,CAAA;AACpB,EAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAM,GAAI,iBAAiB,OAAO,CAAA;AACjD,EAAA,MAAM,GAAA,GAAwB;AAAA,IAC5B,EAAE,IAAA,EAAM,CAAA,CAAE,eAAA,EAAiB,OAAO,OAAA,EAAQ;AAAA,IAC1C,EAAE,MAAM,CAAA,IAAA,EAAO,IAAA,CAAK,CAAC,CAAC,CAAA,CAAA,EAAI,OAAO,OAAA;AAAQ,GAC3C;AACA,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,GAAA,CAAI,KAAK,EAAE,IAAA,EAAM,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,MAAA,EAAS,IAAA,CAAK,CAAA,CAAE,KAAK,CAAC,CAAA,CAAA,CAAA,EAAK,KAAA,EAAO,QAAA,EAAU,MAAA,EAAQ,GAAG,CAAA;AAAA,EACnF;AACA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,sBAAA;AAAA,IACN,OAAA,EAAS,WAAA;AAAA,IACT,KAAA,EAAO,GAAA;AAAA,IACP,UAAU,YAAA,CAAa,cAAA;AAAA,IACvB,UAAU,YAAA,CAAa;AAAA,GACzB;AACF;AAEA,SAAS,gBAAA,CAAiB,KAAqB,IAAA,EAA2B;AACxE,EAAA,MAAM,CAAA,GAAI,MAAM,IAAI,CAAA;AACpB,EAAA,MAAM,KAAA,GAA0B,CAAC,EAAE,IAAA,EAAM,EAAE,cAAA,EAAgB,KAAA,EAAO,SAAS,CAAA;AAC3E,EAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA,EAAG,EAAE,YAAY,CAAA,MAAA,EAAS,IAAA,CAAK,GAAA,CAAI,OAAO,CAAC,CAAA,CAAA,CAAA,EAAK,KAAA,EAAO,SAAS,CAAA;AACnF,EAAA,IAAI,GAAA,CAAI,YAAY,MAAA,EAAW;AAC7B,IAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA,EAAG,EAAE,YAAY,CAAA,MAAA,EAAS,IAAA,CAAK,GAAA,CAAI,OAAO,CAAC,CAAA,CAAA,CAAA,EAAK,KAAA,EAAO,SAAS,CAAA;AAAA,EACrF;AACA,EAAA,IAAI,GAAA,CAAI,iBAAiB,MAAA,EAAW;AAClC,IAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA,EAAG,EAAE,iBAAiB,CAAA,MAAA,EAAS,IAAA,CAAK,GAAA,CAAI,YAAY,CAAC,CAAA,CAAA,CAAA,EAAK,KAAA,EAAO,SAAS,CAAA;AAAA,EAC/F;AACA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,UAAA;AAAA,IACN,OAAA,EAAS,MAAA;AAAA,IACT,KAAA;AAAA,IACA,UAAU,YAAA,CAAa,cAAA;AAAA,IACvB,UAAU,YAAA,CAAa;AAAA,GACzB;AACF;AAIA,SAAS,aAAa,KAAA,EAAwC;AAC5D,EAAA,QAAQ,KAAA;AAAO,IACb,KAAK,OAAA;AAAA,IACL,KAAK,OAAA;AACH,MAAA,OAAO,YAAA,CAAa,YAAA;AAAA,IACtB,KAAK,UAAA;AACH,MAAA,OAAO,YAAA,CAAa,eAAA;AAAA,IACtB;AACE,MAAA,OAAO,YAAA,CAAa,WAAA;AAAA;AAE1B;AAEA,SAAS,cAAc,KAAA,EAAwC;AAC7D,EAAA,QAAQ,KAAA;AAAO,IACb,KAAK,OAAA;AACH,MAAA,OAAO,YAAA,CAAa,iBAAA;AAAA,IACtB,KAAK,OAAA;AACH,MAAA,OAAO,YAAA,CAAa,iBAAA;AAAA,IACtB;AACE,MAAA,OAAO,YAAA,CAAa,WAAA;AAAA;AAE1B;AAEA,SAAS,gBAAgB5B,KAAAA,EAA8B;AACrD,EAAA,MAAM,QAAA,GAAA,CAAYA,KAAAA,CAAK,MAAA,IAAU,CAAA,IAAK,EAAA;AACtC,EAAA,OAAO,IAAA,CAAK,KAAKA,KAAAA,CAAK,IAAA,CAAK,SAAS,YAAA,CAAaA,KAAAA,CAAK,KAAK,CAAA,GAAI,QAAQ,CAAA;AACzE;AAEA,SAAS,QAAA,CAASA,OAAsB,YAAA,EAAwC;AAC9E,EAAA,MAAM,QAAA,GAAA,CAAYA,KAAAA,CAAK,MAAA,IAAU,CAAA,IAAK,EAAA;AACtC,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,eAAe,QAAQ,CAAA;AACtD,EAAA,MAAM,EAAA,GAAK,YAAA,CAAaA,KAAAA,CAAK,KAAK,CAAA;AAClC,EAAA,MAAM,QAAA,GAAW,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,SAAA,GAAY,EAAE,CAAC,CAAA;AACvD,EAAA,IAAIA,MAAK,IAAA,CAAK,MAAA,IAAU,QAAA,EAAU,OAAO,CAACA,KAAI,CAAA;AAE9C,EAAA,MAAM,KAAA,GAAQA,KAAAA,CAAK,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AACnC,EAAA,MAAM,MAAwB,EAAC;AAC/B,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,IAAI,CAAC,GAAA,EAAK;AAAE,MAAA,GAAA,GAAM,CAAA;AAAG,MAAA;AAAA,IAAU;AAC/B,IAAA,IAAA,CAAK,GAAA,GAAM,GAAA,GAAM,CAAA,EAAG,MAAA,GAAS,QAAA,EAAU;AACrC,MAAA,GAAA,CAAI,KAAK,EAAE,GAAGA,KAAAA,EAAM,IAAA,EAAM,KAAK,CAAA;AAC/B,MAAA,GAAA,GAAM,CAAA;AAAA,IACR,CAAA,MAAO;AACL,MAAA,GAAA,GAAM,MAAM,GAAA,GAAM,CAAA;AAAA,IACpB;AAAA,EACF;AACA,EAAA,IAAI,GAAA,MAAS,IAAA,CAAK,EAAE,GAAGA,KAAAA,EAAM,IAAA,EAAM,KAAK,CAAA;AACxC,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,QAAQ,IAAA,EAAkF;AACjG,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,eAAA,CAAgB,CAAC,CAAC,GAAG,CAAC,CAAA;AAC9E,EAAA,MAAM,eAAe,IAAA,CAAK,GAAA;AAAA,IACxB,KAAK,GAAA,CAAI,OAAA,EAAS,KAAK,QAAA,GAAW,CAAA,GAAI,aAAa,SAAS,CAAA;AAAA,IAC5D,IAAA,CAAK,QAAA,GAAW,CAAA,GAAI,YAAA,CAAa;AAAA,GACnC;AACA,EAAA,MAAM,eAAiC,EAAC;AACxC,EAAA,KAAA,MAAW,CAAA,IAAK,KAAK,KAAA,EAAO;AAC1B,IAAA,YAAA,CAAa,IAAA,CAAK,GAAG,QAAA,CAAS,CAAA,EAAG,YAAY,CAAC,CAAA;AAAA,EAChD;AACA,EAAA,MAAM,WAAA,GAAc,YAAA,CAAa,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,aAAA,CAAc,CAAA,CAAE,KAAK,CAAA,EAAG,CAAC,CAAA;AAC/E,EAAA,OAAO;AAAA,IACL,OAAO,IAAA,CAAK,IAAA,CAAK,YAAA,GAAe,CAAA,GAAI,aAAa,SAAS,CAAA;AAAA,IAC1D,QAAQ,IAAA,CAAK,IAAA,CAAK,WAAA,GAAc,CAAA,GAAI,aAAa,SAAS,CAAA;AAAA,IAC1D;AAAA,GACF;AACF;AAIO,SAAS,aAAa,GAAA,EAAoC;AAC/D,EAAA,MAAM,QAAqB,EAAC;AAC5B,EAAA,MAAM,QAAsB,EAAC;AAC7B,EAAA,MAAM,QAAA,GAAW,CAAC,GAAG,GAAA,CAAI,QAAQ,CAAA;AAEjC,EAAA,MAAM,OAAO,GAAA,CAAI,IAAA,KAAS,WAAA,IAAe,CAAC,CAAC,GAAA,CAAI,mBAAA;AAG/C,EAAA,MAAM,YAAA,GAAe,IAAI,eAAA,GAAkB,gBAAA,CAAiB,IAAI,eAAA,EAAiB,GAAA,CAAI,IAAI,CAAA,GAAI,IAAA;AAC7F,EAAA,MAAM,aAAA,GAAgB,YAAA,GAAe,OAAA,CAAQ,YAAY,CAAA,GAAI,IAAA;AAE7D,EAAA,MAAM,UAAA,GAAa,+BAAA,CAAgC,GAAA,CAAI,cAAA,EAAgB,IAAI,IAAI,CAAA;AAC/E,EAAA,MAAM,WAAA,GAAc,QAAQ,UAAU,CAAA;AAEtC,EAAA,MAAM,aAAA,GAAgB,6BAAA,CAA8B,GAAA,CAAI,cAAA,EAAgB,IAAI,IAAI,CAAA;AAChF,EAAA,MAAM,cAAA,GAAiB,aAAA,GAAgB,OAAA,CAAQ,aAAa,CAAA,GAAI,IAAA;AAEhE,EAAA,MAAM,cAAc,IAAA,GAAO,2BAAA,CAA4B,IAAI,mBAAA,EAAsB,GAAA,CAAI,IAAI,CAAA,GAAI,IAAA;AAC7F,EAAA,MAAM,YAAA,GAAe,WAAA,GAAc,OAAA,CAAQ,WAAW,CAAA,GAAI,IAAA;AAE1D,EAAA,MAAM,aAAA,GAAgB,iBAAA;AAAA,IACpB,IAAI,SAAA,CAAU,eAAA;AAAA,IACd,IAAI,SAAA,CAAU,aAAA;AAAA,IACd,IAAI,SAAA,CAAU,mBAAA;AAAA,IACd,GAAA,CAAI;AAAA,GACN;AACA,EAAA,MAAM,cAAA,GAAiB,QAAQ,aAAa,CAAA;AAE5C,EAAA,MAAM,gBAAA,GAAmB,yBAAA;AAAA,IACvB,GAAA,CAAI,UAAU,QAAA,CAAS,CAAA;AAAA,IACvB,GAAA,CAAI,UAAU,QAAA,CAAS,OAAA;AAAA,IACvB,GAAA,CAAI;AAAA,GACN;AACA,EAAA,MAAM,iBAAA,GAAoB,QAAQ,gBAAgB,CAAA;AAElD,EAAA,MAAM,kBAAkB,mBAAA,CAAoB,GAAA,CAAI,WAAA,CAAY,gBAAA,EAAkB,IAAI,IAAI,CAAA;AACtF,EAAA,MAAM,gBAAA,GAAmB,QAAQ,eAAe,CAAA;AAEhD,EAAA,MAAM,kBAAA,GAAqB,2BAAA;AAAA,IACzB,GAAA,CAAI,YAAY,QAAA,CAAS,CAAA;AAAA,IACzB,GAAA,CAAI,YAAY,QAAA,CAAS,OAAA;AAAA,IACzB,GAAA,CAAI;AAAA,GACN;AACA,EAAA,MAAM,mBAAA,GAAsB,QAAQ,kBAAkB,CAAA;AAEtD,EAAA,MAAM,YAAA,GAAe,gBAAA,CAAiB,GAAA,CAAI,QAAA,EAAU,IAAI,IAAI,CAAA;AAC5D,EAAA,MAAM,aAAA,GAAgB,QAAQ,YAAY,CAAA;AAI1C,EAAA,MAAM,QAAQ,IAAA,CAAK,GAAA;AAAA,IACjB,WAAA,CAAY,KAAA;AAAA,IACZ,cAAA,CAAe,KAAA;AAAA,IACf,gBAAA,CAAiB,KAAA;AAAA,IACjB,aAAA,CAAc,KAAA;AAAA,IACd,aAAA,GAAgB,cAAc,KAAA,GAAQ,CAAA;AAAA,IACtC,YAAA,CAAa;AAAA,GACf;AAGA,EAAA,MAAM,YAAY,IAAA,CAAK,GAAA;AAAA,IACrB,iBAAA,CAAkB,KAAA;AAAA,IAClB,mBAAA,CAAoB,KAAA;AAAA,IACpB,cAAA,GAAiB,eAAe,KAAA,GAAQ,CAAA;AAAA,IACxC,YAAA,CAAa;AAAA,GACf;AAEA,EAAA,MAAM,SAAA,GACJ,QAAQ,YAAA,GACJ,IAAA,CAAK,IAAI,YAAA,CAAa,KAAA,EAAO,YAAA,CAAa,cAAc,CAAA,GACxD,CAAA;AAIN,EAAA,MAAM,cAAA,GAAiB,YAAA,CAAa,eAAA,GAAkB,YAAA,CAAa,aAAA;AACnE,EAAA,MAAM,WAAA,GAAc,YAAA,CAAa,WAAA,GAAc,cAAA,GAAiB,YAAA,CAAa,WAAA;AAC7E,EAAA,MAAM,cAAA,GAAiB,cAAc,KAAA,GAAQ,CAAA;AAC7C,EAAA,MAAM,YAAA,GAAe,WAAA,GAAc,KAAA,GAAQ,YAAA,CAAa,OAAA;AACxD,EAAA,MAAM,YAAA,GAAe,YAAA,GAAe,SAAA,GAAY,YAAA,CAAa,OAAA;AAC7D,EAAA,MAAM,eAAA,GAAkB,eAAe,SAAA,GAAY,CAAA;AACnD,EAAA,MAAM,SAAA,GAAY,IAAA,GAAO,YAAA,GAAe,SAAA,GAAY,YAAA,GAAe,SAAA;AACnE,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,IAAA,CAAK,SAAA,GAAY,aAAa,WAAW,CAAA;AAGhE,EAAA,MAAM,CAAA,GAAI,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA;AACxB,EAAA,MAAM,UAAgC,EAAC;AAGvC,EAAA,MAAM,aAAA,GAAgB,WAAA;AACtB,EAAA,MAAM,cAAA,GAAiB,aAAA,GAAgB,YAAA,GAAe,SAAA,GAAY,WAAA,GAAc,KAAA;AAChF,EAAA,MAAM,YAAY,cAAA,GAAiB,aAAA;AACnC,EAAA,MAAM,YAAA,GAAe,SAAA;AACrB,EAAA,MAAM,aAAA,GAAgB,eAAA,CAAgB,CAAA,CAAE,oBAAA,EAAsB,SAAS,CAAA;AACvE,EAAA,MAAM,mBAAmB,IAAA,GAAO,eAAA,CAAgB,EAAE,yBAAA,EAA2B,YAAY,IAAI,EAAC;AAC9F,EAAA,MAAM,kBAAkB,IAAA,CAAK,GAAA,CAAI,cAAc,MAAA,EAAQ,gBAAA,CAAiB,QAAQ,CAAC,CAAA;AACjF,EAAA,MAAM,YAAA,GAAe,gBAAgB,eAAe,CAAA;AAGpD,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,KAAA,GAAQ,YAAA,CAAa,YAAA,GAAe,CAAA;AACvD,EAAA,IAAI,OAAA,GAAU,aAAa,aAAA,GAAgB,MAAA;AAG3C,EAAA,IAAI,qBAAA,GAAwB,EAAA;AAC5B,EAAA,IAAI,iBAAA,GAAoB,EAAA;AACxB,EAAA,IAAI,kBAAA,GAAqB,cAAA;AACzB,EAAA,IAAI,gBAAgB,aAAA,EAAe;AACjC,IAAA,qBAAA,GAAwB,OAAA;AACxB,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,IAAA,EAAM,UAAA;AAAA,MACN,OAAA,EAAS,UAAA;AAAA,MACT,KAAA,EAAO,gBAAA;AAAA,MACP,CAAA,EAAG,WAAA;AAAA,MACH,CAAA,EAAG,OAAA;AAAA,MACH,KAAA,EAAO,KAAA;AAAA,MACP,QAAQ,aAAA,CAAc,MAAA;AAAA,MACtB,OAAO,aAAA,CAAc;AAAA,KACtB,CAAA;AACD,IAAA,iBAAA,GAAoB,UAAU,aAAA,CAAc,MAAA;AAC5C,IAAA,kBAAA,GAAqB,cAAA;AACrB,IAAA,OAAA,GAAU,oBAAoB,YAAA,CAAa,OAAA;AAAA,EAC7C;AAGA,EAAA,MAAM,UAAA,GAAa,OAAA;AACnB,EAAA,OAAA,IAAW,eAAe,YAAA,CAAa,cAAA;AAGvC,EAAA,MAAM,MAAA,GAAS,OAAA;AAGf,EAAA,IAAI,qBAAA,GAAwB,GAAG,qBAAA,GAAwB,MAAA;AACvD,EAAA,MAAM,OAAA,GAAU,gBAAA,CAAiB,UAAA,EAAY,KAAK,CAAA;AAClD,EAAA,KAAA,CAAM,IAAA,CAAK;AAAA,IACT,IAAA,EAAM,cAAA;AAAA,IACN,OAAA,EAAS,MAAA;AAAA,IACT,KAAA,EAAO,gBAAA;AAAA,IACP,CAAA,EAAG,WAAA;AAAA,IACH,CAAA,EAAG,MAAA;AAAA,IACH,KAAA,EAAO,KAAA;AAAA,IACP,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,OAAO,OAAA,CAAQ;AAAA,GAChB,CAAA;AACD,EAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,IACX,MAAA,EAAQ,WAAA;AAAA,IACR,UAAA,EAAY,aAAA;AAAA,IACZ,CAAA,EAAG,aAAA;AAAA,IACH,CAAA,EAAG,UAAA;AAAA,IACH,KAAA,EAAO,SAAA;AAAA,IACP,MAAA,EAAQ;AAAA,GACT,CAAA;AACD,EAAA,IAAI,WAAA,GAAc,SAAS,OAAA,CAAQ,MAAA;AAGnC,EAAA,IAAI,eAAA,GAAkB,CAAA;AACtB,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,MAAM,UAAA,GAAa,gBAAA,CAAiB,aAAA,EAAe,SAAS,CAAA;AAC5D,IAAA,eAAA,GAAkB,UAAA,CAAW,MAAA;AAC7B,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,IAAA,EAAM,YAAA;AAAA,MACN,OAAA,EAAS,WAAA;AAAA,MACT,KAAA,EAAO,gBAAA;AAAA,MACP,CAAA,EAAG,YAAA;AAAA,MACH,CAAA,EAAG,MAAA;AAAA,MACH,KAAA,EAAO,SAAA;AAAA,MACP,QAAQ,UAAA,CAAW,MAAA;AAAA,MACnB,OAAO,UAAA,CAAW;AAAA,KACnB,CAAA;AACD,IAAA,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,WAAA,EAAa,MAAA,GAAS,WAAW,MAAM,CAAA;AAAA,EAChE;AAGA,EAAA,IAAI,aAAA,GAAgB,CAAA;AACpB,EAAA,IAAI,QAAQ,WAAA,EAAa;AACvB,IAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,WAAA,EAAa,SAAS,CAAA;AACxD,IAAA,aAAA,GAAgB,QAAA,CAAS,MAAA;AACzB,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,IAAA,EAAM,UAAA;AAAA,MACN,OAAA,EAAS,MAAA;AAAA,MACT,KAAA,EAAO,gBAAA;AAAA,MACP,CAAA,EAAG,YAAA;AAAA,MACH,CAAA,EAAG,MAAA;AAAA,MACH,KAAA,EAAO,SAAA;AAAA,MACP,QAAQ,QAAA,CAAS,MAAA;AAAA,MACjB,OAAO,QAAA,CAAS;AAAA,KACjB,CAAA;AACD,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,MACX,MAAA,EAAQ,OAAA;AAAA,MACR,UAAA,EAAY,gBAAA;AAAA,MACZ,CAAA,EAAG,YAAA;AAAA,MACH,CAAA,EAAG,UAAA;AAAA,MACH,KAAA,EAAO,SAAA;AAAA,MACP,MAAA,EAAQ;AAAA,KACT,CAAA;AACD,IAAA,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,WAAA,EAAa,MAAA,GAAS,SAAS,MAAM,CAAA;AAAA,EAC9D;AAEA,EAAA,MAAM,wBAAA,GAA2B,WAAA;AACjC,EAAA,MAAM,UAAA,GAAa,IAAA,GAAO,YAAA,CAAa,cAAA,GAAiB,YAAA,CAAa,OAAA;AACrE,EAAA,OAAA,GAAU,WAAA,GAAc,UAAA;AAGxB,EAAA,MAAM,UAAA,GAAa,OAAA;AACnB,EAAA,MAAM,gBAAA,GAAmB,gBAAA,CAAiB,aAAA,EAAe,KAAK,CAAA;AAC9D,EAAA,KAAA,CAAM,IAAA,CAAK;AAAA,IACT,IAAA,EAAM,WAAA;AAAA,IACN,OAAA,EAAS,MAAA;AAAA,IACT,KAAA,EAAO,WAAA;AAAA,IACP,CAAA,EAAG,WAAA;AAAA,IACH,CAAA,EAAG,UAAA;AAAA,IACH,KAAA,EAAO,KAAA;AAAA,IACP,QAAQ,gBAAA,CAAiB,MAAA;AAAA,IACzB,OAAO,gBAAA,CAAiB;AAAA,GACzB,CAAA;AACD,EAAA,MAAM,mBAAA,GAAsB,gBAAA,CAAiB,gBAAA,EAAkB,SAAS,CAAA;AACxE,EAAA,MAAM,aAAA,GAAgB,UAAA;AACtB,EAAA,KAAA,CAAM,IAAA,CAAK;AAAA,IACT,IAAA,EAAM,oBAAA;AAAA,IACN,OAAA,EAAS,WAAA;AAAA,IACT,KAAA,EAAO,WAAA;AAAA,IACP,CAAA,EAAG,YAAA;AAAA,IACH,CAAA,EAAG,aAAA;AAAA,IACH,KAAA,EAAO,SAAA;AAAA,IACP,QAAQ,mBAAA,CAAoB,MAAA;AAAA,IAC5B,OAAO,mBAAA,CAAoB;AAAA,GAC5B,CAAA;AACD,EAAA,MAAM,qBAAqB,IAAA,CAAK,GAAA;AAAA,IAC9B,aAAa,gBAAA,CAAiB,MAAA;AAAA,IAC9B,gBAAgB,mBAAA,CAAoB;AAAA,GACtC;AACA,EAAA,OAAA,GAAU,qBAAqB,YAAA,CAAa,OAAA;AAG5C,EAAA,MAAM,KAAA,GAAQ,OAAA;AACd,EAAA,MAAM,WAAA,GAAc,gBAAA,CAAiB,eAAA,EAAiB,KAAK,CAAA;AAC3D,EAAA,KAAA,CAAM,IAAA,CAAK;AAAA,IACT,IAAA,EAAM,aAAA;AAAA,IACN,OAAA,EAAS,MAAA;AAAA,IACT,KAAA,EAAO,WAAA;AAAA,IACP,CAAA,EAAG,WAAA;AAAA,IACH,CAAA,EAAG,KAAA;AAAA,IACH,KAAA,EAAO,KAAA;AAAA,IACP,QAAQ,WAAA,CAAY,MAAA;AAAA,IACpB,OAAO,WAAA,CAAY;AAAA,GACpB,CAAA;AACD,EAAA,MAAM,cAAA,GAAiB,gBAAA,CAAiB,kBAAA,EAAoB,SAAS,CAAA;AACrE,EAAA,MAAM,QAAA,GAAW,KAAA;AACjB,EAAA,KAAA,CAAM,IAAA,CAAK;AAAA,IACT,IAAA,EAAM,sBAAA;AAAA,IACN,OAAA,EAAS,WAAA;AAAA,IACT,KAAA,EAAO,WAAA;AAAA,IACP,CAAA,EAAG,YAAA;AAAA,IACH,CAAA,EAAG,QAAA;AAAA,IACH,KAAA,EAAO,SAAA;AAAA,IACP,QAAQ,cAAA,CAAe,MAAA;AAAA,IACvB,OAAO,cAAA,CAAe;AAAA,GACvB,CAAA;AACD,EAAA,MAAM,gBAAgB,IAAA,CAAK,GAAA;AAAA,IACzB,QAAQ,WAAA,CAAY,MAAA;AAAA,IACpB,WAAW,cAAA,CAAe;AAAA,GAC5B;AACA,EAAA,OAAA,GAAU,gBAAgB,YAAA,CAAa,OAAA;AAGvC,EAAA,MAAM,IAAA,GAAO,OAAA;AACb,EAAA,MAAM,UAAA,GAAa,gBAAA,CAAiB,YAAA,EAAc,KAAK,CAAA;AACvD,EAAA,KAAA,CAAM,IAAA,CAAK;AAAA,IACT,IAAA,EAAM,UAAA;AAAA,IACN,OAAA,EAAS,MAAA;AAAA,IACT,KAAA,EAAO,UAAA;AAAA,IACP,CAAA,EAAG,WAAA;AAAA,IACH,CAAA,EAAG,IAAA;AAAA,IACH,KAAA,EAAO,KAAA;AAAA,IACP,QAAQ,UAAA,CAAW,MAAA;AAAA,IACnB,OAAO,UAAA,CAAW;AAAA,GACnB,CAAA;AACD,EAAA,OAAA,GAAU,IAAA,GAAO,UAAA,CAAW,MAAA,GAAS,YAAA,CAAa,gBAAA;AAGlD,EAAA,MAAMmC,MAAAA,GAAQ,CAAC,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,EAAA,KACjD,CAAA,EAAA,EAAK,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,GAAA,EAAM,EAAE,IAAI,EAAE,CAAA,CAAA;AAC7B,EAAA,MAAM,eAAe,WAAA,GAAc,KAAA;AACnC,EAAA,MAAM,gBAAA,GAAmB,eAAe,YAAA,CAAa,aAAA;AAGrD,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,MAAM,KAAK,MAAA,GAAS,IAAA,CAAK,IAAI,OAAA,CAAQ,MAAA,EAAQ,eAAe,CAAA,GAAI,CAAA;AAChE,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,IAAA,EAAM,WAAA;AAAA,MACN,IAAA,EAAM,cAAA;AAAA,MACN,EAAA,EAAI,YAAA;AAAA,MACJ,CAAA,EAAGA,MAAAA,CAAM,YAAA,EAAc,EAAA,EAAI,kBAAkB,EAAE;AAAA,KAChD,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,QAAQ,WAAA,EAAa;AACvB,IAAA,MAAM,IAAA,GAAO,cAAc,UAAA,GAAa,CAAA;AAExC,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,IAAA,EAAM,aAAA;AAAA,MACN,IAAA,EAAM,cAAA;AAAA,MACN,EAAA,EAAI,WAAA;AAAA,MACJ,CAAA,EAAGA,OAAM,cAAA,EAAgB,MAAA,GAAS,QAAQ,MAAA,EAAQ,cAAA,EAAgB,UAAA,GAAa,YAAA,CAAa,aAAa;AAAA,KAC1G,CAAA;AAED,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,IAAA,EAAM,WAAA;AAAA,MACN,IAAA,EAAM,UAAA;AAAA,MACN,EAAA,EAAI,gBAAA;AAAA,MACJ,CAAA,EAAG,CAAA,EAAA,EAAK,eAAe,CAAA,CAAA,EAAI,MAAA,GAAS,aAAa,CAAA,GAAA,EAAM,eAAe,CAAA,CAAA,EAAI,IAAI,CAAA,GAAA,EAAM,cAAc,IAAI,IAAI,CAAA;AAAA,KAC3G,CAAA;AAAA,EACH,CAAA,MAAO;AACL,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,IAAA,EAAM,MAAA;AAAA,MACN,IAAA,EAAM,cAAA;AAAA,MACN,EAAA,EAAI,WAAA;AAAA,MACJ,CAAA,EAAGA,OAAM,cAAA,EAAgB,MAAA,GAAS,QAAQ,MAAA,EAAQ,cAAA,EAAgB,UAAA,GAAa,YAAA,CAAa,aAAa;AAAA,KAC1G,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,qBAAqB,CAAA,EAAG;AAC1B,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,IAAA,EAAM,UAAA;AAAA,MACN,IAAA,EAAM,UAAA;AAAA,MACN,EAAA,EAAI,cAAA;AAAA,MACJ,GAAGA,MAAAA,CAAM,kBAAA,EAAoB,mBAAmB,cAAA,EAAgB,UAAA,GAAa,aAAa,aAAa;AAAA,KACxG,CAAA;AAAA,EACH;AAGA,EAAA,KAAA,CAAM,IAAA,CAAK;AAAA,IACT,IAAA,EAAM,MAAA;AAAA,IACN,IAAA,EAAM,WAAA;AAAA,IACN,EAAA,EAAI,aAAA;AAAA,IACJ,CAAA,EAAGA,OAAM,cAAA,EAAgB,UAAA,GAAa,iBAAiB,MAAA,EAAQ,cAAA,EAAgB,KAAA,GAAQ,YAAA,CAAa,aAAa;AAAA,GAClH,CAAA;AACD,EAAA,KAAA,CAAM,IAAA,CAAK;AAAA,IACT,IAAA,EAAM,MAAA;AAAA,IACN,IAAA,EAAM,aAAA;AAAA,IACN,EAAA,EAAI,UAAA;AAAA,IACJ,CAAA,EAAGA,OAAM,cAAA,EAAgB,KAAA,GAAQ,YAAY,MAAA,EAAQ,cAAA,EAAgB,IAAA,GAAO,YAAA,CAAa,aAAa;AAAA,GACvG,CAAA;AAGD,EAAA,MAAM,eAAA,GAAkB,UAAA,GAAa,gBAAA,CAAiB,MAAA,GAAS,CAAA;AAC/D,EAAA,KAAA,CAAM,IAAA,CAAK;AAAA,IACT,IAAA,EAAM,WAAA;AAAA,IACN,IAAA,EAAM,WAAA;AAAA,IACN,EAAA,EAAI,oBAAA;AAAA,IACJ,CAAA,EAAGA,MAAAA,CAAM,YAAA,EAAc,eAAA,EAAiB,kBAAkB,eAAe;AAAA,GAC1E,CAAA;AACD,EAAA,MAAM,UAAA,GAAa,KAAA,GAAQ,WAAA,CAAY,MAAA,GAAS,CAAA;AAChD,EAAA,KAAA,CAAM,IAAA,CAAK;AAAA,IACT,IAAA,EAAM,WAAA;AAAA,IACN,IAAA,EAAM,aAAA;AAAA,IACN,EAAA,EAAI,sBAAA;AAAA,IACJ,CAAA,EAAGA,MAAAA,CAAM,YAAA,EAAc,UAAA,EAAY,kBAAkB,UAAU;AAAA,GAChE,CAAA;AAGD,EAAA,IAAI,UAAA,GAAa,OAAA;AACjB,EAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,IAAA,UAAA,IAAc,QAAA,CAAS,MAAA,GAAS,YAAA,CAAa,mBAAA,GAAsB,CAAA;AAAA,EACrE;AAMA,EAAA,MAAM,QAAQ,YAAA,CAAa,WAAA;AAC3B,EAAA,MAAM,QAAQ,YAAA,CAAa,eAAA;AAI3B,EAAA,MAAM,SAAA,GAAY,qBAAA;AAClB,EAAA,MAAM,YAAA,GAAe,wBAAA;AAErB,EAAA,MAAM,UAAA,GAAa,UAAA;AACnB,EAAA,MAAM,aAAA,GAAgB,aAAA;AAEtB,EAAA,MAAM,UAAA,GAAa,IAAA;AACnB,EAAA,MAAM,aAAA,GAAgB,OAAO,UAAA,CAAW,MAAA;AAExC,EAAA,MAAM,KAAA,GAA2B;AAAA,IAC/B;AAAA,MACE,KAAA,EAAO,gBAAA;AAAA,MACP,KAAA,EAAO,gBAAA;AAAA,MACP,CAAA,EAAG,KAAA;AAAA,MACH,CAAA,EAAG,SAAA;AAAA,MACH,KAAA,EAAO,KAAA;AAAA,MACP,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,eAAe,SAAS;AAAA,KAC/C;AAAA,IACA;AAAA,MACE,KAAA,EAAO,WAAA;AAAA,MACP,KAAA,EAAO,WAAA;AAAA,MACP,CAAA,EAAG,KAAA;AAAA,MACH,CAAA,EAAG,UAAA;AAAA,MACH,KAAA,EAAO,KAAA;AAAA,MACP,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,gBAAgB,UAAU;AAAA,KACjD;AAAA,IACA;AAAA,MACE,KAAA,EAAO,UAAA;AAAA,MACP,KAAA,EAAO,UAAA;AAAA,MACP,CAAA,EAAG,KAAA;AAAA,MACH,CAAA,EAAG,UAAA;AAAA,MACH,KAAA,EAAO,KAAA;AAAA,MACP,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,gBAAgB,UAAU;AAAA;AACjD,GACF;AAEA,EAAA,MAAM,MAAA,GAA6B;AAAA,IACjC,KAAA,EAAO,SAAA;AAAA,IACP,MAAA,EAAQ,IAAA,CAAK,IAAA,CAAK,UAAU,CAAA;AAAA,IAC5B,KAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,MAAM,GAAA,CAAI;AAAA,GACZ;AACA,EAAA,IAAI,GAAA,CAAI,KAAA,KAAU,MAAA,EAAW,MAAA,CAAO,QAAQ,GAAA,CAAI,KAAA;AAChD,EAAA,OAAO,MAAA;AACT;AAGA,SAAS,gBAAA,CAAiB,MAAe,WAAA,EAAwF;AAC/H,EAAA,MAAM,eAAe,IAAA,CAAK,GAAA,CAAI,IAAI,WAAA,GAAc,CAAA,GAAI,aAAa,SAAS,CAAA;AAC1E,EAAA,MAAM,eAAiC,EAAC;AACxC,EAAA,KAAA,MAAW,CAAA,IAAK,KAAK,KAAA,EAAO;AAC1B,IAAA,YAAA,CAAa,IAAA,CAAK,GAAG,QAAA,CAAS,CAAA,EAAG,YAAY,CAAC,CAAA;AAAA,EAChD;AACA,EAAA,MAAM,WAAA,GAAc,YAAA,CAAa,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,aAAA,CAAc,CAAA,CAAE,KAAK,CAAA,EAAG,CAAC,CAAA;AAC/E,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,WAAA;AAAA,IACP,QAAQ,IAAA,CAAK,IAAA,CAAK,WAAA,GAAc,CAAA,GAAI,aAAa,SAAS,CAAA;AAAA,IAC1D;AAAA,GACF;AACF;AAEO,SAAS,kBAAkB,KAAA,EAAwC;AACxE,EAAA,OAAO,cAAc,KAAK,CAAA;AAC5B;AAKA,SAAS,eAAA,CAAgB,OAAe,WAAA,EAA+B;AACrE,EAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,IAAI,WAAA,GAAc,CAAA,GAAI,aAAa,gBAAgB,CAAA;AAC1E,EAAA,MAAM,KAAK,YAAA,CAAa,aAAA;AACxB,EAAA,MAAM,QAAA,GAAW,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,KAAA,GAAQ,EAAE,CAAC,CAAA;AACnD,EAAA,IAAI,KAAA,CAAM,MAAA,IAAU,QAAA,EAAU,OAAO,CAAC,KAAK,CAAA;AAE3C,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,KAAK,CAAA;AAG/B,EAAA,IAAI,IAAA,GAAgC,IAAA;AACpC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,IAAI,KAAA,CAAM,KAAA,CAAM,GAAG,CAAC,CAAA,CAAE,KAAK,GAAG,CAAA;AACpC,IAAA,MAAM,IAAI,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA,CAAE,KAAK,GAAG,CAAA;AACjC,IAAA,IAAI,CAAA,CAAE,MAAA,IAAU,QAAA,IAAY,CAAA,CAAE,UAAU,QAAA,EAAU;AAChD,MAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,IAAI,CAAA,CAAE,MAAA,GAAS,EAAE,MAAM,CAAA,GAAI,KAAK,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA,CAAE,MAAA,GAAS,KAAK,CAAC,CAAA,CAAE,MAAM,CAAA,EAAG;AACtF,QAAA,IAAA,GAAO,CAAC,GAAG,CAAC,CAAA;AAAA,MACd;AAAA,IACF;AAAA,EACF;AACA,EAAA,IAAI,MAAM,OAAO,IAAA;AAEjB,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,MAAM,IAAA,GAAO,GAAA,GAAM,GAAA,GAAM,GAAA,GAAM,CAAA,GAAI,CAAA;AACnC,IAAA,IAAI,IAAA,CAAK,MAAA,GAAS,QAAA,IAAY,GAAA,EAAK;AACjC,MAAA,KAAA,CAAM,KAAK,GAAG,CAAA;AACd,MAAA,GAAA,GAAM,CAAA;AACN,MAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AAEtB,QAAA,MAAM,OAAO,KAAA,CAAM,KAAA,CAAM,MAAM,OAAA,CAAQ,CAAC,IAAI,CAAC,CAAA;AAC7C,QAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG,GAAA,GAAM,MAAM,GAAA,GAAM,IAAA,CAAK,KAAK,GAAG,CAAA;AACpD,QAAA;AAAA,MACF;AAAA,IACF,CAAA,MAAO;AACL,MAAA,GAAA,GAAM,IAAA;AAAA,IACR;AAAA,EACF;AACA,EAAA,IAAI,GAAA,EAAK,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA;AACvB,EAAA,OAAO,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AACzB;AAEA,SAAS,gBAAgB,SAAA,EAA2B;AAClD,EAAA,OAAO,IAAA,CAAK,IAAI,CAAA,EAAG,SAAS,IAAI,YAAA,CAAa,sBAAA,GAAyB,IAAI,YAAA,CAAa,gBAAA;AACzF;;;AC11BA,SAASC,UAAS,CAAA,EAAsB;AAOtC,EAAA,OAAO;AAAA;AAAA,iDAAA,EAE0C,EAAE,IAAI,CAAA;AAAA,oDAAA,EACH,EAAE,SAAS,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,uDAAA,EASR,EAAE,IAAI,CAAA;AAAA,uDAAA,EACN,EAAE,IAAI,CAAA;AAAA,0DAAA,EACH,EAAE,SAAS,CAAA;AAAA,mEAAA,EACF,EAAE,SAAS,CAAA;AAAA,8DAAA,EAChB,EAAE,SAAS,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0DAAA,EAOf,EAAE,IAAI,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA,CAYhE,IAAA,EAAK;AACP;AAEA,SAAS,YAAY,CAAA,EAAsB;AACzC,EAAA,OAAOX,sBAAA,CAAK;AAAA,IACVT,oBAAA;AAAA,MACE,QAAA;AAAA,MACA;AAAA,QACE,EAAA,EAAI,cAAA;AAAA,QACJ,OAAA,EAAS,WAAA;AAAA,QACT,IAAA,EAAM,CAAA;AAAA,QACN,IAAA,EAAM,CAAA;AAAA,QACN,WAAA,EAAa,CAAA;AAAA,QACb,YAAA,EAAc,CAAA;AAAA,QACd,MAAA,EAAQ;AAAA,OACV;AAAA,MACA,CAACA,oBAAA,CAAG,MAAA,EAAQ,EAAE,CAAA,EAAG,sBAAsB,IAAA,EAAM,CAAA,CAAE,MAAA,EAAQ,CAAC;AAAA,KAC1D;AAAA,IACAA,oBAAA;AAAA,MACE,QAAA;AAAA,MACA;AAAA,QACE,EAAA,EAAI,qBAAA;AAAA,QACJ,OAAA,EAAS,WAAA;AAAA,QACT,IAAA,EAAM,CAAA;AAAA,QACN,IAAA,EAAM,CAAA;AAAA,QACN,WAAA,EAAa,CAAA;AAAA,QACb,YAAA,EAAc,CAAA;AAAA,QACd,MAAA,EAAQ;AAAA,OACV;AAAA,MACA,CAACA,oBAAA,CAAG,MAAA,EAAQ,EAAE,CAAA,EAAG,sBAAsB,IAAA,EAAM,CAAA,CAAE,MAAA,EAAQ,CAAC;AAAA;AAC1D,GACD,CAAA;AACH;AAEA,SAAS,YAAY,GAAA,EAAwB;AAC3C,EAAA,IAAI,GAAA,CAAI,OAAA,KAAY,UAAA,EAAY,OAAO,uBAAA;AACvC,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,OAAA,KAAY,WAAA,GAAc,kBAAA,GAAqB,cAAA;AAChE,EAAA,OAAO,CAAA,EAAG,IAAI,CAAA,cAAA,EAAiB,GAAA,CAAI,KAAK,CAAA,CAAA;AAC1C;AAEA,SAAS,aAAa,KAAA,EAAuB;AAC3C,EAAA,QAAQ,KAAA;AAAO,IACb,KAAK,OAAA;AACH,MAAA,OAAO,oBAAA;AAAA,IACT,KAAK,OAAA;AACH,MAAA,OAAO,oBAAA;AAAA,IACT,KAAK,UAAA;AACH,MAAA,OAAO,uBAAA;AAAA,IACT,KAAK,QAAA;AACH,MAAA,OAAO,yBAAA;AAAA,IACT;AACE,MAAA,OAAO,qBAAA;AAAA;AAEb;AAEA,SAAS,aAAa,IAAA,EAAsB;AAC1C,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,WAAA;AACH,MAAA,OAAO,wBAAA;AAAA,IACT,KAAK,WAAA;AACH,MAAA,OAAO,wBAAA;AAAA,IACT,KAAK,aAAA;AACH,MAAA,OAAO,0BAAA;AAAA,IACT,KAAK,UAAA;AACH,MAAA,OAAO,uBAAA;AAAA,IACT;AACE,MAAA,OAAO,mBAAA;AAAA;AAEb;AAEA,SAAS,WAAW,IAAA,EAA+B;AAEjD,EAAA,MAAM,IAAIP,sBAAA,CAAK;AAAA,IACb,GAAG,IAAA,CAAK,CAAA;AAAA,IACR,GAAG,IAAA,CAAK,CAAA;AAAA,IACR,OAAO,IAAA,CAAK,KAAA;AAAA,IACZ,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,EAAA,EAAI,KAAK,KAAA,GAAQ,CAAA;AAAA,IACjB,EAAA,EAAI,KAAK,KAAA,GAAQ,CAAA;AAAA,IACjB,KAAA,EAAO,CAAA,wBAAA,EAA2B,IAAA,CAAK,KAAK,CAAA,CAAA;AAAA,IAC5C,cAAc,IAAA,CAAK;AAAA,GACpB,CAAA;AAED,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,KAAA,GAAQ,CAAA;AACjC,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,CAAA;AAClC,EAAA,MAAM,GAAA,GAAMR,sBAAA;AAAA,IACV;AAAA,MACE,CAAA,EAAG,EAAA;AAAA,MACH,CAAA,EAAG,EAAA;AAAA,MACH,KAAA,EAAO,mBAAA;AAAA,MACP,aAAA,EAAe,QAAA;AAAA,MACf,mBAAA,EAAqB,SAAA;AAAA,MACrB,SAAA,EAAW,CAAA,WAAA,EAAc,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA;AAAA,KACnC;AAAA,IACA,IAAA,CAAK;AAAA,GACP;AACA,EAAA,OAAOY,uBAAA,CAAM,EAAE,WAAA,EAAa,IAAA,CAAK,OAAM,EAAG,CAAC,CAAA,EAAG,GAAG,CAAC,CAAA;AACpD;AAEA,SAAS,aAAa,CAAA,EAA+B;AAEnD,EAAA,MAAM,IAAIJ,sBAAA,CAAK;AAAA,IACb,GAAG,CAAA,CAAE,CAAA;AAAA,IACL,GAAG,CAAA,CAAE,CAAA;AAAA,IACL,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,QAAQ,CAAA,CAAE,MAAA;AAAA,IACV,EAAA,EAAI,EAAE,MAAA,GAAS,CAAA;AAAA,IACf,EAAA,EAAI,EAAE,MAAA,GAAS,CAAA;AAAA,IACf,KAAA,EAAO,CAAA,oCAAA,EAAuC,CAAA,CAAE,MAAM,CAAA,CAAA;AAAA,IACtD,eAAe,CAAA,CAAE;AAAA,GAClB,CAAA;AACD,EAAA,MAAM,QAAQ,YAAA,CAAa,sBAAA;AAC3B,EAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,UAAA,CAAW,MAAA,GAAS,KAAA;AACpC,EAAA,MAAM,SAAS,CAAA,CAAE,CAAA,GAAA,CAAK,EAAE,MAAA,GAAS,KAAA,IAAS,IAAI,KAAA,GAAQ,IAAA;AACtD,EAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,KAAA,GAAQ,CAAA;AAC3B,EAAA,MAAM,KAAA,GAAQ,EAAE,UAAA,CAAW,GAAA;AAAA,IAAI,CAAC,IAAI,CAAA,KAClCR,sBAAA;AAAA,MACE;AAAA,QACE,CAAA,EAAG,EAAA;AAAA,QACH,CAAA,EAAG,SAAS,CAAA,GAAI,KAAA;AAAA,QAChB,KAAA,EAAO,yBAAA;AAAA,QACP,aAAA,EAAe;AAAA,OACjB;AAAA,MACA;AAAA;AACF,GACF;AACA,EAAA,OAAOY,uBAAA,CAAM,EAAE,aAAA,EAAe,CAAA,CAAE,MAAA,IAAU,CAAC,CAAA,EAAG,GAAG,KAAK,CAAC,CAAA;AACzD;AAEA,SAAS,UAAU,GAAA,EAAwB;AACzC,EAAA,MAAM,IAAIJ,sBAAA,CAAK;AAAA,IACb,GAAG,GAAA,CAAI,CAAA;AAAA,IACP,GAAG,GAAA,CAAI,CAAA;AAAA,IACP,OAAO,GAAA,CAAI,KAAA;AAAA,IACX,QAAQ,GAAA,CAAI,MAAA;AAAA,IACZ,IAAI,YAAA,CAAa,UAAA;AAAA,IACjB,IAAI,YAAA,CAAa,UAAA;AAAA,IACjB,KAAA,EAAO,YAAY,GAAG,CAAA;AAAA,IACtB,aAAa,GAAA,CAAI;AAAA,GAClB,CAAA;AAOD,EAAA,MAAM,SAAA,GAAY,GAAA,CAAI,CAAA,GAAI,YAAA,CAAa,SAAA;AACvC,EAAA,MAAM,UAAA,GAAa,GAAA,CAAI,CAAA,GAAI,GAAA,CAAI,QAAQ,YAAA,CAAa,SAAA;AACpD,EAAA,MAAM,OAAA,GAAU,GAAA,CAAI,CAAA,GAAI,GAAA,CAAI,KAAA,GAAQ,CAAA;AAIpC,EAAA,IAAI,cAAA,GAAiB,CAAA;AACrB,EAAA,KAAA,MAAWT,KAAAA,IAAQ,IAAI,KAAA,EAAO;AAC5B,IAAA,IAAA,CAAKA,KAAAA,CAAK,MAAA,IAAU,CAAA,IAAK,CAAA,EAAG;AAC1B,MAAA,MAAM,CAAA,GAAI,gBAAgBA,KAAI,CAAA;AAC9B,MAAA,IAAI,CAAA,GAAI,gBAAgB,cAAA,GAAiB,CAAA;AAAA,IAC3C;AAAA,EACF;AACA,EAAA,MAAM,oBAAoB,IAAA,CAAK,GAAA;AAAA,IAC7B,SAAA;AAAA,IACA,KAAK,GAAA,CAAI,OAAA,GAAU,cAAA,GAAiB,CAAA,EAAG,aAAa,cAAc;AAAA,GACpE;AAEA,EAAA,IAAI,KAAA,GAAQ,GAAA,CAAI,CAAA,GAAI,YAAA,CAAa,SAAA;AACjC,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,KAAA,MAAWA,KAAAA,IAAQ,IAAI,KAAA,EAAO;AAC5B,IAAA,MAAM,EAAA,GAAK,iBAAA,CAAkBA,KAAAA,CAAK,KAAK,CAAA;AACvC,IAAA,MAAM,QAAA,GAAW,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,KAAK,IAAI,CAAA;AAC7C,IAAA,MAAM,QAAA,GAAA,CAAYA,KAAAA,CAAK,MAAA,IAAU,CAAA,IAAK,CAAA;AACtC,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,OAAA,CAAQ,IAAA;AAAA,QACNC,sBAAA;AAAA,UACE,EAAE,GAAG,iBAAA,EAAmB,CAAA,EAAG,UAAU,KAAA,EAAO,YAAA,CAAaD,KAAAA,CAAK,KAAK,CAAA,EAAE;AAAA,UACrEA,KAAAA,CAAK;AAAA;AACP,OACF;AAAA,IACF,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,IAAA;AAAA,QACNC,sBAAA;AAAA,UACE;AAAA,YACE,CAAA,EAAG,OAAA;AAAA,YACH,CAAA,EAAG,QAAA;AAAA,YACH,KAAA,EAAO,YAAA,CAAaD,KAAAA,CAAK,KAAK,CAAA;AAAA,YAC9B,aAAA,EAAe;AAAA,WACjB;AAAA,UACAA,KAAAA,CAAK;AAAA;AACP,OACF;AAAA,IACF;AACA,IAAA,KAAA,IAAS,EAAA;AAAA,EACX;AAEA,EAAA,OAAOa,uBAAA;AAAA,IACL;AAAA,MACE,oBAAoB,GAAA,CAAI,IAAA;AAAA,MACxB,uBAAuB,GAAA,CAAI,OAAA;AAAA,MAC3B,qBAAqB,GAAA,CAAI;AAAA,KAC3B;AAAA,IACA,CAAC,CAAA,EAAG,GAAG,OAAO;AAAA,GAChB;AACF;AAGA,SAAS,gBAAgBb,KAAAA,EAA+C;AACtE,EAAA,MAAM,QACJA,KAAAA,CAAK,KAAA,KAAU,WAAWA,KAAAA,CAAK,KAAA,KAAU,UAAU,GAAA,GAAM,GAAA;AAC3D,EAAA,OAAOA,KAAAA,CAAK,KAAK,MAAA,GAAS,KAAA;AAC5B;AAEO,SAAS,kBAAA,CAAmB,QAA4B,MAAA,EAA+B;AAC5F,EAAA,MAAM,CAAA,GAAIc,kCAAA,CAAiB,MAAA,EAAQ,KAAA,IAAS,SAAS,CAAA;AAErD,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,QAAA,CAAS,IAAA,CAAKZ,uBAAA,CAAQ,MAAA,CAAO,KAAA,IAAS,0BAA0B,CAAC,CAAA;AACjE,EAAA,QAAA,CAAS,IAAA;AAAA,IACPa,sBAAA;AAAA,MACE,CAAA,0BAAA,EAA6B,MAAA,CAAO,IAAI,CAAA,EAAA,EAAK,MAAA,CAAO,IAAI,CAAA,SAAA,EAAO,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA,QAAA,EAAW,MAAA,CAAO,MAAM,MAAM,CAAA,OAAA,CAAA,IAC7G,MAAA,CAAO,QAAA,CAAS,MAAA,GAAS,CAAA,GACtB,CAAA,YAAA,EAAe,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,GACzC,EAAA;AAAA;AACR,GACF;AACA,EAAA,QAAA,CAAS,IAAA,CAAKC,qBAAG,OAAA,EAAS,IAAIoB,SAAAA,CAAS,CAAC,CAAC,CAAC,CAAA;AAC1C,EAAA,QAAA,CAAS,IAAA,CAAK,WAAA,CAAY,CAAC,CAAC,CAAA;AAE5B,EAAA,IAAI,OAAO,KAAA,EAAO;AAChB,IAAA,QAAA,CAAS,IAAA;AAAA,MACPnC,sBAAA;AAAA,QACE,EAAE,CAAA,EAAG,MAAA,CAAO,KAAA,GAAQ,CAAA,EAAG,CAAA,EAAG,YAAA,CAAa,aAAA,GAAgB,EAAA,EAAI,KAAA,EAAO,cAAA,EAAgB,aAAA,EAAe,QAAA,EAAS;AAAA,QAC1G,MAAA,CAAO;AAAA;AACT,KACF;AAAA,EACF;AAGA,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,KAAA,MAAW,KAAK,MAAA,CAAO,KAAA,UAAe,IAAA,CAAK,UAAA,CAAW,CAAC,CAAC,CAAA;AACxD,EAAA,QAAA,CAAS,KAAKY,uBAAA,CAAM,EAAE,OAAO,cAAA,EAAe,EAAG,OAAO,CAAC,CAAA;AAGvD,EAAA,MAAM,YAAsB,EAAC;AAC7B,EAAA,KAAA,MAAW,KAAK,MAAA,CAAO,OAAA,YAAmB,IAAA,CAAK,YAAA,CAAa,CAAC,CAAC,CAAA;AAC9D,EAAA,QAAA,CAAS,KAAKA,uBAAA,CAAM,EAAE,OAAO,oBAAA,EAAqB,EAAG,SAAS,CAAC,CAAA;AAG/D,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,KAAA,MAAW,CAAA,IAAK,OAAO,KAAA,EAAO;AAC5B,IAAA,OAAA,CAAQ,IAAA;AAAA,MACND,sBAAA,CAAO;AAAA,QACL,GAAG,CAAA,CAAE,CAAA;AAAA,QACL,KAAA,EAAO,YAAA,CAAa,CAAA,CAAE,IAAI,CAAA;AAAA,QAC1B,aAAa,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,EAAA,EAAK,EAAE,EAAE,CAAA;AAAA,OAChC;AAAA,KACH;AAAA,EACF;AACA,EAAA,QAAA,CAAS,KAAKC,uBAAA,CAAM,EAAE,OAAO,cAAA,EAAe,EAAG,OAAO,CAAC,CAAA;AAGvD,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,KAAA,MAAW,KAAK,MAAA,CAAO,KAAA,SAAc,IAAA,CAAK,SAAA,CAAU,CAAC,CAAC,CAAA;AACtD,EAAA,QAAA,CAAS,KAAKA,uBAAA,CAAM,EAAE,OAAO,cAAA,EAAe,EAAG,MAAM,CAAC,CAAA;AAGtD,EAAA,IAAI,MAAA,CAAO,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG;AAC9B,IAAA,MAAM,SAAS,MAAA,CAAO,MAAA,GAAS,OAAO,QAAA,CAAS,MAAA,GAAS,aAAa,mBAAA,GAAsB,CAAA;AAC3F,IAAA,MAAM,OAAiB,EAAC;AACxB,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AAC/C,MAAA,IAAA,CAAK,IAAA;AAAA,QACHZ,sBAAA;AAAA,UACE;AAAA,YACE,GAAG,YAAA,CAAa,WAAA;AAAA,YAChB,CAAA,EAAG,MAAA,GAAA,CAAU,CAAA,GAAI,CAAA,IAAK,YAAA,CAAa,mBAAA;AAAA,YACnC,KAAA,EAAO;AAAA,WACT;AAAA,UACA,CAAA,OAAA,EAAK,MAAA,CAAO,QAAA,CAAS,CAAC,CAAC,CAAA;AAAA;AACzB,OACF;AAAA,IACF;AACA,IAAA,QAAA,CAAS,KAAKY,uBAAA,CAAM,EAAE,OAAO,iBAAA,EAAkB,EAAG,IAAI,CAAC,CAAA;AAAA,EACzD;AAEA,EAAA,OAAOI,yBAAA;AAAA,IACL;AAAA,MACE,KAAA,EAAO,QAAA;AAAA,MACP,IAAA,EAAM,KAAA;AAAA,MACN,YAAA,EAAcC,2BAAA,CAAU,MAAA,CAAO,KAAA,IAAS,0BAA0B,CAAA;AAAA,MAClE,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,SAAS,CAAA,IAAA,EAAO,MAAA,CAAO,KAAK,CAAA,CAAA,EAAI,OAAO,MAAM,CAAA;AAAA,KAC/C;AAAA,IACA;AAAA,GACF;AACF;AAEO,SAAS,YAAA,CAAa,WAA+B,MAAA,EAA+B;AACzF,EAAA,MAAM,MAAM,OAAO,SAAA,KAAc,QAAA,GAAW,WAAA,CAAY,SAAS,CAAA,GAAI,SAAA;AACrE,EAAA,MAAM,MAAA,GAAS,aAAa,GAAG,CAAA;AAC/B,EAAA,OAAO,kBAAA,CAAmB,QAAQ,MAAM,CAAA;AAC1C;;;AC/WO,IAAM,MAAA,GAAwB;AAAA,EACnC,IAAA,EAAM,QAAA;AAAA,EACN,OAAOjB,KAAAA,EAAuB;AAC5B,IAAA,KAAA,MAAW,GAAA,IAAOA,KAAAA,CAAK,KAAA,CAAM,OAAO,CAAA,EAAG;AACrC,MAAA,MAAM,CAAA,GAAI,IAAI,IAAA,EAAK;AACnB,MAAA,IAAI,CAAC,CAAA,EAAG;AACR,MAAA,IAAI,EAAE,UAAA,CAAW,GAAG,KAAK,CAAA,CAAE,UAAA,CAAW,IAAI,CAAA,EAAG;AAC7C,MAAA,OAAO,YAAA,CAAa,KAAK,CAAC,CAAA;AAAA,IAC5B;AACA,IAAA,OAAO,KAAA;AAAA,EACT,CAAA;AAAA,EACA,KAAA,EAAO,WAAA;AAAA,EACP,MAAA,CAAOA,OAAc,MAAA,EAA+B;AAClD,IAAA,OAAO,YAAA,CAAaA,OAAM,MAAM,CAAA;AAAA,EAClC;AACF;;;ACGO,IAAM,iBAAA,GAAN,cAAgC,KAAA,CAAM;AAAA,EAC3C,IAAA;AAAA,EACA,WAAA,CAAY,SAAiBD,KAAAA,EAAe;AAC1C,IAAA,KAAA,CAAMA,UAAS,MAAA,GAAY,CAAA,KAAA,EAAQA,KAAI,CAAA,EAAA,EAAK,OAAO,KAAK,OAAO,CAAA;AAC/D,IAAA,IAAA,CAAK,IAAA,GAAO,mBAAA;AACZ,IAAA,IAAIA,KAAAA,KAAS,MAAA,EAAW,IAAA,CAAK,IAAA,GAAOA,KAAAA;AAAA,EACtC;AACF,CAAA;AAOA,SAASmB,YAAW,GAAA,EAAwB;AAC1C,EAAA,MAAM,MAAiB,EAAC;AACxB,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA;AAC9B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,CAAC,CAAA,IAAK,EAAA;AACvB,IAAA,MAAM,OAAA,GAAU,IAAI,IAAA,EAAK;AACzB,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,IAAI,QAAQ,UAAA,CAAW,GAAG,KAAK,OAAA,CAAQ,UAAA,CAAW,IAAI,CAAA,EAAG;AAEzD,IAAA,IAAI,GAAA,GAAM,KAAA;AACV,IAAA,IAAI,MAAM,GAAA,CAAI,MAAA;AACd,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACnC,MAAA,MAAM,CAAA,GAAI,IAAI,CAAC,CAAA;AACf,MAAA,IAAI,MAAM,GAAA,EAAK;AAAE,QAAA,GAAA,GAAM,CAAC,GAAA;AAAK,QAAA;AAAA,MAAU;AACvC,MAAA,IAAI,GAAA,EAAK;AACT,MAAA,IAAI,MAAM,GAAA,EAAK;AAAE,QAAA,GAAA,GAAM,CAAA;AAAG,QAAA;AAAA,MAAO;AACjC,MAAA,IAAI,MAAM,GAAA,IAAO,GAAA,CAAI,CAAA,GAAI,CAAC,MAAM,GAAA,EAAK;AAAE,QAAA,GAAA,GAAM,CAAA;AAAG,QAAA;AAAA,MAAO;AAAA,IACzD;AACA,IAAA,MAAM,WAAW,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,GAAG,EAAE,IAAA,EAAK;AACxC,IAAA,IAAI,CAAC,QAAA,EAAU;AACf,IAAA,GAAA,CAAI,KAAK,EAAE,IAAA,EAAM,UAAU,IAAA,EAAM,CAAA,GAAI,GAAG,CAAA;AAAA,EAC1C;AACA,EAAA,OAAO,GAAA;AACT;AAMA,SAAS,gBAAA,CAAiB,GAAW,MAAA,EAAuB;AAC1D,EAAA,MAAM,MAAa,EAAC;AACpB,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,MAAM,OAAA,GAAU,EAAE,IAAA,EAAK;AACvB,EAAA,OAAO,CAAA,GAAI,QAAQ,MAAA,EAAQ;AACzB,IAAA,OAAO,CAAA,GAAI,QAAQ,MAAA,IAAU,IAAA,CAAK,KAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAG,CAAA,EAAA;AACpD,IAAA,IAAI,CAAA,IAAK,QAAQ,MAAA,EAAQ;AACzB,IAAA,IAAI,OAAA,CAAQ,CAAC,CAAA,KAAM,GAAA,EAAK;AACtB,MAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,OAAA,CAAQ,GAAA,EAAK,IAAI,CAAC,CAAA;AACtC,MAAA,IAAI,MAAM,CAAA,EAAG;AACX,QAAA,MAAM,IAAI,iBAAA,CAAkB,CAAA,+BAAA,EAAkC,CAAC,KAAK,MAAM,CAAA;AAAA,MAC5E;AACA,MAAA,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,OAAA,CAAQ,KAAA,CAAM,CAAA,GAAI,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA;AAC5D,MAAA,CAAA,GAAI,GAAA,GAAM,CAAA;AAAA,IACZ,CAAA,MAAO;AACL,MAAA,IAAI,CAAA,GAAI,CAAA;AACR,MAAA,OAAO,CAAA,GAAI,QAAQ,MAAA,IAAU,CAAC,KAAK,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAG,CAAA,EAAA;AACrD,MAAA,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,QAAQ,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,EAAG,CAAA;AACrD,MAAA,CAAA,GAAI,CAAA;AAAA,IACN;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,mBAAmB,CAAA,EAAoB;AAC9C,EAAA,OAAO,2BAAA,CAA4B,KAAK,CAAC,CAAA;AAC3C;AAEA,SAAS,mBAAA,CAAoB,GAAW,MAAA,EAA+C;AACrF,EAAA,MAAM,IAAA,GAAO,gBAAA,CAAiB,CAAA,EAAG,MAAM,CAAA;AACvC,EAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,IAAA,MAAM,IAAI,iBAAA,CAAkB,CAAA,qBAAA,CAAA,EAAyB,MAAM,CAAA;AAAA,EAC7D;AACA,EAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,IAAA,OAAO,EAAE,EAAA,EAAI,IAAA,CAAK,CAAC,EAAE,IAAA,EAAK;AAAA,EAC5B;AACA,EAAA,IACE,IAAA,CAAK,MAAA,KAAW,CAAA,IAChB,IAAA,CAAK,CAAC,CAAA,CAAE,IAAA,KAAS,QAAA,IACjB,kBAAA,CAAmB,IAAA,CAAK,CAAC,CAAA,CAAE,IAAI,CAAA,EAC/B;AACA,IAAA,OAAO,EAAE,EAAA,EAAI,IAAA,CAAK,CAAC,CAAA,CAAE,MAAM,IAAA,EAAM,IAAA,CAAK,CAAC,CAAA,CAAE,IAAA,EAAK;AAAA,EAChD;AACA,EAAA,MAAM,IAAI,iBAAA,CAAkB,CAAA,uBAAA,EAA0B,CAAC,KAAK,MAAM,CAAA;AACpE;AAEA,SAAS,mBAAA,CAAoB,GAAW,MAAA,EAA+C;AACrF,EAAA,MAAM,IAAA,GAAO,gBAAA,CAAiB,CAAA,EAAG,MAAM,CAAA;AACvC,EAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,IAAA,MAAM,IAAI,iBAAA,CAAkB,CAAA,qBAAA,CAAA,EAAyB,MAAM,CAAA;AAAA,EAC7D;AACA,EAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,IAAA,OAAO,EAAE,EAAA,EAAI,IAAA,CAAK,CAAC,EAAE,IAAA,EAAK;AAAA,EAC5B;AACA,EAAA,IACE,IAAA,CAAK,MAAA,KAAW,CAAA,IAChB,IAAA,CAAK,CAAC,CAAA,CAAE,IAAA,KAAS,QAAA,IACjB,kBAAA,CAAmB,IAAA,CAAK,CAAC,CAAA,CAAE,IAAI,CAAA,EAC/B;AACA,IAAA,OAAO,EAAE,IAAA,EAAM,IAAA,CAAK,CAAC,CAAA,CAAE,MAAM,EAAA,EAAI,IAAA,CAAK,CAAC,CAAA,CAAE,IAAA,EAAK;AAAA,EAChD;AAGA,EAAA,IACE,IAAA,CAAK,MAAA,KAAW,CAAA,IAChB,IAAA,CAAK,CAAC,CAAA,CAAE,IAAA,KAAS,QAAA,IACjB,kBAAA,CAAmB,IAAA,CAAK,CAAC,CAAA,CAAE,IAAI,CAAA,EAC/B;AACA,IAAA,OAAO,EAAE,EAAA,EAAI,IAAA,CAAK,CAAC,CAAA,CAAE,MAAM,IAAA,EAAM,IAAA,CAAK,CAAC,CAAA,CAAE,IAAA,EAAK;AAAA,EAChD;AACA,EAAA,MAAM,IAAI,iBAAA,CAAkB,CAAA,uBAAA,EAA0B,CAAC,KAAK,MAAM,CAAA;AACpE;AAEA,IAAM,UAAU,CAAC,MAAA,EAAQ,KAAA,EAAO,KAAA,EAAO,OAAO,IAAI,CAAA;AAElD,SAAS,UAAUnB,KAAAA,EAAiE;AAClF,EAAA,IAAI,GAAA,GAAM,KAAA;AACV,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAIA,KAAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,CAAA,GAAIA,MAAK,CAAC,CAAA;AAChB,IAAA,IAAI,MAAM,GAAA,EAAK;AAAE,MAAA,GAAA,GAAM,CAAC,GAAA;AAAK,MAAA;AAAA,IAAU;AACvC,IAAA,IAAI,GAAA,EAAK;AACT,IAAA,KAAA,MAAW,MAAM,OAAA,EAAS;AACxB,MAAA,IAAIA,KAAAA,CAAK,UAAA,CAAW,EAAA,EAAI,CAAC,CAAA,EAAG;AAI1B,QAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,GAAG,GAAA,EAAK,CAAA,GAAI,GAAG,MAAA,EAAO;AAAA,MAC5C;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,eAAe,CAAA,EAAmB;AACzC,EAAA,IAAI,GAAA,GAAM,KAAA;AACV,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,QAAQ,CAAA,EAAA,EAAK;AACjC,IAAA,MAAM,CAAA,GAAI,EAAE,CAAC,CAAA;AACb,IAAA,IAAI,MAAM,GAAA,EAAK;AAAE,MAAA,GAAA,GAAM,CAAC,GAAA;AAAK,MAAA;AAAA,IAAU;AACvC,IAAA,IAAI,GAAA,EAAK;AACT,IAAA,IAAI,CAAA,KAAM,KAAK,OAAO,CAAA;AAAA,EACxB;AACA,EAAA,OAAO,EAAA;AACT;AAQA,SAAS,iBAAiB,GAAA,EAAyB;AACjD,EAAA,MAAM,MAAkB,EAAC;AACzB,EAAA,IAAI,CAAA,GAAI,IAAI,IAAA,EAAK;AAEjB,EAAA,IAAI,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,eAAe,CAAA;AAC/B,EAAA,IAAI,CAAC,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,iBAAiB,CAAA;AACrC,EAAA,IAAI,CAAA,EAAG;AACL,IAAA,GAAA,CAAI,UAAA,GAAa,CAAA,CAAE,CAAC,CAAA,CAAE,IAAA,EAAK;AAC3B,IAAA,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,CAAA,CAAE,CAAC,EAAE,MAAM,CAAA;AAAA,EACzB;AAEA,EAAA,CAAA,GAAI,CAAA,CAAE,MAAM,kBAAkB,CAAA;AAC9B,EAAA,IAAI,CAAA,EAAG;AACL,IAAA,GAAA,CAAI,SAAA,GAAY,CAAA,CAAE,CAAC,CAAA,CAAE,IAAA,EAAK;AAC1B,IAAA,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,CAAA,CAAE,CAAC,EAAE,MAAM,CAAA;AAAA,EACzB;AAEA,EAAA,CAAA,GAAI,CAAA,CAAE,MAAM,0CAA0C,CAAA;AACtD,EAAA,IAAI,CAAA,EAAG;AACL,IAAA,GAAA,CAAI,WAAA,GAAc,CAAA,CAAE,CAAC,CAAA,CAAE,IAAA,EAAK;AAC5B,IAAA,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,CAAA,CAAE,CAAC,EAAE,MAAM,CAAA;AAAA,EACzB;AAGA,EAAA,IAAI,CAAC,GAAA,CAAI,UAAA,IAAc,CAAA,CAAE,MAAK,EAAG;AAC/B,IAAA,GAAA,CAAI,aAAa,CAAA,CAAE,IAAA,EAAK,CAAE,OAAA,CAAQ,UAAU,EAAE,CAAA;AAAA,EAChD;AACA,EAAA,OAAO,GAAA;AACT;AAYA,SAAS,SAAA,CAAUqC,MAAAA,EAAoB,EAAA,EAAY,IAAA,EAA2B,MAAA,EAAsB;AAClG,EAAA,MAAM,KAAA,GAAQA,MAAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AAClC,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,MAAM,IAAI,iBAAA;AAAA,MACR,CAAA,YAAA,EAAe,EAAE,CAAA,yBAAA,EAA4B,MAAM,CAAA,CAAA,CAAA;AAAA,MACnD;AAAA,KACF;AAAA,EACF;AACA,EAAAA,MAAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,EAAA,EAAI,IAAI,CAAA;AAC5B;AAEA,SAAS,YAAYA,MAAAA,EAA0B;AAC7C,EAAA,IAAIA,MAAAA,CAAM,CAAA,IAAKA,MAAAA,CAAM,KAAA,CAAM,MAAA,EAAQ;AACjC,IAAA,MAAM,IAAI,iBAAA,CAAkB,iDAAA,EAA8C,CAAC,CAAA;AAAA,EAC7E;AACA,EAAA,MAAM,KAAA,GAAQA,MAAAA,CAAM,KAAA,CAAMA,MAAAA,CAAM,CAAC,CAAA;AACjC,EAAA,IAAI,CAAC,aAAA,CAAc,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,EAAG;AACnC,IAAA,MAAM,IAAI,iBAAA;AAAA,MACR,CAAA,uDAAA,EAA0D,MAAM,IAAI,CAAA,CAAA,CAAA;AAAA,MACpE,KAAA,CAAM;AAAA,KACR;AAAA,EACF;AAEA,EAAA,MAAM,OAAO,KAAA,CAAM,IAAA,CAAK,QAAQ,aAAA,EAAe,EAAE,EAAE,IAAA,EAAK;AACxD,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,aAAa,CAAA;AAClC,IAAA,IAAI,GAAGA,MAAAA,CAAM,GAAA,CAAI,KAAA,GAAQ,EAAE,CAAC,CAAA;AAAA,EAC9B;AACA,EAAAA,MAAAA,CAAM,CAAA,EAAA;AAEN,EAAA,OAAOA,MAAAA,CAAM,CAAA,GAAIA,MAAAA,CAAM,KAAA,CAAM,MAAA,EAAQ;AACnC,IAAA,MAAM,EAAA,GAAKA,MAAAA,CAAM,KAAA,CAAMA,MAAAA,CAAM,CAAC,CAAA;AAC9B,IAAA,MAAM,CAAA,GAAI,EAAA,CAAG,IAAA,CAAK,KAAA,CAAM,uDAAuD,CAAA;AAC/E,IAAA,IAAI,CAAC,CAAA,EAAG;AACR,IAAA,MAAM,GAAA,GAAM,CAAA,CAAE,CAAC,CAAA,CAAE,WAAA,EAAY;AAC7B,IAAA,MAAM,QAAA,GAAW,CAAA,CAAE,CAAC,CAAA,CAAE,IAAA,EAAK;AAC3B,IAAA,MAAM,KAAA,GAAQC,aAAY,QAAQ,CAAA;AAClC,IAAA,IAAI,GAAA,KAAQ,OAAA,EAASD,MAAAA,CAAM,IAAI,KAAA,GAAQ,KAAA;AAAA,SAAA,IAC9B,GAAA,KAAQ,QAAA,EAAUA,MAAAA,CAAM,IAAI,MAAA,GAAS,KAAA;AAAA,SAAA,IACrC,QAAQ,WAAA,EAAa;AAC5B,MAAA,MAAM,CAAA,GAAI,MAAM,WAAA,EAAY;AAC5B,MAAA,IAAI,CAAA,KAAM,IAAA,IAAQ,CAAA,KAAM,IAAA,EAAM;AAC5B,QAAA,MAAM,IAAI,iBAAA,CAAkB,CAAA,iCAAA,EAAoC,KAAK,CAAA,CAAA,CAAA,EAAK,GAAG,IAAI,CAAA;AAAA,MACnF;AACA,MAAAA,MAAAA,CAAM,IAAI,SAAA,GAAY,CAAA;AAAA,IACxB,CAAA,MAAA,IAAW,QAAQ,gBAAA,EAAkB;AACnC,MAAA,MAAM,CAAA,GAAI,MAAM,WAAA,EAAY;AAC5B,MAAA,IAAI,CAAA,KAAM,MAAA,EAAQA,MAAAA,CAAM,IAAI,kBAAA,GAAqB,IAAA;AAAA,WAAA,IACxC,CAAA,KAAM,YAAA,EAAcA,MAAAA,CAAM,IAAI,kBAAA,GAAqB,KAAA;AAAA,WACvD,MAAM,IAAI,iBAAA,CAAkB,CAAA,6CAAA,CAAA,EAAiD,GAAG,IAAI,CAAA;AAAA,IAC3F;AACA,IAAAA,MAAAA,CAAM,CAAA,EAAA;AAAA,EACR;AACF;AAEA,SAASC,aAAY,CAAA,EAAmB;AACtC,EAAA,MAAM,CAAA,GAAI,EAAE,IAAA,EAAK;AACjB,EAAA,IAAI,CAAA,CAAE,UAAA,CAAW,GAAG,CAAA,IAAK,EAAE,QAAA,CAAS,GAAG,CAAA,IAAK,CAAA,CAAE,UAAU,CAAA,EAAG,OAAO,CAAA,CAAE,KAAA,CAAM,GAAG,EAAE,CAAA;AAC/E,EAAA,OAAO,CAAA;AACT;AAGA,SAAS,cAAA,CAAe,IAAaD,MAAAA,EAA6B;AAChE,EAAA,MAAM,CAAA,GAAI,EAAA,CAAG,IAAA,CAAK,KAAA,CAAM,qBAAqB,CAAA;AAC7C,EAAA,IAAI,CAAC,GAAG,OAAO,KAAA;AACf,EAAA,IAAI,IAAA,GAAO,CAAA,CAAE,CAAC,CAAA,CAAE,IAAA,EAAK;AAErB,EAAA,IAAI,UAAA;AACJ,EAAA,MAAM,OAAO,IAAA,CAAK,KAAA,CAAM,eAAe,CAAA,IAAK,IAAA,CAAK,MAAM,iBAAiB,CAAA;AACxE,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,UAAA,GAAa,IAAA,CAAK,CAAC,CAAA,CAAE,IAAA,EAAK;AAC1B,IAAA,IAAA,GAAO,KAAK,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,KAAK,EAAE,IAAA,EAAK;AAAA,EACxC;AAEA,EAAA,IAAI,IAAA,GAAyB,OAAA;AAC7B,EAAA,IAAI,IAAA;AACJ,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,gDAAgD,CAAA;AAC7E,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,MAAM,CAAA,GAAI,SAAA,CAAU,CAAC,CAAA,CAAE,WAAA,EAAY;AACnC,IAAA,IAAI,CAAA,KAAM,MAAA,IAAU,CAAA,KAAM,OAAA,EAAS,IAAA,GAAO,CAAA;AAAA,SACrC,IAAA,GAAO,CAAA;AACZ,IAAA,IAAA,GAAO,KAAK,KAAA,CAAM,CAAA,EAAG,SAAA,CAAU,KAAK,EAAE,IAAA,EAAK;AAAA,EAC7C;AAEA,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,gDAAgD,CAAA;AAC9E,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,MAAM,CAAA,GAAI,UAAA,CAAW,CAAC,CAAA,CAAE,WAAA,EAAY;AACpC,IAAA,IAAI,CAAA,KAAM,MAAA,IAAU,CAAA,KAAM,OAAA,EAAS,IAAA,GAAO,CAAA;AAAA,SACrC,IAAA,GAAO,CAAA;AACZ,IAAA,IAAA,GAAO,KAAK,KAAA,CAAM,CAAA,EAAG,UAAA,CAAW,KAAK,EAAE,IAAA,EAAK;AAAA,EAC9C;AAEA,EAAA,IAAI,EAAA;AACJ,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,4BAA4B,CAAA;AACvD,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,EAAA,GAAK,QAAQ,CAAC,CAAA;AACd,IAAA,IAAA,GAAO,KAAK,KAAA,CAAM,CAAA,EAAG,OAAA,CAAQ,KAAK,EAAE,IAAA,EAAK;AAAA,EAC3C;AAEA,EAAA,MAAM,IAAA,GAAOC,aAAY,IAAI,CAAA;AAC7B,EAAA,IAAI,CAAC,IAAA,EAAM,MAAM,IAAI,iBAAA,CAAkB,CAAA,8BAAA,CAAA,EAAkC,GAAG,IAAI,CAAA;AAChF,EAAA,MAAM,OAAA,GAAU,EAAA,IAAM,YAAA,CAAa,IAAI,CAAA;AACvC,EAAA,SAAA,CAAUD,MAAAA,EAAO,OAAA,EAAS,OAAA,EAAS,EAAA,CAAG,IAAI,CAAA;AAC1C,EAAA,MAAM,KAAA,GAAsB;AAAA,IAC1B,EAAA,EAAI,OAAA;AAAA,IACJ,IAAA;AAAA,IACA,IAAA;AAAA,IACA,MAAM,EAAA,CAAG;AAAA,GACX;AACA,EAAA,IAAI,UAAA,KAAe,MAAA,EAAW,KAAA,CAAM,UAAA,GAAa,UAAA;AACjD,EAAA,IAAI,IAAA,KAAS,MAAA,EAAW,KAAA,CAAM,IAAA,GAAO,IAAA;AACrC,EAAAA,MAAAA,CAAM,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA;AAC3B,EAAA,OAAO,IAAA;AACT;AAGA,SAAS,gBAAA,CAAiB,IAAaA,MAAAA,EAA6B;AAClE,EAAA,MAAM,CAAA,GAAI,EAAA,CAAG,IAAA,CAAK,KAAA,CAAM,uBAAuB,CAAA;AAC/C,EAAA,IAAI,CAAC,GAAG,OAAO,KAAA;AACf,EAAA,IAAI,IAAA,GAAO,CAAA,CAAE,CAAC,CAAA,CAAE,IAAA,EAAK;AAErB,EAAA,IAAI,UAAA,GAAa,KAAA;AACjB,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,EAAG;AACtB,IAAA,UAAA,GAAa,IAAA;AACb,IAAA,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,EAAE,IAAA,EAAK;AAAA,EAChC;AAEA,EAAA,IAAI,UAAA;AACJ,EAAA,MAAM,OAAO,IAAA,CAAK,KAAA,CAAM,eAAe,CAAA,IAAK,IAAA,CAAK,MAAM,iBAAiB,CAAA;AACxE,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,UAAA,GAAa,IAAA,CAAK,CAAC,CAAA,CAAE,IAAA,EAAK;AAC1B,IAAA,IAAA,GAAO,KAAK,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,KAAK,EAAE,IAAA,EAAK;AAAA,EACxC;AAEA,EAAA,IAAI,EAAA;AACJ,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,4BAA4B,CAAA;AACvD,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,EAAA,GAAK,QAAQ,CAAC,CAAA;AACd,IAAA,IAAA,GAAO,KAAK,KAAA,CAAM,CAAA,EAAG,OAAA,CAAQ,KAAK,EAAE,IAAA,EAAK;AAAA,EAC3C;AACA,EAAA,MAAM,IAAA,GAAOC,aAAY,IAAI,CAAA;AAC7B,EAAA,IAAI,CAAC,IAAA,EAAM,MAAM,IAAI,iBAAA,CAAkB,CAAA,gCAAA,CAAA,EAAoC,GAAG,IAAI,CAAA;AAClF,EAAA,MAAM,IAAA,GAAO,EAAA,IAAM,YAAA,CAAa,IAAI,CAAA;AACpC,EAAA,SAAA,CAAUD,MAAAA,EAAO,IAAA,EAAM,SAAA,EAAW,EAAA,CAAG,IAAI,CAAA;AACzC,EAAA,MAAM,IAAA,GAAoB;AAAA,IACxB,EAAA,EAAI,IAAA;AAAA,IACJ,IAAA;AAAA,IACA,iBAAiB,EAAC;AAAA,IAClB,MAAM,EAAA,CAAG;AAAA,GACX;AACA,EAAA,IAAI,UAAA,KAAe,MAAA,EAAW,IAAA,CAAK,UAAA,GAAa,UAAA;AAChD,EAAAA,MAAAA,CAAM,GAAA,CAAI,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AAE5B,EAAA,IAAI,UAAA,EAAY;AACd,IAAAA,MAAAA,CAAM,CAAA,EAAA;AACN,IAAA,OAAOA,MAAAA,CAAM,CAAA,GAAIA,MAAAA,CAAM,KAAA,CAAM,MAAA,EAAQ;AACnC,MAAA,MAAM,KAAA,GAAQA,MAAAA,CAAM,KAAA,CAAMA,MAAAA,CAAM,CAAC,CAAA;AACjC,MAAA,IAAI,KAAA,CAAM,SAAS,GAAA,EAAK;AACtB,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,MAAM,OAAA,GAAU,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,iCAAiC,CAAA;AAClE,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,IAAA,CAAK,gBAAgB,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA,CAAE,MAAM,CAAA;AAC3C,QAAAA,MAAAA,CAAM,CAAA,EAAA;AACN,QAAA;AAAA,MACF;AACA,MAAA,MAAM,IAAI,iBAAA;AAAA,QACR,CAAA,4DAAA,CAAA;AAAA,QACA,KAAA,CAAM;AAAA,OACR;AAAA,IACF;AACA,IAAA,MAAM,IAAI,iBAAA,CAAkB,CAAA,yCAAA,CAAA,EAA6C,EAAA,CAAG,IAAI,CAAA;AAAA,EAClF;AACA,EAAA,OAAO,IAAA;AACT;AAGA,SAAS,mBAAA,CAAoB,IAAaA,MAAAA,EAA6B;AAErE,EAAA,IAAI,CAAA,GAAI,EAAA,CAAG,IAAA,CAAK,KAAA,CAAM,2CAA2C,CAAA;AACjE,EAAA,IAAI,CAAA,EAAG;AACL,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,CAAC,CAAA,CAAE,IAAA,EAAK;AACvB,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAC,CAAA,IAAK,aAAa,IAAI,CAAA;AACpC,IAAA,SAAA,CAAUA,MAAAA,EAAO,EAAA,EAAI,OAAA,EAAS,EAAA,CAAG,IAAI,CAAA;AACrC,IAAAA,MAAAA,CAAM,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,EAAE,EAAA,EAAI,IAAA,EAAM,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,EAAA,CAAG,IAAA,EAAM,CAAA;AAChE,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,CAAA,GAAI,EAAA,CAAG,IAAA,CAAK,KAAA,CAAM,8CAA8C,CAAA;AAChE,EAAA,IAAI,CAAA,EAAG;AACL,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,CAAC,CAAA,CAAE,IAAA,EAAK;AACvB,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAC,CAAA,IAAK,aAAa,IAAI,CAAA;AACpC,IAAA,SAAA,CAAUA,MAAAA,EAAO,EAAA,EAAI,SAAA,EAAW,EAAA,CAAG,IAAI,CAAA;AACvC,IAAAA,MAAAA,CAAM,GAAA,CAAI,QAAA,CAAS,IAAA,CAAK;AAAA,MACtB,EAAA;AAAA,MACA,IAAA;AAAA,MACA,iBAAiB,EAAC;AAAA,MAClB,MAAM,EAAA,CAAG;AAAA,KACV,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,SAAA,CAAU,IAAaA,MAAAA,EAA6B;AAC3D,EAAA,MAAM,CAAA,GAAI,EAAA,CAAG,IAAA,CAAK,KAAA,CAAM,yCAAyC,CAAA;AACjE,EAAA,IAAI,CAAC,GAAG,OAAO,KAAA;AACf,EAAA,MAAMpC,KAAAA,GAAAA,CAAQ,EAAE,CAAC,CAAA,IAAK,EAAE,CAAC,CAAA,IAAK,IAAI,IAAA,EAAK;AACvC,EAAAoC,MAAAA,CAAM,CAAA,EAAA;AACN,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,OAAOA,MAAAA,CAAM,CAAA,GAAIA,MAAAA,CAAM,KAAA,CAAM,MAAA,EAAQ;AACnC,IAAA,MAAM,KAAA,GAAQA,MAAAA,CAAM,KAAA,CAAMA,MAAAA,CAAM,CAAC,CAAA;AACjC,IAAA,IAAI,KAAA,CAAM,SAAS,GAAA,EAAK;AACtB,MAAA,MAAM,OAAoB,EAAE,IAAA,EAAApC,OAAM,OAAA,EAAS,IAAA,EAAM,GAAG,IAAA,EAAK;AACzD,MAAAoC,MAAAA,CAAM,GAAA,CAAI,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AACzB,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,KAAA,MAAW,GAAA,IAAO,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,EAAG;AAC5E,MAAA,OAAA,CAAQ,KAAK,GAAG,CAAA;AAAA,IAClB;AACA,IAAAA,MAAAA,CAAM,CAAA,EAAA;AAAA,EACR;AACA,EAAA,MAAM,IAAI,iBAAA,CAAkB,CAAA,uBAAA,CAAA,EAA2B,EAAA,CAAG,IAAI,CAAA;AAChE;AAEA,SAAS,aAAa,IAAA,EAAsB;AAG1C,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,gBAAA,EAAkB,GAAG,CAAA;AAC/C,EAAA,OAAO,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA,GAAI,OAAO,GAAA,GAAM,IAAA;AAChD;AAEA,SAAS,aAAA,CAAc,IAAaA,MAAAA,EAA6B;AAC/D,EAAA,MAAM,EAAA,GAAK,SAAA,CAAU,EAAA,CAAG,IAAI,CAAA;AAC5B,EAAA,IAAI,CAAC,IAAI,OAAO,KAAA;AAChB,EAAA,MAAM,GAAA,GAAM,GAAG,IAAA,CAAK,KAAA,CAAM,GAAG,EAAA,CAAG,KAAK,EAAE,IAAA,EAAK;AAC5C,EAAA,MAAM,SAAA,GAAY,EAAA,CAAG,IAAA,CAAK,KAAA,CAAM,GAAG,GAAG,CAAA;AACtC,EAAA,MAAM,QAAA,GAAW,eAAe,SAAS,CAAA;AACzC,EAAA,MAAM,GAAA,GAAA,CAAO,YAAY,CAAA,GAAI,SAAA,CAAU,MAAM,CAAA,EAAG,QAAQ,CAAA,GAAI,SAAA,EAAW,IAAA,EAAK;AAC5E,EAAA,MAAM,QAAA,GAAW,YAAY,CAAA,GAAI,SAAA,CAAU,MAAM,QAAA,GAAW,CAAC,CAAA,CAAE,IAAA,EAAK,GAAI,EAAA;AACxE,EAAA,MAAM,GAAA,GAAM,mBAAA,CAAoB,GAAA,EAAK,EAAA,CAAG,IAAI,CAAA;AAC5C,EAAA,MAAM,GAAA,GAAM,mBAAA,CAAoB,GAAA,EAAK,EAAA,CAAG,IAAI,CAAA;AAK5C,EAAA,KAAA,MAAW,SAAS,CAAC,GAAA,CAAI,EAAA,EAAI,GAAA,CAAI,EAAE,CAAA,EAAG;AACpC,IAAA,IAAI,CAACA,MAAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA,EAAG;AAC7B,MAAA,MAAM,IAAI,iBAAA,CAAkB,CAAA,oBAAA,EAAuB,KAAK,CAAA,CAAA,CAAA,EAAK,GAAG,IAAI,CAAA;AAAA,IACtE;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAQ,iBAAiB,QAAQ,CAAA;AAEvC,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,WAAW,GAAA,CAAI,EAAA;AACnB,EAAA,IAAI,WAAW,GAAA,CAAI,EAAA;AAEnB,EAAA,QAAQ,GAAG,EAAA;AAAI,IACb,KAAK,IAAA;AACH,MAAA,IAAA,GAAO,aAAA;AACP,MAAA;AAAA,IACF,KAAK,KAAA;AACH,MAAA,IAAA,GAAO,UAAA;AACP,MAAA;AAAA,IACF,KAAK,KAAA;AAEH,MAAA,IAAI,MAAM,UAAA,IAAc,YAAA,CAAa,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,EAAG;AAC3D,QAAA,IAAA,GAAO,QAAA;AAAA,MACT,CAAA,MAAO;AACL,QAAA,IAAA,GAAO,SAAA;AAAA,MACT;AACA,MAAA;AAAA,IACF,KAAK,KAAA;AAKH,MAAA,IAAI,MAAM,UAAA,IAAc,aAAA,CAAc,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,EAAG;AAE5D,QAAA,IAAA,GAAO,SAAA;AACP,QAAA,CAAC,QAAA,EAAU,QAAQ,CAAA,GAAI,CAAC,UAAU,QAAQ,CAAA;AAAA,MAC5C,CAAA,MAAO;AACL,QAAA,IAAA,GAAO,QAAA;AAAA,MACT;AACA,MAAA;AAAA,IACF,KAAK,MAAA;AACH,MAAA,IAAA,GAAO,gBAAA;AACP,MAAA;AAAA,IACF;AACE,MAAA,MAAM,IAAI,iBAAA,CAAkB,CAAA,kBAAA,EAAqB,GAAG,EAAE,CAAA,CAAA,CAAA,EAAK,GAAG,IAAI,CAAA;AAAA;AAItE,EAAA,MAAM,OAAA,GAAUA,MAAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA;AAC1C,EAAA,MAAM,OAAA,GAAUA,MAAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA;AAC1C,EAAA,gBAAA,CAAiB,MAAM,OAAA,EAAS,OAAA,EAAS,QAAA,EAAU,QAAA,EAAU,GAAG,IAAI,CAAA;AAEpE,EAAA,MAAM,GAAA,GAAuB;AAAA,IAC3B,IAAA;AAAA,IACA,MAAA,EAAQ,QAAA;AAAA,IACR,MAAA,EAAQ,QAAA;AAAA,IACR,MAAM,EAAA,CAAG;AAAA,GACX;AAGA,EAAA,IAAI,UAAU,GAAA,CAAI,IAAA;AAClB,EAAA,IAAI,UAAU,GAAA,CAAI,IAAA;AAClB,EAAA,IAAI,EAAA,CAAG,EAAA,KAAO,KAAA,IAAS,IAAA,KAAS,SAAA,EAAW;AACzC,IAAA,CAAC,OAAA,EAAS,OAAO,CAAA,GAAI,CAAC,SAAS,OAAO,CAAA;AAAA,EACxC;AACA,EAAA,IAAI,OAAA,KAAY,MAAA,EAAW,GAAA,CAAI,kBAAA,GAAqB,OAAA;AACpD,EAAA,IAAI,OAAA,KAAY,MAAA,EAAW,GAAA,CAAI,kBAAA,GAAqB,OAAA;AAEpD,EAAA,IAAI,MAAM,UAAA,EAAY;AACpB,IAAA,MAAM,EAAA,GAAK,KAAA,CAAM,UAAA,CAAW,WAAA,EAAY;AACxC,IAAA,IAAI,SAAS,SAAA,IAAa,EAAA,KAAO,SAAA,EAAW,GAAA,CAAI,aAAa,KAAA,CAAM,UAAA;AAAA,SAAA,IAC1D,SAAS,QAAA,IAAY,EAAA,KAAO,QAAA,EAAU,GAAA,CAAI,aAAa,KAAA,CAAM,UAAA;AAAA,SAAA,IAC7D,IAAA,KAAS,aAAA,IAAiB,IAAA,KAAS,UAAA,EAAY;AACtD,MAAA,GAAA,CAAI,aAAa,KAAA,CAAM,UAAA;AAAA,IACzB;AAAA,EACF;AACA,EAAA,IAAI,KAAA,CAAM,SAAA,KAAc,MAAA,EAAW,GAAA,CAAI,YAAY,KAAA,CAAM,SAAA;AACzD,EAAA,IAAI,KAAA,CAAM,WAAA,KAAgB,MAAA,EAAW,GAAA,CAAI,oBAAoB,KAAA,CAAM,WAAA;AAGnE,EAAA,IAAI,IAAA,KAAS,QAAA,IAAY,GAAA,CAAI,iBAAA,EAAmB;AAC9C,IAAA,MAAM,IAAA,GAAOA,OAAM,GAAA,CAAI,QAAA,CAAS,KAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,QAAQ,CAAA;AAC7D,IAAA,IAAI,QAAQ,CAAC,IAAA,CAAK,gBAAgB,QAAA,CAAS,GAAA,CAAI,iBAAiB,CAAA,EAAG;AACjE,MAAA,MAAM,IAAI,iBAAA;AAAA,QACR,CAAA,iBAAA,EAAoB,GAAA,CAAI,iBAAiB,CAAA,+BAAA,EAAkC,KAAK,IAAI,CAAA,CAAA,CAAA;AAAA,QACpF,EAAA,CAAG;AAAA,OACL;AAAA,IACF;AAAA,EACF;AAEA,EAAAA,MAAAA,CAAM,GAAA,CAAI,SAAA,CAAU,IAAA,CAAK,GAAG,CAAA;AAC5B,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,iBACP,IAAA,EACA,OAAA,EACA,OAAA,EACA,KAAA,EACA,OACA,MAAA,EACM;AACN,EAAA,IAAI,IAAA,KAAS,aAAA,IAAiB,IAAA,KAAS,UAAA,EAAY;AACjD,IAAA,IAAI,OAAA,KAAY,OAAA,IAAW,OAAA,KAAY,OAAA,EAAS;AAC9C,MAAA,MAAM,IAAI,iBAAA;AAAA,QACR,CAAA,mEAAA,EAAsE,KAAK,CAAA,OAAA,EAAU,KAAK,CAAA,EAAA,CAAA;AAAA,QAC1F;AAAA,OACF;AAAA,IACF;AACA,IAAA,IAAI,OAAA,KAAY,SAAA,IAAa,OAAA,KAAY,SAAA,EAAW;AAClD,MAAA,MAAM,IAAI,iBAAA;AAAA,QACR,CAAA,0FAAA,CAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AACA,IAAA;AAAA,EACF;AACA,EAAA,IAAI,IAAA,KAAS,SAAA,IAAa,IAAA,KAAS,QAAA,EAAU;AAC3C,IAAA,IAAI,OAAA,KAAY,SAAA,IAAa,OAAA,KAAY,SAAA,EAAW;AAClD,MAAA,MAAM,KAAA,GAAQ,IAAA,KAAS,SAAA,GAAY,SAAA,GAAY,QAAA;AAC/C,MAAA,MAAM,IAAI,iBAAA;AAAA,QACR,OAAI,KAAK,CAAA,yDAAA,CAAA;AAAA,QACT;AAAA,OACF;AAAA,IACF;AACA,IAAA;AAAA,EACF;AACA,EAAA,IAAI,SAAS,gBAAA,EAAkB;AAC7B,IAAA,IAAI,YAAY,OAAA,EAAS;AACvB,MAAA,MAAM,IAAI,iBAAA;AAAA,QACR,CAAA,+EAAA,CAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AACA,IAAA;AAAA,EACF;AACF;AAIO,SAAS,aAAa,GAAA,EAAyB;AACpD,EAAA,MAAM,GAAA,GAAkB;AAAA,IACtB,IAAA,EAAM,SAAA;AAAA,IACN,SAAA,EAAW,IAAA;AAAA,IACX,kBAAA,EAAoB,IAAA;AAAA,IACpB,QAAQ,EAAC;AAAA,IACT,UAAU,EAAC;AAAA,IACX,WAAW,EAAC;AAAA,IACZ,OAAO,EAAC;AAAA,IACR,UAAU;AAAC,GACb;AACA,EAAA,MAAMA,MAAAA,GAAqB;AAAA,IACzB,GAAA;AAAA,IACA,OAAA,sBAAa,GAAA,EAAI;AAAA,IACjB,KAAA,EAAOlB,YAAW,GAAG,CAAA;AAAA,IACrB,CAAA,EAAG;AAAA,GACL;AACA,EAAA,WAAA,CAAYkB,MAAK,CAAA;AAEjB,EAAA,OAAOA,MAAAA,CAAM,CAAA,GAAIA,MAAAA,CAAM,KAAA,CAAM,MAAA,EAAQ;AACnC,IAAA,MAAM,EAAA,GAAKA,MAAAA,CAAM,KAAA,CAAMA,MAAAA,CAAM,CAAC,CAAA;AAE9B,IAAA,IAAI,cAAA,CAAe,EAAA,EAAIA,MAAK,CAAA,EAAG;AAAE,MAAAA,MAAAA,CAAM,CAAA,EAAA;AAAK,MAAA;AAAA,IAAU;AACtD,IAAA,IAAI,gBAAA,CAAiB,EAAA,EAAIA,MAAK,CAAA,EAAG;AAAE,MAAAA,MAAAA,CAAM,CAAA,EAAA;AAAK,MAAA;AAAA,IAAU;AACxD,IAAA,IAAI,mBAAA,CAAoB,EAAA,EAAIA,MAAK,CAAA,EAAG;AAAE,MAAAA,MAAAA,CAAM,CAAA,EAAA;AAAK,MAAA;AAAA,IAAU;AAC3D,IAAA,IAAI,SAAA,CAAU,EAAA,EAAIA,MAAK,CAAA,EAAG;AAAE,MAAAA,MAAAA,CAAM,CAAA,EAAA;AAAK,MAAA;AAAA,IAAU;AACjD,IAAA,IAAI,aAAA,CAAc,EAAA,EAAIA,MAAK,CAAA,EAAG;AAAE,MAAAA,MAAAA,CAAM,CAAA,EAAA;AAAK,MAAA;AAAA,IAAU;AACrD,IAAA,MAAM,IAAI,iBAAA,CAAkB,CAAA,wBAAA,EAA2B,GAAG,IAAI,CAAA,CAAA,EAAI,GAAG,IAAI,CAAA;AAAA,EAC3E;AAGA,EAAA,IAAI,CAAC,GAAA,CAAI,MAAA,IAAU,GAAA,CAAI,QAAA,CAAS,UAAU,CAAA,EAAG;AAC3C,IAAA,GAAA,CAAI,QAAA,CAAS,IAAA;AAAA,MACX;AAAA,KACF;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;;;AC5lBO,IAAM,aAAA,GAAgB;AAAA,EAC3B,OAAA,EAAS,EAAA;AAAA;AAAA,EACT,SAAA,EAAW,GAAA;AAAA;AAAA,EACX,WAAA,EAAa,EAAA;AAAA;AAAA,EAEb,MAAA,EAAQ,EAAA;AAAA,EACR,MAAA,EAAQ,EAAA;AAAA,EACR,aAAA,EAAe,EAAA;AAAA,EACf,aAAA,EAAe,EAAA;AAAA,EACf,WAAA,EAAa,GAAA;AAAA,EACb,UAAA,EAAY,GAAA;AAAA,EACZ,OAAA,EAAS,EAAA;AAAA,EACT,SAAA,EAAW,EAAA;AAAA,EACX,WAAA,EAAa,EAAA;AAAA,EACb,UAAA,EAAY,kBAAA;AAAA,EAEZ,OAAA,EAAS,EAAA;AAAA,EACT,OAAA,EAAS,EAAA;AAAA,EACT,aAAA,EAAe,EAAA;AAAA,EACf,UAAA,EAAY,GAAA;AAAA,EACZ,UAAA,EAAY,EAAA;AAAA,EACZ,SAAA,EAAW,EAAA;AAAA;AAAA,EACX,WAAA,EAAa,GAAA;AAAA;AAAA,EAEb,WAAA,EAAa,EAAA;AAAA,EACb,eAAA,EAAiB,EAAA;AAAA,EACjB,kBAAA,EAAoB,EAAA;AAAA,EAEpB,MAAA,EAAQ,EAAA;AAAA,EACR,OAAA,EAAS,EAAA;AAAA,EAET,kBAAA,EAAoB,CAAA;AAAA,EACpB,mBAAA,EAAqB;AACvB,CAAA;AAIA,SAAS,sBACP,EAAA,EACA,EAAA,EACA,EAAA,EACA,EAAA,EACA,IACA,EAAA,EAC0B;AAC1B,EAAA,MAAM,KAAK,EAAA,GAAK,EAAA;AAChB,EAAA,MAAM,KAAK,EAAA,GAAK,EAAA;AAChB,EAAA,IAAI,EAAA,KAAO,CAAA,IAAK,EAAA,KAAO,CAAA,EAAG,OAAO,EAAE,CAAA,EAAG,EAAA,GAAK,EAAA,EAAI,CAAA,EAAG,EAAA,EAAG;AACrD,EAAA,MAAM,CAAA,GAAI,IAAI,IAAA,CAAK,IAAA,CAAA,CAAM,KAAK,EAAA,KAAO,CAAA,GAAA,CAAK,EAAA,GAAK,EAAA,KAAO,CAAC,CAAA;AACvD,EAAA,OAAO,EAAE,GAAG,EAAA,GAAK,EAAA,GAAK,GAAG,CAAA,EAAG,EAAA,GAAK,KAAK,CAAA,EAAE;AAC1C;AAEA,SAAS,YAAY,EAAA,EAAqB;AAExC,EAAA,OACG,EAAA,IAAM,KAAA,IAAU,EAAA,IAAM,KAAA,IACtB,EAAA,IAAM,SAAU,EAAA,IAAM,KAAA,IACtB,EAAA,IAAM,KAAA,IAAU,EAAA,IAAM,KAAA;AAE3B;AAEA,SAAS,iBAAA,CAAkB,GAAW,KAAA,EAAuB;AAC3D,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,KAAA,MAAW,MAAM,CAAA,EAAG;AAElB,IAAA,CAAA,IAAK,WAAA,CAAY,GAAG,WAAA,CAAY,CAAC,KAAK,CAAC,CAAA,GAAI,QAAQ,GAAA,GAAM,KAAA;AAAA,EAC3D;AACA,EAAA,OAAO,CAAA;AACT;AAIA,SAAS,YAAY,EAAA,EAAgE;AACnF,EAAA,MAAME,EAAAA,GAAI,aAAA;AACV,EAAA,MAAM,KAAA,GAAQ,iBAAA,CAAkB,EAAA,CAAG,IAAA,EAAMA,GAAE,WAAW,CAAA;AACtD,EAAA,IAAI,MAAA,GAAS,KAAA;AACb,EAAA,IAAI,GAAG,UAAA,EAAY;AACjB,IAAA,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,iBAAA,CAAkB,CAAA,IAAA,EAAI,GAAG,UAAU,CAAA,IAAA,CAAA,EAAKA,EAAAA,CAAE,UAAU,CAAC,CAAA;AAAA,EACjF;AAGA,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,EAAA,CAAG,UAAA,EAAY,KAAA,IAASA,EAAAA,CAAE,SAAA;AAC9B,EAAA,KAAA,IAASA,EAAAA,CAAE,OAAA;AAEX,EAAA,MAAM,MAAA,GAAS,EAAA,CAAG,eAAA,CAAgB,MAAA,GAAS,CAAA;AAC3C,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,KAAA,IAAS,CAAA;AACT,IAAA,KAAA,IAASA,EAAAA,CAAE,WAAA;AACX,IAAA,KAAA,IAAS,EAAA,CAAG,eAAA,CAAgB,MAAA,GAASA,EAAAA,CAAE,WAAA;AACvC,IAAA,MAAA,GAAS,IAAA,CAAK,IAAI,MAAA,EAAQ,iBAAA,CAAkBA,GAAE,UAAA,EAAYA,EAAAA,CAAE,UAAU,CAAC,CAAA;AACvE,IAAA,KAAA,MAAW,EAAA,IAAM,GAAG,eAAA,EAAiB;AACnC,MAAA,MAAA,GAAS,IAAA,CAAK,IAAI,MAAA,EAAQ,iBAAA,CAAkB,IAAIA,EAAAA,CAAE,UAAU,IAAI,EAAE,CAAA;AAAA,IACpE;AAAA,EACF;AAIA,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAIA,EAAAA,CAAE,MAAA,EAAS,SAAS,CAAA,GAAK,IAAA,CAAK,KAAA,GAAQA,EAAAA,CAAE,aAAa,CAAA;AACzE,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAIA,EAAAA,CAAE,MAAA,EAAS,QAAQ,CAAA,GAAK,IAAA,CAAK,KAAA,GAAQA,EAAAA,CAAE,aAAa,CAAA;AAExE,EAAA,MAAM,MAAA,GAAwD;AAAA,IAC5D,EAAA,EAAI,IAAA,CAAK,KAAA,CAAM,EAAE,CAAA;AAAA,IACjB,EAAA,EAAI,IAAA,CAAK,KAAA,CAAM,EAAE;AAAA,GACnB;AACA,EAAA,OAAO,MAAA;AACT;AASA,SAAS,cAAA,CAAe,KAAiB,KAAA,EAAgC;AACvE,EAAA,MAAM,QAAoB,EAAC;AAC3B,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,SAAA,EAAW;AAC7B,IAAA,IAAI,CAAC,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,MAAM,CAAA,IAAK,CAAC,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,MAAM,CAAA,EAAG;AAClD,IAAA,IAAI,CAAA,CAAE,SAAS,SAAA,EAAW;AAExB,MAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA,CAAE,QAAQ,EAAA,EAAI,CAAA,CAAE,QAAQ,CAAA;AAAA,IAC7C,CAAA,MAAA,IAAW,CAAA,CAAE,IAAA,KAAS,QAAA,EAAU;AAE9B,MAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA,CAAE,QAAQ,EAAA,EAAI,CAAA,CAAE,QAAQ,CAAA;AAAA,IAC7C,CAAA,MAAA,IAAW,CAAA,CAAE,IAAA,KAAS,gBAAA,EAAkB;AAEtC,MAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA,CAAE,QAAQ,EAAA,EAAI,CAAA,CAAE,QAAQ,CAAA;AAAA,IAC7C;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,YAAA,CAAa,KAAoB,SAAA,EAA4C;AACpF,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAoB;AACtC,EAAA,KAAA,MAAW,KAAK,GAAA,EAAK,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,IAAI,CAAC,CAAA;AAEtC,EAAA,MAAM,SAAA,GAAY,IAAI,MAAA,GAAS,CAAA;AAC/B,EAAA,KAAA,IAAS,IAAA,GAAO,CAAA,EAAG,IAAA,GAAO,SAAA,EAAW,IAAA,EAAA,EAAQ;AAC3C,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,KAAA,MAAW,KAAK,SAAA,EAAW;AACzB,MAAA,MAAM,KAAK,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,IAAI,KAAK,CAAA,IAAK,CAAA;AACrC,MAAA,IAAI,KAAK,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,EAAE,KAAK,CAAA,CAAA,EAAI;AAC9B,QAAA,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,CAAC,CAAA;AACjB,QAAA,OAAA,GAAU,IAAA;AAAA,MACZ;AAAA,IACF;AACA,IAAA,IAAI,CAAC,OAAA,EAAS;AAAA,EAChB;AACA,EAAA,OAAO,KAAA;AACT;AAUA,SAAS,mBAAmB,GAAA,EAAgD;AAC1E,EAAA,MAAM,QAAA,GAAW,IAAI,GAAA,CAAI,GAAA,CAAI,MAAA,CAAO,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAC,CAAA;AACpD,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAoB;AACpC,EAAA,GAAA,CAAI,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,CAAC,CAAC,CAAA;AAG7C,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAoB;AACvC,EAAA,MAAM,IAAA,GAAO,CAAC,CAAA,KAAsB;AAClC,IAAA,IAAI,CAAA,GAAI,CAAA;AACR,IAAA,OAAA,CAAQ,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,IAAK,CAAA,MAAO,GAAG,CAAA,GAAI,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,IAAK,CAAA;AACxD,IAAA,IAAI,CAAA,GAAI,CAAA;AACR,IAAA,OAAA,CAAQ,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,IAAK,OAAO,CAAA,EAAG;AACjC,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,IAAK,CAAA;AAC9B,MAAA,MAAA,CAAO,GAAA,CAAI,GAAG,CAAC,CAAA;AACf,MAAA,CAAA,GAAI,IAAA;AAAA,IACN;AACA,IAAA,OAAO,CAAA;AAAA,EACT,CAAA;AACA,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,EAAW,CAAA,KAAoB;AAC5C,IAAA,MAAM,EAAA,GAAK,KAAK,CAAC,CAAA;AACjB,IAAA,MAAM,EAAA,GAAK,KAAK,CAAC,CAAA;AACjB,IAAA,IAAI,OAAO,EAAA,EAAI;AAEf,IAAA,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,EAAE,CAAA,IAAK,CAAA,MAAO,GAAA,CAAI,GAAA,CAAI,EAAE,CAAA,IAAK,CAAA,CAAA,EAAI,MAAA,CAAO,GAAA,CAAI,IAAI,EAAE,CAAA;AAAA,SAC1D,MAAA,CAAO,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAAA,EACxB,CAAA;AACA,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,MAAA,EAAQ,MAAA,CAAO,IAAI,CAAA,CAAE,EAAA,EAAI,EAAE,EAAE,CAAA;AACjD,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,SAAA,EAAW;AAC7B,IAAA,IAAI,CAAA,CAAE,IAAA,KAAS,gBAAA,IAAoB,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,MAAM,CAAA,IAAK,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,MAAM,CAAA,EAAG;AACnF,MAAA,KAAA,CAAM,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,MAAM,CAAA;AAAA,IAC1B;AAAA,EACF;AAGA,EAAA,MAAM,QAAA,GAAW,CAAC,CAAA,EAAiB,CAAA,KACjC,EAAE,IAAA,KAAS,MAAA,GAAS,MAAA,GAAS,CAAA,CAAE,IAAA,KAAS,OAAA,GAAU,OAAA,GAAU,CAAA,KAAM,IAAI,MAAA,GAAS,OAAA;AAGjF,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAA8B;AACxD,EAAA,GAAA,CAAI,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM;AAC3B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,CAAA,CAAE,EAAE,CAAA;AACtB,IAAA,IAAI,CAAA,CAAE,IAAA,KAAS,MAAA,IAAU,CAAA,CAAE,SAAS,OAAA,EAAS;AAC3C,MAAA,aAAA,CAAc,GAAA,CAAI,IAAA,EAAM,CAAA,CAAE,IAAI,CAAA;AAAA,IAChC,CAAA,MAAA,IAAW,CAAC,aAAA,CAAc,GAAA,CAAI,IAAI,CAAA,EAAG;AACnC,MAAA,aAAA,CAAc,GAAA,CAAI,IAAA,EAAM,QAAA,CAAS,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,IACxC;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,KAAA,uBAAY,GAAA,EAA8B;AAChD,EAAA,GAAA,CAAI,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM;AAC3B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,CAAA,CAAE,EAAE,CAAA;AACtB,IAAA,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,aAAA,CAAc,GAAA,CAAI,IAAI,CAAA,IAAK,QAAA,CAAS,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,EAC3D,CAAC,CAAA;AACD,EAAA,OAAO,KAAA;AACT;AAIO,SAAS,cAAc,GAAA,EAAsC;AAClE,EAAA,MAAMA,EAAAA,GAAI,aAAA;AACV,EAAA,MAAM,KAAA,GAAQ,IAAI,GAAA,CAAI,GAAA,CAAI,QAAA,CAAS,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAC,CAAA;AACnD,EAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAI,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,EAAA,EAAI,CAAC,CAAC,CAAC,CAAA;AAG1D,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAwC;AAC1D,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,QAAA,EAAU,KAAA,CAAM,IAAI,CAAA,CAAE,EAAA,EAAI,WAAA,CAAY,CAAC,CAAC,CAAA;AAG5D,EAAA,MAAM,SAAA,GAAY,cAAA,CAAe,GAAA,EAAK,KAAK,CAAA;AAC3C,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,GAAA,CAAI,QAAA,EAAU,SAAS,CAAA;AAClD,EAAA,IAAI,QAAA,GAAW,CAAA;AACf,EAAA,KAAA,MAAW,CAAA,IAAK,MAAM,MAAA,EAAO,aAAc,IAAA,CAAK,GAAA,CAAI,UAAU,CAAC,CAAA;AAG/D,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAoB;AAC3C,EAAA,GAAA,CAAI,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM,WAAW,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,CAAC,CAAC,CAAA;AACpD,EAAA,MAAM,KAAA,GAAQ,mBAAmB,GAAG,CAAA;AAGpC,EAAA,MAAM,eAAA,uBAAsB,GAAA,EAAsB;AAClD,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,QAAA,EAAU,eAAA,CAAgB,IAAI,CAAA,CAAE,EAAA,EAAI,EAAE,CAAA;AAC1D,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,SAAA,EAAW;AAC7B,IAAA,IAAI,CAAA,CAAE,IAAA,KAAS,aAAA,IAAiB,CAAA,CAAE,SAAS,UAAA,EAAY;AACvD,IAAA,MAAM,GAAA,GAAM,SAAA,CAAU,GAAA,CAAI,CAAA,CAAE,MAAM,CAAA,GAAI,CAAA,CAAE,MAAA,GAAS,SAAA,CAAU,GAAA,CAAI,CAAA,CAAE,MAAM,CAAA,GAAI,EAAE,MAAA,GAAS,IAAA;AACtF,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,MAAM,CAAA,GAAI,CAAA,CAAE,MAAA,GAAS,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,MAAM,CAAA,GAAI,EAAE,MAAA,GAAS,IAAA;AAC9E,IAAA,IAAI,OAAO,GAAA,EAAK,eAAA,CAAgB,IAAI,GAAG,CAAA,CAAG,KAAK,GAAG,CAAA;AAAA,EACpD;AAEA,EAAA,MAAM,UAA2B,EAAC;AAClC,EAAA,KAAA,IAAS,CAAA,GAAI,GAAG,CAAA,IAAK,QAAA,EAAU,KAAK,OAAA,CAAQ,IAAA,CAAK,EAAE,CAAA;AACnD,EAAA,KAAA,MAAW,CAAA,IAAK,GAAA,CAAI,QAAA,EAAU,OAAA,CAAQ,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,IAAK,CAAC,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA;AAGlE,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAsB;AACxC,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,QAAA,EAAU,KAAA,CAAM,IAAI,CAAA,CAAE,EAAA,EAAI,EAAE,CAAA;AAChD,EAAA,KAAA,MAAW,CAAA,IAAK,WAAW,KAAA,CAAM,GAAA,CAAI,EAAE,EAAE,CAAA,CAAG,IAAA,CAAK,CAAA,CAAE,IAAI,CAAA;AAEvD,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAoB;AAC1C,EAAA,GAAA,CAAI,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM,UAAU,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,CAAC,CAAC,CAAA;AAGrD,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAoB;AACvC,EAAA,MAAM,IAAA,GAAO,QAAQ,CAAC,CAAA;AACtB,EAAA,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AAClB,IAAA,MAAM,KAAK,WAAA,CAAY,eAAA,CAAgB,IAAI,CAAA,CAAE,EAAE,GAAI,UAAU,CAAA;AAC7D,IAAA,MAAM,KAAK,WAAA,CAAY,eAAA,CAAgB,IAAI,CAAA,CAAE,EAAE,GAAI,UAAU,CAAA;AAC7D,IAAA,IAAI,EAAA,KAAO,EAAA,EAAI,OAAO,EAAA,GAAK,EAAA;AAC3B,IAAA,OAAO,SAAA,CAAU,IAAI,CAAA,CAAE,EAAE,IAAK,SAAA,CAAU,GAAA,CAAI,EAAE,EAAE,CAAA;AAAA,EAClD,CAAC,CAAA;AACD,EAAA,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM,OAAO,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,CAAC,CAAC,CAAA;AAG1C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,QAAA,EAAU,CAAA,EAAA,EAAK;AAClC,IAAA,MAAM,GAAA,GAAM,QAAQ,CAAC,CAAA;AACrB,IAAA,KAAA,MAAW,KAAK,GAAA,EAAK;AACnB,MAAA,MAAM,EAAA,GAAK,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,CAAG,MAAA,CAAO,CAAC,CAAA,KAAM,MAAA,CAAO,GAAA,CAAI,CAAC,CAAC,CAAA;AACvD,MAAA,IAAI,EAAA,CAAG,SAAS,CAAA,EAAG;AACjB,QAAA,MAAM,GAAA,GAAM,EAAA,CAAG,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,IAAO,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,IAAK,CAAA,CAAA,EAAI,CAAC,CAAA;AAC/D,QAAA,MAAA,CAAO,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,GAAA,GAAM,GAAG,MAAM,CAAA;AAAA,MAClC,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,IAAI,CAAA,CAAE,EAAA,EAAI,UAAU,GAAA,CAAI,CAAA,CAAE,EAAE,CAAG,CAAA;AAAA,MACxC;AAAA,IACF;AAEA,IAAA,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACjB,MAAA,MAAM,EAAA,GAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA;AAC1B,MAAA,MAAM,EAAA,GAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA;AAC1B,MAAA,IAAI,EAAA,KAAO,EAAA,EAAI,OAAO,EAAA,GAAK,EAAA;AAC3B,MAAA,OAAO,SAAA,CAAU,IAAI,CAAA,CAAE,EAAE,IAAK,SAAA,CAAU,GAAA,CAAI,EAAE,EAAE,CAAA;AAAA,IAClD,CAAC,CAAA;AACD,IAAA,IAAI,IAAA,GAAO,CAAA,QAAA;AACX,IAAA,KAAA,MAAW,KAAK,GAAA,EAAK;AACnB,MAAA,IAAI,CAAA,GAAI,MAAA,CAAO,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA;AACvB,MAAA,IAAI,CAAA,IAAK,IAAA,EAAM,CAAA,GAAI,IAAA,GAAO,CAAA;AAC1B,MAAA,MAAA,CAAO,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,CAAC,CAAA;AAClB,MAAA,IAAA,GAAO,CAAA;AAAA,IACT;AAAA,EACF;AAGA,EAAA,MAAM,WAAqB,OAAA,CAAQ,GAAA;AAAA,IAAI,CAAC,GAAA,KACtC,GAAA,CAAI,OAAO,CAAC,CAAA,EAAG,MAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAA,CAAM,IAAI,CAAA,CAAE,EAAE,EAAG,EAAE,CAAA,EAAGA,GAAE,MAAgB;AAAA,GAC3E;AACA,EAAA,MAAM,aAAuB,EAAC;AAC9B,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,QAAA,EAAU,CAAA,EAAA,EAAK;AAClC,IAAA,OAAA,IAAW,SAAS,CAAC,CAAA;AACrB,IAAA,UAAA,CAAW,CAAC,CAAA,GAAI,OAAA;AAChB,IAAA,OAAA,IAAW,QAAA,CAAS,CAAC,CAAA,GAAIA,EAAAA,CAAE,OAAA;AAAA,EAC7B;AAGA,EAAA,IAAI,QAAgBA,EAAAA,CAAE,MAAA;AACtB,EAAA,KAAA,MAAW,CAAA,IAAK,MAAM,MAAA,EAAO,UAAW,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,CAAA,CAAE,EAAE,CAAA;AAC5D,EAAA,MAAM,QAAA,GAAW,KAAK,GAAA,CAAIA,EAAAA,CAAE,WAAW,CAAA,GAAI,KAAA,GAAQA,GAAE,WAAW,CAAA;AAGhE,EAAA,MAAM,WAA6B,EAAC;AACpC,EAAA,MAAM,OAAA,uBAAc,GAAA,EAA4B;AAChD,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,QAAA,EAAU,CAAA,EAAA,EAAK;AAClC,IAAA,KAAA,MAAW,CAAA,IAAK,OAAA,CAAQ,CAAC,CAAA,EAAG;AAC1B,MAAA,MAAM,CAAA,GAAI,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA;AACxB,MAAA,MAAM,CAAA,GAAoB;AAAA,QACxB,OAAA,EAAS,CAAA;AAAA,QACT,EAAA,EAAI,WAAW,CAAC,CAAA;AAAA,QAChB,EAAA,EAAI,MAAA,CAAO,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,GAAK,QAAA;AAAA,QACxB,IAAI,CAAA,CAAE,EAAA;AAAA,QACN,IAAI,CAAA,CAAE;AAAA,OACR;AACA,MAAA,IAAI,EAAE,eAAA,CAAgB,MAAA,GAAS,GAAG,CAAA,CAAE,QAAA,GAAW,EAAE,EAAA,GAAK,CAAA;AACtD,MAAA,QAAA,CAAS,KAAK,CAAC,CAAA;AACf,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,CAAC,CAAA;AAAA,IACrB;AAAA,EACF;AAGA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,QAAA,EAAU,CAAA,EAAA,EAAK;AAClC,IAAA,MAAM,IAAA,GAAO,QAAQ,CAAC,CAAA,CAAE,IAAI,CAAC,CAAA,KAAM,QAAQ,GAAA,CAAI,CAAA,CAAE,EAAE,CAAE,CAAA,CAAE,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,EAAA,GAAK,EAAE,EAAE,CAAA;AACjF,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA;AACvB,MAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,EAAA,GAAK,GAAA,CAAI,KAAKA,EAAAA,CAAE,WAAA;AACpC,MAAA,IAAI,GAAA,CAAI,EAAA,GAAK,IAAA,CAAK,EAAA,GAAK,MAAA,EAAQ;AAC7B,QAAA,GAAA,CAAI,EAAA,GAAK,KAAK,EAAA,GAAK,MAAA;AACnB,QAAA,IAAI,IAAI,QAAA,KAAa,MAAA,EAAW,GAAA,CAAI,QAAA,GAAW,IAAI,EAAA,GAAK,CAAA;AAAA,MAC1D;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,SAAS,QAAA,EAAU,MAAA,GAAS,CAAA,QAAA,EAAW,MAAA,GAAS,UAAU,MAAA,GAAS,CAAA,QAAA;AACvE,EAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,IAAA,MAAA,GAAS,KAAK,GAAA,CAAI,MAAA,EAAQ,CAAA,CAAE,EAAA,GAAK,EAAE,EAAE,CAAA;AACrC,IAAA,MAAA,GAAS,KAAK,GAAA,CAAI,MAAA,EAAQ,CAAA,CAAE,EAAA,GAAK,EAAE,EAAE,CAAA;AACrC,IAAA,MAAA,GAAS,KAAK,GAAA,CAAI,MAAA,EAAQ,CAAA,CAAE,EAAA,GAAK,EAAE,EAAE,CAAA;AACrC,IAAA,MAAA,GAAS,KAAK,GAAA,CAAI,MAAA,EAAQ,CAAA,CAAE,EAAA,GAAK,EAAE,EAAE,CAAA;AAAA,EACvC;AACA,EAAA,IAAI,CAAC,QAAA,CAAS,MAAM,CAAA,EAAG;AAAE,IAAA,MAAA,GAAS,CAAA;AAAG,IAAA,MAAA,GAAS,GAAA;AAAK,IAAA,MAAA,GAAS,CAAA;AAAG,IAAA,MAAA,GAAS,GAAA;AAAA,EAAK;AAG7E,EAAA,MAAM,UAAA,GAAa,CAAC,CAAC,GAAA,CAAI,MAAA;AACzB,EAAA,MAAM,QAAA,GAAW,SAASA,EAAAA,CAAE,WAAA;AAC5B,EAAA,MAAM,SAAA,GAAY,SAASA,EAAAA,CAAE,WAAA;AAC7B,EAAA,MAAM,OAAA,GAAU,SAASA,EAAAA,CAAE,eAAA;AAC3B,EAAA,MAAM,UAAA,GAAa,SAASA,EAAAA,CAAE,kBAAA;AAG9B,EAAA,MAAM,UAAA,GAAa,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,KAAM,MAAM,CAAA;AACtE,EAAA,MAAM,WAAA,GAAc,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,KAAM,OAAO,CAAA;AAExE,EAAA,MAAM,aAAgC,EAAC;AACvC,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAA6B;AAEpD,EAAA,MAAM,WAAA,GAAA,CAAe,UAAU,UAAA,IAAc,CAAA;AAE7C,EAAA,SAAS,UAAA,CAAW,QAAwB,IAAA,EAA8B;AACxE,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACzB,IAAA,MAAM,MAAA,GAAA,CAAU,MAAA,CAAO,MAAA,GAAS,CAAA,IAAKA,EAAAA,CAAE,WAAA;AACvC,IAAA,IAAI,EAAA,GAAK,cAAc,MAAA,GAAS,CAAA;AAChC,IAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,MAAA,MAAM,MAAA,GAAS,CAAA,CAAE,IAAA,KAAS,UAAA,IAAc,EAAE,IAAA,KAAS,QAAA;AACnD,MAAA,MAAM,CAAA,GAAI,MAAA,GAASA,EAAAA,CAAE,UAAA,GAAaA,EAAAA,CAAE,OAAA;AACpC,MAAA,MAAM,CAAA,GAAI,MAAA,GAASA,EAAAA,CAAE,UAAA,GAAaA,EAAAA,CAAE,OAAA;AAEpC,MAAA,IAAI,CAAA;AACJ,MAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,QAAA,CAAA,GAAI,QAAA,GAAWA,GAAE,SAAA,GAAY,CAAA;AAAA,MAC/B,CAAA,MAAO;AACL,QAAA,CAAA,GAAI,YAAYA,EAAAA,CAAE,SAAA;AAAA,MACpB;AACA,MAAA,MAAM,CAAA,GAAI,KAAK,CAAA,GAAI,CAAA;AAGnB,MAAA,MAAM,OAAA,GAAU,IAAA,KAAS,MAAA,GAAS,CAAA,GAAI,CAAA,GAAI,CAAA;AAC1C,MAAA,MAAM,OAAA,GAAU,MAAA,GAAS,EAAA,GAAK,EAAA,GAAK,CAAA;AACnC,MAAA,MAAM,GAAA,GAAuB;AAAA,QAC3B,KAAA,EAAO,CAAA;AAAA,QACP,CAAA;AAAA,QACA,CAAA;AAAA,QACA,KAAA,EAAO,CAAA;AAAA,QACP,MAAA,EAAQ,CAAA;AAAA,QACR,IAAA;AAAA,QACA,OAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,UAAA,CAAW,KAAK,GAAG,CAAA;AACnB,MAAA,UAAA,CAAW,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,GAAG,CAAA;AACxB,MAAA,EAAA,IAAMA,EAAAA,CAAE,WAAA;AAAA,IACV;AAAA,EACF;AACA,EAAA,UAAA,CAAW,YAAY,MAAM,CAAA;AAC7B,EAAA,UAAA,CAAW,aAAa,OAAO,CAAA;AAG/B,EAAA,IAAI,OAAO,QAAA,EAAU,IAAA,GAAO,SAAA,EAAW,IAAA,GAAO,SAAS,IAAA,GAAO,UAAA;AAC9D,EAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAC1B,IAAA,IAAI,OAAO,CAAA,CAAE,CAAA;AACb,IAAA,IAAI,KAAA,GAAQ,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,KAAA;AACpB,IAAA,MAAM,SAAS,CAAA,CAAE,KAAA,CAAM,SAAS,UAAA,IAAc,CAAA,CAAE,MAAM,IAAA,KAAS,QAAA;AAC/D,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEX,MAAA,MAAM,MAAA,GAAS,iBAAA,CAAkB,CAAA,CAAE,KAAA,CAAM,MAAM,GAAG,CAAA;AAClD,MAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,KAAA,GAAQ,CAAA;AAC3B,MAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,EAAA,GAAK,SAAS,CAAC,CAAA;AACrC,MAAA,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,EAAA,GAAK,SAAS,CAAC,CAAA;AAAA,IACzC;AACA,IAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,IAAI,CAAA;AAC1B,IAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,KAAK,CAAA;AAC3B,IAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,CAAA,CAAE,CAAC,CAAA;AAEzB,IAAA,IAAA,GAAO,IAAA,CAAK,IAAI,IAAA,EAAM,CAAA,CAAE,IAAI,CAAA,CAAE,MAAA,GAASA,GAAE,aAAa,CAAA;AAAA,EACxD;AAGA,EAAA,MAAM,UAAA,GAAa,GAAA,CAAI,KAAA,GAAQA,EAAAA,CAAE,OAAA,GAAU,CAAA;AAC3C,EAAA,MAAM,OAAA,GAAUA,GAAE,MAAA,GAAS,IAAA;AAC3B,EAAA,MAAM,OAAA,GAAUA,EAAAA,CAAE,MAAA,GAAS,UAAA,GAAa,IAAA;AAExC,EAAA,MAAM,SAAA,GAAY,CAAC,EAAA,EAAY,EAAA,MAAgB,EAAE,GAAG,EAAA,GAAK,OAAA,EAAS,CAAA,EAAG,EAAA,GAAK,OAAA,EAAQ,CAAA;AAElF,EAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,IAAA,MAAM,CAAA,GAAI,SAAA,CAAU,CAAA,CAAE,EAAA,EAAI,EAAE,EAAE,CAAA;AAC9B,IAAA,CAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AACT,IAAA,CAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AACT,IAAA,IAAI,CAAA,CAAE,QAAA,KAAa,MAAA,EAAW,CAAA,CAAE,QAAA,IAAY,OAAA;AAAA,EAC9C;AACA,EAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAC1B,IAAA,CAAA,CAAE,CAAA,IAAK,OAAA;AACP,IAAA,CAAA,CAAE,CAAA,IAAK,OAAA;AACP,IAAA,CAAA,CAAE,OAAA,IAAW,OAAA;AACb,IAAA,CAAA,CAAE,OAAA,IAAW,OAAA;AAAA,EACf;AACA,EAAA,MAAM,UAAsC,UAAA,GACxC;AAAA,IACE,GAAG,QAAA,GAAW,OAAA;AAAA,IACd,GAAG,OAAA,GAAU,OAAA;AAAA,IACb,OAAO,SAAA,GAAY,QAAA;AAAA,IACnB,QAAQ,UAAA,GAAa;AAAA,GACvB,GACA,MAAA;AACJ,EAAA,IAAI,OAAA,IAAW,GAAA,CAAI,MAAA,EAAQ,OAAA,CAAQ,OAAO,GAAA,CAAI,MAAA;AAE9C,EAAA,MAAM,KAAA,GAAQ,IAAA,GAAO,IAAA,GAAO,CAAA,GAAIA,EAAAA,CAAE,MAAA;AAClC,EAAA,MAAM,MAAA,GAAS,IAAA,GAAO,IAAA,GAAO,CAAA,GAAIA,GAAE,MAAA,GAAS,UAAA;AAG5C,EAAA,MAAM,QAAuB,EAAC;AAC9B,EAAA,MAAM,QAAqC,EAAC;AAG5C,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAA+B;AACvD,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,SAAA,EAAW;AAC7B,IAAA,IAAI,CAAA,CAAE,SAAS,gBAAA,EAAkB;AACjC,IAAA,IAAI,CAAC,WAAA,CAAY,GAAA,CAAI,CAAA,CAAE,MAAM,CAAA,EAAG,WAAA,CAAY,GAAA,CAAI,CAAA,CAAE,MAAA,EAAQ,EAAE,CAAA;AAC5D,IAAA,WAAA,CAAY,GAAA,CAAI,CAAA,CAAE,MAAM,CAAA,CAAG,KAAK,CAAC,CAAA;AAAA,EACnC;AACA,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAqB;AAE5C,EAAA,SAAS,WAAW,EAAA,EAAuE;AACzF,IAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AACxB,IAAA,IAAI,CAAA,EAAG,OAAO,EAAE,EAAA,EAAI,EAAE,EAAA,EAAI,EAAA,EAAI,CAAA,CAAE,EAAA,EAAI,EAAA,EAAI,CAAA,CAAE,EAAA,EAAI,EAAA,EAAI,EAAE,EAAA,EAAG;AACvD,IAAA,MAAM,CAAA,GAAI,UAAA,CAAW,GAAA,CAAI,EAAE,CAAA;AAC3B,IAAA,IAAI,CAAA,EAAG;AACL,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,KAAA,GAAQ,CAAA;AAAA,QACpB,EAAA,EAAI,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,MAAA,GAAS,CAAA;AAAA,QACrB,EAAA,EAAI,EAAE,KAAA,GAAQ,CAAA;AAAA,QACd,EAAA,EAAI,EAAE,MAAA,GAAS;AAAA,OACjB;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,SAAS,SAAA,CAAU,EAAA,EAAY,OAAA,EAAiB,OAAA,EAA2C;AACzF,IAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AACxB,IAAA,IAAI,CAAA,EAAG,OAAO,qBAAA,CAAsB,CAAA,CAAE,EAAA,EAAI,CAAA,CAAE,EAAA,EAAI,CAAA,CAAE,EAAA,EAAI,CAAA,CAAE,EAAA,EAAI,OAAA,EAAS,OAAO,CAAA;AAC5E,IAAA,MAAM,CAAA,GAAI,UAAA,CAAW,GAAA,CAAI,EAAE,CAAA;AAE3B,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,KAAA,GAAQ,CAAA;AAC3B,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,MAAA,GAAS,CAAA;AAC5B,IAAA,OAAO,WAAA,CAAY,EAAE,KAAA,EAAO,CAAA,CAAE,QAAQ,EAAA,EAAI,EAAA,EAAI,SAAS,OAAO,CAAA;AAAA,EAChE;AAKA,EAAA,SAAS,cAAA,CAAe,IAAY,IAAA,EAAkD;AACpF,IAAA,MAAM,CAAA,GAAI,UAAA,CAAW,GAAA,CAAI,EAAE,CAAA;AAC3B,IAAA,MAAM,SAAS,CAAA,CAAE,KAAA,CAAM,SAAS,UAAA,IAAc,CAAA,CAAE,MAAM,IAAA,KAAS,QAAA;AAC/D,IAAA,MAAM,CAAA,GAAI,SAAS,CAAA,CAAE,CAAA,GAAI,EAAE,MAAA,GAAS,CAAA,GAAI,EAAE,CAAA,GAAI,EAAA;AAC9C,IAAA,MAAM,CAAA,GAAI,SAAS,MAAA,GAAS,CAAA,CAAE,IAAI,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,KAAA,GAAQ,CAAA;AACtD,IAAA,OAAO,EAAE,GAAG,CAAA,EAAE;AAAA,EAChB;AAEA,EAAA,KAAA,MAAW,CAAC,QAAA,EAAU,IAAI,CAAA,IAAK,WAAA,EAAa;AAC1C,IAAA,MAAM,OAAA,GAAU,GAAA,CAAI,kBAAA,IAAsB,IAAA,CAAK,UAAUA,EAAAA,CAAE,kBAAA;AAC3D,IAAA,MAAM,SAAA,GACJ,UAAA,CAAW,GAAA,CAAI,QAAQ,CAAA,IAAK,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,KAAM,UAAA,CAAW,GAAA,CAAI,CAAA,CAAE,MAAM,CAAC,CAAA;AAExE,IAAA,IAAI,SAAA,EAAW;AAEb,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,GAAA,CAAI,QAAQ,CAAA,IAAK,MAAA;AACpC,MAAA,MAAM,OAAA,GAAU,cAAA,CAAe,QAAA,EAAU,IAAI,CAAA;AAC7C,MAAA,MAAM,YAAA,GAAe,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,CAAA,EAAG,CAAA,EAAG,cAAA,CAAe,CAAA,CAAE,MAAA,EAAQ,IAAI,GAAE,CAAE,CAAA;AAC/E,MAAA,MAAM,EAAA,GAAK,CAAC,OAAA,CAAQ,CAAA,EAAG,GAAG,YAAA,CAAa,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,CAAA,CAAE,CAAC,CAAC,CAAA;AACxD,MAAA,MAAM,EAAA,GAAK,CAAC,OAAA,CAAQ,CAAA,EAAG,GAAG,YAAA,CAAa,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,CAAA,CAAE,CAAC,CAAC,CAAA;AACxD,MAAA,MAAM,IAAA,GACJ,IAAA,KAAS,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,GAAG,EAAE,CAAA,GAAI,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,GAAG,EAAE,CAAA,GAAI,EAAA;AAC7D,MAAA,MAAMC,KAAAA,GAAO,IAAA,CAAK,GAAA,CAAI,GAAG,EAAE,CAAA;AAC3B,MAAA,MAAMC,KAAAA,GAAO,IAAA,CAAK,GAAA,CAAI,GAAG,EAAE,CAAA;AAE3B,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,MAAMC,SAAAA,GAAqB;AAAA,UACzB,CAAA,EAAA,EAAK,KAAA,CAAM,IAAI,CAAC,IAAI,KAAA,CAAMF,KAAI,CAAC,CAAA,GAAA,EAAM,MAAM,IAAI,CAAC,CAAA,CAAA,EAAI,KAAA,CAAMC,KAAI,CAAC,CAAA;AAAA,SACjE;AACA,QAAA,KAAA,MAAW,KAAK,YAAA,EAAc;AAC5B,UAAAC,SAAAA,CAAS,IAAA,CAAK,CAAA,EAAA,EAAK,KAAA,CAAM,CAAA,CAAE,EAAE,CAAC,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,CAAA,CAAE,CAAA,CAAE,CAAC,CAAC,CAAA,GAAA,EAAM,KAAA,CAAM,IAAI,CAAC,CAAA,CAAA,EAAI,MAAM,CAAA,CAAE,CAAA,CAAE,CAAC,CAAC,CAAA,CAAE,CAAA;AAClF,UAAA,UAAA,CAAW,GAAA,CAAI,EAAE,CAAC,CAAA;AAAA,QACpB;AACA,QAAA,KAAA,CAAM,IAAA,CAAK;AAAA,UACT,QAAA;AAAA,UACA,UAAU,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,MAAM,CAAA;AAAA,UAClC,KAAA,EAAO,IAAA;AAAA,UACP,OAAA,EAASF,KAAAA;AAAA,UACT,UAAA,EAAYC,KAAAA;AAAA,UACZ,QAAQ,CAAA,EAAA,EAAK,KAAA,CAAM,IAAI,CAAC,CAAA,CAAA,EAAI,MAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAA,EAAM,KAAA,CAAM,QAAQ,CAAC,CAAC,IAAI,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA;AAAA,UACtF,QAAA,EAAAC;AAAA,SACD,CAAA;AAAA,MACH,CAAA,MAAO;AAEL,QAAA,KAAA,MAAW,KAAK,YAAA,EAAc;AAC5B,UAAA,KAAA,CAAM,IAAA,CAAK;AAAA,YACT,UAAU,CAAA,CAAE,CAAA;AAAA,YACZ,GACE,CAAA,EAAA,EAAK,KAAA,CAAM,EAAE,CAAA,CAAE,CAAC,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,CAAA,CAAE,CAAA,CAAE,CAAC,CAAC,CAAA,GAAA,EAC5B,MAAM,IAAI,CAAC,IAAI,KAAA,CAAM,CAAA,CAAE,CAAA,CAAE,CAAC,CAAC,CAAA,GAAA,EAC3B,KAAA,CAAM,IAAI,CAAC,CAAA,CAAA,EAAI,MAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAA,EAC/B,KAAA,CAAM,QAAQ,CAAC,CAAC,IAAI,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA;AAAA,YAC3C,SAAA,EAAW,QAAA;AAAA,YACX,MAAA,EAAQ;AAAA,WACT,CAAA;AACD,UAAA,UAAA,CAAW,GAAA,CAAI,EAAE,CAAC,CAAA;AAAA,QACpB;AAAA,MACF;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,OAAA,EAAS;AAEd,IAAA,MAAM,MAAA,GAAS,WAAW,QAAQ,CAAA;AAClC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,MAAM,YAAA,GAAe,IAAA,CAClB,GAAA,CAAI,CAAC,MAAM,UAAA,CAAW,CAAA,CAAE,MAAM,CAAC,CAAA,CAC/B,MAAA,CAAO,CAAC,CAAA,KAAkC,MAAM,IAAI,CAAA;AACvD,IAAA,IAAI,YAAA,CAAa,WAAW,CAAA,EAAG;AAC/B,IAAA,MAAM,IAAA,GAAO,YAAA,CAAa,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAA,CAAE,EAAA,EAAI,CAAC,CAAA,GAAI,YAAA,CAAa,MAAA;AACvE,IAAA,MAAM,IAAA,GAAO,YAAA,CAAa,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAA,CAAE,EAAA,EAAI,CAAC,CAAA,GAAI,YAAA,CAAa,MAAA;AACvE,IAAA,MAAM,GAAA,GAAM,SAAA,CAAU,QAAA,EAAU,IAAA,EAAM,IAAI,CAAA;AAC1C,IAAA,MAAM,IAAA,GAAO,OAAO,MAAA,CAAO,EAAA;AAC3B,IAAA,MAAM,IAAA,GAAO,OAAO,MAAA,CAAO,EAAA;AAC3B,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,IAAA,EAAM,IAAI,CAAA,IAAK,CAAA;AACtC,IAAA,MAAM,EAAA,GAAK,GAAA,CAAI,CAAA,GAAK,IAAA,GAAO,MAAOH,EAAAA,CAAE,mBAAA;AACpC,IAAA,MAAM,EAAA,GAAK,GAAA,CAAI,CAAA,GAAK,IAAA,GAAO,MAAOA,EAAAA,CAAE,mBAAA;AACpC,IAAA,MAAM,WAAqB,EAAC;AAC5B,IAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,MAAA,MAAM,GAAA,GAAM,SAAA,CAAU,CAAA,CAAE,MAAA,EAAQ,IAAI,EAAE,CAAA;AACtC,MAAA,QAAA,CAAS,KAAK,CAAA,EAAA,EAAK,KAAA,CAAM,IAAI,CAAC,CAAC,IAAI,KAAA,CAAM,GAAA,CAAI,CAAC,CAAC,CAAA,GAAA,EAAM,MAAM,EAAE,CAAC,IAAI,KAAA,CAAM,EAAE,CAAC,CAAA,CAAE,CAAA;AAC7E,MAAA,UAAA,CAAW,IAAI,CAAC,CAAA;AAAA,IAClB;AACA,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,QAAA;AAAA,MACA,UAAU,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,MAAM,CAAA;AAAA,MAClC,KAAA,EAAO,EAAA;AAAA,MACP,OAAA,EAAS,EAAA;AAAA,MACT,UAAA,EAAY,EAAA;AAAA,MACZ,QAAQ,CAAA,EAAA,EAAK,KAAA,CAAM,EAAE,CAAC,CAAA,CAAA,EAAI,MAAM,EAAE,CAAC,CAAA,GAAA,EAAM,KAAA,CAAM,IAAI,CAAC,CAAC,IAAI,KAAA,CAAM,GAAA,CAAI,CAAC,CAAC,CAAA,CAAA;AAAA,MACrE;AAAA,KACD,CAAA;AAAA,EACH;AAEA,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,SAAA,EAAW;AAC7B,IAAA,IAAI,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,EAAG;AACvB,IAAA,MAAM,CAAA,GAAI,UAAA,CAAW,CAAA,CAAE,MAAM,CAAA;AAC7B,IAAA,MAAM,CAAA,GAAI,UAAA,CAAW,CAAA,CAAE,MAAM,CAAA;AAC7B,IAAA,IAAI,CAAC,CAAA,IAAK,CAAC,CAAA,EAAG;AAGd,IAAA,IAAI,CAAA,CAAE,IAAA,KAAS,gBAAA,IAAoB,UAAA,CAAW,GAAA,CAAI,CAAA,CAAE,MAAM,CAAA,IAAK,UAAA,CAAW,GAAA,CAAI,CAAA,CAAE,MAAM,CAAA,EAAG;AACvF,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,MAAM,CAAA,IAAK,MAAA;AACpC,MAAA,MAAM,OAAA,GAAU,cAAA,CAAe,CAAA,CAAE,MAAA,EAAQ,IAAI,CAAA;AAC7C,MAAA,MAAM,OAAA,GAAU,cAAA,CAAe,CAAA,CAAE,MAAA,EAAQ,IAAI,CAAA;AAC7C,MAAA,MAAM,OAAO,IAAA,KAAS,MAAA,GAClB,IAAA,CAAK,GAAA,CAAI,QAAQ,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAA,GAAI,KACjC,IAAA,CAAK,GAAA,CAAI,QAAQ,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAA,GAAI,EAAA;AACrC,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA,QACT,QAAA,EAAU,CAAA;AAAA,QACV,GACE,CAAA,EAAA,EAAK,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAA,EACpC,KAAA,CAAM,IAAI,CAAC,CAAA,CAAA,EAAI,MAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAA,EAC/B,MAAM,IAAI,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,QAAQ,CAAC,CAAC,CAAA,GAAA,EAC/B,KAAA,CAAM,QAAQ,CAAC,CAAC,IAAI,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA;AAAA,QAC3C,SAAA,EAAW,QAAA;AAAA,QACX,MAAA,EAAQ;AAAA,OACT,CAAA;AACD,MAAA;AAAA,IACF;AAKA,IAAA,MAAM,QAAA,GAAW,UAAA,CAAW,GAAA,CAAI,CAAA,CAAE,MAAM,CAAA;AACxC,IAAA,MAAM,QAAA,GAAW,UAAA,CAAW,GAAA,CAAI,CAAA,CAAE,MAAM,CAAA;AACxC,IAAA,IAAI,EAAA;AACJ,IAAA,IAAI,EAAA;AACJ,IAAA,IAAI,QAAA,IAAY,CAAC,QAAA,EAAU;AACzB,MAAA,EAAA,GAAK,EAAE,CAAA,EAAG,QAAA,CAAS,OAAA,EAAS,CAAA,EAAG,SAAS,OAAA,EAAQ;AAChD,MAAA,EAAA,GAAK,UAAU,CAAA,CAAE,MAAA,EAAQ,EAAA,CAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,IACrC,CAAA,MAAA,IAAW,QAAA,IAAY,CAAC,QAAA,EAAU;AAChC,MAAA,EAAA,GAAK,EAAE,CAAA,EAAG,QAAA,CAAS,OAAA,EAAS,CAAA,EAAG,SAAS,OAAA,EAAQ;AAChD,MAAA,EAAA,GAAK,UAAU,CAAA,CAAE,MAAA,EAAQ,EAAA,CAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,IACrC,CAAA,MAAO;AACL,MAAA,EAAA,GAAK,UAAU,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,EAAA,EAAI,EAAE,EAAE,CAAA;AACnC,MAAA,EAAA,GAAK,UAAU,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,EAAA,EAAI,EAAE,EAAE,CAAA;AAAA,IACrC;AAEA,IAAA,MAAM,MAAA,GAAS,CAAA,CAAE,IAAA,KAAS,SAAA,IAAa,EAAE,IAAA,KAAS,QAAA;AAClD,IAAA,IAAII,UAAAA,GAAsC,MAAA;AAC1C,IAAA,IAAI,CAAA,CAAE,IAAA,KAAS,UAAA,IAAc,CAAA,CAAE,IAAA,KAAS,aAAa,CAAA,CAAE,IAAA,KAAS,QAAA,EAAUA,UAAAA,GAAY,MAAA;AAAA,SAAA,IAC7E,CAAA,CAAE,IAAA,KAAS,gBAAA,EAAkBA,UAAAA,GAAY,QAAA;AAElD,IAAA,MAAM,IAAA,GAAoB;AAAA,MACxB,QAAA,EAAU,CAAA;AAAA,MACV,CAAA,EAAG,KAAK,KAAA,CAAM,EAAA,CAAG,CAAC,CAAC,CAAA,CAAA,EAAI,MAAM,EAAA,CAAG,CAAC,CAAC,CAAA,GAAA,EAAM,KAAA,CAAM,GAAG,CAAC,CAAC,IAAI,KAAA,CAAM,EAAA,CAAG,CAAC,CAAC,CAAA,CAAA;AAAA,MAClE,SAAA,EAAAA,UAAAA;AAAA,MACA;AAAA,KACF;AAGA,IAAA,IAAI,CAAA,CAAE,IAAA,KAAS,SAAA,IAAa,CAAA,CAAE,SAAS,QAAA,EAAU;AAC/C,MAAA,MAAM,OAAiB,EAAC;AACxB,MAAA,MAAM,OAAA,GAAU,CAAA,CAAE,IAAA,KAAS,SAAA,GAAY,SAAA,GAAY,QAAA;AACnD,MAAA,IAAA,CAAK,IAAA,CAAK,CAAA,IAAA,EAAI,CAAA,CAAE,UAAA,IAAc,OAAO,CAAA,IAAA,CAAG,CAAA;AACxC,MAAA,IAAI,EAAE,SAAA,EAAW,IAAA,CAAK,KAAK,CAAA,CAAA,EAAI,CAAA,CAAE,SAAS,CAAA,CAAA,CAAG,CAAA;AAC7C,MAAA,IAAI,EAAE,iBAAA,EAAmB,IAAA,CAAK,KAAK,CAAA,kBAAA,EAAqB,CAAA,CAAE,iBAAiB,CAAA,CAAA,CAAG,CAAA;AAC9E,MAAA,MAAM,KAAA,GAA0B;AAAA,QAC9B,IAAA;AAAA,QACA,EAAA,EAAA,CAAK,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,CAAA,IAAK,CAAA;AAAA,QACpB,EAAA,EAAA,CAAK,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,CAAA,IAAK;AAAA,OACtB;AACA,MAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,IACf,CAAA,MAAA,IAAA,CAAY,EAAE,IAAA,KAAS,aAAA,IAAiB,EAAE,IAAA,KAAS,UAAA,KAAe,EAAE,UAAA,EAAY;AAC9E,MAAA,IAAA,CAAK,KAAA,GAAQ;AAAA,QACX,IAAA,EAAM,CAAC,CAAA,IAAA,EAAI,CAAA,CAAE,UAAU,CAAA,IAAA,CAAG,CAAA;AAAA,QAC1B,EAAA,EAAA,CAAK,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,CAAA,IAAK,CAAA;AAAA,QACpB,EAAA,EAAA,CAAK,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,CAAA,IAAK;AAAA,OACtB;AAAA,IACF;AAGA,IAAA,IAAI,EAAE,kBAAA,EAAoB;AACxB,MAAA,IAAA,CAAK,gBAAA,GAAmB,iBAAA,CAAkB,EAAA,EAAI,EAAA,EAAI,EAAE,kBAAkB,CAAA;AAAA,IACxE;AACA,IAAA,IAAI,EAAE,kBAAA,EAAoB;AACxB,MAAA,IAAA,CAAK,cAAA,GAAiB,iBAAA,CAAkB,EAAA,EAAI,EAAA,EAAI,EAAE,kBAAkB,CAAA;AAAA,IACtE;AAEA,IAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACjB;AAEA,EAAA,MAAM,MAAA,GAA8B;AAAA,IAClC,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAAA,IACvB,MAAA,EAAQ,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AAAA,IACzB,MAAA,EAAQ,UAAA;AAAA,IACR,QAAA,EAAU,QAAA;AAAA,IACV,KAAA;AAAA,IACA,KAAA;AAAA,IACA,UAAU,GAAA,CAAI,QAAA;AAAA,IACd;AAAA,GACF;AACA,EAAA,IAAI,GAAA,CAAI,KAAA,EAAO,MAAA,CAAO,KAAA,GAAQ,GAAA,CAAI,KAAA;AAClC,EAAA,IAAI,OAAA,SAAgB,OAAA,GAAU,OAAA;AAC9B,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,WAAA,CAAY,UAAoB,GAAA,EAAkC;AACzE,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,OAAO,gBAAA,GAAmB,CAAA;AAC5D,EAAA,MAAM,GAAA,GAAM,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,IAAK,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA,IAAK,CAAA,CAAA,EAAI,CAAC,CAAA;AAC9D,EAAA,OAAO,MAAM,QAAA,CAAS,MAAA;AACxB;AAEA,SAAS,YACP,CAAA,EACA,CAAA,EACA,EAAA,EACA,EAAA,EACA,IACA,EAAA,EAC0B;AAE1B,EAAA,MAAM,KAAK,EAAA,GAAK,EAAA;AAChB,EAAA,MAAM,KAAK,EAAA,GAAK,EAAA;AAChB,EAAA,IAAI,EAAA,KAAO,KAAK,EAAA,KAAO,CAAA,SAAU,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAG;AAChD,EAAA,MAAM,QAAQ,CAAA,GAAI,CAAA;AAClB,EAAA,MAAM,QAAQ,CAAA,GAAI,CAAA;AAClB,EAAA,MAAM,SAAS,EAAA,KAAO,CAAA,GAAI,QAAQ,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,GAAI,QAAA;AACjD,EAAA,MAAM,SAAS,EAAA,KAAO,CAAA,GAAI,QAAQ,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,GAAI,QAAA;AACjD,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,MAAM,CAAA;AACjC,EAAA,OAAO,EAAE,GAAG,EAAA,GAAK,EAAA,GAAK,GAAG,CAAA,EAAG,EAAA,GAAK,KAAK,CAAA,EAAE;AAC1C;AAEA,SAAS,iBAAA,CACP,IAAA,EACA,GAAA,EACA1C,KAAAA,EACwC;AACxC,EAAA,MAAM,EAAA,GAAK,GAAA,CAAI,CAAA,GAAI,IAAA,CAAK,CAAA;AACxB,EAAA,MAAM,EAAA,GAAK,GAAA,CAAI,CAAA,GAAI,IAAA,CAAK,CAAA;AACxB,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,EAAA,EAAI,EAAE,CAAA,IAAK,CAAA;AAClC,EAAA,MAAM,EAAA,GAAM,KAAK,GAAA,GAAO,EAAA;AACxB,EAAA,MAAM,EAAA,GAAM,KAAK,GAAA,GAAO,EAAA;AAExB,EAAA,MAAM,EAAA,GAAM,CAAC,EAAA,GAAK,GAAA,GAAO,CAAA;AACzB,EAAA,MAAM,EAAA,GAAM,KAAK,GAAA,GAAO,CAAA;AACxB,EAAA,OAAO,EAAE,IAAA,EAAAA,KAAAA,EAAM,CAAA,EAAG,KAAA,CAAM,KAAK,CAAA,GAAI,EAAA,GAAK,EAAE,CAAA,EAAG,GAAG,KAAA,CAAM,IAAA,CAAK,CAAA,GAAI,EAAA,GAAK,EAAE,CAAA,EAAE;AACxE;AAEA,SAAS,MAAM,CAAA,EAAmB;AAChC,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAG,CAAA,GAAI,GAAA;AAC/B;;;AC7uBA,SAASmC,UAAS,CAAA,EAAsB;AAGtC,EAAA,MAAM,MAAA,GAAS,SAAA;AACf,EAAA,MAAM,QAAA,GAAW,SAAA;AACjB,EAAA,MAAM,aAAA,GAAgB,SAAA;AACtB,EAAA,MAAM,WAAA,GAAc,SAAA;AACpB,EAAA,OAAO;AAAA;AAAA,8BAAA,EAEuB,aAAa,CAAA;AAAA,wDAAA,EACa,EAAE,IAAI,CAAA;AAAA,iDAAA,EACb,EAAE,MAAM,CAAA;AAAA,0BAAA,EAC/B,EAAE,EAAE,CAAA;AAAA,qDAAA,EACuB,EAAE,IAAI,CAAA;AAAA,mCAAA,EACxB,QAAQ,8BAA8B,MAAM,CAAA;AAAA,iCAAA,EAC9C,QAAQ,8BAA8B,MAAM,CAAA;AAAA,+CAAA,EAC9B,EAAE,IAAI,CAAA;AAAA,wDAAA,EACG,EAAE,SAAS,CAAA;AAAA,2DAAA,EACR,EAAE,SAAS,CAAA;AAAA,+CAAA,EACvB,EAAE,SAAS,CAAA;AAAA,qBAAA,EACrC,QAAQ,CAAA;AAAA,uBAAA,EACN,WAAW,CAAA;AAAA,yBAAA,EACT,WAAW,CAAA;AAAA,wBAAA,EACZ,EAAE,MAAM,CAAA;AAAA,yBAAA,EACP,WAAW,CAAA;AAAA,oBAAA,EAChB,EAAE,EAAE,CAAA;AAAA,wDAAA,EACgC,EAAE,SAAS,CAAA;AAAA,iCAAA,EAClC,EAAE,MAAM,CAAA;AAAA,2CAAA,EACE,EAAE,SAAS,CAAA;AAAA,gDAAA,EACN,EAAE,IAAI,CAAA;AAAA,CAAA,CACtD,IAAA,EAAK;AACP;AAEA,SAAS,QAAQ,CAAA,EAAsB;AACrC,EAAA,OAAOX,sBAAA,CAAK;AAAA,IACVT,oBAAA;AAAA,MACE,QAAA;AAAA,MACA;AAAA,QACE,EAAA,EAAI,kBAAA;AAAA,QACJ,OAAA,EAAS,UAAA;AAAA,QACT,IAAA,EAAM,CAAA;AAAA,QACN,IAAA,EAAM,CAAA;AAAA,QACN,WAAA,EAAa,EAAA;AAAA,QACb,YAAA,EAAc,CAAA;AAAA,QACd,MAAA,EAAQ;AAAA,OACV;AAAA,MACA,CAACA,oBAAA,CAAG,UAAA,EAAY,EAAE,QAAQ,aAAA,EAAe,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAQ,cAAA,EAAgB,GAAA,EAAK,CAAC;AAAA,KACjG;AAAA,IACAA,oBAAA;AAAA,MACE,QAAA;AAAA,MACA;AAAA,QACE,EAAA,EAAI,yBAAA;AAAA,QACJ,OAAA,EAAS,UAAA;AAAA,QACT,IAAA,EAAM,CAAA;AAAA,QACN,IAAA,EAAM,CAAA;AAAA,QACN,WAAA,EAAa,EAAA;AAAA,QACb,YAAA,EAAc,CAAA;AAAA,QACd,MAAA,EAAQ;AAAA,OACV;AAAA,MACA,CAACA,oBAAA,CAAG,UAAA,EAAY,EAAE,QAAQ,aAAA,EAAe,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAQ,cAAA,EAAgB,GAAA,EAAK,CAAC;AAAA,KACjG;AAAA,IACAA,oBAAA;AAAA,MACE,QAAA;AAAA,MACA;AAAA,QACE,EAAA,EAAI,iBAAA;AAAA,QACJ,OAAA,EAAS,WAAA;AAAA,QACT,IAAA,EAAM,EAAA;AAAA,QACN,IAAA,EAAM,CAAA;AAAA,QACN,WAAA,EAAa,EAAA;AAAA,QACb,YAAA,EAAc,EAAA;AAAA,QACd,MAAA,EAAQ;AAAA,OACV;AAAA,MACA,CAACA,oBAAA,CAAG,SAAA,EAAW,EAAE,QAAQ,eAAA,EAAiB,IAAA,EAAM,CAAA,CAAE,EAAA,EAAI,QAAQ,CAAA,CAAE,MAAA,EAAQ,cAAA,EAAgB,GAAA,EAAK,CAAC;AAAA;AAChG,GACD,CAAA;AACH;AAEA,IAAM,CAAA,GAAI;AAAA;AAAA,EAER,MAAA,EAAQ,CAAA;AAAA,EACR,OAAA,EAAS,CAAA;AAAA,EACT,QAAA,EAAU,EAAA;AAAA,EACV,QAAA,EAAU,EAAA;AAAA,EACV,KAAA,EAAO,EAAA;AAAA,EACP,MAAA,EAAQ,CAAA;AAAA,EACR,MAAA,EAAQ,EAAA;AAAA,EACR,KAAA,EAAO,EAAA;AAAA,EACP,MAAA,EAAQ,CAAA;AAAA,EACR,MAAA,EAAQ,EAAA;AAAA,EACR,OAAA,EAAS,EAEX,CAAA;AAEA,SAAS,YAAY,CAAA,EAA4B;AAC/C,EAAA,MAAM,IAAI,CAAA,CAAE,KAAA;AACZ,EAAA,MAAM,MAAA,GAAS,CAAA,CAAE,IAAA,KAAS,UAAA,IAAc,EAAE,IAAA,KAAS,QAAA;AACnD,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,OAAOH,uBAAA;AAAA,MACL,EAAE,KAAA,EAAO,gCAAA,EAAkC,SAAA,EAAW,CAAA,CAAE,EAAA,EAAI,SAAA,EAAW,CAAA,UAAA,EAAa,CAAA,CAAE,CAAC,CAAA,EAAA,EAAK,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,EAAI;AAAA,MACnG;AAAA,QACEJ,uBAAK,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAG,KAAA,EAAO,CAAA,CAAE,KAAA,EAAO,MAAA,EAAQ,EAAE,MAAA,EAAQ,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,GAAG,CAAA;AAAA,QACnER,sBAAA;AAAA,UACE,EAAE,KAAA,EAAO,kBAAA,EAAoB,CAAA,EAAG,CAAA,CAAE,QAAQ,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,aAAA,EAAe,QAAA,EAAS;AAAA,UAC5E,CAAA,IAAA,EAAI,CAAA,CAAE,UAAA,IAAc,OAAO,CAAA,IAAA;AAAA,SAC7B;AAAA,QACAA,sBAAA;AAAA,UACE,EAAE,KAAA,EAAO,kBAAA,EAAoB,CAAA,EAAG,CAAA,CAAE,QAAQ,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,aAAA,EAAe,QAAA,EAAS;AAAA,UAC5E,CAAA,CAAE;AAAA;AACJ;AACF,KACF;AAAA,EACF;AAGA,EAAA,MAAM,GAAA,GAAgB;AAAA,IACpBS,wBAAA,CAAO,EAAE,KAAA,EAAO,kBAAA,EAAoB,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,CAAA,CAAE,OAAA,EAAS,CAAA,EAAG,CAAA,CAAE,MAAA,EAAQ,CAAA;AAAA,IACxEV,sBAAA,CAAK,EAAE,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,CAAA,CAAE,QAAA,EAAU,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,CAAA,CAAE,QAAA,EAAU,CAAA;AAAA,IACvDA,sBAAA,CAAK,EAAE,EAAA,EAAI,CAAA,CAAE,QAAQ,EAAA,EAAI,CAAA,CAAE,KAAA,EAAO,EAAA,EAAI,CAAA,CAAE,MAAA,EAAQ,EAAA,EAAI,CAAA,CAAE,OAAO,CAAA;AAAA,IAC7DA,sBAAA,CAAK,EAAE,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,CAAA,CAAE,QAAA,EAAU,EAAA,EAAI,CAAA,CAAE,MAAA,EAAQ,EAAA,EAAI,CAAA,CAAE,OAAO,CAAA;AAAA,IAC1DA,sBAAA,CAAK,EAAE,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,CAAA,CAAE,QAAA,EAAU,EAAA,EAAI,CAAA,CAAE,MAAA,EAAQ,EAAA,EAAI,CAAA,CAAE,OAAO;AAAA,GAC5D;AACA,EAAA,IAAI,CAAA,CAAE,SAAS,UAAA,EAAY;AAEzB,IAAA,GAAA,CAAI,KAAKA,sBAAA,CAAK,EAAE,KAAA,EAAO,mBAAA,EAAqB,IAAI,CAAA,EAAG,EAAA,EAAI,CAAA,CAAE,QAAA,EAAU,IAAI,EAAA,EAAI,EAAA,EAAI,CAAA,CAAE,QAAA,EAAU,CAAC,CAAA;AAAA,EAC9F;AACA,EAAA,IAAI,EAAE,UAAA,EAAY;AAChB,IAAA,GAAA,CAAI,IAAA;AAAA,MACFC,sBAAA;AAAA,QACE,EAAE,OAAO,kBAAA,EAAoB,CAAA,EAAG,IAAI,CAAA,EAAG,EAAA,EAAI,eAAe,QAAA,EAAS;AAAA,QACnE,CAAA,IAAA,EAAI,EAAE,UAAU,CAAA,IAAA;AAAA;AAClB,KACF;AAAA,EACF;AACA,EAAA,GAAA,CAAI,IAAA;AAAA,IACFA,sBAAA,CAAO,EAAE,KAAA,EAAO,kBAAA,EAAoB,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,CAAA,CAAE,OAAA,EAAS,aAAA,EAAe,QAAA,EAAS,EAAG,EAAE,IAAI;AAAA,GAC5F;AACA,EAAA,OAAOY,uBAAA;AAAA,IACL,EAAE,KAAA,EAAO,aAAA,EAAe,SAAA,EAAW,CAAA,CAAE,EAAA,EAAI,SAAA,EAAW,CAAA,UAAA,EAAa,CAAA,CAAE,CAAC,CAAA,EAAA,EAAK,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,EAAI;AAAA,IAChF;AAAA,GACF;AACF;AAEA,SAAS,qBAAqB,CAAA,EAA2B;AACvD,EAAA,MAAM,IAAI,CAAA,CAAE,OAAA;AACZ,EAAA,MAAM,KAAA,GAAkB;AAAA,IACtBG,oBAAA,CAAG,SAAA,EAAW,EAAE,EAAA,EAAI,EAAE,EAAA,EAAI,EAAA,EAAI,CAAA,CAAE,EAAA,EAAI,IAAI,CAAA,CAAE,EAAA,EAAI,EAAA,EAAI,CAAA,CAAE,IAAI;AAAA,GAC1D;AAGA,EAAA,IAAI,IAAA;AACJ,EAAA,MAAM,MAAA,GAAS,CAAA,CAAE,eAAA,CAAgB,MAAA,GAAS,CAAA;AAC1C,EAAA,IAAI,MAAA,EAAQ;AAEV,IAAA,IAAA,GAAO,EAAE,EAAA,GAAK,CAAA,CAAE,KAAK,EAAA,IAAM,CAAA,CAAE,aAAa,EAAA,GAAK,CAAA,CAAA;AAAA,EACjD,CAAA,MAAO;AACL,IAAA,IAAA,GAAO,EAAE,EAAA,GAAK,CAAA;AAAA,EAChB;AAEA,EAAA,IAAI,EAAE,UAAA,EAAY;AAChB,IAAA,KAAA,CAAM,IAAA;AAAA,MACJf,sBAAA;AAAA,QACE,EAAE,KAAA,EAAO,kBAAA,EAAoB,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,EAAI,MAAA,GAAS,CAAA,CAAE,EAAA,GAAK,EAAE,EAAA,GAAK,EAAA,GAAK,EAAE,EAAA,GAAK,EAAA,EAAK,eAAe,QAAA,EAAS;AAAA,QAC1G,CAAA,IAAA,EAAI,EAAE,UAAU,CAAA,IAAA;AAAA;AAClB,KACF;AAAA,EACF;AACA,EAAA,KAAA,CAAM,IAAA;AAAA,IACJA,sBAAA;AAAA,MACE,EAAE,KAAA,EAAO,YAAA,EAAc,CAAA,EAAG,CAAA,CAAE,EAAA,EAAI,CAAA,EAAG,MAAA,GAAS,IAAA,GAAO,CAAA,CAAE,EAAA,GAAK,CAAA,EAAG,eAAe,QAAA,EAAS;AAAA,MACrF,CAAA,CAAE;AAAA;AACJ,GACF;AAEA,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,MAAM,IAAA,GAAA,CAAQ,MAAA,GAAS,IAAA,GAAO,CAAA,CAAE,EAAA,IAAM,CAAA;AACtC,IAAA,KAAA,CAAM,IAAA,CAAKD,uBAAK,EAAE,KAAA,EAAO,aAAa,EAAA,EAAI,CAAA,CAAE,EAAA,GAAK,CAAA,CAAE,EAAA,GAAK,CAAA,EAAG,IAAI,IAAA,EAAM,EAAA,EAAI,EAAE,EAAA,GAAK,CAAA,CAAE,KAAK,CAAA,EAAG,EAAA,EAAI,IAAA,EAAM,CAAC,CAAA;AACrG,IAAA,IAAI,KAAK,IAAA,GAAO,EAAA;AAChB,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,EAAA,GAAK,CAAA,CAAE,EAAA,GAAK,EAAA;AAC5B,IAAA,KAAA,CAAM,IAAA,CAAKC,sBAAA,CAAO,EAAE,KAAA,EAAO,qBAAA,EAAuB,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,EAAA,EAAG,EAAG,kBAAkB,CAAC,CAAA;AACxF,IAAA,EAAA,IAAM,EAAA;AACN,IAAA,KAAA,MAAW,EAAA,IAAM,EAAE,eAAA,EAAiB;AAClC,MAAA,KAAA,CAAM,IAAA,CAAKA,sBAAA,CAAO,EAAE,KAAA,EAAO,gBAAA,EAAkB,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,EAAA,EAAG,EAAG,EAAE,CAAC,CAAA;AACnE,MAAA,EAAA,IAAM,EAAA;AAAA,IACR;AAAA,EACF;AAEA,EAAA,OAAOY,uBAAA,CAAM,EAAE,KAAA,EAAO,eAAA,EAAiB,WAAW,CAAA,CAAE,EAAA,IAAM,KAAK,CAAA;AACjE;AAEA,SAAS+B,cAAa,CAAA,EAAwB;AAC5C,EAAA,QAAQ,CAAA,CAAE,SAAS,IAAA;AAAM,IACvB,KAAK,SAAA;AACH,MAAA,OAAO,eAAA;AAAA,IACT,KAAK,QAAA;AACH,MAAA,OAAO,cAAA;AAAA,IACT,KAAK,gBAAA;AACH,MAAA,OAAO,eAAA;AAAA,IACT;AACE,MAAA,OAAO,aAAA;AAAA;AAEb;AAEA,SAAS,UAAU,CAAA,EAAoC;AACrD,EAAA,IAAI,CAAA,CAAE,SAAA,KAAc,QAAA,EAAU,OAAO,uBAAA;AACrC,EAAA,IAAI,CAAA,CAAE,cAAc,MAAA,EAAQ;AAC1B,IAAA,OAAO,CAAA,CAAE,QAAA,CAAS,IAAA,KAAS,QAAA,GACvB,+BAAA,GACA,wBAAA;AAAA,EACN;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAASC,YAAW,CAAA,EAAwB;AAC1C,EAAA,MAAM,KAAA,GAAyC;AAAA,IAC7C,KAAA,EAAOD,cAAa,CAAC,CAAA;AAAA,IACrB,GAAG,CAAA,CAAE,CAAA;AAAA,IACL,aAAA,EAAe,EAAE,QAAA,CAAS,MAAA;AAAA,IAC1B,aAAA,EAAe,EAAE,QAAA,CAAS;AAAA,GAC5B;AACA,EAAA,MAAM,MAAA,GAAS,UAAU,CAAC,CAAA;AAC1B,EAAA,IAAI,MAAA,EAAQ,KAAA,CAAM,YAAY,CAAA,GAAI,MAAA;AAClC,EAAA,OAAOhC,uBAAO,KAAK,CAAA;AACrB;AAEA,SAAS,gBAAgB,CAAA,EAA+B;AACtD,EAAA,IAAI,CAAC,CAAA,CAAE,KAAA,EAAO,OAAO,IAAA;AACrB,EAAA,MAAM,IAAA,GAAO,EAAE,KAAA,CAAM,IAAA;AACrB,EAAA,MAAM,KAAA,GAAQ,EAAA;AACd,EAAA,MAAM,MAAA,GAAS,KAAK,MAAA,GAAS,KAAA;AAC7B,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,CAAE,MAAM,CAAA,EAAG,CAAC,CAAA;AAC7D,EAAA,MAAM,KAAA,GAAQ,SAAS,CAAA,GAAM,CAAA;AAC7B,EAAA,MAAM,QAAQ,MAAA,GAAS,CAAA;AACvB,EAAA,MAAM,MAAA,GAAS,CAAA,CAAE,KAAA,CAAM,EAAA,GAAK,SAAS,CAAA,GAAI,CAAA;AACzC,EAAA,MAAM,MAAA,GAAS,CAAA,CAAE,QAAA,CAAS,IAAA,KAAS,QAAA;AACnC,EAAA,MAAM,KAAA,GAAkB;AAAA,IACtBH,sBAAA,CAAK;AAAA,MACH,KAAA,EAAO,YAAA;AAAA,MACP,CAAA,EAAG,CAAA,CAAE,KAAA,CAAM,EAAA,GAAK,KAAA,GAAQ,CAAA;AAAA,MACxB,CAAA,EAAG,CAAA,CAAE,KAAA,CAAM,EAAA,GAAK,KAAA,GAAQ,CAAA;AAAA,MACxB,KAAA,EAAO,KAAA;AAAA,MACP,MAAA,EAAQ,KAAA;AAAA,MACR,EAAA,EAAI,CAAA;AAAA,MACJ,EAAA,EAAI;AAAA,KACL;AAAA,GACH;AACA,EAAA,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM;AACrB,IAAA,KAAA,CAAM,IAAA;AAAA,MACJR,sBAAA;AAAA,QACE;AAAA,UACE,KAAA,EAAO,MAAA,IAAU,CAAA,KAAM,CAAA,GAAI,0CAAA,GAA6C,kBAAA;AAAA,UACxE,CAAA,EAAG,EAAE,KAAA,CAAO,EAAA;AAAA,UACZ,CAAA,EAAG,SAAS,CAAA,GAAI,KAAA;AAAA,UAChB,aAAA,EAAe;AAAA,SACjB;AAAA,QACA;AAAA;AACF,KACF;AAAA,EACF,CAAC,CAAA;AACD,EAAA,OAAOY,uBAAA,CAAM,EAAE,KAAA,EAAO,oBAAA,IAAwB,KAAK,CAAA;AACrD;AAEA,SAAS,qBAAqB,CAAA,EAA0B;AACtD,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,IAAI,EAAE,gBAAA,EAAkB;AACtB,IAAA,GAAA,CAAI,IAAA;AAAA,MACFZ,sBAAA;AAAA,QACE,EAAE,KAAA,EAAO,YAAA,EAAc,CAAA,EAAG,CAAA,CAAE,gBAAA,CAAiB,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,gBAAA,CAAiB,CAAA,EAAG,aAAA,EAAe,QAAA,EAAS;AAAA,QACjG,EAAE,gBAAA,CAAiB;AAAA;AACrB,KACF;AAAA,EACF;AACA,EAAA,IAAI,EAAE,cAAA,EAAgB;AACpB,IAAA,GAAA,CAAI,IAAA;AAAA,MACFA,sBAAA;AAAA,QACE,EAAE,KAAA,EAAO,YAAA,EAAc,CAAA,EAAG,CAAA,CAAE,cAAA,CAAe,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,cAAA,CAAe,CAAA,EAAG,aAAA,EAAe,QAAA,EAAS;AAAA,QAC7F,EAAE,cAAA,CAAe;AAAA;AACnB,KACF;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,WAAW,EAAA,EAAuC;AACzD,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,GAAA,IAAO,GAAG,QAAA,EAAU;AAC7B,IAAA,KAAA,CAAM,IAAA,CAAKW,uBAAO,EAAE,KAAA,EAAO,iBAAiB,CAAA,EAAG,GAAA,EAAK,CAAC,CAAA;AAAA,EACvD;AACA,EAAA,KAAA,CAAM,IAAA,CAAKA,sBAAA,CAAO,EAAE,KAAA,EAAO,eAAA,EAAiB,CAAA,EAAG,EAAA,CAAG,MAAA,EAAQ,YAAA,EAAc,uBAAA,EAAyB,CAAC,CAAA;AAClG,EAAA,OAAOC,uBAAA;AAAA,IACL,EAAE,KAAA,EAAO,gBAAA,EAAkB,aAAA,EAAe,GAAG,QAAA,EAAS;AAAA,IACtD;AAAA,GACF;AACF;AAEO,SAAS,mBAAA,CAAoB,QAA6B,MAAA,EAA+B;AAC9F,EAAA,MAAM,CAAA,GAAIC,kCAAA,CAAiB,MAAA,EAAQ,KAAA,IAAS,SAAS,CAAA;AACrD,EAAA,MAAM,WAAqB,EAAC;AAE5B,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,GAAA,CAAI,SAAA,CAAU,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,SAAS,CAAA,CAAE,MAAA;AAC1E,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,GAAA,CAAI,SAAA,CAAU,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,QAAQ,CAAA,CAAE,MAAA;AACxE,EAAA,QAAA,CAAS,IAAA,CAAKZ,uBAAA,CAAQ,CAAA,gBAAA,EAAmB,MAAA,CAAO,KAAA,GAAQ,aAAQ,MAAA,CAAO,KAAA,GAAQ,EAAE,CAAA,CAAE,CAAC,CAAA;AACpF,EAAA,QAAA,CAAS,IAAA;AAAA,IACPa,sBAAA;AAAA,MACE,CAAA,EAAG,OAAO,OAAA,GAAU,WAAA,GAAc,OAAO,OAAA,CAAQ,IAAA,GAAO,OAAO,EAAE,CAAA,EAC5D,OAAO,MAAA,CAAO,MAAM,YAAY,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,YAAA,EAAe,QAAQ,aAAa,OAAO,CAAA,QAAA;AAAA;AACxG,GACF;AACA,EAAA,QAAA,CAAS,IAAA,CAAKC,qBAAG,OAAA,EAAS,IAAIoB,SAAAA,CAAS,CAAC,CAAC,CAAC,CAAA;AAC1C,EAAA,QAAA,CAAS,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAC,CAAA;AAExB,EAAA,IAAI,OAAO,KAAA,EAAO;AAChB,IAAA,QAAA,CAAS,IAAA;AAAA,MACPnC,sBAAA;AAAA,QACE,EAAE,CAAA,EAAG,MAAA,CAAO,KAAA,GAAQ,CAAA,EAAG,GAAG,EAAA,EAAI,KAAA,EAAO,aAAA,EAAe,aAAA,EAAe,QAAA,EAAS;AAAA,QAC5E,MAAA,CAAO;AAAA;AACT,KACF;AAAA,EACF;AAGA,EAAA,IAAI,OAAO,OAAA,EAAS;AAClB,IAAA,MAAM,IAAI,MAAA,CAAO,OAAA;AACjB,IAAA,MAAM,SAAA,GAAsB;AAAA,MAC1BQ,uBAAK,EAAE,CAAA,EAAG,EAAE,CAAA,EAAG,CAAA,EAAG,EAAE,CAAA,EAAG,KAAA,EAAO,CAAA,CAAE,KAAA,EAAO,QAAQ,CAAA,CAAE,MAAA,EAAQ,IAAI,CAAA,EAAG,EAAA,EAAI,GAAG;AAAA,KACzE;AACA,IAAA,IAAI,EAAE,IAAA,EAAM;AACV,MAAA,SAAA,CAAU,IAAA;AAAA,QACRR,sBAAA;AAAA,UACE,EAAE,KAAA,EAAO,qBAAA,EAAuB,CAAA,EAAG,EAAE,CAAA,GAAI,CAAA,CAAE,KAAA,GAAQ,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,EAAA,EAAI,eAAe,QAAA,EAAS;AAAA,UAC3F,CAAA,CAAE;AAAA;AACJ,OACF;AAAA,IACF;AACA,IAAA,QAAA,CAAS,IAAA,CAAKY,wBAAM,EAAE,KAAA,EAAO,iBAAiB,SAAA,EAAW,SAAA,EAAU,EAAG,SAAS,CAAC,CAAA;AAAA,EAClF;AAGA,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,KAAA,MAAW,KAAK,MAAA,CAAO,KAAA,UAAe,IAAA,CAAKgC,WAAAA,CAAW,CAAC,CAAC,CAAA;AACxD,EAAA,KAAA,MAAW,MAAM,MAAA,CAAO,KAAA,UAAe,IAAA,CAAK,UAAA,CAAW,EAAE,CAAC,CAAA;AAC1D,EAAA,QAAA,CAAS,KAAKhC,uBAAA,CAAM,EAAE,OAAO,aAAA,EAAc,EAAG,OAAO,CAAC,CAAA;AAGtD,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,KAAA,MAAW,KAAK,MAAA,CAAO,MAAA,WAAiB,IAAA,CAAK,WAAA,CAAY,CAAC,CAAC,CAAA;AAC3D,EAAA,QAAA,CAAS,KAAKA,uBAAA,CAAM,EAAE,OAAO,cAAA,EAAe,EAAG,QAAQ,CAAC,CAAA;AAGxD,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,KAAK,MAAA,CAAO,QAAA,QAAgB,IAAA,CAAK,oBAAA,CAAqB,CAAC,CAAC,CAAA;AACnE,EAAA,QAAA,CAAS,KAAKA,uBAAA,CAAM,EAAE,OAAO,gBAAA,EAAiB,EAAG,KAAK,CAAC,CAAA;AAGvD,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,KAAA,MAAW,CAAA,IAAK,OAAO,KAAA,EAAO;AAC5B,IAAA,MAAM,GAAA,GAAM,gBAAgB,CAAC,CAAA;AAC7B,IAAA,IAAI,GAAA,EAAK,QAAA,CAAS,IAAA,CAAK,GAAG,CAAA;AAC1B,IAAA,QAAA,CAAS,IAAA,CAAK,GAAG,oBAAA,CAAqB,CAAC,CAAC,CAAA;AAAA,EAC1C;AACA,EAAA,QAAA,CAAS,KAAKA,uBAAA,CAAM,EAAE,OAAO,cAAA,EAAe,EAAG,QAAQ,CAAC,CAAA;AAExD,EAAA,OAAOI,yBAAA;AAAA,IACL;AAAA,MACE,KAAA,EAAO,OAAA;AAAA,MACP,IAAA,EAAM,KAAA;AAAA,MACN,YAAA,EAAcC,2BAAA,CAAU,MAAA,CAAO,KAAA,IAAS,sBAAsB,CAAA;AAAA,MAC9D,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,SAAS,CAAA,IAAA,EAAO,MAAA,CAAO,KAAK,CAAA,CAAA,EAAI,OAAO,MAAM,CAAA,CAAA;AAAA,MAC7C,mBAAA,EAAqB;AAAA,KACvB;AAAA,IACA;AAAA,GACF;AACF;AAEO,SAAS,aAAA,CAAc,WAAgC,MAAA,EAA+B;AAC3F,EAAA,MAAM,MAAM,OAAO,SAAA,KAAc,QAAA,GAAW,YAAA,CAAa,SAAS,CAAA,GAAI,SAAA;AACtE,EAAA,MAAM,MAAA,GAAS,cAAc,GAAG,CAAA;AAChC,EAAA,OAAO,mBAAA,CAAoB,QAAQ,MAAM,CAAA;AAC3C;;;ACxZO,IAAM,OAAA,GAAyB;AAAA,EACpC,IAAA,EAAM,SAAA;AAAA,EACN,OAAOjB,KAAAA,EAAuB;AAC5B,IAAA,KAAA,MAAW,GAAA,IAAOA,KAAAA,CAAK,KAAA,CAAM,OAAO,CAAA,EAAG;AACrC,MAAA,MAAM,CAAA,GAAI,IAAI,IAAA,EAAK;AACnB,MAAA,IAAI,CAAC,CAAA,EAAG;AACR,MAAA,IAAI,EAAE,UAAA,CAAW,GAAG,KAAK,CAAA,CAAE,UAAA,CAAW,IAAI,CAAA,EAAG;AAC7C,MAAA,OAAO,aAAA,CAAc,KAAK,CAAC,CAAA;AAAA,IAC7B;AACA,IAAA,OAAO,KAAA;AAAA,EACT,CAAA;AAAA,EACA,KAAA,EAAO,YAAA;AAAA,EACP,MAAA,CAAOA,OAAc,MAAA,EAA+B;AAClD,IAAA,OAAO,aAAA,CAAcA,OAAM,MAAM,CAAA;AAAA,EACnC;AACF;;;ACOO,IAAM,cAAA,GAAN,cAA6B,KAAA,CAAM;AAAA,EACxC,IAAA;AAAA,EACA,WAAA,CAAY,SAAiBD,KAAAA,EAAe;AAC1C,IAAA,KAAA,CAAMA,UAAS,MAAA,GAAY,CAAA,KAAA,EAAQA,KAAI,CAAA,EAAA,EAAK,OAAO,KAAK,OAAO,CAAA;AAC/D,IAAA,IAAA,CAAK,IAAA,GAAO,gBAAA;AACZ,IAAA,IAAIA,KAAAA,KAAS,MAAA,EAAW,IAAA,CAAK,IAAA,GAAOA,KAAAA;AAAA,EACtC;AACF,CAAA;AAOA,IAAM,WAAA,GAA+C;AAAA,EACnD,IAAA,EAAM,GAAA;AAAA,EACN,KAAA,EAAO,GAAA;AAAA,EACP,KAAA,EAAO,GAAA;AAAA,EACP,QAAA,EAAU;AACZ,CAAA;AAGA,SAAS,gBAAgB,CAAA,EAAmB;AAC1C,EAAA,OAAO,CAAA,CACJ,OAAA,CAAQ,UAAA,EAAY,GAAG,CAAA,CACvB,OAAA,CAAQ,OAAA,EAAS,GAAG,CAAA,CACpB,OAAA,CAAQ,SAAA,EAAW,GAAG,CAAA;AAC3B;AAEA,SAASmB,YAAW,GAAA,EAAwB;AAC1C,EAAA,MAAM,MAAiB,EAAC;AACxB,EAAA,MAAM,IAAA,GAAO,eAAA,CAAgB,GAAG,CAAA,CAAE,MAAM,OAAO,CAAA;AAC/C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,CAAC,CAAA,IAAK,EAAA;AACvB,IAAA,MAAM,OAAA,GAAU,IAAI,IAAA,EAAK;AACzB,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,IAAI,QAAQ,UAAA,CAAW,GAAG,KAAK,OAAA,CAAQ,UAAA,CAAW,IAAI,CAAA,EAAG;AAEzD,IAAA,IAAI,GAAA,GAAM,KAAA;AACV,IAAA,IAAI,MAAM,GAAA,CAAI,MAAA;AACd,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACnC,MAAA,MAAM,CAAA,GAAI,IAAI,CAAC,CAAA;AACf,MAAA,IAAI,MAAM,GAAA,EAAK;AACb,QAAA,GAAA,GAAM,CAAC,GAAA;AACP,QAAA;AAAA,MACF;AACA,MAAA,IAAI,GAAA,EAAK;AACT,MAAA,IAAI,MAAM,GAAA,EAAK;AACb,QAAA,GAAA,GAAM,CAAA;AACN,QAAA;AAAA,MACF;AACA,MAAA,IAAI,MAAM,GAAA,IAAO,GAAA,CAAI,CAAA,GAAI,CAAC,MAAM,GAAA,EAAK;AACnC,QAAA,GAAA,GAAM,CAAA;AACN,QAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,MAAM,WAAW,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,GAAG,EAAE,IAAA,EAAK;AACxC,IAAA,IAAI,CAAC,QAAA,EAAU;AACf,IAAA,GAAA,CAAI,KAAK,EAAE,IAAA,EAAM,UAAU,IAAA,EAAM,CAAA,GAAI,GAAG,CAAA;AAAA,EAC1C;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAASmB,aAAY,CAAA,EAAmB;AACtC,EAAA,MAAM,CAAA,GAAI,EAAE,IAAA,EAAK;AACjB,EAAA,IAAI,EAAE,MAAA,IAAU,CAAA,KAAO,EAAE,UAAA,CAAW,GAAG,KAAK,CAAA,CAAE,QAAA,CAAS,GAAG,CAAA,IAAO,EAAE,UAAA,CAAW,GAAG,KAAK,CAAA,CAAE,QAAA,CAAS,GAAG,CAAA,CAAA,EAAK;AACvG,IAAA,OAAO,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,EACtB;AACA,EAAA,OAAO,CAAA;AACT;AAEA,SAAS,WAAA,CAAY,CAAA,EAAW,MAAA,EAAgB,IAAA,EAAsB;AACpE,EAAA,IAAI,CAAC,mBAAA,CAAoB,IAAA,CAAK,CAAA,CAAE,IAAA,EAAM,CAAA,EAAG;AACvC,IAAA,MAAM,IAAI,cAAA,CAAe,CAAA,EAAG,IAAI,CAAA,wBAAA,EAA2B,CAAC,MAAM,MAAM,CAAA;AAAA,EAC1E;AACA,EAAA,OAAO,MAAA,CAAO,CAAA,CAAE,IAAA,EAAM,CAAA;AACxB;AAIA,SAAS,eAAA,CAAgB,IAAa,GAAA,EAAuB;AAC3D,EAAA,MAAM,CAAA,GAAI,EAAA,CAAG,IAAA,CAAK,KAAA,CAAM,2BAA2B,CAAA;AACnD,EAAA,IAAI,CAAC,GAAG,OAAO,KAAA;AACf,EAAA,MAAM,GAAA,GAAM,CAAA,CAAE,CAAC,CAAA,CAAE,WAAA,EAAY;AAC7B,EAAA,MAAM,QAAA,GAAW,CAAA,CAAE,CAAC,CAAA,CAAE,IAAA,EAAK;AAC3B,EAAA,MAAM,KAAA,GAAQA,aAAY,QAAQ,CAAA;AAClC,EAAA,QAAQ,GAAA;AAAK,IACX,KAAK,OAAA;AACH,MAAA,GAAA,CAAI,KAAA,GAAQ,KAAA;AACZ,MAAA,OAAO,IAAA;AAAA,IACT,KAAK,MAAA,EAAQ;AACX,MAAA,MAAM,CAAA,GAAI,MAAM,WAAA,EAAY;AAC5B,MAAA,IAAI,MAAM,MAAA,IAAU,CAAA,KAAM,WAAW,CAAA,KAAM,OAAA,IAAW,MAAM,UAAA,EAAY;AACtE,QAAA,MAAM,IAAI,cAAA,CAAe,CAAA,mDAAA,EAAsD,KAAK,CAAA,EAAA,CAAA,EAAM,GAAG,IAAI,CAAA;AAAA,MACnG;AACA,MAAA,GAAA,CAAI,IAAA,GAAO,CAAA;AACX,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,IACA,KAAK,WAAA,EAAa;AAChB,MAAA,MAAM,CAAA,GAAI,MAAM,WAAA,EAAY;AAC5B,MAAA,IAAI,CAAA,KAAM,IAAA,IAAQ,CAAA,KAAM,IAAA,EAAM;AAC5B,QAAA,MAAM,IAAI,cAAA,CAAe,CAAA,iCAAA,EAAoC,KAAK,CAAA,EAAA,CAAA,EAAM,GAAG,IAAI,CAAA;AAAA,MACjF;AACA,MAAA,GAAA,CAAI,SAAA,GAAY,CAAA;AAChB,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,IACA,KAAK,QAAA,EAAU;AACb,MAAA,MAAM,CAAA,GAAI,MAAM,WAAA,EAAY;AAC5B,MAAA,IAAI,CAAA,KAAM,SAAA,IAAa,CAAA,KAAM,YAAA,IAAgB,MAAM,KAAA,EAAO;AACxD,QAAA,MAAM,IAAI,cAAA,CAAe,CAAA,iDAAA,EAAoD,KAAK,CAAA,EAAA,CAAA,EAAM,GAAG,IAAI,CAAA;AAAA,MACjG;AACA,MAAA,GAAA,CAAI,MAAA,GAAS,CAAA;AACb,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,IACA,KAAK,oBAAA;AACH,MAAA,GAAA,CAAI,iBAAA,GAAoB,WAAA,CAAY,KAAA,EAAO,EAAA,CAAG,MAAM,oBAAoB,CAAA;AACxE,MAAA,OAAO,IAAA;AAAA,IACT,KAAK,gBAAA;AACH,MAAA,GAAA,CAAI,aAAA,GAAgB,kBAAA,CAAmB,IAAA,CAAK,KAAK,CAAA;AACjD,MAAA,OAAO,IAAA;AAAA,IACT;AACE,MAAA,OAAO,KAAA;AAAA;AAEb;AAUA,SAAS,aAAA,CAAc,KAAa,MAAA,EAAgC;AAClE,EAAA,MAAM,CAAA,GAAI,IAAI,IAAA,EAAK;AACnB,EAAA,MAAM,GAAA,GAAM,CAAA,CAAE,KAAA,CAAM,qDAAqD,CAAA;AACzE,EAAA,IAAI,GAAA,EAAK;AACP,IAAA,MAAM,CAAA,GAAI,MAAA,CAAO,GAAA,CAAI,CAAC,CAAC,CAAA;AACvB,IAAA,MAAM,CAAA,GAAI,MAAA,CAAO,GAAA,CAAI,CAAC,CAAC,CAAA;AACvB,IAAA,MAAM,CAAA,GAAI,MAAA,CAAO,GAAA,CAAI,CAAC,CAAC,CAAA;AACvB,IAAA,IAAI,EAAE,CAAA,IAAK,CAAA,IAAK,CAAA,IAAK,CAAA,CAAA,EAAI;AACvB,MAAA,MAAM,IAAI,eAAe,CAAA,2DAAA,EAAoD,CAAC,IAAI,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,CAAA,EAAK,MAAM,CAAA;AAAA,IACrG;AACA,IAAA,IAAI,IAAI,CAAA,EAAG;AACT,MAAA,MAAM,IAAI,cAAA,CAAe,CAAA,mDAAA,EAAiD,CAAC,KAAK,MAAM,CAAA;AAAA,IACxF;AACA,IAAA,MAAM,EAAA,GAAA,CAAM,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA,IAAK,CAAA;AAC7B,IAAA,MAAM,QAAA,GAAA,CAAA,CAAa,CAAA,GAAI,CAAA,IAAK,CAAA,KAAM,CAAA;AAClC,IAAA,OAAO,EAAE,UAAU,EAAA,EAAI,UAAA,EAAY,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAE,EAAG,QAAA,EAAS;AAAA,EAC3D;AACA,EAAA,IAAI,iBAAA,CAAkB,IAAA,CAAK,CAAC,CAAA,EAAG;AAC7B,IAAA,OAAO,EAAE,QAAA,EAAU,MAAA,CAAO,CAAC,CAAA,EAAE;AAAA,EAC/B;AACA,EAAA,MAAM,IAAI,cAAA,CAAe,CAAA,uDAAA,EAA0D,GAAG,MAAM,MAAM,CAAA;AACpG;AAIA,SAAS,WAAA,CAAY,GAAA,EAAa,IAAA,EAAgB,MAAA,EAAgC;AAChF,EAAA,MAAM,GAAA,GAAM,IAAI,IAAA,EAAK;AACrB,EAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,cAAA,CAAe,+BAA+B,MAAM,CAAA;AACxE,EAAA,MAAM,cAAA,GAAiB,YAAY,IAAI,CAAA;AAEvC,EAAA,MAAM,SAAA,GAAY,CAAC,GAAA,KAAkC;AACnD,IAAA,IAAI,CAAC,GAAA,EAAK;AACV,IAAA,IAAI,mBAAmB,IAAA,EAAM;AAC3B,MAAA,MAAM,IAAI,cAAA;AAAA,QACR,CAAA,UAAA,EAAa,GAAG,CAAA,gEAAA,EAA8D,GAAG,CAAA,CAAA,CAAA;AAAA,QACjF;AAAA,OACF;AAAA,IACF;AACA,IAAA,IAAI,QAAQ,cAAA,EAAgB;AAC1B,MAAA,MAAM,IAAI,cAAA;AAAA,QACR,CAAA,UAAA,EAAa,GAAG,CAAA,mCAAA,EAAsC,IAAI,SAAS,GAAG,CAAA,CAAA,CAAA;AAAA,QACtE;AAAA,OACF;AAAA,IACF;AAAA,EACF,CAAA;AAGA,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,4DAA4D,CAAA;AACpF,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,SAAA,CAAU,KAAA,CAAM,CAAC,CAAA,EAAG,WAAA,EAAa,CAAA;AACjC,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,MAAM,CAAC,CAAA;AAAA,MACb,IAAA,EAAM,KAAA,CAAM,CAAC,CAAA,CAAE,WAAA,EAAY;AAAA,MAC3B,GAAA,EAAK,MAAM,CAAC,CAAA,GAAI,OAAO,KAAA,CAAM,CAAC,CAAC,CAAA,GAAI;AAAA,KACrC;AAAA,EACF;AAGA,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,KAAA,CAAM,8CAA8C,CAAA;AACzE,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,SAAA,CAAU,QAAA,CAAS,CAAC,CAAA,EAAG,WAAA,EAAa,CAAA;AACpC,IAAA,OAAO,EAAE,IAAA,EAAM,QAAA,CAAS,CAAC,CAAA,EAAG,IAAA,EAAM,IAAA,EAAM,GAAA,EAAK,MAAA,CAAO,QAAA,CAAS,CAAC,CAAC,CAAA,EAAE;AAAA,EACnE;AAGA,EAAA,IAAI,mBAAA,CAAoB,IAAA,CAAK,GAAG,CAAA,EAAG;AACjC,IAAA,OAAO,EAAE,IAAA,EAAM,GAAA,EAAK,IAAA,EAAM,IAAA,EAAM,KAAK,CAAA,EAAE;AAAA,EACzC;AAEA,EAAA,MAAM,IAAI,cAAA,CAAe,CAAA,oCAAA,EAAuC,GAAG,KAAK,MAAM,CAAA;AAChF;AAIA,IAAM,MAAA,GAAS,0CAAA;AAEf,SAAS,aAAA,CAAc,IAAa,GAAA,EAAoB;AACtD,EAAA,MAAM,IAAA,GAAO,EAAA,CAAG,IAAA,CAAK,KAAA,CAAM,wBAAwB,CAAA;AACnD,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,MAAM,IAAI,cAAA,CAAe,CAAA,qBAAA,EAAwB,GAAG,IAAI,CAAA,CAAA,EAAI,GAAG,IAAI,CAAA;AAAA,EACrE;AACA,EAAA,MAAM,EAAA,GAAK,KAAK,CAAC,CAAA;AACjB,EAAA,IAAI,CAAC,mBAAA,CAAoB,IAAA,CAAK,EAAE,CAAA,EAAG;AACjC,IAAA,MAAM,IAAI,cAAA,CAAe,CAAA,iBAAA,EAAoB,EAAE,CAAA,uEAAA,CAAA,EAA2E,GAAG,IAAI,CAAA;AAAA,EACnI;AACA,EAAA,IAAI,IAAA,GAAO,IAAA,CAAK,CAAC,CAAA,CAAE,IAAA,EAAK;AAGxB,EAAA,IAAI,KAAA,GAAQ,EAAA;AACZ,EAAA,IAAI,KAAK,UAAA,CAAW,GAAG,KAAK,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AAChD,IAAA,MAAM,CAAA,GAAI,KAAK,CAAC,CAAA;AAChB,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,CAAA,EAAG,CAAC,CAAA;AAC7B,IAAA,IAAI,GAAA,GAAM,GAAG,MAAM,IAAI,eAAe,CAAA,mCAAA,EAAsC,EAAE,CAAA,CAAA,CAAA,EAAK,EAAA,CAAG,IAAI,CAAA;AAC1F,IAAA,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA;AACzB,IAAA,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,CAAC,EAAE,IAAA,EAAK;AAAA,EAClC,CAAA,MAAO;AAEL,IAAA,MAAM,WAAW,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA,CAAE,CAAC,CAAA,IAAK,EAAA;AACzC,IAAA,IAAI,QAAA,IAAY,CAAC,mCAAA,CAAoC,IAAA,CAAK,QAAQ,KAAK,CAAC,cAAA,CAAe,IAAA,CAAK,QAAQ,CAAA,EAAG;AACrG,MAAA,KAAA,GAAQ,QAAA;AACR,MAAA,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,MAAM,EAAE,IAAA,EAAK;AAAA,IAC1C;AAAA,EACF;AAGA,EAAA,IAAI,SAAA,GAAY,KAAA;AAChB,EAAA,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,gBAAA,EAAkB,MAAM;AAC1C,IAAA,SAAA,GAAY,IAAA;AACZ,IAAA,OAAO,EAAA;AAAA,EACT,CAAC,EAAE,IAAA,EAAK;AAGR,EAAA,MAAMQ,WAA8D,EAAC;AACrE,EAAA,MAAA,CAAO,SAAA,GAAY,CAAA;AACnB,EAAA,IAAI,EAAA;AACJ,EAAA,OAAA,CAAQ,EAAA,GAAK,MAAA,CAAO,IAAA,CAAK,IAAI,OAAO,IAAA,EAAM;AACxC,IAAAA,SAAQ,IAAA,CAAK,EAAE,KAAK,EAAA,CAAG,CAAC,EAAE,WAAA,EAAY,EAAG,OAAO,EAAA,CAAG,KAAA,EAAO,UAAU,EAAA,CAAG,KAAA,GAAQ,GAAG,CAAC,CAAA,CAAE,QAAQ,CAAA;AAAA,EAC/F;AAEA,EAAA,MAAM,SAAiC,EAAC;AACxC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAIA,QAAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACvC,IAAA,MAAM,GAAA,GAAMA,SAAQ,CAAC,CAAA;AACrB,IAAA,MAAM,SAAA,GAAY,CAAA,GAAI,CAAA,GAAIA,QAAAA,CAAQ,MAAA,GAASA,SAAQ,CAAA,GAAI,CAAC,CAAA,CAAE,KAAA,GAAQ,IAAA,CAAK,MAAA;AACvE,IAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,IAAI,QAAA,EAAU,SAAS,EAAE,IAAA,EAAK;AACrD,IAAA,IAAI,GAAA,CAAI,OAAO,MAAA,EAAQ;AACrB,MAAA,MAAM,IAAI,eAAe,CAAA,WAAA,EAAc,GAAA,CAAI,GAAG,CAAA,YAAA,EAAe,EAAE,CAAA,CAAA,CAAA,EAAK,EAAA,CAAG,IAAI,CAAA;AAAA,IAC7E;AACA,IAAA,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA,GAAI,GAAA;AAAA,EACpB;AAEA,EAAA,MAAM,QAAA,GAAA,CAAYA,QAAAA,CAAQ,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,CAAA,EAAGA,QAAAA,CAAQ,CAAC,CAAA,CAAE,KAAK,CAAA,GAAI,IAAA,EAAM,IAAA,EAAK;AAChF,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,MAAM,IAAI,eAAe,CAAA,iBAAA,EAAoB,QAAQ,cAAc,EAAE,CAAA,CAAA,CAAA,EAAK,GAAG,IAAI,CAAA;AAAA,EACnF;AAEA,EAAA,IAAI,QAAA,GAAW,CAAA;AACf,EAAA,IAAI,UAAA;AACJ,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI,MAAA,CAAO,aAAa,MAAA,EAAW;AACjC,IAAA,MAAM,CAAA,GAAI,aAAA,CAAc,MAAA,CAAO,QAAA,EAAU,GAAG,IAAI,CAAA;AAChD,IAAA,QAAA,GAAW,CAAA,CAAE,QAAA;AACb,IAAA,UAAA,GAAa,CAAA,CAAE,UAAA;AACf,IAAA,QAAA,GAAW,CAAA,CAAE,QAAA;AAAA,EACf,CAAA,MAAA,IAAW,CAAC,SAAA,EAAW;AACrB,IAAA,MAAM,IAAI,cAAA,CAAe,CAAA,MAAA,EAAS,EAAE,CAAA,iDAAA,CAAA,EAAqD,GAAG,IAAI,CAAA;AAAA,EAClG;AACA,EAAA,IAAI,QAAA,KAAa,GAAG,SAAA,GAAY,IAAA;AAEhC,EAAA,MAAM,OAAyB,EAAC;AAChC,EAAA,IAAI,MAAA,CAAO,KAAA,KAAU,MAAA,IAAa,MAAA,CAAO,UAAU,EAAA,EAAI;AACrD,IAAA,KAAA,MAAW,IAAA,IAAQ,MAAA,CAAO,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,EAAG;AAC/E,MAAA,MAAM,MAAM,WAAA,CAAY,IAAA,EAAM,GAAA,CAAI,IAAA,EAAM,GAAG,IAAI,CAAA;AAC/C,MAAA,IAAI,GAAA,CAAI,SAAS,EAAA,EAAI;AACnB,QAAA,MAAM,IAAI,cAAA,CAAe,CAAA,MAAA,EAAS,EAAE,CAAA,yBAAA,CAAA,EAA6B,GAAG,IAAI,CAAA;AAAA,MAC1E;AACA,MAAA,IAAA,CAAK,KAAK,GAAG,CAAA;AAAA,IACf;AAAA,EACF;AAEA,EAAA,MAAM,OAAO,MAAA,CAAO,IAAA,GAChB,OAAO,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,IAAA,EAAM,EAAE,MAAA,CAAO,OAAO,IAC1D,EAAC;AACL,EAAA,MAAM,YAAY,MAAA,CAAO,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,MAAK,GAAI,MAAA;AACvD,EAAA,MAAM,OAAO,MAAA,CAAO,IAAA,GAAOR,YAAAA,CAAY,MAAA,CAAO,IAAI,CAAA,GAAI,MAAA;AAEtD,EAAA,MAAM,IAAA,GAAiB;AAAA,IACrB,EAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA;AAAA,IACA,MAAM,EAAA,CAAG;AAAA,GACX;AACA,EAAA,IAAI,UAAA,OAAiB,UAAA,GAAa,UAAA;AAClC,EAAA,IAAI,QAAA,KAAa,MAAA,EAAW,IAAA,CAAK,QAAA,GAAW,QAAA;AAC5C,EAAA,IAAI,SAAA,OAAgB,SAAA,GAAY,SAAA;AAChC,EAAA,IAAI,IAAA,OAAW,IAAA,GAAO,IAAA;AACtB,EAAA,GAAA,CAAI,KAAA,CAAM,KAAK,IAAI,CAAA;AACrB;AAIO,SAAS,UAAU,GAAA,EAAsB;AAC9C,EAAA,MAAM,GAAA,GAAe;AAAA,IACnB,IAAA,EAAM,MAAA;AAAA,IACN,IAAA,EAAM,MAAA;AAAA,IACN,SAAA,EAAW,IAAA;AAAA,IACX,MAAA,EAAQ,SAAA;AAAA,IACR,iBAAA,EAAmB,CAAA;AAAA,IACnB,aAAA,EAAe,KAAA;AAAA,IACf,OAAO,EAAC;AAAA,IACR,UAAU;AAAC,GACb;AAEA,EAAA,MAAM,KAAA,GAAQnB,YAAW,GAAG,CAAA;AAC5B,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,MAAM,IAAI,cAAA,CAAe,8CAAA,EAA2C,CAAC,CAAA;AAAA,EACvE;AACA,EAAA,MAAM,KAAA,GAAQ,MAAM,CAAC,CAAA;AACrB,EAAA,IAAI,CAAC,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,EAAG;AAChC,IAAA,MAAM,IAAI,cAAA,CAAe,CAAA,oDAAA,EAAuD,MAAM,IAAI,CAAA,CAAA,CAAA,EAAK,MAAM,IAAI,CAAA;AAAA,EAC3G;AACA,EAAA,MAAM,cAAc,KAAA,CAAM,IAAA,CAAK,QAAQ,UAAA,EAAY,EAAE,EAAE,IAAA,EAAK;AAC5D,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,MAAM,IAAI,WAAA,CAAY,KAAA,CAAM,aAAa,CAAA,IAAK,WAAA,CAAY,MAAM,aAAa,CAAA;AAC7E,IAAA,IAAI,CAAA,EAAG,GAAA,CAAI,KAAA,GAAQ,CAAA,CAAE,CAAC,CAAA;AAAA,EACxB;AAEA,EAAA,IAAI,QAAA,GAAW,KAAA;AACf,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,EAAA,GAAK,MAAM,CAAC,CAAA;AAClB,IAAA,IAAI,UAAA,CAAW,IAAA,CAAK,EAAA,CAAG,IAAI,CAAA,EAAG;AAC5B,MAAA,aAAA,CAAc,IAAI,GAAG,CAAA;AACrB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,YAAA,CAAa,IAAA,CAAK,EAAA,CAAG,IAAI,CAAA,EAAG;AAC9B,MAAA,IAAI,UAAU,MAAM,IAAI,cAAA,CAAe,+BAAA,EAAiC,GAAG,IAAI,CAAA;AAC/E,MAAA,QAAA,GAAW,IAAA;AAAA,IACb;AACA,IAAA,IAAI,eAAA,CAAgB,EAAA,EAAI,GAAG,CAAA,EAAG;AAC9B,IAAA,MAAM,IAAI,cAAA,CAAe,CAAA,wBAAA,EAA2B,GAAG,IAAI,CAAA,CAAA,EAAI,GAAG,IAAI,CAAA;AAAA,EACxE;AAEA,EAAA,IAAI,GAAA,CAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AAC1B,IAAA,MAAM,IAAI,cAAA,CAAe,mBAAA,EAAqB,CAAC,CAAA;AAAA,EACjD;AAGA,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAY;AAC5B,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,KAAA,EAAO;AACzB,IAAA,IAAI,GAAA,CAAI,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,EAAG;AACjB,MAAA,MAAM,IAAI,cAAA,CAAe,CAAA,mBAAA,EAAsB,EAAE,EAAE,CAAA,CAAA,CAAA,EAAK,EAAE,IAAI,CAAA;AAAA,IAChE;AACA,IAAA,GAAA,CAAI,GAAA,CAAI,EAAE,EAAE,CAAA;AAAA,EACd;AACA,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,KAAA,EAAO;AACzB,IAAA,KAAA,MAAW,GAAA,IAAO,EAAE,IAAA,EAAM;AACxB,MAAA,IAAI,CAAC,GAAA,CAAI,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA,EAAG;AACtB,QAAA,MAAM,IAAI,cAAA,CAAe,CAAA,MAAA,EAAS,CAAA,CAAE,EAAE,wCAAwC,GAAA,CAAI,IAAI,CAAA,CAAA,CAAA,EAAK,CAAA,CAAE,IAAI,CAAA;AAAA,MACnG;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,GAAA;AACT;;;AChYO,IAAM,KAAA,GAAQ,WAAA;AACd,IAAM,MAAA,GAAS,YAAA;AAEf,IAAM,iBAAA,GAAN,cAAgC,KAAA,CAAM;AAAA,EAC3C,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,mBAAA;AAAA,EACd;AACF,CAAA;AAiBA,SAAS,WAAW,GAAA,EAAqB;AACvC,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAoB;AACzC,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAoB;AACzC,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAoB;AACzC,EAAA,MAAM,KAAA,GAAkB,CAAC,KAAA,EAAO,MAAM,CAAA;AACtC,EAAA,QAAA,CAAS,GAAA,CAAI,OAAO,CAAC,CAAA;AACrB,EAAA,QAAA,CAAS,GAAA,CAAI,QAAQ,CAAC,CAAA;AACtB,EAAA,KAAA,MAAW,EAAA,IAAM,CAAC,KAAA,EAAO,MAAM,CAAA,EAAG;AAChC,IAAA,QAAA,CAAS,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AACnB,IAAA,QAAA,CAAS,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAAA,EACrB;AACA,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,KAAA,EAAO;AACzB,IAAA,KAAA,CAAM,IAAA,CAAK,EAAE,EAAE,CAAA;AACf,IAAA,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,CAAA,CAAE,QAAQ,CAAA;AAC7B,IAAA,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,EAAE,CAAA;AACrB,IAAA,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,EAAE,CAAA;AAAA,EACvB;AAEA,EAAA,MAAM,QAAgB,EAAC;AACvB,EAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAkB;AACjC,IAAA,KAAA,CAAM,KAAK,CAAC,CAAA;AACZ,IAAA,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA,CAAG,KAAK,CAAC,CAAA;AAC5B,IAAA,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,CAAG,KAAK,CAAC,CAAA;AAAA,EAC5B,CAAA;AAGA,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAY;AACnC,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,KAAA,EAAO;AACzB,IAAA,IAAI,CAAA,CAAE,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG;AACvB,MAAA,OAAA,CAAQ,EAAE,IAAA,EAAM,KAAA,EAAO,EAAA,EAAI,CAAA,CAAE,IAAI,IAAA,EAAM,IAAA,EAAM,GAAA,EAAK,CAAA,EAAG,CAAA;AAAA,IACvD,CAAA,MAAO;AACL,MAAA,KAAA,MAAW,GAAA,IAAO,EAAE,IAAA,EAAM;AACxB,QAAA,OAAA,CAAQ,EAAE,IAAA,EAAM,GAAA,CAAI,IAAA,EAAM,EAAA,EAAI,CAAA,CAAE,EAAA,EAAI,IAAA,EAAM,GAAA,CAAI,IAAA,EAAM,GAAA,EAAK,GAAA,CAAI,KAAK,CAAA;AAClE,QAAA,UAAA,CAAW,GAAA,CAAI,IAAI,IAAI,CAAA;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,KAAA,EAAO;AACzB,IAAA,IAAI,CAAC,UAAA,CAAW,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,EAAG;AACzB,MAAA,OAAA,CAAQ,EAAE,IAAA,EAAM,CAAA,CAAE,EAAA,EAAI,EAAA,EAAI,QAAQ,IAAA,EAAM,IAAA,EAAM,GAAA,EAAK,CAAA,EAAG,CAAA;AAAA,IACxD;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,KAAA,EAAO,QAAA,EAAU,QAAA,EAAU,UAAU,KAAA,EAAM;AACtD;AAEA,SAAS,SAAS,CAAA,EAAoB;AACpC,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAoB;AACtC,EAAA,KAAA,MAAW,KAAK,CAAA,CAAE,KAAA,EAAO,KAAA,CAAM,GAAA,CAAI,GAAG,CAAC,CAAA;AACvC,EAAA,KAAA,MAAW,CAAA,IAAK,CAAA,CAAE,KAAA,EAAO,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,EAAA,EAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,IAAK,KAAK,CAAC,CAAA;AAEnE,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,CAAA,IAAK,CAAA,CAAE,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,IAAK,CAAA,MAAO,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA;AAEpE,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,OAAO,MAAM,MAAA,EAAQ;AACnB,IAAA,MAAM,CAAA,GAAI,MAAM,KAAA,EAAM;AACtB,IAAA,KAAA,CAAM,KAAK,CAAC,CAAA;AACZ,IAAA,KAAA,MAAW,CAAA,IAAK,CAAA,CAAE,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,EAAI;AAClC,MAAA,MAAM,KAAK,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,EAAE,KAAK,CAAA,IAAK,CAAA;AACnC,MAAA,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,CAAC,CAAA;AACjB,MAAA,IAAI,CAAA,KAAM,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,EAAE,EAAE,CAAA;AAAA,IAC9B;AAAA,EACF;AAEA,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,CAAE,KAAA,CAAM,MAAA,EAAQ;AACnC,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAA,CAAO,KAAA,CAAM,GAAA,CAAI,CAAC,KAAK,CAAA,IAAK,CAAA,IAAK,CAAA,KAAM,KAAA,IAAS,MAAM,MAAM,CAAA;AAC1F,IAAA,MAAM,IAAI,iBAAA;AAAA,MACR,CAAA,qCAAA,EAAwC,KAAA,CAAM,IAAA,CAAK,UAAK,CAAC,CAAA,gCAAA;AAAA,KAC3D;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,aAAa,GAAA,EAAkC;AAC7D,EAAA,MAAM,CAAA,GAAI,WAAW,GAAG,CAAA;AACxB,EAAA,MAAM,KAAA,GAAQ,SAAS,CAAC,CAAA;AAExB,EAAA,MAAM,EAAA,uBAAS,GAAA,EAAoB;AACnC,EAAA,MAAM,EAAA,uBAAS,GAAA,EAAoB;AACnC,EAAA,MAAM,EAAA,uBAAS,GAAA,EAAoB;AACnC,EAAA,MAAM,EAAA,uBAAS,GAAA,EAAoB;AAGnC,EAAA,EAAA,CAAG,GAAA,CAAI,OAAO,CAAC,CAAA;AACf,EAAA,EAAA,CAAG,GAAA,CAAI,OAAO,CAAC,CAAA;AACf,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,IAAI,MAAM,KAAA,EAAO;AACjB,IAAA,MAAM,CAAA,GAAI,CAAA,CAAE,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA;AAC1B,IAAA,MAAM,GAAA,GAAM,CAAA,CAAE,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA;AAC5B,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,IAAI,aAAA,GAAgB,KAAA;AACpB,IAAA,KAAA,MAAW,KAAK,GAAA,EAAK;AACnB,MAAA,IAAI,CAAA;AACJ,MAAA,QAAQ,EAAE,IAAA;AAAM,QACd,KAAK,IAAA;AACH,UAAA,CAAA,GAAI,EAAA,CAAG,GAAA,CAAI,CAAA,CAAE,IAAI,IAAK,CAAA,CAAE,GAAA;AACxB,UAAA;AAAA,QACF,KAAK,IAAA;AACH,UAAA,CAAA,GAAI,EAAA,CAAG,GAAA,CAAI,CAAA,CAAE,IAAI,IAAK,CAAA,CAAE,GAAA;AACxB,UAAA;AAAA,QACF,KAAK,IAAA;AACH,UAAA,CAAA,GAAI,GAAG,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA,GAAK,EAAE,GAAA,GAAM,CAAA;AAC9B,UAAA;AAAA,QACF,KAAK,IAAA;AACH,UAAA,CAAA,GAAI,GAAG,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA,GAAK,EAAE,GAAA,GAAM,CAAA;AAC9B,UAAA;AAAA;AAEJ,MAAA,IAAI,CAAC,aAAA,IAAiB,CAAA,GAAI,KAAA,EAAO;AAC/B,QAAA,KAAA,GAAQ,CAAA;AACR,QAAA,aAAA,GAAgB,IAAA;AAAA,MAClB;AAAA,IACF;AACA,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,CAAA;AAC7B,IAAA,EAAA,CAAG,GAAA,CAAI,GAAG,GAAG,CAAA;AACb,IAAA,EAAA,CAAG,GAAA,CAAI,CAAA,EAAG,GAAA,GAAM,CAAC,CAAA;AAAA,EACnB;AAEA,EAAA,MAAM,eAAA,GAAkB,EAAA,CAAG,GAAA,CAAI,MAAM,CAAA;AAGrC,EAAA,EAAA,CAAG,GAAA,CAAI,QAAQ,eAAe,CAAA;AAC9B,EAAA,EAAA,CAAG,GAAA,CAAI,QAAQ,eAAe,CAAA;AAC9B,EAAA,KAAA,IAAS,IAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC1C,IAAA,MAAM,CAAA,GAAI,MAAM,CAAC,CAAA;AACjB,IAAA,IAAI,MAAM,MAAA,EAAQ;AAClB,IAAA,MAAM,CAAA,GAAI,CAAA,CAAE,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA;AAC1B,IAAA,MAAM,GAAA,GAAM,CAAA,CAAE,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA;AAC5B,IAAA,IAAI,MAAA,GAAS,eAAA;AACb,IAAA,IAAI,aAAA,GAAgB,KAAA;AACpB,IAAA,KAAA,MAAW,KAAK,GAAA,EAAK;AACnB,MAAA,IAAI,CAAA;AACJ,MAAA,QAAQ,EAAE,IAAA;AAAM,QACd,KAAK,IAAA;AACH,UAAA,CAAA,GAAI,EAAA,CAAG,GAAA,CAAI,CAAA,CAAE,EAAE,IAAK,CAAA,CAAE,GAAA;AACtB,UAAA;AAAA,QACF,KAAK,IAAA;AACH,UAAA,CAAA,GAAI,GAAG,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,GAAK,EAAE,GAAA,GAAM,CAAA;AAC5B,UAAA;AAAA,QACF,KAAK,IAAA;AACH,UAAA,CAAA,GAAI,EAAA,CAAG,GAAA,CAAI,CAAA,CAAE,EAAE,IAAK,CAAA,CAAE,GAAA;AACtB,UAAA;AAAA,QACF,KAAK,IAAA;AACH,UAAA,CAAA,GAAI,GAAG,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,GAAK,EAAE,GAAA,GAAM,CAAA;AAC5B,UAAA;AAAA;AAEJ,MAAA,IAAI,CAAC,aAAA,IAAiB,CAAA,GAAI,MAAA,EAAQ;AAChC,QAAA,MAAA,GAAS,CAAA;AACT,QAAA,aAAA,GAAgB,IAAA;AAAA,MAClB;AAAA,IACF;AACA,IAAA,EAAA,CAAG,GAAA,CAAI,GAAG,MAAM,CAAA;AAChB,IAAA,EAAA,CAAG,GAAA,CAAI,CAAA,EAAG,MAAA,GAAS,CAAC,CAAA;AAAA,EACtB;AAGA,EAAA,MAAM,MAAM,GAAA,CAAI,iBAAA;AAChB,EAAA,MAAM,QAAA,uBAAe,GAAA,EAA0B;AAC/C,EAAA,MAAM,SAAA,GAAY,MAAM,MAAA,CAAO,CAAC,MAAM,CAAA,KAAM,KAAA,IAAS,MAAM,MAAM,CAAA;AACjE,EAAA,IAAI,aAAA,GAAgB,KAAA;AACpB,EAAA,KAAA,MAAW,MAAM,SAAA,EAAW;AAC1B,IAAA,MAAM,KAAA,GAAQ4B,OAAM,EAAA,CAAG,GAAA,CAAI,EAAE,CAAA,GAAK,EAAA,CAAG,GAAA,CAAI,EAAE,CAAE,CAAA;AAC7C,IAAA,IAAI,KAAA,GAAQ,OAAO,aAAA,GAAgB,IAAA;AACnC,IAAA,QAAA,CAAS,IAAI,EAAA,EAAI;AAAA,MACf,EAAA,EAAIA,MAAAA,CAAM,EAAA,CAAG,GAAA,CAAI,EAAE,CAAE,CAAA;AAAA,MACrB,EAAA,EAAIA,MAAAA,CAAM,EAAA,CAAG,GAAA,CAAI,EAAE,CAAE,CAAA;AAAA,MACrB,EAAA,EAAIA,MAAAA,CAAM,EAAA,CAAG,GAAA,CAAI,EAAE,CAAE,CAAA;AAAA,MACrB,EAAA,EAAIA,MAAAA,CAAM,EAAA,CAAG,GAAA,CAAI,EAAE,CAAE,CAAA;AAAA,MACrB,KAAA;AAAA,MACA,QAAA,EAAU,SAAS,GAAA,GAAM;AAAA,KAC1B,CAAA;AAAA,EACH;AAGA,EAAA,MAAM,YAAA,GAAe,mBAAA,CAAoB,GAAA,EAAK,CAAA,EAAG,QAAQ,CAAA;AACzD,EAAA,MAAM,aAAA,GAAgB,SAAA,CAAU,MAAA,CAAO,CAAC,EAAA,KAAO,SAAS,GAAA,CAAI,EAAE,CAAA,CAAG,QAAQ,CAAA,CAAE,MAAA;AAG3E,EAAA,IAAI,eAAA;AACJ,EAAA,IAAI,aAAA;AACJ,EAAA,MAAM,WAAA,GAAc,IAAI,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,aAAa,MAAS,CAAA;AAClE,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,IAAI,GAAA,GAAM,CAAA;AACV,IAAA,KAAA,MAAW,CAAA,IAAK,IAAI,KAAA,EAAO;AACzB,MAAA,IAAI,CAAA,CAAE,QAAA,KAAa,MAAA,IAAa,QAAA,CAAS,GAAA,CAAI,EAAE,EAAE,CAAA,CAAG,QAAA,EAAU,GAAA,IAAO,CAAA,CAAE,QAAA;AAAA,IACzE;AACA,IAAA,eAAA,GAAkBA,OAAM,GAAG,CAAA;AAC3B,IAAA,aAAA,GAAgBA,MAAAA,CAAM,IAAA,CAAK,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,EACtC;AAEA,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAA,CAAE,IAAA,CAAK,MAAA,EAAQ,CAAC,CAAA;AAEhE,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,GAAA,CAAI,QAAA,CAAS,IAAA;AAAA,MACX;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAA6B;AAAA,IACjC,QAAA;AAAA,IACA,KAAA,EAAO,SAAA;AAAA,IACP,eAAA,EAAiBA,OAAM,eAAe,CAAA;AAAA,IACtC,YAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,IAAI,eAAA,KAAoB,MAAA,EAAW,MAAA,CAAO,eAAA,GAAkB,eAAA;AAC5D,EAAA,IAAI,aAAA,KAAkB,MAAA,EAAW,MAAA,CAAO,aAAA,GAAgB,aAAA;AACxD,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,mBAAA,CACP,GAAA,EACA,CAAA,EACA,QAAA,EACU;AACV,EAAA,MAAM,aAAa,CAAC,EAAA,KAAwB,SAAS,GAAA,CAAI,EAAE,GAAG,QAAA,IAAY,KAAA;AAC1E,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAsB;AAC3C,EAAA,MAAM,eAAA,uBAAsB,GAAA,EAAqB;AACjD,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,KAAA,EAAO,QAAA,CAAS,IAAI,CAAA,CAAE,EAAA,EAAI,EAAE,CAAA;AAChD,EAAA,KAAA,MAAW,CAAA,IAAK,EAAE,KAAA,EAAO;AACvB,IAAA,IAAI,CAAA,CAAE,IAAA,KAAS,KAAA,IAAS,CAAA,CAAE,IAAA,KAAS,MAAA,IAAU,CAAA,CAAE,EAAA,KAAO,KAAA,IAAS,CAAA,CAAE,EAAA,KAAO,MAAA,EAAQ;AAChF,IAAA,QAAA,CAAS,IAAI,CAAA,CAAE,IAAI,CAAA,CAAG,IAAA,CAAK,EAAE,EAAE,CAAA;AAC/B,IAAA,IAAI,UAAA,CAAW,CAAA,CAAE,IAAI,CAAA,IAAK,UAAA,CAAW,CAAA,CAAE,EAAE,CAAA,EAAG,eAAA,CAAgB,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,IAAI,CAAA;AAAA,EAC5E;AAEA,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,EAAE,CAAA,CAAE,MAAA,CAAO,UAAU,CAAA;AAC1D,EAAA,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,CAAG,EAAA,GAAK,QAAA,CAAS,GAAA,CAAI,CAAC,EAAG,EAAE,CAAA;AAC9D,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,CAAC,EAAA,KAAO,CAAC,eAAA,CAAgB,GAAA,CAAI,EAAE,CAAC,CAAA,IAAK,KAAA,CAAM,CAAC,CAAA;AACrE,EAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAC;AAEpB,EAAA,MAAMnC,QAAiB,EAAC;AACxB,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,IAAI,GAAA,GAA0B,KAAA;AAC9B,EAAA,OAAO,GAAA,IAAO,CAAC,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG;AAC5B,IAAAA,KAAAA,CAAK,KAAK,GAAG,CAAA;AACb,IAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AACZ,IAAA,MAAM,KAAA,GAAA,CAAmB,SAAS,GAAA,CAAI,GAAG,KAAK,EAAC,EAAG,OAAO,UAAU,CAAA;AACnE,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AAExB,IAAA,MAAM,EAAA,GAAK,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA,CAAG,EAAA;AAC9B,IAAA,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,EAAW,CAAA,KAAc;AACnC,MAAA,MAAM,EAAA,GAAK,KAAK,GAAA,CAAI,QAAA,CAAS,IAAI,CAAC,CAAA,CAAG,KAAK,EAAE,CAAA;AAC5C,MAAA,MAAM,EAAA,GAAK,KAAK,GAAA,CAAI,QAAA,CAAS,IAAI,CAAC,CAAA,CAAG,KAAK,EAAE,CAAA;AAC5C,MAAA,IAAI,EAAA,KAAO,EAAA,EAAI,OAAO,EAAA,GAAK,EAAA;AAC3B,MAAA,OAAO,QAAA,CAAS,IAAI,CAAC,CAAA,CAAG,KAAK,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,CAAG,EAAA;AAAA,IAChD,CAAC,CAAA;AACD,IAAA,GAAA,GAAM,MAAM,CAAC,CAAA;AAAA,EACf;AACA,EAAA,OAAOA,KAAAA;AACT;AAGA,SAASmC,OAAM,CAAA,EAAmB;AAChC,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAG,CAAA,GAAI,GAAA;AAC/B;;;ACrRA,IAAM,GAAA,GAAM;AAAA,EACV,CAAA,EAAG,EAAA;AAAA,EACH,GAAA,EAAK,GAAA;AAAA,EACL,IAAA,EAAM,EAAA;AAAA,EACN,GAAA,EAAK,EAAA;AAAA,EACL,OAAA,EAAS,EAAA;AAAA,EACT,QAAA,EAAU;AACZ,CAAA;AAWO,SAAS,SAAA,CAAU,KAAc,QAAA,EAAiD;AACvF,EAAA,MAAM,KAAA,GAAQ,QAAA,IAAY,YAAA,CAAa,GAAG,CAAA;AAG1C,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,MAAM,WAAW,MAAc,OAAA,EAAA;AAC/B,EAAA,MAAMC,SAAQ,QAAA,EAAS;AACvB,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAoB;AACrC,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,KAAA,EAAO,IAAA,CAAK,IAAI,CAAA,CAAE,EAAA,EAAI,UAAU,CAAA;AAEpD,EAAA,MAAM,OAAiB,EAAC;AACxB,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAoB;AAC3C,EAAA,IAAI,KAAA,GAAQ,KAAA;AAEZ,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,KAAA,EAAO;AACzB,IAAA,MAAM,QAAQ,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AACtC,IAAA,KAAA,MAAW,CAAA,IAAK,CAAA,CAAE,IAAA,EAAM,IAAI,CAAA,CAAE,SAAS,IAAA,IAAQ,CAAA,CAAE,GAAA,KAAQ,CAAA,EAAG,KAAA,GAAQ,IAAA;AACpE,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,MAAA,IAAA,GAAOA,MAAAA;AAAA,IACT,CAAA,MAAA,IAAW,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AAC7B,MAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,IAC1B,CAAA,MAAO;AACL,MAAA,MAAM,GAAA,GAAM,CAAC,GAAG,KAAK,EAAE,IAAA,EAAK,CAAE,KAAK,GAAG,CAAA;AACtC,MAAA,MAAM,MAAA,GAAS,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA;AACjC,MAAA,IAAI,WAAW,MAAA,EAAW;AACxB,QAAA,IAAA,GAAO,MAAA;AAAA,MACT,CAAA,MAAO;AACL,QAAA,MAAM,IAAI,QAAA,EAAS;AACnB,QAAA,KAAA,MAAW,KAAK,KAAA,EAAO,IAAA,CAAK,IAAA,CAAK,EAAE,MAAM,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAI,IAAI,CAAA,EAAG,QAAA,EAAU,CAAA,EAAG,KAAA,EAAO,MAAM,CAAA;AACxF,QAAA,UAAA,CAAW,GAAA,CAAI,KAAK,CAAC,CAAA;AACrB,QAAA,IAAA,GAAO,CAAA;AAAA,MACT;AAAA,IACF;AACA,IAAA,IAAA,CAAK,IAAA,CAAK;AAAA,MACR,IAAA,EAAM,IAAA;AAAA,MACN,EAAA,EAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA;AAAA,MACjB,QAAQ,CAAA,CAAE,EAAA;AAAA,MACV,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,UAAU,CAAA,CAAE,QAAA;AAAA,MACZ,KAAA,EAAO;AAAA,KACR,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,GAAA,CAAI,QAAA,CAAS,IAAA;AAAA,MACX;AAAA,KACF;AAAA,EACF;AAGA,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAY;AAC/B,EAAA,KAAA,MAAW,CAAA,IAAK,IAAA,EAAM,MAAA,CAAO,GAAA,CAAI,EAAE,IAAI,CAAA;AACvC,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,EAAS,CAAA,EAAA,EAAK,IAAI,CAAC,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,EAAG,KAAA,CAAM,KAAK,CAAC,CAAA;AAClE,EAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,IAAA,MAAM,MAAM,QAAA,EAAS;AACrB,IAAA,KAAA,MAAW,CAAA,IAAK,KAAA,EAAO,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA,EAAG,EAAA,EAAI,GAAA,EAAK,QAAA,EAAU,CAAA,EAAG,KAAA,EAAO,MAAM,CAAA;AAAA,EACjF;AAGA,EAAA,MAAM,MAAA,GAAqB,MAAM,IAAA,CAAK,EAAE,QAAQ,OAAA,EAAQ,EAAG,MAAM,EAAE,CAAA;AACnE,EAAA,MAAM,KAAA,GAAoB,MAAM,IAAA,CAAK,EAAE,QAAQ,OAAA,EAAQ,EAAG,MAAM,EAAE,CAAA;AAClE,EAAA,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM;AACrB,IAAA,MAAA,CAAO,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA;AACrB,IAAA,KAAA,CAAM,CAAA,CAAE,EAAE,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA;AAAA,EACpB,CAAC,CAAA;AACD,EAAA,MAAM,QAAQ,IAAI,KAAA,CAAM,OAAO,CAAA,CAAE,KAAK,CAAC,CAAA;AACvC,EAAA,KAAA,MAAW,CAAA,IAAK,IAAA,EAAM,KAAA,CAAM,CAAA,CAAE,EAAE,CAAA,EAAA;AAChC,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,EAAS,CAAA,EAAA,EAAK,IAAI,KAAA,CAAM,CAAC,CAAA,KAAM,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA;AAClE,EAAA,MAAM,OAAiB,EAAC;AACxB,EAAA,MAAM,OAAO,IAAI,KAAA,CAAM,OAAO,CAAA,CAAE,KAAK,CAAC,CAAA;AACtC,EAAA,MAAM,CAAA,GAAI,CAAC,GAAG,KAAK,CAAA;AACnB,EAAA,OAAO,EAAE,MAAA,EAAQ;AACf,IAAA,MAAM,CAAA,GAAI,EAAE,KAAA,EAAM;AAClB,IAAA,IAAA,CAAK,KAAK,CAAC,CAAA;AACX,IAAA,KAAA,MAAW,EAAA,IAAM,MAAA,CAAO,CAAC,CAAA,EAAG;AAC1B,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,EAAE,CAAA,CAAE,EAAA;AACpB,MAAA,IAAA,CAAK,EAAE,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,EAAG,IAAA,CAAK,CAAC,CAAA,GAAI,CAAC,CAAA;AACzC,MAAA,IAAI,EAAE,KAAA,CAAM,EAAE,MAAM,CAAA,EAAG,CAAA,CAAE,KAAK,EAAE,CAAA;AAAA,IAClC;AAAA,EACF;AAGA,EAAA,MAAM,KAAK,IAAI,KAAA,CAAM,OAAO,CAAA,CAAE,KAAK,CAAC,CAAA;AACpC,EAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,IAAA,KAAA,MAAW,EAAA,IAAM,KAAA,CAAM,CAAC,CAAA,EAAG;AACzB,MAAA,MAAM,CAAA,GAAI,KAAK,EAAE,CAAA;AACjB,MAAA,EAAA,CAAG,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAA,CAAE,IAAI,CAAA,GAAI,CAAA,CAAE,QAAQ,CAAA;AAAA,IACjD;AAAA,EACF;AACA,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAG,EAAE,CAAA;AAC3B,EAAA,MAAM,KAAK,IAAI,KAAA,CAAM,OAAO,CAAA,CAAE,KAAK,CAAC,CAAA;AACpC,EAAA,KAAA,IAAS,IAAI,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACzC,IAAA,MAAM,CAAA,GAAI,KAAK,CAAC,CAAA;AAChB,IAAA,IAAI,MAAA,CAAO,CAAC,CAAA,CAAE,MAAA,KAAW,CAAA,EAAG;AAC1B,MAAA,EAAA,CAAG,CAAC,CAAA,GAAI,EAAA,CAAG,CAAC,CAAA;AAAA,IACd,CAAA,MAAO;AACL,MAAA,IAAI,CAAA,GAAI,QAAA;AACR,MAAA,KAAA,MAAW,EAAA,IAAM,MAAA,CAAO,CAAC,CAAA,EAAG;AAC1B,QAAA,MAAM,CAAA,GAAI,KAAK,EAAE,CAAA;AACjB,QAAA,CAAA,GAAI,IAAA,CAAK,IAAI,CAAA,EAAG,EAAA,CAAG,EAAE,EAAE,CAAA,GAAI,EAAE,QAAQ,CAAA;AAAA,MACvC;AACA,MAAA,EAAA,CAAG,CAAC,CAAA,GAAI,CAAA;AAAA,IACV;AAAA,EACF;AACA,EAAA,MAAM,GAAA,GAAM,IAAI,iBAAA,GAAoB,IAAA;AACpC,EAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAAuB,IAAA,CAAK,GAAA,CAAI,EAAA,CAAG,CAAC,CAAA,GAAI,EAAA,CAAG,CAAC,CAAC,CAAA,IAAK,GAAA;AAGzE,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAG,IAAI,CAAA;AACnC,EAAA,MAAM,MAAA,GAAqB,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,UAAU,CAAA,EAAE,EAAG,MAAM,EAAE,CAAA;AACvE,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,EAAS,CAAA,EAAA,EAAK,MAAA,CAAO,IAAA,CAAK,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA;AACxD,EAAA,MAAM,MAAM,IAAI,KAAA,CAAM,OAAO,CAAA,CAAE,KAAK,CAAC,CAAA;AACrC,EAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,KAAU,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAO,GAAA,CAAI,CAAC,CAAA,GAAI,CAAE,CAAC,CAAA;AAC/D,EAAA,MAAM,UAAA,GAAa,CAAC,CAAA,KAAwB,KAAA,CAAM,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,EAAA,KAAO,IAAA,CAAK,EAAE,CAAA,CAAE,IAAI,CAAA;AAC9E,EAAA,MAAM,UAAA,GAAa,CAAC,CAAA,KAAwB,MAAA,CAAO,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,EAAA,KAAO,IAAA,CAAK,EAAE,CAAA,CAAE,EAAE,CAAA;AAC7E,EAAA,KAAA,IAAS,IAAA,GAAO,CAAA,EAAG,IAAA,GAAO,CAAA,EAAG,IAAA,EAAA,EAAQ;AACnC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,OAAA,EAAS,CAAA,EAAA,EAAK;AACjC,MAAA,MAAA,CAAO,CAAC,CAAA,GAAI,UAAA,CAAW,OAAO,CAAC,CAAA,EAAG,YAAY,GAAG,CAAA;AACjD,MAAA,OAAA,CAAQ,QAAQ,GAAG,CAAA;AAAA,IACrB;AACA,IAAA,KAAA,IAAS,CAAA,GAAI,OAAA,GAAU,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACrC,MAAA,MAAA,CAAO,CAAC,CAAA,GAAI,UAAA,CAAW,OAAO,CAAC,CAAA,EAAG,YAAY,GAAG,CAAA;AACjD,MAAA,OAAA,CAAQ,QAAQ,GAAG,CAAA;AAAA,IACrB;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,CAAA;AACzC,EAAA,MAAM,IAAA,GAAO,IAAI,GAAA,GAAM,MAAA;AACvB,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAG,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,MAAM,CAAC,CAAA;AAC1D,EAAA,MAAM,YAAY,OAAA,GAAU,CAAA,IAAK,GAAA,CAAI,IAAA,GAAO,IAAI,GAAA,CAAI,CAAA;AAEpD,EAAA,MAAM,KAAK,IAAI,KAAA,CAAM,OAAO,CAAA,CAAE,KAAK,CAAC,CAAA;AACpC,EAAA,MAAM,KAAK,IAAI,KAAA,CAAM,OAAO,CAAA,CAAE,KAAK,CAAC,CAAA;AACpC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,OAAA,EAAS,CAAA,EAAA,EAAK;AACjC,IAAA,MAAM,KAAA,GAAQ,OAAO,CAAC,CAAA;AACtB,IAAA,MAAM,IAAA,GAAA,CAAQ,KAAA,CAAM,MAAA,GAAS,CAAA,IAAK,GAAA,CAAI,IAAA;AACtC,IAAA,MAAM,EAAA,GAAK,OAAO,GAAA,CAAI,CAAA,GAAA,CAAK,WAAW,CAAA,GAAI,GAAA,CAAI,IAAI,IAAA,IAAQ,CAAA;AAC1D,IAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM;AACtB,MAAA,EAAA,CAAG,CAAC,CAAA,GAAI,GAAA,CAAI,MAAM,GAAA,CAAI,CAAA,GAAI,IAAI,GAAA,CAAI,GAAA;AAClC,MAAA,EAAA,CAAG,CAAC,CAAA,GAAI,EAAA,GAAK,CAAA,GAAI,GAAA,CAAI,IAAA;AAAA,IACvB,CAAC,CAAA;AAAA,EACH;AAGA,EAAA,MAAM,OAAA,GAAU,CAAC,GAAG,KAAA,CAAM,OAAO,EAAE,IAAA,EAAM,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,MAAM,IAAA,CAAK,CAAC,CAAA,GAAI,IAAA,CAAK,CAAC,CAAA,IAAK,GAAG,CAAC,CAAA,GAAI,EAAA,CAAG,CAAC,CAAC,CAAA;AAC5F,EAAA,MAAM,YAAY,IAAI,KAAA,CAAM,OAAO,CAAA,CAAE,KAAK,CAAC,CAAA;AAC3C,EAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAO,UAAU,CAAC,CAAA,GAAI,IAAI,CAAE,CAAA;AAEhD,EAAA,MAAM,MAAA,GAAqB,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IAC7C,EAAA,EAAI,UAAU,CAAC,CAAA;AAAA,IACf,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,IACP,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,IACP,GAAG,GAAA,CAAI,CAAA;AAAA,IACP,EAAA,EAAID,MAAAA,CAAM,EAAA,CAAG,CAAC,CAAC,CAAA;AAAA,IACf,EAAA,EAAIA,MAAAA,CAAM,EAAA,CAAG,CAAC,CAAC,CAAA;AAAA,IACf,QAAA,EAAU,cAAc,CAAC;AAAA,GAC3B,CAAE,CAAA;AAEF,EAAA,MAAM,OAAA,GAAoB,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM;AACxC,IAAA,MAAM,QAAA,GAAW,CAAA,CAAE,KAAA,GACf,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,IAAK,aAAA,CAAc,CAAA,CAAE,EAAE,CAAA,IAAK,IAAA,CAAK,IAAI,EAAA,CAAG,CAAA,CAAE,EAAE,CAAA,GAAI,EAAA,CAAG,CAAA,CAAE,IAAI,CAAA,GAAI,CAAA,CAAE,QAAQ,CAAA,IAAK,GAAA,GAChG,KAAA,CAAM,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,MAAO,CAAA,CAAG,QAAA;AACnC,IAAA,MAAM,MAAM,WAAA,CAAY,EAAA,CAAG,EAAE,IAAI,CAAA,EAAG,GAAG,CAAA,CAAE,IAAI,GAAG,EAAA,CAAG,CAAA,CAAE,EAAE,CAAA,EAAG,EAAA,CAAG,EAAE,EAAE,CAAA,EAAG,IAAI,CAAC,CAAA;AACzE,IAAA,MAAM,GAAA,GAAc;AAAA,MAClB,IAAA,EAAM,SAAA,CAAU,CAAA,CAAE,IAAI,CAAA;AAAA,MACtB,EAAA,EAAI,SAAA,CAAU,CAAA,CAAE,EAAE,CAAA;AAAA,MAClB,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,QAAA;AAAA,MACA,GAAG,GAAA,CAAI,CAAA;AAAA,MACP,QAAQ,GAAA,CAAI,EAAA;AAAA,MACZ,QAAQ,GAAA,CAAI;AAAA,KACd;AACA,IAAA,IAAI,CAAA,CAAE,MAAA,KAAW,MAAA,EAAW,GAAA,CAAI,SAAS,CAAA,CAAE,MAAA;AAC3C,IAAA,IAAI,CAAA,CAAE,KAAA,KAAU,MAAA,EAAW,GAAA,CAAI,QAAQ,CAAA,CAAE,KAAA;AACzC,IAAA,IAAI,CAAC,CAAA,CAAE,KAAA,EAAO,GAAA,CAAI,WAAW,CAAA,CAAE,QAAA;AAC/B,IAAA,OAAO,GAAA;AAAA,EACT,CAAC,CAAA;AAED,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,GAAA,GAAM,GAAA,CAAI,CAAA,GAAI,UAAU,GAAA,CAAI,GAAA,GAAM,GAAA,CAAI,CAAA,GAAI,GAAA,CAAI,GAAA;AAChE,EAAA,MAAM,OAAA,GAAU,OAAO,QAAA,GAAW,EAAA;AAClC,EAAA,MAAM,MAAA,GAAS,UAAU,GAAA,CAAI,QAAA;AAE7B,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA;AAAA,IACtB,MAAA,EAAQ,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA;AAAA,IACxB,OAAO,GAAA,CAAI,KAAA;AAAA,IACX,SAAA,EAAW,IAAA;AAAA,IACX,IAAA,EAAM,KAAA;AAAA,IACN,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,OAAO,EAAC;AAAA,IACR,OAAO,EAAC;AAAA,IACR,WAAW,EAAC;AAAA,IACZ,GAAA,EAAK,EAAE,MAAA,EAAQ,IAAA,EAAM,OAAA,EAAQ;AAAA,IAC7B,OAAA,EAAS,eAAA,CAAgB,GAAA,EAAK,KAAK,CAAA;AAAA,IACnC,UAAU,GAAA,CAAI,QAAA;AAAA,IACd;AAAA,GACF;AACF;AAEA,SAAS,OAAA,CAAQ,QAAoB,GAAA,EAAqB;AACxD,EAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,KAAU,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAO,GAAA,CAAI,CAAC,CAAA,GAAI,CAAE,CAAC,CAAA;AACjE;AAEA,SAAS,UAAA,CAAW,KAAA,EAAiB,SAAA,EAAoC,GAAA,EAAyB;AAChG,EAAA,OAAO,KAAA,CACJ,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM;AACb,IAAA,MAAM,EAAA,GAAK,UAAU,CAAC,CAAA;AACtB,IAAA,MAAM,OAAO,EAAA,CAAG,MAAA,GAAS,EAAA,CAAG,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,EAAG,CAAC,IAAI,EAAA,CAAG,MAAA,GAAS,IAAI,CAAC,CAAA;AAC/E,IAAA,OAAO,EAAE,CAAA,EAAG,CAAA,EAAG,IAAA,EAAK;AAAA,EACtB,CAAC,EACA,IAAA,CAAK,CAAC,GAAG,CAAA,KAAO,CAAA,CAAE,IAAA,KAAS,CAAA,CAAE,IAAA,GAAO,CAAA,CAAE,OAAO,CAAA,CAAE,IAAA,GAAO,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAE,EAChE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,CAAC,CAAA;AACnB;AAEA,SAAS,WAAA,CACP,EAAA,EACA,EAAA,EACA,EAAA,EACA,IACA,CAAA,EACuC;AACvC,EAAA,MAAM,KAAK,EAAA,GAAK,EAAA;AAChB,EAAA,MAAM,KAAK,EAAA,GAAK,EAAA;AAChB,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,EAAA,EAAI,EAAE,CAAA,IAAK,CAAA;AAClC,EAAA,MAAM,KAAK,EAAA,GAAK,GAAA;AAChB,EAAA,MAAM,KAAK,EAAA,GAAK,GAAA;AAChB,EAAA,MAAM,EAAA,GAAK,KAAK,EAAA,GAAK,CAAA;AACrB,EAAA,MAAM,EAAA,GAAK,KAAK,EAAA,GAAK,CAAA;AACrB,EAAA,MAAM,EAAA,GAAK,KAAK,EAAA,GAAK,CAAA;AACrB,EAAA,MAAM,EAAA,GAAK,KAAK,EAAA,GAAK,CAAA;AACrB,EAAA,OAAO,EAAE,CAAA,EAAG,CAAA,EAAA,EAAKA,MAAAA,CAAM,EAAE,CAAC,CAAA,CAAA,EAAIA,MAAAA,CAAM,EAAE,CAAC,CAAA,GAAA,EAAMA,MAAAA,CAAM,EAAE,CAAC,CAAA,CAAA,EAAIA,MAAAA,CAAM,EAAE,CAAC,CAAA,CAAA,EAAI,EAAA,EAAA,CAAK,EAAA,GAAK,EAAA,IAAM,CAAA,EAAG,EAAA,EAAA,CAAK,EAAA,GAAK,EAAA,IAAM,CAAA,EAAE;AAC9G;AAEA,SAAS,eAAA,CAAgB,KAAc,KAAA,EAAwD;AAC7F,EAAA,MAAM,OAAA,GAAuC;AAAA,IAC3C,iBAAiB,KAAA,CAAM,eAAA;AAAA,IACvB,SAAA,EAAW,IAAI,KAAA,CAAM,MAAA;AAAA,IACrB,UAAU,KAAA,CAAM,QAAA;AAAA,IAChB,eAAe,KAAA,CAAM,aAAA;AAAA,IACrB,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,cAAc,KAAA,CAAM;AAAA,GACtB;AACA,EAAA,IAAI,KAAA,CAAM,aAAA,KAAkB,MAAA,EAAW,OAAA,CAAQ,gBAAgB,KAAA,CAAM,aAAA;AACrE,EAAA,OAAO,OAAA;AACT;AAEA,SAASA,OAAM,CAAA,EAAmB;AAChC,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAG,CAAA,GAAI,GAAA;AAC/B;;;ACvQO,IAAM,UAAA,GAAa;AAAA,EACxB,KAAA,EAAO,GAAA;AAAA,EACP,KAAA,EAAO,EAAA;AAAA,EACP,IAAA,EAAM,EAAA;AAAA,EACN,KAAA,EAAO,EAAA;AAAA,EACP,KAAA,EAAO,EAAA;AAAA,EACP,GAAA,EAAK,EAAA;AAAA,EACL,OAAA,EAAS,EAAA;AAAA,EACT,QAAA,EAAU,EAAA;AAAA,EACV,MAAA,EAAQ,EAAA;AAAA;AAAA,EAER,QAAA,EAAU,EAAA;AAAA,EACV,WAAA,EAAa,EAAA;AAAA,EACb,QAAA,EAAU,EAAA;AAAA,EACV,OAAA,EAAS,EAAA;AAAA,EACT,MAAA,EAAQ,EAAA;AAAA,EACR,MAAA,EAAQ,EAAA;AAAA;AAAA,EAER,YAAA,EAAc,GAAA;AAAA,EACd,QAAA,EAAU;AACZ,CAAA;AAEA,SAAS,WAAW,IAAA,EAAwB;AAC1C,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,MAAA;AACH,MAAA,OAAO,GAAA;AAAA,IACT,KAAK,OAAA;AACH,MAAA,OAAO,GAAA;AAAA,IACT,KAAK,OAAA;AACH,MAAA,OAAO,GAAA;AAAA,IACT;AACE,MAAA,OAAO,EAAA;AAAA;AAEb;AAEA,SAAS,IAAI,CAAA,EAAmB;AAC9B,EAAA,OAAO,OAAO,UAAA,CAAW,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAC,CAAA;AACxC;AAEA,SAAS,SAAA,CAAU,IAAA,EAAmB,GAAA,EAAa,IAAA,EAA+B;AAChF,EAAA,MAAM,GAAA,GAAM,WAAW,IAAI,CAAA;AAC3B,EAAA,MAAM,OAAA,GAAU,GAAA,KAAQ,CAAA,GAAI,EAAA,GAAK,GAAG,GAAA,GAAM,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,EAAG,GAAA,CAAI,GAAG,CAAC,GAAG,GAAG,CAAA,CAAA;AACvE,EAAA,IAAI,SAAS,IAAA,EAAM,OAAO,QAAQ,CAAA,GAAI,IAAA,GAAO,KAAK,OAAO,CAAA,CAAA;AACzD,EAAA,OAAO,CAAA,EAAG,IAAI,CAAA,EAAG,OAAO,CAAA,CAAA;AAC1B;AAIA,SAAS,YAAY,GAAA,EAA8D;AACjF,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAsB;AACvC,EAAA,KAAA,MAAW,KAAK,GAAA,CAAI,KAAA,OAAY,GAAA,CAAI,CAAA,CAAE,IAAI,CAAC,CAAA;AAC3C,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAoB;AACrC,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAY;AACjC,EAAA,MAAM,OAAA,GAAU,CAAC,EAAA,KAAuB;AACtC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AAC1B,IAAA,IAAI,MAAA,KAAW,QAAW,OAAO,MAAA;AACjC,IAAA,IAAI,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA,EAAG,OAAO,CAAA;AAC7B,IAAA,QAAA,CAAS,IAAI,EAAE,CAAA;AACf,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AACrB,IAAA,IAAI,CAAA,GAAI,CAAA;AACR,IAAA,KAAA,MAAW,GAAA,IAAO,CAAA,CAAE,IAAA,EAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA,GAAI,CAAC,CAAA;AAC/D,IAAA,QAAA,CAAS,OAAO,EAAE,CAAA;AAClB,IAAA,IAAA,CAAK,GAAA,CAAI,IAAI,CAAC,CAAA;AACd,IAAA,OAAO,CAAA;AAAA,EACT,CAAA;AACA,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,KAAA,MAAW,CAAA,IAAK,GAAA,CAAI,KAAA,EAAO,OAAA,GAAU,IAAA,CAAK,IAAI,OAAA,EAAS,OAAA,CAAQ,CAAA,CAAE,EAAE,CAAC,CAAA;AACpE,EAAA,OAAO,EAAE,MAAM,OAAA,EAAQ;AACzB;AAIA,SAAS,WAAA,CACP,GAAA,EACA,QAAA,EACA,IAAA,EACA,OAAA,EACY;AACZ,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAoB;AAC1C,EAAA,GAAA,CAAI,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM,UAAU,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,CAAC,CAAC,CAAA;AAClD,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAsB;AACvC,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAsB;AACvC,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,KAAA,EAAO;AACzB,IAAA,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,EAAE,CAAA;AACjB,IAAA,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,EAAE,CAAA;AAAA,EACnB;AACA,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,KAAA,EAAO;AACzB,IAAA,KAAA,MAAW,GAAA,IAAO,EAAE,IAAA,EAAM;AACxB,MAAA,IAAA,CAAK,IAAI,GAAA,CAAI,IAAI,CAAA,CAAG,IAAA,CAAK,EAAE,EAAE,CAAA;AAC7B,MAAA,IAAA,CAAK,IAAI,CAAA,CAAE,EAAE,CAAA,CAAG,IAAA,CAAK,IAAI,IAAI,CAAA;AAAA,IAC/B;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAAqB,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,UAAU,CAAA,EAAE,EAAG,MAAM,EAAE,CAAA;AACvE,EAAA,KAAA,MAAW,CAAA,IAAK,GAAA,CAAI,KAAA,EAAO,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,EAAE,CAAE,CAAA,CAAE,IAAA,CAAK,CAAA,CAAE,EAAE,CAAA;AAE5D,EAAA,MAAM,OAAO,CAAC,EAAA,KAAwB,SAAS,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA,CAAG,QAAA;AACjE,EAAA,MAAM,KAAK,CAAC,EAAA,KAAuB,SAAS,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA,CAAG,EAAA;AAE9D,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACnB,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,CAAC,CAAA,GAAI,CAAA,GAAI,CAAA;AACzB,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,CAAC,CAAA,GAAI,CAAA,GAAI,CAAA;AACzB,MAAA,IAAI,EAAA,KAAO,EAAA,EAAI,OAAO,EAAA,GAAK,EAAA;AAC3B,MAAA,IAAI,EAAA,KAAO,CAAA,IAAK,EAAA,CAAG,CAAC,CAAA,KAAM,EAAA,CAAG,CAAC,CAAA,EAAG,OAAO,EAAA,CAAG,CAAC,CAAA,GAAI,GAAG,CAAC,CAAA;AACpD,MAAA,OAAO,UAAU,GAAA,CAAI,CAAC,CAAA,GAAK,SAAA,CAAU,IAAI,CAAC,CAAA;AAAA,IAC5C,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAoB;AACpC,EAAA,MAAM,aAAa,MAAY;AAC7B,IAAA,KAAA,MAAW,KAAA,IAAS,MAAA,EAAQ,KAAA,CAAM,OAAA,CAAQ,CAAC,EAAA,EAAI,CAAA,KAAM,GAAA,CAAI,GAAA,CAAI,EAAA,EAAI,CAAC,CAAC,CAAA;AAAA,EACrE,CAAA;AACA,EAAA,UAAA,EAAW;AAEX,EAAA,MAAM,UAAA,GAAa,CAAC,EAAA,EAAY,SAAA,KAAgC;AAC9D,IAAA,IAAI,UAAU,MAAA,KAAW,CAAA,EAAG,OAAO,GAAA,CAAI,IAAI,EAAE,CAAA;AAC7C,IAAA,IAAI,CAAA,GAAI,CAAA;AACR,IAAA,KAAA,MAAW,CAAA,IAAK,SAAA,EAAW,CAAA,IAAK,GAAA,CAAI,IAAI,CAAC,CAAA;AACzC,IAAA,OAAO,IAAI,SAAA,CAAU,MAAA;AAAA,EACvB,CAAA;AAEA,EAAA,KAAA,IAAS,IAAA,GAAO,CAAA,EAAG,IAAA,GAAO,CAAA,EAAG,IAAA,EAAA,EAAQ;AAEnC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,OAAA,EAAS,CAAA,EAAA,EAAK;AACjC,MAAA,MAAA,CAAO,CAAC,CAAA,GAAI,eAAA,CAAgB,OAAO,CAAC,CAAA,EAAG,CAAC,EAAA,KAAO;AAC7C,QAAA,MAAM,KAAK,UAAA,CAAW,EAAA,EAAI,IAAA,CAAK,GAAA,CAAI,EAAE,CAAE,CAAA;AACvC,QAAA,OAAO,IAAA,CAAK,EAAE,CAAA,GAAI,EAAA,GAAK,GAAA,GAAM,EAAA;AAAA,MAC/B,CAAC,CAAA;AACD,MAAA,UAAA,EAAW;AAAA,IACb;AAEA,IAAA,KAAA,IAAS,CAAA,GAAI,OAAA,GAAU,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACrC,MAAA,MAAA,CAAO,CAAC,CAAA,GAAI,eAAA,CAAgB,OAAO,CAAC,CAAA,EAAG,CAAC,EAAA,KAAO;AAC7C,QAAA,MAAM,KAAK,UAAA,CAAW,EAAA,EAAI,IAAA,CAAK,GAAA,CAAI,EAAE,CAAE,CAAA;AACvC,QAAA,OAAO,IAAA,CAAK,EAAE,CAAA,GAAI,EAAA,GAAK,GAAA,GAAM,EAAA;AAAA,MAC/B,CAAC,CAAA;AACD,MAAA,UAAA,EAAW;AAAA,IACb;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,eAAA,CAAgB,KAAe,GAAA,EAAuC;AAC7E,EAAA,OAAO,GAAA,CACJ,GAAA,CAAI,CAAC,EAAA,EAAI,OAAO,EAAE,EAAA,EAAI,CAAA,EAAG,CAAA,EAAG,IAAI,EAAE,CAAA,EAAE,CAAE,CAAA,CACtC,KAAK,CAAC,CAAA,EAAG,CAAA,KAAO,CAAA,CAAE,MAAM,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,EAAE,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAE,CAAA,CACpD,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,EAAE,CAAA;AACpB;AAIA,SAASE,UAAAA,CACP,CAAA,EACA,CAAA,EACA,SAAA,EAC+C;AAC/C,EAAA,IAAI,cAAc,IAAA,EAAM;AACtB,IAAA,MAAMC,GAAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,KAAA,GAAQ,CAAA;AAC3B,IAAA,MAAMC,GAAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,MAAA;AACnB,IAAA,MAAMC,GAAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,KAAA,GAAQ,CAAA;AAC3B,IAAA,MAAMC,MAAK,CAAA,CAAE,CAAA;AACb,IAAA,MAAMC,IAAAA,GAAAA,CAAOH,MAAKE,GAAAA,IAAM,CAAA;AACxB,IAAA,MAAME,KAAI,CAAA,EAAA,EAAKL,GAAE,CAAA,CAAA,EAAIC,GAAE,MAAMD,GAAE,CAAA,CAAA,EAAII,IAAG,CAAA,GAAA,EAAMF,GAAE,CAAA,CAAA,EAAIE,IAAG,CAAA,GAAA,EAAMF,GAAE,IAAIC,GAAE,CAAA,CAAA;AACnE,IAAA,OAAO,EAAE,GAAAE,EAAAA,EAAG,MAAA,EAAA,CAASL,MAAKE,GAAAA,IAAM,CAAA,EAAG,QAAQE,IAAAA,EAAI;AAAA,EACjD;AACA,EAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,KAAA;AACnB,EAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,MAAA,GAAS,CAAA;AAC5B,EAAA,MAAM,KAAK,CAAA,CAAE,CAAA;AACb,EAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,MAAA,GAAS,CAAA;AAC5B,EAAA,MAAM,GAAA,GAAA,CAAO,KAAK,EAAA,IAAM,CAAA;AACxB,EAAA,MAAM,IAAI,CAAA,EAAA,EAAK,EAAE,CAAA,CAAA,EAAI,EAAE,MAAM,GAAG,CAAA,CAAA,EAAI,EAAE,CAAA,GAAA,EAAM,GAAG,CAAA,CAAA,EAAI,EAAE,CAAA,GAAA,EAAM,EAAE,IAAI,EAAE,CAAA,CAAA;AACnE,EAAA,OAAO,EAAE,CAAA,EAAG,MAAA,EAAQ,KAAK,MAAA,EAAA,CAAS,EAAA,GAAK,MAAM,CAAA,EAAE;AACjD;AAIA,SAAS,aAAA,CAAc,KAAc,QAAA,EAAgD;AACnF,EAAA,MAAMf,EAAAA,GAAI,UAAA;AACV,EAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,YAAY,GAAG,CAAA;AACzC,EAAA,MAAM,MAAA,GAAS,WAAA,CAAY,GAAA,EAAK,QAAA,EAAU,MAAM,OAAO,CAAA;AACvD,EAAA,MAAM,MAAM,GAAA,CAAI,SAAA;AAEhB,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAsB;AACvC,EAAA,KAAA,MAAW,KAAK,GAAA,CAAI,KAAA,OAAY,GAAA,CAAI,CAAA,CAAE,IAAI,CAAC,CAAA;AAG3C,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,KAAU;AACtC,IAAA,MAAM,IAAI,KAAA,CAAM,MAAA;AAChB,IAAA,IAAI,CAAA,KAAM,GAAG,OAAO,CAAA;AACpB,IAAA,MAAM,IAAA,GAAO,GAAA,KAAQ,IAAA,GAAOA,EAAAA,CAAE,QAAQA,EAAAA,CAAE,KAAA;AACxC,IAAA,MAAM,GAAA,GAAM,GAAA,KAAQ,IAAA,GAAOA,EAAAA,CAAE,QAAQA,EAAAA,CAAE,KAAA;AACvC,IAAA,OAAO,CAAA,GAAI,IAAA,GAAA,CAAQ,CAAA,GAAI,CAAA,IAAK,GAAA;AAAA,EAC9B,CAAC,CAAA;AACD,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAG,SAAS,CAAA;AAE1C,EAAA,MAAM,eAAe,GAAA,CAAI,aAAA;AACzB,EAAA,MAAM,WAAW,YAAA,GAAeA,EAAAA,CAAE,MAAA,GAAS,CAAA,GAAIA,GAAE,KAAA,GAAQ,CAAA;AAEzD,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,KAAA,GAAQA,EAAAA,CAAE,OAAA,GAAU,CAAA;AAGvC,EAAA,MAAM,aAAA,GAAgB,QAAQ,IAAA,GAAOA,EAAAA,CAAE,MAAM,MAAA,GAAS,QAAA,GAAWA,GAAE,GAAA,GAAM,QAAA;AACzE,EAAA,MAAM,cAAc,GAAA,KAAQ,IAAA,GAAOA,EAAAA,CAAE,GAAA,GAAMA,GAAE,GAAA,GAAM,MAAA;AAEnD,EAAA,MAAM,QAAmB,EAAC;AAC1B,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAqB;AAEzC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,OAAA,EAAS,CAAA,EAAA,EAAK;AACjC,IAAA,MAAM,KAAA,GAAQ,OAAO,CAAC,CAAA;AACtB,IAAA,MAAM,MAAA,GAAS,UAAU,CAAC,CAAA;AAC1B,IAAA,MAAM,UAAA,GAAa,WAAA,GAAA,CAAe,SAAA,GAAY,MAAA,IAAU,CAAA;AACxD,IAAA,IAAI,MAAA,GAAS,UAAA;AACb,IAAA,KAAA,MAAW,MAAM,KAAA,EAAO;AACtB,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AACrB,MAAA,MAAM,QAAA,GAAW,QAAA,CAAS,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AACzC,MAAA,MAAM,CAAA,GAAI,CAAA,CAAE,SAAA,GAAYA,EAAAA,CAAE,OAAOA,EAAAA,CAAE,KAAA;AACnC,MAAA,MAAM,IAAIA,EAAAA,CAAE,KAAA;AACZ,MAAA,IAAI,CAAA;AACJ,MAAA,IAAI,CAAA;AACJ,MAAA,IAAI,QAAQ,IAAA,EAAM;AAEhB,QAAA,MAAM,OAAA,GAAU,aAAA,GAAgB,CAAA,IAAKA,EAAAA,CAAE,QAAQA,EAAAA,CAAE,KAAA,CAAA;AACjD,QAAA,CAAA,GAAI,MAAA,GAAA,CAAUA,EAAAA,CAAE,KAAA,GAAQ,CAAA,IAAK,CAAA;AAC7B,QAAA,CAAA,GAAI,OAAA;AACJ,QAAA,MAAA,IAAUA,EAAAA,CAAE,QAAQA,EAAAA,CAAE,KAAA;AAAA,MACxB,CAAA,MAAO;AACL,QAAA,MAAM,OAAA,GAAU,aAAA,GAAgB,CAAA,IAAKA,EAAAA,CAAE,QAAQA,EAAAA,CAAE,KAAA,CAAA;AACjD,QAAA,CAAA,GAAI,OAAA,GAAA,CAAWA,EAAAA,CAAE,KAAA,GAAQ,CAAA,IAAK,CAAA;AAC9B,QAAA,CAAA,GAAI,MAAA;AACJ,QAAA,MAAA,IAAUA,EAAAA,CAAE,QAAQA,EAAAA,CAAE,KAAA;AAAA,MACxB;AACA,MAAA,MAAM,GAAA,GAAe;AAAA,QACnB,EAAA;AAAA,QACA,IAAA,EAAM,CAAA;AAAA,QACN,QAAA;AAAA,QACA,CAAA;AAAA,QACA,CAAA;AAAA,QACA,KAAA,EAAO,CAAA;AAAA,QACP,MAAA,EAAQ,CAAA;AAAA,QACR,WAAW,CAAA,CAAE,SAAA;AAAA,QACb,IAAA,EAAM;AAAA,OACR;AACA,MAAA,KAAA,CAAM,KAAK,GAAG,CAAA;AACd,MAAA,OAAA,CAAQ,GAAA,CAAI,IAAI,GAAG,CAAA;AAAA,IACrB;AAAA,EACF;AAGA,EAAA,MAAM,QAAoB,EAAC;AAC3B,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,KAAA,EAAO;AACzB,IAAA,KAAA,MAAW,GAAA,IAAO,EAAE,IAAA,EAAM;AACxB,MAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA;AAC9B,MAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA;AAC3B,MAAA,IAAI,CAAC,CAAA,IAAK,CAAC,EAAA,EAAI;AACf,MAAA,MAAM,QAAA,GACJ,QAAA,CAAS,QAAA,CAAS,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA,CAAG,QAAA,IAAY,QAAA,CAAS,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,CAAG,QAAA;AAC5E,MAAA,MAAM,EAAE,GAAG,MAAA,EAAQ,MAAA,KAAWU,UAAAA,CAAU,CAAA,EAAG,IAAI,GAAG,CAAA;AAClD,MAAA,MAAM,IAAA,GAAiB;AAAA,QACrB,MAAM,GAAA,CAAI,IAAA;AAAA,QACV,IAAI,CAAA,CAAE,EAAA;AAAA,QACN,MAAM,GAAA,CAAI,IAAA;AAAA,QACV,KAAK,GAAA,CAAI,GAAA;AAAA,QACT,CAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,MAAM,MAAM,SAAA,CAAU,GAAA,CAAI,MAAM,GAAA,CAAI,GAAA,EAAK,IAAI,IAAI,CAAA;AACjD,MAAA,IAAI,GAAA,OAAU,KAAA,GAAQ,EAAE,MAAM,GAAA,EAAK,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,MAAA,EAAO;AACxD,MAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,IACjB;AAAA,EACF;AAGA,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,IAAI,QAAA,GAAW,CAAA;AACf,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,UAAA,EAAY,GAAA,KAAQ,IAAA,GAAO,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,MAAA,GAAS,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,KAAK,CAAA;AAC/E,IAAA,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,GAAA,KAAQ,IAAA,GAAO,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA;AAAA,EAC7E;AAGA,EAAA,MAAM,YAA4B,EAAC;AACnC,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,MAAM,eAAA,GAAkB,cAAc,SAAA,GAAY,CAAA;AAClD,IAAA,MAAM,YAAA,GAAeV,EAAAA,CAAE,GAAA,GAAMA,EAAAA,CAAE,MAAA;AAC/B,IAAA,MAAM,aAAA,GAAgB,UAAA,GAAaA,EAAAA,CAAE,KAAA,GAAQA,EAAAA,CAAE,MAAA;AAC/C,IAAA,MAAM,KAAA,GAAQ,CAAC,OAAA,KACb,GAAA,KAAQ,OAAO,EAAE,EAAA,EAAI,eAAA,EAAiB,EAAA,EAAI,SAAQ,GAAI,EAAE,EAAA,EAAI,OAAA,EAAS,IAAI,eAAA,EAAgB;AAC3F,IAAA,SAAA,CAAU,IAAA,CAAK,EAAE,EAAA,EAAI,WAAA,EAAa,KAAA,EAAO,OAAA,EAAS,CAAA,EAAGA,EAAAA,CAAE,MAAA,EAAQ,GAAG,KAAA,CAAM,YAAY,GAAG,CAAA;AACvF,IAAA,SAAA,CAAU,IAAA,CAAK,EAAE,EAAA,EAAI,YAAA,EAAc,KAAA,EAAO,QAAA,EAAU,CAAA,EAAGA,EAAAA,CAAE,MAAA,EAAQ,GAAG,KAAA,CAAM,aAAa,GAAG,CAAA;AAG1F,IAAA,MAAM,UAAA,uBAAiB,GAAA,EAAY;AACnC,IAAA,KAAA,MAAW,CAAA,IAAK,GAAA,CAAI,KAAA,EAAO,KAAA,MAAW,GAAA,IAAO,EAAE,IAAA,EAAM,UAAA,CAAW,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA;AAC5E,IAAA,MAAM,SAAA,GAAY,UAAU,CAAC,CAAA;AAC7B,IAAA,MAAM,UAAA,GAAa,UAAU,CAAC,CAAA;AAC9B,IAAA,KAAA,MAAW,CAAA,IAAK,IAAI,KAAA,EAAO;AACzB,MAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA;AAC1B,MAAA,IAAI,CAAA,CAAE,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG;AACvB,QAAA,KAAA,CAAM,IAAA,CAAK,YAAA,CAAa,SAAA,EAAW,CAAA,EAAG,GAAA,EAAK,IAAA,EAAM,QAAA,CAAS,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,EAAE,CAAE,CAAC,CAAA;AAAA,MAChF;AACA,MAAA,IAAI,CAAC,UAAA,CAAW,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,EAAG;AACzB,QAAA,KAAA,CAAM,IAAA,CAAK,YAAA,CAAa,UAAA,EAAY,CAAA,EAAG,GAAA,EAAK,KAAA,EAAO,QAAA,CAAS,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,EAAE,CAAE,CAAC,CAAA;AAAA,MAClF;AAAA,IACF;AACA,IAAA,UAAA,GAAa,gBAAgBA,EAAAA,CAAE,MAAA;AAAA,EACjC;AAEA,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,cAAc,SAAS,CAAA;AAC3D,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA,KAAA,GAAQ,WAAWA,EAAAA,CAAE,GAAA;AACrB,IAAA,OAAA,GAAU,UAAA,GAAa,EAAA;AAAA,EACzB,CAAA,MAAO;AACL,IAAA,KAAA,GAAQ,aAAaA,EAAAA,CAAE,GAAA;AACvB,IAAA,OAAA,GAAU,QAAA,GAAW,EAAA;AAAA,EACvB;AACA,EAAA,MAAM,MAAA,GAAS,UAAUA,EAAAA,CAAE,QAAA;AAE3B,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA;AAAA,IACtB,MAAA,EAAQ,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA;AAAA,IACxB,OAAO,GAAA,CAAI,KAAA;AAAA,IACX,SAAA,EAAW,GAAA;AAAA,IACX,IAAA,EAAM,SAAA;AAAA,IACN,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,KAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAA;AAAA,IACA,OAAA,EAAS,YAAA,CAAa,GAAA,EAAK,QAAQ,CAAA;AAAA,IACnC,UAAU,GAAA,CAAI,QAAA;AAAA,IACd;AAAA,GACF;AACF;AAEA,SAAS,YAAA,CACP,IAAA,EACA,CAAA,EACA,GAAA,EACA,WACA,QAAA,EACU;AACV,EAAA,IAAI,EAAA;AACJ,EAAA,IAAI,EAAA;AACJ,EAAA,IAAI,EAAA;AACJ,EAAA,IAAI,EAAA;AACJ,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,EAAA,GAAK,IAAA,CAAK,EAAA;AACV,MAAA,EAAA,GAAK,IAAA,CAAK,KAAK,IAAA,CAAK,CAAA;AACpB,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,KAAA,GAAQ,CAAA;AACrB,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAA,IACT,CAAA,MAAO;AACL,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,KAAA,GAAQ,CAAA;AACrB,MAAA,EAAA,GAAK,CAAA,CAAE,IAAI,CAAA,CAAE,MAAA;AACb,MAAA,EAAA,GAAK,IAAA,CAAK,EAAA;AACV,MAAA,EAAA,GAAK,IAAA,CAAK,KAAK,IAAA,CAAK,CAAA;AAAA,IACtB;AACA,IAAA,MAAMe,IAAAA,GAAAA,CAAO,KAAK,EAAA,IAAM,CAAA;AACxB,IAAA,OAAO,cAAA,CAAe,MAAM,CAAA,EAAG,SAAA,EAAW,KAAK,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,GAAA,EAAM,EAAE,IAAIA,IAAG,CAAA,GAAA,EAAM,EAAE,CAAA,CAAA,EAAIA,IAAG,MAAM,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,QAAQ,CAAA;AAAA,EACjH;AACA,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,EAAA,GAAK,IAAA,CAAK,KAAK,IAAA,CAAK,CAAA;AACpB,IAAA,EAAA,GAAK,IAAA,CAAK,EAAA;AACV,IAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AACP,IAAA,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,MAAA,GAAS,CAAA;AAAA,EACxB,CAAA,MAAO;AACL,IAAA,EAAA,GAAK,CAAA,CAAE,IAAI,CAAA,CAAE,KAAA;AACb,IAAA,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,MAAA,GAAS,CAAA;AACtB,IAAA,EAAA,GAAK,IAAA,CAAK,KAAK,IAAA,CAAK,CAAA;AACpB,IAAA,EAAA,GAAK,IAAA,CAAK,EAAA;AAAA,EACZ;AACA,EAAA,MAAM,GAAA,GAAA,CAAO,KAAK,EAAA,IAAM,CAAA;AACxB,EAAA,OAAO,cAAA,CAAe,MAAM,CAAA,EAAG,SAAA,EAAW,KAAK,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,GAAA,EAAM,GAAG,IAAI,EAAE,CAAA,GAAA,EAAM,GAAG,CAAA,CAAA,EAAI,EAAE,MAAM,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,QAAQ,CAAA;AACjH;AAEA,SAAS,cAAA,CACP,IAAA,EACA,CAAA,EACA,SAAA,EACA,GACA,QAAA,EACU;AACV,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,SAAA,GAAY,IAAA,CAAK,EAAA,GAAK,CAAA,CAAE,EAAA;AAAA,IAC9B,EAAA,EAAI,SAAA,GAAY,CAAA,CAAE,EAAA,GAAK,IAAA,CAAK,EAAA;AAAA,IAC5B,IAAA,EAAM,IAAA;AAAA,IACN,GAAA,EAAK,CAAA;AAAA,IACL,CAAA;AAAA,IACA,UAAU,QAAA,CAAS;AAAA,GACrB;AACF;AAIA,SAAS,oBAAA,CACP,GAAA,EACA,QAAA,EACA,OAAA,EACA,GAAA,EACY;AACZ,EAAA,MAAM,QAAoB,EAAC;AAC3B,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,KAAA,EAAO;AACzB,IAAA,KAAA,MAAW,GAAA,IAAO,EAAE,IAAA,EAAM;AACxB,MAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA;AAC9B,MAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA;AAC3B,MAAA,IAAI,CAAC,CAAA,IAAK,CAAC,EAAA,EAAI;AACf,MAAA,MAAM,QAAA,GACJ,QAAA,CAAS,QAAA,CAAS,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA,CAAG,QAAA,IAAY,QAAA,CAAS,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,CAAG,QAAA;AAC5E,MAAA,MAAM,EAAE,GAAG,MAAA,EAAQ,MAAA,KAAWL,UAAAA,CAAU,CAAA,EAAG,IAAI,GAAG,CAAA;AAClD,MAAA,MAAM,IAAA,GAAiB,EAAE,IAAA,EAAM,GAAA,CAAI,MAAM,EAAA,EAAI,CAAA,CAAE,EAAA,EAAI,IAAA,EAAM,IAAI,IAAA,EAAM,GAAA,EAAK,GAAA,CAAI,GAAA,EAAK,GAAG,QAAA,EAAS;AAC7F,MAAA,MAAM,MAAM,SAAA,CAAU,GAAA,CAAI,MAAM,GAAA,CAAI,GAAA,EAAK,IAAI,IAAI,CAAA;AACjD,MAAA,IAAI,GAAA,OAAU,KAAA,GAAQ,EAAE,MAAM,GAAA,EAAK,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,MAAA,EAAO;AACxD,MAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,IACjB;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAASO,eAAAA,CAAe,KAAc,QAAA,EAAgD;AACpF,EAAA,MAAMjB,EAAAA,GAAI,UAAA;AACV,EAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,YAAY,GAAG,CAAA;AACzC,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAsB;AACvC,EAAA,KAAA,MAAW,KAAK,GAAA,CAAI,KAAA,OAAY,GAAA,CAAI,CAAA,CAAE,IAAI,CAAC,CAAA;AAE3C,EAAA,MAAM,YAAsB,EAAC;AAC7B,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAoB;AACvC,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,KAAA,EAAO;AACzB,IAAA,MAAM,EAAA,GAAK,EAAE,IAAA,IAAQ,EAAA;AACrB,IAAA,MAAA,CAAO,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,EAAE,CAAA;AACnB,IAAA,IAAI,CAAC,SAAA,CAAU,QAAA,CAAS,EAAE,CAAA,EAAG,SAAA,CAAU,KAAK,EAAE,CAAA;AAAA,EAChD;AAEA,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAoB;AAC1C,EAAA,GAAA,CAAI,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM,UAAU,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,CAAC,CAAC,CAAA;AAClD,EAAA,MAAM,OAAO,CAAC,EAAA,KAAwB,SAAS,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA,CAAG,QAAA;AACjE,EAAA,MAAM,KAAK,CAAC,EAAA,KAAuB,SAAS,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA,CAAG,EAAA;AAG9D,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAsB;AACvC,EAAA,MAAM,MAAM,CAAC,IAAA,EAAc,MAAsB,CAAA,EAAG,IAAI,KAAI,CAAC,CAAA,CAAA;AAC7D,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,KAAA,EAAO;AACzB,IAAA,MAAM,CAAA,GAAI,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,EAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,EAAE,CAAE,CAAA;AAChD,IAAA,IAAI,CAAC,KAAK,GAAA,CAAI,CAAC,GAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,EAAE,CAAA;AAChC,IAAA,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,CAAG,IAAA,CAAK,EAAE,EAAE,CAAA;AAAA,EACxB;AACA,EAAA,KAAA,MAAW,GAAA,IAAO,IAAA,CAAK,MAAA,EAAO,EAAG;AAC/B,IAAA,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACjB,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,CAAC,CAAA,GAAI,CAAA,GAAI,CAAA;AACzB,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,CAAC,CAAA,GAAI,CAAA,GAAI,CAAA;AACzB,MAAA,IAAI,EAAA,KAAO,EAAA,EAAI,OAAO,EAAA,GAAK,EAAA;AAC3B,MAAA,IAAI,EAAA,CAAG,CAAC,CAAA,KAAM,EAAA,CAAG,CAAC,CAAA,EAAG,OAAO,EAAA,CAAG,CAAC,CAAA,GAAI,EAAA,CAAG,CAAC,CAAA;AACxC,MAAA,OAAO,UAAU,GAAA,CAAI,CAAC,CAAA,GAAK,SAAA,CAAU,IAAI,CAAC,CAAA;AAAA,IAC5C,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,KAAA,GAAQA,EAAAA,CAAE,OAAA,GAAU,CAAA;AACvC,EAAA,MAAM,IAAA,GAAOA,GAAE,GAAA,GAAM,MAAA;AACrB,EAAA,MAAM,IAAA,GAAO,CAAC,CAAA,KAAsBA,EAAAA,CAAE,YAAA,GAAeA,GAAE,GAAA,GAAM,CAAA,IAAKA,EAAAA,CAAE,KAAA,GAAQA,EAAAA,CAAE,KAAA,CAAA;AAG9E,EAAA,MAAM,QAAoB,EAAC;AAC3B,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAoB;AACtC,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAoB;AACtC,EAAA,IAAI,MAAA,GAAS,IAAA;AACb,EAAA,SAAA,CAAU,OAAA,CAAQ,CAAC,IAAA,EAAM,CAAA,KAAM;AAC7B,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,OAAA,EAAS,CAAA,EAAA,EAAK;AACjC,MAAA,MAAM,MAAM,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,IAAA,EAAM,CAAC,CAAC,CAAA;AACjC,MAAA,IAAI,KAAK,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,IAAI,MAAM,CAAA;AAAA,IAC7C;AACA,IAAA,MAAM,KAAA,GAAQ,QAAQA,EAAAA,CAAE,KAAA,GAAA,CAAS,QAAQ,CAAA,IAAKA,EAAAA,CAAE,KAAA,GAAQ,CAAA,GAAIA,EAAAA,CAAE,QAAA;AAC9D,IAAA,KAAA,CAAM,GAAA,CAAI,MAAM,MAAM,CAAA;AACtB,IAAA,KAAA,CAAM,GAAA,CAAI,MAAM,KAAK,CAAA;AACrB,IAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,IAAA,EAAM,CAAA,EAAG,MAAA,EAAQ,MAAA,EAAQ,KAAA,EAAO,GAAA,EAAK,CAAA,GAAI,CAAA,KAAM,CAAA,EAAG,CAAA;AACrE,IAAA,MAAA,IAAU,KAAA;AAAA,EACZ,CAAC,CAAA;AACD,EAAA,MAAM,aAAA,GAAgB,MAAA;AAGtB,EAAA,MAAM,QAAmB,EAAC;AAC1B,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAqB;AACzC,EAAA,KAAA,MAAW,QAAQ,SAAA,EAAW;AAC5B,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA;AAC9B,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA;AAC5B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,OAAA,EAAS,CAAA,EAAA,EAAK;AACjC,MAAA,MAAM,MAAM,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,IAAA,EAAM,CAAC,CAAC,CAAA;AACjC,MAAA,IAAI,CAAC,GAAA,EAAK;AACV,MAAA,MAAM,SAAA,GAAY,IAAI,MAAA,GAASA,EAAAA,CAAE,SAAS,GAAA,CAAI,MAAA,GAAS,KAAKA,EAAAA,CAAE,KAAA;AAC9D,MAAA,MAAM,EAAA,GAAK,OAAA,GAAA,CAAW,KAAA,GAAQ,SAAA,IAAa,CAAA;AAC3C,MAAA,GAAA,CAAI,OAAA,CAAQ,CAAC,EAAA,EAAI,GAAA,KAAQ;AACvB,QAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AACrB,QAAA,MAAM,CAAA,GAAI,CAAA,CAAE,SAAA,GAAYA,EAAAA,CAAE,OAAOA,EAAAA,CAAE,KAAA;AACnC,QAAA,MAAM,IAAI,IAAA,CAAK,CAAC,CAAA,GAAA,CAAKA,EAAAA,CAAE,QAAQ,CAAA,IAAK,CAAA;AACpC,QAAA,MAAM,CAAA,GAAI,EAAA,GAAK,GAAA,IAAOA,EAAAA,CAAE,QAAQA,EAAAA,CAAE,KAAA,CAAA;AAClC,QAAA,MAAM,GAAA,GAAe;AAAA,UACnB,EAAA;AAAA,UACA,IAAA,EAAM,CAAA;AAAA,UACN,QAAA,EAAU,QAAA,CAAS,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AAAA,UAClC,CAAA;AAAA,UACA,CAAA;AAAA,UACA,KAAA,EAAO,CAAA;AAAA,UACP,QAAQA,EAAAA,CAAE,KAAA;AAAA,UACV,WAAW,CAAA,CAAE,SAAA;AAAA,UACb,IAAA,EAAM;AAAA,SACR;AACA,QAAA,KAAA,CAAM,KAAK,GAAG,CAAA;AACd,QAAA,OAAA,CAAQ,GAAA,CAAI,IAAI,GAAG,CAAA;AAAA,MACrB,CAAC,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAQ,oBAAA,CAAqB,GAAA,EAAK,QAAA,EAAU,SAAS,IAAI,CAAA;AAC/D,EAAA,MAAM,QAAQ,IAAA,CAAK,OAAO,CAAA,GAAIA,EAAAA,CAAE,QAAQA,EAAAA,CAAE,GAAA;AAC1C,EAAA,MAAM,UAAU,aAAA,GAAgB,EAAA;AAChC,EAAA,MAAM,MAAA,GAAS,UAAUA,EAAAA,CAAE,QAAA;AAE3B,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA;AAAA,IACtB,MAAA,EAAQ,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA;AAAA,IACxB,OAAO,GAAA,CAAI,KAAA;AAAA,IACX,SAAA,EAAW,IAAA;AAAA,IACX,IAAA,EAAM,SAAA;AAAA,IACN,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,KAAA;AAAA,IACA,KAAA;AAAA,IACA,WAAW,EAAC;AAAA,IACZ,KAAA;AAAA,IACA,OAAA,EAAS,YAAA,CAAa,GAAA,EAAK,QAAQ,CAAA;AAAA,IACnC,UAAU,GAAA,CAAI,QAAA;AAAA,IACd;AAAA,GACF;AACF;AAIA,SAAS,gBAAA,CAAiB,KAAc,QAAA,EAAgD;AACtF,EAAA,MAAMA,EAAAA,GAAI,UAAA;AACV,EAAA,MAAM,CAAA,GAAI,SAAS,eAAA,IAAmB,CAAA;AAEtC,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,CAAI,EAAA,EAAI,KAAK,GAAA,CAAI,EAAA,EAAI,IAAA,GAAO,CAAC,CAAC,CAAA;AACrD,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,KAAA,GAAQA,EAAAA,CAAE,OAAA,GAAU,CAAA;AACvC,EAAA,MAAM,UAAUA,EAAAA,CAAE,GAAA;AAClB,EAAA,MAAM,MAAA,GAASA,EAAAA,CAAE,GAAA,GAAM,MAAA,GAAS,EAAA;AAQhC,EAAA,MAAM,SAAA,GAAwB,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM;AACjD,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,QAAA,CAAS,GAAA,CAAI,EAAE,EAAE,CAAA;AACpC,IAAA,IAAI,EAAE,SAAA,EAAW;AACf,MAAA,MAAM,EAAA,GAAK,OAAA,GAAU,CAAA,CAAE,EAAA,GAAK,SAAA;AAC5B,MAAA,OAAO,EAAE,EAAA,EAAI,CAAA,CAAE,EAAA,EAAI,CAAA,EAAG,EAAA,GAAKA,EAAAA,CAAE,OAAA,GAAU,CAAA,EAAG,CAAA,EAAGA,EAAAA,CAAE,OAAA,EAAQ;AAAA,IACzD;AACA,IAAA,MAAM,CAAA,GAAI,OAAA,GAAU,CAAA,CAAE,EAAA,GAAK,SAAA;AAC3B,IAAA,MAAM,IAAI,IAAA,CAAK,GAAA,CAAIA,GAAE,QAAA,EAAU,CAAA,CAAE,WAAW,SAAS,CAAA;AACrD,IAAA,OAAO,EAAE,EAAA,EAAI,CAAA,CAAE,EAAA,EAAI,GAAG,CAAA,EAAE;AAAA,EAC1B,CAAC,CAAA;AACD,EAAA,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,IAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA;AAG/C,EAAA,MAAM,YAAsB,EAAC;AAC7B,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAoB;AACvC,EAAA,KAAA,MAAW,MAAM,SAAA,EAAW;AAC1B,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,SAAA,CAAU,QAAQ,CAAA,EAAA,EAAK;AACzC,MAAA,IAAI,GAAG,CAAA,IAAK,SAAA,CAAU,CAAC,CAAA,GAAIA,GAAE,MAAA,EAAQ;AACnC,QAAA,MAAA,GAAS,CAAA;AACT,QAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAI,WAAW,EAAA,EAAI;AACjB,MAAA,MAAA,GAAS,SAAA,CAAU,MAAA;AACnB,MAAA,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,IAClB;AACA,IAAA,SAAA,CAAU,MAAM,CAAA,GAAI,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,CAAA;AAC9B,IAAA,MAAA,CAAO,GAAA,CAAI,EAAA,CAAG,EAAA,EAAI,MAAM,CAAA;AAAA,EAC1B;AACA,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,UAAU,MAAM,CAAA;AAE9C,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAsB;AACvC,EAAA,KAAA,MAAW,KAAK,GAAA,CAAI,KAAA,OAAY,GAAA,CAAI,CAAA,CAAE,IAAI,CAAC,CAAA;AAC3C,EAAA,MAAM,YAAA,uBAAmB,GAAA,EAAsB;AAC/C,EAAA,KAAA,MAAW,MAAM,SAAA,EAAW,YAAA,CAAa,GAAA,CAAI,EAAA,CAAG,IAAI,EAAE,CAAA;AAEtD,EAAA,MAAM,QAAmB,EAAC;AAC1B,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAqB;AACzC,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,KAAA,EAAO;AACzB,IAAA,MAAM,EAAA,GAAK,YAAA,CAAa,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA;AAChC,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA;AAC5B,IAAA,MAAM,CAAA,GAAI,MAAA,GAAS,IAAA,IAAQA,EAAAA,CAAE,WAAWA,EAAAA,CAAE,WAAA,CAAA;AAC1C,IAAA,MAAM,GAAA,GAAe;AAAA,MACnB,IAAI,CAAA,CAAE,EAAA;AAAA,MACN,IAAA,EAAM,CAAA;AAAA,MACN,QAAA,EAAU,QAAA,CAAS,QAAA,CAAS,GAAA,CAAI,EAAE,EAAE,CAAA;AAAA,MACpC,GAAG,EAAA,CAAG,CAAA;AAAA,MACN,CAAA;AAAA,MACA,OAAO,EAAA,CAAG,CAAA;AAAA,MACV,QAAQA,EAAAA,CAAE,QAAA;AAAA,MACV,WAAW,CAAA,CAAE,SAAA;AAAA,MACb,IAAA,EAAM;AAAA,KACR;AACA,IAAA,KAAA,CAAM,KAAK,GAAG,CAAA;AACd,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,GAAG,CAAA;AAAA,EACvB;AAEA,EAAA,MAAM,QAAoB,EAAC;AAC3B,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,KAAA,EAAO;AACzB,IAAA,KAAA,MAAW,GAAA,IAAO,EAAE,IAAA,EAAM;AACxB,MAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA;AAC9B,MAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA;AAC3B,MAAA,IAAI,CAAC,CAAA,IAAK,CAAC,EAAA,EAAI;AACf,MAAA,MAAM,QAAA,GACJ,QAAA,CAAS,QAAA,CAAS,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA,CAAG,QAAA,IAAY,QAAA,CAAS,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,CAAG,QAAA;AAC5E,MAAA,MAAM,EAAE,GAAG,MAAA,EAAQ,MAAA,KAAWU,UAAAA,CAAU,CAAA,EAAG,IAAI,IAAI,CAAA;AACnD,MAAA,MAAM,IAAA,GAAiB;AAAA,QACrB,MAAM,GAAA,CAAI,IAAA;AAAA,QACV,IAAI,CAAA,CAAE,EAAA;AAAA,QACN,MAAM,GAAA,CAAI,IAAA;AAAA,QACV,KAAK,GAAA,CAAI,GAAA;AAAA,QACT,CAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,MAAM,MAAM,SAAA,CAAU,GAAA,CAAI,MAAM,GAAA,CAAI,GAAA,EAAK,IAAI,IAAI,CAAA;AACjD,MAAA,IAAI,GAAA,OAAU,KAAA,GAAQ,EAAE,MAAM,GAAA,EAAK,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,MAAA,EAAO;AACxD,MAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,IACjB;AAAA,EACF;AAEA,EAAA,MAAM,gBAAgB,MAAA,GAAS,SAAA,GAAYV,GAAE,QAAA,GAAA,CAAY,SAAA,GAAY,KAAKA,EAAAA,CAAE,WAAA;AAC5E,EAAA,MAAM,eAAe,aAAA,GAAgB,EAAA;AACrC,EAAA,MAAM,OAAA,GAAU,UAAU,CAAA,GAAI,SAAA;AAC9B,EAAA,IAAI,QAAA,GAAW,OAAA;AACf,EAAA,KAAA,MAAW,CAAA,IAAK,OAAO,QAAA,GAAW,IAAA,CAAK,IAAI,QAAA,EAAU,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,KAAK,CAAA;AAGlE,EAAA,MAAM,SAAA,GAAY,WAAW,CAAC,CAAA;AAC9B,EAAA,MAAM,UAAA,GAAa,SAAA,IAAa,CAAA,GAAI,CAAA,GAAI,SAAA;AACxC,EAAA,MAAM,QAAwB,EAAC;AAC/B,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,IAAK,CAAA,GAAI,IAAA,EAAM,KAAK,UAAA,EAAY;AAC9C,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAG,CAAA,GAAI,GAAA;AACtC,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,GAAA,EAAK,UAAU,OAAA,GAAU,SAAA;AAAA,MACzB,KAAA,EAAO,OAAA;AAAA,MACP,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,OAAA,GAAU,SAAS,CAAA,GAAI;AAAA,KACxC,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,KAAA,GAAQ,KAAK,IAAA,CAAK,IAAA,CAAK,IAAI,QAAA,EAAU,OAAO,CAAA,GAAIA,EAAAA,CAAE,GAAG,CAAA;AAC3D,EAAA,MAAM,SAAS,IAAA,CAAK,IAAA,CAAK,eAAeA,EAAAA,CAAE,MAAA,GAASA,GAAE,QAAQ,CAAA;AAE7D,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAO,GAAA,CAAI,KAAA;AAAA,IACX,SAAA,EAAW,IAAA;AAAA,IACX,IAAA,EAAM,YAAA;AAAA,IACN,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,KAAA;AAAA,IACA,KAAA;AAAA,IACA,WAAW,EAAC;AAAA,IACZ,IAAA,EAAM,EAAE,KAAA,EAAO,QAAA,EAAU,cAAc,KAAA,EAAO,OAAA,EAAS,KAAK,OAAA,EAAQ;AAAA,IACpE,OAAA,EAAS,YAAA,CAAa,GAAA,EAAK,QAAQ,CAAA;AAAA,IACnC,UAAU,GAAA,CAAI,QAAA;AAAA,IACd;AAAA,GACF;AACF;AAEA,SAAS,WAAW,CAAA,EAAmB;AACrC,EAAA,MAAM,UAAA,GAAa,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,GAAA,EAAK,GAAA,EAAK,GAAG,CAAA;AAC1D,EAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAC1B,IAAA,IAAI,CAAA,GAAI,CAAA,IAAK,EAAA,EAAI,OAAO,CAAA;AAAA,EAC1B;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,YAAA,CAAa,KAAc,QAAA,EAA2D;AAC7F,EAAA,MAAM,OAAA,GAAuC;AAAA,IAC3C,iBAAiB,QAAA,CAAS,eAAA;AAAA,IAC1B,SAAA,EAAW,IAAI,KAAA,CAAM,MAAA;AAAA,IACrB,UAAU,QAAA,CAAS,QAAA;AAAA,IACnB,eAAe,QAAA,CAAS,aAAA;AAAA,IACxB,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,cAAc,QAAA,CAAS;AAAA,GACzB;AACA,EAAA,IAAI,QAAA,CAAS,aAAA,KAAkB,MAAA,EAAW,OAAA,CAAQ,gBAAgB,QAAA,CAAS,aAAA;AAC3E,EAAA,OAAO,OAAA;AACT;AAIO,SAAS,UAAA,CAAW,KAAc,QAAA,EAAiD;AACxF,EAAA,MAAM,KAAA,GAAQ,QAAA,IAAY,YAAA,CAAa,GAAG,CAAA;AAC1C,EAAA,IAAI,IAAI,MAAA,KAAW,KAAA,EAAO,OAAO,SAAA,CAAU,KAAK,KAAK,CAAA;AACrD,EAAA,IAAI,IAAI,MAAA,KAAW,YAAA,EAAc,OAAO,gBAAA,CAAiB,KAAK,KAAK,CAAA;AAEnE,EAAA,IAAI,GAAA,CAAI,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA,EAAG,OAAOiB,eAAAA,CAAe,GAAA,EAAK,KAAK,CAAA;AACnE,EAAA,OAAO,aAAA,CAAc,KAAK,KAAK,CAAA;AACjC;;;ACprBA,SAAS,OAAO,CAAA,EAAmB;AACjC,EAAA,OAAO,OAAO,UAAA,CAAW,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAC,CAAA;AACxC;AAEA,SAAS,SAAS,IAAA,EAAwB;AACxC,EAAA,OAAO,IAAA,KAAS,aAAa,EAAA,GAAK,IAAA;AACpC;AAIA,IAAM,OAAA,GAAU;AAAA,EACd,MAAA,EAAQ,SAAA;AAAA,EACR,IAAA,EAAM,SAAA;AAAA,EACN,IAAA,EAAM,SAAA;AAAA,EACN,GAAA,EAAK,SAAA;AAAA,EACL,IAAA,EAAM,SAAA;AAAA,EACN,KAAA,EAAO,SAAA;AAAA,EACP,UAAA,EAAY,SAAA;AAAA,EACZ,OAAA,EAAS,SAAA;AAAA,EACT,IAAA,EAAM,SAAA;AAAA,EACN,UAAA,EAAY,SAAA;AAAA,EACZ,QAAA,EAAU,SAAA;AAAA,EACV,QAAA,EAAU,SAAA;AAAA,EACV,QAAA,EAAU,SAAA;AAAA,EACV,OAAA,EAAS,SAAA;AAAA,EACT,QAAA,EAAU,SAAA;AAAA,EACV,YAAA,EAAc,SAAA;AAAA,EACd,cAAA,EAAgB,SAAA;AAAA,EAChB,IAAA,EAAM,SAAA;AAAA,EACN,YAAA,EAAc,SAAA;AAAA,EACd,IAAA,EAAM;AACR,CAAA;AAEA,SAASpB,UAAS,CAAA,EAAsB;AACtC,EAAA,MAAM,CAAA,GAAI,OAAA;AACV,EAAA,OAAO;AAAA;AAAA,gCAAA,EAEyB,CAAA,CAAE,IAAI,CAAA,UAAA,EAAa,CAAA,CAAE,MAAM,CAAA;AAAA,iCAAA,EAC1B,EAAE,IAAI,CAAA;AAAA,2CAAA,EACI,CAAA,CAAE,UAAU,CAAA,2BAAA,EAA8B,CAAA,CAAE,QAAQ,CAAA;AAAA,0CAAA,EACrD,EAAE,QAAQ,CAAA;AAAA,uBAAA,EAC7B,EAAE,GAAG,CAAA;AAAA,8CAAA,EACkB,EAAE,OAAO,CAAA;AAAA,wCAAA,EACf,EAAE,KAAK,CAAA;AAAA,6CAAA,EACF,EAAE,UAAU,CAAA;AAAA,yDAAA,EACA,EAAE,IAAI,CAAA;AAAA,6CAAA,EAClB,EAAE,QAAQ,CAAA;AAAA,qCAAA,EAClB,EAAE,OAAO,CAAA;AAAA,uCAAA,EACP,EAAE,UAAU,CAAA;AAAA,wDAAA,EACK,EAAE,UAAU,CAAA;AAAA,oBAAA,EAChD,CAAA,CAAE,IAAI,CAAA,UAAA,EAAa,CAAA,CAAE,MAAM,CAAA;AAAA,2CAAA,EACJ,CAAA,CAAE,QAAQ,CAAA,UAAA,EAAa,CAAA,CAAE,UAAU,CAAA;AAAA,8BAAA,EAChD,CAAA,CAAE,IAAI,CAAA,UAAA,EAAa,CAAA,CAAE,MAAM,CAAA;AAAA,uCAAA,EAClB,CAAA,CAAE,QAAQ,CAAA,UAAA,EAAa,CAAA,CAAE,UAAU,CAAA;AAAA,wBAAA,EAClD,EAAE,IAAI,CAAA;AAAA,iCAAA,EACG,EAAE,QAAQ,CAAA;AAAA,6CAAA,EACE,EAAE,KAAK,CAAA;AAAA,qCAAA,EACf,EAAE,UAAU,CAAA;AAAA,2BAAA,EACtB,EAAE,EAAE,CAAA;AAAA,iCAAA,EACE,CAAA,CAAE,YAAY,CAAA,UAAA,EAAa,CAAA,CAAE,cAAc,CAAA;AAAA,gDAAA,EAC5B,EAAE,OAAO,CAAA;AAAA,0DAAA,EACC,EAAE,IAAI,CAAA;AAAA,6BAAA,EACnC,EAAE,GAAG,CAAA;AAAA;AAAA;AAAA,+DAAA,EAG6B,EAAE,IAAI,CAAA;AAAA,6BAAA,EACxC,EAAE,IAAI,CAAA;AAAA,kCAAA,EACD,EAAE,YAAY,CAAA;AAAA,2CAAA,EACL,EAAE,OAAO,CAAA;AAAA,wBAAA,EAC5B,EAAE,IAAI,CAAA;AAAA,0CAAA,EACY,EAAE,OAAO,CAAA;AAAA,+BAAA,EACpB,EAAE,UAAU,CAAA;AAAA,kCAAA,EACT,CAAA,CAAE,IAAI,CAAA,UAAA,EAAa,CAAA,CAAE,MAAM,CAAA;AAAA,2CAAA,EAClB,CAAA,CAAE,QAAQ,CAAA,UAAA,EAAa,CAAA,CAAE,UAAU,CAAA;AAAA,mEAAA,EACX,EAAE,IAAI,CAAA;AAAA,yCAAA,EAChC,EAAE,QAAQ,CAAA;AAAA,2BAAA,EACxB,EAAE,IAAI,CAAA;AAAA,oCAAA,EACG,EAAE,QAAQ,CAAA;AAAA,iCAAA,EACb,EAAE,IAAI,CAAA;AAAA,6DAAA,EACsB,EAAE,IAAI,CAAA;AAAA,mCAAA,EAChC,EAAE,UAAU,CAAA;AAAA,0CAAA,EACL,EAAE,UAAU,CAAA;AAAA,kCAAA,EACpB,EAAE,UAAU,CAAA;AAAA,CAAA,CAC9C,IAAA,EAAK;AACP;AAEA,SAASU,QAAAA,GAAkB;AACzB,EAAA,MAAM,GAAA,GAAM,CAAC,EAAA,EAAY,KAAA,KACvB9B,oBAAA;AAAA,IACE,QAAA;AAAA,IACA;AAAA,MACE,EAAA;AAAA,MACA,OAAA,EAAS,WAAA;AAAA,MACT,IAAA,EAAM,CAAA;AAAA,MACN,IAAA,EAAM,CAAA;AAAA,MACN,WAAA,EAAa,CAAA;AAAA,MACb,YAAA,EAAc,CAAA;AAAA,MACd,MAAA,EAAQ;AAAA,KACV;AAAA,IACA,CAACL,0BAAQ,EAAE,MAAA,EAAQ,iBAAiB,IAAA,EAAM,KAAA,EAAO,CAAC;AAAA,GACpD;AACF,EAAA,OAAOc,sBAAA,CAAK,CAAC,GAAA,CAAI,eAAA,EAAiB,OAAA,CAAQ,IAAI,CAAA,EAAG,GAAA,CAAI,oBAAA,EAAsB,OAAA,CAAQ,QAAQ,CAAC,CAAC,CAAA;AAC/F;AAIA,SAASgC,UAAAA,CAAU,GAAY,IAAA,EAAwC;AACrE,EAAA,IAAI,CAAA,CAAE,SAAA,EAAW,OAAO,eAAA,CAAgB,CAAC,CAAA;AACzC,EAAA,IAAI,IAAA,KAAS,YAAA,EAAc,OAAO,mBAAA,CAAoB,CAAC,CAAA;AACvD,EAAA,OAAO,eAAe,CAAC,CAAA;AACzB;AAEA,SAAS,UAAU,CAAA,EAA6C;AAC9D,EAAA,MAAM,IAAI,CAAA,CAAE,QAAA;AACZ,EAAA,MAAM,KAAA,GAAyC;AAAA,IAC7C,KAAA,EAAO,CAAA,YAAA,EAAe,CAAA,CAAE,QAAA,GAAW,cAAc,EAAE,CAAA,EAAG,CAAA,CAAE,IAAA,CAAK,SAAA,GAAY,GAAA,GAAM,CAAA,CAAE,IAAA,CAAK,YAAY,EAAE,CAAA,CAAA;AAAA,IACpG,WAAW,CAAA,CAAE,EAAA;AAAA,IACb,SAAA,EAAW,MAAA,CAAO,CAAA,CAAE,EAAE,CAAA;AAAA,IACtB,SAAA,EAAW,MAAA,CAAO,CAAA,CAAE,EAAE,CAAA;AAAA,IACtB,SAAA,EAAW,MAAA,CAAO,CAAA,CAAE,EAAE,CAAA;AAAA,IACtB,SAAA,EAAW,MAAA,CAAO,CAAA,CAAE,EAAE,CAAA;AAAA,IACtB,YAAA,EAAc,MAAA,CAAO,CAAA,CAAE,KAAK,CAAA;AAAA,IAC5B,eAAA,EAAiB,MAAA,CAAO,CAAA,CAAE,IAAA,CAAK,QAAQ,CAAA;AAAA,IACvC,eAAA,EAAiB,MAAA,CAAO,CAAA,CAAE,QAAQ;AAAA,GACpC;AACA,EAAA,IAAI,CAAA,CAAE,IAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,KAAA,CAAM,UAAU,CAAA,GAAI,CAAA,CAAE,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAChE,EAAA,IAAI,CAAA,CAAE,KAAK,UAAA,EAAY;AACrB,IAAA,MAAM,EAAA,GAAK,EAAE,IAAA,CAAK,UAAA;AAClB,IAAA,KAAA,CAAM,kBAAkB,CAAA,GAAI,CAAA,EAAG,MAAA,CAAO,EAAA,CAAG,CAAC,CAAC,CAAA,CAAA,EAAI,MAAA,CAAO,EAAA,CAAG,CAAC,CAAC,CAAA,CAAA,EAAI,MAAA,CAAO,EAAA,CAAG,CAAC,CAAC,CAAA,CAAA;AAC3E,IAAA,IAAI,CAAA,CAAE,IAAA,CAAK,QAAA,KAAa,MAAA,EAAW,KAAA,CAAM,oBAAoB,CAAA,GAAI,MAAA,CAAO,CAAA,CAAE,IAAA,CAAK,QAAQ,CAAA;AAAA,EACzF;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,eAAe,CAAA,EAAoB;AAC1C,EAAA,MAAM,EAAE,CAAA,EAAG,CAAA,EAAG,OAAO,CAAA,EAAG,MAAA,EAAQ,GAAE,GAAI,CAAA;AACtC,EAAA,MAAM,IAAI,CAAA,CAAE,QAAA;AACZ,EAAA,MAAM,MAAM,CAAA,GAAI,CAAA;AAChB,EAAA,MAAM,IAAA,GAAO,EAAA;AACb,EAAA,MAAM,IAAA,GAAO,EAAA;AACb,EAAA,MAAM,OAAO,CAAA,GAAI,IAAA;AACjB,EAAA,MAAM,IAAA,GAAO,IAAI,CAAA,GAAI,IAAA;AACrB,EAAA,MAAM,EAAA,GAAK,IAAI,CAAA,GAAI,CAAA;AAEnB,EAAA,MAAM,KAAA,GAAkB;AAAA,IACtBhD,sBAAA,CAAK,EAAE,KAAA,EAAO,UAAA,EAAY,GAAG,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,GAAG,CAAA;AAAA,IACnEA,sBAAA,CAAK,EAAE,KAAA,EAAO,WAAA,EAAa,GAAG,CAAA,GAAI,GAAA,EAAK,CAAA,EAAG,IAAA,EAAM,OAAO,CAAA,GAAI,GAAA,EAAK,MAAA,EAAQ,IAAA,GAAO,MAAM,CAAA;AAAA,IACrFT,sBAAA,CAAK,EAAE,KAAA,EAAO,aAAA,EAAe,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,IAAA,EAAM,EAAA,EAAI,CAAA,GAAI,CAAA,EAAG,EAAA,EAAI,MAAM,CAAA;AAAA,IACnEA,sBAAA,CAAK,EAAE,KAAA,EAAO,aAAA,EAAe,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,IAAA,EAAM,EAAA,EAAI,CAAA,GAAI,CAAA,EAAG,EAAA,EAAI,MAAM,CAAA;AAAA,IACnEA,sBAAA,CAAK,EAAE,KAAA,EAAO,aAAA,EAAe,IAAI,CAAA,GAAI,GAAA,EAAK,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,GAAI,GAAA,EAAK,EAAA,EAAI,MAAM,CAAA;AAAA,IACxEA,uBAAK,EAAE,KAAA,EAAO,aAAA,EAAe,EAAA,EAAI,IAAI,CAAA,GAAI,GAAA,EAAK,EAAA,EAAI,CAAA,EAAG,IAAI,CAAA,GAAI,CAAA,GAAI,GAAA,EAAK,EAAA,EAAI,MAAM,CAAA;AAAA,IAChFA,sBAAA,CAAK,EAAE,KAAA,EAAO,aAAA,EAAe,IAAI,CAAA,GAAI,GAAA,EAAK,EAAA,EAAI,IAAA,EAAM,IAAI,CAAA,GAAI,GAAA,EAAK,EAAA,EAAI,CAAA,GAAI,GAAG,CAAA;AAAA,IAC5EA,uBAAK,EAAE,KAAA,EAAO,aAAA,EAAe,EAAA,EAAI,IAAI,CAAA,GAAI,GAAA,EAAK,EAAA,EAAI,IAAA,EAAM,IAAI,CAAA,GAAI,CAAA,GAAI,KAAK,EAAA,EAAI,CAAA,GAAI,GAAG;AAAA,GACtF;AAEA,EAAA,MAAM,KAAA,GAAQ,CACZ,EAAA,EACA,KAAA,EACA,OACA,GAAA,GAAM,eAAA,KAENa,uBAAA,CAAM,EAAC,EAAG;AAAA,IACRZ,sBAAA,CAAO,EAAE,KAAA,EAAO,qBAAA,EAAuB,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,aAAA,EAAe,QAAA,EAAS,EAAG,KAAK,CAAA;AAAA,IACxFA,sBAAA,CAAO,EAAE,KAAA,EAAO,GAAA,EAAK,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,aAAA,EAAe,QAAA,EAAS,EAAG,KAAK;AAAA,GACxE,CAAA;AAEH,EAAA,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAA,GAAM,CAAA,EAAG,MAAM,MAAA,CAAO,CAAA,CAAE,EAAE,CAAC,CAAC,CAAA;AACjD,EAAA,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAA,GAAM,GAAA,EAAK,KAAA,EAAO,MAAA,CAAO,CAAA,CAAE,IAAA,CAAK,QAAQ,CAAC,CAAC,CAAA;AAC/D,EAAA,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAA,GAAM,GAAA,EAAK,MAAM,MAAA,CAAO,CAAA,CAAE,EAAE,CAAC,CAAC,CAAA;AAGnD,EAAA,MAAM,QAAA,GAAW,CAAC,EAAA,EAAY,KAAA,EAAe,OAAe,GAAA,GAAM,eAAA,KAChEY,uBAAA,CAAM,EAAC,EAAG;AAAA,IACRZ,sBAAA,CAAO,EAAE,KAAA,EAAO,GAAA,EAAK,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,IAAA,GAAO,EAAA,EAAI,aAAA,EAAe,QAAA,EAAS,EAAG,KAAK,CAAA;AAAA,IAC1EA,sBAAA,CAAO,EAAE,KAAA,EAAO,qBAAA,EAAuB,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,IAAA,GAAO,EAAA,EAAI,aAAA,EAAe,QAAA,EAAS,EAAG,KAAK;AAAA,GAC7F,CAAA;AACH,EAAA,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,CAAA,GAAI,GAAA,GAAM,CAAA,EAAG,MAAM,MAAA,CAAO,CAAA,CAAE,EAAE,CAAC,CAAC,CAAA;AACpD,EAAA,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,CAAA,GAAI,GAAA,GAAM,GAAA,EAAK,OAAA,EAAS,MAAA,CAAO,CAAA,CAAE,KAAK,CAAA,EAAG,qBAAqB,CAAC,CAAA;AACnF,EAAA,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,CAAA,GAAI,GAAA,GAAM,GAAA,EAAK,MAAM,MAAA,CAAO,CAAA,CAAE,EAAE,CAAC,CAAC,CAAA;AAGtD,EAAA,MAAM,QAAA,GAAW,CAAA,CAAE,IAAA,CAAK,QAAA,KAAa,MAAA;AACrC,EAAA,MAAM,QAAQ,QAAA,GAAW,CAAA,GAAI,IAAA,GAAO,EAAA,GAAK,IAAI,IAAA,GAAO,EAAA;AACpD,EAAA,KAAA,CAAM,IAAA,CAAKA,sBAAA,CAAO,EAAE,KAAA,EAAO,gBAAgB,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,KAAA,EAAO,eAAe,QAAA,EAAS,EAAG,CAAA,CAAE,IAAA,CAAK,KAAK,CAAC,CAAA;AACpG,EAAA,KAAA,CAAM,IAAA,CAAKA,sBAAA,CAAO,EAAE,KAAA,EAAO,cAAc,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,KAAA,GAAQ,IAAI,aAAA,EAAe,QAAA,EAAS,EAAG,CAAA,CAAE,EAAE,CAAC,CAAA;AAC/F,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,KAAA,CAAM,IAAA;AAAA,MACJA,sBAAA;AAAA,QACE,EAAE,OAAO,eAAA,EAAiB,CAAA,EAAG,IAAI,CAAA,EAAG,KAAA,GAAQ,EAAA,EAAI,aAAA,EAAe,QAAA,EAAS;AAAA,QACxE,CAAA,OAAA,EAAK,OAAO,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,CAAK,QAAS,CAAC,CAAC,CAAA;AAAA;AAC1C,KACF;AAAA,EACF;AAEA,EAAA,OAAOY,uBAAA,CAAM,SAAA,CAAU,CAAC,CAAA,EAAG,KAAK,CAAA;AAClC;AAEA,SAAS,gBAAgB,CAAA,EAAoB;AAC3C,EAAA,MAAM,EAAE,CAAA,EAAG,CAAA,EAAG,OAAO,CAAA,EAAG,MAAA,EAAQ,GAAE,GAAI,CAAA;AACtC,EAAA,MAAM,EAAA,GAAK,IAAI,CAAA,GAAI,CAAA;AACnB,EAAA,MAAM,EAAA,GAAK,IAAI,CAAA,GAAI,CAAA;AACnB,EAAA,MAAM,MAAM,CAAA,EAAG,EAAE,IAAI,CAAC,CAAA,CAAA,EAAI,IAAI,CAAC,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,CAAC,IAAI,EAAE,CAAA,CAAA;AAC/D,EAAA,MAAM,KAAA,GAAkB;AAAA,IACtBF,0BAAQ,EAAE,KAAA,EAAO,YAAA,EAAc,MAAA,EAAQ,KAAK,CAAA;AAAA,IAC5CV,sBAAA,CAAO,EAAE,KAAA,EAAO,cAAA,EAAgB,GAAG,EAAA,EAAI,CAAA,EAAG,EAAA,GAAK,CAAA,EAAG,aAAA,EAAe,QAAA,EAAS,EAAG,CAAA,CAAE,KAAK,KAAK,CAAA;AAAA,IACzFA,uBAAO,EAAE,KAAA,EAAO,cAAc,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA,GAAK,EAAA,EAAI,aAAA,EAAe,QAAA,IAAY,CAAA,EAAA,EAAK,MAAA,CAAO,EAAE,QAAA,CAAS,EAAE,CAAC,CAAA,CAAE;AAAA,GAC1G;AACA,EAAA,OAAOY,uBAAA,CAAM,SAAA,CAAU,CAAC,CAAA,EAAG,KAAK,CAAA;AAClC;AAEA,SAAS,oBAAoB,CAAA,EAAoB;AAC/C,EAAA,MAAM,EAAE,CAAA,EAAG,CAAA,EAAG,OAAO,CAAA,EAAG,MAAA,EAAQ,GAAE,GAAI,CAAA;AACtC,EAAA,MAAM,IAAI,CAAA,CAAE,QAAA;AACZ,EAAA,MAAM,EAAA,GAAK,IAAI,CAAA,GAAI,CAAA;AACnB,EAAA,MAAM,QAAkB,CAACJ,sBAAA,CAAK,EAAE,KAAA,EAAO,mBAAmB,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,QAAQ,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA,EAAI,CAAA,EAAG,CAAC,CAAA;AAEpG,EAAA,KAAA,CAAM,KAAKR,sBAAA,CAAO,EAAE,KAAA,EAAO,cAAA,EAAgB,GAAG,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,aAAA,EAAe,SAAQ,EAAG,CAAA,EAAG,EAAE,IAAA,CAAK,KAAK,EAAE,CAAC,CAAA;AAEpG,EAAA,KAAA,CAAM,KAAKA,sBAAA,CAAO,EAAE,KAAA,EAAO,YAAA,EAAc,GAAG,EAAA,EAAI,CAAA,EAAG,CAAA,GAAI,CAAA,GAAI,IAAI,CAAA,EAAG,aAAA,EAAe,UAAS,EAAG,CAAA,CAAE,EAAE,CAAC,CAAA;AAClG,EAAA,MAAM,OAAO,CAAA,IAAK,GAAA;AAClB,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,KAAA,CAAM,IAAA,CAAKA,uBAAO,EAAE,KAAA,EAAO,uBAAuB,CAAA,EAAG,CAAA,GAAI,GAAG,CAAA,EAAG,CAAA,GAAI,IAAI,aAAA,EAAe,OAAA,IAAW,CAAA,GAAA,EAAM,MAAA,CAAO,EAAE,EAAE,CAAC,EAAE,CAAC,CAAA;AACtH,IAAA,KAAA,CAAM,IAAA,CAAKA,uBAAO,EAAE,KAAA,EAAO,uBAAuB,CAAA,EAAG,CAAA,GAAI,IAAI,CAAA,EAAG,CAAA,EAAG,IAAI,EAAA,EAAI,aAAA,EAAe,OAAM,EAAG,CAAA,GAAA,EAAM,OAAO,CAAA,CAAE,EAAE,CAAC,CAAA,CAAE,CAAC,CAAA;AACxH,IAAA,KAAA,CAAM,IAAA;AAAA,MACJA,sBAAA;AAAA,QACE,EAAE,KAAA,EAAO,CAAA,mBAAA,EAAsB,CAAA,CAAE,WAAW,QAAA,GAAW,EAAE,CAAA,CAAA,EAAI,CAAA,EAAG,IAAI,CAAA,EAAG,CAAA,GAAI,CAAA,GAAI,CAAA,EAAG,eAAe,QAAA,EAAS;AAAA,QAC1G,CAAA,MAAA,EAAS,MAAA,CAAO,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA;AAC1B,KACF;AAAA,EACF;AACA,EAAA,OAAOY,uBAAA,CAAM,SAAA,CAAU,CAAC,CAAA,EAAG,KAAK,CAAA;AAClC;AAIA,SAASgC,YAAW,CAAA,EAAqB;AACvC,EAAA,MAAM,GAAA,GAAM,CAAA,YAAA,EAAe,CAAA,CAAE,QAAA,GAAW,cAAc,EAAE,CAAA,CAAA;AACxD,EAAA,MAAM,MAAA,GAAS,CAAA,CAAE,QAAA,GAAW,0BAAA,GAA6B,qBAAA;AACzD,EAAA,OAAOjC,sBAAA,CAAO;AAAA,IACZ,KAAA,EAAO,GAAA;AAAA,IACP,GAAG,CAAA,CAAE,CAAA;AAAA,IACL,YAAA,EAAc,MAAA;AAAA,IACd,aAAa,CAAA,CAAE,IAAA;AAAA,IACf,WAAW,CAAA,CAAE,EAAA;AAAA,IACb,aAAa,CAAA,CAAE,IAAA;AAAA,IACf,YAAY,CAAA,CAAE,GAAA;AAAA,IACd,eAAA,EAAiB,MAAA,CAAO,CAAA,CAAE,QAAQ;AAAA,GACnC,CAAA;AACH;AAEA,SAAS8C,iBAAgB,CAAA,EAA4B;AACnD,EAAA,IAAI,CAAC,CAAA,CAAE,KAAA,EAAO,OAAO,IAAA;AACrB,EAAA,MAAM,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,IAAA,CAAK,SAAS,CAAA,GAAI,CAAA;AACpC,EAAA,MAAM,EAAA,GAAK,EAAA;AACX,EAAA,OAAO7C,uBAAA,CAAM,EAAE,KAAA,EAAO,sBAAA,EAAuB,EAAG;AAAA,IAC9CJ,sBAAA,CAAK;AAAA,MACH,KAAA,EAAO,mBAAA;AAAA,MACP,CAAA,EAAG,CAAA,CAAE,KAAA,CAAM,CAAA,GAAI,CAAA,GAAI,CAAA;AAAA,MACnB,CAAA,EAAG,CAAA,CAAE,KAAA,CAAM,CAAA,GAAI,EAAA,GAAK,CAAA;AAAA,MACpB,KAAA,EAAO,CAAA;AAAA,MACP,MAAA,EAAQ,EAAA;AAAA,MACR,EAAA,EAAI,CAAA;AAAA,MACJ,EAAA,EAAI;AAAA,KACL,CAAA;AAAA,IACDR,sBAAA;AAAA,MACE;AAAA,QACE,KAAA,EAAO,CAAA,kBAAA,EAAqB,CAAA,CAAE,QAAA,GAAW,cAAc,EAAE,CAAA,CAAA;AAAA,QACzD,CAAA,EAAG,EAAE,KAAA,CAAM,CAAA;AAAA,QACX,CAAA,EAAG,CAAA,CAAE,KAAA,CAAM,CAAA,GAAI,GAAA;AAAA,QACf,aAAA,EAAe;AAAA,OACjB;AAAA,MACA,EAAE,KAAA,CAAM;AAAA;AACV,GACD,CAAA;AACH;AAEA,SAAS,WAAA,CAAY,OAAmB,KAAA,EAAuB;AAC7D,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,EAAA;AAC/B,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AACnC,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,MAAA;AAC7B,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,MAAM,KAAA,EAAO;AACtB,IAAA,KAAA,CAAM,IAAA,CAAKQ,uBAAK,EAAE,KAAA,EAAO,YAAY,EAAA,CAAG,GAAA,GAAM,SAAS,EAAE,CAAA,CAAA,EAAI,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAG,KAAA,EAAO,QAAQ,EAAA,CAAG,MAAA,EAAQ,CAAC,CAAA;AAAA,EACzG;AACA,EAAA,KAAA,MAAW,MAAM,KAAA,EAAO;AACtB,IAAA,KAAA,CAAM,IAAA,CAAKT,sBAAA,CAAK,EAAE,EAAA,EAAI,GAAG,EAAA,EAAI,EAAA,CAAG,CAAA,EAAG,EAAA,EAAI,KAAA,EAAO,EAAA,EAAI,EAAA,CAAG,CAAA,EAAG,CAAC,CAAA;AAAA,EAC3D;AACA,EAAA,KAAA,CAAM,IAAA,CAAKA,sBAAA,CAAK,EAAE,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,MAAA,EAAQ,EAAA,EAAI,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,CAAC,CAAA;AAC7D,EAAA,KAAA,CAAM,KAAKA,sBAAA,CAAK,EAAE,EAAA,EAAI,UAAA,CAAW,cAAc,EAAA,EAAI,KAAA,CAAM,CAAC,CAAA,CAAE,GAAG,EAAA,EAAI,UAAA,CAAW,cAAc,EAAA,EAAI,MAAA,EAAQ,CAAC,CAAA;AACzG,EAAA,KAAA,MAAW,MAAM,KAAA,EAAO;AACtB,IAAA,IAAI,CAAC,GAAG,IAAA,EAAM;AACd,IAAA,KAAA,CAAM,IAAA;AAAA,MACJC,uBAAO,EAAE,KAAA,EAAO,oBAAA,EAAsB,CAAA,EAAG,IAAI,CAAA,EAAG,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,SAAS,CAAA,GAAI,CAAA,EAAG,eAAe,OAAA,EAAQ,EAAG,GAAG,IAAI;AAAA,KAC7G;AAAA,EACF;AACA,EAAA,OAAOY,uBAAA,CAAM,EAAE,KAAA,EAAO,cAAA,IAAkB,KAAK,CAAA;AAC/C;AAEA,SAAS,eAAe,CAAA,EAAyB;AAC/C,EAAA,OAAOA,wBAAM,EAAE,KAAA,EAAO,oBAAoB,SAAA,EAAW,CAAA,CAAE,IAAG,EAAG;AAAA,IAC3DH,wBAAA,CAAO,EAAE,EAAA,EAAI,CAAA,CAAE,EAAA,EAAI,EAAA,EAAI,CAAA,CAAE,EAAA,EAAI,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA;AAAA,IACrCT,sBAAA,CAAO,EAAE,CAAA,EAAG,CAAA,CAAE,EAAA,EAAI,CAAA,EAAG,CAAA,CAAE,EAAA,GAAK,GAAA,EAAK,aAAA,EAAe,QAAA,EAAS,EAAG,EAAE,KAAK;AAAA,GACpE,CAAA;AACH;AAEA,SAAS0D,WAAAA,CAAW,MAAgB,OAAA,EAAyB;AAC3D,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,KAAA,MAAW,EAAA,IAAM,KAAK,KAAA,EAAO;AAC3B,IAAA,IAAI,GAAG,KAAA,EAAO;AACZ,MAAA,KAAA,CAAM,KAAK3D,sBAAA,CAAK,EAAE,KAAA,EAAO,cAAA,EAAgB,IAAI,EAAA,CAAG,GAAA,EAAK,EAAA,EAAI,OAAA,EAAS,IAAI,EAAA,CAAG,GAAA,EAAK,IAAI,IAAA,CAAK,QAAA,EAAU,CAAC,CAAA;AAAA,IACpG;AAAA,EACF;AACA,EAAA,KAAA,CAAM,KAAKA,sBAAA,CAAK,EAAE,OAAO,UAAA,EAAY,EAAA,EAAI,KAAK,KAAA,EAAO,EAAA,EAAI,IAAA,CAAK,QAAA,EAAU,IAAI,IAAA,CAAK,GAAA,EAAK,IAAI,IAAA,CAAK,QAAA,EAAU,CAAC,CAAA;AAC1G,EAAA,KAAA,MAAW,EAAA,IAAM,KAAK,KAAA,EAAO;AAC3B,IAAA,MAAM,GAAA,GAAM,EAAA,CAAG,KAAA,GAAQ,CAAA,GAAI,CAAA;AAC3B,IAAA,KAAA,CAAM,KAAKA,sBAAA,CAAK,EAAE,EAAA,EAAI,EAAA,CAAG,KAAK,EAAA,EAAI,IAAA,CAAK,QAAA,EAAU,EAAA,EAAI,GAAG,GAAA,EAAK,EAAA,EAAI,KAAK,QAAA,GAAW,GAAA,EAAK,CAAC,CAAA;AACvF,IAAA,IAAI,GAAG,KAAA,EAAO;AACZ,MAAA,KAAA,CAAM,IAAA;AAAA,QACJC,sBAAA,CAAO,EAAE,CAAA,EAAG,EAAA,CAAG,KAAK,CAAA,EAAG,IAAA,CAAK,QAAA,GAAW,EAAA,EAAI,eAAe,QAAA,EAAS,EAAG,MAAA,CAAO,EAAA,CAAG,KAAK,CAAC;AAAA,OACxF;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAOY,uBAAA,CAAM,EAAE,KAAA,EAAO,cAAA,IAAkB,KAAK,CAAA;AAC/C;AAEA,SAAS,UAAU,GAAA,EAAsB;AACvC,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,IAAA,EAAM;AACxB,IAAA,MAAM,GAAA,GAAM,CAAA,eAAA,EAAkB,CAAA,CAAE,KAAA,GAAQ,QAAA,GAAW,EAAE,CAAA,EAAG,CAAA,CAAE,QAAA,GAAW,WAAA,GAAc,EAAE,CAAA,CAAA;AACrF,IAAA,MAAM,MAAA,GAAS,CAAA,CAAE,QAAA,GAAW,0BAAA,GAA6B,qBAAA;AACzD,IAAA,MAAA,CAAO,IAAA;AAAA,MACLD,sBAAA,CAAO;AAAA,QACL,KAAA,EAAO,GAAA;AAAA,QACP,GAAG,CAAA,CAAE,CAAA;AAAA,QACL,YAAA,EAAc,MAAA;AAAA,QACd,aAAa,CAAA,CAAE,IAAA;AAAA,QACf,WAAW,CAAA,CAAE,EAAA;AAAA,QACb,WAAA,EAAa,EAAE,MAAA,IAAU,EAAA;AAAA,QACzB,YAAA,EAAc,MAAA,CAAO,CAAA,CAAE,KAAK,CAAA;AAAA,QAC5B,eAAA,EAAiB,MAAA,CAAO,CAAA,CAAE,QAAQ;AAAA,OACnC;AAAA,KACH;AACA,IAAA,IAAI,CAAC,CAAA,CAAE,KAAA,IAAS,CAAA,CAAE,KAAA,EAAO;AACvB,MAAA,MAAM,OAAA,GAAU,CAAA,CAAE,QAAA,GAAW,WAAA,GAAc,EAAA;AAC3C,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,CAAA,CAAE,QAAA,IAAY,CAAC,CAAA;AACrC,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,KAAA,CAAM,SAAS,GAAA,EAAK,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA,GAAI,CAAA;AAC9D,MAAA,QAAA,CAAS,IAAA;AAAA,QACPH,sBAAA,CAAK,EAAE,KAAA,EAAO,mBAAA,EAAqB,GAAG,CAAA,CAAE,MAAA,GAAS,IAAI,CAAA,EAAG,CAAA,EAAG,EAAE,MAAA,GAAS,EAAA,EAAI,OAAO,CAAA,EAAG,MAAA,EAAQ,IAAI,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG;AAAA,OAChH;AACA,MAAA,QAAA,CAAS,IAAA;AAAA,QACPR,uBAAO,EAAE,KAAA,EAAO,CAAA,gBAAA,EAAmB,OAAO,IAAI,CAAA,EAAG,CAAA,CAAE,MAAA,EAAQ,CAAA,EAAG,EAAE,MAAA,GAAS,CAAA,EAAG,eAAe,QAAA,EAAS,EAAG,EAAE,KAAK;AAAA,OAChH;AACA,MAAA,QAAA,CAAS,IAAA;AAAA,QACPA,uBAAO,EAAE,KAAA,EAAO,CAAA,eAAA,EAAkB,OAAO,IAAI,CAAA,EAAG,CAAA,CAAE,MAAA,EAAQ,CAAA,EAAG,EAAE,MAAA,GAAS,EAAA,EAAI,aAAA,EAAe,QAAA,IAAY,MAAM;AAAA,OAC/G;AAAA,IACF;AAAA,EACF;AACA,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,MAAA,EAAQ;AAC1B,IAAA,QAAA,CAAS,IAAA;AAAA,MACPY,uBAAA,CAAM,EAAE,KAAA,EAAO,CAAA,iBAAA,EAAoB,CAAA,CAAE,QAAA,GAAW,WAAA,GAAc,EAAE,CAAA,CAAA,EAAI,YAAA,EAAc,CAAA,CAAE,EAAA,EAAG,EAAG;AAAA,QACxFH,wBAAA,CAAO,EAAE,EAAA,EAAI,CAAA,CAAE,CAAA,EAAG,EAAA,EAAI,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA;AAAA,QACnCT,sBAAA,CAAO,EAAE,CAAA,EAAG,CAAA,CAAE,GAAG,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,GAAA,EAAK,eAAe,QAAA,EAAS,EAAG,MAAA,CAAO,CAAA,CAAE,EAAE,CAAC;AAAA,OACvE;AAAA,KACH;AAAA,EACF;AACA,EAAA,OAAOY,uBAAA,CAAM,EAAE,KAAA,EAAO,aAAA,EAAc,EAAG;AAAA,IACrCA,uBAAA,CAAM,EAAE,KAAA,EAAO,kBAAA,IAAsB,MAAM,CAAA;AAAA,IAC3CA,uBAAA,CAAM,EAAE,KAAA,EAAO,oBAAA,IAAwB,QAAQ,CAAA;AAAA,IAC/CA,uBAAA,CAAM,EAAE,KAAA,EAAO,oBAAA,IAAwB,QAAQ;AAAA,GAChD,CAAA;AACH;AAEA,SAAS,YAAY,OAAA,EAA2D;AAC9E,EAAA,MAAM,CAAA,GAAI,QAAA,CAAS,OAAA,CAAQ,IAAI,CAAA;AAC/B,EAAA,MAAM,GAAA,GAAM,CAAA,EAAG,MAAA,CAAO,OAAA,CAAQ,eAAe,CAAC,CAAA,EAAG,CAAA,GAAI,GAAA,GAAM,CAAA,GAAI,EAAE,CAAA,CAAA;AACjE,EAAA,MAAM,KAAA,GAAQ,QAAQ,aAAA,KAAkB,MAAA,GAAY,uBAAU,MAAA,CAAO,OAAA,CAAQ,aAAa,CAAC,CAAA,CAAA,GAAK,EAAA;AAChG,EAAA,MAAM,KAAA,GAAQ,CAAA,iBAAA,EAAoB,GAAG,CAAA,MAAA,EAAM,OAAA,CAAQ,SAAS,CAAA,YAAA,EAAY,OAAA,CAAQ,QAAQ,CAAA,mBAAA,EAAmB,OAAA,CAAQ,aAAa,YAAY,KAAK,CAAA,CAAA;AACjJ,EAAA,MAAM,QAAA,GAAW,QAAQ,YAAA,CAAa,GAAA,CAAI,CAAC,EAAA,KAAO,EAAE,CAAA,CAAE,IAAA,CAAK,UAAK,CAAA;AAChE,EAAA,OAAO,EAAE,OAAO,QAAA,EAAS;AAC3B;AAIO,SAAS,gBAAA,CAAiB,QAA0B,MAAA,EAA+B;AACxF,EAAA,MAAM,CAAA,GAAIC,kCAAA,CAAiB,MAAA,EAAQ,KAAA,IAAS,SAAS,CAAA;AACrD,EAAA,MAAM,WAAqB,EAAC;AAE5B,EAAA,MAAM,EAAA,GAAK,OAAO,OAAA,CAAQ,YAAA;AAC1B,EAAA,QAAA,CAAS,IAAA,CAAKZ,uBAAA,CAAQ,CAAA,YAAA,EAAe,MAAA,CAAO,KAAA,GAAQ,aAAQ,MAAA,CAAO,KAAA,GAAQ,EAAE,CAAA,CAAE,CAAC,CAAA;AAChF,EAAA,QAAA,CAAS,IAAA;AAAA,IACPa,sBAAA;AAAA,MACE,CAAA,EAAG,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,8BAAA,EAAiC,OAAO,MAAA,CAAO,OAAA,CAAQ,eAAe,CAAC,CAAA,CAAA,EAAI,QAAA,CAAS,OAAO,IAAI,CAAC,CAAA,CAAA,IACxH,EAAA,CAAG,MAAA,GAAS,CAAA,gBAAA,EAAmB,GAAG,IAAA,CAAK,UAAK,CAAC,CAAA,CAAA,GAAK,EAAA,CAAA,GACnD;AAAA;AACJ,GACF;AACA,EAAA,QAAA,CAAS,IAAA,CAAKC,qBAAG,OAAA,EAAS,IAAIoB,SAAAA,CAAS,CAAC,CAAC,CAAC,CAAA;AAC1C,EAAA,QAAA,CAAS,IAAA,CAAKU,UAAS,CAAA;AAEvB,EAAA,IAAI,OAAO,KAAA,EAAO;AAChB,IAAA,QAAA,CAAS,IAAA;AAAA,MACP7C,sBAAA,CAAO,EAAE,CAAA,EAAG,MAAA,CAAO,QAAQ,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,KAAA,EAAO,eAAA,EAAiB,aAAA,EAAe,QAAA,EAAS,EAAG,OAAO,KAAK;AAAA,KACtG;AAAA,EACF;AAEA,EAAA,IAAI,OAAO,GAAA,EAAK;AACd,IAAA,QAAA,CAAS,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,EACrC,CAAA,MAAO;AAEL,IAAA,IAAI,MAAA,CAAO,KAAA,IAAS,MAAA,CAAO,KAAA,CAAM,MAAA,EAAQ;AACvC,MAAA,QAAA,CAAS,KAAK,WAAA,CAAY,MAAA,CAAO,KAAA,EAAO,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,IACvD;AAGA,IAAA,IAAI,OAAO,IAAA,EAAM;AACf,MAAA,IAAI,OAAA,GAAU,QAAA;AACd,MAAA,KAAA,MAAW,CAAA,IAAK,OAAO,KAAA,EAAO,OAAA,GAAU,KAAK,GAAA,CAAI,OAAA,EAAS,EAAE,CAAC,CAAA;AAC7D,MAAA,QAAA,CAAS,IAAA,CAAK0D,WAAAA,CAAW,MAAA,CAAO,IAAA,EAAM,QAAA,CAAS,OAAO,CAAA,GAAI,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,QAAA,GAAW,EAAE,CAAC,CAAA;AAAA,IAChG;AAGA,IAAA,MAAM,UAAoB,EAAC;AAC3B,IAAA,KAAA,MAAW,KAAK,MAAA,CAAO,KAAA,UAAe,IAAA,CAAKd,WAAAA,CAAW,CAAC,CAAC,CAAA;AACxD,IAAA,QAAA,CAAS,KAAKhC,uBAAA,CAAM,EAAE,OAAO,eAAA,EAAgB,EAAG,OAAO,CAAC,CAAA;AAGxD,IAAA,IAAI,MAAA,CAAO,UAAU,MAAA,EAAQ;AAC3B,MAAA,QAAA,CAAS,IAAA,CAAKA,uBAAA,CAAM,EAAE,KAAA,EAAO,mBAAA,EAAoB,EAAG,MAAA,CAAO,SAAA,CAAU,GAAA,CAAI,cAAc,CAAC,CAAC,CAAA;AAAA,IAC3F;AAGA,IAAA,MAAM,SAAmB,EAAC;AAC1B,IAAA,KAAA,MAAW,CAAA,IAAK,OAAO,KAAA,EAAO,MAAA,CAAO,KAAK4C,UAAAA,CAAU,CAAA,EAAG,MAAA,CAAO,IAAI,CAAC,CAAA;AACnE,IAAA,QAAA,CAAS,KAAK5C,uBAAA,CAAM,EAAE,OAAO,eAAA,EAAgB,EAAG,MAAM,CAAC,CAAA;AAGvD,IAAA,MAAM,WAAqB,EAAC;AAC5B,IAAA,KAAA,MAAW,CAAA,IAAK,OAAO,KAAA,EAAO;AAC5B,MAAA,MAAM,GAAA,GAAM6C,iBAAgB,CAAC,CAAA;AAC7B,MAAA,IAAI,GAAA,EAAK,QAAA,CAAS,IAAA,CAAK,GAAG,CAAA;AAAA,IAC5B;AACA,IAAA,QAAA,CAAS,KAAK7C,uBAAA,CAAM,EAAE,OAAO,gBAAA,EAAiB,EAAG,QAAQ,CAAC,CAAA;AAAA,EAC5D;AAGA,EAAA,MAAM,EAAE,KAAA,EAAO,QAAA,EAAS,GAAI,WAAA,CAAY,OAAO,OAAO,CAAA;AACtD,EAAA,MAAM,OAAA,GAAU,OAAO,MAAA,GAAS,EAAA;AAChC,EAAA,MAAM,WAAA,GAAwB;AAAA,IAC5BZ,sBAAA,CAAO,EAAE,KAAA,EAAO,iBAAA,EAAmB,CAAA,EAAG,QAAA,EAAU,CAAA,EAAG,OAAA,EAAS,aAAA,EAAe,OAAA,EAAQ,EAAG,KAAK;AAAA,GAC7F;AACA,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,WAAA,CAAY,IAAA;AAAA,MACVA,sBAAA;AAAA,QACE,EAAE,KAAA,EAAO,sBAAA,EAAwB,CAAA,EAAG,MAAA,CAAO,QAAQ,QAAA,EAAU,CAAA,EAAG,OAAA,EAAS,aAAA,EAAe,KAAA,EAAM;AAAA,QAC9F,kBAAkB,QAAQ,CAAA;AAAA;AAC5B,KACF;AAAA,EACF;AACA,EAAA,QAAA,CAAS,KAAKY,uBAAA,CAAM,EAAE,OAAO,gBAAA,EAAiB,EAAG,WAAW,CAAC,CAAA;AAE7D,EAAA,OAAOI,yBAAA;AAAA,IACL;AAAA,MACE,KAAA,EAAO,SAAA;AAAA,MACP,IAAA,EAAM,KAAA;AAAA,MACN,YAAA,EAAcC,2BAAA,CAAU,MAAA,CAAO,KAAA,IAAS,sBAAsB,CAAA;AAAA,MAC9D,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,SAAS,CAAA,IAAA,EAAO,MAAA,CAAO,KAAK,CAAA,CAAA,EAAI,OAAO,MAAM,CAAA,CAAA;AAAA,MAC7C,mBAAA,EAAqB;AAAA,KACvB;AAAA,IACA;AAAA,GACF;AACF;AAEA,IAAM,QAAA,GAAW,EAAA;AAEV,SAAS,UAAA,CAAW,WAA6B,MAAA,EAA+B;AACrF,EAAA,MAAM,MAAM,OAAO,SAAA,KAAc,QAAA,GAAW,SAAA,CAAU,SAAS,CAAA,GAAI,SAAA;AACnE,EAAA,MAAM,QAAA,GAAW,aAAa,GAAG,CAAA;AACjC,EAAA,MAAM,MAAA,GAAS,UAAA,CAAW,GAAA,EAAK,QAAQ,CAAA;AACvC,EAAA,OAAO,gBAAA,CAAiB,QAAQ,MAAM,CAAA;AACxC;;;AC1gBO,IAAM,IAAA,GAAsB;AAAA,EACjC,IAAA,EAAM,MAAA;AAAA,EACN,OAAOjB,KAAAA,EAAuB;AAC5B,IAAA,KAAA,MAAW,GAAA,IAAOA,KAAAA,CAAK,KAAA,CAAM,OAAO,CAAA,EAAG;AACrC,MAAA,MAAM,CAAA,GAAI,IAAI,IAAA,EAAK;AACnB,MAAA,IAAI,CAAC,CAAA,EAAG;AACR,MAAA,IAAI,EAAE,UAAA,CAAW,GAAG,KAAK,CAAA,CAAE,UAAA,CAAW,IAAI,CAAA,EAAG;AAC7C,MAAA,OAAO,UAAA,CAAW,KAAK,CAAC,CAAA;AAAA,IAC1B;AACA,IAAA,OAAO,KAAA;AAAA,EACT,CAAA;AAAA,EACA,KAAA,EAAO,SAAA;AAAA,EACP,MAAA,CAAOA,OAAc,MAAA,EAA+B;AAClD,IAAA,OAAO,UAAA,CAAWA,OAAM,MAAM,CAAA;AAAA,EAChC;AACF;;;ACKO,IAAM,kBAAA,GAAN,cAAiC,KAAA,CAAM;AAAA,EAC5C,IAAA;AAAA,EACA,WAAA,CAAY,SAAiBD,KAAAA,EAAe;AAC1C,IAAA,KAAA,CAAMA,QAAO,CAAA,EAAG,OAAO,CAAA,OAAA,EAAUA,KAAI,MAAM,OAAO,CAAA;AAClD,IAAA,IAAA,CAAK,IAAA,GAAO,oBAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAOA,KAAAA;AAAA,EACd;AACF,CAAA;AAEA,IAAM,KAAA,uBAAY,GAAA,CAAwB;AAAA,EACxC,aAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,IAAM,WAAA,uBAAkB,GAAA,CAAmB;AAAA,EACzC,KAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAC,CAAA;AACD,IAAM,6BAAa,IAAI,GAAA,CAAmB,CAAC,KAAA,EAAO,KAAA,EAAO,QAAQ,CAAC,CAAA;AAElE,IAAM,8BAAc,IAAI,GAAA,CAAmB,CAAC,QAAA,EAAU,UAAU,CAAC,CAAA;AACjE,IAAM,QAAA,uBAAe,GAAA,CAAmB;AAAA,EACtC,KAAA;AAAA,EACA,GAAG,WAAA;AAAA,EACH,GAAG;AACL,CAAC,CAAA;AAGD,IAAM,QAAA,GAAW,qBAAA;AAEjB,SAAS,UAAU,KAAA,EAA6B;AAC9C,EAAA,QAAQ,KAAA;AAAO,IACb,KAAK,KAAA;AACH,MAAA,OAAO,OAAA;AAAA,IACT,KAAK,KAAA;AACH,MAAA,OAAO,OAAA;AAAA,IACT,KAAK,KAAA;AACH,MAAA,OAAO,OAAA;AAAA,IACT,KAAK,IAAA;AACH,MAAA,OAAO,MAAA;AAAA,IACT;AACE,MAAA,OAAO,MAAA;AAAA;AAEb;AAOA,SAAS,UAAU,CAAA,EAAmB;AACpC,EAAA,MAAM,CAAA,GAAI,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA;AACzB,EAAA,OAAO,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,GAAK,EAAA;AACrB;AAGA,SAAS,aAAa,IAAA,EAAkC;AACtD,EAAA,MAAM,CAAA,GAAI,KAAK,IAAA,EAAK;AACpB,EAAA,IAAI,CAAC,GAAG,OAAO,MAAA;AACf,EAAA,IAAI,CAAA,CAAE,UAAA,CAAW,GAAG,CAAA,IAAK,EAAE,QAAA,CAAS,GAAG,CAAA,EAAG,OAAO,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,EAAE,IAAA,EAAK;AACrE,EAAA,IAAI,CAAA,CAAE,UAAA,CAAW,GAAG,CAAA,IAAK,EAAE,QAAA,CAAS,GAAG,CAAA,EAAG,OAAO,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,EAAE,IAAA,EAAK;AACrE,EAAA,OAAO,CAAA;AACT;AAEO,IAAM,iBAAN,MAAqB;AAAA,EAClB,KAAA;AAAA,EACA,CAAA,GAAI,CAAA;AAAA,EACJ,QAAkB,EAAC;AAAA,EACnB,IAAA,uBAAW,GAAA,EAA4B;AAAA,EACvC,WAAqB,EAAC;AAAA,EAE9B,YAAY,MAAA,EAAgB;AAC1B,IAAA,IAAA,CAAK,KAAA,GAAQ,OAAO,KAAA,CAAM,OAAO,EAAE,GAAA,CAAI,CAAC,KAAK,GAAA,MAAS;AAAA,MACpD,IAAA,EAAM,IAAI,IAAA,EAAK;AAAA,MACf,GAAG,GAAA,GAAM;AAAA,KACX,CAAE,CAAA;AAAA,EACJ;AAAA,EAEA,KAAA,GAAgB;AACd,IAAA,MAAM,MAAA,GAAS,KAAK,aAAA,EAAc;AAClC,IAAA,MAAM,GAAA,GAAc;AAAA,MAClB,IAAA,EAAM,UAAA;AAAA,MACN,cAAc,EAAC;AAAA,MACf,YAAY,EAAC;AAAA,MACb,UAAU,IAAA,CAAK;AAAA,KACjB;AACA,IAAA,IAAI,MAAA,CAAO,KAAA,EAAO,GAAA,CAAI,KAAA,GAAQ,MAAA,CAAO,KAAA;AAErC,IAAA,MAAM,UAAA,GAAa,KAAK,UAAA,EAAW;AAGnC,IAAA,MAAM,QAAA,GAAW,KAAK,IAAA,EAAK;AAC3B,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,EAAA,GAAK,SAAA,CAAU,QAAA,CAAS,IAAI,EAAE,WAAA,EAAY;AAChD,MAAA,MAAM,IAAI,kBAAA;AAAA,QACR,IAAI,EAAE,CAAA,sCAAA,CAAA;AAAA,QACN,QAAA,CAAS;AAAA,OACX;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,cAAA,EAAgB,GAAA,CAAI,UAAA,GAAa,IAAA,CAAK,cAAA;AAC/C,IAAA,GAAA,CAAI,UAAA,GAAa,UAAA;AACjB,IAAA,GAAA,CAAI,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAC,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,EAAE,CAAE,CAAA;AAC5D,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEQ,cAAA;AAAA;AAAA,EAIA,IAAA,GAAoB;AAC1B,IAAA,OAAO,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,MAAA,EAAQ;AACjC,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA;AAC5B,MAAA,IAAI,EAAA,CAAG,IAAA,KAAS,EAAA,IAAM,EAAA,CAAG,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,IAAK,EAAA,CAAG,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA,EAAG;AACzE,QAAA,IAAA,CAAK,CAAA,EAAA;AACL,QAAA;AAAA,MACF;AACA,MAAA,OAAO,EAAA;AAAA,IACT;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,IAAA,GAAoB;AAC1B,IAAA,MAAM,EAAA,GAAK,KAAK,IAAA,EAAK;AACrB,IAAA,IAAI,IAAI,IAAA,CAAK,CAAA,EAAA;AACb,IAAA,OAAO,EAAA;AAAA,EACT;AAAA;AAAA,EAIQ,aAAA,GAAoC;AAC1C,IAAA,MAAM,EAAA,GAAK,KAAK,IAAA,EAAK;AACrB,IAAA,IAAI,CAAC,EAAA,IAAM,CAAC,eAAe,IAAA,CAAK,EAAA,CAAG,IAAI,CAAA,EAAG;AACxC,MAAA,MAAM,IAAI,kBAAA;AAAA,QACR,2DAAA;AAAA,QACA,EAAA,EAAI;AAAA,OACN;AAAA,IACF;AACA,IAAA,MAAME,MAAAA,GAAQ0D,kCAAA,CAAiB,EAAA,CAAG,IAAI,CAAA;AACtC,IAAA,OAAO1D,MAAAA,GAAQ,EAAE,KAAA,EAAAA,MAAAA,KAAU,EAAC;AAAA,EAC9B;AAAA;AAAA,EAIQ,MAAA,CAAO,EAAA,EAAY,IAAA,GAA2B,aAAA,EAAeF,KAAAA,EAA+B;AAClG,IAAA,IAAI,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AACxB,IAAA,IAAI,CAAC,CAAA,EAAG;AACN,MAAA,CAAA,GAAI,EAAE,EAAA,EAAI,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,MAAAA,KAAAA,EAAK;AAC/B,MAAA,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,CAAC,CAAA;AACnB,MAAA,IAAA,CAAK,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,IACpB;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAAA,EAEQ,QAAQA,KAAAA,EAAkB;AAChC,IAAA,MAAM,EAAA,GAAK,SAAA,CAAUA,KAAAA,CAAK,IAAI,CAAA;AAC9B,IAAA,MAAM,IAAA,GAAO,GAAG,WAAA,EAAY;AAC5B,IAAA,IAAI,OAAOA,KAAAA,CAAK,IAAA,CAAK,MAAM,EAAA,CAAG,MAAM,EAAE,IAAA,EAAK;AAE3C,IAAA,IAAI,UAAA;AACJ,IAAA,MAAM,WAAA,GAAc,uBAAA,CAAwB,IAAA,CAAK,IAAI,CAAA;AACrD,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,UAAA,GAAA,CAAc,YAAY,CAAC,CAAA,IAAK,YAAY,CAAC,CAAA,IAAK,IAAI,IAAA,EAAK;AAC3D,MAAA,IAAA,GAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,WAAA,CAAY,KAAK,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,QAAQ,WAAA,CAAY,CAAC,CAAA,CAAE,MAAM,GAAG,IAAA,EAAK;AAAA,IACzG;AAEA,IAAA,IAAI,EAAA;AACJ,IAAA,IAAI,IAAA;AACJ,IAAA,MAAM,OAAA,GAAU,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA;AACnC,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,EAAA,GAAKsC,6BAAA,CAAY,KAAK,KAAA,CAAM,CAAA,EAAG,QAAQ,KAAK,CAAA,CAAE,MAAM,CAAA;AACpD,MAAA,IAAA,GAAOA,6BAAA,CAAY,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,KAAA,GAAQ,OAAA,CAAQ,CAAC,CAAA,CAAE,MAAM,CAAA,CAAE,IAAA,EAAM,CAAA;AAAA,IACzE,CAAA,MAAO;AACL,MAAA,EAAA,GAAKA,8BAAY,IAAI,CAAA;AACrB,MAAA,IAAA,GAAO,EAAA;AAAA,IACT;AACA,IAAA,IAAI,CAAC,EAAA,EAAI;AACP,MAAA,MAAM,IAAI,kBAAA,CAAmB,CAAA,CAAA,EAAI,EAAE,CAAA,0BAAA,CAAA,EAA8BtC,MAAK,CAAC,CAAA;AAAA,IACzE;AACA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AACjC,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,QAAA,CAAS,IAAA,GAAO,IAAA;AAChB,MAAA,QAAA,CAAS,IAAA,GAAO,IAAA;AAChB,MAAA,IAAI,UAAA,WAAqB,UAAA,GAAa,UAAA;AAAA,IACxC,CAAA,MAAO;AACL,MAAA,MAAM,IAAoB,EAAE,EAAA,EAAI,MAAM,IAAA,EAAM,IAAA,EAAMA,MAAK,CAAA,EAAE;AACzD,MAAA,IAAI,UAAA,IAAc,UAAA,GAAa,UAAA;AAC/B,MAAA,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,CAAC,CAAA;AACnB,MAAA,IAAA,CAAK,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,IACpB;AAAA,EACF;AAAA;AAAA;AAAA,EAKQ,UAAA,GAA6B;AACnC,IAAA,MAAM,MAAsB,EAAC;AAC7B,IAAA,WAAS;AACP,MAAA,MAAM,EAAA,GAAK,KAAK,IAAA,EAAK;AACrB,MAAA,IAAI,CAAC,EAAA,EAAI;AACT,MAAA,MAAM,EAAA,GAAK,SAAA,CAAU,EAAA,CAAG,IAAI,EAAE,WAAA,EAAY;AAC1C,MAAA,IAAI,EAAA,KAAO,KAAA,IAAS,EAAA,KAAO,MAAA,IAAU,OAAO,KAAA,EAAO;AAEnD,MAAA,IAAI,KAAA,CAAM,GAAA,CAAI,EAAwB,CAAA,EAAG;AACvC,QAAA,IAAA,CAAK,CAAA,EAAA;AACL,QAAA,IAAA,CAAK,QAAQ,EAAE,CAAA;AACf,QAAA;AAAA,MACF;AACA,MAAA,IAAI,QAAA,CAAS,GAAA,CAAI,EAAmB,CAAA,EAAG;AACrC,QAAA,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,aAAA,CAAc,EAAE,CAAC,CAAA;AAC/B,QAAA;AAAA,MACF;AACA,MAAA,IAAA,CAAK,CAAA,EAAA;AACL,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,oBAAA,CAAqB,EAAE,CAAA;AACzC,MAAA,IAAI,IAAA,EAAM,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA;AAAA,IACzB;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEQ,cAAc,IAAA,EAAyB;AAC7C,IAAA,MAAM,EAAA,GAAK,SAAA,CAAU,IAAA,CAAK,IAAI,EAAE,WAAA,EAAY;AAC5C,IAAA,IAAA,CAAK,CAAA,EAAA;AACL,IAAA,IAAI,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,GAAG,MAAM,CAAA;AAGpC,IAAA,IAAI,UAAA;AACJ,IAAA,IAAI,WAAA,CAAY,GAAA,CAAI,EAAE,CAAA,EAAG;AACvB,MAAA,MAAM,EAAA,GAAK,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA;AAClC,MAAA,IAAI,EAAA,EAAI;AACN,QAAA,UAAA,GAAa,EAAA,CAAG,CAAC,CAAA,CAAG,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,OAAO,OAAO,CAAA;AAClE,QAAA,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAA,CAAG,KAAK,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,KAAA,GAAQ,EAAA,CAAG,CAAC,EAAE,MAAM,CAAA;AAAA,MACrE;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,aAAa,IAAI,CAAA;AACpC,IAAA,MAAM,QAAA,GAAyB;AAAA,MAC7B,EAAE,KAAA,EAAO,UAAA,EAAY,UAAA,EAAY,IAAA,CAAK,YAAW;AAAE,KACrD;AAEA,IAAA,WAAS;AACP,MAAA,MAAM,EAAA,GAAK,KAAK,IAAA,EAAK;AACrB,MAAA,IAAI,CAAC,EAAA,EAAI;AACP,QAAA,MAAM,IAAI,kBAAA,CAAmB,CAAA,cAAA,EAAiB,EAAE,CAAA,UAAA,CAAA,EAAc,KAAK,CAAC,CAAA;AAAA,MACtE;AACA,MAAA,MAAM,IAAA,GAAO,SAAA,CAAU,EAAA,CAAG,IAAI,EAAE,WAAA,EAAY;AAC5C,MAAA,IAAI,SAAS,KAAA,EAAO;AAClB,QAAA,IAAA,CAAK,CAAA,EAAA;AACL,QAAA;AAAA,MACF;AACA,MAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,QAAA,IAAI,OAAO,KAAA,EAAO;AAChB,UAAA,MAAM,IAAI,kBAAA;AAAA,YACR,uDAAuD,EAAE,CAAA,CAAA,CAAA;AAAA,YACzD,EAAA,CAAG;AAAA,WACL;AAAA,QACF;AACA,QAAA,IAAA,CAAK,CAAA,EAAA;AACL,QAAA,QAAA,CAAS,IAAA,CAAK;AAAA,UACZ,OAAO,YAAA,CAAa,EAAA,CAAG,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,UACpC,UAAA,EAAY,KAAK,UAAA;AAAW,SAC7B,CAAA;AACD,QAAA;AAAA,MACF;AACA,MAAA,IAAI,SAAS,KAAA,EAAO;AAClB,QAAA,IAAI,CAAC,UAAA,CAAW,GAAA,CAAI,EAAE,CAAA,EAAG;AACvB,UAAA,MAAM,IAAI,kBAAA;AAAA,YACR,mDAAmD,EAAE,CAAA,CAAA,CAAA;AAAA,YACrD,EAAA,CAAG;AAAA,WACL;AAAA,QACF;AACA,QAAA,IAAA,CAAK,CAAA,EAAA;AACL,QAAA,MAAM,QAAQ,EAAA,CAAG,IAAA,CAAK,KAAA,CAAM,CAAC,EAAE,IAAA,EAAK;AACpC,QAAA,QAAA,CAAS,IAAA,CAAK;AAAA,UACZ,KAAA,EAAO,KAAA,GAAQ,YAAA,CAAa,KAAK,CAAA,GAAI,MAAA;AAAA,UACrC,UAAA,EAAY,KAAK,UAAA;AAAW,SAC7B,CAAA;AACD,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,IAAI,mBAAmB,CAAA,YAAA,EAAe,IAAI,SAAS,EAAE,CAAA,CAAA,CAAA,EAAK,GAAG,CAAC,CAAA;AAAA,IACtE;AAEA,IAAA,MAAM,IAAA,GAAoB,EAAE,IAAA,EAAM,UAAA,EAAY,IAAI,EAAA,EAAI,QAAA,EAAU,IAAA,EAAM,IAAA,CAAK,CAAA,EAAE;AAC7E,IAAA,IAAI,UAAA,IAAc,UAAA,CAAW,MAAA,EAAQ,IAAA,CAAK,UAAA,GAAa,UAAA;AACvD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGQ,qBAAqB,EAAA,EAA+B;AAC1D,IAAA,MAAMC,QAAO,EAAA,CAAG,IAAA;AAChB,IAAA,MAAM,EAAA,GAAK,SAAA,CAAUA,KAAI,CAAA,CAAE,WAAA,EAAY;AAEvC,IAAA,IAAI,EAAA,KAAO,UAAA,IAAc,EAAA,KAAO,YAAA,EAAc;AAC5C,MAAA,MAAM,CAAA,GAAI,4BAAA,CAA6B,IAAA,CAAKA,KAAI,CAAA;AAChD,MAAA,IAAI,CAAC,GAAG,MAAM,IAAI,mBAAmB,CAAA,UAAA,EAAa,EAAE,CAAA,UAAA,CAAA,EAAc,EAAA,CAAG,CAAC,CAAA;AACtE,MAAA,IAAA,CAAK,OAAO,CAAA,CAAE,CAAC,CAAA,EAAI,aAAA,EAAe,GAAG,CAAC,CAAA;AACtC,MAAA,OAAO,EAAE,MAAM,EAAA,EAAI,EAAA,EAAI,EAAE,CAAC,CAAA,EAAI,IAAA,EAAM,EAAA,CAAG,CAAA,EAAE;AAAA,IAC3C;AAEA,IAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,MAAA,OAAO,IAAA,CAAK,UAAU,EAAE,CAAA;AAAA,IAC1B;AAEA,IAAA,IAAI,OAAO,KAAA,EAAO;AAChB,MAAA,MAAM,CAAA,GAAI,kCAAA,CAAmC,IAAA,CAAKA,KAAI,CAAA;AACtD,MAAA,IAAI,CAAC,CAAA,EAAG,MAAM,IAAI,kBAAA,CAAmB,gDAAA,EAAkD,GAAG,CAAC,CAAA;AAC3F,MAAA,MAAM,MAAM,CAAA,CAAE,CAAC,CAAA,CAAG,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAMqC,8BAAY,CAAA,CAAE,IAAA,EAAM,CAAC,CAAA,CAAE,OAAO,OAAO,CAAA;AAC7E,MAAA,GAAA,CAAI,OAAA,CAAQ,CAAC,EAAA,KAAO,IAAA,CAAK,OAAO,EAAA,EAAI,aAAA,EAAe,EAAA,CAAG,CAAC,CAAC,CAAA;AACxD,MAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,GAAA,EAAK,IAAA,EAAM,CAAA,CAAE,CAAC,CAAA,CAAG,IAAA,EAAK,EAAG,IAAA,EAAM,EAAA,CAAG,CAAA,EAAE;AAAA,IAC5D;AAEA,IAAA,IAAIrC,KAAAA,CAAK,UAAA,CAAW,IAAI,CAAA,EAAG;AACzB,MAAA,MAAM,CAAA,GAAI,sBAAA,CAAuB,IAAA,CAAKA,KAAI,CAAA;AAC1C,MAAA,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,CAAG,IAAA,EAAK,GAAI,EAAA,EAAI,IAAA,EAAM,GAAG,CAAA,EAAE;AAAA,IACpE;AAEA,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,MAAM,CAAA,GAAI,6BAAA,CAA8B,IAAA,CAAKA,KAAI,CAAA;AACjD,MAAA,IAAI,CAAC,CAAA,EAAG,MAAM,IAAI,kBAAA,CAAmB,sDAAA,EAAwD,GAAG,CAAC,CAAA;AACjG,MAAA,IAAA,CAAK,OAAO,CAAA,CAAE,CAAC,CAAA,EAAI,aAAA,EAAe,GAAG,CAAC,CAAA;AACtC,MAAA,OAAO,EAAE,IAAA,EAAM,WAAA,EAAa,EAAA,EAAI,EAAE,CAAC,CAAA,EAAI,IAAA,EAAM,CAAA,CAAE,CAAC,CAAA,CAAG,IAAA,EAAK,EAAG,IAAA,EAAM,GAAG,CAAA,EAAE;AAAA,IACxE;AAEA,IAAA,IAAI,OAAO,SAAA,EAAW;AACpB,MAAA,MAAM,CAAA,GAAI,oBAAA,CAAqB,IAAA,CAAKA,KAAI,CAAA;AACxC,MAAA,IAAI,CAAC,CAAA,EAAG,MAAM,IAAI,kBAAA,CAAmB,6BAAA,EAA+B,GAAG,CAAC,CAAA;AACxE,MAAA,IAAA,CAAK,OAAO,CAAA,CAAE,CAAC,CAAA,EAAI,aAAA,EAAe,GAAG,CAAC,CAAA;AACtC,MAAA,OAAO,EAAE,MAAM,SAAA,EAAW,EAAA,EAAI,EAAE,CAAC,CAAA,EAAI,IAAA,EAAM,EAAA,CAAG,CAAA,EAAE;AAAA,IAClD;AAEA,IAAA,IAAI,OAAO,YAAA,EAAc;AACvB,MAAA,MAAM,CAAA,GAAI,yCAAA,CAA0C,IAAA,CAAKA,KAAI,CAAA;AAC7D,MAAA,MAAM,KAAA,GAAQ,CAAA,IAAK,CAAA,CAAE,CAAC,CAAA,GAAI,SAAS,CAAA,CAAE,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,CAAA;AAC/C,MAAA,MAAM,IAAA,GAAO,CAAA,IAAK,CAAA,CAAE,CAAC,CAAA,GAAI,SAAS,CAAA,CAAE,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,CAAA;AAC9C,MAAA,IAAA,CAAK,cAAA,GAAiB,EAAE,KAAA,EAAO,IAAA,EAAK;AACpC,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA,CAAK,aAAa,EAAE,CAAA;AAAA,EAC7B;AAAA,EAEQ,UAAU,EAAA,EAAmB;AACnC,IAAA,MAAM,CAAA,GAAI,sDAAA,CAAuD,IAAA,CAAK,EAAA,CAAG,IAAI,CAAA;AAC7E,IAAA,IAAI,CAAC,CAAA,EAAG;AACN,MAAA,MAAM,IAAI,kBAAA;AAAA,QACR,qEAAA;AAAA,QACA,EAAA,CAAG;AAAA,OACL;AAAA,IACF;AACA,IAAA,MAAM,YAAA,GAAe,CAAA,CAAE,CAAC,CAAA,CAAG,WAAA,EAAY;AACvC,IAAA,MAAM,SAAA,GACJ,iBAAiB,MAAA,GAAS,MAAA,GAAS,aAAa,UAAA,CAAW,MAAM,IAAI,MAAA,GAAS,OAAA;AAChF,IAAA,MAAM,MAAM,CAAA,CAAE,CAAC,CAAA,CAAG,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAMqC,8BAAY,CAAA,CAAE,IAAA,EAAM,CAAC,CAAA,CAAE,OAAO,OAAO,CAAA;AAC7E,IAAA,GAAA,CAAI,OAAA,CAAQ,CAAC,EAAA,KAAO,IAAA,CAAK,OAAO,EAAA,EAAI,aAAA,EAAe,EAAA,CAAG,CAAC,CAAC,CAAA;AACxD,IAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAA,EAAW,GAAA,EAAK,IAAA,EAAM,CAAA,CAAE,CAAC,CAAA,CAAG,IAAA,EAAK,EAAG,IAAA,EAAM,GAAG,CAAA,EAAE;AAAA,EACxE;AAAA,EAEQ,aAAa,EAAA,EAAsB;AACzC,IAAA,MAAMrC,QAAO,EAAA,CAAG,IAAA;AAChB,IAAA,MAAM,UAAA,GAAa,QAAA,CAAS,IAAA,CAAKA,KAAI,CAAA;AACrC,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,MAAM,IAAI,kBAAA,CAAmB,CAAA,yBAAA,EAA4BA,KAAI,CAAA,CAAA,CAAA,EAAK,GAAG,CAAC,CAAA;AAAA,IACxE;AACA,IAAA,MAAM,KAAA,GAAQ,WAAW,CAAC,CAAA;AAC1B,IAAA,MAAM,KAAK,UAAA,CAAW,KAAA;AACtB,IAAA,MAAM,OAAA,GAAUA,KAAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAChC,IAAA,IAAI,QAAA,GAAWA,KAAAA,CAAK,KAAA,CAAM,EAAA,GAAK,MAAM,MAAM,CAAA;AAG3C,IAAA,IAAI,KAAA;AACJ,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,OAAA,CAAQ,GAAG,CAAA;AAClC,IAAA,IAAI,SAAS,CAAA,EAAG;AACd,MAAA,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,KAAA,GAAQ,CAAC,EAAE,IAAA,EAAK;AACvC,MAAA,QAAA,GAAW,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA;AAAA,IACpC;AAGA,IAAA,IAAI,cAAA,GAAiB,KAAA;AACrB,IAAA,IAAI,gBAAA,GAAmB,KAAA;AACvB,IAAA,IAAI,IAAA,GAAO,QAAQ,IAAA,EAAK;AACxB,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,EAAG;AACtB,MAAA,cAAA,GAAiB,IAAA;AACjB,MAAA,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,EAAE,IAAA,EAAK;AAAA,IAChC,CAAA,MAAA,IAAW,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,EAAG;AAC7B,MAAA,gBAAA,GAAmB,IAAA;AACnB,MAAA,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,EAAE,IAAA,EAAK;AAAA,IAChC;AACA,IAAA,IAAI,KAAA,GAAQ,SAAS,IAAA,EAAK;AAC1B,IAAA,IAAI,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA,EAAG;AACzB,MAAA,cAAA,GAAiB,IAAA;AACjB,MAAA,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,EAAK;AAAA,IAC9B,CAAA,MAAA,IAAW,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA,EAAG;AAChC,MAAA,gBAAA,GAAmB,IAAA;AACnB,MAAA,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,EAAK;AAAA,IAC9B;AAEA,IAAA,MAAMkC,MAAAA,GAAQ,UAAU,KAAK,CAAA;AAG7B,IAAA,IAAI,MAAA,GAAS,KAAA;AACb,IAAA,IAAI,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA,EAAG;AACzB,MAAA,MAAA,GAAS,IAAA;AACT,MAAA,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,EAAK;AAAA,IAC9B;AAEA,IAAA,MAAM,IAAA,GAAOA,MAAAA,KAAU,OAAA,GAAU,EAAA,GAAKG,8BAAY,IAAI,CAAA;AACtD,IAAA,MAAM,EAAA,GAAKH,MAAAA,KAAU,MAAA,GAAS,EAAA,GAAKG,8BAAY,KAAK,CAAA;AAEpD,IAAA,IAAI,MAAM,IAAA,CAAK,MAAA,CAAO,IAAA,EAAM,aAAA,EAAe,GAAG,CAAC,CAAA;AAC/C,IAAA,IAAI,EAAA,EAAI;AACN,MAAA,MAAM,IAAI,IAAA,CAAK,MAAA,CAAO,EAAA,EAAI,aAAA,EAAe,GAAG,CAAC,CAAA;AAC7C,MAAA,IAAI,MAAA,IAAU,aAAA,GAAgB,IAAA;AAAA,IAChC;AAEA,IAAA,MAAM,GAAA,GAAkB;AAAA,MACtB,IAAA,EAAM,SAAA;AAAA,MACN,IAAA;AAAA,MACA,EAAA;AAAA,MACA,KAAA,EAAAH,MAAAA;AAAA,MACA,MAAM,EAAA,CAAG;AAAA,KACX;AACA,IAAA,IAAI,KAAA,MAAW,KAAA,GAAQ,KAAA;AACvB,IAAA,IAAI,cAAA,MAAoB,cAAA,GAAiB,IAAA;AACzC,IAAA,IAAI,gBAAA,MAAsB,gBAAA,GAAmB,IAAA;AAC7C,IAAA,IAAI,MAAA,MAAY,MAAA,GAAS,IAAA;AACzB,IAAA,OAAO,GAAA;AAAA,EACT;AACF,CAAA;AAEO,SAAS,cAAclC,KAAAA,EAAsB;AAClD,EAAA,OAAO,IAAI,cAAA,CAAeA,KAAI,CAAA,CAAE,KAAA,EAAM;AACxC;;;ACvbO,IAAM,SAAA,GAAY;AAAA,EACvB,UAAA,EAAY,EAAA;AAAA,EACZ,MAAA,EAAQ,EAAA;AAAA,EACR,UAAA,EAAY,EAAA;AAAA,EACZ,YAAA,EAAc,GAAA;AAAA,EACd,WAAA,EAAa,EAAA;AAAA,EACb,SAAA,EAAW,EAAA;AAAA,EACX,OAAA,EAAS,EAAA;AAAA,EACT,aAAA,EAAe,EAAA;AAAA,EACf,SAAA,EAAW,EAAA;AAAA,EACX,UAAA,EAAY,EAAA;AAAA,EACZ,QAAA,EAAU,EAAA;AAAA,EACV,WAAA,EAAa,EAAA;AAAA,EACb,KAAA,EAAO,EAAA;AAAA,EACP,WAAA,EAAa,CAAA;AAAA,EACb,QAAA,EAAU,EAAA;AAAA,EACV,UAAA,EAAY,EAAA;AAAA,EACZ,YAAA,EAAc,EAAA;AAAA,EACd,YAAA,EAAc,EAAA;AAAA,EACd,eAAA,EAAiB,EAAA;AAAA,EACjB,eAAA,EAAiB,EAAA;AAAA,EACjB,gBAAA,EAAkB,EAAA;AAAA,EAClB,eAAA,EAAiB,CAAA;AAAA,EACjB,KAAA,EAAO,EAAA;AAAA,EACP,cAAA,EAAgB,EAAA;AAAA,EAChB,eAAA,EAAiB,EAAA;AAAA,EACjB,QAAA,EAAU,CAAA;AAAA,EACV,UAAA,EAAY,EAAA;AAAA,EACZ,WAAA,EAAa,EAAA;AAAA,EACb,aAAA,EAAe,EAAA;AAAA,EACf,KAAA,EAAO,EAAA;AAAA,EACP,cAAA,EAAgB,CAAA;AAAA,EAChB,cAAA,EAAgB,EAAA;AAAA,EAChB,OAAA,EAAS,EAAA;AAAA,EACT,KAAA,EAAO,EAAA;AAAA,EACP,aAAA,EAAe,EAAA;AAAA,EACf,QAAA,EAAU;AACZ,CAAA;AAEA,IAAM,UAAA,GAAa,EAAA;AACnB,IAAM,cAAA,GAAiB,IAAA;AAEvB,SAAS,SAAA,CAAU,GAAW,IAAA,EAAsB;AAClD,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,KAAA,MAAW,MAAM,CAAA,EAAG;AAClB,IAAA,CAAA,IAAK,OAAA,CAAQ,IAAA,CAAK,EAAE,CAAA,GAAI,OAAO,IAAA,GAAO,IAAA;AAAA,EACxC;AACA,EAAA,OAAO,CAAA;AACT;AAaA,IAAM,iBAAN,MAAqB;AAAA,EACX,GAAA;AAAA,EACA,YAA2B,EAAC;AAAA,EAC5B,KAAA,uBAAY,GAAA,EAAoB;AAAA,EAChC,MAAA,uBAAa,GAAA,EAAyB;AAAA,EACtC,IAAc,EAAC;AAAA,EACf,QAAkB,EAAC;AAAA,EAEnB,CAAA,GAAI,CAAA;AAAA,EACJ,IAAA,uBAAW,GAAA,EAAuB;AAAA,EAClC,cAAwB,EAAC;AAAA,EAEzB,WAA4B,EAAC;AAAA,EAC7B,cAAkC,EAAC;AAAA,EACnC,YAAgC,EAAC;AAAA,EACjC,OAAsB,EAAC;AAAA,EACvB,QAAsB,EAAC;AAAA,EACvB,WAA4B,EAAC;AAAA,EAC7B,aAAgC,EAAC;AAAA,EACjC,WAAuC,EAAC;AAAA,EACxC,WAAqB,EAAC;AAAA,EAEtB,WAAA,GAA6B,IAAA;AAAA,EAC7B,YAAA,GAAe,CAAA;AAAA,EAEvB,YAAY,GAAA,EAAa;AACvB,IAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AAAA,EACb;AAAA,EAEA,GAAA,GAAuB;AACrB,IAAA,IAAA,CAAK,YAAA,EAAa;AAClB,IAAA,IAAI,KAAK,GAAA,CAAI,UAAA,OAAiB,WAAA,GAAc,IAAA,CAAK,IAAI,UAAA,CAAW,KAAA;AAGhE,IAAA,MAAM,UAAA,GAAa,SAAA,CAAU,OAAA,GAAU,SAAA,CAAU,MAAA;AACjD,IAAA,IAAA,CAAK,CAAA,GAAI,UAAA,GAAa,SAAA,CAAU,aAAA,GAAgB,SAAA,CAAU,SAAA;AAE1D,IAAA,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,UAAA,EAAY,CAAC,CAAA;AAGhC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,CAAA,GAAI,SAAA,CAAU,SAAA;AACnC,IAAA,KAAA,MAAW,CAAC,EAAA,EAAI,KAAK,CAAA,IAAK,KAAK,IAAA,EAAM;AACnC,MAAA,OAAO,MAAM,MAAA,EAAQ;AACnB,QAAA,MAAM,CAAA,GAAI,MAAM,GAAA,EAAI;AACpB,QAAA,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,EAAE,EAAA,EAAI,GAAG,CAAA,CAAE,CAAA,EAAG,IAAA,EAAM,CAAA,CAAE,MAAM,OAAA,EAAS,OAAA,EAAS,KAAA,EAAO,CAAA,CAAE,OAAO,CAAA;AAAA,MACtF;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,UAAU,SAAA,CAAU,UAAA;AACvC,IAAA,KAAA,MAAW,EAAA,IAAM,KAAK,SAAA,EAAW;AAC/B,MAAA,IAAI,CAAC,EAAA,CAAG,SAAA,EAAW,EAAA,CAAG,UAAA,GAAa,UAAA;AAAA,IACrC;AAEA,IAAA,MAAM,UAAA,GAAa,KAAK,CAAA,CAAE,IAAA,CAAK,EAAE,MAAA,GAAS,CAAC,KAAK,SAAA,CAAU,WAAA;AAC1D,IAAA,MAAM,QAAA,GAAA,CAAY,KAAK,KAAA,CAAM,IAAA,CAAK,MAAM,MAAA,GAAS,CAAC,CAAA,IAAK,SAAA,CAAU,UAAA,IAAc,CAAA;AAC/E,IAAA,IAAA,CAAK,eAAe,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,YAAA,EAAc,aAAa,QAAQ,CAAA;AACrE,IAAA,MAAM,QAAQ,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,YAAA,GAAe,UAAU,SAAS,CAAA;AAChE,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA;AAEpC,IAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,QAAA,EAAU,CAAA,CAAE,KAAA,GAAQ,KAAA;AAEzC,IAAA,MAAM,MAAA,GAA0B;AAAA,MAC9B,KAAA;AAAA,MACA,MAAA;AAAA,MACA,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,UAAU,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,IAAA,CAAK,IAAI,QAAQ,CAAA;AAAA,MAChD,KAAK,IAAA,CAAK;AAAA,KACZ;AACA,IAAA,IAAI,KAAK,GAAA,CAAI,KAAA,EAAO,MAAA,CAAO,KAAA,GAAQ,KAAK,GAAA,CAAI,KAAA;AAC5C,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA,EAIQ,YAAA,GAAqB;AAC3B,IAAA,MAAM,EAAA,GAAK,KAAK,GAAA,CAAI,YAAA;AACpB,IAAA,IAAA,CAAK,QAAQ,EAAA,CAAG,GAAA;AAAA,MAAI,CAAC,CAAA,KACnB,IAAA,CAAK,GAAA,CAAI,SAAA,CAAU,YAAY,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,CAAA,CAAE,MAAM,cAAc,CAAC,CAAA,GAAI,SAAA,CAAU,aAAa,CAAC;AAAA,KACxG;AACA,IAAA,EAAA,CAAG,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM,IAAA,CAAK,MAAM,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,CAAC,CAAC,CAAA;AAE5C,IAAA,MAAM,IAAI,EAAA,CAAG,MAAA;AACb,IAAA,MAAM,IAAA,GAAO,IAAI,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,SAAA,CAAU,YAAY,CAAA;AAEtE,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,MAAA,IAAA,CAAK,CAAC,CAAA,GAAI,IAAA,CAAK,IAAI,IAAA,CAAK,CAAC,GAAG,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,GAAK,IAAI,IAAA,CAAK,KAAA,CAAM,IAAI,CAAC,CAAA,GAAK,IAAI,EAAE,CAAA;AAAA,IAC9E;AAGA,IAAA,MAAM,IAAA,GAAO,eAAA,CAAgB,IAAA,CAAK,GAAA,CAAI,UAAU,CAAA;AAChD,IAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,MAAA,MAAM,KAAA,GAAQ,EAAE,KAAA,IAAS,EAAA;AACzB,MAAA,MAAM,CAAA,GAAI,SAAA,CAAU,KAAA,EAAO,UAAU,IAAI,SAAA,CAAU,aAAA;AACnD,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,EAAE,IAAI,CAAA;AAChC,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,EAAE,EAAE,CAAA;AAC9B,MAAA,IAAI,EAAA,KAAO,MAAA,IAAa,EAAA,KAAO,MAAA,EAAW;AAC1C,MAAA,IAAI,EAAA,KAAO,MAAA,IAAa,EAAA,KAAO,MAAA,EAAW;AAC1C,MAAA,IAAI,OAAO,EAAA,EAAI;AACb,QAAA,IAAI,EAAA,GAAK,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,EAAE,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,EAAI,SAAA,CAAU,cAAc,CAAC,CAAA;AAC9E,QAAA;AAAA,MACF;AACA,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AACzB,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AACzB,MAAA,IAAI,CAAA,KAAM,IAAI,CAAA,EAAG;AACf,QAAA,IAAA,CAAK,CAAC,CAAA,GAAI,IAAA,CAAK,IAAI,IAAA,CAAK,CAAC,GAAI,CAAC,CAAA;AAAA,MAChC,CAAA,MAAO;AACL,QAAA,IAAI,IAAA,GAAO,CAAA;AACX,QAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,GAAG,CAAA,EAAA,EAAK,IAAA,IAAQ,KAAK,CAAC,CAAA;AAC1C,QAAA,IAAI,OAAO,CAAA,EAAG;AACZ,UAAA,MAAM,GAAA,GAAA,CAAO,CAAA,GAAI,IAAA,KAAS,CAAA,GAAI,CAAA,CAAA;AAC9B,UAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,GAAG,CAAA,EAAA,EAAK,IAAA,CAAK,CAAC,CAAA,IAAM,GAAA;AAAA,QAC1C;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,CAAA,GAAI,IAAI,KAAA,CAAM,CAAC,CAAA;AACpB,IAAA,IAAI,EAAA,GAAK,UAAU,WAAA,GAAA,CAAe,IAAA,CAAK,MAAM,CAAC,CAAA,IAAK,UAAU,UAAA,IAAc,CAAA;AAC3E,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,MAAA,IAAA,CAAK,CAAA,CAAE,CAAC,CAAA,GAAI,EAAA;AACZ,MAAA,IAAI,CAAA,GAAI,IAAA,CAAK,MAAA,EAAQ,EAAA,IAAM,KAAK,CAAC,CAAA;AAAA,IACnC;AAEA,IAAA,EAAA,CAAG,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM;AACnB,MAAA,MAAM,OAAA,GAAU,EAAE,aAAA,KAAkB,IAAA;AACpC,MAAA,MAAM,KAAA,GAAQ,OAAA,GAAU,EAAA,GAAK,SAAA,CAAU,OAAA;AACvC,MAAA,MAAM,EAAA,GAAkB;AAAA,QACtB,WAAA,EAAa,CAAA;AAAA,QACb,KAAA,EAAO,CAAA;AAAA,QACP,CAAA,EAAG,IAAA,CAAK,CAAA,CAAE,CAAC,CAAA;AAAA,QACX,KAAA,EAAO,KAAK,CAAA,CAAE,CAAC,IAAK,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,GAAK,CAAA;AAAA,QACrC,KAAA;AAAA,QACA,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AAAA,QACnB,OAAO,SAAA,CAAU,MAAA;AAAA,QACjB,OAAA,EAAS,OAAA,GAAU,EAAA,GAAK,SAAA,CAAU,UAAU,SAAA,CAAU,MAAA;AAAA,QACtD,UAAA,EAAY,CAAA;AAAA,QACZ,SAAA,EAAW;AAAA,OACb;AACA,MAAA,IAAA,CAAK,SAAA,CAAU,KAAK,EAAE,CAAA;AACtB,MAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,EAAE,CAAA;AAAA,IAC1B,CAAC,CAAA;AAAA,EACH;AAAA;AAAA,EAIQ,MAAM,GAAA,EAA+B;AAC3C,IAAA,IAAI,QAAQ,MAAA,EAAW;AACvB,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,WAAA,EAAa;AAClC,MAAA,IAAI,GAAA,GAAM,GAAA,CAAI,GAAA,EAAK,GAAA,CAAI,GAAA,GAAM,GAAA;AAC7B,MAAA,IAAI,GAAA,GAAM,GAAA,CAAI,GAAA,EAAK,GAAA,CAAI,GAAA,GAAM,GAAA;AAAA,IAC/B;AAAA,EACF;AAAA,EAEQ,SAAA,CAAU,GAAW,CAAA,EAAiB;AAC5C,IAAA,IAAA,CAAK,eAAe,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,YAAA,EAAc,IAAI,CAAC,CAAA;AAAA,EACvD;AAAA;AAAA,EAIQ,QAAQ,EAAA,EAAkB;AAChC,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,EAAE,CAAA;AAC7B,IAAA,IAAI,QAAQ,MAAA,EAAW;AACvB,IAAA,MAAM,QAAQ,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,EAAE,KAAK,EAAC;AACpC,IAAA,MAAM,QAAQ,KAAA,CAAM,MAAA;AACpB,IAAA,MAAM,CAAA,GAAI,KAAK,CAAA,CAAE,GAAG,IAAK,SAAA,CAAU,KAAA,GAAQ,CAAA,GAAI,KAAA,GAAQ,SAAA,CAAU,WAAA;AACjE,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA,EAAG,MAAM,IAAA,CAAK,CAAA,EAAG,OAAO,CAAA;AACrC,IAAA,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,KAAK,CAAA;AAAA,EACzB;AAAA,EAEQ,SAAS,EAAA,EAAkB;AACjC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AAC9B,IAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AAChC,MAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,CAAA,YAAA,EAAe,EAAE,CAAA,6BAAA,CAA+B,CAAA;AACnE,MAAA;AAAA,IACF;AACA,IAAA,MAAM,CAAA,GAAI,MAAM,GAAA,EAAI;AACpB,IAAA,IAAA,CAAK,YAAY,IAAA,CAAK,EAAE,EAAA,EAAI,CAAA,EAAG,EAAE,CAAA,EAAG,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,SAAS,IAAA,CAAK,CAAA,EAAG,KAAA,EAAO,CAAA,CAAE,OAAO,CAAA;AAAA,EACrF;AAAA,EAEQ,QAAA,CAAS,EAAA,EAAY,GAAA,EAAa,WAAA,EAAsB,aAAa,CAAA,EAAW;AACtF,IAAA,MAAM,QAAQ,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,EAAE,KAAK,EAAC;AACpC,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,GAAS,UAAA;AAC9B,IAAA,IAAI,MAAA,IAAU,CAAA,EAAG,OAAO,IAAA,CAAK,EAAE,GAAG,CAAA;AAClC,IAAA,IAAI,CAAC,aAAa,OAAO,IAAA,CAAK,EAAE,GAAG,CAAA,GAAK,UAAU,KAAA,GAAQ,CAAA;AAC1D,IAAA,OAAO,IAAA,CAAK,EAAE,GAAG,CAAA,GAAK,UAAU,KAAA,GAAQ,CAAA,GAAA,CAAK,MAAA,GAAS,CAAA,IAAK,SAAA,CAAU,WAAA;AAAA,EACvE;AAAA;AAAA,EAIQ,IAAA,CAAK,OAAuB,KAAA,EAAqB;AACvD,IAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,MAAA,QAAQ,EAAE,IAAA;AAAM,QACd,KAAK,SAAA;AACH,UAAA,IAAA,CAAK,aAAa,CAAC,CAAA;AACnB,UAAA;AAAA,QACF,KAAK,UAAA;AACH,UAAA,IAAA,CAAK,KAAK,SAAA,CAAU,QAAA;AACpB,UAAA,IAAA,CAAK,OAAA,CAAQ,EAAE,EAAE,CAAA;AACjB,UAAA,IAAA,CAAK,MAAM,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,EAAE,CAAC,CAAA;AAC/B,UAAA;AAAA,QACF,KAAK,YAAA;AACH,UAAA,IAAA,CAAK,KAAK,SAAA,CAAU,QAAA;AACpB,UAAA,IAAA,CAAK,QAAA,CAAS,EAAE,EAAE,CAAA;AAClB,UAAA,IAAA,CAAK,MAAM,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,EAAE,CAAC,CAAA;AAC/B,UAAA;AAAA,QACF,KAAK,MAAA;AACH,UAAA,IAAA,CAAK,UAAU,CAAC,CAAA;AAChB,UAAA;AAAA,QACF,KAAK,KAAA;AACH,UAAA,IAAA,CAAK,QAAA,CAAS,CAAA,CAAE,GAAA,EAAK,CAAA,CAAE,IAAI,CAAA;AAC3B,UAAA;AAAA,QACF,KAAK,SAAA;AACH,UAAA,IAAA,CAAK,KAAK,SAAA,CAAU,cAAA;AACpB,UAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,EAAE,IAAA,EAAM,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,CAAK,CAAA,GAAI,SAAA,CAAU,KAAA,GAAQ,CAAA,EAAG,KAAA,EAAO,GAAG,CAAA;AAC9E,UAAA,IAAA,CAAK,KAAK,SAAA,CAAU,KAAA;AACpB,UAAA;AAAA,QACF,KAAK,WAAA;AACH,UAAA,IAAA,CAAK,cAAA,CAAe,CAAA,CAAE,EAAA,EAAI,CAAA,CAAE,IAAI,CAAA;AAChC,UAAA;AAAA,QACF,KAAK,SAAA;AACH,UAAA,IAAA,CAAK,YAAA,CAAa,EAAE,EAAE,CAAA;AACtB,UAAA;AAAA,QACF,KAAK,UAAA;AACH,UAAA,IAAA,CAAK,cAAc,CAAA,CAAE,EAAA,EAAI,EAAE,QAAA,EAAU,KAAA,EAAO,EAAE,UAAU,CAAA;AACxD,UAAA;AAAA;AACJ,IACF;AAAA,EACF;AAAA,EAEQ,UAAA,GAAiC;AACvC,IAAA,IAAI,KAAK,WAAA,KAAgB,IAAA,IAAQ,CAAC,IAAA,CAAK,GAAA,CAAI,YAAY,OAAO,MAAA;AAC9D,IAAA,MAAM,IAAI,IAAA,CAAK,WAAA;AACf,IAAA,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,GAAA,CAAI,UAAA,CAAW,IAAA;AACxC,IAAA,OAAO,CAAA;AAAA,EACT;AAAA,EAEQ,aAAa,CAAA,EAAqB;AACxC,IAAA,IAAA,CAAK,KAAK,SAAA,CAAU,SAAA;AACpB,IAAA,MAAM,IAAI,IAAA,CAAK,CAAA;AACf,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,EAAE,IAAI,CAAA;AAChC,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,EAAE,EAAE,CAAA;AAC9B,IAAA,MAAM,OAAO,CAAA,CAAE,IAAA,KAAS,EAAA,IAAM,CAAA,CAAE,SAAS,CAAA,CAAE,EAAA;AAE3C,IAAA,IAAI,EAAA;AACJ,IAAA,IAAI,EAAA;AAEJ,IAAA,IAAI,CAAA,CAAE,UAAU,OAAA,EAAS;AAEvB,MAAA,MAAM,CAAA,GAAI,EAAA;AACV,MAAA,EAAA,GAAK,IAAA,CAAK,QAAA,CAAS,CAAA,CAAE,EAAA,EAAI,GAAG,KAAK,CAAA;AACjC,MAAA,EAAA,GAAK,KAAK,SAAA,CAAU,QAAA;AAAA,IACtB,CAAA,MAAA,IAAW,CAAA,CAAE,KAAA,KAAU,MAAA,EAAQ;AAE7B,MAAA,MAAM,CAAA,GAAI,EAAA;AACV,MAAA,EAAA,GAAK,IAAA,CAAK,QAAA,CAAS,CAAA,CAAE,IAAA,EAAM,GAAG,IAAI,CAAA;AAClC,MAAA,EAAA,GAAK,KAAK,SAAA,CAAU,QAAA;AAAA,IACtB,WAAW,IAAA,EAAM;AACf,MAAA,MAAM,CAAA,GAAI,EAAA;AACV,MAAA,EAAA,GAAK,IAAA,CAAK,QAAA,CAAS,CAAA,CAAE,IAAA,EAAM,GAAG,IAAI,CAAA;AAClC,MAAA,EAAA,GAAK,KAAK,SAAA,CAAU,WAAA;AAAA,IACtB,CAAA,MAAO;AACL,MAAA,MAAM,SAAA,GAAA,CAAa,EAAA,IAAM,CAAA,KAAM,EAAA,IAAM,CAAA,CAAA;AACrC,MAAA,EAAA,GAAK,IAAA,CAAK,QAAA,CAAS,CAAA,CAAE,IAAA,EAAM,IAAK,SAAS,CAAA;AACzC,MAAA,IAAI,EAAE,MAAA,EAAQ;AAEZ,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,EAAG,CAAA,GAAK,CAAA;AACjC,QAAA,EAAA,GAAK,SAAA,GAAY,KAAK,CAAA,CAAE,EAAG,IAAK,KAAA,GAAQ,IAAA,CAAK,CAAA,CAAE,EAAG,CAAA,GAAK,KAAA;AAAA,MACzD,CAAA,MAAO;AACL,QAAA,EAAA,GAAK,IAAA,CAAK,QAAA,CAAS,CAAA,CAAE,EAAA,EAAI,EAAA,EAAK,CAAC,SAAA,EAAW,CAAA,CAAE,cAAA,GAAiB,CAAA,GAAI,CAAC,CAAA;AAAA,MACpE;AAAA,IACF;AAEA,IAAA,MAAM,MAAqB,EAAE,OAAA,EAAS,GAAG,CAAA,EAAG,EAAA,EAAI,IAAI,IAAA,EAAK;AACzD,IAAA,MAAM,GAAA,GAAM,KAAK,UAAA,EAAW;AAC5B,IAAA,IAAI,GAAA,KAAQ,MAAA,EAAW,GAAA,CAAI,MAAA,GAAS,GAAA;AACpC,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,GAAA,CAAI,WAAA,GAAc,IAAI,SAAA,CAAU,QAAA;AAChC,MAAA,IAAA,CAAK,IAAI,GAAA,CAAI,WAAA;AAAA,IACf;AACA,IAAA,IAAA,CAAK,QAAA,CAAS,KAAK,GAAG,CAAA;AACtB,IAAA,IAAA,CAAK,eAAe,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,YAAA,EAAc,IAAI,EAAE,CAAA;AACtD,IAAA,IAAA,CAAK,MAAM,EAAE,CAAA;AACb,IAAA,IAAA,CAAK,MAAM,EAAE,CAAA;AAGb,IAAA,IAAI,CAAA,CAAE,MAAA,IAAU,EAAA,KAAO,MAAA,EAAW;AAChC,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,EAAE,EAAE,CAAA;AAC/B,MAAA,EAAA,CAAG,KAAA,GAAQ,CAAA,GAAI,SAAA,CAAU,MAAA,GAAS,CAAA;AAClC,MAAA,EAAA,CAAG,OAAA,GAAU,EAAA,CAAG,KAAA,GAAQ,SAAA,CAAU,MAAA;AAAA,IACpC;AAEA,IAAA,IAAI,EAAE,cAAA,IAAkB,EAAA,KAAO,QAAW,IAAA,CAAK,OAAA,CAAQ,EAAE,EAAE,CAAA;AAC3D,IAAA,IAAI,EAAE,gBAAA,IAAoB,EAAA,KAAO,QAAW,IAAA,CAAK,QAAA,CAAS,EAAE,IAAI,CAAA;AAAA,EAClE;AAAA,EAEQ,UAAU,IAAA,EAAqB;AACrC,IAAA,IAAA,CAAK,KAAK,SAAA,CAAU,eAAA;AACpB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,gBAAgB,CAAA;AAC9C,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,MAAA,CAAO,CAAC,IAAI,CAAA,KAAM,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,SAAA,CAAU,CAAA,EAAG,UAAU,CAAC,GAAG,CAAC,CAAA;AAC/E,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,SAAA,CAAU,UAAA,EAAY,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA,GAAI,SAAA,CAAU,QAAA,GAAW,CAAC,CAAA;AAClF,IAAA,MAAM,IAAI,KAAA,CAAM,MAAA,GAAS,SAAA,CAAU,WAAA,GAAc,UAAU,QAAA,GAAW,CAAA;AACtE,IAAA,MAAM,MAAM,IAAA,CAAK,CAAA;AAEjB,IAAA,MAAM,OAAO,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,CAAC,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,EAAE,CAAC,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAmB,MAAM,MAAS,CAAA;AAChG,IAAA,IAAA,CAAK,QAAQ,CAAC,CAAA,KAAM,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AAEjC,IAAA,IAAI,CAAA;AACJ,IAAA,IAAI,IAAA,GAAO,CAAA;AACX,IAAA,IAAI,IAAA,CAAK,SAAA,KAAc,MAAA,IAAU,IAAA,CAAK,UAAU,CAAA,EAAG;AACjD,MAAA,MAAM,IAAI,IAAA,CAAK,CAAA,CAAE,KAAK,GAAA,CAAI,GAAG,IAAI,CAAC,CAAA;AAClC,MAAA,MAAM,IAAI,IAAA,CAAK,CAAA,CAAE,KAAK,GAAA,CAAI,GAAG,IAAI,CAAC,CAAA;AAClC,MAAA,MAAM,OAAO,CAAA,GAAI,CAAA,GAAI,KAAK,KAAA,CAAM,IAAA,CAAK,IAAI,GAAG,IAAI,CAAC,CAAA,GAAK,CAAA,GAAI,KAAK,KAAA,CAAM,IAAA,CAAK,IAAI,GAAG,IAAI,CAAC,CAAA,GAAK,CAAA;AAC3F,MAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAI,CAAA;AACvB,MAAA,CAAA,GAAA,CAAK,CAAA,GAAI,CAAA,IAAK,CAAA,GAAI,IAAA,GAAO,CAAA;AAAA,IAC3B,CAAA,MAAA,IAAW,IAAA,CAAK,SAAA,KAAc,MAAA,IAAU,KAAK,MAAA,EAAQ;AACnD,MAAA,CAAA,GAAI,KAAK,CAAA,CAAE,IAAA,CAAK,CAAC,CAAE,CAAA,GAAK,UAAU,aAAA,GAAgB,CAAA;AAAA,IACpD,CAAA,MAAA,IAAW,IAAA,CAAK,SAAA,KAAc,OAAA,IAAW,KAAK,MAAA,EAAQ;AACpD,MAAA,CAAA,GAAI,KAAK,CAAA,CAAE,IAAA,CAAK,CAAC,CAAE,IAAK,SAAA,CAAU,aAAA;AAAA,IACpC,CAAA,MAAO;AACL,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,CAAC,CAAA,IAAK,CAAA;AACrB,MAAA,CAAA,GAAI,IAAA,CAAK,CAAA,CAAE,CAAC,CAAA,GAAK,CAAA,GAAI,CAAA;AAAA,IACvB;AAEA,IAAA,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA,EAAG,CAAA,EAAG,GAAA,EAAK,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,CAAA,EAAG,CAAA;AAC3D,IAAA,IAAA,CAAK,SAAA,CAAU,GAAG,IAAI,CAAA;AACtB,IAAA,IAAA,CAAK,IAAI,GAAA,GAAM,CAAA;AAAA,EACjB;AAAA,EAEQ,QAAA,CAAS,KAAeA,KAAAA,EAAoB;AAClD,IAAA,IAAA,CAAK,KAAK,SAAA,CAAU,cAAA;AACpB,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,GAAA,CAAI,CAAC,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,EAAE,CAAC,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAmB,MAAM,MAAS,CAAA;AAC3F,IAAA,IAAA,CAAK,QAAQ,CAAC,CAAA,KAAM,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AACjC,IAAA,MAAM,OAAO,IAAA,CAAK,MAAA,GAAS,KAAK,GAAA,CAAI,GAAG,IAAI,CAAA,GAAI,CAAA;AAC/C,IAAA,MAAM,OAAO,IAAA,CAAK,MAAA,GAAS,KAAK,GAAA,CAAI,GAAG,IAAI,CAAA,GAAI,CAAA;AAC/C,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,CAAA,CAAE,IAAI,IAAK,SAAA,CAAU,UAAA;AACvC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,CAAA,CAAE,IAAI,IAAK,SAAA,CAAU,UAAA;AACxC,IAAA,MAAM,MAAM,IAAA,CAAK,CAAA;AACjB,IAAA,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAAA,OAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,GAAA,EAAK,OAAO,KAAA,GAAQ,IAAA,EAAM,MAAA,EAAQ,SAAA,CAAU,OAAO,CAAA;AACtF,IAAA,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,KAAA,GAAQ,IAAI,CAAA;AACjC,IAAA,IAAA,CAAK,CAAA,GAAI,MAAM,SAAA,CAAU,KAAA;AAAA,EAC3B;AAAA,EAEQ,cAAA,CAAe,IAAYA,KAAAA,EAAoB;AACrD,IAAA,IAAA,CAAK,KAAK,SAAA,CAAU,cAAA;AACpB,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,EAAE,CAAA;AAC7B,IAAA,IAAA,CAAK,MAAM,GAAG,CAAA;AACd,IAAA,MAAM,CAAA,GAAI,KAAK,IAAA,CAAK,SAAA,CAAUA,OAAM,UAAU,CAAC,CAAA,GAAI,SAAA,CAAU,OAAA,GAAU,CAAA;AACvE,IAAA,MAAM,KAAK,GAAA,KAAQ,MAAA,GAAY,KAAK,CAAA,CAAE,GAAG,IAAK,SAAA,CAAU,WAAA;AACxD,IAAA,MAAM,MAAM,IAAA,CAAK,CAAA;AACjB,IAAA,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,EAAE,IAAA,EAAAA,KAAAA,EAAM,EAAA,EAAI,CAAA,EAAG,GAAA,EAAK,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,SAAA,CAAU,OAAO,CAAA;AAC5E,IAAA,IAAA,CAAK,SAAA,CAAU,EAAA,GAAK,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA;AAC5B,IAAA,IAAA,CAAK,CAAA,GAAI,MAAM,SAAA,CAAU,KAAA;AAAA,EAC3B;AAAA,EAEQ,aAAa,EAAA,EAAkB;AACrC,IAAA,IAAA,CAAK,CAAA,IAAK,UAAU,SAAA,GAAY,CAAA;AAChC,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AAC7B,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,EAAE,CAAA;AAC7B,IAAA,IAAI,EAAA,IAAM,QAAQ,MAAA,EAAW;AAC3B,MAAA,EAAA,CAAG,SAAA,GAAY,IAAA;AACf,MAAA,EAAA,CAAG,aAAa,IAAA,CAAK,CAAA;AACrB,MAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,EAAE,CAAA,EAAG,IAAA,CAAK,CAAA,CAAE,GAAG,CAAA,EAAI,CAAA,EAAG,IAAA,CAAK,CAAA,EAAG,CAAA;AACjD,MAAA,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,IAChB;AAAA,EACF;AAAA,EAEQ,aAAA,CACN,EAAA,EACA,QAAA,EACA,KAAA,EACA,UAAA,EACM;AACN,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,CAAA,GAAI,SAAA,CAAU,eAAA;AACpC,IAAA,MAAM,MAAc,EAAE,GAAA,EAAK,OAAO,iBAAA,EAAmB,GAAA,EAAK,OAAO,iBAAA,EAAkB;AACnF,IAAA,IAAA,CAAK,WAAA,CAAY,KAAK,GAAG,CAAA;AAEzB,IAAA,MAAM,cAAwC,EAAC;AAG/C,IAAA,IAAA,CAAK,IAAI,QAAA,GAAW,SAAA,CAAU,YAAA,GAAe,SAAA,CAAU,eAAe,SAAA,CAAU,SAAA;AAChF,IAAA,MAAM,YAAoC,EAAC;AAC3C,IAAA,IAAI,QAAA,CAAS,CAAC,CAAA,EAAG,KAAA,YAAiB,KAAA,GAAQ,QAAA,CAAS,CAAC,CAAA,CAAE,KAAA;AACtD,IAAA,WAAA,CAAY,KAAK,SAAS,CAAA;AAC1B,IAAA,IAAA,CAAK,IAAA,CAAK,SAAS,CAAC,CAAA,EAAG,cAAc,EAAC,EAAG,QAAQ,CAAC,CAAA;AAGlD,IAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,QAAA,CAAS,QAAQ,EAAA,EAAA,EAAM;AAC3C,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,CAAA,GAAI,SAAA,CAAU,gBAAA;AAChC,MAAA,MAAM,IAAA,GAA+B,EAAE,IAAA,EAAK;AAC5C,MAAA,IAAI,QAAA,CAAS,EAAE,CAAA,CAAG,KAAA,OAAY,KAAA,GAAQ,QAAA,CAAS,EAAE,CAAA,CAAG,KAAA;AACpD,MAAA,WAAA,CAAY,KAAK,IAAI,CAAA;AACrB,MAAA,IAAA,CAAK,CAAA,GAAI,IAAA,GAAO,SAAA,CAAU,YAAA,GAAe,SAAA,CAAU,SAAA;AACnD,MAAA,IAAA,CAAK,KAAK,QAAA,CAAS,EAAE,CAAA,CAAG,UAAA,EAAY,QAAQ,CAAC,CAAA;AAAA,IAC/C;AAEA,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,CAAA,GAAI,SAAA,CAAU,eAAA;AACvC,IAAA,IAAA,CAAK,YAAY,GAAA,EAAI;AAIrB,IAAA,IAAI,OAAO,GAAA,CAAI,GAAA;AACf,IAAA,IAAI,OAAO,GAAA,CAAI,GAAA;AACf,IAAA,IAAI,CAAC,QAAA,CAAS,IAAI,CAAA,EAAG;AACnB,MAAA,IAAA,GAAO,CAAA;AACP,MAAA,IAAA,GAAO,KAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,SAAA,CAAU,SAAS,CAAC,CAAA;AAAA,IAC9C;AACA,IAAA,MAAM,KAAA,GAAQ,QAAQ,SAAA,CAAU,eAAA;AAChC,IAAA,IAAI,OAAO,IAAA,CAAK,CAAA,CAAE,IAAI,CAAA,GAAK,UAAU,UAAA,GAAa,KAAA;AAClD,IAAA,IAAI,QAAQ,IAAA,CAAK,CAAA,CAAE,IAAI,CAAA,GAAK,UAAU,UAAA,GAAa,KAAA;AACnD,IAAA,IAAI,KAAA,GAAQ,OAAO,EAAA,EAAI;AAErB,MAAA,MAAM,GAAA,GAAA,CAAO,OAAO,KAAA,IAAS,CAAA;AAC7B,MAAA,IAAA,GAAO,GAAA,GAAM,EAAA;AACb,MAAA,KAAA,GAAQ,GAAA,GAAM,EAAA;AAAA,IAChB;AAEA,IAAA,MAAM,KAAA,GAA0B;AAAA,MAC9B,EAAA;AAAA,MACA,CAAA,EAAG,IAAA;AAAA,MACH,CAAA,EAAG,QAAA;AAAA,MACH,OAAO,KAAA,GAAQ,IAAA;AAAA,MACf,QAAQ,WAAA,GAAc,QAAA;AAAA,MACtB,QAAA,EAAU;AAAA,KACZ;AACA,IAAA,IAAI,UAAA,IAAc,UAAA,CAAW,MAAA,EAAQ,KAAA,CAAM,UAAA,GAAa,UAAA;AACxD,IAAA,IAAA,CAAK,SAAA,CAAU,KAAK,KAAK,CAAA;AACzB,IAAA,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,KAAA,GAAQ,IAAI,CAAA;AACjC,IAAA,IAAA,CAAK,CAAA,GAAI,WAAA;AAAA,EACX;AACF,CAAA;AAGA,SAAS,gBAAgB,KAAA,EAAqC;AAC5D,EAAA,MAAM,MAAoB,EAAC;AAC3B,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,IAAI,CAAA,CAAE,IAAA,KAAS,SAAA,EAAW,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA,SAAA,IAC3B,CAAA,CAAE,SAAS,UAAA,EAAY;AAC9B,MAAA,KAAA,MAAW,EAAA,IAAM,EAAE,QAAA,EAAU,GAAA,CAAI,KAAK,GAAG,eAAA,CAAgB,EAAA,CAAG,UAAU,CAAC,CAAA;AAAA,IACzE;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AAEO,SAAS,eAAe,GAAA,EAA8B;AAC3D,EAAA,OAAO,IAAI,cAAA,CAAe,GAAG,CAAA,CAAE,GAAA,EAAI;AACrC;;;ACvfA,IAAM,IAAA,GAAO,SAAA;AACb,IAAM,WAAA,GAAc,SAAA;AAEpB,SAASmC,UAAS,CAAA,EAAsB;AACtC,EAAA,OAAO;AAAA;AAAA,uBAAA,EAEgB,EAAE,OAAO,CAAA;AAAA,6CAAA,EACa,IAAI,aAAa,WAAW,CAAA;AAAA,uDAAA,EAClB,EAAE,IAAI,CAAA;AAAA,0DAAA,EACH,EAAE,SAAS,CAAA;AAAA,mDAAA,EAClB,EAAE,MAAM,CAAA;AAAA,2BAAA,EAChC,EAAE,EAAE,CAAA;AAAA,qBAAA,EACV,CAAA,CAAE,EAAE,CAAA,UAAA,EAAa,WAAW,CAAA;AAAA,4BAAA,EACrB,WAAW,CAAA;AAAA,0BAAA,EACb,WAAW,CAAA;AAAA,oBAAA,EACjB,CAAA,CAAE,EAAE,CAAA,UAAA,EAAa,WAAW,CAAA;AAAA,sBAAA,EAC1B,EAAE,MAAM,CAAA;AAAA,4BAAA,EACF,EAAE,MAAM,CAAA;AAAA,iDAAA,EACa,EAAE,IAAI,CAAA;AAAA,mDAAA,EACJ,EAAE,SAAS,CAAA;AAAA,yBAAA,EACrC,EAAE,MAAM,CAAA;AAAA,oCAAA,EACG,EAAE,OAAO,CAAA;AAAA,0BAAA,EACnB,EAAE,QAAQ,CAAA;AAAA,4BAAA,EACR,EAAE,OAAO,CAAA;AAAA,0BAAA,EACX,CAAA,CAAE,SAAS,CAAA,UAAA,EAAa,CAAA,CAAE,OAAO,CAAA;AAAA,oDAAA,EACP,EAAE,IAAI,CAAA;AAAA,sDAAA,EACJ,EAAE,SAAS,CAAA;AAAA,oDAAA,EACb,EAAE,IAAI,CAAA;AAAA;AAAA;AAAA,iDAAA,EAGT,EAAE,IAAI,CAAA;AAAA,2BAAA,EAC5B,EAAE,OAAO,CAAA;AAAA,yBAAA,EACX,CAAA,CAAE,SAAS,CAAA,UAAA,EAAa,CAAA,CAAE,OAAO,CAAA;AAAA,oDAAA,EACN,EAAE,SAAS,CAAA;AAAA,yBAAA,EACtC,CAAA,CAAE,EAAE,CAAA,UAAA,EAAa,CAAA,CAAE,OAAO,CAAA;AAAA,yDAAA,EACM,EAAE,SAAS,CAAA;AAAA,0BAAA,EAC1C,EAAE,QAAQ,CAAA;AAAA,iDAAA,EACa,EAAE,IAAI,CAAA;AAAA,CAAA,CACvD,IAAA,EAAK;AACP;AAEA,SAASU,SAAQ,CAAA,EAAsB;AACrC,EAAA,OAAOrB,sBAAA,CAAK;AAAA,IACVT,oBAAA;AAAA,MACE,QAAA;AAAA,MACA,EAAE,EAAA,EAAI,eAAA,EAAiB,OAAA,EAAS,aAAa,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,CAAA,EAAG,WAAA,EAAa,EAAA,EAAI,YAAA,EAAc,CAAA,EAAG,QAAQ,MAAA,EAAO;AAAA,MACjH,CAACA,oBAAA,CAAG,SAAA,EAAW,EAAE,MAAA,EAAQ,iBAAiB,IAAA,EAAM,CAAA,CAAE,MAAA,EAAQ,CAAC;AAAA,KAC7D;AAAA,IACAA,oBAAA;AAAA,MACE,QAAA;AAAA,MACA,EAAE,EAAA,EAAI,aAAA,EAAe,OAAA,EAAS,aAAa,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,CAAA,EAAG,WAAA,EAAa,EAAA,EAAI,YAAA,EAAc,EAAA,EAAI,QAAQ,MAAA,EAAO;AAAA,MAChH,CAACA,oBAAA,CAAG,UAAA,EAAY,EAAE,QAAQ,eAAA,EAAiB,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAQ,cAAA,EAAgB,GAAA,EAAK,CAAC;AAAA;AACnG,GACD,CAAA;AACH;AAEA,IAAM,MAAA,GAAS,CAAA;AAIf,SAAS,eAAe,EAAA,EAAyB;AAC/C,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,KAAA,CAAM,KAAKhB,sBAAA,CAAK,EAAE,OAAO,aAAA,EAAe,EAAA,EAAI,GAAG,CAAA,EAAG,EAAA,EAAI,EAAA,CAAG,OAAA,EAAS,IAAI,EAAA,CAAG,CAAA,EAAG,IAAI,EAAA,CAAG,UAAA,EAAY,CAAC,CAAA;AAChG,EAAA,KAAA,CAAM,IAAA,CAAK,UAAA,CAAW,EAAE,CAAC,CAAA;AACzB,EAAA,OAAOa,uBAAA,CAAM,EAAE,KAAA,EAAO,iBAAA,EAAmB,SAAA,EAAW,EAAA,CAAG,WAAA,CAAY,EAAA,EAAI,WAAA,EAAa,EAAA,CAAG,WAAA,CAAY,IAAA,IAAQ,KAAK,CAAA;AAClH;AAEA,SAAS,WAAW,EAAA,EAAyB;AAC3C,EAAA,MAAM,IAAI,EAAA,CAAG,WAAA;AACb,EAAA,MAAM,KAAK,EAAA,CAAG,CAAA;AACd,EAAA,MAAM,SAAS,CAAA,CAAE,UAAA,GAAa,CAAA,IAAA,EAAI,CAAA,CAAE,UAAU,CAAA,IAAA,CAAA,GAAM,IAAA;AAEpD,EAAA,IAAI,CAAA,CAAE,SAAS,OAAA,EAAS;AACtB,IAAA,MAAM,OAAO,EAAA,CAAG,KAAA;AAChB,IAAA,MAAM,MAAgB,EAAC;AACvB,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,GAAA,CAAI,IAAA,CAAKZ,sBAAA,CAAO,EAAE,KAAA,EAAO,sBAAsB,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,IAAA,GAAO,CAAA,EAAG,aAAA,EAAe,QAAA,EAAS,EAAG,MAAM,CAAC,CAAA;AAAA,IACvG;AACA,IAAA,GAAA,CAAI,IAAA;AAAA,MACFS,wBAAA,CAAO,EAAE,KAAA,EAAO,mBAAA,EAAqB,EAAA,EAAI,IAAI,IAAA,GAAO,CAAA,EAAG,CAAA,EAAG,GAAA,EAAK,CAAA;AAAA,MAC/DV,sBAAA,CAAK,EAAE,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,IAAA,GAAO,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,IAAA,GAAO,EAAA,EAAI,CAAA;AAAA,MACrDA,sBAAA,CAAK,EAAE,EAAA,EAAI,EAAA,GAAK,GAAG,EAAA,EAAI,IAAA,GAAO,EAAA,EAAI,EAAA,EAAI,EAAA,GAAK,CAAA,EAAG,EAAA,EAAI,IAAA,GAAO,IAAI,CAAA;AAAA,MAC7DA,sBAAA,CAAK,EAAE,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,IAAA,GAAO,EAAA,EAAI,EAAA,EAAI,EAAA,GAAK,CAAA,EAAG,EAAA,EAAI,IAAA,GAAO,IAAI,CAAA;AAAA,MACzDA,sBAAA,CAAK,EAAE,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,IAAA,GAAO,EAAA,EAAI,EAAA,EAAI,EAAA,GAAK,CAAA,EAAG,EAAA,EAAI,IAAA,GAAO,IAAI,CAAA;AAAA,MACzDC,sBAAA,CAAO,EAAE,KAAA,EAAO,kBAAA,EAAoB,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,IAAA,GAAO,EAAA,EAAI,aAAA,EAAe,QAAA,EAAS,EAAG,EAAE,IAAI;AAAA,KAC5F;AACA,IAAA,OAAOY,uBAAA,CAAM,EAAE,KAAA,EAAO,0BAAA,IAA8B,GAAG,CAAA;AAAA,EACzD;AAEA,EAAA,IAAI,CAAA,CAAE,SAAS,UAAA,IAAc,CAAA,CAAE,SAAS,SAAA,IAAa,CAAA,CAAE,SAAS,QAAA,EAAU;AACxE,IAAA,OAAO,oBAAA,CAAqB,IAAI,MAAM,CAAA;AAAA,EACxC;AAEA,EAAA,IAAI,CAAA,CAAE,SAAS,UAAA,EAAY;AACzB,IAAA,MAAM,IAAI,EAAA,CAAG,KAAA;AACb,IAAA,MAAM,IAAI,EAAA,CAAG,KAAA;AACb,IAAA,MAAM,IAAI,EAAA,CAAG,KAAA;AACb,IAAA,MAAM,IAAI,EAAA,CAAG,KAAA;AACb,IAAA,MAAM,EAAA,GAAK,CAAA;AACX,IAAA,MAAM,IAAI,CAAA,EAAA,EAAK,CAAC,CAAA,CAAA,EAAI,CAAA,GAAI,EAAE,CAAA,GAAA,EAAM,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,EAAE,CAAA,OAAA,EAAU,CAAC,CAAA,KAAA,EAAQ,CAAA,GAAI,IAAI,EAAE,CAAA,GAAA,EAAM,CAAA,GAAI,CAAC,IAAI,EAAE,CAAA,OAAA,EAAU,CAAC,CAAC,UAAU,CAAC,CAAA,CAAA,EAAI,CAAA,GAAI,EAAE,MAAM,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,EAAE,UAAU,CAAC,CAAA,EAAA,CAAA;AACtJ,IAAA,OAAOA,uBAAA,CAAM,EAAE,KAAA,EAAO,aAAA,EAAc,EAAG;AAAA,MACrCD,sBAAA,CAAO,EAAE,CAAA,EAAG,CAAA;AAAA,MACZX,sBAAA,CAAO,EAAE,KAAA,EAAO,kBAAA,EAAoB,GAAG,EAAA,EAAI,CAAA,EAAG,CAAA,GAAI,CAAA,GAAI,IAAI,CAAA,EAAG,aAAA,EAAe,QAAA,EAAS,EAAG,EAAE,IAAI;AAAA,KAC/F,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,KAAA,GAAkB;AAAA,IACtBQ,uBAAK,EAAE,CAAA,EAAG,GAAG,KAAA,EAAO,CAAA,EAAG,GAAG,KAAA,EAAO,KAAA,EAAO,EAAA,CAAG,KAAA,EAAO,QAAQ,EAAA,CAAG,KAAA,EAAO,IAAI,CAAA,EAAG,EAAA,EAAI,GAAG;AAAA,GACpF;AAGA,EAAA,MAAM,UAAA,GAAa,MAAA,KAAW,CAAA,CAAE,IAAA,KAAS,aAAA,IAAiB,CAAA,CAAE,IAAA,KAAS,OAAA,GAAU,CAAA,IAAA,EAAI,CAAA,CAAE,IAAI,CAAA,IAAA,CAAA,GAAM,IAAA,CAAA;AAC/F,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,KAAA,CAAM,IAAA;AAAA,MACJR,sBAAA,CAAO,EAAE,KAAA,EAAO,oBAAA,EAAsB,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,CAAG,KAAA,GAAQ,EAAA,EAAI,aAAA,EAAe,QAAA,IAAY,UAAU;AAAA,KACtG;AACA,IAAA,KAAA,CAAM,IAAA;AAAA,MACJA,sBAAA,CAAO,EAAE,KAAA,EAAO,kBAAA,EAAoB,GAAG,EAAA,EAAI,CAAA,EAAG,EAAA,CAAG,KAAA,GAAQ,EAAA,EAAI,aAAA,EAAe,QAAA,EAAS,EAAG,EAAE,IAAI;AAAA,KAChG;AAAA,EACF,CAAA,MAAO;AACL,IAAA,KAAA,CAAM,IAAA;AAAA,MACJA,uBAAO,EAAE,KAAA,EAAO,kBAAA,EAAoB,CAAA,EAAG,IAAI,CAAA,EAAG,EAAA,CAAG,KAAA,GAAQ,EAAA,CAAG,QAAQ,CAAA,GAAI,CAAA,EAAG,eAAe,QAAA,EAAS,EAAG,EAAE,IAAI;AAAA,KAC9G;AAAA,EACF;AACA,EAAA,OAAOY,uBAAA,CAAM,EAAE,KAAA,EAAO,aAAA,IAAiB,KAAK,CAAA;AAC9C;AAGA,SAAS,oBAAA,CAAqB,IAAiB,MAAA,EAA+B;AAC5E,EAAA,MAAM,IAAI,EAAA,CAAG,WAAA;AACb,EAAA,MAAM,KAAK,EAAA,CAAG,CAAA;AACd,EAAA,MAAM,CAAA,GAAI,EAAA;AACV,EAAA,MAAM,EAAA,GAAK,GAAG,KAAA,GAAQ,EAAA;AACtB,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,KAAA,CAAM,IAAA,CAAKZ,sBAAA,CAAO,EAAE,KAAA,EAAO,sBAAsB,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,CAAG,QAAQ,CAAA,EAAG,aAAA,EAAe,QAAA,EAAS,EAAG,MAAM,CAAC,CAAA;AAAA,EAC7G;AACA,EAAA,KAAA,CAAM,IAAA,CAAKS,wBAAA,CAAO,EAAE,KAAA,EAAO,aAAA,EAAe,IAAI,EAAA,EAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AACzD,EAAA,IAAI,CAAA,CAAE,SAAS,UAAA,EAAY;AACzB,IAAA,MAAM,EAAA,GAAK,KAAK,CAAA,GAAI,CAAA;AACpB,IAAA,KAAA,CAAM,KAAKV,sBAAA,CAAK,EAAE,KAAA,EAAO,kBAAA,EAAoB,IAAI,EAAA,EAAI,EAAA,EAAI,EAAA,GAAK,CAAA,EAAG,IAAI,EAAA,EAAI,EAAA,EAAI,EAAA,GAAK,CAAA,EAAG,CAAC,CAAA;AACtF,IAAA,KAAA,CAAM,IAAA,CAAKA,sBAAA,CAAK,EAAE,KAAA,EAAO,oBAAoB,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,IAAI,EAAA,GAAK,CAAA,EAAG,EAAA,EAAI,EAAA,EAAI,CAAC,CAAA;AAAA,EACpF,CAAA,MAAA,IAAW,CAAA,CAAE,IAAA,KAAS,QAAA,EAAU;AAC9B,IAAA,KAAA,CAAM,IAAA,CAAKA,uBAAK,EAAE,KAAA,EAAO,oBAAoB,EAAA,EAAI,EAAA,GAAK,CAAA,GAAI,CAAA,EAAG,EAAA,EAAI,EAAA,GAAK,IAAI,CAAA,EAAG,EAAA,EAAI,KAAK,CAAA,GAAI,CAAA,EAAG,IAAI,EAAA,GAAK,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA;AAAA,EAChH,CAAA,MAAO;AAEL,IAAA,KAAA,CAAM,IAAA;AAAA,MACJW,yBAAA,CAAQ,EAAE,KAAA,EAAO,kBAAA,EAAoB,MAAA,EAAQ,CAAA,EAAG,EAAA,GAAK,CAAC,CAAA,CAAA,EAAI,EAAA,GAAK,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,EAAA,GAAK,CAAC,CAAA,CAAA,EAAI,EAAA,GAAK,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,EAAA,GAAK,CAAC,CAAA,CAAA,EAAI,EAAA,GAAK,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI;AAAA,KAC1H;AAAA,EACF;AACA,EAAA,KAAA,CAAM,KAAKV,sBAAA,CAAO,EAAE,KAAA,EAAO,kBAAA,EAAoB,GAAG,EAAA,EAAI,CAAA,EAAG,EAAA,CAAG,KAAA,GAAQ,IAAI,aAAA,EAAe,QAAA,EAAS,EAAG,CAAA,CAAE,IAAI,CAAC,CAAA;AAC1G,EAAA,OAAOY,uBAAA,CAAM,EAAE,KAAA,EAAO,8BAAA,EAAgC,aAAa,CAAA,CAAE,IAAA,IAAQ,KAAK,CAAA;AACpF;AAIA,SAAS,iBAAiB,CAAA,EAA6B;AACrD,EAAA,MAAM,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,CAAE,OAAA,GAAU,EAAE,IAAI,CAAA;AACxC,EAAA,OAAOJ,sBAAA,CAAK;AAAA,IACV,KAAA,EAAO,YAAA;AAAA,IACP,WAAW,CAAA,CAAE,EAAA;AAAA,IACb,GAAG,CAAA,CAAE,CAAA;AAAA,IACL,GAAG,CAAA,CAAE,IAAA;AAAA,IACL,KAAA,EAAO,EAAA;AAAA,IACP,MAAA,EAAQ;AAAA,GACT,CAAA;AACH;AAIA,SAAS,cAAc,CAAA,EAA0B;AAC/C,EAAA,MAAM,CAAA,GAAI,EAAE,OAAA,CAAQ,KAAA;AACpB,EAAA,MAAMoD,UAAAA,GAAY,CAAA,KAAM,OAAA,GAAU,kBAAA,GAAqB,YAAA;AACvD,EAAA,MAAM,SAAA,GAAY,CAAA,KAAM,OAAA,IAAW,CAAA,KAAM,UAAU,mBAAA,GAAsB,qBAAA;AACzE,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,IAAI,EAAE,IAAA,EAAM;AACV,IAAA,MAAM,MAAA,GAAS,CAAA,CAAE,WAAA,IAAe,CAAA,CAAE,CAAA,GAAI,EAAA;AACtC,IAAA,MAAM,QAAQ,CAAA,CAAE,EAAA;AAChB,IAAA,MAAM,CAAA,GAAI,CAAA,EAAA,EAAK,CAAA,CAAE,EAAE,CAAA,CAAA,EAAI,CAAA,CAAE,CAAC,CAAA,GAAA,EAAM,KAAK,CAAA,GAAA,EAAM,MAAM,CAAA,GAAA,EAAM,EAAE,EAAE,CAAA,CAAA;AAC3D,IAAA,KAAA,CAAM,IAAA,CAAKjD,uBAAO,EAAE,KAAA,EAAOiD,YAAW,CAAA,EAAG,YAAA,EAAc,SAAA,EAAW,CAAC,CAAA;AACnE,IAAA,IAAI,CAAA,CAAE,QAAQ,KAAA,EAAO;AACnB,MAAA,KAAA,CAAM,IAAA;AAAA,QACJ5D,sBAAA;AAAA,UACE,EAAE,KAAA,EAAO,kBAAA,EAAoB,CAAA,EAAG,KAAA,GAAQ,CAAA,EAAG,CAAA,EAAA,CAAI,CAAA,CAAE,CAAA,GAAI,MAAA,IAAU,CAAA,GAAI,CAAA,EAAE;AAAA,UACrE,QAAA,CAAS,CAAA,EAAG,CAAA,CAAE,OAAA,CAAQ,KAAK;AAAA;AAC7B,OACF;AAAA,IACF;AAAA,EACF,CAAA,MAAO;AACL,IAAA,KAAA,CAAM,IAAA,CAAKD,uBAAK,EAAE,KAAA,EAAO6D,YAAW,EAAA,EAAI,CAAA,CAAE,IAAI,EAAA,EAAI,CAAA,CAAE,GAAG,EAAA,EAAI,CAAA,CAAE,IAAI,EAAA,EAAI,CAAA,CAAE,GAAG,YAAA,EAAc,SAAA,EAAW,CAAC,CAAA;AAEpG,IAAA,IAAI,MAAM,MAAA,EAAQ,KAAA,CAAM,IAAA,CAAKnD,wBAAA,CAAO,EAAE,KAAA,EAAO,iBAAA,EAAmB,EAAA,EAAI,CAAA,CAAE,IAAI,EAAA,EAAI,CAAA,CAAE,GAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAC1F,IAAA,IAAI,MAAM,OAAA,EAAS,KAAA,CAAM,IAAA,CAAKA,wBAAA,CAAO,EAAE,KAAA,EAAO,iBAAA,EAAmB,EAAA,EAAI,CAAA,CAAE,IAAI,EAAA,EAAI,CAAA,CAAE,GAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAC3F,IAAA,IAAI,CAAA,CAAE,QAAQ,KAAA,EAAO;AACnB,MAAA,MAAM,GAAA,GAAA,CAAO,CAAA,CAAE,EAAA,GAAK,CAAA,CAAE,EAAA,IAAM,CAAA;AAC5B,MAAA,KAAA,CAAM,IAAA;AAAA,QACJT,sBAAA;AAAA,UACE,EAAE,KAAA,EAAO,kBAAA,EAAoB,CAAA,EAAG,GAAA,EAAK,GAAG,CAAA,CAAE,CAAA,GAAI,CAAA,EAAG,aAAA,EAAe,QAAA,EAAS;AAAA,UACzE,QAAA,CAAS,CAAA,EAAG,CAAA,CAAE,OAAA,CAAQ,KAAK;AAAA;AAC7B,OACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAOY,uBAAA;AAAA,IACL;AAAA,MACE,KAAA,EAAO,gBAAA;AAAA,MACP,WAAA,EAAa,CAAA;AAAA,MACb,WAAA,EAAa,EAAE,OAAA,CAAQ,IAAA;AAAA,MACvB,SAAA,EAAW,EAAE,OAAA,CAAQ;AAAA,KACvB;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,QAAA,CAAS,GAAkB,KAAA,EAAuB;AACzD,EAAA,OAAO,CAAA,CAAE,WAAW,MAAA,GAAY,CAAA,EAAG,EAAE,MAAM,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,GAAK,KAAA;AAC5D;AAIA,SAAS,SAAS,CAAA,EAA6B;AAC7C,EAAA,OAAO,KAAK,GAAA,CAAI,EAAA,EAAI,EAAE,EAAA,CAAG,MAAA,GAAS,IAAI,EAAE,CAAA;AAC1C;AAGA,SAAS,kBAAkB,CAAA,EAA6B;AACtD,EAAA,MAAM,UAAA,GAAa,CAAA,CAAE,EAAA,KAAO,KAAA,GAAQ,+BAAA,GAAkC,cAAA;AACtE,EAAA,MAAM,KAAA,GAAkB;AAAA,IACtBJ,sBAAA,CAAK,EAAE,KAAA,EAAO,UAAA,EAAY,GAAG,CAAA,CAAE,CAAA,EAAG,GAAG,CAAA,CAAE,CAAA,EAAG,OAAO,CAAA,CAAE,KAAA,EAAO,QAAQ,CAAA,CAAE,MAAA,EAAQ,IAAI,CAAA,EAAG,EAAA,EAAI,GAAG;AAAA,GAC5F;AACA,EAAA,KAAA,MAAW,EAAA,IAAM,EAAE,QAAA,EAAU;AAC3B,IAAA,IAAI,EAAA,CAAG,SAAS,MAAA,EAAW;AACzB,MAAA,KAAA,CAAM,IAAA,CAAKT,uBAAK,EAAE,KAAA,EAAO,oBAAoB,EAAA,EAAI,CAAA,CAAE,GAAG,EAAA,EAAI,EAAA,CAAG,MAAM,EAAA,EAAI,CAAA,CAAE,IAAI,CAAA,CAAE,KAAA,EAAO,IAAI,EAAA,CAAG,IAAA,EAAM,CAAC,CAAA;AAAA,IACtG;AAAA,EACF;AACA,EAAA,OAAOa,uBAAA,CAAM,EAAE,KAAA,EAAO,iBAAA,EAAmB,WAAW,CAAA,CAAE,EAAA,IAAM,KAAK,CAAA;AACnE;AAGA,SAAS,kBAAkB,CAAA,EAA6B;AACtD,EAAA,MAAM,IAAA,GAAO,SAAS,CAAC,CAAA;AACvB,EAAA,MAAM,IAAA,GAAO,EAAA;AACb,EAAA,MAAM,IAAA,GAAO,CAAA;AACb,EAAA,MAAM,KAAK,CAAA,CAAE,CAAA;AACb,EAAA,MAAM,KAAK,CAAA,CAAE,CAAA;AACb,EAAA,MAAM,GAAA,GAAM,KAAK,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,GAAA,EAAM,EAAA,GAAK,IAAI,CAAA,GAAA,EAAM,EAAA,GAAK,OAAO,IAAI,CAAA,GAAA,EAAM,KAAK,IAAA,GAAO,IAAI,IAAI,EAAA,GAAK,IAAI,MAAM,EAAE,CAAA,EAAA,CAAA;AACzG,EAAA,MAAM,KAAA,GAAkB;AAAA,IACtBD,uBAAO,EAAE,KAAA,EAAO,kBAAA,EAAoB,CAAA,EAAG,KAAK,CAAA;AAAA,IAC5CX,sBAAA,CAAO,EAAE,KAAA,EAAO,iBAAA,EAAmB,CAAA,EAAG,EAAA,GAAK,CAAA,EAAG,CAAA,EAAG,EAAA,GAAK,EAAA,EAAG,EAAG,CAAA,CAAE,EAAE;AAAA,GAClE;AAGA,EAAA,IAAI,CAAA,CAAE,UAAA,IAAc,CAAA,CAAE,UAAA,CAAW,MAAA,EAAQ;AACvC,IAAA,KAAA,CAAM,IAAA;AAAA,MACJA,uBAAO,EAAE,KAAA,EAAO,gBAAgB,CAAA,EAAG,EAAA,GAAK,OAAO,CAAA,EAAG,CAAA,EAAG,EAAA,GAAK,EAAA,IAAM,CAAA,CAAA,EAAI,CAAA,CAAE,WAAW,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAG;AAAA,KAChG;AAAA,EACF;AAEA,EAAA,CAAA,CAAE,QAAA,CAAS,OAAA,CAAQ,CAAC,EAAA,EAAI,CAAA,KAAM;AAC5B,IAAA,IAAI,CAAC,GAAG,KAAA,EAAO;AACf,IAAA,MAAM,EAAA,GAAK,MAAM,CAAA,GAAI,CAAA,CAAE,IAAI,IAAA,GAAO,CAAA,GAAI,EAAE,CAAA,GAAI,CAAA;AAC5C,IAAA,MAAM,EAAA,GAAK,MAAM,CAAA,GAAI,CAAA,CAAE,IAAI,EAAA,GAAA,CAAM,EAAA,CAAG,IAAA,IAAQ,CAAA,CAAE,CAAA,IAAK,EAAA;AACnD,IAAA,KAAA,CAAM,IAAA,CAAKA,sBAAA,CAAO,EAAE,KAAA,EAAO,gBAAgB,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAG,EAAG,CAAA,CAAA,EAAI,EAAA,CAAG,KAAK,GAAG,CAAC,CAAA;AAAA,EAC7E,CAAC,CAAA;AAED,EAAA,OAAOY,uBAAA,CAAM,EAAE,KAAA,EAAO,uBAAA,EAAyB,WAAW,CAAA,CAAE,EAAA,IAAM,KAAK,CAAA;AACzE;AAEA,SAAS,UAAU,CAAA,EAAwB;AACzC,EAAA,MAAM,IAAA,GAAO,EAAA;AACb,EAAA,MAAM,IAAA,GAAO,EAAA;AACb,EAAA,MAAM,IAAA,GAAO,CAAA;AACb,EAAA,MAAM,GAAA,GAAM,CAAA,EAAA,EAAK,CAAA,CAAE,CAAC,CAAA,CAAA,EAAI,CAAA,CAAE,CAAC,CAAA,GAAA,EAAM,CAAA,CAAE,CAAA,GAAI,IAAI,CAAA,GAAA,EAAM,CAAA,CAAE,CAAA,GAAI,IAAA,GAAO,IAAI,CAAA,GAAA,EAAM,CAAA,CAAE,CAAA,GAAI,IAAA,GAAO,IAAI,CAAA,CAAA,EAAI,CAAA,CAAE,CAAA,GAAI,IAAI,CAAA,GAAA,EAAM,CAAA,CAAE,CAAC,CAAA,EAAA,CAAA;AAChH,EAAA,OAAOA,wBAAM,EAAE,KAAA,EAAO,iBAAA,EAAmB,SAAA,EAAW,OAAM,EAAG;AAAA,IAC3DJ,sBAAA,CAAK,EAAE,KAAA,EAAO,cAAA,EAAgB,GAAG,CAAA,CAAE,CAAA,EAAG,GAAG,CAAA,CAAE,CAAA,EAAG,OAAO,CAAA,CAAE,KAAA,EAAO,QAAQ,CAAA,CAAE,MAAA,EAAQ,IAAI,CAAA,EAAG,EAAA,EAAI,GAAG,CAAA;AAAA,IAC9FG,uBAAO,EAAE,KAAA,EAAO,kBAAA,EAAoB,CAAA,EAAG,KAAK,CAAA;AAAA,IAC5CX,sBAAA,CAAO,EAAE,KAAA,EAAO,iBAAA,EAAmB,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,EAAA,IAAM,KAAK,CAAA;AAAA,IACnEA,sBAAA;AAAA,MACE,EAAE,KAAA,EAAO,iBAAA,EAAmB,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,CAAE,KAAA,GAAQ,CAAA,EAAG,CAAA,EAAG,EAAE,CAAA,GAAI,CAAA,CAAE,SAAS,CAAA,GAAI,CAAA,EAAG,eAAe,QAAA,EAAS;AAAA,MACrG,CAAA,CAAE;AAAA;AACJ,GACD,CAAA;AACH;AAIA,SAAS6D,YAAW,EAAA,EAAwB;AAC1C,EAAA,MAAM,IAAA,GAAO,CAAA;AACb,EAAA,MAAM,IAAI,EAAA,CAAG,CAAA;AACb,EAAA,MAAM,IAAI,EAAA,CAAG,CAAA;AACb,EAAA,MAAM,IAAI,EAAA,CAAG,KAAA;AACb,EAAA,MAAM,IAAI,EAAA,CAAG,MAAA;AACb,EAAA,MAAM,OAAO,CAAA,EAAA,EAAK,CAAC,IAAI,CAAC,CAAA,GAAA,EAAM,IAAI,CAAA,GAAI,IAAI,MAAM,CAAA,GAAI,CAAC,IAAI,CAAA,GAAI,IAAI,MAAM,CAAA,GAAI,CAAC,MAAM,CAAC,CAAA,EAAA,CAAA;AACnF,EAAA,MAAM,MAAA,GAAS,CAAA,EAAA,EAAK,CAAA,GAAI,CAAA,GAAI,IAAI,CAAA,CAAA,EAAI,CAAC,CAAA,GAAA,EAAM,CAAA,GAAI,IAAI,CAAA,GAAA,EAAM,CAAA,GAAI,CAAC,CAAA,EAAA,CAAA;AAC9D,EAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,IAAA,CAAK,IAAA,CAAK,MAAM,gBAAgB,CAAA;AACjD,EAAA,MAAM,MAAA,GAAS,IAAI,CAAA,GAAI,CAAA,GAAA,CAAM,MAAM,MAAA,GAAS,CAAA,IAAK,KAAM,CAAA,GAAI,CAAA;AAC3D,EAAA,MAAM,QAAQ,KAAA,CAAM,GAAA;AAAA,IAAI,CAAC,CAAA,EAAG,CAAA,KAC1B7D,uBAAO,EAAE,KAAA,EAAO,oBAAoB,CAAA,EAAG,CAAA,GAAI,CAAA,GAAI,CAAA,EAAG,GAAG,MAAA,GAAS,CAAA,GAAI,IAAI,aAAA,EAAe,QAAA,IAAY,CAAC;AAAA,GACpG;AACA,EAAA,OAAOY,uBAAA,CAAM,EAAE,KAAA,EAAO,aAAA,IAAiB,CAACD,sBAAA,CAAO,EAAE,CAAA,EAAG,IAAA,EAAM,CAAA,EAAGA,sBAAA,CAAO,EAAE,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,GAAG,KAAK,CAAC,CAAA;AAC/F;AAEA,SAAS,cAAc,CAAA,EAA0B;AAC/C,EAAA,MAAM,MAAA,GAAS,KAAK,GAAA,CAAI,EAAA,EAAI,EAAE,IAAA,CAAK,MAAA,GAAS,SAAS,EAAE,CAAA;AACvD,EAAA,MAAM,EAAA,GAAK,EAAE,KAAA,GAAQ,CAAA;AACrB,EAAA,MAAM,KAAA,GAAkB;AAAA,IACtBZ,sBAAA,CAAK,EAAE,EAAA,EAAI,CAAA,EAAG,IAAI,CAAA,CAAE,CAAA,EAAG,EAAA,EAAI,EAAA,GAAK,MAAA,GAAS,CAAA,EAAG,EAAA,EAAI,CAAA,CAAE,GAAG,CAAA;AAAA,IACrDA,uBAAK,EAAE,EAAA,EAAI,EAAA,GAAK,MAAA,GAAS,GAAG,EAAA,EAAI,CAAA,CAAE,CAAA,EAAG,EAAA,EAAI,EAAE,KAAA,GAAQ,CAAA,EAAG,EAAA,EAAI,CAAA,CAAE,GAAG,CAAA;AAAA,IAC/DS,uBAAK,EAAE,CAAA,EAAG,KAAK,MAAA,GAAS,CAAA,EAAG,GAAG,CAAA,CAAE,CAAA,GAAI,EAAA,EAAI,KAAA,EAAO,QAAQ,MAAA,EAAQ,EAAA,EAAI,IAAI,CAAA,EAAG,EAAA,EAAI,GAAG,CAAA;AAAA,IACjFR,sBAAA,CAAO,EAAE,KAAA,EAAO,iBAAA,EAAmB,GAAG,EAAA,EAAI,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,CAAA,EAAG,aAAA,EAAe,QAAA,EAAS,EAAG,EAAE,IAAI;AAAA,GACzF;AACA,EAAA,OAAOY,uBAAA,CAAM,EAAE,KAAA,EAAO,YAAA,IAAgB,KAAK,CAAA;AAC7C;AAEA,SAAS,gBAAgB,EAAA,EAA6B;AACpD,EAAA,OAAOA,uBAAA,CAAM,EAAE,KAAA,EAAO,YAAA,EAAa,EAAG;AAAA,IACpCJ,sBAAA,CAAK,EAAE,CAAA,EAAG,EAAA,CAAG,EAAA,GAAK,GAAG,KAAA,GAAQ,CAAA,EAAG,CAAA,EAAG,EAAA,CAAG,CAAA,EAAG,KAAA,EAAO,GAAG,KAAA,EAAO,MAAA,EAAQ,EAAA,CAAG,MAAA,EAAQ,EAAA,EAAI,EAAA,CAAG,MAAA,GAAS,CAAA,EAAG,EAAA,EAAI,EAAA,CAAG,MAAA,GAAS,CAAA,EAAG,CAAA;AAAA,IACnHR,sBAAA,CAAO,EAAE,KAAA,EAAO,iBAAA,EAAmB,GAAG,EAAA,CAAG,EAAA,EAAI,GAAG,EAAA,CAAG,CAAA,GAAI,GAAG,MAAA,GAAS,CAAA,GAAI,GAAG,aAAA,EAAe,QAAA,IAAY,CAAA,CAAA,EAAI,EAAA,CAAG,IAAI,CAAA,CAAA,CAAG;AAAA,GACpH,CAAA;AACH;AAEA,SAAS,cAAc,CAAA,EAAqC;AAC1D,EAAA,MAAM,CAAA,GAAI,CAAA;AACV,EAAA,OAAOY,uBAAA,CAAM,EAAE,KAAA,EAAO,kBAAA,EAAmB,EAAG;AAAA,IAC1Cb,sBAAA,CAAK,EAAE,KAAA,EAAO,gBAAA,EAAkB,IAAI,CAAA,CAAE,CAAA,GAAI,GAAG,EAAA,EAAI,CAAA,CAAE,IAAI,CAAA,EAAG,EAAA,EAAI,EAAE,CAAA,GAAI,CAAA,EAAG,IAAI,CAAA,CAAE,CAAA,GAAI,GAAG,CAAA;AAAA,IACpFA,sBAAA,CAAK,EAAE,KAAA,EAAO,gBAAA,EAAkB,IAAI,CAAA,CAAE,CAAA,GAAI,GAAG,EAAA,EAAI,CAAA,CAAE,IAAI,CAAA,EAAG,EAAA,EAAI,EAAE,CAAA,GAAI,CAAA,EAAG,IAAI,CAAA,CAAE,CAAA,GAAI,GAAG;AAAA,GACrF,CAAA;AACH;AAIO,SAAS,oBAAA,CAAqB,QAAyB,MAAA,EAA+B;AAC3F,EAAA,MAAM,CAAA,GAAIc,kCAAA,CAAiB,MAAA,EAAQ,KAAA,IAAS,SAAS,CAAA;AACrD,EAAA,MAAM,WAAqB,EAAC;AAE5B,EAAA,MAAM,IAAA,GAAO,OAAO,QAAA,CAAS,MAAA;AAC7B,EAAA,MAAM,KAAA,GAAQ,OAAO,SAAA,CAAU,MAAA;AAC/B,EAAA,QAAA,CAAS,IAAA,CAAKZ,uBAAA,CAAQ,CAAA,gBAAA,EAAmB,MAAA,CAAO,KAAA,GAAQ,aAAQ,MAAA,CAAO,KAAA,GAAQ,EAAE,CAAA,CAAE,CAAC,CAAA;AACpF,EAAA,QAAA,CAAS,IAAA;AAAA,IACPa,sBAAA;AAAA,MACE,GAAG,MAAA,CAAO,SAAA,CAAU,MAAM,CAAA,eAAA,EAAkB,IAAI,cAAc,KAAK,CAAA,oBAAA;AAAA;AACrE,GACF;AACA,EAAA,QAAA,CAAS,IAAA,CAAKC,qBAAG,OAAA,EAAS,IAAIoB,SAAAA,CAAS,CAAC,CAAC,CAAC,CAAA;AAC1C,EAAA,QAAA,CAAS,IAAA,CAAKU,QAAAA,CAAQ,CAAC,CAAC,CAAA;AAExB,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,KAAA,GAAQ,EAAA,GAAK,CAAA;AACtC,EAAA,IAAI,OAAO,KAAA,EAAO;AAChB,IAAA,QAAA,CAAS,IAAA;AAAA,MACP7C,sBAAA,CAAO,EAAE,CAAA,EAAG,MAAA,CAAO,QAAQ,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,KAAA,EAAO,cAAA,EAAgB,aAAA,EAAe,QAAA,EAAS,EAAG,OAAO,KAAK;AAAA,KACrG;AAAA,EACF;AAEA,EAAA,MAAM,OAAiB,EAAC;AAExB,EAAA,IAAA,CAAK,IAAA,CAAKY,uBAAA,CAAM,EAAE,KAAA,EAAO,kBAAA,EAAmB,EAAG,MAAA,CAAO,SAAA,CAAU,GAAA,CAAI,cAAc,CAAC,CAAC,CAAA;AAEpF,EAAA,IAAA,CAAK,IAAA,CAAKA,uBAAA,CAAM,EAAE,KAAA,EAAO,eAAA,EAAgB,EAAG,MAAA,CAAO,SAAA,CAAU,GAAA,CAAI,iBAAiB,CAAC,CAAC,CAAA;AAEpF,EAAA,IAAA,CAAK,IAAA,CAAKA,uBAAA,CAAM,EAAE,KAAA,EAAO,aAAA,EAAc,EAAG,MAAA,CAAO,WAAA,CAAY,GAAA,CAAI,gBAAgB,CAAC,CAAC,CAAA;AAEnF,EAAA,IAAA,CAAK,IAAA,CAAKA,uBAAA,CAAM,EAAE,KAAA,EAAO,mBAAA,EAAoB,EAAG,MAAA,CAAO,SAAA,CAAU,GAAA,CAAI,iBAAiB,CAAC,CAAC,CAAA;AACxF,EAAA,IAAA,CAAK,IAAA,CAAKA,uBAAA,CAAM,EAAE,KAAA,EAAO,aAAA,EAAc,EAAG,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,SAAS,CAAC,CAAC,CAAA;AAErE,EAAA,IAAA,CAAK,IAAA,CAAKA,uBAAA,CAAM,EAAE,KAAA,EAAO,iBAAA,EAAkB,EAAG,MAAA,CAAO,QAAA,CAAS,GAAA,CAAI,aAAa,CAAC,CAAC,CAAA;AAEjF,EAAA,IAAA,CAAK,IAAA,CAAKA,uBAAA,CAAM,EAAE,KAAA,EAAO,cAAA,EAAe,EAAG,MAAA,CAAO,KAAA,CAAM,GAAA,CAAIiD,WAAU,CAAC,CAAC,CAAA;AACxE,EAAA,IAAA,CAAK,IAAA,CAAKjD,uBAAA,CAAM,EAAE,KAAA,EAAO,aAAA,EAAc,EAAG,MAAA,CAAO,QAAA,CAAS,GAAA,CAAI,aAAa,CAAC,CAAC,CAAA;AAC7E,EAAA,IAAA,CAAK,IAAA,CAAKA,uBAAA,CAAM,EAAE,KAAA,EAAO,aAAA,EAAc,EAAG,MAAA,CAAO,UAAA,CAAW,GAAA,CAAI,eAAe,CAAC,CAAC,CAAA;AACjF,EAAA,IAAA,CAAK,IAAA,CAAKA,uBAAA,CAAM,EAAE,KAAA,EAAO,iBAAA,EAAkB,EAAG,MAAA,CAAO,QAAA,CAAS,GAAA,CAAI,aAAa,CAAC,CAAC,CAAA;AAEjF,EAAA,QAAA,CAAS,IAAA;AAAA,IACP,SAAA,GAAYA,uBAAA,CAAM,EAAE,SAAA,EAAW,CAAA,aAAA,EAAgB,SAAS,CAAA,CAAA,CAAA,EAAI,EAAG,IAAI,CAAA,GAAIA,uBAAA,CAAM,IAAI,IAAI;AAAA,GACvF;AAEA,EAAA,MAAM,MAAA,GAAS,OAAO,MAAA,GAAS,SAAA;AAC/B,EAAA,OAAOI,yBAAA;AAAA,IACL;AAAA,MACE,KAAA,EAAO,QAAA;AAAA,MACP,IAAA,EAAM,KAAA;AAAA,MACN,YAAA,EAAcC,2BAAA,CAAU,MAAA,CAAO,KAAA,IAAS,sBAAsB,CAAA;AAAA,MAC9D,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,MAAA;AAAA,MACA,OAAA,EAAS,CAAA,IAAA,EAAO,MAAA,CAAO,KAAK,IAAI,MAAM,CAAA,CAAA;AAAA,MACtC,mBAAA,EAAqB;AAAA,KACvB;AAAA,IACA;AAAA,GACF;AACF;AAEO,SAAS,cAAA,CAAe,WAA4B,MAAA,EAA+B;AACxF,EAAA,MAAM,MAAM,OAAO,SAAA,KAAc,QAAA,GAAW,aAAA,CAAc,SAAS,CAAA,GAAI,SAAA;AACvE,EAAA,MAAM,MAAA,GAAS,eAAe,GAAG,CAAA;AACjC,EAAA,OAAO,oBAAA,CAAqB,QAAQ,MAAM,CAAA;AAC5C;;;AC/aO,IAAM,QAAA,GAA0B;AAAA,EACrC,IAAA,EAAM,UAAA;AAAA,EACN,OAAOjB,KAAAA,EAAuB;AAC5B,IAAA,KAAA,MAAW,GAAA,IAAOA,KAAAA,CAAK,KAAA,CAAM,OAAO,CAAA,EAAG;AACrC,MAAA,MAAM,CAAA,GAAI,IAAI,IAAA,EAAK;AACnB,MAAA,IAAI,CAAC,CAAA,EAAG;AACR,MAAA,IAAI,EAAE,UAAA,CAAW,GAAG,KAAK,CAAA,CAAE,UAAA,CAAW,IAAI,CAAA,EAAG;AAE7C,MAAA,OAAO,cAAA,CAAe,KAAK,CAAC,CAAA;AAAA,IAC9B;AACA,IAAA,OAAO,KAAA;AAAA,EACT,CAAA;AAAA,EACA,KAAA,EAAO,aAAA;AAAA,EACP,MAAA,CAAOA,OAAc,MAAA,EAA+B;AAClD,IAAA,OAAO,cAAA,CAAeA,OAAM,MAAM,CAAA;AAAA,EACpC;AACF;;;ACJO,IAAM,eAAA,GAAN,cAA8B,KAAA,CAAM;AAAA,EACzC,IAAA;AAAA,EACA,WAAA,CAAY,SAAiBD,KAAAA,EAAe;AAC1C,IAAA,KAAA,CAAMA,UAAS,MAAA,GAAY,CAAA,EAAG,OAAO,CAAA,OAAA,EAAUA,KAAI,MAAM,OAAO,CAAA;AAChE,IAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAOA,KAAAA;AAAA,EACd;AACF,CAAA;AAIA,IAAM,UAAU,CAAC,GAAA,EAAK,QAAA,EAAK,QAAA,EAAK,UAAK,MAAG,CAAA;AACxC,IAAM,UAAU,CAAC,GAAA,EAAK,QAAA,EAAK,QAAA,EAAK,UAAK,MAAG,CAAA;AAOxC,SAAS+D,UAAS,CAAA,EAAkB;AAClC,EAAA,MAAM,MAAa,EAAC;AACpB,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,OAAO,CAAA,GAAI,EAAE,MAAA,EAAQ;AACnB,IAAA,MAAM,CAAA,GAAI,EAAE,CAAC,CAAA;AACb,IAAA,IAAI,CAAA,KAAM,GAAA,IAAO,CAAA,KAAM,GAAA,EAAM;AAC3B,MAAA,CAAA,EAAA;AACA,MAAA;AAAA,IACF;AACA,IAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAA;AAC5B,IAAA,IAAI,MAAM,CAAA,EAAG;AACX,MAAA,MAAM,KAAA,GAAQ,QAAQ,EAAE,CAAA;AACxB,MAAA,IAAIC,KAAI,CAAA,GAAI,CAAA;AACZ,MAAA,IAAIC,IAAAA,GAAM,EAAA;AACV,MAAA,OAAOD,EAAAA,GAAI,CAAA,CAAE,MAAA,IAAU,CAAA,CAAEA,EAAC,MAAM,KAAA,IAAS,CAAA,CAAEA,EAAC,CAAA,KAAM,GAAA,EAAK;AACrD,QAAAC,IAAAA,IAAO,EAAED,EAAC,CAAA;AACV,QAAAA,EAAAA,EAAAA;AAAA,MACF;AACA,MAAA,GAAA,CAAI,KAAK,EAAE,IAAA,EAAMC,IAAAA,EAAK,MAAA,EAAQ,MAAM,CAAA;AACpC,MAAA,CAAA,GAAID,EAAAA,GAAI,CAAA;AACR,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAA,GAAI,CAAA;AACR,IAAA,IAAI,GAAA,GAAM,EAAA;AACV,IAAA,OAAO,CAAA,GAAI,CAAA,CAAE,MAAA,IAAU,CAAA,CAAE,CAAC,MAAM,GAAA,IAAO,CAAA,CAAE,CAAC,CAAA,KAAM,GAAA,EAAM;AACpD,MAAA,GAAA,IAAO,EAAE,CAAC,CAAA;AACV,MAAA,CAAA,EAAA;AAAA,IACF;AACA,IAAA,GAAA,CAAI,KAAK,EAAE,IAAA,EAAM,GAAA,EAAK,MAAA,EAAQ,OAAO,CAAA;AACrC,IAAA,CAAA,GAAI,CAAA;AAAA,EACN;AACA,EAAA,OAAO,GAAA;AACT;AAGA,SAAS,iBAAiBhE,KAAAA,EAAsB;AAC9C,EAAA,OAAOA,KAAAA,CAAK,OAAA,CAAQ,sCAAA,EAAwC,OAAO,CAAA;AACrE;AAEA,IAAM,MAAA,GAAS,UAAA;AACf,IAAM,MAAA,GAAS,sCAAA;AAEf,SAAS,KAAA,CAAM,GAAA,EAAa,IAAA,EAAcA,KAAAA,EAAsB;AAC9D,EAAA,IAAI,CAAC,SAAA,CAAU,IAAA,CAAK,GAAG,CAAA,EAAG;AACxB,IAAA,MAAM,IAAI,eAAA,CAAgB,CAAA,EAAG,IAAI,CAAA,0BAAA,EAA6B,GAAG,KAAKA,KAAI,CAAA;AAAA,EAC5E;AACA,EAAA,OAAO,QAAA,CAAS,KAAK,EAAE,CAAA;AACzB;AAIO,SAAS,WAAWC,KAAAA,EAAwB;AACjD,EAAA,MAAM,QAAA,GAAWA,KAAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AACnC,EAAA,MAAM,GAAA,GAAgB;AAAA,IACpB,IAAA,EAAM,OAAA;AAAA,IACN,SAAA,EAAW,IAAA;AAAA,IACX,UAAA,EAAY,MAAA;AAAA,IACZ,QAAQ,EAAC;AAAA,IACT,aAAa,EAAC;AAAA,IACd,MAAM,EAAC;AAAA,IACP,cAAc,EAAC;AAAA,IACf,UAAU;AAAC,GACb;AAEA,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAY;AACjC,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAY;AACjC,EAAA,IAAI,SAAA,GAAY,KAAA;AAEhB,EAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,QAAA,CAAS,QAAQ,EAAA,EAAA,EAAM;AAC3C,IAAA,MAAM,OAAA,GAAU,SAAS,EAAE,CAAA;AAC3B,IAAA,MAAM,SAAS,EAAA,GAAK,CAAA;AACpB,IAAA,MAAM,OAAA,GAAU,QAAQ,IAAA,EAAK;AAC7B,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,IAAI,QAAQ,UAAA,CAAW,GAAG,KAAK,OAAA,CAAQ,UAAA,CAAW,IAAI,CAAA,EAAG;AAGzD,IAAA,IAAI,CAAC,SAAA,IAAa,iBAAA,CAAkB,IAAA,CAAK,OAAO,CAAA,EAAG;AACjD,MAAA,SAAA,GAAY,IAAA;AACZ,MAAA,MAAM,IAAA,GAAO8D,UAAS,OAAO,CAAA;AAC7B,MAAA,MAAM,QAAA,GAAW,KAAK,IAAA,CAAK,CAAC,GAAG,GAAA,KAAQ,GAAA,GAAM,CAAA,IAAK,CAAA,CAAE,MAAM,CAAA;AAC1D,MAAA,IAAI,QAAA,EAAU,GAAA,CAAI,KAAA,GAAQ,QAAA,CAAS,IAAA;AAAA,WAAA,IAC1B,IAAA,CAAK,CAAC,CAAA,IAAK,CAAC,KAAK,CAAC,CAAA,CAAE,QAAQ,GAAA,CAAI,KAAA,GAAQ,KAAK,KAAA,CAAM,CAAC,EAAE,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAC1F,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAC,SAAA,EAAW;AAEd,MAAA,IAAI,iBAAA,CAAkB,IAAA,CAAK,OAAO,CAAA,EAAG;AACnC,QAAA,SAAA,GAAY,IAAA;AACZ,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,QAAQ,WAAA,EAAY;AAGlC,IAAA,IAAI,KAAA,CAAM,UAAA,CAAW,SAAS,CAAA,EAAG;AAC/B,MAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,GAAG,CAAA,GAAI,CAAC,CAAA,CAAE,IAAA,EAAK,CAAE,WAAA,EAAY;AACrE,MAAA,IAAI,CAAA,KAAM,IAAA,IAAQ,CAAA,KAAM,IAAA,MAAU,SAAA,GAAY,CAAA;AAAA,eACrC,QAAA,CAAS,IAAA,CAAK,mBAAmB,CAAC,CAAA,QAAA,EAAW,MAAM,CAAA,YAAA,CAAc,CAAA;AAC1E,MAAA;AAAA,IACF;AACA,IAAA,IAAI,KAAA,CAAM,UAAA,CAAW,SAAS,CAAA,EAAG;AAC/B,MAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,GAAG,CAAA,GAAI,CAAC,CAAA,CAAE,IAAA,EAAK,CAAE,WAAA,EAAY;AACrE,MAAA,IAAI,MAAM,MAAA,IAAU,CAAA,KAAM,WAAW,CAAA,KAAM,MAAA,MAAY,UAAA,GAAa,CAAA;AAAA,eAC3D,QAAA,CAAS,IAAA,CAAK,wBAAwB,CAAC,CAAA,QAAA,EAAW,MAAM,CAAA,cAAA,CAAgB,CAAA;AACjF,MAAA;AAAA,IACF;AACA,IAAA,IAAI,KAAA,CAAM,UAAA,CAAW,UAAU,CAAA,EAAG;AAChC,MAAA,YAAA,CAAa,OAAA,CAAQ,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,GAAG,IAAI,CAAC,CAAA,EAAG,MAAA,EAAQ,GAAA,EAAK,QAAQ,CAAA;AAC3E,MAAA;AAAA,IACF;AACA,IAAA,IAAI,KAAA,CAAM,UAAA,CAAW,OAAO,CAAA,EAAG;AAC7B,MAAA,MAAM,GAAA,GAAM,QACT,KAAA,CAAM,OAAA,CAAQ,QAAQ,GAAG,CAAA,GAAI,CAAC,CAAA,CAC9B,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,MAAM,CAAA,CACnB,OAAO,OAAO,CAAA;AACjB,MAAA,GAAA,CAAI,YAAA,CAAa,IAAA,CAAK,GAAG,GAAG,CAAA;AAC5B,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,WAAA,CAAY,IAAA,CAAK,OAAO,CAAA,EAAG;AAC7B,MAAA,GAAA,CAAI,OAAO,IAAA,CAAK,UAAA,CAAW,SAAS,MAAA,EAAQ,QAAA,EAAU,QAAQ,CAAC,CAAA;AAC/D,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,gBAAA,CAAiB,IAAA,CAAK,OAAO,CAAA,EAAG;AAClC,MAAA,GAAA,CAAI,WAAA,CAAY,KAAK,eAAA,CAAgB,OAAA,CAAQ,MAAK,EAAG,MAAA,EAAQ,QAAA,EAAU,QAAQ,CAAC,CAAA;AAChF,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA;AAChC,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,GAAA,CAAI,KAAK,IAAA,CAAK,QAAA,CAAS,MAAM,MAAA,EAAQ,QAAA,EAAU,QAAQ,CAAC,CAAA;AACxD,MAAA;AAAA,IACF;AAEA,IAAA,GAAA,CAAI,SAAS,IAAA,CAAK,CAAA,kBAAA,EAAqB,MAAM,CAAA,GAAA,EAAM,OAAO,CAAA,CAAA,CAAG,CAAA;AAAA,EAC/D;AAGA,EAAA,KAAA,MAAW,EAAA,IAAM,IAAI,YAAA,EAAc;AACjC,IAAA,IAAI,CAAC,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA,EAAG;AACrB,MAAA,MAAM,IAAI,eAAA,CAAgB,CAAA,qCAAA,EAAwC,EAAE,CAAA,CAAA,CAAG,CAAA;AAAA,IACzE;AAAA,EACF;AAEA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,UAAA,CACP,EAAA,EACA,MAAA,EACA,QAAA,EACA,QAAA,EACM;AACN,EAAA,IAAI,SAAS,GAAA,CAAI,EAAE,KAAK,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA,EAAG;AACxC,IAAA,MAAM,IAAI,eAAA,CAAgB,CAAA,mBAAA,EAAsB,EAAE,KAAK,MAAM,CAAA;AAAA,EAC/D;AACF;AAEA,SAAS,UAAA,CACP/D,KAAAA,EACA,MAAA,EACA,QAAA,EACA,QAAA,EACY;AACZ,EAAA,MAAM,IAAA,GAAO+D,SAAAA,CAAS,gBAAA,CAAiB/D,KAAI,CAAC,CAAA;AAE5C,EAAA,MAAM,KAAA,GAAQ,KAAK,CAAC,CAAA;AACpB,EAAA,IAAI,CAAC,SAAS,KAAA,CAAM,MAAA,QAAc,IAAI,eAAA,CAAgB,0BAA0B,MAAM,CAAA;AACtF,EAAA,MAAM,KAAK,KAAA,CAAM,IAAA;AACjB,EAAA,UAAA,CAAW,EAAA,EAAI,MAAA,EAAQ,QAAA,EAAU,QAAQ,CAAA;AAEzC,EAAA,MAAM,QAAoB,EAAE,EAAA,EAAI,MAAA,EAAQ,CAAA,EAAG,MAAM,MAAA,EAAO;AACxD,EAAA,MAAM,aAAuB,EAAC;AAE9B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,CAAA,GAAI,KAAK,CAAC,CAAA;AAChB,IAAA,IAAI,EAAE,MAAA,EAAQ;AACZ,MAAA,UAAA,CAAW,IAAA,CAAK,EAAE,IAAI,CAAA;AACtB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,MAAM,CAAA,CAAE,IAAA;AACd,IAAA,IAAI,SAAA,CAAU,IAAA,CAAK,GAAG,CAAA,EAAG;AACvB,MAAA,KAAA,CAAM,SAAS,QAAA,CAAS,GAAA,CAAI,KAAA,CAAM,CAAC,GAAG,EAAE,CAAA;AAAA,IAC1C,CAAA,MAAA,IAAW,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,EAAG;AAC3B,MAAA,KAAA,CAAM,MAAA,GAAS,CAAC,GAAG,GAAG,CAAA,CAAE,MAAA;AAAA,IAC1B,CAAA,MAAA,IAAW,WAAA,CAAY,IAAA,CAAK,GAAG,CAAA,EAAG;AAChC,MAAA,KAAA,CAAM,MAAA,GAAS,KAAA,CAAM,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAA,GAAI,CAAC,CAAA,EAAG,QAAA,EAAU,MAAM,CAAA;AAAA,IACxE,CAAA,MAAA,IAAW,aAAA,CAAc,IAAA,CAAK,GAAG,CAAA,EAAG;AAClC,MAAA,MAAM,CAAA,GAAI,KAAA,CAAM,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAA,GAAI,CAAC,CAAA,EAAG,UAAA,EAAY,MAAM,CAAA;AACnE,MAAA,IAAI,KAAK,CAAA,EAAG,MAAM,IAAI,eAAA,CAAgB,uCAAuC,MAAM,CAAA;AACnF,MAAA,KAAA,CAAM,QAAA,GAAW,CAAA;AAAA,IACnB,CAAA,MAAO;AACL,MAAA,UAAA,CAAW,KAAK,GAAG,CAAA;AAAA,IACrB;AAAA,EACF;AACA,EAAA,IAAI,MAAM,MAAA,GAAS,CAAA,QAAS,IAAI,eAAA,CAAgB,kCAAkC,MAAM,CAAA;AACxF,EAAA,IAAI,WAAW,MAAA,EAAQ,KAAA,CAAM,KAAA,GAAQ,UAAA,CAAW,KAAK,GAAG,CAAA;AACxD,EAAA,QAAA,CAAS,IAAI,EAAE,CAAA;AACf,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,eAAA,CACPA,KAAAA,EACA,MAAA,EACA,QAAA,EACA,QAAA,EACiB;AAEjB,EAAA,IAAI,KAAA;AACJ,EAAA,MAAM,WAAWA,KAAAA,CAAK,OAAA,CAAQ,cAAA,EAAgB,CAAC,IAAI,CAAA,KAAM;AACvD,IAAA,KAAA,GAAQ,MAAA,CAAO,CAAC,CAAA,CAAE,IAAA,EAAK;AACvB,IAAA,OAAO,GAAA;AAAA,EACT,CAAC,CAAA;AACD,EAAA,MAAM,IAAA,GAAO+D,SAAAA,CAAS,gBAAA,CAAiB,QAAQ,CAAC,CAAA;AAChD,EAAA,MAAM,KAAA,GAAQ,KAAK,CAAC,CAAA;AACpB,EAAA,IAAI,CAAC,SAAS,KAAA,CAAM,MAAA,QAAc,IAAI,eAAA,CAAgB,+BAA+B,MAAM,CAAA;AAC3F,EAAA,MAAM,KAAK,KAAA,CAAM,IAAA;AACjB,EAAA,UAAA,CAAW,EAAA,EAAI,MAAA,EAAQ,QAAA,EAAU,QAAQ,CAAA;AAEzC,EAAA,MAAM,KAAsB,EAAE,EAAA,EAAI,IAAA,EAAM,WAAA,EAAa,MAAM,MAAA,EAAO;AAClE,EAAA,IAAI,KAAA,KAAU,KAAA,GAAQ,KAAA;AACtB,EAAA,MAAM,aAAuB,EAAC;AAE9B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,CAAA,GAAI,KAAK,CAAC,CAAA;AAChB,IAAA,IAAI,EAAE,MAAA,EAAQ;AACZ,MAAA,UAAA,CAAW,IAAA,CAAK,EAAE,IAAI,CAAA;AACtB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,MAAM,CAAA,CAAE,IAAA;AACd,IAAA,MAAM,GAAA,GAAM,IAAI,WAAA,EAAY;AAC5B,IAAA,IAAI,GAAA,KAAQ,WAAA,EAAa,EAAA,CAAG,IAAA,GAAO,WAAA;AAAA,SAAA,IAC1B,GAAA,KAAQ,OAAA,EAAS,EAAA,CAAG,IAAA,GAAO,OAAA;AAAA,SAAA,IAC3B,SAAA,CAAU,IAAA,CAAK,GAAG,CAAA,EAAG;AAC5B,MAAA,EAAA,CAAG,IAAA,GAAO,WAAW,GAAA,CAAI,KAAA,CAAM,IAAI,OAAA,CAAQ,GAAG,CAAA,GAAI,CAAC,CAAC,CAAA;AACpD,MAAA,EAAA,CAAG,IAAA,GAAO,OAAA;AAAA,IACZ,CAAA,MAAA,IAAW,oBAAA,CAAqB,IAAA,CAAK,GAAG,CAAA,EAAG;AACzC,MAAA,EAAA,CAAG,QAAA,GAAW,KAAA,CAAM,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAA,GAAI,CAAC,CAAA,EAAG,UAAA,EAAY,MAAM,CAAA;AAAA,IACzE,CAAA,MAAO;AACL,MAAA,UAAA,CAAW,KAAK,GAAG,CAAA;AAAA,IACrB;AAAA,EACF;AACA,EAAA,IAAI,WAAW,MAAA,EAAQ,EAAA,CAAG,KAAA,GAAQ,UAAA,CAAW,KAAK,GAAG,CAAA;AACrD,EAAA,QAAA,CAAS,IAAI,EAAE,CAAA;AACf,EAAA,OAAO,EAAA;AACT;AAEA,IAAM,UAAA,GAA2C;AAAA,EAC/C,IAAA,EAAM,UAAA;AAAA,EACN,IAAA,EAAM,WAAA;AAAA,EACN,IAAA,EAAM,MAAA;AAAA,EACN,IAAA,EAAM;AACR,CAAA;AAEA,SAAS,QAAA,CACP,CAAA,EACA,MAAA,EACA,QAAA,EACA,QAAA,EACU;AACV,EAAA,MAAM,IAAA,GAAO,EAAE,CAAC,CAAA;AAChB,EAAA,MAAM5B,MAAAA,GAAQ,EAAE,CAAC,CAAA;AACjB,EAAA,MAAM,EAAA,GAAK,EAAE,CAAC,CAAA;AACd,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,CAAC,CAAA,IAAK,EAAA;AACrB,EAAA,MAAM,IAAA,GAAO,WAAWA,MAAK,CAAA;AAE7B,EAAA,MAAM,KAAA,GAAQ,CAAC,EAAA,KACb,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA,GAAI,OAAA,GAAU,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA,GAAI,YAAA,GAAe,IAAA;AACjE,EAAA,MAAM,EAAA,GAAK,MAAM,IAAI,CAAA;AACrB,EAAA,MAAM,EAAA,GAAK,MAAM,EAAE,CAAA;AACnB,EAAA,IAAI,CAAC,IAAI,MAAM,IAAI,gBAAgB,CAAA,6BAAA,EAAgC,IAAI,sDAAiD,MAAM,CAAA;AAC9H,EAAA,IAAI,CAAC,IAAI,MAAM,IAAI,gBAAgB,CAAA,6BAAA,EAAgC,EAAE,sDAAiD,MAAM,CAAA;AAC5H,EAAA,IAAI,OAAO,EAAA,EAAI;AACb,IAAA,MAAM,IAAI,eAAA;AAAA,MACR,oBAAoB,EAAE,CAAA,+EAAA,CAAA;AAAA,MACtB;AAAA,KACF;AAAA,EACF;AACA,EAAA,IAAA,CAAK,IAAA,KAAS,WAAA,IAAe,IAAA,KAAS,OAAA,KAAY,OAAO,OAAA,EAAS;AAChE,IAAA,MAAM,IAAI,eAAA,CAAgB,CAAA,EAAG,IAAI,wCAAmC,MAAM,CAAA;AAAA,EAC5E;AAEA,EAAA,MAAM,GAAA,GAAgB,EAAE,IAAA,EAAM,EAAA,EAAI,MAAM,MAAA,EAAQ,CAAA,EAAG,MAAM,MAAA,EAAO;AAChE,EAAA,MAAM,IAAA,GAAO4B,SAAAA,CAAS,gBAAA,CAAiB,IAAI,CAAC,CAAA;AAC5C,EAAA,MAAM,aAAuB,EAAC;AAC9B,EAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,IAAA,IAAI,EAAE,MAAA,EAAQ;AACZ,MAAA,UAAA,CAAW,IAAA,CAAK,EAAE,IAAI,CAAA;AACtB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,MAAM,CAAA,CAAE,IAAA;AACd,IAAA,IAAI,SAAA,CAAU,IAAA,CAAK,GAAG,CAAA,EAAG,GAAA,CAAI,MAAA,GAAS,QAAA,CAAS,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA,EAAG,EAAE,CAAA;AAAA,SAAA,IACtD,YAAY,IAAA,CAAK,GAAG,CAAA,EAAG,GAAA,CAAI,SAAS,KAAA,CAAM,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,QAAQ,GAAG,CAAA,GAAI,CAAC,CAAA,EAAG,UAAU,MAAM,CAAA;AAAA,SAC/F,UAAA,CAAW,KAAK,GAAG,CAAA;AAAA,EAC1B;AACA,EAAA,IAAI,IAAI,MAAA,IAAU,CAAA,QAAS,IAAI,eAAA,CAAgB,yCAAyC,MAAM,CAAA;AAC9F,EAAA,IAAI,WAAW,MAAA,EAAQ,GAAA,CAAI,KAAA,GAAQ,UAAA,CAAW,KAAK,GAAG,CAAA;AACtD,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,YAAA,CACP,IAAA,EACA,MAAA,EACA,GAAA,EACA,QAAA,EACM;AACN,EAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,EAAG;AAClC,IAAA,MAAM,CAAA,GAAI,KAAK,IAAA,EAAK;AACpB,IAAA,IAAI,CAAC,CAAA,EAAG;AACR,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,OAAA,CAAQ,GAAG,CAAA;AACxB,IAAA,IAAI,KAAK,CAAA,EAAG;AACV,MAAA,GAAA,CAAI,SAAS,IAAA,CAAK,CAAA,mBAAA,EAAsB,CAAC,CAAA,QAAA,EAAW,MAAM,CAAA,iBAAA,CAAmB,CAAA;AAC7E,MAAA;AAAA,IACF;AACA,IAAA,MAAM,KAAK,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,EAAE,IAAA,EAAK;AAC/B,IAAA,MAAM,CAAA,GAAI,KAAA,CAAM,CAAA,CAAE,KAAA,CAAM,EAAA,GAAK,CAAC,CAAA,CAAE,IAAA,EAAK,EAAG,SAAA,EAAW,MAAM,CAAA;AACzD,IAAA,IAAI,CAAC,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA,EAAG;AACrB,MAAA,MAAM,IAAI,eAAA,CAAgB,CAAA,kCAAA,EAAqC,EAAE,KAAK,MAAM,CAAA;AAAA,IAC9E;AACA,IAAA,MAAM,KAAA,GAAQ,IAAI,MAAA,CAAO,IAAA,CAAK,CAAC,EAAA,KAAO,EAAA,CAAG,OAAO,EAAE,CAAA;AAClD,IAAA,IAAI,KAAA,QAAa,MAAA,GAAS,CAAA;AAAA,EAC5B;AACF;;;ACpVO,IAAM,WAAA,GAAc;AAAA,EACzB,OAAA,EAAS,EAAA;AAAA,EACT,WAAA,EAAa,CAAA;AAAA,EACb,WAAA,EAAa,EAAA;AAAA,EACb,WAAA,EAAa,EAAA;AAAA,EACb,WAAA,EAAa,EAAA;AAAA,EACb,SAAA,EAAW,EAAA;AAAA,EACX,QAAA,EAAU,EAAA;AAAA,EACV,OAAA,EAAS,GAAA;AAAA,EAET,oBAAA,EAAsB,CAAA;AAAA,EACtB,iBAAA,EAAmB,CAAA;AAAA,EACnB,SAAA,EAAW,CAAA;AAAA,EAEX,MAAA,EAAQ,EAAA;AAAA,EACR,YAAA,EAAc,EAAA;AAAA,EACd,YAAA,EAAc,EAAA;AAAA,EACd,MAAA,EAAQ;AACV,CAAA;AAuBO,SAAS,YAAY,GAAA,EAAkC;AAC5D,EAAA,MAAMxB,EAAAA,GAAI,WAAA;AACV,EAAA,MAAM,MAAM,GAAA,CAAI,SAAA;AAChB,EAAA,MAAM,QAAA,GAAW,CAAC,GAAG,GAAA,CAAI,QAAQ,CAAA;AAGjC,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAkB;AACrC,EAAA,KAAA,MAAW,KAAK,GAAA,CAAI,MAAA,SAAe,GAAA,CAAI,CAAA,CAAE,IAAI,OAAO,CAAA;AACpD,EAAA,KAAA,MAAW,KAAK,GAAA,CAAI,WAAA,SAAoB,GAAA,CAAI,CAAA,CAAE,IAAI,YAAY,CAAA;AAC9D,EAAA,MAAM,MAAM,CAAC,GAAG,IAAI,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAA,EAAG,GAAG,IAAI,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAC,CAAA;AAChF,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAoB;AAC1C,EAAA,GAAA,CAAI,OAAA,CAAQ,CAAC,EAAA,EAAI,CAAA,KAAM,UAAU,GAAA,CAAI,EAAA,EAAI,CAAC,CAAC,CAAA;AAQ3C,EAAA,MAAM,KAAA,GAAgB,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,IAAA,EAAM,CAAA,CAAE,MAAM,EAAA,EAAI,CAAA,CAAE,EAAA,EAAI,QAAA,EAAU,OAAM,CAAE,CAAA;AAGvF,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAsB;AACtC,EAAA,GAAA,CAAI,OAAA,CAAQ,CAAC,EAAA,KAAO,GAAA,CAAI,IAAI,EAAA,EAAI,EAAE,CAAC,CAAA;AACnC,EAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM,GAAA,CAAI,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA,CAAG,IAAA,CAAK,CAAC,CAAC,CAAA;AAChD,EAAA,MAAMF,MAAAA,uBAAY,GAAA,EAAuB;AACzC,EAAA,GAAA,CAAI,QAAQ,CAAC,EAAA,KAAOA,OAAM,GAAA,CAAI,EAAA,EAAI,CAAC,CAAC,CAAA;AACpC,EAAA,MAAM,GAAA,GAAM,CAAC,CAAA,KAAoB;AAC/B,IAAAA,MAAAA,CAAM,GAAA,CAAI,CAAA,EAAG,CAAC,CAAA;AACd,IAAA,KAAA,MAAW,EAAA,IAAM,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA,EAAI;AAC5B,MAAA,MAAM,CAAA,GAAI,MAAM,EAAE,CAAA;AAClB,MAAA,MAAM,CAAA,GAAIA,MAAAA,CAAM,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA;AACxB,MAAA,IAAI,CAAA,KAAM,CAAA,EAAG,CAAA,CAAE,QAAA,GAAW,IAAA;AAAA,WAAA,IACjB,CAAA,KAAM,CAAA,EAAG,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA;AAAA,IAC5B;AACA,IAAAA,MAAAA,CAAM,GAAA,CAAI,CAAA,EAAG,CAAC,CAAA;AAAA,EAChB,CAAA;AAEA,EAAA,KAAA,MAAW,EAAA,IAAM,KAAK,IAAIA,MAAAA,CAAM,IAAI,EAAE,CAAA,KAAM,CAAA,EAAG,GAAA,CAAI,EAAE,CAAA;AAGrD,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAsB;AACvC,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAoB;AACtC,EAAA,GAAA,CAAI,OAAA,CAAQ,CAAC,EAAA,KAAO;AAClB,IAAA,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AACf,IAAA,KAAA,CAAM,GAAA,CAAI,IAAI,CAAC,CAAA;AAAA,EACjB,CAAC,CAAA;AACD,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,MAAM,CAAC,IAAA,EAAM,EAAE,CAAA,GAAI,CAAA,CAAE,WAAW,CAAC,CAAA,CAAE,EAAA,EAAI,CAAA,CAAE,IAAI,CAAA,GAAI,CAAC,CAAA,CAAE,IAAA,EAAM,EAAE,EAAE,CAAA;AAC9D,IAAA,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,CAAG,IAAA,CAAK,EAAE,CAAA;AACvB,IAAA,KAAA,CAAM,IAAI,EAAA,EAAI,KAAA,CAAM,GAAA,CAAI,EAAE,IAAK,CAAC,CAAA;AAAA,EAClC;AAGA,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAoB;AACtC,EAAA,GAAA,CAAI,QAAQ,CAAC,EAAA,KAAO,MAAM,GAAA,CAAI,EAAA,EAAI,CAAC,CAAC,CAAA;AACpC,EAAA,MAAM,KAAA,GAAQ,IAAI,MAAA,CAAO,CAAC,OAAO,KAAA,CAAM,GAAA,CAAI,EAAE,CAAA,KAAM,CAAC,CAAA;AACpD,EAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAI,KAAK,CAAA;AAC/B,EAAA,IAAI,EAAA,GAAK,CAAA;AAET,EAAA,MAAM,CAAA,GAAI,CAAC,GAAG,KAAK,CAAA;AACnB,EAAA,OAAO,EAAA,GAAK,EAAE,MAAA,EAAQ;AACpB,IAAA,MAAM,CAAA,GAAI,EAAE,EAAA,EAAI,CAAA;AAEhB,IAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAI;AAC5B,MAAA,KAAA,CAAM,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,EAAI,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,GAAK,CAAC,CAAC,CAAA;AACvD,MAAA,SAAA,CAAU,IAAI,CAAA,EAAG,SAAA,CAAU,GAAA,CAAI,CAAC,IAAK,CAAC,CAAA;AACtC,MAAA,IAAI,UAAU,GAAA,CAAI,CAAC,MAAM,CAAA,EAAG,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,IACtC;AAAA,EACF;AAGA,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAG,GAAA,CAAI,GAAA,CAAI,CAAC,EAAA,KAAO,KAAA,CAAM,GAAA,CAAI,EAAE,CAAE,CAAC,CAAA;AAC/D,EAAA,MAAM,MAAA,GAAqB,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,WAAW,CAAA,EAAE,EAAG,MAAM,EAAE,CAAA;AACxE,EAAA,KAAA,MAAW,EAAA,IAAM,KAAK,MAAA,CAAO,KAAA,CAAM,IAAI,EAAE,CAAE,CAAA,CAAG,IAAA,CAAK,EAAE,CAAA;AACrD,EAAA,MAAA,CAAO,QAAQ,CAAC,GAAA,KAAQ,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,GAAK,SAAA,CAAU,GAAA,CAAI,CAAC,CAAE,CAAC,CAAA;AAGjF,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAoB;AACpC,EAAA,MAAM,UAAU,MAAY,MAAA,CAAO,OAAA,CAAQ,CAAC,QAAQ,GAAA,CAAI,OAAA,CAAQ,CAAC,EAAA,EAAI,MAAM,GAAA,CAAI,GAAA,CAAI,EAAA,EAAI,CAAC,CAAC,CAAC,CAAA;AAC1F,EAAA,OAAA,EAAQ;AACR,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAsB;AACxC,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAsB;AACvC,EAAA,GAAA,CAAI,OAAA,CAAQ,CAAC,EAAA,KAAO;AAClB,IAAA,KAAA,CAAM,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAChB,IAAA,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAAA,EACjB,CAAC,CAAA;AACD,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,MAAM,CAAC,IAAA,EAAM,EAAE,CAAA,GAAI,CAAA,CAAE,WAAW,CAAC,CAAA,CAAE,EAAA,EAAI,CAAA,CAAE,IAAI,CAAA,GAAI,CAAC,CAAA,CAAE,IAAA,EAAM,EAAE,EAAE,CAAA;AAC9D,IAAA,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,CAAG,IAAA,CAAK,EAAE,CAAA;AACvB,IAAA,KAAA,CAAM,GAAA,CAAI,EAAE,CAAA,CAAG,IAAA,CAAK,IAAI,CAAA;AAAA,EAC1B;AACA,EAAA,MAAM,IAAA,GAAO,CAAC,EAAA,EAAY,KAAA,KAAyC;AACjE,IAAA,MAAM,EAAA,GAAK,KAAA,CAAM,GAAA,CAAI,EAAE,CAAA;AACvB,IAAA,IAAI,CAAC,EAAA,CAAG,MAAA,EAAQ,OAAO,GAAA,CAAI,IAAI,EAAE,CAAA;AACjC,IAAA,OAAO,EAAA,CAAG,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA,EAAI,CAAC,CAAA,GAAI,EAAA,CAAG,MAAA;AAAA,EACtD,CAAA;AACA,EAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ,CAAA,EAAG,KAAA,EAAA,EAAS;AACtC,IAAA,MAAM,QAAA,GAAW,QAAQ,CAAA,KAAM,CAAA;AAC/B,IAAA,MAAM,KAAA,GAAQ,QAAA,GACV,CAAC,GAAG,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,GACxC,CAAC,GAAG,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CAAE,OAAA,EAAQ;AAC1D,IAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,MAAA,MAAM,KAAA,GAAQ,WAAW,KAAA,GAAQ,IAAA;AACjC,MAAA,MAAA,CAAO,CAAC,EAAG,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,IAAA,CAAK,GAAG,KAAK,CAAA,GAAI,KAAK,CAAA,EAAG,KAAK,KAAK,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,GAAK,SAAA,CAAU,GAAA,CAAI,CAAC,CAAE,CAAA;AAClG,MAAA,OAAA,EAAQ;AAAA,IACV;AAAA,EACF;AAGA,EAAA,MAAM6B,OAAAA,GAAS,CAAC,EAAA,KAA4D;AAC1E,IAAA,IAAI,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA,KAAM,SAAS,OAAO,EAAE,KAAA,EAAO3B,EAAAA,CAAE,SAAS,KAAA,EAAOA,EAAAA,CAAE,OAAA,EAAS,CAAA,EAAGA,GAAE,OAAA,EAAQ;AAC1F,IAAA,MAAM,EAAA,GAAK,IAAI,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,EAAE,CAAA;AAClD,IAAA,MAAM,OAAO,EAAA,CAAG,IAAA,KAAS,OAAA,GAAUA,EAAAA,CAAE,cAAcA,EAAAA,CAAE,WAAA;AACrD,IAAA,MAAM,OAAO,EAAA,CAAG,IAAA,KAAS,OAAA,GAAUA,EAAAA,CAAE,cAAcA,EAAAA,CAAE,WAAA;AAErD,IAAA,MAAM,KAAA,GAAQ,GAAA,KAAQ,IAAA,GAAO,IAAA,GAAO,IAAI,IAAA,GAAO,CAAA;AAC/C,IAAA,MAAM,KAAA,GAAQ,GAAA,KAAQ,IAAA,GAAO,IAAA,GAAO,IAAI,IAAA,GAAO,CAAA;AAC/C,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,CAAA,EAAG,CAAA,EAAE;AAAA,EAC9B,CAAA;AAGA,EAAA,MAAM,QAAA,GAAW,CAAC,EAAA,KAAuB;AACvC,IAAA,MAAM,CAAA,GAAI2B,QAAO,EAAE,CAAA;AACnB,IAAA,OAAO,GAAA,KAAQ,IAAA,GAAO,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,KAAA;AAAA,EACpC,CAAA;AACA,EAAA,MAAM,SAAA,GAAY,CAAC,EAAA,KAAuB;AACxC,IAAA,MAAM,CAAA,GAAIA,QAAO,EAAE,CAAA;AACnB,IAAA,OAAO,GAAA,KAAQ,IAAA,GAAO,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,KAAA;AAAA,EACpC,CAAA;AAEA,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,GAAA,CAAI,CAAC,GAAA,KAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAG,GAAA,CAAI,GAAA,CAAI,QAAQ,CAAC,CAAC,CAAA;AACvE,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAG,GAAA,CAAI,GAAA,CAAI,SAAS,CAAC,CAAA,GAAI,CAAA,GAAI3B,EAAAA,CAAE,QAAA;AACxD,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAG,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,MAAM,CAAC,CAAA;AAC3D,EAAA,MAAM,cAAcA,EAAAA,CAAE,MAAA,GAASA,GAAE,YAAA,GAAe,CAAA,GAAK,WAAW,IAAA,GAAQ,CAAA;AAGxE,EAAA,MAAM,aAAuB,EAAC;AAC9B,EAAA,IAAI,GAAA,GAAMA,EAAAA,CAAE,MAAA,GAASA,EAAAA,CAAE,YAAA,GAAe,CAAA;AACtC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,IAAA,GAAA,IAAO,UAAU,CAAC,CAAA;AAClB,IAAA,UAAA,CAAW,CAAC,CAAA,GAAI,GAAA;AAChB,IAAA,GAAA,IAAO,SAAA,CAAU,CAAC,CAAA,GAAKA,EAAAA,CAAE,SAAA;AAAA,EAC3B;AAEA,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAsB;AACvC,EAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,GAAA,EAAK,CAAA,KAAM;AACzB,IAAA,MAAM,IAAI,GAAA,CAAI,MAAA;AACd,IAAA,MAAM,KAAA,GAAA,CAAS,IAAI,CAAA,IAAK,IAAA;AACxB,IAAA,GAAA,CAAI,OAAA,CAAQ,CAAC,EAAA,EAAI,CAAA,KAAM;AACrB,MAAA,MAAM,KAAA,GAAQ,WAAA,GAAc,KAAA,GAAQ,CAAA,GAAI,CAAA,GAAI,IAAA;AAC5C,MAAA,MAAM,IAAA,GAAO,WAAW,CAAC,CAAA;AACzB,MAAA,MAAM,EAAA,GAAK,GAAA,KAAQ,IAAA,GAAO,IAAA,GAAO,KAAA;AACjC,MAAA,MAAM,EAAA,GAAK,GAAA,KAAQ,IAAA,GAAO,KAAA,GAAQ,IAAA;AAClC,MAAA,MAAM,CAAA,GAAI2B,QAAO,EAAE,CAAA;AACnB,MAAA,IAAA,CAAK,GAAA,CAAI,IAAI,EAAE,EAAA,EAAI,MAAM,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA,EAAI,EAAA,EAAI,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA,EAAO,OAAO,CAAA,CAAE,KAAA,EAAO,GAAG,CAAA,CAAE,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,CAAA;AAAA,IACtG,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AAGD,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAoB;AACxC,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,MAAA,EAAQ,OAAA,CAAQ,IAAI,CAAA,CAAE,EAAA,EAAI,EAAE,MAAM,CAAA;AACtD,EAAA,MAAM,MAAA,GAAS,CAAC,GAAA,KAA4B,GAAA,CAAI,IAAA,CAAK,OAAO,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,GAAG,CAAA;AAC/E,EAAA,MAAM,OAAA,GAAU,CAAC,GAAA,KAA4B,GAAA,CAAI,IAAA,CAAK,OAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,GAAG,CAAA;AAClF,EAAA,MAAM,KAAA,GAAQ,CAACC,IAAAA,KAAoC,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAOA,IAAG,CAAA,EAAG,QAAA;AAEzF,EAAA,MAAM,SAAA,GAAY,CAAC,GAAA,EAAa,CAAA,KAAoC;AAClE,IAAA,KAAA,MAAW,CAAA,IAAK,MAAA,CAAO,GAAG,CAAA,EAAG;AAC3B,MAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA,IAAK,CAAA;AAC9B,MAAA,IAAI,CAAA,CAAE,IAAA,KAAS,UAAA,IAAc,CAAA,CAAE,SAAS,MAAA,EAAQ;AAC9C,QAAA,IAAI,IAAA,GAAO,CAAA,CAAE,MAAA,EAAQ,OAAO,KAAA;AAAA,MAC9B,CAAA,MAAA,IAAW,CAAA,CAAE,IAAA,KAAS,WAAA,EAAa;AACjC,QAAA,IAAI,IAAA,IAAQ,CAAA,CAAE,MAAA,EAAQ,OAAO,KAAA;AAAA,MAC/B;AAAA,IAEF;AACA,IAAA,KAAA,MAAW,CAAA,IAAK,OAAA,CAAQ,GAAG,CAAA,EAAG;AAC5B,MAAA,MAAM,GAAA,GAAM,KAAA,CAAM,CAAA,CAAE,EAAE,CAAA;AACtB,MAAA,IAAI,GAAA,KAAQ,MAAA,IAAA,CAAc,CAAA,CAAE,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,IAAK,CAAA,IAAK,CAAA,CAAE,MAAA,GAAS,GAAA,EAAK,OAAO,KAAA;AAAA,IACvE;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AACA,EAAA,MAAM,SAAA,GAAY,CAAC,GAAA,EAAa,CAAA,KAAiC;AAC/D,IAAA,KAAA,MAAW,CAAA,IAAK,MAAA,CAAO,GAAG,CAAA,EAAG;AAC3B,MAAA,IAAI,CAAA,CAAE,IAAA,KAAS,UAAA,EAAY,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,EAAA,CAAO,CAAA,CAAE,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA,IAAK,CAAA,IAAK,EAAE,MAAM,CAAA;AAAA,WAAA,IAC/D,EAAE,IAAA,KAAS,OAAA,IAAW,GAAA,CAAI,CAAA,CAAE,MAAM,CAAC,CAAA;AAAA,IAC9C;AACA,IAAA,KAAA,MAAW,CAAA,IAAK,OAAA,CAAQ,GAAG,CAAA,IAAK,GAAA,CAAI,CAAA,CAAE,EAAA,EAAA,CAAK,CAAA,CAAE,IAAI,CAAA,CAAE,EAAE,CAAA,IAAK,CAAA,IAAK,EAAE,MAAM,CAAA;AAAA,EACzE,CAAA;AACA,EAAA,GAAA,CAAI,YAAA,CAAa,OAAA,CAAQ,CAAC,GAAA,EAAK,CAAA,KAAM;AACnC,IAAA,IAAI,UAAU,GAAA,EAAK,OAAO,CAAA,EAAG,SAAA,CAAU,KAAK,OAAO,CAAA;AAAA,kBACrC,IAAA,CAAK,CAAA,UAAA,EAAa,IAAI,CAAC,CAAA,cAAA,EAAiB,GAAG,CAAA,iDAAA,CAAmD,CAAA;AAAA,EAC9G,CAAC,CAAA;AAED,EAAA,MAAM,SAAA,GAAY,CAACA,IAAAA,KACjB,GAAA,CAAI,KAAK,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAOA,IAAAA,IAAO,CAAA,CAAE,IAAA,KAAS,UAAU,CAAA,CAAE,MAAA;AAChE,EAAA,MAAM,aAAuB,EAAC;AAC9B,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAChC,EAAA,KAAA,MAAW,EAAA,IAAM,IAAI,WAAA,EAAa;AAChC,IAAA,IAAI,SAAA,CAAU,EAAA,CAAG,EAAA,EAAI,OAAO,CAAA,EAAG;AAC7B,MAAA,UAAA,CAAW,IAAA,CAAK,GAAG,EAAE,CAAA;AACrB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,EAAA,CAAG,EAAE,CAAA,CAAE,IAAA;AAAA,MACzB,CAAC,CAAA,KAAA,CACE,CAAA,CAAE,SAAS,UAAA,IAAc,CAAA,CAAE,SAAS,MAAA,KAAA,CACpC,OAAA,CAAQ,IAAI,CAAA,CAAE,IAAI,KAAK,CAAA,IAAK,CAAA,CAAE,UAC/B,SAAA,CAAU,CAAA,CAAE,IAAI,CAAA,KAAM;AAAA,KAC1B;AACA,IAAA,IAAI,IAAA,EAAM,OAAA,CAAQ,GAAA,CAAI,EAAA,CAAG,EAAE,CAAA;AAAA,EAC7B;AAGA,EAAA,MAAM,QAAA,GAAW,CAAC,CAAA,EAAaC,GAAAA,EAAYC,GAAAA,KAA2B;AACpE,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAMD,GAAAA,EAAIC,GAAE,CAAA,IAAK,CAAA;AAClC,IAAA,MAAM,KAAKD,GAAAA,GAAK,GAAA;AAChB,IAAA,MAAM,KAAKC,GAAAA,GAAK,GAAA;AAChB,IAAA,IAAI,EAAE,IAAA,KAAS,OAAA,EAAS,OAAO,EAAE,GAAG,CAAA,CAAE,EAAA,GAAK,EAAA,GAAK,CAAA,CAAE,GAAG,CAAA,EAAG,CAAA,CAAE,EAAA,GAAK,EAAA,GAAK,EAAE,CAAA,EAAE;AACxE,IAAA,MAAM,EAAA,GAAK,OAAO,CAAA,GAAI,CAAA,CAAE,QAAQ,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,GAAI,QAAA;AAC/C,IAAA,MAAM,EAAA,GAAK,OAAO,CAAA,GAAI,CAAA,CAAE,QAAQ,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,GAAI,QAAA;AAC/C,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AACzB,IAAA,OAAO,EAAE,CAAA,EAAG,CAAA,CAAE,EAAA,GAAK,EAAA,GAAK,GAAG,CAAA,EAAG,CAAA,CAAE,EAAA,GAAK,EAAA,GAAK,CAAA,EAAE;AAAA,EAC9C,CAAA;AAEA,EAAA,MAAM,YAAA,GAAe,KAAK,GAAA,CAAI,GAAG,CAAC,GAAG,IAAA,CAAK,MAAA,EAAQ,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAO,GAAA,KAAQ,IAAA,GAAO,CAAA,CAAE,EAAA,GAAK,CAAA,CAAE,QAAQ,CAAA,CAAE,EAAA,GAAK,CAAA,CAAE,KAAM,CAAC,CAAA;AAEhH,EAAA,MAAM,WAA2B,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,CAAC,GAAG,CAAA,KAAM;AACtD,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA;AACzB,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA;AACvB,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,CAAC,CAAA,CAAG,QAAA;AAC3B,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAM,EAAA,GAAK,QAAA,CAAS,CAAA,EAAG,CAAA,CAAE,EAAA,GAAK,EAAE,EAAA,EAAI,CAAA,CAAE,EAAA,GAAK,CAAA,CAAE,EAAE,CAAA;AAC/C,MAAA,MAAM,EAAA,GAAK,QAAA,CAAS,CAAA,EAAG,CAAA,CAAE,EAAA,GAAK,EAAE,EAAA,EAAI,CAAA,CAAE,EAAA,GAAK,CAAA,CAAE,EAAE,CAAA;AAC/C,MAAA,MAAA,GAAS,CAAC,IAAI,EAAE,CAAA;AAAA,IAClB,CAAA,MAAO;AAEL,MAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,QAAA,MAAM,EAAA,GAAK,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAC3B,QAAA,MAAM,EAAA,GAAK,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAC3B,QAAA,MAAM,IAAA,GAAO,eAAe9B,EAAAA,CAAE,YAAA;AAC9B,QAAA,MAAA,GAAS,CAAC,EAAA,EAAI,EAAE,CAAA,EAAG,EAAA,CAAG,GAAG,CAAA,EAAG,IAAA,EAAK,EAAG,EAAE,GAAG,EAAA,CAAG,CAAA,EAAG,CAAA,EAAG,IAAA,IAAQ,EAAE,CAAA;AAAA,MAC9D,CAAA,MAAO;AACL,QAAA,MAAM,EAAA,GAAK,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAC3B,QAAA,MAAM,EAAA,GAAK,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAC3B,QAAA,MAAM,IAAA,GAAO,eAAeA,EAAAA,CAAE,YAAA;AAC9B,QAAA,MAAA,GAAS,CAAC,EAAA,EAAI,EAAE,CAAA,EAAG,IAAA,EAAM,GAAG,EAAA,CAAG,CAAA,EAAE,EAAG,EAAE,GAAG,IAAA,EAAM,CAAA,EAAG,EAAA,CAAG,CAAA,IAAK,EAAE,CAAA;AAAA,MAC9D;AAAA,IACF;AAEA,IAAA,MAAM,EAAA,GAAK,OAAO,CAAC,CAAA;AACnB,IAAA,MAAM,EAAA,GAAK,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA;AACnC,IAAA,MAAM,EAAA,GAAA,CAAM,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,CAAA,IAAK,CAAA;AAC3B,IAAA,MAAM,EAAA,GAAA,CAAM,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,CAAA,IAAK,CAAA;AAC3B,IAAA,MAAM,GAAA,GAAM,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,CAAA;AACtB,IAAA,MAAM,GAAA,GAAM,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,CAAA;AACtB,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,GAAA,EAAK,GAAG,CAAA,IAAK,CAAA;AACnC,IAAA,MAAM,MAAA,GAAS,EAAA,GAAM,GAAA,GAAM,EAAA,GAAMA,EAAAA,CAAE,iBAAA;AACnC,IAAA,MAAM,MAAA,GAAS,EAAA,GAAM,GAAA,GAAM,EAAA,GAAMA,EAAAA,CAAE,iBAAA;AACnC,IAAA,OAAO,EAAE,GAAA,EAAK,CAAA,EAAG,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAQ,MAAA,EAAQ,QAAA,EAAU,MAAA,EAAQ,MAAA,EAAO;AAAA,EACpF,CAAC,CAAA;AAGD,EAAA,MAAM,WAAA,GAAc,CAAC4B,IAAAA,KAAyB,GAAA,CAAI,IAAA,CAAK,KAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAOA,IAAG,CAAA;AAC/E,EAAA,MAAM,WAAA,GAAc,CAACA,IAAAA,KAAyB,GAAA,CAAI,IAAA,CAAK,KAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAASA,IAAG,CAAA;AAEjF,EAAA,MAAM,UAAA,GAA8B,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM;AACxD,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA;AACvB,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,CAAA;AAAA,MACP,IAAI,CAAA,CAAE,EAAA;AAAA,MACN,IAAI,CAAA,CAAE,EAAA;AAAA,MACN,GAAG,CAAA,CAAE,CAAA;AAAA,MACL,MAAA,EAAQ,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,IAAK,CAAA;AAAA,MAC7B,QAAA,EAAU,CAAC,WAAA,CAAY,CAAA,CAAE,EAAE,CAAA;AAAA,MAC3B,MAAA,EAAQ,CAAC,WAAA,CAAY,CAAA,CAAE,EAAE;AAAA,KAC3B;AAAA,EACF,CAAC,CAAA;AACD,EAAA,MAAM,UAAA,GAAmC,GAAA,CAAI,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,KAAM;AAClE,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA;AACvB,IAAA,OAAO;AAAA,MACL,UAAA,EAAY,CAAA;AAAA,MACZ,IAAI,CAAA,CAAE,EAAA;AAAA,MACN,IAAI,CAAA,CAAE,EAAA;AAAA,MACN,CAAA,EAAG,EAAE,KAAA,GAAQ,CAAA;AAAA,MACb,CAAA,EAAG,EAAE,KAAA,GAAQ,CAAA;AAAA,MACb,OAAA,EAAS,UAAA,CAAW,QAAA,CAAS,CAAA,CAAE,EAAE,CAAA;AAAA,MACjC,IAAA,EAAM,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,EAAE;AAAA,KACxB;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,MAAM,EAAA,GAAW,EAAE,IAAA,EAAM,QAAA,EAAU,MAAM,QAAA,EAAU,IAAA,EAAM,CAAA,QAAA,EAAW,IAAA,EAAM,CAAA,QAAA,EAAU;AACpF,EAAA,MAAM,MAAA,GAAS,CAAC,EAAA,EAAY,EAAA,EAAY,IAAY,EAAA,KAAqB;AACvE,IAAA,EAAA,CAAG,OAAO,IAAA,CAAK,GAAA,CAAI,EAAA,CAAG,IAAA,EAAM,IAAI,EAAE,CAAA;AAClC,IAAA,EAAA,CAAG,OAAO,IAAA,CAAK,GAAA,CAAI,EAAA,CAAG,IAAA,EAAM,IAAI,EAAE,CAAA;AAClC,IAAA,EAAA,CAAG,OAAO,IAAA,CAAK,GAAA,CAAI,EAAA,CAAG,IAAA,EAAM,IAAI,EAAE,CAAA;AAClC,IAAA,EAAA,CAAG,OAAO,IAAA,CAAK,GAAA,CAAI,EAAA,CAAG,IAAA,EAAM,IAAI,EAAE,CAAA;AAAA,EACpC,CAAA;AACA,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAwB,MAAA,CAAO,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA;AAChE,EAAA,MAAM,SAAS,CAAC,CAAA,KAAwB,IAAI,CAAA,CAAE,MAAA,GAAS5B,GAAE,MAAA,GAAS,CAAA;AAElE,EAAA,KAAA,MAAW,MAAM,UAAA,EAAY;AAC3B,IAAA,MAAA,CAAO,EAAA,CAAG,EAAA,GAAK,EAAA,CAAG,CAAA,EAAG,GAAG,EAAA,GAAK,EAAA,CAAG,CAAA,EAAG,EAAA,CAAG,KAAK,EAAA,CAAG,CAAA,EAAG,EAAA,CAAG,EAAA,GAAK,GAAG,CAAC,CAAA;AAC7D,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,EAAA,CAAG,KAAA,CAAM,EAAE,CAAA,EAAG,MAAA,CAAO,EAAA,CAAG,KAAA,CAAM,KAAK,CAAC,CAAA,GAAI,CAAA;AACnE,IAAA,MAAA,CAAO,EAAA,CAAG,EAAA,GAAK,EAAA,EAAI,EAAA,CAAG,KAAK,EAAA,CAAG,CAAA,GAAIA,EAAAA,CAAE,YAAA,GAAe,CAAA,EAAG,EAAA,CAAG,EAAA,GAAK,EAAA,EAAI,GAAG,EAAE,CAAA;AACvE,IAAA,IAAI,GAAG,KAAA,CAAM,QAAA,KAAa,QAAW,MAAA,CAAO,EAAA,CAAG,IAAI,EAAA,CAAG,EAAA,GAAK,GAAG,CAAA,EAAG,EAAA,CAAG,KAAK,EAAA,EAAI,EAAA,CAAG,KAAK,EAAA,CAAG,CAAA,GAAIA,GAAE,YAAY,CAAA;AAAA,EAC5G;AACA,EAAA,KAAA,MAAW,MAAM,UAAA,EAAY;AAC3B,IAAA,MAAA,CAAO,GAAG,EAAA,GAAK,EAAA,CAAG,IAAI,CAAA,EAAG,EAAA,CAAG,KAAK,EAAA,CAAG,CAAA,GAAI,GAAG,EAAA,CAAG,EAAA,GAAK,GAAG,CAAA,GAAI,CAAA,EAAG,GAAG,EAAA,GAAK,EAAA,CAAG,IAAI,CAAC,CAAA;AAC7E,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,EAAA,CAAG,UAAA,CAAW,EAAE,CAAA,EAAG,MAAA,CAAO,EAAA,CAAG,UAAA,CAAW,KAAK,CAAC,CAAA,GAAI,CAAA;AAC7E,IAAA,MAAA,CAAO,EAAA,CAAG,EAAA,GAAK,EAAA,EAAI,EAAA,CAAG,KAAK,EAAA,CAAG,CAAA,GAAI,CAAA,GAAIA,EAAAA,CAAE,eAAe,CAAA,EAAG,EAAA,CAAG,EAAA,GAAK,EAAA,EAAI,GAAG,EAAE,CAAA;AAAA,EAC7E;AACA,EAAA,KAAA,MAAW,MAAM,QAAA,EAAU;AACzB,IAAA,EAAA,CAAG,MAAA,CAAO,QAAQ,KAAK,CAAA;AACvB,IAAA,IAAI,EAAA,CAAG,MAAA,GAAS,CAAA,EAAG,MAAA,CAAO,GAAG,MAAA,GAAS,CAAA,EAAG,EAAA,CAAG,MAAA,GAAS,GAAG,EAAA,CAAG,MAAA,GAAS,CAAA,EAAG,EAAA,CAAG,SAAS,CAAC,CAAA;AAAA,EACtF;AAGA,EAAA,MAAM,EAAA,GAAKA,EAAAA,CAAE,MAAA,GAAS,EAAA,CAAG,IAAA;AACzB,EAAA,MAAM,EAAA,GAAKA,EAAAA,CAAE,MAAA,GAAS,EAAA,CAAG,IAAA;AACzB,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,MAA+B,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,EAAA,EAAI,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,EAAA,EAAG,CAAA;AACzE,EAAA,UAAA,CAAW,OAAA,CAAQ,CAAC,EAAA,KAAO;AACzB,IAAA,EAAA,CAAG,EAAA,IAAM,EAAA;AACT,IAAA,EAAA,CAAG,EAAA,IAAM,EAAA;AAAA,EACX,CAAC,CAAA;AACD,EAAA,UAAA,CAAW,OAAA,CAAQ,CAAC,EAAA,KAAO;AACzB,IAAA,EAAA,CAAG,EAAA,IAAM,EAAA;AACT,IAAA,EAAA,CAAG,EAAA,IAAM,EAAA;AAAA,EACX,CAAC,CAAA;AACD,EAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,EAAA,KAAO;AACvB,IAAA,EAAA,CAAG,MAAA,GAAS,EAAA,CAAG,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA;AAC/B,IAAA,EAAA,CAAG,MAAA,IAAU,EAAA;AACb,IAAA,EAAA,CAAG,MAAA,IAAU,EAAA;AAAA,EACf,CAAC,CAAA;AAED,EAAA,MAAM,QAAQ,EAAA,CAAG,IAAA,GAAO,EAAA,CAAG,IAAA,GAAO,IAAIA,EAAAA,CAAE,MAAA;AACxC,EAAA,MAAM,SAAS,EAAA,CAAG,IAAA,GAAO,EAAA,CAAG,IAAA,GAAO,IAAIA,EAAAA,CAAE,MAAA;AAGzC,EAAA,MAAM,QAAA,GAAW,eAAe,GAAG,CAAA;AAEnC,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAAA,IACvB,MAAA,EAAQ,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AAAA,IACzB,OAAO,GAAA,CAAI,KAAA;AAAA,IACX,SAAA,EAAW,GAAA;AAAA,IACX,MAAA,EAAQ,UAAA;AAAA,IACR,WAAA,EAAa,UAAA;AAAA,IACb,IAAA,EAAM,QAAA;AAAA,IACN,QAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,eAAe,GAAA,EAAmC;AACzD,EAAA,IAAI,CAAC,IAAI,WAAA,CAAY,MAAA,IAAU,CAAC,GAAA,CAAI,MAAA,CAAO,QAAQ,OAAO,MAAA;AAC1D,EAAA,MAAM,GAAA,GAAM,CAAC,GAAA,KAAgB,GAAA,CAAI,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,GAAG,CAAA,CAAE,MAAA;AAClE,EAAA,MAAM,IAAA,GAAO,CAAC,GAAA,KAAgB,GAAA,CAAI,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,GAAG,CAAA,CAAE,MAAA;AACrE,EAAA,MAAM,GAAA,GAAM,CAAC4B,IAAAA,KAAgB,GAAA,CAAI,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAOA,IAAG,CAAA,CAAE,MAAA;AAClE,EAAA,MAAM,IAAA,GAAO,CAACA,IAAAA,KAAgB,GAAA,CAAI,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAASA,IAAG,CAAA,CAAE,MAAA;AAErE,EAAA,MAAM,YAAA,GAAe,GAAA,CAAI,WAAA,CAAY,KAAA,CAAM,CAAC,CAAA,KAAM,GAAA,CAAI,CAAA,CAAE,EAAE,MAAM,CAAA,IAAK,IAAA,CAAK,CAAA,CAAE,EAAE,MAAM,CAAC,CAAA;AACrF,EAAA,MAAM,WAAA,GAAc,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA,KAAM,GAAA,CAAI,CAAA,CAAE,EAAE,MAAM,CAAA,IAAK,IAAA,CAAK,CAAA,CAAE,EAAE,MAAM,CAAC,CAAA;AAC/E,EAAA,MAAM,OAAA,GAAU,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,CAAC,MAAM,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,KAAM,CAAC,CAAA;AACxD,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,CAAC,MAAM,IAAA,CAAK,CAAA,CAAE,EAAE,CAAA,KAAM,CAAC,CAAA;AACvD,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,MAAA,KAAW,CAAA,IAAK,MAAM,MAAA,KAAW,CAAA;AAE7D,EAAA,MAAM,OAAiB,EAAC;AACxB,EAAA,IAAI,YAAA,EAAc,IAAA,CAAK,IAAA,CAAK,eAAe,CAAA;AAC3C,EAAA,IAAI,WAAA,EAAa,IAAA,CAAK,IAAA,CAAK,cAAc,CAAA;AACzC,EAAA,IAAI,WAAA,EAAa,IAAA,CAAK,IAAA,CAAK,cAAc,CAAA;AACzC,EAAA,OAAO,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,GAAI,MAAA;AACzC;;;ACrZA,SAAS/B,UAAS,CAAA,EAAkB;AAClC,EAAA,OAAO;AAAA;AAAA,wBAAA,EAEiB,CAAA,CAAE,SAAS,CAAA,UAAA,EAAa,CAAA,CAAE,WAAW,CAAA;AAAA;AAAA,wBAAA,EAErC,EAAE,SAAS,CAAA;AAAA,uDAAA,EACoB,EAAE,SAAS,CAAA;AAAA,sBAAA,EAC5C,CAAA,CAAE,iBAAiB,CAAA,UAAA,EAAa,CAAA,CAAE,gBAAgB,CAAA;AAAA,sBAAA,EAClD,CAAA,CAAE,iBAAiB,CAAA,UAAA,EAAa,CAAA,CAAE,gBAAgB,CAAA;AAAA,0BAAA,EAC9C,CAAA,CAAE,WAAW,CAAA,UAAA,EAAa,CAAA,CAAE,aAAa,CAAA;AAAA,qEAAA,EACE,EAAE,UAAU,CAAA;AAAA;AAAA,+CAAA,EAElC,EAAE,IAAI,CAAA;AAAA,yDAAA,EACI,EAAE,SAAS,CAAA;AAAA,4CAAA,EACxB,EAAE,SAAS,CAAA;AAAA,oDAAA,EACH,EAAE,SAAS,CAAA;AAAA,wBAAA,EACvC,EAAE,SAAS,CAAA;AAAA,uDAAA,EACoB,EAAE,eAAe,CAAA;AAAA,gCAAA,EACxC,CAAA,CAAE,SAAS,CAAA,UAAA,EAAa,CAAA,CAAE,eAAe,CAAA;AAAA,mDAAA,EACtB,EAAE,WAAW,CAAA;AAAA,mDAAA,EACb,EAAE,IAAI,CAAA;AAAA,CAAA,CACzD,IAAA,EAAK;AACP;AAEA,SAASU,SAAQ,CAAA,EAAkB;AACjC,EAAA,OAAOrB,sBAAA,CAAK;AAAA,IACVT,oBAAA;AAAA,MACE,QAAA;AAAA,MACA,EAAE,EAAA,EAAI,eAAA,EAAiB,OAAA,EAAS,aAAa,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,WAAA,EAAa,CAAA,EAAG,YAAA,EAAc,CAAA,EAAG,QAAQ,oBAAA,EAAqB;AAAA,MAC7H,CAACL,0BAAQ,EAAE,MAAA,EAAQ,gBAAgB,IAAA,EAAM,CAAA,CAAE,SAAA,EAAW,CAAC;AAAA,KACzD;AAAA,IACAK,oBAAA;AAAA,MACE,QAAA;AAAA,MACA,EAAE,EAAA,EAAI,qBAAA,EAAuB,OAAA,EAAS,aAAa,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,CAAA,EAAG,WAAA,EAAa,EAAA,EAAI,YAAA,EAAc,CAAA,EAAG,QAAQ,oBAAA,EAAqB;AAAA,MACrI;AAAA,QACEL,0BAAQ,EAAE,MAAA,EAAQ,gBAAgB,IAAA,EAAM,CAAA,CAAE,iBAAiB,CAAA;AAAA,QAC3DA,0BAAQ,EAAE,MAAA,EAAQ,iBAAiB,IAAA,EAAM,CAAA,CAAE,iBAAiB;AAAA;AAC9D;AACF,GACD,CAAA;AACH;AAIA,SAAS,eAAe,CAAA,EAAyB;AAC/C,EAAA,MAAM,CAAA,GAAI,YAAE,OAAA,GAAU,GAAA;AACtB,EAAA,QAAQ,CAAA;AAAG,IACT,KAAK,CAAA;AACH,MAAA,OAAO,CAAC,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA;AAAA,IACxB,KAAK,CAAA;AACH,MAAA,OAAO;AAAA,QACL,EAAE,CAAA,EAAG,CAAC,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,QACd,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA;AAAE,OACf;AAAA,IACF,KAAK,CAAA;AACH,MAAA,OAAO;AAAA,QACL,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,EAAE;AAAA,QACd,EAAE,CAAA,EAAG,CAAC,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,QACd,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA;AAAE,OACf;AAAA,IACF;AACE,MAAA,OAAO;AAAA,QACL,EAAE,CAAA,EAAG,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,EAAE;AAAA,QACf,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,EAAE;AAAA,QACd,EAAE,CAAA,EAAG,CAAC,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,QACd,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA;AAAE,OACf;AAAA;AAEN;AAEA,SAAS,YAAA,CAAa,IAAmB,KAAA,EAAuC;AAC9E,EAAA,MAAM,IAAI,EAAA,CAAG,MAAA;AACb,EAAA,IAAI,CAAA,IAAK,GAAG,OAAO,EAAA;AACnB,EAAA,MAAM,MAAA,GAAS,KAAA,KAAU,OAAA,IAAW,CAAA,IAAK,WAAA,CAAE,oBAAA;AAC3C,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,OAAO,cAAA,CAAe,CAAC,CAAA,CACpB,GAAA,CAAI,CAAC,CAAA,KAAMD,wBAAA,CAAO,EAAE,KAAA,EAAO,gBAAA,EAAkB,EAAA,EAAI,EAAA,CAAG,EAAA,GAAK,CAAA,CAAE,CAAA,EAAG,EAAA,EAAI,EAAA,CAAG,EAAA,GAAK,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,WAAA,CAAE,OAAA,EAAS,CAAC,CAAA,CAC9F,IAAA,CAAK,EAAE,CAAA;AAAA,EACZ;AACA,EAAA,OAAOT,sBAAA;AAAA,IACL,EAAE,KAAA,EAAO,oBAAA,EAAsB,CAAA,EAAG,EAAA,CAAG,EAAA,EAAI,CAAA,EAAG,EAAA,CAAG,EAAA,GAAK,CAAA,EAAG,aAAA,EAAe,QAAA,EAAS;AAAA,IAC/E,OAAO,CAAC;AAAA,GACV;AACF;AAIA,SAAS,WAAA,CAAY,IAAmB,KAAA,EAAuC;AAC7E,EAAA,MAAM,GAAA,GAAM,EAAA,CAAG,KAAA,CAAM,QAAA,KAAa,SAAY,mCAAA,GAAsC,gBAAA;AACpF,EAAA,MAAM,QAAkB,CAACS,wBAAA,CAAO,EAAE,KAAA,EAAO,KAAK,EAAA,EAAI,EAAA,CAAG,EAAA,EAAI,EAAA,EAAI,GAAG,EAAA,EAAI,CAAA,EAAG,EAAA,CAAG,CAAA,EAAG,CAAC,CAAA;AAC9E,EAAA,KAAA,CAAM,IAAA,CAAK,YAAA,CAAa,EAAA,EAAI,KAAK,CAAC,CAAA;AAElC,EAAA,MAAM,MAAA,GAAS,EAAA,CAAG,EAAA,GAAK,EAAA,CAAG,IAAI,WAAA,CAAE,SAAA;AAChC,EAAA,KAAA,CAAM,KAAKT,sBAAA,CAAO,EAAE,KAAA,EAAO,gBAAA,EAAkB,GAAG,EAAA,CAAG,EAAA,EAAI,CAAA,EAAG,MAAA,EAAQ,eAAe,QAAA,EAAS,EAAG,EAAA,CAAG,KAAA,CAAM,EAAE,CAAC,CAAA;AACzG,EAAA,IAAI,EAAA,CAAG,MAAM,KAAA,EAAO;AAClB,IAAA,KAAA,CAAM,IAAA;AAAA,MACJA,uBAAO,EAAE,KAAA,EAAO,mBAAA,EAAqB,CAAA,EAAG,GAAG,EAAA,EAAI,CAAA,EAAG,MAAA,GAAS,WAAA,CAAE,cAAc,aAAA,EAAe,QAAA,EAAS,EAAG,EAAA,CAAG,MAAM,KAAK;AAAA,KACtH;AAAA,EACF;AACA,EAAA,IAAI,EAAA,CAAG,KAAA,CAAM,QAAA,KAAa,MAAA,EAAW;AACnC,IAAA,KAAA,CAAM,IAAA;AAAA,MACJA,sBAAA,CAAO,EAAE,KAAA,EAAO,cAAA,EAAgB,GAAG,EAAA,CAAG,EAAA,GAAK,GAAG,CAAA,GAAI,CAAA,EAAG,GAAG,EAAA,CAAG,EAAA,GAAK,GAAG,CAAA,GAAI,CAAA,IAAK,CAAA,EAAA,EAAK,EAAA,CAAG,KAAA,CAAM,QAAQ,CAAA,CAAE;AAAA,KACtG;AAAA,EACF;AACA,EAAA,MAAM,KAAA,GAAqD;AAAA,IACzD,KAAA,EAAO,kBAAA;AAAA,IACP,SAAA,EAAW,GAAG,KAAA,CAAM,EAAA;AAAA,IACpB,eAAe,EAAA,CAAG;AAAA,GACpB;AACA,EAAA,IAAI,EAAA,CAAG,MAAM,QAAA,KAAa,MAAA,QAAiB,eAAe,CAAA,GAAI,GAAG,KAAA,CAAM,QAAA;AACvE,EAAA,IAAI,EAAA,CAAG,QAAA,EAAU,KAAA,CAAM,aAAa,CAAA,GAAI,MAAA;AACxC,EAAA,IAAI,EAAA,CAAG,MAAA,EAAQ,KAAA,CAAM,WAAW,CAAA,GAAI,MAAA;AACpC,EAAA,OAAOY,uBAAA,CAAM,OAAO,KAAK,CAAA;AAC3B;AAIA,SAAS,iBAAiB,EAAA,EAAgC;AACxD,EAAA,MAAM,CAAA,GAAI,EAAA,CAAG,EAAA,GAAK,EAAA,CAAG,CAAA,GAAI,CAAA;AACzB,EAAA,MAAM,CAAA,GAAI,EAAA,CAAG,EAAA,GAAK,EAAA,CAAG,CAAA,GAAI,CAAA;AACzB,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,IAAI,GAAG,OAAA,EAAS;AACd,IAAA,KAAA,CAAM,IAAA;AAAA,MACJJ,sBAAA,CAAK,EAAE,KAAA,EAAO,kBAAA,EAAoB,GAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,KAAA,EAAO,GAAG,CAAA,GAAI,CAAA,EAAG,QAAQ,EAAA,CAAG,CAAA,GAAI,GAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG;AAAA,KACzG;AAAA,EACF;AACA,EAAA,MAAM,UAAA,GAAa,EAAA,CAAG,UAAA,CAAW,IAAA,KAAS,UAAU,cAAA,GAAiB,cAAA;AACrE,EAAA,KAAA,CAAM,KAAKA,sBAAA,CAAK,EAAE,OAAO,UAAA,EAAY,CAAA,EAAG,GAAG,KAAA,EAAO,EAAA,CAAG,CAAA,EAAG,MAAA,EAAQ,GAAG,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA,EAAI,CAAA,EAAG,CAAC,CAAA;AAGrF,EAAA,MAAM,MAAA,GAAS,IAAI,WAAA,CAAE,SAAA;AACrB,EAAA,KAAA,CAAM,KAAKR,sBAAA,CAAO,EAAE,KAAA,EAAO,gBAAA,EAAkB,GAAG,EAAA,CAAG,EAAA,EAAI,CAAA,EAAG,MAAA,EAAQ,eAAe,QAAA,EAAS,EAAG,EAAA,CAAG,UAAA,CAAW,EAAE,CAAC,CAAA;AAC9G,EAAA,IAAI,EAAA,CAAG,WAAW,KAAA,EAAO;AACvB,IAAA,KAAA,CAAM,IAAA;AAAA,MACJA,uBAAO,EAAE,KAAA,EAAO,mBAAA,EAAqB,CAAA,EAAG,GAAG,EAAA,EAAI,CAAA,EAAG,MAAA,GAAS,WAAA,CAAE,cAAc,aAAA,EAAe,QAAA,EAAS,EAAG,EAAA,CAAG,WAAW,KAAK;AAAA,KAC3H;AAAA,EACF;AACA,EAAA,IAAI,GAAG,UAAA,CAAW,IAAA,KAAS,WAAW,EAAA,CAAG,UAAA,CAAW,SAAS,MAAA,EAAW;AACtE,IAAA,KAAA,CAAM,IAAA,CAAKA,uBAAO,EAAE,KAAA,EAAO,iBAAiB,CAAA,EAAG,EAAA,CAAG,IAAI,CAAA,EAAG,CAAA,GAAI,GAAG,CAAA,GAAI,EAAA,EAAI,eAAe,QAAA,EAAS,EAAG,UAAK,EAAA,CAAG,UAAA,CAAW,IAAI,CAAA,CAAE,CAAC,CAAA;AAAA,EAC/H;AACA,EAAA,IAAI,EAAA,CAAG,WAAW,KAAA,EAAO;AACvB,IAAA,KAAA,CAAM,IAAA,CAAKA,uBAAO,EAAE,KAAA,EAAO,iBAAiB,CAAA,EAAG,EAAA,CAAG,EAAA,GAAK,EAAA,CAAG,CAAA,GAAI,CAAA,GAAI,GAAG,CAAA,EAAG,EAAA,CAAG,KAAK,CAAA,EAAE,EAAG,IAAI,EAAA,CAAG,UAAA,CAAW,KAAK,CAAA,CAAA,CAAG,CAAC,CAAA;AAAA,EAClH;AACA,EAAA,OAAOY,uBAAA;AAAA,IACL;AAAA,MACE,KAAA,EAAO,EAAA,CAAG,IAAA,GAAO,gCAAA,GAAmC,kBAAA;AAAA,MACpD,SAAA,EAAW,GAAG,UAAA,CAAW,EAAA;AAAA,MACzB,WAAA,EAAa,GAAG,UAAA,CAAW,IAAA;AAAA,MAC3B,cAAA,EAAgB,EAAA,CAAG,OAAA,GAAU,MAAA,GAAS;AAAA,KACxC;AAAA,IACA;AAAA,GACF;AACF;AAIA,SAAS,QAAQ,EAAA,EAA0B;AACzC,EAAA,MAAM,IAAI,EAAA,CAAG,MAAA;AACb,EAAA,IAAI,CAAA,CAAE,WAAW,CAAA,EAAG;AAClB,IAAA,OAAO,KAAK,CAAA,CAAE,CAAC,CAAA,CAAG,CAAC,IAAI,CAAA,CAAE,CAAC,CAAA,CAAG,CAAC,MAAM,CAAA,CAAE,CAAC,EAAG,CAAC,CAAA,CAAA,EAAI,EAAE,CAAC,CAAA,CAAG,CAAC,CAAA,CAAA,EAAI,EAAE,CAAC,CAAA,CAAG,CAAC,CAAA,CAAA,EAAI,CAAA,CAAE,CAAC,CAAA,CAAG,CAAC,CAAA,CAAA,EAAI,CAAA,CAAE,CAAC,CAAA,CAAG,CAAC,IAAI,CAAA,CAAE,CAAC,EAAG,CAAC,CAAA,CAAA;AAAA,EACpG;AACA,EAAA,OAAO,CAAA,EAAA,EAAK,EAAE,CAAC,CAAA,CAAG,CAAC,CAAA,CAAA,EAAI,CAAA,CAAE,CAAC,CAAA,CAAG,CAAC,CAAA,GAAA,EAAM,EAAE,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA,CAAG,CAAC,CAAA,CAAA,EAAI,EAAE,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA,CAAG,CAAC,CAAA,CAAA;AAC9E;AAEA,SAAS,UAAU,EAAA,EAA0B;AAC3C,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,IAAI,GAAA,GAAM,cAAA;AACV,EAAA,IAAI,SAAA;AACJ,EAAA,IAAI,EAAA,CAAG,SAAS,UAAA,EAAY;AAC1B,IAAA,SAAA,GAAY,qBAAA;AAAA,EACd,CAAA,MAAA,IAAW,EAAA,CAAG,IAAA,KAAS,OAAA,EAAS;AAC9B,IAAA,GAAA,IAAO,qBAAA;AACP,IAAA,SAAA,GAAY,2BAAA;AAAA,EACd,CAAA,MAAA,IAAW,EAAA,CAAG,IAAA,KAAS,WAAA,EAAa;AAClC,IAAA,GAAA,IAAO,yBAAA;AAAA,EACT;AAEA,EAAA,KAAA,CAAM,KAAKD,sBAAA,CAAO,EAAE,OAAO,GAAA,EAAK,CAAA,EAAG,QAAQ,EAAE,CAAA,EAAG,GAAI,SAAA,GAAY,EAAE,YAAA,EAAc,SAAA,KAAc,EAAC,EAAI,CAAC,CAAA;AAGpG,EAAA,IAAI,EAAA,CAAG,SAAS,WAAA,EAAa;AAC3B,IAAA,MAAM,MAAM,EAAA,CAAG,MAAA;AACf,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA;AAC/B,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA;AAC/B,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,CAAA;AACzB,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,CAAA;AACzB,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,EAAA,EAAI,EAAE,CAAA,IAAK,CAAA;AAClC,IAAA,MAAM,CAAA,GAAI,CAAA;AACV,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,CAAA,GAAK,EAAA,GAAK,GAAA,GAAO,CAAA;AACjC,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,CAAA,GAAK,EAAA,GAAK,GAAA,GAAO,CAAA;AACjC,IAAA,KAAA,CAAM,IAAA,CAAKF,yBAAO,EAAE,KAAA,EAAO,0BAA0B,EAAA,EAAI,EAAA,EAAI,CAAA,EAAG,CAAC,CAAA;AAAA,EACnE;AAEA,EAAA,IAAI,EAAA,CAAG,SAAS,CAAA,EAAG;AACjB,IAAA,KAAA,CAAM,IAAA;AAAA,MACJT,uBAAO,EAAE,KAAA,EAAO,iBAAA,EAAmB,CAAA,EAAG,GAAG,MAAA,EAAQ,CAAA,EAAG,EAAA,CAAG,MAAA,GAAS,GAAG,aAAA,EAAe,QAAA,IAAY,MAAA,CAAO,EAAA,CAAG,MAAM,CAAC;AAAA,KACjH;AAAA,EACF;AACA,EAAA,OAAOY,uBAAA;AAAA,IACL,EAAE,KAAA,EAAO,gBAAA,EAAkB,WAAA,EAAa,EAAA,CAAG,IAAI,IAAA,EAAM,SAAA,EAAW,EAAA,CAAG,GAAA,CAAI,IAAI,WAAA,EAAa,EAAA,CAAG,IAAA,EAAM,aAAA,EAAe,GAAG,MAAA,EAAO;AAAA,IAC1H;AAAA,GACF;AACF;AAIO,SAAS,iBAAA,CAAkB,QAA2B,MAAA,EAA+B;AAC1F,EAAA,MAAM,CAAA,GAAIyD,mCAAA,CAAkB,MAAA,EAAQ,KAAA,IAAS,SAAS,CAAA;AACtD,EAAA,MAAM,WAAqB,EAAC;AAE5B,EAAA,MAAM,OAAA,GAAU,OAAO,MAAA,CACpB,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA,CAC1B,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAG,CAAA,CAAE,KAAA,CAAM,EAAE,CAAA,CAAA,EAAI,EAAE,MAAM,CAAA,CAAE,CAAA,CACtC,IAAA,CAAK,IAAI,CAAA;AACZ,EAAA,MAAM,SAAA,GAAY;AAAA,IAChB,CAAA,EAAG,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA,SAAA,EAAY,MAAA,CAAO,WAAA,CAAY,MAAM,CAAA,cAAA,EAAiB,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,MAAA,CAAA;AAAA,IAC/F,OAAA,GAAU,CAAA,SAAA,EAAY,OAAO,CAAA,EAAA,CAAA,GAAO,gBAAA;AAAA,IACpC,MAAA,CAAO,WAAW,MAAA,GAAS,CAAA,SAAA,EAAY,OAAO,UAAA,CAAW,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA,GAAM,yBAAA;AAAA,IACzE,MAAA,CAAO,QAAA,GAAW,CAAA,OAAA,EAAU,MAAA,CAAO,QAAQ,CAAA,CAAA,CAAA,GAAM;AAAA,GACnD,CAAE,OAAO,OAAO,CAAA;AAEhB,EAAA,QAAA,CAAS,IAAA,CAAKpE,uBAAA,CAAQ,CAAA,SAAA,EAAY,MAAA,CAAO,KAAA,GAAQ,aAAQ,MAAA,CAAO,KAAA,GAAQ,EAAE,CAAA,CAAE,CAAC,CAAA;AAC7E,EAAA,QAAA,CAAS,KAAKa,sBAAA,CAAK,SAAA,CAAU,IAAA,CAAK,GAAG,CAAC,CAAC,CAAA;AACvC,EAAA,QAAA,CAAS,IAAA,CAAKC,qBAAG,OAAA,EAAS,IAAIoB,SAAAA,CAAS,CAAC,CAAC,CAAC,CAAA;AAC1C,EAAA,QAAA,CAAS,IAAA,CAAKU,QAAAA,CAAQ,CAAC,CAAC,CAAA;AAExB,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,KAAA,GAAQ,EAAA,GAAK,CAAA;AACtC,EAAA,IAAI,OAAO,KAAA,EAAO;AAChB,IAAA,QAAA,CAAS,KAAK7C,sBAAA,CAAO,EAAE,CAAA,EAAG,MAAA,CAAO,QAAQ,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,KAAA,EAAO,kBAAkB,aAAA,EAAe,QAAA,EAAS,EAAG,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,EACtH;AAEA,EAAA,MAAM,OAAiB,EAAC;AACxB,EAAA,IAAA,CAAK,IAAA,CAAKY,uBAAA,CAAM,EAAE,KAAA,EAAO,eAAA,EAAgB,EAAG,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,SAAS,CAAC,CAAC,CAAA;AACvE,EAAA,IAAA,CAAK,KAAKA,uBAAA,CAAM,EAAE,OAAO,iBAAA,EAAkB,EAAG,OAAO,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,YAAY,CAAA,EAAG,MAAA,CAAO,IAAI,UAAU,CAAC,CAAC,CAAC,CAAA;AAC9G,EAAA,IAAA,CAAK,IAAA,CAAKA,uBAAA,CAAM,EAAE,KAAA,EAAO,sBAAA,EAAuB,EAAG,MAAA,CAAO,WAAA,CAAY,GAAA,CAAI,gBAAgB,CAAC,CAAC,CAAA;AAE5F,EAAA,QAAA,CAAS,IAAA,CAAK,SAAA,GAAYA,uBAAA,CAAM,EAAE,WAAW,CAAA,aAAA,EAAgB,SAAS,CAAA,CAAA,CAAA,EAAI,EAAG,IAAI,CAAA,GAAIA,uBAAA,CAAM,EAAC,EAAG,IAAI,CAAC,CAAA;AAEpG,EAAA,MAAM,MAAA,GAAS,OAAO,MAAA,GAAS,SAAA;AAC/B,EAAA,OAAOI,yBAAA;AAAA,IACL;AAAA,MACE,KAAA,EAAO,UAAA;AAAA,MACP,IAAA,EAAM,KAAA;AAAA,MACN,YAAA,EAAcC,2BAAA,CAAU,MAAA,CAAO,KAAA,IAAS,WAAW,CAAA;AAAA,MACnD,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,MAAA;AAAA,MACA,OAAA,EAAS,CAAA,IAAA,EAAO,MAAA,CAAO,KAAK,IAAI,MAAM,CAAA,CAAA;AAAA,MACtC,mBAAA,EAAqB;AAAA,KACvB;AAAA,IACA;AAAA,GACF;AACF;AAEO,SAAS,WAAA,CAAY,WAA8B,MAAA,EAA+B;AACvF,EAAA,MAAM,MAAM,OAAO,SAAA,KAAc,QAAA,GAAW,UAAA,CAAW,SAAS,CAAA,GAAI,SAAA;AACpE,EAAA,MAAM,MAAA,GAAS,YAAY,GAAG,CAAA;AAC9B,EAAA,OAAO,iBAAA,CAAkB,QAAQ,MAAM,CAAA;AACzC;;;AChSO,IAAM,KAAA,GAAuB;AAAA,EAClC,IAAA,EAAM,OAAA;AAAA,EACN,OAAOjB,KAAAA,EAAuB;AAC5B,IAAA,KAAA,MAAW,GAAA,IAAOA,KAAAA,CAAK,KAAA,CAAM,OAAO,CAAA,EAAG;AACrC,MAAA,MAAM,CAAA,GAAI,IAAI,IAAA,EAAK;AACnB,MAAA,IAAI,CAAC,CAAA,EAAG;AACR,MAAA,IAAI,EAAE,UAAA,CAAW,GAAG,KAAK,CAAA,CAAE,UAAA,CAAW,IAAI,CAAA,EAAG;AAC7C,MAAA,OAAO,iBAAA,CAAkB,KAAK,CAAC,CAAA;AAAA,IACjC;AACA,IAAA,OAAO,KAAA;AAAA,EACT,CAAA;AAAA,EACA,KAAA,EAAO,UAAA;AAAA,EACP,MAAA,CAAOA,OAAc,MAAA,EAA+B;AAClD,IAAA,OAAO,WAAA,CAAYA,OAAM,MAAM,CAAA;AAAA,EACjC;AACF;;;ACAO,IAAM,iBAAA,GAAN,cAAgC,KAAA,CAAM;AAAA,EAClC,IAAA,GAAO,mBAAA;AAClB,CAAA;AAIA,IAAM,YAAA,uBAAmB,GAAA,CAAgB;AAAA,EACvC,QAAA;AAAA,EAAU,QAAA;AAAA,EAAU,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,cAAA;AAAA,EAAgB,IAAA;AAAA,EAAM,KAAA;AAAA,EAClE,SAAA;AAAA,EAAW,OAAA;AAAA,EAAS,KAAA;AAAA,EAAO,OAAA;AAAA,EAAS,OAAA;AAAA,EACpC,QAAA;AAAA,EAAU,YAAA;AAAA,EAAc,IAAA;AAAA,EAAM,QAAA;AAAA,EAAU,QAAA;AAAA,EAAU,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EACxE,QAAA;AAAA,EAAU,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,WAAA;AAAA,EAAa,SAAA;AAAA,EAAW,SAAA;AAAA,EAChD,UAAA;AAAA,EAAY,KAAA;AAAA,EAAO,OAAA;AAAA,EAAS,MAAA;AAAA,EAAQ;AACtC,CAAC,CAAA;AAGD,IAAM,YAAA,GAA2C;AAAA,EAC/C,UAAA,EAAY,UAAA;AAAA,EACZ,IAAA,EAAM,IAAA;AAAA,EACN,WAAA,EAAa,IAAA;AAAA,EACb,KAAA,EAAO,QAAA;AAAA,EACP,IAAA,EAAM,SAAA;AAAA,EACN,GAAA,EAAK,SAAA;AAAA,EACL,GAAA,EAAK,SAAA;AAAA,EACL,OAAA,EAAS,YAAA;AAAA,EACT,GAAA,EAAK,KAAA;AAAA,EACL,OAAA,EAAS,SAAA;AAAA,EACT,SAAA,EAAW,SAAA;AAAA,EACX,OAAA,EAAS;AACX,CAAA;AAEA,IAAM,WAAA,mBAAc,IAAI,GAAA,CAAY,CAAC,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,MAAA,EAAQ,QAAA,EAAU,MAAA,EAAQ,MAAA,EAAQ,KAAK,CAAC,CAAA;AAC3G,IAAM,gBAAA,GAA8C,EAAE,QAAA,EAAU,MAAA,EAAQ,QAAQ,MAAA,EAAO;AAEvF,IAAM,KAAA,uBAAY,GAAA,CAAgB,CAAC,QAAQ,MAAA,EAAQ,cAAA,EAAgB,QAAQ,CAAC,CAAA;AAC5E,IAAM,YAAA,uBAAmB,GAAA,CAAgB,CAAC,SAAS,QAAA,EAAU,MAAA,EAAQ,KAAA,EAAO,QAAQ,CAAC,CAAA;AACrF,IAAM,YAAA,uBAAmB,GAAA,CAAuB;AAAA,EAC9C,QAAA;AAAA,EAAU,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,KAAA;AAAA,EAAO,MAAA;AAAA,EAAQ,YAAA;AAAA,EAAc;AACjE,CAAC,CAAA;AAED,IAAM,kBAAA,GAA+C;AAAA,EACnD,MAAA,EAAQ,QAAA;AAAA,EAAU,QAAA,EAAU,QAAA;AAAA,EAC5B,KAAA,EAAO,OAAA;AAAA,EAAS,KAAA,EAAO,OAAA;AAAA,EACvB,QAAA,EAAU,UAAA;AAAA,EAAY,IAAA,EAAM,UAAA;AAAA,EAC5B,MAAA,EAAQ,QAAA;AAAA,EAAU,GAAA,EAAK,QAAA;AAAA,EACvB,GAAA,EAAK,KAAA;AAAA,EACL,GAAA,EAAK,KAAA;AAAA,EACL,GAAA,EAAK,KAAA;AAAA,EAAO,WAAA,EAAa;AAC3B,CAAA;AAEA,IAAM,6BAAa,IAAI,GAAA,CAAI,CAAC,IAAA,EAAM,IAAA,EAAM,IAAI,CAAC,CAAA;AAC7C,IAAM,QAAA,GAAW,sBAAA;AAUjB,IAAM,QAAA,GAAW,8DAAA;AAGjB,SAASsE,cAAavE,KAAAA,EAAsB;AAC1C,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,IAAI,KAAA,GAAQ,EAAA;AACZ,EAAA,MAAM,KAAA,GAAgC,EAAE,GAAA,EAAK,GAAA,EAAK,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,MAAA,EAAK,MAAA,EAAK,KAAK,GAAA,EAAI;AACnG,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAIA,KAAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,EAAA,GAAKA,MAAK,CAAC,CAAA;AACjB,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,IAAI,EAAA,KAAO,OAAO,OAAA,GAAU,KAAA;AAC5B,MAAA;AAAA,IACF;AACA,IAAA,IAAI,KAAA,CAAM,EAAE,CAAA,EAAG;AACb,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,KAAA,GAAQ,MAAM,EAAE,CAAA;AAChB,MAAA;AAAA,IACF;AACA,IAAA,IAAI,OAAO,GAAA,EAAK,OAAOA,KAAAA,CAAK,KAAA,CAAM,GAAG,CAAC,CAAA;AACtC,IAAA,IAAI,EAAA,KAAO,GAAA,IAAOA,KAAAA,CAAK,CAAA,GAAI,CAAC,CAAA,KAAM,GAAA,EAAK,OAAOA,KAAAA,CAAK,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AAAA,EAC/D;AACA,EAAA,OAAOA,KAAAA;AACT;AAGA,SAAS,gBAAgBA,KAAAA,EAAwB;AAC/C,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,IAAI,KAAA,GAAQ,EAAA;AACZ,EAAA,MAAM,KAAA,GAAgC,EAAE,GAAA,EAAK,GAAA,EAAK,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,MAAA,EAAK,MAAA,EAAK,KAAK,GAAA,EAAI;AACnG,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAIA,KAAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,EAAA,GAAKA,MAAK,CAAC,CAAA;AACjB,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,IAAI,EAAA,KAAO,OAAO,OAAA,GAAU,KAAA;AAC5B,MAAA,GAAA,IAAO,EAAA;AACP,MAAA;AAAA,IACF;AACA,IAAA,IAAI,KAAA,CAAM,EAAE,CAAA,EAAG;AAAE,MAAA,OAAA,GAAU,IAAA;AAAM,MAAA,KAAA,GAAQ,MAAM,EAAE,CAAA;AAAI,MAAA,GAAA,IAAO,EAAA;AAAI,MAAA;AAAA,IAAU;AAC1E,IAAA,IAAI,OAAO,GAAA,EAAK;AAAE,MAAA,GAAA,CAAI,KAAK,GAAG,CAAA;AAAG,MAAA,GAAA,GAAM,EAAA;AAAI,MAAA;AAAA,IAAU;AACrD,IAAA,GAAA,IAAO,EAAA;AAAA,EACT;AACA,EAAA,GAAA,CAAI,KAAK,GAAG,CAAA;AACZ,EAAA,OAAO,GAAA;AACT;AAEA,SAAS+D,UAAS,GAAA,EAAsB;AACtC,EAAA,MAAM/D,KAAAA,GAAOuE,cAAa,GAAG,CAAA;AAC7B,EAAA,MAAM,UAAoB,EAAC;AAE3B,EAAA,MAAM,MAAA,GAASvE,KAAAA,CAAK,OAAA,CAAQ,QAAA,EAAU,IAAI,CAAA,KAAM;AAC9C,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,KAAM,MAAS,CAAA,IAAK,EAAA;AAC5D,IAAA,OAAA,CAAQ,KAAK,KAAK,CAAA;AAClB,IAAA,OAAO,CAAA,GAAA,EAAM,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA,GAAA,CAAA;AAAA,EACjC,CAAC,CAAA;AAED,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,aAAA,EAAe,MAAM,CAAA;AACnD,EAAA,MAAM,MAAe,EAAC;AACtB,EAAA,KAAA,MAAW,CAAA,IAAK,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA,EAAG;AACnC,IAAA,IAAI,CAAC,CAAA,EAAG;AACR,IAAA,MAAM,EAAA,GAAK,aAAA,CAAc,IAAA,CAAK,CAAC,CAAA;AAC/B,IAAA,IAAI,EAAA,EAAI;AACN,MAAA,GAAA,CAAI,IAAA,CAAK,EAAE,KAAA,EAAO,OAAA,CAAQ,MAAA,CAAO,EAAA,CAAG,CAAC,CAAC,CAAC,CAAA,IAAK,EAAA,EAAI,GAAA,EAAK,MAAM,CAAA;AAAA,IAC7D,CAAA,MAAO;AACL,MAAA,GAAA,CAAI,KAAK,EAAE,KAAA,EAAO,CAAA,EAAG,GAAA,EAAK,OAAO,CAAA;AAAA,IACnC;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AAIA,SAAS,WAAA,CAAY,GAAW,CAAA,EAAmB;AACjD,EAAA,MAAM,CAAA,GAAI,CAAA,CAAE,MAAA,EAAQ,CAAA,GAAI,CAAA,CAAE,MAAA;AAC1B,EAAA,MAAM,CAAA,GAAI,MAAM,IAAA,CAAK,EAAE,QAAQ,CAAA,GAAI,CAAA,IAAK,CAAC,CAAA,EAAG,MAAM,CAAC,CAAA,EAAG,GAAG,KAAA,CAAM,CAAC,EAAE,IAAA,CAAK,CAAC,CAAC,CAAC,CAAA;AAC1E,EAAA,KAAA,IAAS,CAAA,GAAI,GAAG,CAAA,IAAK,CAAA,EAAG,KAAK,CAAA,CAAE,CAAC,CAAA,CAAG,CAAC,CAAA,GAAI,CAAA;AACxC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,CAAA,EAAG,CAAA,EAAA,EAAK;AAC3B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,CAAA,EAAG,CAAA,EAAA,EAAK;AAC3B,MAAA,MAAM,IAAA,GAAO,EAAE,CAAA,GAAI,CAAC,MAAM,CAAA,CAAE,CAAA,GAAI,CAAC,CAAA,GAAI,CAAA,GAAI,CAAA;AACzC,MAAA,CAAA,CAAE,CAAC,CAAA,CAAG,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,CAAA,GAAI,CAAC,CAAA,CAAG,CAAC,CAAA,GAAK,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,CAAG,CAAA,GAAI,CAAC,CAAA,GAAK,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,CAAC,CAAA,CAAG,CAAA,GAAI,CAAC,CAAA,GAAK,IAAI,CAAA;AAAA,IACpF;AAAA,EACF;AACA,EAAA,OAAO,CAAA,CAAE,CAAC,CAAA,CAAG,CAAC,CAAA;AAChB;AAEA,SAAS,YAAY,GAAA,EAAiC;AACpD,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,QAAA,GAAW,QAAA;AACf,EAAA,KAAA,MAAW,CAAA,IAAK,CAAC,GAAG,YAAA,EAAc,GAAG,MAAA,CAAO,IAAA,CAAK,YAAY,CAAC,CAAA,EAAG;AAC/D,IAAA,MAAM,IAAA,GAAO,WAAA,CAAY,GAAA,CAAI,WAAA,IAAe,CAAC,CAAA;AAC7C,IAAA,IAAI,OAAO,QAAA,EAAU;AAAE,MAAA,QAAA,GAAW,IAAA;AAAM,MAAA,IAAA,GAAO,CAAA;AAAA,IAAG;AAAA,EACpD;AACA,EAAA,OAAO,QAAA,IAAY,IAAI,IAAA,GAAO,MAAA;AAChC;AAEA,SAAS,QAAQ,EAAA,EAA2B;AAC1C,EAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,KAAA,CAAM,GAAG,CAAA;AAC1B,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAC/B,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,MAAM,CAAA,GAAI,OAAO,CAAC,CAAA;AAClB,IAAA,IAAI,CAAC,OAAO,SAAA,CAAU,CAAC,KAAK,CAAA,GAAI,CAAA,IAAK,CAAA,GAAI,GAAA,EAAK,OAAO,IAAA;AACrD,IAAA,CAAA,GAAI,IAAI,GAAA,GAAM,CAAA;AAAA,EAChB;AACA,EAAA,OAAO,CAAA,KAAM,CAAA;AACf;AAGA,SAAS,QAAA,CAAS,IAAY,IAAA,EAA8B;AAC1D,EAAA,MAAM,CAAA,GAAI,qCAAA,CAAsC,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA;AAChE,EAAA,IAAI,CAAC,GAAG,OAAO,IAAA;AACf,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,CAAA,CAAE,CAAC,CAAE,CAAA;AAC5B,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,CAAA,CAAE,CAAC,CAAC,CAAA;AAC1B,EAAA,MAAM,UAAU,OAAA,CAAQ,EAAA,CAAG,MAAM,GAAG,CAAA,CAAE,CAAC,CAAE,CAAA;AACzC,EAAA,IAAI,MAAA,KAAW,QAAQ,OAAA,KAAY,IAAA,IAAQ,SAAS,CAAA,IAAK,MAAA,GAAS,IAAI,OAAO,IAAA;AAC7E,EAAA,MAAM,OAAO,MAAA,KAAW,CAAA,GAAI,CAAA,GAAK,UAAA,IAAe,KAAK,MAAA,KAAa,CAAA;AAClE,EAAA,OAAA,CAAQ,MAAA,GAAS,WAAW,OAAA,GAAU,IAAA,CAAA;AACxC;AAEA,IAAM,+BAAe,IAAI,GAAA,CAAgB,CAAC,QAAA,EAAU,UAAA,EAAY,WAAW,CAAC,CAAA;AAIrE,SAAS,aAAaC,KAAAA,EAA0B;AACrD,EAAA,MAAM,GAAA,GAAkB;AAAA,IACtB,IAAA,EAAM,SAAA;AAAA,IACN,MAAA,EAAQ,QAAA;AAAA,IACR,SAAA,EAAW,IAAA;AAAA,IACX,QAAQ,EAAC;AAAA,IACT,QAAQ,EAAC;AAAA,IACT,SAAS,EAAC;AAAA,IACV,OAAO,EAAC;AAAA,IACR,QAAQ,EAAC;AAAA,IACT,UAAU;AAAC,GACb;AAEA,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAA2B;AAClD,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAA0B;AAChD,EAAA,MAAM,aAA6B,EAAC;AACpC,EAAA,IAAI,UAAA,GAAa,KAAA;AAEjB,EAAA,MAAM,QAAA,GAAWA,KAAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAEnC,EAAA,MAAM,SAAA,GAAY,CAAC,CAAA,EAAkB,MAAA,KAAmB;AACtD,IAAA,IAAI,UAAA,CAAW,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,EAAG;AACxB,MAAA,MAAM,IAAI,iBAAA,CAAkB,CAAA,WAAA,EAAc,EAAE,EAAE,CAAA,yBAAA,EAA4B,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,IACrF;AACA,IAAA,UAAA,CAAW,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,CAAC,CAAA;AACtB,IAAA,GAAA,CAAI,OAAA,CAAQ,KAAK,CAAC,CAAA;AAClB,IAAA,MAAM,GAAA,GAAM,UAAA,CAAW,UAAA,CAAW,MAAA,GAAS,CAAC,CAAA;AAC5C,IAAA,IAAI,GAAA,IAAO,CAAC,GAAA,CAAI,OAAA,CAAQ,QAAA,CAAS,CAAA,CAAE,EAAE,CAAA,EAAG,GAAA,CAAI,OAAA,CAAQ,IAAA,CAAK,CAAA,CAAE,EAAE,CAAA;AAAA,EAC/D,CAAA;AAEA,EAAA,MAAM,YAAA,GAAe,CAAC,EAAA,EAAY,IAAA,KAAoC;AACpE,IAAA,IAAI,CAAA,GAAI,UAAA,CAAW,GAAA,CAAI,EAAE,CAAA;AACzB,IAAA,IAAI,CAAC,CAAA,EAAG;AACN,MAAA,CAAA,GAAI,EAAE,EAAA,EAAI,IAAA,EAAM,MAAA,EAAQ,EAAC,EAAE;AAC3B,MAAA,UAAA,CAAW,GAAA,CAAI,IAAI,CAAC,CAAA;AACpB,MAAA,GAAA,CAAI,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IACpB;AACA,IAAA,OAAO,CAAA;AAAA,EACT,CAAA;AAGA,EAAA,MAAM,UAAA,GAAa,CAAC,CAAA,EAAkB,IAAA,EAAe,OAAe,MAAA,KAAmB;AACrF,IAAA,IAAI,CAAA,GAAI,KAAA;AACR,IAAA,OAAO,CAAA,GAAI,KAAK,MAAA,EAAQ;AACtB,MAAA,MAAM,EAAA,GAAK,KAAK,CAAC,CAAA;AACjB,MAAA,IAAI,GAAG,GAAA,EAAK;AAAE,QAAA,CAAA,EAAA;AAAK,QAAA;AAAA,MAAU;AAC7B,MAAA,MAAM,GAAA,GAAM,EAAA,CAAG,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA,GAAI,EAAA,CAAG,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,IAAA;AAC7D,MAAA,IAAI,QAAQ,IAAA,EAAM;AAAE,QAAA,CAAA,EAAA;AAAK,QAAA;AAAA,MAAU;AACnC,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA;AACtB,MAAA,CAAA,IAAK,CAAA;AACL,MAAA,IAAI,CAAC,GAAA,EAAK;AACV,MAAA,QAAQ,GAAA;AAAK,QACX,KAAK,MAAA;AACH,UAAA,IAAI,MAAM,GAAA,CAAI,GAAA,CAAI,KAAmB,CAAA,EAAG,CAAA,CAAE,OAAO,GAAA,CAAI,KAAA;AACrD,UAAA;AAAA,QACF,KAAK,MAAA;AACH,UAAA,IAAI,aAAa,GAAA,CAAI,GAAA,CAAI,KAAmB,CAAA,EAAG,CAAA,CAAE,aAAa,GAAA,CAAI,KAAA;AAClE,UAAA;AAAA,QACF,KAAK,IAAA;AAAM,UAAA,CAAA,CAAE,KAAK,GAAA,CAAI,KAAA;AAAO,UAAA;AAAA,QAC7B,KAAK,OAAA;AAAS,UAAA,CAAA,CAAE,QAAQ,GAAA,CAAI,KAAA;AAAO,UAAA;AAAA,QACnC,KAAK,OAAA,EAAS;AAAE,UAAA,MAAM,CAAA,GAAI,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA;AAAG,UAAA,IAAI,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,IAAK,KAAA,GAAQ,CAAA;AAAG,UAAA;AAAA,QAAO;AAAA,QACzF,KAAK,MAAA;AAAQ,UAAA,CAAA,CAAE,OAAO,GAAA,CAAI,KAAA;AAAO,UAAA;AAAA,QACjC,KAAK,IAAA,EAAM;AACT,UAAA,MAAM,EAAA,GAAK,uCAAA,CAAwC,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA;AACjE,UAAA,IAAI,EAAA,EAAI,CAAA,CAAE,EAAA,GAAK,EAAE,GAAG,MAAA,CAAO,EAAA,CAAG,CAAC,CAAC,GAAG,CAAA,EAAG,MAAA,CAAO,EAAA,CAAG,CAAC,CAAC,CAAA,EAAE;AACpD,UAAA;AAAA,QACF;AAAA,QACA;AACE,UAAA,GAAA,CAAI,QAAA,CAAS,KAAK,CAAA,mBAAA,EAAsB,GAAG,iBAAiB,CAAA,CAAE,EAAE,CAAA,QAAA,EAAW,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA;AACxF,IACF;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,aAAkD,EAAC;AACzD,EAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,GAAA,EAAK,CAAA,KAAM;AAC3B,IAAA,KAAA,MAAW,GAAA,IAAO,eAAA,CAAgBsE,aAAAA,CAAa,GAAG,CAAC,CAAA,EAAG,UAAA,CAAW,IAAA,CAAK,EAAE,IAAA,EAAM,GAAA,EAAK,EAAA,EAAI,CAAA,GAAI,GAAG,CAAA;AAAA,EAChG,CAAC,CAAA;AAED,EAAA,KAAA,MAAW,QAAQ,UAAA,EAAY;AAC7B,IAAA,MAAM,SAAS,IAAA,CAAK,EAAA;AACpB,IAAA,MAAM,IAAA,GAAOR,SAAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AAC/B,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACvB,IAAA,MAAM,EAAA,GAAK,KAAK,CAAC,CAAA;AAGjB,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,IAAI,CAAC,EAAA,CAAG,GAAA,IAAO,wBAAwB,IAAA,CAAK,EAAA,CAAG,KAAK,CAAA,EAAG;AACrD,QAAA,UAAA,GAAa,IAAA;AACb,QAAA,IAAI,IAAA,CAAK,CAAC,CAAA,EAAG,GAAA,MAAS,KAAA,GAAQ,IAAA,CAAK,CAAC,CAAA,CAAG,KAAA;AACvC,QAAA;AAAA,MACF;AACA,MAAA,MAAM,IAAI,iBAAA;AAAA,QACR,iEAAiE,MAAM,CAAA,CAAA;AAAA,OACzE;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,IAAK,EAAA,CAAG,UAAU,GAAA,EAAK;AACzC,MAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,QAAA,MAAM,IAAI,iBAAA,CAAkB,CAAA,oBAAA,EAAuB,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,MAC9D;AACA,MAAA,UAAA,CAAW,GAAA,EAAI;AACf,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,CAAC,EAAA,CAAG,GAAA,IAAO,GAAG,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA,EAAG;AACrC,MAAA,MAAM,MAAM,EAAA,CAAG,KAAA,CAAM,MAAM,CAAA,EAAG,EAAE,EAAE,WAAA,EAAY;AAC9C,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AACzB,MAAA,QAAQ,GAAA;AAAK,QACX,KAAK,QAAA,EAAU;AACb,UAAA,MAAM,CAAA,GAAI,IAAA,CAAK,CAAC,CAAA,EAAG,KAAA;AACnB,UAAA,IAAI,KAAK,YAAA,CAAa,GAAA,CAAI,CAAC,CAAA,MAAO,MAAA,GAAS,CAAA;AAAA,eAAA,IAClC,CAAA,MAAO,QAAA,CAAS,IAAA,CAAK,mBAAmB,CAAC,CAAA,8BAAA,EAA4B,MAAM,CAAA,CAAA,CAAG,CAAA;AACvF,UAAA;AAAA,QACF;AAAA,QACA,KAAK,WAAA,EAAa;AAChB,UAAA,MAAM,CAAA,GAAI,IAAA,CAAK,CAAC,CAAA,EAAG,OAAO,WAAA,EAAY;AACtC,UAAA,IAAI,CAAA,KAAM,IAAA,IAAQ,CAAA,KAAM,IAAA,MAAU,SAAA,GAAY,CAAA;AAC9C,UAAA;AAAA,QACF;AAAA,QACA,KAAK,OAAA;AAAS,UAAA,IAAI,KAAK,CAAC,CAAA,MAAO,KAAA,GAAQ,IAAA,CAAK,CAAC,CAAA,CAAG,KAAA;AAAO,UAAA;AAAA,QACvD,KAAK,QAAA;AAAU,UAAA,GAAA,CAAI,OAAO,IAAA,CAAK,GAAG,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,GAAG,EAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,KAAK,CAAC,CAAA;AAAG,UAAA;AAAA,QACnF,KAAK,QAAA;AAAU,UAAA,GAAA,CAAI,OAAO,IAAA,CAAK,GAAG,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,GAAG,EAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,KAAK,CAAC,CAAA;AAAG,UAAA;AAAA,QACnF,KAAK,QAAA;AAAU,UAAA;AAAA;AAAA,QACf;AAAS,UAAA,GAAA,CAAI,SAAS,IAAA,CAAK,CAAA,mBAAA,EAAsB,GAAG,CAAA,SAAA,EAAY,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA;AAE3E,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,SAAA,CAAU,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,GAAA,IAAO,UAAA,CAAW,GAAA,CAAI,CAAA,CAAE,KAAK,CAAC,CAAA;AAClE,IAAA,IAAI,MAAM,CAAA,EAAG;AACX,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,EAAA,GAAK,CAAC,CAAA;AACzB,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,EAAA,GAAK,CAAC,CAAA;AACvB,MAAA,IAAI,CAAC,KAAA,IAAS,CAAC,OAAO,KAAA,CAAM,GAAA,IAAO,IAAI,GAAA,EAAK;AAC1C,QAAA,MAAM,IAAI,iBAAA,CAAkB,CAAA,qBAAA,EAAwB,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,MAC/D;AACA,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,EAAE,CAAA,CAAG,KAAA;AACvB,MAAA,MAAM,IAAA,GAAoB;AAAA,QACxB,MAAM,KAAA,CAAM,KAAA;AAAA,QACZ,IAAI,GAAA,CAAI,KAAA;AAAA,QACR,UAAU,IAAA,KAAS,IAAA;AAAA,QACnB,QAAA,EAAU,IAAA,KAAS,IAAA,GAAO,KAAA,GAAQ,QAAA;AAAA,QAClC,IAAA,EAAM;AAAA,OACR;AAEA,MAAA,IAAI,KAAK,EAAA,GAAK,CAAA;AACd,MAAA,IAAI,IAAA,CAAK,EAAE,CAAA,IAAK,CAAC,IAAA,CAAK,EAAE,CAAA,CAAG,GAAA,IAAO,IAAA,CAAK,EAAE,CAAA,CAAG,KAAA,KAAU,GAAA,EAAK,EAAA,EAAA;AAC3D,MAAA,OAAO,EAAA,GAAK,KAAK,MAAA,EAAQ;AACvB,QAAA,MAAM,EAAA,GAAK,KAAK,EAAE,CAAA;AAClB,QAAA,IAAI,GAAG,GAAA,EAAK;AAAE,UAAA,IAAA,CAAK,QAAQ,EAAA,CAAG,KAAA;AAAO,UAAA,EAAA,EAAA;AAAM,UAAA;AAAA,QAAU;AACrD,QAAA,MAAM,GAAA,GAAM,EAAA,CAAG,KAAA,CAAM,WAAA,EAAY;AACjC,QAAA,IAAI,kBAAA,CAAmB,GAAG,CAAA,EAAG;AAAE,UAAA,IAAA,CAAK,QAAA,GAAW,mBAAmB,GAAG,CAAA;AAAI,UAAA,EAAA,EAAA;AAAM,UAAA;AAAA,QAAU;AACzF,QAAA,IAAI,GAAA,KAAQ,OAAA,IAAW,GAAA,KAAQ,QAAA,EAAU;AAAE,UAAA,IAAA,CAAK,IAAA,GAAO,GAAA;AAAK,UAAA,EAAA,EAAA;AAAM,UAAA;AAAA,QAAU;AAC5E,QAAA,IAAI,QAAA,CAAS,IAAA,CAAK,EAAA,CAAG,KAAK,CAAA,EAAG;AAAE,UAAA,IAAA,CAAK,QAAQ,EAAA,CAAG,KAAA;AAAO,UAAA,EAAA,EAAA;AAAM,UAAA;AAAA,QAAU;AACtE,QAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,UAAA,MAAM,CAAA,GAAI,IAAA,CAAK,EAAA,GAAK,CAAC,CAAA;AACrB,UAAA,IAAI,CAAA,EAAG;AACL,YAAA,IAAA,CAAK,KAAA,GAAQ,EAAE,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,MAAA,CAAO,EAAE,IAAA,EAAM,CAAC,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,MAAA,CAAO,QAAA,CAAS,CAAC,CAAC,CAAA;AAC7F,YAAA,KAAA,MAAW,GAAA,IAAO,KAAK,KAAA,EAAO;AAC5B,cAAA,IAAI,GAAA,GAAM,CAAA,IAAK,GAAA,GAAM,IAAA,EAAM;AACzB,gBAAA,GAAA,CAAI,SAAS,IAAA,CAAK,CAAA,QAAA,EAAW,GAAG,CAAA,gCAAA,EAA8B,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,cACzE;AAAA,YACF;AAAA,UACF;AACA,UAAA,EAAA,IAAM,CAAA;AAAG,UAAA;AAAA,QACX;AACA,QAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,UAAA,MAAM,CAAA,GAAI,IAAA,CAAK,EAAA,GAAK,CAAC,CAAA;AACrB,UAAA,IAAI,CAAA,EAAG;AAAE,YAAA,MAAM,CAAC,IAAA,EAAM,GAAG,IAAI,CAAA,CAAE,KAAA,CAAM,MAAM,GAAG,CAAA;AAAG,YAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAAM,YAAA,IAAI,GAAA,OAAU,OAAA,GAAU,GAAA;AAAA,UAAK;AACpG,UAAA,EAAA,IAAM,CAAA;AAAG,UAAA;AAAA,QACX;AACA,QAAA,IAAI,QAAQ,KAAA,EAAO;AAAE,UAAA,IAAA,CAAK,EAAA,GAAK,IAAA,CAAK,EAAA,GAAK,CAAC,CAAA,EAAG,KAAA;AAAO,UAAA,EAAA,IAAM,CAAA;AAAG,UAAA;AAAA,QAAU;AACvE,QAAA,EAAA,EAAA;AAAA,MACF;AACA,MAAA,GAAA,CAAI,KAAA,CAAM,KAAK,IAAI,CAAA;AACnB,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,CAAC,EAAA,CAAG,GAAA,IAAO,WAAA,CAAY,IAAI,EAAA,CAAG,KAAK,CAAA,IAAK,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,CAAG,UAAU,GAAA,EAAK;AAChF,MAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,MAAA,IAAI,CAAC,OAAO,GAAA,CAAI,GAAA,QAAW,IAAI,iBAAA,CAAkB,CAAA,wBAAA,EAA2B,MAAM,CAAA,CAAA,CAAG,CAAA;AACrF,MAAA,MAAM,IAAA,GAAQ,gBAAA,CAAiB,EAAA,CAAG,KAAK,KAAK,EAAA,CAAG,KAAA;AAC/C,MAAA,MAAM,KAAA,GAAQ,KAAK,CAAC,CAAA,EAAG,MAAM,IAAA,CAAK,CAAC,EAAG,KAAA,GAAQ,MAAA;AAC9C,MAAA,IAAI,SAAA,CAAU,GAAA,CAAI,GAAA,CAAI,KAAK,CAAA,EAAG;AAC5B,QAAA,MAAM,IAAI,iBAAA,CAAkB,CAAA,UAAA,EAAa,IAAI,KAAK,CAAA,yBAAA,EAA4B,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,MACzF;AACA,MAAA,MAAM,MAAA,GAAS,UAAA,CAAW,UAAA,CAAW,MAAA,GAAS,CAAC,CAAA;AAC/C,MAAA,MAAM,CAAA,GAAkB;AAAA,QACtB,IAAI,GAAA,CAAI,KAAA;AAAA,QAAO,IAAA;AAAA,QAAM,KAAA;AAAA,QAAO,SAAS,EAAC;AAAA,QAAG,UAAU,EAAC;AAAA,QAAG,QAAQ,MAAA,EAAQ,EAAA;AAAA,QAAI,IAAA,EAAM;AAAA,OACnF;AACA,MAAA,IAAI,MAAA,EAAQ,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,EAAE,EAAE,CAAA;AACrC,MAAA,SAAA,CAAU,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,CAAC,CAAA;AACrB,MAAA,GAAA,CAAI,MAAA,CAAO,KAAK,CAAC,CAAA;AACjB,MAAA,UAAA,CAAW,KAAK,CAAC,CAAA;AACjB,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,SAAA,GAAa,YAAA,CAAa,EAAA,CAAG,KAAK,KAAK,EAAA,CAAG,KAAA;AAChD,IAAA,IAAI,CAAC,EAAA,CAAG,GAAA,IAAO,YAAA,CAAa,GAAA,CAAI,SAAS,CAAA,EAAG;AAC1C,MAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,MAAA,IAAI,CAAC,GAAA,IAAO,GAAA,CAAI,GAAA,EAAK,MAAM,IAAI,iBAAA,CAAkB,CAAA,QAAA,EAAW,EAAA,CAAG,KAAK,CAAA,oBAAA,EAAuB,MAAM,CAAA,CAAA,CAAG,CAAA;AACpG,MAAA,IAAI,GAAA,GAAM,CAAA;AACV,MAAA,IAAI,KAAA;AACJ,MAAA,IAAI,IAAA,CAAK,CAAC,CAAA,EAAG,GAAA,EAAK;AAAE,QAAA,KAAA,GAAQ,IAAA,CAAK,CAAC,CAAA,CAAG,KAAA;AAAO,QAAA,GAAA,GAAM,CAAA;AAAA,MAAG;AACrD,MAAA,MAAM,CAAA,GAAmB,EAAE,EAAA,EAAI,GAAA,CAAI,OAAO,IAAA,EAAM,SAAA,EAAW,KAAA,EAAO,MAAA,EAAQ,WAAW,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAA,EAAE;AACtG,MAAA,UAAA,CAAW,CAAA,EAAG,IAAA,EAAM,GAAA,EAAK,MAAM,CAAA;AAC/B,MAAA,SAAA,CAAU,GAAG,MAAM,CAAA;AACnB,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,SAAA,CAAU,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,GAAA,IAAO,CAAA,CAAE,KAAA,KAAU,GAAG,CAAA;AAC3D,IAAA,IAAI,MAAM,CAAA,EAAG;AACX,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA;AAC7B,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,GAAM,CAAC,CAAA;AAC1B,MAAA,IAAI,KAAA,IAAS,CAAC,KAAA,CAAM,GAAA,IAAO,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,GAAG,CAAA,EAAG;AACnD,QAAA,MAAM,CAAA,GAAK,YAAA,CAAa,KAAA,CAAM,KAAK,KAAK,KAAA,CAAM,KAAA;AAC9C,QAAA,IAAI,CAAC,YAAA,CAAa,GAAA,CAAI,CAAC,CAAA,EAAG;AACxB,UAAA,MAAM,IAAA,GAAO,WAAA,CAAY,KAAA,CAAM,KAAK,CAAA;AACpC,UAAA,MAAM,IAAI,iBAAA;AAAA,YACR,CAAA,qBAAA,EAAwB,KAAA,CAAM,KAAK,CAAA,CAAA,EAAI,IAAA,GAAO,yBAAoB,IAAI,CAAA,EAAA,CAAA,GAAO,EAAE,CAAA,OAAA,EAAU,MAAM,CAAA,CAAA;AAAA,WACjG;AAAA,QACF;AACA,QAAA,KAAA,MAAW,OAAO,GAAA,EAAK;AACrB,UAAA,MAAM,CAAA,GAAmB,EAAE,EAAA,EAAI,GAAA,CAAI,OAAO,IAAA,EAAM,CAAA,EAAG,MAAA,EAAQ,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAA,EAAE;AACvF,UAAA,UAAA,CAAW,CAAA,EAAG,IAAA,EAAM,GAAA,GAAM,CAAA,EAAG,MAAM,CAAA;AACnC,UAAA,SAAA,CAAU,GAAG,MAAM,CAAA;AAAA,QACrB;AACA,QAAA;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,IAAK,CAAC,GAAG,GAAA,IAAO,UAAA,CAAW,SAAS,CAAA,EAAG;AACzD,MAAA,MAAM,GAAA,GAAM,UAAA,CAAW,UAAA,CAAW,MAAA,GAAS,CAAC,CAAA;AAC5C,MAAA,IAAI,CAAC,GAAA,CAAI,OAAA,CAAQ,QAAA,CAAS,EAAA,CAAG,KAAK,CAAA,EAAG,GAAA,CAAI,OAAA,CAAQ,IAAA,CAAK,EAAA,CAAG,KAAK,CAAA;AAC9D,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,CAAC,EAAA,CAAG,GAAA,IAAO,IAAA,CAAK,MAAA,IAAU,KAAK,CAAC,IAAA,CAAK,CAAC,CAAA,CAAG,GAAA,EAAK;AAChD,MAAA,MAAM,IAAA,GAAO,WAAA,CAAY,EAAA,CAAG,KAAK,CAAA;AACjC,MAAA,MAAM,IAAI,iBAAA;AAAA,QACR,CAAA,qBAAA,EAAwB,EAAA,CAAG,KAAK,CAAA,CAAA,EAAI,IAAA,GAAO,yBAAoB,IAAI,CAAA,EAAA,CAAA,GAAO,EAAE,CAAA,OAAA,EAAU,MAAM,CAAA,CAAA;AAAA,OAC9F;AAAA,IACF;AACA,IAAA,MAAM,IAAI,kBAAkB,CAAA,kBAAA,EAAqB,MAAM,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,CAAA,CAAA,CAAG,CAAA;AAAA,EAClF;AAEA,EAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,IAAA,MAAM,IAAI,kBAAkB,CAAA,gBAAA,EAAmB,UAAA,CAAW,WAAW,MAAA,GAAS,CAAC,CAAA,CAAG,EAAE,CAAA,CAAA,CAAG,CAAA;AAAA,EACzF;AAGA,EAAA,KAAA,MAAW,EAAA,IAAM,GAAA,CAAI,MAAA,EAAQ,YAAA,CAAa,IAAI,UAAU,CAAA;AACxD,EAAA,KAAA,MAAW,EAAA,IAAM,GAAA,CAAI,MAAA,EAAQ,YAAA,CAAa,IAAI,QAAQ,CAAA;AAGtD,EAAA,KAAA,MAAW,IAAA,IAAQ,IAAI,KAAA,EAAO;AAC5B,IAAA,KAAA,MAAW,OAAO,CAAC,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,EAAE,CAAA,EAAG;AACtC,MAAA,IAAI,CAAC,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA,EAAG;AACxB,QAAA,MAAM,IAAI,iBAAA;AAAA,UACR,CAAA,mCAAA,EAAsC,GAAG,CAAA,QAAA,EAAW,IAAA,CAAK,QAAQ,GAAG,CAAA,CAAA;AAAA,SACtE;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,SAAS,OAAA,EAAS;AACzB,MAAA,MAAM,CAAA,GAAI,UAAA,CAAW,GAAA,CAAI,IAAA,CAAK,IAAI,GAAI,CAAA,GAAI,UAAA,CAAW,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA;AAChE,MAAA,IAAI,CAAC,YAAA,CAAa,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA,IAAK,CAAC,YAAA,CAAa,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA,EAAG;AAC1D,QAAA,GAAA,CAAI,QAAA,CAAS,IAAA,CAAK,CAAA,WAAA,EAAc,IAAA,CAAK,IAAI,CAAA,MAAA,EAAI,IAAA,CAAK,EAAE,CAAA,uCAAA,EAA0C,IAAA,CAAK,IAAA,IAAQ,GAAG,CAAA,CAAA,CAAG,CAAA;AAAA,MACnH;AAAA,IACF;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,MAAA,EAAQ;AAC1B,IAAA,IAAI,CAAA,CAAE,IAAA,KAAS,QAAA,IAAY,CAAC,EAAE,KAAA,EAAO;AACrC,IAAA,KAAA,MAAW,QAAA,IAAY,EAAE,OAAA,EAAS;AAChC,MAAA,MAAM,CAAA,GAAI,UAAA,CAAW,GAAA,CAAI,QAAQ,CAAA;AACjC,MAAA,IAAI,CAAC,GAAG,EAAA,EAAI;AACZ,MAAA,MAAM,MAAA,GAAS,QAAA,CAAS,CAAA,CAAE,EAAA,EAAI,EAAE,KAAK,CAAA;AACrC,MAAA,IAAI,WAAW,KAAA,EAAO;AACpB,QAAA,MAAM,IAAI,iBAAA;AAAA,UACR,CAAA,EAAG,CAAA,CAAE,EAAE,CAAA,IAAA,EAAO,EAAE,EAAE,CAAA,sBAAA,EAAyB,CAAA,CAAE,KAAK,CAAA,OAAA,EAAU,CAAA,CAAE,IAAA,IAAQ,CAAA,CAAE,QAAQ,GAAG,CAAA,CAAA;AAAA,SACrF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,GAAA;AACT;;;ACpeA,IAAM,IAAA,GAAO,aAAA;AACb,IAAM,GAAA,GAAM,eAAA;AACZ,IAAM,GAAA,GAAM,cAAA;AACZ,IAAM,IAAA,GAAO,mBAAA;AACb,IAAM,GAAA,GAAM,iBAAA;AACZ,IAAM,KAAA,GAAQ,mBAAA;AACd,IAAM,GAAA,GAAM,kBAAA;AAIZ,IAAM,KAAK,CAAC,CAAA,KAAc,KAAK,KAAA,CAAM,CAAA,GAAI,GAAG,CAAA,GAAI,GAAA;AAGhD,SAAS,MAAM,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,KAAK,CAAA,EAAW;AAC7E,EAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AACvC,EAAA,MAAM,EAAA,GAAK,GAAA,GAAM,IAAA,CAAK,EAAA,GAAK,GAAA;AAC3B,EAAA,MAAM,EAAA,GAAK,GAAA,GAAM,IAAA,CAAK,EAAA,GAAK,GAAA;AAC3B,EAAA,MAAM,MAAM,EAAA,CAAG,EAAA,GAAK,EAAA,GAAK,IAAA,CAAK,IAAI,EAAE,CAAC,CAAA,EAAG,GAAA,GAAM,GAAG,EAAA,GAAK,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,EAAE,CAAC,CAAA;AACvE,EAAA,MAAM,MAAM,EAAA,CAAG,EAAA,GAAK,EAAA,GAAK,IAAA,CAAK,IAAI,EAAE,CAAC,CAAA,EAAG,GAAA,GAAM,GAAG,EAAA,GAAK,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,EAAE,CAAC,CAAA;AACvE,EAAA,OACE/D,sBAAA,CAAK,EAAE,KAAA,EAAO,IAAA,EAAM,IAAI,EAAA,CAAG,EAAE,GAAG,EAAA,EAAI,EAAA,CAAG,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,EAAE,CAAA,EAAG,IAAI,EAAA,CAAG,EAAE,GAAG,CAAA,GACpEW,0BAAQ,EAAE,KAAA,EAAO,KAAK,MAAA,EAAQ,CAAA,EAAG,GAAG,EAAE,CAAC,IAAI,EAAA,CAAG,EAAE,CAAC,CAAA,CAAA,EAAI,GAAG,IAAI,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,GAAG,IAAI,CAAA;AAErF;AAIA,SAAS,OAAO,CAAA,EAAgB;AAC9B,EAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,GAAG,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,CAAA;AAC3C,EAAA,MAAM,KAAK,CAAA,CAAE,CAAA,GAAI,IAAA,EAAM,EAAA,GAAK,EAAE,CAAA,GAAI,IAAA;AAClC,EAAA,MAAM,IAAI,EAAA,GAAK,EAAA,GAAK,CAAA,EAAG,CAAA,GAAI,KAAK,EAAA,GAAK,CAAA;AACrC,EAAA,MAAM,KAAA,GAAkB;AAAA,IACtBF,sBAAA,CAAK,EAAE,KAAA,EAAO,IAAA,EAAM,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,KAAA,EAAO,GAAG,EAAE,CAAA,EAAG,MAAA,EAAQ,EAAA,CAAG,EAAE,CAAA,EAAG,EAAA,EAAI,EAAA,GAAK,CAAA,EAAG,EAAA,EAAI,EAAA,GAAK,CAAA,EAAG;AAAA,GACjG;AAEA,EAAA,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,EAAA,GAAK,IAAA,EAAM,CAAA,GAAI,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,EAAA,GAAK,IAAI,CAAC,CAAA;AACpE,EAAA,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,EAAA,GAAK,IAAA,EAAM,CAAA,GAAI,CAAA,EAAG,EAAA,GAAK,EAAA,GAAK,IAAI,CAAC,CAAA;AAC/D,EAAA,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,EAAA,GAAK,IAAA,EAAM,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,EAAA,GAAK,IAAA,EAAM,CAAA,GAAI,EAAA,GAAK,CAAC,CAAC,CAAA;AACpE,EAAA,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,EAAA,GAAK,IAAA,EAAM,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,EAAA,GAAK,IAAA,EAAM,CAAA,GAAI,CAAC,CAAC,CAAA;AAC/D,EAAA,OAAOI,uBAAA,CAAM,EAAC,EAAG,KAAK,CAAA;AACxB;AAEA,SAAS,SAAA,CAAU,GAAQ,KAAA,EAAwC;AACjE,EAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,GAAG,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,CAAA;AAC3C,EAAA,MAAM,KAAK,CAAA,CAAE,CAAA,GAAI,IAAA,EAAM,EAAA,GAAK,EAAE,CAAA,GAAI,GAAA;AAClC,EAAA,MAAM,IAAI,EAAA,GAAK,EAAA,GAAK,CAAA,EAAG,CAAA,GAAI,KAAK,EAAA,GAAK,CAAA;AACrC,EAAA,MAAM,KAAA,GAAkB;AAAA,IACtBJ,sBAAA,CAAK,EAAE,KAAA,EAAO,IAAA,EAAM,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,OAAO,EAAA,CAAG,EAAE,CAAA,EAAG,MAAA,EAAQ,EAAA,CAAG,EAAE,GAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG;AAAA,GACvF;AACA,EAAA,IAAI,UAAU,UAAA,EAAY;AAExB,IAAA,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,EAAA,GAAK,MAAM,EAAA,GAAK,EAAA,GAAK,IAAA,EAAM,CAAA,GAAI,EAAA,GAAK,IAAA,EAAM,EAAA,GAAK,EAAA,GAAK,IAAI,CAAC,CAAA;AAC9E,IAAA,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,EAAA,GAAK,MAAM,EAAA,GAAK,EAAA,GAAK,IAAA,EAAM,CAAA,GAAI,EAAA,GAAK,IAAA,EAAM,EAAA,GAAK,EAAA,GAAK,IAAI,CAAC,CAAA;AAC9E,IAAA,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,EAAA,GAAK,MAAM,EAAA,GAAK,EAAA,GAAK,IAAA,EAAM,CAAA,GAAI,EAAA,GAAK,IAAA,EAAM,EAAA,GAAK,EAAA,GAAK,IAAI,CAAC,CAAA;AAAA,EAChF,CAAA,MAAO;AACL,IAAA,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,EAAA,GAAK,KAAK,EAAA,GAAK,EAAA,GAAK,IAAA,EAAM,CAAA,GAAI,EAAA,GAAK,GAAA,EAAK,EAAA,GAAK,EAAA,GAAK,IAAI,CAAC,CAAA;AAC5E,IAAA,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,EAAA,GAAK,KAAK,EAAA,GAAK,EAAA,GAAK,IAAA,EAAM,CAAA,GAAI,EAAA,GAAK,GAAA,EAAK,EAAA,GAAK,EAAA,GAAK,IAAI,CAAC,CAAA;AAAA,EAC9E;AACA,EAAA,OAAOI,uBAAA,CAAM,EAAC,EAAG,KAAK,CAAA;AACxB;AAEA,SAAS,UAAU,CAAA,EAAgB;AACjC,EAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,CAAA;AACvB,EAAA,OAAOA,uBAAA,CAAM,EAAC,EAAG,CAAC,SAAA,CAAU,CAAA,EAAG,UAAU,CAAA,EAAGZ,sBAAA,CAAO,EAAE,KAAA,EAAO,GAAA,EAAK,GAAG,EAAA,CAAG,EAAE,CAAA,EAAG,CAAA,EAAG,EAAA,CAAG,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,IAAA,GAAO,CAAC,CAAA,EAAG,aAAA,EAAe,QAAA,EAAS,EAAG,KAAK,CAAC,CAAC,CAAA;AAC7I;AAEA,SAAS,SAAS,CAAA,EAAgB;AAChC,EAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,GAAG,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,CAAA;AAC3C,EAAA,MAAM,KAAK,CAAA,CAAE,CAAA,GAAI,IAAA,EAAM,EAAA,GAAK,EAAE,CAAA,GAAI,IAAA;AAClC,EAAA,MAAM,IAAI,EAAA,GAAK,EAAA,GAAK,CAAA,EAAG,CAAA,GAAI,KAAK,EAAA,GAAK,CAAA;AACrC,EAAA,MAAM,KAAA,GAAkB,CAACQ,sBAAA,CAAK,EAAE,KAAA,EAAO,IAAA,EAAM,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,KAAA,EAAO,EAAA,CAAG,EAAE,CAAA,EAAG,MAAA,EAAQ,EAAA,CAAG,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,CAAC,CAAA;AAC/G,EAAA,MAAM,IAAA,GAAO,CAAA;AACb,EAAA,MAAM,MAAM,EAAA,GAAK,IAAA;AACjB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,KAAK,KAAA,CAAM,IAAA,CAAKT,sBAAA,CAAK,EAAE,KAAA,EAAO,GAAA,EAAK,EAAA,EAAI,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,EAAI,EAAA,CAAG,CAAA,GAAI,CAAA,GAAI,GAAG,CAAA,EAAG,EAAA,EAAI,GAAG,CAAA,GAAI,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,CAAA,GAAI,CAAA,GAAI,GAAG,CAAA,EAAG,CAAC,CAAA;AAEnI,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,IAAA,MAAM,EAAA,GAAK,IAAI,CAAA,GAAI,GAAA;AACnB,IAAA,MAAM,SAAS,CAAA,GAAI,CAAA,KAAM,CAAA,GAAI,EAAA,GAAK,IAAI,EAAA,GAAK,CAAA;AAC3C,IAAA,KAAA,IAAS,EAAA,GAAK,IAAI,MAAA,EAAQ,EAAA,GAAK,IAAI,EAAA,GAAK,CAAA,EAAG,EAAA,IAAM,EAAA,GAAK,CAAA,EAAG;AACvD,MAAA,KAAA,CAAM,IAAA,CAAKA,uBAAK,EAAE,KAAA,EAAO,KAAK,EAAA,EAAI,EAAA,CAAG,EAAE,CAAA,EAAG,EAAA,EAAI,EAAA,CAAG,EAAE,CAAA,EAAG,EAAA,EAAI,EAAA,CAAG,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA,GAAK,GAAG,CAAA,EAAG,CAAC,CAAA;AAAA,IACvF;AAAA,EACF;AACA,EAAA,OAAOa,uBAAA,CAAM,EAAC,EAAG,KAAK,CAAA;AACxB;AAEA,SAAS,SAAA,CAAU,GAAQ,KAAA,EAAuB;AAEhD,EAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,GAAG,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,CAAA;AAC3C,EAAA,MAAM,KAAK,CAAA,CAAE,CAAA,GAAI,IAAA,EAAM,EAAA,GAAK,EAAE,CAAA,GAAI,GAAA;AAClC,EAAA,MAAM,IAAI,EAAA,GAAK,EAAA,GAAK,CAAA,EAAG,CAAA,GAAI,KAAK,EAAA,GAAK,CAAA;AACrC,EAAA,OAAOA,uBAAA,CAAM,EAAC,EAAG;AAAA,IACfJ,sBAAA,CAAK,EAAE,KAAA,EAAO,IAAA,EAAM,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,OAAO,EAAA,CAAG,EAAE,CAAA,EAAG,MAAA,EAAQ,EAAA,CAAG,EAAE,GAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,CAAA;AAAA,IACrFR,uBAAO,EAAE,KAAA,EAAO,GAAA,EAAK,CAAA,EAAG,GAAG,EAAE,CAAA,EAAG,CAAA,EAAG,EAAA,CAAG,KAAK,CAAC,CAAA,EAAG,aAAA,EAAe,QAAA,IAAY,KAAK;AAAA,GAChF,CAAA;AACH;AAEA,SAAS,YAAY,CAAA,EAAgB;AACnC,EAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,GAAG,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,IAAA;AAC3C,EAAA,MAAM,KAAK,CAAA,CAAE,CAAA,GAAI,GAAA,EAAK,EAAA,GAAK,EAAE,CAAA,GAAI,IAAA;AACjC,EAAA,MAAM,KAAA,GAAkB;AAAA,IACtBQ,sBAAA,CAAK,EAAE,KAAA,EAAO,IAAA,EAAM,CAAA,EAAG,EAAA,CAAG,EAAA,GAAK,EAAA,GAAK,CAAC,CAAA,EAAG,CAAA,EAAG,EAAA,CAAG,KAAK,EAAA,GAAK,CAAC,CAAA,EAAG,KAAA,EAAO,EAAA,CAAG,EAAE,CAAA,EAAG,MAAA,EAAQ,EAAA,CAAG,EAAE,CAAA,EAAG,EAAA,EAAI,EAAA,GAAK,CAAA,EAAG,EAAA,EAAI,EAAA,GAAK,GAAG;AAAA,GACrH;AAEA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,CAAA,EAAG,CAAA,EAAA,EAAK;AAC3B,IAAA,MAAM,EAAA,GAAK,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,IAAA;AACrB,IAAA,KAAA,CAAM,KAAKG,sBAAA,CAAO,EAAE,OAAO,IAAA,EAAM,CAAA,EAAG,KAAK,EAAA,CAAG,EAAA,GAAK,EAAE,CAAC,IAAI,EAAA,CAAG,EAAA,GAAK,KAAK,CAAA,GAAI,CAAC,CAAC,CAAA,GAAA,EAAM,EAAA,CAAG,EAAE,CAAC,IAAI,EAAA,CAAG,EAAE,CAAC,CAAA,OAAA,EAAU,EAAA,CAAG,KAAK,EAAE,CAAC,CAAA,CAAA,EAAI,EAAA,CAAG,KAAK,EAAA,GAAK,CAAA,GAAI,CAAC,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA;AAAA,EACpJ;AACA,EAAA,OAAOC,uBAAA,CAAM,EAAC,EAAG,KAAK,CAAA;AACxB;AAIA,SAAS,OAAO,CAAA,EAAgB;AAC9B,EAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,GAAG,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,CAAA;AAC3C,EAAA,MAAM,KAAK,CAAA,CAAE,CAAA,GAAI,IAAA,EAAM,EAAA,GAAK,EAAE,CAAA,GAAI,IAAA;AAClC,EAAA,MAAM,IAAI,EAAA,GAAK,EAAA,GAAK,CAAA,EAAG,CAAA,GAAI,KAAK,EAAA,GAAK,CAAA;AACrC,EAAA,MAAM,KAAA,GAAkB,CAACJ,sBAAA,CAAK,EAAE,KAAA,EAAO,IAAA,EAAM,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,KAAA,EAAO,EAAA,CAAG,EAAE,CAAA,EAAG,MAAA,EAAQ,EAAA,CAAG,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,CAAC,CAAA;AAC/G,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,IAAK,CAAA,EAAG,CAAA,EAAA,QAAW,IAAA,CAAKT,sBAAA,CAAK,EAAE,KAAA,EAAO,KAAK,EAAA,EAAI,EAAA,CAAG,CAAA,GAAI,CAAC,GAAG,EAAA,EAAI,EAAA,CAAG,CAAA,GAAI,CAAA,IAAK,KAAK,CAAA,CAAE,CAAA,EAAG,EAAA,EAAI,EAAA,CAAG,IAAI,EAAA,GAAK,CAAC,CAAA,EAAG,EAAA,EAAI,GAAG,CAAA,GAAI,CAAA,IAAK,KAAK,CAAA,CAAE,CAAA,EAAG,CAAC,CAAA;AACnJ,EAAA,KAAA,CAAM,KAAKU,wBAAA,CAAO,EAAE,OAAO,GAAA,EAAK,EAAA,EAAI,GAAG,CAAA,GAAI,EAAA,GAAK,CAAC,CAAA,EAAG,EAAA,EAAI,GAAG,CAAA,GAAI,CAAC,GAAG,CAAA,EAAG,GAAA,EAAK,CAAC,CAAA;AAC5E,EAAA,OAAOG,uBAAA,CAAM,EAAC,EAAG,KAAK,CAAA;AACxB;AAEA,SAAS,UAAA,CAAW,GAAQ,CAAA,EAA0B;AACpD,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,MAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,CAAE,IAAI,GAAG,CAAA;AACjC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,CAAA,EAAG,CAAA,EAAA,EAAK;AAC3B,IAAA,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,EAAE,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,GAAI,GAAA,EAAK,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,CAAA,GAAI,MAAM,GAAA,EAAK,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,CAAA,GAAI,GAAA,EAAK,GAAG,CAAA,CAAE,CAAA,GAAI,GAAA,EAAK,CAAC,CAAA;AAAA,EACjG;AACA,EAAA,IAAI,CAAA,CAAE,KAAA,EAAO,KAAA,CAAM,IAAA,CAAKZ,sBAAA,CAAO,EAAE,KAAA,EAAO,GAAA,EAAK,CAAA,EAAG,EAAA,CAAG,CAAA,CAAE,CAAA,GAAI,EAAE,CAAA,GAAI,CAAC,CAAA,EAAG,CAAA,EAAG,EAAA,CAAG,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,IAAI,CAAC,CAAA,EAAG,aAAA,EAAe,KAAA,EAAM,EAAG,CAAA,IAAA,EAAI,CAAA,CAAE,KAAK,EAAE,CAAC,CAAA;AAC/H,EAAA,OAAOY,uBAAA,CAAM,EAAC,EAAG,KAAK,CAAA;AACxB;AAEA,SAAS,GAAG,CAAA,EAAgB;AAC1B,EAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,CAAA;AACvB,EAAA,MAAM,KAAK,CAAA,CAAE,CAAA,GAAI,GAAA,EAAK,EAAA,GAAK,EAAE,CAAA,GAAI,IAAA;AACjC,EAAA,MAAM,EAAA,GAAK,KAAK,EAAA,GAAK,CAAA,EAAG,KAAK,CAAA,CAAE,CAAA,GAAI,EAAE,CAAA,GAAI,IAAA;AACzC,EAAA,OAAOA,uBAAA,CAAM,EAAC,EAAG;AAAA,IACfJ,sBAAA,CAAK,EAAE,KAAA,EAAO,IAAA,EAAM,CAAA,EAAG,GAAG,EAAE,CAAA,EAAG,CAAA,EAAG,EAAA,CAAG,EAAE,CAAA,EAAG,OAAO,EAAA,CAAG,EAAE,CAAA,EAAG,MAAA,EAAQ,EAAA,CAAG,EAAE,GAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,CAAA;AAAA,IACvFA,sBAAA,CAAK,EAAE,KAAA,EAAO,GAAA,EAAK,CAAA,EAAG,EAAA,CAAG,EAAA,GAAK,CAAC,CAAA,EAAG,CAAA,EAAG,EAAA,CAAG,EAAA,GAAK,CAAC,CAAA,EAAG,KAAA,EAAO,EAAA,CAAG,EAAA,GAAK,CAAC,CAAA,EAAG,MAAA,EAAQ,EAAA,CAAG,EAAA,GAAK,CAAC,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,IAAA,EAAM,QAAQ,CAAA;AAAA,IACpHT,sBAAA,CAAK,EAAE,KAAA,EAAO,GAAA,EAAK,EAAA,EAAI,GAAG,EAAE,CAAA,EAAG,EAAA,EAAI,EAAA,CAAG,EAAA,GAAK,EAAE,GAAG,EAAA,EAAI,EAAA,CAAG,EAAE,CAAA,EAAG,EAAA,EAAI,EAAA,CAAG,EAAA,GAAK,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,IAAI,CAAA,EAAG,CAAA;AAAA,IAC1FA,sBAAA,CAAK,EAAE,KAAA,EAAO,GAAA,EAAK,IAAI,EAAA,CAAG,EAAA,GAAK,EAAA,GAAK,IAAI,CAAA,EAAG,EAAA,EAAI,EAAA,CAAG,CAAA,CAAE,IAAI,CAAA,CAAE,CAAA,GAAI,CAAC,CAAA,EAAG,EAAA,EAAI,EAAA,CAAG,EAAA,GAAK,EAAA,GAAK,IAAI,CAAA,EAAG,EAAA,EAAI,EAAA,CAAG,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,CAAC,GAAG;AAAA,GAClH,CAAA;AACH;AAEA,SAAS,OAAO,CAAA,EAAgB;AAC9B,EAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,CAAA;AACvB,EAAA,MAAM,KAAK,CAAA,CAAE,CAAA,GAAI,GAAA,EAAK,EAAA,GAAK,EAAE,CAAA,GAAI,IAAA;AACjC,EAAA,MAAM,EAAA,GAAK,KAAK,EAAA,GAAK,CAAA,EAAG,KAAK,CAAA,CAAE,CAAA,GAAI,EAAE,CAAA,GAAI,IAAA;AACzC,EAAA,OAAOa,uBAAA,CAAM,EAAC,EAAG;AAAA,IACfJ,sBAAA,CAAK,EAAE,KAAA,EAAO,IAAA,EAAM,CAAA,EAAG,GAAG,EAAE,CAAA,EAAG,CAAA,EAAG,EAAA,CAAG,EAAE,CAAA,EAAG,OAAO,EAAA,CAAG,EAAE,CAAA,EAAG,MAAA,EAAQ,EAAA,CAAG,EAAE,GAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,CAAA;AAAA,IACvFE,yBAAA,CAAQ,EAAE,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,GAAG,EAAA,CAAG,EAAA,GAAK,EAAA,GAAK,IAAI,CAAC,CAAA,CAAA,EAAI,GAAG,EAAA,GAAK,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,IAAI,CAAC,CAAA,CAAA,EAAI,EAAA,CAAG,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,IAAI,CAAC,CAAA,CAAA,EAAI,GAAG,EAAA,GAAK,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,IAAI,CAAC,IAAI,EAAA,CAAG,EAAA,GAAK,EAAE,CAAC,CAAA,CAAA,EAAI,EAAA,CAAG,KAAK,EAAE,CAAC,CAAA,CAAA,EAAI,EAAA,CAAG,EAAE,CAAC,CAAA,CAAA,EAAI,EAAA,CAAG,EAAA,GAAK,EAAE,CAAC,CAAA,CAAA,EAAI;AAAA,GACnM,CAAA;AACH;AAEA,SAAS,OAAO,CAAA,EAAgB;AAC9B,EAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,GAAG,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,CAAA;AAC3C,EAAA,MAAM,KAAK,CAAA,CAAE,CAAA,GAAI,IAAA,EAAM,EAAA,GAAK,EAAE,CAAA,GAAI,IAAA;AAClC,EAAA,OAAOE,uBAAA,CAAM,EAAC,EAAG;AAAA,IACfJ,sBAAA,CAAK,EAAE,KAAA,EAAO,IAAA,EAAM,CAAA,EAAG,EAAA,CAAG,EAAA,GAAK,EAAA,GAAK,CAAC,CAAA,EAAG,CAAA,EAAG,EAAA,CAAG,EAAA,GAAK,EAAA,GAAK,CAAC,CAAA,EAAG,KAAA,EAAO,EAAA,CAAG,EAAE,CAAA,EAAG,MAAA,EAAQ,EAAA,CAAG,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,CAAA;AAAA,IACzGT,sBAAA,CAAK,EAAE,KAAA,EAAO,GAAA,EAAK,EAAA,EAAI,EAAA,CAAG,EAAA,GAAK,EAAA,GAAK,GAAG,CAAA,EAAG,EAAA,EAAI,EAAA,CAAG,KAAK,EAAA,GAAK,CAAA,GAAI,CAAC,CAAA,EAAG,EAAA,EAAI,EAAA,CAAG,EAAA,GAAK,EAAA,GAAK,GAAG,CAAA,EAAG,EAAA,EAAI,EAAA,CAAG,EAAA,GAAK,EAAA,GAAK,CAAA,GAAI,CAAC,GAAG;AAAA,GACpH,CAAA;AACH;AAEA,SAAS,QAAQ,CAAA,EAAgB;AAC/B,EAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,GAAG,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,CAAA;AAC3C,EAAA,MAAM,KAAK,CAAA,CAAE,CAAA,GAAI,GAAA,EAAK,EAAA,GAAK,EAAE,CAAA,GAAI,GAAA;AACjC,EAAA,MAAM,IAAI,EAAA,GAAK,EAAA,GAAK,CAAA,EAAG,CAAA,GAAI,KAAK,EAAA,GAAK,CAAA;AACrC,EAAA,OAAOa,uBAAA,CAAM,EAAC,EAAG;AAAA,IACfJ,sBAAA,CAAK,EAAE,KAAA,EAAO,IAAA,EAAM,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,OAAO,EAAA,CAAG,EAAE,CAAA,EAAG,MAAA,EAAQ,EAAA,CAAG,EAAA,GAAK,GAAG,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,CAAA;AAAA,IAC3FG,sBAAA,CAAO,EAAE,KAAA,EAAO,IAAA,EAAM,GAAG,CAAA,EAAA,EAAK,EAAA,CAAG,CAAA,GAAI,EAAA,GAAK,GAAG,CAAC,CAAA,CAAA,EAAI,EAAA,CAAG,IAAI,CAAC,CAAC,CAAA,GAAA,EAAM,EAAA,CAAG,EAAA,GAAK,GAAG,CAAC,CAAA,CAAA,EAAI,GAAG,EAAA,GAAK,GAAG,CAAC,CAAA,CAAA,EAAI,EAAA,CAAG,EAAA,GAAK,GAAG,CAAC,MAAM;AAAA,GACpH,CAAA;AACH;AAEA,SAAS,QAAQ,CAAA,EAAgB;AAC/B,EAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,GAAG,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,CAAA;AAC3C,EAAA,MAAM,KAAK,CAAA,CAAE,CAAA,GAAI,GAAA,EAAK,EAAA,GAAK,EAAE,CAAA,GAAI,IAAA;AACjC,EAAA,MAAM,IAAI,EAAA,GAAK,EAAA,GAAK,CAAA,EAAG,CAAA,GAAI,KAAK,EAAA,GAAK,GAAA;AACrC,EAAA,OAAOC,uBAAA,CAAM,EAAC,EAAG;AAAA,IACfJ,sBAAA,CAAK,EAAE,KAAA,EAAO,GAAA,EAAK,CAAA,EAAG,EAAA,CAAG,CAAA,GAAI,EAAA,GAAK,IAAI,CAAA,EAAG,CAAA,EAAG,EAAA,CAAG,CAAA,GAAI,EAAA,GAAK,GAAG,CAAA,EAAG,KAAA,EAAO,EAAA,CAAG,EAAA,GAAK,IAAI,CAAA,EAAG,MAAA,EAAQ,EAAA,CAAG,EAAA,GAAK,GAAG,CAAA,EAAG,IAAA,EAAM,MAAA,EAAQ,CAAA;AAAA,IACxHA,sBAAA,CAAK,EAAE,KAAA,EAAO,IAAA,EAAM,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,OAAO,EAAA,CAAG,EAAE,CAAA,EAAG,MAAA,EAAQ,EAAA,CAAG,EAAE,GAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,CAAA;AAAA,IACrFA,sBAAA,CAAK,EAAE,KAAA,EAAO,GAAA,EAAK,CAAA,EAAG,EAAA,CAAG,CAAA,GAAI,EAAA,GAAK,IAAI,CAAA,EAAG,CAAA,EAAG,EAAA,CAAG,CAAA,GAAI,EAAA,GAAK,CAAC,CAAA,EAAG,KAAA,EAAO,EAAA,CAAG,EAAA,GAAK,IAAI,CAAA,EAAG,MAAA,EAAQ,EAAA,CAAG,EAAA,GAAK,GAAG,CAAA,EAAG,IAAA,EAAM,MAAA,EAAQ,CAAA;AAAA,IACtHC,yBAAO,EAAE,KAAA,EAAO,KAAK,EAAA,EAAI,EAAA,CAAG,IAAI,EAAA,GAAK,CAAC,CAAA,EAAG,EAAA,EAAI,GAAG,CAAA,GAAI,EAAA,GAAK,CAAC,CAAA,EAAG,CAAA,EAAG,KAAK;AAAA,GACtE,CAAA;AACH;AAEA,SAAS,QAAQ,CAAA,EAAgB;AAC/B,EAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,GAAG,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,CAAA;AAC3C,EAAA,MAAM,KAAK,CAAA,CAAE,CAAA,GAAI,GAAA,EAAK,EAAA,GAAK,EAAE,CAAA,GAAI,IAAA;AACjC,EAAA,MAAM,IAAI,EAAA,GAAK,EAAA,GAAK,CAAA,EAAG,CAAA,GAAI,KAAK,EAAA,GAAK,CAAA;AACrC,EAAA,MAAM,KAAK,EAAA,GAAK,IAAA;AAChB,EAAA,MAAM,KAAA,GAAkB;AAAA,IACtBE,sBAAA,CAAO,EAAE,KAAA,EAAO,IAAA,EAAM,CAAA,EAAG,CAAA,EAAA,EAAK,EAAA,CAAG,CAAC,CAAC,CAAA,CAAA,EAAI,EAAA,CAAG,CAAA,GAAI,EAAE,CAAC,CAAA,GAAA,EAAM,EAAA,CAAG,EAAA,GAAK,CAAC,CAAC,CAAA,CAAA,EAAI,EAAA,CAAG,EAAE,CAAC,CAAA,OAAA,EAAU,EAAA,CAAG,CAAA,GAAI,EAAE,CAAC,CAAA,CAAA,EAAI,GAAG,CAAA,GAAI,EAAE,CAAC,CAAA,GAAA,EAAM,EAAA,CAAG,CAAA,GAAI,EAAE,CAAC,CAAA,CAAA,EAAI,EAAA,CAAG,CAAA,GAAI,EAAA,GAAK,EAAE,CAAC,CAAA,GAAA,EAAM,EAAA,CAAG,KAAK,CAAC,CAAC,CAAA,CAAA,EAAI,EAAA,CAAG,EAAE,CAAC,CAAA,OAAA,EAAU,EAAA,CAAG,CAAC,CAAC,CAAA,CAAA,EAAI,EAAA,CAAG,CAAA,GAAI,EAAA,GAAK,EAAE,CAAC,MAAM,CAAA;AAAA,IAClNA,uBAAO,EAAE,KAAA,EAAO,GAAA,EAAK,IAAA,EAAM,QAAQ,CAAA,EAAG,CAAA,EAAA,EAAK,EAAA,CAAG,CAAC,CAAC,CAAA,CAAA,EAAI,EAAA,CAAG,CAAA,GAAI,EAAE,CAAC,CAAA,GAAA,EAAM,EAAA,CAAG,EAAA,GAAK,CAAC,CAAC,CAAA,CAAA,EAAI,EAAA,CAAG,EAAE,CAAC,UAAU,EAAA,CAAG,CAAA,GAAI,EAAE,CAAC,IAAI,EAAA,CAAG,CAAA,GAAI,EAAE,CAAC,IAAI;AAAA,GAChI;AACA,EAAA,OAAOC,uBAAA,CAAM,EAAC,EAAG,KAAK,CAAA;AACxB;AAIA,SAAS,MAAA,CAAO,GAAQ,CAAA,EAA0B;AAChD,EAAA,MAAM,CAAA,GAAI,EAAE,UAAA,IAAc,OAAA;AAC1B,EAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,GAAG,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,CAAA;AAC3C,EAAA,IAAI,CAAA,KAAM,MAAA,IAAU,CAAA,KAAM,KAAA,EAAO;AAC/B,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,IAAK,CAAA,KAAM,QAAQ,IAAA,GAAO,IAAA,CAAA;AACvC,IAAA,MAAM,KAAA,GAAQ;AAAA,MACZD,uBAAO,EAAE,KAAA,EAAO,IAAA,EAAM,CAAA,EAAG,KAAK,EAAA,CAAG,EAAA,GAAK,EAAE,CAAC,IAAI,EAAA,CAAG,EAAA,GAAK,EAAA,GAAK,GAAG,CAAC,CAAA,GAAA,EAAM,EAAA,CAAG,EAAE,CAAC,IAAI,EAAA,CAAG,EAAE,CAAC,CAAA,OAAA,EAAU,GAAG,EAAA,GAAK,EAAE,CAAC,CAAA,CAAA,EAAI,GAAG,EAAA,GAAK,EAAA,GAAK,GAAG,CAAC,MAAM,CAAA;AAAA,MACpIH,sBAAA,CAAK,EAAE,KAAA,EAAO,IAAA,EAAM,CAAA,EAAG,EAAA,CAAG,EAAA,GAAK,EAAA,GAAK,IAAI,CAAA,EAAG,CAAA,EAAG,EAAA,CAAG,KAAK,EAAA,GAAK,GAAG,CAAA,EAAG,KAAA,EAAO,EAAA,CAAG,EAAA,GAAK,GAAG,CAAA,EAAG,QAAQ,EAAA,CAAG,CAAA,CAAE,CAAA,GAAI,IAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,GAAG,CAAA;AAAA,MAC5HC,yBAAO,EAAE,KAAA,EAAO,KAAK,EAAA,EAAI,EAAA,CAAG,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA,GAAK,EAAA,GAAK,IAAI,CAAA,EAAG,CAAA,EAAG,GAAG,EAAA,GAAK,GAAG,GAAG;AAAA,KAC5E;AACA,IAAA,OAAOG,uBAAA,CAAM,EAAC,EAAG,KAAK,CAAA;AAAA,EACxB;AACA,EAAA,IAAI,MAAM,QAAA,EAAU;AAClB,IAAA,MAAM2D,MAAK,CAAA,CAAE,CAAA,GAAI,GAAA,EAAKC,GAAAA,GAAK,EAAE,CAAA,GAAI,IAAA;AACjC,IAAA,MAAMnD,KAAI,EAAA,GAAKkD,GAAAA,GAAK,CAAA,EAAGE,EAAAA,GAAI,KAAKD,GAAAA,GAAK,CAAA;AACrC,IAAA,OAAO5D,uBAAA,CAAM,EAAC,EAAG;AAAA,MACfJ,sBAAA,CAAK,EAAE,KAAA,EAAO,IAAA,EAAM,CAAA,EAAG,EAAA,CAAGa,EAAC,CAAA,EAAG,CAAA,EAAG,EAAA,CAAGoD,EAAC,CAAA,EAAG,KAAA,EAAO,GAAGF,GAAE,CAAA,EAAG,MAAA,EAAQ,EAAA,CAAGC,GAAE,CAAA,EAAG,EAAA,EAAIA,GAAAA,GAAK,CAAA,EAAG,EAAA,EAAIA,GAAAA,GAAK,CAAA,EAAG,CAAA;AAAA,MAC/F/D,yBAAO,EAAE,KAAA,EAAO,KAAK,EAAA,EAAI,EAAA,CAAGY,KAAIkD,GAAAA,GAAK,CAAC,GAAG,EAAA,EAAI,EAAA,CAAG,EAAE,CAAA,EAAG,CAAA,EAAG,GAAGC,GAAAA,GAAK,IAAI,GAAG,CAAA;AAAA,MACvEzE,sBAAA,CAAK,EAAE,KAAA,EAAO,GAAA,EAAK,EAAA,EAAI,GAAG,EAAE,CAAA,EAAG,EAAA,EAAI,EAAA,CAAG0E,EAAAA,GAAID,GAAE,GAAG,EAAA,EAAI,EAAA,CAAG,EAAE,CAAA,EAAG,EAAA,EAAI,EAAA,CAAGC,EAAAA,GAAID,GAAAA,GAAK,CAAA,CAAE,CAAA,GAAI,IAAI,CAAA,EAAG;AAAA,KACzF,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,KAAK,CAAA,CAAE,CAAA,GAAI,GAAA,EAAK,EAAA,GAAK,EAAE,CAAA,GAAI,IAAA;AACjC,EAAA,MAAM,IAAI,EAAA,GAAK,EAAA,GAAK,CAAA,EAAG,CAAA,GAAI,KAAK,EAAA,GAAK,CAAA;AACrC,EAAA,OAAO5D,uBAAA,CAAM,EAAC,EAAG;AAAA,IACfJ,sBAAA,CAAK,EAAE,KAAA,EAAO,IAAA,EAAM,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,OAAO,EAAA,CAAG,EAAE,CAAA,EAAG,MAAA,EAAQ,EAAA,CAAG,EAAE,GAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,CAAA;AAAA,IACrFC,yBAAO,EAAE,KAAA,EAAO,GAAA,EAAK,EAAA,EAAI,GAAG,EAAE,CAAA,EAAG,EAAA,EAAI,EAAA,CAAG,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,EAAA,GAAK,GAAG,GAAG;AAAA,GAC/D,CAAA;AACH;AAEA,SAAS,QAAA,CAAS,GAAQ,KAAA,EAAuB;AAC/C,EAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,GAAG,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,CAAA;AAC3C,EAAA,MAAM,KAAK,CAAA,CAAE,CAAA,GAAI,IAAA,EAAM,EAAA,GAAK,EAAE,CAAA,GAAI,IAAA;AAClC,EAAA,MAAM,IAAI,EAAA,GAAK,EAAA,GAAK,CAAA,EAAG,CAAA,GAAI,KAAK,EAAA,GAAK,CAAA;AACrC,EAAA,OAAOG,uBAAA,CAAM,EAAC,EAAG;AAAA,IACfJ,sBAAA,CAAK,EAAE,KAAA,EAAO,IAAA,EAAM,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,OAAO,EAAA,CAAG,EAAE,CAAA,EAAG,MAAA,EAAQ,EAAA,CAAG,EAAE,GAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,CAAA;AAAA,IACrFC,yBAAO,EAAE,KAAA,EAAO,KAAK,EAAA,EAAI,EAAA,CAAG,IAAI,EAAA,GAAK,IAAI,CAAA,EAAG,EAAA,EAAI,GAAG,CAAA,GAAI,EAAA,GAAK,IAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA;AAAA,IACzEA,yBAAO,EAAE,KAAA,EAAO,KAAK,EAAA,EAAI,EAAA,CAAG,IAAI,EAAA,GAAK,GAAG,CAAA,EAAG,EAAA,EAAI,GAAG,CAAA,GAAI,EAAA,GAAK,IAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA;AAAA,IACxET,uBAAO,EAAE,KAAA,EAAO,GAAA,EAAK,CAAA,EAAG,GAAG,EAAE,CAAA,EAAG,CAAA,EAAG,EAAA,CAAG,IAAI,EAAA,GAAK,IAAI,GAAG,aAAA,EAAe,QAAA,IAAY,KAAK;AAAA,GACvF,CAAA;AACH;AAEA,SAAS,OAAA,CAAQ,GAAQ,IAAA,EAAuB;AAC9C,EAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,CAAA;AACvB,EAAA,MAAM,KAAK,CAAA,CAAE,CAAA,GAAI,IAAA,EAAM,EAAA,GAAK,EAAE,CAAA,GAAI,IAAA;AAClC,EAAA,MAAM,EAAA,GAAK,KAAK,EAAA,GAAK,CAAA,EAAG,KAAK,CAAA,CAAE,CAAA,GAAI,EAAE,CAAA,GAAI,GAAA;AACzC,EAAA,MAAM,KAAA,GAAkB,CAACQ,sBAAA,CAAK,EAAE,KAAA,EAAO,IAAA,EAAM,CAAA,EAAG,EAAA,CAAG,EAAE,CAAA,EAAG,CAAA,EAAG,EAAA,CAAG,EAAE,CAAA,EAAG,KAAA,EAAO,EAAA,CAAG,EAAE,CAAA,EAAG,MAAA,EAAQ,EAAA,CAAG,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,CAAC,CAAA;AACjH,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,KAAA,CAAM,IAAA,CAAKT,uBAAK,EAAE,KAAA,EAAO,KAAK,EAAA,EAAI,EAAA,CAAG,EAAE,CAAA,EAAG,EAAA,EAAI,EAAA,CAAG,EAAE,CAAA,EAAG,EAAA,EAAI,EAAA,CAAG,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA,GAAK,EAAE,CAAA,EAAG,CAAC,CAAA;AACpF,IAAA,KAAA,CAAM,IAAA,CAAKA,sBAAA,CAAK,EAAE,KAAA,EAAO,GAAA,EAAK,EAAA,EAAI,EAAA,CAAG,EAAE,CAAA,EAAG,EAAA,EAAI,EAAA,CAAG,EAAA,GAAK,EAAA,GAAK,CAAC,CAAA,EAAG,EAAA,EAAI,EAAA,CAAG,EAAA,GAAK,EAAE,CAAA,EAAG,EAAA,EAAI,EAAA,CAAG,EAAA,GAAK,EAAA,GAAK,CAAC,CAAA,EAAG,CAAC,CAAA;AAAA,EACxG;AACA,EAAA,KAAA,CAAM,IAAA,CAAKA,sBAAA,CAAK,EAAE,KAAA,EAAO,GAAA,EAAK,EAAA,EAAI,EAAA,CAAG,EAAE,CAAA,EAAG,EAAA,EAAI,EAAA,CAAG,EAAA,GAAK,EAAE,CAAA,EAAG,EAAA,EAAI,EAAA,CAAG,EAAE,CAAA,EAAG,EAAA,EAAI,EAAA,CAAG,EAAA,GAAK,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,IAAI,CAAA,EAAG,CAAC,CAAA;AACtG,EAAA,KAAA,CAAM,IAAA,CAAKA,sBAAA,CAAK,EAAE,KAAA,EAAO,KAAK,EAAA,EAAI,EAAA,CAAG,EAAA,GAAK,EAAA,GAAK,GAAG,CAAA,EAAG,EAAA,EAAI,EAAA,CAAG,CAAA,CAAE,IAAI,CAAA,CAAE,CAAA,GAAI,CAAC,CAAA,EAAG,EAAA,EAAI,EAAA,CAAG,EAAA,GAAK,EAAA,GAAK,GAAG,CAAA,EAAG,EAAA,EAAI,EAAA,CAAG,CAAA,CAAE,IAAI,CAAA,CAAE,CAAA,GAAI,CAAC,CAAA,EAAG,CAAC,CAAA;AAC3H,EAAA,OAAOa,uBAAA,CAAM,EAAC,EAAG,KAAK,CAAA;AACxB;AAIA,SAAS,KAAA,CAAM,GAAQ,KAAA,EAAuB;AAG5C,EAAA,MAAM,EAAA,GAAK,CAAC,EAAA,KAAe,EAAA,CAAG,EAAE,CAAA,GAAK,EAAA,GAAK,GAAA,GAAO,CAAA,CAAE,CAAC,CAAA;AACpD,EAAA,MAAM,EAAA,GAAK,CAAC,EAAA,KAAe,EAAA,CAAG,EAAE,CAAA,GAAK,EAAA,GAAK,GAAA,GAAO,CAAA,CAAE,CAAC,CAAA;AACpD,EAAA,MAAM,CAAA,GACJ,KAAK,EAAA,CAAG,EAAE,CAAC,CAAA,CAAA,EAAI,EAAA,CAAG,EAAE,CAAC,CAAA,GAAA,EAChB,EAAA,CAAG,EAAE,CAAC,CAAA,CAAA,EAAI,EAAA,CAAG,EAAE,CAAC,CAAA,CAAA,EAAI,GAAG,EAAE,CAAC,CAAA,CAAA,EAAI,EAAA,CAAG,EAAE,CAAC,IAAI,EAAA,CAAG,EAAE,CAAC,CAAA,CAAA,EAAI,EAAA,CAAG,EAAE,CAAC,CAAA,GAAA,EACxD,EAAA,CAAG,EAAE,CAAC,CAAA,CAAA,EAAI,GAAG,EAAE,CAAC,CAAA,CAAA,EAAI,EAAA,CAAG,EAAE,CAAC,IAAI,EAAA,CAAG,EAAE,CAAC,CAAA,CAAA,EAAI,EAAA,CAAG,GAAG,CAAC,CAAA,CAAA,EAAI,EAAA,CAAG,EAAE,CAAC,CAAA,GAAA,EACzD,GAAG,GAAG,CAAC,CAAA,CAAA,EAAI,EAAA,CAAG,EAAE,CAAC,IAAI,EAAA,CAAG,GAAG,CAAC,CAAA,CAAA,EAAI,EAAA,CAAG,EAAE,CAAC,CAAA,CAAA,EAAI,EAAA,CAAG,GAAG,CAAC,CAAA,CAAA,EAAI,EAAA,CAAG,EAAE,CAAC,CAAA,GAAA,EAC3D,GAAG,GAAG,CAAC,IAAI,EAAA,CAAG,EAAE,CAAC,CAAA,CAAA,EAAI,EAAA,CAAG,GAAG,CAAC,CAAA,CAAA,EAAI,EAAA,CAAG,EAAE,CAAC,CAAA,CAAA,EAAI,EAAA,CAAG,GAAG,CAAC,CAAA,CAAA,EAAI,EAAA,CAAG,EAAE,CAAC,CAAA,EAAA,CAAA;AAElE,EAAA,OAAOA,uBAAA,CAAM,EAAC,EAAG;AAAA,IACfD,sBAAA,CAAO,EAAE,KAAA,EAAO,KAAA,EAAO,GAAG,CAAA;AAAA,IAC1BX,uBAAO,EAAE,KAAA,EAAO,KAAK,CAAA,EAAG,EAAA,CAAG,EAAE,CAAA,GAAI,CAAA,CAAE,IAAI,CAAC,CAAA,EAAG,GAAG,EAAA,CAAG,EAAE,GAAG,aAAA,EAAe,QAAA,IAAY,KAAK;AAAA,GACvF,CAAA;AACH;AAEA,SAAS,OAAO,CAAA,EAAgB;AAC9B,EAAA,MAAM,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,CAAA;AACtB,EAAA,OAAOD,sBAAA,CAAK,EAAE,KAAA,EAAO,YAAA,EAAc,EAAA,EAAI,GAAG,CAAA,CAAE,CAAC,CAAA,EAAG,EAAA,EAAI,EAAA,CAAG,CAAC,GAAG,EAAA,EAAI,EAAA,CAAG,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAC,GAAG,EAAA,EAAI,EAAA,CAAG,CAAC,CAAA,EAAG,CAAA;AAC3F;AAKO,SAAS,SAAS,IAAA,EAA4C;AACnE,EAAA,IAAI,IAAA,KAAS,UAAA,IAAc,IAAA,KAAS,KAAA,IAAS,IAAA,KAAS,OAAA,IAAW,IAAA,KAAS,MAAA,EAAQ,OAAO,EAAE,CAAA,EAAG,GAAA,EAAK,GAAG,EAAA,EAAG;AACzG,EAAA,IAAI,SAAS,KAAA,EAAO,OAAO,EAAE,CAAA,EAAG,GAAA,EAAK,GAAG,EAAA,EAAG;AAC3C,EAAA,IAAI,SAAS,YAAA,EAAc,OAAO,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA,EAAG;AACjD,EAAA,OAAO,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAG;AACxB;AAEO,SAAS,cAAA,CAAe,GAAkB,CAAA,EAAgB;AAC/D,EAAA,QAAQ,EAAE,IAAA;AAAM,IACd,KAAK,QAAA;AAAU,MAAA,OAAO,OAAO,CAAC,CAAA;AAAA,IAC9B,KAAK,SAAA;AAAW,MAAA,OAAOa,uBAAA,CAAM,EAAC,EAAG,CAAC,OAAO,CAAC,CAAA,EAAGZ,sBAAA,CAAO,EAAE,KAAA,EAAO,GAAA,EAAK,CAAA,EAAG,EAAA,CAAG,EAAE,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,CAAC,CAAA,EAAG,CAAA,EAAG,EAAA,CAAG,CAAA,CAAE,IAAI,CAAA,CAAE,CAAA,GAAI,CAAC,CAAA,EAAG,aAAA,EAAe,QAAA,EAAS,EAAG,IAAI,CAAC,CAAC,CAAA;AAAA,IAC/I,KAAK,OAAA;AAAS,MAAA,OAAOY,uBAAA,CAAM,EAAC,EAAG,CAAC,OAAO,CAAC,CAAA,EAAGZ,sBAAA,CAAO,EAAE,KAAA,EAAO,GAAA,EAAK,CAAA,EAAG,EAAA,CAAG,EAAE,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,CAAC,CAAA,EAAG,CAAA,EAAG,EAAA,CAAG,CAAA,CAAE,IAAI,CAAA,CAAE,CAAA,GAAI,CAAC,CAAA,EAAG,aAAA,EAAe,QAAA,EAAS,EAAG,KAAK,CAAC,CAAC,CAAA;AAAA,IAC9I,KAAK,QAAA;AAAU,MAAA,OAAO,SAAA,CAAU,GAAG,UAAU,CAAA;AAAA,IAC7C,KAAK,UAAA;AAAY,MAAA,OAAO,SAAA,CAAU,GAAG,UAAU,CAAA;AAAA,IAC/C,KAAK,WAAA;AAAa,MAAA,OAAO,UAAU,CAAC,CAAA;AAAA,IACpC,KAAK,UAAA;AAAY,MAAA,OAAO,SAAS,CAAC,CAAA;AAAA,IAClC,KAAK,cAAA;AAAgB,MAAA,OAAO,SAAA,CAAU,GAAG,IAAI,CAAA;AAAA,IAC7C,KAAK,KAAA;AAAO,MAAA,OAAO,SAAA,CAAU,GAAG,KAAK,CAAA;AAAA,IACrC,KAAK,OAAA;AAAS,MAAA,OAAO,SAAA,CAAU,GAAG,KAAK,CAAA;AAAA,IACvC,KAAK,OAAA;AAAS,MAAA,OAAO,SAAA,CAAU,GAAG,KAAK,CAAA;AAAA,IACvC,KAAK,KAAA;AAAO,MAAA,OAAO,SAAA,CAAU,GAAG,KAAK,CAAA;AAAA,IACrC,KAAK,IAAA;AAAM,MAAA,OAAO,YAAY,CAAC,CAAA;AAAA,IAC/B,KAAK,QAAA;AAAU,MAAA,OAAO,OAAO,CAAC,CAAA;AAAA,IAC9B,KAAK,YAAA;AAAc,MAAA,OAAO,UAAA,CAAW,GAAG,CAAC,CAAA;AAAA,IACzC,KAAK,IAAA;AAAM,MAAA,OAAO,GAAG,CAAC,CAAA;AAAA,IACtB,KAAK,QAAA;AAAU,MAAA,OAAO,OAAO,CAAC,CAAA;AAAA,IAC9B,KAAK,QAAA;AAAU,MAAA,OAAO,OAAO,CAAC,CAAA;AAAA,IAC9B,KAAK,SAAA;AAAW,MAAA,OAAO,QAAQ,CAAC,CAAA;AAAA,IAChC,KAAK,SAAA;AAAW,MAAA,OAAO,QAAQ,CAAC,CAAA;AAAA,IAChC,KAAK,SAAA;AAAW,MAAA,OAAO,QAAQ,CAAC,CAAA;AAAA,IAChC,KAAK,QAAA;AAAU,MAAA,OAAO,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,IACjC,KAAK,KAAA;AAAO,MAAA,OAAO,QAAA,CAAS,GAAG,KAAK,CAAA;AAAA,IACpC,KAAK,KAAA;AAAO,MAAA,OAAO,QAAA,CAAS,GAAG,KAAK,CAAA;AAAA,IACpC,KAAK,SAAA;AAAW,MAAA,OAAO,SAAA,CAAU,GAAG,KAAK,CAAA;AAAA,IACzC,KAAK,SAAA;AAAW,MAAA,OAAO,OAAA,CAAQ,CAAA,EAAI,CAAA,CAAE,IAAA,KAAS,WAAY,CAAA;AAAA,IAC1D,KAAK,UAAA;AAAY,MAAA,OAAO,KAAA,CAAM,CAAA,EAAG,CAAA,CAAE,KAAA,IAAS,UAAU,CAAA;AAAA,IACtD,KAAK,KAAA;AAAO,MAAA,OAAO,KAAA,CAAM,CAAA,EAAG,CAAA,CAAE,KAAA,IAAS,KAAK,CAAA;AAAA,IAC5C,KAAK,MAAA;AAAQ,MAAA,OAAO,KAAA,CAAM,CAAA,EAAG,CAAA,CAAE,KAAA,IAAS,MAAM,CAAA;AAAA,IAC9C,KAAK,OAAA;AAAS,MAAA,OAAO,KAAA,CAAM,CAAA,EAAG,CAAA,CAAE,KAAA,IAAS,OAAO,CAAA;AAAA,IAChD,KAAK,KAAA;AAAO,MAAA,OAAO,OAAO,CAAC,CAAA;AAAA,IAC3B;AAAS,MAAA,OAAO,SAAA,CAAU,GAAG,GAAG,CAAA;AAAA;AAEpC;AAGO,SAAS,YAAY,IAAA,EAA2B;AACrD,EAAA,OAAO,SAAS,UAAA,IAAc,IAAA,KAAS,KAAA,IAAS,IAAA,KAAS,UAAU,IAAA,KAAS,OAAA;AAC9E;;;AClUO,IAAM,SAAA,GAAY;AAAA,EACvB,QAAA,EAAU,EAAA;AAAA,EACV,QAAA,EAAU,EAAA;AAAA,EACV,aAAA,EAAe,GAAA;AAAA,EACf,WAAA,EAAa,EAAA;AAAA,EACb,eAAA,EAAiB,GAAA;AAAA,EACjB,YAAA,EAAc,GAAA;AAAA,EACd,cAAA,EAAgB,GAAA;AAAA,EAChB,SAAA,EAAW,CAAA;AAAA,EACX,OAAA,EAAS,EAAA;AAAA,EACT,UAAA,EAAY,EAAA;AAAA,EACZ,SAAA,EAAW,EAAA;AAAA,EACX,iBAAA,EAAmB,EAAA;AAAA,EACnB,YAAA,EAAc,EAAA;AAAA,EACd,MAAA,EAAQ,GAAA;AAAA,EACR,GAAA,EAAK;AACP,CAAA;AAEA,IAAM,cAAA,uBAAqB,GAAA,CAAI;AAAA,EAC7B,IAAA;AAAA,EAAM,QAAA;AAAA,EAAU,QAAA;AAAA,EAAU,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,QAAA;AAAA,EAChD,QAAA;AAAA,EAAU,YAAA;AAAA,EAAc,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,KAAA;AAAA,EAAO;AACvD,CAAC,CAAA;AAID,SAAS,WAAW,CAAA,EAA0B;AAC5C,EAAA,IAAI,WAAA,CAAY,CAAA,CAAE,IAAI,CAAA,EAAG,OAAO,CAAA;AAChC,EAAA,IAAI,CAAA,GAAI,SAAA,CAAU,SAAA,GAAY,SAAA,CAAU,OAAA;AACxC,EAAA,IAAI,CAAA,CAAE,EAAA,IAAM,CAAA,CAAE,KAAA,OAAY,SAAA,CAAU,UAAA;AACpC,EAAA,OAAO,CAAA;AACT;AAEA,SAAS,UAAU,CAAA,EAA0B;AAC3C,EAAA,OAAO,CAAA,CAAE,SAAS,CAAA,CAAE,EAAA;AACtB;AAEA,SAAS,gBAAgB,CAAA,EAA4C;AACnE,EAAA,OAAO,QAAA,CAAS,EAAE,IAAI,CAAA;AACxB;AAGA,SAAS,OAAO,GAAA,EAA8E;AAC5F,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,CAAA,EAAG,SAAA,CAAU,GAAA,CAAI,MAAM,CAAA,CAAE,MAAA,GAAS,SAAA,CAAU,MAAA,GAAS,CAAC,CAAA;AAClF,EAAA,MAAM,OAAO,MAAA,GAAS,CAAA;AACtB,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,IAAI,EAAA,GAAK,IAAA;AAAA,IACf,KAAK,GAAA,CAAI,CAAA;AAAA,IACT,KAAA,EAAO,IAAI,EAAA,GAAK,IAAA;AAAA,IAChB,QAAQ,GAAA,CAAI,CAAA,GAAI,IAAI,CAAA,GAAI,UAAA,CAAW,IAAI,MAAM;AAAA,GAC/C;AACF;AAGA,SAAS,SAAA,CAAU,GAAA,EAAgB,EAAA,EAAY,EAAA,EAAsB;AACnE,EAAA,MAAM,EAAA,GAAK,KAAK,GAAA,CAAI,EAAA;AACpB,EAAA,MAAM,EAAA,GAAK,KAAK,GAAA,CAAI,EAAA;AACpB,EAAA,IAAI,EAAA,KAAO,CAAA,IAAK,EAAA,KAAO,CAAA,EAAG,OAAO,EAAE,CAAA,EAAG,GAAA,CAAI,EAAA,EAAI,CAAA,EAAG,GAAA,CAAI,EAAA,EAAG;AACxD,EAAA,MAAM,EAAA,GAAK,IAAI,CAAA,GAAI,CAAA;AACnB,EAAA,MAAM,EAAA,GAAK,IAAI,CAAA,GAAI,CAAA;AACnB,EAAA,MAAM,KAAK,EAAA,KAAO,CAAA,GAAI,KAAK,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,GAAI,QAAA;AAC1C,EAAA,MAAM,KAAK,EAAA,KAAO,CAAA,GAAI,KAAK,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,GAAI,QAAA;AAC1C,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AACzB,EAAA,OAAO,EAAE,CAAA,EAAG,GAAA,CAAI,EAAA,GAAK,EAAA,GAAK,GAAG,CAAA,EAAG,GAAA,CAAI,EAAA,GAAK,EAAA,GAAK,CAAA,EAAE;AAClD;AAIA,SAAS,WAAA,CACP,KACA,KAAA,EACuB;AACvB,EAAA,MAAM,EAAA,GAAK,IAAI,SAAA,KAAc,IAAA;AAE7B,EAAA,MAAM,MAAA,uBAAa,GAAA,EAA6B;AAChD,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,OAAA,EAAS;AAC3B,IAAA,MAAM,CAAA,GAAI,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,IAAK,CAAA;AAC7B,IAAA,IAAI,CAAC,OAAO,GAAA,CAAI,CAAC,GAAG,MAAA,CAAO,GAAA,CAAI,CAAA,EAAG,EAAE,CAAA;AACpC,IAAA,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,CAAG,IAAA,CAAK,CAAC,CAAA;AAAA,EACvB;AACA,EAAA,MAAM,UAAA,GAAa,CAAC,GAAG,MAAA,CAAO,IAAA,EAAM,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAG1D,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAsB;AAEtC,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAoB;AACzC,EAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAC1B,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA;AACzB,IAAA,IAAI,IAAA,GAAO,CAAA;AACX,IAAA,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM;AACrB,MAAA,MAAM,EAAA,GAAK,gBAAgB,CAAC,CAAA;AAC5B,MAAA,MAAM,QAAQ,EAAA,GAAK,EAAA,CAAG,CAAA,GAAI,UAAA,CAAW,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,EAAA,CAAG,GAAG,SAAA,CAAU,CAAC,EAAE,MAAA,GAAS,SAAA,CAAU,SAAS,CAAC,CAAA;AACnG,MAAA,IAAA,IAAQ,KAAA,IAAS,CAAA,GAAI,CAAA,GAAI,SAAA,CAAU,WAAA,GAAc,CAAA,CAAA;AAAA,IACnD,CAAC,CAAA;AACD,IAAA,QAAA,CAAS,GAAA,CAAI,GAAG,IAAI,CAAA;AACpB,IAAA,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,UAAA,EAAY,IAAI,CAAA;AAAA,EACxC;AAEA,EAAA,UAAA,CAAW,OAAA,CAAQ,CAAC,CAAA,EAAG,MAAA,KAAW;AAChC,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA;AACzB,IAAA,MAAM,KAAA,GAAQ,SAAS,SAAA,CAAU,aAAA;AACjC,IAAA,IAAI,MAAA,GAAA,CAAU,UAAA,GAAa,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,IAAM,CAAA;AAC/C,IAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,MAAA,MAAM,EAAA,GAAK,gBAAgB,CAAC,CAAA;AAC5B,MAAA,MAAM,QAAQ,EAAA,GAAK,EAAA,CAAG,CAAA,GAAI,UAAA,CAAW,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,EAAA,CAAG,GAAG,SAAA,CAAU,CAAC,EAAE,MAAA,GAAS,SAAA,CAAU,SAAS,CAAC,CAAA;AACnG,MAAA,MAAM,MAAA,GAAS,SAAS,KAAA,GAAQ,CAAA;AAChC,MAAA,IAAI,EAAA,EAAI,GAAA,CAAI,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,EAAE,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,CAAA;AAAA,WACxC,GAAA,CAAI,IAAI,CAAA,CAAE,EAAA,EAAI,EAAE,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,KAAA,EAAO,CAAA;AAC1C,MAAA,MAAA,IAAU,QAAQ,SAAA,CAAU,WAAA;AAAA,IAC9B;AAAA,EACF,CAAC,CAAA;AACD,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,SAAA,CAAU,SAA0B,KAAA,EAAgD;AAC3F,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAyB;AACzC,EAAA,KAAA,MAAW,CAAA,IAAK,SAAS,GAAA,CAAI,GAAA,CAAI,EAAE,EAAA,kBAAI,IAAI,KAAK,CAAA;AAChD,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,GAAA,CAAI,IAAI,CAAA,CAAE,IAAI,CAAA,EAAG,GAAA,CAAI,EAAE,EAAE,CAAA;AACzB,IAAA,GAAA,CAAI,IAAI,CAAA,CAAE,EAAE,CAAA,EAAG,GAAA,CAAI,EAAE,IAAI,CAAA;AAAA,EAC3B;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,WAAA,CAAY,KAAiB,KAAA,EAA2C;AAC/E,EAAA,MAAM,SAAA,GAAoC,EAAE,IAAA,EAAM,CAAA,EAAG,MAAM,CAAA,EAAG,YAAA,EAAc,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAE;AACzF,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAoB;AACrC,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,OAAA,EAAS;AAC3B,IAAA,IAAI,WAAA,CAAY,EAAE,IAAI,CAAA,OAAQ,GAAA,CAAI,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,SAAA,IAChC,CAAA,CAAE,MAAM,IAAA,CAAK,GAAA,CAAI,EAAE,EAAA,EAAI,SAAA,CAAU,CAAA,CAAE,IAAI,CAAE,CAAA;AAAA,EACpD;AACA,EAAA,MAAM,GAAA,GAAM,SAAA,CAAU,GAAA,CAAI,OAAA,EAAS,KAAK,CAAA;AAExC,EAAA,KAAA,IAAS,OAAO,CAAA,EAAG,IAAA,GAAO,IAAI,OAAA,CAAQ,MAAA,GAAS,GAAG,IAAA,EAAA,EAAQ;AACxD,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,KAAA,MAAW,CAAA,IAAK,IAAI,OAAA,EAAS;AAC3B,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,EAAG;AACpB,MAAA,MAAM,QAAkB,EAAC;AACzB,MAAA,KAAA,MAAW,KAAK,GAAA,CAAI,GAAA,CAAI,EAAE,EAAE,CAAA,IAAK,EAAC,EAAG;AACnC,QAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA;AACpB,QAAA,IAAI,CAAA,KAAM,MAAA,EAAW,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA;AAAA,MACnC;AACA,MAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACxB,MAAA,MAAM,OAAO,cAAA,CAAe,GAAA,CAAI,CAAA,CAAE,IAAI,IAClC,IAAA,CAAK,GAAA,CAAI,GAAG,KAAK,IAAI,CAAA,GACrB,IAAA,CAAK,GAAA,CAAI,GAAG,KAAK,CAAA,GAAI,CAAA;AACzB,MAAA,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,IAAI,CAAA;AACnB,MAAA,OAAA,GAAU,IAAA;AAAA,IACZ;AACA,IAAA,IAAI,CAAC,OAAA,EAAS;AAAA,EAChB;AAEA,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAG,CAAC,GAAG,IAAA,CAAK,MAAA,EAAQ,CAAC,CAAA;AAC9C,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,OAAA,EAAS;AAC3B,IAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,EAAE,GAAG,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,eAAe,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA,GAAI,IAAA,GAAO,IAAI,CAAC,CAAA;AAAA,EAC/E;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,SAAA,CAAU,KAAiB,KAAA,EAA2C;AAC7E,EAAA,MAAM,GAAA,GAAM,SAAA,CAAU,GAAA,CAAI,OAAA,EAAS,KAAK,CAAA;AACxC,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAoB;AAErC,EAAA,IAAI,IAAA,GAAO,IAAI,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,WAAA,CAAY,CAAA,CAAE,IAAI,CAAC,CAAA;AACtD,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,IAAI,IAAA,GAAO,EAAA;AACX,IAAA,KAAA,MAAW,CAAA,IAAK,IAAI,OAAA,EAAS;AAC3B,MAAA,MAAM,MAAM,GAAA,CAAI,GAAA,CAAI,CAAA,CAAE,EAAE,GAAG,IAAA,IAAQ,CAAA;AACnC,MAAA,IAAI,MAAM,IAAA,EAAM;AAAE,QAAA,IAAA,GAAO,GAAA;AAAK,QAAA,IAAA,GAAO,CAAA;AAAA,MAAG;AAAA,IAC1C;AAAA,EACF;AACA,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,EAAA,MAAM,KAAA,GAAkB,CAAC,IAAA,CAAK,EAAE,CAAA;AAChC,EAAA,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,CAAC,CAAA;AACnB,EAAA,OAAO,MAAM,MAAA,EAAQ;AACnB,IAAA,MAAM,EAAA,GAAK,MAAM,KAAA,EAAM;AACvB,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AACrB,IAAA,KAAA,MAAW,KAAK,GAAA,CAAI,GAAA,CAAI,EAAE,CAAA,IAAK,EAAC,EAAG;AACjC,MAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG;AAAE,QAAA,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,CAAC,CAAA;AAAG,QAAA,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,MAAG;AAAA,IACzD;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,CAAA,IAAK,GAAA,CAAI,OAAA,EAAS,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,IAAI,CAAC,CAAA;AAClE,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,WAAA,CAAY,KAAiB,UAAA,EAA2C;AAC/E,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAsB;AACtC,EAAA,MAAM,CAAA,GAAI,IAAI,OAAA,CAAQ,MAAA;AACtB,EAAA,MAAM,MAAA,GAAS,KAAK,GAAA,CAAI,UAAA,EAAa,IAAI,EAAA,IAAO,CAAA,GAAI,KAAK,EAAA,CAAG,CAAA;AAC5D,EAAA,GAAA,CAAI,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM;AAC5B,IAAA,MAAM,GAAA,GAAO,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAC,CAAA,GAAK,CAAA,GAAI,IAAA,CAAK,EAAA,GAAK,IAAA,CAAK,EAAA,GAAK,CAAA;AAC3D,IAAA,GAAA,CAAI,IAAI,CAAA,CAAE,EAAA,EAAI,EAAE,CAAA,EAAG,SAAS,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG,GAAG,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,GAAG,GAAG,CAAA;AAAA,EACxE,CAAC,CAAA;AACD,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,SAAA,CAAU,KAAiB,KAAA,EAA6C;AAC/E,EAAA,MAAM,GAAA,GAAM,SAAA,CAAU,GAAA,CAAI,OAAA,EAAS,KAAK,CAAA;AACxC,EAAA,IAAI,GAAA,GAAM,GAAA,CAAI,OAAA,CAAQ,CAAC,CAAA;AACvB,EAAA,IAAI,IAAA,GAAO,EAAA;AACX,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,OAAA,EAAS;AAC3B,IAAA,MAAM,MAAM,GAAA,CAAI,GAAA,CAAI,CAAA,CAAE,EAAE,GAAG,IAAA,IAAQ,CAAA;AACnC,IAAA,IAAI,MAAM,IAAA,EAAM;AAAE,MAAA,IAAA,GAAO,GAAA;AAAK,MAAA,GAAA,GAAM,CAAA;AAAA,IAAG;AAAA,EACzC;AACA,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAsB;AACtC,EAAA,IAAI,CAAC,KAAK,OAAO,GAAA;AACjB,EAAA,GAAA,CAAI,GAAA,CAAI,IAAI,EAAA,EAAI,EAAE,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA;AAC9B,EAAA,MAAM,MAAA,GAAS,IAAI,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,GAAA,CAAK,EAAE,CAAA;AACzD,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,SAAA,CAAU,YAAA,EAAe,OAAO,MAAA,GAAS,EAAA,IAAO,CAAA,GAAI,IAAA,CAAK,EAAA,CAAG,CAAA;AACpF,EAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM;AACvB,IAAA,MAAM,GAAA,GAAO,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,GAAK,CAAA,GAAI,IAAA,CAAK,EAAA,GAAK,IAAA,CAAK,EAAA,GAAK,CAAA;AACvE,IAAA,GAAA,CAAI,IAAI,CAAA,CAAE,EAAA,EAAI,EAAE,CAAA,EAAG,SAAS,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG,GAAG,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,GAAG,GAAG,CAAA;AAAA,EACxE,CAAC,CAAA;AACD,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,SAAS,GAAA,EAAwC;AACxD,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAsB;AACtC,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,OAAA,EAAS;AAC3B,IAAA,MAAM,EAAA,GAAK,gBAAgB,CAAC,CAAA;AAC5B,IAAA,GAAA,CAAI,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,EAAE,CAAA,EAAG,MAAA,GAAS,EAAA,CAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA;AAC5C,IAAA,MAAA,IAAU,EAAA,CAAG,IAAI,SAAA,CAAU,WAAA;AAAA,EAC7B;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,cAAA,CAAe,KAAiB,KAAA,EAA6C;AACpF,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAsB;AACtC,EAAA,MAAM,QAAA,GAAW,IAAI,GAAA,CAAI,GAAA,CAAI,MAAM,CAAA;AACnC,EAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,GAAA,CAAI,MAAM,CAAA;AAClC,EAAA,MAAM,SAAS,SAAA,CAAU,cAAA;AACzB,EAAA,MAAM,IAAA,GAAO,SAAA,CAAU,QAAA,GAAW,SAAA,CAAU,WAAA;AAE5C,EAAA,MAAM,SAAA,GAAY,CAAC,GAAA,EAAe,CAAA,KAAc;AAC9C,IAAA,MAAM,IAAA,GAAA,CAAQ,GAAA,CAAI,MAAA,GAAS,CAAA,IAAK,IAAA;AAChC,IAAA,GAAA,CAAI,OAAA,CAAQ,CAAC,EAAA,EAAI,CAAA,KAAM,IAAI,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA,EAAG,IAAI,IAAA,GAAO,IAAA,GAAO,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAA,EACnE,CAAA;AACA,EAAA,SAAA,CAAU,GAAA,CAAI,QAAQ,CAAC,CAAA;AACvB,EAAA,SAAA,CAAU,GAAA,CAAI,QAAQ,MAAM,CAAA;AAG5B,EAAA,MAAM,GAAA,GAAM,SAAA,CAAU,GAAA,CAAI,OAAA,EAAS,KAAK,CAAA;AACxC,EAAA,MAAM,QAAQ,GAAA,CAAI,OAAA,CAAQ,MAAA,CAAO,CAAC,MAAM,CAAC,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,IAAK,CAAC,QAAQ,GAAA,CAAI,CAAA,CAAE,EAAE,CAAC,CAAA;AACjF,EAAA,IAAI,GAAA,GAAM,CAAA;AACV,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,IAAI,OAAA;AACJ,IAAA,KAAA,MAAW,KAAK,GAAA,CAAI,GAAA,CAAI,EAAE,EAAE,CAAA,IAAK,EAAC,EAAG;AACnC,MAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,EAAG;AAAE,QAAA,OAAA,GAAU,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA;AAAG,QAAA;AAAA,MAAO;AAAA,IACxD;AACA,IAAA,GAAA,CAAI,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,EAAE,CAAA,EAAG,OAAA,IAAY,GAAA,EAAA,GAAQ,IAAA,EAAO,CAAA,EAAG,MAAA,GAAS,CAAA,EAAG,CAAA;AAAA,EAC/D;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,YAAY,GAAA,EAAwC;AAC3D,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAsB;AACtC,EAAA,IAAI,QAAA,GAAW,CAAA;AACf,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,OAAA,EAAS;AAC3B,IAAA,IAAI,CAAA,CAAE,EAAA,EAAI,GAAA,CAAI,GAAA,CAAI,EAAE,EAAA,EAAI,EAAE,CAAA,EAAG,CAAA,CAAE,GAAG,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,EAAA,CAAG,GAAG,CAAA;AAAA,SAC3C;AAAE,MAAA,GAAA,CAAI,GAAA,CAAI,EAAE,EAAA,EAAI,EAAE,GAAG,QAAA,GAAW,GAAA,EAAK,CAAA,EAAG,CAAA,EAAG,CAAA;AAAG,MAAA,QAAA,EAAA;AAAA,IAAY;AAAA,EACjE;AACA,EAAA,OAAO,GAAA;AACT;AAIA,SAAS,cAAc,GAAA,EAAgC;AACrD,EAAA,IAAI,GAAA,CAAI,MAAA,KAAW,YAAA,IAAgB,GAAA,CAAI,MAAA,CAAO,WAAW,CAAA,IAAK,GAAA,CAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG;AACrF,IAAA,OAAO,GAAA,CAAI,KAAA;AAAA,EACb;AACA,EAAA,MAAM,OAAO,IAAI,GAAA,CAAI,IAAI,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,EAAE,IAAA,EAAM,CAAA,CAAE,EAAE,CAAA,CAAE,IAAA,GAAO,IAAA,CAAK,QAAG,CAAC,CAAC,CAAA;AAC1E,EAAA,MAAM,QAAuB,EAAC;AAC9B,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,MAAA,EAAQ;AAC1B,IAAA,KAAA,MAAW,EAAA,IAAM,IAAI,MAAA,EAAQ;AAC3B,MAAA,MAAM,GAAA,GAAM,CAAC,CAAA,EAAG,EAAE,EAAE,IAAA,EAAK,CAAE,KAAK,QAAG,CAAA;AACnC,MAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG;AAClB,QAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA,EAAG,EAAA,EAAI,EAAA,EAAI,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,QAAA,EAAU,IAAA,EAAM,IAAA,EAAM,CAAA;AAC/E,QAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AAAA,MACd;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,CAAC,GAAG,GAAA,CAAI,KAAA,EAAO,GAAG,KAAK,CAAA;AAChC;AAIA,SAAS,SAAS,GAAA,EAAgC;AAChD,EAAA,IAAI,GAAA,CAAI,QAAQ,MAAA,KAAW,CAAA,IAAK,IAAI,KAAA,CAAM,MAAA,KAAW,GAAG,OAAO,gBAAA;AAC/D,EAAA,QAAQ,IAAI,MAAA;AAAQ,IAClB,KAAK,MAAA;AAAQ,MAAA,OAAO,MAAA;AAAA,IACpB,KAAK,MAAA;AAAQ,MAAA,OAAO,MAAA;AAAA,IACpB,KAAK,KAAA;AAAO,MAAA,OAAO,KAAA;AAAA,IACnB,KAAK,MAAA;AAAQ,MAAA,OAAO,MAAA;AAAA,IACpB,KAAK,YAAA;AAAc,MAAA,OAAO,YAAA;AAAA,IAC1B,KAAK,MAAA;AAAQ,MAAA,OAAO,MAAA;AAAA,IACpB,KAAK,QAAA;AAAU,MAAA,OAAO,GAAA,CAAI,QAAQ,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,IAAI,IAAI,cAAA,GAAiB,MAAA;AAAA,IACzE;AAAS,MAAA,OAAO,SAAA;AAAA;AAEpB;AAIO,SAAS0E,eAAc,GAAA,EAAsC;AAClE,EAAA,MAAM,KAAA,GAAQ,cAAc,GAAG,CAAA;AAG/B,EAAA,IAAI,OAAA;AACJ,EAAA,QAAQ,IAAI,MAAA;AAAQ,IAClB,KAAK,MAAA;AAAQ,MAAA,OAAA,GAAU,WAAA,CAAY,GAAA,EAAK,SAAA,CAAU,GAAA,EAAK,KAAK,CAAC,CAAA;AAAG,MAAA;AAAA,IAChE,KAAK,MAAA;AAAQ,MAAA,OAAA,GAAU,SAAA,CAAU,KAAK,KAAK,CAAA;AAAG,MAAA;AAAA,IAC9C,KAAK,MAAA;AAAQ,MAAA,OAAA,GAAU,WAAA,CAAY,GAAA,EAAK,SAAA,CAAU,eAAe,CAAA;AAAG,MAAA;AAAA,IACpE,KAAK,MAAA;AAAQ,MAAA,OAAA,GAAU,WAAA,CAAY,GAAA,EAAK,SAAA,CAAU,eAAe,CAAA;AAAG,MAAA;AAAA,IACpE,KAAK,KAAA;AAAO,MAAA,OAAA,GAAU,SAAS,GAAG,CAAA;AAAG,MAAA;AAAA,IACrC,KAAK,YAAA;AAAc,MAAA,OAAA,GAAU,cAAA,CAAe,KAAK,KAAK,CAAA;AAAG,MAAA;AAAA,IACzD,KAAK,QAAA;AAAU,MAAA,OAAA,GAAU,YAAY,GAAG,CAAA;AAAG,MAAA;AAAA,IAC3C,KAAK,QAAA;AAAA,IACL;AAAS,MAAA,OAAA,GAAU,WAAA,CAAY,GAAA,EAAK,WAAA,CAAY,GAAA,EAAK,KAAK,CAAC,CAAA;AAAG,MAAA;AAAA;AAIhE,EAAA,MAAM,KAAA,GAAqB,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM;AAChD,IAAA,MAAM,EAAA,GAAK,gBAAgB,CAAC,CAAA;AAC5B,IAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,EAAE,KAAK,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAE;AAC5C,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,CAAA;AAAA,MACR,IAAI,CAAA,CAAE,CAAA;AAAA,MACN,IAAI,CAAA,CAAE,CAAA;AAAA,MACN,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,EAAA,CAAG,CAAA,GAAI,CAAA;AAAA,MAChB,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,EAAA,CAAG,CAAA,GAAI,CAAA;AAAA,MAChB,GAAG,EAAA,CAAG,CAAA;AAAA,MACN,GAAG,EAAA,CAAG,CAAA;AAAA,MACN,IAAA,EAAM;AAAA,KACR;AAAA,EACF,CAAC,CAAA;AACD,EAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,MAAA,CAAO,EAAA,EAAI,CAAC,CAAC,CAAC,CAAA;AAG1D,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAAyF;AACnH,EAAA,MAAM,OAAA,GAAU,CAAC,EAAA,KAAuB;AACtC,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,IAAI,CAAA,GAAI,IAAI,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,EAAE,CAAA;AAC1C,IAAA,OAAO,GAAG,MAAA,EAAQ;AAAE,MAAA,KAAA,EAAA;AAAS,MAAA,CAAA,GAAI,GAAA,CAAI,OAAO,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,EAAG,MAAM,CAAA;AAAA,IAAG;AAC7E,IAAA,OAAO,KAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,gBAAgB,CAAC,GAAG,GAAA,CAAI,MAAM,EAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,QAAQ,CAAA,CAAE,EAAE,IAAI,OAAA,CAAQ,CAAA,CAAE,EAAE,CAAC,CAAA;AAClF,EAAA,KAAA,MAAW,KAAK,aAAA,EAAe;AAC7B,IAAA,IAAI,IAAI,QAAA,EAAU,CAAA,GAAI,QAAA,EAAU,CAAA,GAAI,WAAW,EAAA,GAAK,CAAA,QAAA;AACpD,IAAA,MAAM,MAAA,GAAS,CAAC,CAAA,KAAoE;AAClF,MAAA,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA;AAAG,MAAA,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,CAAE,GAAG,CAAA;AAAG,MAAA,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,CAAE,KAAK,CAAA;AAAG,MAAA,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,CAAA,CAAE,MAAM,CAAA;AAAA,IACvG,CAAA;AACA,IAAA,KAAA,MAAW,GAAA,IAAO,EAAE,OAAA,EAAS;AAAE,MAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AAAG,MAAA,IAAI,EAAA,EAAI,MAAA,CAAO,MAAA,CAAO,EAAE,CAAC,CAAA;AAAA,IAAG;AACxF,IAAA,KAAA,MAAW,GAAA,IAAO,EAAE,QAAA,EAAU;AAAE,MAAA,MAAM,EAAA,GAAK,aAAA,CAAc,GAAA,CAAI,GAAG,CAAA;AAAG,MAAA,IAAI,EAAA,SAAW,EAAE,CAAA;AAAA,IAAG;AACvF,IAAA,IAAI,MAAM,QAAA,EAAU;AACpB,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,CAAA,CAAE,EAAE,CAAA;AAC1B,IAAA,MAAM,MAAM,SAAA,CAAU,SAAA;AACtB,IAAA,aAAA,CAAc,GAAA,CAAI,EAAE,EAAA,EAAI;AAAA,MACtB,MAAM,CAAA,GAAI,GAAA;AAAA,MACV,GAAA,EAAK,CAAA,GAAI,GAAA,GAAM,SAAA,CAAU,YAAA;AAAA,MACzB,OAAO,CAAA,GAAI,GAAA;AAAA,MACX,QAAQ,EAAA,GAAK,GAAA;AAAA,MACb;AAAA,KACD,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,OAAO,QAAA,EAAU,IAAA,GAAO,QAAA,EAAU,IAAA,GAAO,WAAW,IAAA,GAAO,CAAA,QAAA;AAC/D,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,MAAM,CAAA,GAAI,OAAO,CAAC,CAAA;AAClB,IAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,CAAA,CAAE,IAAI,CAAA;AAAG,IAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,CAAA,CAAE,GAAG,CAAA;AAC1D,IAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,CAAA,CAAE,KAAK,CAAA;AAAG,IAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,CAAA,CAAE,MAAM,CAAA;AAAA,EAChE;AACA,EAAA,KAAA,MAAW,EAAA,IAAM,aAAA,CAAc,MAAA,EAAO,EAAG;AACvC,IAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,EAAA,CAAG,IAAI,CAAA;AAAG,IAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,EAAA,CAAG,GAAG,CAAA;AAC5D,IAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,EAAA,CAAG,KAAK,CAAA;AAAG,IAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,EAAA,CAAG,MAAM,CAAA;AAAA,EAClE;AACA,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,EAAG;AAAE,IAAA,IAAA,GAAO,CAAA;AAAG,IAAA,IAAA,GAAO,CAAA;AAAG,IAAA,IAAA,GAAO,SAAA,CAAU,QAAA;AAAU,IAAA,IAAA,GAAO,SAAA,CAAU,QAAA;AAAA,EAAU;AAExG,EAAA,MAAM,EAAA,GAAK,UAAU,GAAA,GAAM,IAAA;AAC3B,EAAA,MAAM,EAAA,GAAK,UAAU,GAAA,GAAM,IAAA;AAC3B,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AAAE,IAAA,CAAA,CAAE,CAAA,IAAK,EAAA;AAAI,IAAA,CAAA,CAAE,CAAA,IAAK,EAAA;AAAI,IAAA,CAAA,CAAE,EAAA,IAAM,EAAA;AAAI,IAAA,CAAA,CAAE,EAAA,IAAM,EAAA;AAAA,EAAI;AAEvE,EAAA,MAAM,SAAqB,EAAC;AAC5B,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,MAAA,EAAQ;AAC1B,IAAA,MAAM,EAAA,GAAK,aAAA,CAAc,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA;AACjC,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,KAAA,EAAO,CAAA;AAAA,MACP,CAAA,EAAG,GAAG,IAAA,GAAO,EAAA;AAAA,MACb,CAAA,EAAG,GAAG,GAAA,GAAM,EAAA;AAAA,MACZ,CAAA,EAAG,EAAA,CAAG,KAAA,GAAQ,EAAA,CAAG,IAAA;AAAA,MACjB,CAAA,EAAG,EAAA,CAAG,MAAA,GAAS,EAAA,CAAG,GAAA;AAAA,MAClB,OAAO,EAAA,CAAG;AAAA,KACX,CAAA;AAAA,EACH;AAGA,EAAA,MAAM,SAAA,GAAwB,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AAChD,IAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA;AAC/B,IAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA;AAC7B,IAAA,MAAM,KAAK,SAAA,CAAU,CAAA,EAAG,CAAA,CAAE,EAAA,EAAI,EAAE,EAAE,CAAA;AAClC,IAAA,MAAM,KAAK,SAAA,CAAU,CAAA,EAAG,CAAA,CAAE,EAAA,EAAI,EAAE,EAAE,CAAA;AAClC,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,MAAA,EAAQ,CAAC,EAAA,EAAI,EAAE,CAAA;AAAA,MACf,MAAA,EAAA,CAAS,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,CAAA,IAAK,CAAA;AAAA,MACxB,MAAA,EAAA,CAAS,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,CAAA,IAAK;AAAA,KAC1B;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,KAAA,GAAQ,IAAA,GAAO,IAAA,GAAO,CAAA,GAAI,SAAA,CAAU,GAAA;AAC1C,EAAA,MAAM,MAAA,GAAS,IAAA,GAAO,IAAA,GAAO,CAAA,GAAI,SAAA,CAAU,GAAA;AAE3C,EAAA,OAAO;AAAA,IACL,GAAA;AAAA,IACA,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,GAAG,CAAA;AAAA,IAC1B,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,EAAE,CAAA;AAAA,IAC3B,OAAA,EAAS,KAAA;AAAA,IACT,KAAA,EAAO,SAAA;AAAA,IACP,MAAA;AAAA,IACA,aAAA,EAAe,SAAS,GAAG,CAAA;AAAA,IAC3B,UAAU,GAAA,CAAI,QAAA;AAAA,IACd,OAAO,GAAA,CAAI;AAAA,GACb;AACF;;;ACpaA,IAAMC,MAAK,CAAC,CAAA,KAAc,KAAK,KAAA,CAAM,CAAA,GAAI,GAAG,CAAA,GAAI,GAAA;AAEhD,SAASxC,UAAS,CAAA,EAAkB;AAClC,EAAA,OAAO;AAAA;AAAA,qBAAA,EAEc,CAAA,CAAE,UAAU,CAAA,UAAA,EAAa,CAAA,CAAE,YAAY,CAAA;AAAA,qCAAA,EACvB,EAAE,YAAY,CAAA;AAAA,sBAAA,EAC7B,EAAE,YAAY,CAAA;AAAA,yCAAA,EACK,EAAE,YAAY,CAAA;AAAA,mDAAA,EACJ,EAAE,YAAY,CAAA;AAAA,2BAAA,EACtC,CAAA,CAAE,SAAS,CAAA,UAAA,EAAa,CAAA,CAAE,WAAW,CAAA;AAAA,qDAAA,EACX,EAAE,IAAI,CAAA;AAAA,sBAAA,EACrC,EAAE,YAAY,CAAA;AAAA,6CAAA,EACS,EAAE,KAAK,CAAA;AAAA,gDAAA,EACJ,EAAE,QAAQ,CAAA;AAAA;AAAA;AAAA;AAAA,gDAAA,EAIV,CAAA,CAAE,SAAS,CAAA,+BAAA,EAAkC,CAAA,CAAE,EAAE,CAAA;AAAA,2CAAA,EACtD,CAAA,CAAE,SAAS,CAAA,+BAAA,EAAkC,CAAA,CAAE,EAAE,CAAA;AAAA,4CAAA,EAChD,EAAE,UAAU,CAAA;AAAA,4CAAA,EACZ,EAAE,UAAU,CAAA;AAAA,uDAAA,EACD,CAAA,CAAE,UAAU,CAAA,UAAA,EAAa,CAAA,CAAE,YAAY,CAAA;AAAA,kEAAA,EAC5B,EAAE,UAAU,CAAA;AAAA;AAAA,iDAAA,EAE7B,EAAE,IAAI,CAAA;AAAA,CAAA,CACvD,IAAA,EAAK;AACP;AAIA,SAAS,SAAA,CAAU,GAAU,IAAA,EAA2B;AACtD,EAAA,IAAI,IAAA,CAAK,aAAa,QAAA,IAAY,IAAA,CAAK,SAAS,IAAA,CAAK,KAAA,CAAM,WAAW,CAAA,EAAG;AACvE,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AAExB,IAAA,MAAM,GAAA,GAAM,EAAE,WAAA,CAAY,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,KAAM,EAAE,QAAQ,CAAA;AACxD,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,MAAA,GAAS,GAAA,GAAM,CAAA,CAAE,WAAA;AAClC,IAAA,OAAO,IAAA,CAAK,GAAA,GAAM,IAAA,CAAK,MAAM,CAAA;AAAA,EAC/B;AACA,EAAA,QAAQ,KAAK,QAAA;AAAU,IACrB,KAAK,OAAA;AAAS,MAAA,OAAO,CAAA,CAAE,SAAA;AAAA,IACvB,KAAK,UAAA;AAAY,MAAA,OAAO,CAAA,CAAE,YAAA;AAAA,IAC1B,KAAK,QAAA;AAAU,MAAA,OAAO,CAAA,CAAE,UAAA;AAAA,IACxB,KAAK,KAAA;AAAO,MAAA,OAAO,CAAA,CAAE,OAAA;AAAA,IACrB,KAAK,KAAA;AAAO,MAAA,OAAO,CAAA,CAAE,OAAA;AAAA,IACrB,KAAK,KAAA;AAAO,MAAA,OAAO,CAAA,CAAE,OAAA;AAAA,IACrB;AAAS,MAAA,OAAO,CAAA,CAAE,UAAA;AAAA;AAEtB;AAEA,SAAS,WAAW,IAAA,EAA2B;AAC7C,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,IAAI,IAAA,CAAK,MAAM,KAAA,CAAM,IAAA,CAAK,KAAK,IAAA,KAAS,OAAA,GAAU,UAAU,QAAQ,CAAA;AACpE,EAAA,IAAI,IAAA,CAAK,KAAA,EAAO,MAAA,EAAQ,KAAA,CAAM,IAAA,CAAK,CAAA,KAAA,EAAQ,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA,CAAE,CAAA;AACjE,EAAA,IAAI,IAAA,CAAK,KAAA,EAAO,KAAA,CAAM,IAAA,CAAK,KAAK,KAAK,CAAA;AACrC,EAAA,IAAI,IAAA,CAAK,QAAA,KAAa,KAAA,EAAO,KAAA,CAAM,KAAK,KAAK,CAAA;AAC7C,EAAA,IAAI,IAAA,CAAK,QAAA,KAAa,KAAA,EAAO,KAAA,CAAM,KAAK,KAAK,CAAA;AAC7C,EAAA,IAAI,IAAA,CAAK,KAAA,EAAO,KAAA,CAAM,IAAA,CAAK,KAAK,KAAK,CAAA;AACrC,EAAA,OAAO,KAAA,CAAM,KAAK,QAAK,CAAA;AACzB;AAEA,SAAS,UAAU,EAAA,EAAY,EAAA,EAAY,IAAY,EAAA,EAAY,KAAA,EAAe,KAAK,CAAA,EAAW;AAChG,EAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AACvC,EAAA,MAAM,EAAA,GAAK,GAAA,GAAM,IAAA,CAAK,EAAA,GAAK,IAAA;AAC3B,EAAA,MAAM,EAAA,GAAK,GAAA,GAAM,IAAA,CAAK,EAAA,GAAK,IAAA;AAC3B,EAAA,OAAOzB,yBAAA,CAAQ;AAAA,IACb,IAAA,EAAM,KAAA;AAAA,IACN,MAAA,EAAQ,GAAGiE,GAAAA,CAAG,EAAE,CAAC,CAAA,CAAA,EAAIA,GAAAA,CAAG,EAAE,CAAC,CAAA,CAAA,EAAIA,IAAG,EAAA,GAAK,EAAA,GAAK,KAAK,GAAA,CAAI,EAAE,CAAC,CAAC,CAAA,CAAA,EAAIA,IAAG,EAAA,GAAK,EAAA,GAAK,KAAK,GAAA,CAAI,EAAE,CAAC,CAAC,CAAA,CAAA,EAAIA,IAAG,EAAA,GAAK,EAAA,GAAK,KAAK,GAAA,CAAI,EAAE,CAAC,CAAC,CAAA,CAAA,EAAIA,IAAG,EAAA,GAAK,EAAA,GAAK,KAAK,GAAA,CAAI,EAAE,CAAC,CAAC,CAAA;AAAA,GACpJ,CAAA;AACH;AAEA,SAAS,UAAA,CAAW,IAAc,CAAA,EAAkB;AAClD,EAAA,MAAM,EAAE,MAAK,GAAI,EAAA;AACjB,EAAA,MAAM,EAAA,GAAK,EAAA,CAAG,MAAA,CAAO,CAAC,CAAA;AACtB,EAAA,MAAM,KAAK,EAAA,CAAG,MAAA,CAAO,EAAA,CAAG,MAAA,CAAO,SAAS,CAAC,CAAA;AACzC,EAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,CAAA,EAAG,IAAI,CAAA;AAC/B,EAAA,MAAM,GAAA,GAAM,CAAA,wBAAA,EAA2B,IAAA,CAAK,QAAQ,CAAA,CAAA;AACpD,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,IAAI,IAAA,CAAK,aAAa,KAAA,EAAO;AAE3B,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,CAAA,EAAG,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,CAAC,CAAA,GAAI,KAAK,EAAA,GAAK,CAAA;AAC7D,IAAA,MAAM,EAAA,GAAK,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AAC7B,IAAA,MAAM,EAAA,GAAK,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AAC7B,IAAA,KAAA,CAAM,IAAA,CAAK5E,sBAAA,CAAK,EAAE,KAAA,EAAO,KAAK,MAAA,EAAQ,KAAA,EAAO,EAAA,EAAI4E,GAAAA,CAAG,EAAA,CAAG,CAAA,GAAI,EAAE,CAAA,EAAG,IAAIA,GAAAA,CAAG,EAAA,CAAG,CAAA,GAAI,EAAE,CAAA,EAAG,EAAA,EAAIA,GAAAA,CAAG,EAAA,CAAG,IAAI,EAAE,CAAA,EAAG,EAAA,EAAIA,GAAAA,CAAG,EAAA,CAAG,CAAA,GAAI,EAAE,CAAA,EAAG,CAAC,CAAA;AAC1H,IAAA,KAAA,CAAM,IAAA,CAAK5E,sBAAA,CAAK,EAAE,KAAA,EAAO,KAAK,MAAA,EAAQ,KAAA,EAAO,EAAA,EAAI4E,GAAAA,CAAG,EAAA,CAAG,CAAA,GAAI,EAAE,CAAA,EAAG,IAAIA,GAAAA,CAAG,EAAA,CAAG,CAAA,GAAI,EAAE,CAAA,EAAG,EAAA,EAAIA,GAAAA,CAAG,EAAA,CAAG,IAAI,EAAE,CAAA,EAAG,EAAA,EAAIA,GAAAA,CAAG,EAAA,CAAG,CAAA,GAAI,EAAE,CAAA,EAAG,CAAC,CAAA;AAAA,EAC5H,CAAA,MAAO;AACL,IAAA,KAAA,CAAM,IAAA,CAAK5D,oBAAA,CAAG,UAAA,EAAY,EAAE,KAAA,EAAO,GAAA,EAAK,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,EAAA,CAAG,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAG4D,GAAAA,CAAG,CAAA,CAAE,CAAC,CAAC,CAAA,CAAA,EAAIA,GAAAA,CAAG,CAAA,CAAE,CAAC,CAAC,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,EAAG,CAAC,CAAA;AAAA,EAC3H;AAEA,EAAA,IAAI,IAAA,CAAK,QAAA,EAAU,KAAA,CAAM,IAAA,CAAK,UAAU,EAAA,CAAG,CAAA,EAAG,EAAA,CAAG,CAAA,EAAG,EAAA,CAAG,CAAA,EAAG,EAAA,CAAG,CAAA,EAAG,KAAK,CAAC,CAAA;AAGtE,EAAA,IAAI,IAAA,CAAK,aAAa,OAAA,EAAS;AAC7B,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,CAAA,EAAG,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,CAAC,CAAA,GAAI,KAAK,EAAA,GAAK,CAAA;AAC7D,IAAA,KAAA,MAAW,CAAA,IAAK,CAAC,GAAA,EAAK,IAAI,CAAA,EAAG;AAC3B,MAAA,MAAM,KAAK,EAAA,CAAG,CAAA,GAAA,CAAK,EAAA,CAAG,CAAA,GAAI,GAAG,CAAA,IAAK,CAAA;AAClC,MAAA,MAAM,KAAK,EAAA,CAAG,CAAA,GAAA,CAAK,EAAA,CAAG,CAAA,GAAI,GAAG,CAAA,IAAK,CAAA;AAClC,MAAA,KAAA,CAAM,IAAA,CAAK5E,uBAAK,EAAE,KAAA,EAAO,KAAK,MAAA,EAAQ,KAAA,EAAO,IAAI4E,GAAAA,CAAG,EAAA,GAAK,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,CAAC,CAAA,EAAG,IAAIA,GAAAA,CAAG,EAAA,GAAK,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,CAAC,CAAA,EAAG,IAAIA,GAAAA,CAAG,EAAA,GAAK,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,CAAC,CAAA,EAAG,IAAIA,GAAAA,CAAG,EAAA,GAAK,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,CAAC,CAAA,EAAG,CAAC,CAAA;AAAA,IAChL;AAAA,EACF;AAGA,EAAA,MAAM,GAAA,GAAM,WAAW,IAAI,CAAA;AAC3B,EAAA,IAAI,GAAA,QAAW,IAAA,CAAK3E,sBAAA,CAAO,EAAE,KAAA,EAAO,kBAAA,EAAoB,CAAA,EAAG2E,GAAAA,CAAG,EAAA,CAAG,MAAM,GAAG,CAAA,EAAGA,GAAAA,CAAG,GAAG,MAAA,GAAS,CAAC,GAAG,aAAA,EAAe,QAAA,EAAS,EAAG,GAAG,CAAC,CAAA;AAG/H,EAAA,IAAI,IAAA,CAAK,QAAA,EAAU,KAAA,CAAM,IAAA,CAAK3E,uBAAO,EAAE,KAAA,EAAO,aAAA,EAAe,CAAA,EAAG2E,IAAG,EAAA,CAAG,CAAA,GAAA,CAAK,EAAA,CAAG,CAAA,GAAI,GAAG,CAAA,IAAK,IAAI,CAAA,EAAG,CAAA,EAAGA,GAAAA,CAAG,EAAA,CAAG,CAAA,GAAA,CAAK,EAAA,CAAG,IAAI,EAAA,CAAG,CAAA,IAAK,IAAA,GAAO,CAAC,GAAG,aAAA,EAAe,QAAA,EAAS,EAAG,IAAA,CAAK,QAAQ,CAAC,CAAA;AAClL,EAAA,IAAI,IAAA,CAAK,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK3E,uBAAO,EAAE,KAAA,EAAO,aAAA,EAAe,CAAA,EAAG2E,IAAG,EAAA,CAAG,CAAA,GAAA,CAAK,EAAA,CAAG,CAAA,GAAI,GAAG,CAAA,IAAK,IAAI,CAAA,EAAG,CAAA,EAAGA,GAAAA,CAAG,EAAA,CAAG,CAAA,GAAA,CAAK,EAAA,CAAG,IAAI,EAAA,CAAG,CAAA,IAAK,IAAA,GAAO,CAAC,GAAG,aAAA,EAAe,QAAA,EAAS,EAAG,IAAA,CAAK,OAAO,CAAC,CAAA;AAEhL,EAAA,OAAO/D,uBAAA;AAAA,IACL;AAAA,MACE,KAAA,EAAO,eAAA;AAAA,MACP,aAAa,IAAA,CAAK,IAAA;AAAA,MAClB,WAAW,IAAA,CAAK,EAAA;AAAA,MAChB,aAAa,IAAA,CAAK,QAAA;AAAA,MAClB,GAAI,IAAA,CAAK,KAAA,EAAO,MAAA,GAAS,EAAE,WAAA,EAAa,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA,EAAE,GAAI,EAAC;AAAA,MAClE,GAAI,KAAK,KAAA,GAAQ,EAAE,cAAc,IAAA,CAAK,KAAA,KAAU,EAAC;AAAA,MACjD,GAAI,KAAK,IAAA,GAAO,EAAE,aAAa,IAAA,CAAK,IAAA,KAAS;AAAC,KAChD;AAAA,IACA;AAAA,GACF;AACF;AAIA,SAAS,WAAA,CAAY,IAAc,CAAA,EAAkB;AACnD,EAAA,MAAM,CAAA,GAAI,GAAG,KAAA,CAAM,IAAA;AACnB,EAAA,MAAM,GAAA,GAAM,mBAAmB,CAAC,CAAA,CAAA;AAChC,EAAA,MAAM,UAAA,GACJ,CAAA,KAAM,MAAA,IAAU,CAAA,KAAM,KAAA,GAAQ,CAAA,CAAE,UAAA,GAC5B,CAAA,KAAM,QAAA,IAAY,CAAA,KAAM,MAAA,GAAS,CAAA,CAAE,eACjC,CAAA,CAAE,UAAA;AACV,EAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,KAAA,CAAM,KAAA,IAAS,GAAG,KAAA,CAAM,EAAA;AACzC,EAAA,MAAM,GAAA,GAAM,CAAA,KAAM,MAAA,GAAS,CAAA,KAAA,EAAQ,KAAK,CAAA,CAAA,GAAK,KAAA;AAC7C,EAAA,OAAOA,uBAAA;AAAA,IACL,EAAE,OAAO,iBAAA,EAAmB,WAAA,EAAa,GAAG,YAAA,EAAcK,2BAAA,CAAU,KAAK,CAAA,EAAE;AAAA,IAC3E;AAAA,MACET,sBAAA,CAAK,EAAE,KAAA,EAAO,GAAA,EAAK,CAAA,EAAGmE,GAAAA,CAAG,EAAA,CAAG,CAAC,CAAA,EAAG,CAAA,EAAGA,GAAAA,CAAG,EAAA,CAAG,CAAC,CAAA,EAAG,KAAA,EAAOA,GAAAA,CAAG,EAAA,CAAG,CAAC,CAAA,EAAG,MAAA,EAAQA,GAAAA,CAAG,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,CAAA;AAAA,MAC9F3E,sBAAA,CAAO,EAAE,KAAA,EAAO,uBAAA,EAAyB,MAAM,UAAA,EAAY,CAAA,EAAG2E,IAAG,EAAA,CAAG,CAAA,GAAI,UAAE,iBAAiB,CAAA,EAAG,GAAGA,GAAAA,CAAG,EAAA,CAAG,IAAI,EAAE,CAAA,IAAK,GAAG;AAAA;AACvH,GACF;AACF;AAIA,SAAS,YAAA,CAAa,GAAc,CAAA,EAAkB;AACpD,EAAA,MAAM,IAAI,CAAA,CAAE,MAAA;AACZ,EAAA,MAAM,QAAkB,CAAC,cAAA,CAAe,GAAG,EAAE,CAAA,EAAG,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,GAAG,CAAA,CAAE,CAAA,EAAG,GAAG,CAAA,CAAE,CAAA,EAAG,CAAC,CAAA;AAE9E,EAAA,IAAI,CAAC,WAAA,CAAY,CAAA,CAAE,IAAI,CAAA,EAAG;AACxB,IAAA,MAAM,SAAS,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,UAAE,SAAA,GAAY,EAAA;AACzC,IAAA,KAAA,CAAM,IAAA,CAAK3E,uBAAO,EAAE,KAAA,EAAO,gBAAgB,CAAA,EAAG2E,GAAAA,CAAG,EAAE,EAAE,CAAA,EAAG,GAAGA,GAAAA,CAAG,MAAM,GAAG,aAAA,EAAe,QAAA,IAAY,CAAA,CAAE,KAAA,IAAS,CAAA,CAAE,EAAE,CAAC,CAAA;AAClH,IAAA,MAAM,GAAA,GAAM,CAAA,CAAE,EAAA,IAAM,CAAA,CAAE,KAAA;AACtB,IAAA,IAAI,GAAA,QAAW,IAAA,CAAK3E,sBAAA,CAAO,EAAE,KAAA,EAAO,iBAAA,EAAmB,CAAA,EAAG2E,GAAAA,CAAG,CAAA,CAAE,EAAE,GAAG,CAAA,EAAGA,GAAAA,CAAG,SAAS,SAAA,CAAE,UAAU,GAAG,aAAA,EAAe,QAAA,EAAS,EAAG,GAAG,CAAC,CAAA;AAAA,EACnI;AAEA,EAAA,MAAM,KAAA,GAAqD;AAAA,IACzD,KAAA,EAAO,eAAA;AAAA,IACP,WAAW,CAAA,CAAE,EAAA;AAAA,IACb,aAAa,CAAA,CAAE;AAAA,GACjB;AACA,EAAA,IAAI,CAAA,CAAE,IAAA,EAAM,KAAA,CAAM,WAAW,IAAI,CAAA,CAAE,IAAA;AACnC,EAAA,IAAI,CAAA,CAAE,EAAA,EAAI,KAAA,CAAM,SAAS,IAAI,CAAA,CAAE,EAAA;AAC/B,EAAA,IAAI,CAAA,CAAE,UAAA,EAAY,KAAA,CAAM,WAAW,IAAI,CAAA,CAAE,UAAA;AAEzC,EAAA,OAAO/D,uBAAA,CAAM,OAAO,KAAK,CAAA;AAC3B;AAIO,SAAS,mBAAA,CAAoB,QAA6B,MAAA,EAA+B;AAC9F,EAAA,MAAM,CAAA,GAAIgE,qCAAA,CAAoB,MAAA,EAAQ,KAAA,IAAS,SAAS,CAAA;AACxD,EAAA,MAAM,WAAqB,EAAC;AAE5B,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAoB;AACvC,EAAA,KAAA,MAAW,CAAA,IAAK,MAAA,CAAO,OAAA,EAAS,MAAA,CAAO,IAAI,CAAA,CAAE,MAAA,CAAO,IAAA,EAAA,CAAO,MAAA,CAAO,IAAI,CAAA,CAAE,MAAA,CAAO,IAAI,CAAA,IAAK,KAAK,CAAC,CAAA;AAC9F,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAoB;AAC1C,EAAA,KAAA,MAAW,CAAA,IAAK,MAAA,CAAO,KAAA,EAAO,SAAA,CAAU,IAAI,CAAA,CAAE,IAAA,CAAK,QAAA,EAAA,CAAW,SAAA,CAAU,IAAI,CAAA,CAAE,IAAA,CAAK,QAAQ,CAAA,IAAK,KAAK,CAAC,CAAA;AAEtG,EAAA,MAAM,SAAA,GAAY;AAAA,IAChB,CAAA,EAAG,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,UAAA,EAAa,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA,QAAA,EAAW,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA,YAAA,CAAA;AAAA,IACvF,CAAA,UAAA,EAAa,OAAO,aAAa,CAAA,CAAA,CAAA;AAAA,IACjC,SAAA,CAAU,OAAO,CAAA,OAAA,EAAU,CAAC,GAAG,SAAS,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM,CAAA,EAAG,CAAC,CAAA,CAAA,EAAI,CAAC,EAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA,GAAM,EAAA;AAAA,IACvF,MAAA,CAAO,SAAS,MAAA,GAAS,CAAA,UAAA,EAAa,OAAO,QAAA,CAAS,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA,GAAM;AAAA,GACxE,CAAE,OAAO,OAAO,CAAA;AAEhB,EAAA,QAAA,CAAS,IAAA,CAAK3E,uBAAA,CAAQ,CAAA,eAAA,EAAkB,MAAA,CAAO,KAAA,GAAQ,aAAQ,MAAA,CAAO,KAAA,GAAQ,EAAE,CAAA,CAAE,CAAC,CAAA;AACnF,EAAA,QAAA,CAAS,KAAKa,sBAAA,CAAK,SAAA,CAAU,IAAA,CAAK,GAAG,CAAC,CAAC,CAAA;AACvC,EAAA,QAAA,CAAS,IAAA,CAAKC,qBAAG,OAAA,EAAS,IAAIoB,SAAAA,CAAS,CAAC,CAAC,CAAC,CAAA;AAE1C,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,KAAA,GAAQ,EAAA,GAAK,CAAA;AACtC,EAAA,IAAI,OAAO,KAAA,EAAO;AAChB,IAAA,QAAA,CAAS,KAAKnC,sBAAA,CAAO,EAAE,GAAG2E,GAAAA,CAAG,MAAA,CAAO,QAAQ,CAAC,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,OAAO,cAAA,EAAgB,aAAA,EAAe,UAAS,EAAG,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,EACxH;AAEA,EAAA,MAAM,OAAiB,EAAC;AAExB,EAAA,MAAM,YAAA,GAAe,CAAC,GAAG,MAAA,CAAO,MAAM,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAK,CAAA;AACxE,EAAA,IAAA,CAAK,IAAA,CAAK/D,uBAAA,CAAM,EAAE,KAAA,EAAO,qBAAoB,EAAG,YAAA,CAAa,GAAA,CAAI,CAAC,MAAM,WAAA,CAAY,CAAA,EAAG,CAAC,CAAC,CAAC,CAAC,CAAA;AAC3F,EAAA,IAAA,CAAK,KAAKA,uBAAA,CAAM,EAAE,KAAA,EAAO,cAAA,IAAkB,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,CAAC,MAAM,UAAA,CAAW,CAAA,EAAG,CAAC,CAAC,CAAC,CAAC,CAAA;AACrF,EAAA,IAAA,CAAK,KAAKA,uBAAA,CAAM,EAAE,KAAA,EAAO,gBAAA,IAAoB,MAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAM,YAAA,CAAa,CAAI,CAAC,CAAC,CAAC,CAAA;AAE3F,EAAA,QAAA,CAAS,IAAA,CAAK,SAAA,GAAYA,uBAAA,CAAM,EAAE,WAAW,CAAA,aAAA,EAAgB,SAAS,CAAA,CAAA,CAAA,EAAI,EAAG,IAAI,CAAA,GAAIA,uBAAA,CAAM,EAAC,EAAG,IAAI,CAAC,CAAA;AAEpG,EAAA,MAAM,MAAA,GAAS,OAAO,MAAA,GAAS,SAAA;AAC/B,EAAA,OAAOI,yBAAA;AAAA,IACL;AAAA,MACE,KAAA,EAAO,QAAA;AAAA,MACP,IAAA,EAAM,KAAA;AAAA,MACN,YAAA,EAAcC,2BAAA,CAAU,MAAA,CAAO,KAAA,IAAS,iBAAiB,CAAA;AAAA,MACzD,KAAA,EAAO0D,GAAAA,CAAG,MAAA,CAAO,KAAK,CAAA;AAAA,MACtB,MAAA,EAAQA,IAAG,MAAM,CAAA;AAAA,MACjB,OAAA,EAAS,OAAOA,GAAAA,CAAG,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA,EAAIA,GAAAA,CAAG,MAAM,CAAC,CAAA,CAAA;AAAA,MAC9C,mBAAA,EAAqB;AAAA,KACvB;AAAA,IACA;AAAA,GACF;AACF;AAEO,SAAS,aAAA,CAAc,WAAgC,MAAA,EAA+B;AAC3F,EAAA,MAAM,MAAM,OAAO,SAAA,KAAc,QAAA,GAAW,YAAA,CAAa,SAAS,CAAA,GAAI,SAAA;AACtE,EAAA,MAAM,MAAA,GAASD,eAAc,GAAG,CAAA;AAChC,EAAA,OAAO,mBAAA,CAAoB,QAAQ,MAAM,CAAA;AAC3C;;;ACvPO,IAAM,OAAA,GAAyB;AAAA,EACpC,IAAA,EAAM,SAAA;AAAA,EACN,OAAO1E,KAAAA,EAAuB;AAC5B,IAAA,KAAA,MAAW,GAAA,IAAOA,KAAAA,CAAK,KAAA,CAAM,OAAO,CAAA,EAAG;AACrC,MAAA,MAAM,CAAA,GAAI,IAAI,IAAA,EAAK;AACnB,MAAA,IAAI,CAAC,CAAA,EAAG;AACR,MAAA,IAAI,EAAE,UAAA,CAAW,GAAG,KAAK,CAAA,CAAE,UAAA,CAAW,IAAI,CAAA,EAAG;AAC7C,MAAA,OAAO,wBAAA,CAAyB,KAAK,CAAC,CAAA;AAAA,IACxC;AACA,IAAA,OAAO,KAAA;AAAA,EACT,CAAA;AAAA,EACA,KAAA,EAAO,YAAA;AAAA,EACP,MAAA,CAAOA,OAAc,MAAA,EAA+B;AAClD,IAAA,OAAO,aAAA,CAAcA,OAAM,MAAM,CAAA;AAAA,EACnC;AACF;;;ACoCA,IAAM,gBAAA,uBAAuB,GAAA,CAAI;AAAA,EAC/B,gBAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAC,CAAA;AAEM,SAAS,oBAAoB,GAAA,EAAmC;AACrE,EAAA,IAAI,eAAe,KAAA,EAAO;AACxB,IAAA,MAAM,MAAA,GAAS,GAAA;AAMf,IAAA,MAAM,cAAA,GAAiB,OAAO,MAAA,CAAO,IAAA,KAAS,QAAA;AAC9C,IAAA,MAAM,cAAc,CAAC,cAAA,IAAkB,gBAAA,CAAiB,GAAA,CAAI,IAAI,IAAI,CAAA;AACpE,IAAA,MAAM,MAAA,GACJ,OAAO,MAAA,CAAO,MAAA,KAAW,QAAA,GACrB,MAAA,CAAO,MAAA,GACP,WAAA,GACA,eAAA,CAAgB,GAAA,CAAI,KAAK,CAAA,GACzB,MAAA;AAEN,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,OAAA;AAAA,MACV,IAAA,EAAM,cAAc,YAAA,GAAe,aAAA;AAAA,MACnC,MAAM,OAAO,MAAA,CAAO,IAAA,KAAS,QAAA,GAAW,OAAO,IAAA,GAAO,MAAA;AAAA,MACtD,QAAQ,OAAO,MAAA,CAAO,MAAA,KAAW,QAAA,GAAW,OAAO,MAAA,GAAS,MAAA;AAAA,MAC5D,MAAA;AAAA,MACA,OAAA,EAAS,cACL,CAAA,aAAA,EAAgB,GAAA,CAAI,IAAI,CAAA,EAAA,EAAK,GAAA,CAAI,OAAO,CAAA,CAAA,GACxC,GAAA,CAAI,OAAA;AAAA,MACR,IAAA,EACE,OAAO,MAAA,CAAO,IAAA,KAAS,WACnB,MAAA,CAAO,IAAA,GACP,cACA,sHAAA,GACA,MAAA;AAAA,MACN,KAAA,EAAO;AAAA,KACT;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,OAAA;AAAA,IACV,IAAA,EAAM,eAAA;AAAA,IACN,OAAA,EAAS,OAAO,GAAG,CAAA;AAAA,IACnB,KAAA,EAAO;AAAA,GACT;AACF;AAEO,SAAS,mBAAA,CACd,WAAA,EACA,IAAA,EACA,MAAA,GAAkC,EAAC,EAC3B;AACR,EAAA,MAAM,QAAA,GAAW,IAAA,GACb,CAAA,EAAG,IAAI,CAAA,8BAAA,CAAA,GACP,uCAAA;AACJ,EAAA,MAAM,MAAA,GACJ,WAAA,CAAY,CAAC,CAAA,EAAG,OAAA,IAAW,qCAAA;AAC7B,EAAA,MAAM,QAAQ0B,SAAAA,CAAS,MAAA,EAAQ,EAAE,CAAA,CAAE,KAAA,CAAM,GAAG,CAAC,CAAA;AAC7C,EAAA,MAAM,SAAS,WAAA,CAAY,CAAC,GAAG,MAAA,GAC3BA,SAAAA,CAAS,WAAW,WAAA,CAAY,CAAC,CAAA,CAAE,MAAM,IAAI,EAAE,CAAA,CAAE,MAAM,CAAA,EAAG,CAAC,IAC3D,EAAC;AACL,EAAA,MAAM,IAAA,GAAO,2DAAA;AACb,EAAA,MAAM,KAAA,GAAQ,GAAA;AACd,EAAA,MAAM,UAAA,GAAa,EAAA;AACnB,EAAA,MAAM,MAAA,GAAS,GAAA,GAAA,CAAO,KAAA,CAAM,MAAA,GAAS,OAAO,MAAA,IAAU,UAAA;AACtD,EAAA,MAAM,UAAA,GACJ,OAAO,UAAA,IAAc,sCAAA;AAEvB,EAAA,MAAM,QAAA,GAAW;AAAA,IACfzB,wBAAM,QAAQ,CAAA;AAAA,IACda,sBAAA,CAAK,CAAA,EAAG,QAAQ,CAAA,EAAA,EAAK,MAAM,CAAA,CAAE,CAAA;AAAA,IAC7BC,oBAAA;AAAA,MACE,OAAA;AAAA,MACA,EAAC;AAAA,MACD;AAAA,wCAAA,EACoCE,2BAAA,CAAU,UAAU,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAO3D;AAAA,IACAF,oBAAA,CAAG,GAAA,EAAK,EAAE,KAAA,EAAO,2BAA0B,EAAG;AAAA,MAC5CP,sBAAA,CAAK;AAAA,QACH,CAAA,EAAG,CAAA;AAAA,QACH,CAAA,EAAG,CAAA;AAAA,QACH,OAAO,KAAA,GAAQ,CAAA;AAAA,QACf,QAAQ,MAAA,GAAS,CAAA;AAAA,QACjB,EAAA,EAAI,CAAA;AAAA,QACJ,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,MACDA,sBAAA,CAAK;AAAA,QACH,CAAA,EAAG,EAAA;AAAA,QACH,CAAA,EAAG,EAAA;AAAA,QACH,KAAA,EAAO,CAAA;AAAA,QACP,MAAA,EAAQ,EAAA;AAAA,QACR,EAAA,EAAI,CAAA;AAAA,QACJ,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,MACDA,sBAAA,CAAK;AAAA,QACH,CAAA,EAAG,EAAA;AAAA,QACH,CAAA,EAAG,EAAA;AAAA,QACH,KAAA,EAAO,CAAA;AAAA,QACP,MAAA,EAAQ,CAAA;AAAA,QACR,EAAA,EAAI,CAAA;AAAA,QACJ,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,MACDR,sBAAA;AAAA,QACE,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,OAAO,+BAAA,EAAgC;AAAA,QACvD;AAAA,OACF;AAAA,MACAA,sBAAA;AAAA,QACE,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,OAAO,+BAAA,EAAgC;AAAA,QACvD;AAAA,OACF;AAAA,MACA,GAAG,UAAA,CAAW,KAAA,EAAO,EAAA,EAAI,GAAA,EAAK,YAAY,8BAA8B,CAAA;AAAA,MACxE,GAAG,UAAA;AAAA,QACD,MAAA;AAAA,QACA,EAAA;AAAA,QACA,GAAA,GAAM,KAAA,CAAM,MAAA,GAAS,UAAA,GAAa,EAAA;AAAA,QAClC,UAAA;AAAA,QACA;AAAA,OACF;AAAA,MACAA,sBAAA;AAAA,QACE,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,MAAA,GAAS,EAAA,EAAI,OAAO,+BAAA,EAAgC;AAAA,QAChE;AAAA;AACF,KACD;AAAA,GACH;AAEA,EAAA,OAAOgB,yBAAA;AAAA,IACL;AAAA,MACE,KAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAA,EAAS,CAAA,IAAA,EAAO,KAAK,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AAAA,MAC/B,IAAA,EAAM,KAAA;AAAA,MACN,YAAA,EAAc,QAAA;AAAA,MACd,uBAAA,EAAyB;AAAA,KAC3B;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,UAAA,CACP,IAAA,EACA,CAAA,EACA,CAAA,EACA,YACA,SAAA,EACU;AACV,EAAA,OAAO,IAAA,CAAK,GAAA;AAAA,IAAI,CAAC,GAAA,EAAK,GAAA,KACpBhB,sBAAA,CAAK,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,GAAI,GAAA,GAAM,UAAA,EAAY,KAAA,EAAO,SAAA,IAAa,GAAG;AAAA,GAC5D;AACF;AAEA,SAAS0B,SAAAA,CAAS,OAAe,GAAA,EAAuB;AACtD,EAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA,CAAE,IAAA,EAAK,CAAE,KAAA,CAAM,GAAG,CAAA;AACzD,EAAA,MAAM,OAAiB,EAAC;AACxB,EAAA,IAAI,OAAA,GAAU,EAAA;AAEd,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAA,GAAU,IAAA;AACV,MAAA;AAAA,IACF;AACA,IAAA,IAAI,OAAA,CAAQ,MAAA,GAAS,IAAA,CAAK,MAAA,GAAS,KAAK,GAAA,EAAK;AAC3C,MAAA,OAAA,IAAW,IAAI,IAAI,CAAA,CAAA;AACnB,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,KAAK,OAAO,CAAA;AACjB,IAAA,OAAA,GAAU,IAAA;AAAA,EACZ;AACA,EAAA,IAAI,OAAA,EAAS,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA;AAC9B,EAAA,OAAO,IAAA,CAAK,MAAA,GAAS,CAAA,GAAI,IAAA,GAAO,CAAC,KAAK,CAAA;AACxC;AAEA,SAAS,gBAAgB,KAAA,EAA+C;AACtE,EAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AACnB,EAAA,KAAA,MAAW3B,KAAAA,IAAQ,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA,EAAG;AACpC,IAAA,MAAM,OAAA,GAAUA,MAAK,IAAA,EAAK;AAC1B,IAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,KAAK,CAAA,EAAG;AAC7B,MAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,sBAAA,EAAwB,MAAM,CAAA;AAAA,IACvD;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;;;ACjOA,IAAM,OAAA,GAAU,sBAAA;AAET,SAAS,eAAe,GAAA,EAA4B;AACzD,EAAA,MAAM,SAAwB,EAAC;AAC/B,EAAA,IAAIC,KAAAA,GAAO,GAAA;AAGX,EAAA,MAAM,IAAA,GAAOA,KAAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAC/B,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,UAAA,EAAY,OAAA,EAAS,IAAA,CAAK,CAAC,CAAA,CAAE,WAAA,EAAY,KAAM,GAAA,EAAK,CAAA;AACxE,IAAAA,KAAAA,GAAO,KAAK,CAAC,CAAA;AAAA,EACf;AAEA,EAAA,SAAA,CAAUA,OAAM,MAAA,EAAQ,EAAE,MAAM,KAAA,EAAO,MAAA,EAAQ,OAAO,CAAA;AACtD,EAAA,OAAO,MAAA;AACT;AAQA,SAAS,SAAA,CAAU,GAAA,EAAa,GAAA,EAAoB,KAAA,EAAoB;AACtE,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,IAAI,KAAA,GAAQ,EAAA;AACZ,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACxB,IAAA,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,KAAA,EAAO,IAAA,EAAM,KAAA,CAAM,IAAA,IAAQ,MAAA,EAAW,MAAA,EAAQ,KAAA,CAAM,MAAA,IAAU,QAAW,CAAA;AACzG,IAAA,KAAA,GAAQ,EAAA;AAAA,EACV,CAAA;AAEA,EAAA,OAAO,CAAA,GAAI,IAAI,MAAA,EAAQ;AACrB,IAAA,MAAM,EAAA,GAAK,IAAI,CAAC,CAAA;AAGhB,IAAA,IAAI,OAAO,GAAA,EAAK;AACd,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,OAAA,CAAQ,GAAA,EAAK,IAAI,CAAC,CAAA;AAClC,MAAA,IAAI,MAAM,CAAA,EAAG;AACX,QAAA,UAAA,EAAW;AACX,QAAA,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,GAAA,CAAI,KAAA,CAAM,CAAA,GAAI,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA;AACvD,QAAA,CAAA,GAAI,GAAA,GAAM,CAAA;AACV,QAAA;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IAAI,OAAO,GAAA,EAAK;AACd,MAAA,MAAM,YAAA,GAAe,aAAA,CAAc,GAAA,EAAK,GAAA,EAAK,IAAI,CAAC,CAAA;AAClD,MAAA,IAAI,eAAe,CAAA,IAAK,GAAA,CAAI,YAAA,GAAe,CAAC,MAAM,GAAA,EAAK;AACrD,QAAA,MAAM,UAAA,GAAa,aAAA,CAAc,GAAA,EAAK,GAAA,EAAK,eAAe,CAAC,CAAA;AAC3D,QAAA,IAAI,aAAa,CAAA,EAAG;AAClB,UAAA,UAAA,EAAW;AACX,UAAA,MAAM,QAAuB,EAAC;AAC9B,UAAA,SAAA,CAAU,IAAI,KAAA,CAAM,CAAA,GAAI,GAAG,YAAY,CAAA,EAAG,OAAO,KAAK,CAAA;AACtD,UAAA,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,GAAA,CAAI,KAAA,CAAM,YAAA,GAAe,CAAA,EAAG,UAAU,CAAA,EAAG,KAAA,EAAO,OAAO,CAAA;AACtF,UAAA,CAAA,GAAI,UAAA,GAAa,CAAA;AACjB,UAAA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IAAI,OAAO,GAAA,IAAO,GAAA,CAAI,CAAA,GAAI,CAAC,MAAM,GAAA,EAAK;AACpC,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,OAAA,CAAQ,IAAA,EAAM,IAAI,CAAC,CAAA;AACnC,MAAA,IAAI,MAAM,CAAA,EAAG;AACX,QAAA,UAAA,EAAW;AACX,QAAA,SAAA,CAAU,GAAA,CAAI,KAAA,CAAM,CAAA,GAAI,CAAA,EAAG,GAAG,CAAA,EAAG,GAAA,EAAK,EAAE,GAAG,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,CAAA;AAC9D,QAAA,CAAA,GAAI,GAAA,GAAM,CAAA;AACV,QAAA;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IAAI,OAAO,GAAA,EAAK;AACd,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,OAAA,CAAQ,GAAA,EAAK,IAAI,CAAC,CAAA;AAClC,MAAA,IAAI,MAAM,CAAA,IAAK,GAAA,CAAI,GAAA,GAAM,CAAC,MAAM,GAAA,EAAK;AACnC,QAAA,UAAA,EAAW;AACX,QAAA,SAAA,CAAU,GAAA,CAAI,KAAA,CAAM,CAAA,GAAI,CAAA,EAAG,GAAG,CAAA,EAAG,GAAA,EAAK,EAAE,GAAG,KAAA,EAAO,MAAA,EAAQ,IAAA,EAAM,CAAA;AAChE,QAAA,CAAA,GAAI,GAAA,GAAM,CAAA;AACV,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,KAAA,IAAS,EAAA;AACT,IAAA,CAAA,EAAA;AAAA,EACF;AACA,EAAA,UAAA,EAAW;AACb;AAEA,SAAS,aAAA,CAAc,CAAA,EAAW,EAAA,EAAY,IAAA,EAAsB;AAClE,EAAA,KAAA,IAAS,CAAA,GAAI,IAAA,EAAM,CAAA,GAAI,CAAA,CAAE,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,IAAI,CAAA,CAAE,CAAC,CAAA,KAAM,IAAA,EAAM;AAAE,MAAA,CAAA,EAAA;AAAK,MAAA;AAAA,IAAU;AACpC,IAAA,IAAI,CAAA,CAAE,CAAC,CAAA,KAAM,EAAA,EAAI,OAAO,CAAA;AAAA,EAC1B;AACA,EAAA,OAAO,EAAA;AACT;AAMA,IAAM,UAAA,GAAa,IAAA;AACnB,IAAM,OAAA,GAAU,IAAA;AAChB,IAAM,OAAA,GAAU,IAAA;AAChB,IAAM,WAAA,GAAc,IAAA;AAEb,SAAS,aAAA,CAAc,QAAgC,QAAA,EAA0B;AACtF,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,CAAA,IAAK,UAAA,CAAW,GAAG,QAAQ,CAAA;AAAA,EAC7B;AACA,EAAA,OAAO,CAAA;AACT;AAEA,SAAS,UAAA,CAAW,GAAgB,EAAA,EAAoB;AACtD,EAAA,QAAQ,EAAE,IAAA;AAAM,IACd,KAAK,MAAA,EAAQ;AACX,MAAA,MAAM,EAAA,GAAK,CAAA,CAAE,IAAA,GAAO,OAAA,GAAU,UAAA;AAC9B,MAAA,OAAO,CAAA,CAAE,KAAA,CAAM,MAAA,GAAS,EAAA,GAAK,EAAA;AAAA,IAC/B;AAAA,IACA,KAAK,MAAA;AAEH,MAAA,OAAO,CAAA,CAAE,KAAA,CAAM,MAAA,GAAS,EAAA,GAAK,OAAA,GAAU,CAAA;AAAA,IACzC,KAAK,MAAA;AACH,MAAA,OAAO,aAAA,CAAc,CAAA,CAAE,KAAA,EAAO,EAAE,CAAA;AAAA,IAClC,KAAK,UAAA;AACH,MAAA,OAAO,EAAA,GAAK,WAAA;AAAA;AAElB;AAIO,SAAS,kBAAkB,MAAA,EAAwC;AACxE,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,QAAQ,EAAE,IAAA;AAAM,MACd,KAAK,MAAA;AAAA,MACL,KAAK,MAAA;AACH,QAAA,GAAA,IAAO,CAAA,CAAE,KAAA;AACT,QAAA;AAAA,MACF,KAAK,MAAA;AACH,QAAA,GAAA,IAAO,iBAAA,CAAkB,EAAE,KAAK,CAAA;AAChC,QAAA;AAAA,MACF,KAAK,UAAA;AACH,QAAA,GAAA,IAAO,CAAA,CAAE,UAAU,MAAA,GAAS,MAAA;AAC5B,QAAA;AAAA;AACJ,EACF;AACA,EAAA,OAAO,GAAA;AACT;AAgBO,SAAS,UAAA,CACd,MAAA,EACA,QAAA,EACA,QAAA,EACa;AACb,EAAA,MAAM,QAAqB,EAAC;AAC5B,EAAA,IAAID,QAAsB,EAAC;AAC3B,EAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,EAAA,MAAM,WAAW,MAAM;AACrB,IAAA,KAAA,CAAM,KAAK,EAAE,MAAA,EAAQA,KAAAA,EAAM,KAAA,EAAO,OAAO,CAAA;AACzC,IAAAA,QAAO,EAAC;AACR,IAAA,KAAA,GAAQ,CAAA;AAAA,EACV,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,CAAC,CAAA,EAAgB,CAAA,KAAc;AAChD,IAAA,IAAI,KAAA,GAAQ,CAAA,IAAK,KAAA,GAAQ,CAAA,GAAI,UAAU,QAAA,EAAS;AAChD,IAAAA,KAAAA,CAAK,KAAK,CAAC,CAAA;AACX,IAAA,KAAA,IAAS,CAAA;AAAA,EACX,CAAA;AAEA,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,IAAI,CAAA,CAAE,SAAS,MAAA,EAAQ;AAErB,MAAA,MAAM,KAAA,GAAQ,2BAAA,CAA4B,CAAA,CAAE,KAAK,CAAA;AACjD,MAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,QAAA,MAAM,EAAA,GAAkB,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,CAAA,EAAG,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAO;AACjF,QAAA,MAAM,EAAA,GAAK,UAAA,CAAW,EAAA,EAAI,QAAQ,CAAA;AAClC,QAAA,IAAI,KAAA,GAAQ,CAAA,IAAK,KAAA,GAAQ,EAAA,GAAK,QAAA,EAAU;AAEtC,UAAA,QAAA,EAAS;AACT,UAAA,MAAM,OAAA,GAAU,CAAA,CAAE,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AACnC,UAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC1B,UAAA,MAAM,EAAA,GAAkB,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,OAAA,EAAS,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAO;AACvF,UAAAA,KAAAA,CAAK,KAAK,EAAE,CAAA;AACZ,UAAA,KAAA,GAAQ,UAAA,CAAW,IAAI,QAAQ,CAAA;AAAA,QACjC,CAAA,MAAO;AACL,UAAAA,KAAAA,CAAK,KAAK,EAAE,CAAA;AACZ,UAAA,KAAA,IAAS,EAAA;AAAA,QACX;AAAA,MACF;AAAA,IACF,CAAA,MAAO;AACL,MAAA,UAAA,CAAW,CAAA,EAAG,UAAA,CAAW,CAAA,EAAG,QAAQ,CAAC,CAAA;AAAA,IACvC;AAAA,EACF;AACA,EAAA,QAAA,EAAS;AACT,EAAA,OAAO,KAAA;AACT;AAIA,SAAS,4BAA4B,CAAA,EAAqB;AACxD,EAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AAC5B,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,MAAM,EAAA,GAAK,iBAAA;AACX,EAAA,IAAI,CAAA;AACJ,EAAA,OAAA,CAAQ,CAAA,GAAI,EAAA,CAAG,IAAA,CAAK,CAAC,OAAO,IAAA,EAAM;AAChC,IAAA,GAAA,CAAI,IAAA,CAAK,CAAA,CAAE,CAAC,CAAC,CAAA;AAAA,EACf;AACA,EAAA,OAAO,GAAA,CAAI,MAAA,GAAS,CAAA,GAAI,GAAA,GAAM,CAAC,CAAC,CAAA;AAClC;;;ACjOO,IAAM,iBAAA,GAAN,cAAgC,KAAA,CAAM;AAAA,EAC3C,WAAA,CACE,OAAA,EACOA,KAAAA,EACA,MAAA,EACA,MAAA,EACP;AACA,IAAA,KAAA,CAAMA,UAAS,MAAA,GAAY,CAAA,KAAA,EAAQA,KAAI,CAAA,EAAA,EAAK,OAAO,KAAK,OAAO,CAAA;AAJxD,IAAA,IAAA,CAAA,IAAA,GAAAA,KAAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAGP,IAAA,IAAA,CAAK,IAAA,GAAO,mBAAA;AAAA,EACd;AAAA,EANS,IAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAKX,CAAA;AAEA,IAAM,YAAA,GAAwC,CAAC,KAAA,EAAO,aAAa,CAAA;AACnE,IAAM,uBAAA,GAA0B,GAAA;AAQhC,SAAS,cAAA,CAAeA,OAAc,GAAA,EAAuB;AAC3D,EAAA,MAAM,OAAOA,KAAAA,CAAK,OAAA,CAAQ,QAAA,EAAU,EAAE,EAAE,IAAA,EAAK;AAC7C,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AAC5B,EAAA,IAAI,MAAM,CAAA,EAAG;AACb,EAAA,MAAM,GAAA,GAAM,KAAK,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,CAAE,IAAA,GAAO,WAAA,EAAY;AAClD,EAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,CAAC,EAAE,IAAA,EAAK;AACrC,EAAA,IAAI,GAAA,KAAQ,OAAA,IAAY,YAAA,CAAmC,QAAA,CAAS,GAAG,CAAA,EAAG;AACxE,IAAA,GAAA,CAAI,KAAA,GAAQ,GAAA;AAAA,EACd,CAAA,MAAA,IAAW,QAAQ,OAAA,EAAS;AAC1B,IAAA,GAAA,CAAI,aAAA,GAAgB,GAAA;AAAA,EACtB,CAAA,MAAA,IAAW,QAAQ,eAAA,EAAiB;AAClC,IAAA,MAAM,CAAA,GAAI,OAAO,GAAG,CAAA;AACpB,IAAA,IAAI,MAAA,CAAO,SAAS,CAAC,CAAA,IAAK,KAAK,EAAA,IAAM,CAAA,IAAK,GAAA,EAAM,GAAA,CAAI,aAAA,GAAgB,CAAA;AAAA,EACtE;AACF;AAEA,SAAS,QAAA,CAAS,EAAA,EAAY,KAAA,EAAe,KAAA,EAA4B;AACvE,EAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,cAAA,CAAe,KAAK,CAAA,EAAG,KAAA,EAAO,QAAA,EAAU,EAAC,EAAE;AACzE;AAEO,SAAS,aAAaC,KAAAA,EAA0B;AACrD,EAAA,MAAM,QAAA,GAAWA,KAAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AACnC,EAAA,IAAI,UAAA,GAAa,CAAA;AAGjB,EAAA,IAAI,SAAS,CAAC,CAAA,EAAG,MAAK,CAAE,WAAA,OAAkB,SAAA,EAAW;AACnD,IAAA,QAAA,CAAS,KAAA,EAAM;AACf,IAAA,UAAA,GAAa,CAAA;AAAA,EACf;AACA,EAAA,MAAM,KAAA,GAAQ,QAAA;AAEd,EAAA,MAAM,UAAA,GAAyB,EAAE,KAAA,EAAO,KAAA,EAAO,eAAe,uBAAA,EAAwB;AACtF,EAAA,IAAI,IAAA,GAA2B,IAAA;AAC/B,EAAA,IAAI6E,UAAAA,GAAY,CAAA;AAChB,EAAA,MAAM1D,OAAAA,GAAS,MAAM,CAAA,CAAA,EAAI0D,UAAAA,EAAW,CAAA,CAAA;AAGpC,EAAA,MAAM,QAAgD,EAAC;AACvD,EAAA,IAAI,gBAAA,GAAmB,CAAA;AAEvB,EAAA,MAAM,MAAA,GAAS,CAAC,IAAA,EAAmB,KAAA,EAAe,QAAgB,MAAA,KAAmB;AACnF,IAAA,OAAO,KAAA,CAAM,MAAA,IAAU,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,CAAE,KAAA,IAAS,KAAA,EAAO,KAAA,CAAM,GAAA,EAAI;AACzE,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,EAAG,IAAA;AACxC,IAAA,IAAI,CAAC,QAAQ,MAAM,IAAI,kBAAkB,kDAAA,EAA+C,MAAA,EAAQ,QAAW,MAAM,CAAA;AACjH,IAAA,IAAA,CAAK,KAAA,GAAQ,OAAO,KAAA,GAAQ,CAAA;AAC5B,IAAA,MAAA,CAAO,QAAA,CAAS,KAAK,IAAI,CAAA;AACzB,IAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,KAAA,EAAO,CAAA;AAAA,EAC5B,CAAA;AAEA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,CAAC,CAAA,IAAK,EAAA;AACxB,IAAA,MAAM,MAAA,GAAS,IAAI,CAAA,GAAI,UAAA;AACvB,IAAA,MAAM9E,KAAAA,GAAO,GAAA,CAAI,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AACnC,IAAA,MAAM,OAAA,GAAUA,MAAK,IAAA,EAAK;AAC1B,IAAA,IAAI,CAAC,OAAA,EAAS;AAEd,IAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,IAAI,CAAA,EAAG;AAC5B,MAAA,cAAA,CAAe,SAAS,UAAU,CAAA;AAClC,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAUA,KAAAA,CAAK,KAAA,CAAM,sBAAsB,CAAA;AACjD,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,CAAC,CAAA,CAAE,MAAA,GAAS,CAAA;AAClC,MAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,CAAC,CAAA,CAAE,IAAA,EAAK;AAC9B,MAAA,MAAM,IAAA,GAAO,QAAA,CAASoB,OAAAA,EAAO,EAAG,OAAO,KAAK,CAAA;AAC5C,MAAA,IAAI,UAAU,CAAA,EAAG;AACf,QAAA,IAAI,MAAM,MAAM,IAAI,kBAAkB,uCAAA,EAAyC,MAAA,EAAQ,QAAWpB,KAAI,CAAA;AACtG,QAAA,IAAA,GAAO,IAAA;AACP,QAAA,KAAA,CAAM,MAAA,GAAS,CAAA;AACf,QAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,KAAA,EAAO,GAAG,CAAA;AAAA,MAC/B,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,IAAA,EAAM,KAAA,EAAO,MAAA,EAAQA,KAAI,CAAA;AAAA,MAClC;AACA,MAAA,gBAAA,GAAmB,KAAA;AACnB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAASA,KAAAA,CAAK,KAAA,CAAM,qBAAqB,CAAA;AAC/C,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,CAAC,CAAA,CAAE,MAAA;AACzB,MAAA,MAAM,QAAQ,gBAAA,GAAmB,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,SAAS,CAAC,CAAA;AAC1D,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,CAAC,CAAA,CAAE,IAAA,EAAK;AAC7B,MAAA,MAAM,IAAA,GAAO,QAAA,CAASoB,OAAAA,EAAO,EAAG,OAAO,KAAK,CAAA;AAC5C,MAAA,MAAA,CAAO,IAAA,EAAM,KAAA,EAAO,MAAA,EAAQpB,KAAI,CAAA;AAChC,MAAA;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,IAAA,EAAM,MAAM,IAAI,kBAAkB,mDAA8C,CAAA;AAErF,EAAA,MAAM,GAAA,GAAkB;AAAA,IACtB,IAAA,EAAM,SAAA;AAAA,IACN,OAAO,UAAA,CAAW,KAAA;AAAA,IAClB,IAAA;AAAA,IACA,eAAe,UAAA,CAAW;AAAA,GAC5B;AACA,EAAA,IAAI,UAAA,CAAW,aAAA,EAAe,GAAA,CAAI,aAAA,GAAgB,UAAA,CAAW,aAAA;AAC7D,EAAA,OAAO,GAAA;AACT;;;AC/GA,IAAMQ,QAAAA,GAAU,EAAA;AAChB,IAAM,WAAA,GAAc,EAAA;AACpB,IAAM,QAAA,GAAW,EAAA;AACjB,IAAM,aAAA,GAAgB,CAAA;AACtB,IAAM,QAAA,GAAW,CAAA;AAGjB,SAAS,aAAa,UAAA,EAA4B;AAChD,EAAA,IAAI,UAAA,IAAc,GAAG,OAAO,EAAA;AAC5B,EAAA,IAAI,UAAA,KAAe,GAAG,OAAO,EAAA;AAC7B,EAAA,OAAO,EAAA;AACT;AAEA,IAAM,YAAA,GAAe,EAAA;AACrB,IAAM,SAAA,GAAY,EAAA;AAClB,IAAM,QAAA,GAAW,EAAA;AAEjB,SAAS,WAAW,KAAA,EAAuB;AACzC,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,YAAA;AACxB,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,SAAA;AACxB,EAAA,OAAO,QAAA;AACT;AAEA,SAAS,aAAa,EAAA,EAAoB;AACxC,EAAA,OAAO,EAAA,GAAK,QAAA;AACd;AAKA,SAAS,WAAA,CAAY,OAAe,aAAA,EAA+B;AACjE,EAAA,IAAI,KAAA,KAAU,CAAA,EAAG,OAAO,aAAA,GAAgB,GAAA;AACxC,EAAA,OAAO,aAAA;AACT;AAUA,SAAS,YAAA,CAAa,MAAmB,QAAA,EAAgC;AACvE,EAAA,MAAM,EAAA,GAAK,UAAA,CAAW,IAAA,CAAK,KAAK,CAAA;AAEhC,EAAA,MAAM,GAAA,GAAM,aAAA,CAAc,IAAA,CAAK,MAAA,EAAQ,EAAE,CAAA;AACzC,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI,OAAO,QAAA,EAAU;AACnB,IAAA,KAAA,GAAQ,CAAC,EAAE,MAAA,EAAQ,IAAA,CAAK,OAAO,KAAA,EAAM,EAAG,KAAA,EAAO,GAAA,EAAK,CAAA;AAAA,EACtD,CAAA,MAAO;AACL,IAAA,KAAA,GAAQ,UAAA,CAAW,IAAA,CAAK,MAAA,EAAQ,QAAA,EAAU,EAAE,CAAA;AAAA,EAC9C;AACA,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,KAAA,MAAW,MAAM,KAAA,EAAO,IAAI,GAAG,KAAA,GAAQ,IAAA,SAAa,EAAA,CAAG,KAAA;AACvD,EAAA,MAAM,EAAA,GAAK,aAAa,EAAE,CAAA;AAG1B,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,MAAA,GAAS,EAAA,GAAK,aAAA;AACnC,EAAA,OAAO,EAAE,OAAO,KAAA,EAAO,IAAA,CAAK,IAAI,EAAA,EAAI,IAAI,GAAG,MAAA,EAAO;AACpD;AAWA,SAAS,YAAA,CACP,cACA,aAAA,EACU;AACV,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,IAAA,GAAO,CAAC,CAAA,KAAmB;AAC/B,IAAA,MAAM,IAAI,YAAA,CAAa,CAAA,EAAG,YAAY,CAAA,CAAE,KAAA,EAAO,aAAa,CAAC,CAAA;AAC7D,IAAA,IAAI,KAAA,CAAM,CAAA,CAAE,KAAK,CAAA,KAAM,UAAa,CAAA,CAAE,KAAA,GAAQ,KAAA,CAAM,CAAA,CAAE,KAAK,CAAA,EAAG,KAAA,CAAM,CAAA,CAAE,KAAK,IAAI,CAAA,CAAE,KAAA;AACjF,IAAA,KAAA,MAAW,CAAA,IAAK,CAAA,CAAE,QAAA,EAAU,IAAA,CAAK,CAAC,CAAA;AAAA,EACpC,CAAA;AACA,EAAA,KAAA,MAAW,CAAA,IAAK,YAAA,EAAc,IAAA,CAAK,CAAC,CAAA;AACpC,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,YAAA,CACP,KAAA,EACA,cAAA,EACA,SAAA,EACS;AACT,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,IAAI,MAAM,SAAS,CAAA,KAAM,MAAA,EAAW,OAAO,EAAE,MAAA,EAAO;AACpD,EAAA,IAAI,QAAA,GAAW,cAAA;AACf,EAAA,MAAA,CAAO,SAAS,CAAA,GAAI,QAAA,GAAW,KAAA,CAAM,SAAS,CAAA,GAAI,CAAA;AAClD,EAAA,KAAA,IAAS,IAAI,SAAA,GAAY,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACjD,IAAA,QAAA,GAAW,WAAW,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA,GAAI,aAAa,CAAC,CAAA;AACnD,IAAA,MAAA,CAAO,CAAC,CAAA,GAAI,QAAA,GAAA,CAAY,KAAA,CAAM,CAAC,KAAK,CAAA,IAAK,CAAA;AAAA,EAC3C;AACA,EAAA,OAAO,EAAE,MAAA,EAAO;AAClB;AAIA,SAAS,UACP,IAAA,EACA,IAAA,EACA,WACA,OAAA,EACA,aAAA,EACA,OACA,GAAA,EACmD;AACnD,EAAA,MAAM,IAAI,YAAA,CAAa,IAAA,EAAM,YAAY,IAAA,CAAK,KAAA,EAAO,aAAa,CAAC,CAAA;AACnE,EAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA;AACnC,EAAA,MAAM,EAAA,GAAK,UAAA,CAAW,IAAA,CAAK,KAAK,CAAA;AAGhC,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,KAAA,EAAO,MAAM,IAAA,CAAK,KAAK,CAAA,IAAK,CAAA,CAAE,KAAK,CAAA;AAEjE,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AAC9B,IAAA,MAAMuE,GAAAA,GAAwB;AAAA,MAC5B,IAAA;AAAA,MACA,CAAA;AAAA,MACA,CAAA,EAAG,IAAA,GAAO,CAAA,CAAE,MAAA,GAAS,CAAA;AAAA,MACrB,IAAA,EAAM,OAAA;AAAA,MACN,WAAA,EAAa,SAAA;AAAA,MACb,UAAA;AAAA,MACA,aAAa,CAAA,CAAE,MAAA;AAAA,MACf,QAAA,EAAU,EAAA;AAAA,MACV,OAAO,CAAA,CAAE;AAAA,KACX;AACA,IAAA,GAAA,CAAI,KAAKA,GAAE,CAAA;AACX,IAAA,OAAO,EAAE,UAAA,EAAYA,GAAAA,EAAI,MAAA,EAAQ,EAAE,MAAA,EAAO;AAAA,EAC5C;AAEA,EAAA,IAAI,MAAA,GAAS,IAAA;AACb,EAAA,MAAM,eAAoC,EAAC;AAC3C,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AAC7C,IAAA,IAAI,CAAA,GAAI,GAAG,MAAA,IAAU,WAAA;AACrB,IAAA,MAAM,EAAE,UAAA,EAAY,GAAA,EAAK,MAAA,EAAO,GAAI,SAAA;AAAA,MAClC,IAAA,CAAK,SAAS,CAAC,CAAA;AAAA,MACf,MAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA;AAAA,MACA,aAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,YAAA,CAAa,KAAK,GAAG,CAAA;AACrB,IAAA,MAAA,IAAU,MAAA;AAAA,EACZ;AACA,EAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,MAAA,EAAQ,SAAS,IAAI,CAAA;AAE/C,EAAA,MAAM,MAAA,GAAS,YAAA,CAAa,CAAC,CAAA,CAAE,CAAA;AAC/B,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,YAAA,CAAa,MAAA,GAAS,CAAC,CAAA,CAAE,CAAA;AACpD,EAAA,MAAM,OAAA,GAAA,CAAW,SAAS,KAAA,IAAS,CAAA;AAEnC,EAAA,MAAM,EAAA,GAAwB;AAAA,IAC5B,IAAA;AAAA,IACA,CAAA;AAAA,IACA,CAAA,EAAG,OAAA;AAAA,IACH,IAAA,EAAM,OAAA;AAAA,IACN,WAAA,EAAa,SAAA;AAAA,IACb,UAAA;AAAA,IACA,aAAa,CAAA,CAAE,MAAA;AAAA,IACf,QAAA,EAAU,EAAA;AAAA,IACV,OAAO,CAAA,CAAE;AAAA,GACX;AACA,EAAA,GAAA,CAAI,KAAK,EAAE,CAAA;AACX,EAAA,OAAO,EAAE,UAAA,EAAY,EAAA,EAAI,MAAA,EAAQ,MAAA,EAAO;AAC1C;AAIA,SAAS,UAAA,CAAW,GAAsB,OAAA,EAA0B;AAClE,EAAA,IAAI,CAAA,CAAE,IAAA,KAAS,QAAA,EAAU,OAAO,CAAA,CAAE,CAAA;AAClC,EAAA,MAAM,GAAA,GAAM,CAAA,CAAE,IAAA,KAAS,MAAA,GAAS,EAAA,GAAK,CAAA;AACrC,EAAA,OAAO,EAAE,CAAA,GAAA,CAAK,OAAA,GAAU,MAAM,CAAC,GAAA,IAAO,EAAE,UAAA,GAAa,CAAA;AACvD;AAEA,SAAS,OAAA,CAAQ,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,EAAA,EAAoB;AACvE,EAAA,MAAM,CAAA,GAAA,CAAK,KAAK,EAAA,IAAM,IAAA;AACtB,EAAA,OAAO,KAAK,EAAA,CAAG,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,EAAI,GAAG,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAA,EAAA,CAAO,KAAK,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,EAAI,GAAG,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA,EAAA,CAAM,KAAK,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,EAAI,GAAG,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA,EAAK,EAAA,CAAG,QAAQ,CAAC,CAAC,IAAI,EAAA,CAAG,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA;AAClK;AAEA,SAAS,aAAa,KAAA,EAAuB;AAC3C,EAAA,IAAI,KAAA,IAAS,GAAG,OAAO,GAAA;AACvB,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,GAAA;AACxB,EAAA,OAAO,GAAA;AACT;AAGA,SAAS,kBAAkB,KAAA,EAAuB;AAChD,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,GAAA;AACxB,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,GAAA;AACxB,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,GAAA;AACxB,EAAA,OAAO,GAAA;AACT;AAIA,SAAS,UAAU,KAAA,EAA+D;AAChF,EAAA,IAAI,OAAO,QAAA,EAAU,IAAA,GAAO,QAAA,EAAU,IAAA,GAAO,WAAW,IAAA,GAAO,CAAA,QAAA;AAC/D,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,MAAM,KAAK,CAAA,CAAE,UAAA;AACb,IAAA,MAAM,KAAK,CAAA,CAAE,WAAA;AACb,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,CAAA,GAAI,EAAA,GAAK,CAAA;AACzB,IAAA,MAAM,MAAA,GAAS,CAAA,CAAE,CAAA,GAAI,EAAA,GAAK,CAAA;AAC1B,IAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,KAAK,CAAA;AAC3B,IAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,MAAM,CAAA;AAC5B,IAAA,IAAA,GAAO,KAAK,GAAA,CAAI,IAAA,EAAM,CAAA,CAAE,CAAA,GAAI,KAAK,CAAC,CAAA;AAClC,IAAA,IAAA,GAAO,KAAK,GAAA,CAAI,IAAA,EAAM,CAAA,CAAE,CAAA,GAAI,KAAK,CAAC,CAAA;AAAA,EACpC;AACA,EAAA,MAAM,KAAKvE,QAAAA,GAAU,IAAA;AACrB,EAAA,MAAM,KAAKA,QAAAA,GAAU,IAAA;AACrB,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,CAAA,CAAE,CAAA,IAAK,EAAA;AACP,IAAA,CAAA,CAAE,CAAA,IAAK,EAAA;AAAA,EACT;AACA,EAAA,OAAO,EAAE,KAAA,EAAQ,IAAA,GAAO,IAAA,GAAQA,QAAAA,GAAU,GAAG,MAAA,EAAS,IAAA,GAAO,IAAA,GAAQA,QAAAA,GAAU,CAAA,EAAE;AACnF;AAIA,SAAS,WAAW,CAAA,EAA8B;AAChD,EAAA,OAAO,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,WAAA,GAAc,IAAI,aAAA,GAAgB,CAAA;AACnD;AAEA,SAAS,UAAA,CAAW,MAAmB,IAAA,EAA2D;AAChG,EAAA,MAAM,QAA6B,EAAC;AACpC,EAAA,MAAM,IAAA,GAAO,CAAC,MAAA,KAAwB;AACpC,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,EAAE,CAAA;AAC9B,IAAA,MAAM,GAAA,GAAM,WAAW,GAAG,CAAA;AAC1B,IAAA,KAAA,MAAW,CAAA,IAAK,OAAO,QAAA,EAAU;AAC/B,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA;AACzB,MAAA,IAAI,KAAA;AACJ,MAAA,IAAI,GAAA,CAAI,SAAS,QAAA,EAAU;AACzB,QAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,GAAa,CAAA;AAC/B,QAAA,KAAA,GAAQ,IAAI,IAAA,KAAS,MAAA,GAAS,IAAI,CAAA,GAAI,KAAA,GAAQ,IAAI,CAAA,GAAI,KAAA;AAAA,MACxD,CAAA,MAAO;AACL,QAAA,KAAA,GAAQ,UAAA,CAAW,KAAK,IAAI,CAAA;AAAA,MAC9B;AACA,MAAA,MAAM,GAAA,GAAM,UAAA,CAAW,GAAA,EAAK,KAAK,CAAA;AACjC,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA,QACT,MAAM,MAAA,CAAO,EAAA;AAAA,QACb,IAAI,CAAA,CAAE,EAAA;AAAA,QACN,MAAM,OAAA,CAAQ,KAAA,EAAO,KAAK,GAAA,EAAK,UAAA,CAAW,GAAG,CAAC,CAAA;AAAA,QAC9C,KAAA,EAAO,EAAA;AAAA,QACP,KAAA,EAAO,YAAA,CAAa,CAAA,CAAE,KAAK;AAAA,OAC5B,CAAA;AACD,MAAA,IAAA,CAAK,CAAC,CAAA;AAAA,IACR;AAAA,EACF,CAAA;AACA,EAAA,IAAA,CAAK,IAAI,CAAA;AACT,EAAA,OAAO,KAAA;AACT;AAIA,SAAS,UAAU,GAAA,EAAsC;AACvD,EAAA,MAAM,OAAO,GAAA,CAAI,IAAA;AACjB,EAAA,MAAM,QAAQ,IAAA,CAAK,QAAA;AACnB,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,SAAS,CAAC,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,UAAU,CAAA;AAC5C,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,KAAA,CAAM,UAAU,CAAA;AAExC,EAAA,MAAM,QAA6B,EAAC;AACpC,EAAA,MAAM,KAAK,GAAA,CAAI,aAAA;AAEf,EAAA,MAAM,QAAQ,YAAA,CAAa,IAAA,EAAM,WAAA,CAAY,CAAA,EAAG,EAAE,CAAC,CAAA;AACnD,EAAA,MAAM,YAAA,GAAe,KAAA,CAAM,KAAA,GAAQ,CAAA,GAAI,aAAa,CAAC,CAAA;AAGrD,EAAA,MAAM,KAAA,GAAQ,aAAa,CAAC,GAAG,YAAY,GAAG,SAAS,GAAG,EAAE,CAAA;AAC5D,EAAA,MAAM,IAAA,GAAO,YAAA,CAAa,KAAA,EAAO,YAAA,EAAc,CAAC,CAAA;AAEhD,EAAA,IAAI,WAAA,GAAc,CAAA;AAClB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,UAAA,CAAW,QAAQ,CAAA,EAAA,EAAK;AAC1C,IAAA,IAAI,CAAA,GAAI,GAAG,WAAA,IAAe,QAAA;AAC1B,IAAA,MAAM,EAAE,MAAA,EAAAwE,OAAAA,EAAO,GAAI,SAAA,CAAU,UAAA,CAAW,CAAC,CAAA,EAAG,WAAA,EAAa,CAAA,EAAG,IAAA,EAAM,EAAA,EAAI,OAAO,KAAK,CAAA;AAClF,IAAA,WAAA,IAAeA,OAAAA;AAAA,EACjB;AACA,EAAA,MAAM,WAAA,GAAc,WAAA;AAEpB,EAAA,MAAM,YAAY,KAAA,CAAM,MAAA;AACxB,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,SAAA,CAAU,QAAQ,CAAA,EAAA,EAAK;AACzC,IAAA,IAAI,CAAA,GAAI,GAAG,UAAA,IAAc,QAAA;AACzB,IAAA,MAAM,EAAE,MAAA,EAAAA,OAAAA,EAAO,GAAI,UAAU,SAAA,CAAU,CAAC,CAAA,EAAG,UAAA,EAAY,UAAA,GAAa,CAAA,EAAG,IAAA,EAAM,EAAA,EAAI,OAAO,KAAK,CAAA;AAC7F,IAAA,UAAA,IAAcA,OAAAA;AAAA,EAChB;AACA,EAAA,MAAM,UAAA,GAAa,UAAA;AACnB,EAAA,KAAA,IAAS,CAAA,GAAI,SAAA,EAAW,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AAC7C,IAAA,KAAA,CAAM,CAAC,CAAA,CAAE,CAAA,GAAI,CAAC,KAAA,CAAM,CAAC,CAAA,CAAE,CAAA;AACvB,IAAA,KAAA,CAAM,CAAC,EAAE,IAAA,GAAO,MAAA;AAAA,EAClB;AAEA,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,WAAA,EAAa,UAAU,CAAA,GAAI,CAAA;AAClD,EAAA,MAAM,QAAA,GAA8B;AAAA,IAClC,IAAA,EAAM,IAAA;AAAA,IACN,CAAA,EAAG,CAAA;AAAA,IACH,CAAA,EAAG,KAAA;AAAA,IACH,IAAA,EAAM,QAAA;AAAA,IACN,WAAA,EAAa,EAAA;AAAA,IACb,YAAY,KAAA,CAAM,KAAA;AAAA,IAClB,aAAa,KAAA,CAAM,MAAA;AAAA,IACnB,QAAA,EAAU,WAAW,CAAC,CAAA;AAAA,IACtB,OAAO,KAAA,CAAM;AAAA,GACf;AACA,EAAA,KAAA,CAAM,KAAK,QAAQ,CAAA;AAEnB,EAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,UAAU,KAAK,CAAA;AACzC,EAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,IAAA,CAAK,EAAA,EAAI,CAAC,CAAC,CAAC,CAAA;AACrD,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,IAAA,EAAM,IAAI,CAAA;AAEnC,EAAA,OAAO,EAAE,OAAO,MAAA,EAAQ,KAAA,EAAO,OAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,GAAA,CAAI,KAAA,EAAM;AACvE;AAIA,SAAS,iBAAiB,GAAA,EAAsC;AAC9D,EAAA,MAAM,OAAO,GAAA,CAAI,IAAA;AACjB,EAAA,MAAM,QAA6B,EAAC;AACpC,EAAA,MAAM,KAAK,GAAA,CAAI,aAAA;AAEf,EAAA,MAAM,QAAQ,YAAA,CAAa,IAAA,EAAM,WAAA,CAAY,CAAA,EAAG,EAAE,CAAC,CAAA;AACnD,EAAA,MAAM,YAAA,GAAe,KAAA,CAAM,KAAA,GAAQ,CAAA,GAAI,aAAa,CAAC,CAAA;AAErD,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,IAAA,CAAK,QAAA,EAAU,EAAE,CAAA;AAC5C,EAAA,MAAM,IAAA,GAAO,YAAA,CAAa,KAAA,EAAO,YAAA,EAAc,CAAC,CAAA;AAChD,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AAC7C,IAAA,IAAI,CAAA,GAAI,GAAG,MAAA,IAAU,QAAA;AACrB,IAAA,MAAM,EAAE,MAAA,EAAAA,OAAAA,EAAO,GAAI,UAAU,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,IAAA,EAAM,EAAA,EAAI,OAAO,KAAK,CAAA;AAChF,IAAA,MAAA,IAAUA,OAAAA;AAAA,EACZ;AACA,EAAA,MAAM,WAAA,GAAc,MAAA;AAEpB,EAAA,MAAM,QAAA,GAA8B;AAAA,IAClC,IAAA,EAAM,IAAA;AAAA,IACN,CAAA,EAAG,CAAA;AAAA,IACH,GAAG,WAAA,GAAc,CAAA;AAAA,IACjB,IAAA,EAAM,QAAA;AAAA,IACN,WAAA,EAAa,EAAA;AAAA,IACb,YAAY,KAAA,CAAM,KAAA;AAAA,IAClB,aAAa,KAAA,CAAM,MAAA;AAAA,IACnB,QAAA,EAAU,WAAW,CAAC,CAAA;AAAA,IACtB,OAAO,KAAA,CAAM;AAAA,GACf;AACA,EAAA,KAAA,CAAM,KAAK,QAAQ,CAAA;AAEnB,EAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,UAAU,KAAK,CAAA;AACzC,EAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,IAAA,CAAK,EAAA,EAAI,CAAC,CAAC,CAAC,CAAA;AACrD,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,IAAA,EAAM,IAAI,CAAA;AAEnC,EAAA,OAAO,EAAE,OAAO,MAAA,EAAQ,KAAA,EAAO,eAAe,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,GAAA,CAAI,KAAA,EAAM;AAC/E;AAIO,SAAS,cAAc,GAAA,EAAsC;AAClE,EAAA,MAAM,QAAsB,GAAA,CAAI,KAAA;AAChC,EAAA,IAAI,KAAA,KAAU,aAAA,EAAe,OAAO,gBAAA,CAAiB,GAAG,CAAA;AACxD,EAAA,OAAO,UAAU,GAAG,CAAA;AACtB;;;ACpXA,SAAS,YAAY,KAAA,EAAsB;AACzC,EAAA,OAAO,KAAA,CAAM,aAAA,CAAc,MAAA,IAAU,CAAA,GAAI,GAAA,GAAM,CAAA;AACjD;AAEA,SAAS,YAAA,CAAa,OAAc,WAAA,EAA6B;AAC/D,EAAA,IAAI,WAAA,GAAc,CAAA,EAAG,OAAO,KAAA,CAAM,WAAA;AAClC,EAAA,OAAO,KAAA,CAAM,aAAA,CAAc,WAAA,GAAc,KAAA,CAAM,cAAc,MAAM,CAAA;AACrE;AAeA,SAASC,YACPjF,KAAAA,EACA,KAAA,EACA,IACA,QAAA,EACA,UAAA,EACA,YACA,KAAA,EACkB;AAClB,EAAA,MAAM,SAAA,GAAY,KAAK,QAAA,GAAW,IAAA;AAGlC,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,cAAwB,EAAC;AAC/B,EAAA,IAAI,MAAA,GAAS,KAAA;AAEb,EAAA,MAAM,IAAA,GAAO,CAAC,GAAA,EAAkB,aAAA,KAA2B;AACzD,IAAA,QAAQ,IAAI,IAAA;AAAM,MAChB,KAAK,MAAA,EAAQ;AACX,QAAA,MAAM,CAAA,GAAI,YAAA,CAAa,GAAA,EAAK,QAAQ,CAAA;AACpC,QAAA,MAAA,CAAO,IAAA;AAAA,UACL,KAAA,CAAM;AAAA,YACJ,CAAA,EAAG,MAAA;AAAA,YACH,CAAA,EAAG,SAAA;AAAA,YACH,IAAA,EAAM,aAAA,GAAgB,KAAA,CAAM,SAAA,GAAY,KAAA,CAAM,IAAA;AAAA,YAC9C,aAAA,EAAe,GAAA,CAAI,IAAA,GAAO,GAAA,GAAM,UAAA;AAAA,YAChC,YAAA,EAAc,GAAA,CAAI,MAAA,GAAS,QAAA,GAAW,MAAA;AAAA,YACtC,iBAAA,EAAmB,gBAAgB,WAAA,GAAc;AAAA,WACnD,EAAG,IAAI,KAAK;AAAA,SACd;AACA,QAAA,MAAA,IAAU,CAAA;AACV,QAAA;AAAA,MACF;AAAA,MACA,KAAK,MAAA,EAAQ;AACX,QAAA,MAAM,CAAA,GAAI,YAAA,CAAa,GAAA,EAAK,QAAQ,CAAA;AAEpC,QAAA,WAAA,CAAY,KAAKS,sBAAA,CAAK;AAAA,UACpB,CAAA,EAAG,MAAA;AAAA,UACH,CAAA,EAAG,KAAK,QAAA,GAAW,GAAA;AAAA,UACnB,KAAA,EAAO,CAAA;AAAA,UACP,QAAQ,QAAA,GAAW,GAAA;AAAA,UACnB,EAAA,EAAI,CAAA;AAAA,UACJ,EAAA,EAAI,CAAA;AAAA,UACJ,MAAM,KAAA,CAAM;AAAA,SACb,CAAC,CAAA;AACF,QAAA,MAAA,CAAO,IAAA;AAAA,UACL,KAAA,CAAM;AAAA,YACJ,GAAG,MAAA,GAAS,CAAA;AAAA,YACZ,CAAA,EAAG,SAAA;AAAA,YACH,MAAM,KAAA,CAAM,MAAA;AAAA,YACZ,aAAA,EAAe,0DAAA;AAAA,YACf,aAAa,QAAA,GAAW;AAAA,WAC1B,EAAG,IAAI,KAAK;AAAA,SACd;AACA,QAAA,MAAA,IAAU,CAAA;AACV,QAAA;AAAA,MACF;AAAA,MACA,KAAK,MAAA,EAAQ;AAEX,QAAA,MAAM,MAAA,GAAS,CAAA,SAAA,EAAYS,2BAAA,CAAU,GAAA,CAAI,IAAI,CAAC,CAAA,iCAAA,CAAA;AAC9C,QAAA,MAAM,aAAa,MAAA,CAAO,MAAA;AAC1B,QAAA,KAAA,MAAW,SAAS,GAAA,CAAI,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,IAAI,IAAI,CAAA;AAEnD,QAAA,MAAM,cAAc,MAAA,CAAO,MAAA,CAAO,UAAU,CAAA,CAAE,KAAK,EAAE,CAAA;AACrD,QAAA,MAAA,CAAO,IAAA,CAAK,MAAA,GAAS,WAAA,GAAc,MAAM,CAAA;AACzC,QAAA;AAAA,MACF;AAAA,MACA,KAAK,UAAA,EAAY;AACf,QAAA,MAAM,OAAO,QAAA,GAAW,IAAA;AACxB,QAAA,MAAM,IAAA,GAAO,MAAA;AACb,QAAA,MAAM,IAAA,GAAO,KAAK,IAAA,GAAO,CAAA;AACzB,QAAA,WAAA,CAAY,KAAKT,sBAAA,CAAK;AAAA,UACpB,CAAA,EAAG,IAAA;AAAA,UACH,CAAA,EAAG,IAAA;AAAA,UACH,KAAA,EAAO,IAAA;AAAA,UACP,MAAA,EAAQ,IAAA;AAAA,UACR,EAAA,EAAI,CAAA;AAAA,UACJ,EAAA,EAAI,CAAA;AAAA,UACJ,IAAA,EAAM,GAAA,CAAI,OAAA,GAAU,KAAA,CAAM,YAAA,GAAe,MAAA;AAAA,UACzC,MAAA,EAAQ,GAAA,CAAI,OAAA,GAAU,KAAA,CAAM,eAAe,KAAA,CAAM,cAAA;AAAA,UACjD,cAAA,EAAgB;AAAA,SACjB,CAAC,CAAA;AACF,QAAA,IAAI,IAAI,OAAA,EAAS;AAEf,UAAA,MAAM,IAAI,CAAA,EAAA,EAAA,CAAM,IAAA,GAAO,OAAO,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,EAAA,CAAK,OAAO,IAAA,GAAO,GAAA,EAAK,QAAQ,CAAC,CAAC,OAAO,IAAA,GAAO,IAAA,GAAO,MAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,EAAA,CAAK,OAAO,IAAA,GAAO,IAAA,EAAM,QAAQ,CAAC,CAAC,OAAO,IAAA,GAAO,IAAA,GAAO,MAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,EAAA,CAAK,IAAA,GAAO,OAAO,IAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA;AAC/N,UAAA,WAAA,CAAY,KAAKG,sBAAA,CAAQ;AAAA,YACvB,CAAA,EAAG,CAAA;AAAA,YACH,IAAA,EAAM,MAAA;AAAA,YACN,MAAA,EAAQ,SAAA;AAAA,YACR,cAAA,EAAgB,CAAA;AAAA,YAChB,gBAAA,EAAkB,OAAA;AAAA,YAClB,iBAAA,EAAmB;AAAA,WACpB,CAAC,CAAA;AAAA,QACJ;AACA,QAAA,MAAA,IAAU,OAAO,QAAA,GAAW,IAAA;AAC5B,QAAA;AAAA,MACF;AAAA;AACF,EACF,CAAA;AAEA,EAAA,KAAA,MAAW,GAAA,IAAOZ,KAAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,GAAG,CAAA;AAEvC,EAAA,MAAM,WAAA,GAAcgB,qBAAG,MAAA,EAAQ;AAAA,IAC7B,aAAA,EAAe,UAAA;AAAA,IACf,WAAA,EAAa,QAAA;AAAA,IACb,aAAA,EAAe;AAAA,GACjB,EAAG,MAAA,CAAO,IAAA,CAAK,EAAE,CAAC,CAAA;AAClB,EAAA,OAAO,EAAE,aAAa,WAAA,EAAY;AACpC;AAEA,SAAS,YAAA,CAAa,KAAkB,EAAA,EAAoB;AAC1D,EAAA,QAAQ,IAAI,IAAA;AAAM,IAChB,KAAK,MAAA;AACH,MAAA,OAAO,IAAI,KAAA,CAAM,MAAA,GAAS,EAAA,IAAM,GAAA,CAAI,OAAO,IAAA,GAAO,IAAA,CAAA;AAAA,IACpD,KAAK,MAAA;AACH,MAAA,OAAO,GAAA,CAAI,KAAA,CAAM,MAAA,GAAS,EAAA,GAAK,IAAA,GAAO,CAAA;AAAA,IACxC,KAAK,MAAA,EAAQ;AACX,MAAA,IAAI,CAAA,GAAI,CAAA;AACR,MAAA,KAAA,MAAW,KAAK,GAAA,CAAI,KAAA,EAAO,CAAA,IAAK,YAAA,CAAa,GAAG,EAAE,CAAA;AAClD,MAAA,OAAO,CAAA;AAAA,IACT;AAAA,IACA,KAAK,UAAA;AACH,MAAA,OAAO,EAAA,GAAK,OAAO,EAAA,GAAK,IAAA;AAAA;AAE9B;AAGA,SAAS,KAAA,CAAM,OAAoD,OAAA,EAAyB;AAC1F,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC1C,IAAA,IAAI,MAAM,MAAA,EAAW;AACrB,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,CAAC,CAAA,EAAA,EAAK,OAAO,CAAA,KAAM,QAAA,GAAW,MAAA,CAAO,CAAC,IAAIE,2BAAA,CAAU,MAAA,CAAO,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,EACjF;AACA,EAAA,OAAO,CAAA,OAAA,EAAU,MAAM,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,EAAIA,2BAAA,CAAU,OAAO,CAAC,CAAA,QAAA,CAAA;AACxD;AAcA,SAASgE,WAAAA,CACP,CAAA,EACA,KAAA,EACA,KAAA,EACA,UAAA,EACQ;AACR,EAAA,MAAM,MAAA,GAAS,CAAA,CAAE,IAAA,CAAK,KAAA,KAAU,CAAA;AAChC,EAAA,MAAM,MAAA,GAAS,CAAA,CAAE,IAAA,CAAK,KAAA,KAAU,CAAA;AAChC,EAAA,MAAM,KAAK,CAAA,CAAE,QAAA;AACb,EAAA,MAAM,EAAA,GAAK,aAAa,EAAE,CAAA;AAC1B,EAAA,MAAM,SAAA,GAAY,EAAE,KAAA,CAAM,MAAA;AAI1B,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,WAAA,GAAc,CAAA;AACnC,EAAA,MAAMC,cAAa,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,WAAA,GAAc,IAAI,aAAA,GAAgB,CAAA;AAE7D,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,MAAM,cAAwB,EAAC;AAC/B,EAAA,MAAM,MAAA,GAAS,MAAA,GAAS,GAAA,GAAM,MAAA,GAAS,GAAA,GAAM,GAAA;AAI7C,EAAA,MAAM,QAAA,GAAW,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,UAAA,GAAa,CAAA;AAEtC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,SAAA,EAAW,CAAA,EAAA,EAAK;AAClC,IAAA,MAAMnF,KAAAA,GAAO,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA;AACtB,IAAA,MAAM,EAAA,GAAK,IAAA,GAAA,CAAQ,CAAA,GAAI,GAAA,IAAO,EAAA;AAC9B,IAAA,MAAM,CAAA,GAAIiF,YAAWjF,KAAAA,EAAM,QAAA,EAAU,IAAI,EAAA,EAAI,UAAA,EAAY,QAAQ,KAAK,CAAA;AACtE,IAAA,WAAA,CAAY,IAAA,CAAK,GAAG,CAAA,CAAE,WAAW,CAAA;AACjC,IAAA,QAAA,CAAS,IAAA,CAAK,EAAE,WAAW,CAAA;AAAA,EAC7B;AAIA,EAAA,MAAM,GAAA,GAAM,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,UAAA,GAAa,CAAA;AACjC,EAAA,MAAM,GAAA,GAAM,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,UAAA,GAAa,CAAA;AACjC,EAAA,MAAM,KAAK,iBAAA,CAAkB,CAAA,CAAE,KAAK,KAAK,CAAA,GAAI,YAAY,KAAK,CAAA;AAC9D,EAAA,QAAA,CAAS,IAAA;AAAA,IACPgB,qBAAG,MAAA,EAAQ;AAAA,MACT,EAAA,EAAI,GAAA;AAAA,MACJ,EAAA,EAAImE,WAAAA;AAAA,MACJ,EAAA,EAAI,GAAA;AAAA,MACJ,EAAA,EAAIA,WAAAA;AAAA,MACJ,MAAA,EAAQ,KAAA;AAAA,MACR,cAAA,EAAgB,EAAA;AAAA,MAChB,gBAAA,EAAkB;AAAA,KACnB;AAAA,GACH;AAEA,EAAA,MAAM,GAAA,GAAM,MAAA,GACR,2BAAA,GACA,MAAA,GACE,wBAAA,GACA,wBAAA;AAEN,EAAA,OAAOtE,uBAAA;AAAA,IACL;AAAA,MACE,KAAA,EAAO,GAAA;AAAA,MACP,cAAA,EAAgB,EAAE,IAAA,CAAK,EAAA;AAAA,MACvB,YAAA,EAAc,EAAE,IAAA,CAAK,KAAA;AAAA,MACrB,mBAAmB,CAAA,CAAE;AAAA,KACvB;AAAA,IACA,CAAC,GAAG,WAAA,EAAa,GAAG,QAAQ;AAAA,GAC9B;AACF;AAIO,SAAS,gBAAA,CACd,GAAA,EACA,SAAA,GAAY,SAAA,EACZ,aAAa,sCAAA,EACL;AACR,EAAA,MAAM,KAAA,GAAQuE,qCAAA,CAAoB,GAAA,CAAI,aAAA,IAAiB,SAAS,CAAA;AAChE,EAAA,MAAM,MAAA,GAAS,cAAc,GAAG,CAAA;AAChC,EAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,MAAA,CAAO,MAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,IAAA,CAAK,EAAA,EAAI,CAAC,CAAC,CAAC,CAAA;AAE5D,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,KAAA,MAAW,CAAA,IAAK,OAAO,KAAA,EAAO;AAC5B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA;AAC5B,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,KAAA,EAAO,MAAA,CAAO,WAAW,CAAA;AACpD,IAAA,QAAA,CAAS,IAAA;AAAA,MACPxE,sBAAA,CAAQ;AAAA,QACN,GAAG,CAAA,CAAE,IAAA;AAAA,QACL,IAAA,EAAM,MAAA;AAAA,QACN,MAAA,EAAQ,KAAA;AAAA,QACR,gBAAgB,CAAA,CAAE,KAAA;AAAA,QAClB,gBAAA,EAAkB;AAAA,OACnB;AAAA,KACH;AAAA,EACF;AAEA,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,KAAA,MAAW,CAAA,IAAK,OAAO,KAAA,EAAO;AAC5B,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,IAAA,CAAK,KAAA,KAAU,CAAA,GAAI,MAAM,WAAA,GAAc,YAAA,CAAa,KAAA,EAAO,CAAA,CAAE,WAAW,CAAA;AACxF,IAAA,QAAA,CAAS,KAAKsE,WAAAA,CAAW,CAAA,EAAG,KAAA,EAAO,KAAA,EAAO,UAAU,CAAC,CAAA;AAAA,EACvD;AAEA,EAAA,MAAMhF,SAAQ,GAAA,CAAI,KAAA,IAAS,iBAAA,CAAkB,GAAA,CAAI,KAAK,MAAM,CAAA;AAE5D,EAAA,OAAOe,yBAAA;AAAA,IACL;AAAA,MACE,OAAA,EAAS,CAAA,IAAA,EAAO,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,EAAI,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA;AAAA,MACnE,KAAA,EAAO,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,MAC7B,MAAA,EAAQ,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAA;AAAA,MAC/B,IAAA,EAAM,mBAAA;AAAA,MACN,YAAA,EAAc,CAAA,SAAA,EAAYC,2BAAA,CAAUhB,MAAK,CAAC,CAAA;AAAA,KAC5C;AAAA,IACA;AAAA,MACEA,wBAASA,MAAK,CAAA;AAAA,MACda,sBAAA,CAAQ,GAAG,MAAA,CAAO,KAAK,iBAAiB,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA,MAAA,CAAQ,CAAA;AAAA,MACnEN,sBAAA,CAAK,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAG,KAAA,EAAO,MAAA,CAAO,KAAA,EAAO,QAAQ,MAAA,CAAO,MAAA,EAAQ,IAAA,EAAM,KAAA,CAAM,IAAI,CAAA;AAAA,MAC/EI,wBAAM,EAAE,KAAA,EAAO,2BAA2B,aAAA,EAAe,MAAA,IAAU,QAAQ,CAAA;AAAA,MAC3EA,uBAAA,CAAM,EAAE,KAAA,EAAO,yBAAA,IAA6B,QAAQ;AAAA;AACtD,GACF;AACF;AAEO,SAAS,aAAA,CAAcZ,OAAc,IAAA,EAAwD;AAClG,EAAA,MAAM,GAAA,GAAM,aAAaA,KAAI,CAAA;AAC7B,EAAA,OAAO,gBAAA,CAAiB,GAAA,EAAK,IAAA,EAAM,KAAA,EAAO,MAAM,UAAU,CAAA;AAC5D;;;ACtTO,IAAM,OAAA,GAAyB;AAAA,EACpC,IAAA,EAAM,SAAA;AAAA,EACN,OAAOA,KAAAA,EAAuB;AAC5B,IAAA,MAAM,KAAA,GAAQA,KAAAA,CAAK,IAAA,EAAK,CAAE,MAAM,IAAI,CAAA;AACpC,IAAA,MAAM,QAAQ,KAAA,CAAM,CAAC,GAAG,IAAA,EAAK,CAAE,aAAY,IAAK,EAAA;AAChD,IAAA,IAAI,KAAA,CAAM,UAAA,CAAW,SAAS,CAAA,EAAG,OAAO,IAAA;AAExC,IAAA,KAAA,MAAW,MAAM,KAAA,EAAO;AACtB,MAAA,MAAM,CAAA,GAAI,GAAG,IAAA,EAAK;AAClB,MAAA,IAAI,CAAC,CAAA,EAAG;AACR,MAAA,IAAI,CAAA,CAAE,UAAA,CAAW,IAAI,CAAA,EAAG;AACxB,MAAA,OAAO,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,IACzB;AACA,IAAA,OAAO,KAAA;AAAA,EACT,CAAA;AAAA,EACA,KAAA,EAAO,YAAA;AAAA,EAEP,MAAA,CAAOA,OAAc,MAAA,EAA+B;AAClD,IAAA,OAAO,cAAcA,KAAAA,EAAM;AAAA,MACzB,OAAO,MAAA,EAAQ,KAAA;AAAA,MACf,YAAY,MAAA,EAAQ;AAAA,KACrB,CAAA;AAAA,EACH;AACF,CAAA;;;ACLO,IAAM,SAAA,GAAkD;AAAA,EAC7D,YAAA,EAAc;AAAA,IACZ,IAAA,EAAM,KAAA;AAAA,IACN,KAAA,EAAO,EAAE,GAAA,EAAK,QAAA,EAAU,MAAM,YAAA,EAAa;AAAA,IAC3C,KAAA,EAAO,EAAE,GAAA,EAAK,eAAA,EAAiB,MAAM,WAAA,EAAY;AAAA,IACjD,WAAA,EAAa;AAAA,MACX,EAAE,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,UAAA,EAAW;AAAA,MAC1B,EAAE,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,UAAA,EAAW;AAAA,MAC1B,EAAE,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,QAAA,EAAS;AAAA,MACxB,EAAE,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,UAAA;AAAW;AAC5B,GACF;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,IAAA,EAAM,KAAA;AAAA,IACN,KAAA,EAAO,EAAE,GAAA,EAAK,YAAA,EAAc,MAAM,aAAA,EAAc;AAAA,IAChD,KAAA,EAAO,EAAE,GAAA,EAAK,YAAA,EAAc,MAAM,aAAA,EAAc;AAAA,IAChD,WAAA,EAAa;AAAA,MACX,EAAE,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,gBAAA,EAAiB;AAAA,MAChC,EAAE,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,YAAA,EAAa;AAAA,MAC5B,EAAE,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,UAAA,EAAW;AAAA,MAC1B,EAAE,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,WAAA;AAAY;AAC7B,GACF;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,KAAA;AAAA,IACN,KAAA,EAAO,EAAE,GAAA,EAAK,YAAA,EAAc,MAAM,aAAA,EAAc;AAAA,IAChD,KAAA,EAAO,EAAE,GAAA,EAAK,uBAAA,EAAsB,MAAM,wBAAA,EAAsB;AAAA,IAChE,WAAA,EAAa;AAAA,MACX,EAAE,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,gBAAA,EAAiB;AAAA,MAChC,EAAE,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,WAAA,EAAY;AAAA,MAC3B,EAAE,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,SAAA,EAAU;AAAA,MACzB,EAAE,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,YAAA;AAAa;AAC9B,GACF;AAAA,EACA,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,KAAA;AAAA;AAAA,IAEN,KAAA,EAAO,EAAE,GAAA,EAAK,mBAAA,EAAqB,MAAM,kBAAA,EAAmB;AAAA,IAC5D,KAAA,EAAO,EAAE,GAAA,EAAK,YAAA,EAAc,MAAM,aAAA,EAAc;AAAA,IAChD,WAAA,EAAa;AAAA,MACX,EAAE,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,gBAAA,EAAiB;AAAA,MAChC,EAAE,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,OAAA,EAAQ;AAAA,MACvB,EAAE,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,WAAA,EAAY;AAAA,MAC3B,EAAE,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,MAAA;AAAO;AACxB,GACF;AAAA,EACA,QAAA,EAAU;AAAA,IACR,IAAA,EAAM,KAAA;AAAA,IACN,KAAA,EAAO,EAAE,GAAA,EAAK,mBAAA,EAAqB,MAAM,cAAA,EAAe;AAAA,IACxD,KAAA,EAAO,EAAE,GAAA,EAAK,kBAAA,EAAoB,MAAM,aAAA,EAAc;AAAA,IACtD,WAAA,EAAa;AAAA,MACX,EAAE,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,iBAAA,EAAkB;AAAA,MACjC,EAAE,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,oBAAA,EAAqB;AAAA,MACpC,EAAE,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,oBAAA,EAAqB;AAAA,MACpC,EAAE,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,qBAAA;AAAsB;AACvC,GACF;AAAA,EACA,QAAA,EAAU;AAAA,IACR,IAAA,EAAM,KAAA;AAAA,IACN,KAAA,EAAO,EAAE,GAAA,EAAK,eAAA,EAAiB,MAAM,mBAAA,EAAoB;AAAA,IACzD,KAAA,EAAO,EAAE,GAAA,EAAK,qBAAA,EAAuB,MAAM,iBAAA,EAAkB;AAAA,IAC7D,WAAA,EAAa;AAAA,MACX,EAAE,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,OAAA,EAAQ;AAAA,MACvB,EAAE,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,cAAA,EAAe;AAAA,MAC9B,EAAE,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,oBAAA,EAAkB;AAAA,MACjC,EAAE,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,SAAA;AAAU;AAC3B,GACF;AAAA,EACA,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,KAAA;AAAA,IACN,IAAA,EAAM,CAAA;AAAA,IACN,IAAA,EAAM,CAAA;AAAA,IACN,KAAA,EAAO,EAAE,GAAA,EAAK,iBAAA,EAAmB,MAAM,kBAAA,EAAmB;AAAA,IAC1D,KAAA,EAAO,EAAE,GAAA,EAAK,eAAA,EAAiB,MAAM,gBAAA,EAAiB;AAAA,IACtD,UAAA,EAAY;AAAA,MACV,EAAE,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,OAAO,QAAA,EAAS;AAAA,MAClC,EAAE,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,OAAO,iBAAA,EAAkB;AAAA,MAC3C,EAAE,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,OAAO,eAAA,EAAgB;AAAA,MACzC,EAAE,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,OAAO,SAAA,EAAU;AAAA,MACnC,EAAE,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,OAAO,aAAA,EAAc;AAAA,MACvC,EAAE,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,OAAO,aAAA,EAAc;AAAA,MACvC,EAAE,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,OAAO,iBAAA,EAAkB;AAAA,MAC3C,EAAE,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,OAAO,WAAA,EAAY;AAAA,MACrC,EAAE,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,OAAO,aAAA;AAAc;AACzC,GACF;AAAA,EACA,aAAA,EAAe;AAAA,IACb,IAAA,EAAM,KAAA;AAAA,IACN,IAAA,EAAM,SAAA;AAAA,IACN,IAAA,EAAM,CAAA;AAAA,IACN,IAAA,EAAM,CAAA;AAAA,IACN,KAAA,EAAO,EAAE,GAAA,EAAK,YAAA,EAAc,MAAM,QAAA,EAAS;AAAA,IAC3C,KAAA,EAAO,EAAE,GAAA,EAAK,MAAA,EAAQ,MAAM,SAAA,EAAU;AAAA,IACtC,WAAW,CAAC,MAAA,EAAQ,UAAA,EAAY,UAAA,EAAY,UAAU,SAAS,CAAA;AAAA,IAC/D,WAAW,CAAC,YAAA,EAAc,OAAA,EAAS,UAAA,EAAY,SAAS,QAAQ;AAAA;AAEpE,CAAA;AAEO,SAAS,gBAAgB,IAAA,EAAwC;AACtE,EAAA,IAAI,IAAA,IAAQ,SAAA,EAAW,OAAO,SAAA,CAAU,IAAsB,CAAA;AAC9D,EAAA,OAAO,MAAA;AACT;AAMO,SAAS,qBAAA,CAAsB,KAAgB,IAAA,EAA0B;AAC9E,EAAA,IAAI,IAAA,CAAK,SAAS,KAAA,EAAO;AACvB,IAAA,GAAA,CAAI,IAAA,GAAO,KAAA;AACX,IAAA,GAAA,CAAI,IAAA,GAAO,CAAA;AACX,IAAA,GAAA,CAAI,IAAA,GAAO,CAAA;AAAA,EACb,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,KAAA,EAAO;AAC9B,IAAA,GAAA,CAAI,IAAA,GAAO,KAAA;AACX,IAAA,GAAA,CAAI,IAAA,GAAO,KAAK,IAAA,IAAQ,CAAA;AACxB,IAAA,GAAA,CAAI,IAAA,GAAO,KAAK,IAAA,IAAQ,CAAA;AAAA,EAC1B,CAAA,MAAO;AACL,IAAA,GAAA,CAAI,IAAA,GAAO,KAAA;AACX,IAAA,GAAA,CAAI,IAAA,GAAO,CAAA;AACX,IAAA,GAAA,CAAI,IAAA,GAAO,CAAA;AAAA,EACb;AACA,EAAA,IAAI,IAAA,CAAK,IAAA,EAAM,GAAA,CAAI,IAAA,GAAO,IAAA,CAAK,IAAA;AAC/B,EAAA,IAAI,CAAC,GAAA,CAAI,KAAA,CAAM,GAAA,IAAO,CAAC,GAAA,CAAI,KAAA,CAAM,IAAA,EAAM,GAAA,CAAI,KAAA,GAAQ,EAAE,GAAG,KAAK,KAAA,EAAM;AACnE,EAAA,IAAI,CAAC,GAAA,CAAI,KAAA,CAAM,GAAA,IAAO,CAAC,GAAA,CAAI,KAAA,CAAM,IAAA,EAAM,GAAA,CAAI,KAAA,GAAQ,EAAE,GAAG,KAAK,KAAA,EAAM;AACnE,EAAA,IAAI,IAAA,CAAK,WAAA,IAAe,GAAA,CAAI,WAAA,CAAY,WAAW,CAAA,EAAG;AACpD,IAAA,GAAA,CAAI,WAAA,GAAc,KAAK,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,GAAG,CAAA,EAAE,CAAE,CAAA;AAAA,EAC1D;AACA,EAAA,IAAI,IAAA,CAAK,UAAA,IAAc,GAAA,CAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAClD,IAAA,GAAA,CAAI,UAAA,GAAa,KAAK,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,GAAG,CAAA,EAAE,CAAE,CAAA;AAAA,EACxD;AACA,EAAA,IAAI,IAAA,CAAK,SAAA,IAAa,CAAC,GAAA,CAAI,SAAA,MAAe,SAAA,GAAY,CAAC,GAAG,IAAA,CAAK,SAAS,CAAA;AACxE,EAAA,IAAI,IAAA,CAAK,SAAA,IAAa,CAAC,GAAA,CAAI,SAAA,MAAe,SAAA,GAAY,CAAC,GAAG,IAAA,CAAK,SAAS,CAAA;AAC1E;;;AC/IA,IAAM,cAAA,uBAA0C,GAAA,CAAI;AAAA,EAClD,YAAA;AAAA,EACA,eAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,IAAM,cAAA,GAA+B;AAAA,EACnC,UAAA,EAAY,IAAA;AAAA,EACZ,SAAA,EAAW,IAAA;AAAA,EACX,UAAA,EAAY,IAAA;AAAA,EACZ,cAAA,EAAgB,MAAA;AAAA,EAChB,WAAA,EAAa,MAAA;AAAA,EACb,mBAAA,EAAqB,IAAA;AAAA,EACrB,cAAA,EAAgB,cAAA;AAAA,EAChB,cAAA,EAAgB,aAAA;AAAA,EAChB,QAAA,EAAU,MAAA;AAAA,EACV,OAAA,EAAS;AACX,CAAA;AAOA,SAAS,SAAA,GAAwB;AAC/B,EAAA,OAAO,EAAE,GAAA,EAAK,EAAA,EAAI,IAAA,EAAM,EAAA,EAAG;AAC7B;AAEA,SAAS,eAAe,CAAA,EAAgD;AAGtE,EAAA,QAAQ,CAAA;AAAG,IACT,KAAK,CAAA;AAAG,MAAA,OAAO,EAAE,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAE;AAAA,IAChC,KAAK,CAAA;AAAG,MAAA,OAAO,EAAE,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAE;AAAA,IAChC,KAAK,CAAA;AAAG,MAAA,OAAO,EAAE,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAE;AAAA,IAChC,KAAK,CAAA;AAAG,MAAA,OAAO,EAAE,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAE;AAAA;AAEpC;AAEA,SAAS,MAAA,GAAoB;AAC3B,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,QAAA;AAAA,IACN,IAAA,EAAM,UAAA;AAAA,IACN,IAAA,EAAM,KAAA;AAAA,IACN,IAAA,EAAM,CAAA;AAAA,IACN,IAAA,EAAM,CAAA;AAAA,IACN,OAAO,SAAA,EAAU;AAAA,IACjB,OAAO,SAAA,EAAU;AAAA,IACjB,QAAQ,EAAC;AAAA,IACT,OAAO,EAAC;AAAA,IACR,YAAY,EAAC;AAAA,IACb,aAAa,EAAC;AAAA,IACd,MAAA,EAAQ,EAAE,GAAG,cAAA;AAAe,GAC9B;AACF;AAEA,SAASqC,aAAY,CAAA,EAAmB;AACtC,EAAA,MAAM,CAAA,GAAI,EAAE,IAAA,EAAK;AACjB,EAAA,IAAK,CAAA,CAAE,UAAA,CAAW,GAAG,CAAA,IAAK,EAAE,QAAA,CAAS,GAAG,CAAA,IAAO,CAAA,CAAE,WAAW,GAAG,CAAA,IAAK,CAAA,CAAE,QAAA,CAAS,GAAG,CAAA,EAAI;AACpF,IAAA,OAAO,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,EACtB;AACA,EAAA,OAAO,CAAA;AACT;AAEA,SAAS+C,WAAAA,CAAWrF,OAAc,IAAA,EAAqD;AAErF,EAAA,IAAI,CAAA,GAAI,IAAA;AACR,EAAA,OAAO,CAAA,GAAIA,MAAK,MAAA,IAAU,IAAA,CAAK,KAAKA,KAAAA,CAAK,CAAC,CAAE,CAAA,EAAG,CAAA,EAAA;AAC/C,EAAA,IAAIA,KAAAA,CAAK,CAAC,CAAA,KAAM,GAAA,IAAOA,MAAK,CAAC,CAAA,KAAM,KAAK,OAAO,IAAA;AAC/C,EAAA,MAAM,KAAA,GAAQA,MAAK,CAAC,CAAA;AACpB,EAAA,MAAM,QAAQ,CAAA,GAAI,CAAA;AAClB,EAAA,IAAI,GAAA,GAAM,KAAA;AACV,EAAA,OAAO,MAAMA,KAAAA,CAAK,MAAA,IAAUA,KAAAA,CAAK,GAAG,MAAM,KAAA,EAAO,GAAA,EAAA;AACjD,EAAA,IAAI,GAAA,IAAOA,KAAAA,CAAK,MAAA,EAAQ,OAAO,IAAA;AAC/B,EAAA,OAAO,EAAE,MAAMA,KAAAA,CAAK,KAAA,CAAM,OAAO,GAAG,CAAA,EAAG,IAAA,EAAM,GAAA,GAAM,CAAA,EAAE;AACvD;AAEA,SAAS,UAAU,GAAA,EAAyB;AAG1C,EAAA,MAAM,UAAA,GAAa,GAAA,CAAI,KAAA,CAAM,2BAA2B,CAAA;AACxD,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,MAAMmC,MAAAA,GAAQ,WAAW,CAAC,CAAA;AAC1B,IAAA,MAAM,MAAM,UAAA,CAAW,KAAA;AACvB,IAAA,MAAM,OAAO,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,GAAG,EAAE,IAAA,EAAK;AACpC,IAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAM,GAAA,GAAM,WAAW,CAAC,CAAA,CAAE,MAAM,CAAA,CAAE,IAAA,EAAK;AACzD,IAAA,MAAM,QAAA,GAAWA,MAAAA,KAAU,QAAA,IAAOA,MAAAA,KAAU,QAAQA,MAAAA,KAAU,GAAA;AAC9D,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,OAAO,EAAE,GAAA,EAAK,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,UAAU,IAAA,EAAK;AAAA,IAClD;AACA,IAAA,OAAO,EAAE,GAAA,EAAK,IAAA,EAAM,IAAA,EAAM,KAAA,EAAM;AAAA,EAClC;AAEA,EAAA,OAAO,EAAE,GAAA,EAAK,EAAA,EAAI,IAAA,EAAM,GAAA,CAAI,MAAK,EAAE;AACrC;AAEA,SAASmD,iBAAgB,GAAA,EAAuB;AAE9C,EAAA,MAAM,CAAA,GAAI,IAAI,IAAA,EAAK;AACnB,EAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,UAAA,CAAW,GAAG,CAAA,IAAK,CAAA,CAAE,QAAA,CAAS,GAAG,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,CAAA;AACtE,EAAA,OAAO,MACJ,KAAA,CAAM,GAAG,EACT,GAAA,CAAI,CAAC,MAAMhD,YAAAA,CAAY,CAAA,CAAE,IAAA,EAAM,CAAC,CAAA,CAChC,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,CAAC,CAAA;AAC/B;AAEA,SAASiD,gBAAAA,CACP,KACA,KAAA,EACM;AAEN,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,OAAO,CAAA,GAAI,IAAI,MAAA,EAAQ;AAErB,IAAA,OAAO,CAAA,GAAI,IAAI,MAAA,IAAU,IAAA,CAAK,KAAK,GAAA,CAAI,CAAC,CAAE,CAAA,EAAG,CAAA,EAAA;AAC7C,IAAA,IAAI,CAAA,IAAK,IAAI,MAAA,EAAQ;AAErB,IAAA,MAAM,WAAW,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA,CAAE,MAAM,uBAAuB,CAAA;AAC3D,IAAA,IAAI,CAAC,QAAA,EAAU;AACf,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,CAAC,CAAA,CAAG,WAAA,EAAY;AACrC,IAAA,CAAA,IAAK,QAAA,CAAS,CAAC,CAAA,CAAE,MAAA;AAEjB,IAAA,IAAI,IAAI,CAAC,CAAA,KAAM,OAAO,GAAA,CAAI,CAAC,MAAM,GAAA,EAAK;AACpC,MAAA,MAAM,CAAA,GAAIF,WAAAA,CAAW,GAAA,EAAK,CAAC,CAAA;AAC3B,MAAA,IAAI,CAAC,CAAA,EAAG;AACR,MAAA,IAAI,GAAA,KAAQ,MAAA,EAAQ,KAAA,CAAM,IAAA,GAAO,CAAA,CAAE,IAAA;AAAA,WAAA,IAC1B,GAAA,KAAQ,OAAA,EAAS,KAAA,CAAM,KAAA,GAAQ,CAAA,CAAE,IAAA;AAC1C,MAAA,CAAA,GAAI,CAAA,CAAE,IAAA;AAAA,IACR,CAAA,MAAO;AAEL,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA;AACxB,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,oBAAoB,CAAA;AAChD,MAAA,MAAM,GAAA,GAAM,QAAA,GAAW,QAAA,CAAS,KAAA,GAAS,IAAA,CAAK,MAAA;AAC9C,MAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,GAAG,EAAE,IAAA,EAAK;AACpC,MAAA,CAAA,IAAK,GAAA;AACL,MAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,QAAA,MAAM,CAAA,GAAI,OAAO,GAAG,CAAA;AACpB,QAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA,QAAS,IAAA,GAAO,CAAA;AAAA,MACrC,CAAA,MAAA,IAAW,QAAQ,UAAA,EAAY;AAC7B,QAAA,KAAA,CAAM,QAAA,GAAW,GAAA;AAAA,MACnB,CAAA,MAAA,IAAW,QAAQ,OAAA,EAAS;AAC1B,QAAA,KAAA,CAAM,KAAA,GAAQ,GAAA;AAAA,MAChB,CAAA,MAAA,IAAW,QAAQ,OAAA,EAAS;AAC1B,QAAA,IAAI,QAAQ,QAAA,IAAY,GAAA,KAAQ,YAAY,GAAA,KAAQ,UAAA,IAAc,QAAQ,SAAA,EAAW;AACnF,UAAA,KAAA,CAAM,KAAA,GAAQ,GAAA;AAAA,QAChB;AAAA,MACF,CAAA,MAAA,IAAW,QAAQ,WAAA,EAAa;AAC9B,QAAA,KAAA,CAAM,SAAA,GAAY,GAAA,KAAQ,MAAA,IAAU,GAAA,KAAQ,GAAA;AAAA,MAC9C;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,cAAA,CAAerF,OAAc,EAAA,EAAyB;AAE7D,EAAA,MAAM,CAAA,GAAIqF,WAAAA,CAAWrF,KAAAA,EAAM,CAAC,CAAA;AAC5B,EAAA,IAAI,CAAC,GAAG,OAAO,KAAA;AACf,EAAA,MAAM,OAAOA,KAAAA,CAAK,KAAA,CAAM,CAAA,CAAE,IAAI,EAAE,IAAA,EAAK;AACrC,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,mEAAmE,CAAA;AAC9F,EAAA,IAAI,CAAC,SAAS,OAAO,KAAA;AACrB,EAAA,MAAM,CAAA,GAAI,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAC,CAAA;AAC3B,EAAA,MAAM,CAAA,GAAI,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAC,CAAA;AAC3B,EAAA,MAAM,KAAA,GAAQ,QAAQ,CAAC,CAAA;AACvB,EAAA,MAAM,WAAW,CAAA,GAAI,CAAA,IAAK,IAAI,CAAA,IAAK,CAAA,GAAI,KAAK,CAAA,GAAI,CAAA;AAChD,EAAA,MAAM,QAAA,GAAW,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,CAAC,CAAC,CAAA;AAC3C,EAAA,MAAM,QAAA,GAAW,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,CAAC,CAAC,CAAA;AAC3C,EAAA,MAAM,KAAA,GAAqB;AAAA,IACzB,EAAA,EAAI,CAAA,CAAA,EAAI,EAAA,CAAG,UAAA,EAAY,CAAA,CAAA;AAAA,IACvB,OAAO,CAAA,CAAE,IAAA;AAAA,IACT,CAAA,EAAG,QAAA;AAAA,IACH,CAAA,EAAG,QAAA;AAAA,IACH,QAAA;AAAA,IACA,KAAA,EAAO,WAAW,CAAA,GAAI,MAAA;AAAA,IACtB,KAAA,EAAO,WAAW,CAAA,GAAI;AAAA,GACxB;AACA,EAAA,IAAI,KAAA,EAAOuF,gBAAAA,CAAgB,KAAA,EAAO,KAAK,CAAA;AACvC,EAAA,EAAA,CAAG,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA;AACxB,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,aAAA,CAAcvF,OAAc,EAAA,EAAyB;AAE5D,EAAA,MAAM,CAAA,GAAIA,KAAAA,CAAK,KAAA,CAAM,8CAA8C,CAAA;AACnE,EAAA,IAAI,CAAC,GAAG,OAAO,KAAA;AACf,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,CAAA,CAAE,CAAC,CAAC,CAAA;AACvB,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,CAAA,CAAE,CAAC,CAAC,CAAA;AACvB,EAAA,MAAM,IAAA,GAAO,EAAE,CAAC,CAAA;AAChB,EAAA,MAAM,IAAA,GAAmB,EAAE,GAAA,EAAK,GAAA,EAAI;AACpC,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,6BAA6B,CAAA;AACzD,EAAA,IAAI,UAAU,IAAA,CAAK,KAAA,GAAQ,MAAA,CAAO,QAAA,CAAS,CAAC,CAAC,CAAA;AAC7C,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,qBAAqB,CAAA;AACjD,EAAA,IAAI,QAAA,EAAU,IAAA,CAAK,KAAA,GAAQ,QAAA,CAAS,CAAC,CAAA;AACrC,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,kCAAkC,CAAA;AAC9D,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,MAAM,EAAA,GAAK,QAAA,CAAS,CAAC,CAAA,CAAG,WAAA,EAAY;AACpC,IAAA,IAAA,CAAK,KAAA,GAAQ,EAAA;AACb,IAAA,IAAI,IAAA,CAAK,KAAA,KAAU,MAAA,EAAW,IAAA,CAAK,KAAA,GAAQ,OAAO,QAAA,GAAW,CAAA,GAAI,EAAA,KAAO,QAAA,GAAW,CAAA,GAAI,CAAA;AAAA,EACzF;AACA,EAAA,EAAA,CAAG,GAAA,CAAI,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AACtB,EAAA,IAAI,KAAK,KAAA,EAAO;AACd,IAAA,EAAA,CAAG,GAAA,CAAI,WAAW,IAAA,CAAK,EAAE,KAAK,GAAA,EAAK,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,CAAA;AAAA,EACxD;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,eAAA,CAAgB,GAAA,EAAa,KAAA,EAAe,GAAA,EAAsB;AACzE,EAAA,MAAM,CAAA,GAAI,GAAA,CAAI,IAAA,EAAK,CAAE,WAAA,EAAY;AACjC,EAAA,MAAM,CAAA,GAAI,MAAM,IAAA,EAAK;AACrB,EAAA,IAAI,CAAA,KAAM,YAAA,EAAc,GAAA,CAAI,MAAA,CAAO,aAAa,CAAA,KAAM,MAAA;AAAA,OAAA,IAC7C,CAAA,KAAM,WAAA,EAAa,GAAA,CAAI,MAAA,CAAO,YAAY,CAAA,KAAM,MAAA;AAAA,OAAA,IAChD,CAAA,KAAM,YAAA,EAAc,GAAA,CAAI,MAAA,CAAO,aAAa,CAAA,KAAM,MAAA;AAAA,OAAA,IAClD,CAAA,KAAM,kBAAkB,GAAA,CAAI,MAAA,CAAO,iBAAiB,CAAA,CAAE,OAAA,CAAQ,MAAM,EAAE,CAAA;AAAA,OAAA,IACtE,MAAM,aAAA,EAAe,GAAA,CAAI,OAAO,WAAA,GAAc,CAAA,KAAM,WAAW,QAAA,GAAW,MAAA;AAAA,OAAA,IAC1E,CAAA,KAAM,qBAAA,EAAuB,GAAA,CAAI,MAAA,CAAO,sBAAsB,CAAA,KAAM,MAAA;AAAA,OAAA,IACpE,MAAM,gBAAA,EAAkB;AAC/B,IAAA,MAAM,CAAA,GAAI,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,EAAE,CAAA;AAC5B,IAAA,GAAA,CAAI,OAAO,cAAA,GAAiB,CAAA;AAAA,EAC9B,CAAA,MAAA,IAAW,MAAM,gBAAA,EAAkB;AACjC,IAAA,MAAM,CAAA,GAAI,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,EAAE,CAAA;AAC5B,IAAA,GAAA,CAAI,OAAO,cAAA,GAAiB,CAAA;AAAA,EAC9B;AACF;AAEA,SAASwF,YAAAA,CAAYxF,OAAc,GAAA,EAA4C;AAE7E,EAAA,MAAM,CAAA,GAAIA,MAAK,IAAA,EAAK;AACpB,EAAA,MAAM,OAAO,CAAA,CAAE,KAAA,CAAM,QAAA,CAAS,MAAM,EAAE,IAAA,EAAK;AAE3C,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,uCAAuC,CAAA;AACpE,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,GAAA,CAAI,IAAA,GAAO,SAAA;AACX,IAAA,GAAA,CAAI,IAAA,GAAO,KAAA;AACX,IAAA,GAAA,CAAI,IAAA,GAAO,MAAA,CAAO,SAAA,CAAU,CAAC,CAAC,CAAA;AAC9B,IAAA,GAAA,CAAI,IAAA,GAAO,MAAA,CAAO,SAAA,CAAU,CAAC,CAAC,CAAA;AAC9B,IAAA,MAAME,MAAAA,GAAQ,SAAA,CAAU,CAAC,CAAA,CAAG,IAAA,EAAK;AACjC,IAAA,IAAIA,MAAAA,EAAO,GAAA,CAAI,KAAA,GAAQoC,YAAAA,CAAYpC,MAAK,CAAA;AACxC,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,gDAAgD,CAAA;AAC7E,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,GAAA,CAAI,IAAA,GAAO,aAAA;AACX,IAAA,GAAA,CAAI,IAAA,GAAO,KAAA;AACX,IAAA,IAAI,SAAA,CAAU,CAAC,CAAA,IAAK,SAAA,CAAU,CAAC,CAAA,EAAG;AAChC,MAAA,GAAA,CAAI,IAAA,GAAO,MAAA,CAAO,SAAA,CAAU,CAAC,CAAC,CAAA;AAC9B,MAAA,GAAA,CAAI,IAAA,GAAO,MAAA,CAAO,SAAA,CAAU,CAAC,CAAC,CAAA;AAAA,IAChC;AACA,IAAA,MAAMA,MAAAA,GAAQ,SAAA,CAAU,CAAC,CAAA,CAAG,IAAA,EAAK;AACjC,IAAA,IAAIA,MAAAA,EAAO,GAAA,CAAI,KAAA,GAAQoC,YAAAA,CAAYpC,MAAK,CAAA;AACxC,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,2BAA2B,CAAA;AACzD,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,MAAM,GAAA,GAAM,UAAA,CAAW,CAAC,CAAA,CAAG,WAAA,EAAY;AACvC,IAAA,MAAM,SAAA,GAAY,UAAA,CAAW,CAAC,CAAA,CAAG,IAAA,EAAK;AACtC,IAAA,IAAI,cAAA,CAAe,GAAA,CAAI,GAAG,CAAA,EAAG;AAC3B,MAAA,IAAI,SAAA,EAAW,GAAA,CAAI,KAAA,GAAQoC,YAAAA,CAAY,SAAS,CAAA;AAChD,MAAA,OAAO,GAAA;AAAA,IACT;AAEA,IAAA,IAAI,KAAK,UAAA,CAAW,GAAG,KAAK,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AAChD,MAAA,GAAA,CAAI,KAAA,GAAQA,aAAY,IAAI,CAAA;AAAA,IAC9B,CAAA,MAAA,IAAW,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG;AAC1B,MAAA,GAAA,CAAI,KAAA,GAAQA,aAAY,IAAI,CAAA;AAAA,IAC9B;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,YAAYrC,KAAAA,EAAyB;AACnD,EAAA,MAAM,KAAiB,EAAE,GAAA,EAAK,MAAA,EAAO,EAAG,YAAY,CAAA,EAAE;AACtD,EAAA,MAAM,KAAA,GAAQA,KAAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAChC,EAAA,IAAI,YAAA;AACJ,EAAA,IAAI,QAAA,GAAW,KAAA;AAEf,EAAA,KAAA,MAAW,OAAO,KAAA,EAAO;AAEvB,IAAA,IAAID,KAAAA,GAAO,GAAA;AACX,IAAA,MAAM,OAAA,GAAU,iBAAiBA,KAAI,CAAA;AACrC,IAAA,IAAI,WAAW,CAAA,EAAGA,QAAOA,KAAAA,CAAK,KAAA,CAAM,GAAG,OAAO,CAAA;AAC9C,IAAAA,KAAAA,GAAOA,MAAK,IAAA,EAAK;AACjB,IAAA,IAAI,CAACA,KAAAA,EAAM;AACT,MAAA,QAAA,GAAW,KAAA;AACX,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,YAAA,CAAa,IAAA,CAAKA,KAAI,CAAA,EAAG;AAC3B,MAAA,YAAA,GAAewF,YAAAA,CAAYxF,KAAAA,EAAM,EAAA,CAAG,GAAG,CAAA;AACvC,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,cAAA,CAAe,IAAA,CAAKA,KAAI,CAAA,EAAG;AAC7B,MAAA,QAAA,GAAW,IAAA;AACX,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,EAAA,GAAKA,KAAAA,CAAK,KAAA,CAAM,0BAA0B,CAAA;AAChD,MAAA,IAAI,EAAA,EAAI;AACN,QAAA,eAAA,CAAgB,GAAG,CAAC,CAAA,EAAI,GAAG,CAAC,CAAA,EAAI,GAAG,GAAG,CAAA;AACtC,QAAA;AAAA,MACF;AACA,MAAA,QAAA,GAAW,KAAA;AAAA,IACb;AAEA,IAAA,IAAI,aAAA,CAAc,IAAA,CAAKA,KAAI,CAAA,EAAG;AAC5B,MAAA,EAAA,CAAG,IAAI,KAAA,GAAQsC,YAAAA,CAAYtC,MAAK,OAAA,CAAQ,gBAAA,EAAkB,EAAE,CAAC,CAAA;AAC7D,MAAA;AAAA,IACF;AACA,IAAA,IAAI,cAAA,CAAe,IAAA,CAAKA,KAAI,CAAA,EAAG;AAC7B,MAAA,EAAA,CAAG,IAAI,KAAA,GAAQ,SAAA,CAAUA,MAAK,OAAA,CAAQ,iBAAA,EAAmB,EAAE,CAAC,CAAA;AAC5D,MAAA;AAAA,IACF;AACA,IAAA,IAAI,cAAA,CAAe,IAAA,CAAKA,KAAI,CAAA,EAAG;AAC7B,MAAA,EAAA,CAAG,IAAI,KAAA,GAAQ,SAAA,CAAUA,MAAK,OAAA,CAAQ,iBAAA,EAAmB,EAAE,CAAC,CAAA;AAC5D,MAAA;AAAA,IACF;AACA,IAAA,IAAI,YAAA,CAAa,IAAA,CAAKA,KAAI,CAAA,EAAG;AAC3B,MAAA,EAAA,CAAG,IAAI,SAAA,GAAYsF,gBAAAA,CAAgBtF,MAAK,OAAA,CAAQ,eAAA,EAAiB,EAAE,CAAC,CAAA;AACpE,MAAA,IAAI,EAAA,CAAG,IAAI,IAAA,KAAS,UAAA,KAAe,GAAA,CAAI,IAAA,GAAO,EAAA,CAAG,GAAA,CAAI,SAAA,CAAU,MAAA;AAC/D,MAAA;AAAA,IACF;AACA,IAAA,IAAI,YAAA,CAAa,IAAA,CAAKA,KAAI,CAAA,EAAG;AAC3B,MAAA,EAAA,CAAG,IAAI,SAAA,GAAYsF,gBAAAA,CAAgBtF,MAAK,OAAA,CAAQ,eAAA,EAAiB,EAAE,CAAC,CAAA;AACpE,MAAA,IAAI,EAAA,CAAG,IAAI,IAAA,KAAS,UAAA,KAAe,GAAA,CAAI,IAAA,GAAO,EAAA,CAAG,GAAA,CAAI,SAAA,CAAU,MAAA;AAC/D,MAAA;AAAA,IACF;AACA,IAAA,IAAI,YAAA,CAAa,IAAA,CAAKA,KAAI,CAAA,EAAG;AAC3B,MAAA,MAAM,CAAA,GAAIA,MAAK,OAAA,CAAQ,eAAA,EAAiB,EAAE,CAAA,CAAE,IAAA,GAAO,WAAA,EAAY;AAC/D,MAAA,MAAM,EAAA,GAAK,CAAA,CAAE,KAAA,CAAM,qBAAqB,CAAA;AACxC,MAAA,IAAI,EAAA,EAAI;AACN,QAAA,MAAM,CAAA,GAAI,MAAA,CAAO,EAAA,CAAG,CAAC,CAAC,CAAA;AACtB,QAAA,MAAM,CAAA,GAAI,MAAA,CAAO,EAAA,CAAG,CAAC,CAAC,CAAA;AACtB,QAAA,EAAA,CAAG,IAAI,IAAA,GAAO,CAAA;AACd,QAAA,EAAA,CAAG,IAAI,IAAA,GAAO,CAAA;AACd,QAAA,IAAI,MAAM,CAAA,IAAK,CAAA,KAAM,CAAA,EAAG,EAAA,CAAG,IAAI,IAAA,GAAO,KAAA;AAAA,aAAA,IAC7B,MAAM,CAAA,IAAK,CAAA,KAAM,CAAA,EAAG,EAAA,CAAG,IAAI,IAAA,GAAO,KAAA;AAAA,aACtC,EAAA,CAAG,IAAI,IAAA,GAAO,KAAA;AAAA,MACrB;AACA,MAAA;AAAA,IACF;AACA,IAAA,IAAI,eAAA,CAAgB,IAAA,CAAKA,KAAI,CAAA,EAAG;AAE9B,MAAA,MAAM,CAAA,GAAIA,KAAAA,CAAK,KAAA,CAAM,0CAA0C,CAAA;AAC/D,MAAA,IAAI,CAAA,EAAG;AACL,QAAA,MAAM,CAAA,GAAI,MAAA,CAAO,CAAA,CAAE,CAAC,CAAC,CAAA;AACrB,QAAA,MAAM,IAAA,GAAO,CAAA,CAAE,CAAC,CAAA,CAAG,IAAA,EAAK;AACxB,QAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,2BAA2B,CAAA;AACxD,QAAA,MAAM,WAAA,GAAc,SAAA,GAAY,SAAA,CAAU,CAAC,CAAA,GAAK,MAAA;AAChD,QAAA,IAAI,CAAA,IAAK,CAAA,IAAK,CAAA,IAAK,CAAA,EAAG;AACpB,UAAA,MAAM,QAAA,GAAW,GAAG,GAAA,CAAI,WAAA,CAAY,KAAK,CAAC,CAAA,KAAM,CAAA,CAAE,CAAA,KAAM,CAAC,CAAA;AACzD,UAAA,IAAI,QAAA,EAAU;AACZ,YAAA,QAAA,CAAS,KAAA,GAAQ,EAAE,CAAC,CAAA;AACpB,YAAA,IAAI,WAAA,WAAsB,WAAA,GAAc,WAAA;AAAA,UAC1C,CAAA,MAAO;AACL,YAAA,EAAA,CAAG,GAAA,CAAI,WAAA,CAAY,IAAA,CAAK,EAAE,CAAA,EAAG,OAAO,CAAA,CAAE,CAAC,CAAA,EAAI,WAAA,EAAa,CAAA;AAAA,UAC1D;AAAA,QACF;AAAA,MACF;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,YAAA,CAAa,IAAA,CAAKA,KAAI,CAAA,EAAG;AAC3B,MAAA,MAAM,CAAA,GAAIA,KAAAA,CAAK,OAAA,CAAQ,eAAA,EAAiB,EAAE,CAAA,CAAE,IAAA,EAAK,CAAE,WAAA,EAAY,CAAE,OAAA,CAAQ,IAAA,EAAM,EAAE,CAAA;AACjF,MAAA,IAAI,CAAA,KAAM,UAAU,CAAA,KAAM,KAAA,IAAS,MAAM,QAAA,EAAU,EAAA,CAAG,GAAA,CAAI,MAAA,CAAO,QAAA,GAAW,KAAA;AAAA,WAAA,IACnE,CAAA,KAAM,QAAQ,CAAA,KAAM,MAAA,IAAU,MAAM,SAAA,EAAW,EAAA,CAAG,GAAA,CAAI,MAAA,CAAO,QAAA,GAAW,IAAA;AAAA,WAC5E,EAAA,CAAG,GAAA,CAAI,MAAA,CAAO,QAAA,GAAW,MAAA;AAC9B,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,eAAA,CAAgB,IAAA,CAAKA,KAAI,CAAA,EAAG;AAC9B,MAAA,MAAM,CAAA,GAAIA,MAAK,OAAA,CAAQ,kBAAA,EAAoB,EAAE,CAAA,CAAE,IAAA,GAAO,WAAA,EAAY;AAClE,MAAA,EAAA,CAAG,IAAI,MAAA,CAAO,OAAA,GAAU,MAAM,MAAA,IAAU,CAAA,KAAM,QAAQ,CAAA,KAAM,GAAA;AAC5D,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,aAAA,CAAc,IAAA,CAAKA,KAAI,CAAA,EAAG;AAC5B,MAAA,MAAM,CAAA,GAAIA,KAAAA,CAAK,OAAA,CAAQ,gBAAA,EAAkB,EAAE,CAAA,CAAE,IAAA,EAAK,CAAE,WAAA,EAAY,CAAE,OAAA,CAAQ,IAAA,EAAM,EAAE,CAAA;AAClF,MAAA,IAAI,MAAM,OAAA,EAAS;AACjB,QAAA,EAAA,CAAG,GAAA,CAAI,OAAO,QAAA,GAAW,KAAA;AACzB,QAAA,EAAA,CAAG,GAAA,CAAI,OAAO,UAAA,GAAa,KAAA;AAC3B,QAAA,EAAA,CAAG,GAAA,CAAI,OAAO,SAAA,GAAY,KAAA;AAC1B,QAAA,EAAA,CAAG,GAAA,CAAI,OAAO,mBAAA,GAAsB,KAAA;AACpC,QAAA,EAAA,CAAG,IAAI,KAAA,GAAQ,OAAA;AAAA,MACjB;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,aAAA,CAAc,IAAA,CAAKA,KAAI,CAAA,EAAG;AAC5B,MAAA,aAAA,CAAcA,OAAM,EAAE,CAAA;AACtB,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,MAAA,GAASA,KAAAA,CAAK,KAAA,CAAM,wBAAwB,CAAA;AAClD,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,CAAA,GAAI,MAAA,CAAO,MAAA,CAAO,CAAC,CAAC,CAAA;AAC1B,MAAA,MAAM,QAAA,GAAW,MAAA,CAAO,CAAC,CAAA,CAAG,IAAA,EAAK;AACjC,MAAA,MAAM,KAAA,GAAQsC,aAAY,QAAQ,CAAA;AAClC,MAAA,MAAM,IAAA,GAAO,eAAe,CAAC,CAAA;AAC7B,MAAA,EAAA,CAAG,GAAA,CAAI,UAAA,CAAW,IAAA,CAAK,EAAE,GAAA,EAAK,IAAA,CAAK,GAAA,EAAK,GAAA,EAAK,IAAA,CAAK,GAAA,EAAK,KAAA,EAAO,CAAA;AAC9D,MAAA;AAAA,IACF;AAGA,IAAA,IAAItC,MAAK,UAAA,CAAW,GAAG,KAAKA,KAAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AAChD,MAAA,IAAI,cAAA,CAAeA,KAAAA,EAAM,EAAE,CAAA,EAAG;AAAA,IAChC;AAAA,EACF;AAGA,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,MAAM,IAAA,GAAO,gBAAgB,YAAY,CAAA;AACzC,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,qBAAA,CAAsB,EAAA,CAAG,KAAK,IAAI,CAAA;AAClC,MAAA,EAAA,CAAG,IAAI,QAAA,GAAW,YAAA;AAAA,IACpB;AAAA,EACF;AAGA,EAAA,IAAI,EAAA,CAAG,GAAA,CAAI,IAAA,KAAS,CAAA,IAAK,EAAA,CAAG,GAAA,CAAI,IAAA,KAAS,CAAA,IAAK,EAAA,CAAG,GAAA,CAAI,IAAA,KAAS,KAAA,EAAO;AACnE,IAAA,EAAA,CAAG,IAAI,IAAA,GAAO,KAAA;AAAA,EAChB;AACA,EAAA,IAAI,EAAA,CAAG,GAAA,CAAI,IAAA,KAAS,SAAA,IAAa,EAAA,CAAG,IAAI,IAAA,KAAS,aAAA,EAAe,EAAA,CAAG,GAAA,CAAI,IAAA,GAAO,KAAA;AAE9E,EAAA,OAAO,EAAA,CAAG,GAAA;AACZ;AAEA,SAAS,iBAAiBA,KAAAA,EAAsB;AAC9C,EAAA,IAAI,OAAA,GAAyB,IAAA;AAC7B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAIA,KAAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,EAAA,GAAKA,MAAK,CAAC,CAAA;AACjB,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,IAAI,EAAA,KAAO,SAAS,OAAA,GAAU,IAAA;AAAA,IAChC,CAAA,MAAA,IAAW,EAAA,KAAO,GAAA,IAAO,EAAA,KAAO,GAAA,EAAK;AACnC,MAAA,OAAA,GAAU,EAAA;AAAA,IACZ,CAAA,MAAA,IAAW,OAAO,GAAA,EAAK;AACrB,MAAA,OAAO,CAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,EAAA;AACT;;;ACjaA,IAAM,QAAA,GAAW,GAAA;AACjB,IAAM,QAAA,GAAW,GAAA;AACjB,IAAM,SAAA,GAAY,GAAA;AAClB,IAAM,SAAA,GAAY,EAAA;AAClB,IAAMyF,OAAAA,GAAS,GAAA;AACf,IAAM,OAAA,GAAU,EAAA;AAEhB,SAAS,cAAcxF,KAAAA,EAAsB;AAE3C,EAAA,MAAM,OAAOA,KAAAA,CAAK,KAAA,CAAM,kBAAkB,CAAA,IAAK,EAAC,EAAG,MAAA;AACnD,EAAA,OAAA,CAAQA,KAAAA,CAAK,MAAA,GAAS,GAAA,IAAOwF,OAAAA,GAAS,MAAM,EAAA,GAAK,CAAA;AACnD;AAEA,SAAS,QAAQ,CAAA,EAAmB;AAClC,EAAA,OAAO,KAAK,GAAA,CAAI,IAAA,EAAM,KAAK,GAAA,CAAI,IAAA,EAAM,CAAC,CAAC,CAAA;AACzC;AAEA,SAAS,UAAA,CAAW,GAAgB,IAAA,EAA2C;AAC7E,EAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,CAAA,CAAE,CAAC,CAAA;AACtB,EAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,CAAA,CAAE,CAAC,CAAA;AACtB,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,EAAA,GAAK,EAAA,GAAK,IAAA,CAAK,CAAA;AAC/B,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,EAAA,GAAA,CAAM,CAAA,GAAI,MAAM,IAAA,CAAK,CAAA;AACrC,EAAA,OAAO,EAAE,IAAI,EAAA,EAAG;AAClB;AAEA,SAAS,aAAA,CAAc,CAAA,EAAgB,OAAA,EAAiB,IAAA,EAAe,KAAA,EAAkC;AACvG,EAAA,IAAI,CAAA,CAAE,IAAA,KAAS,MAAA,EAAW,OAAO,CAAA;AACjC,EAAA,MAAM,YAAY,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAA,CAAK,IAAI,IAAI,CAAA;AAC5C,EAAA,MAAM,SAAA,GAAY,CAAA;AAClB,EAAA,IAAI,OAAA,IAAW,GAAG,OAAO,CAAA;AACzB,EAAA,MAAM,KAAA,GAAQ,EAAE,IAAA,GAAO,OAAA;AACvB,EAAA,IAAI,UAAU,QAAA,EAAU;AACtB,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,SAAA,EAAW,KAAA,GAAQ,SAAS,CAAA;AAAA,EAC9C;AAEA,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,EAAA,GAAK,SAAA,GAAY,SAAA;AACtC,EAAA,MAAM,OAAO,KAAA,GAAQ,OAAA;AACrB,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,IAAA,GAAO,KAAK,EAAE,CAAA;AAClC,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,SAAA,EAAW,CAAC,CAAA;AAC9B;AAQA,SAAS,sBAAA,CACP,MAAA,EACA,IAAA,EACA,IAAA,EACM;AACN,EAAA,IAAI,SAAS,KAAA,EAAO;AAClB,IAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,MAAA,CAAA,CAAE,KAAA,CAAM,KAAK,CAAA,CAAE,EAAA,GAAK,EAAE,CAAA,GAAI,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,KAAA,GAAQ,CAAA;AAC9C,MAAA,CAAA,CAAE,KAAA,CAAM,EAAA,GAAK,CAAA,CAAE,EAAA,GAAK,EAAE,CAAA,GAAI,CAAA;AAAA,IAC5B;AACA,IAAA;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,CAAA,CAAE,KAAA,CAAM,KAAK,CAAA,CAAE,EAAA;AACf,IAAA,CAAA,CAAE,KAAA,CAAM,KAAK,CAAA,CAAE,EAAA;AACf,IAAA,CAAA,CAAE,KAAA,CAAM,KAAK,CAAA,CAAE,EAAA,GAAK,EAAE,CAAA,GAAI,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,KAAA,GAAQ,CAAA;AAC9C,IAAA,CAAA,CAAE,KAAA,CAAM,EAAA,GAAK,CAAA,CAAE,EAAA,GAAK,EAAE,CAAA,GAAI,CAAA;AAC1B,IAAA,CAAA,CAAE,MAAM,QAAA,GAAW,KAAA;AACnB,IAAA,CAAA,CAAE,MAAM,UAAA,GAAa,QAAA;AAAA,EACvB;AAEA,EAAA,IAAI,SAAS,aAAA,EAAe;AAE1B,IAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,MAAA,CAAA,CAAE,MAAM,QAAA,GAAW,IAAA;AACnB,MAAA,CAAA,CAAE,KAAA,CAAM,KAAK,CAAA,CAAE,EAAA,GAAK,EAAE,CAAA,GAAI,EAAA,GAAK,CAAA,CAAE,KAAA,CAAM,KAAA,GAAQ,CAAA;AAC/C,MAAA,CAAA,CAAE,KAAA,CAAM,KAAK,CAAA,CAAE,EAAA;AACf,MAAA,CAAA,CAAE,MAAM,UAAA,GAAa,QAAA;AAAA,IACvB;AACA,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,GAAA,GAAM,CAAA;AACZ,EAAA,KAAA,IAAS,IAAA,GAAO,CAAA,EAAG,IAAA,GAAO,EAAA,EAAI,IAAA,EAAA,EAAQ;AACpC,IAAA,IAAI,KAAA,GAAQ,KAAA;AACZ,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,MAAA,KAAA,IAAS,IAAI,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AAC1C,QAAA,MAAM,CAAA,GAAI,MAAA,CAAO,CAAC,CAAA,CAAG,KAAA;AACrB,QAAA,MAAM,CAAA,GAAI,MAAA,CAAO,CAAC,CAAA,CAAG,KAAA;AACrB,QAAA,MAAM,GAAA,GAAM,CAAA,CAAE,EAAA,GAAK,CAAA,CAAE,QAAQ,CAAA,GAAI,GAAA;AACjC,QAAA,MAAM,GAAA,GAAM,CAAA,CAAE,EAAA,GAAK,CAAA,CAAE,QAAQ,CAAA,GAAI,GAAA;AACjC,QAAA,MAAM,GAAA,GAAM,CAAA,CAAE,EAAA,GAAK,CAAA,CAAE,SAAS,CAAA,GAAI,GAAA;AAClC,QAAA,MAAM,GAAA,GAAM,CAAA,CAAE,EAAA,GAAK,CAAA,CAAE,SAAS,CAAA,GAAI,GAAA;AAClC,QAAA,MAAM,GAAA,GAAM,CAAA,CAAE,EAAA,GAAK,CAAA,CAAE,QAAQ,CAAA,GAAI,GAAA;AACjC,QAAA,MAAM,GAAA,GAAM,CAAA,CAAE,EAAA,GAAK,CAAA,CAAE,QAAQ,CAAA,GAAI,GAAA;AACjC,QAAA,MAAM,GAAA,GAAM,CAAA,CAAE,EAAA,GAAK,CAAA,CAAE,SAAS,CAAA,GAAI,GAAA;AAClC,QAAA,MAAM,GAAA,GAAM,CAAA,CAAE,EAAA,GAAK,CAAA,CAAE,SAAS,CAAA,GAAI,GAAA;AAClC,QAAA,MAAM,QAAA,GAAW,KAAK,GAAA,CAAI,GAAA,EAAK,GAAG,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,GAAG,CAAA;AACvD,QAAA,MAAM,QAAA,GAAW,KAAK,GAAA,CAAI,GAAA,EAAK,GAAG,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,GAAG,CAAA;AACvD,QAAA,IAAI,QAAA,GAAW,CAAA,IAAK,QAAA,GAAW,CAAA,EAAG;AAEhC,UAAA,MAAM,EAAA,GAAM,CAAA,CAAE,EAAA,GAAK,CAAA,CAAE,EAAA,IAAO,GAAA;AAC5B,UAAA,MAAM,EAAA,GAAM,CAAA,CAAE,EAAA,GAAK,CAAA,CAAE,EAAA,IAAO,GAAA;AAC5B,UAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,EAAA,EAAI,EAAE,CAAA,IAAK,CAAA;AAClC,UAAA,MAAM,KAAK,EAAA,GAAK,GAAA;AAChB,UAAA,MAAM,KAAK,EAAA,GAAK,GAAA;AAChB,UAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAI,QAAA,EAAU,QAAQ,CAAA,GAAI,CAAA,GAAI,GAAG,CAAA;AAC/D,UAAA,CAAA,CAAE,MAAM,EAAA,GAAK,IAAA;AACb,UAAA,CAAA,CAAE,MAAM,EAAA,GAAK,IAAA;AACb,UAAA,CAAA,CAAE,MAAM,EAAA,GAAK,IAAA;AACb,UAAA,CAAA,CAAE,MAAM,EAAA,GAAK,IAAA;AACb,UAAA,KAAA,GAAQ,IAAA;AAAA,QACV;AAAA,MACF;AAEA,MAAA,MAAM,EAAA,GAAK,MAAA,CAAO,CAAC,CAAA,CAAG,KAAA;AACtB,MAAA,IAAI,EAAA,CAAG,EAAA,GAAK,EAAA,CAAG,KAAA,GAAQ,IAAI,IAAA,CAAK,EAAA,GAAK,CAAA,EAAG,EAAA,CAAG,EAAA,GAAK,IAAA,CAAK,EAAA,GAAK,CAAA,GAAI,GAAG,KAAA,GAAQ,CAAA;AACzE,MAAA,IAAI,GAAG,EAAA,GAAK,EAAA,CAAG,QAAQ,CAAA,GAAI,IAAA,CAAK,KAAK,IAAA,CAAK,CAAA,GAAI,CAAA,EAAG,EAAA,CAAG,KAAK,IAAA,CAAK,EAAA,GAAK,KAAK,CAAA,GAAI,CAAA,GAAI,GAAG,KAAA,GAAQ,CAAA;AAC3F,MAAA,IAAI,EAAA,CAAG,EAAA,GAAK,EAAA,CAAG,MAAA,GAAS,IAAI,IAAA,CAAK,EAAA,GAAK,CAAA,EAAG,EAAA,CAAG,EAAA,GAAK,IAAA,CAAK,EAAA,GAAK,CAAA,GAAI,GAAG,MAAA,GAAS,CAAA;AAC3E,MAAA,IAAI,GAAG,EAAA,GAAK,EAAA,CAAG,SAAS,CAAA,GAAI,IAAA,CAAK,KAAK,IAAA,CAAK,CAAA,GAAI,CAAA,EAAG,EAAA,CAAG,KAAK,IAAA,CAAK,EAAA,GAAK,KAAK,CAAA,GAAI,CAAA,GAAI,GAAG,MAAA,GAAS,CAAA;AAAA,IAC/F;AACA,IAAA,IAAI,CAAC,KAAA,EAAO;AAAA,EACd;AAGA,EAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,IAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,MAAA,MAAM,EAAA,GAAK,CAAA,CAAE,KAAA,CAAM,EAAA,GAAK,CAAA,CAAE,EAAA;AAC1B,MAAA,MAAM,EAAA,GAAK,CAAA,CAAE,KAAA,CAAM,EAAA,GAAK,CAAA,CAAE,EAAA;AAC1B,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,EAAA,EAAI,EAAE,IAAI,EAAA,EAAI;AAC3B,QAAA,CAAA,CAAE,MAAM,QAAA,GAAW,IAAA;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,aAAa,GAAA,EAAoC;AAC/D,EAAA,MAAM,WAAA,GAAc,QAAA;AACpB,EAAA,MAAM,YAAA,GAAe,QAAA;AACrB,EAAA,MAAM,IAAA,GAAgB;AAAA,IACpB,EAAA,EAAI,SAAA;AAAA,IACJ,IAAI,SAAA,GAAY,EAAA;AAAA,IAChB,CAAA,EAAG,cAAc,SAAA,GAAY,CAAA;AAAA,IAC7B,CAAA,EAAG,eAAe,SAAA,GAAY;AAAA,GAChC;AAEA,EAAA,MAAM,SAAwB,EAAC;AAC/B,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAAY;AAEtC,EAAA,IAAI,GAAA,CAAI,SAAS,UAAA,EAAY;AAE3B,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,KAAA,MAAW,CAAA,IAAK,IAAI,MAAA,EAAQ;AAC1B,MAAA,IAAI,EAAE,IAAA,KAAS,MAAA,IAAa,EAAE,IAAA,GAAO,OAAA,YAAmB,CAAA,CAAE,IAAA;AAAA,IAC5D;AAEA,IAAA,KAAA,MAAW,CAAA,IAAK,IAAI,MAAA,EAAQ;AAC1B,MAAA,MAAM,EAAE,EAAA,EAAI,EAAA,EAAG,GAAI,UAAA,CAAW,GAAG,IAAI,CAAA;AACrC,MAAA,MAAM,IAAI,aAAA,CAAc,CAAA,EAAG,SAAS,IAAA,EAAM,GAAA,CAAI,OAAO,WAAW,CAAA;AAChE,MAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,CAAA,CAAE,KAAK,CAAA;AACnC,MAAA,MAAM,KAAA,GAAqB;AAAA,QACzB,MAAM,CAAA,CAAE,KAAA;AAAA,QACR,EAAA,EAAI,EAAA;AAAA,QACJ,EAAA,EAAI,EAAA;AAAA,QACJ,EAAA,EAAI,EAAA,GAAK,CAAA,GAAI,CAAA,GAAI,KAAA,GAAQ,CAAA;AAAA,QACzB,EAAA,EAAI,KAAK,CAAA,GAAI,CAAA;AAAA,QACb,KAAA;AAAA,QACA,MAAA,EAAQ,OAAA;AAAA,QACR,QAAA,EAAU,KAAA;AAAA,QACV,UAAA,EAAY;AAAA,OACd;AACA,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,KAAA,EAAO,CAAA,EAAG,IAAI,EAAA,EAAI,CAAA,EAAG,OAAO,CAAA;AAC1C,MAAA,IAAI,CAAA,CAAE,QAAA,EAAU,aAAA,CAAc,GAAA,CAAI,EAAE,QAAQ,CAAA;AAAA,IAC9C;AAEA,IAAA,sBAAA,CAAuB,MAAA,EAAQ,IAAA,EAAM,GAAA,CAAI,MAAA,CAAO,cAAc,CAAA;AAAA,EAChE;AAEA,EAAA,OAAO;AAAA,IACL,WAAA;AAAA,IACA,YAAA;AAAA,IACA,IAAA;AAAA,IACA,MAAA;AAAA,IACA,UAAA,EAAY,CAAC,GAAG,aAAa;AAAA,GAC/B;AACF;;;AC/MA,IAAM,eAAA,GAAkB;AAAA,EACtB,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EACjC,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW;AACnC,CAAA;AAEA,IAAM,cAAA,GAAmD;AAAA;AAAA,EAEvD,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW;AACnC,CAAA;AAEA,IAAM,SAAA,GAAY;AAAA,EAChB,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW;AACpE,CAAA;AAEA,IAAM,GAAA,GAAM;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,CAAA,CA2BV,IAAA,EAAK;AAEP,SAAS,SAAA,GAAoB;AAC3B,EAAA,OAAOzE,oBAAA;AAAA,IACL,QAAA;AAAA,IACA;AAAA,MACE,EAAA,EAAI,iBAAA;AAAA,MACJ,OAAA,EAAS,WAAA;AAAA,MACT,IAAA,EAAM,CAAA;AAAA,MACN,IAAA,EAAM,CAAA;AAAA,MACN,WAAA,EAAa,CAAA;AAAA,MACb,YAAA,EAAc,CAAA;AAAA,MACd,MAAA,EAAQ;AAAA,KACV;AAAA,IACA,CAACA,qBAAG,MAAA,EAAQ,EAAE,GAAG,oBAAA,EAAsB,IAAA,EAAM,SAAA,EAAW,CAAC;AAAA,GAC3D;AACF;AAEA,SAAS,UAAA,CAAW,GAAgB,UAAA,EAA8B;AAChE,EAAA,IAAI,CAAA,CAAE,KAAA,EAAO,OAAO,CAAA,CAAE,KAAA;AACtB,EAAA,IAAI,EAAE,QAAA,EAAU;AACd,IAAA,MAAM,GAAA,GAAM,UAAA,CAAW,OAAA,CAAQ,CAAA,CAAE,QAAQ,CAAA;AACzC,IAAA,IAAI,OAAO,CAAA,EAAG,OAAO,eAAA,CAAgB,GAAA,GAAM,gBAAgB,MAAM,CAAA;AAAA,EACnE;AACA,EAAA,OAAO,SAAA;AACT;AAEA,SAAS,wBAAA,CAAyB,KAAgB,GAAA,EAAiC;AACjF,EAAA,IAAI,CAAC,GAAA,CAAI,MAAA,CAAO,UAAA,EAAY,OAAO,EAAA;AACnC,EAAA,MAAM,EAAE,MAAK,GAAI,GAAA;AAEjB,EAAA,IAAI,GAAA,CAAI,SAAS,KAAA,EAAO;AACtB,IAAA,MAAM,KAAA,GAAQ,KAAK,CAAA,GAAI,CAAA;AACvB,IAAA,MAAM,KAAA,GAAQ,KAAK,CAAA,GAAI,CAAA;AAEvB,IAAA,MAAM,KAAA,GAAQ;AAAA,MACZ,EAAE,CAAA,EAAG,IAAA,CAAK,EAAA,GAAK,OAAO,CAAA,EAAG,IAAA,CAAK,EAAA,EAAI,CAAA,EAAG,OAAO,CAAA,EAAG,KAAA,EAAO,IAAA,EAAM,cAAA,CAAe,CAAC,CAAA,EAAE;AAAA,MAC9E,EAAE,CAAA,EAAG,IAAA,CAAK,EAAA,EAAI,GAAG,IAAA,CAAK,EAAA,EAAI,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,IAAA,EAAM,cAAA,CAAe,CAAC,CAAA,EAAE;AAAA,MACtE,EAAE,CAAA,EAAG,IAAA,CAAK,EAAA,EAAI,GAAG,IAAA,CAAK,EAAA,GAAK,KAAA,EAAO,CAAA,EAAG,OAAO,CAAA,EAAG,KAAA,EAAO,IAAA,EAAM,cAAA,CAAe,CAAC,CAAA,EAAE;AAAA,MAC9E,EAAE,CAAA,EAAG,IAAA,CAAK,EAAA,GAAK,KAAA,EAAO,GAAG,IAAA,CAAK,EAAA,GAAK,KAAA,EAAO,CAAA,EAAG,OAAO,CAAA,EAAG,KAAA,EAAO,IAAA,EAAM,cAAA,CAAe,CAAC,CAAA;AAAE,KACxF;AACA,IAAA,OAAOH,uBAAA;AAAA,MACL,EAAE,IAAI,mBAAA,EAAoB;AAAA,MAC1B,KAAA,CAAM,GAAA;AAAA,QAAI,CAAC,MACTJ,sBAAA,CAAK,EAAE,GAAG,CAAA,CAAE,CAAA,EAAG,GAAG,CAAA,CAAE,CAAA,EAAG,OAAO,CAAA,CAAE,CAAA,EAAG,QAAQ,CAAA,CAAE,CAAA,EAAG,MAAM,CAAA,CAAE,IAAA,EAAM,cAAA,EAAgB,IAAA,EAAM;AAAA;AACtF,KACF;AAAA,EACF;AAIA,EAAA,IAAI,GAAA,CAAI,IAAA,KAAS,KAAA,IAAS,GAAA,CAAI,UAAU,OAAA,EAAS;AAC/C,IAAA,MAAM,KAAA,GAAQ,KAAK,CAAA,GAAI,CAAA;AACvB,IAAA,MAAM,KAAA,GAAQ,KAAK,CAAA,GAAI,CAAA;AAEvB,IAAA,MAAM,QAAA,GAAW;AAAA,MACf,SAAA;AAAA;AAAA,MACA,SAAA;AAAA;AAAA,MACA,SAAA;AAAA;AAAA,MACA,SAAA;AAAA;AAAA,MACA;AAAA;AAAA,KACF;AACA,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,CAAA,EAAG,GAAA,EAAA,EAAO;AAChC,MAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,CAAA,EAAG,GAAA,EAAA,EAAO;AAChC,QAAA,MAAM,QAAQ,GAAA,GAAM,GAAA;AACpB,QAAA,MAAM,IAAA,GAAO,SAAS,KAAK,CAAA;AAC3B,QAAA,MAAM,CAAA,GAAI,IAAA,CAAK,EAAA,GAAK,GAAA,GAAM,KAAA;AAC1B,QAAA,MAAM,CAAA,GAAI,IAAA,CAAK,EAAA,GAAA,CAAM,CAAA,GAAI,GAAA,IAAO,KAAA;AAChC,QAAA,KAAA,CAAM,IAAA;AAAA,UACJA,sBAAA,CAAK,EAAE,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,cAAA,EAAgB,GAAA,EAAK;AAAA,SACvE;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAOI,uBAAA,CAAM,EAAE,EAAA,EAAI,mBAAA,IAAuB,KAAK,CAAA;AAAA,EACjD;AAEA,EAAA,OAAO,EAAA;AACT;AAEA,SAAS,iBAAA,CAAkB,KAAgB,GAAA,EAAiC;AAG1E,EAAA,IAAI,GAAA,CAAI,KAAA,KAAU,OAAA,EAAS,OAAO,EAAA;AAClC,EAAA,IAAI,GAAA,CAAI,IAAA,KAAS,UAAA,EAAY,OAAO,EAAA;AACpC,EAAA,MAAM,EAAE,MAAK,GAAI,GAAA;AACjB,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,MAAM,CAAA,EAAA,EAAK;AACjC,IAAA,MAAM,IAAI,IAAA,CAAK,EAAA,GAAM,IAAA,CAAK,CAAA,GAAI,IAAK,GAAA,CAAI,IAAA;AACvC,IAAA,KAAA,CAAM,KAAKb,sBAAA,CAAO,EAAE,IAAI,CAAA,EAAG,EAAA,EAAI,KAAK,EAAA,EAAI,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,KAAK,EAAA,GAAK,IAAA,CAAK,GAAG,KAAA,EAAO,gBAAA,EAAkB,CAAC,CAAA;AAAA,EACjG;AACA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,MAAM,CAAA,EAAA,EAAK;AACjC,IAAA,MAAM,IAAI,IAAA,CAAK,EAAA,GAAM,IAAA,CAAK,CAAA,GAAI,IAAK,GAAA,CAAI,IAAA;AACvC,IAAA,KAAA,CAAM,KAAKA,sBAAA,CAAO,EAAE,IAAI,IAAA,CAAK,EAAA,EAAI,IAAI,CAAA,EAAG,EAAA,EAAI,IAAA,CAAK,EAAA,GAAK,KAAK,CAAA,EAAG,EAAA,EAAI,GAAG,KAAA,EAAO,gBAAA,EAAkB,CAAC,CAAA;AAAA,EACjG;AACA,EAAA,KAAA,CAAM,IAAA;AAAA,IACJS,sBAAA,CAAK;AAAA,MACH,GAAG,IAAA,CAAK,EAAA;AAAA,MACR,GAAG,IAAA,CAAK,EAAA;AAAA,MACR,OAAO,IAAA,CAAK,CAAA;AAAA,MACZ,QAAQ,IAAA,CAAK,CAAA;AAAA,MACb,KAAA,EAAO,uBAAA;AAAA,MACP,IAAA,EAAM;AAAA,KACP;AAAA,GACH;AACA,EAAA,OAAOI,uBAAA,CAAM,EAAE,EAAA,EAAI,wBAAA,IAA4B,KAAK,CAAA;AACtD;AAEA,SAAS,UAAA,CAAW,KAAgB,GAAA,EAAiC;AACnE,EAAA,IAAI,CAAC,GAAA,CAAI,MAAA,CAAO,SAAA,EAAW,OAAO,EAAA;AAClC,EAAA,IAAI,GAAA,CAAI,IAAA,KAAS,aAAA,EAAe,OAAO,EAAA;AACvC,EAAA,MAAM,EAAE,MAAK,GAAI,GAAA;AACjB,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,OAAO,GAAA,CAAI,IAAA;AACjB,EAAA,MAAM,OAAO,GAAA,CAAI,IAAA;AACjB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,EAAA,GAAM,IAAA,CAAK,IAAI,CAAA,GAAK,IAAA;AACnC,IAAA,MAAM,GAAA,GAAM,IAAA,KAAS,CAAA,IAAK,CAAA,KAAM,IAAI,eAAA,GAAkB,gBAAA;AACtD,IAAA,KAAA,CAAM,KAAKb,sBAAA,CAAO,EAAE,IAAI,CAAA,EAAG,EAAA,EAAI,KAAK,EAAA,EAAI,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,KAAK,EAAA,GAAK,IAAA,CAAK,GAAG,KAAA,EAAO,GAAA,EAAK,CAAC,CAAA;AAAA,EACpF;AACA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,EAAA,GAAM,IAAA,CAAK,IAAI,CAAA,GAAK,IAAA;AACnC,IAAA,MAAM,GAAA,GAAM,IAAA,KAAS,CAAA,IAAK,CAAA,KAAM,IAAI,eAAA,GAAkB,gBAAA;AACtD,IAAA,KAAA,CAAM,KAAKA,sBAAA,CAAO,EAAE,IAAI,IAAA,CAAK,EAAA,EAAI,IAAI,CAAA,EAAG,EAAA,EAAI,IAAA,CAAK,EAAA,GAAK,KAAK,CAAA,EAAG,EAAA,EAAI,GAAG,KAAA,EAAO,GAAA,EAAK,CAAC,CAAA;AAAA,EACpF;AAEA,EAAA,KAAA,CAAM,IAAA;AAAA,IACJS,sBAAA,CAAK;AAAA,MACH,GAAG,IAAA,CAAK,EAAA;AAAA,MACR,GAAG,IAAA,CAAK,EAAA;AAAA,MACR,OAAO,IAAA,CAAK,CAAA;AAAA,MACZ,QAAQ,IAAA,CAAK,CAAA;AAAA,MACb,KAAA,EAAO,uBAAA;AAAA,MACP,IAAA,EAAM;AAAA,KACP;AAAA,GACH;AACA,EAAA,OAAOI,uBAAA,CAAM,EAAE,EAAA,EAAI,gBAAA,IAAoB,KAAK,CAAA;AAC9C;AAEA,SAAS,eAAe,GAAA,EAAyB;AAC/C,EAAA,IAAI,GAAA,CAAI,MAAA,CAAO,QAAA,KAAa,IAAA,EAAM,OAAO,IAAA;AACzC,EAAA,IAAI,GAAA,CAAI,MAAA,CAAO,QAAA,KAAa,KAAA,EAAO,OAAO,KAAA;AAC1C,EAAA,OAAO,IAAI,IAAA,KAAS,UAAA;AACtB;AAEA,SAAS,UAAA,CAAW,KAAgB,GAAA,EAAiC;AACnE,EAAA,IAAI,CAAC,cAAA,CAAe,GAAG,CAAA,EAAG,OAAO,EAAA;AACjC,EAAA,MAAM,EAAE,MAAK,GAAI,GAAA;AACjB,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,MAAM,MAAA,GAAS,IAAI,MAAA,CAAO,UAAA,GAAa,EAAE,YAAA,EAAc,uBAAA,KAA4B,EAAC;AAGpF,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,EAAA,GAAK,IAAA,CAAK,CAAA,GAAI,EAAA;AAC9B,EAAA,MAAM,EAAA,GAAK,KAAK,EAAA,GAAK,EAAA;AACrB,EAAA,GAAA,CAAI,IAAA;AAAA,IACFb,sBAAA,CAAO;AAAA,MACL,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,EAAA,EAAI,EAAA;AAAA,MACJ,EAAA,EAAI,IAAA,CAAK,EAAA,GAAK,IAAA,CAAK,CAAA;AAAA,MACnB,EAAA,EAAI,EAAA;AAAA,MACJ,MAAA,EAAQ,SAAA;AAAA,MACR,cAAA,EAAgB,GAAA;AAAA,MAChB,GAAG;AAAA,KACJ;AAAA,GACH;AACA,EAAA,GAAA,CAAI,IAAA;AAAA,IACFA,sBAAA,CAAO;AAAA,MACL,EAAA,EAAI,EAAA;AAAA,MACJ,EAAA,EAAI,IAAA,CAAK,EAAA,GAAK,IAAA,CAAK,CAAA;AAAA,MACnB,EAAA,EAAI,EAAA;AAAA,MACJ,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,MAAA,EAAQ,SAAA;AAAA,MACR,cAAA,EAAgB,GAAA;AAAA,MAChB,GAAG;AAAA,KACJ;AAAA,GACH;AAGA,EAAA,IAAI,GAAA,CAAI,MAAM,GAAA,EAAK;AACjB,IAAA,GAAA,CAAI,IAAA;AAAA,MACFC,sBAAA;AAAA,QACE,EAAE,CAAA,EAAG,IAAA,CAAK,EAAA,EAAI,CAAA,EAAG,KAAK,EAAA,EAAI,KAAA,EAAO,oBAAA,EAAsB,aAAA,EAAe,OAAA,EAAQ;AAAA,QAC9E,IAAI,KAAA,CAAM;AAAA;AACZ,KACF;AAAA,EACF;AACA,EAAA,IAAI,GAAA,CAAI,MAAM,IAAA,EAAM;AAClB,IAAA,GAAA,CAAI,IAAA;AAAA,MACFA,sBAAA;AAAA,QACE,EAAE,CAAA,EAAG,IAAA,CAAK,EAAA,GAAK,IAAA,CAAK,CAAA,EAAG,CAAA,EAAG,EAAA,GAAK,EAAA,EAAI,KAAA,EAAO,oBAAA,EAAsB,aAAA,EAAe,KAAA,EAAM;AAAA,QACrF,IAAI,KAAA,CAAM;AAAA;AACZ,KACF;AAAA,EACF;AAEA,EAAA,IAAI,GAAA,CAAI,MAAM,GAAA,EAAK;AACjB,IAAA,GAAA,CAAI,IAAA;AAAA,MACFA,sBAAA;AAAA,QACE;AAAA,UACE,GAAG,EAAA,GAAK,EAAA;AAAA,UACR,CAAA,EAAG,IAAA,CAAK,EAAA,GAAK,IAAA,CAAK,CAAA;AAAA,UAClB,KAAA,EAAO,oBAAA;AAAA,UACP,aAAA,EAAe,KAAA;AAAA,UACf,SAAA,EAAW,cAAc,EAAA,GAAK,EAAE,IAAI,IAAA,CAAK,EAAA,GAAK,KAAK,CAAC,CAAA,CAAA;AAAA,SACtD;AAAA,QACA,IAAI,KAAA,CAAM;AAAA;AACZ,KACF;AAAA,EACF;AACA,EAAA,IAAI,GAAA,CAAI,MAAM,IAAA,EAAM;AAClB,IAAA,GAAA,CAAI,IAAA;AAAA,MACFA,sBAAA;AAAA,QACE;AAAA,UACE,GAAG,EAAA,GAAK,EAAA;AAAA,UACR,GAAG,IAAA,CAAK,EAAA;AAAA,UACR,KAAA,EAAO,oBAAA;AAAA,UACP,aAAA,EAAe,OAAA;AAAA,UACf,WAAW,CAAA,WAAA,EAAc,EAAA,GAAK,EAAE,CAAA,CAAA,EAAI,KAAK,EAAE,CAAA,CAAA;AAAA,SAC7C;AAAA,QACA,IAAI,KAAA,CAAM;AAAA;AACZ,KACF;AAAA,EACF;AACA,EAAA,OAAOY,uBAAA,CAAM,EAAE,EAAA,EAAI,gBAAA,IAAoB,GAAG,CAAA;AAC5C;AAEA,SAAS,qBAAA,CAAsB,KAAgB,GAAA,EAAiC;AAC9E,EAAA,IAAI,CAAC,GAAA,CAAI,MAAA,CAAO,mBAAA,IAAuB,GAAA,CAAI,IAAA,KAAS,KAAA,IAAS,GAAA,CAAI,WAAA,CAAY,MAAA,KAAW,CAAA,EAAG,OAAO,EAAA;AAElG,EAAA,IAAI,GAAA,CAAI,KAAA,KAAU,OAAA,EAAS,OAAO,EAAA;AAClC,EAAA,MAAM,EAAE,MAAK,GAAI,GAAA;AACjB,EAAc,KAAK,CAAA,GAAI;AACvB,EAAc,KAAK,CAAA,GAAI;AACvB,EAAA,MAAM,OAAA,GAAU,EAAA;AAChB,EAAA,MAAM,SAAA,GAA6E;AAAA,IACjF,CAAA,EAAG,EAAE,CAAA,EAAG,IAAA,CAAK,KAAK,IAAA,CAAK,CAAA,GAAI,OAAA,EAAS,CAAA,EAAG,IAAA,CAAK,EAAA,GAAK,OAAA,GAAU,EAAA,EAAI,QAAQ,KAAA,EAAM;AAAA;AAAA,IAC7E,CAAA,EAAG,EAAE,CAAA,EAAG,IAAA,CAAK,EAAA,GAAK,OAAA,EAAS,CAAA,EAAG,IAAA,CAAK,EAAA,GAAK,OAAA,GAAU,EAAA,EAAI,MAAA,EAAQ,OAAA,EAAQ;AAAA;AAAA,IACtE,CAAA,EAAG,EAAE,CAAA,EAAG,IAAA,CAAK,EAAA,GAAK,OAAA,EAAS,CAAA,EAAG,IAAA,CAAK,EAAA,GAAK,IAAA,CAAK,CAAA,GAAI,OAAA,EAAS,QAAQ,OAAA,EAAQ;AAAA;AAAA,IAC1E,CAAA,EAAG,EAAE,CAAA,EAAG,IAAA,CAAK,KAAK,IAAA,CAAK,CAAA,GAAI,OAAA,EAAS,CAAA,EAAG,KAAK,EAAA,GAAK,IAAA,CAAK,CAAA,GAAI,OAAA,EAAS,QAAQ,KAAA;AAAM;AAAA,GACnF;AAKA,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,WAAA,EAAa;AAC/B,IAAA,MAAM,GAAA,GAAM,SAAA,CAAU,CAAA,CAAE,CAAC,CAAA;AACzB,IAAA,MAAM,OAAA,GAAU,CAAA,CAAE,CAAA,KAAM,CAAA,IAAK,EAAE,CAAA,KAAM,CAAA;AACrC,IAAA,MAAM,SAAA,GAAY,EAAE,WAAA,GAAc,SAAA,CAAU,EAAE,WAAA,EAAa,EAAE,IAAI,EAAC;AAElE,IAAA,MAAM,MAAA,GAAS,OAAA,IAAW,SAAA,CAAU,MAAA,GAAS,CAAA,GAAI,IAAI,CAAA,GAAI,SAAA,CAAU,MAAA,GAAS,EAAA,GAAK,GAAA,CAAI,CAAA;AACrF,IAAA,KAAA,CAAM,IAAA;AAAA,MACJZ,sBAAA;AAAA,QACE,EAAE,CAAA,EAAG,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,QAAQ,KAAA,EAAO,sBAAA,EAAwB,aAAA,EAAe,GAAA,CAAI,MAAA,EAAO;AAAA,QAChF,CAAA,CAAE;AAAA;AACJ,KACF;AACA,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,SAAA,CAAU,QAAQ,CAAA,EAAA,EAAK;AACzC,MAAA,KAAA,CAAM,IAAA;AAAA,QACJA,sBAAA;AAAA,UACE;AAAA,YACE,GAAG,GAAA,CAAI,CAAA;AAAA,YACP,CAAA,EAAG,MAAA,GAAS,EAAA,GAAK,CAAA,GAAI,EAAA;AAAA,YACrB,KAAA,EAAO,qBAAA;AAAA,YACP,eAAe,GAAA,CAAI;AAAA,WACrB;AAAA,UACA,UAAU,CAAC;AAAA;AACb,OACF;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAOY,uBAAA,CAAM,EAAE,EAAA,EAAI,sBAAA,IAA0B,KAAK,CAAA;AACpD;AAEA,SAAS,SAAA,CAAUZ,OAAc,QAAA,EAA4B;AAC3D,EAAA,MAAM,KAAA,GAAQA,KAAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAC9B,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,IAAA,CAAK,MAAM,GAAA,GAAM,CAAA,EAAG,IAAA,EAAK,CAAE,SAAS,QAAA,EAAU;AAC5C,MAAA,IAAI,GAAA,EAAK,GAAA,CAAI,IAAA,CAAK,GAAG,CAAA;AACrB,MAAA,GAAA,GAAM,CAAA;AAAA,IACR,CAAA,MAAO;AACL,MAAA,GAAA,GAAA,CAAO,GAAA,GAAM,GAAA,GAAM,GAAA,GAAM,EAAA,IAAM,CAAA;AAAA,IACjC;AAAA,EACF;AACA,EAAA,IAAI,GAAA,EAAK,GAAA,CAAI,IAAA,CAAK,GAAG,CAAA;AACrB,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,UAAA,CAAW,GAAA,EAAa,GAAA,EAAa,IAAA,EAAc,IAAA,EAAyC;AACnG,EAAA,IAAI,IAAA,KAAS,CAAA,IAAK,IAAA,KAAS,CAAA,EAAG,OAAO,MAAA;AACrC,EAAA,IAAI,GAAA,KAAQ,CAAA,IAAK,GAAA,KAAQ,CAAA,EAAG,OAAO,CAAA;AACnC,EAAA,IAAI,GAAA,KAAQ,CAAA,IAAK,GAAA,KAAQ,CAAA,EAAG,OAAO,CAAA;AACnC,EAAA,IAAI,GAAA,KAAQ,CAAA,IAAK,GAAA,KAAQ,CAAA,EAAG,OAAO,CAAA;AACnC,EAAA,IAAI,GAAA,KAAQ,CAAA,IAAK,GAAA,KAAQ,CAAA,EAAG,OAAO,CAAA;AACnC,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,gBAAA,CAAiB,KAAgB,GAAA,EAAiC;AACzE,EAAA,IAAI,IAAI,IAAA,KAAS,UAAA,IAAc,IAAI,UAAA,CAAW,MAAA,KAAW,GAAG,OAAO,EAAA;AACnE,EAAA,IAAI,IAAI,IAAA,KAAS,KAAA,IAAS,GAAA,CAAI,IAAA,KAAS,OAAO,OAAO,EAAA;AAErD,EAAA,MAAM,EAAE,MAAK,GAAI,GAAA;AACjB,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,CAAA,GAAI,GAAA,CAAI,IAAA;AAC3B,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,CAAA,GAAI,GAAA,CAAI,IAAA;AAE3B,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAsB;AAC1C,EAAA,KAAA,MAAW,EAAA,IAAM,IAAI,UAAA,EAAY;AAC/B,IAAA,MAAM,IAAI,CAAA,EAAG,EAAA,CAAG,GAAG,CAAA,CAAA,EAAI,GAAG,GAAG,CAAA,CAAA;AAC7B,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAK,EAAC;AAC/B,IAAA,GAAA,CAAI,IAAA,CAAK,GAAG,KAAK,CAAA;AACjB,IAAA,OAAA,CAAQ,GAAA,CAAI,GAAG,GAAG,CAAA;AAAA,EACpB;AAEA,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,eAAA,GAAkB,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAA,CAAO,KAAA,GAAQ,EAAA,IAAM,GAAG,CAAC,CAAA;AAClE,EAAA,MAAM,SAAA,GAAY,IAAI,KAAA,KAAU,OAAA;AAIhC,EAAA,IAAI,SAAA,IAAa,GAAA,CAAI,IAAA,KAAS,KAAA,EAAO;AACnC,IAAA,KAAA,MAAW,CAAA,IAAK,IAAI,WAAA,EAAa;AAC/B,MAAA,MAAM,QAAQ,MAAM;AAClB,QAAA,QAAQ,EAAE,CAAA;AAAG,UACX,KAAK,CAAA;AAAG,YAAA,OAAO,EAAE,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAE;AAAA,UAChC,KAAK,CAAA;AAAG,YAAA,OAAO,EAAE,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAE;AAAA,UAChC,KAAK,CAAA;AAAG,YAAA,OAAO,EAAE,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAE;AAAA,UAChC,KAAK,CAAA;AAAG,YAAA,OAAO,EAAE,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAE;AAAA;AAClC,MACF,CAAA,GAAG;AACH,MAAA,MAAM,IAAI,CAAA,EAAG,IAAA,CAAK,GAAG,CAAA,CAAA,EAAI,KAAK,GAAG,CAAA,CAAA;AACjC,MAAA,IAAI,CAAC,QAAQ,GAAA,CAAI,CAAC,GAAG,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAG,EAAE,CAAA;AAAA,IACxC;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,KAAK,CAAA,IAAK,OAAA,EAAS;AAChC,IAAA,MAAM,CAAC,KAAK,GAAG,CAAA,GAAI,EAAE,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AAC1C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,EAAA,GAAK,KAAA,GAAQ,GAAA;AAChC,IAAA,MAAM,QAAQ,IAAA,CAAK,EAAA,GAAK,KAAA,IAAS,GAAA,CAAI,OAAO,CAAA,GAAI,GAAA,CAAA;AAGhD,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,IAAK,CAAC,SAAA,EAAW;AACpC,MAAA,MAAM,EAAA,GAAK,QAAQ,KAAA,GAAQ,CAAA;AAC3B,MAAA,MAAM,EAAA,GAAK,QAAQ,KAAA,GAAQ,CAAA;AAC3B,MAAA,KAAA,CAAM,IAAA,CAAKA,sBAAA,CAAO,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,KAAA,EAAO,sBAAA,EAAuB,EAAG,KAAA,CAAM,CAAC,CAAE,CAAC,CAAA;AAC7E,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,IAAA,GAAO,EAAA;AACb,IAAA,MAAM,IAAA,GAAO,EAAA;AACb,IAAA,IAAI,OAAA,GAAU,QAAQ,IAAA,GAAO,EAAA;AAE7B,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,MAAM,IAAI,UAAA,CAAW,GAAA,EAAK,KAAK,GAAA,CAAI,IAAA,EAAM,IAAI,IAAI,CAAA;AACjD,MAAA,MAAM,KAAA,GAAQ,CAAA,GAAI,GAAA,CAAI,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,CAAA,KAAM,CAAC,CAAA,GAAI,MAAA;AAC3D,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,KAAA,CAAM,IAAA;AAAA,UACJA,sBAAA;AAAA,YACE,EAAE,CAAA,EAAG,KAAA,GAAQ,KAAA,GAAQ,CAAA,EAAG,GAAG,OAAA,EAAS,KAAA,EAAO,sBAAA,EAAwB,aAAA,EAAe,QAAA,EAAS;AAAA,YAC3F,KAAA,CAAM;AAAA;AACR,SACF;AACA,QAAA,OAAA,IAAW,EAAA;AACX,QAAA,IAAI,MAAM,WAAA,EAAa;AACrB,UAAA,MAAM,SAAA,GAAY,UAAU,KAAA,CAAM,WAAA,EAAa,KAAK,GAAA,CAAI,EAAA,EAAI,eAAe,CAAC,CAAA;AAC5E,UAAA,KAAA,MAAW,MAAM,SAAA,EAAW;AAC1B,YAAA,KAAA,CAAM,IAAA;AAAA,cACJA,sBAAA;AAAA,gBACE,EAAE,CAAA,EAAG,KAAA,GAAQ,KAAA,GAAQ,CAAA,EAAG,GAAG,OAAA,EAAS,KAAA,EAAO,yBAAA,EAA2B,aAAA,EAAe,QAAA,EAAS;AAAA,gBAC9F;AAAA;AACF,aACF;AACA,YAAA,OAAA,IAAW,EAAA;AAAA,UACb;AACA,UAAA,OAAA,IAAW,CAAA;AAAA,QACb;AAAA,MACF;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,IAAA,EAAM,eAAe,CAAA;AAC7C,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,QAAA,MAAM,MAAA,GAAS,SAAA,GAAa,CAAA,KAAM,CAAA,GAAI,aAAQ,MAAA,GAAU,EAAA;AACxD,QAAA,KAAA,CAAM,IAAA;AAAA,UACJA,sBAAA;AAAA,YACE,EAAE,GAAG,KAAA,GAAQ,IAAA,EAAM,GAAG,OAAA,EAAS,KAAA,EAAO,qBAAA,EAAuB,aAAA,EAAe,OAAA,EAAQ;AAAA,YACpF,MAAA,GAAS,MAAM,CAAC;AAAA;AAClB,SACF;AACA,QAAA,OAAA,IAAW,EAAA;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAOY,uBAAA,CAAM,EAAE,EAAA,EAAI,uBAAA,IAA2B,KAAK,CAAA;AACrD;AAEA,SAAS,aAAA,CAAc,KAAgB,GAAA,EAAiC;AACtE,EAAA,IAAI,GAAA,CAAI,IAAA,KAAS,SAAA,EAAW,OAAO,EAAA;AACnC,EAAA,MAAM,EAAE,MAAK,GAAI,GAAA;AACjB,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,CAAA,GAAI,GAAA,CAAI,IAAA;AAC3B,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,CAAA,GAAI,GAAA,CAAI,IAAA;AAC3B,EAAA,MAAM,SAAS,IAAA,CAAK,GAAA;AAAA,IAClB,CAAA;AAAA,IACA,GAAG,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,IAAA,CAAU,CAAA,CAAE,GAAA,GAAM,CAAA,KAAM,CAAA,CAAE,MAAM,CAAA,CAAE;AAAA,GAC9D;AAEA,EAAA,MAAM,QAAkB,EAAC;AAGzB,EAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,GAAA,CAAI,MAAM,GAAA,EAAA,EAAO;AACvC,IAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,GAAA,CAAI,MAAM,GAAA,EAAA,EAAO;AACvC,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,GAAA,KAAQ,GAAA,IAAO,CAAA,CAAE,GAAA,KAAQ,GAAG,CAAA;AAClE,MAAA,MAAM,KAAA,GAAQ,KAAA,EAAO,KAAA,IAAA,CAAU,GAAA,GAAM,MAAM,GAAA,GAAM,CAAA,CAAA;AACjD,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,QAAQ,MAAM,CAAA;AACxC,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,SAAA,CAAU,MAAA,GAAS,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,SAAA,CAAU,MAAM,CAAC,CAAA;AAC/E,MAAA,MAAM,KAAA,GAAQ,UAAU,GAAG,CAAA;AAC3B,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,EAAA,GAAK,GAAA,GAAM,KAAA;AAC1B,MAAA,MAAM,IAAI,IAAA,CAAK,EAAA,GAAA,CAAM,GAAA,CAAI,IAAA,GAAO,IAAI,GAAA,IAAO,KAAA;AAC3C,MAAA,KAAA,CAAM,IAAA;AAAA,QACJJ,sBAAA,CAAK;AAAA,UACH,CAAA;AAAA,UACA,CAAA;AAAA,UACA,KAAA,EAAO,KAAA;AAAA,UACP,MAAA,EAAQ,KAAA;AAAA,UACR,IAAA,EAAM,KAAA;AAAA,UACN,MAAA,EAAQ,MAAA;AAAA,UACR,cAAA,EAAgB;AAAA,SACjB;AAAA,OACH;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,IAAI,SAAA,EAAW;AACjB,IAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,GAAA,CAAI,MAAM,GAAA,EAAA,EAAO;AACvC,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,SAAA,CAAU,GAAG,CAAA;AAC7B,MAAA,IAAI,CAAC,GAAA,EAAK;AACV,MAAA,MAAM,IAAI,IAAA,CAAK,EAAA,GAAA,CAAM,IAAI,IAAA,GAAO,CAAA,GAAI,MAAM,GAAA,IAAO,KAAA;AACjD,MAAA,KAAA,CAAM,IAAA;AAAA,QACJR,sBAAA;AAAA,UACE;AAAA,YACE,CAAA,EAAG,KAAK,EAAA,GAAK,CAAA;AAAA,YACb,CAAA;AAAA,YACA,KAAA,EAAO,oBAAA;AAAA,YACP,aAAA,EAAe,KAAA;AAAA,YACf,mBAAA,EAAqB;AAAA,WACvB;AAAA,UACA;AAAA;AACF,OACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,IAAI,SAAA,EAAW;AACjB,IAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,GAAA,CAAI,MAAM,GAAA,EAAA,EAAO;AACvC,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,SAAA,CAAU,GAAG,CAAA;AAC7B,MAAA,IAAI,CAAC,GAAA,EAAK;AACV,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,EAAA,GAAA,CAAM,GAAA,GAAM,GAAA,IAAO,KAAA;AAClC,MAAA,KAAA,CAAM,IAAA;AAAA,QACJA,sBAAA;AAAA,UACE;AAAA,YACE,CAAA;AAAA,YACA,CAAA,EAAG,IAAA,CAAK,EAAA,GAAK,IAAA,CAAK,CAAA,GAAI,EAAA;AAAA,YACtB,KAAA,EAAO,oBAAA;AAAA,YACP,aAAA,EAAe;AAAA,WACjB;AAAA,UACA;AAAA;AACF,OACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,EAAA,IAAM,IAAI,UAAA,EAAY;AAC/B,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,EAAA,GAAK,KAAA,IAAS,GAAG,GAAA,GAAM,GAAA,CAAA;AACvC,IAAA,MAAM,EAAA,GAAK,KAAK,EAAA,GAAK,KAAA,IAAS,IAAI,IAAA,GAAO,CAAA,GAAI,GAAG,GAAA,GAAM,GAAA,CAAA;AAEtD,IAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,KAAA,CAAM,KAAA,CAAM,KAAK,CAAA;AAClC,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,IAAI,GAAA,GAAM,EAAA;AACV,IAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,MAAA,IAAA,CAAK,MAAM,GAAA,GAAM,CAAA,EAAG,IAAA,EAAK,CAAE,SAAS,EAAA,EAAI;AACtC,QAAA,IAAI,GAAA,EAAK,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA;AACvB,QAAA,GAAA,GAAM,CAAA;AAAA,MACR,CAAA,MAAO;AACL,QAAA,GAAA,GAAA,CAAO,GAAA,GAAM,GAAA,GAAM,GAAA,GAAM,EAAA,IAAM,CAAA;AAAA,MACjC;AAAA,IACF;AACA,IAAA,IAAI,GAAA,EAAK,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA;AACvB,IAAA,MAAM,KAAA,GAAQ,EAAA;AACd,IAAA,MAAM,MAAA,GAAS,EAAA,GAAA,CAAO,KAAA,CAAM,MAAA,GAAS,KAAK,KAAA,GAAS,CAAA;AACnD,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,MAAA,KAAA,CAAM,IAAA;AAAA,QACJA,sBAAA;AAAA,UACE;AAAA,YACE,CAAA,EAAG,EAAA;AAAA,YACH,CAAA,EAAG,SAAS,CAAA,GAAI,KAAA;AAAA,YAChB,KAAA,EAAO,sBAAA;AAAA,YACP,mBAAA,EAAqB;AAAA,WACvB;AAAA,UACA,MAAM,CAAC;AAAA;AACT,OACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAOY,uBAAA,CAAM,EAAE,EAAA,EAAI,mBAAA,IAAuB,KAAK,CAAA;AACjD;AAEA,IAAM,UAAA,GAA2D;AAAA,EAC/D,MAAA,EAAQ,SAAA;AAAA,EACR,MAAA,EAAQ,SAAA;AAAA,EACR,IAAA,EAAM;AACR,CAAA;AAEA,SAAS,eAAe,CAAA,EAAyC;AAC/D,EAAA,IAAI,CAAA,IAAK,GAAG,OAAO,QAAA;AACnB,EAAA,IAAI,CAAA,IAAK,GAAG,OAAO,QAAA;AACnB,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,iBAAA,CAAkB,KAAgB,GAAA,EAAiC;AAC1E,EAAA,IAAI,GAAA,CAAI,IAAA,KAAS,aAAA,EAAe,OAAO,EAAA;AACvC,EAAA,MAAM,EAAE,MAAK,GAAI,GAAA;AACjB,EAAA,MAAM,UAAA,GAAa,GAAA,CAAI,MAAA,CAAO,OAAA,GAAU,CAAA,GAAI,CAAA;AAC5C,EAAA,MAAM,UAAA,GAAa,GAAA,CAAI,MAAA,CAAO,OAAA,GAAU,CAAA,GAAI,CAAA;AAC5C,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,CAAA,IAAK,GAAA,CAAI,IAAA,GAAO,UAAA,CAAA;AACnC,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,CAAA,IAAK,GAAA,CAAI,IAAA,GAAO,UAAA,CAAA;AACnC,EAAA,MAAM,KAAA,GAAQ,QAAQ,GAAA,CAAI,IAAA;AAC1B,EAAA,MAAM,KAAA,GAAQ,QAAQ,GAAA,CAAI,IAAA;AAC1B,EAAA,MAAM,QAAkB,EAAC;AAGzB,EAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,GAAA,CAAI,MAAM,GAAA,EAAA,EAAO;AACvC,IAAA,MAAM,IAAI,IAAA,CAAK,EAAA,GAAA,CAAM,GAAA,CAAI,IAAA,GAAO,IAAI,GAAA,IAAO,KAAA;AAC3C,IAAA,KAAA,CAAM,IAAA;AAAA,MACJJ,sBAAA,CAAK;AAAA,QACH,GAAG,IAAA,CAAK,EAAA;AAAA,QACR,CAAA;AAAA,QACA,KAAA,EAAO,KAAA;AAAA,QACP,MAAA,EAAQ,KAAA;AAAA,QACR,KAAA,EAAO,GAAA,GAAM,CAAA,KAAM,CAAA,GAAI,wBAAA,GAA2B;AAAA,OACnD;AAAA,KACH;AAAA,EACF;AAGA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,GAAA,CAAI,MAAM,CAAA,EAAA,EAAK;AAClC,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,EAAA,GAAK,CAAA,GAAI,KAAA;AACxB,IAAA,KAAA,CAAM,KAAKT,sBAAA,CAAO,EAAE,EAAA,EAAI,CAAA,EAAG,IAAI,IAAA,CAAK,EAAA,EAAI,EAAA,EAAI,CAAA,EAAG,IAAI,IAAA,CAAK,EAAA,GAAK,OAAO,KAAA,EAAO,qBAAA,EAAuB,CAAC,CAAA;AAAA,EACrG;AACA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,GAAA,CAAI,MAAM,CAAA,EAAA,EAAK;AAClC,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,EAAA,GAAK,CAAA,GAAI,KAAA;AACxB,IAAA,KAAA,CAAM,KAAKA,sBAAA,CAAO,EAAE,EAAA,EAAI,IAAA,CAAK,IAAI,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,IAAA,CAAK,KAAK,KAAA,EAAO,EAAA,EAAI,GAAG,KAAA,EAAO,qBAAA,EAAuB,CAAC,CAAA;AAAA,EACrG;AAGA,EAAA,MAAM,IAAA,GAAO,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,KAAA,EAAO,KAAK,CAAA,GAAI,IAAI,CAAA;AACtD,EAAA,MAAM,UAAU,IAAI,KAAA,CAAM,IAAI,IAAI,CAAA,CAAE,KAAK,CAAC,CAAA;AAC1C,EAAA,MAAM,UAAU,IAAI,KAAA,CAAM,IAAI,IAAI,CAAA,CAAE,KAAK,CAAC,CAAA;AAC1C,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,KAAA,EAAO;AACzB,IAAA,IAAI,CAAA,CAAE,GAAA,GAAM,CAAA,IAAK,CAAA,CAAE,GAAA,IAAO,GAAA,CAAI,IAAA,IAAQ,CAAA,CAAE,GAAA,GAAM,CAAA,IAAK,CAAA,CAAE,GAAA,IAAO,IAAI,IAAA,EAAM;AACtE,IAAA,MAAM,CAAA,GAAI,CAAA,CAAE,KAAA,KAAU,CAAA,CAAE,KAAA,GAAS,CAAA,CAAE,KAAA,KAAU,QAAA,GAAW,CAAA,GAAI,CAAA,CAAE,KAAA,KAAU,QAAA,GAAW,IAAI,CAAA,GAAK,CAAA,CAAA;AAC5F,IAAA,IAAI,KAAK,CAAA,EAAG;AACZ,IAAA,OAAA,CAAQ,CAAA,CAAE,GAAG,CAAA,IAAK,CAAA;AAClB,IAAA,OAAA,CAAQ,CAAA,CAAE,GAAG,CAAA,IAAK,CAAA;AAClB,IAAA,MAAM,GAAA,GAAM,CAAA,CAAE,KAAA,IAAS,cAAA,CAAe,CAAC,CAAA;AACvC,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,EAAA,GAAA,CAAM,CAAA,CAAE,MAAM,GAAA,IAAO,KAAA;AACrC,IAAA,MAAM,EAAA,GAAK,KAAK,EAAA,GAAA,CAAM,GAAA,CAAI,OAAO,CAAA,GAAI,CAAA,CAAE,MAAM,GAAA,IAAO,KAAA;AACpD,IAAA,KAAA,CAAM,IAAA;AAAA,MACJU,wBAAA,CAAO;AAAA,QACL,EAAA;AAAA,QACA,EAAA;AAAA,QACA,CAAA,EAAG,IAAA;AAAA,QACH,IAAA,EAAM,WAAW,GAAG,CAAA;AAAA,QACpB,MAAA,EAAQ,WAAW,GAAG,CAAA;AAAA,QACtB,cAAA,EAAgB;AAAA,OACjB;AAAA,KACH;AAAA,EACF;AAGA,EAAA,IAAI,IAAI,SAAA,EAAW;AACjB,IAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,GAAA,CAAI,MAAM,GAAA,EAAA,EAAO;AACvC,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,SAAA,CAAU,GAAG,CAAA;AAC/B,MAAA,IAAI,CAAC,KAAA,EAAO;AACZ,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,EAAA,GAAA,CAAM,GAAA,GAAM,GAAA,IAAO,KAAA;AACnC,MAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,KAAA,EAAO,EAAE,CAAA;AACjC,MAAA,MAAM,SAAS,IAAA,CAAK,EAAA,GAAK,CAAA,GAAA,CAAK,KAAA,CAAM,SAAS,CAAA,IAAK,EAAA;AAClD,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,QAAA,KAAA,CAAM,IAAA;AAAA,UACJT,sBAAA;AAAA,YACE,EAAE,GAAG,EAAA,EAAI,CAAA,EAAG,SAAS,CAAA,GAAI,EAAA,EAAI,OAAO,uBAAA,EAAwB;AAAA,YAC5D,MAAM,CAAC;AAAA;AACT,SACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,IAAI,SAAA,EAAW;AACjB,IAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,GAAA,CAAI,MAAM,GAAA,EAAA,EAAO;AACvC,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,SAAA,CAAU,GAAG,CAAA;AAC/B,MAAA,IAAI,CAAC,KAAA,EAAO;AACZ,MAAA,MAAM,IAAI,IAAA,CAAK,EAAA,GAAA,CAAM,IAAI,IAAA,GAAO,CAAA,GAAI,MAAM,GAAA,IAAO,KAAA;AACjD,MAAA,KAAA,CAAM,IAAA;AAAA,QACJA,sBAAA,CAAO,EAAE,CAAA,EAAG,IAAA,CAAK,EAAA,GAAK,GAAG,CAAA,EAAG,KAAA,EAAO,yBAAA,EAA0B,EAAG,KAAK;AAAA,OACvE;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,GAAA,CAAI,OAAO,OAAA,EAAS;AAEtB,IAAA,MAAM,QAAA,GAAW,OAAO,OAAO,CAAA;AAC/B,IAAA,MAAM,QAAA,GAAW,OAAO,OAAO,CAAA;AAC/B,IAAA,MAAM,OAAA,GAAU,QAAQ,MAAA,GAAS,CAAA,GAAI,KAAK,GAAA,CAAI,GAAG,OAAO,CAAA,GAAI,CAAA;AAC5D,IAAA,MAAM,OAAA,GAAU,QAAQ,MAAA,GAAS,CAAA,GAAI,KAAK,GAAA,CAAI,GAAG,OAAO,CAAA,GAAI,CAAA;AAG5D,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,EAAA,GAAK,KAAA,GAAQ,KAAA,GAAQ,GAAA;AAC5C,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,EAAA,GAAK,KAAA,GAAQ,KAAA,GAAQ,GAAA;AAC3C,IAAA,KAAA,CAAM,IAAA,CAAKA,sBAAA,CAAO,EAAE,CAAA,EAAG,SAAA,EAAW,CAAA,EAAG,IAAA,CAAK,EAAA,GAAK,CAAA,EAAG,KAAA,EAAO,uBAAA,EAAwB,EAAG,OAAO,CAAC,CAAA;AAC5F,IAAA,KAAA,CAAM,IAAA,CAAKA,sBAAA,CAAO,EAAE,CAAA,EAAG,QAAA,EAAU,CAAA,EAAG,IAAA,CAAK,EAAA,GAAK,CAAA,EAAG,KAAA,EAAO,uBAAA,EAAwB,EAAG,MAAM,CAAC,CAAA;AAC1F,IAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,GAAA,CAAI,MAAM,GAAA,EAAA,EAAO;AACvC,MAAA,MAAM,IAAI,IAAA,CAAK,EAAA,GAAA,CAAM,IAAI,IAAA,GAAO,CAAA,GAAI,MAAM,GAAA,IAAO,KAAA;AACjD,MAAA,MAAM,GAAA,GAAM,QAAQ,GAAG,CAAA;AACvB,MAAA,MAAM,IAAA,GAAO,SAAS,GAAG,CAAA;AACzB,MAAA,MAAM,GAAA,GAAM,GAAA,KAAQ,OAAA,IAAW,GAAA,GAAM,IACjC,4BAAA,GACA,uBAAA;AACJ,MAAA,KAAA,CAAM,IAAA,CAAKA,sBAAA,CAAO,EAAE,CAAA,EAAG,SAAA,EAAW,CAAA,EAAG,KAAA,EAAO,GAAA,EAAI,EAAG,MAAA,CAAO,GAAG,CAAC,CAAC,CAAA;AAC/D,MAAA,KAAA,CAAM,IAAA;AAAA,QACJA,sBAAA,CAAO,EAAE,CAAA,EAAG,QAAA,EAAU,CAAA,EAAG,KAAA,EAAO,IAAA,KAAS,CAAA,GAAI,4BAAA,GAA+B,uBAAA,EAAwB,EAAG,MAAA,CAAO,IAAI,CAAC;AAAA,OACrH;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,EAAA,GAAK,KAAA,GAAQ,KAAA,GAAQ,GAAA;AAC5C,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,EAAA,GAAK,KAAA,GAAQ,KAAA,GAAQ,GAAA;AAC3C,IAAA,KAAA,CAAM,IAAA;AAAA,MACJA,sBAAA;AAAA,QACE,EAAE,GAAG,IAAA,CAAK,EAAA,GAAK,GAAG,CAAA,EAAG,SAAA,EAAW,OAAO,yBAAA,EAA0B;AAAA,QACjE;AAAA;AACF,KACF;AACA,IAAA,KAAA,CAAM,IAAA;AAAA,MACJA,sBAAA;AAAA,QACE,EAAE,GAAG,IAAA,CAAK,EAAA,GAAK,GAAG,CAAA,EAAG,QAAA,EAAU,OAAO,yBAAA,EAA0B;AAAA,QAChE;AAAA;AACF,KACF;AACA,IAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,GAAA,CAAI,MAAM,GAAA,EAAA,EAAO;AACvC,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,EAAA,GAAA,CAAM,GAAA,GAAM,GAAA,IAAO,KAAA;AACnC,MAAA,MAAM,GAAA,GAAM,QAAQ,GAAG,CAAA;AACvB,MAAA,MAAM,IAAA,GAAO,SAAS,GAAG,CAAA;AACzB,MAAA,KAAA,CAAM,IAAA;AAAA,QACJA,sBAAA;AAAA,UACE;AAAA,YACE,CAAA,EAAG,EAAA;AAAA,YACH,CAAA,EAAG,SAAA;AAAA,YACH,KAAA,EAAO,GAAA,KAAQ,OAAA,IAAW,GAAA,GAAM,IAAI,4BAAA,GAA+B;AAAA,WACrE;AAAA,UACA,OAAO,GAAG;AAAA;AACZ,OACF;AACA,MAAA,KAAA,CAAM,IAAA;AAAA,QACJA,sBAAA;AAAA,UACE;AAAA,YACE,CAAA,EAAG,EAAA;AAAA,YACH,CAAA,EAAG,QAAA;AAAA,YACH,KAAA,EAAO,IAAA,KAAS,CAAA,GAAI,4BAAA,GAA+B;AAAA,WACrD;AAAA,UACA,OAAO,IAAI;AAAA;AACb,OACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAOY,uBAAA,CAAM,EAAE,EAAA,EAAI,uBAAA,IAA2B,KAAK,CAAA;AACrD;AAEA,SAAS,OAAO,IAAA,EAA0B;AACxC,EAAA,MAAM,MAAA,GAAS,CAAC,GAAG,IAAI,EAAE,GAAA,CAAI,CAAC,GAAG,CAAA,MAAO,EAAE,GAAG,CAAA,EAAE,CAAE,EAAE,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA;AAC3E,EAAA,MAAM,QAAQ,IAAI,KAAA,CAAM,KAAK,MAAM,CAAA,CAAE,KAAK,CAAC,CAAA;AAC3C,EAAA,IAAI,IAAA,GAAO,CAAA,QAAA;AACX,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,IAAA,EAAA;AACA,IAAA,IAAI,CAAA,CAAE,MAAM,IAAA,EAAM;AAChB,MAAA,IAAA,GAAO,IAAA;AACP,MAAA,IAAA,GAAO,CAAA,CAAE,CAAA;AAAA,IACX;AACA,IAAA,KAAA,CAAM,CAAA,CAAE,CAAC,CAAA,GAAI,IAAA;AAAA,EACf;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,uBAAA,CAAwB,KAAgB,GAAA,EAAiC;AAChF,EAAA,IAAI,GAAA,CAAI,IAAA,KAAS,aAAA,EAAe,OAAO,EAAA;AACvC,EAAA,MAAM,QAAQ,GAAA,CAAI,IAAA,CAAK,EAAA,GAAK,GAAA,CAAI,KAAK,CAAA,GAAI,EAAA;AACzC,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,IAAA,CAAK,EAAA,GAAK,CAAA;AAC5B,EAAA,MAAM,KAAA,GAAuD;AAAA,IAC3D,CAAC,UAAU,YAAY,CAAA;AAAA,IACvB,CAAC,UAAU,YAAY,CAAA;AAAA,IACvB,CAAC,QAAQ,UAAU;AAAA,GACrB;AACA,EAAA,MAAM,OAAO,KAAA,CAAM,GAAA;AAAA,IAAI,CAAC,EAAA,EAAI,CAAA,KAC1BA,uBAAA,CAAM,EAAE,SAAA,EAAW,CAAA,UAAA,EAAa,KAAK,CAAA,EAAA,EAAK,KAAA,GAAQ,CAAA,GAAI,EAAE,KAAI,EAAG;AAAA,MAC7DH,wBAAA,CAAO,EAAE,EAAA,EAAI,CAAA,EAAG,IAAI,CAAA,EAAG,CAAA,EAAG,GAAG,IAAA,EAAM,UAAA,CAAW,GAAG,CAAC,CAAC,GAAG,MAAA,EAAQ,UAAA,CAAW,GAAG,CAAC,CAAC,GAAG,CAAA;AAAA,MACjFT,sBAAA,CAAO,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,KAAA,EAAO,uBAAA,EAAwB,EAAG,EAAA,CAAG,CAAC,CAAC;AAAA,KAC/D;AAAA,GACH;AACA,EAAA,OAAOY,uBAAA,CAAM,EAAE,EAAA,EAAI,uBAAA,IAA2B,IAAI,CAAA;AACpD;AAEA,SAAS,YAAA,CAAa,KAAgB,GAAA,EAAiC;AACrE,EAAA,IAAI,GAAA,CAAI,IAAA,KAAS,UAAA,EAAY,OAAO,EAAA;AACpC,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,MAAA,EAAQ;AAC1B,IAAA,KAAA,CAAM,IAAA,CAAK,cAAA,CAAe,CAAA,EAAG,GAAA,CAAI,UAAU,CAAC,CAAA;AAAA,EAC9C;AACA,EAAA,OAAOA,uBAAA,CAAM,EAAE,EAAA,EAAI,kBAAA,IAAsB,KAAK,CAAA;AAChD;AAEA,SAAS,cAAA,CAAe,IAAiB,UAAA,EAA8B;AACrE,EAAA,MAAM,IAAI,EAAA,CAAG,KAAA;AACb,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,CAAA,EAAG,UAAU,CAAA;AACtC,EAAA,MAAM,KAAA,GAAQ,EAAE,KAAA,IAAS,QAAA;AACzB,EAAA,IAAI,OAAA;AACJ,EAAA,MAAM,MAAA,GAAS,CAAA,CAAE,SAAA,GAAY,MAAA,GAAS,KAAA;AACtC,EAAA,MAAM,WAAA,GAAc,CAAA,CAAE,SAAA,GAAY,GAAA,GAAM,GAAA;AACxC,EAAA,MAAM,WAAA,GAAc,CAAA,CAAE,IAAA,KAAS,MAAA,GAAY,IAAA,GAAO,IAAA;AAClD,EAAA,IAAI,UAAU,QAAA,EAAU;AACtB,IAAA,OAAA,GAAUH,wBAAA,CAAO;AAAA,MACf,IAAI,EAAA,CAAG,EAAA;AAAA,MACP,IAAI,EAAA,CAAG,EAAA;AAAA,MACP,GAAG,EAAA,CAAG,CAAA;AAAA,MACN,IAAA,EAAM,KAAA;AAAA,MACN,cAAA,EAAgB,WAAA;AAAA,MAChB,MAAA;AAAA,MACA,cAAA,EAAgB,WAAA;AAAA,MAChB,KAAA,EAAO;AAAA,KACR,CAAA;AAAA,EACH,CAAA,MAAA,IAAW,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAA,GAAUD,sBAAA,CAAK;AAAA,MACb,CAAA,EAAG,EAAA,CAAG,EAAA,GAAK,EAAA,CAAG,CAAA;AAAA,MACd,CAAA,EAAG,EAAA,CAAG,EAAA,GAAK,EAAA,CAAG,CAAA;AAAA,MACd,KAAA,EAAO,GAAG,CAAA,GAAI,CAAA;AAAA,MACd,MAAA,EAAQ,GAAG,CAAA,GAAI,CAAA;AAAA,MACf,IAAA,EAAM,KAAA;AAAA,MACN,cAAA,EAAgB,WAAA;AAAA,MAChB,MAAA;AAAA,MACA,cAAA,EAAgB,WAAA;AAAA,MAChB,KAAA,EAAO;AAAA,KACR,CAAA;AAAA,EACH,CAAA,MAAA,IAAW,UAAU,SAAA,EAAW;AAC9B,IAAA,MAAM,IAAI,EAAA,CAAG,CAAA;AACb,IAAA,OAAA,GAAUE,yBAAA,CAAQ;AAAA,MAChB,MAAA,EAAQ,CAAA,EAAG,EAAA,CAAG,EAAE,CAAA,CAAA,EAAI,EAAA,CAAG,EAAA,GAAK,CAAC,CAAA,CAAA,EAAI,EAAA,CAAG,EAAA,GAAK,CAAC,CAAA,CAAA,EAAI,EAAA,CAAG,EAAE,CAAA,CAAA,EAAI,EAAA,CAAG,EAAE,CAAA,CAAA,EAAI,EAAA,CAAG,EAAA,GAAK,CAAC,CAAA,CAAA,EAAI,EAAA,CAAG,EAAA,GAAK,CAAC,CAAA,CAAA,EAAI,EAAA,CAAG,EAAE,CAAA,CAAA;AAAA,MAC/F,IAAA,EAAM,KAAA;AAAA,MACN,cAAA,EAAgB,WAAA;AAAA,MAChB,MAAA;AAAA,MACA,cAAA,EAAgB,WAAA;AAAA,MAChB,KAAA,EAAO;AAAA,KACR,CAAA;AAAA,EACH,CAAA,MAAO;AAEL,IAAA,MAAM,IAAI,EAAA,CAAG,CAAA;AACb,IAAA,OAAA,GAAUA,yBAAA,CAAQ;AAAA,MAChB,MAAA,EAAQ,CAAA,EAAG,EAAA,CAAG,EAAE,CAAA,CAAA,EAAI,GAAG,EAAA,GAAK,CAAC,CAAA,CAAA,EAAI,EAAA,CAAG,EAAA,GAAK,CAAC,IAAI,EAAA,CAAG,EAAA,GAAK,CAAA,GAAI,GAAG,CAAA,CAAA,EAAI,EAAA,CAAG,EAAA,GAAK,CAAC,CAAA,CAAA,EAAI,EAAA,CAAG,EAAA,GAAK,CAAA,GAAI,GAAG,CAAA,CAAA;AAAA,MAC7F,IAAA,EAAM,KAAA;AAAA,MACN,cAAA,EAAgB,WAAA;AAAA,MAChB,MAAA;AAAA,MACA,cAAA,EAAgB,WAAA;AAAA,MAChB,KAAA,EAAO;AAAA,KACR,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,MAAA,GAAS,EAAA,CAAG,KAAA,CAAM,QAAA,GACpBX,sBAAA,CAAO;AAAA,IACL,IAAI,EAAA,CAAG,EAAA;AAAA,IACP,IAAI,EAAA,CAAG,EAAA;AAAA,IACP,EAAA,EAAI,GAAG,KAAA,CAAM,EAAA;AAAA,IACb,EAAA,EAAI,GAAG,KAAA,CAAM,EAAA;AAAA,IACb,KAAA,EAAO;AAAA,GACR,CAAA,GACD,EAAA;AAEJ,EAAA,MAAM,KAAA,GAAQC,sBAAA;AAAA,IACZ,EAAE,CAAA,EAAG,EAAA,CAAG,KAAA,CAAM,EAAA,EAAI,GAAG,EAAA,CAAG,KAAA,CAAM,EAAA,EAAI,KAAA,EAAO,iBAAA,EAAkB;AAAA,IAC3D,GAAG,KAAA,CAAM;AAAA,GACX;AAGA,EAAA,IAAI,KAAA,GAAQ,EAAA;AACZ,EAAA,IAAI,EAAE,QAAA,EAAU;AACd,IAAA,MAAM,KAAK,EAAA,CAAG,EAAA;AACd,IAAA,MAAM,KAAK,EAAA,CAAG,EAAA;AACd,IAAA,KAAA,GAAQA,sBAAA;AAAA,MACN,EAAE,CAAA,EAAG,EAAA,GAAK,EAAA,CAAG,CAAA,GAAI,GAAG,CAAA,EAAG,EAAA,GAAK,EAAA,CAAG,CAAA,GAAI,GAAG,KAAA,EAAO,oBAAA,EAAsB,WAAA,EAAa,EAAA,EAAI,eAAe,GAAA,EAAI;AAAA,MACvG;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAW,EAAE,IAAA,GACf,CAAA,EAAG,EAAE,KAAK,CAAA,OAAA,EAAO,EAAE,KAAA,IAAS,CAAA,CAAE,CAAC,CAAA,EAAA,EAAK,CAAA,CAAE,SAAS,CAAA,CAAE,CAAC,YAAO,CAAA,CAAE,IAAI,CAAA,CAAA,GAC/D,CAAA,EAAG,CAAA,CAAE,KAAK,WAAQ,CAAA,CAAE,KAAA,IAAS,EAAE,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA,EAAA,CAAM,CAAA,CAAE,KAAA,IAAS,CAAA,CAAE,CAAA,EAAG,QAAQ,CAAC,CAAC,IAAI,CAAA,CAAE,IAAA,KAAS,SAAY,CAAA,WAAA,EAAW,CAAA,CAAE,IAAI,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA;AAEnI,EAAA,OAAOY,uBAAA;AAAA,IACL;AAAA,MACE,KAAA,EAAO,iBAAA;AAAA,MACP,iBAAiB,CAAA,CAAE,EAAA;AAAA,MACnB,cAAc,CAAA,CAAE,KAAA;AAAA,MAChB,GAAI,EAAE,QAAA,GAAW,EAAE,iBAAiB,CAAA,CAAE,QAAA,KAAa;AAAC,KACtD;AAAA,IACA,CAACX,uBAAA,CAAQ,QAAQ,CAAA,EAAG,SAAS,MAAA,EAAQ,KAAA,EAAO,KAAK,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,CAAC;AAAA,GAC/E;AACF;AAEA,SAASwF,aAAAA,CAAa,KAAgB,GAAA,EAAiC;AACrE,EAAA,IAAI,GAAA,CAAI,MAAA,CAAO,cAAA,KAAmB,MAAA,EAAQ,OAAO,EAAA;AACjD,EAAA,IAAI,GAAA,CAAI,SAAS,SAAA,EAAW;AAE1B,IAAA,MAAM,IAAI,GAAA,CAAI,IAAA,CAAK,EAAA,GAAK,GAAA,CAAI,KAAK,CAAA,GAAI,GAAA;AACrC,IAAA,MAAM,IAAI,GAAA,CAAI,IAAA,CAAK,EAAA,GAAK,GAAA,CAAI,KAAK,CAAA,GAAI,EAAA;AACrC,IAAA,MAAM,CAAA,GAAI,GAAA;AACV,IAAA,MAAM,CAAA,GAAI,EAAA;AACV,IAAA,MAAM,QAAQ,SAAA,CAAU,GAAA;AAAA,MAAI,CAAC,CAAA,EAAG,CAAA,KAC9B1E,oBAAA,CAAG,MAAA,EAAQ,EAAE,MAAA,EAAQ,CAAA,EAAI,CAAA,IAAK,SAAA,CAAU,SAAS,CAAA,CAAA,GAAM,GAAG,CAAA,CAAA,CAAA,EAAK,YAAA,EAAc,GAAG;AAAA,KAClF;AACA,IAAA,MAAM,IAAA,GAAOA,oBAAA;AAAA,MACX,gBAAA;AAAA,MACA,EAAE,EAAA,EAAI,oBAAA,EAAsB,EAAA,EAAI,IAAA,EAAM,IAAI,MAAA,EAAO;AAAA,MACjD;AAAA,KACF;AACA,IAAA,OAAOH,uBAAA,CAAM,EAAE,EAAA,EAAI,kBAAA,EAAmB,EAAG;AAAA,MACvCG,qBAAG,MAAA,EAAQ,EAAC,EAAG,CAAC,IAAI,CAAC,CAAA;AAAA,MACrBP,sBAAA,CAAK,EAAE,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,IAAA,EAAM,0BAAA,EAA4B,MAAA,EAAQ,SAAA,EAAW,CAAA;AAAA,MACvFR,sBAAA,CAAO,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,KAAA,EAAO,uBAAA,EAAyB,aAAA,EAAe,OAAA,EAAQ,EAAG,KAAK,CAAA;AAAA,MACrFA,sBAAA;AAAA,QACE,EAAE,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAG,IAAI,CAAA,EAAG,KAAA,EAAO,uBAAA,EAAyB,aAAA,EAAe,KAAA,EAAM;AAAA,QAC3E;AAAA;AACF,KACD,CAAA;AAAA,EACH;AACA,EAAA,IAAI,GAAA,CAAI,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG,OAAO,EAAA;AACxC,EAAA,MAAM,QAAQ,GAAA,CAAI,IAAA,CAAK,EAAA,GAAK,GAAA,CAAI,KAAK,CAAA,GAAI,EAAA;AACzC,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,IAAA,CAAK,EAAA,GAAK,CAAA;AAC5B,EAAA,MAAM,OAAiB,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,CAAC,KAAK,CAAA,KAAM;AACpD,IAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,CAAA,GAAI,eAAA,CAAgB,MAAM,CAAA;AACxD,IAAA,OAAOY,uBAAA,CAAM,EAAE,SAAA,EAAW,CAAA,UAAA,EAAa,KAAK,KAAK,KAAA,GAAQ,CAAA,GAAI,EAAE,CAAA,CAAA,CAAA,EAAI,EAAG;AAAA,MACpEH,wBAAA,CAAO,EAAE,EAAA,EAAI,CAAA,EAAG,IAAI,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,IAAA,EAAM,KAAA,EAAO,cAAA,EAAgB,GAAA,EAAK,MAAA,EAAQ,OAAO,CAAA;AAAA,MAC9ET,sBAAA,CAAO,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA,EAAI,KAAA,EAAO,uBAAA,EAAwB,EAAG,GAAG;AAAA,KAC7D,CAAA;AAAA,EACH,CAAC,CAAA;AACD,EAAA,OAAOY,uBAAA,CAAM,EAAE,EAAA,EAAI,kBAAA,IAAsB,IAAI,CAAA;AAC/C;AAEA,SAAS,WAAA,CAAY,KAAgB,GAAA,EAAiC;AACpE,EAAA,IAAI,CAAC,GAAA,CAAI,KAAA,EAAO,OAAO,EAAA;AACvB,EAAA,OAAOZ,sBAAA;AAAA,IACL,EAAE,CAAA,EAAG,GAAA,CAAI,WAAA,GAAc,CAAA,EAAG,GAAG,EAAA,EAAI,KAAA,EAAO,iBAAA,EAAmB,aAAA,EAAe,QAAA,EAAS;AAAA,IACnF,GAAA,CAAI;AAAA,GACN;AACF;AAEO,SAAS,gBAAgB,GAAA,EAAwB;AACtD,EAAA,MAAM,GAAA,GAAM,aAAa,GAAG,CAAA;AAC5B,EAAA,MAAM,mBACJ,GAAA,CAAI,UAAA,CAAW,MAAA,GAAS,CAAA,IAAK,IAAI,IAAA,KAAS,aAAA;AAC5C,EAAA,MAAM,UAAA,GACJ,gBAAA,IAAoB,GAAA,CAAI,IAAA,CAAK,EAAA,GAAK,GAAA,CAAI,IAAA,CAAK,CAAA,GAAI,GAAA,GAAM,GAAA,CAAI,WAAA,GAAc,GAAA,GAAM,CAAA;AAC/E,EAAA,MAAM,WAAA,GAAc,IAAI,WAAA,GAAc,UAAA;AAEtC,EAAA,MAAM,IAAA,GAAO;AAAA,IACX,WAAA,CAAY,KAAK,GAAG,CAAA;AAAA,IACpB,wBAAA,CAAyB,KAAK,GAAG,CAAA;AAAA,IACjC,UAAA,CAAW,KAAK,GAAG,CAAA;AAAA,IACnB,iBAAA,CAAkB,KAAK,GAAG,CAAA;AAAA,IAC1B,qBAAA,CAAsB,KAAK,GAAG,CAAA;AAAA,IAC9B,gBAAA,CAAiB,KAAK,GAAG,CAAA;AAAA,IACzB,aAAA,CAAc,KAAK,GAAG,CAAA;AAAA,IACtB,iBAAA,CAAkB,KAAK,GAAG,CAAA;AAAA,IAC1B,UAAA,CAAW,KAAK,GAAG,CAAA;AAAA,IACnB,YAAA,CAAa,KAAK,GAAG,CAAA;AAAA,IACrByF,aAAAA,CAAa,KAAK,GAAG,CAAA;AAAA,IACrB,uBAAA,CAAwB,KAAK,GAAG;AAAA,IAChC,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,CAAC,CAAA;AAE5B,EAAA,OAAOzE,yBAAA;AAAA,IACL;AAAA,MACE,KAAA,EAAO,WAAA;AAAA,MACP,mBAAA,EAAqB,QAAA;AAAA,MACrB,aAAa,GAAA,CAAI,IAAA;AAAA,MACjB,KAAA,EAAO,WAAA;AAAA,MACP,QAAQ,GAAA,CAAI,YAAA;AAAA,MACZ,OAAA,EAAS,CAAA,IAAA,EAAO,WAAW,CAAA,CAAA,EAAI,IAAI,YAAY,CAAA,CAAA;AAAA,MAC/C,IAAA,EAAM;AAAA,KACR;AAAA,IACA;AAAA,MACEf,uBAAA,CAAQ,IAAI,KAAA,GAAQ,CAAA,cAAA,EAAYgB,4BAAU,GAAA,CAAI,KAAK,CAAC,CAAA,CAAA,GAAK,gBAAgB,CAAA;AAAA,MACzEH,sBAAA;AAAA,QACE,CAAA,cAAA,EAAiB,GAAA,CAAI,QAAA,GAAW,CAAA,EAAA,EAAK,IAAI,QAAQ,CAAA,UAAA,CAAA,GAAe,EAAE,CAAA,EAAA,EAAK,GAAA,CAAI,IAAI,CAAA,OAAA,EAAU,GAAA,CAAI,OAAO,MAAM,CAAA,SAAA;AAAA,OAC5G;AAAA,MACAU,sBAAA,CAAK,CAACT,oBAAA,CAAG,OAAA,EAAS,IAAI,GAAG,CAAA,EAAG,SAAA,EAAW,CAAC,CAAA;AAAA,MACxC,GAAG;AAAA;AACL,GACF;AACF;AAEO,SAAS,aAAaf,KAAAA,EAAsB;AACjD,EAAA,MAAM,GAAA,GAAM,YAAYA,KAAI,CAAA;AAC5B,EAAA,OAAO,gBAAgB,GAAG,CAAA;AAC5B;;;AC78BO,IAAM,MAAA,GAAwB;AAAA,EACnC,IAAA,EAAM,QAAA;AAAA,EACN,OAAOA,KAAAA,EAAuB;AAC5B,IAAA,MAAM,KAAA,GAAQA,KAAAA,CAAK,IAAA,EAAK,CAAE,KAAA,CAAM,IAAI,CAAA,CAAE,CAAC,CAAA,EAAG,IAAA,EAAK,CAAE,WAAA,EAAY,IAAK,EAAA;AAClE,IAAA,OAAO,KAAA,CAAM,WAAW,QAAQ,CAAA;AAAA,EAClC,CAAA;AAAA,EACA,KAAA,EAAO,WAAA;AAAA,EAEP,OAAOA,KAAAA,EAAsB;AAC3B,IAAA,OAAO,aAAaA,KAAI,CAAA;AAAA,EAC1B;AACF,CAAA;;;ACNO,IAAM,aAAA,GAAN,cAA4B,KAAA,CAAM;AAAA,EACvC,WAAA,CAAY,SAAwB,UAAA,EAAqB;AACvD,IAAA,KAAA,CAAM,eAAe,MAAA,GAAY,CAAA,MAAA,EAAS,UAAU,CAAA,EAAA,EAAK,OAAO,KAAK,OAAO,CAAA;AAD1C,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AAElC,IAAA,IAAA,CAAK,IAAA,GAAO,eAAA;AAAA,EACd;AAAA,EAHoC,UAAA;AAItC,CAAA;AAIA,SAASsE,cAAa,CAAA,EAAmB;AACvC,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,QAAQ,CAAA,EAAA,EAAK;AACjC,IAAA,MAAM,EAAA,GAAK,EAAE,CAAC,CAAA;AACd,IAAA,IAAI,EAAA,KAAO,GAAA,EAAK,OAAA,GAAU,CAAC,OAAA;AAC3B,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,IAAI,OAAO,GAAA,IAAO,CAAA,CAAE,CAAA,GAAI,CAAC,MAAM,GAAA,EAAK;AACpC,MAAA,IAAI,OAAO,GAAA,EAAK;AAAA,IAClB;AACA,IAAA,GAAA,IAAO,EAAA;AAAA,EACT;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS3C,SAAQ,CAAA,EAAmB;AAClC,EAAA,MAAM,CAAA,GAAI,EAAE,IAAA,EAAK;AACjB,EAAA,IAAI,CAAA,CAAE,MAAA,IAAU,CAAA,IAAK,CAAA,CAAE,WAAW,GAAG,CAAA,IAAK,CAAA,CAAE,QAAA,CAAS,GAAG,CAAA,EAAG,OAAO,CAAA,CAAE,KAAA,CAAM,GAAG,EAAE,CAAA;AAC/E,EAAA,OAAO,CAAA;AACT;AAIA,IAAM,WAAA,GAA8C;AAAA,EAClD,eAAA,EAAiB,eAAA;AAAA,EACjB,cAAA,EAAgB,cAAA;AAAA,EAChB,gBAAA,EAAkB,gBAAA;AAAA,EAClB,eAAA,EAAiB,eAAA;AAAA,EACjB,MAAA,EAAQ,eAAA;AAAA,EACR,MAAA,EAAQ,cAAA;AAAA,EACR,MAAA,EAAQ,gBAAA;AAAA,EACR,MAAA,EAAQ,eAAA;AAAA,EACR,MAAA,EAAQ,gBAAA;AAAA,EACR,MAAA,EAAQ;AACV,CAAA;AAOA,SAAS,iBAAA,CAAkB,OAAe,IAAA,EAA+C;AAEvF,EAAA,MAAM,CAAA,GAAI,MAAM,WAAA,EAAY;AAC5B,EAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,IAAA,IAAI,CAAA,KAAM,MAAM,OAAO,eAAA;AACvB,IAAA,IAAI,CAAA,KAAM,MAAM,OAAO,cAAA;AACvB,IAAA,IAAI,CAAA,KAAM,MAAM,OAAO,gBAAA;AACvB,IAAA,IAAI,CAAA,KAAM,MAAM,OAAO,eAAA;AAAA,EACzB,CAAA,MAAO;AACL,IAAA,IAAI,CAAA,KAAM,MAAM,OAAO,eAAA;AACvB,IAAA,IAAI,CAAA,KAAM,MAAM,OAAO,cAAA;AACvB,IAAA,IAAI,CAAA,KAAM,MAAM,OAAO,gBAAA;AACvB,IAAA,IAAI,CAAA,KAAM,MAAM,OAAO,eAAA;AAAA,EACzB;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,cAAA,CAAe,KAAa,IAAA,EAA+C;AAClF,EAAA,MAAM,GAAA,GAAM,GAAA,CAAI,IAAA,EAAK,CAAE,WAAA,EAAY;AACnC,EAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,EAAA,IAAI,WAAA,CAAY,GAAG,CAAA,EAAG,OAAO,YAAY,GAAG,CAAA;AAE5C,EAAA,OAAO,iBAAA,CAAkB,KAAK,IAAI,CAAA;AACpC;AASA,SAAS,IAAI3B,KAAAA,EAAyB;AACpC,EAAA,OAAOA,MAAK,KAAA,CAAM,OAAO,EAAE,GAAA,CAAI,CAAC,KAAK,CAAA,MAAO;AAAA,IAC1C,IAAA,EAAMsE,aAAAA,CAAa,GAAG,CAAA,CAAE,IAAA,EAAK;AAAA,IAC7B,YAAY,CAAA,GAAI;AAAA,GAClB,CAAE,EAAE,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,IAAA,CAAK,SAAS,CAAC,CAAA;AACrC;AAEO,SAAS,SAAStE,KAAAA,EAAsB;AAC7C,EAAA,MAAM,KAAA,GAAQ,IAAIA,KAAI,CAAA;AACtB,EAAA,IAAI,MAAM,MAAA,KAAW,CAAA,EAAG,MAAM,IAAI,cAAc,aAAa,CAAA;AAG7D,EAAA,MAAM,MAAA,GAAS,MAAM,CAAC,CAAA;AACtB,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAC3C,EAAA,IAAI,WAAA,CAAY,CAAC,CAAA,EAAG,WAAA,OAAkB,KAAA,EAAO;AAC3C,IAAA,MAAM,IAAI,aAAA,CAAc,CAAA,4BAAA,EAA+B,OAAO,IAAI,CAAA,CAAA,EAAI,OAAO,UAAU,CAAA;AAAA,EACzF;AAEA,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,IAAI,QAAA,GAAwB,WAAA;AAC5B,EAAA,IAAI,SAAA,GAAyB,IAAA;AAC7B,EAAA,IAAIC,MAAAA;AAGJ,EAAA,OAAO,CAAA,GAAI,MAAM,MAAA,EAAQ;AACvB,IAAA,MAAMF,KAAAA,GAAO,MAAM,CAAC,CAAA;AACpB,IAAA,MAAM,IAAIA,KAAAA,CAAK,IAAA;AACf,IAAA,MAAM,KAAA,GAAQ,EAAE,WAAA,EAAY;AAC5B,IAAA,IAAI,KAAA,CAAM,UAAA,CAAW,WAAW,CAAA,EAAG;AACjC,MAAA,MAAM,CAAA,GAAI,EAAE,KAAA,CAAM,WAAA,CAAY,MAAM,CAAA,CAAE,IAAA,GAAO,WAAA,EAAY;AACzD,MAAA,IAAI,CAAA,KAAM,WAAA,IAAe,CAAA,KAAM,MAAA,IAAU,MAAM,QAAA,EAAU;AACvD,QAAA,MAAM,IAAI,aAAA,CAAc,CAAA,kBAAA,EAAqB,CAAC,CAAA,wBAAA,CAAA,EAA4BA,MAAK,UAAU,CAAA;AAAA,MAC3F;AACA,MAAA,IAAI,MAAM,WAAA,EAAa;AAErB,QAAA,MAAM,IAAI,aAAA;AAAA,UACR,aAAa,CAAC,CAAA,iEAAA,CAAA;AAAA,UACdA,KAAAA,CAAK;AAAA,SACP;AAAA,MACF;AACA,MAAA,QAAA,GAAW,CAAA;AACX,MAAA,CAAA,EAAA;AACA,MAAA;AAAA,IACF;AACA,IAAA,IAAI,KAAA,CAAM,UAAA,CAAW,YAAY,CAAA,EAAG;AAClC,MAAA,MAAM,CAAA,GAAI,EAAE,KAAA,CAAM,YAAA,CAAa,MAAM,CAAA,CAAE,IAAA,GAAO,WAAA,EAAY;AAC1D,MAAA,IAAI,CAAA,KAAM,IAAA,IAAQ,CAAA,KAAM,IAAA,EAAM;AAC5B,QAAA,MAAM,IAAI,aAAA,CAAc,CAAA,mBAAA,EAAsB,CAAC,CAAA,gBAAA,CAAA,EAAoBA,MAAK,UAAU,CAAA;AAAA,MACpF;AACA,MAAA,SAAA,GAAY,CAAA;AACZ,MAAA,CAAA,EAAA;AACA,MAAA;AAAA,IACF;AACA,IAAA,IAAI,KAAA,CAAM,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC9B,MAAAE,MAAAA,GAAQ0B,SAAQ,CAAA,CAAE,KAAA,CAAM,SAAS,MAAM,CAAA,CAAE,MAAM,CAAA;AAC/C,MAAA,CAAA,EAAA;AACA,MAAA;AAAA,IACF;AACA,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,WAAwB,EAAC;AAC/B,EAAA,MAAM,OAAiB,EAAC;AAExB,EAAA,OAAO,CAAA,GAAI,MAAM,MAAA,EAAQ;AACvB,IAAA,MAAM5B,KAAAA,GAAO,MAAM,CAAC,CAAA;AACpB,IAAA,MAAM,IAAIA,KAAAA,CAAK,IAAA;AACf,IAAA,MAAM,OAAO,CAAA,CAAE,KAAA,CAAM,KAAK,CAAA,CAAE,CAAC,GAAG,WAAA,EAAY;AAE5C,IAAA,IAAI,SAAS,OAAA,EAAS;AACpB,MAAA,MAAM,QAAA,GAAW,eAAA,CAAgB,KAAA,EAAO,CAAA,EAAG,QAAQ,CAAA;AACnD,MAAA,CAAA,GAAI,QAAA;AACJ,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,SAAS,KAAA,EAAO;AAClB,MAAA,YAAA,CAAa,CAAA,EAAGA,KAAAA,CAAK,UAAA,EAAY,IAAI,CAAA;AACrC,MAAA,CAAA,EAAA;AACA,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAI,aAAA,CAAc,CAAA,iBAAA,EAAoB,CAAC,CAAA,CAAA,EAAIA,MAAK,UAAU,CAAA;AAAA,EAClE;AAGA,EAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,CAAG,WAAA,EAAa,CAAC,CAAA;AACjE,EAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,IAAA,KAAA,MAAW,CAAA,IAAK,EAAE,UAAA,EAAY;AAC5B,MAAA,IAAI,EAAE,QAAA,EAAU;AACd,QAAA,MAAM,CAAC,SAAS,CAAA,GAAI,CAAA,CAAE,QAAA,CAAS,MAAM,GAAG,CAAA;AACxC,QAAA,IAAI,aAAa,CAAC,SAAA,CAAU,IAAI,SAAA,CAAU,WAAA,EAAa,CAAA,EAAG;AACxD,UAAA,MAAM,IAAI,aAAA;AAAA,YACR,oBAAoB,SAAS,CAAA,MAAA,EAAS,EAAE,EAAE,CAAA,CAAA,EAAI,EAAE,IAAI,CAAA,iBAAA;AAAA,WACtD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,KAAA;AAAA,IACN,QAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA,EAAAE,MAAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACF;AACF;AAIA,SAAS,eAAA,CACP,KAAA,EACA,QAAA,EACA,WAAA,EACQ;AACR,EAAA,MAAM,IAAA,GAAO,MAAM,QAAQ,CAAA;AAI3B,EAAA,MAAM,WAAA,GAAc,uCAAA,CAAwC,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA;AAC1E,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,MAAMyF,QAAAA,GAAU,WAAA,CAAY,CAAC,CAAA,CAAG,IAAA,EAAK;AACrC,IAAA,MAAM,MAAA,GAAS,WAAA,CAAY,CAAC,CAAA,CAAG,IAAA,EAAK;AACpC,IAAA,MAAM,EAAE,IAAAC,GAAAA,EAAI,IAAA,EAAAC,OAAK,GAAI,SAAA,CAAUF,QAAAA,EAAS,IAAA,CAAK,UAAU,CAAA;AACvD,IAAA,IAAI,YAAY,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,EAAA,KAAOC,GAAE,CAAA,EAAG;AACxC,MAAA,MAAM,IAAI,aAAA,CAAc,CAAA,oBAAA,EAAuBA,GAAE,CAAA,EAAA,CAAA,EAAM,KAAK,UAAU,CAAA;AAAA,IACxE;AACA,IAAA,MAAME,cAA6B,EAAC;AACpC,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,MAAM,SAAA,GAAY,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,OAAO,OAAO,CAAA;AACvE,MAAA,KAAA,MAAW,KAAK,SAAA,EAAW;AACzB,QAAAA,YAAW,IAAA,CAAK,kBAAA,CAAmB,GAAG,IAAA,CAAK,UAAA,EAAYF,GAAE,CAAC,CAAA;AAAA,MAC5D;AAAA,IACF;AACA,IAAA,WAAA,CAAY,IAAA,CAAK,EAAE,EAAA,EAAAA,GAAAA,EAAI,MAAAC,KAAAA,EAAM,UAAA,EAAAC,aAAY,CAAA;AACzC,IAAA,OAAO,QAAA,GAAW,CAAA;AAAA,EACpB;AAEA,EAAA,MAAM,CAAA,GAAI,uBAAA,CAAwB,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA;AAChD,EAAA,IAAI,CAAC,CAAA,EAAG;AACN,IAAA,MAAM,IAAI,aAAA;AAAA,MACR,CAAA,8FAAA,EAAiG,KAAK,IAAI,CAAA,CAAA;AAAA,MAC1G,IAAA,CAAK;AAAA,KACP;AAAA,EACF;AACA,EAAA,MAAM,OAAA,GAAU,CAAA,CAAE,CAAC,CAAA,CAAG,IAAA,EAAK;AAC3B,EAAA,MAAM,EAAE,EAAA,EAAI,IAAA,KAAS,SAAA,CAAU,OAAA,EAAS,KAAK,UAAU,CAAA;AAEvD,EAAA,IAAI,YAAY,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,EAAE,CAAA,EAAG;AACxC,IAAA,MAAM,IAAI,aAAA,CAAc,CAAA,oBAAA,EAAuB,EAAE,CAAA,EAAA,CAAA,EAAM,KAAK,UAAU,CAAA;AAAA,EACxE;AAEA,EAAA,MAAM,aAA6B,EAAC;AACpC,EAAA,IAAI,IAAI,QAAA,GAAW,CAAA;AACnB,EAAA,OAAO,CAAA,GAAI,MAAM,MAAA,EAAQ;AACvB,IAAA,MAAM9F,KAAAA,GAAO,MAAM,CAAC,CAAA;AACpB,IAAA,IAAIA,KAAAA,CAAK,SAAS,GAAA,EAAK;AACrB,MAAA,WAAA,CAAY,IAAA,CAAK,EAAE,EAAA,EAAI,IAAA,EAAM,YAAY,CAAA;AACzC,MAAA,OAAO,CAAA,GAAI,CAAA;AAAA,IACb;AACA,IAAA,MAAM,OAAO,kBAAA,CAAmBA,KAAAA,CAAK,IAAA,EAAMA,KAAAA,CAAK,YAAY,EAAE,CAAA;AAC9D,IAAA,UAAA,CAAW,KAAK,IAAI,CAAA;AACpB,IAAA,CAAA,EAAA;AAAA,EACF;AACA,EAAA,MAAM,IAAI,aAAA,CAAc,CAAA,0BAAA,EAA6B,EAAE,CAAA,EAAA,CAAA,EAAM,KAAK,UAAU,CAAA;AAC9E;AAEA,SAAS,SAAA,CAAU,SAAiB,UAAA,EAAkD;AAEpF,EAAA,MAAM,UAAA,GAAa,sCAAA,CAAuC,IAAA,CAAK,OAAO,CAAA;AACtE,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,OAAO,EAAE,IAAI,UAAA,CAAW,CAAC,GAAI,IAAA,EAAM,UAAA,CAAW,CAAC,CAAA,EAAG;AAAA,EACpD;AACA,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA;AAC3C,EAAA,OAAO,EAAE,EAAA,EAAI,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAO;AACpC;AAQA,SAAS,kBAAA,CAAmB,GAAA,EAAa,UAAA,EAAoB,OAAA,EAA+B;AAC1F,EAAA,IAAI,CAAA,GAAI,IAAI,IAAA,EAAK;AAEjB,EAAA,IAAI,OAAA;AACJ,EAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,CAAA,EAAG,GAAG,CAAA;AACxC,EAAA,IAAI,YAAY,CAAA,EAAG;AACjB,IAAA,OAAA,GAAU4B,SAAQ,CAAA,CAAE,KAAA,CAAM,WAAW,CAAC,CAAA,CAAE,MAAM,CAAA;AAC9C,IAAA,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,QAAQ,EAAE,IAAA,EAAK;AAAA,EAChC;AAGA,EAAA,IAAI,QAAA;AACJ,EAAA,MAAM,UAAA,GAAa,qDAAA,CAAsD,IAAA,CAAK,CAAC,CAAA;AAC/E,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,QAAA,GAAW,WAAW,CAAC,CAAA;AACvB,IAAA,CAAA,GAAI,EAAE,KAAA,CAAM,CAAA,EAAG,UAAA,CAAW,KAAK,EAAE,IAAA,EAAK;AAAA,EACxC;AAEA,EAAA,MAAM,SAAS,CAAA,CAAE,KAAA,CAAM,KAAK,CAAA,CAAE,OAAO,OAAO,CAAA;AAC5C,EAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,IAAA,MAAM,IAAI,aAAA,CAAc,CAAA,0BAAA,EAA6B,OAAO,MAAM,UAAU,CAAA;AAAA,EAC9E;AAEA,EAAA,MAAM,IAAA,GAAO,OAAO,CAAC,CAAA;AACrB,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA;AAE3B,EAAA,MAAM,KAAA,GAAQ,EAAE,EAAA,EAAI,KAAA,EAAO,IAAI,KAAA,EAAO,EAAA,EAAI,KAAA,EAAO,EAAA,EAAI,KAAA,EAAM;AAC3D,EAAA,MAAM,YAAsB,EAAC;AAC7B,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,MAAM,KAAA,GAAQ,IAAI,WAAA,EAAY;AAC9B,IAAA,IAAI,KAAA,KAAU,IAAA,EAAM,KAAA,CAAM,EAAA,GAAK,IAAA;AAAA,SAAA,IACtB,KAAA,KAAU,IAAA,EAAM,KAAA,CAAM,EAAA,GAAK,IAAA;AAAA,SAAA,IAC3B,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,QAAA,QAAgB,EAAA,GAAK,IAAA;AAAA,SAAA,IACjD,UAAU,IAAA,IAAQ,KAAA,KAAU,cAAc,KAAA,KAAU,SAAA,QAAiB,EAAA,GAAK,IAAA;AAAA,SAAA,IAC1E,GAAA,KAAQ,GAAA,IAAO,GAAA,KAAQ,GAAA,QAAW,EAAA,GAAK,IAAA;AAAA,SAC3C,SAAA,CAAU,KAAK,GAAG,CAAA;AAAA,EACzB;AAEA,EAAA,IAAI,QAAA,QAAgB,EAAA,GAAK,IAAA;AACzB,EAAA,IAAI,KAAA,CAAM,EAAA,EAAI,KAAA,CAAM,EAAA,GAAK,IAAA;AAEzB,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,MAAM,SAAA,CAAU,MAAA,GAAS,IAAI,SAAA,CAAU,IAAA,CAAK,GAAG,CAAA,GAAI,MAAA;AAAA,IACnD,EAAA,EAAI,MAAM,EAAA,IAAM,MAAA;AAAA,IAChB,EAAA,EAAI,MAAM,EAAA,IAAM,MAAA;AAAA,IAChB,EAAA,EAAI,MAAM,EAAA,IAAM,MAAA;AAAA,IAChB,OAAA,EAAS,MAAM,EAAA,IAAM,MAAA;AAAA,IACrB,QAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,gBAAA,CAAiB,GAAW,EAAA,EAAoB;AACvD,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,QAAQ,CAAA,EAAA,EAAK;AACjC,IAAA,IAAI,CAAA,CAAE,CAAC,CAAA,KAAM,GAAA,YAAe,CAAC,OAAA;AAC7B,IAAA,IAAI,CAAC,OAAA,IAAW,CAAA,CAAE,CAAC,CAAA,KAAM,IAAI,OAAO,CAAA;AAAA,EACtC;AACA,EAAA,OAAO,EAAA;AACT;AAmBA,SAAS,YAAA,CAAa,GAAA,EAAa,UAAA,EAAoB,OAAA,EAAyB;AAE9E,EAAA,IAAI,IAAI,GAAA,CAAI,OAAA,CAAQ,UAAA,EAAY,EAAE,EAAE,IAAA,EAAK;AAGzC,EAAA,IAAI,KAAA;AACJ,EAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,CAAA,EAAG,GAAG,CAAA;AACxC,EAAA,IAAI,YAAY,CAAA,EAAG;AACjB,IAAA,KAAA,GAAQA,SAAQ,CAAA,CAAE,KAAA,CAAM,WAAW,CAAC,CAAA,CAAE,MAAM,CAAA;AAC5C,IAAA,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,QAAQ,EAAE,IAAA,EAAK;AAAA,EAChC;AAIA,EAAA,MAAM,IAAA,GAAO,wEAAA,CAAyE,IAAA,CAAK,CAAC,CAAA;AAC5F,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,MAAM,GAAG,GAAA,EAAK,IAAI5B,KAAAA,EAAM,EAAA,EAAI,GAAG,CAAA,GAAI,IAAA;AACnC,IAAA,MAAM,QAAA,GAAW,iBAAA,CAAkB,EAAA,EAAK,MAAM,CAAA;AAC9C,IAAA,MAAM,MAAA,GAAS,iBAAA,CAAkB,EAAA,EAAK,OAAO,CAAA;AAC7C,IAAA,IAAI,CAAC,QAAA,IAAY,CAAC,MAAA,EAAQ;AACxB,MAAA,MAAM,IAAI,aAAA,CAAc,CAAA,sCAAA,EAAyC,GAAG,IAAI,UAAU,CAAA;AAAA,IACpF;AACA,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,MACX,IAAA,EAAM,GAAA;AAAA,MACN,EAAA,EAAI,GAAA;AAAA,MACJ,QAAA;AAAA,MACA,MAAA;AAAA,MACA,aAAaA,KAAAA,KAAS,IAAA;AAAA,MACtB;AAAA,KACD,CAAA;AACD,IAAA;AAAA,EACF;AAIA,EAAA,MAAM,KAAA,GAAQ,0HAAA,CAA2H,IAAA,CAAK,CAAC,CAAA;AAC/I,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,MAAM,GAAG,GAAA,EAAK,UAAUA,KAAAA,EAAM,SAAA,EAAW,GAAG,CAAA,GAAI,KAAA;AAChD,IAAA,MAAM,QAAA,GAAW,cAAA,CAAe,QAAA,EAAW,MAAM,CAAA;AACjD,IAAA,MAAM,MAAA,GAAS,cAAA,CAAe,SAAA,EAAY,OAAO,CAAA;AACjD,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAM,IAAI,aAAA,CAAc,CAAA,0BAAA,EAA6B,QAAQ,MAAM,UAAU,CAAA;AAAA,IAC/E;AACA,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,aAAA,CAAc,CAAA,2BAAA,EAA8B,SAAS,MAAM,UAAU,CAAA;AAAA,IACjF;AACA,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,MACX,IAAA,EAAM,GAAA;AAAA,MACN,EAAA,EAAI,GAAA;AAAA,MACJ,QAAA;AAAA,MACA,MAAA;AAAA,MACA,aAAaA,KAAAA,KAAS,IAAA;AAAA,MACtB;AAAA,KACD,CAAA;AACD,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,IAAI,aAAA;AAAA,IACR,0BAA0B,GAAG;AAAA,6FAAA,CAAA;AAAA,IAE7B;AAAA,GACF;AACF;;;ACpZO,IAAM,SAAA,GAAY;AAAA,EACvB,gBAAA,EAAkB,GAAA;AAAA,EAClB,gBAAA,EAAkB,EAAA;AAAA,EAClB,aAAA,EAAe,EAAA;AAAA,EACf,UAAA,EAAY,EAAA;AAAA,EACZ,SAAA,EAAW,CAAA;AAAA,EACX,OAAA,EAAS,EAAA;AAAA,EACT,OAAA,EAAS,EAAA;AAAA,EACT,OAAA,EAAS,EAAA;AAAA,EAKT,aAAA,EAAe,GAAA;AAAA,EACf,UAAA,EAAY,GAAA;AAAA,EACZ,aAAA,EAAe,CAAA;AAAA,EACf,QAAA,EAAU,EAAA;AAAA,EAEV,YAAA,EAAc,EAAA;AAAA;AAAA,EACd,cAAA,EAAgB,EAAA;AAAA;AAAA,EAChB,cAAA,EAAgB,CAAA;AAAA;AAAA,EAChB,cAAA,EAAgB,CAAA;AAAA;AAAA,EAChB,YAAA,EAAc,CAAA;AAAA;AAAA;AAAA,EAId,iBAAA,EAAmB;AACrB,CAAA;AAIA,SAAS,cAAc,GAAA,EAAyE;AAC9F,EAAA,MAAMuC,EAAAA,GAAI,SAAA;AAEV,EAAA,MAAM,cAAcA,EAAAA,CAAE,gBAAA,GAAmB,IAAI,GAAA,CAAI,IAAA,CAAK,SAASA,EAAAA,CAAE,aAAA;AAEjE,EAAA,IAAI,MAAA,GAAS,WAAA;AACb,EAAA,MAAM,OAAuB,EAAC;AAC9B,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,UAAA,CAAW,QAAQ,CAAA,EAAA,EAAK;AAC9C,IAAA,MAAM,CAAA,GAAI,GAAA,CAAI,UAAA,CAAW,CAAC,CAAA;AAC1B,IAAA,MAAM,WAAW,CAAA,CAAE,IAAA;AACnB,IAAA,MAAM,QAAA,GAAW,EAAE,IAAA,IAAQ,EAAA;AAC3B,IAAA,MAAM,eACH,CAAA,CAAE,EAAA,GAAK,IAAI,CAAA,KAAM,CAAA,CAAE,KAAK,CAAA,GAAI,CAAA,CAAA,IAAM,CAAA,CAAE,EAAA,GAAK,IAAI,CAAA,CAAA,IAAM,CAAA,CAAE,WAAW,CAAC,CAAA,CAAE,KAAK,CAAA,GAAI,CAAA,CAAA;AAC/E,IAAA,MAAM,WAAA,GAAc,WAAA,IAAeA,EAAAA,CAAE,aAAA,GAAgB,GAAA,GAAM,CAAA,CAAA;AAC3D,IAAA,MAAM,CAAA,GACJA,EAAAA,CAAE,gBAAA,GAAmB,CAAA,GACrB,SAAS,MAAA,GAASA,EAAAA,CAAE,UAAA,IACnB,QAAA,GAAWA,GAAE,QAAA,GAAW,QAAA,CAAS,MAAA,GAASA,EAAAA,CAAE,aAAa,CAAA,CAAA,GAC1D,WAAA;AACF,IAAA,IAAI,CAAA,GAAI,QAAQ,MAAA,GAAS,CAAA;AAEzB,IAAA,MAAM,UAAUA,EAAAA,CAAE,aAAA,GAAgB,IAAIA,EAAAA,CAAE,UAAA,GAAaA,GAAE,UAAA,GAAa,CAAA;AACpE,IAAA,IAAA,CAAK,IAAA,CAAK,EAAE,SAAA,EAAW,CAAA,EAAG,SAAS,CAAA;AAAA,EACrC;AAEA,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQA,GAAE,gBAAgB,CAAA;AACjD,EAAA,MAAM,MAAA,GAASA,GAAE,aAAA,GAAgB,GAAA,CAAI,WAAW,MAAA,GAASA,EAAAA,CAAE,aAAaA,EAAAA,CAAE,SAAA;AAC1E,EAAA,OAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,IAAA,EAAK;AAC/B;AASA,SAAS,sBAAsB,GAAA,EAAkC;AAC/D,EAAA,MAAM,MAAM,GAAA,CAAI,QAAA,CAAS,IAAI,CAAC,CAAA,KAAM,EAAE,EAAE,CAAA;AACxC,EAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,GAAA,CAAI,GAAA,CAAI,CAAC,EAAA,EAAI,CAAA,KAAM,CAAC,EAAA,EAAI,CAAC,CAAU,CAAC,CAAA;AAE5D,EAAA,MAAM,QAAmB,EAAC;AAC1B,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,IAAA,EAAM;AACxB,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,CAAA,CAAE,IAAI,CAAA;AAC7B,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,CAAA,CAAE,EAAE,CAAA;AAC3B,IAAA,IAAI,OAAA,CAAQ,IAAI,CAAA,CAAE,KAAK,KAAK,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,KAAK,CAAA,EAAG;AAChD,MAAA,MAAM,OAAA,GAAU,MAAM,CAAA,CAAE,MAAM,KAAK,CAAC,KAAA,CAAM,EAAE,QAAQ,CAAA;AACpD,MAAA,MAAM,SAAA,GAAY,MAAM,CAAA,CAAE,QAAQ,KAAK,CAAC,KAAA,CAAM,EAAE,MAAM,CAAA;AACtD,MAAA,IAAI,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,EAAE,KAAA,EAAO,EAAA,EAAI,CAAA,CAAE,KAAA,EAAO,CAAA;AAAA,WAAA,IAC7C,SAAA,EAAW,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,EAAE,KAAA,EAAO,EAAA,EAAI,CAAA,CAAE,KAAA,EAAO,CAAA;AAAA,WACxD,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,EAAE,KAAA,EAAO,EAAA,EAAI,CAAA,CAAE,KAAA,EAAO,CAAA;AAAA,IAChD;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAoB;AACtC,EAAA,KAAA,MAAW,EAAA,IAAM,GAAA,EAAK,KAAA,CAAM,GAAA,CAAI,IAAI,CAAC,CAAA;AACrC,EAAA,IAAI,OAAA,GAAU,IAAA;AACd,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,OAAO,OAAA,IAAW,KAAA,GAAQ,GAAA,CAAI,MAAA,GAAS,CAAA,EAAG;AACxC,IAAA,OAAA,GAAU,KAAA;AACV,IAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,MAAA,MAAM,EAAA,GAAK,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA,IAAK,CAAA;AAChC,MAAA,MAAM,EAAA,GAAK,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,IAAK,CAAA;AAC9B,MAAA,IAAI,EAAA,GAAK,KAAK,CAAA,EAAG;AACf,QAAA,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,EAAA,GAAK,CAAC,CAAA;AACtB,QAAA,OAAA,GAAU,IAAA;AAAA,MACZ;AAAA,IACF;AACA,IAAA,KAAA,EAAA;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,aAAa,CAAA,EAA+C;AACnE,EAAA,MAAM,GAAA,GAAM,CAAA,CAAE,OAAA,CAAQ,GAAG,CAAA;AACzB,EAAA,IAAI,GAAA,GAAM,CAAA,EAAG,OAAO,EAAE,OAAO,CAAA,EAAE;AAC/B,EAAA,OAAO,EAAE,KAAA,EAAO,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,EAAG,MAAA,EAAQ,CAAA,CAAE,KAAA,CAAM,GAAA,GAAM,CAAC,CAAA,EAAE;AAC5D;AAEA,SAAS,MAAM,CAAA,EAAgC;AAC7C,EAAA,OAAO,CAAA,KAAM,mBAAmB,CAAA,KAAM,cAAA;AACxC;AASA,SAAS,mBAAA,CACP,WAAA,EACA,MAAA,EACA,IAAA,EACM;AACN,EAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AAEvB,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAyB;AAC/C,EAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,CAAA,CAAE,IAAI,CAAA,CAAE,KAAA;AAC/B,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,CAAA,CAAE,EAAE,CAAA,CAAE,KAAA;AAC7B,IAAA,IAAI,CAAC,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,YAAa,GAAA,CAAI,CAAA,kBAAG,IAAI,GAAA,EAAK,CAAA;AACjD,IAAA,IAAI,CAAC,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,YAAa,GAAA,CAAI,CAAA,kBAAG,IAAI,GAAA,EAAK,CAAA;AACjD,IAAA,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,CAAG,GAAA,CAAI,CAAC,CAAA;AACvB,IAAA,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,CAAG,GAAA,CAAI,CAAC,CAAA;AAAA,EACzB;AAEA,EAAA,SAAS,MAAM,SAAA,EAAgC;AAC7C,IAAA,MAAM,OAAA,GAAU,cAAc,MAAA,GAAS,MAAA,GAAS,CAAC,GAAG,MAAM,EAAE,OAAA,EAAQ;AACpE,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACvC,MAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,CAAA,GAAI,CAAC,CAAA;AAC1B,MAAA,MAAM,GAAA,GAAM,QAAQ,CAAC,CAAA;AACrB,MAAA,MAAM,QAAA,GAAW,WAAA,CAAY,GAAA,CAAI,IAAI,CAAA;AACrC,MAAA,MAAM,OAAA,GAAU,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA;AACnC,MAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,CAAC,EAAA,EAAI,GAAA,KAAQ,CAAC,EAAA,EAAI,GAAG,CAAU,CAAC,CAAA;AACrE,MAAA,MAAM,SAAA,uBAAgB,GAAA,EAAoB;AAC1C,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACvC,QAAA,MAAM,EAAA,GAAK,QAAQ,CAAC,CAAA;AACpB,QAAA,MAAM,EAAA,GAAK,SAAA,CAAU,GAAA,CAAI,EAAE,CAAA;AAC3B,QAAA,IAAI,CAAC,EAAA,EAAI;AACP,UAAA,SAAA,CAAU,GAAA,CAAI,IAAI,CAAC,CAAA;AACnB,UAAA;AAAA,QACF;AACA,QAAA,MAAM,UAAoB,EAAC;AAC3B,QAAA,KAAA,MAAW,KAAK,EAAA,EAAI;AAClB,UAAA,IAAI,OAAA,CAAQ,IAAI,CAAC,CAAA,UAAW,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAE,CAAA;AAAA,QAClD;AACA,QAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,UAAA,SAAA,CAAU,GAAA,CAAI,IAAI,CAAC,CAAA;AAAA,QACrB,CAAA,MAAO;AAEL,UAAA,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,CAAC,CAAA;AAC5B,UAAA,MAAM,IAAI,OAAA,CAAQ,MAAA;AAClB,UAAA,MAAM,MAAM,CAAA,GAAI,CAAA,KAAM,CAAA,GAClB,OAAA,CAAA,CAAS,IAAI,CAAA,IAAK,CAAC,CAAA,GAAA,CAClB,OAAA,CAAQ,IAAI,CAAA,GAAI,CAAC,IAAK,OAAA,CAAQ,CAAA,GAAI,CAAC,CAAA,IAAM,CAAA;AAC9C,UAAA,SAAA,CAAU,GAAA,CAAI,IAAI,GAAG,CAAA;AAAA,QACvB;AAAA,MACF;AACA,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACrB,QAAA,MAAM,EAAA,GAAK,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,IAAK,CAAA;AAC/B,QAAA,MAAM,EAAA,GAAK,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,IAAK,CAAA;AAC/B,QAAA,IAAI,EAAA,KAAO,IAAI,OAAO,CAAA;AACtB,QAAA,OAAO,EAAA,GAAK,EAAA;AAAA,MACd,CAAC,CAAA;AAAA,IACH;AAAA,EACF;AAGA,EAAA,KAAA,CAAM,MAAM,CAAA;AACZ,EAAA,KAAA,CAAM,IAAI,CAAA;AACV,EAAA,KAAA,CAAM,MAAM,CAAA;AACd;AAwBA,SAAS,kBAAA,CACP,aAAA,EACA,QAAA,EACA,SAAA,EACqB;AACrB,EAAA,MAAMA,EAAAA,GAAI,SAAA;AACV,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAwB;AAG3C,EAAA,KAAA,MAAW,MAAM,aAAA,EAAe;AAC9B,IAAA,IAAI,UAAA,GAAaA,EAAAA,CAAE,OAAA,GAAUA,EAAAA,CAAE,OAAA;AAC/B,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,EAAA,CAAG,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACtC,MAAA,MAAM,EAAA,GAAK,EAAA,CAAG,GAAA,CAAI,CAAC,CAAA;AACnB,MAAA,MAAM,CAAA,GAAI,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AACzB,MAAA,MAAM,EAAA,GAAK,SAAA,CAAU,GAAA,CAAI,EAAE,CAAA;AAC3B,MAAA,IAAI,SAASA,EAAAA,CAAE,OAAA;AACf,MAAA,IAAI,EAAA,EAAI;AACN,QAAA,MAAM,wBAAkC,EAAC;AACzC,QAAA,KAAA,MAAW,KAAK,EAAA,EAAI;AAClB,UAAA,MAAM,CAAA,GAAI,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA;AACtB,UAAA,IAAI,GAAG,qBAAA,CAAsB,IAAA,CAAK,EAAE,CAAA,GAAI,CAAA,CAAE,SAAS,CAAC,CAAA;AAAA,QACtD;AACA,QAAA,IAAI,qBAAA,CAAsB,SAAS,CAAA,EAAG;AACpC,UAAA,qBAAA,CAAsB,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,CAAC,CAAA;AAC1C,UAAA,MAAM,IAAI,qBAAA,CAAsB,MAAA;AAChC,UAAA,MAAM,MAAM,CAAA,GAAI,CAAA,KAAM,CAAA,GAClB,qBAAA,CAAA,CAAuB,IAAI,CAAA,IAAK,CAAC,CAAA,GAAA,CAChC,qBAAA,CAAsB,IAAI,CAAA,GAAI,CAAC,IAAK,qBAAA,CAAsB,CAAA,GAAI,CAAC,CAAA,IAAM,CAAA;AAC1E,UAAA,MAAA,GAAS,GAAA,GAAM,EAAE,MAAA,GAAS,CAAA;AAAA,QAC5B;AAAA,MACF;AACA,MAAA,MAAM,IAAI,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,UAAA,GAAaA,GAAE,OAAO,CAAA;AACjD,MAAA,MAAA,CAAO,IAAI,EAAA,EAAI;AAAA,QACb,EAAA;AAAA,QACA,CAAA;AAAA,QACA,QAAQ,CAAA,CAAE,MAAA;AAAA,QACV,OAAO,CAAA,CAAE,KAAA;AAAA,QACT,UAAA,EAAY;AAAA,OACb,CAAA;AACD,MAAA,UAAA,GAAa,IAAI,CAAA,CAAE,MAAA;AAAA,IACrB;AAAA,EACF;AAKA,EAAA,KAAA,IAAS,KAAK,aAAA,CAAc,MAAA,GAAS,CAAA,EAAG,EAAA,IAAM,GAAG,EAAA,EAAA,EAAM;AACrD,IAAA,MAAM,EAAA,GAAK,cAAc,EAAE,CAAA;AAC3B,IAAA,IAAI,UAAA,GAAaA,EAAAA,CAAE,OAAA,GAAUA,EAAAA,CAAE,OAAA;AAC/B,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,EAAA,CAAG,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACtC,MAAA,MAAM,EAAA,GAAK,EAAA,CAAG,GAAA,CAAI,CAAC,CAAA;AACnB,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AAC1B,MAAA,MAAM,EAAA,GAAK,SAAA,CAAU,GAAA,CAAI,EAAE,CAAA;AAC3B,MAAA,IAAI,SAAS,IAAA,CAAK,CAAA;AAClB,MAAA,IAAI,EAAA,IAAM,EAAA,CAAG,IAAA,GAAO,CAAA,EAAG;AACrB,QAAA,MAAM,UAAoB,EAAC;AAC3B,QAAA,KAAA,MAAW,KAAK,EAAA,EAAI;AAClB,UAAA,MAAM,CAAA,GAAI,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA;AACtB,UAAA,IAAI,GAAG,OAAA,CAAQ,IAAA,CAAK,EAAE,CAAA,GAAI,CAAA,CAAE,SAAS,CAAC,CAAA;AAAA,QACxC;AACA,QAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,UAAA,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,CAAC,CAAA;AAC5B,UAAA,MAAM,IAAI,OAAA,CAAQ,MAAA;AAClB,UAAA,MAAM,MAAM,CAAA,GAAI,CAAA,KAAM,CAAA,GAClB,OAAA,CAAA,CAAS,IAAI,CAAA,IAAK,CAAC,CAAA,GAAA,CAClB,OAAA,CAAQ,IAAI,CAAA,GAAI,CAAC,IAAK,OAAA,CAAQ,CAAA,GAAI,CAAC,CAAA,IAAM,CAAA;AAC9C,UAAA,MAAA,GAAS,GAAA,GAAM,KAAK,MAAA,GAAS,CAAA;AAAA,QAC/B;AAAA,MACF;AAEA,MAAA,MAAM,KAAA,GAAQ,aAAaA,EAAAA,CAAE,OAAA;AAG7B,MAAA,MAAM,IAAA,GAAO,KAAK,GAAA,CAAI,KAAA,EAAO,KAAK,GAAA,CAAI,IAAA,CAAK,CAAA,EAAG,MAAM,CAAC,CAAA;AACrD,MAAA,IAAA,CAAK,CAAA,GAAI,IAAA;AACT,MAAA,UAAA,GAAa,OAAO,IAAA,CAAK,MAAA;AAAA,IAC3B;AAAA,EACF;AAEA,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAoB;AACpC,EAAA,KAAA,MAAW,CAAC,IAAI,CAAC,CAAA,IAAK,QAAQ,GAAA,CAAI,GAAA,CAAI,EAAA,EAAI,CAAA,CAAE,CAAC,CAAA;AAC7C,EAAA,OAAO,GAAA;AACT;AAIO,SAAS,UAAU,GAAA,EAA8B;AACtD,EAAA,MAAMA,EAAAA,GAAI,SAAA;AACV,EAAA,MAAM,IAAA,GAAO,IAAI,SAAA,KAAc,IAAA;AAG/B,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAqF;AAC1G,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,QAAA,EAAU;AAC5B,IAAA,MAAM,CAAA,GAAI,cAAc,CAAC,CAAA;AACzB,IAAA,QAAA,CAAS,GAAA,CAAI,EAAE,EAAA,EAAI,EAAE,KAAK,CAAA,EAAG,GAAG,GAAG,CAAA;AAAA,EACrC;AAEA,EAAA,MAAM,KAAA,GAAQ,sBAAsB,GAAG,CAAA;AAGvC,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAsB;AAC9C,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,QAAA,EAAU;AAC5B,IAAA,MAAM,CAAA,GAAI,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,IAAK,CAAA;AAC7B,IAAA,IAAI,CAAC,YAAY,GAAA,CAAI,CAAC,GAAG,WAAA,CAAY,GAAA,CAAI,CAAA,EAAG,EAAE,CAAA;AAC9C,IAAA,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,CAAG,IAAA,CAAK,EAAE,EAAE,CAAA;AAAA,EAC/B;AACA,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,IAAA,CAAK,WAAA,CAAY,IAAA,EAAM,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAGlE,EAAA,mBAAA,CAAoB,WAAA,EAAa,MAAA,EAAQ,GAAA,CAAI,IAAI,CAAA;AAGjD,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAyB;AAC/C,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,IAAA,EAAM;AACxB,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,CAAA,CAAE,IAAI,CAAA,CAAE,KAAA;AAC/B,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,CAAA,CAAE,EAAE,CAAA,CAAE,KAAA;AAC7B,IAAA,IAAI,CAAC,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,YAAa,GAAA,CAAI,CAAA,kBAAG,IAAI,GAAA,EAAK,CAAA;AACjD,IAAA,IAAI,CAAC,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,YAAa,GAAA,CAAI,CAAA,kBAAG,IAAI,GAAA,EAAK,CAAA;AACjD,IAAA,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,CAAG,GAAA,CAAI,CAAC,CAAA;AACvB,IAAA,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,CAAG,GAAA,CAAI,CAAC,CAAA;AAAA,EACzB;AAGA,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM;AACnC,IAAA,MAAM,GAAA,GAAM,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA;AAC7B,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,CAAA;AAAA,MACP,GAAA;AAAA,MACA,QAAA,EAAU,IAAA,CAAK,GAAA,CAAI,GAAG,GAAA,CAAI,GAAA,CAAI,CAAC,EAAA,KAAO,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA,CAAG,KAAK,CAAC,CAAA;AAAA,MAC9D,SAAA,EAAW,IAAA,CAAK,GAAA,CAAI,GAAG,GAAA,CAAI,GAAA,CAAI,CAAC,EAAA,KAAO,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA,CAAG,MAAM,CAAC;AAAA,KAClE;AAAA,EACF,CAAC,CAAA;AAMD,EAAA,MAAM,aAAA,GAAgB,UAAA,CAAW,GAAA,CAAI,CAAC,EAAA,MAAQ,EAAE,KAAA,EAAO,EAAA,CAAG,KAAA,EAAO,GAAA,EAAK,EAAA,CAAG,GAAA,EAAI,CAAE,CAAA;AAI/E,EAAA,MAAM,kBAAA,uBAAyB,GAAA,EAA+C;AAC9E,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,KAAA,MAAW,CAAC,EAAA,EAAI,CAAC,CAAA,IAAK,QAAA,EAAU;AAC9B,MAAA,kBAAA,CAAmB,GAAA,CAAI,IAAI,EAAE,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAQ,CAAA;AAAA,IACjE;AAAA,EACF,CAAA,MAAO;AAGL,IAAA,KAAA,MAAW,CAAC,EAAA,EAAI,CAAC,CAAA,IAAK,QAAA,EAAU;AAC9B,MAAA,kBAAA,CAAmB,GAAA,CAAI,IAAI,EAAE,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAA,EAAQ,CAAA,CAAE,KAAA,EAAO,CAAA;AAAA,IACjE;AAAA,EACF;AACA,EAAA,MAAM,aAAA,GAAgB,kBAAA,CAAmB,aAAA,EAAe,kBAAA,EAAoB,SAAS,CAAA;AAErF,EAAA,MAAM,SAA4B,EAAC;AAEnC,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,IAAI,UAAUA,EAAAA,CAAE,OAAA;AAChB,IAAA,KAAA,MAAW,MAAM,UAAA,EAAY;AAC3B,MAAA,KAAA,MAAW,EAAA,IAAM,GAAG,GAAA,EAAK;AACvB,QAAA,MAAM,CAAA,GAAI,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AACzB,QAAA,MAAM,CAAA,GAAI,OAAA,GAAA,CAAW,EAAA,CAAG,QAAA,GAAW,EAAE,KAAA,IAAS,CAAA;AAC9C,QAAA,MAAM,CAAA,GAAI,aAAA,CAAc,GAAA,CAAI,EAAE,KAAKA,EAAAA,CAAE,OAAA;AACrC,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,QAAQ,CAAA,CAAE,GAAA;AAAA,UACV,CAAA;AAAA,UACA,CAAA;AAAA,UACA,OAAO,CAAA,CAAE,KAAA;AAAA,UACT,QAAQ,CAAA,CAAE,MAAA;AAAA,UACV,cAAcA,EAAAA,CAAE,aAAA;AAAA,UAChB,MAAM,CAAA,CAAE;AAAA,SACT,CAAA;AAAA,MACH;AACA,MAAA,OAAA,IAAW,EAAA,CAAG,WAAWA,EAAAA,CAAE,OAAA;AAAA,IAC7B;AAAA,EACF,CAAA,MAAO;AACL,IAAA,IAAI,UAAUA,EAAAA,CAAE,OAAA;AAChB,IAAA,KAAA,MAAW,MAAM,UAAA,EAAY;AAC3B,MAAA,KAAA,MAAW,EAAA,IAAM,GAAG,GAAA,EAAK;AACvB,QAAA,MAAM,CAAA,GAAI,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AAEzB,QAAA,MAAM,CAAA,GAAI,aAAA,CAAc,GAAA,CAAI,EAAE,KAAKA,EAAAA,CAAE,OAAA;AACrC,QAAA,MAAM,CAAA,GAAI,OAAA,GAAA,CAAW,EAAA,CAAG,SAAA,GAAY,EAAE,MAAA,IAAU,CAAA;AAChD,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,QAAQ,CAAA,CAAE,GAAA;AAAA,UACV,CAAA;AAAA,UACA,CAAA;AAAA,UACA,OAAO,CAAA,CAAE,KAAA;AAAA,UACT,QAAQ,CAAA,CAAE,MAAA;AAAA,UACV,cAAcA,EAAAA,CAAE,aAAA;AAAA,UAChB,MAAM,CAAA,CAAE;AAAA,SACT,CAAA;AAAA,MACH;AACA,MAAA,OAAA,IAAW,EAAA,CAAG,YAAYA,EAAAA,CAAE,OAAA;AAAA,IAC9B;AAAA,EACF;AAGA,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,IAAI,CAAA,CAAE,IAAI,CAAA,CAAE,KAAA,GAAQ,MAAM,IAAA,GAAO,CAAA,CAAE,IAAI,CAAA,CAAE,KAAA;AACzC,IAAA,IAAI,CAAA,CAAE,IAAI,CAAA,CAAE,MAAA,GAAS,MAAM,IAAA,GAAO,CAAA,CAAE,IAAI,CAAA,CAAE,MAAA;AAAA,EAC5C;AACA,EAAA,MAAM,KAAA,GAAQ,OAAOA,EAAAA,CAAE,OAAA;AACvB,EAAA,MAAM,MAAA,GAAS,OAAOA,EAAAA,CAAE,OAAA;AAGxB,EAAA,MAAM,UAAA,GAAa,IAAI,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,MAAA,CAAO,EAAA,EAAI,CAAC,CAAU,CAAC,CAAA;AACvE,EAAA,MAAM,QAAyB,EAAC;AAChC,EAAA,MAAM,cAAA,uBAAqB,GAAA,EAAoB;AAE/C,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,IAAA,EAAM;AACxB,IAAA,MAAM,SAAA,GAAY,YAAA,CAAa,CAAA,CAAE,IAAI,CAAA,CAAE,KAAA;AACvC,IAAA,MAAM,OAAA,GAAU,YAAA,CAAa,CAAA,CAAE,EAAE,CAAA,CAAE,KAAA;AACnC,IAAA,MAAM,CAAA,GAAI,UAAA,CAAW,GAAA,CAAI,SAAS,CAAA;AAClC,IAAA,MAAM,CAAA,GAAI,UAAA,CAAW,GAAA,CAAI,OAAO,CAAA;AAChC,IAAA,IAAI,CAAC,CAAA,IAAK,CAAC,CAAA,EAAG;AAEd,IAAA,MAAM,OAAA,GAAU,YAAA,CAAa,CAAA,CAAE,IAAI,CAAA,CAAE,MAAA;AACrC,IAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,CAAA,CAAE,EAAE,CAAA,CAAE,MAAA;AACjC,IAAA,MAAM,QAAQ,eAAA,CAAgB,CAAA,EAAG,CAAA,EAAG,OAAA,EAAS,OAAO,cAAc,CAAA;AAClE,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,GAAA,EAAK,CAAA;AAAA,MACL,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,YAAY,KAAA,CAAM,UAAA;AAAA,MAClB,UAAU,KAAA,CAAM,QAAA;AAAA,MAChB,SAAS,KAAA,CAAM;AAAA,KAChB,CAAA;AAAA,EACH;AAEA,EAAA,OAAO;AAAA,IACL,GAAA;AAAA,IACA,QAAA,EAAU,MAAA;AAAA,IACV,KAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACF;AACF;AAIA,SAAS,YAAA,CAAa,GAAoB,GAAA,EAAiC;AACzE,EAAA,IAAI,GAAA,EAAK;AACP,IAAA,MAAM,GAAA,GAAM,CAAA,CAAE,IAAA,CAAK,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,SAAA,CAAU,IAAA,CAAK,WAAA,EAAY,KAAM,GAAA,CAAI,aAAa,CAAA;AACxF,IAAA,IAAI,GAAA,IAAO,GAAG,OAAO,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,CAAG,OAAA;AAAA,EAC1C;AACA,EAAA,OAAO,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,MAAA,GAAS,CAAA;AAC1B;AAEA,SAAS,eAAA,CACP,CAAA,EACA,CAAA,EACA,OAAA,EACA,OACA,cAAA,EAMA;AACA,EAAA,MAAMA,EAAAA,GAAI,SAAA;AAEV,EAAA,MAAM,QAAA,GAAW,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,KAAA,GAAQ,CAAA;AACjC,EAAA,MAAM,QAAA,GAAW,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,KAAA,GAAQ,CAAA;AACjC,EAAA,MAAM,QAAA,GAAW,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,MAAA,GAAS,CAAA;AAClC,EAAA,MAAM,QAAA,GAAW,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,MAAA,GAAS,CAAA;AAElC,EAAA,MAAM,KAAK,QAAA,GAAW,QAAA;AACtB,EAAA,MAAM,KAAK,QAAA,GAAW,QAAA;AAGtB,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI,KAAK,GAAA,CAAI,EAAE,KAAK,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,EAAG;AAChC,IAAA,KAAA,GAAQ,EAAA,IAAM,IAAI,OAAA,GAAU,MAAA;AAC5B,IAAA,KAAA,GAAQ,EAAA,IAAM,IAAI,MAAA,GAAS,OAAA;AAAA,EAC7B,CAAA,MAAO;AACL,IAAA,KAAA,GAAQ,EAAA,IAAM,IAAI,QAAA,GAAW,KAAA;AAC7B,IAAA,KAAA,GAAQ,EAAA,IAAM,IAAI,KAAA,GAAQ,QAAA;AAAA,EAC5B;AAEA,EAAA,MAAM,OAAA,GAAU,UAAA,CAAW,CAAA,EAAG,KAAA,EAAO,OAAO,CAAA;AAC5C,EAAA,MAAM,OAAA,GAAU,UAAA,CAAW,CAAA,EAAG,KAAA,EAAO,KAAK,CAAA;AAE1C,EAAA,IAAI,KAAA,KAAU,OAAA,IAAW,KAAA,KAAU,MAAA,EAAQ;AACzC,IAAA,MAAM,QAAA,GAAA,CAAY,OAAA,CAAQ,CAAA,GAAI,OAAA,CAAQ,CAAA,IAAK,CAAA;AAE3C,IAAA,MAAM,YAAY,CAAA,EAAA,EAAK,IAAA,CAAK,MAAM,QAAA,GAAW,CAAC,IAAI,CAAC,CAAA,CAAA;AACnD,IAAA,MAAM,MAAA,GAAS,cAAA,CAAe,GAAA,CAAI,SAAS,CAAA,IAAK,CAAA;AAChD,IAAA,cAAA,CAAe,GAAA,CAAI,SAAA,EAAW,MAAA,GAAS,CAAC,CAAA;AAExC,IAAA,MAAM,IAAA,GAAO,MAAA,GAAS,CAAA,KAAM,CAAA,GAAI,CAAA,GAAI,EAAA;AACpC,IAAA,MAAM,UAAU,IAAA,CAAK,IAAA,CAAK,SAAS,CAAC,CAAA,GAAIA,GAAE,iBAAA,GAAoB,IAAA;AAC9D,IAAA,MAAM,OAAO,QAAA,GAAW,OAAA;AAExB,IAAA,MAAM3B,KAAAA,GACJ,KAAK,OAAA,CAAQ,CAAC,IAAI,OAAA,CAAQ,CAAC,CAAA,GAAA,EACtB,IAAI,CAAA,CAAA,EAAI,OAAA,CAAQ,CAAC,CAAA,GAAA,EACjB,IAAI,IAAI,OAAA,CAAQ,CAAC,MACjB,OAAA,CAAQ,CAAC,CAAA,CAAA,EAAI,OAAA,CAAQ,CAAC,CAAA,CAAA;AAC7B,IAAA,OAAO;AAAA,MACL,IAAA,EAAAA,KAAAA;AAAA,MACA,UAAA,EAAY,EAAE,CAAA,EAAG,OAAA,CAAQ,GAAG,CAAA,EAAG,OAAA,CAAQ,CAAA,EAAG,IAAA,EAAM,KAAA,EAAM;AAAA,MACtD,QAAA,EAAU,EAAE,CAAA,EAAG,OAAA,CAAQ,GAAG,CAAA,EAAG,OAAA,CAAQ,CAAA,EAAG,IAAA,EAAM,KAAA,EAAM;AAAA,MACpD,OAAA,EAAS,EAAE,CAAA,EAAG,IAAA,EAAM,CAAA,EAAA,CAAI,OAAA,CAAQ,CAAA,GAAI,OAAA,CAAQ,CAAA,IAAK,CAAA,GAAI2B,EAAAA,CAAE,YAAA;AAAa,KACtE;AAAA,EACF,CAAA,MAAO;AACL,IAAA,MAAM,QAAA,GAAA,CAAY,OAAA,CAAQ,CAAA,GAAI,OAAA,CAAQ,CAAA,IAAK,CAAA;AAC3C,IAAA,MAAM,YAAY,CAAA,EAAA,EAAK,IAAA,CAAK,MAAM,QAAA,GAAW,CAAC,IAAI,CAAC,CAAA,CAAA;AACnD,IAAA,MAAM,MAAA,GAAS,cAAA,CAAe,GAAA,CAAI,SAAS,CAAA,IAAK,CAAA;AAChD,IAAA,cAAA,CAAe,GAAA,CAAI,SAAA,EAAW,MAAA,GAAS,CAAC,CAAA;AACxC,IAAA,MAAM,IAAA,GAAO,MAAA,GAAS,CAAA,KAAM,CAAA,GAAI,CAAA,GAAI,EAAA;AACpC,IAAA,MAAM,UAAU,IAAA,CAAK,IAAA,CAAK,SAAS,CAAC,CAAA,GAAIA,GAAE,iBAAA,GAAoB,IAAA;AAC9D,IAAA,MAAM,OAAO,QAAA,GAAW,OAAA;AAExB,IAAA,MAAM3B,KAAAA,GACJ,KAAK,OAAA,CAAQ,CAAC,IAAI,OAAA,CAAQ,CAAC,CAAA,GAAA,EACtB,OAAA,CAAQ,CAAC,CAAA,CAAA,EAAI,IAAI,CAAA,GAAA,EACjB,OAAA,CAAQ,CAAC,CAAA,CAAA,EAAI,IAAI,MACjB,OAAA,CAAQ,CAAC,CAAA,CAAA,EAAI,OAAA,CAAQ,CAAC,CAAA,CAAA;AAC7B,IAAA,OAAO;AAAA,MACL,IAAA,EAAAA,KAAAA;AAAA,MACA,UAAA,EAAY,EAAE,CAAA,EAAG,OAAA,CAAQ,GAAG,CAAA,EAAG,OAAA,CAAQ,CAAA,EAAG,IAAA,EAAM,KAAA,EAAM;AAAA,MACtD,QAAA,EAAU,EAAE,CAAA,EAAG,OAAA,CAAQ,GAAG,CAAA,EAAG,OAAA,CAAQ,CAAA,EAAG,IAAA,EAAM,KAAA,EAAM;AAAA,MACpD,OAAA,EAAS,EAAE,CAAA,EAAA,CAAI,OAAA,CAAQ,CAAA,GAAI,OAAA,CAAQ,CAAA,IAAK,CAAA,EAAG,CAAA,EAAG,IAAA,GAAO2B,EAAAA,CAAE,YAAA;AAAa,KACtE;AAAA,EACF;AACF;AAEA,SAAS,UAAA,CACP,CAAA,EACA,IAAA,EACA,GAAA,EAC0B;AAC1B,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,OAAA;AACH,MAAA,OAAO,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,OAAO,CAAA,EAAG,YAAA,CAAa,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,IACrD,KAAK,MAAA;AACH,MAAA,OAAO,EAAE,GAAG,CAAA,CAAE,CAAA,EAAG,GAAG,YAAA,CAAa,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,IAC3C,KAAK,KAAA;AACH,MAAA,OAAO,EAAE,GAAG,CAAA,CAAE,CAAA,GAAI,EAAE,KAAA,GAAQ,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAA,EAAE;AAAA,IACxC,KAAK,QAAA;AACH,MAAA,OAAO,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,KAAA,GAAQ,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,MAAA,EAAO;AAAA;AAEvD;;;AC3hBA,SAASH,UAAS,CAAA,EAAsB;AACtC,EAAA,OAAO;AAAA;AAAA,kDAAA,EAE2C,EAAE,IAAI,CAAA;AAAA,0BAAA,EAC9B,CAAA,CAAE,EAAE,CAAA,UAAA,EAAa,CAAA,CAAE,MAAM,CAAA;AAAA,iCAAA,EAClB,CAAA,CAAE,IAAI,CAAA,UAAA,EAAa,CAAA,CAAE,MAAM,CAAA;AAAA,yDAAA,EACH,EAAE,IAAI,CAAA;AAAA,qDAAA,EACV,EAAE,IAAI,CAAA;AAAA,wDAAA,EACH,EAAE,IAAI,CAAA;AAAA,gDAAA,EACd,EAAE,SAAS,CAAA;AAAA,uDAAA,EACJ,EAAE,EAAE,CAAA;AAAA,kCAAA,EACzB,EAAE,MAAM,CAAA;AAAA,kCAAA,EACR,EAAE,IAAI,CAAA;AAAA,kCAAA,EACN,EAAE,QAAQ,CAAA;AAAA,kCAAA,EACV,EAAE,OAAO,CAAA;AAAA,8BAAA,EACb,EAAE,SAAS,CAAA;AAAA,mCAAA,EACN,EAAE,MAAM,CAAA;AAAA;AAAA,wBAAA,EAEnB,EAAE,MAAM,CAAA;AAAA,+BAAA,EACD,CAAA,CAAE,MAAM,CAAA,2BAAA,EAA8B,CAAA,CAAE,EAAE,CAAA;AAAA,8BAAA,EAC3C,CAAA,CAAE,EAAE,CAAA,UAAA,EAAa,CAAA,CAAE,SAAS,CAAA;AAAA,sDAAA,EACJ,EAAE,SAAS,CAAA;AAAA,CAAA,CACjE,IAAA,EAAK;AACP;AAIA,SAAS,YAAY,CAAA,EAAmD;AACtE,EAAA,MAAM,MAAwC,EAAC;AAC/C,EAAA,IAAI,CAAA,CAAE,IAAI,GAAA,CAAI,IAAA,CAAK,EAAE,KAAA,EAAO,IAAA,EAAM,GAAA,EAAK,0BAAA,EAA4B,CAAA;AACnE,EAAA,IAAI,CAAA,CAAE,IAAI,GAAA,CAAI,IAAA,CAAK,EAAE,KAAA,EAAO,IAAA,EAAM,GAAA,EAAK,0BAAA,EAA4B,CAAA;AACnE,EAAA,IAAI,CAAA,CAAE,IAAI,GAAA,CAAI,IAAA,CAAK,EAAE,KAAA,EAAO,IAAA,EAAM,GAAA,EAAK,0BAAA,EAA4B,CAAA;AACnE,EAAA,IAAI,CAAA,CAAE,OAAA,IAAW,CAAC,CAAA,CAAE,EAAA,EAAI,GAAA,CAAI,IAAA,CAAK,EAAE,KAAA,EAAO,GAAA,EAAK,GAAA,EAAK,0BAAA,EAA4B,CAAA;AAChF,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,aAAa,CAAA,EAA4B;AAChD,EAAA,MAAMG,EAAAA,GAAI,SAAA;AACV,EAAA,MAAM,OAAiB,EAAC;AAGxB,EAAA,IAAA,CAAK,IAAA;AAAA,IACH9B,sBAAA,CAAK;AAAA,MACH,GAAG,CAAA,CAAE,CAAA;AAAA,MACL,GAAG,CAAA,CAAE,CAAA;AAAA,MACL,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,QAAQ,CAAA,CAAE,MAAA;AAAA,MACV,EAAA,EAAI,CAAA;AAAA,MACJ,KAAA,EAAO;AAAA,KACR;AAAA,GACH;AAGA,EAAA,IAAA,CAAK,IAAA;AAAA,IACHG,sBAAA,CAAO;AAAA,MACL,CAAA,EACE,CAAA,EAAA,EAAK,CAAA,CAAE,CAAC,CAAA,CAAA,EAAI,CAAA,CAAE,CAAA,GAAI,CAAC,CAAA,GAAA,EACd,CAAA,CAAE,CAAC,CAAA,CAAA,EAAI,EAAE,CAAC,CAAA,CAAA,EAAI,CAAA,CAAE,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,CAAA,CAAE,CAAC,CAAA,GAAA,EAC5B,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,KAAA,GAAQ,CAAC,CAAA,CAAA,EAAI,CAAA,CAAE,CAAC,CAAA,GAAA,EACxB,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,KAAK,CAAA,CAAA,EAAI,CAAA,CAAE,CAAC,CAAA,CAAA,EAAI,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,KAAK,CAAA,CAAA,EAAI,CAAA,CAAE,CAAA,GAAI,CAAC,CAAA,GAAA,EAChD,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,KAAK,CAAA,CAAA,EAAI,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,YAAY,CAAA,GAAA,EACrC,CAAA,CAAE,CAAC,CAAA,CAAA,EAAI,CAAA,CAAE,CAAA,GAAI,EAAE,YAAY,CAAA,EAAA,CAAA;AAAA,MAClC,KAAA,EAAO;AAAA,KACR;AAAA,GACH;AAGA,EAAA,IAAA,CAAK,IAAA;AAAA,IACHX,sBAAA;AAAA,MACE;AAAA,QACE,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,KAAA,GAAQ,CAAA;AAAA,QACnB,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,YAAA,GAAe,CAAA;AAAA,QAC1B,KAAA,EAAO;AAAA,OACT;AAAA,MACA,EAAE,MAAA,CAAO;AAAA;AACX,GACF;AAGA,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACtC,IAAA,MAAM,GAAA,GAAM,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA;AACpB,IAAA,MAAM,IAAI,GAAA,CAAI,SAAA;AACd,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,GAAA,CAAI,OAAA;AAGrB,IAAA,IAAI,IAAI,CAAA,EAAG;AACT,MAAA,IAAA,CAAK,IAAA;AAAA,QACHD,sBAAA,CAAO;AAAA,UACL,IAAI,CAAA,CAAE,CAAA;AAAA,UACN,IAAI,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,YAAA,GAAe,IAAIuC,EAAAA,CAAE,UAAA;AAAA,UACjC,EAAA,EAAI,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,KAAA;AAAA,UACZ,IAAI,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,YAAA,GAAe,IAAIA,EAAAA,CAAE,UAAA;AAAA,UACjC,KAAA,EAAO;AAAA,SACR;AAAA,OACH;AAAA,IACF;AAGA,IAAA,IAAA,CAAK,IAAA;AAAA,MACHtC,sBAAA;AAAA,QACE;AAAA,UACE,CAAA,EAAG,CAAA,CAAE,CAAA,GAAIsC,EAAAA,CAAE,gBAAA;AAAA,UACX,CAAA,EAAG,EAAA;AAAA,UACH,KAAA,EAAO,CAAA,CAAE,EAAA,GAAK,qBAAA,GAAwB;AAAA,SACxC;AAAA,QACA,CAAA,CAAE;AAAA;AACJ,KACF;AAGA,IAAA,MAAMO,QAAAA,GAAU,YAAY,CAAC,CAAA;AAC7B,IAAA,MAAM,OAAA,GAAU,EAAA;AAChB,IAAA,MAAM,SAAA,GAAY,CAAA;AAClB,IAAA,MAAM,gBAAgBA,QAAAA,CAAQ,MAAA,GAAS,OAAA,GAAA,CAAWA,QAAAA,CAAQ,SAAS,CAAA,IAAK,SAAA;AACxE,IAAA,MAAM,gBAAgB,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,KAAA,GAAQP,GAAE,gBAAA,GAAmB,aAAA;AAE3D,IAAA,IAAI,EAAE,IAAA,EAAM;AACV,MAAA,IAAA,CAAK,IAAA;AAAA,QACHtC,sBAAA;AAAA,UACE;AAAA,YACE,GAAG,aAAA,GAAgB,CAAA;AAAA,YACnB,CAAA,EAAG,EAAA;AAAA,YACH,KAAA,EAAO,kBAAA;AAAA,YACP,aAAA,EAAe;AAAA,WACjB;AAAA,UACA,CAAA,CAAE;AAAA;AACJ,OACF;AAAA,IACF;AAGA,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI6C,QAAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACvC,MAAA,MAAM,CAAA,GAAIA,SAAQ,CAAC,CAAA;AACnB,MAAA,MAAM,EAAA,GAAK,aAAA,GAAgB,CAAA,IAAK,OAAA,GAAU,SAAA,CAAA;AAC1C,MAAA,IAAA,CAAK,IAAA;AAAA,QACHrC,sBAAA,CAAK;AAAA,UACH,CAAA,EAAG,EAAA;AAAA,UACH,GAAG,EAAA,GAAK,CAAA;AAAA,UACR,KAAA,EAAO,OAAA;AAAA,UACP,MAAA,EAAQ,EAAA;AAAA,UACR,EAAA,EAAI,CAAA;AAAA,UACJ,OAAO,CAAA,CAAE;AAAA,SACV;AAAA,OACH;AACA,MAAA,IAAA,CAAK,IAAA;AAAA,QACHR,sBAAA;AAAA,UACE;AAAA,YACE,CAAA,EAAG,KAAK,OAAA,GAAU,CAAA;AAAA,YAClB,GAAG,EAAA,GAAK,CAAA;AAAA,YACR,KAAA,EAAO;AAAA,WACT;AAAA,UACA,CAAA,CAAE;AAAA;AACJ,OACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAOY,uBAAA;AAAA,IACL;AAAA,MACE,KAAA,EAAO,eAAA;AAAA,MACP,SAAA,EAAW,EAAE,MAAA,CAAO;AAAA,KACtB;AAAA,IACA;AAAA,GACF;AACF;AAUA,SAAS,WAAA,CACP,EAAA,EACA,EAAA,EACA,IAAA,EACA,MACA,IAAA,EACQ;AACR,EAAA,MAAM0B,EAAAA,GAAI,SAAA;AAEV,EAAA,MAAM,KAAK,CAAC,IAAA;AACZ,EAAA,MAAM,EAAA,GAAK,IAAA;AAGX,EAAA,MAAM,UAAUA,EAAAA,CAAE,YAAA;AAClB,EAAA,MAAM,IAAA,GAAO,KAAK,IAAA,GAAO,OAAA;AACzB,EAAA,MAAM,IAAA,GAAO,KAAK,IAAA,GAAO,OAAA;AAGzB,EAAA,MAAM,QAAA,GAAW,EAAA;AACjB,EAAA,MAAM,QAAA,GAAW,EAAA;AACjB,EAAA,MAAM,SAAA,GAAY,EAAA,GAAK,IAAA,GAAOA,EAAAA,CAAE,cAAA;AAChC,EAAA,MAAM,SAAA,GAAY,EAAA,GAAK,IAAA,GAAOA,EAAAA,CAAE,cAAA;AAEhC,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,eAAA,EAAiB;AAEpB,MAAA,KAAA,CAAM,IAAA;AAAA,QACJvC,sBAAA,CAAO;AAAA,UACL,EAAA,EAAI,IAAA,GAAO,EAAA,GAAKuC,EAAAA,CAAE,cAAA;AAAA,UAClB,EAAA,EAAI,IAAA,GAAO,EAAA,GAAKA,EAAAA,CAAE,cAAA;AAAA,UAClB,EAAA,EAAI,IAAA,GAAO,EAAA,GAAKA,EAAAA,CAAE,cAAA;AAAA,UAClB,EAAA,EAAI,IAAA,GAAO,EAAA,GAAKA,EAAAA,CAAE,cAAA;AAAA,UAClB,KAAA,EAAO;AAAA,SACR;AAAA,OACH;AACA,MAAA;AAAA,IACF;AAAA,IACA,KAAK,cAAA,EAAgB;AAEnB,MAAA,KAAA,CAAM,IAAA;AAAA,QACJ7B,wBAAA,CAAS;AAAA,UACP,EAAA,EAAI,IAAA;AAAA,UACJ,EAAA,EAAI,IAAA;AAAA,UACJ,GAAG6B,EAAAA,CAAE,cAAA;AAAA,UACL,KAAA,EAAO;AAAA,SACR;AAAA,OACH;AACA,MAAA;AAAA,IACF;AAAA,IACA,KAAK,gBAAA,EAAkB;AAErB,MAAA,KAAA,CAAM,IAAA;AAAA,QACJvC,sBAAA,CAAO;AAAA,UACL,EAAA,EAAI,IAAA,GAAO,EAAA,GAAKuC,EAAAA,CAAE,cAAA;AAAA,UAClB,EAAA,EAAI,IAAA,GAAO,EAAA,GAAKA,EAAAA,CAAE,cAAA;AAAA,UAClB,EAAA,EAAI,IAAA,GAAO,EAAA,GAAKA,EAAAA,CAAE,cAAA;AAAA,UAClB,EAAA,EAAI,IAAA,GAAO,EAAA,GAAKA,EAAAA,CAAE,cAAA;AAAA,UAClB,KAAA,EAAO;AAAA,SACR;AAAA,OACH;AAEA,MAAA,KAAA,CAAM,IAAA;AAAA,QACJvC,sBAAA,CAAO,EAAE,EAAA,EAAI,SAAA,EAAW,EAAA,EAAI,SAAA,EAAW,EAAA,EAAI,QAAA,EAAU,EAAA,EAAI,QAAA,EAAU,KAAA,EAAO,cAAA,EAAgB;AAAA,OAC5F;AACA,MAAA,KAAA,CAAM,IAAA;AAAA,QACJA,sBAAA,CAAO;AAAA,UACL,EAAA,EAAI,SAAA;AAAA,UACJ,EAAA,EAAI,SAAA;AAAA,UACJ,EAAA,EAAI,QAAA,GAAW,EAAA,GAAKuC,EAAAA,CAAE,cAAA;AAAA,UACtB,EAAA,EAAI,QAAA,GAAW,EAAA,GAAKA,EAAAA,CAAE,cAAA;AAAA,UACtB,KAAA,EAAO;AAAA,SACR;AAAA,OACH;AACA,MAAA,KAAA,CAAM,IAAA;AAAA,QACJvC,sBAAA,CAAO;AAAA,UACL,EAAA,EAAI,SAAA;AAAA,UACJ,EAAA,EAAI,SAAA;AAAA,UACJ,EAAA,EAAI,QAAA,GAAW,EAAA,GAAKuC,EAAAA,CAAE,cAAA;AAAA,UACtB,EAAA,EAAI,QAAA,GAAW,EAAA,GAAKA,EAAAA,CAAE,cAAA;AAAA,UACtB,KAAA,EAAO;AAAA,SACR;AAAA,OACH;AACA,MAAA;AAAA,IACF;AAAA,IACA,KAAK,eAAA,EAAiB;AAEpB,MAAA,KAAA,CAAM,IAAA;AAAA,QACJ7B,wBAAA,CAAS;AAAA,UACP,EAAA,EAAI,IAAA;AAAA,UACJ,EAAA,EAAI,IAAA;AAAA,UACJ,GAAG6B,EAAAA,CAAE,cAAA;AAAA,UACL,KAAA,EAAO;AAAA,SACR;AAAA,OACH;AACA,MAAA,KAAA,CAAM,IAAA;AAAA,QACJvC,sBAAA,CAAO,EAAE,EAAA,EAAI,SAAA,EAAW,EAAA,EAAI,SAAA,EAAW,EAAA,EAAI,QAAA,EAAU,EAAA,EAAI,QAAA,EAAU,KAAA,EAAO,cAAA,EAAgB;AAAA,OAC5F;AACA,MAAA,KAAA,CAAM,IAAA;AAAA,QACJA,sBAAA,CAAO;AAAA,UACL,EAAA,EAAI,SAAA;AAAA,UACJ,EAAA,EAAI,SAAA;AAAA,UACJ,EAAA,EAAI,QAAA,GAAW,EAAA,GAAKuC,EAAAA,CAAE,cAAA;AAAA,UACtB,EAAA,EAAI,QAAA,GAAW,EAAA,GAAKA,EAAAA,CAAE,cAAA;AAAA,UACtB,KAAA,EAAO;AAAA,SACR;AAAA,OACH;AACA,MAAA,KAAA,CAAM,IAAA;AAAA,QACJvC,sBAAA,CAAO;AAAA,UACL,EAAA,EAAI,SAAA;AAAA,UACJ,EAAA,EAAI,SAAA;AAAA,UACJ,EAAA,EAAI,QAAA,GAAW,EAAA,GAAKuC,EAAAA,CAAE,cAAA;AAAA,UACtB,EAAA,EAAI,QAAA,GAAW,EAAA,GAAKA,EAAAA,CAAE,cAAA;AAAA,UACtB,KAAA,EAAO;AAAA,SACR;AAAA,OACH;AACA,MAAA;AAAA,IACF;AAAA;AAGF,EAAA,OAAO,KAAA,CAAM,KAAK,EAAE,CAAA;AACtB;AAEA,SAAS,iBAAiB,IAAA,EAAqE;AAC7F,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,OAAA;AACH,MAAA,OAAO,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAE;AAAA,IACtB,KAAK,MAAA;AACH,MAAA,OAAO,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,CAAA,EAAE;AAAA,IACvB,KAAK,QAAA;AACH,MAAA,OAAO,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAE;AAAA,IACtB,KAAK,KAAA;AACH,MAAA,OAAO,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,EAAA,EAAG;AAAA;AAE3B;AAIA,SAASM,YAAW,IAAA,EAA6B;AAC/C,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,CAAM,IAAA;AAAA,IACJjC,sBAAA,CAAO;AAAA,MACL,GAAG,IAAA,CAAK,IAAA;AAAA,MACR,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,WAAA,GAAc,aAAA,GAAgB;AAAA,KAC/C;AAAA,GACH;AAEA,EAAA,MAAM,OAAA,GAAU,gBAAA,CAAiB,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA;AACrD,EAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA;AAEjD,EAAA,KAAA,CAAM,IAAA;AAAA,IACJ,WAAA;AAAA,MACE,KAAK,UAAA,CAAW,CAAA;AAAA,MAChB,KAAK,UAAA,CAAW,CAAA;AAAA,MAChB,OAAA,CAAQ,CAAA;AAAA,MACR,OAAA,CAAQ,CAAA;AAAA,MACR,KAAK,GAAA,CAAI;AAAA;AACX,GACF;AACA,EAAA,KAAA,CAAM,IAAA;AAAA,IACJ,WAAA;AAAA,MACE,KAAK,QAAA,CAAS,CAAA;AAAA,MACd,KAAK,QAAA,CAAS,CAAA;AAAA,MACd,KAAA,CAAM,CAAA;AAAA,MACN,KAAA,CAAM,CAAA;AAAA,MACN,KAAK,GAAA,CAAI;AAAA;AACX,GACF;AAEA,EAAA,IAAI,IAAA,CAAK,GAAA,CAAI,KAAA,IAAS,IAAA,CAAK,OAAA,EAAS;AAClC,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,KAAA;AACvB,IAAA,MAAM,CAAA,GAAI,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,EAAA;AAC7B,IAAA,KAAA,CAAM,IAAA;AAAA,MACJH,sBAAA,CAAK;AAAA,QACH,CAAA,EAAG,IAAA,CAAK,OAAA,CAAQ,CAAA,GAAI,CAAA,GAAI,CAAA;AAAA,QACxB,CAAA,EAAG,IAAA,CAAK,OAAA,CAAQ,CAAA,GAAI,CAAA;AAAA,QACpB,KAAA,EAAO,CAAA;AAAA,QACP,MAAA,EAAQ,EAAA;AAAA,QACR,EAAA,EAAI,CAAA;AAAA,QACJ,KAAA,EAAO;AAAA,OACR;AAAA,KACH;AACA,IAAA,KAAA,CAAM,IAAA;AAAA,MACJR,sBAAA;AAAA,QACE;AAAA,UACE,CAAA,EAAG,KAAK,OAAA,CAAQ,CAAA;AAAA,UAChB,CAAA,EAAG,KAAK,OAAA,CAAQ,CAAA;AAAA,UAChB,KAAA,EAAO;AAAA,SACT;AAAA,QACA;AAAA;AACF,KACF;AAAA,EACF;AAEA,EAAA,OAAOY,uBAAA,CAAM,EAAE,KAAA,EAAO,mBAAA,IAAuB,KAAK,CAAA;AACpD;AAIO,SAAS,YAAA,CACd,MAAA,EACA,SAAA,GAA+C,SAAA,EACvC;AACR,EAAA,MAAM,KAAA,GAAQC,mCAAiB,SAAS,CAAA;AACxC,EAAA,MAAM,EAAE,QAAA,EAAU,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,KAAI,GAAI,MAAA;AAEhD,EAAA,MAAM,WAAWE,oBAAA,CAAG,OAAA,EAAS,EAAC,EAAGoB,SAAAA,CAAS,KAAK,CAAC,CAAA;AAChD,EAAA,MAAM,SAAA,GAAYlC,uBAAA,CAAQ,GAAA,CAAI,KAAA,IAAS,eAAe,CAAA;AACtD,EAAA,MAAM,QAAA,GAAWa,sBAAA;AAAA,IACf,CAAA,iCAAA,EAAoC,QAAA,CAAS,MAAM,CAAA,cAAA,EAAiB,MAAM,MAAM,CAAA,eAAA;AAAA,GAClF;AAEA,EAAA,MAAM,aAAA,GAAgB,IAAI,KAAA,GACtBd,sBAAA;AAAA,IACE;AAAA,MACE,CAAA,EAAG,EAAA;AAAA,MACH,CAAA,EAAG,EAAA;AAAA,MACH,KAAA,EAAO;AAAA,KACT;AAAA,IACA,GAAA,CAAI;AAAA,GACN,GACA,EAAA;AAEJ,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,KAAA,GAAQ,EAAA,GAAK,CAAA;AAEhC,EAAA,MAAM,SAAA,GAAYY,uBAAA;AAAA,IAChB,EAAE,KAAA,EAAO,iBAAA,EAAmB,SAAA,EAAW,CAAA,aAAA,EAAgB,MAAM,CAAA,CAAA,CAAA,EAAI;AAAA,IACjE,QAAA,CAAS,IAAI,YAAY;AAAA,GAC3B;AACA,EAAA,MAAM,MAAA,GAASA,uBAAA;AAAA,IACb,EAAE,KAAA,EAAO,cAAA,EAAgB,SAAA,EAAW,CAAA,aAAA,EAAgB,MAAM,CAAA,CAAA,CAAA,EAAI;AAAA,IAC9D,KAAA,CAAM,IAAIgC,WAAU;AAAA,GACtB;AAEA,EAAA,OAAO5B,yBAAA;AAAA,IACL;AAAA,MACE,KAAA;AAAA,MACA,QAAQ,MAAA,GAAS,MAAA;AAAA,MACjB,OAAA,EAAS,CAAA,IAAA,EAAO,KAAK,CAAA,CAAA,EAAI,SAAS,MAAM,CAAA,CAAA;AAAA,MACxC,KAAA,EAAO;AAAA,KACT;AAAA,IACA,CAAC,SAAA,EAAW,QAAA,EAAU,QAAA,EAAU,aAAA,EAAe,QAAQ,SAAS;AAAA,GAClE;AACF;AAEO,SAAS,SAAA,CACdhB,OACA,MAAA,EACQ;AACR,EAAA,MAAM,GAAA,GAAM,SAASA,KAAI,CAAA;AACzB,EAAA,MAAM,MAAA,GAAS,UAAU,GAAG,CAAA;AAC5B,EAAA,MAAM,SAAA,GAAc,QAAQ,KAAA,IAA+C,SAAA;AAC3E,EAAA,OAAO,YAAA,CAAa,QAAQ,SAAS,CAAA;AACvC;;;ACncO,IAAM,GAAA,GAAqB;AAAA,EAChC,IAAA,EAAM,KAAA;AAAA,EACN,OAAOA,KAAAA,EAAuB;AAC5B,IAAA,KAAA,MAAW,GAAA,IAAOA,KAAAA,CAAK,KAAA,CAAM,OAAO,CAAA,EAAG;AACrC,MAAA,MAAM,CAAA,GAAI,IAAI,IAAA,EAAK;AACnB,MAAA,IAAI,CAAA,CAAE,WAAW,CAAA,EAAG;AACpB,MAAA,IAAI,EAAE,UAAA,CAAW,IAAI,KAAK,CAAA,CAAE,UAAA,CAAW,GAAG,CAAA,EAAG;AAC7C,MAAA,MAAM,KAAA,GAAQ,EAAE,KAAA,CAAM,KAAK,EAAE,CAAC,CAAA,EAAG,aAAY,IAAK,EAAA;AAClD,MAAA,OAAO,KAAA,KAAU,KAAA;AAAA,IACnB;AACA,IAAA,OAAO,KAAA;AAAA,EACT,CAAA;AAAA,EACA,KAAA,EAAO,QAAA;AAAA,EACP,MAAA,CAAOA,OAAc,MAAA,EAA+B;AAClD,IAAA,OAAO,SAAA,CAAUA,OAAM,MAAM,CAAA;AAAA,EAC/B;AACF,CAAA;;;ACMO,IAAM,oBAAA,GAAN,cAAmC,KAAA,CAAM;AAAA,EAC9C,WAAA,CAAY,SAAwB,UAAA,EAAqB;AACvD,IAAA,KAAA,CAAM,eAAe,MAAA,GAAY,CAAA,MAAA,EAAS,UAAU,CAAA,EAAA,EAAK,OAAO,KAAK,OAAO,CAAA;AAD1C,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AAElC,IAAA,IAAA,CAAK,IAAA,GAAO,sBAAA;AAAA,EACd;AAAA,EAHoC,UAAA;AAItC,CAAA;AAIA,SAASsE,cAAa,CAAA,EAAmB;AACvC,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,QAAQ,CAAA,EAAA,EAAK;AACjC,IAAA,MAAM,EAAA,GAAK,EAAE,CAAC,CAAA;AACd,IAAA,IAAI,EAAA,KAAO,GAAA,EAAK,OAAA,GAAU,CAAC,OAAA;AAC3B,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,IAAI,OAAO,GAAA,IAAO,CAAA,CAAE,CAAA,GAAI,CAAC,MAAM,GAAA,EAAK;AACpC,MAAA,IAAI,OAAO,GAAA,EAAK;AAAA,IAClB;AACA,IAAA,GAAA,IAAO,EAAA;AAAA,EACT;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS3C,SAAQ,CAAA,EAAmB;AAClC,EAAA,MAAM,CAAA,GAAI,EAAE,IAAA,EAAK;AACjB,EAAA,IAAI,CAAA,CAAE,MAAA,IAAU,CAAA,IAAK,CAAA,CAAE,WAAW,GAAG,CAAA,IAAK,CAAA,CAAE,QAAA,CAAS,GAAG,CAAA,EAAG,OAAO,CAAA,CAAE,KAAA,CAAM,GAAG,EAAE,CAAA;AAC/E,EAAA,OAAO,CAAA;AACT;AAIA,SAASmE,KAAI9F,KAAAA,EAAyB;AACpC,EAAA,OAAOA,MAAK,KAAA,CAAM,OAAO,EAAE,GAAA,CAAI,CAAC,KAAK,CAAA,MAAO;AAAA,IAC1C,IAAA,EAAMsE,cAAa,GAAG,CAAA,CAAE,SAAQ,CAAE,OAAA,CAAQ,QAAQ,EAAE,CAAA;AAAA,IACpD,YAAY,CAAA,GAAI;AAAA,GAClB,CAAE,EAAE,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,IAAA,CAAK,SAAS,CAAC,CAAA;AACrC;AAIA,IAAM,WAAA,mBAAc,IAAI,GAAA,CAAI,CAAC,KAAK,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAG,CAAC,CAAA;AAEvE,SAAS,UAAA,CAAW,OAAe,UAAA,EAAqC;AAC7E,EAAA,MAAM,CAAA,GAAI,MAAM,UAAA,CAAW,GAAG,IAAI,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA,GAAI,KAAA;AAEnD,EAAA,MAAM,SAAA,GAAY,qBAAA,CAAsB,IAAA,CAAK,CAAC,CAAA;AAC9C,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,MAAM,IAAA,GAAO,UAAU,CAAC,CAAA;AACxB,IAAA,MAAM,IAAA,GAAO,UAAU,CAAC,CAAA;AACxB,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,SAAA,CAAU,CAAC,GAAI,EAAE,CAAA;AACtC,IAAA,IAAI,GAAA,GAAM,GAAG,MAAM,IAAI,qBAAqB,CAAA,kCAAA,EAAgC,GAAG,IAAI,UAAU,CAAA;AAC7F,IAAA,OAAO,EAAE,MAAM,MAAA,EAAQ,IAAA,EAAM,GAAG,IAAI,CAAA,EAAG,IAAI,CAAA,CAAA,EAAsB,GAAA,EAAI;AAAA,EACvE;AAEA,EAAA,MAAM,SAAA,GAAY,mBAAA,CAAoB,IAAA,CAAK,CAAC,CAAA;AAC5C,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,SAAA,CAAU,CAAC,GAAI,EAAE,CAAA;AACtC,IAAA,MAAM,GAAA,GAAM,SAAA,CAAU,CAAC,CAAA,CAAG,WAAA,EAAY;AACtC,IAAA,IAAI,GAAA,GAAM,GAAG,MAAM,IAAI,qBAAqB,CAAA,6BAAA,EAA2B,GAAG,IAAI,UAAU,CAAA;AACxF,IAAA,IAAI,CAAC,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA,EAAG,MAAM,IAAI,oBAAA,CAAqB,CAAA,aAAA,EAAgB,GAAG,CAAA,CAAA,CAAA,EAAK,UAAU,CAAA;AAC5F,IAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,GAAA,EAAK,GAAA,EAAgB;AAAA,EAC9C;AACA,EAAA,MAAM,IAAI,oBAAA,CAAqB,CAAA,oBAAA,EAAuB,KAAK,uCAAuC,UAAU,CAAA;AAC9G;AAEA,IAAM,eAAA,uBAAsB,GAAA,CAAI,CAAC,eAAe,cAAA,EAAgB,OAAA,EAAS,OAAO,CAAC,CAAA;AAEjF,SAAS,cAAA,CAAe,MAAc,UAAA,EAAyC;AAC7E,EAAA,MAAM,CAAA,GAAI,KAAK,IAAA,EAAK;AACpB,EAAA,IAAI,CAAC,CAAA,CAAE,UAAA,CAAW,GAAG,CAAA,EAAG;AACtB,IAAA,MAAM,IAAI,oBAAA,CAAqB,CAAA,oCAAA,EAAuC,CAAC,KAAK,UAAU,CAAA;AAAA,EACxF;AACA,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,KAAA,CAAM,CAAC,EAAE,IAAA,EAAK;AAC7B,EAAA,IAAI,eAAA,CAAgB,GAAA,CAAI,IAAI,CAAA,EAAG;AAC7B,IAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAgC;AAAA,EAC/D;AAEA,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAA;AACjC,EAAA,IAAI,WAAW,CAAA,EAAG;AAChB,IAAA,MAAM,UAAU,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,OAAO,EAAE,IAAA,EAAK;AAC5C,IAAA,MAAM,QAAQ,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,CAAC,EAAE,IAAA,EAAK;AAC3C,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,MAAA;AAAA,MACN,IAAA,EAAM,UAAA,CAAW,OAAA,EAAS,UAAU,CAAA;AAAA,MACpC,EAAA,EAAI,UAAA,CAAW,KAAA,EAAO,UAAU;AAAA,KAClC;AAAA,EACF;AACA,EAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,IAAI,UAAA,CAAW,IAAA,EAAM,UAAU,CAAA,EAAE;AAC3D;AAIA,IAAMyB,aAAAA,GAAmD;AAAA,EACvD,QAAA,EAAU,UAAA;AAAA,EACV,GAAA,EAAK,KAAA;AAAA,EACL,GAAA,EAAK,UAAA;AAAA,EACL,UAAA,EAAY,UAAA;AAAA,EACZ,aAAA,EAAe,aAAA;AAAA,EACf,KAAA,EAAO,OAAA;AAAA,EACP,MAAA,EAAQ,QAAA;AAAA,EACR,GAAA,EAAK,KAAA;AAAA,EACL,MAAA,EAAQ;AAAA;AAEV,CAAA;AAEA,IAAM,YAAA,GAAmD;AAAA,EACvD,GAAA,EAAK,SAAA;AAAA,EAAW,IAAA,EAAM,UAAA;AAAA,EAAY,KAAA,EAAO,WAAA;AAAA,EAAa,IAAA,EAAM;AAC9D,CAAA;AAEA,IAAM,eAAA,GAAsD;AAAA,EAC1D,MAAA,EAAQ,eAAA;AAAA,EAAiB,SAAA,EAAW,eAAA;AAAA,EACpC,KAAA,EAAO,cAAA;AAAA,EAAgB,KAAA,EAAO;AAChC,CAAA;AAEA,IAAM,gBAAA,GAAuD;AAAA,EAC3D,cAAA,EAAgB,sBAAA;AAAA,EAChB,IAAA,EAAM,sBAAA;AAAA,EACN,cAAA,EAAgB,sBAAA;AAAA,EAChB,GAAA,EAAK;AACP,CAAA;AAEA,IAAM,eAAA,GAAsD;AAAA,EAC1D,cAAA,EAAgB,qBAAA;AAAA,EAChB,MAAA,EAAQ;AACV,CAAA;AAEA,IAAM,iBAAA,GAAwD;AAAA,EAC5D,YAAA,EAAc,qBAAA;AAAA,EACd,KAAA,EAAO;AACT,CAAA;AAEA,SAAS,WAAA,CAAY,QAAkB,UAAA,EAAoE;AACzG,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,CAAC,CAAA,EAAG,aAAY,IAAK,EAAA;AACzC,EAAA,IAAI,SAAS,KAAA,EAAO;AAClB,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,CAAC,CAAA,EAAG,aAAY,IAAK,EAAA;AACxC,IAAA,IAAI,CAAC,YAAA,CAAa,GAAG,CAAA,EAAG,MAAM,IAAI,oBAAA,CAAqB,CAAA,qBAAA,EAAwB,GAAG,CAAA,CAAA,CAAA,EAAK,UAAU,CAAA;AACjG,IAAA,OAAO,EAAE,IAAA,EAAM,YAAA,CAAa,GAAG,CAAA,EAAI,UAAU,CAAA,EAAE;AAAA,EACjD;AACA,EAAA,IAAI,SAAS,QAAA,EAAU;AACrB,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,CAAC,CAAA,EAAG,aAAY,IAAK,EAAA;AACxC,IAAA,IAAI,CAAC,eAAA,CAAgB,GAAG,CAAA,EAAG,MAAM,IAAI,oBAAA,CAAqB,CAAA,wBAAA,EAA2B,GAAG,CAAA,CAAA,CAAA,EAAK,UAAU,CAAA;AACvG,IAAA,OAAO,EAAE,IAAA,EAAM,eAAA,CAAgB,GAAG,CAAA,EAAI,UAAU,CAAA,EAAE;AAAA,EACpD;AACA,EAAA,IAAI,SAAS,SAAA,EAAW;AACtB,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,CAAC,CAAA,EAAG,aAAY,IAAK,EAAA;AACxC,IAAA,IAAI,CAAC,gBAAA,CAAiB,GAAG,CAAA,EAAG,MAAM,IAAI,oBAAA,CAAqB,CAAA,yBAAA,EAA4B,GAAG,CAAA,CAAA,CAAA,EAAK,UAAU,CAAA;AACzG,IAAA,OAAO,EAAE,IAAA,EAAM,gBAAA,CAAiB,GAAG,CAAA,EAAI,UAAU,CAAA,EAAE;AAAA,EACrD;AACA,EAAA,IAAI,SAAS,QAAA,EAAU;AACrB,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,CAAC,CAAA,EAAG,aAAY,IAAK,EAAA;AACxC,IAAA,IAAI,CAAC,eAAA,CAAgB,GAAG,CAAA,EAAG,MAAM,IAAI,oBAAA,CAAqB,CAAA,wBAAA,EAA2B,GAAG,CAAA,CAAA,CAAA,EAAK,UAAU,CAAA;AACvG,IAAA,OAAO,EAAE,IAAA,EAAM,eAAA,CAAgB,GAAG,CAAA,EAAI,UAAU,CAAA,EAAE;AAAA,EACpD;AACA,EAAA,IAAI,SAAS,UAAA,EAAY;AACvB,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,CAAC,CAAA,EAAG,aAAY,IAAK,EAAA;AACxC,IAAA,IAAI,CAAC,iBAAA,CAAkB,GAAG,CAAA,EAAG,MAAM,IAAI,oBAAA,CAAqB,CAAA,0BAAA,EAA6B,GAAG,CAAA,CAAA,CAAA,EAAK,UAAU,CAAA;AAC3G,IAAA,OAAO,EAAE,IAAA,EAAM,iBAAA,CAAkB,GAAG,CAAA,EAAI,UAAU,CAAA,EAAE;AAAA,EACtD;AACA,EAAA,IAAIA,aAAAA,CAAa,IAAI,CAAA,EAAG,OAAO,EAAE,MAAMA,aAAAA,CAAa,IAAI,CAAA,EAAI,QAAA,EAAU,CAAA,EAAE;AACxE,EAAA,MAAM,IAAI,oBAAA,CAAqB,CAAA,mBAAA,EAAsB,IAAI,KAAK,UAAU,CAAA;AAC1E;AAEA,SAAS,SAAA,CAAU,SAAiB,UAAA,EAAoC;AAEtE,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,OAAA,CAAQ,GAAG,CAAA;AACpC,EAAA,IAAI,WAAW,CAAA,EAAG;AAChB,IAAA,MAAM,IAAI,oBAAA,CAAqB,CAAA,+CAAA,CAAA,EAAmD,UAAU,CAAA;AAAA,EAC9F;AACA,EAAA,MAAM,KAAK,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,QAAQ,EAAE,IAAA,EAAK;AAC3C,EAAA,IAAI,CAAC,kBAAA,CAAmB,IAAA,CAAK,EAAE,CAAA,EAAG;AAChC,IAAA,MAAM,IAAI,oBAAA,CAAqB,CAAA,iBAAA,EAAoB,EAAE,KAAK,UAAU,CAAA;AAAA,EACtE;AACA,EAAA,MAAM,QAAQ,OAAA,CAAQ,KAAA,CAAM,QAAA,GAAW,CAAC,EAAE,IAAA,EAAK;AAE/C,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA;AAC/B,EAAA,IAAI,QAAQ,CAAA,EAAG;AACb,IAAA,MAAM,IAAI,oBAAA,CAAqB,CAAA,MAAA,EAAS,EAAE,qDAAqD,UAAU,CAAA;AAAA,EAC3G;AACA,EAAA,MAAM,cAAc,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,KAAK,EAAE,IAAA,EAAK;AAC/C,EAAA,MAAM,YAAA,GAAe,KAAA,CAAM,KAAA,CAAM,KAAK,EAAE,IAAA,EAAK;AAE7C,EAAA,MAAM,MAAA,GAAS,WAAA,CAAY,KAAA,CAAM,KAAK,CAAA,CAAE,OAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA;AAClE,EAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG,MAAM,IAAI,oBAAA,CAAqB,CAAA,MAAA,EAAS,EAAE,CAAA,cAAA,CAAA,EAAkB,UAAU,CAAA;AAC/F,EAAA,MAAM,EAAE,IAAA,EAAM,QAAA,EAAS,GAAI,WAAA,CAAY,QAAQ,UAAU,CAAA;AACzD,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAA;AAEvC,EAAA,MAAM,OAAwC,EAAC;AAC/C,EAAA,KAAA,MAAW,OAAO,SAAA,EAAW;AAC3B,IAAA,MAAM,EAAA,GAAK,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAA;AAC1B,IAAA,IAAI,MAAM,CAAA,EAAG;AACX,MAAA,MAAM,IAAI,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,EAAE,EAAE,IAAA,EAAK;AAChC,MAAA,MAAM,IAAI,GAAA,CAAI,KAAA,CAAM,EAAA,GAAK,CAAC,EAAE,IAAA,EAAK;AACjC,MAAA,MAAM,CAAA,GAAI,OAAO,CAAC,CAAA;AAClB,MAAA,IAAA,CAAK,CAAC,CAAA,GAAI,MAAA,CAAO,QAAA,CAAS,CAAC,KAAK,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,GAAI,CAAA,GAAI,CAAA;AAAA,IACxD,CAAA,MAAO;AAEL,MAAA,MAAM,CAAA,GAAI,OAAO,GAAG,CAAA;AACpB,MAAA,IAAI,MAAA,CAAO,SAAS,CAAC,CAAA,IAAK,QAAQ,IAAA,CAAK,GAAG,CAAA,EAAG,IAAA,CAAK,KAAA,GAAQ,CAAA;AAAA,WAAA,IACjD,IAAA,KAAS,KAAA,EAAO,IAAA,CAAK,KAAA,GAAQ,GAAA;AAAA,gBAC5B,KAAA,GAAQ,GAAA;AAAA,IACpB;AAAA,EACF;AAGA,EAAA,MAAM,SAAA,GAAY,cAAA,CAAe,YAAA,EAAc,UAAU,CAAA;AACzD,EAAA,IAAI,IAAA,KAAS,UAAA,IAAc,SAAA,CAAU,IAAA,KAAS,MAAA,EAAQ;AACpD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,SAAA,CAAU,EAAE,CAAA,GAAI,MAAA,CAAO,SAAA,CAAU,IAAI,CAAC,CAAA;AACtE,IAAA,IAAI,OAAA,GAAU,CAAA,EAAG,IAAA,CAAK,IAAA,GAAO,OAAA;AAAA,EAC/B;AACA,EAAA,IAAI,IAAA,KAAS,OAAA,IAAW,SAAA,CAAU,IAAA,KAAS,MAAA,EAAQ;AACjD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,SAAA,CAAU,EAAE,CAAA,GAAI,MAAA,CAAO,SAAA,CAAU,IAAI,CAAC,CAAA;AACtE,IAAA,IAAI,OAAA,GAAU,CAAA,EAAG,IAAA,CAAK,IAAA,GAAO,OAAA;AAAA,EAC/B;AAEA,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,IAAA,EAAM,SAAA,EAAU;AACrC;AAEA,SAAS,OAAO,CAAA,EAA4B;AAC1C,EAAA,OAAO,CAAA,CAAE,GAAA;AACX;AAIA,IAAM,WAAA,GAAmD;AAAA,EACvD,GAAA,EAAK,KAAA;AAAA,EAAO,KAAA,EAAO,OAAA;AAAA,EAAS,IAAA,EAAM,MAAA;AAAA,EAAQ,MAAA,EAAQ,QAAA;AAAA,EAClD,MAAA,EAAQ,QAAA;AAAA,EAAU,KAAA,EAAO,OAAA;AAAA,EAAS,KAAA,EAAO,OAAA;AAAA,EAAS,MAAA,EAAQ,QAAA;AAAA,EAC1D,KAAA,EAAO,OAAA;AAAA,EAAS,IAAA,EAAM,MAAA;AAAA,EAAQ,IAAA,EAAM;AACtC,CAAA;AAEA,SAAS,aAAA,CAAc,OAAe,UAAA,EAAwC;AAC5E,EAAA,IAAI,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA,EAAG;AACzB,IAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,IAAI,UAAA,CAAW,KAAA,EAAO,UAAU,CAAA,EAAE;AAAA,EAC5D;AACA,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA;AAClC,EAAA,IAAI,YAAY,CAAA,EAAG;AACjB,IAAA,MAAM,IAAI,oBAAA,CAAqB,CAAA,uDAAA,EAA0D,KAAK,KAAK,UAAU,CAAA;AAAA,EAC/G;AACA,EAAA,MAAM,SAAS,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,QAAQ,EAAE,IAAA,EAAK;AAC7C,EAAA,MAAM,MAAM,KAAA,CAAM,KAAA,CAAM,QAAA,GAAW,CAAC,EAAE,IAAA,EAAK;AAC3C,EAAA,IAAI,CAAC,MAAA,IAAU,CAAC,GAAA,EAAK,MAAM,IAAI,oBAAA,CAAqB,CAAA,wBAAA,EAA2B,KAAK,CAAA,CAAA,CAAA,EAAK,UAAU,CAAA;AACnG,EAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,MAAA,EAAQ,GAAA,EAAI;AACpC;AAEA,SAAS,SAAA,CAAU,SAAiB,UAAA,EAAoC;AAGtE,EAAA,MAAM,CAAA,GAAI,yDAAA,CAA0D,IAAA,CAAK,OAAO,CAAA;AAChF,EAAA,IAAI,CAAC,CAAA,EAAG;AACN,IAAA,MAAM,IAAI,oBAAA,CAAqB,CAAA,qBAAA,EAAwB,OAAO,sCAAsC,UAAU,CAAA;AAAA,EAChH;AACA,EAAA,MAAM,OAAA,GAAU,EAAE,CAAC,CAAA;AACnB,EAAA,MAAM,QAAA,GAAW,CAAA,CAAE,CAAC,CAAA,CAAG,WAAA,EAAY;AACnC,EAAA,MAAM,KAAA,GAAQ,EAAE,CAAC,CAAA;AACjB,EAAA,MAAM,MAAA,GAAS,EAAE,CAAC,CAAA;AAElB,EAAA,MAAM,KAAA,GAAQ,YAAY,QAAQ,CAAA;AAClC,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,MAAM,IAAI,oBAAA,CAAqB,CAAA,oBAAA,EAAuB,QAAQ,KAAK,UAAU,CAAA;AAAA,EAC/E;AACA,EAAA,MAAM,IAAA,GAAuB;AAAA,IAC3B,IAAA,EAAM,aAAA,CAAc,OAAA,EAAS,UAAU,CAAA;AAAA,IACvC,EAAA,EAAI,aAAA,CAAc,KAAA,EAAO,UAAU,CAAA;AAAA,IACnC;AAAA,GACF;AACA,EAAA,IAAI,MAAA,EAAQ,IAAA,CAAK,GAAA,GAAM,UAAA,CAAW,QAAQ,UAAU,CAAA;AACpD,EAAA,OAAO,IAAA;AACT;AAIA,IAAM,+BAAe,IAAI,GAAA,CAAoB,CAAC,MAAA,EAAQ,MAAA,EAAQ,MAAM,CAAC,CAAA;AAE9D,SAAS,gBAAgB/F,KAAAA,EAA6B;AAC3D,EAAA,MAAM,KAAA,GAAQ8F,KAAI9F,KAAI,CAAA;AACtB,EAAA,IAAI,MAAM,MAAA,KAAW,CAAA,EAAG,MAAM,IAAI,qBAAqB,aAAa,CAAA;AAGpE,EAAA,MAAM,MAAA,GAAS,MAAM,CAAC,CAAA;AACtB,EAAA,IAAI,MAAA,CAAO,KAAK,KAAA,CAAM,KAAK,EAAE,CAAC,CAAA,EAAG,WAAA,EAAY,KAAM,YAAA,EAAc;AAC/D,IAAA,MAAM,IAAI,oBAAA,CAAqB,CAAA,mCAAA,EAAsC,OAAO,IAAI,CAAA,CAAA,EAAI,OAAO,UAAU,CAAA;AAAA,EACvG;AAEA,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,IAAI,KAAA,GAAwB,MAAA;AAC5B,EAAA,IAAIC,MAAAA;AAGJ,EAAA,OAAO,CAAA,GAAI,MAAM,MAAA,EAAQ;AACvB,IAAA,MAAMF,KAAAA,GAAO,MAAM,CAAC,CAAA;AACpB,IAAA,MAAM,KAAA,GAAQA,KAAAA,CAAK,IAAA,CAAK,WAAA,EAAY;AACpC,IAAA,IAAI,KAAA,CAAM,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC9B,MAAA,MAAM,CAAA,GAAIA,MAAK,IAAA,CAAK,KAAA,CAAM,SAAS,MAAM,CAAA,CAAE,IAAA,EAAK,CAAE,WAAA,EAAY;AAC9D,MAAA,IAAI,CAAC,YAAA,CAAa,GAAA,CAAI,CAAC,CAAA,EAAG;AACxB,QAAA,MAAM,IAAI,oBAAA,CAAqB,CAAA,eAAA,EAAkB,CAAC,CAAA,0BAAA,CAAA,EAA8BA,MAAK,UAAU,CAAA;AAAA,MACjG;AACA,MAAA,KAAA,GAAQ,CAAA;AACR,MAAA,CAAA,EAAA;AACA,MAAA;AAAA,IACF;AACA,IAAA,IAAI,KAAA,CAAM,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC9B,MAAAE,MAAAA,GAAQ0B,SAAQ5B,KAAAA,CAAK,IAAA,CAAK,MAAM,QAAA,CAAS,MAAM,CAAA,CAAE,IAAA,EAAM,CAAA;AACvD,MAAA,CAAA,EAAA;AACA,MAAA;AAAA,IACF;AACA,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,QAA0B,EAAC;AACjC,EAAA,MAAM,QAA0B,EAAC;AAGjC,EAAA,IAAI,IAAA,GAAiC,IAAA;AACrC,EAAA,OAAO,CAAA,GAAI,MAAM,MAAA,EAAQ;AACvB,IAAA,MAAMA,KAAAA,GAAO,MAAM,CAAC,CAAA;AACpB,IAAA,MAAM,IAAIA,KAAAA,CAAK,IAAA;AACf,IAAA,MAAM,KAAA,GAAQ,EAAE,WAAA,EAAY;AAC5B,IAAA,IAAI,UAAU,OAAA,EAAS;AAAE,MAAA,IAAA,GAAO,OAAA;AAAS,MAAA,CAAA,EAAA;AAAK,MAAA;AAAA,IAAU;AACxD,IAAA,IAAI,UAAU,OAAA,EAAS;AAAE,MAAA,IAAA,GAAO,OAAA;AAAS,MAAA,CAAA,EAAA;AAAK,MAAA;AAAA,IAAU;AACxD,IAAA,IAAI,SAAS,OAAA,EAAS;AACpB,MAAA,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,CAAA,EAAGA,KAAAA,CAAK,UAAU,CAAC,CAAA;AAAA,IAC1C,CAAA,MAAA,IAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,CAAA,EAAGA,KAAAA,CAAK,UAAU,CAAC,CAAA;AAAA,IAC1C,CAAA,MAAO;AACL,MAAA,MAAM,IAAI,oBAAA,CAAqB,CAAA,8CAAA,EAAiD,CAAC,CAAA,CAAA,CAAA,EAAKA,MAAK,UAAU,CAAA;AAAA,IACvG;AACA,IAAA,CAAA,EAAA;AAAA,EACF;AAGA,EAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,KAAA,CAAM,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAC,CAAA;AAC9C,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,IAAA,CAAK,EAAE,CAAA,CAAE,MAAA,GAAS,CAAA,EAAG;AACpD,MAAA,MAAM,IAAI,oBAAA,CAAqB,CAAA,mBAAA,EAAsB,IAAA,CAAK,EAAE,CAAA,CAAA,CAAG,CAAA;AAAA,IACjE;AAAA,EACF;AACA,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,KAAA,MAAW,MAAM,CAAC,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,EAAE,CAAA,EAAG;AACrC,MAAA,IAAI,EAAA,CAAG,SAAS,KAAA,IAAS,CAAC,QAAQ,GAAA,CAAI,EAAA,CAAG,MAAM,CAAA,EAAG;AAChD,QAAA,MAAM,IAAI,oBAAA,CAAqB,CAAA,8BAAA,EAAiC,EAAA,CAAG,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,MAC9E;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,UAAU,MAAA,EAAQ;AACpB,IAAA,MAAM,UAAA,GAAa,CAAC,CAAA,KAAuB;AACzC,MAAA,IAAI,CAAA,CAAE,SAAS,MAAA,EAAQ;AACrB,QAAA,MAAM,IAAI,oBAAA,CAAqB,CAAA,kCAAA,EAAqC,SAAA,CAAU,CAAC,CAAC,CAAA,YAAA,CAAc,CAAA;AAAA,MAChG;AAAA,IACF,CAAA;AACA,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,IAAI,KAAK,SAAA,CAAU,IAAA,KAAS,SAAS,UAAA,CAAW,IAAA,CAAK,UAAU,EAAE,CAAA;AACjE,MAAA,IAAI,IAAA,CAAK,SAAA,CAAU,IAAA,KAAS,MAAA,EAAQ;AAAE,QAAA,UAAA,CAAW,IAAA,CAAK,UAAU,IAAI,CAAA;AAAG,QAAA,UAAA,CAAW,IAAA,CAAK,UAAU,EAAE,CAAA;AAAA,MAAG;AAAA,IACxG;AACA,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,KAAA,MAAW,MAAM,CAAC,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,EAAE,CAAA,EAAG;AACrC,QAAA,IAAI,EAAA,CAAG,IAAA,KAAS,OAAA,EAAS,UAAA,CAAW,GAAG,EAAE,CAAA;AAAA,MAC3C;AACA,MAAA,IAAI,IAAA,CAAK,GAAA,EAAK,UAAA,CAAW,IAAA,CAAK,GAAG,CAAA;AAAA,IACnC;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,IAAA,EAAM,YAAA,EAAc,OAAO,KAAA,EAAAE,MAAAA,EAAO,OAAO,KAAA,EAAM;AAC1D;AAEA,SAAS,UAAU,CAAA,EAA4B;AAC7C,EAAA,IAAI,CAAA,CAAE,SAAS,MAAA,EAAQ,OAAO,IAAI,CAAA,CAAE,IAAI,CAAA,EAAG,CAAA,CAAE,GAAG,CAAA,CAAA;AAChD,EAAA,OAAO,CAAA,CAAA,EAAI,CAAA,CAAE,GAAG,CAAA,EAAG,EAAE,GAAG,CAAA,CAAA;AAC1B;;;AC9VA,IAAM,KAAA,GAAQ,EAAA;AAId,SAAS,SAAA,CAAU,CAAA,EAAW,CAAA,EAAW,CAAA,EAAW,GAAW,KAAA,EAAgD;AAC7G,EAAA,OAAOc,oBAAA,CAAG,MAAA,EAAQ,EAAE,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,GAAG,KAAA,EAAO,CAAA;AAC3D;AAEA,SAAS,SAAA,CAAU,EAAA,EAAY,EAAA,EAAY,CAAA,EAAW,KAAA,EAAgD;AACpG,EAAA,OAAOA,oBAAA,CAAG,UAAU,EAAE,EAAA,EAAI,IAAI,CAAA,EAAG,GAAG,OAAO,CAAA;AAC7C;AAEA,SAAS,SAAA,CAAU,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,IAAY,KAAA,EAAgD;AACjH,EAAA,OAAOA,oBAAA,CAAG,QAAQ,EAAE,EAAA,EAAI,IAAI,EAAA,EAAI,EAAA,EAAI,GAAG,KAAA,EAAO,CAAA;AAChD;AAEA,SAAS,SAAA,CAAU,GAAW,KAAA,EAAgD;AAC5E,EAAA,OAAOA,qBAAG,MAAA,EAAQ,EAAE,CAAA,EAAG,GAAG,OAAO,CAAA;AACnC;AAEA,SAAS,SAAA,CAAU,CAAA,EAAW,CAAA,EAAW,OAAA,EAAiB,KAAA,EAAgD;AACxG,EAAA,OAAOA,oBAAA,CAAG,MAAA,EAAQ,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,KAAA,EAAM,EAAGE,2BAAA,CAAU,OAAO,CAAC,CAAA;AAC1D;AAIA,IAAM,WAAA,GAAsC;AAAA,EAC1C,GAAA,EAAK,SAAA;AAAA,EAAW,GAAA,EAAK,SAAA;AAAA,EAAW,GAAA,EAAK,SAAA;AAAA,EAAW,GAAA,EAAK,SAAA;AAAA,EACrD,GAAA,EAAK,SAAA;AAAA,EAAW,GAAA,EAAK,SAAA;AAAA,EAAW,GAAA,EAAK,SAAA;AAAA,EAAW,GAAA,EAAK,SAAA;AAAA,EACrD,GAAA,EAAK,SAAA;AAAA,EAAW,GAAA,EAAK;AACvB,CAAA;AAEA,SAAS,cAAc,KAAA,EAA8C;AACnE,EAAA,IAAI,UAAU,MAAA,EAAW,OAAO,CAAC,SAAA,EAAW,SAAA,EAAW,WAAW,SAAS,CAAA;AAC3E,EAAA,MAAM,IAAI,MAAA,CAAO,KAAK,CAAA,CAAE,OAAA,CAAQ,kBAAkB,EAAE,CAAA;AAEpD,EAAA,MAAM,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,uBAAuB,CAAA;AACzC,EAAA,IAAI,CAAC,CAAA,EAAG,OAAO,CAAC,SAAA,EAAW,SAAA,EAAW,WAAW,SAAS,CAAA;AAC1D,EAAA,MAAM,GAAA,GAAM,UAAA,CAAW,CAAA,CAAE,CAAC,CAAE,CAAA;AAC5B,EAAA,MAAM,OAAO,CAAA,CAAE,CAAC,MAAM,GAAA,IAAO,CAAA,CAAE,CAAC,CAAA,KAAM,GAAA,GAAM,GAAA,GAAO,CAAA,CAAE,CAAC,CAAA,KAAM,GAAA,IAAO,EAAE,CAAC,CAAA,KAAM,MAAM,GAAA,GAAM,CAAA;AACxF,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,IAAI,CAAA;AAClC,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,IAAK,IAAA,IAAQ,CAAA,EAAG,OAAO,CAAC,SAAA,EAAW,SAAA,EAAW,SAAA,EAAW,SAAS,CAAA;AAC3F,EAAA,MAAM,GAAA,GAAM,OAAO,IAAI,CAAA;AACvB,EAAA,IAAI,IAAI,MAAA,IAAU,CAAA,EAAG,OAAO,CAAC,YAAY,GAAG,CAAA,EAAI,WAAA,CAAY,GAAA,CAAI,CAAC,CAAE,CAAA,EAAI,WAAA,CAAY,GAAG,GAAI,SAAS,CAAA;AACnG,EAAA,MAAM,EAAA,GAAK,IAAI,CAAC,CAAA;AAChB,EAAA,MAAM,EAAA,GAAK,IAAI,CAAC,CAAA;AAChB,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA;AACjC,EAAA,OAAO;AAAA,IACL,WAAA,CAAY,EAAE,CAAA,IAAK,SAAA;AAAA,IACnB,WAAA,CAAY,EAAE,CAAA,IAAK,SAAA;AAAA,IACnB,WAAA,CAAY,GAAG,CAAA,IAAK,SAAA;AAAA,IACpB;AAAA;AAAA,GACF;AACF;AAIA,IAAM,QAAA,GAAqB;AAAA,EACzB,IAAA,EAAM,UAAA;AAAA,EACN,QAAA,EAAU,MAAA;AAAA,EACV,OAAO,CAAA,GAAI,KAAA;AAAA,EACX,MAAA,EAAQ,KAAA;AAAA,EACR,IAAA,EAAM;AAAA,IACJ,EAAE,IAAA,EAAM,GAAA,EAAK,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,IACxB,EAAE,IAAA,EAAM,GAAA,EAAK,GAAG,CAAA,GAAI,KAAA,EAAO,GAAG,CAAA;AAAE,GAClC;AAAA,EACA,IAAA,EAAM,CAAC,IAAA,EAAM,CAAA,EAAG,CAAA,KAAM;AACpB,IAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA;AAC3C,IAAA,MAAM,KAAK,CAAA,GAAI,CAAA;AACf,IAAA,MAAM,QAAQ,CAAA,GAAI,IAAA;AAClB,IAAA,MAAM,KAAA,GAAA,CAAS,IAAI,KAAA,IAAS,CAAA;AAC5B,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,CAAA,IAAA,EAAO,EAAE,CAAA,GAAA,EAAM,KAAK,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,EAAE,KAAA,EAAO,YAAA,EAAc,CAAA;AAC7E,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,CAAA,EAAA,EAAK,KAAA,GAAQ,KAAK,CAAA,CAAA,EAAI,EAAE,CAAA,GAAA,EAAM,CAAC,IAAI,EAAE,CAAA,CAAA,EAAI,EAAE,KAAA,EAAO,cAAc,CAAA;AACxF,IAAA,MAAM,IAAA,GAAO,SAAA,CAAU,KAAA,EAAO,EAAA,GAAK,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,EAAE,KAAA,EAAO,gBAAA,EAAkB,EAAA,EAAI,CAAA,EAAG,CAAA;AAClF,IAAA,MAAM,KAAA,GAAQ,CAAA;AACd,IAAA,MAAM,SAAA,GAAY,QAAQ,KAAA,GAAQ,IAAA;AAClC,IAAA,MAAM,OAAA,GAAW,QAAQ,IAAA,GAAQ,IAAA,CAAK,IAAI,CAAA,EAAG,KAAA,CAAM,SAAS,CAAC,CAAA;AAC7D,IAAA,MAAM,UAAU,KAAA,CAAM,GAAA;AAAA,MAAI,CAAC,KAAA,EAAO,CAAA,KAChC,SAAA,CAAU,SAAA,GAAY,IAAI,OAAA,GAAU,KAAA,GAAQ,CAAA,EAAG,EAAA,GAAK,GAAG,KAAA,EAAO,CAAA,EAAG,EAAE,IAAA,EAAM,OAAO;AAAA,KAClF,CAAE,KAAK,EAAE,CAAA;AACT,IAAA,OAAO,KAAA,GAAQ,QAAQ,IAAA,GAAO,OAAA;AAAA,EAChC;AACF,CAAA;AAEA,IAAM,GAAA,GAAgB;AAAA,EACpB,IAAA,EAAM,KAAA;AAAA,EACN,QAAA,EAAU,MAAA;AAAA,EACV,KAAA,EAAO,KAAA;AAAA,EACP,MAAA,EAAQ,KAAA;AAAA,EACR,IAAA,EAAM;AAAA,IACJ,EAAE,IAAA,EAAM,OAAA,EAAS,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,IAC5B,EAAE,IAAA,EAAM,SAAA,EAAW,CAAA,EAAG,KAAA,EAAO,GAAG,CAAA;AAAE,GACpC;AAAA,EACA,IAAA,EAAM,CAAC,IAAA,EAAM,CAAA,EAAG,CAAA,KAAM;AACpB,IAAA,MAAM,QAAQ,MAAA,CAAO,IAAA,CAAK,KAAK,KAAA,IAAS,KAAK,EAAE,WAAA,EAAY;AAC3D,IAAA,MAAM,IAAA,GAAQ;AAAA,MACZ,GAAA,EAAK,SAAA;AAAA,MAAW,KAAA,EAAO,SAAA;AAAA,MAAW,IAAA,EAAM,SAAA;AAAA,MACxC,MAAA,EAAQ,SAAA;AAAA,MAAW,KAAA,EAAO,SAAA;AAAA,MAAW,MAAA,EAAQ;AAAA,KAC/C,CAA6B,KAAK,CAAA,IAAK,SAAA;AACvC,IAAA,MAAM,KAAK,CAAA,GAAI,CAAA;AACf,IAAA,MAAM,EAAA,GAAK,IAAI,CAAA,GAAI,CAAA;AACnB,IAAA,OAAO;AAAA;AAAA,MAEL,SAAA,CAAU,CAAA,IAAA,EAAO,CAAA,GAAI,CAAC,MAAM,EAAA,GAAK,CAAC,CAAA,CAAA,EAAI,EAAA,GAAK,CAAC,CAAA,CAAA,EAAI,EAAE,KAAA,EAAO,cAAc,CAAA;AAAA,MACvE,UAAU,CAAA,EAAA,EAAK,CAAC,CAAA,CAAA,EAAI,CAAA,GAAI,CAAC,CAAA,GAAA,EAAM,EAAA,GAAK,CAAC,CAAA,CAAA,EAAI,KAAK,CAAC,CAAA,CAAA,EAAI,EAAE,KAAA,EAAO,cAAc,CAAA;AAAA,MAC1E,SAAA,CAAU,EAAA,EAAI,EAAA,EAAI,CAAA,EAAG,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAA,EAAW,cAAA,EAAgB,CAAA,EAAG,OAAA,EAAS,IAAA,EAAM,CAAA;AAAA;AAAA,MAElF,SAAA,CAAU,EAAA,GAAK,GAAA,EAAK,EAAA,GAAK,GAAA,EAAK,GAAA,EAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,GAAA,EAAK,CAAA;AAAA;AAAA,MAEjE,SAAA,CAAU,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,GAAG,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,CAAA,EAAG,EAAE,MAAA,EAAQ,SAAA,EAAW,cAAA,EAAgB,KAAK;AAAA,KACtF,CAAE,KAAK,EAAE,CAAA;AAAA,EACX;AACF,CAAA;AAEA,IAAM,QAAA,GAAqB;AAAA,EACzB,IAAA,EAAM,UAAA;AAAA,EACN,QAAA,EAAU,MAAA;AAAA,EACV,KAAA,EAAO,KAAA;AAAA,EACP,MAAA,EAAQ,KAAA;AAAA,EACR,IAAA,EAAM;AAAA,IACJ,EAAE,IAAA,EAAM,GAAA,EAAK,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,IACxB,EAAE,IAAA,EAAM,GAAA,EAAK,CAAA,EAAG,KAAA,EAAO,GAAG,CAAA;AAAE,GAC9B;AAAA,EACA,IAAA,EAAM,CAAC,KAAA,EAAO,CAAA,EAAG,CAAA,KAAM;AACrB,IAAA,MAAM,KAAK,CAAA,GAAI,CAAA;AACf,IAAA,MAAM,EAAA,GAAK,IAAI,CAAA,GAAI,CAAA;AACnB,IAAA,OAAO;AAAA,MACL,SAAA,CAAU,CAAA,IAAA,EAAO,CAAA,GAAI,CAAC,MAAM,EAAA,GAAK,CAAC,CAAA,CAAA,EAAI,EAAA,GAAK,CAAC,CAAA,CAAA,EAAI,EAAE,KAAA,EAAO,cAAc,CAAA;AAAA,MACvE,UAAU,CAAA,EAAA,EAAK,CAAC,CAAA,CAAA,EAAI,CAAA,GAAI,CAAC,CAAA,GAAA,EAAM,EAAA,GAAK,CAAC,CAAA,CAAA,EAAI,KAAK,CAAC,CAAA,CAAA,EAAI,EAAE,KAAA,EAAO,cAAc,CAAA;AAAA,MAC1E,UAAU,EAAA,EAAI,EAAA,EAAI,GAAG,EAAE,KAAA,EAAO,iBAAiB,CAAA;AAAA;AAAA,MAE/C,UAAU,CAAA,EAAA,EAAK,EAAA,GAAK,CAAC,CAAA,CAAA,EAAI,EAAA,GAAK,CAAC,CAAA,aAAA,EAAgB,EAAA,GAAK,CAAC,CAAA,CAAA,EAAI,EAAA,GAAK,CAAC,CAAA,CAAA,EAAI,EAAE,MAAM,SAAA,EAAW,OAAA,EAAS,KAAK,CAAA;AAAA,MACpG,UAAU,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,CAAA,EAAG,UAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,WAAA,EAAa,GAAG,aAAA,EAAe,GAAA,EAAK,eAAe,QAAA,EAAU,mBAAA,EAAqB,UAAU;AAAA,KAC7I,CAAE,KAAK,EAAE,CAAA;AAAA,EACX;AACF,CAAA;AAEA,IAAM,WAAA,GAAwB;AAAA,EAC5B,IAAA,EAAM,aAAA;AAAA,EACN,QAAA,EAAU,MAAA;AAAA,EACV,KAAA,EAAO,KAAA;AAAA,EACP,MAAA,EAAQ,KAAA;AAAA,EACR,IAAA,EAAM;AAAA,IACJ,EAAE,IAAA,EAAM,GAAA,EAAK,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,IACxB,EAAE,IAAA,EAAM,GAAA,EAAK,CAAA,EAAG,KAAA,EAAO,GAAG,CAAA;AAAE,GAC9B;AAAA,EACA,IAAA,EAAM,CAAC,KAAA,EAAO,CAAA,EAAG,CAAA,KAAM;AACrB,IAAA,MAAM,KAAK,CAAA,GAAI,CAAA;AACf,IAAA,MAAM,EAAA,GAAK,IAAI,CAAA,GAAI,CAAA;AACnB,IAAA,OAAO;AAAA,MACL,SAAA,CAAU,CAAA,IAAA,EAAO,CAAA,GAAI,CAAC,MAAM,EAAA,GAAK,CAAC,CAAA,CAAA,EAAI,EAAA,GAAK,CAAC,CAAA,CAAA,EAAI,EAAE,KAAA,EAAO,cAAc,CAAA;AAAA,MACvE,UAAU,CAAA,EAAA,EAAK,CAAC,CAAA,CAAA,EAAI,CAAA,GAAI,CAAC,CAAA,GAAA,EAAM,EAAA,GAAK,CAAC,CAAA,CAAA,EAAI,KAAK,CAAC,CAAA,CAAA,EAAI,EAAE,KAAA,EAAO,cAAc,CAAA;AAAA,MAC1E,SAAA,CAAU,EAAA,EAAI,EAAA,EAAI,CAAA,EAAG,EAAE,IAAA,EAAM,SAAA,EAAW,MAAA,EAAQ,SAAA,EAAW,cAAA,EAAgB,GAAA,EAAK;AAAA,KAClF,CAAE,KAAK,EAAE,CAAA;AAAA,EACX;AACF,CAAA;AAEA,IAAM,KAAA,GAAkB;AAAA,EACtB,IAAA,EAAM,OAAA;AAAA,EACN,QAAA,EAAU,MAAA;AAAA,EACV,OAAO,CAAA,GAAI,KAAA;AAAA,EACX,MAAA,EAAQ,KAAA;AAAA,EACR,IAAA,EAAM;AAAA,IACJ,EAAE,IAAA,EAAM,OAAA,EAAS,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,IAC5B,EAAE,IAAA,EAAM,SAAA,EAAW,GAAG,CAAA,GAAI,KAAA,EAAO,GAAG,CAAA;AAAE,GACxC;AAAA,EACA,IAAA,EAAM,CAAC,KAAA,EAAO,CAAA,EAAG,CAAA,KAAM;AACrB,IAAA,MAAM,KAAK,CAAA,GAAI,CAAA;AACf,IAAA,MAAM,QAAQ,CAAA,GAAI,IAAA;AAClB,IAAA,MAAM,KAAA,GAAA,CAAS,IAAI,KAAA,IAAS,CAAA;AAC5B,IAAA,OAAO;AAAA,MACL,SAAA,CAAU,CAAA,IAAA,EAAO,EAAE,CAAA,GAAA,EAAM,KAAK,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,EAAE,KAAA,EAAO,YAAA,EAAc,CAAA;AAAA,MAC/D,SAAA,CAAU,CAAA,EAAA,EAAK,KAAA,GAAQ,KAAK,IAAI,EAAE,CAAA,GAAA,EAAM,CAAC,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,EAAE,KAAA,EAAO,cAAc,CAAA;AAAA,MAC1E,SAAA,CAAU,KAAA,EAAO,EAAA,GAAK,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,EAAE,IAAA,EAAM,SAAA,EAAW,EAAA,EAAI,CAAA,EAAG,CAAA;AAAA,MAC7D,SAAA,CAAU,KAAA,GAAQ,KAAA,GAAQ,IAAA,EAAM,EAAA,GAAK,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,EAAE,IAAA,EAAM,SAAA,EAAW;AAAA,KACnE,CAAE,KAAK,EAAE,CAAA;AAAA,EACX;AACF,CAAA;AAEA,IAAM,MAAA,GAAmB;AAAA,EACvB,IAAA,EAAM,QAAA;AAAA,EACN,QAAA,EAAU,MAAA;AAAA,EACV,OAAO,CAAA,GAAI,KAAA;AAAA,EACX,QAAQ,CAAA,GAAI,KAAA;AAAA,EACZ,IAAA,EAAM;AAAA;AAAA,IAEJ,EAAE,IAAA,EAAM,GAAA,EAAK,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,IACxB,EAAE,IAAA,EAAM,GAAA,EAAK,GAAG,CAAA,GAAI,KAAA,EAAO,GAAG,CAAA,EAAE;AAAA,IAChC,EAAE,IAAA,EAAM,GAAA,EAAK,GAAG,CAAA,EAAG,CAAA,EAAG,IAAI,KAAA,EAAM;AAAA,IAChC,EAAE,MAAM,GAAA,EAAK,CAAA,EAAG,IAAI,KAAA,EAAO,CAAA,EAAG,IAAI,KAAA;AAAM,GAC1C;AAAA,EACA,eAAA,EAAiB,IAAA;AAAA,EACjB,IAAA,EAAM,CAAC,KAAA,EAAO,CAAA,EAAG,CAAA,KAAM;AACrB,IAAA,MAAM,EAAA,GAAK,IAAI,CAAA,GAAI,CAAA;AACnB,IAAA,MAAM,EAAA,GAAK,IAAI,CAAA,GAAI,CAAA;AACnB,IAAA,OAAO;AAAA,MACL,SAAA,CAAU,IAAI,EAAA,EAAI,EAAA,EAAI,IAAI,EAAE,KAAA,EAAO,gBAAgB,CAAA;AAAA,MACnD,SAAA,CAAU,IAAI,CAAA,EAAG,CAAA,GAAI,GAAG,CAAA,EAAG,EAAE,IAAA,EAAM,SAAA,EAAW;AAAA,KAChD,CAAE,KAAK,EAAE,CAAA;AAAA,EACX;AACF,CAAA;AAEA,SAAS,OAAA,GAAoB;AAC3B,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,KAAA;AAAA,IACN,QAAA,EAAU,MAAA;AAAA;AAAA,IAEV,OAAO,CAAA,GAAI,KAAA;AAAA,IACX,QAAQ,CAAA,GAAI,KAAA;AAAA,IACZ,MAAM,EAAC;AAAA,IACP,eAAA,EAAiB,IAAA;AAAA,IACjB,IAAA,EAAM,CAAC,IAAA,EAAM,CAAA,EAAG,CAAA,KAAM;AACpB,MAAA,MAAM,IAAA,GAAO,KAAK,GAAA,CAAI,CAAA,EAAG,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,IAAQ,CAAC,CAAC,CAAA;AACpD,MAAA,MAAM,UAAU,IAAA,GAAO,CAAA;AACvB,MAAA,MAAM,aAAa,KAAA,GAAQ,CAAA;AAC3B,MAAA,OAAO;AAAA,QACL,SAAA,CAAU,UAAA,EAAY,CAAA,EAAG,CAAA,GAAI,CAAA,GAAI,UAAA,EAAY,CAAA,GAAI,CAAA,EAAG,EAAE,KAAA,EAAO,gBAAA,EAAkB,EAAA,EAAI,GAAG,CAAA;AAAA;AAAA,QAEtF,SAAA,CAAU,UAAA,GAAa,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAG,EAAE,IAAA,EAAM,SAAA,EAAW,MAAA,EAAQ,SAAA,EAAW,cAAA,EAAgB,KAAK,CAAA;AAAA;AAAA,QAE/F,SAAA,CAAU,UAAA,GAAa,KAAA,GAAQ,GAAA,EAAK,CAAA,GAAI,CAAA,IAAK,CAAA,GAAI,CAAA,GAAI,CAAA,CAAA,EAAI,GAAA,EAAK,EAAE,IAAA,EAAM,WAAW,CAAA;AAAA,QACjF,UAAU,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,GAAI,GAAG,CAAA,EAAA,EAAK,OAAA,GAAU,CAAC,CAAA,CAAA,EAAI,EAAE,KAAA,EAAO,gBAAA,EAAkB,eAAe,QAAA,EAAU,mBAAA,EAAqB,UAAU;AAAA,OACrI,CAAE,KAAK,EAAE,CAAA;AAAA,IACX;AAAA,GACF;AACF;AAEA,IAAM,MAAA,GAAmB;AAAA,EACvB,IAAA,EAAM,QAAA;AAAA,EACN,QAAA,EAAU,MAAA;AAAA,EACV,OAAO,CAAA,GAAI,KAAA;AAAA,EACX,MAAA,EAAQ,KAAA;AAAA,EACR,MAAM,EAAC;AAAA,EACP,IAAA,EAAM,CAAC,IAAA,EAAM,EAAA,EAAI,CAAA,KAAM;AACrB,IAAA,MAAM,IAAA,GAAO,KAAK,GAAA,CAAI,CAAA,EAAG,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,IAAQ,CAAC,CAAC,CAAA;AACpD,IAAA,MAAM,OAAiB,EAAC;AACxB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,MAAA,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,CAAA,GAAI,KAAA,EAAO,IAAI,CAAA,EAAG,CAAA,EAAG,EAAE,IAAA,EAAM,WAAW,MAAA,EAAQ,SAAA,EAAW,cAAA,EAAgB,GAAA,EAAK,CAAC,CAAA;AAAA,IACvG;AACA,IAAA,OAAO,UAAU,EAAA,EAAI,CAAA,GAAI,IAAI,CAAA,EAAG,IAAA,GAAO,QAAQ,CAAA,EAAG,CAAA,EAAG,EAAE,IAAA,EAAM,WAAW,EAAA,EAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,KAAK,EAAE,CAAA;AAAA,EACjG;AACF,CAAA;AAMA,SAAS,OAAA,CACP,IAAA,EACA,QAAA,EACA,KAAA,EACA,OACA,QAAA,EACU;AACV,EAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAQ,GAAI,QAAA;AACnC,EAAA,MAAM,IAAA,GAAkB,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM;AACvC,IAAA,MAAM,MAAA,GAAS,EAAA;AACf,IAAA,IAAI,CAAA,CAAE,IAAA,KAAS,MAAA,EAAQ,OAAO,EAAE,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,EAAA,GAAK,CAAA,CAAE,MAAM,MAAA,EAAO;AAC3E,IAAA,IAAI,CAAA,CAAE,IAAA,KAAS,OAAA,EAAS,OAAO,EAAE,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,CAAA,EAAG,QAAQ,CAAA,EAAG,CAAA,EAAG,EAAA,GAAK,CAAA,CAAE,MAAM,MAAA,EAAO;AACpF,IAAA,IAAI,CAAA,CAAE,IAAA,KAAS,KAAA,EAAO,OAAO,EAAE,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,CAAA,EAAG,EAAA,GAAK,CAAA,CAAE,GAAA,GAAM,MAAA,EAAQ,GAAG,CAAA,EAAE;AAC1E,IAAA,OAAO,EAAE,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,CAAA,EAAG,EAAA,GAAK,CAAA,CAAE,GAAA,GAAM,MAAA,EAAQ,CAAA,EAAG,MAAA,GAAS,CAAA,EAAE;AAAA,EAC/D,CAAC,CAAA;AACD,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,QAAA,EAAU,MAAA;AAAA,IACV,KAAA;AAAA,IACA,MAAA;AAAA,IACA,IAAA;AAAA,IACA,MAAM,MAAM;AACV,MAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,OAAO,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,QAAQ,SAAA,EAAW,cAAA,EAAgB,CAAA,EAAG,EAAA,EAAI,SAAS,CAAA;AAClH,MAAA,MAAM,SAAS,IAAA,CAAK,GAAA;AAAA,QAAI,CAAC,CAAA,KACvB,SAAA,CAAU,CAAA,CAAE,GAAG,CAAA,CAAE,CAAA,EAAG,GAAA,EAAK,EAAE,MAAM,SAAA,EAAW,MAAA,EAAQ,SAAA,EAAW,cAAA,EAAgB,KAAK;AAAA,OACtF,CAAE,KAAK,EAAE,CAAA;AAET,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,GAAA,CAAI,CAAC,GAAG,CAAA,KAAM;AACnC,QAAA,MAAM,CAAA,GAAI,KAAK,CAAC,CAAA;AAChB,QAAA,MAAM,EAAA,GAAK,EAAE,IAAA,KAAS,MAAA,GAAS,IAAI,CAAA,CAAE,IAAA,KAAS,UAAU,EAAA,GAAK,CAAA;AAC7D,QAAA,MAAM,EAAA,GAAK,EAAE,IAAA,KAAS,KAAA,GAAQ,IAAI,CAAA,CAAE,IAAA,KAAS,WAAW,EAAA,GAAK,CAAA;AAC7D,QAAA,MAAM,MAAA,GAAS,EAAE,IAAA,KAAS,MAAA,GAAS,UAAU,CAAA,CAAE,IAAA,KAAS,UAAU,KAAA,GAAQ,QAAA;AAC1E,QAAA,OAAO,SAAA,CAAU,EAAE,CAAA,GAAI,EAAA,EAAI,EAAE,CAAA,GAAI,EAAA,GAAK,CAAA,EAAG,CAAA,CAAE,IAAA,EAAM;AAAA,UAC/C,KAAA,EAAO,iBAAA;AAAA,UACP,aAAA,EAAe;AAAA,SAChB,CAAA;AAAA,MACH,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AACV,MAAA,MAAM,UAAU,SAAA,CAAU,KAAA,GAAQ,CAAA,EAAG,MAAA,GAAS,GAAG,KAAA,EAAO;AAAA,QACtD,KAAA,EAAO,mBAAA;AAAA,QACP,aAAA,EAAe;AAAA,OAChB,CAAA;AACD,MAAA,OAAO,KAAA,GAAQ,SAAS,QAAA,GAAW,OAAA;AAAA,IACrC;AAAA,GACF;AACF;AAGA,IAAM,SAAA,GAA0B;AAAA;AAAA,EAE9B,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,OAAA,EAAS,KAAK,CAAA,EAAE;AAAA,EACrC,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,OAAA,EAAS,KAAK,CAAA,EAAE;AAAA,EACrC,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,OAAA,EAAS,KAAK,CAAA,EAAE;AAAA,EACrC,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,OAAA,EAAS,KAAK,CAAA,EAAE;AAAA,EACrC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,OAAA,EAAS,KAAK,CAAA,EAAE;AAAA,EACpC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,OAAA,EAAS,KAAK,CAAA,EAAE;AAAA,EACpC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,OAAA,EAAS,KAAK,CAAA,EAAE;AAAA,EACpC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,OAAA,EAAS,KAAK,CAAA,EAAE;AAAA,EACpC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,OAAA,EAAS,KAAK,CAAA,EAAE;AAAA,EACpC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,OAAA,EAAS,KAAK,CAAA,EAAE;AAAA,EACpC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,OAAA,EAAS,KAAK,EAAA,EAAG;AAAA,EACrC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,OAAA,EAAS,KAAK,EAAA,EAAG;AAAA,EACrC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,OAAA,EAAS,KAAK,EAAA,EAAG;AAAA,EACrC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,OAAA,EAAS,KAAK,EAAA,EAAG;AAAA;AAAA,EAErC,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,KAAK,CAAA,EAAE;AAAA,EACpC,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,KAAK,CAAA,EAAE;AAAA,EACpC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,MAAA,EAAQ,KAAK,CAAA,EAAE;AAAA,EACnC,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,KAAK,CAAA,EAAE;AAAA,EACpC,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,KAAK,CAAA,EAAE;AAAA,EACpC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,MAAA,EAAQ,KAAK,CAAA,EAAE;AAAA,EACnC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,MAAA,EAAQ,KAAK,CAAA,EAAE;AAAA,EACnC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,MAAA,EAAQ,KAAK,CAAA,EAAE;AAAA,EACnC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,MAAA,EAAQ,KAAK,CAAA,EAAE;AAAA,EACnC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,MAAA,EAAQ,KAAK,EAAA,EAAG;AAAA,EACpC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,MAAA,EAAQ,KAAK,EAAA;AACnC,CAAA;AAEA,IAAM,WAAA,GAA4B;AAAA,EAChC,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,KAAK,CAAA,EAAE;AAAA,EACpC,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,KAAK,CAAA,EAAE;AAAA,EACpC,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,MAAA,EAAQ,KAAK,CAAA,EAAE;AAAA,EACvC,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,MAAA,EAAQ,KAAK,CAAA,EAAE;AAAA,EACtC,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,MAAA,EAAQ,KAAK,CAAA,EAAE;AAAA,EACtC,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,MAAA,EAAQ,KAAK,CAAA,EAAE;AAAA,EACtC,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,MAAA,EAAQ,KAAK,CAAA,EAAE;AAAA,EACvC,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,MAAA,EAAQ,KAAK,CAAA,EAAE;AAAA,EACvC,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,MAAA,EAAQ,KAAK,CAAA,EAAE;AAAA,EACvC,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,MAAA,EAAQ,KAAK,CAAA,EAAE;AAAA,EACvC,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,OAAA,EAAS,KAAK,CAAA,EAAE;AAAA,EACrC,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,OAAA,EAAS,KAAK,CAAA,EAAE;AAAA,EACrC,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,OAAA,EAAS,KAAK,CAAA,EAAE;AAAA,EACxC,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,OAAA,EAAS,KAAK,CAAA,EAAE;AAAA,EACxC,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,OAAA,EAAS,KAAK,CAAA,EAAE;AAAA,EACxC,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,OAAA,EAAS,KAAK,CAAA,EAAE;AAAA,EACxC,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,OAAA,EAAS,KAAK,CAAA,EAAE;AAAA,EACxC,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,OAAA,EAAS,KAAK,CAAA,EAAE;AAAA,EACxC,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,OAAA,EAAS,KAAK,CAAA,EAAE;AAAA,EACxC,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,OAAA,EAAS,KAAK,CAAA;AACxC,CAAA;AAIA,SAAS,WACP,IAAA,EACA,KAAA,EACA,MAAA,EACA,QAAA,EACA,UACA,KAAA,EACU;AACV,EAAA,MAAM,MAAA,GAAA,CAAU,QAAQ,EAAA,IAAM,IAAA,CAAK,IAAI,CAAA,EAAG,QAAA,CAAS,SAAS,CAAC,CAAA;AAC7D,EAAA,MAAM,IAAA,GAAkB,QAAA,CAAS,GAAA,CAAI,CAAC,MAAM,CAAA,MAAO;AAAA,IACjD,IAAA;AAAA,IACA,CAAA,EAAG,IAAI,CAAA,GAAI,MAAA;AAAA,IACX,GAAG,MAAA,GAAS;AAAA,GACd,CAAE,CAAA;AACF,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,QAAA,EAAU,QAAA;AAAA,IACV,KAAA;AAAA,IACA,MAAA;AAAA,IACA,IAAA;AAAA,IACA,MAAM,MAAM;AACV,MAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,OAAO,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,QAAQ,SAAA,EAAW,cAAA,EAAgB,CAAA,EAAG,EAAA,EAAI,GAAG,CAAA;AAC5G,MAAA,MAAM,WAAA,GAAc,SAAA,CAAU,CAAA,EAAG,MAAA,GAAS,CAAA,EAAG,KAAA,GAAQ,CAAA,EAAG,CAAA,EAAG,EAAE,IAAA,EAAM,SAAA,EAAW,EAAA,EAAI,GAAG,CAAA;AACrF,MAAA,MAAM,UAAU,IAAA,CAAK,GAAA;AAAA,QAAI,CAAC,CAAA,KACxB,SAAA,CAAU,CAAA,CAAE,GAAG,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,EAAE,MAAM,SAAA,EAAW,MAAA,EAAQ,SAAA,EAAW,cAAA,EAAgB,KAAK;AAAA,OACpF,CAAE,KAAK,EAAE,CAAA;AACT,MAAA,MAAM,SAAA,GAAY,QAAA,CAAS,GAAA,CAAI,CAAC,MAAM,CAAA,KAAM;AAC1C,QAAA,MAAM,CAAA,GAAI,KAAK,CAAC,CAAA;AAChB,QAAA,OAAO,SAAA,CAAU,CAAA,CAAE,CAAA,EAAG,MAAA,GAAS,IAAI,IAAA,EAAM;AAAA,UACvC,KAAA,EAAO,wBAAA;AAAA,UACP,aAAA,EAAe;AAAA,SAChB,CAAA;AAAA,MACH,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AACV,MAAA,MAAM,OAAA,GAAU,SAAA,CAAU,KAAA,GAAQ,CAAA,EAAG,IAAI,KAAA,EAAO;AAAA,QAC9C,KAAA,EAAO,0BAAA;AAAA,QACP,aAAA,EAAe;AAAA,OAChB,CAAA;AACD,MAAA,OAAO,KAAA,GAAQ,WAAA,GAAc,OAAA,GAAU,SAAA,GAAY,OAAA;AAAA,IACrD;AAAA,GACF;AACF;AAIO,IAAM,YAAA,GAAqD;AAAA,EAChE,QAAA,EAAU,QAAA;AAAA,EACV,GAAA,EAAK,GAAA;AAAA,EACL,UAAA,EAAY,QAAA;AAAA,EACZ,aAAA,EAAe,WAAA;AAAA,EACf,KAAA,EAAO,KAAA;AAAA,EACP,MAAA,EAAQ,MAAA;AAAA,EACR,KAAK,OAAA,EAAQ;AAAA,EACb,MAAA,EAAQ,MAAA;AAAA,EACR,SAAA,EAAW,OAAA,CAAQ,SAAA,EAAW,SAAA,EAAW,aAAA,EAAe,SAAA,EAAW,EAAE,KAAA,EAAO,GAAA,EAAK,MAAA,EAAQ,GAAA,EAAK,OAAA,EAAS,GAAG,CAAA;AAAA,EAC1G,YAAY,OAAA,CAAQ,UAAA,EAAY,SAAA,EAAW,cAAA,EAAgB,UAAU,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,EAAG,EAAE,KAAA,EAAO,EAAA,EAAI,QAAQ,GAAA,EAAK,OAAA,EAAS,GAAG,CAAA;AAAA,EACzH,WAAA,EAAa,OAAA,CAAQ,WAAA,EAAa,SAAA,EAAW,cAAA,EAAgB,WAAA,EAAa,EAAE,KAAA,EAAO,GAAA,EAAK,MAAA,EAAQ,GAAA,EAAK,OAAA,EAAS,GAAG,CAAA;AAAA,EACjH,UAAA,EAAY,OAAA,CAAQ,UAAA,EAAY,SAAA,EAAW,mBAAA,EAAqB,WAAA,EAAa,EAAE,KAAA,EAAO,GAAA,EAAK,MAAA,EAAQ,GAAA,EAAK,OAAA,EAAS,GAAG,CAAA;AAAA,EACpH,eAAA,EAAiB,UAAA,CAAW,eAAA,EAAiB,GAAA,EAAK,EAAA,EAAI,SAAA,EAAW,CAAC,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,KAAK,CAAA,EAAG,SAAS,CAAA;AAAA,EAC1G,cAAA,EAAgB,UAAA,CAAW,cAAA,EAAgB,EAAA,EAAI,EAAA,EAAI,SAAA,EAAW,CAAC,KAAA,EAAO,MAAA,EAAQ,KAAK,CAAA,EAAG,OAAO,CAAA;AAAA,EAC7F,cAAA,EAAgB,UAAA,CAAW,cAAA,EAAgB,EAAA,EAAI,EAAA,EAAI,SAAA,EAAW,CAAC,KAAA,EAAO,MAAA,EAAQ,KAAK,CAAA,EAAG,OAAO,CAAA;AAAA,EAC7F,sBAAA,EAAwB,UAAA,CAAW,sBAAA,EAAwB,EAAA,EAAI,EAAA,EAAI,SAAA,EAAW,CAAC,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAK,CAAA,EAAG,gBAAa,CAAA;AAAA,EACzH,sBAAA,EAAwB,UAAA,CAAW,sBAAA,EAAwB,GAAA,EAAK,EAAA,EAAI,SAAA,EAAW,CAAC,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAK,CAAA,EAAG,iBAAc,CAAA;AAAA,EAC3H,qBAAA,EAAuB,UAAA,CAAW,qBAAA,EAAuB,EAAA,EAAI,EAAA,EAAI,SAAA,EAAW,CAAC,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,KAAK,GAAG,QAAQ,CAAA;AAAA,EACvH,qBAAA,EAAuB,UAAA,CAAW,qBAAA,EAAuB,EAAA,EAAI,EAAA,EAAI,SAAA,EAAW,CAAC,KAAA,EAAO,KAAA,EAAO,KAAK,CAAA,EAAG,YAAY;AACjH,CAAA;AAEO,SAAS,QAAA,CAAS,IAAA,EAA0B,IAAA,GAAwC,EAAC,EAAa;AACvG,EAAA,MAAM,IAAA,GAAO,aAAa,IAAI,CAAA;AAC9B,EAAA,IAAI,CAAC,IAAA,EAAM,MAAM,IAAI,KAAA,CAAM,CAAA,8BAAA,EAAiC,IAAI,CAAA,CAAE,CAAA;AAGlE,EAAA,IAAI,SAAS,UAAA,EAAY;AACvB,IAAA,MAAM,IAAA,GAAO,KAAK,GAAA,CAAI,CAAA,EAAG,OAAO,IAAA,CAAK,IAAA,IAAQ,CAAC,CAAC,CAAA;AAC/C,IAAA,OAAO;AAAA,MACL,GAAG,IAAA;AAAA,MACH,OAAO,IAAA,GAAO,KAAA;AAAA,MACd,IAAA,EAAM;AAAA,QACJ,EAAE,IAAA,EAAM,GAAA,EAAK,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,QACxB,EAAE,IAAA,EAAM,GAAA,EAAK,GAAG,IAAA,GAAO,KAAA,EAAO,GAAG,CAAA;AAAE;AACrC,KACF;AAAA,EACF;AAEA,EAAA,IAAI,SAAS,OAAA,EAAS;AACpB,IAAA,MAAM,IAAA,GAAO,KAAK,GAAA,CAAI,CAAA,EAAG,OAAO,IAAA,CAAK,IAAA,IAAQ,CAAC,CAAC,CAAA;AAC/C,IAAA,OAAO;AAAA,MACL,GAAG,IAAA;AAAA,MACH,OAAO,IAAA,GAAO,KAAA;AAAA,MACd,IAAA,EAAM;AAAA,QACJ,EAAE,IAAA,EAAM,OAAA,EAAS,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,QAC5B,EAAE,IAAA,EAAM,SAAA,EAAW,GAAG,IAAA,GAAO,KAAA,EAAO,GAAG,CAAA;AAAE;AAC3C,KACF;AAAA,EACF;AAEA,EAAA,IAAI,SAAS,KAAA,EAAO;AAClB,IAAA,MAAM,QAAA,GAAW,KAAK,GAAA,CAAI,CAAA,EAAG,OAAO,IAAA,CAAK,IAAA,IAAQ,CAAC,CAAC,CAAA;AACnD,IAAA,MAAM,UAAU,QAAA,GAAW,CAAA;AAC3B,IAAA,MAAM,IAAI,OAAA,GAAU,KAAA;AACpB,IAAA,MAAM,IAAI,CAAA,GAAI,KAAA;AACd,IAAA,MAAM,OAAkB,EAAC;AACzB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,EAAS,CAAA,EAAA,EAAK;AAChC,MAAA,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAG,CAAA,EAAG,CAAA;AACrD,MAAA,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,CAAO,QAAA,GAAW,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAG,CAAA,EAAG,CAAA;AAAA,IAC9D;AACA,IAAA,OAAO,EAAE,GAAG,IAAA,EAAM,OAAO,CAAA,EAAG,MAAA,EAAQ,GAAG,IAAA,EAAK;AAAA,EAC9C;AAEA,EAAA,IAAI,SAAS,QAAA,EAAU;AACrB,IAAA,MAAM,QAAA,GAAW,KAAK,GAAA,CAAI,CAAA,EAAG,OAAO,IAAA,CAAK,IAAA,IAAQ,CAAC,CAAC,CAAA;AACnD,IAAA,MAAM,OAAkB,EAAC;AACzB,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,UAAU,CAAA,EAAA,EAAK,IAAA,CAAK,KAAK,EAAE,IAAA,EAAM,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA,EAAG,CAAA,EAAG,IAAI,KAAA,EAAO,CAAA,EAAG,GAAG,CAAA;AACxF,IAAA,OAAO,EAAE,GAAG,IAAA,EAAM,KAAA,EAAO,QAAA,GAAW,OAAO,IAAA,EAAK;AAAA,EAClD;AAEA,EAAA,OAAO,IAAA;AACT;AAKO,IAAM,UAAA,GAAa,KAAA;;;AC7enB,IAAM,QAAA,GAAW;AAAA,EACtB,KAAA,EAAO,UAAA;AAAA,EACP,WAAA,EAAa,EAAA;AAAA,EACb,MAAA,EAAQ,UAAA;AAAA,EACR,WAAA,EAAa,EAAA;AAAA,EACb,WAAA,EAAa,EAAA;AAAA,EACb,WAAA,EAAa,EAAA;AAAA,EACb,WAAA,EAAa,EAAA;AAAA,EACb,OAAA,EAAS,EAAA;AAAA,EACT,MAAA,EAAQ;AACV,CAAA;AAEA,IAAM,SAAA,GAAoC,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAE;AAIvG,SAAS,cAAc,IAAA,EAIrB;AACA,EAAA,IAAI,IAAA,KAAS,QAAQ,OAAO,EAAE,MAAM,EAAA,EAAI,QAAA,EAAU,KAAA,EAAO,UAAA,EAAY,KAAA,EAAM;AAC3E,EAAA,IAAI,IAAA,KAAS,QAAQ,OAAO,EAAE,MAAM,EAAA,EAAI,QAAA,EAAU,IAAA,EAAM,UAAA,EAAY,KAAA,EAAM;AAC1E,EAAA,OAAO,EAAE,IAAA,EAAM,EAAA,EAAI,QAAA,EAAU,IAAA,EAAM,YAAY,IAAA,EAAK;AACtD;AAEA,SAAS,cAAA,CAAe,IAAA,EAA8B,OAAA,EAAiB,OAAA,EAA4C;AACjH,EAAA,MAAM,EAAE,IAAA,EAAM,QAAA,EAAU,UAAA,EAAW,GAAI,cAAc,IAAI,CAAA;AACzD,EAAA,MAAM+E,SAAQ,QAAA,CAAS,KAAA;AAEvB,EAAA,MAAM,MAAA,GAAA,CAAU,IAAA,GAAO,CAAA,IAAKA,MAAAA,GAAQ,SAAS,WAAA,GAAc,CAAA;AAC3D,EAAA,MAAM,KAAA,GAAQ,QAAA,GAAW,QAAA,CAAS,WAAA,GAAc,CAAA,GAAI,CAAA;AACpD,EAAA,MAAM,KAAA,GAAQ,EAAA,GAAKA,MAAAA,GAAQ,QAAA,CAAS,MAAA;AACpC,EAAA,MAAM,MAAA,GAAS,KAAA,GAAQ,KAAA,GAAQ,QAAA,CAAS,WAAA,GAAc,CAAA;AACtD,EAAA,MAAM,CAAA,GAAI,OAAA;AACV,EAAA,MAAM,CAAA,GAAI,OAAA;AACV,EAAA,MAAM,KAAA,GAAQ,MAAA,GAAS,QAAA,CAAS,WAAA,GAAc,CAAA;AAC9C,EAAA,MAAM,MAAA,GAAS,MAAA,GAAS,QAAA,CAAS,WAAA,GAAc,CAAA;AAE/C,EAAA,MAAM,SAAA,GAAY,QAAA,GAAW,QAAA,CAAS,WAAA,GAAc,CAAA;AACpD,EAAA,MAAM,OAAA,GAAU,IAAI,QAAA,CAAS,WAAA,GAAc,YAAY,QAAA,CAAS,WAAA,GAAc,CAAA,GAAIA,MAAAA,GAAQA,MAAAA,GAAQ,CAAA;AAClG,EAAA,OAAO;AAAA,IACL,CAAA;AAAA,IAAG,CAAA;AAAA,IAAG,KAAA;AAAA,IAAO,MAAA;AAAA,IAAQ,KAAA,EAAOA,MAAAA;AAAA,IAAO,IAAA;AAAA,IAAM,QAAA;AAAA,IAAU,UAAA;AAAA,IACnD,OAAA;AAAA,IAAS,cAAc,QAAA,CAAS;AAAA,GAClC;AACF;AAIA,SAAS,MAAA,CAAO,KAAgC,CAAA,EAA8C;AAC5F,EAAA,MAAMA,SAAQ,GAAA,CAAI,KAAA;AAClB,EAAA,MAAM,SAAS,GAAA,CAAI,CAAA,GAAI,SAAS,WAAA,GAAc,QAAA,CAAS,cAAcA,MAAAA,GAAQ,CAAA;AAC7E,EAAA,MAAM,SAAA,GAAY,GAAA,CAAI,QAAA,GAAW,QAAA,CAAS,WAAA,GAAc,CAAA;AACxD,EAAA,MAAM,MAAA,GAAS,IAAI,CAAA,GAAI,QAAA,CAAS,cAAc,SAAA,GAAY,QAAA,CAAS,cAAcA,MAAAA,GAAQ,CAAA;AACzF,EAAA,IAAI,CAAA,CAAE,SAAS,MAAA,EAAQ;AACrB,IAAA,MAAM,IAAA,GAAO,MAAA,GAAA,CAAU,CAAA,CAAE,GAAA,GAAM,CAAA,IAAKA,MAAAA;AACpC,IAAA,MAAM,IAAA,GAAO,SAAA,CAAU,CAAA,CAAE,GAAG,CAAA;AAC5B,IAAA,IAAI,IAAA,GAAO,SAAS,IAAA,GAAOA,MAAAA;AAC3B,IAAA,IAAI,IAAA,IAAQ,CAAA,EAAG,IAAA,IAAQ,QAAA,CAAS,MAAA;AAChC,IAAA,OAAO,EAAE,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,IAAA,EAAK;AAAA,EAC5B;AAEA,EAAA,MAAM,QAAA,GAAW,MAAA,GAAA,CAAU,CAAA,CAAE,GAAA,GAAM,CAAA,IAAKA,MAAAA;AACxC,EAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA;AACjC,EAAA,MAAM,UAAA,GAAa,CAAA,CAAE,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA;AACxC,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,CAAA,GAAI,QAAA,CAAS,WAAA;AACnC,IAAA,MAAMC,UAAS,UAAA,GAAa,SAAA,GAAY,CAAA,GAAI,SAAA,GAAY,SAAS,WAAA,GAAc,CAAA;AAC/E,IAAA,OAAO,EAAE,CAAA,EAAG,QAAA,EAAU,CAAA,EAAGA,OAAAA,EAAO;AAAA,EAClC;AACA,EAAA,MAAM,eAAe,GAAA,CAAI,CAAA,GAAI,IAAI,MAAA,GAAS,QAAA,CAAS,cAAc,QAAA,CAAS,WAAA;AAC1E,EAAA,MAAM,SAAS,UAAA,GAAa,YAAA,GAAe,CAAA,GAAI,YAAA,GAAe,SAAS,WAAA,GAAc,CAAA;AACrF,EAAA,OAAO,EAAE,CAAA,EAAG,QAAA,EAAU,CAAA,EAAG,MAAA,EAAO;AAClC;AAIA,SAAS,SAAA,CACP,GAAA,EACA,IAAA,EACA,aAAA,EACsB;AACtB,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,IAAA,CAAK,IAAA,EAAM,KAAK,IAAI,CAAA;AAC1C,EAAA,IAAI,IAAA,CAAK,aAAa,MAAA,EAAQ;AAC5B,IAAA,MAAM,YAAY,IAAA,CAAK,SAAA,CAAU,SAAS,MAAA,GAAS,IAAA,CAAK,UAAU,IAAA,GAAO,aAAA;AACzE,IAAA,IAAI5E,EAAAA,GAAI,GAAGoD,EAAAA,GAAI,CAAA;AACf,IAAA,IAAI,cAAc,aAAA,EAAe;AAC/B,MAAApD,EAAAA,GAAI,GAAA,CAAI,CAAA,GAAI,QAAA,CAAS,UAAU,IAAA,CAAK,KAAA;AACpC,MAAAoD,KAAI,GAAA,CAAI,CAAA,GAAA,CAAK,GAAA,CAAI,MAAA,GAAS,KAAK,MAAA,IAAU,CAAA;AAAA,IAC3C,CAAA,MAAA,IAAW,cAAc,cAAA,EAAgB;AACvC,MAAApD,EAAAA,GAAI,GAAA,CAAI,CAAA,GAAI,GAAA,CAAI,QAAQ,QAAA,CAAS,OAAA;AACjC,MAAAoD,KAAI,GAAA,CAAI,CAAA,GAAA,CAAK,GAAA,CAAI,MAAA,GAAS,KAAK,MAAA,IAAU,CAAA;AAAA,IAC3C,CAAA,MAAA,IAAW,cAAc,OAAA,EAAS;AAChC,MAAApD,KAAI,GAAA,CAAI,CAAA,GAAA,CAAK,GAAA,CAAI,KAAA,GAAQ,KAAK,KAAA,IAAS,CAAA;AACvC,MAAAoD,EAAAA,GAAI,GAAA,CAAI,CAAA,GAAI,QAAA,CAAS,UAAU,IAAA,CAAK,MAAA;AAAA,IACtC,CAAA,MAAO;AACL,MAAApD,KAAI,GAAA,CAAI,CAAA,GAAA,CAAK,GAAA,CAAI,KAAA,GAAQ,KAAK,KAAA,IAAS,CAAA;AACvC,MAAAoD,EAAAA,GAAI,GAAA,CAAI,CAAA,GAAI,GAAA,CAAI,SAAS,QAAA,CAAS,OAAA;AAAA,IACpC;AACA,IAAA,MAAMyB,QAAiD,EAAC;AACxD,IAAA,KAAA,MAAW,KAAK,IAAA,CAAK,IAAA,EAAMA,KAAAA,CAAK,EAAE,IAAI,CAAA,GAAI,EAAE,CAAA,EAAG7E,KAAI,CAAA,CAAE,CAAA,EAAG,CAAA,EAAGoD,EAAAA,GAAI,EAAE,CAAA,EAAE;AAEnE,IAAA,IAAI,SAAA,KAAc,aAAA,EAAe,aAAA,CAAc,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,aAAA,CAAc,IAAA,EAAM,IAAA,CAAK,KAAA,GAAQ,QAAA,CAAS,OAAO,CAAA;AAChH,IAAA,IAAI,SAAA,KAAc,cAAA,EAAgB,aAAA,CAAc,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,aAAA,CAAc,KAAA,EAAO,IAAA,CAAK,KAAA,GAAQ,QAAA,CAAS,OAAO,CAAA;AACnH,IAAA,IAAI,SAAA,KAAc,OAAA,EAAS,aAAA,CAAc,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,aAAA,CAAc,KAAA,EAAO,IAAA,CAAK,MAAA,GAAS,QAAA,CAAS,OAAO,CAAA;AAC7G,IAAA,IAAI,SAAA,KAAc,OAAA,EAAS,aAAA,CAAc,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,aAAA,CAAc,KAAA,EAAO,IAAA,CAAK,MAAA,GAAS,QAAA,CAAS,OAAO,CAAA;AAC7G,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MAAM,CAAA,EAAApD,EAAAA;AAAA,MAAG,CAAA,EAAAoD,EAAAA;AAAA,MAAG,OAAO,IAAA,CAAK,KAAA;AAAA,MAAO,QAAQ,IAAA,CAAK,MAAA;AAAA,MAAQ,QAAA,EAAU,CAAA;AAAA,MAAG,IAAA,EAAAyB;AAAA,KACnE;AAAA,EACF;AAGA,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI,KAAK,SAAA,CAAU,IAAA,KAAS,OAAA,EAAS,MAAA,GAAS,KAAK,SAAA,CAAU,EAAA;AAAA,OAAA,IACpD,KAAK,SAAA,CAAU,IAAA,KAAS,MAAA,EAAQ,MAAA,GAAS,KAAK,SAAA,CAAU,IAAA;AAAA,aACtD,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,IAAA,CAAK,EAAE,CAAA,2BAAA,CAA6B,CAAA;AAC9E,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,GAAA,EAAK,MAAM,CAAA;AAInC,EAAA,IAAI,IAAA,CAAK,aAAa,QAAA,EAAU;AAE9B,IAAA,MAAM,UAAU,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,SAAS,CAAC,CAAA;AAC9C,IAAiB,OAAA,CAAQ,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,CAAG;AAE3C,IAAA,MAAM7E,KAAI,QAAA,CAAS,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,CAAG,CAAA;AACrC,IAAA,MAAMoD,KAAI,QAAA,CAAS,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,CAAG,CAAA;AAErC,IAAA,MAAMyB,QAAiD,EAAC;AACxD,IAAA,KAAA,MAAW,KAAK,IAAA,CAAK,IAAA,EAAMA,KAAAA,CAAK,EAAE,IAAI,CAAA,GAAI,EAAE,CAAA,EAAG7E,KAAI,CAAA,CAAE,CAAA,EAAG,CAAA,EAAGoD,EAAAA,GAAI,EAAE,CAAA,EAAE;AACnE,IAAA,OAAO,EAAE,IAAA,EAAM,CAAA,EAAApD,EAAAA,EAAG,GAAAoD,EAAAA,EAAG,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,QAAQ,IAAA,CAAK,MAAA,EAAQ,QAAA,EAAU,CAAA,EAAG,MAAAyB,KAAAA,EAAK;AAAA,EACjF;AAGA,EAAA,MAAM,IAAI,QAAA,CAAS,CAAA;AACnB,EAAA,IAAI,IAAI,QAAA,CAAS,CAAA;AAEjB,EAAA,IAAI,KAAK,eAAA,EAAiB;AAK1B,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,QAAA,CAAS,KAAA,EAAO;AAClC,IAAA,CAAA,GAAI,QAAA,CAAS,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,CAAA;AAAA,EACjC;AACA,EAAA,MAAM,OAAiD,EAAC;AACxD,EAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,EAAE,IAAI,CAAA,GAAI,EAAE,CAAA,EAAG,IAAI,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,CAAA,GAAI,EAAE,CAAA,EAAE;AACnE,EAAA,OAAO,EAAE,IAAA,EAAM,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAQ,QAAA,EAAU,CAAA,EAAG,IAAA,EAAK;AACjF;AAIA,SAAS,UAAA,CACP,EAAA,EACA,KAAA,EACA,GAAA,EAC0B;AAC1B,EAAA,IAAI,GAAG,IAAA,KAAS,OAAA,SAAgB,MAAA,CAAO,GAAA,EAAK,GAAG,EAAE,CAAA;AACjD,EAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,IAAA,CAAK,EAAA,KAAO,EAAA,CAAG,MAAM,CAAA;AACtD,EAAA,IAAI,CAAC,MAAM,MAAM,IAAI,MAAM,CAAA,8BAAA,EAAiC,EAAA,CAAG,MAAM,CAAA,CAAA,CAAG,CAAA;AACxE,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,IAAA,CAAK,EAAA,CAAG,GAAG,CAAA;AAC5B,EAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,KAAA,CAAM,CAAA,MAAA,EAAS,EAAA,CAAG,MAAM,CAAA,oBAAA,EAAuB,EAAA,CAAG,GAAG,CAAA,CAAA,CAAG,CAAA;AAG5E,EAAA,OAAO,EAAE,CAAA,EAAG,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,IAAI,CAAA,EAAE;AAC9B;AAEA,SAAS,UAAA,CAAW,EAAA,EAA8B,EAAA,EAA8B,GAAA,EAAwC;AACtH,EAAA,MAAM,EAAA,GAAK,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,CAAA;AACrB,EAAA,MAAM,EAAA,GAAK,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,CAAA;AACrB,EAAA,MAAM,OAAO,IAAA,CAAK,IAAA,CAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAE,CAAA;AACxC,EAAA,IAAI,IAAA,GAAO,CAAA,EAAG,OAAO,CAAA,EAAA,EAAK,GAAG,CAAC,CAAA,CAAA,EAAI,EAAA,CAAG,CAAC,CAAA,GAAA,EAAM,EAAA,CAAG,CAAC,CAAA,CAAA,EAAI,GAAG,CAAC,CAAA,CAAA;AAExD,EAAA,MAAM,EAAA,GAAK,CAAC,EAAA,GAAK,IAAA;AACjB,EAAA,MAAM,KAAK,EAAA,GAAK,IAAA;AAEhB,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,EAAE,CAAC,CAAC,CAAA;AAKnE,EAAA,MAAM,IAAA,GAAO,EAAA,IAAM,CAAA,GAAI,CAAA,GAAI,EAAA;AAC3B,EAAA,IAAI,IAAA,EAAc,MAAc,IAAA,EAAc,IAAA;AAC9C,EAAA,IAAI,GAAA,EAAK;AAEP,IAAA,IAAA,GAAA,CAAQ,EAAA,CAAG,CAAA,GAAI,GAAA,CAAI,CAAA,IAAK,CAAA;AACxB,IAAA,IAAA,GAAA,CAAQ,EAAA,CAAG,CAAA,GAAI,GAAA,CAAI,CAAA,IAAK,CAAA;AACxB,IAAA,IAAA,GAAA,CAAQ,GAAA,CAAI,CAAA,GAAI,EAAA,CAAG,CAAA,IAAK,CAAA;AACxB,IAAA,IAAA,GAAA,CAAQ,GAAA,CAAI,CAAA,GAAI,EAAA,CAAG,CAAA,IAAK,CAAA;AAAA,EAC1B,CAAA,MAAO;AACL,IAAA,MAAM,IAAA,GAAO,KAAK,GAAA,GAAM,IAAA;AACxB,IAAA,MAAM,IAAA,GAAO,KAAK,GAAA,GAAM,IAAA;AACxB,IAAA,IAAA,GAAO,EAAA,CAAG,CAAA,GAAI,EAAA,GAAK,IAAA,GAAO,IAAA;AAC1B,IAAA,IAAA,GAAO,EAAA,CAAG,CAAA,GAAI,EAAA,GAAK,IAAA,GAAO,IAAA;AAC1B,IAAA,IAAA,GAAO,EAAA,CAAG,CAAA,GAAI,EAAA,GAAK,IAAA,GAAO,IAAA;AAC1B,IAAA,IAAA,GAAO,EAAA,CAAG,CAAA,GAAI,EAAA,GAAK,IAAA,GAAO,IAAA;AAAA,EAC5B;AACA,EAAA,OAAO,KAAK,EAAA,CAAG,CAAA,CAAE,QAAQ,CAAC,CAAC,IAAI,EAAA,CAAG,CAAA,CAAE,QAAQ,CAAC,CAAC,MAAM,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,EAAI,KAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,QAAQ,CAAC,CAAC,IAAI,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,EAAI,GAAG,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,EAAI,GAAG,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA;AACpK;AAIO,SAAS,iBAAiB,GAAA,EAA4C;AAE3E,EAAA,MAAM,QAAA,GAAW,EAAE,IAAA,EAAM,CAAA,EAAG,OAAO,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,CAAA,EAAE;AAEzD,EAAA,KAAA,MAAW,IAAA,IAAQ,IAAI,KAAA,EAAO;AAC5B,IAAA,IAAI,IAAA,CAAK,SAAA,CAAU,IAAA,KAAS,MAAA,EAAQ;AAClC,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,IAAA,CAAK,IAAA,EAAM,KAAK,IAAI,CAAA;AAC1C,MAAA,MAAM,IAAA,GAAO,KAAK,SAAA,CAAU,IAAA;AAC5B,MAAA,IAAI,IAAA,KAAS,aAAA,EAAe,QAAA,CAAS,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,QAAA,CAAS,IAAA,EAAM,IAAA,CAAK,KAAA,GAAQ,QAAA,CAAS,OAAO,CAAA;AACjG,MAAA,IAAI,IAAA,KAAS,cAAA,EAAgB,QAAA,CAAS,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,QAAA,CAAS,KAAA,EAAO,IAAA,CAAK,KAAA,GAAQ,QAAA,CAAS,OAAO,CAAA;AACpG,MAAA,IAAI,IAAA,KAAS,OAAA,EAAS,QAAA,CAAS,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,QAAA,CAAS,KAAA,EAAO,IAAA,CAAK,MAAA,GAAS,QAAA,CAAS,OAAO,CAAA;AAC9F,MAAA,IAAI,IAAA,KAAS,OAAA,EAAS,QAAA,CAAS,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,QAAA,CAAS,KAAA,EAAO,IAAA,CAAK,MAAA,GAAS,QAAA,CAAS,OAAO,CAAA;AAAA,IAChG;AAAA,EACF;AAGA,EAAA,MAAM,GAAA,GAAM,cAAA;AAAA,IACV,GAAA,CAAI,KAAA;AAAA,IACJ,QAAA,CAAS,SAAS,QAAA,CAAS,IAAA;AAAA,IAC3B,SAAS,MAAA,GAAS,QAAA,CAAS,KAAA,IAAS,GAAA,CAAI,QAAQ,EAAA,GAAK,CAAA;AAAA,GACvD;AAGA,EAAA,MAAM,aAAA,GAAgB,EAAE,IAAA,EAAM,CAAA,EAAG,OAAO,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,CAAA,EAAE;AAC9D,EAAA,MAAM,KAAA,GAAgC,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,CAAC,MAAM,SAAA,CAAU,GAAA,EAAK,CAAA,EAAG,aAAa,CAAC,CAAA;AAG3F,EAAA,MAAM,KAAA,GAAgC,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AAC5D,IAAA,MAAM,MAAA,GAAS,UAAA,CAAW,IAAA,CAAK,IAAA,EAAM,OAAO,GAAG,CAAA;AAC/C,IAAA,MAAM,IAAA,GAAO,UAAA,CAAW,IAAA,CAAK,EAAA,EAAI,OAAO,GAAG,CAAA;AAC3C,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,IAAA,EAAM,EAAA;AAAA;AAAA,MACN,MAAA;AAAA,MACA,IAAA;AAAA,MACA,OAAO,IAAA,CAAK;AAAA,KACd;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,IAAI,OAAO,GAAA,CAAI,CAAA;AACf,EAAA,IAAI,OAAO,GAAA,CAAI,CAAA;AACf,EAAA,IAAI,IAAA,GAAO,GAAA,CAAI,CAAA,GAAI,GAAA,CAAI,KAAA;AACvB,EAAA,IAAI,IAAA,GAAO,GAAA,CAAI,CAAA,GAAI,GAAA,CAAI,MAAA;AACvB,EAAA,KAAA,MAAW,MAAM,KAAA,EAAO;AACtB,IAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,EAAA,CAAG,CAAC,CAAA;AAC1B,IAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,EAAA,CAAG,CAAC,CAAA;AAC1B,IAAA,IAAA,GAAO,KAAK,GAAA,CAAI,IAAA,EAAM,EAAA,CAAG,CAAA,GAAI,GAAG,KAAK,CAAA;AACrC,IAAA,IAAA,GAAO,KAAK,GAAA,CAAI,IAAA,EAAM,EAAA,CAAG,CAAA,GAAI,GAAG,MAAM,CAAA;AAAA,EACxC;AACA,EAAA,KAAA,MAAW,MAAM,KAAA,EAAO;AACtB,IAAA,IAAA,GAAO,IAAA,CAAK,IAAI,IAAA,EAAM,EAAA,CAAG,OAAO,CAAA,EAAG,EAAA,CAAG,KAAK,CAAC,CAAA;AAC5C,IAAA,IAAA,GAAO,IAAA,CAAK,IAAI,IAAA,EAAM,EAAA,CAAG,OAAO,CAAA,EAAG,EAAA,CAAG,KAAK,CAAC,CAAA;AAC5C,IAAA,IAAA,GAAO,IAAA,CAAK,IAAI,IAAA,EAAM,EAAA,CAAG,OAAO,CAAA,EAAG,EAAA,CAAG,KAAK,CAAC,CAAA;AAC5C,IAAA,IAAA,GAAO,IAAA,CAAK,IAAI,IAAA,EAAM,EAAA,CAAG,OAAO,CAAA,EAAG,EAAA,CAAG,KAAK,CAAC,CAAA;AAAA,EAC9C;AAEA,EAAA,MAAM,MAAA,GAAS,SAAS,MAAA,GAAS,IAAA;AACjC,EAAA,MAAM,MAAA,GAAS,SAAS,MAAA,GAAS,IAAA;AACjC,EAAA,IAAI,MAAA,KAAW,CAAA,IAAK,MAAA,KAAW,CAAA,EAAG;AAChC,IAAA,GAAA,CAAI,CAAA,IAAK,MAAA;AACT,IAAA,GAAA,CAAI,CAAA,IAAK,MAAA;AACT,IAAA,GAAA,CAAI,OAAA,IAAW,MAAA;AACf,IAAA,KAAA,MAAW,MAAM,KAAA,EAAO;AACtB,MAAA,EAAA,CAAG,CAAA,IAAK,MAAA;AACR,MAAA,EAAA,CAAG,CAAA,IAAK,MAAA;AACR,MAAA,KAAA,MAAW,CAAA,IAAK,MAAA,CAAO,IAAA,CAAK,EAAA,CAAG,IAAI,CAAA,EAAG;AACpC,QAAA,EAAA,CAAG,IAAA,CAAK,CAAC,CAAA,CAAG,CAAA,IAAK,MAAA;AACjB,QAAA,EAAA,CAAG,IAAA,CAAK,CAAC,CAAA,CAAG,CAAA,IAAK,MAAA;AAAA,MACnB;AAAA,IACF;AACA,IAAA,KAAA,MAAW,MAAM,KAAA,EAAO;AACtB,MAAA,EAAA,CAAG,OAAO,CAAA,IAAK,MAAA;AACf,MAAA,EAAA,CAAG,OAAO,CAAA,IAAK,MAAA;AACf,MAAA,EAAA,CAAG,KAAK,CAAA,IAAK,MAAA;AACb,MAAA,EAAA,CAAG,KAAK,CAAA,IAAK,MAAA;AAAA,IACf;AAAA,EACF;AAEA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,EAAA,GAAK,MAAM,CAAC,CAAA;AAClB,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA;AACxB,IAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,GAAM,OAAO,GAAA,EAAK,IAAA,CAAK,GAAG,CAAA,GAAI,MAAA;AACjD,IAAA,EAAA,CAAG,OAAO,UAAA,CAAW,EAAA,CAAG,MAAA,EAAQ,EAAA,CAAG,MAAM,KAAK,CAAA;AAAA,EAChD;AACA,EAAA,MAAM,KAAA,GAAS,IAAA,GAAO,IAAA,GAAQ,QAAA,CAAS,MAAA,GAAS,CAAA;AAChD,EAAA,MAAM,MAAA,GAAU,IAAA,GAAO,IAAA,GAAQ,QAAA,CAAS,MAAA,GAAS,CAAA;AAEjD,EAAA,OAAO,EAAE,GAAA,EAAK,SAAA,EAAW,KAAK,KAAA,EAAO,KAAA,EAAO,OAAO,MAAA,EAAO;AAC5D;;;AC7RA,IAAM,cAAA,GAAyC;AAAA,EAC7C,GAAA,EAAK,SAAA;AAAA,EACL,KAAA,EAAO,SAAA;AAAA,EACP,IAAA,EAAM,SAAA;AAAA,EACN,MAAA,EAAQ,SAAA;AAAA,EACR,MAAA,EAAQ,SAAA;AAAA,EACR,KAAA,EAAO,SAAA;AAAA,EACP,KAAA,EAAO,SAAA;AAAA,EACP,MAAA,EAAQ,SAAA;AAAA,EACR,KAAA,EAAO,SAAA;AAAA,EACP,IAAA,EAAM;AACR,CAAA;AAEA,SAAS/D,UAAS,CAAA,EAAsB;AACtC,EAAA,OAAO;AAAA;AAAA,gDAAA,EAEyC,EAAE,IAAI,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oDAAA,EAqBF,EAAE,IAAI,CAAA;AAAA;AAAA;AAAA,CAAA,CAG1D,IAAA,EAAK;AACP;AAIA,SAAS,gBAAgB,GAAA,EAAwC;AAC/D,EAAA,MAAM6D,SAAQ,GAAA,CAAI,KAAA;AAClB,EAAA,MAAM,WAAqB,EAAC;AAG5B,EAAA,QAAA,CAAS,KAAKxF,sBAAA,CAAO;AAAA,IACnB,GAAG,GAAA,CAAI,CAAA;AAAA,IAAG,GAAG,GAAA,CAAI,CAAA;AAAA,IAAG,OAAO,GAAA,CAAI,KAAA;AAAA,IAAO,QAAQ,GAAA,CAAI,MAAA;AAAA,IAClD,EAAA,EAAI,CAAA;AAAA,IAAG,KAAA,EAAO;AAAA,GACf,CAAC,CAAA;AAGF,EAAA,QAAA,CAAS,KAAKA,sBAAA,CAAO;AAAA,IACnB,CAAA,EAAG,GAAA,CAAI,CAAA,GAAI,QAAA,CAAS,WAAA;AAAA,IACpB,CAAA,EAAG,GAAA,CAAI,OAAA,GAAU,GAAA,CAAI,YAAA,GAAe,CAAA;AAAA,IACpC,KAAA,EAAO,GAAA,CAAI,KAAA,GAAQ,QAAA,CAAS,WAAA,GAAc,CAAA;AAAA,IAC1C,QAAQ,GAAA,CAAI,YAAA;AAAA,IACZ,KAAA,EAAO;AAAA,GACR,CAAC,CAAA;AAGF,EAAA,IAAI,IAAI,QAAA,EAAU;AAChB,IAAA,MAAM,KAAA,GAAQ;AAAA,MACZ,EAAE,CAAA,EAAG,GAAA,CAAI,IAAI,QAAA,CAAS,WAAA,EAAa,MAAM,KAAA,EAAM;AAAA,MAC/C,EAAE,CAAA,EAAG,GAAA,CAAI,CAAA,GAAI,GAAA,CAAI,MAAA,GAAS,QAAA,CAAS,WAAA,GAAc,QAAA,CAAS,WAAA,EAAa,IAAA,EAAM,QAAA;AAAS,KACxF;AACA,IAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AAErB,MAAA,QAAA,CAAS,KAAKG,sBAAA,CAAO;AAAA,QACnB,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,GAAI,SAAS,WAAW,CAAA,CAAA,EAAI,EAAE,CAAA,GAAI,CAAC,MAAM,GAAA,CAAI,CAAA,GAAI,IAAI,KAAA,GAAQ,QAAA,CAAS,WAAW,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAC,CAAA,CAAA;AAAA,QACxG,KAAA,EAAO;AAAA,OACR,CAAC,CAAA;AAEF,MAAA,QAAA,CAAS,KAAKA,sBAAA,CAAO;AAAA,QACnB,CAAA,EAAG,CAAA,EAAA,EAAK,GAAA,CAAI,CAAA,GAAI,QAAA,CAAS,WAAW,CAAA,CAAA,EAAI,CAAA,CAAE,CAAA,GAAI,QAAA,CAAS,WAAA,GAAc,CAAC,MAAM,GAAA,CAAI,CAAA,GAAI,GAAA,CAAI,KAAA,GAAQ,QAAA,CAAS,WAAW,IAAI,CAAA,CAAE,CAAA,GAAI,QAAA,CAAS,WAAA,GAAc,CAAC,CAAA,CAAA;AAAA,QACtJ,KAAA,EAAO;AAAA,OACR,CAAC,CAAA;AAEF,MAAA,IAAI,IAAI,UAAA,EAAY;AAClB,QAAA,MAAM,OAAA,GAAU,IAAI,CAAA,GAAI,QAAA,CAAS,cAAc,QAAA,CAAS,WAAA,GAAe,EAAA,GAAMqF,MAAAA,GAAQA,MAAAA,GAAQ,CAAA;AAC7F,QAAA,MAAM,UAAU,OAAA,GAAUA,MAAAA;AAC1B,QAAA,QAAA,CAAS,KAAKxF,sBAAA,CAAO;AAAA,UACnB,CAAA,EAAG,OAAA;AAAA,UAAS,GAAG,CAAA,CAAE,CAAA;AAAA,UAAG,OAAO,OAAA,GAAU,OAAA;AAAA,UAAS,QAAQ,QAAA,CAAS,WAAA;AAAA,UAC/D,IAAA,EAAM;AAAA,SACP,CAAC,CAAA;AAAA,MACJ;AAEA,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,GAAA,CAAI,MAAM,CAAA,EAAA,EAAK;AAClC,QAAA,MAAM,EAAA,GAAK,GAAA,CAAI,CAAA,GAAI,QAAA,CAAS,WAAA,GAAc,SAAS,WAAA,GAAcwF,MAAAA,GAAQ,CAAA,GAAA,CAAK,CAAA,GAAI,CAAA,IAAKA,MAAAA;AACvF,QAAA,QAAA,CAAS,IAAA,CAAKvF,wBAAA,CAAS,EAAE,EAAA,EAAI,EAAA,EAAI,CAAA,CAAE,CAAA,GAAI,CAAA,EAAG,CAAA,EAAG,GAAA,EAAK,KAAA,EAAO,iBAAA,EAAmB,CAAC,CAAA;AAC7E,QAAA,QAAA,CAAS,IAAA,CAAKA,wBAAA,CAAS,EAAE,EAAA,EAAI,IAAI,CAAA,CAAE,CAAA,GAAI,QAAA,CAAS,WAAA,GAAc,GAAG,CAAA,EAAG,GAAA,EAAK,KAAA,EAAO,iBAAA,EAAmB,CAAC,CAAA;AAAA,MACtG;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,SAAA,GAAY,GAAA,CAAI,QAAA,GAAW,QAAA,CAAS,WAAA,GAAc,CAAA;AACxD,EAAA,MAAM,SAAA,GAAY,GAAA,CAAI,CAAA,GAAI,QAAA,CAAS,cAAc,SAAA,GAAY,CAAA;AAC7D,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,IAAK,GAAA,CAAI,IAAA,EAAM,KAAK,CAAA,EAAG;AACrC,IAAA,MAAM,EAAA,GAAK,GAAA,CAAI,CAAA,GAAI,QAAA,CAAS,WAAA,GAAc,SAAS,WAAA,GAAcuF,MAAAA,GAAQ,CAAA,GAAA,CAAK,CAAA,GAAI,CAAA,IAAKA,MAAAA;AACvF,IAAA,QAAA,CAAS,IAAA,CAAKhG,sBAAA,CAAO,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,SAAA,EAAW,KAAA,EAAO,iBAAA,EAAkB,EAAG,MAAA,CAAO,CAAC,CAAC,CAAC,CAAA;AAAA,EACpF;AAEA,EAAA,MAAM,UAAA,GAAa,GAAA,CAAI,CAAA,GAAI,GAAA,CAAI,MAAA,GAAS,QAAA,CAAS,WAAA,IAAe,GAAA,CAAI,QAAA,GAAW,QAAA,CAAS,WAAA,GAAc,CAAA,CAAA,GAAK,CAAA;AAC3G,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,IAAK,GAAA,CAAI,IAAA,EAAM,KAAK,CAAA,EAAG;AACrC,IAAA,MAAM,EAAA,GAAK,GAAA,CAAI,CAAA,GAAI,QAAA,CAAS,WAAA,GAAc,SAAS,WAAA,GAAcgG,MAAAA,GAAQ,CAAA,GAAA,CAAK,CAAA,GAAI,CAAA,IAAKA,MAAAA;AACvF,IAAA,QAAA,CAAS,IAAA,CAAKhG,sBAAA,CAAO,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,UAAA,EAAY,KAAA,EAAO,iBAAA,EAAkB,EAAG,MAAA,CAAO,CAAC,CAAC,CAAC,CAAA;AAAA,EACrF;AAGA,EAAA,MAAM,UAAU,CAAC,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,KAAK,GAAG,CAAA;AACxC,EAAA,MAAM,UAAU,CAAC,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,KAAK,GAAG,CAAA;AACxC,EAAA,MAAM,MAAA,GAAS,IAAI,CAAA,GAAI,QAAA,CAAS,cAAc,SAAA,GAAY,QAAA,CAAS,cAAcgG,MAAAA,GAAQ,CAAA;AACzF,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,IAAA,MAAM,IAAA,GAAO,SAAS,CAAA,GAAIA,MAAAA;AAC1B,IAAA,MAAM,IAAA,GAAO,MAAA,GAAA,CAAU,CAAA,GAAI,CAAA,IAAKA,SAAQ,QAAA,CAAS,MAAA;AACjD,IAAA,QAAA,CAAS,KAAKhG,sBAAA,CAAO,EAAE,CAAA,EAAG,GAAA,CAAI,IAAI,QAAA,CAAS,WAAA,GAAc,CAAA,EAAG,CAAA,EAAG,MAAM,KAAA,EAAO,iBAAA,IAAqB,OAAA,CAAQ,CAAC,CAAE,CAAC,CAAA;AAC7G,IAAA,QAAA,CAAS,KAAKA,sBAAA,CAAO,EAAE,GAAG,GAAA,CAAI,CAAA,GAAI,IAAI,KAAA,GAAQ,QAAA,CAAS,cAAc,CAAA,EAAG,CAAA,EAAG,MAAM,KAAA,EAAO,iBAAA,IAAqB,OAAA,CAAQ,CAAC,CAAE,CAAC,CAAA;AACzH,IAAA,QAAA,CAAS,KAAKA,sBAAA,CAAO,EAAE,CAAA,EAAG,GAAA,CAAI,IAAI,QAAA,CAAS,WAAA,GAAc,CAAA,EAAG,CAAA,EAAG,MAAM,KAAA,EAAO,iBAAA,IAAqB,OAAA,CAAQ,CAAC,CAAE,CAAC,CAAA;AAC7G,IAAA,QAAA,CAAS,KAAKA,sBAAA,CAAO,EAAE,GAAG,GAAA,CAAI,CAAA,GAAI,IAAI,KAAA,GAAQ,QAAA,CAAS,cAAc,CAAA,EAAG,CAAA,EAAG,MAAM,KAAA,EAAO,iBAAA,IAAqB,OAAA,CAAQ,CAAC,CAAE,CAAC,CAAA;AAAA,EAC3H;AAGA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,GAAA,CAAI,MAAM,CAAA,EAAA,EAAK;AAClC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,EAAK;AAC3B,MAAA,MAAM,EAAA,GAAK,GAAA,CAAI,CAAA,GAAI,QAAA,CAAS,WAAA,GAAc,SAAS,WAAA,GAAcgG,MAAAA,GAAQ,CAAA,GAAA,CAAK,CAAA,GAAI,CAAA,IAAKA,MAAAA;AACvF,MAAA,IAAI,EAAA,GAAK,SAAS,CAAA,GAAIA,MAAAA;AACtB,MAAA,IAAI,CAAA,IAAK,CAAA,EAAG,EAAA,IAAM,QAAA,CAAS,MAAA;AAC3B,MAAA,QAAA,CAAS,IAAA,CAAKvF,wBAAA,CAAS,EAAE,EAAA,EAAI,EAAA,EAAI,GAAG,GAAA,EAAK,KAAA,EAAO,YAAA,EAAc,CAAC,CAAA;AAAA,IACjE;AAAA,EACF;AAEA,EAAA,OAAOG,uBAAA,CAAM,EAAE,KAAA,EAAO,uBAAA,IAA2B,QAAQ,CAAA;AAC3D;AAIA,SAAS,WAAW,EAAA,EAAkC;AACpD,EAAA,MAAM,OAAO,QAAA,CAAS,EAAA,CAAG,KAAK,IAAA,EAAM,EAAA,CAAG,KAAK,IAAI,CAAA;AAChD,EAAA,MAAM,IAAA,GAAO,KAAK,IAAA,CAAK,EAAA,CAAG,MAAM,EAAA,CAAG,KAAA,EAAO,GAAG,MAAM,CAAA;AACnD,EAAA,MAAMuF,UAAAA,GAAY,EAAA,CAAG,IAAA,CAAK,KAAA,IAAS,iBAAiB,EAAE,CAAA;AACtD,EAAA,MAAM,OAAA,GAAUA,aACZnG,sBAAA,CAAO;AAAA,IACL,CAAA,EAAG,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,KAAA,GAAQ,CAAA;AAAA,IACrB,CAAA,EAAG,KAAK,QAAA,KAAa,MAAA,GAAS,GAAG,CAAA,GAAI,CAAA,GAAI,GAAG,CAAA,GAAI,CAAA;AAAA,IAChD,KAAA,EAAO;AAAA,GACT,EAAGmG,UAAS,CAAA,GACZ,EAAA;AACJ,EAAA,OAAOvF,uBAAA;AAAA,IACL,EAAE,OAAO,CAAA,sBAAA,EAAyB,EAAA,CAAG,KAAK,IAAI,CAAA,CAAA,EAAI,WAAW,CAAA,UAAA,EAAa,EAAA,CAAG,EAAE,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,EAAI,EAAA,CAAG,EAAE,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA,EAAI;AAAA,IAChH,CAAC,IAAI;AAAA,GACP,GAAI,OAAA;AACN;AAEA,SAAS,iBAAiB,EAAA,EAA8C;AACtE,EAAA,MAAM,EAAA,GAAK,GAAG,IAAA,CAAK,EAAA;AACnB,EAAA,MAAM,IAAA,GAAO,GAAG,IAAA,CAAK,IAAA;AACrB,EAAA,IAAI,GAAG,IAAA,CAAK,IAAA,KAAS,UAAA,IAAc,IAAA,CAAK,UAAU,MAAA,EAAW;AAC3D,IAAA,OAAO,GAAG,EAAA,CAAG,WAAA,EAAa,CAAA,CAAA,EAAI,KAAK,KAAK,CAAA,MAAA,CAAA;AAAA,EAC1C;AACA,EAAA,IAAI,EAAA,CAAG,IAAA,CAAK,IAAA,KAAS,KAAA,IAAS,KAAK,KAAA,EAAO;AACxC,IAAA,OAAO,CAAA,EAAG,GAAG,WAAA,EAAa,KAAK,MAAA,CAAO,IAAA,CAAK,KAAK,CAAC,CAAA,CAAA,CAAA;AAAA,EACnD;AACA,EAAA,IAAI,EAAA,CAAG,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA,IAAK,EAAA,CAAG,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,SAAS,CAAA,IAAK,EAAA,CAAG,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,UAAU,CAAA,IAAK,EAAA,CAAG,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,SAAS,CAAA,IAAK,EAAA,CAAG,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,WAAW,CAAA,EAAG;AAC9L,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,GAAG,WAAA,EAAY;AACxB;AAIA,SAAS,WAAW,EAAA,EAAqD;AACvE,EAAA,MAAM,MAAA,GAAS,cAAA,CAAe,EAAA,CAAG,KAAK,CAAA,IAAK,SAAA;AAC3C,EAAA,MAAMD,KAAAA,GAAOA,uBAAO,EAAE,CAAA,EAAG,GAAG,IAAA,EAAM,KAAA,EAAO,YAAA,EAAc,MAAA,EAAQ,CAAA;AAC/D,EAAA,MAAM,OAAOF,wBAAA,CAAS,EAAE,EAAA,EAAI,EAAA,CAAG,OAAO,CAAA,EAAG,EAAA,EAAI,EAAA,CAAG,MAAA,CAAO,GAAG,CAAA,EAAG,GAAA,EAAK,MAAM,MAAA,EAAQ,KAAA,EAAO,kBAAkB,CAAA;AACzG,EAAA,MAAM,OAAOA,wBAAA,CAAS,EAAE,EAAA,EAAI,EAAA,CAAG,KAAK,CAAA,EAAG,EAAA,EAAI,EAAA,CAAG,IAAA,CAAK,GAAG,CAAA,EAAG,GAAA,EAAK,MAAM,MAAA,EAAQ,KAAA,EAAO,kBAAkB,CAAA;AACrG,EAAA,OAAOE,QAAO,IAAA,GAAO,IAAA;AACvB;AAIO,SAAS,sBAAA,CAAuB,QAAgC,MAAA,EAA+B;AACpG,EAAA,MAAM,KAAA,GAAQE,kCAAA,CAAiB,MAAA,EAAQ,KAAA,IAAS,SAAS,CAAA;AACzD,EAAA,MAAM,GAAA,GAAMsB,UAAS,KAAK,CAAA;AAE1B,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,GAAA,CAAI,KAAA,IAAS,YAAA;AAErC,EAAA,MAAM,YAAY,MAAA,CAAO,GAAA,CAAI,KAAA,GACzBnC,sBAAA,CAAO,EAAE,CAAA,EAAG,QAAA,CAAS,MAAA,EAAQ,CAAA,EAAG,IAAI,KAAA,EAAO,aAAA,IAAiB,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA,GAC5E,EAAA;AAEJ,EAAA,MAAM,SAAA,GAAY,eAAA,CAAgB,MAAA,CAAO,SAAS,CAAA;AAClD,EAAA,MAAM,QAAQ,MAAA,CAAO,KAAA,CAAM,IAAI,UAAU,CAAA,CAAE,KAAK,IAAI,CAAA;AACpD,EAAA,MAAM,QAAQ,MAAA,CAAO,KAAA,CAAM,IAAI,UAAU,CAAA,CAAE,KAAK,IAAI,CAAA;AAEpD,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZC,uBAAA,CAAQgB,2BAAA,CAAU,QAAQ,CAAC,CAAA;AAAA,IAC3BH,uBAAO,kDAAkD,CAAA;AAAA,IACzDC,oBAAA,CAAG,OAAA,EAAS,EAAC,EAAG,GAAG,CAAA;AAAA,IACnB,SAAA;AAAA,IACA,SAAA;AAAA,IACAH,wBAAM,EAAE,KAAA,EAAO,eAAc,EAAG,CAAC,KAAK,CAAC,CAAA;AAAA,IACvCA,wBAAM,EAAE,KAAA,EAAO,eAAc,EAAG,CAAC,KAAK,CAAC;AAAA,GACzC;AAEA,EAAA,OAAOI,yBAAA;AAAA,IACL;AAAA,MACE,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,SAAS,CAAA,IAAA,EAAO,MAAA,CAAO,KAAK,CAAA,CAAA,EAAI,OAAO,MAAM,CAAA,CAAA;AAAA,MAC7C,KAAA,EAAO;AAAA,KACT;AAAA,IACA;AAAA,GACF;AACF;AAEO,SAAS,gBAAA,CAAiBhB,OAAc,MAAA,EAA+B;AAC5E,EAAA,MAAM,GAAA,GAAM,gBAAgBA,KAAI,CAAA;AAChC,EAAA,MAAM,MAAA,GAAS,iBAAiB,GAAG,CAAA;AACnC,EAAA,OAAO,sBAAA,CAAuB,QAAQ,MAAM,CAAA;AAC9C;;;ACvPO,IAAM,UAAA,GAA4B;AAAA,EACvC,IAAA,EAAM,YAAA;AAAA,EACN,OAAOA,KAAAA,EAAuB;AAC5B,IAAA,KAAA,MAAW,GAAA,IAAOA,KAAAA,CAAK,KAAA,CAAM,OAAO,CAAA,EAAG;AACrC,MAAA,MAAM,CAAA,GAAI,IAAI,IAAA,EAAK;AACnB,MAAA,IAAI,CAAA,CAAE,WAAW,CAAA,EAAG;AACpB,MAAA,IAAI,EAAE,UAAA,CAAW,IAAI,KAAK,CAAA,CAAE,UAAA,CAAW,GAAG,CAAA,EAAG;AAC7C,MAAA,MAAM,KAAA,GAAQ,EAAE,KAAA,CAAM,KAAK,EAAE,CAAC,CAAA,EAAG,aAAY,IAAK,EAAA;AAClD,MAAA,OAAO,KAAA,KAAU,YAAA;AAAA,IACnB;AACA,IAAA,OAAO,KAAA;AAAA,EACT,CAAA;AAAA,EACA,KAAA,EAAO,eAAA;AAAA,EACP,MAAA,CAAOA,OAAc,MAAA,EAA+B;AAClD,IAAA,OAAO,gBAAA,CAAiBA,OAAM,MAAM,CAAA;AAAA,EACtC;AACF,CAAA;;;AC2BO,IAAM,cAAA,GAAN,cAA6B,KAAA,CAAM;AAAA,EACxC,WAAA,CAAY,SAAwBD,KAAAA,EAAc;AAChD,IAAA,KAAA,CAAM,CAAA,KAAA,EAAQA,KAAI,CAAA,EAAA,EAAK,OAAO,CAAA,CAAE,CAAA;AADE,IAAA,IAAA,CAAA,IAAA,GAAAA,KAAAA;AAElC,IAAA,IAAA,CAAK,IAAA,GAAO,gBAAA;AAAA,EACd;AAAA,EAHoC,IAAA;AAItC,CAAA;AAWA,SAAS4B,SAAQ,CAAA,EAAmB;AAClC,EAAA,OAAO,EAAE,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA,CAAE,OAAA,CAAQ,QAAQ,GAAG,CAAA;AACpD;AAEA,SAAS,WAAW,IAAA,EAAsD;AACxE,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,4BAA4B,CAAA;AACjD,EAAA,IAAI,CAAC,GAAG,OAAO,IAAA;AACf,EAAA,OAAO,EAAE,KAAA,EAAO,CAAA,CAAE,CAAC,CAAA,CAAG,QAAQ,MAAA,EAAQ,GAAG,CAAA,EAAG,IAAA,EAAM,KAAK,KAAA,CAAM,CAAA,CAAE,CAAC,CAAA,CAAE,MAAM,CAAA,EAAE;AAC5E;AAEA,SAAS,gBAAgB3B,KAAAA,EAAsB;AAC7C,EAAA,MAAM,MAAc,EAAC;AACrB,EAAA,MAAM,GAAA,GAAMA,KAAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAC9B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACnC,IAAA,IAAI,CAAA,GAAI,IAAI,CAAC,CAAA;AAGb,IAAA,IAAI,KAAA,GAAQ,KAAA;AACZ,IAAA,IAAI,SAAA,GAAY,EAAA;AAChB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,QAAQ,CAAA,EAAA,EAAK;AACjC,MAAA,MAAM,CAAA,GAAI,EAAE,CAAC,CAAA;AACb,MAAA,IAAI,CAAA,KAAM,GAAA,KAAQ,CAAA,KAAM,CAAA,IAAK,CAAA,CAAE,IAAI,CAAC,CAAA,KAAM,IAAA,CAAA,EAAO,KAAA,GAAQ,CAAC,KAAA;AAC1D,MAAA,IAAI,KAAA,EAAO;AACX,MAAA,IAAI,MAAM,GAAA,IAAO,CAAA,CAAE,CAAA,GAAI,CAAC,MAAM,GAAA,EAAK;AAAE,QAAA,SAAA,GAAY,CAAA;AAAG,QAAA;AAAA,MAAO;AAC3D,MAAA,IAAI,MAAM,GAAA,EAAK;AAAE,QAAA,SAAA,GAAY,CAAA;AAAG,QAAA;AAAA,MAAO;AAAA,IACzC;AACA,IAAA,IAAI,aAAa,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,GAAG,SAAS,CAAA;AAC5C,IAAA,CAAA,GAAI,EAAE,IAAA,EAAK;AACX,IAAA,IAAI,CAAA,CAAE,WAAW,CAAA,EAAG;AACpB,IAAA,GAAA,CAAI,KAAK,EAAE,IAAA,EAAM,GAAG,EAAA,EAAI,CAAA,GAAI,GAAG,CAAA;AAAA,EACjC;AACA,EAAA,OAAO,GAAA;AACT;AAEO,SAAS,UAAUA,KAAAA,EAAuB;AAC/C,EAAA,MAAM,KAAA,GAAQ,gBAAgBA,KAAI,CAAA;AAClC,EAAA,IAAI,MAAM,MAAA,KAAW,CAAA,QAAS,IAAI,cAAA,CAAe,eAAe,CAAC,CAAA;AAGjE,EAAA,IAAI,KAAA,CAAM,CAAC,CAAA,CAAG,IAAA,CAAK,WAAA,EAAY,CAAE,KAAA,CAAM,KAAK,CAAA,CAAE,CAAC,CAAA,KAAM,MAAA,EAAQ;AAC3D,IAAA,MAAM,IAAI,cAAA;AAAA,MACR,wCAAA;AAAA,MACA,KAAA,CAAM,CAAC,CAAA,CAAG;AAAA,KACZ;AAAA,EACF;AAEA,EAAA,IAAI,SAAA,GAA2B,IAAA;AAC/B,EAAA,IAAIC,MAAAA;AACJ,EAAA,MAAM,QAAoB,EAAC;AAC3B,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAsB;AAC5C,EAAA,MAAM,SAAsB,EAAC;AAC7B,EAAA,MAAM,aAA6B,EAAC;AACpC,EAAA,MAAM,WAA0B,EAAC;AACjC,EAAA,MAAM,QAAoB,EAAC;AAG3B,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAgD;AAExE,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAsB;AAE9C,EAAA,IAAI,MAAA,GAAS,CAAA;AAGb,EAAA,OAAO,MAAA,GAAS,MAAM,MAAA,EAAQ;AAC5B,IAAA,MAAM,EAAA,GAAK,MAAM,MAAM,CAAA;AACvB,IAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,IAAA,CAAK,WAAA,EAAY;AAElC,IAAA,IAAI,KAAA,CAAM,UAAA,CAAW,YAAY,CAAA,EAAG;AAClC,MAAA,MAAM,CAAA,GAAI,GAAG,IAAA,CAAK,KAAA,CAAM,aAAa,MAAM,CAAA,CAAE,IAAA,EAAK,CAAE,WAAA,EAAY;AAChE,MAAA,IAAI,CAAA,KAAM,IAAA,IAAQ,CAAA,KAAM,IAAA,EAAM;AAC5B,QAAA,MAAM,IAAI,cAAA;AAAA,UACR,oCAAoC,CAAC,CAAA,EAAA,CAAA;AAAA,UACrC,EAAA,CAAG;AAAA,SACL;AAAA,MACF;AACA,MAAA,SAAA,GAAY,CAAA;AACZ,MAAA,MAAA,EAAA;AACA,MAAA;AAAA,IACF;AACA,IAAA,IAAI,KAAA,CAAM,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC9B,MAAA,MAAM,OAAO,EAAA,CAAG,IAAA,CAAK,MAAM,QAAA,CAAS,MAAM,EAAE,IAAA,EAAK;AACjD,MAAA,MAAM,CAAA,GAAI,WAAW,IAAI,CAAA;AACzB,MAAA,IAAI,CAAA,EAAGA,MAAAA,GAAQ,CAAA,CAAE,KAAA;AAAA,WACZA,MAAAA,GAAQ,IAAA;AACb,MAAA,MAAA,EAAA;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,KAAA,KAAU,OAAA,IAAW,KAAA,CAAM,UAAA,CAAW,QAAQ,CAAA,EAAG;AACnD,MAAA,MAAA,EAAA;AACA,MAAA,OAAO,MAAA,GAAS,MAAM,MAAA,EAAQ;AAC5B,QAAA,aAAA,CAAc,KAAA,CAAM,MAAM,CAAA,EAAI,KAAA,EAAO,aAAa,WAAW,CAAA;AAC7D,QAAA,MAAA,EAAA;AAAA,MACF;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,KAAA,CAAM,UAAA,CAAW,MAAM,CAAA,EAAG;AAC5B,MAAA,MAAA,GAAS,SAAA,CAAU,OAAO,MAAA,EAAQ,KAAA,EAAO,WAAW,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,WAAA,EAAa,WAAW,CAAA;AAC1G,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAI,cAAA;AAAA,MACR,mCAAmC,EAAA,CAAG,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA,CAAA;AAAA,MACvD,EAAA,CAAG;AAAA,KACL;AAAA,EACF;AAKA,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,IAAI,CAAC,EAAE,QAAA,EAAU;AACjB,IAAA,MAAM,OAAA,GAAU,CAAC,GAAG,MAAA,EAAQ,GAAG,UAAA,EAAY,GAAG,QAAQ,CAAA,CAAE,IAAA;AAAA,MACtD,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,CAAA,CAAE;AAAA,KACxB;AACA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAM,IAAI,cAAA;AAAA,QACR,CAAA,gBAAA,EAAmB,EAAE,KAAK,CAAA,6BAAA,CAAA;AAAA,QAC1B;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAIA,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,IAAI,CAAA,CAAE,SAAS,SAAA,EAAW;AAC1B,IAAA,MAAM,OAAA,GAAU,WAAA,CAAY,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA;AACtC,IAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA;AAClC,IAAA,IAAI,CAAC,SAAS,MAAM,IAAI,eAAe,CAAA,gBAAA,EAAmB,CAAA,CAAE,IAAI,CAAA,kBAAA,CAAA,EAAsB,CAAC,CAAA;AACvF,IAAA,IAAI,CAAC,OAAO,MAAM,IAAI,eAAe,CAAA,gBAAA,EAAmB,CAAA,CAAE,EAAE,CAAA,kBAAA,CAAA,EAAsB,CAAC,CAAA;AACnF,IAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,KAAA,CAAM,MAAA,EAAQ;AACnC,MAAA,MAAM,IAAI,cAAA;AAAA,QACR,CAAA,eAAA,EAAkB,CAAA,CAAE,IAAI,CAAA,KAAA,EAAQ,EAAE,EAAE,CAAA,qDAAA,CAAA;AAAA,QACpC;AAAA,OACF;AAAA,IACF;AAAA,EACF;AACA,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,IAAI,CAAA,CAAE,SAAS,SAAA,EAAW;AAC1B,IAAA,MAAM,UAAA,GAAa,WAAA,CAAY,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA;AACzC,IAAA,MAAM,QAAA,GAAW,WAAA,CAAY,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA;AACrC,IAAA,MAAM,OAAA,GAAU,WAAA,CAAY,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA;AACtC,IAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA;AAClC,IAAA,MAAM,QAAA,GAAW,aAAa,WAAA,CAAY,GAAA,CAAI,EAAE,IAAI,CAAA,CAAG,KAAK,OAAA,EAAS,MAAA;AACrE,IAAA,MAAM,MAAA,GAAS,WAAW,WAAA,CAAY,GAAA,CAAI,EAAE,EAAE,CAAA,CAAG,KAAK,KAAA,EAAO,MAAA;AAC7D,IAAA,IAAI,CAAC,QAAA,IAAY,CAAC,MAAA,EAAQ;AACxB,MAAA,MAAM,IAAI,cAAA;AAAA,QACR,CAAA,kCAAA,EAAqC,CAAA,CAAE,IAAI,CAAA,KAAA,EAAQ,EAAE,EAAE,CAAA,CAAA,CAAA;AAAA,QACvD;AAAA,OACF;AAAA,IACF;AACA,IAAA,IAAI,aAAa,MAAA,EAAQ;AACvB,MAAA,MAAM,IAAI,cAAA;AAAA,QACR,CAAA,cAAA,EAAiB,CAAA,CAAE,IAAI,CAAA,KAAA,EAAQ,EAAE,EAAE,CAAA,4BAAA,CAAA;AAAA,QACnC;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAAoB;AAC9C,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,IAAI,CAAA,CAAE,SAAS,SAAA,EAAW;AAC1B,IAAA,aAAA,CAAc,GAAA,CAAI,EAAE,IAAA,EAAA,CAAO,aAAA,CAAc,IAAI,CAAA,CAAE,IAAI,CAAA,IAAK,CAAA,IAAK,CAAC,CAAA;AAAA,EAChE;AACA,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,CAAC,CAAA,IAAK,aAAA,EAAe;AACpC,IAAA,IAAI,IAAI,CAAA,EAAG;AACT,MAAA,MAAM,IAAI,cAAA;AAAA,QACR,CAAA,SAAA,EAAY,GAAG,CAAA,MAAA,EAAS,CAAC,CAAA,sBAAA,CAAA;AAAA,QACzB;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,MAAA;AAAA,IACN,SAAA;AAAA,IACA,KAAA,EAAAA,MAAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAO,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,KAAM,EAAE,KAAA,CAAM,GAAA,CAAI,CAAC,EAAA,KAAO,UAAU,GAAA,CAAI,EAAE,CAAE,CAAA,CAAE,MAAA,CAAO,OAAO,CAAC,CAAA;AAAA,IACnF,MAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACF;AACF;AAIA,SAAS,SAAA,CACP,OACA,QAAA,EACA,KAAA,EACA,WACA,MAAA,EACA,UAAA,EACA,QAAA,EACA,WAAA,EACA,WAAA,EACQ;AACR,EAAA,MAAM,EAAA,GAAK,MAAM,QAAQ,CAAA;AAEzB,EAAA,MAAM,CAAA,GAAI,EAAA,CAAG,IAAA,CAAK,KAAA,CAAM,qCAAqC,CAAA;AAC7D,EAAA,IAAI,CAAC,CAAA,EAAG,MAAM,IAAI,cAAA,CAAe,4BAAA,EAA8B,GAAG,EAAE,CAAA;AACpE,EAAA,MAAM,KAAA,GAAQ0B,QAAAA,CAAQ,CAAA,CAAE,CAAC,CAAE,CAAA;AAC3B,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,CAAC,CAAA,CAAG,IAAA,EAAK;AAExB,EAAA,IAAI,QAAA,GAAW,KAAA;AACf,EAAA,IAAI,QAAA,GAAW,KAAA;AACf,EAAA,IAAI,KAAA,GAAQ,IAAA;AACZ,EAAA,IAAI,KAAA,CAAM,UAAA,CAAW,UAAU,CAAA,EAAG;AAChC,IAAA,QAAA,GAAW,IAAA;AACX,IAAA,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,UAAA,CAAW,MAAM,EAAE,IAAA,EAAK;AAAA,EAC9C;AACA,EAAA,IAAI,KAAA,KAAU,KAAK,QAAA,GAAW,IAAA;AAAA,OAAA,IACrB,MAAM,MAAA,GAAS,CAAA;AACtB,IAAA,MAAM,IAAI,cAAA,CAAe,CAAA,sCAAA,EAAyC,KAAK,CAAA,CAAA,CAAA,EAAK,GAAG,EAAE,CAAA;AAEnF,EAAA,MAAM,MAAA,GAAS,CAAA,OAAA,EAAU,KAAA,CAAM,MAAM,CAAA,CAAA;AACrC,EAAA,MAAM,IAAA,GAAiB,EAAE,EAAA,EAAI,MAAA,EAAQ,OAAO,QAAA,EAAU,KAAA,EAAO,EAAC,EAAE;AAChE,EAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AACf,EAAA,IAAI,WAAA,CAAY,GAAA,CAAI,KAAK,CAAA,EAAG;AAC1B,IAAA,MAAM,IAAI,cAAA,CAAe,CAAA,sBAAA,EAAyB,KAAK,CAAA,CAAA,CAAA,EAAK,GAAG,EAAE,CAAA;AAAA,EACnE;AACA,EAAA,WAAA,CAAY,GAAA,CAAI,OAAO,IAAI,CAAA;AAE3B,EAAA,IAAI,CAAC,QAAA,EAAU;AAEb,IAAA,OAAO,QAAA,GAAW,CAAA;AAAA,EACpB;AAEA,EAAA,IAAI,IAAI,QAAA,GAAW,CAAA;AACnB,EAAA,OAAO,CAAA,GAAI,MAAM,MAAA,EAAQ;AACvB,IAAA,MAAM,GAAA,GAAM,MAAM,CAAC,CAAA;AACnB,IAAA,IAAI,GAAA,CAAI,IAAA,KAAS,GAAA,EAAK,OAAO,CAAA,GAAI,CAAA;AAEjC,IAAA,IAAI,IAAI,IAAA,CAAK,WAAA,EAAY,CAAE,UAAA,CAAW,MAAM,CAAA,EAAG;AAC7C,MAAA,CAAA,GAAI,SAAA,CAAU,OAAO,CAAA,EAAG,IAAA,EAAM,WAAW,MAAA,EAAQ,UAAA,EAAY,UAAU,WAAW,CAAA;AAClF,MAAA;AAAA,IACF;AAIA,IAAA,IAAI,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,qBAAqB,CAAA,EAAG;AAEzC,MAAA,IAAI,WAAW,IAAA,CAAK,KAAA,CACjB,GAAA,CAAI,CAAC,OAAO,SAAA,CAAU,GAAA,CAAI,EAAE,CAAC,EAC7B,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,EAAG,UAAU,EAAE,CAAA;AAC9B,MAAA,IAAI,CAAC,QAAA,EAAU;AACb,QAAA,MAAM,MAAA,GAAS,GAAG,MAAM,CAAA,eAAA,CAAA;AACxB,QAAA,QAAA,GAAW,EAAE,IAAI,MAAA,EAAQ,KAAA,EAAO,IAAI,MAAA,EAAQ,QAAA,EAAU,EAAC,EAAE;AACzD,QAAA,SAAA,CAAU,GAAA,CAAI,QAAQ,QAAQ,CAAA;AAC9B,QAAA,IAAA,CAAK,KAAA,CAAM,KAAK,MAAM,CAAA;AAAA,MACxB;AACA,MAAA,CAAA,GAAI,eAAA,CAAgB,OAAO,CAAA,EAAG,IAAA,EAAM,UAAU,MAAA,EAAQ,UAAA,EAAY,UAAU,WAAW,CAAA;AACvF,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAI,cAAA;AAAA,MACR,kCAAkC,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA,CAAA;AAAA,MACvD,GAAA,CAAI;AAAA,KACN;AAAA,EACF;AACA,EAAA,MAAM,IAAI,cAAA,CAAe,CAAA,qCAAA,CAAA,EAAyC,EAAA,CAAG,EAAE,CAAA;AACzE;AAEA,SAAS,SAAA,CACP,OACA,QAAA,EACA,IAAA,EACA,WACA,MAAA,EACA,UAAA,EACA,UACA,WAAA,EACQ;AACR,EAAA,MAAM,EAAA,GAAK,MAAM,QAAQ,CAAA;AACzB,EAAA,MAAM,CAAA,GAAI,EAAA,CAAG,IAAA,CAAK,KAAA,CAAM,uCAAuC,CAAA;AAC/D,EAAA,IAAI,CAAC,CAAA,EAAG,MAAM,IAAI,cAAA,CAAe,4BAAA,EAA8B,GAAG,EAAE,CAAA;AACpE,EAAA,MAAM,KAAA,GAAQA,QAAAA,CAAQ,CAAA,CAAE,CAAC,CAAE,CAAA;AAC3B,EAAA,MAAM,QAAA,GAAW,EAAA,CAAG,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA;AAErC,EAAA,IAAI,KAAK,QAAA,EAAU;AACjB,IAAA,MAAM,IAAI,cAAA;AAAA,MACR,CAAA,gBAAA,EAAmB,KAAK,KAAK,CAAA,sBAAA,CAAA;AAAA,MAC7B,EAAA,CAAG;AAAA,KACL;AAAA,EACF;AAEA,EAAA,MAAM,SAAS,CAAA,EAAG,IAAA,CAAK,EAAE,CAAA,OAAA,EAAU,IAAA,CAAK,MAAM,MAAM,CAAA,CAAA;AACpD,EAAA,MAAM,IAAA,GAAiB,EAAE,EAAA,EAAI,MAAA,EAAQ,KAAA,EAAO,QAAQ,IAAA,CAAK,EAAA,EAAI,QAAA,EAAU,EAAC,EAAE;AAC1E,EAAA,SAAA,CAAU,GAAA,CAAI,QAAQ,IAAI,CAAA;AAC1B,EAAA,IAAA,CAAK,KAAA,CAAM,KAAK,MAAM,CAAA;AAEtB,EAAA,IAAI,CAAC,QAAA,EAAU,OAAO,QAAA,GAAW,CAAA;AAEjC,EAAA,IAAI,IAAI,QAAA,GAAW,CAAA;AACnB,EAAA,OAAO,CAAA,GAAI,MAAM,MAAA,EAAQ;AACvB,IAAA,MAAM,GAAA,GAAM,MAAM,CAAC,CAAA;AACnB,IAAA,IAAI,GAAA,CAAI,IAAA,KAAS,GAAA,EAAK,OAAO,CAAA,GAAI,CAAA;AACjC,IAAA,CAAA,GAAI,eAAA,CAAgB,OAAO,CAAA,EAAG,IAAA,EAAM,MAAM,MAAA,EAAQ,UAAA,EAAY,UAAU,WAAW,CAAA;AAAA,EACrF;AACA,EAAA,MAAM,IAAI,cAAA,CAAe,CAAA,qCAAA,CAAA,EAAyC,EAAA,CAAG,EAAE,CAAA;AACzE;AAIA,SAAS,eAAA,CACP,OACA,GAAA,EACA,IAAA,EACA,MACA,MAAA,EACA,UAAA,EACA,UACA,WAAA,EACQ;AACR,EAAA,MAAM,EAAA,GAAK,MAAM,GAAG,CAAA;AACpB,EAAA,MAAM,CAAA,GAAI,EAAA,CAAG,IAAA,CAAK,KAAA,CAAM,+BAA+B,CAAA;AACvD,EAAA,IAAI,CAAC,CAAA,EAAG;AACN,IAAA,MAAM,IAAI,cAAA;AAAA,MACR,iCAAiC,EAAA,CAAG,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,EAAA,CAAA;AAAA,MACrD,EAAA,CAAG;AAAA,KACL;AAAA,EACF;AACA,EAAA,MAAM,EAAA,GAAK,EAAE,CAAC,CAAA;AACd,EAAA,IAAI,IAAA,GAAO,CAAA,CAAE,CAAC,CAAA,CAAG,IAAA,EAAK;AAEtB,EAAA,IAAI,WAAA,CAAY,GAAA,CAAI,EAAE,CAAA,EAAG;AACvB,IAAA,MAAM,IAAI,cAAA,CAAe,CAAA,cAAA,EAAiB,EAAE,CAAA,CAAA,CAAA,EAAK,GAAG,EAAE,CAAA;AAAA,EACxD;AAGA,EAAA,MAAM,KAAK,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA,CAAE,CAAC,EAAG,WAAA,EAAY;AAC7C,EAAA,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,MAAM,EAAE,IAAA,EAAK;AAElC,EAAA,IAAI,EAAA,KAAO,OAAA,IAAW,EAAA,KAAO,KAAA,IAAS,OAAO,cAAA,EAAgB;AAE3D,IAAA,IAAI,OAAA,GAAgC,MAAA;AACpC,IAAA,MAAM,IAAA,GAAO,KAAK,KAAA,CAAM,KAAK,EAAE,CAAC,CAAA,EAAG,aAAY,IAAK,EAAA;AACpD,IAAA,IAAI,IAAA,KAAS,SAAA,IAAa,IAAA,KAAS,OAAA,IAAW,SAAS,MAAA,EAAQ;AAC7D,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAM,EAAE,IAAA,EAAK;AAAA,IACtC;AACA,IAAA,IAAI,KAAA;AACJ,IAAA,MAAM,CAAA,GAAI,WAAW,IAAI,CAAA;AACzB,IAAA,IAAI,CAAA,UAAW,CAAA,CAAE,KAAA;AAGjB,IAAA,IAAI,UAAA,GAAsC,OAAA;AAC1C,IAAA,IAAI,EAAA,KAAO,KAAA,IAAS,OAAA,KAAY,MAAA,EAAQ,UAAA,GAAa,OAAA;AACrD,IAAA,IAAI,EAAA,KAAO,KAAA,IAAS,OAAA,KAAY,MAAA,EAAQ,UAAA,GAAa,OAAA;AACrD,IAAA,MAAM,EAAA,GAAgB;AAAA,MACpB,EAAA;AAAA,MACA,IAAA,EAAM,EAAA;AAAA,MACN,OAAA;AAAA,MACA,UAAA;AAAA,MACA,KAAA;AAAA,MACA,QAAQ,IAAA,CAAK,EAAA;AAAA,MACb,QAAQ,IAAA,CAAK;AAAA,KACf;AACA,IAAA,MAAA,CAAO,KAAK,EAAE,CAAA;AACd,IAAA,IAAA,CAAK,QAAA,CAAS,KAAK,EAAE,CAAA;AACrB,IAAA,WAAA,CAAY,GAAA,CAAI,IAAI,EAAE,MAAA,EAAQ,KAAK,EAAA,EAAI,MAAA,EAAQ,IAAA,CAAK,EAAA,EAAI,CAAA;AACxD,IAAA,OAAO,GAAA,GAAM,CAAA;AAAA,EACf;AAEA,EAAA,IAAI,OAAO,MAAA,EAAQ;AAEjB,IAAA,IAAI,MAAA,GAAyB,UAAA;AAC7B,IAAA,MAAM,IAAA,GAAO,KAAK,KAAA,CAAM,KAAK,EAAE,CAAC,CAAA,EAAG,aAAY,IAAK,EAAA;AACpD,IAAA,IACE,IAAA,KAAS,MAAA,IAAU,IAAA,KAAS,SAAA,IAAa,IAAA,KAAS,MAAA,IAClD,IAAA,KAAS,SAAA,IAAa,IAAA,KAAS,QAAA,IAAY,IAAA,KAAS,QAAA,EACpD;AACA,MAAA,MAAA,GAAS,IAAA;AACT,MAAA,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAM,EAAE,IAAA,EAAK;AAAA,IACtC;AACA,IAAA,MAAM,CAAA,GAAI,WAAW,IAAI,CAAA;AACzB,IAAA,IAAI,CAAC,CAAA,EAAG;AACN,MAAA,MAAM,IAAI,cAAA,CAAe,CAAA,MAAA,EAAS,EAAE,CAAA,0BAAA,CAAA,EAA8B,GAAG,EAAE,CAAA;AAAA,IACzE;AACA,IAAA,MAAM,CAAA,GAAkB;AAAA,MACtB,EAAA;AAAA,MACA,IAAA,EAAM,MAAA;AAAA,MACN,MAAA;AAAA,MACA,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,QAAQ,IAAA,CAAK,EAAA;AAAA,MACb,QAAQ,IAAA,CAAK;AAAA,KACf;AACA,IAAA,UAAA,CAAW,KAAK,CAAC,CAAA;AACjB,IAAA,IAAA,CAAK,QAAA,CAAS,KAAK,EAAE,CAAA;AACrB,IAAA,WAAA,CAAY,GAAA,CAAI,IAAI,EAAE,MAAA,EAAQ,KAAK,EAAA,EAAI,MAAA,EAAQ,IAAA,CAAK,EAAA,EAAI,CAAA;AACxD,IAAA,OAAO,GAAA,GAAM,CAAA;AAAA,EACf;AAEA,EAAA,IAAI,OAAO,YAAA,EAAc;AACvB,IAAA,MAAM,CAAA,GAAI,WAAW,IAAI,CAAA;AACzB,IAAA,IAAI,CAAC,CAAA,EAAG;AACN,MAAA,MAAM,IAAI,cAAA;AAAA,QACR,eAAe,EAAE,CAAA,0BAAA,CAAA;AAAA,QACjB,EAAA,CAAG;AAAA,OACL;AAAA,IACF;AACA,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,IAAA,CAAK,IAAA,EAAK;AAC1B,IAAA,IAAI,KAAA,KAAU,EAAA,IAAM,KAAA,KAAU,WAAA,EAAa;AACzC,MAAA,MAAM,IAAI,cAAA;AAAA,QACR,CAAA,YAAA,EAAe,EAAE,CAAA,mDAAA,EAAsD,KAAK,CAAA,EAAA,CAAA;AAAA,QAC5E,EAAA,CAAG;AAAA,OACL;AAAA,IACF;AACA,IAAA,MAAM,CAAA,GAAkB;AAAA,MACtB,EAAA;AAAA,MACA,IAAA,EAAM,sBAAA;AAAA,MACN,MAAA,EAAQ,UAAA;AAAA,MACR,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,QAAQ,IAAA,CAAK,EAAA;AAAA,MACb,QAAQ,IAAA,CAAK;AAAA,KACf;AACA,IAAA,UAAA,CAAW,KAAK,CAAC,CAAA;AACjB,IAAA,IAAA,CAAK,QAAA,CAAS,KAAK,EAAE,CAAA;AACrB,IAAA,WAAA,CAAY,GAAA,CAAI,IAAI,EAAE,MAAA,EAAQ,KAAK,EAAA,EAAI,MAAA,EAAQ,IAAA,CAAK,EAAA,EAAI,CAAA;AACxD,IAAA,OAAO,GAAA,GAAM,CAAA;AAAA,EACf;AAEA,EAAA,IAAI,OAAO,SAAA,EAAW;AACpB,IAAA,MAAM,IAAA,GAAO,KAAK,KAAA,CAAM,KAAK,EAAE,CAAC,CAAA,EAAG,aAAY,IAAK,EAAA;AACpD,IAAA,IAAI,WAAA;AACJ,IAAA,IAAI,SAAS,KAAA,IAAS,IAAA,KAAS,QAAQ,IAAA,KAAS,KAAA,IAAS,SAAS,OAAA,EAAS;AACzE,MAAA,WAAA,GAAc,IAAA;AACd,MAAA,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAM,EAAE,IAAA,EAAK;AAAA,IACtC,CAAA,MAAO;AACL,MAAA,MAAM,IAAI,cAAA;AAAA,QACR,CAAA,SAAA,EAAY,EAAE,CAAA,4CAAA,EAA+C,IAAI,CAAA,EAAA,CAAA;AAAA,QACjE,EAAA,CAAG;AAAA,OACL;AAAA,IACF;AACA,IAAA,IAAI,KAAA;AACJ,IAAA,MAAM,CAAA,GAAI,WAAW,IAAI,CAAA;AACzB,IAAA,IAAI,CAAA,UAAW,CAAA,CAAE,KAAA;AACjB,IAAA,MAAM,CAAA,GAAiB;AAAA,MACrB,EAAA;AAAA,MACA,WAAA;AAAA,MACA,KAAA;AAAA,MACA,QAAQ,IAAA,CAAK,EAAA;AAAA,MACb,QAAQ,IAAA,CAAK;AAAA,KACf;AACA,IAAA,QAAA,CAAS,KAAK,CAAC,CAAA;AACf,IAAA,IAAA,CAAK,QAAA,CAAS,KAAK,EAAE,CAAA;AACrB,IAAA,WAAA,CAAY,GAAA,CAAI,IAAI,EAAE,MAAA,EAAQ,KAAK,EAAA,EAAI,MAAA,EAAQ,IAAA,CAAK,EAAA,EAAI,CAAA;AACxD,IAAA,OAAO,GAAA,GAAM,CAAA;AAAA,EACf;AAEA,EAAA,MAAM,IAAI,cAAA;AAAA,IACR,CAAA,0BAAA,EAA6B,EAAE,CAAA,UAAA,EAAa,EAAE,CAAA,CAAA,CAAA;AAAA,IAC9C,EAAA,CAAG;AAAA,GACL;AACF;AAIA,SAAS,aAAA,CACP,EAAA,EACA,KAAA,EACA,WAAA,EACA,WAAA,EACM;AAEN,EAAA,IAAI,EAAA,CAAG,IAAA,CAAK,WAAA,EAAY,KAAM,OAAA,EAAS;AAEvC,EAAA,MAAM3B,QAAO,EAAA,CAAG,IAAA;AAGhB,EAAA,SAAS,aAAa,CAAA,EAAgD;AACpE,IAAA,MAAM,CAAA,GAAI,EAAE,SAAA,EAAU;AACtB,IAAA,IAAI,CAAA,CAAE,UAAA,CAAW,GAAG,CAAA,EAAG;AACrB,MAAA,MAAM,CAAA,GAAI,WAAW,CAAC,CAAA;AACtB,MAAA,IAAI,CAAC,GAAG,OAAO,IAAA;AACf,MAAA,OAAO,EAAE,EAAA,EAAI,CAAA,CAAE,KAAA,EAAO,IAAA,EAAM,EAAE,IAAA,EAAK;AAAA,IACrC;AACA,IAAA,MAAM,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,sBAAsB,CAAA;AACxC,IAAA,IAAI,CAAC,GAAG,OAAO,IAAA;AACf,IAAA,OAAO,EAAE,EAAA,EAAI,CAAA,CAAE,CAAC,CAAA,EAAI,IAAA,EAAM,CAAA,CAAE,KAAA,CAAM,CAAA,CAAE,CAAC,CAAA,CAAE,MAAM,CAAA,EAAE;AAAA,EACjD;AAEA,EAAA,MAAM,IAAA,GAAO,aAAaA,KAAI,CAAA;AAC9B,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,MAAM,IAAI,cAAA;AAAA,MACR,CAAA,uCAAA,CAAA;AAAA,MACA,EAAA,CAAG;AAAA,KACL;AAAA,EACF;AACA,EAAA,IAAI,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,SAAA,EAAU;AAG/B,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,YAAA;AACJ,EAAA,IAAI,cAAA;AAEJ,EAAA,IAAI,IAAA,CAAK,UAAA,CAAW,KAAK,CAAA,EAAG;AAC1B,IAAA,IAAA,GAAO,SAAA;AACP,IAAA,YAAA,GAAe,CAAA;AAAA,EACjB,CAAA,MAAA,IAAW,IAAA,CAAK,UAAA,CAAW,KAAK,CAAA,EAAG;AAEjC,IAAA,IAAA,GAAO,aAAA;AACP,IAAA,IAAI,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAC,EAAE,SAAA,EAAU;AAChC,IAAA,MAAM,CAAA,GAAI,WAAW,CAAC,CAAA;AACtB,IAAA,IAAI,CAAA,EAAG;AACL,MAAA,cAAA,GAAiB,CAAA,CAAE,KAAA;AACnB,MAAA,CAAA,GAAI,CAAA,CAAE,KAAK,SAAA,EAAU;AAAA,IACvB;AACA,IAAA,IAAI,CAAC,CAAA,CAAE,UAAA,CAAW,KAAK,CAAA,EAAG;AACxB,MAAA,MAAM,IAAI,cAAA;AAAA,QACR,CAAA,yCAAA,EAA4C,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,EAAA,CAAA;AAAA,QAC1D,EAAA,CAAG;AAAA,OACL;AAAA,IACF;AACA,IAAA,YAAA,GAAe,IAAA,CAAK,MAAA,GAAS,CAAA,CAAE,MAAA,GAAS,CAAA;AAAA,EAC1C,CAAA,MAAA,IAAW,IAAA,CAAK,UAAA,CAAW,KAAK,CAAA,EAAG;AACjC,IAAA,IAAA,GAAO,SAAA;AACP,IAAA,IAAI,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAC,EAAE,SAAA,EAAU;AAChC,IAAA,MAAM,CAAA,GAAI,WAAW,CAAC,CAAA;AACtB,IAAA,IAAI,CAAA,EAAG;AACL,MAAA,cAAA,GAAiB,CAAA,CAAE,KAAA;AACnB,MAAA,CAAA,GAAI,CAAA,CAAE,KAAK,SAAA,EAAU;AAAA,IACvB;AACA,IAAA,IAAI,CAAC,CAAA,CAAE,UAAA,CAAW,KAAK,CAAA,EAAG;AACxB,MAAA,MAAM,IAAI,cAAA;AAAA,QACR,CAAA,qCAAA,EAAwC,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,EAAA,CAAA;AAAA,QACtD,EAAA,CAAG;AAAA,OACL;AAAA,IACF;AACA,IAAA,YAAA,GAAe,IAAA,CAAK,MAAA,GAAS,CAAA,CAAE,MAAA,GAAS,CAAA;AAAA,EAC1C,CAAA,MAAA,IAAW,IAAA,CAAK,UAAA,CAAW,KAAK,CAAA,EAAG;AACjC,IAAA,IAAA,GAAO,UAAA;AACP,IAAA,YAAA,GAAe,CAAA;AAAA,EACjB,CAAA,MAAO;AACL,IAAA,MAAM,IAAI,cAAA;AAAA,MACR,CAAA,2BAAA,EAA8B,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,kCAAA,CAAA;AAAA,MAC/C,EAAA,CAAG;AAAA,KACL;AAAA,EACF;AAEA,EAAA,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,YAAY,CAAA,CAAE,SAAA,EAAU;AAC1C,EAAA,MAAM,IAAA,GAAO,aAAa,IAAI,CAAA;AAC9B,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,MAAM,IAAI,cAAA,CAAe,CAAA,uCAAA,CAAA,EAA2C,EAAA,CAAG,EAAE,CAAA;AAAA,EAC3E;AACA,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,SAAA,EAAU;AAGrC,EAAA,IAAI,KAAA,GAA4B,cAAA;AAChC,EAAA,IAAI,QAAA,CAAS,UAAA,CAAW,GAAG,CAAA,EAAG;AAC5B,IAAA,MAAM,CAAA,GAAI,UAAA,CAAW,QAAA,CAAS,KAAA,CAAM,CAAC,CAAC,CAAA;AACtC,IAAA,IAAI,CAAA,UAAW,CAAA,CAAE,KAAA;AAAA,EACnB;AAIA,EAAA,IAAI,SAAS,SAAA,EAAW;AACtB,IAAA,IAAI,WAAA,CAAY,IAAI,IAAA,CAAK,EAAE,KAAK,WAAA,CAAY,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,EAAG;AACxD,MAAA,MAAM,IAAI,cAAA;AAAA,QACR,CAAA,mDAAA,CAAA;AAAA,QACA,EAAA,CAAG;AAAA,OACL;AAAA,IACF;AACA,IAAA,IAAI,CAAC,WAAA,CAAY,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,EAAG;AAC7B,MAAA,MAAM,IAAI,cAAA,CAAe,CAAA,mBAAA,EAAsB,KAAK,EAAE,CAAA,CAAA,CAAA,EAAK,GAAG,EAAE,CAAA;AAAA,IAClE;AACA,IAAA,IAAI,CAAC,WAAA,CAAY,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,EAAG;AAC7B,MAAA,MAAM,IAAI,cAAA,CAAe,CAAA,mBAAA,EAAsB,KAAK,EAAE,CAAA,CAAA,CAAA,EAAK,GAAG,EAAE,CAAA;AAAA,IAClE;AAAA,EACF,CAAA,MAAO;AACL,IAAA,MAAM,MAAA,GAAS,YAAY,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,IAAK,WAAA,CAAY,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA;AAClE,IAAA,MAAM,IAAA,GAAO,YAAY,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,IAAK,WAAA,CAAY,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA;AAChE,IAAA,IAAI,CAAC,MAAA,EAAQ,MAAM,IAAI,cAAA,CAAe,mBAAmB,IAAA,CAAK,EAAE,CAAA,iBAAA,CAAA,EAAqB,EAAA,CAAG,EAAE,CAAA;AAC1F,IAAA,IAAI,CAAC,IAAA,EAAM,MAAM,IAAI,cAAA,CAAe,mBAAmB,IAAA,CAAK,EAAE,CAAA,iBAAA,CAAA,EAAqB,EAAA,CAAG,EAAE,CAAA;AAAA,EAC1F;AAEA,EAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,IAAA,CAAK,EAAA,EAAI,IAAI,IAAA,CAAK,EAAA,EAAI,IAAA,EAAM,KAAA,EAAO,CAAA;AACxD;;;ACzmBO,IAAM,UAAA,GAAa;AAAA,EACxB,SAAA,EAAW,GAAA;AAAA,EACX,UAAA,EAAY,EAAA;AAAA,EACZ,WAAA,EAAa,EAAA;AAAA,EACb,WAAA,EAAa,EAAA;AAAA;AAAA,EAEb,QAAA,EAAU,GAAA;AAAA;AAAA,EAEV,QAAA,EAAU,EAAA;AAAA;AAAA,EAEV,QAAA,EAAU,EAAA;AAAA,EACV,QAAA,EAAU,EAAA;AAAA;AAAA,EAEV,cAAA,EAAgB,EAAA;AAAA;AAAA,EAEhB,cAAA,EAAgB,EAAA;AAAA;AAAA,EAEhB,aAAA,EAAe,EAAA;AAAA;AAAA,EAEf,OAAA,EAAS,EAAA;AAAA;AAAA,EAET,OAAA,EAAS,EAAA;AAAA;AAAA,EAET,cAAA,EAAgB,EAAA;AAAA;AAAA,EAEhB,KAAA,EAAO,GAAA;AAAA,EACP,QAAA,EAAU,EAEZ,CAAA;AAEA,SAAS,MAAM,IAAA,EAAuB;AACpC,EAAA,OACG,IAAA,IAAQ,KAAA,IAAU,IAAA,IAAQ,KAAA,IAC1B,IAAA,IAAQ,SAAU,IAAA,IAAQ,KAAA,IAC1B,IAAA,IAAQ,KAAA,IAAU,IAAA,IAAQ,KAAA;AAE/B;AAEA,SAAS,aAAa,CAAA,EAAmB;AACvC,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,KAAA,MAAW,MAAM,CAAA,EAAG;AAClB,IAAA,MAAM,CAAA,GAAI,EAAA,CAAG,WAAA,CAAY,CAAC,CAAA,IAAK,CAAA;AAC/B,IAAA,CAAA,IAAK,KAAA,CAAM,CAAC,CAAA,GAAI,UAAA,CAAW,WAAW,UAAA,CAAW,KAAA;AAAA,EACnD;AACA,EAAA,OAAO,CAAA;AACT;AAEA,SAAS,OAAO,CAAA,EAA6C;AAC3D,EAAA,IAAI,UAAU,CAAA,KAAM,CAAA,CAAE,SAAS,MAAA,IAAU,CAAA,CAAE,SAAS,sBAAA,CAAA,EAAyB;AAC3E,IAAA,MAAM,IAAA,GAAO,YAAA,CAAa,CAAA,CAAE,KAAK,CAAA,GAAI,EAAA;AACrC,IAAA,OAAO;AAAA,MACL,CAAA,EAAG,KAAK,GAAA,CAAI,UAAA,CAAW,WAAW,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,IAAI,CAAC,CAAA;AAAA,MACrD,GAAG,UAAA,CAAW;AAAA,KAChB;AAAA,EACF;AACA,EAAA,IAAI,iBAAiB,CAAA,EAAG;AACtB,IAAA,OAAO,EAAE,CAAA,EAAG,UAAA,CAAW,WAAA,EAAa,CAAA,EAAG,WAAW,WAAA,EAAY;AAAA,EAChE;AAEA,EAAA,MAAM,IAAI,UAAA,CAAW,WAAA;AACrB,EAAA,OAAO,EAAE,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAG,IAAI,CAAA,EAAE;AAC9B;AAEO,SAAS,WAAW,GAAA,EAAgC;AACzD,EAAA,MAAM,UAAA,GAA+B;AAAA,IACnC,GAAG,GAAA,CAAI,MAAA;AAAA,IACP,GAAG,GAAA,CAAI,UAAA;AAAA,IACP,GAAG,GAAA,CAAI;AAAA,GACT;AACA,EAAA,MAAM,OAAA,uBAAc,GAAA,EAA4B;AAChD,EAAA,KAAA,MAAW,KAAK,UAAA,EAAY,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,IAAI,CAAC,CAAA;AAG/C,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAoB;AACzC,EAAA,KAAA,MAAW,IAAA,IAAQ,IAAI,KAAA,EAAO;AAC5B,IAAA,IAAI,KAAK,QAAA,EAAU;AACnB,IAAA,SAAA,CAAU,GAAA,EAAK,MAAM,QAAQ,CAAA;AAAA,EAC/B;AAIA,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAoB;AACzC,EAAA,MAAM,eAAA,uBAAsB,GAAA,EAAoB;AAEhD,EAAA,KAAA,MAAW,IAAA,IAAQ,IAAI,KAAA,EAAO;AAE5B,IAAA,MAAM,KAAA,uBAAY,GAAA,EAAsB;AACxC,IAAA,KAAA,MAAW,OAAA,IAAW,KAAK,QAAA,EAAU;AACnC,MAAA,MAAM,GAAA,GAAM,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA,IAAK,CAAA;AACrC,MAAA,IAAI,CAAC,MAAM,GAAA,CAAI,GAAG,GAAG,KAAA,CAAM,GAAA,CAAI,GAAA,EAAK,EAAE,CAAA;AACtC,MAAA,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA,CAAG,IAAA,CAAK,OAAO,CAAA;AAAA,IAC9B;AAEA,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,KAAA,MAAW,GAAG,GAAG,CAAA,IAAK,KAAA,EAAO;AAC3B,MAAA,GAAA,CAAI,OAAA,CAAQ,CAAC,EAAA,EAAI,EAAA,KAAO,SAAS,GAAA,CAAI,EAAA,EAAI,EAAE,CAAC,CAAA;AAC5C,MAAA,IAAI,GAAA,CAAI,MAAA,GAAS,OAAA,EAAS,OAAA,GAAU,GAAA,CAAI,MAAA;AAAA,IAC1C;AACA,IAAA,eAAA,CAAgB,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,OAAO,CAAA;AAAA,EACtC;AAGA,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,KAAA,MAAW,KAAK,QAAA,CAAS,MAAA,IAAU,IAAI,CAAA,GAAI,QAAQ,MAAA,GAAS,CAAA;AAC5D,EAAA,MAAM,UAAU,MAAA,GAAS,CAAA;AAGzB,EAAA,MAAM,UAAU,UAAA,CAAW,OAAA;AAC3B,EAAA,MAAM,WAAW,UAAA,CAAW,QAAA;AAC5B,EAAA,MAAM,WAAW,UAAA,CAAW,QAAA;AAC5B,EAAA,MAAM,SAAA,GAAY,UAAA,CAAW,cAAA,GAAiB,UAAA,CAAW,cAAA;AAEzD,EAAA,MAAM,MAAA,GAAS,OAAA,GAAU,QAAA,GAAW,CAAA,GAAI,UAAA,CAAW,QAAA;AACnD,EAAA,MAAM,YAAY,SAAA,GAAY,MAAA;AAE9B,EAAA,MAAM,cAAgC,EAAC;AACvC,EAAA,MAAM,cAAgC,EAAC;AACvC,EAAA,MAAM,gBAAoC,EAAC;AAE3C,EAAA,IAAI,OAAA,GAAU,OAAA;AAEd,EAAA,KAAA,MAAW,IAAA,IAAQ,IAAI,KAAA,EAAO;AAC5B,IAAA,MAAM,KAAA,GAAQ,OAAA;AAEd,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,MAAM,IAAI,UAAA,CAAW,cAAA;AACrB,MAAA,WAAA,CAAY,IAAA,CAAK;AAAA,QACf,IAAA;AAAA,QACA,CAAA,EAAG,OAAA;AAAA,QACH,CAAA,EAAG,KAAA;AAAA,QACH,KAAA,EAAO,SAAA;AAAA,QACP,MAAA,EAAQ,CAAA;AAAA,QACR,MAAA,EAAQ,OAAA;AAAA,QACR,MAAA,EAAQ,KAAA;AAAA,QACR,YAAY,UAAA,CAAW;AAAA,OACxB,CAAA;AACD,MAAA,OAAA,IAAW,IAAI,UAAA,CAAW,OAAA;AAC1B,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,UAAA,GAAa,KAAA;AACjB,IAAA,MAAM,cAAc,IAAA,CAAK,KAAA;AACzB,IAAA,MAAM,cAAA,GAAiB,KAAA;AACvB,IAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,IAAA,KAAA,MAAW,UAAU,WAAA,EAAa;AAChC,MAAA,MAAM,IAAA,GAAO,IAAI,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,MAAM,CAAA;AAClD,MAAA,MAAM,IAAA,GAAO,eAAA,CAAgB,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,IAAK,CAAA;AAC7C,MAAA,MAAM,QAAQ,IAAA,CAAK,GAAA;AAAA,QACjB,UAAA,CAAW,aAAA;AAAA,QACX,IAAA,GAAO,QAAA,GAAW,CAAA,GAAI,UAAA,CAAW;AAAA,OACnC;AACA,MAAA,MAAM,KAAA,GAAQ,UAAU,UAAA,CAAW,cAAA;AACnC,MAAA,MAAM,KAAA,GAAQ,YAAY,UAAA,CAAW,cAAA;AACrC,MAAA,WAAA,CAAY,IAAA,CAAK;AAAA,QACf,IAAA;AAAA,QACA,CAAA,EAAG,KAAA;AAAA,QACH,CAAA,EAAG,UAAA;AAAA,QACH,KAAA,EAAO,KAAA;AAAA,QACP,MAAA,EAAQ,KAAA;AAAA,QACR,MAAA,EAAQ,KAAA;AAAA,QACR,MAAA,EAAQ,UAAA;AAAA,QACR,aAAa,UAAA,CAAW;AAAA,OACzB,CAAA;AAGD,MAAA,MAAM,aAAA,GAAgB,KAAA,GAAQ,UAAA,CAAW,cAAA,GAAiB,UAAA,CAAW,QAAA;AACrE,MAAA,MAAM,YAAA,GAAe,aAAa,UAAA,CAAW,QAAA;AAE7C,MAAA,KAAA,MAAW,OAAA,IAAW,KAAK,QAAA,EAAU;AACnC,QAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA;AAC/B,QAAA,MAAM,GAAA,GAAM,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA,IAAK,CAAA;AACrC,QAAA,MAAM,GAAA,GAAM,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA,IAAK,CAAA;AACrC,QAAA,MAAM,EAAA,GAAK,aAAA,GAAgB,GAAA,GAAM,QAAA,GAAW,QAAA,GAAW,CAAA;AACvD,QAAA,MAAM,EAAA,GAAK,YAAA,GAAe,GAAA,GAAM,QAAA,GAAW,QAAA,GAAW,CAAA;AACtD,QAAA,MAAM,EAAE,CAAA,EAAG,CAAA,EAAE,GAAI,OAAO,GAAG,CAAA;AAC3B,QAAA,aAAA,CAAc,IAAA,CAAK;AAAA,UACjB,GAAA;AAAA,UACA,CAAA,EAAG,KAAK,CAAA,GAAI,CAAA;AAAA,UACZ,CAAA,EAAG,KAAK,CAAA,GAAI,CAAA;AAAA,UACZ,KAAA,EAAO,CAAA;AAAA,UACP,MAAA,EAAQ;AAAA,SACT,CAAA;AAAA,MACH;AAEA,MAAA,UAAA,IAAc,KAAA;AACd,MAAA,KAAA,IAAS,KAAA;AAAA,IACX;AAEA,IAAA,WAAA,CAAY,IAAA,CAAK;AAAA,MACf,IAAA;AAAA,MACA,CAAA,EAAG,OAAA;AAAA,MACH,CAAA,EAAG,cAAA;AAAA,MACH,KAAA,EAAO,SAAA;AAAA,MACP,MAAA,EAAQ,KAAA;AAAA,MACR,MAAA,EAAQ,OAAA;AAAA,MACR,MAAA,EAAQ,cAAA;AAAA,MACR,YAAY,UAAA,CAAW;AAAA,KACxB,CAAA;AAED,IAAA,OAAA,GAAU,cAAA,GAAiB,QAAQ,UAAA,CAAW,OAAA;AAAA,EAChD;AAEA,EAAA,MAAM,WAAA,GAAc,OAAA,GAAU,UAAA,CAAW,OAAA,GAAU,OAAA;AACnD,EAAA,MAAM,UAAA,GAAa,UAAU,SAAA,GAAY,OAAA;AAGzC,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAA4D;AAClF,EAAA,KAAA,MAAW,MAAM,aAAA,EAAe;AAC9B,IAAA,SAAA,CAAU,GAAA,CAAI,EAAA,CAAG,GAAA,CAAI,EAAA,EAAI;AAAA,MACvB,CAAA,EAAG,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,KAAA,GAAQ,CAAA;AAAA,MACrB,CAAA,EAAG,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,MAAA,GAAS,CAAA;AAAA,MACtB,GAAG,EAAA,CAAG,KAAA;AAAA,MACN,GAAG,EAAA,CAAG;AAAA,KACP,CAAA;AAAA,EACH;AACA,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAA4B;AACnD,EAAA,KAAA,MAAW,KAAK,WAAA,EAAa,UAAA,CAAW,IAAI,CAAA,CAAE,IAAA,CAAK,OAAO,CAAC,CAAA;AAE3D,EAAA,MAAM,cAAgC,EAAC;AACvC,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,KAAA,EAAO;AACzB,IAAA,IAAI,CAAA,CAAE,SAAS,SAAA,EAAW;AACxB,MAAA,WAAA,CAAY,IAAA,CAAK,gBAAA,CAAiB,CAAA,EAAG,SAAA,EAAW,UAAU,CAAC,CAAA;AAAA,IAC7D,CAAA,MAAO;AACL,MAAA,MAAMW,KAAAA,GAAO,iBAAA,CAAkB,CAAA,EAAG,SAAkB,CAAA;AACpD,MAAA,WAAA,CAAY,KAAKA,KAAI,CAAA;AAAA,IACvB;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,GAAA;AAAA,IACA,KAAA,EAAO,WAAA;AAAA,IACP,KAAA,EAAO,WAAA;AAAA,IACP,OAAA,EAAS,aAAA;AAAA,IACT,KAAA,EAAO,WAAA;AAAA,IACP,KAAA,EAAO,UAAA;AAAA,IACP,MAAA,EAAQ;AAAA,GACV;AACF;AAIA,SAAS,SAAA,CACP,GAAA,EACA,IAAA,EACA,QAAA,EACM;AAEN,EAAA,MAAM,MAAA,GAAS,CAAC,EAAA,KAAwB;AACtC,IAAA,MAAM,EAAA,GAAK,IAAI,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,EAAE,CAAA;AAC7C,IAAA,IAAI,EAAA,EAAI,OAAO,EAAA,CAAG,MAAA,KAAW,IAAA,CAAK,EAAA;AAClC,IAAA,MAAM,CAAA,GAAI,IAAI,UAAA,CAAW,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,EAAE,CAAA;AAChD,IAAA,IAAI,CAAA,EAAG,OAAO,CAAA,CAAE,MAAA,KAAW,IAAA,CAAK,EAAA;AAChC,IAAA,MAAM,CAAA,GAAI,IAAI,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,EAAE,CAAA;AAC9C,IAAA,IAAI,CAAA,EAAG,OAAO,CAAA,CAAE,MAAA,KAAW,IAAA,CAAK,EAAA;AAChC,IAAA,OAAO,KAAA;AAAA,EACT,CAAA;AACA,EAAA,MAAM,GAAA,GAAM;AAAA,IACV,GAAG,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,IAAA,CAAK,EAAE,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,EAAE,CAAA;AAAA,IACjE,GAAG,GAAA,CAAI,UAAA,CAAW,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,IAAA,CAAK,EAAE,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,EAAE,CAAA;AAAA,IACrE,GAAG,GAAA,CAAI,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,IAAA,CAAK,EAAE,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,EAAE;AAAA,GACrE;AAGA,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAsB;AACtC,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAoB;AACtC,EAAA,KAAA,MAAW,MAAM,GAAA,EAAK;AACpB,IAAA,GAAA,CAAI,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AACd,IAAA,KAAA,CAAM,GAAA,CAAI,IAAI,CAAC,CAAA;AAAA,EACjB;AACA,EAAA,MAAM,WAAoC,EAAC;AAC3C,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,KAAA,EAAO;AACzB,IAAA,IAAI,CAAA,CAAE,SAAS,SAAA,EAAW;AAC1B,IAAA,IAAI,CAAC,OAAO,CAAA,CAAE,IAAI,KAAK,CAAC,MAAA,CAAO,CAAA,CAAE,EAAE,CAAA,EAAG;AACtC,IAAA,IAAI,CAAA,CAAE,IAAA,KAAS,CAAA,CAAE,EAAA,EAAI;AACrB,IAAA,GAAA,CAAI,IAAI,CAAA,CAAE,IAAI,CAAA,CAAG,IAAA,CAAK,EAAE,EAAE,CAAA;AAC1B,IAAA,KAAA,CAAM,GAAA,CAAI,EAAE,EAAA,EAAA,CAAK,KAAA,CAAM,IAAI,CAAA,CAAE,EAAE,CAAA,IAAK,CAAA,IAAK,CAAC,CAAA;AAC1C,IAAA,QAAA,CAAS,KAAK,CAAC,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,EAAE,CAAC,CAAA;AAAA,EAC9B;AAKA,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAY;AAClC,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAoB;AACtC,EAAA,KAAA,MAAW,EAAA,IAAM,GAAA,EAAK,KAAA,CAAM,GAAA,CAAI,IAAI,CAAC,CAAA;AACrC,EAAA,MAAM,GAAA,GAAM,CAAC,CAAA,KAAoB;AAC/B,IAAA,KAAA,CAAM,GAAA,CAAI,GAAG,CAAC,CAAA;AACd,IAAA,KAAA,MAAW,KAAK,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA,IAAK,EAAC,EAAG;AAChC,MAAA,MAAM,CAAA,GAAI,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,IAAK,CAAA;AAC1B,MAAA,IAAI,MAAM,CAAA,EAAG;AAEX,QAAA,SAAA,CAAU,GAAA,CAAI,CAAA,EAAG,CAAC,CAAA,EAAA,EAAK,CAAC,CAAA,CAAE,CAAA;AAAA,MAC5B,CAAA,MAAA,IAAW,MAAM,CAAA,EAAG;AAClB,QAAA,GAAA,CAAI,CAAC,CAAA;AAAA,MACP;AAAA,IACF;AACA,IAAA,KAAA,CAAM,GAAA,CAAI,GAAG,CAAC,CAAA;AAAA,EAChB,CAAA;AAEA,EAAA,MAAM,SAAS,GAAA,CAAI,MAAA,CAAO,OAAO,CAAC,CAAA,KAAM,EAAE,MAAA,KAAW,IAAA,CAAK,EAAA,IAAM,CAAA,CAAE,SAAS,OAAO,CAAA,CAAE,IAAI,CAAC,CAAA,KAAM,EAAE,EAAE,CAAA;AACnG,EAAA,KAAA,MAAW,CAAA,IAAK,MAAA,EAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,IAAK,CAAA,MAAO,CAAA,EAAG,GAAA,CAAI,CAAC,CAAA;AAC5D,EAAA,KAAA,MAAW,EAAA,IAAM,GAAA,EAAK,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,EAAE,CAAA,IAAK,CAAA,MAAO,CAAA,EAAG,GAAA,CAAI,EAAE,CAAA;AAG5D,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAsB;AACzC,EAAA,KAAA,MAAW,MAAM,GAAA,EAAK,MAAA,CAAO,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AACvC,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,CAAA,IAAK,QAAA,EAAU;AAC7B,IAAA,IAAI,UAAU,GAAA,CAAI,CAAA,EAAG,CAAC,CAAA,EAAA,EAAK,CAAC,EAAE,CAAA,EAAG;AACjC,IAAA,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,CAAG,IAAA,CAAK,CAAC,CAAA;AAAA,EACvB;AAEA,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAoB;AACzC,EAAA,KAAA,MAAW,EAAA,IAAM,GAAA,EAAK,QAAA,CAAS,GAAA,CAAI,IAAI,CAAC,CAAA;AACxC,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,CAAA,IAAK,QAAA,EAAU;AAC7B,IAAA,IAAI,UAAU,GAAA,CAAI,CAAA,EAAG,CAAC,CAAA,EAAA,EAAK,CAAC,EAAE,CAAA,EAAG;AACjC,IAAA,QAAA,CAAS,IAAI,CAAA,EAAA,CAAI,QAAA,CAAS,IAAI,CAAC,CAAA,IAAK,KAAK,CAAC,CAAA;AAAA,EAC5C;AACA,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,EAAA,IAAM,GAAA,EAAK,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA,IAAK,CAAA,MAAO,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,EAAE,CAAA;AACtE,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,KAAA,GAAQ,IAAI,GAAA,CAAI,QAAQ,CAAA;AAC9B,EAAA,OAAO,KAAA,CAAM,SAAS,CAAA,EAAG;AACvB,IAAA,MAAM,CAAA,GAAI,MAAM,KAAA,EAAM;AACtB,IAAA,KAAA,CAAM,KAAK,CAAC,CAAA;AACZ,IAAA,KAAA,MAAW,KAAK,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,IAAK,EAAC,EAAG;AACnC,MAAA,MAAM,CAAA,GAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAC,KAAK,CAAA,IAAK,CAAA;AAChC,MAAA,KAAA,CAAM,GAAA,CAAI,GAAG,CAAC,CAAA;AACd,MAAA,IAAI,CAAA,KAAM,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA;AAAA,IAC3B;AAAA,EACF;AACA,EAAA,KAAA,MAAW,EAAA,IAAM,GAAA,EAAK,IAAI,CAAC,KAAA,CAAM,SAAS,EAAE,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,EAAE,CAAA;AAE5D,EAAA,KAAA,MAAW,EAAA,IAAM,GAAA,EAAK,QAAA,CAAS,GAAA,CAAI,IAAI,CAAC,CAAA;AACxC,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,MAAM,EAAA,GAAK,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,IAAK,CAAA;AAC9B,IAAA,KAAA,MAAW,KAAK,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,IAAK,EAAC,EAAG;AACnC,MAAA,MAAM,EAAA,GAAK,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,IAAK,CAAA;AAC9B,MAAA,IAAI,KAAK,EAAA,GAAK,CAAA,WAAY,GAAA,CAAI,CAAA,EAAG,KAAK,CAAC,CAAA;AAAA,IACzC;AAAA,EACF;AACF;AAIA,SAASyF,KAAI,CAAA,EAAmB;AAC9B,EAAA,OAAA,CAAQ,KAAK,KAAA,CAAM,CAAA,GAAI,GAAG,CAAA,GAAI,KAAK,QAAA,EAAS;AAC9C;AAEA,SAAS,iBAAA,CACP,CAAA,EACA,SAAA,EACA,OAAA,EACgB;AAChB,EAAA,MAAM,CAAA,GAAI,SAAA,CAAU,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA;AAC9B,EAAA,MAAM,CAAA,GAAI,SAAA,CAAU,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA;AAE5B,EAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA;AACnB,EAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA;AAEnB,EAAA,IAAI,OAAO,EAAE,CAAA,EAAG,EAAE,CAAA,EAAG,CAAA,EAAG,EAAE,CAAA,EAAE;AAC5B,EAAA,IAAI,KAAK,EAAE,CAAA,EAAG,EAAE,CAAA,EAAG,CAAA,EAAG,EAAE,CAAA,EAAE;AAG1B,EAAA,IAAI,KAAK,GAAA,CAAI,EAAE,KAAK,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,EAAG;AAChC,IAAA,IAAA,GAAO,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,IAAK,MAAM,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA,CAAE,CAAA,GAAI,CAAA,CAAA,EAAI,CAAA,EAAG,EAAE,CAAA,EAAE;AACzD,IAAA,EAAA,GAAK,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,IAAK,MAAM,CAAA,GAAI,CAAC,CAAA,CAAE,CAAA,GAAI,IAAI,CAAA,CAAE,CAAA,GAAI,CAAA,CAAA,EAAI,CAAA,EAAG,EAAE,CAAA,EAAE;AAAA,EACzD,CAAA,MAAO;AACL,IAAA,IAAA,GAAO,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,GAAG,CAAA,CAAE,CAAA,IAAK,EAAA,IAAM,CAAA,GAAI,EAAE,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA,CAAE,IAAI,CAAA,CAAA,EAAG;AACzD,IAAA,EAAA,GAAK,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,GAAG,CAAA,CAAE,CAAA,IAAK,EAAA,IAAM,CAAA,GAAI,CAAC,CAAA,CAAE,CAAA,GAAI,CAAA,GAAI,CAAA,CAAE,IAAI,CAAA,CAAA,EAAG;AAAA,EACzD;AAMA,EAAA,IAAIzF,KAAAA;AACJ,EAAA,IAAI,WAAA;AACJ,EAAA,IAAI,KAAK,GAAA,CAAI,EAAE,KAAK,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,EAAG;AAChC,IAAA,MAAM,IAAA,GAAA,CAAQ,IAAA,CAAK,CAAA,GAAI,EAAA,CAAG,CAAA,IAAK,CAAA;AAC/B,IAAAA,QACE,CAAA,EAAA,EAAKyF,IAAAA,CAAI,IAAA,CAAK,CAAC,CAAC,CAAA,CAAA,EAAIA,IAAAA,CAAI,IAAA,CAAK,CAAC,CAAC,CAAA,GAAA,EAC1BA,IAAAA,CAAI,IAAI,CAAC,CAAA,CAAA,EAAIA,KAAI,IAAA,CAAK,CAAC,CAAC,CAAA,GAAA,EACxBA,KAAI,IAAI,CAAC,CAAA,CAAA,EAAIA,IAAAA,CAAI,GAAG,CAAC,CAAC,CAAA,GAAA,EACtBA,IAAAA,CAAI,GAAG,CAAC,CAAC,IAAIA,IAAAA,CAAI,EAAA,CAAG,CAAC,CAAC,CAAA,CAAA;AAC7B,IAAA,WAAA,GAAc,EAAE,GAAG,IAAA,EAAM,CAAA,EAAA,CAAI,KAAK,CAAA,GAAI,EAAA,CAAG,CAAA,IAAK,CAAA,GAAI,CAAA,EAAE;AAAA,EACtD,CAAA,MAAO;AACL,IAAA,MAAM,IAAA,GAAA,CAAQ,IAAA,CAAK,CAAA,GAAI,EAAA,CAAG,CAAA,IAAK,CAAA;AAC/B,IAAAzF,QACE,CAAA,EAAA,EAAKyF,IAAAA,CAAI,IAAA,CAAK,CAAC,CAAC,CAAA,CAAA,EAAIA,IAAAA,CAAI,IAAA,CAAK,CAAC,CAAC,CAAA,GAAA,EAC1BA,IAAAA,CAAI,KAAK,CAAC,CAAC,IAAIA,IAAAA,CAAI,IAAI,CAAC,CAAA,GAAA,EACxBA,KAAI,EAAA,CAAG,CAAC,CAAC,CAAA,CAAA,EAAIA,KAAI,IAAI,CAAC,CAAA,GAAA,EACtBA,IAAAA,CAAI,GAAG,CAAC,CAAC,IAAIA,IAAAA,CAAI,EAAA,CAAG,CAAC,CAAC,CAAA,CAAA;AAC7B,IAAA,WAAA,GAAc,EAAE,IAAI,IAAA,CAAK,CAAA,GAAI,GAAG,CAAA,IAAK,CAAA,EAAG,CAAA,EAAG,IAAA,GAAO,CAAA,EAAE;AAAA,EACtD;AAEA,EAAA,OAAO,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAAzF,OAAM,WAAA,EAAY;AACtC;AAEA,SAAS,gBAAA,CACP,CAAA,EACA,SAAA,EACA,WAAA,EACgB;AAEhB,EAAA,MAAM,QAAA,GAAW,CACf,EAAA,KAC8E;AAC9E,IAAA,IAAI,WAAA,CAAY,GAAA,CAAI,EAAE,CAAA,EAAG;AACvB,MAAA,MAAM,CAAA,GAAI,WAAA,CAAY,GAAA,CAAI,EAAE,CAAA;AAC5B,MAAA,OAAO;AAAA,QACL,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,KAAA,GAAQ,CAAA;AAAA,QACnB,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,MAAA,GAAS,CAAA;AAAA,QACpB,MAAA,EAAQ,IAAA;AAAA,QACR,OAAO,CAAA,CAAE,CAAA;AAAA,QACT,OAAO,CAAA,CAAE;AAAA,OACX;AAAA,IACF;AACA,IAAA,MAAM,CAAA,GAAI,SAAA,CAAU,GAAA,CAAI,EAAE,CAAA;AAC1B,IAAA,OAAO,EAAE,GAAG,CAAA,CAAE,CAAA,EAAG,GAAG,CAAA,CAAE,CAAA,EAAG,QAAQ,KAAA,EAAM;AAAA,EACzC,CAAA;AACA,EAAA,MAAM,CAAA,GAAI,QAAA,CAAS,CAAA,CAAE,IAAI,CAAA;AACzB,EAAA,MAAM,CAAA,GAAI,QAAA,CAAS,CAAA,CAAE,EAAE,CAAA;AAIvB,EAAA,MAAM,IAAA,GAAA,CAAQ,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,IAAK,CAAA;AAC3B,EAAA,MAAMA,QACJ,CAAA,EAAA,EAAKyF,IAAAA,CAAI,CAAA,CAAE,CAAC,CAAC,CAAA,CAAA,EAAIA,IAAAA,CAAI,CAAA,CAAE,CAAC,CAAC,CAAA,GAAA,EACpBA,IAAAA,CAAI,EAAE,CAAC,CAAC,IAAIA,IAAAA,CAAI,IAAI,CAAC,CAAA,GAAA,EACrBA,KAAI,CAAA,CAAE,CAAC,CAAC,CAAA,CAAA,EAAIA,KAAI,IAAI,CAAC,CAAA,GAAA,EACrBA,IAAAA,CAAI,EAAE,CAAC,CAAC,IAAIA,IAAAA,CAAI,CAAA,CAAE,CAAC,CAAC,CAAA,CAAA;AAC3B,EAAA,OAAO,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAAzF,KAAAA,EAAM,aAAa,EAAE,CAAA,EAAA,CAAI,CAAA,CAAE,CAAA,GAAI,EAAE,CAAA,IAAK,CAAA,EAAG,CAAA,EAAG,IAAA,GAAO,GAAE,EAAE;AAC3E;;;AC7aA,IAAM,WAAA,GAAc,kDAAA;AACpB,IAAM,MAAA,GAAS,SAAA;AACf,IAAM,YAAA,GAAe,SAAA;AACrB,IAAM,SAAA,GAAY,SAAA;AAClB,IAAM,SAAA,GAAY,SAAA;AAClB,IAAM,SAAA,GAAY,SAAA;AAClB,IAAM,YAAA,GAAe,SAAA;AACrB,IAAM,UAAA,GAAa,SAAA;AACnB,IAAM,eAAA,GAAkB,SAAA;AAEjB,SAAS,UAAA,CAAW,WAAmB,MAAA,EAA+B;AAC3E,EAAA,MAAM,GAAA,GAAM,UAAU,SAAS,CAAA;AAC/B,EAAA,MAAM,MAAA,GAAS,WAAW,GAAG,CAAA;AAC7B,EAAA,OAAO,gBAAA,CAAiB,MAAc,CAAA;AACxC;AAEO,SAAS,gBAAA,CACd,QACA,OAAA,EACQ;AACR,EAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAQ,GAAA,EAAI,GAAI,MAAA;AAE/B,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,GAAA,CAAI,IAAA,CAAKV,uBAAA,CAAM,GAAA,CAAI,KAAA,IAAS,cAAc,CAAC,CAAA;AAC3C,EAAA,GAAA,CAAI,IAAA,CAAKa,sBAAA,CAAK,CAAA,KAAA,EAAQ,GAAA,CAAI,SAAS,CAAA,QAAA,EAAM,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA,UAAA,EAAa,MAAA,CAAO,OAAA,CAAQ,MAAM,kBAAkB,CAAC,CAAA;AAE9G,EAAA,GAAA,CAAI,IAAA,CAAK,WAAW,CAAA;AAGpB,EAAA,KAAA,MAAW,MAAM,MAAA,CAAO,KAAA,MAAW,IAAA,CAAK,UAAA,CAAW,EAAE,CAAC,CAAA;AAGtD,EAAA,KAAA,MAAW,GAAA,IAAO,OAAO,KAAA,EAAO;AAC9B,IAAA,GAAA,CAAI,IAAA;AAAA,MACFF,uBAAA,CAAM,EAAE,KAAA,EAAO,qBAAA,EAAsB,EAAG;AAAA,QACtCJ,sBAAA,CAAK;AAAA,UACH,CAAA,EAAG,GAAA,CAAI,CAAA,GAAI,GAAA,CAAI,WAAA;AAAA,UACf,GAAG,GAAA,CAAI,CAAA;AAAA,UACP,KAAA,EAAO,GAAA,CAAI,KAAA,GAAQ,GAAA,CAAI,WAAA;AAAA,UACvB,QAAQ,GAAA,CAAI,MAAA;AAAA,UACZ,IAAA,EAAM,SAAA;AAAA,UACN,MAAA,EAAQ,MAAA;AAAA,UACR,cAAA,EAAgB;AAAA,SACjB,CAAA;AAAA,QACDA,sBAAA,CAAK;AAAA,UACH,GAAG,GAAA,CAAI,CAAA;AAAA,UACP,GAAG,GAAA,CAAI,CAAA;AAAA,UACP,OAAO,GAAA,CAAI,WAAA;AAAA,UACX,QAAQ,GAAA,CAAI,MAAA;AAAA,UACZ,IAAA,EAAM,eAAA;AAAA,UACN,MAAA,EAAQ,MAAA;AAAA,UACR,cAAA,EAAgB;AAAA,SACjB,CAAA;AAAA,QACDR,sBAAA;AAAA,UACE;AAAA,YACE,CAAA,EAAG,GAAA,CAAI,CAAA,GAAI,GAAA,CAAI,WAAA,GAAc,CAAA;AAAA,YAC7B,CAAA,EAAG,GAAA,CAAI,CAAA,GAAI,GAAA,CAAI,MAAA,GAAS,CAAA;AAAA,YACxB,SAAA,EAAW,CAAA,WAAA,EAAc,GAAA,CAAI,CAAA,GAAI,GAAA,CAAI,WAAA,GAAc,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,CAAA,GAAI,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA,CAAA,CAAA;AAAA,YAC9E,aAAA,EAAe,QAAA;AAAA,YACf,mBAAA,EAAqB,QAAA;AAAA,YACrB,aAAA,EAAe,WAAA;AAAA,YACf,WAAA,EAAa,EAAA;AAAA,YACb,IAAA,EAAM;AAAA,WACR;AAAA,UACA,IAAI,IAAA,CAAK;AAAA;AACX,OACD;AAAA,KACH;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,MAAM,MAAA,CAAO,KAAA,MAAW,IAAA,CAAK,UAAA,CAAW,EAAE,CAAC,CAAA;AAGtD,EAAA,KAAA,MAAW,MAAM,MAAA,CAAO,OAAA,MAAa,IAAA,CAAK,YAAA,CAAa,EAAE,CAAC,CAAA;AAE1D,EAAA,OAAOgB,yBAAA;AAAA,IACL;AAAA,MACE,KAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAA,EAAS,CAAA,IAAA,EAAO,KAAK,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AAAA,MAC/B,KAAA,EAAO;AAAA,KACT;AAAA,IACA;AAAA,GACF;AACF;AAIA,SAAS,SAAA,GAAoB;AAC3B,EAAA,OAAOQ,sBAAA,CAAK;AAAA;AAAA,IAEVT,oBAAA;AAAA,MACE,QAAA;AAAA,MACA;AAAA,QACE,EAAA,EAAI,gBAAA;AAAA,QACJ,OAAA,EAAS,WAAA;AAAA,QACT,IAAA,EAAM,CAAA;AAAA,QACN,IAAA,EAAM,CAAA;AAAA,QACN,WAAA,EAAa,CAAA;AAAA,QACb,YAAA,EAAc,CAAA;AAAA,QACd,MAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACEA,qBAAG,MAAA,EAAQ;AAAA,UACT,CAAA,EAAG,uBAAA;AAAA,UACH,IAAA,EAAM;AAAA,SACP;AAAA;AACH,KACF;AAAA;AAAA,IAEAA,oBAAA;AAAA,MACE,QAAA;AAAA,MACA;AAAA,QACE,EAAA,EAAI,gBAAA;AAAA,QACJ,OAAA,EAAS,WAAA;AAAA,QACT,IAAA,EAAM,CAAA;AAAA,QACN,IAAA,EAAM,CAAA;AAAA,QACN,WAAA,EAAa,CAAA;AAAA,QACb,YAAA,EAAc,CAAA;AAAA,QACd,MAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACEA,qBAAG,MAAA,EAAQ;AAAA,UACT,CAAA,EAAG,uBAAA;AAAA,UACH,IAAA,EAAM,SAAA;AAAA,UACN,MAAA,EAAQ,MAAA;AAAA,UACR,cAAA,EAAgB;AAAA,SACjB;AAAA;AACH,KACF;AAAA;AAAA,IAEAA,oBAAA;AAAA,MACE,QAAA;AAAA,MACA;AAAA,QACE,EAAA,EAAI,gBAAA;AAAA,QACJ,OAAA,EAAS,WAAA;AAAA,QACT,IAAA,EAAM,CAAA;AAAA,QACN,IAAA,EAAM,CAAA;AAAA,QACN,WAAA,EAAa,CAAA;AAAA,QACb,YAAA,EAAc,CAAA;AAAA,QACd,MAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACEA,oBAAA,CAAG,QAAA,EAAU,EAAE,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,IAAA,EAAM,SAAA,EAAW,MAAA,EAAQ,QAAQ;AAAA;AACtE;AACF,GACD,CAAA;AACH;AAIA,SAAS,WAAW,EAAA,EAA4B;AAC9C,EAAA,MAAM,OAAA,GAAU,EAAA,CAAG,MAAA,GAAS,EAAA,CAAG,UAAA,GAAa,CAAA;AAC5C,EAAA,MAAM,OAAA,GAAU,EAAA,CAAG,MAAA,GAAS,EAAA,CAAG,MAAA,GAAS,CAAA;AACxC,EAAA,IAAI,EAAA,CAAG,KAAK,QAAA,EAAU;AACpB,IAAA,OAAOH,uBAAA,CAAM,EAAE,KAAA,EAAO,8BAAA,EAA+B,EAAG;AAAA,MACtDJ,sBAAA,CAAK;AAAA,QACH,GAAG,EAAA,CAAG,CAAA;AAAA,QACN,GAAG,EAAA,CAAG,CAAA;AAAA,QACN,OAAO,EAAA,CAAG,KAAA;AAAA,QACV,QAAQ,EAAA,CAAG,MAAA;AAAA,QACX,IAAA,EAAM,SAAA;AAAA,QACN,MAAA,EAAQ,MAAA;AAAA,QACR,cAAA,EAAgB;AAAA,OACjB,CAAA;AAAA,MACDA,sBAAA,CAAK;AAAA,QACH,GAAG,EAAA,CAAG,CAAA;AAAA,QACN,GAAG,EAAA,CAAG,CAAA;AAAA,QACN,OAAO,EAAA,CAAG,UAAA;AAAA,QACV,QAAQ,EAAA,CAAG,MAAA;AAAA,QACX,IAAA,EAAM,eAAA;AAAA,QACN,MAAA,EAAQ,MAAA;AAAA,QACR,cAAA,EAAgB;AAAA,OACjB,CAAA;AAAA,MACDR,sBAAA;AAAA,QACE;AAAA,UACE,CAAA,EAAG,OAAA;AAAA,UACH,CAAA,EAAG,OAAA;AAAA,UACH,SAAA,EAAW,CAAA,WAAA,EAAc,OAAO,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,CAAA;AAAA,UAC3C,aAAA,EAAe,QAAA;AAAA,UACf,mBAAA,EAAqB,QAAA;AAAA,UACrB,aAAA,EAAe,WAAA;AAAA,UACf,WAAA,EAAa,EAAA;AAAA,UACb,aAAA,EAAe,MAAA;AAAA,UACf,IAAA,EAAM;AAAA,SACR;AAAA,QACA,GAAG,IAAA,CAAK;AAAA;AACV,KACD,CAAA;AAAA,EACH;AACA,EAAA,OAAOY,uBAAA,CAAM,EAAE,KAAA,EAAO,qBAAA,EAAsB,EAAG;AAAA,IAC7CJ,sBAAA,CAAK;AAAA,MACH,GAAG,EAAA,CAAG,CAAA;AAAA,MACN,GAAG,EAAA,CAAG,CAAA;AAAA,MACN,OAAO,EAAA,CAAG,KAAA;AAAA,MACV,QAAQ,EAAA,CAAG,MAAA;AAAA,MACX,IAAA,EAAM,SAAA;AAAA,MACN,MAAA,EAAQ,MAAA;AAAA,MACR,cAAA,EAAgB;AAAA,KACjB,CAAA;AAAA,IACDA,sBAAA,CAAK;AAAA,MACH,GAAG,EAAA,CAAG,CAAA;AAAA,MACN,GAAG,EAAA,CAAG,CAAA;AAAA,MACN,OAAO,EAAA,CAAG,UAAA;AAAA,MACV,QAAQ,EAAA,CAAG,MAAA;AAAA,MACX,IAAA,EAAM,eAAA;AAAA,MACN,MAAA,EAAQ,MAAA;AAAA,MACR,cAAA,EAAgB;AAAA,KACjB,CAAA;AAAA,IACDR,sBAAA;AAAA,MACE;AAAA,QACE,CAAA,EAAG,OAAA;AAAA,QACH,CAAA,EAAG,OAAA;AAAA,QACH,SAAA,EAAW,CAAA,WAAA,EAAc,OAAO,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,CAAA;AAAA,QAC3C,aAAA,EAAe,QAAA;AAAA,QACf,mBAAA,EAAqB,QAAA;AAAA,QACrB,aAAA,EAAe,WAAA;AAAA,QACf,WAAA,EAAa,EAAA;AAAA,QACb,aAAA,EAAe,MAAA;AAAA,QACf,IAAA,EAAM;AAAA,OACR;AAAA,MACA,GAAG,IAAA,CAAK;AAAA;AACV,GACD,CAAA;AACH;AAIA,SAAS,aAAa,EAAA,EAA8B;AAClD,EAAA,MAAM,IAAI,EAAA,CAAG,GAAA;AACb,EAAA,IAAI,aAAA,IAAiB,CAAA,EAAG,OAAO,aAAA,CAAc,EAAE,CAAA;AAC/C,EAAA,IAAI,QAAA,IAAY,CAAA,EAAG,OAAO,cAAA,CAAe,EAAE,CAAA;AAC3C,EAAA,OAAO,YAAY,EAAE,CAAA;AACvB;AAEA,SAAS,eAAe,EAAA,EAA8B;AACpD,EAAA,MAAM,IAAI,EAAA,CAAG,GAAA;AACb,EAAA,MAAM,SAAA,GAAY,EAAE,IAAA,KAAS,sBAAA;AAC7B,EAAA,MAAM,EAAA,GAAK,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,KAAA,GAAQ,CAAA;AAC7B,EAAA,MAAM,EAAA,GAAK,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,MAAA,GAAS,CAAA;AAC9B,EAAA,MAAM,QAAA,GAAqB;AAAA,IACzBQ,sBAAA,CAAK;AAAA,MACH,GAAG,EAAA,CAAG,CAAA;AAAA,MACN,GAAG,EAAA,CAAG,CAAA;AAAA,MACN,OAAO,EAAA,CAAG,KAAA;AAAA,MACV,QAAQ,EAAA,CAAG,MAAA;AAAA,MACX,EAAA,EAAI,EAAA;AAAA,MACJ,EAAA,EAAI,EAAA;AAAA,MACJ,IAAA,EAAM,SAAA;AAAA,MACN,MAAA,EAAQ,MAAA;AAAA,MACR,cAAA,EAAgB;AAAA,KACjB,CAAA;AAAA,IACD6F,+BAAA;AAAA,MACE;AAAA,QACE,CAAA,EAAG,EAAA;AAAA,QACH,CAAA,EAAG,EAAA;AAAA,QACH,aAAA,EAAe,QAAA;AAAA,QACf,mBAAA,EAAqB,QAAA;AAAA,QACrB,aAAA,EAAe,WAAA;AAAA,QACf,WAAA,EAAa,EAAA;AAAA,QACb,IAAA,EAAM;AAAA,OACR;AAAA,MACA,CAAA,CAAE,KAAA;AAAA,MACF;AAAA;AACF,GACF;AAEA,EAAA,IAAI,CAAA,CAAE,IAAA,KAAS,MAAA,IAAU,CAAA,CAAE,WAAW,UAAA,EAAY;AAChD,IAAA,QAAA,CAAS,IAAA,CAAK,UAAA,CAAW,EAAA,CAAG,CAAA,GAAI,CAAA,EAAG,GAAG,CAAA,GAAI,CAAA,EAAG,CAAA,CAAE,MAAM,CAAC,CAAA;AAAA,EACxD;AAEA,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,MAAM,EAAA,GAAK,EAAA;AACX,IAAA,MAAM,EAAA,GAAK,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,MAAA,GAAS,EAAA;AAC9B,IAAA,QAAA,CAAS,IAAA;AAAA,MACP7F,sBAAA,CAAK;AAAA,QACH,GAAG,EAAA,GAAK,CAAA;AAAA,QACR,GAAG,EAAA,GAAK,CAAA;AAAA,QACR,KAAA,EAAO,EAAA;AAAA,QACP,MAAA,EAAQ,EAAA;AAAA,QACR,IAAA,EAAM,MAAA;AAAA,QACN,MAAA,EAAQ,MAAA;AAAA,QACR,cAAA,EAAgB;AAAA,OACjB,CAAA;AAAA,MACDO,qBAAG,MAAA,EAAQ;AAAA,QACT,CAAA,EAAG,KAAK,EAAA,GAAK,CAAC,IAAI,EAAE,CAAA,GAAA,EAAM,KAAK,CAAC,CAAA,CAAA,EAAI,EAAE,CAAA,GAAA,EAAM,EAAE,IAAI,EAAA,GAAK,CAAC,MAAM,EAAE,CAAA,CAAA,EAAI,KAAK,CAAC,CAAA,CAAA;AAAA,QAC1E,MAAA,EAAQ,MAAA;AAAA,QACR,cAAA,EAAgB;AAAA,OACjB;AAAA,KACH;AAAA,EACF;AACA,EAAA,OAAOH,uBAAA,CAAM,EAAE,KAAA,EAAO,CAAA,2BAAA,EAA8B,EAAE,MAAM,CAAA,CAAA,IAAM,QAAQ,CAAA;AAC5E;AAEA,SAAS,UAAA,CAAW,CAAA,EAAW,CAAA,EAAW,MAAA,EAAwB;AAChE,EAAA,MAAM,KAAK,CAAA,GAAI,CAAA;AACf,EAAA,MAAM,KAAK,CAAA,GAAI,CAAA;AACf,EAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,IAAA,OAAOG,oBAAA,CAAG,GAAA,EAAK,EAAE,KAAA,EAAO,eAAc,EAAG;AAAA,MACvCA,oBAAA,CAAG,QAAA,EAAU,EAAE,EAAA,EAAI,IAAI,EAAA,GAAK,CAAA,EAAG,CAAA,EAAG,GAAA,EAAK,MAAM,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAQ,cAAA,EAAgB,GAAG,CAAA;AAAA,MACxFA,qBAAG,MAAA,EAAQ;AAAA,QACT,GAAG,CAAA,EAAA,EAAK,EAAA,GAAK,CAAC,CAAA,CAAA,EAAI,KAAK,CAAC,CAAA,GAAA,EAAM,EAAE,CAAA,CAAA,EAAI,KAAK,CAAC,CAAA,CAAA,EAAI,KAAK,CAAC,CAAA,CAAA,EAAI,KAAK,CAAC,CAAA,CAAA;AAAA,QAC9D,IAAA,EAAM,MAAA;AAAA,QACN,MAAA,EAAQ,MAAA;AAAA,QACR,cAAA,EAAgB;AAAA,OACjB;AAAA,KACF,CAAA;AAAA,EACH;AACA,EAAA,IAAI,WAAW,SAAA,EAAW;AAExB,IAAA,OAAOA,oBAAA,CAAG,GAAA,EAAK,EAAE,KAAA,EAAO,kBAAiB,EAAG;AAAA,MAC1CA,oBAAA,CAAG,QAAA,EAAU,EAAE,EAAA,EAAI,EAAA,EAAI,CAAA,EAAG,CAAA,EAAG,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAQ,cAAA,EAAgB,GAAG,CAAA;AAAA,MAC9EA,oBAAA,CAAG,UAAU,EAAE,EAAA,EAAI,IAAI,CAAA,EAAG,GAAA,EAAK,IAAA,EAAM,MAAA,EAAQ,CAAA;AAAA,MAC7CA,qBAAG,MAAA,EAAQ;AAAA,QACT,GAAG,CAAA,EAAA,EAAK,EAAE,IAAI,EAAA,GAAK,CAAC,MAAM,EAAE,CAAA,CAAA,EAAI,EAAA,GAAK,CAAC,MAAM,EAAE,CAAA,CAAA,EAAI,KAAK,CAAC,CAAA,GAAA,EAAM,EAAE,CAAA,CAAA,EAAI,EAAA,GAAK,CAAC,CAAA,GAAA,EAAM,KAAK,CAAC,CAAA,CAAA,EAAI,EAAE,CAAA,GAAA,EAAM,EAAA,GAAK,CAAC,CAAA,CAAA,EAAI,EAAE,CAAA,GAAA,EAAM,EAAA,GAAK,CAAC,CAAA,CAAA,EAAI,EAAE,MAAM,EAAA,GAAK,CAAC,IAAI,EAAE,CAAA,CAAA;AAAA,QAClJ,MAAA,EAAQ,MAAA;AAAA,QACR,cAAA,EAAgB;AAAA,OACjB;AAAA,KACF,CAAA;AAAA,EACH;AACA,EAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,IAAA,OAAOA,oBAAA,CAAG,GAAA,EAAK,EAAE,KAAA,EAAO,eAAc,EAAG;AAAA,MACvCA,oBAAA,CAAG,MAAA,EAAQ,EAAE,CAAA,EAAG,KAAK,CAAA,EAAG,CAAA,EAAG,EAAA,GAAK,CAAA,EAAG,OAAO,EAAA,EAAI,MAAA,EAAQ,CAAA,EAAG,IAAA,EAAM,QAAQ,CAAA;AAAA,MACvEA,oBAAA,CAAG,MAAA,EAAQ,EAAE,CAAA,EAAG,CAAA,EAAA,EAAK,EAAA,GAAK,CAAC,CAAA,CAAA,EAAI,EAAA,GAAK,CAAC,CAAA,GAAA,EAAM,EAAE,CAAA,CAAA,EAAI,EAAA,GAAK,CAAC,CAAA,GAAA,EAAM,EAAA,GAAK,CAAC,CAAA,CAAA,EAAI,EAAA,GAAK,CAAC,CAAA,CAAA,EAAI,MAAA,EAAQ,SAAA,EAAW,cAAA,EAAgB,CAAA,EAAG,IAAA,EAAM,MAAA,EAAQ;AAAA,KACtI,CAAA;AAAA,EACH;AACA,EAAA,IAAI,WAAW,SAAA,EAAW;AACxB,IAAA,OAAOA,oBAAA,CAAG,GAAA,EAAK,EAAE,KAAA,EAAO,kBAAiB,EAAG;AAAA,MAC1CA,qBAAG,MAAA,EAAQ,EAAE,GAAG,EAAA,GAAK,CAAA,EAAG,GAAG,EAAA,GAAK,CAAA,EAAG,OAAO,EAAA,EAAI,MAAA,EAAQ,GAAG,IAAA,EAAM,MAAA,EAAQ,QAAQ,MAAA,EAAQ,cAAA,EAAgB,GAAG,CAAA;AAAA,MAC1GA,oBAAA,CAAG,MAAA,EAAQ,EAAE,CAAA,EAAG,CAAA,EAAA,EAAK,EAAA,GAAK,CAAC,CAAA,CAAA,EAAI,EAAA,GAAK,CAAC,CAAA,GAAA,EAAM,EAAE,CAAA,CAAA,EAAI,EAAA,GAAK,CAAC,CAAA,GAAA,EAAM,EAAA,GAAK,CAAC,CAAA,CAAA,EAAI,EAAA,GAAK,CAAC,CAAA,CAAA,EAAI,MAAA,EAAQ,MAAA,EAAQ,cAAA,EAAgB,CAAA,EAAG,IAAA,EAAM,MAAA,EAAQ;AAAA,KACnI,CAAA;AAAA,EACH;AACA,EAAA,IAAI,WAAW,QAAA,EAAU;AAEvB,IAAA,OAAOA,oBAAA,CAAG,GAAA,EAAK,EAAE,KAAA,EAAO,iBAAgB,EAAG;AAAA,MACzCA,qBAAG,MAAA,EAAQ;AAAA,QACT,CAAA,EAAG,CAAA,EAAA,EAAK,EAAA,GAAK,CAAC,CAAA,CAAA,EAAI,KAAK,CAAC,CAAA,GAAA,EAAM,EAAA,GAAK,CAAC,CAAA,CAAA,EAAI,EAAE,MAAM,EAAA,GAAK,GAAG,CAAA,CAAA,EAAI,EAAE,CAAA,GAAA,EAAM,EAAA,GAAK,GAAG,CAAA,CAAA,EAAI,EAAA,GAAK,CAAC,CAAA,GAAA,EAAM,EAAE,CAAA,CAAA,EAAI,EAAA,GAAK,CAAC,CAAA,GAAA,EAAM,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,GAAA,EAAM,EAAA,GAAK,GAAG,CAAA,CAAA,EAAI,EAAE,CAAA,GAAA,EAAM,EAAA,GAAK,GAAG,CAAA,CAAA,EAAI,KAAK,CAAC,CAAA,GAAA,EAAM,EAAA,GAAK,CAAC,CAAA,CAAA,EAAI,EAAA,GAAK,CAAC,CAAA,GAAA,EAAM,EAAA,GAAK,CAAC,CAAA,CAAA,EAAI,EAAA,GAAK,CAAC,CAAA,EAAA,CAAA;AAAA,QAC9M,IAAA,EAAM,MAAA;AAAA,QACN,MAAA,EAAQ,MAAA;AAAA,QACR,cAAA,EAAgB;AAAA,OACjB;AAAA,KACF,CAAA;AAAA,EACH;AACA,EAAA,IAAI,WAAW,QAAA,EAAU;AACvB,IAAA,OAAOA,oBAAA,CAAG,GAAA,EAAK,EAAE,KAAA,EAAO,iBAAgB,EAAG;AAAA,MACzCA,qBAAG,MAAA,EAAQ;AAAA,QACT,CAAA,EAAG,CAAA,EAAA,EAAK,EAAA,GAAK,CAAC,IAAI,EAAA,GAAK,CAAC,CAAA,GAAA,EAAM,EAAA,GAAK,CAAC,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,EAAA,GAAK,CAAC,CAAA,CAAA,EAAI,EAAA,GAAK,CAAC,CAAA,GAAA,EAAM,EAAA,GAAK,CAAC,CAAA,CAAA,EAAI,EAAA,GAAK,CAAC,CAAA,GAAA,EAAM,EAAA,GAAK,CAAC,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,EAAA,GAAK,CAAC,CAAA,CAAA,EAAI,KAAK,CAAC,CAAA,EAAA,CAAA;AAAA,QAC1H,IAAA,EAAM,MAAA;AAAA,QACN,MAAA,EAAQ,MAAA;AAAA,QACR,cAAA,EAAgB;AAAA,OACjB,CAAA;AAAA,MACDA,qBAAG,MAAA,EAAQ;AAAA,QACT,CAAA,EAAG,CAAA,EAAA,EAAK,EAAA,GAAK,CAAC,IAAI,EAAA,GAAK,CAAC,CAAA,GAAA,EAAM,EAAA,GAAK,CAAC,CAAA,CAAA,EAAI,EAAA,GAAK,CAAC,CAAA,GAAA,EAAM,KAAK,CAAC,CAAA,CAAA,EAAI,EAAE,CAAA,GAAA,EAAM,EAAA,GAAK,CAAC,CAAA,CAAA,EAAI,EAAE,MAAM,EAAA,GAAK,CAAC,CAAA,CAAA,EAAI,EAAA,GAAK,CAAC,CAAA,GAAA,EAAM,EAAA,GAAK,CAAC,CAAA,CAAA,EAAI,KAAK,CAAC,CAAA,CAAA;AAAA,QAC9H,MAAA,EAAQ,MAAA;AAAA,QACR,cAAA,EAAgB;AAAA,OACjB;AAAA,KACF,CAAA;AAAA,EACH;AACA,EAAA,OAAO,EAAA;AACT;AAEA,SAAS,cAAc,EAAA,EAA8B;AACnD,EAAA,MAAM,IAAI,EAAA,CAAG,GAAA;AACb,EAAA,MAAM,EAAA,GAAK,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,KAAA,GAAQ,CAAA;AAC7B,EAAA,MAAM,EAAA,GAAK,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,MAAA,GAAS,CAAA;AAC9B,EAAA,MAAM,CAAA,GAAI,GAAG,KAAA,GAAQ,CAAA;AACrB,EAAA,MAAM,MAAA,GAAS,GAAG,EAAE,CAAA,CAAA,EAAI,KAAK,CAAC,CAAA,CAAA,EAAI,KAAK,CAAC,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,EAAE,IAAI,EAAA,GAAK,CAAC,IAAI,EAAA,GAAK,CAAC,IAAI,EAAE,CAAA,CAAA;AAC9E,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,IAAI,CAAA,CAAE,gBAAgB,KAAA,EAAO;AAE3B,IAAA,MAAM,IAAI,CAAA,GAAI,IAAA;AACd,IAAA,KAAA,CAAM,IAAA;AAAA,MACJA,qBAAG,MAAA,EAAQ;AAAA,QACT,CAAA,EAAG,CAAA,EAAA,EAAK,EAAA,GAAK,CAAC,CAAA,CAAA,EAAI,KAAK,CAAC,CAAA,GAAA,EAAM,EAAA,GAAK,CAAC,CAAA,CAAA,EAAI,EAAA,GAAK,CAAC,CAAA,GAAA,EAAM,EAAA,GAAK,CAAC,CAAA,CAAA,EAAI,EAAA,GAAK,CAAC,MAAM,EAAA,GAAK,CAAC,CAAA,CAAA,EAAI,EAAA,GAAK,CAAC,CAAA,CAAA;AAAA,QAC1F,MAAA,EAAQ,MAAA;AAAA,QACR,cAAA,EAAgB,GAAA;AAAA,QAChB,gBAAA,EAAkB;AAAA,OACnB;AAAA,KACH;AAAA,EACF,CAAA,MAAA,IAAW,CAAA,CAAE,WAAA,KAAgB,KAAA,EAAO;AAClC,IAAA,MAAM,IAAI,CAAA,GAAI,GAAA;AACd,IAAA,KAAA,CAAM,IAAA;AAAA,MACJA,qBAAG,MAAA,EAAQ;AAAA,QACT,CAAA,EAAG,KAAK,EAAA,GAAK,CAAC,IAAI,EAAE,CAAA,GAAA,EAAM,KAAK,CAAC,CAAA,CAAA,EAAI,EAAE,CAAA,GAAA,EAAM,EAAE,IAAI,EAAA,GAAK,CAAC,MAAM,EAAE,CAAA,CAAA,EAAI,KAAK,CAAC,CAAA,CAAA;AAAA,QAC1E,MAAA,EAAQ,MAAA;AAAA,QACR,cAAA,EAAgB,GAAA;AAAA,QAChB,gBAAA,EAAkB;AAAA,OACnB;AAAA,KACH;AAAA,EACF,CAAA,MAAA,IAAW,CAAA,CAAE,WAAA,KAAgB,IAAA,EAAM;AACjC,IAAA,KAAA,CAAM,IAAA;AAAA,MACJA,qBAAG,QAAA,EAAU;AAAA,QACX,EAAA;AAAA,QACA,EAAA;AAAA,QACA,GAAG,CAAA,GAAI,IAAA;AAAA,QACP,IAAA,EAAM,MAAA;AAAA,QACN,MAAA,EAAQ,MAAA;AAAA,QACR,cAAA,EAAgB;AAAA,OACjB;AAAA,KACH;AAAA,EACF,CAAA,MAAA,IAAW,CAAA,CAAE,WAAA,KAAgB,OAAA,EAAS;AAEpC,IAAA,KAAA,CAAM,IAAA;AAAA,MACJA,qBAAG,QAAA,EAAU;AAAA,QACX,EAAA;AAAA,QACA,EAAA;AAAA,QACA,GAAG,CAAA,GAAI,IAAA;AAAA,QACP,IAAA,EAAM,MAAA;AAAA,QACN,MAAA,EAAQ,MAAA;AAAA,QACR,cAAA,EAAgB;AAAA,OACjB;AAAA,KACH;AACA,IAAA,MAAM,KAAK,CAAA,GAAI,IAAA;AACf,IAAA,MAAM,MAAgB,EAAC;AACvB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,MAAA,MAAM,GAAA,GAAM,CAAC,IAAA,CAAK,EAAA,GAAK,IAAK,CAAA,GAAI,CAAA,GAAI,KAAK,EAAA,GAAM,CAAA;AAC/C,MAAA,GAAA,CAAI,IAAA,CAAK,CAAA,EAAG,EAAA,GAAK,EAAA,GAAK,KAAK,GAAA,CAAI,GAAG,CAAC,CAAA,CAAA,EAAI,KAAK,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,GAAG,CAAC,CAAA,CAAE,CAAA;AAAA,IAClE;AACA,IAAA,KAAA,CAAM,IAAA;AAAA,MACJA,qBAAG,SAAA,EAAW;AAAA,QACZ,MAAA,EAAQ,GAAA,CAAI,IAAA,CAAK,GAAG,CAAA;AAAA,QACpB,IAAA,EAAM,MAAA;AAAA,QACN,MAAA,EAAQ,MAAA;AAAA,QACR,cAAA,EAAgB;AAAA,OACjB;AAAA,KACH;AAAA,EACF;AACA,EAAA,MAAM,QAAA,GAAW,EAAE,KAAA,IAAS,EAAA;AAC5B,EAAA,MAAM,UAAU,QAAA,GACZf,sBAAA;AAAA,IACE;AAAA,MACE,CAAA,EAAG,EAAA;AAAA,MACH,CAAA,EAAG,GAAG,CAAA,GAAI,CAAA;AAAA,MACV,aAAA,EAAe,QAAA;AAAA,MACf,aAAA,EAAe,WAAA;AAAA,MACf,WAAA,EAAa,EAAA;AAAA,MACb,IAAA,EAAM;AAAA,KACR;AAAA,IACA;AAAA,GACF,GACA,EAAA;AACJ,EAAA,OAAOY,wBAAM,EAAE,KAAA,EAAO,+BAA+B,CAAA,CAAE,WAAW,IAAG,EAAG;AAAA,IACtEG,qBAAG,SAAA,EAAW;AAAA,MACZ,MAAA;AAAA,MACA,IAAA,EAAM,YAAA;AAAA,MACN,MAAA,EAAQ,MAAA;AAAA,MACR,cAAA,EAAgB;AAAA,KACjB,CAAA;AAAA,IACD,GAAG,KAAA;AAAA,IACH;AAAA,GACD,CAAA;AACH;AAEA,SAAS,YAAY,EAAA,EAA8B;AACjD,EAAA,MAAM,IAAI,EAAA,CAAG,GAAA;AACb,EAAA,MAAM,EAAA,GAAK,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,KAAA,GAAQ,CAAA;AAC7B,EAAA,MAAM,EAAA,GAAK,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,MAAA,GAAS,CAAA;AAC9B,EAAA,MAAM,CAAA,GAAI,GAAG,KAAA,GAAQ,CAAA;AACrB,EAAA,MAAM,KAAA,GAAQ,EAAE,IAAA,KAAS,KAAA;AACzB,EAAA,MAAM,cAAA,GAAiB,EAAE,IAAA,KAAS,cAAA;AAClC,EAAA,MAAM,OAAA,GAAU,QAAQ,CAAA,GAAI,GAAA;AAC5B,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,QAAA,CAAS,IAAA;AAAA,IACPA,qBAAG,QAAA,EAAU;AAAA,MACX,EAAA;AAAA,MACA,EAAA;AAAA,MACA,CAAA;AAAA,MACA,IAAA,EAAM,UAAA;AAAA,MACN,MAAA,EAAQ,MAAA;AAAA,MACR,cAAA,EAAgB;AAAA,KACjB;AAAA,GACH;AACA,EAAA,IAAI,cAAA,EAAgB;AAClB,IAAA,QAAA,CAAS,IAAA;AAAA,MACPA,qBAAG,QAAA,EAAU;AAAA,QACX,EAAA;AAAA,QACA,EAAA;AAAA,QACA,GAAG,CAAA,GAAI,CAAA;AAAA,QACP,IAAA,EAAM,MAAA;AAAA,QACN,MAAA,EAAQ,MAAA;AAAA,QACR,cAAA,EAAgB;AAAA,OACjB;AAAA,KACH;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAAS,CAAA,CAAE,UAAA,KAAe,OAAA,KAAY,cAAA,IAAkB,KAAA,CAAA;AAC9D,EAAA,IAAI,CAAA,CAAE,YAAY,SAAA,EAAW;AAC3B,IAAA,QAAA,CAAS,KAAK,YAAA,CAAa,EAAA,EAAI,IAAI,CAAA,GAAI,IAAA,EAAM,MAAM,CAAC,CAAA;AAAA,EACtD,CAAA,MAAA,IAAW,CAAA,CAAE,OAAA,KAAY,OAAA,EAAS;AAChC,IAAA,QAAA,CAAS,KAAK,UAAA,CAAW,EAAA,EAAI,EAAA,EAAI,CAAA,GAAI,IAAI,CAAC,CAAA;AAAA,EAC5C;AAIA,EAAA,IAAI,EAAE,KAAA,EAAO;AACX,IAAA,QAAA,CAAS,IAAA;AAAA,MACPf,sBAAA;AAAA,QACE;AAAA,UACE,CAAA,EAAG,EAAA;AAAA,UACH,CAAA,EAAG,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,MAAA,GAAS,EAAA;AAAA,UACtB,aAAA,EAAe,QAAA;AAAA,UACf,aAAA,EAAe,WAAA;AAAA,UACf,WAAA,EAAa,EAAA;AAAA,UACb,IAAA,EAAM;AAAA,SACR;AAAA,QACA,CAAA,CAAE;AAAA;AACJ,KACF;AAAA,EACF;AACA,EAAA,OAAOY,uBAAA,CAAM,EAAE,KAAA,EAAO,CAAA,0BAAA,EAA6B,CAAA,CAAE,IAAI,CAAA,SAAA,EAAY,CAAA,CAAE,OAAO,CAAA,CAAA,EAAG,EAAG,QAAQ,CAAA;AAC9F;AAEA,SAAS,YAAA,CAAa,EAAA,EAAY,EAAA,EAAY,IAAA,EAAc,MAAA,EAAyB;AACnF,EAAA,MAAM,CAAA,GAAI,IAAA;AACV,EAAA,MAAM,IAAI,IAAA,GAAO,GAAA;AACjB,EAAA,MAAM,CAAA,GAAI,KAAK,CAAA,GAAI,CAAA;AACnB,EAAA,MAAM,CAAA,GAAI,KAAK,CAAA,GAAI,CAAA;AACnB,EAAA,OAAOG,oBAAA,CAAG,GAAA,EAAK,EAAE,KAAA,EAAO,mBAAkB,EAAG;AAAA,IAC3CA,qBAAG,MAAA,EAAQ;AAAA,MACT,CAAA;AAAA,MACA,CAAA;AAAA,MACA,KAAA,EAAO,CAAA;AAAA,MACP,MAAA,EAAQ,CAAA;AAAA,MACR,IAAA,EAAM,SAAS,MAAA,GAAS,SAAA;AAAA,MACxB,MAAA,EAAQ,MAAA;AAAA,MACR,cAAA,EAAgB;AAAA,KACjB,CAAA;AAAA,IACDA,qBAAG,MAAA,EAAQ;AAAA,MACT,CAAA,EAAG,CAAA,EAAA,EAAK,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,GAAA,EAAM,EAAE,CAAA,CAAA,EAAI,CAAA,GAAI,IAAI,IAAI,CAAA,GAAA,EAAM,CAAA,GAAI,CAAC,IAAI,CAAC,CAAA,CAAA;AAAA,MACtD,MAAA,EAAQ,SAAS,SAAA,GAAY,MAAA;AAAA,MAC7B,cAAA,EAAgB,CAAA;AAAA,MAChB,IAAA,EAAM;AAAA,KACP;AAAA,GACF,CAAA;AACH;AAEA,SAAS,UAAA,CAAW,EAAA,EAAY,EAAA,EAAY,IAAA,EAAsB;AAChE,EAAA,MAAM,IAAI,IAAA,GAAO,CAAA;AAEjB,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,EAAK;AAC3B,IAAA,MAAM,MAAO,CAAA,GAAI,IAAA,CAAK,EAAA,GAAM,CAAA,GAAI,KAAK,EAAA,GAAK,CAAA;AAC1C,IAAA,MAAM,MAAM,EAAA,GAAA,CAAM,CAAA,GAAI,GAAA,IAAO,IAAA,CAAK,IAAI,GAAG,CAAA;AACzC,IAAA,MAAM,MAAM,EAAA,GAAA,CAAM,CAAA,GAAI,GAAA,IAAO,IAAA,CAAK,IAAI,GAAG,CAAA;AACzC,IAAA,MAAM,GAAA,GAAM,EAAA,GAAK,CAAA,GAAI,IAAA,CAAK,IAAI,GAAG,CAAA;AACjC,IAAA,MAAM,GAAA,GAAM,EAAA,GAAK,CAAA,GAAI,IAAA,CAAK,IAAI,GAAG,CAAA;AACjC,IAAA,KAAA,CAAM,IAAA,CAAK,KAAK,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,GAAA,EAAM,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAE,CAAA;AAAA,EAC9C;AACA,EAAA,OAAOA,oBAAA,CAAG,GAAA,EAAK,EAAE,KAAA,EAAO,iBAAgB,EAAG;AAAA,IACzCA,oBAAA,CAAG,QAAA,EAAU,EAAE,EAAA,EAAI,EAAA,EAAI,CAAA,EAAG,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAQ,cAAA,EAAgB,CAAA,EAAG,CAAA;AAAA,IAC3EA,oBAAA,CAAG,MAAA,EAAQ,EAAE,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA,EAAG,MAAA,EAAQ,MAAA,EAAQ,cAAA,EAAgB,GAAA,EAAK,CAAA;AAAA;AAAA,IAEtEA,qBAAG,MAAA,EAAQ;AAAA,MACT,CAAA,EAAG,KAAK,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,GAAA,EAAM,EAAE,IAAI,EAAA,GAAK,CAAA,GAAI,GAAG,CAAA,GAAA,EAAM,EAAE,IAAI,EAAE,CAAA,GAAA,EAAM,KAAK,CAAA,GAAI,GAAG,IAAI,EAAE,CAAA,CAAA;AAAA,MAC9E,MAAA,EAAQ,MAAA;AAAA,MACR,cAAA,EAAgB,GAAA;AAAA,MAChB,gBAAA,EAAkB;AAAA,KACnB;AAAA,GACF,CAAA;AACH;AAIA,SAAS,WAAW,EAAA,EAA4B;AAC9C,EAAA,MAAM,IAAI,EAAA,CAAG,IAAA;AACb,EAAA,MAAM,SAAA,GAAY,EAAE,IAAA,KAAS,SAAA;AAC7B,EAAA,MAAM,SAAA,GAAY,YAAY,KAAA,GAAQ,MAAA;AACtC,EAAA,MAAM,WAAA,GAAc,YAAY,sBAAA,GAAyB,MAAA;AACzD,EAAA,MAAM,SAAA,GAAY,YAAY,sBAAA,GAAyB,sBAAA;AACvD,EAAA,MAAM,QAAA,GAAqB;AAAA,IACzBJ,sBAAA,CAAK;AAAA,MACH,GAAG,EAAA,CAAG,IAAA;AAAA,MACN,IAAA,EAAM,MAAA;AAAA,MACN,MAAA,EAAQ,YAAY,YAAA,GAAe,MAAA;AAAA,MACnC,cAAA,EAAgB,GAAA;AAAA,MAChB,kBAAA,EAAoB,SAAA;AAAA,MACpB,cAAA,EAAgB,WAAA;AAAA,MAChB,YAAA,EAAc;AAAA,KACf;AAAA,GACH;AAEA,EAAA,IAAI,CAAA,CAAE,SAAS,aAAA,EAAe;AAC5B,IAAA,MAAM,IAAA,GAAO,UAAA,CAAW,EAAA,CAAG,IAAI,CAAA;AAC/B,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,QAAA,CAAS,IAAA;AAAA,QACPI,qBAAG,SAAA,EAAW;AAAA,UACZ,QAAQ,aAAA,CAAc,IAAA,CAAK,CAAA,EAAG,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,UACvC,IAAA,EAAM,SAAA;AAAA,UACN,MAAA,EAAQ,MAAA;AAAA,UACR,cAAA,EAAgB;AAAA,SACjB;AAAA,OACH;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,CAAA,CAAE,SAAS,SAAA,EAAW;AACxB,IAAA,MAAM,IAAA,GAAO,UAAA,CAAW,EAAA,CAAG,IAAI,CAAA;AAC/B,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,QAAA,CAAS,IAAA;AAAA,QACPA,qBAAG,MAAA,EAAQ;AAAA,UACT,GAAG,CAAA,EAAA,EAAK,IAAA,CAAK,CAAA,GAAI,CAAC,IAAI,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA,GAAA,EAAM,KAAK,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,UAC9D,MAAA,EAAQ,MAAA;AAAA,UACR,cAAA,EAAgB;AAAA,SACjB;AAAA,OACH;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,CAAA,CAAE,KAAA,IAAS,EAAA,CAAG,WAAA,EAAa;AAC7B,IAAA,QAAA,CAAS,IAAA;AAAA,MACPf,sBAAA;AAAA,QACE;AAAA,UACE,CAAA,EAAG,GAAG,WAAA,CAAY,CAAA;AAAA,UAClB,CAAA,EAAG,GAAG,WAAA,CAAY,CAAA;AAAA,UAClB,aAAA,EAAe,QAAA;AAAA,UACf,aAAA,EAAe,WAAA;AAAA,UACf,WAAA,EAAa,EAAA;AAAA,UACb,IAAA,EAAM;AAAA,SACR;AAAA,QACA,CAAA,CAAE;AAAA;AACJ,KACF;AAAA,EACF;AACA,EAAA,OAAOY,uBAAA,CAAM,EAAE,KAAA,EAAO,CAAA,yBAAA,EAA4B,EAAE,IAAI,CAAA,CAAA,IAAM,QAAQ,CAAA;AACxE;AAEA,SAAS,WAAW,CAAA,EAA4C;AAC9D,EAAA,MAAM,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,4CAA4C,CAAA;AAC9D,EAAA,IAAI,CAAC,GAAG,OAAO,IAAA;AACf,EAAA,OAAO,EAAE,CAAA,EAAG,UAAA,CAAW,CAAA,CAAE,CAAC,CAAE,CAAA,EAAG,CAAA,EAAG,UAAA,CAAW,CAAA,CAAE,CAAC,CAAE,CAAA,EAAE;AACtD;AAEA,SAAS,aAAA,CAAc,EAAA,EAAY,EAAA,EAAY,CAAA,EAAmB;AAChE,EAAA,OAAO,GAAG,EAAA,GAAK,CAAC,IAAI,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,EAAA,GAAK,CAAC,CAAA,CAAA,EAAI,EAAA,GAAK,CAAC,CAAA,CAAA,EAAI,EAAE,IAAI,EAAE,CAAA,CAAA,EAAI,KAAK,CAAC,CAAA,CAAA;AACxE;;;ACxpBO,IAAM,IAAA,GAAsB;AAAA,EACjC,IAAA,EAAM,MAAA;AAAA,EACN,OAAOZ,KAAAA,EAAuB;AAC5B,IAAA,KAAA,MAAW,GAAA,IAAOA,KAAAA,CAAK,KAAA,CAAM,OAAO,CAAA,EAAG;AACrC,MAAA,MAAM,CAAA,GAAI,IAAI,IAAA,EAAK;AACnB,MAAA,IAAI,CAAA,CAAE,WAAW,CAAA,EAAG;AACpB,MAAA,IAAI,CAAA,CAAE,UAAA,CAAW,IAAI,CAAA,IAAK,CAAA,CAAE,UAAA,CAAW,GAAG,CAAA,IAAK,CAAA,CAAE,UAAA,CAAW,IAAI,CAAA,EAAG;AACnE,MAAA,MAAM,KAAA,GAAQ,EAAE,KAAA,CAAM,KAAK,EAAE,CAAC,CAAA,EAAG,aAAY,IAAK,EAAA;AAClD,MAAA,OAAO,KAAA,KAAU,MAAA;AAAA,IACnB;AACA,IAAA,OAAO,KAAA;AAAA,EACT,CAAA;AAAA,EACA,KAAA,EAAO,SAAA;AAAA,EACP,MAAA,CAAOA,OAAc,MAAA,EAA+B;AAClD,IAAA,OAAO,UAAA,CAAWA,KAAY,CAAA;AAAA,EAChC;AACF,CAAA;;;ACeO,IAAM,WAAA,GAAkD;AAAA;AAAA,EAE7D,GAAA,EAAK;AAAA,IACH,IAAA,EAAM,KAAA;AAAA,IACN,WAAA,EAAa,GAAA;AAAA,IACb,KAAA,EAAO;AAAA,MACL,EAAE,MAAM,KAAA,EAAO,IAAA,EAAM,MAAM,QAAA,EAAU,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,MAC5D,EAAE,MAAM,KAAA,EAAO,IAAA,EAAM,MAAM,QAAA,EAAU,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,MAC5D,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,UAAU,MAAA;AAAO,KAC/C;AAAA,IACA,aAAA,EAAe,CAAA;AAAA,IACf,UAAA,EAAY;AAAA,GACd;AAAA,EACA,EAAA,EAAI;AAAA,IACF,IAAA,EAAM,IAAA;AAAA,IACN,WAAA,EAAa,SAAA;AAAA,IACb,KAAA,EAAO;AAAA,MACL,EAAE,MAAM,KAAA,EAAO,IAAA,EAAM,MAAM,QAAA,EAAU,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,MAC5D,EAAE,MAAM,KAAA,EAAO,IAAA,EAAM,MAAM,QAAA,EAAU,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,MAC5D,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,UAAU,MAAA;AAAO,KAC/C;AAAA,IACA,aAAA,EAAe,CAAA;AAAA,IACf,UAAA,EAAY;AAAA,GACd;AAAA,EACA,GAAA,EAAK;AAAA,IACH,IAAA,EAAM,KAAA;AAAA,IACN,WAAA,EAAa,GAAA;AAAA,IACb,aAAA,EAAe,IAAA;AAAA,IACf,KAAA,EAAO;AAAA,MACL,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,UAAU,MAAA,EAAO;AAAA,MAC3C,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,UAAU,MAAA;AAAO,KAC/C;AAAA,IACA,UAAA,EAAY;AAAA,GACd;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,MAAA;AAAA,IACN,WAAA,EAAa,GAAA;AAAA,IACb,aAAA,EAAe,IAAA;AAAA,IACf,KAAA,EAAO;AAAA,MACL,EAAE,MAAM,KAAA,EAAO,IAAA,EAAM,MAAM,QAAA,EAAU,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,MAC5D,EAAE,MAAM,KAAA,EAAO,IAAA,EAAM,MAAM,QAAA,EAAU,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,MAC5D,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,UAAU,MAAA;AAAO,KAC/C;AAAA,IACA,aAAA,EAAe,CAAA;AAAA,IACf,UAAA,EAAY;AAAA,GACd;AAAA,EACA,GAAA,EAAK;AAAA,IACH,IAAA,EAAM,KAAA;AAAA,IACN,WAAA,EAAa,SAAA;AAAA,IACb,aAAA,EAAe,IAAA;AAAA,IACf,KAAA,EAAO;AAAA,MACL,EAAE,MAAM,KAAA,EAAO,IAAA,EAAM,MAAM,QAAA,EAAU,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,MAC5D,EAAE,MAAM,KAAA,EAAO,IAAA,EAAM,MAAM,QAAA,EAAU,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,MAC5D,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,UAAU,MAAA;AAAO,KAC/C;AAAA,IACA,aAAA,EAAe,CAAA;AAAA,IACf,UAAA,EAAY;AAAA,GACd;AAAA,EACA,GAAA,EAAK;AAAA,IACH,IAAA,EAAM,KAAA;AAAA,IACN,WAAA,EAAa,IAAA;AAAA,IACb,KAAA,EAAO;AAAA,MACL,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,UAAU,MAAA,EAAO;AAAA,MAC5C,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,UAAU,MAAA,EAAO;AAAA,MAC5C,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,UAAU,MAAA;AAAO,KAC/C;AAAA,IACA,UAAA,EAAY;AAAA,GACd;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,MAAA;AAAA,IACN,WAAA,EAAa,IAAA;AAAA,IACb,aAAA,EAAe,IAAA;AAAA,IACf,KAAA,EAAO;AAAA,MACL,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,UAAU,MAAA,EAAO;AAAA,MAC5C,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,UAAU,MAAA,EAAO;AAAA,MAC5C,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,UAAU,MAAA;AAAO,KAC/C;AAAA,IACA,UAAA,EAAY;AAAA,GACd;AAAA,EACA,GAAA,EAAK;AAAA,IACH,IAAA,EAAM,KAAA;AAAA,IACN,WAAA,EAAa,GAAA;AAAA,IACb,KAAA,EAAO;AAAA,MACL,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,UAAU,MAAA,EAAO;AAAA,MAC3C,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,UAAU,MAAA;AAAO,KAC/C;AAAA,IACA,UAAA,EAAY;AAAA,GACd;AAAA;AAAA,EAGA,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,QAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,UAAU,MAAA,EAAO;AAAA,MAC5C,EAAE,IAAA,EAAM,GAAA,EAAK,IAAA,EAAM,KAAA,EAAO,UAAU,MAAA;AAAO,KAC7C;AAAA,IACA,UAAA,EAAY;AAAA,GACd;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,QAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,UAAU,MAAA,EAAO;AAAA,MAC5C,EAAE,IAAA,EAAM,GAAA,EAAK,IAAA,EAAM,KAAA,EAAO,UAAU,MAAA;AAAO,KAC7C;AAAA,IACA,UAAA,EAAY;AAAA,GACd;AAAA;AAAA,EAGA,EAAA,EAAI;AAAA,IACF,IAAA,EAAM,IAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,UAAU,MAAA,EAAO;AAAA,MAC3C,EAAE,IAAA,EAAM,GAAA,EAAK,IAAA,EAAM,IAAA,EAAM,UAAU,MAAA,EAAO;AAAA,MAC1C,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,UAAU,MAAA;AAAO,KAC9C;AAAA,IACA,UAAA,EAAY;AAAA,GACd;AAAA,EACA,EAAA,EAAI;AAAA,IACF,IAAA,EAAM,IAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,IAAA,EAAM,GAAA,EAAK,IAAA,EAAM,IAAA,EAAM,UAAU,MAAA,EAAO;AAAA,MAC1C,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,UAAU,MAAA,EAAO;AAAA,MAC3C,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,UAAU,MAAA;AAAO,KAC9C;AAAA,IACA,UAAA,EAAY;AAAA,GACd;AAAA;AAAA,EAGA,GAAA,EAAK;AAAA,IACH,IAAA,EAAM,KAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,UAAU,MAAA,EAAO;AAAA,MAC3C,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,UAAU,MAAA,EAAO;AAAA,MAC3C,EAAE,IAAA,EAAM,GAAA,EAAK,IAAA,EAAM,KAAA,EAAO,UAAU,MAAA,EAAO;AAAA,MAC3C,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,UAAU,MAAA;AAAO,KAC9C;AAAA,IACA,UAAA,EAAY;AAAA,GACd;AAAA,EACA,GAAA,EAAK;AAAA,IACH,IAAA,EAAM,KAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,UAAU,MAAA,EAAO;AAAA,MAC3C,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,UAAU,MAAA,EAAO;AAAA,MAC3C,EAAE,IAAA,EAAM,GAAA,EAAK,IAAA,EAAM,KAAA,EAAO,UAAU,MAAA,EAAO;AAAA,MAC3C,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,UAAU,MAAA;AAAO,KAC9C;AAAA,IACA,UAAA,EAAY;AAAA,GACd;AAAA,EACA,EAAA,EAAI;AAAA,IACF,IAAA,EAAM,IAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,UAAU,MAAA,EAAO;AAAA,MAC3C,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,UAAU,MAAA,EAAO;AAAA,MAC3C,EAAE,IAAA,EAAM,GAAA,EAAK,IAAA,EAAM,KAAA,EAAO,UAAU,MAAA,EAAO;AAAA,MAC3C,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,UAAU,MAAA;AAAO,KAC9C;AAAA,IACA,UAAA,EAAY;AAAA,GACd;AAAA;AAAA,EAGA,GAAA,EAAK;AAAA,IACH,IAAA,EAAM,KAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,UAAU,MAAA,EAAO;AAAA,MAC3C,EAAE,IAAA,EAAM,GAAA,EAAK,IAAA,EAAM,IAAA,EAAM,UAAU,MAAA,EAAO;AAAA,MAC1C,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,UAAU,KAAA,EAAM;AAAA,MAC1C,EAAE,IAAA,EAAM,GAAA,EAAK,IAAA,EAAM,KAAA,EAAO,UAAU,MAAA,EAAO;AAAA,MAC3C,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,UAAU,KAAA;AAAM,KAC7C;AAAA,IACA,UAAA,EAAY;AAAA,GACd;AAAA,EACA,GAAA,EAAK;AAAA,IACH,IAAA,EAAM,KAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,UAAU,MAAA,EAAO;AAAA,MAC3C,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,UAAU,MAAA,EAAO;AAAA,MAC3C,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,UAAU,KAAA,EAAM;AAAA,MAC1C,EAAE,IAAA,EAAM,GAAA,EAAK,IAAA,EAAM,KAAA,EAAO,UAAU,MAAA,EAAO;AAAA,MAC3C,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,UAAU,KAAA;AAAM,KAC7C;AAAA,IACA,UAAA,EAAY;AAAA,GACd;AAAA;AAAA,EAGA,GAAA,EAAK;AAAA,IACH,IAAA,EAAM,KAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,MAAM,KAAA,EAAO,IAAA,EAAM,MAAM,QAAA,EAAU,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,MAC5D,EAAE,MAAM,KAAA,EAAO,IAAA,EAAM,MAAM,QAAA,EAAU,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,MAC5D,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,UAAU,MAAA;AAAO,KAC/C;AAAA,IACA,aAAA,EAAe,CAAA;AAAA,IACf,UAAA,EAAY;AAAA,GACd;AAAA,EACA,GAAA,EAAK;AAAA,IACH,IAAA,EAAM,KAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,UAAU,MAAA,EAAO;AAAA,MAC5C,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,UAAU,MAAA,EAAO;AAAA,MAC5C,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,UAAU,MAAA;AAAO,KAC/C;AAAA,IACA,UAAA,EAAY;AAAA,GACd;AAAA,EACA,GAAA,EAAK;AAAA,IACH,IAAA,EAAM,KAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,MAAM,KAAA,EAAO,IAAA,EAAM,MAAM,QAAA,EAAU,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,MAC5D,EAAE,MAAM,KAAA,EAAO,IAAA,EAAM,MAAM,QAAA,EAAU,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,MAC5D,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,UAAU,MAAA;AAAO,KAC/C;AAAA,IACA,aAAA,EAAe,CAAA;AAAA,IACf,UAAA,EAAY;AAAA,GACd;AAAA,EACA,GAAA,EAAK;AAAA,IACH,IAAA,EAAM,KAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,UAAU,MAAA,EAAO;AAAA,MAC5C,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,UAAU,MAAA,EAAO;AAAA,MAC5C,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,UAAU,MAAA;AAAO,KAC/C;AAAA,IACA,UAAA,EAAY;AAAA,GACd;AAAA,EACA,GAAA,EAAK;AAAA,IACH,IAAA,EAAM,KAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,UAAU,KAAA,EAAM;AAAA,MAC3C,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,UAAU,KAAA,EAAM;AAAA,MAC3C,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,UAAU,KAAA;AAAM,KAC9C;AAAA,IACA,UAAA,EAAY;AAAA,GACd;AAAA,EACA,GAAA,EAAK;AAAA,IACH,IAAA,EAAM,KAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,UAAU,MAAA,EAAO;AAAA,MAC3C,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,UAAU,MAAA;AAAO,KAC/C;AAAA,IACA,UAAA,EAAY;AAAA,GACd;AAAA,EACA,GAAA,EAAK;AAAA,IACH,IAAA,EAAM,KAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,UAAU,MAAA,EAAO;AAAA,MAC3C,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,UAAU,MAAA;AAAO,KAC/C;AAAA,IACA,UAAA,EAAY;AAAA,GACd;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,MAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,UAAU,KAAA,EAAM;AAAA,MAC1C,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,UAAU,KAAA;AAAM,KAC9C;AAAA,IACA,UAAA,EAAY;AAAA,GACd;AAAA;AAAA,EAGA,EAAA,EAAI;AAAA,IACF,IAAA,EAAM,IAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,UAAU,KAAA,EAAM;AAAA,MAC3C,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,UAAU,KAAA,EAAM;AAAA,MAC3C,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,UAAU,MAAA;AAAO,KAC/C;AAAA,IACA,UAAA,EAAY;AAAA,GACd;AAAA,EACA,EAAA,EAAI;AAAA,IACF,IAAA,EAAM,IAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,UAAU,KAAA,EAAM;AAAA,MAC3C,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,UAAU,KAAA,EAAM;AAAA,MAC3C,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,UAAU,MAAA;AAAO,KAC/C;AAAA,IACA,UAAA,EAAY;AAAA,GACd;AAAA,EACA,EAAA,EAAI;AAAA,IACF,IAAA,EAAM,IAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,UAAU,KAAA,EAAM;AAAA,MAC3C,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,UAAU,KAAA,EAAM;AAAA,MAC3C,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,UAAU,MAAA;AAAO,KAC/C;AAAA,IACA,UAAA,EAAY;AAAA,GACd;AAAA,EACA,EAAA,EAAI;AAAA,IACF,IAAA,EAAM,IAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,UAAU,KAAA,EAAM;AAAA,MAC3C,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,UAAU,KAAA,EAAM;AAAA,MAC3C,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,UAAU,MAAA;AAAO,KAC/C;AAAA,IACA,UAAA,EAAY;AAAA,GACd;AAAA,EACA,EAAA,EAAI;AAAA,IACF,IAAA,EAAM,IAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,UAAU,KAAA,EAAM;AAAA,MAC3C,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,UAAU,KAAA,EAAM;AAAA,MAC3C,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,UAAU,MAAA;AAAO,KAC/C;AAAA,IACA,UAAA,EAAY;AAAA,GACd;AAAA,EACA,EAAA,EAAI;AAAA,IACF,IAAA,EAAM,IAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,UAAU,KAAA,EAAM;AAAA,MAC3C,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,UAAU,KAAA,EAAM;AAAA,MAC3C,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,UAAU,MAAA;AAAO,KAC/C;AAAA,IACA,UAAA,EAAY;AAAA,GACd;AAAA;AAAA,EAGA,GAAA,EAAK;AAAA,IACH,IAAA,EAAM,KAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,IAAA,EAAM,GAAA,EAAK,IAAA,EAAM,IAAA,EAAM,UAAU,MAAA,EAAO;AAAA,MAC1C,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,UAAU,KAAA,EAAM;AAAA,MAC3C,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,UAAU,KAAA,EAAM;AAAA,MAC3C,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,UAAU,KAAA;AAAM,KAC9C;AAAA,IACA,UAAA,EAAY;AAAA,GACd;AAAA,EACA,GAAA,EAAK;AAAA,IACH,IAAA,EAAM,KAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,IAAA,EAAM,GAAA,EAAK,IAAA,EAAM,IAAA,EAAM,UAAU,KAAA,EAAM;AAAA,MACzC,EAAE,MAAM,KAAA,EAAO,IAAA,EAAM,MAAM,QAAA,EAAU,KAAA,EAAO,UAAU,IAAA,EAAK;AAAA,MAC3D,EAAE,MAAM,KAAA,EAAO,IAAA,EAAM,MAAM,QAAA,EAAU,KAAA,EAAO,UAAU,IAAA,EAAK;AAAA,MAC3D,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,UAAU,KAAA;AAAM,KAC9C;AAAA,IACA,UAAA,EAAY;AAAA,GACd;AAAA,EACA,GAAA,EAAK;AAAA,IACH,IAAA,EAAM,KAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,MAAM,KAAA,EAAO,IAAA,EAAM,MAAM,QAAA,EAAU,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,MAC5D,EAAE,MAAM,KAAA,EAAO,IAAA,EAAM,MAAM,QAAA,EAAU,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,MAC5D,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,UAAU,MAAA;AAAO,KAC/C;AAAA,IACA,aAAA,EAAe,CAAA;AAAA,IACf,UAAA,EAAY;AAAA,GACd;AAAA,EACA,GAAA,EAAK;AAAA,IACH,IAAA,EAAM,KAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,MAAM,KAAA,EAAO,IAAA,EAAM,MAAM,QAAA,EAAU,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,MAC5D,EAAE,MAAM,KAAA,EAAO,IAAA,EAAM,MAAM,QAAA,EAAU,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,MAC5D,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,UAAU,MAAA;AAAO,KAC/C;AAAA,IACA,aAAA,EAAe,CAAA;AAAA,IACf,UAAA,EAAY;AAAA,GACd;AAAA,EACA,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,OAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,UAAU,MAAA,EAAO;AAAA,MAC3C,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,UAAU,MAAA,EAAO;AAAA,MAC3C,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,UAAU,MAAA,EAAO;AAAA,MAC3C,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,UAAU,MAAA;AAAO,KAC/C;AAAA,IACA,UAAA,EAAY;AAAA;AAEhB,CAAA;AAEO,SAAS,WAAW,IAAA,EAAuC;AAChE,EAAA,OAAO,IAAA,IAAQ,WAAA;AACjB;AAEO,SAAS,aAAa,IAAA,EAAkC;AAC7D,EAAA,OAAO,YAAY,IAAI,CAAA;AACzB;;;AC3XO,IAAM,aAAA,GAAN,cAA4B,KAAA,CAAM;AAAA,EACvC,IAAA;AAAA,EACA,MAAA;AAAA,EACA,WAAA,CAAY,OAAA,EAAiBD,KAAAA,EAAe,MAAA,EAAiB;AAC3D,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,eAAA;AACZ,IAAA,IAAIA,KAAAA,KAAS,MAAA,EAAW,IAAA,CAAK,IAAA,GAAOA,KAAAA;AACpC,IAAA,IAAI,MAAA,KAAW,MAAA,EAAW,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAC1C;AACF,CAAA;AAEA,IAAM,gBAAA,GAAkC;AAAA,EACtC,MAAA;AAAA,EAAQ,KAAA;AAAA,EAAO,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,OAAA;AAAA,EAC/B,MAAA;AAAA,EAAQ,OAAA;AAAA,EAAS,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,KAAA;AAAA,EACjC,QAAA;AAAA,EAAU,SAAA;AAAA,EAAW,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,OAAA;AAAA,EACrC,OAAA;AAAA,EAAS;AACX,CAAA;AAEA,IAAM,cAAA,GAA8C;AAAA,EAClD,GAAA,EAAK,OAAA;AAAA,EACL,SAAA,EAAW,OAAA;AAAA,EACX,UAAA,EAAY,QAAA;AAAA,EACZ,UAAA,EAAY,QAAA;AAAA,EACZ,UAAA,EAAY,QAAA;AAAA,EACZ,YAAA,EAAc;AAChB,CAAA;AAQA,SAAS,cAAcC,KAAAA,EAAyB;AAC9C,EAAA,MAAM,MAAiB,EAAC;AACxB,EAAA,MAAM,KAAA,GAAQA,KAAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC7B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,MAAM,KAAA,CAAM,CAAC,CAAA,CAAE,OAAA,CAAQ,OAAO,EAAE,CAAA;AAEtC,IAAA,IAAI,QAAA,GAAW,EAAA;AACf,IAAA,IAAI,KAAA,GAAQ,KAAA;AACZ,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACnC,MAAA,MAAM,EAAA,GAAK,IAAI,CAAC,CAAA;AAChB,MAAA,IAAI,EAAA,KAAO,GAAA,EAAK,KAAA,GAAQ,CAAC,KAAA;AACzB,MAAA,IAAI,CAAC,KAAA,IAAS,EAAA,KAAO,GAAA,EAAK;AACxB,QAAA,MAAM,IAAA,GAAO,GAAA,CAAI,CAAA,GAAI,CAAC,CAAA;AACtB,QAAA,IAAI,IAAA,KAAS,MAAA,IAAa,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,EAAG;AAAA,MAC7C;AACA,MAAA,QAAA,IAAY,EAAA;AAAA,IACd;AACA,IAAA,IAAI,CAAC,QAAA,CAAS,IAAA,EAAK,EAAG;AACtB,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,OAAO,MAAA,GAAS,QAAA,CAAS,MAAA,KAAW,QAAA,CAAS,MAAM,MAAM,GAAA,IAAO,QAAA,CAAS,MAAM,CAAA,KAAM,GAAA,CAAA,EAAO;AAC1F,MAAA,MAAA,IAAU,QAAA,CAAS,MAAM,CAAA,KAAM,GAAA,GAAO,CAAA,GAAI,CAAA;AAAA,IAC5C;AACA,IAAA,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,QAAA,CAAS,IAAA,IAAQ,MAAA,EAAQ,MAAA,EAAQ,CAAA,GAAI,CAAA,EAAG,CAAA;AAAA,EAC3D;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,cAAc,CAAA,EAAmB;AACxC,EAAA,OAAO,EAAE,IAAA,EAAK,CAAE,QAAQ,UAAA,EAAY,EAAE,EAAE,IAAA,EAAK;AAC/C;AAEA,SAAS,aAAaD,KAAAA,EAAkC;AACtD,EAAA,MAAM,CAAA,GAAIA,KAAAA,CAAK,IAAA,CAAK,KAAA,CAAM,wHAAwH,CAAA;AAClJ,EAAA,IAAI,CAAC,GAAG,OAAO,IAAA;AACf,EAAA,MAAM,QAAQ,cAAA,CAAe,CAAA,CAAE,CAAC,CAAA,CAAE,WAAA,EAAa,CAAA,IAAK,OAAA;AACpD,EAAA,MAAM,IAAA,GAAO,EAAE,CAAC,CAAA;AAChB,EAAA,MAAM,OAAA,GAAU,CAAA,CAAE,CAAC,CAAA,CAAE,WAAA,EAAY;AACjC,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,CAAC,CAAA,EAAG,IAAA,EAAK;AACxB,EAAA,MAAM,WAAA,GAAe,gBAAA,CAA8B,QAAA,CAAS,OAAO,CAAA;AACnE,EAAA,MAAM,IAAA,GAAmB;AAAA,IACvB,IAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA,EAAU,WAAA,GAAe,OAAA,GAA0B,CAAA,CAAE,CAAC,CAAA;AAAA,IACtD,UAAU,CAAC;AAAA,GACb;AACA,EAAA,IAAI,IAAA,KAAS,MAAA,EAAW,IAAA,CAAK,SAAA,GAAY,IAAA;AACzC,EAAA,OAAO,IAAA;AACT;AAOA,SAAS,mBAAmBA,KAAAA,EAAqC;AAE/D,EAAA,MAAM,CAAA,GAAIA,KAAAA,CAAK,IAAA,CAAK,KAAA,CAAM,mEAAmE,CAAA;AAC7F,EAAA,IAAI,CAAC,GAAG,OAAO,IAAA;AACf,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,EAAE,CAAC,CAAA,GAAI,SAAS,CAAA,CAAE,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,EAAA;AAAA;AAAA,IACnC,KAAA,EAAO,EAAE,CAAC;AAAA,GACZ;AACF;AAMA,SAAS,UAAU,CAAA,EAAqB;AACtC,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,KAAA,GAAQ,KAAA;AACZ,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,QAAQ,CAAA,EAAA,EAAK;AACjC,IAAA,MAAM,EAAA,GAAK,EAAE,CAAC,CAAA;AACd,IAAA,IAAI,OAAO,GAAA,EAAK;AACd,MAAA,KAAA,GAAQ,CAAC,KAAA;AACT,MAAA,GAAA,IAAO,EAAA;AACP,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,IAAI,EAAA,KAAO,GAAA,IAAO,EAAA,KAAO,GAAA,EAAK,KAAA,EAAA;AAAA,WAAA,IACrB,EAAA,KAAO,GAAA,IAAO,EAAA,KAAO,GAAA,EAAK,KAAA,EAAA;AAAA,WAAA,IAC1B,EAAA,KAAO,GAAA,IAAO,KAAA,KAAU,CAAA,EAAG;AAClC,QAAA,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,CAAA;AACnB,QAAA,GAAA,GAAM,EAAA;AACN,QAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,GAAA,IAAO,EAAA;AAAA,EACT;AACA,EAAA,IAAI,IAAI,IAAA,EAAK,MAAO,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA;AACnC,EAAA,OAAO,GAAA;AACT;AAQA,SAAS,SAAS,GAAA,EAAwB;AACxC,EAAA,IAAI,CAAA,GAAI,IAAI,IAAA,EAAK;AACjB,EAAA,IAAI,IAAA;AAEJ,EAAA,MAAM,EAAA,GAAK,CAAA,CAAE,KAAA,CAAM,6BAA6B,CAAA;AAChD,EAAA,IAAI,EAAA,EAAI;AACN,IAAA,IAAA,GAAO,GAAG,CAAC,CAAA;AACX,IAAA,CAAA,GAAI,EAAA,CAAG,CAAC,CAAA,CAAE,IAAA,EAAK;AAAA,EACjB;AACA,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,IAAI,CAAA,CAAE,UAAA,CAAW,GAAG,CAAA,EAAG;AACrB,IAAA,OAAA,GAAU,IAAA;AACV,IAAA,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,EAAK;AAAA,EACtB;AACA,EAAA,OAAO,EAAE,IAAA,EAAM,GAAA,EAAK,CAAA,EAAG,OAAA,EAAQ;AACjC;AAEA,IAAM,WAAA,GAAc,oCAAA;AACpB,IAAM,UAAA,GAAa,iBAAA;AAEnB,SAAS,UAAU,CAAA,EAAoB;AACrC,EAAA,IAAI,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA,EAAG,OAAO,IAAA;AAChC,EAAA,IAAI,UAAA,CAAW,IAAA,CAAK,CAAC,CAAA,EAAG,OAAO,IAAA;AAC/B,EAAA,IAAI,iBAAA,CAAkB,IAAA,CAAK,CAAC,CAAA,EAAG,OAAO,IAAA;AACtC,EAAA,IAAI,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA,EAAG,OAAO,IAAA;AAChC,EAAA,OAAO,KAAA;AACT;AAeA,SAAS,YAAA,CAAaqC,QAAoB,QAAA,EAA2B;AACnE,EAAAA,MAAAA,CAAM,YAAA,EAAA;AASN,EAAA,OAAO,CAAA,IAAA,EAAOA,OAAM,YAAY,CAAA,CAAA;AAClC;AAEA,SAAS,SAAA,CAAUA,MAAAA,EAAoB,IAAA,EAAc,QAAA,GAAwB,MAAA,EAAc;AACzF,EAAA,IAAIA,MAAAA,CAAM,SAAA,CAAU,GAAA,CAAI,IAAI,CAAA,EAAG;AAC/B,EAAA,MAAM,IAAA,GAAmB,EAAE,IAAA,EAAM,KAAA,EAAO,SAAS,QAAA,EAAS;AAC1D,EAAAA,MAAAA,CAAM,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA;AACzB,EAAAA,MAAAA,CAAM,SAAA,CAAU,GAAA,CAAI,IAAA,EAAM,IAAI,CAAA;AAC9B,EAAAA,MAAAA,CAAM,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA;AACzB;AAUA,SAAS,SAAA,CACPA,MAAAA,EACA,OAAA,EACA,cAAA,EACA,OACA,MAAA,EAC4D;AAE5D,EAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,KAAA,CAAM,gCAAgC,CAAA;AACxD,EAAA,IAAI,CAAC,CAAA,EAAG;AACN,IAAA,MAAM,IAAI,aAAA,CAAc,CAAA,oBAAA,EAAuB,OAAO,CAAA,CAAA,EAAI,QAAQ,OAAO,CAAA;AAAA,EAC3E;AACA,EAAA,MAAM,SAAA,GAAY,EAAE,CAAC,CAAA;AACrB,EAAA,MAAM,OAAA,GAAU,EAAE,CAAC,CAAA;AAEnB,EAAA,IAAI,CAAC,UAAA,CAAW,SAAA,CAAU,WAAA,EAAa,CAAA,EAAG;AACxC,IAAA,MAAM,IAAI,aAAA;AAAA,MACR,2BAA2B,SAAS,CAAA,yCAAA,CAAA;AAAA,MACpC,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACA,EAAA,MAAM,KAAA,GAAQ,UAAU,WAAA,EAAY;AACpC,EAAA,MAAM,IAAA,GAAO,aAAa,KAAiC,CAAA;AAE3D,EAAA,MAAM,IAAA,GAAO,UAAU,OAAO,CAAA;AAG9B,EAAA,IAAI,UAAA,GAAa,KAAK,aAAA,IAAiB,CAAA;AACvC,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,GAAA,CAAI,QAAQ,CAAA;AACrC,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,UAAA,GAAa,KAAK,GAAA,CAAI,CAAA,EAAG,SAAS,UAAA,EAAY,EAAE,KAAK,CAAC,CAAA;AAAA,EACxD;AAEA,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,mBAAA,CAAoB,IAAA,CAAK,CAAC,CAAC,CAAA,CAAE,MAAA;AACtE,EAAA,IAAI,IAAA,CAAK,aAAA,KAAkB,MAAA,IAAa,YAAA,GAAe,UAAA,EAAY;AACjE,IAAA,UAAA,GAAa,YAAA;AAAA,EACf;AAGA,EAAA,MAAM,QAAmB,EAAC;AAC1B,EAAA,KAAA,MAAW,EAAA,IAAM,KAAK,KAAA,EAAO;AAC3B,IAAA,IAAI,GAAG,QAAA,IAAY,EAAA,CAAG,SAAS,IAAA,IAAQ,IAAA,CAAK,kBAAkB,MAAA,EAAW;AAEvE,MAAA;AAAA,IACF;AACA,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,MAAM,EAAA,CAAG,IAAA;AAAA,MACT,MAAM,EAAA,CAAG,IAAA;AAAA,MACT,UAAU,EAAA,CAAG;AAAA,KACd,CAAA;AAAA,EACH;AACA,EAAA,IAAI,IAAA,CAAK,kBAAkB,MAAA,EAAW;AAEpC,IAAA,MAAM,aAAwB,EAAC;AAC/B,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,IAAY,CAAA,CAAE,IAAA,KAAS,IAAI,CAAA,EAAG,QAAA,IAAY,MAAA;AACnF,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,UAAA,EAAY,CAAA,EAAA,EAAK;AACpC,MAAA,UAAA,CAAW,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA,EAAA,EAAK,CAAC,IAAI,IAAA,EAAM,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,CAAA;AAAA,IACnE;AACA,IAAA,KAAA,CAAM,OAAA,CAAQ,GAAG,UAAU,CAAA;AAAA,EAC7B;AAEA,EAAA,MAAM,OAAA,GAAU,cAAA,IAAkB,YAAA,CAAaA,MAAK,CAAA;AACpD,EAAA,IAAIA,MAAAA,CAAM,UAAA,CAAW,GAAA,CAAI,OAAO,CAAA,EAAG;AACjC,IAAA,MAAM,IAAI,aAAA,CAAc,CAAA,yBAAA,EAA4B,OAAO,CAAA,CAAA,EAAI,QAAQ,OAAO,CAAA;AAAA,EAChF;AACA,EAAA,MAAM,KAAA,GAAkB;AAAA,IACtB,QAAA,EAAU,cAAA;AAAA,IACV,SAAA,EAAW,KAAA;AAAA,IACX,KAAA,EAAO,IAAA;AAAA,IACP,KAAA;AAAA,IACA,cAAcA,MAAAA,CAAM,YAAA;AAAA,IACpB,EAAA,EAAI;AAAA,GACN;AACA,EAAAA,MAAAA,CAAM,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA;AACvB,EAAAA,MAAAA,CAAM,UAAA,CAAW,GAAA,CAAI,OAAA,EAAS,KAAK,CAAA;AAKnC,EAAA,MAAM,aAAa,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,IAAI,CAAA;AACtD,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAY;AAGlC,EAAA,MAAM,aAA0B,EAAC;AACjC,EAAA,KAAA,MAAW,UAAU,IAAA,EAAM;AACzB,IAAA,MAAM,CAAA,GAAI,SAAS,MAAM,CAAA;AACzB,IAAA,IAAI,EAAE,IAAA,EAAM;AACV,MAAA,OAAA,CAAQA,MAAAA,EAAO,KAAA,EAAO,CAAA,EAAG,CAAA,CAAE,MAAM,MAAM,CAAA;AACvC,MAAA,SAAA,CAAU,GAAA,CAAI,EAAE,IAAI,CAAA;AAAA,IACtB,CAAA,MAAO;AACL,MAAA,UAAA,CAAW,KAAK,CAAC,CAAA;AAAA,IACnB;AAAA,EACF;AAEA,EAAA,IAAI,EAAA,GAAK,CAAA;AACT,EAAA,KAAA,MAAW,OAAO,UAAA,EAAY;AAC5B,IAAA,OAAO,EAAA,GAAK,WAAW,MAAA,IAAU,SAAA,CAAU,IAAI,UAAA,CAAW,EAAE,CAAA,CAAE,IAAI,CAAA,EAAG,EAAA,EAAA;AACrE,IAAA,IAAI,EAAA,IAAM,WAAW,MAAA,EAAQ;AAC3B,MAAA,MAAM,IAAI,aAAA;AAAA,QACR,CAAA,kCAAA,EAAqC,KAAK,CAAA,MAAA,EAAS,UAAA,CAAW,MAAM,CAAA,CAAA,CAAA;AAAA,QACpE,MAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AACA,IAAA,OAAA,CAAQA,QAAO,KAAA,EAAO,GAAA,EAAK,WAAW,EAAE,CAAA,CAAE,MAAM,MAAM,CAAA;AACtD,IAAA,SAAA,CAAU,GAAA,CAAI,UAAA,CAAW,EAAE,CAAA,CAAE,IAAI,CAAA;AACjC,IAAA,EAAA,EAAA;AAAA,EACF;AAEA,EAAA,MAAM,WAAA,GAAc,KAAK,UAAA,IAAc,KAAA;AACvC,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,EAAE,IAAA,KAAS,WAAA,IAAe,CAAA,CAAE,IAAA,KAAS,KAAK,CAAA;AAC5E,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,OAAA,EAAS,WAAA;AAAA,IACT,OAAA,EAAS,SAAS,QAAA,IAAY;AAAA,GAChC;AACF;AAEA,SAAS,OAAA,CACPA,MAAAA,EACA,KAAA,EACA,GAAA,EACA,UACA,MAAA,EACM;AACN,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,QAAA,IAAY,CAAA,CAAE,IAAA,KAAS,IAAI,CAAA;AAC3E,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,MAAM,IAAI,aAAA;AAAA,MACR,CAAA,MAAA,EAAS,KAAA,CAAM,SAAS,CAAA,oBAAA,EAAuB,QAAQ,CAAA,CAAA,CAAA;AAAA,MACvD,MAAA;AAAA,MACA,GAAA,CAAI;AAAA,KACN;AAAA,EACF;AAGA,EAAA,IAAI,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA,EAAG;AACtB,IAAA,IAAA,CAAK,WAAW,GAAA,CAAI,GAAA;AACpB,IAAA,IAAI,GAAA,CAAI,OAAA,EAAS,IAAA,CAAK,OAAA,GAAU,IAAA;AAChC,IAAA;AAAA,EACF;AAGA,EAAA,IAAI,oBAAA,CAAqB,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG;AACtC,IAAA,MAAM,GAAA,GAAM,UAAUA,MAAAA,EAAO,GAAA,CAAI,KAAK,MAAA,kBAAW,IAAI,GAAA,EAAI,EAAG,MAAM,CAAA;AAClE,IAAAA,MAAAA,CAAM,MAAM,IAAA,CAAK;AAAA,MACf,IAAA,EAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAS,GAAA,CAAI,OAAA,EAAS,QAAA,EAAU,GAAA,CAAI,OAAA,EAAQ;AAAA,MAClE,IAAI,EAAE,IAAA,EAAM,QAAQ,OAAA,EAAS,KAAA,CAAM,IAAI,QAAA,EAAS;AAAA,MAChD,UAAU,GAAA,CAAI,OAAA;AAAA,MACd,eAAe,GAAA,CAAI;AAAA,KACpB,CAAA;AACD,IAAA;AAAA,EACF;AAGA,EAAA,MAAM,OAAA,GAAU,GAAA,CAAI,GAAA,CAAI,KAAA,CAAM,kCAAkC,CAAA;AAChE,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,MAAM,KAAA,GAAQ,QAAQ,CAAC,CAAA;AACvB,IAAA,MAAM,OAAA,GAAU,QAAQ,CAAC,CAAA;AACzB,IAAA,IAAI,CAACA,MAAAA,CAAM,UAAA,CAAW,GAAA,CAAI,KAAK,CAAA,EAAG;AAChC,MAAA,MAAM,IAAI,aAAA;AAAA,QACR,CAAA,kBAAA,EAAqB,KAAK,CAAA,gBAAA,EAAmB,GAAA,CAAI,GAAG,CAAA,CAAA;AAAA,QACpD,MAAA;AAAA,QACA,GAAA,CAAI;AAAA,OACN;AAAA,IACF;AACA,IAAA,MAAM,QAAA,GAAWA,MAAAA,CAAM,UAAA,CAAW,GAAA,CAAI,KAAK,CAAA;AAC3C,IAAA,MAAM,UAAA,GAAa,QAAA,CAAS,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,OAAA,IAAW,CAAA,CAAE,IAAA,KAAS,KAAK,CAAA;AACpF,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,MAAM,IAAI,aAAA;AAAA,QACR,aAAa,KAAK,CAAA,GAAA,EAAM,QAAA,CAAS,SAAS,yBAAyB,OAAO,CAAA,CAAA,CAAA;AAAA,QAC1E,MAAA;AAAA,QACA,GAAA,CAAI;AAAA,OACN;AAAA,IACF;AACA,IAAAA,MAAAA,CAAM,MAAM,IAAA,CAAK;AAAA,MACf,MAAM,EAAE,IAAA,EAAM,QAAQ,OAAA,EAAS,KAAA,EAAO,UAAU,OAAA,EAAQ;AAAA,MACxD,IAAI,EAAE,IAAA,EAAM,QAAQ,OAAA,EAAS,KAAA,CAAM,IAAI,QAAA,EAAS;AAAA,MAChD,UAAU,UAAA,CAAW,QAAA;AAAA,MACrB,eAAe,GAAA,CAAI;AAAA,KACpB,CAAA;AACD,IAAA;AAAA,EACF;AAGA,EAAA,MAAM,UAAU,GAAA,CAAI,GAAA;AACpB,EAAA,IAAI,CAAC,gBAAA,CAAiB,IAAA,CAAK,OAAO,CAAA,EAAG;AACnC,IAAA,MAAM,IAAI,cAAc,CAAA,kBAAA,EAAqB,GAAA,CAAI,GAAG,CAAA,CAAA,EAAI,MAAA,EAAQ,IAAI,GAAG,CAAA;AAAA,EACzE;AACA,EAAA,SAAA,CAAUA,QAAO,OAAA,EAAS,IAAA,CAAK,aAAa,KAAA,GAAQ,MAAA,GAAS,KAAK,QAAQ,CAAA;AAC1E,EAAAA,MAAAA,CAAM,MAAM,IAAA,CAAK;AAAA,IACf,IAAA,EAAM,EAAE,IAAA,EAAM,KAAA,EAAO,MAAM,OAAA,EAAQ;AAAA,IACnC,IAAI,EAAE,IAAA,EAAM,QAAQ,OAAA,EAAS,KAAA,CAAM,IAAI,QAAA,EAAS;AAAA,IAChD,QAAA,EAAUA,MAAAA,CAAM,SAAA,CAAU,GAAA,CAAI,OAAO,CAAA,CAAG,QAAA;AAAA,IACxC,eAAe,GAAA,CAAI;AAAA,GACpB,CAAA;AACH;AAGO,SAAS,SAASpC,KAAAA,EAAsB;AAC7C,EAAA,MAAM,KAAA,GAAQ,cAAcA,KAAI,CAAA;AAChC,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,MAAM,IAAI,cAAc,mBAAmB,CAAA;AAAA,EAC7C;AACA,EAAA,MAAM,QAAA,GAAW,MAAM,CAAC,CAAA;AACxB,EAAA,IAAI,CAAC,SAAA,CAAU,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,EAAG;AAClC,IAAA,MAAM,IAAI,aAAA,CAAc,CAAA,mDAAA,EAAsD,SAAS,IAAI,CAAA,CAAA,CAAA,EAAK,SAAS,MAAM,CAAA;AAAA,EACjH;AACA,EAAA,MAAMC,MAAAA,GAAQ0D,kCAAA,CAAiB,QAAA,CAAS,IAAI,CAAA;AAE5C,EAAA,MAAMvB,MAAAA,GAAqB;AAAA,IACzB,WAAW,EAAC;AAAA,IACZ,SAAA,sBAAe,GAAA,EAAI;AAAA,IACnB,QAAQ,EAAC;AAAA,IACT,UAAA,sBAAgB,GAAA,EAAI;AAAA,IACpB,OAAO,EAAC;AAAA,IACR,YAAA,EAAc,CAAA;AAAA,IACd,YAAA,EAAc,CAAA;AAAA,IACd,QAAA,sBAAc,GAAA;AAAI,GACpB;AAEA,EAAA,MAAM,WAAyB,EAAC;AAEhC,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,IAAI,gBAAA,GAAmB,CAAA;AAGvB,EAAA,OAAO,CAAA,GAAI,MAAM,MAAA,EAAQ;AACvB,IAAA,MAAM,EAAA,GAAK,MAAM,CAAC,CAAA;AAClB,IAAA,IAAI,aAAA,CAAc,IAAA,CAAK,EAAA,CAAG,IAAI,CAAA,EAAG;AACjC,IAAA,MAAM,IAAA,GAAO,aAAa,EAAE,CAAA;AAC5B,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,IAAIA,MAAAA,CAAM,SAAA,CAAU,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,EAAG;AAClC,QAAA,MAAM,IAAI,cAAc,CAAA,oBAAA,EAAuB,IAAA,CAAK,IAAI,CAAA,CAAA,EAAI,EAAA,CAAG,MAAA,EAAQ,EAAA,CAAG,IAAI,CAAA;AAAA,MAChF;AACA,MAAAA,MAAAA,CAAM,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA;AACzB,MAAAA,MAAAA,CAAM,SAAA,CAAU,GAAA,CAAI,IAAA,CAAK,MAAM,IAAI,CAAA;AACnC,MAAA,CAAA,EAAA;AACA,MAAA;AAAA,IACF;AACA,IAAA,MAAM,IAAI,cAAc,CAAA,gCAAA,EAAmC,EAAA,CAAG,IAAI,CAAA,CAAA,EAAI,EAAA,CAAG,MAAA,EAAQ,EAAA,CAAG,IAAI,CAAA;AAAA,EAC1F;AAGA,EAAA,OAAO,CAAA,GAAI,MAAM,MAAA,EAAQ;AACvB,IAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AACpB,IAAA,MAAM,EAAA,GAAK,mBAAmB,IAAI,CAAA;AAClC,IAAA,IAAI,CAAC,EAAA,EAAI;AACP,MAAA,MAAM,IAAI,cAAc,CAAA,8BAAA,EAAiC,IAAA,CAAK,IAAI,CAAA,CAAA,CAAA,EAAK,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,IAAI,CAAA;AAAA,IAC/F;AACA,IAAA,CAAA,EAAA;AACA,IAAA,MAAM,GAAA,GAAM,EAAA,CAAG,KAAA,KAAU,EAAA,GAAK,mBAAmB,EAAA,CAAG,KAAA;AACpD,IAAA,gBAAA,GAAmB,GAAA,GAAM,CAAA;AACzB,IAAAA,OAAM,YAAA,GAAe,GAAA;AAGrB,IAAA,MAAM,YAAA,GAAeA,OAAM,MAAA,CAAO,MAAA;AAClC,IAAA,MAAM,WAAA,GAAcA,OAAM,KAAA,CAAM,MAAA;AAGhC,IAAA,OAAO,CAAA,GAAI,MAAM,MAAA,IAAU,KAAA,CAAM,CAAC,CAAA,CAAE,MAAA,GAAS,KAAK,MAAA,EAAQ;AACxD,MAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AACpB,MAAA,cAAA,CAAeA,QAAO,IAAI,CAAA;AAC1B,MAAA,CAAA,EAAA;AAAA,IACF;AACA,IAAA,MAAMkE,QAAAA,GAAsB;AAAA,MAC1B,KAAA,EAAO,GAAA;AAAA,MACP,MAAA,EAAQlE,MAAAA,CAAM,MAAA,CAAO,KAAA,CAAM,YAAY,CAAA;AAAA,MACvC,KAAA,EAAOA,MAAAA,CAAM,KAAA,CAAM,KAAA,CAAM,WAAW;AAAA,KACtC;AACA,IAAA,IAAI,GAAG,KAAA,KAAU,MAAA,EAAWkE,QAAAA,CAAQ,QAAQ,EAAA,CAAG,KAAA;AAC/C,IAAA,QAAA,CAAS,KAAKA,QAAO,CAAA;AAAA,EACvB;AAIA,EAAA,KAAA,MAAW,KAAA,IAASlE,OAAM,MAAA,EAAQ;AAChC,IAAA,IAAI,CAAC,MAAM,QAAA,EAAU;AACrB,IAAA,MAAM,CAAA,GAAIA,MAAAA,CAAM,SAAA,CAAU,GAAA,CAAI,MAAM,QAAQ,CAAA;AAC5C,IAAA,IAAI,CAAC,CAAA,EAAG;AACR,IAAA,MAAM,IAAA,GAAO,YAAA,CAAa,KAAA,CAAM,SAAqC,CAAA;AACrE,IAAA,MAAM,OAAA,GAAU,MAAM,UAAA,IAAc,KAAA;AACpC,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,OAAA,IAAW,CAAA,CAAE,IAAA,KAAS,KAAK,CAAA;AAC1E,IAAA,IAAI,CAAC,GAAA,EAAK;AACV,IAAAA,MAAAA,CAAM,MAAM,IAAA,CAAK;AAAA,MACf,IAAA,EAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAS,KAAA,CAAM,EAAA,EAAI,UAAU,OAAA,EAAQ;AAAA,MAC3D,IAAI,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,MAAM,QAAA,EAAS;AAAA,MACxC,UAAU,GAAA,CAAI;AAAA,KACf,CAAA;AAED,IAAA,MAAM,GAAA,GAAM,SAAS,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,KAAA,KAAU,MAAM,YAAY,CAAA;AAC/D,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,GAAA,CAAI,KAAA,CAAM,KAAKA,MAAAA,CAAM,KAAA,CAAMA,OAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAC,CAAA;AAAA,IACpD;AAAA,EACF;AAEA,EAAA,MAAM,GAAA,GAAc;AAAA,IAClB,IAAA,EAAM,KAAA;AAAA,IACN,WAAWA,MAAAA,CAAM,SAAA;AAAA,IACjB;AAAA,GACF;AACA,EAAA,IAAInC,MAAAA,KAAU,MAAA,EAAW,GAAA,CAAI,KAAA,GAAQA,MAAAA;AACrC,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,cAAA,CAAemC,QAAoBrC,KAAAA,EAAqB;AAC/D,EAAA,MAAMC,QAAOD,KAAAA,CAAK,IAAA;AAElB,EAAA,MAAM,CAAA,GAAIC,KAAAA,CAAK,KAAA,CAAM,mEAAmE,CAAA;AACxF,EAAA,IAAI,CAAA,EAAG;AACL,IAAA,MAAM,GAAA,GAAM,EAAE,CAAC,CAAA;AACf,IAAA,MAAM,OAAA,GAAU,EAAE,CAAC,CAAA;AACnB,IAAA,MAAM,QAAA,GAAW,EAAE,CAAC,CAAA;AACpB,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,QAAc,CAAA;AACvC,IAAA,SAAA,CAAUoC,MAAAA,EAAO,OAAA,EAAS,GAAA,EAAK,KAAA,EAAOrC,MAAK,MAAM,CAAA;AACjD,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,EAAA,GAAKC,KAAAA,CAAK,KAAA,CAAM,8CAA8C,CAAA;AACpE,EAAA,IAAI,EAAA,EAAI;AACN,IAAA,MAAM,OAAA,GAAU,GAAG,CAAC,CAAA;AACpB,IAAA,MAAM,QAAA,GAAW,GAAG,CAAC,CAAA;AACrB,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,QAAc,CAAA;AACvC,IAAA,SAAA,CAAUoC,MAAAA,EAAO,OAAA,EAAS,MAAA,EAAW,KAAA,EAAOrC,MAAK,MAAM,CAAA;AACvD,IAAA;AAAA,EACF;AACA,EAAA,MAAM,IAAI,aAAA,CAAc,CAAA,gCAAA,EAAmCC,KAAI,CAAA,CAAA,EAAID,KAAAA,CAAK,QAAQC,KAAI,CAAA;AACtF;AAEA,SAAS,UAAA,CAAW,KAAyBD,KAAAA,EAAoC;AAC/E,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAoB;AACpC,EAAA,IAAI,CAAC,KAAK,OAAO,GAAA;AACjB,EAAA,MAAM,KAAA,GAAQ,cAAc,GAAG,CAAA;AAC/B,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA,EAAG;AACnC,IAAA,MAAM,CAAA,GAAI,KAAK,IAAA,EAAK;AACpB,IAAA,IAAI,CAAC,CAAA,EAAG;AACR,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,OAAA,CAAQ,GAAG,CAAA;AAC3B,IAAA,IAAI,QAAQ,CAAA,EAAG;AACb,MAAA,GAAA,CAAI,GAAA,CAAI,CAAA,CAAE,WAAA,EAAY,EAAG,MAAM,CAAA;AAAA,IACjC,CAAA,MAAO;AACL,MAAA,MAAM,GAAA,GAAM,EAAE,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA,CAAE,IAAA,GAAO,WAAA,EAAY;AACjD,MAAA,MAAM,GAAA,GAAM,CAAA,CAAE,KAAA,CAAM,KAAA,GAAQ,CAAC,EAAE,IAAA,EAAK,CAAE,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA;AAC1D,MAAA,GAAA,CAAI,GAAA,CAAI,KAAK,GAAG,CAAA;AAAA,IAClB;AAAA,EACF;AAEA,EAAA,OAAO,GAAA;AACT;;;ACpiBO,IAAM,SAAA,GAAY;AAAA,EACvB,eAAA,EAAiB,EAAA;AAAA,EACjB,gBAAA,EAAkB,EAAA;AAAA,EAClB,UAAA,EAAY,EAAA;AAAA,EACZ,gBAAA,EAAkB,EAAA;AAAA,EAElB,eAAA,EAAiB,CAAA;AAAA,EACjB,cAAA,EAAgB,EAAA;AAAA,EAChB,aAAA,EAAe,EAAA;AAAA,EACf,iBAAA,EAAmB,EAAA;AAAA,EACnB,iBAAA,EAAmB,EAAA;AAAA,EACnB,aAAA,EAAe,EAAA;AAAA,EACf,eAAA,EAAiB,EAAA;AAAA,EACjB,SAAA,EAAW,EAAA;AAAA,EACX,iBAAA,EAAmB,CAAA;AAAA,EACnB,UAAA,EAAY,EAAA;AAAA,EACZ,UAAA,EAAY,EAAA;AAAA,EACZ,YAAA,EAAc,EAAA;AAAA,EACd,eAAA,EAAiB;AACnB,CAAA;AAEA,IAAM,WAAA,GAAc,GAAA;AACpB,IAAM,WAAA,GAAc,GAAA;AAEpB,SAAS,iBAAiB,KAAA,EAA2C;AACnE,EAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,IAAI,CAAA;AACxD,EAAA,MAAM,OAAA,GAAU,MAAM,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,KAAK,CAAA;AAC1D,EAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAI,OAAO,MAAA,EAAQ,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAE1D,EAAA,MAAM,aAAa,KAAA,CAAM,SAAA;AACzB,EAAA,MAAM,QAAA,GAAW,WAAW,KAAA,CAAM,SAAS,IAAI,YAAA,CAAa,KAAA,CAAM,SAAS,CAAA,CAAE,WAAA,GAAc,MAAA;AAC3F,EAAA,MAAM,IAAA,GAAO,WAAW,IAAA,CAAK,GAAA,CAAI,IAAI,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA,GAAI,CAAA;AAE5D,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,CAAE,IAAA,CAAK,MAAA,GAAS,WAAW,GAAG,CAAC,CAAA;AACtF,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,CAAE,IAAA,CAAK,MAAA,GAAS,WAAW,GAAG,CAAC,CAAA;AACxF,EAAA,MAAM,OAAA,GAAU,WAAW,MAAA,GAAS,WAAA;AAEpC,EAAA,MAAM,QAAQ,IAAA,CAAK,GAAA;AAAA,IACjB,SAAA,CAAU,eAAA;AAAA,IACV,UAAA,GAAa,cAAc,IAAA,GAAO,EAAA;AAAA,IAClC,OAAA,GAAU;AAAA,GACZ;AACA,EAAA,MAAM,SAAS,IAAA,CAAK,GAAA;AAAA,IAClB,SAAA,CAAU,gBAAA;AAAA,IACV,SAAA,CAAU,cAAA,GAAiB,QAAA,GAAW,SAAA,CAAU,aAAa,SAAA,CAAU;AAAA,GACzE;AACA,EAAA,OAAO,EAAE,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,MAAA,EAAO;AAC/B;AAEA,SAAS,UAAA,CAAW,KAAA,EAAiB,CAAA,EAAW,CAAA,EAAW,CAAA,EAA4B;AACrF,EAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,IAAI,CAAA;AACxD,EAAA,MAAM,OAAA,GAAU,MAAM,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,KAAK,CAAA;AAC1D,EAAA,MAAM,WAA4B,EAAC;AACnC,EAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM;AACvB,IAAA,MAAM,KAAK,CAAA,GAAI,SAAA,CAAU,cAAA,GAAA,CAAkB,CAAA,GAAI,OAAO,SAAA,CAAU,UAAA;AAChE,IAAA,QAAA,CAAS,IAAA,CAAK,SAAS,CAAA,EAAG,MAAA,EAAQ,GAAG,CAAA,GAAI,SAAA,CAAU,gBAAA,EAAkB,EAAE,CAAC,CAAA;AAAA,EAC1E,CAAC,CAAA;AACD,EAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM;AACxB,IAAA,MAAM,KAAK,CAAA,GAAI,SAAA,CAAU,cAAA,GAAA,CAAkB,CAAA,GAAI,OAAO,SAAA,CAAU,UAAA;AAChE,IAAA,MAAM,KAAK,CAAA,GAAI,CAAA;AACf,IAAA,QAAA,CAAS,IAAA,CAAK,SAAS,CAAA,EAAG,OAAA,EAAS,IAAI,EAAA,GAAK,SAAA,CAAU,gBAAA,EAAkB,EAAE,CAAC,CAAA;AAAA,EAC7E,CAAC,CAAA;AACD,EAAA,OAAO,QAAA;AACT;AAEA,SAAS,QAAA,CAAS,CAAA,EAAY,IAAA,EAAwB,KAAA,EAAe,GAAW,CAAA,EAA0B;AACxG,EAAA,MAAM,IAAA,GAAsB;AAAA,IAC1B,MAAM,CAAA,CAAE,IAAA;AAAA,IACR,IAAA,EAAM,IAAA,KAAS,MAAA,GAAS,IAAA,GAAO,KAAA;AAAA,IAC/B,CAAA;AAAA,IACA,CAAA;AAAA,IACA,KAAA;AAAA,IACA,UAAU,CAAA,CAAE;AAAA,GACd;AACA,EAAA,IAAI,CAAA,CAAE,QAAA,KAAa,MAAA,EAAW,IAAA,CAAK,WAAW,CAAA,CAAE,QAAA;AAChD,EAAA,IAAI,CAAA,CAAE,OAAA,EAAS,IAAA,CAAK,OAAA,GAAU,IAAA;AAC9B,EAAA,OAAO,IAAA;AACT;AAYA,SAASwG,YAAWD,QAAAA,EAAmC;AACrD,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAyB;AAC9C,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAyB;AAC9C,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAyB;AAC/C,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAyB;AAChD,EAAA,KAAA,MAAW,CAAA,IAAKA,SAAQ,MAAA,EAAQ;AAC9B,IAAA,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,EAAA,kBAAI,IAAI,KAAK,CAAA;AAC5B,IAAA,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,EAAA,kBAAI,IAAI,KAAK,CAAA;AAC5B,IAAA,SAAA,CAAU,GAAA,CAAI,CAAA,CAAE,EAAA,kBAAI,IAAI,KAAK,CAAA;AAC7B,IAAA,UAAA,CAAW,GAAA,CAAI,CAAA,CAAE,EAAA,kBAAI,IAAI,KAAK,CAAA;AAAA,EAChC;AACA,EAAA,KAAA,MAAW,CAAA,IAAKA,SAAQ,KAAA,EAAO;AAC7B,IAAA,IAAI,EAAE,IAAA,CAAK,IAAA,KAAS,UAAU,CAAA,CAAE,EAAA,CAAG,SAAS,MAAA,EAAQ;AAClD,MAAA,QAAA,CAAS,GAAA,CAAI,EAAE,EAAA,CAAG,OAAO,GAAG,GAAA,CAAI,CAAA,CAAE,KAAK,OAAO,CAAA;AAC9C,MAAA,QAAA,CAAS,GAAA,CAAI,EAAE,IAAA,CAAK,OAAO,GAAG,GAAA,CAAI,CAAA,CAAE,GAAG,OAAO,CAAA;AAAA,IAChD,CAAA,MAAA,IAAW,EAAE,IAAA,CAAK,IAAA,KAAS,SAAS,CAAA,CAAE,EAAA,CAAG,SAAS,MAAA,EAAQ;AACxD,MAAA,SAAA,CAAU,GAAA,CAAI,EAAE,EAAA,CAAG,OAAO,GAAG,GAAA,CAAI,CAAA,CAAE,KAAK,IAAI,CAAA;AAAA,IAC9C,CAAA,MAAA,IAAW,EAAE,IAAA,CAAK,IAAA,KAAS,UAAU,CAAA,CAAE,EAAA,CAAG,SAAS,KAAA,EAAO;AACxD,MAAA,UAAA,CAAW,GAAA,CAAI,EAAE,IAAA,CAAK,OAAO,GAAG,GAAA,CAAI,CAAA,CAAE,GAAG,IAAI,CAAA;AAAA,IAC/C;AAAA,EACF;AACA,EAAA,OAAO,EAAE,QAAA,EAAU,QAAA,EAAU,SAAA,EAAW,UAAA,EAAW;AACrD;AAGA,SAAS,YAAA,CAAaA,UAAqB,KAAA,EAA0C;AACnF,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAoB;AAEtC,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAY;AAEjC,EAAA,MAAM,KAAA,GAAQ,CAAC,EAAA,KAAuB;AACpC,IAAA,IAAI,MAAM,GAAA,CAAI,EAAE,GAAG,OAAO,KAAA,CAAM,IAAI,EAAE,CAAA;AACtC,IAAA,IAAI,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA,EAAG;AAEpB,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,QAAA,CAAS,IAAI,EAAE,CAAA;AACf,IAAA,IAAI,GAAA,GAAM,CAAA;AACV,IAAA,KAAA,MAAW,OAAO,KAAA,CAAM,QAAA,CAAS,IAAI,EAAE,CAAA,IAAK,EAAC,EAAG;AAC9C,MAAA,GAAA,GAAM,KAAK,GAAA,CAAI,GAAA,EAAK,KAAA,CAAM,GAAG,IAAI,CAAC,CAAA;AAAA,IACpC;AACA,IAAA,QAAA,CAAS,OAAO,EAAE,CAAA;AAClB,IAAA,KAAA,CAAM,GAAA,CAAI,IAAI,GAAG,CAAA;AACjB,IAAA,OAAO,GAAA;AAAA,EACT,CAAA;AAEA,EAAA,KAAA,MAAW,CAAA,IAAKA,QAAAA,CAAQ,MAAA,EAAQ,KAAA,CAAM,EAAE,EAAE,CAAA;AAE1C,EAAA,OAAO,KAAA;AACT;AAEA,SAAS5B,cAAAA,CAAc4B,QAAAA,EAAqB,OAAA,EAAiB,OAAA,EAAmC;AAC9F,EAAA,MAAM,KAAA,GAAQC,YAAWD,QAAO,CAAA;AAGhC,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAsC;AACxD,EAAA,KAAA,MAAW,CAAA,IAAKA,SAAQ,MAAA,EAAQ,KAAA,CAAM,IAAI,CAAA,CAAE,EAAA,EAAI,gBAAA,CAAiB,CAAC,CAAC,CAAA;AAGnE,EAAA,MAAM,OAAA,GAAU,YAAA,CAAaA,QAAAA,EAAS,KAAK,CAAA;AAC3C,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAG,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,CAAC,CAAA;AAG5D,EAAA,MAAM,OAAA,GAAsB,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,WAAW,CAAA,EAAE,EAAG,MAAM,EAAE,CAAA;AACzE,EAAA,KAAA,MAAW,CAAA,IAAKA,QAAAA,CAAQ,MAAA,EAAQ,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,EAAE,CAAE,CAAA,CAAE,IAAA,CAAK,CAAA,CAAE,EAAE,CAAA;AAGrE,EAAA,MAAM,YAAA,uBAAmB,GAAA,EAAY;AACrC,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAAY;AACtC,EAAA,KAAA,MAAW,CAAA,IAAKA,SAAQ,MAAA,EAAQ;AAC9B,IAAA,KAAA,MAAW,CAAA,IAAK,KAAA,CAAM,SAAA,CAAU,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,IAAK,EAAC,EAAG,YAAA,CAAa,GAAA,CAAI,CAAC,CAAA;AACnE,IAAA,KAAA,MAAW,CAAA,IAAK,KAAA,CAAM,UAAA,CAAW,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,IAAK,EAAC,EAAG,aAAA,CAAc,GAAA,CAAI,CAAC,CAAA;AAAA,EACvE;AACA,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,IAAA,CAAK,YAAY,CAAA;AACzC,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,IAAA,CAAK,aAAa,CAAA;AAG3C,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,IAAI,OAAA,GAAU,UAAU,SAAA,CAAU,iBAAA;AAClC,EAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,IAAA,OAAA,IAAW,SAAA,CAAU,aAAa,SAAA,CAAU,YAAA;AAAA,EAC9C,CAAA,MAAO;AACL,IAAA,OAAA,IAAW,SAAA,CAAU,YAAA;AAAA,EACvB;AAEA,EAAA,MAAM,cAAwB,OAAA,CAAQ,GAAA;AAAA,IAAI,CAAC,GAAA,KACzC,GAAA,CAAI,MAAA,CAAO,CAAC,GAAG,EAAA,KAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,MAAM,GAAA,CAAI,EAAE,EAAG,CAAC,CAAA,EAAG,UAAU,eAAe;AAAA,GAChF;AACA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,QAAA,EAAU,CAAA,EAAA,EAAK;AAClC,IAAA,MAAA,CAAO,KAAK,OAAO,CAAA;AACnB,IAAA,OAAA,IAAW,WAAA,CAAY,CAAC,CAAA,GAAI,SAAA,CAAU,aAAA;AAAA,EACxC;AAGA,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAA4D;AACpF,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,QAAA,EAAU,CAAA,EAAA,EAAK;AAClC,IAAA,IAAI,CAAA,GAAI,OAAA,GAAU,SAAA,CAAU,iBAAA,GAAoB,SAAA,CAAU,eAAA;AAC1D,IAAA,KAAA,MAAW,EAAA,IAAM,OAAA,CAAQ,CAAC,CAAA,EAAG;AAC3B,MAAA,MAAM,EAAA,GAAK,KAAA,CAAM,GAAA,CAAI,EAAE,CAAA;AACvB,MAAA,MAAM,CAAA,GAAI,OAAO,CAAC,CAAA;AAClB,MAAA,WAAA,CAAY,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,EAAA,CAAG,CAAA,EAAG,CAAA,EAAG,EAAA,CAAG,CAAA,EAAG,CAAA;AAC9C,MAAA,CAAA,IAAK,EAAA,CAAG,IAAI,SAAA,CAAU,eAAA;AAAA,IACxB;AACA,IAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,CAAC,CAAA;AAAA,EACzB;AAGA,EAAA,MAAM,eAAiC,EAAC;AACxC,EAAA,KAAA,MAAW,CAAA,IAAKA,SAAQ,MAAA,EAAQ;AAC9B,IAAA,MAAM,EAAA,GAAK,WAAA,CAAY,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA;AAC/B,IAAA,YAAA,CAAa,IAAA,CAAK;AAAA,MAChB,KAAA,EAAO,CAAA;AAAA,MACP,GAAG,EAAA,CAAG,CAAA;AAAA,MACN,GAAG,EAAA,CAAG,CAAA;AAAA,MACN,OAAO,EAAA,CAAG,CAAA;AAAA,MACV,QAAQ,EAAA,CAAG,CAAA;AAAA,MACX,KAAA,EAAO,WAAW,CAAA,EAAG,EAAA,CAAG,GAAG,EAAA,CAAG,CAAA,EAAG,GAAG,CAAC;AAAA,KACtC,CAAA;AAAA,EACH;AAGA,EAAA,MAAM,WAA+B,EAAC;AACtC,EAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,IAAA,MAAM,IAAA,GAAO,UAAU,SAAA,CAAU,iBAAA;AACjC,IAAA,MAAM,MAAA,GAAS,OAAA,GAAU,SAAA,CAAU,iBAAA,GAAoB,UAAU,eAAA,GAAkB,CAAA;AACnF,IAAA,SAAA,CAAU,OAAA,CAAQ,CAAC,CAAA,EAAG,GAAA,KAAQ;AAC5B,MAAA,QAAA,CAAS,IAAA,CAAK;AAAA,QACZ,IAAA,EAAM,CAAA;AAAA,QACN,CAAA,EAAG,IAAA;AAAA,QACH,CAAA,EAAG,MAAA,GAAS,GAAA,IAAO,SAAA,CAAU,UAAA,GAAa,CAAA,CAAA;AAAA,QAC1C,OAAO,SAAA,CAAU,UAAA;AAAA,QACjB,QAAQ,SAAA,CAAU,UAAA;AAAA,QAClB,IAAA,EAAM,MAAA;AAAA,QACN,QAAA,EAAU;AAAA,OACX,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH;AACA,EAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,IAAA,MAAM,OAAO,MAAA,CAAO,QAAQ,IAAI,WAAA,CAAY,QAAQ,IAAI,SAAA,CAAU,YAAA;AAClE,IAAA,MAAM,MAAA,GAAS,OAAA,GAAU,SAAA,CAAU,iBAAA,GAAoB,UAAU,eAAA,GAAkB,CAAA;AACnF,IAAA,UAAA,CAAW,OAAA,CAAQ,CAAC,CAAA,EAAG,GAAA,KAAQ;AAC7B,MAAA,QAAA,CAAS,IAAA,CAAK;AAAA,QACZ,IAAA,EAAM,CAAA;AAAA,QACN,CAAA,EAAG,IAAA;AAAA,QACH,CAAA,EAAG,MAAA,GAAS,GAAA,IAAO,SAAA,CAAU,UAAA,GAAa,CAAA,CAAA;AAAA,QAC1C,OAAO,SAAA,CAAU,UAAA;AAAA,QACjB,QAAQ,SAAA,CAAU,UAAA;AAAA,QAClB,IAAA,EAAM,OAAA;AAAA,QACN,QAAA,EAAU;AAAA,OACX,CAAA;AAAA,IACH,CAAC,CAAA;AACD,IAAA,OAAA,GAAU,IAAA,GAAO,SAAA,CAAU,UAAA,GAAa,SAAA,CAAU,iBAAA;AAAA,EACpD,CAAA,MAAO;AACL,IAAA,OAAA,GAAU,OAAO,QAAQ,CAAA,GAAI,WAAA,CAAY,QAAQ,IAAI,SAAA,CAAU,iBAAA;AAAA,EACjE;AAGA,EAAA,MAAM,QAAyB,EAAC;AAChC,EAAA,MAAM,YAAwC,EAAC;AAE/C,EAAA,MAAM,YAAA,uBAAmB,GAAA,EAAoB;AAC7C,EAAA,KAAA,MAAW,CAAA,IAAKA,SAAQ,KAAA,EAAO;AAC7B,IAAA,IAAI,CAAA,CAAE,IAAA,CAAK,IAAA,KAAS,MAAA,EAAQ;AAC1B,MAAA,MAAM,GAAA,GAAM,GAAG,CAAA,CAAE,IAAA,CAAK,OAAO,CAAA,CAAA,EAAI,CAAA,CAAE,KAAK,QAAQ,CAAA,CAAA;AAChD,MAAA,YAAA,CAAa,IAAI,GAAA,EAAA,CAAM,YAAA,CAAa,IAAI,GAAG,CAAA,IAAK,KAAK,CAAC,CAAA;AAAA,IACxD,CAAA,MAAA,IAAW,CAAA,CAAE,IAAA,CAAK,IAAA,KAAS,KAAA,EAAO;AAChC,MAAA,MAAM,GAAA,GAAM,CAAA,IAAA,EAAO,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,CAAA;AAC9B,MAAA,YAAA,CAAa,IAAI,GAAA,EAAA,CAAM,YAAA,CAAa,IAAI,GAAG,CAAA,IAAK,KAAK,CAAC,CAAA;AAAA,IACxD;AAAA,EACF;AAEA,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAA2B;AACjD,EAAA,KAAA,MAAW,MAAM,YAAA,EAAc;AAC7B,IAAA,KAAA,MAAW,CAAA,IAAK,GAAG,KAAA,EAAO;AACxB,MAAA,SAAA,CAAU,GAAA,CAAI,GAAG,EAAA,CAAG,KAAA,CAAM,EAAE,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,CAAC,CAAA;AAAA,IAC7C;AAAA,EACF;AACA,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAA8B;AACxD,EAAA,KAAA,MAAW,KAAK,QAAA,EAAU,aAAA,CAAc,GAAA,CAAI,CAAA,CAAE,MAAM,CAAC,CAAA;AAGrD,EAAA,MAAM,SAAA,uBAAqC,GAAA,EAAI;AAE/C,EAAA,KAAA,MAAW,CAAA,IAAKA,SAAQ,KAAA,EAAO;AAC7B,IAAA,MAAM3F,QAAO,SAAA,CAAU,CAAA,EAAG,WAAW,aAAA,EAAe,SAAA,EAAW,QAAQ,WAAW,CAAA;AAClF,IAAA,IAAIA,KAAAA,EAAM;AACR,MAAA,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAAA,OAAM,CAAA;AAAA,IAC9B;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,YAAA,EAAc;AACvC,IAAA,IAAI,QAAQ,CAAA,EAAG;AACf,IAAA,IAAI,GAAA,CAAI,UAAA,CAAW,MAAM,CAAA,EAAG;AAC1B,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA;AACxB,MAAA,MAAM,CAAA,GAAI,aAAA,CAAc,GAAA,CAAI,IAAI,CAAA;AAChC,MAAA,IAAI,CAAA,IAAK,CAAA,CAAE,IAAA,KAAS,MAAA,EAAQ;AAC1B,QAAA,SAAA,CAAU,IAAA,CAAK,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,KAAA,EAAO,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,MAAA,GAAS,GAAG,CAAA;AAAA,MAC5D;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAM,CAAA,GAAI,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA;AAC3B,MAAA,IAAI,CAAA,EAAG,SAAA,CAAU,IAAA,CAAK,EAAE,CAAA,EAAG,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA;AAAA,IAC1C;AAAA,EACF;AAEA,EAAA,MAAM,QAAQ,OAAA,GAAU,OAAA;AACxB,EAAA,MAAM,SAAS,IAAA,CAAK,GAAA;AAAA,IAClB,IAAA,GAAO,UAAU,SAAA,CAAU,iBAAA;AAAA,IAC3B,SAAA,CAAU,gBAAA,GAAmB,SAAA,CAAU,eAAA,GAAkB,UAAU,iBAAA,GAAoB;AAAA,GACzF;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAA2F,QAAAA;AAAA,IACA,CAAA,EAAG,OAAA;AAAA,IACH,CAAA,EAAG,OAAA;AAAA,IACH,KAAA;AAAA,IACA,MAAA;AAAA,IACA,MAAA,EAAQ,YAAA;AAAA,IACR,KAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,UACP,CAAA,EACA,SAAA,EACA,aAAA,EACA,SAAA,EACA,QACA,WAAA,EACoB;AACpB,EAAA,IAAI,KAAK,CAAA,EAAG,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,GAAG,EAAA,GAAK,CAAA;AAEjC,EAAA,IAAI,CAAA,CAAE,IAAA,CAAK,IAAA,KAAS,MAAA,EAAQ;AAC1B,IAAA,MAAM,CAAA,GAAI,SAAA,CAAU,GAAA,CAAI,CAAA,EAAG,CAAA,CAAE,IAAA,CAAK,OAAO,CAAA,CAAA,EAAI,CAAA,CAAE,IAAA,CAAK,QAAQ,CAAA,CAAE,CAAA;AAC9D,IAAA,IAAI,CAAC,GAAG,OAAO,MAAA;AACf,IAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AACP,IAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAA,EACT,CAAA,MAAO;AACL,IAAA,MAAM,CAAA,GAAI,aAAA,CAAc,GAAA,CAAI,CAAA,CAAE,KAAK,IAAI,CAAA;AACvC,IAAA,IAAI,CAAC,GAAG,OAAO,MAAA;AACf,IAAA,EAAA,GAAK,CAAA,CAAE,IAAI,CAAA,CAAE,KAAA;AACb,IAAA,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,MAAA,GAAS,CAAA;AAAA,EACxB;AAEA,EAAA,IAAI,CAAA,CAAE,EAAA,CAAG,IAAA,KAAS,MAAA,EAAQ;AACxB,IAAA,MAAM,CAAA,GAAI,SAAA,CAAU,GAAA,CAAI,CAAA,EAAG,CAAA,CAAE,EAAA,CAAG,OAAO,CAAA,CAAA,EAAI,CAAA,CAAE,EAAA,CAAG,QAAQ,CAAA,CAAE,CAAA;AAC1D,IAAA,IAAI,CAAC,GAAG,OAAO,MAAA;AACf,IAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AACP,IAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAA,EACT,CAAA,MAAO;AACL,IAAA,MAAM,CAAA,GAAI,aAAA,CAAc,GAAA,CAAI,CAAA,CAAE,GAAG,IAAI,CAAA;AACrC,IAAA,IAAI,CAAC,GAAG,OAAO,MAAA;AACf,IAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AACP,IAAA,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,MAAA,GAAS,CAAA;AAAA,EACxB;AAGA,EAAA,MAAM,IAAA,GAAO,EAAA,GAAA,CAAM,EAAA,GAAK,EAAA,IAAM,CAAA;AAE9B,EAAA,IAAI,QAAA,GAAW,EAAA;AACf,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,MAAA,GAAS,GAAG,CAAA,EAAA,EAAK;AAC1C,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,CAAC,CAAA,GAAI,YAAY,CAAC,CAAA;AACzC,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA;AACzB,IAAA,IAAI,EAAA,IAAM,OAAA,GAAU,CAAA,IAAK,EAAA,IAAM,OAAO,CAAA,EAAG;AACvC,MAAA,QAAA,GAAW,CAAA;AACX,MAAA;AAAA,IACF;AAAA,EACF;AACA,EAAA,IAAI,MAAA,GAAS,IAAA;AACb,EAAA,IAAI,YAAY,CAAA,EAAG;AACjB,IAAA,MAAM,MAAA,GAAS,SAAA,CAAU,GAAA,CAAI,QAAQ,CAAA,IAAK,CAAA;AAC1C,IAAA,MAAA,GAAS,OAAO,QAAQ,CAAA,GAAI,WAAA,CAAY,QAAQ,IAAI,EAAA,GAAK,MAAA;AACzD,IAAA,SAAA,CAAU,GAAA,CAAI,QAAA,EAAU,MAAA,GAAS,SAAA,CAAU,SAAS,CAAA;AAAA,EACtD;AAEA,EAAA,IAAI,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,EAAE,IAAI,GAAA,EAAK;AAC3B,IAAA,OAAO,KAAK,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,GAAA,EAAM,EAAE,IAAI,EAAE,CAAA,CAAA;AAAA,EACpC;AACA,EAAA,OAAO,CAAA,EAAA,EAAK,EAAE,CAAA,CAAA,EAAI,EAAE,MAAM,MAAM,CAAA,CAAA,EAAI,EAAE,CAAA,GAAA,EAAM,MAAM,CAAA,CAAA,EAAI,EAAE,CAAA,GAAA,EAAM,EAAE,IAAI,EAAE,CAAA,CAAA;AACxE;AAEO,SAAS,UAAU,GAAA,EAA8B;AACtD,EAAA,MAAM,WAA+B,EAAC;AACtC,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,IAAI,QAAA,GAAW,CAAA;AACf,EAAA,KAAA,MAAW,GAAA,IAAO,IAAI,QAAA,EAAU;AAC9B,IAAA,MAAM,EAAA,GAAK5B,cAAAA,CAAc,GAAA,EAAK,CAAA,EAAG,OAAO,CAAA;AACxC,IAAA,QAAA,CAAS,KAAK,EAAE,CAAA;AAChB,IAAA,OAAA,GAAU,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,MAAA,GAAS,SAAA,CAAU,aAAA;AACvC,IAAA,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,EAAA,CAAG,KAAK,CAAA;AAAA,EACxC;AAEA,EAAA,KAAA,MAAW,CAAA,IAAK,QAAA,EAAU,CAAA,CAAE,KAAA,GAAQ,QAAA;AACpC,EAAA,OAAO;AAAA,IACL,GAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAA,EAAO,QAAA;AAAA,IACP,MAAA,EAAQ;AAAA,GACV;AACF;;;AC1ZA,IAAM,MAAA,GAAS;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,CAAA;AA2Bf,SAAS,UAAU,CAAA,EAAwB;AACzC,EAAA,QAAQ,CAAA;AAAG,IACT,KAAK,MAAA;AAAQ,MAAA,OAAO,kBAAA;AAAA,IACpB,KAAK,KAAA;AAAA,IACL,KAAK,MAAA;AAAA,IACL,KAAK,MAAA;AAAA,IACL,KAAK,OAAA;AAAS,MAAA,OAAO,iBAAA;AAAA,IACrB,KAAK,MAAA;AAAA,IACL,KAAK,OAAA;AAAS,MAAA,OAAO,kBAAA;AAAA,IACrB,KAAK,MAAA;AAAA,IACL,KAAK,MAAA;AAAA,IACL,KAAK,KAAA;AAAO,MAAA,OAAO,kBAAA;AAAA,IACnB,KAAK,QAAA;AAAA,IACL,KAAK,SAAA;AAAW,MAAA,OAAO,oBAAA;AAAA,IACvB,KAAK,MAAA;AAAA,IACL,KAAK,MAAA;AAAA,IACL,KAAK,OAAA;AAAS,MAAA,OAAO,kBAAA;AAAA,IACrB;AAAS,MAAA,OAAO,iBAAA;AAAA;AAEpB;AAEA,SAAS,YAAY,EAAA,EAA4B;AAC/C,EAAA,MAAM,EAAE,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,MAAA,EAAQ,OAAM,GAAI,EAAA;AACvC,EAAA,MAAM,UAAU,SAAA,CAAU,cAAA;AAC1B,EAAA,MAAM,QAAkB,EAAC;AAGzB,EAAA,KAAA,CAAM,IAAA,CAAKlE,sBAAA,CAAK,EAAE,KAAA,EAAO,qBAAqB,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,MAAA,EAAQ,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,CAAC,CAAA;AAElF,EAAA,KAAA,CAAM,IAAA,CAAKA,sBAAA,CAAK,EAAE,KAAA,EAAO,qBAAA,EAAuB,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,CAAC,CAAA;AAE/E,EAAA,KAAA,CAAM,IAAA,CAAKR,sBAAA;AAAA,IACT,EAAE,KAAA,EAAO,mBAAA,EAAqB,CAAA,EAAG,CAAA,GAAI,KAAA,GAAQ,CAAA,EAAG,CAAA,EAAG,CAAA,GAAI,OAAA,GAAU,GAAA,EAAK,aAAA,EAAe,QAAA,EAAS;AAAA,IAC9F,KAAA,CAAM;AAAA,GACP,CAAA;AAGD,EAAA,IAAI,KAAA,CAAM,QAAA,IAAY,KAAA,CAAM,QAAA,KAAa,MAAM,EAAA,EAAI;AACjD,IAAA,KAAA,CAAM,IAAA,CAAKA,sBAAA;AAAA,MACT,EAAE,KAAA,EAAO,qBAAA,EAAuB,CAAA,EAAG,CAAA,GAAI,KAAA,GAAQ,CAAA,EAAG,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,aAAA,EAAe,QAAA,EAAS;AAAA,MACpF,KAAA,CAAM;AAAA,KACP,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,UAAA,CAAW,KAAA,CAAM,SAAS,CAAA,EAAG;AAC/B,IAAA,MAAM,IAAA,GAAO,YAAA,CAAa,KAAA,CAAM,SAAS,CAAA;AACzC,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,KAAA,CAAM,IAAA,CAAKA,sBAAA;AAAA,QACT,EAAE,KAAA,EAAO,qBAAA,EAAuB,CAAA,EAAG,IAAI,KAAA,GAAQ,CAAA,EAAG,CAAA,EAAG,CAAA,GAAI,WAAW,MAAA,GAAS,OAAA,IAAW,CAAA,GAAI,CAAA,EAAG,eAAe,QAAA,EAAS;AAAA,QACvH,IAAA,CAAK;AAAA,OACN,CAAA;AAAA,IACH;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,CAAA,IAAK,GAAG,KAAA,EAAO;AAExB,IAAA,KAAA,CAAM,KAAKD,sBAAA,CAAK;AAAA,MACd,KAAA,EAAO,kBAAA;AAAA,MACP,IAAI,CAAA,CAAE,KAAA;AAAA,MAAO,IAAI,CAAA,CAAE,CAAA;AAAA,MACnB,IAAI,CAAA,CAAE,CAAA;AAAA,MAAG,IAAI,CAAA,CAAE;AAAA,KAChB,CAAC,CAAA;AAEF,IAAA,IAAI,CAAA,CAAE,SAAS,IAAA,EAAM;AACnB,MAAA,KAAA,CAAM,IAAA,CAAKC,sBAAA;AAAA,QACT,EAAE,KAAA,EAAO,mBAAA,EAAqB,CAAA,EAAG,CAAA,CAAE,QAAQ,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,CAAA,EAAE;AAAA,QACzD,CAAA,CAAE;AAAA,OACH,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,IAAA,CAAKA,sBAAA;AAAA,QACT,EAAE,KAAA,EAAO,mBAAA,EAAqB,CAAA,EAAG,CAAA,CAAE,KAAA,GAAQ,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,CAAA,EAAG,aAAA,EAAe,KAAA,EAAM;AAAA,QAC/E,CAAA,CAAE;AAAA,OACH,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,EAAE,OAAA,EAAS;AACb,MAAA,MAAM,EAAA,GAAK,CAAA,CAAE,IAAA,KAAS,IAAA,GAAO,CAAA,CAAE,IAAI,SAAA,CAAU,iBAAA,GAAoB,CAAA,CAAE,CAAA,GAAI,SAAA,CAAU,iBAAA;AACjF,MAAA,KAAA,CAAM,IAAA,CAAKS,wBAAA,CAAO,EAAE,KAAA,EAAO,iBAAA,EAAmB,EAAA,EAAI,EAAA,EAAI,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,SAAA,CAAU,iBAAA,EAAmB,CAAC,CAAA;AAAA,IAC9F;AAEA,IAAA,IAAI,CAAA,CAAE,aAAa,MAAA,EAAW;AAC5B,MAAA,MAAM,EAAA,GAAK,KAAK,GAAA,CAAI,EAAA,EAAI,EAAE,QAAA,CAAS,MAAA,GAAS,IAAI,CAAC,CAAA;AACjD,MAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,EAAA,GAAK,CAAA;AACtB,MAAA,MAAM,EAAA,GAAK,EAAE,CAAA,GAAI,CAAA;AACjB,MAAA,KAAA,CAAM,KAAKD,sBAAA,CAAK,EAAE,OAAO,kBAAA,EAAoB,CAAA,EAAG,IAAI,CAAA,EAAG,EAAA,EAAI,KAAA,EAAO,EAAA,EAAI,QAAQ,EAAA,EAAI,EAAA,EAAI,GAAG,EAAA,EAAI,CAAA,EAAG,CAAC,CAAA;AACjG,MAAA,KAAA,CAAM,IAAA,CAAKR,sBAAA;AAAA,QACT,EAAE,KAAA,EAAO,mBAAA,EAAqB,CAAA,EAAG,EAAA,GAAK,EAAA,GAAK,CAAA,EAAG,CAAA,EAAG,EAAA,GAAK,EAAA,EAAI,aAAA,EAAe,QAAA,EAAS;AAAA,QAClF,CAAA,CAAE;AAAA,OACH,CAAA;AAAA,IACH;AAAA,EACF;AAGA,EAAA,IAAI,UAAA,CAAW,KAAA,CAAM,SAAS,CAAA,EAAG;AAC/B,IAAA,MAAM,IAAA,GAAO,YAAA,CAAa,KAAA,CAAM,SAAS,CAAA;AACzC,IAAA,IAAI,KAAK,aAAA,EAAe;AACtB,MAAA,MAAM,OAAA,GAAU,GAAG,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,KAAK,CAAA;AACrD,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,KAAA,CAAM,KAAKS,wBAAA,CAAO;AAAA,UAChB,KAAA,EAAO,iBAAA;AAAA,UACP,EAAA,EAAI,OAAA,CAAQ,KAAA,GAAQ,SAAA,CAAU,iBAAA;AAAA,UAC9B,IAAI,OAAA,CAAQ,CAAA;AAAA,UACZ,GAAG,SAAA,CAAU;AAAA,SACd,CAAC,CAAA;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAOG,uBAAA;AAAA,IACL;AAAA,MACE,KAAA,EAAO,cAAA;AAAA,MACP,mBAAmB,KAAA,CAAM,SAAA;AAAA,MACzB,eAAA,EAAiB,MAAM,QAAA,IAAY;AAAA,KACrC;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS4F,eAAc,EAAA,EAA8B;AACnD,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,KAAA,CAAM,KAAKhG,sBAAA,CAAK;AAAA,IACd,KAAA,EAAO,sBAAA;AAAA,IACP,CAAA,EAAG,GAAG,CAAA,GAAI,CAAA;AAAA,IAAG,CAAA,EAAG,GAAG,CAAA,GAAI,CAAA;AAAA,IACvB,KAAA,EAAO,GAAG,KAAA,GAAQ,CAAA;AAAA,IAClB,MAAA,EAAQ,GAAG,MAAA,GAAS,CAAA;AAAA,IACpB,EAAA,EAAI,CAAA;AAAA,IAAG,EAAA,EAAI;AAAA,GACZ,CAAC,CAAA;AAEF,EAAA,MAAM,YAAY,EAAA,CAAG,OAAA,CAAQ,KAAA,GACzB,CAAA,EAAG,GAAG,OAAA,CAAQ,KAAK,CAAA,QAAA,EAAM,EAAA,CAAG,QAAQ,KAAK,CAAA,CAAA,GACzC,CAAA,QAAA,EAAW,EAAA,CAAG,QAAQ,KAAK,CAAA,CAAA;AAC/B,EAAA,KAAA,CAAM,IAAA,CAAKR,sBAAA;AAAA,IACT,EAAE,KAAA,EAAO,sBAAA,EAAwB,CAAA,EAAG,EAAA,CAAG,IAAI,EAAA,EAAI,CAAA,EAAG,EAAA,CAAG,CAAA,GAAI,EAAA,EAAG;AAAA,IAC5D;AAAA,GACD,CAAA;AAGD,EAAA,KAAA,MAAW,CAAA,IAAK,GAAG,QAAA,EAAU;AAC3B,IAAA,KAAA,CAAM,KAAKQ,sBAAA,CAAK;AAAA,MACd,KAAA,EAAO,iBAAA;AAAA,MACP,GAAG,CAAA,CAAE,CAAA;AAAA,MAAG,GAAG,CAAA,CAAE,CAAA;AAAA,MAAG,OAAO,CAAA,CAAE,KAAA;AAAA,MAAO,QAAQ,CAAA,CAAE,MAAA;AAAA,MAAQ,EAAA,EAAI,CAAA;AAAA,MAAG,EAAA,EAAI;AAAA,KAC9D,CAAC,CAAA;AACF,IAAA,KAAA,CAAM,IAAA,CAAKR,sBAAA;AAAA,MACT,EAAE,KAAA,EAAO,sBAAA,EAAwB,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,CAAE,KAAA,GAAQ,CAAA,EAAG,CAAA,EAAG,EAAE,CAAA,GAAI,CAAA,CAAE,SAAS,CAAA,GAAI,CAAA,EAAG,eAAe,QAAA,EAAS;AAAA,MAC1G,CAAA,CAAE;AAAA,KACH,CAAA;AAAA,EACH;AAGA,EAAA,KAAA,MAAW,EAAA,IAAM,GAAG,KAAA,EAAO;AACzB,IAAA,KAAA,CAAM,KAAKW,sBAAA,CAAK;AAAA,MACd,KAAA,EAAO,SAAA,CAAU,EAAA,CAAG,IAAA,CAAK,QAAQ,CAAA;AAAA,MACjC,GAAG,EAAA,CAAG,IAAA;AAAA,MACN,gBAAA,EAAkB,GAAG,IAAA,CAAK;AAAA,KAC3B,CAAC,CAAA;AACF,IAAA,IAAI,EAAA,CAAG,KAAK,aAAA,EAAe;AAEzB,MAAA,MAAM,CAAA,GAAI,EAAA,CAAG,IAAA,CAAK,KAAA,CAAM,+BAA+B,CAAA;AACvD,MAAA,IAAI,CAAA,EAAG;AACL,QAAA,MAAM,EAAA,GAAK,UAAA,CAAW,CAAA,CAAE,CAAC,CAAC,CAAA;AAC1B,QAAA,MAAM,EAAA,GAAK,UAAA,CAAW,CAAA,CAAE,CAAC,CAAC,CAAA;AAC1B,QAAA,KAAA,CAAM,KAAKF,wBAAA,CAAO;AAAA,UAChB,KAAA,EAAO,iBAAA;AAAA,UACP,EAAA,EAAI,KAAK,SAAA,CAAU,iBAAA;AAAA,UACnB,EAAA,EAAI,EAAA;AAAA,UACJ,GAAG,SAAA,CAAU;AAAA,SACd,CAAC,CAAA;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,CAAA,IAAK,GAAG,SAAA,EAAW;AAC5B,IAAA,KAAA,CAAM,IAAA,CAAKA,wBAAA,CAAO,EAAE,KAAA,EAAO,mBAAmB,EAAA,EAAI,CAAA,CAAE,CAAA,EAAG,EAAA,EAAI,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAA,EACzE;AAGA,EAAA,KAAA,MAAW,KAAK,EAAA,CAAG,MAAA,QAAc,IAAA,CAAK,WAAA,CAAY,CAAC,CAAC,CAAA;AAEpD,EAAA,OAAOG,uBAAA,CAAM,EAAE,KAAA,EAAO,gBAAA,EAAkB,gBAAgB,EAAA,CAAG,OAAA,CAAQ,KAAA,EAAM,EAAG,KAAK,CAAA;AACnF;AAEO,SAAS,gBAAgB,MAAA,EAAiC;AAC/D,EAAA,MAAM,MAAA,GAAS,EAAA;AACf,EAAA,MAAM,CAAA,GAAI,MAAA,CAAO,KAAA,GAAQ,MAAA,GAAS,CAAA,GAAI,EAAA;AACtC,EAAA,MAAM,CAAA,GAAI,MAAA,CAAO,MAAA,GAAS,MAAA,GAAS,CAAA;AACnC,EAAA,MAAM,UAAA,GAAaG,oBAAA,CAAG,OAAA,EAAS,EAAC,EAAGE,2BAAA,CAAU,MAAM,CAAA,CAAE,OAAA,CAAQ,SAAA,EAAW,GAAG,CAAC,CAAA;AAC5E,EAAA,MAAM,UAAUhB,uBAAA,CAAM,CAAA,KAAA,EAAQ,OAAO,GAAA,CAAI,KAAA,IAAS,wBAAwB,CAAA,CAAE,CAAA;AAC5E,EAAA,MAAM,SAASa,sBAAA,CAAK,CAAA,SAAA,EAAY,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,YAAA,CAAc,CAAA;AACpE,EAAA,MAAM,IAAA,GAAOF,uBAAA;AAAA,IACX,EAAE,SAAA,EAAW,CAAA,UAAA,EAAa,MAAM,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA,CAAA,EAAI;AAAA,IAC9C,MAAA,CAAO,QAAA,CAAS,GAAA,CAAI4F,cAAa;AAAA,GACnC;AAEA,EAAA,OAAOxF,yBAAA;AAAA,IACL;AAAA,MACE,KAAA,EAAO,CAAA;AAAA,MACP,MAAA,EAAQ,CAAA;AAAA,MACR,OAAA,EAAS,CAAA,IAAA,EAAO,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA;AAAA,MACtB,KAAA,EAAO,QAAA;AAAA,MACP,mBAAA,EAAqB;AAAA,KACvB;AAAA,IACA;AAAA,MACEQ,sBAAA,CAAK,CAAC,UAAU,CAAC,CAAA;AAAA,MACjB,OAAA;AAAA,MACA,MAAA;AAAA,MACAhB,sBAAA,CAAK,EAAE,KAAA,EAAO,WAAA,EAAa,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,CAAA;AAAA,MAC5D;AAAA;AACF,GACF;AACF;AAEO,SAAS,UAAUR,KAAAA,EAAsB;AAC9C,EAAA,MAAM,GAAA,GAAc,SAASA,KAAI,CAAA;AACjC,EAAA,MAAM,MAAA,GAAS,UAAU,GAAG,CAAA;AAC5B,EAAA,OAAO,gBAAgB,MAAM,CAAA;AAC/B;;;AC5PO,IAAM,GAAA,GAAqB;AAAA,EAChC,IAAA,EAAM,KAAA;AAAA,EACN,OAAOA,KAAAA,EAAuB;AAC5B,IAAA,MAAM,KAAA,GAAQA,KAAAA,CAAK,IAAA,EAAK,CAAE,KAAA,CAAM,IAAI,CAAA,CAAE,CAAC,CAAA,EAAG,IAAA,EAAK,CAAE,WAAA,EAAY,IAAK,EAAA;AAClE,IAAA,OAAO,KAAA,CAAM,WAAW,KAAK,CAAA;AAAA,EAC/B,CAAA;AAAA,EACA,KAAA,EAAO,QAAA;AAAA,EACP,OAAOA,KAAAA,EAAsB;AAC3B,IAAA,OAAO,UAAUA,KAAI,CAAA;AAAA,EACvB;AACF,CAAA;;;ACYO,IAAM,aAAA,GAAN,cAA4B,KAAA,CAAM;AAAA,EACvC,IAAA;AAAA,EACA,MAAA;AAAA,EACA,WAAA,CAAY,OAAA,EAAiBD,KAAAA,EAAe,MAAA,EAAiB;AAC3D,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,eAAA;AACZ,IAAA,IAAIA,KAAAA,KAAS,MAAA,EAAW,IAAA,CAAK,IAAA,GAAOA,KAAAA;AACpC,IAAA,IAAI,MAAA,KAAW,MAAA,EAAW,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAC1C;AACF,CAAA;AAEA,IAAM,UAAA,GAAmC;AAAA,EACvC,GAAA;AAAA,EAAK,GAAA;AAAA,EAAK,GAAA;AAAA,EAAK,GAAA;AAAA,EAAK,GAAA;AAAA,EAAK,GAAA;AAAA,EAAK,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM;AACxD,CAAA;AAEA,IAAM,UAAA,mBAAa,IAAI,GAAA,CAAI,CAAC,MAAA,EAAQ,OAAO,MAAA,EAAQ,MAAA,EAAQ,OAAA,EAAS,SAAS,CAAC,CAAA;AAQ9E,SAAS0G,eAAczG,KAAAA,EAAyB;AAC9C,EAAA,MAAM,MAAiB,EAAC;AACxB,EAAA,MAAM,KAAA,GAAQA,KAAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC7B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,MAAM,KAAA,CAAM,CAAC,CAAA,CAAE,OAAA,CAAQ,OAAO,EAAE,CAAA;AAEtC,IAAA,IAAI,QAAA,GAAW,EAAA;AACf,IAAA,IAAI,KAAA,GAAQ,KAAA;AACZ,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACnC,MAAA,MAAM,EAAA,GAAK,IAAI,CAAC,CAAA;AAChB,MAAA,IAAI,EAAA,KAAO,GAAA,EAAK,KAAA,GAAQ,CAAC,KAAA;AACzB,MAAA,IAAI,CAAC,KAAA,IAAS,EAAA,KAAO,GAAA,EAAK;AACxB,QAAA,MAAM,IAAA,GAAO,GAAA,CAAI,CAAA,GAAI,CAAC,CAAA;AAEtB,QAAA,IAAI,IAAA,KAAS,MAAA,IAAa,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,EAAG;AAAA,MAC7C;AACA,MAAA,QAAA,IAAY,EAAA;AAAA,IACd;AACA,IAAA,IAAI,CAAC,QAAA,CAAS,IAAA,EAAK,EAAG;AACtB,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,OAAO,MAAA,GAAS,QAAA,CAAS,MAAA,KAAW,QAAA,CAAS,MAAM,MAAM,GAAA,IAAO,QAAA,CAAS,MAAM,CAAA,KAAM,GAAA,CAAA,EAAO;AAC1F,MAAA,MAAA,IAAU,QAAA,CAAS,MAAM,CAAA,KAAM,GAAA,GAAO,CAAA,GAAI,CAAA;AAAA,IAC5C;AACA,IAAA,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,QAAA,CAAS,IAAA,IAAQ,MAAA,EAAQ,MAAA,EAAQ,CAAA,GAAI,CAAA,EAAG,CAAA;AAAA,EAC3D;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS0G,cAAa3G,KAAAA,EAAkC;AACtD,EAAA,MAAM,CAAA,GAAIA,KAAAA,CAAK,IAAA,CAAK,KAAA,CAAM,8DAA8D,CAAA;AACxF,EAAA,IAAI,CAAC,GAAG,OAAO,IAAA;AACf,EAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAC,CAAA,CAAE,WAAA,EAAY;AAC5B,EAAA,MAAM,IAAA,GAAmB;AAAA,IACvB,IAAA,EAAM,EAAE,CAAC,CAAA;AAAA,IACT,UAAU,UAAA,CAAW,GAAA,CAAI,EAAE,CAAA,GAAK,EAAA,GAAoB,EAAE,CAAC;AAAA,GACzD;AACA,EAAA,IAAI,CAAA,CAAE,CAAC,CAAA,KAAM,MAAA,OAAgB,SAAA,GAAY,CAAA,CAAE,CAAC,CAAA,CAAE,IAAA,EAAK;AACnD,EAAA,OAAO,IAAA;AACT;AAgBA,SAAS,cAAcA,KAAAA,EAAyE;AAC9F,EAAA,MAAM,CAAA,GAAIA,KAAAA,CAAK,IAAA,CAAK,KAAA,CAAM,4CAA4C,CAAA;AACtE,EAAA,IAAI,CAAC,GAAG,OAAO,IAAA;AACf,EAAA,MAAM,KAAA,GAAQ4G,WAAAA,CAAW,CAAA,CAAE,CAAC,CAAC,CAAA;AAC7B,EAAA,IAAI,IAAA,GAAoB,QAAA;AACxB,EAAA,IAAI,KAAA,CAAM,GAAA,CAAI,SAAS,CAAA,EAAG,IAAA,GAAO,SAAA;AAAA,OAAA,IACxB,KAAA,CAAM,GAAA,CAAI,OAAO,CAAA,EAAG,IAAA,GAAO,OAAA;AACpC,EAAA,MAAM,SAA4D,EAAE,EAAA,EAAI,CAAA,CAAE,CAAC,GAAG,IAAA,EAAK;AACnF,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,GAAA,CAAI,OAAO,CAAA;AAC/B,EAAA,IAAI,KAAA,SAAc,KAAA,GAAQ,KAAA;AAC1B,EAAA,OAAO,MAAA;AACT;AAEA,SAASA,YAAW,GAAA,EAA8C;AAChE,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAoB;AACpC,EAAA,IAAI,CAAC,KAAK,OAAO,GAAA;AACjB,EAAA,MAAM,QAAQ,GAAA,CAAI,OAAA,CAAQ,UAAA,EAAY,EAAE,EAAE,IAAA,EAAK;AAC/C,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA,EAAG;AACnC,IAAA,MAAM,CAAA,GAAI,KAAK,IAAA,EAAK;AACpB,IAAA,IAAI,CAAC,CAAA,EAAG;AACR,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,OAAA,CAAQ,GAAG,CAAA;AAC3B,IAAA,IAAI,QAAQ,CAAA,EAAG;AACb,MAAA,GAAA,CAAI,GAAA,CAAI,CAAA,CAAE,WAAA,EAAY,EAAG,MAAM,CAAA;AAAA,IACjC,CAAA,MAAO;AACL,MAAA,MAAM,CAAA,GAAI,EAAE,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA,CAAE,IAAA,GAAO,WAAA,EAAY;AAC/C,MAAA,MAAM,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,KAAA,GAAQ,CAAC,EAAE,IAAA,EAAK,CAAE,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA;AACxD,MAAA,GAAA,CAAI,GAAA,CAAI,GAAG,CAAC,CAAA;AAAA,IACd;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,YAAY5G,KAAAA,EAAiC;AAKpD,EAAA,MAAM,CAAA,GAAIA,KAAAA,CAAK,IAAA,CAAK,KAAA,CAAM,uCAAuC,CAAA;AACjE,EAAA,IAAI,CAAC,GAAG,OAAO,IAAA;AACf,EAAA,MAAM,IAAA,GAAO,EAAE,CAAC,CAAA;AAChB,EAAA,IAAI,CAAC,UAAA,CAAW,QAAA,CAAS,IAAI,GAAG,OAAO,IAAA;AACvC,EAAA,IAAI,IAAA,GAAO,CAAA,CAAE,CAAC,CAAA,CAAE,IAAA,EAAK;AACrB,EAAA,IAAI,IAAA;AAEJ,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,0DAA0D,CAAA;AAChF,EAAA,IAAI,EAAA,EAAI;AACN,IAAA,IAAA,GAAO,EAAA,CAAG,CAAC,CAAA,CAAE,IAAA,EAAK;AAClB,IAAA,IAAA,GAAO,GAAG,CAAC,CAAA;AAAA,EACb;AAEA,EAAA,IAAI,KAAK,UAAA,CAAW,GAAG,KAAK,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,EAAG;AAC9C,IAAA,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,EACzB;AACA,EAAA,MAAM,MAAA,GAAoB,EAAE,SAAA,EAAW,IAAA,EAAM,IAAA,EAAK;AAClD,EAAA,IAAI,IAAA,KAAS,MAAA,EAAW,MAAA,CAAO,IAAA,GAAO,IAAA;AACtC,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,UAAA,CAAWqC,QAAmB,MAAA,EAAgC;AACrE,EAAA,IAAIA,MAAAA,CAAM,CAAA,IAAKA,MAAAA,CAAM,KAAA,CAAM,QAAQ,OAAO,IAAA;AAC1C,EAAA,MAAM,EAAA,GAAKA,MAAAA,CAAM,KAAA,CAAMA,MAAAA,CAAM,CAAC,CAAA;AAC9B,EAAA,IAAI,EAAA,CAAG,MAAA,KAAW,MAAA,EAAQ,OAAO,IAAA;AACjC,EAAA,MAAM,IAAA,GAAO,cAAc,EAAE,CAAA;AAC7B,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,EAAAA,MAAAA,CAAM,CAAA,EAAA;AAEN,EAAA,MAAM,IAAA,GAAgB;AAAA,IACpB,IAAI,IAAA,CAAK,EAAA;AAAA,IACT,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,SAAS;AAAC,GACZ;AACA,EAAA,IAAI,IAAA,CAAK,KAAA,KAAU,MAAA,EAAW,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA;AAGhD,EAAA,OAAOA,MAAAA,CAAM,CAAA,GAAIA,MAAAA,CAAM,KAAA,CAAM,MAAA,EAAQ;AACnC,IAAA,MAAM,CAAA,GAAIA,MAAAA,CAAM,KAAA,CAAMA,MAAAA,CAAM,CAAC,CAAA;AAC7B,IAAA,IAAI,CAAA,CAAE,UAAU,MAAA,EAAQ;AACxB,IAAA,MAAM,MAAA,GAAS,YAAY,CAAC,CAAA;AAC5B,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,MAAM,CAAA;AACxB,IAAAA,MAAAA,CAAM,CAAA,EAAA;AAAA,EACR;AACA,EAAA,IAAIA,MAAAA,CAAM,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,EAAG;AAC5B,IAAA,MAAM,IAAI,cAAc,CAAA,mBAAA,EAAsB,IAAA,CAAK,EAAE,CAAA,CAAA,EAAI,EAAA,CAAG,MAAA,EAAQ,EAAA,CAAG,IAAI,CAAA;AAAA,EAC7E;AACA,EAAAA,MAAAA,CAAM,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,IAAI,IAAI,CAAA;AAC7B,EAAA,IAAI,IAAA,CAAK,SAAS,SAAA,EAAW;AAC3B,IAAA,IAAIA,MAAAA,CAAM,SAAA,IAAaA,MAAAA,CAAM,SAAA,KAAc,KAAK,EAAA,EAAI;AAClD,MAAA,MAAM,IAAI,aAAA,CAAc,CAAA,0BAAA,EAA6BA,MAAAA,CAAM,SAAS,CAAA,KAAA,EAAQ,IAAA,CAAK,EAAE,CAAA,CAAA,EAAI,EAAA,CAAG,MAAA,EAAQ,EAAA,CAAG,IAAI,CAAA;AAAA,IAC3G;AACA,IAAAA,MAAAA,CAAM,YAAY,IAAA,CAAK,EAAA;AAAA,EACzB;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,oBAAoBrC,KAAAA,EAAqC;AAEhE,EAAA,MAAM,CAAA,GAAIA,KAAAA,CAAK,IAAA,CAAK,KAAA,CAAM,qGAAqG,CAAA;AAC/H,EAAA,IAAI,CAAC,GAAG,OAAO,IAAA;AACf,EAAA,MAAM,CAAA,GAAmB;AAAA,IACvB,IAAA,EAAM,EAAE,CAAC,CAAA;AAAA,IACT,EAAA,EAAI,EAAE,CAAC,CAAA;AAAA,IACP,SAAA,EAAW,CAAA,CAAE,CAAC,CAAA,CAAE,IAAA;AAAK,GACvB;AACA,EAAA,IAAI,EAAE,CAAC,CAAA,KAAM,QAAW,CAAA,CAAE,EAAA,GAAK,EAAE,CAAC,CAAA;AAClC,EAAA,OAAO,CAAA;AACT;AAEA,SAAS,aAAA,CAAcqC,QAAmB,MAAA,EAAgC;AACxE,EAAA,IAAIA,MAAAA,CAAM,CAAA,IAAKA,MAAAA,CAAM,KAAA,CAAM,QAAQ,OAAO,IAAA;AAC1C,EAAA,MAAM,IAAA,GAAOA,MAAAA,CAAM,KAAA,CAAMA,MAAAA,CAAM,CAAC,CAAA;AAChC,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,MAAA,EAAQ,OAAO,IAAA;AACnC,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,0CAA0C,CAAA;AACpE,EAAA,IAAI,CAAC,GAAG,OAAO,IAAA;AACf,EAAAA,MAAAA,CAAM,CAAA,EAAA;AAEN,EAAA,MAAM,WAA2B,EAAC;AAClC,EAAA,OAAOA,MAAAA,CAAM,CAAA,GAAIA,MAAAA,CAAM,KAAA,CAAM,MAAA,EAAQ;AACnC,IAAA,MAAM,EAAA,GAAKA,MAAAA,CAAM,KAAA,CAAMA,MAAAA,CAAM,CAAC,CAAA;AAC9B,IAAA,IAAI,EAAA,CAAG,UAAU,MAAA,EAAQ;AACzB,IAAA,MAAM,EAAA,GAAK,EAAA,CAAG,IAAA,CAAK,KAAA,CAAM,iCAAiC,CAAA;AAC1D,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,MAAM,KAAA,GAAQuE,WAAAA,CAAW,EAAA,CAAG,CAAC,CAAC,CAAA;AAC9B,IAAAvE,MAAAA,CAAM,CAAA,EAAA;AAGN,IAAA,MAAM,eAAe,EAAA,CAAG,MAAA;AACxB,IAAA,IAAI,KAAA;AACJ,IAAA,IAAI,QAAA;AACJ,IAAA,MAAM,OAAkB,EAAC;AACzB,IAAA,OAAOA,MAAAA,CAAM,CAAA,GAAIA,MAAAA,CAAM,KAAA,CAAM,MAAA,EAAQ;AACnC,MAAA,MAAM,EAAA,GAAKA,MAAAA,CAAM,KAAA,CAAMA,MAAAA,CAAM,CAAC,CAAA;AAC9B,MAAA,IAAI,EAAA,CAAG,UAAU,YAAA,EAAc;AAE/B,MAAA,MAAM,EAAA,GAAK,EAAA,CAAG,IAAA,CAAK,KAAA,CAAM,yBAAyB,CAAA;AAClD,MAAA,IAAI,EAAA,EAAI;AACN,QAAA,IAAI,UAAU,MAAA,EAAW,KAAA,GAAQ,EAAA,CAAG,CAAC,EAAE,IAAA,EAAK;AAAA,aACvC,QAAA,GAAW,EAAA,CAAG,CAAC,CAAA,CAAE,IAAA,EAAK;AAC3B,QAAAA,MAAAA,CAAM,CAAA,EAAA;AACN,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,IAAA,GAAO,UAAA,CAAWA,MAAAA,EAAO,EAAA,CAAG,MAAM,CAAA;AACxC,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,IAAA,CAAK,KAAK,EAAE,IAAA,EAAM,QAAQ,MAAA,EAAQ,IAAA,CAAK,IAAI,CAAA;AAC3C,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,GAAA,GAAM,cAAcA,MAAAA,EAAO,EAAA,CAAG,MAAM,CAAA,IAAK,aAAA,CAAcA,MAAAA,EAAO,EAAA,CAAG,MAAM,CAAA;AAC7E,MAAA,IAAI,GAAA,EAAK;AACP,QAAA,IAAA,CAAK,KAAK,GAAG,CAAA;AACb,QAAA;AAAA,MACF;AACA,MAAA,MAAM,IAAI,cAAc,CAAA,+BAAA,EAAkC,EAAA,CAAG,IAAI,CAAA,CAAA,EAAI,EAAA,CAAG,MAAA,EAAQ,EAAA,CAAG,IAAI,CAAA;AAAA,IACzF;AACA,IAAA,MAAM,MAAA,GAAuB;AAAA,MAC3B,gBAAgB,KAAA,IAAS,MAAA;AAAA,MACzB,IAAA;AAAA,MACA,eAAe,QAAA,IAAY;AAAA,KAC7B;AACA,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,GAAA,CAAI,UAAU,CAAA;AACjC,IAAA,IAAI,SAAS,MAAA,EAAW,MAAA,CAAO,QAAA,GAAW,QAAA,CAAS,MAAM,EAAE,CAAA;AAC3D,IAAA,QAAA,CAAS,KAAK,MAAM,CAAA;AAAA,EACtB;AAGA,EAAA,IAAIA,MAAAA,CAAM,CAAA,IAAKA,MAAAA,CAAM,KAAA,CAAM,MAAA,EAAQ;AACjC,IAAA,MAAM,IAAI,aAAA,CAAc,CAAA,iCAAA,CAAA,EAAqC,IAAA,CAAK,MAAA,EAAQ,KAAK,IAAI,CAAA;AAAA,EACrF;AACA,EAAA,MAAM,SAAA,GAAYA,MAAAA,CAAM,KAAA,CAAMA,MAAAA,CAAM,CAAC,CAAA;AACrC,EAAA,MAAM,EAAA,GAAK,SAAA,CAAU,IAAA,CAAK,KAAA,CAAM,oCAAoC,CAAA;AACpE,EAAA,IAAI,CAAC,EAAA,EAAI;AACP,IAAA,MAAM,IAAI,cAAc,CAAA,gCAAA,EAAmC,SAAA,CAAU,IAAI,CAAA,CAAA,CAAA,EAAK,SAAA,CAAU,MAAA,EAAQ,SAAA,CAAU,IAAI,CAAA;AAAA,EAChH;AACA,EAAAA,MAAAA,CAAM,CAAA,EAAA;AACN,EAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,UAAU,OAAA,EAAS,EAAA,CAAG,CAAC,CAAA,EAAE;AACjD;AAEA,SAAS,aAAA,CAAcA,QAAmB,MAAA,EAAgC;AACxE,EAAA,IAAIA,MAAAA,CAAM,CAAA,IAAKA,MAAAA,CAAM,KAAA,CAAM,QAAQ,OAAO,IAAA;AAC1C,EAAA,MAAM,IAAA,GAAOA,MAAAA,CAAM,KAAA,CAAMA,MAAAA,CAAM,CAAC,CAAA;AAChC,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,MAAA,EAAQ,OAAO,IAAA;AACnC,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,8CAA8C,CAAA;AACxE,EAAA,IAAI,CAAC,GAAG,OAAO,IAAA;AACf,EAAA,MAAM,SAAA,GAAY,CAAA,CAAE,CAAC,CAAA,CAAE,IAAA,EAAK;AAC5B,EAAAA,MAAAA,CAAM,CAAA,EAAA;AAEN,EAAA,MAAM,WAA2B,EAAC;AAClC,EAAA,OAAOA,MAAAA,CAAM,CAAA,GAAIA,MAAAA,CAAM,KAAA,CAAM,MAAA,EAAQ;AACnC,IAAA,MAAM,EAAA,GAAKA,MAAAA,CAAM,KAAA,CAAMA,MAAAA,CAAM,CAAC,CAAA;AAC9B,IAAA,IAAI,EAAA,CAAG,UAAU,MAAA,EAAQ;AACzB,IAAA,MAAM,EAAA,GAAK,EAAA,CAAG,IAAA,CAAK,KAAA,CAAM,iBAAiB,CAAA;AAC1C,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAAA,MAAAA,CAAM,CAAA,EAAA;AACN,IAAA,MAAM,eAAe,EAAA,CAAG,MAAA;AACxB,IAAA,MAAM,OAAkB,EAAC;AACzB,IAAA,OAAOA,MAAAA,CAAM,CAAA,GAAIA,MAAAA,CAAM,KAAA,CAAM,MAAA,EAAQ;AACnC,MAAA,MAAM,EAAA,GAAKA,MAAAA,CAAM,KAAA,CAAMA,MAAAA,CAAM,CAAC,CAAA;AAC9B,MAAA,IAAI,EAAA,CAAG,UAAU,YAAA,EAAc;AAC/B,MAAA,MAAM,IAAA,GAAO,UAAA,CAAWA,MAAAA,EAAO,EAAA,CAAG,MAAM,CAAA;AACxC,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,IAAA,CAAK,KAAK,EAAE,IAAA,EAAM,QAAQ,MAAA,EAAQ,IAAA,CAAK,IAAI,CAAA;AAC3C,QAAA;AAAA,MACF;AACA,MAAA,MAAM,GAAA,GAAM,cAAcA,MAAAA,EAAO,EAAA,CAAG,MAAM,CAAA,IAAK,aAAA,CAAcA,MAAAA,EAAO,EAAA,CAAG,MAAM,CAAA;AAC7E,MAAA,IAAI,GAAA,EAAK;AACP,QAAA,IAAA,CAAK,KAAK,GAAG,CAAA;AACb,QAAA;AAAA,MACF;AACA,MAAA,MAAM,IAAI,cAAc,CAAA,+BAAA,EAAkC,EAAA,CAAG,IAAI,CAAA,CAAA,EAAI,EAAA,CAAG,MAAA,EAAQ,EAAA,CAAG,IAAI,CAAA;AAAA,IACzF;AACA,IAAA,QAAA,CAAS,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA;AAAA,EACxB;AAEA,EAAA,IAAIA,MAAAA,CAAM,CAAA,IAAKA,MAAAA,CAAM,KAAA,CAAM,MAAA,EAAQ;AACjC,IAAA,MAAM,IAAI,aAAA,CAAc,CAAA,iCAAA,CAAA,EAAqC,IAAA,CAAK,MAAA,EAAQ,KAAK,IAAI,CAAA;AAAA,EACrF;AACA,EAAA,MAAM,SAAA,GAAYA,MAAAA,CAAM,KAAA,CAAMA,MAAAA,CAAM,CAAC,CAAA;AACrC,EAAA,MAAM,EAAA,GAAK,SAAA,CAAU,IAAA,CAAK,KAAA,CAAM,4CAA4C,CAAA;AAC5E,EAAA,IAAI,CAAC,EAAA,EAAI;AACP,IAAA,MAAM,IAAI,cAAc,CAAA,2CAAA,EAA8C,SAAA,CAAU,IAAI,CAAA,CAAA,CAAA,EAAK,SAAA,CAAU,MAAA,EAAQ,SAAA,CAAU,IAAI,CAAA;AAAA,EAC3H;AACA,EAAAA,MAAAA,CAAM,CAAA,EAAA;AACN,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,KAAA;AAAA,IACN,SAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA,EAAS,GAAG,CAAC,CAAA;AAAA,IACb,cAAA,EAAgB,EAAA,CAAG,CAAC,CAAA,CAAE,IAAA;AAAK,GAC7B;AACF;AAEO,SAAS,SAASpC,KAAAA,EAAsB;AAC7C,EAAA,MAAM,KAAA,GAAQyG,eAAczG,KAAI,CAAA;AAChC,EAAA,IAAI,MAAM,MAAA,KAAW,CAAA,EAAG,MAAM,IAAI,cAAc,mBAAmB,CAAA;AACnE,EAAA,IAAI,CAAC,SAAA,CAAU,IAAA,CAAK,MAAM,CAAC,CAAA,CAAE,IAAI,CAAA,EAAG;AAClC,IAAA,MAAM,IAAI,aAAA,CAAc,CAAA,mDAAA,EAAsD,KAAA,CAAM,CAAC,CAAA,CAAE,IAAI,CAAA,CAAA,CAAA,EAAK,KAAA,CAAM,CAAC,CAAA,CAAE,MAAA,EAAQ,KAAA,CAAM,CAAC,EAAE,IAAI,CAAA;AAAA,EAChI;AACA,EAAA,MAAMC,MAAAA,GAAQ0D,kCAAA,CAAiB,KAAA,CAAM,CAAC,EAAE,IAAI,CAAA;AAE5C,EAAA,MAAMvB,MAAAA,GAAoB;AAAA,IACxB,WAAW,EAAC;AAAA,IACZ,KAAA,sBAAW,GAAA,EAAI;AAAA,IACf,aAAa,EAAC;AAAA,IACd,MAAM,EAAC;AAAA,IACP,KAAA;AAAA,IACA,CAAA,EAAG,CAAA;AAAA,IACH,iBAAA,EAAmB;AAAA,GACrB;AAGA,EAAA,OAAOA,MAAAA,CAAM,CAAA,GAAI,KAAA,CAAM,MAAA,EAAQ;AAC7B,IAAA,MAAM,EAAA,GAAK,KAAA,CAAMA,MAAAA,CAAM,CAAC,CAAA;AACxB,IAAA,MAAM,IAAA,GAAOsE,cAAa,EAAE,CAAA;AAC5B,IAAA,IAAI,IAAA,EAAM;AACR,MAAAtE,MAAAA,CAAM,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA;AACzB,MAAAA,MAAAA,CAAM,CAAA,EAAA;AACN,MAAA;AAAA,IACF;AACA,IAAA;AAAA,EACF;AAKA,EAAA,MAAM,UAAA,GAAaA,OAAM,CAAA,GAAI,KAAA,CAAM,SAAS,KAAA,CAAMA,MAAAA,CAAM,CAAC,CAAA,CAAE,MAAA,GAAS,CAAA;AACpE,EAAA,OAAOA,MAAAA,CAAM,CAAA,GAAI,KAAA,CAAM,MAAA,EAAQ;AAC7B,IAAA,MAAM,EAAA,GAAK,KAAA,CAAMA,MAAAA,CAAM,CAAC,CAAA;AACxB,IAAA,IAAI,EAAA,CAAG,SAAS,UAAA,EAAY;AAG5B,IAAA,MAAM,KAAA,GAAQ,oBAAoB,EAAE,CAAA;AACpC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,IAAI,CAAC,MAAM,EAAA,EAAI;AACb,QAAA,KAAA,CAAM,EAAA,GAAK,CAAA,CAAA,EAAIA,MAAAA,CAAM,iBAAA,EAAmB,CAAA,CAAA;AAAA,MAC1C;AACA,MAAAA,MAAAA,CAAM,WAAA,CAAY,IAAA,CAAK,KAAK,CAAA;AAC5B,MAAAA,MAAAA,CAAM,CAAA,EAAA;AACN,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,EAAA,GAAK,EAAA,CAAG,IAAA,CAAK,KAAA,CAAM,iEAAiE,CAAA;AAC1F,IAAA,IAAI,EAAA,EAAI;AAEN,MAAAA,MAAAA,CAAM,YAAY,IAAA,CAAK;AAAA,QACrB,EAAA,EAAI,CAAA,CAAA,EAAIA,MAAAA,CAAM,iBAAA,EAAmB,CAAA,CAAA;AAAA,QACjC,IAAA,EAAM,GAAG,CAAC,CAAA;AAAA,QACV,EAAA,EAAI,GAAG,CAAC,CAAA;AAAA,QACR,SAAA,EAAW;AAAA,OACZ,CAAA;AACD,MAAAA,MAAAA,CAAM,CAAA,EAAA;AACN,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,IAAA,GAAO,UAAA,CAAWA,MAAAA,EAAO,EAAA,CAAG,MAAM,CAAA;AACxC,IAAA,IAAI,IAAA,EAAM;AACR,MAAAA,MAAAA,CAAM,KAAK,IAAA,CAAK,EAAE,MAAM,MAAA,EAAQ,MAAA,EAAQ,IAAA,CAAK,EAAA,EAAI,CAAA;AACjD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,aAAA,CAAcA,MAAAA,EAAO,EAAA,CAAG,MAAM,CAAA;AAC9C,IAAA,IAAI,OAAA,EAAS;AACX,MAAAA,MAAAA,CAAM,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA;AACvB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,aAAA,CAAcA,MAAAA,EAAO,EAAA,CAAG,MAAM,CAAA;AAC9C,IAAA,IAAI,OAAA,EAAS;AACX,MAAAA,MAAAA,CAAM,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA;AACvB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,IAAI,cAAc,CAAA,uBAAA,EAA0B,EAAA,CAAG,IAAI,CAAA,CAAA,EAAI,EAAA,CAAG,MAAA,EAAQ,EAAA,CAAG,IAAI,CAAA;AAAA,EACjF;AAEA,EAAA,IAAI,CAACA,OAAM,SAAA,EAAW;AAEpB,IAAA,MAAM,YAAYA,MAAAA,CAAM,KAAA,CAAM,MAAA,EAAO,CAAE,MAAK,CAAE,KAAA;AAC9C,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,MAAM,IAAI,cAAc,wBAAwB,CAAA;AAAA,IAClD;AACA,IAAA,SAAA,CAAU,IAAA,GAAO,SAAA;AACjB,IAAAA,MAAAA,CAAM,YAAY,SAAA,CAAU,EAAA;AAAA,EAC9B;AAGA,EAAA,KAAA,MAAW,CAAA,IAAKA,OAAM,WAAA,EAAa;AACjC,IAAA,IAAI,CAACA,MAAAA,CAAM,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA,EAAG;AAC5B,MAAA,MAAM,IAAI,aAAA,CAAc,CAAA,oCAAA,EAAuC,CAAA,CAAE,IAAI,IAAI,MAAA,EAAW,CAAA,gBAAA,EAAmB,CAAA,CAAE,IAAI,CAAA,CAAE,CAAA;AAAA,IACjH;AACA,IAAA,IAAI,CAACA,MAAAA,CAAM,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,EAAG;AAC1B,MAAA,MAAM,IAAI,aAAA,CAAc,CAAA,oCAAA,EAAuC,CAAA,CAAE,EAAE,IAAI,MAAA,EAAW,CAAA,cAAA,EAAiB,CAAA,CAAE,EAAE,CAAA,CAAE,CAAA;AAAA,IAC3G;AAAA,EACF;AAEA,EAAA,MAAM,GAAA,GAAc;AAAA,IAClB,IAAA,EAAM,KAAA;AAAA,IACN,WAAWA,MAAAA,CAAM,SAAA;AAAA,IACjB,OAAOA,MAAAA,CAAM,KAAA;AAAA,IACb,MAAMA,MAAAA,CAAM,IAAA;AAAA,IACZ,aAAaA,MAAAA,CAAM;AAAA,GACrB;AACA,EAAA,IAAInC,MAAAA,KAAU,MAAA,EAAW,GAAA,CAAI,KAAA,GAAQA,MAAAA;AACrC,EAAA,OAAO,GAAA;AACT;;;ACnaO,IAAM,SAAA,GAAY;AAAA,EACvB,UAAA,EAAY,GAAA;AAAA,EACZ,WAAA,EAAa,EAAA;AAAA,EACb,mBAAA,EAAqB,CAAA;AAAA,EACrB,gBAAA,EAAkB,EAAA;AAAA,EAClB,gBAAA,EAAkB,CAAA;AAAA,EAClB,oBAAA,EAAsB,CAAA;AAAA,EACtB,cAAA,EAAgB,EAAA;AAAA,EAChB,gBAAA,EAAkB,EAAA;AAAA,EAClB,cAAA,EAAgB,GAAA;AAAA,EAChB,cAAA,EAAgB,EAAA;AAAA,EAChB,kBAAA,EAAoB,EAAA;AAAA,EACpB,aAAA,EAAe,EAAA;AAAA,EACf,YAAA,EAAc,CAAA;AAAA,EAGd,QAAA,EAAU,EAAA;AAAA,EACV,QAAA,EAAU,EAAA;AAAA,EACV,aAAA,EAAe;AACjB,CAAA;AA0BA,SAAS,qBAAA,GAAgC;AACvC,EAAA,OAAO,SAAA,CAAU,cAAA;AACnB;AAEA,SAAS,oBAAoB,IAAA,EAAyB;AACpD,EAAA,MAAM,QAAQ,SAAA,CAAU,UAAA;AACxB,EAAA,MAAM,SAAS,SAAA,CAAU,WAAA;AAEzB,EAAA,OAAO,EAAE,OAAO,MAAA,EAAO;AACzB;AAEA,SAAS,QAAA,CAAS,KAAa,IAAA,EAA2B;AAExD,EAAA,IAAI,OAAO,SAAA,CAAU,UAAA;AACrB,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,IAAA,GAAO,KAAK,CAAC,CAAA;AACnB,IAAA,MAAM,EAAA,GAAK,QAAA,CAAS,GAAA,EAAK,IAAI,CAAA;AAC7B,IAAA,IAAI,EAAA,CAAG,KAAA,GAAQ,IAAA,EAAM,IAAA,GAAO,EAAA,CAAG,KAAA;AAC/B,IAAA,MAAA,IAAU,EAAA,CAAG,MAAA;AACb,IAAA,IAAI,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG;AACvB,MAAA,MAAA,IAAU,SAAA,CAAU,cAAA;AAAA,IACtB;AAAA,EACF;AACA,EAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAO;AACvC;AAEA,SAAS,QAAA,CAAS,KAAa,IAAA,EAAyB;AACtD,EAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,KAAK,MAAM,CAAA;AACtC,IAAA,IAAI,CAAC,MAAM,OAAO,EAAE,OAAO,SAAA,CAAU,UAAA,EAAY,MAAA,EAAQ,SAAA,CAAU,WAAA,EAAY;AAC/E,IAAA,OAAO,oBAAwB,CAAA;AAAA,EACjC;AACA,EAAA,IAAI,IAAA,CAAK,SAAS,KAAA,EAAO;AACvB,IAAA,IAAI2G,OAAAA,GAAS,CAAA;AACb,IAAA,IAAIC,KAAAA,GAAO,CAAA;AACX,IAAA,KAAA,MAAW,EAAA,IAAM,KAAK,QAAA,EAAU;AAC9B,MAAA,MAAM,EAAA,GAAK,aAAA,CAAc,GAAA,EAAK,EAAE,CAAA;AAChC,MAAAD,WAAU,EAAA,CAAG,KAAA;AACb,MAAA,IAAI,EAAA,CAAG,MAAA,GAASC,KAAAA,EAAMA,QAAO,EAAA,CAAG,MAAA;AAAA,IAClC;AACA,IAAAD,OAAAA,IAAAA,CAAW,IAAA,CAAK,QAAA,CAAS,MAAA,GAAS,KAAK,SAAA,CAAU,gBAAA;AAEjD,IAAA,MAAME,OAAAA,GAASD,KAAAA,GAAO,SAAA,CAAU,cAAA,GAAiB,CAAA;AACjD,IAAA,OAAO,EAAE,OAAO,IAAA,CAAK,GAAA,CAAID,SAAQ,SAAA,CAAU,UAAU,CAAA,EAAG,MAAA,EAAQE,OAAAA,EAAO;AAAA,EACzE;AAEA,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,KAAA,MAAW,EAAA,IAAM,KAAK,QAAA,EAAU;AAC9B,IAAA,MAAM,EAAA,GAAK,QAAA,CAAS,GAAA,EAAK,EAAA,CAAG,IAAI,CAAA;AAChC,IAAA,MAAA,IAAU,EAAA,CAAG,KAAA;AACb,IAAA,IAAI,EAAA,CAAG,MAAA,GAAS,IAAA,EAAM,IAAA,GAAO,EAAA,CAAG,MAAA;AAAA,EAClC;AACA,EAAA,MAAA,IAAA,CAAW,IAAA,CAAK,QAAA,CAAS,MAAA,GAAS,CAAA,IAAK,SAAA,CAAU,gBAAA;AAEjD,EAAA,MAAM,MAAA,GAAS,SAAA,CAAU,cAAA,GAAiB,CAAA,GAAI,IAAA;AAC9C,EAAA,OAAO,EAAE,OAAO,IAAA,CAAK,GAAA,CAAI,QAAQ,SAAA,CAAU,UAAU,CAAA,EAAG,MAAA,EAAQ,MAAA,EAAO;AACzE;AAEA,SAAS,aAAA,CAAc,KAAa,EAAA,EAA4B;AAE9D,EAAA,IAAI,QAAQ,SAAA,CAAU,UAAA;AACtB,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,EAAA,CAAG,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACvC,IAAA,MAAM,KAAK,QAAA,CAAS,GAAA,EAAK,EAAA,CAAG,IAAA,CAAK,CAAC,CAAC,CAAA;AACnC,IAAA,IAAI,EAAA,CAAG,KAAA,GAAQ,KAAA,EAAO,KAAA,GAAQ,EAAA,CAAG,KAAA;AACjC,IAAA,KAAA,IAAS,EAAA,CAAG,MAAA;AACZ,IAAA,IAAI,IAAI,EAAA,CAAG,IAAA,CAAK,MAAA,GAAS,CAAA,WAAY,SAAA,CAAU,cAAA;AAAA,EACjD;AACA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,KAAA;AAAA,IACP,MAAA,EAAQ,KAAA,GAAQ,SAAA,CAAU,cAAA,GAAiB;AAAA;AAAA,GAC7C;AACF;AAGA,SAAS,SAAA,CACP,GAAA,EACA,GAAA,EACA,IAAA,EACA,IACA,MAAA,EACwG;AACxG,EAAA,IAAI,CAAA,GAAI,MAAA;AACR,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI,MAAA;AACJ,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,IAAA,GAAO,KAAK,CAAC,CAAA;AACnB,IAAA,IAAI,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,SAAA,CAAU,cAAA;AAC1B,IAAA,MAAM,SAAS,SAAA,CAAU,GAAA,EAAK,GAAA,EAAK,IAAA,EAAM,IAAI,CAAC,CAAA;AAC9C,IAAA,IAAI,MAAM,CAAA,EAAG;AACX,MAAA,OAAA,GAAU,MAAA,CAAO,OAAA;AACjB,MAAA,IAAI,MAAA,CAAO,WAAA,EAAa,OAAA,GAAU,MAAA,CAAO,WAAA;AAAA,IAC3C;AACA,IAAA,MAAA,GAAS,MAAA,CAAO,MAAA;AAChB,IAAA,IAAI,MAAA,CAAO,UAAA,EAAY,MAAA,GAAS,MAAA,CAAO,UAAA;AACvC,IAAA,CAAA,GAAI,MAAA,CAAO,IAAA;AAAA,EACb;AACA,EAAA,OAAO,EAAE,IAAA,EAAM,CAAA,EAAG,WAAA,EAAa,OAAA,EAAS,YAAY,MAAA,EAAQ,WAAA,EAAa,OAAA,EAAS,UAAA,EAAY,MAAA,EAAO;AACvG;AAUA,SAAS,SAAA,CAAU,GAAA,EAAoB,GAAA,EAAa,IAAA,EAAe,IAAY,MAAA,EAA6B;AAC1G,EAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,KAAK,MAAM,CAAA;AACtC,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,OAAO,EAAE,IAAA,EAAM,MAAA,GAAS,SAAA,CAAU,aAAa,OAAA,EAAS,MAAA,GAAS,SAAA,CAAU,WAAA,GAAc,CAAA,EAAG,MAAA,EAAQ,MAAA,GAAS,SAAA,CAAU,cAAc,CAAA,EAAE;AAAA,IACzI;AACA,IAAA,OAAO,SAAA,CAAU,GAAA,EAAK,IAAA,EAAM,EAAA,EAAI,MAAM,CAAA;AAAA,EACxC;AACA,EAAA,IAAI,IAAA,CAAK,SAAS,KAAA,EAAO;AACvB,IAAA,OAAO,QAAA,CAAS,GAAA,EAAK,GAAA,EAAK,IAAA,EAAM,IAAI,MAAM,CAAA;AAAA,EAC5C;AACA,EAAA,OAAO,QAAA,CAAS,GAAA,EAAK,GAAA,EAAK,IAAA,EAAM,IAAI,MAAM,CAAA;AAC5C;AAEA,SAAS,SAAA,CAAU,GAAA,EAAoB,IAAA,EAAe,EAAA,EAAY,CAAA,EAAwB;AACxF,EAAA,MAAM,IAAI,SAAA,CAAU,UAAA;AACpB,EAAA,MAAM,IAAI,SAAA,CAAU,WAAA;AACpB,EAAA,MAAM,CAAA,GAAI,KAAK,CAAA,GAAI,CAAA;AACnB,EAAA,MAAM,UAAA,GAA4B,EAAE,IAAA,EAAM,CAAA,EAAG,GAAG,KAAA,EAAO,CAAA,EAAG,QAAQ,CAAA,EAAE;AACpE,EAAA,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,UAAU,CAAA;AACjC,EAAA,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,EAAE,IAAA,EAAM,EAAA,EAAI,EAAA,EAAI,CAAA,GAAI,CAAA,GAAI,CAAA,EAAG,CAAA;AAGvD,EAAA,IAAI,EAAA,GAAK,CAAA;AACT,EAAA,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAA,EAAG,GAAA,KAAQ;AAC/B,IAAA,MAAM,EAAA,GAAK,CAAA,GAAI,CAAA,GAAI,SAAA,CAAU,YAAA;AAC7B,IAAA,MAAM,KAAK,CAAA,CAAE,IAAA,GAAO,uBAAsB,GAAI,SAAA,CAAU,gBAAgB,qBAAA,EAAsB;AAC9F,IAAA,GAAA,CAAI,QAAQ,IAAA,CAAK;AAAA,MACf,MAAA,EAAQ,CAAA;AAAA,MACR,QAAQ,IAAA,CAAK,EAAA;AAAA,MACb,KAAA,EAAO,GAAA;AAAA,MACP,CAAA,EAAG,EAAA;AAAA,MACH,CAAA,EAAG,EAAA;AAAA,MACH,OAAO,SAAA,CAAU,cAAA;AAAA,MACjB,MAAA,EAAQ,EAAA;AAAA,MACR,gBAAgB,SAAA,CAAU;AAAA,KAC3B,CAAA;AACD,IAAA,EAAA,IAAM,EAAA;AAAA,EACR,CAAC,CAAA;AAED,EAAA,OAAO;AAAA,IACL,MAAM,CAAA,GAAI,CAAA;AAAA,IACV,OAAA,EAAS,IAAI,CAAA,GAAI,CAAA;AAAA,IACjB,MAAA,EAAQ,IAAI,CAAA,GAAI,CAAA;AAAA,IAChB,aAAa,IAAA,CAAK,EAAA;AAAA,IAClB,YAAY,IAAA,CAAK;AAAA,GACnB;AACF;AAEA,SAAS,QAAA,CAAS,GAAA,EAAoB,GAAA,EAAa,IAAA,EAAyC,IAAY,MAAA,EAA6B;AAEnI,EAAA,MAAM,WAAA,GAAc,KAAK,QAAA,CAAS,GAAA,CAAI,CAAC,EAAA,KAAO,aAAA,CAAc,GAAA,EAAK,EAAE,CAAC,CAAA;AACpE,EAAA,MAAM,MAAA,GAAS,WAAA,CAAY,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,CAAA,CAAE,KAAA,EAAO,CAAC,CAAA,GAAA,CACzC,IAAA,CAAK,QAAA,CAAS,MAAA,GAAS,KAAK,SAAA,CAAU,gBAAA;AACvD,EAAA,MAAM,KAAA,GAAQ,KAAK,MAAA,GAAS,CAAA;AAG5B,EAAA,MAAM,IAAA,GAAO,MAAA,GAAS,SAAA,CAAU,cAAA,GAAiB,CAAA;AACjD,EAAA,GAAA,CAAI,KAAK,IAAA,CAAK;AAAA,IACZ,IAAA,EAAM,SAAA;AAAA,IACN,IAAI,KAAA,GAAQ,EAAA;AAAA,IACZ,EAAA,EAAI,QAAQ,MAAA,GAAS,EAAA;AAAA,IACrB,CAAA,EAAG;AAAA,GACJ,CAAA;AAGD,EAAA,IAAI,EAAA,GAAK,KAAA;AACT,EAAA,IAAI,YAAA,GAAe,CAAA;AAEnB,EAAA,KAAA,IAAS,KAAK,CAAA,EAAG,EAAA,GAAK,IAAA,CAAK,QAAA,CAAS,QAAQ,EAAA,EAAA,EAAM;AAChD,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,QAAA,CAAS,EAAE,CAAA;AAC3B,IAAA,MAAM,EAAA,GAAK,YAAY,EAAE,CAAA;AACzB,IAAA,MAAM,QAAA,GAAW,EAAA,GAAK,EAAA,CAAG,KAAA,GAAQ,CAAA;AAIjC,IAAA,MAAM,MAAA,GAAwB;AAAA,MAC5B,EAAA,EAAI,OAAO,EAAE,CAAA,MAAA,CAAA;AAAA,MACb,IAAA,EAAM,MAAA;AAAA,MAAQ,EAAA,EAAI,MAAA;AAAA,MAClB,WAAW,EAAA,CAAG;AAAA,KAChB;AACA,IAAA,GAAA,CAAI,YAAY,IAAA,CAAK;AAAA,MACnB,UAAA,EAAY,MAAA;AAAA,MACZ,EAAA,EAAI,QAAA;AAAA,MACJ,EAAA,EAAI,IAAA,GAAO,SAAA,CAAU,cAAA,GAAiB,GAAA;AAAA,MACtC,GAAG,SAAA,CAAU;AAAA,KACd,CAAA;AAID,IAAA,MAAM,UAAA,GAAa,OAAO,SAAA,CAAU,cAAA;AACpC,IAAA,MAAM,SAAS,SAAA,CAAU,GAAA,EAAK,KAAK,EAAA,CAAG,IAAA,EAAM,UAAU,UAAU,CAAA;AAChE,IAAA,MAAM,aAAa,MAAA,CAAO,IAAA;AAE1B,IAAA,GAAA,CAAI,YAAY,IAAA,CAAK;AAAA,MACnB,UAAA,EAAY,EAAE,EAAA,EAAI,CAAA,IAAA,EAAO,EAAE,CAAA,KAAA,CAAA,EAAS,IAAA,EAAM,MAAA,EAAQ,EAAA,EAAI,OAAA,EAAS,SAAA,EAAW,EAAA,CAAG,aAAA,EAAc;AAAA,MAC3F,EAAA,EAAI,QAAA;AAAA,MACJ,EAAA,EAAI,UAAA,GAAa,SAAA,CAAU,cAAA,GAAiB,GAAA;AAAA,MAC5C,GAAG,SAAA,CAAU;AAAA,KACd,CAAA;AAED,IAAA,IAAI,MAAA,CAAO,gBAAgB,MAAA,EAAW;AAEpC,MAAA,GAAA,CAAI,MAAM,IAAA,CAAK,EAAE,MAAM,CAAA,EAAA,EAAK,QAAQ,IAAI,IAAI,CAAA,GAAA,EAAM,QAAQ,CAAA,CAAA,EAAI,MAAA,CAAO,cAAc,SAAA,CAAU,WAAA,GAAc,CAAC,CAAA,CAAA,EAAI,GAAA,EAAK,QAAQ,CAAA;AAAA,IAC/H;AACA,IAAA,IAAI,MAAA,CAAO,eAAe,MAAA,EAAW;AAEnC,MAAA,GAAA,CAAI,MAAM,IAAA,CAAK;AAAA,QACb,IAAA,EAAM,CAAA,EAAA,EAAK,QAAQ,CAAA,CAAA,EAAI,OAAO,UAAA,GAAa,SAAA,CAAU,WAAA,GAAc,CAAC,CAAA,GAAA,EAAM,QAAQ,CAAA,CAAA,EAAI,UAAA,GAAa,UAAU,cAAc,CAAA,CAAA;AAAA,QAC3H,GAAA,EAAK;AAAA,OACN,CAAA;AAAA,IACH;AACA,IAAA,EAAA,IAAM,EAAA,CAAG,QAAQ,SAAA,CAAU,gBAAA;AAC3B,IAAA,IAAI,aAAa,SAAA,CAAU,cAAA,GAAiB,YAAA,EAAc,YAAA,GAAe,aAAa,SAAA,CAAU,cAAA;AAAA,EAClG;AAGA,EAAA,MAAM,KAAA,GAAQ,YAAA;AACd,EAAA,GAAA,CAAI,KAAK,IAAA,CAAK;AAAA,IACZ,IAAA,EAAM,UAAA;AAAA,IACN,IAAI,KAAA,GAAQ,EAAA;AAAA,IACZ,EAAA,EAAI,QAAQ,MAAA,GAAS,EAAA;AAAA,IACrB,CAAA,EAAG;AAAA,GACJ,CAAA;AAID,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,KAAA;AAAA,IACN,OAAA,EAAS,IAAA;AAAA,IACT,MAAA,EAAQ;AAAA,GACV;AACF;AAEA,SAAS,QAAA,CAAS,GAAA,EAAoB,GAAA,EAAa,IAAA,EAAyC,IAAY,MAAA,EAA6B;AAEnI,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,CAAC,OAAO,QAAA,CAAS,GAAA,EAAK,EAAA,CAAG,IAAI,CAAC,CAAA;AACpE,EAAA,MAAM,MAAA,GAAS,WAAA,CAAY,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,CAAA,CAAE,KAAA,EAAO,CAAC,CAAA,GAAA,CACzC,IAAA,CAAK,QAAA,CAAS,MAAA,GAAS,KAAK,SAAA,CAAU,gBAAA;AACvD,EAAA,MAAM,KAAA,GAAQ,KAAK,MAAA,GAAS,CAAA;AAG5B,EAAA,MAAM,UAAA,GAAa,MAAA,GAAS,SAAA,CAAU,cAAA,GAAiB,GAAA;AACvD,EAAA,GAAA,CAAI,YAAY,IAAA,CAAK;AAAA,IACnB,UAAA,EAAY,EAAE,EAAA,EAAI,SAAA,EAAW,IAAA,EAAM,QAAQ,EAAA,EAAI,MAAA,EAAQ,SAAA,EAAW,IAAA,CAAK,SAAA,EAAU;AAAA,IACjF,EAAA;AAAA,IACA,EAAA,EAAI,UAAA;AAAA,IACJ,GAAG,SAAA,CAAU;AAAA,GACd,CAAA;AAGD,EAAA,MAAM,KAAA,GAAQ,SAAS,SAAA,CAAU,cAAA;AACjC,EAAA,MAAM,KAAA,GAAQ,QAAQ,SAAA,CAAU,oBAAA;AAChC,EAAA,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,WAAW,EAAA,EAAI,KAAA,GAAQ,EAAA,EAAI,EAAA,EAAI,KAAA,GAAQ,MAAA,GAAS,EAAA,EAAI,CAAA,EAAG,OAAO,CAAA;AACpF,EAAA,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,WAAW,EAAA,EAAI,KAAA,GAAQ,EAAA,EAAI,EAAA,EAAI,KAAA,GAAQ,MAAA,GAAS,EAAA,EAAI,CAAA,EAAG,OAAO,CAAA;AAGpF,EAAA,IAAI,EAAA,GAAK,KAAA;AACT,EAAA,IAAI,YAAA,GAAe,CAAA;AACnB,EAAA,KAAA,IAAS,KAAK,CAAA,EAAG,EAAA,GAAK,IAAA,CAAK,QAAA,CAAS,QAAQ,EAAA,EAAA,EAAM;AAChD,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,QAAA,CAAS,EAAE,CAAA;AAC3B,IAAA,MAAM,EAAA,GAAK,YAAY,EAAE,CAAA;AACzB,IAAA,MAAM,QAAA,GAAW,EAAA,GAAK,EAAA,CAAG,KAAA,GAAQ,CAAA;AACjC,IAAA,MAAM,MAAA,GAAS,UAAU,GAAA,EAAK,GAAA,EAAK,GAAG,IAAA,EAAM,QAAA,EAAU,KAAA,GAAQ,SAAA,CAAU,cAAc,CAAA;AACtF,IAAA,IAAI,MAAA,CAAO,gBAAgB,MAAA,EAAW;AACpC,MAAA,GAAA,CAAI,MAAM,IAAA,CAAK,EAAE,MAAM,CAAA,EAAA,EAAK,QAAQ,IAAI,KAAK,CAAA,GAAA,EAAM,QAAQ,CAAA,CAAA,EAAI,MAAA,CAAO,cAAc,SAAA,CAAU,WAAA,GAAc,CAAC,CAAA,CAAA,EAAI,GAAA,EAAK,QAAQ,CAAA;AAAA,IAChI;AACA,IAAA,IAAI,MAAA,CAAO,eAAe,MAAA,EAAW;AACnC,MAAA,GAAA,CAAI,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,KAAK,QAAQ,CAAA,CAAA,EAAI,MAAA,CAAO,UAAA,GAAa,SAAA,CAAU,WAAA,GAAc,CAAC,CAAA,GAAA,EAAM,QAAQ,IAAI,MAAA,CAAO,IAAA,GAAO,UAAU,cAAc,CAAA,CAAA,EAAI,GAAA,EAAK,MAAA,EAAQ,CAAA;AAAA,IAChK;AACA,IAAA,EAAA,IAAM,EAAA,CAAG,QAAQ,SAAA,CAAU,gBAAA;AAC3B,IAAA,IAAI,MAAA,CAAO,OAAO,SAAA,CAAU,cAAA,GAAiB,cAAc,YAAA,GAAe,MAAA,CAAO,OAAO,SAAA,CAAU,cAAA;AAAA,EACpG;AAGA,EAAA,MAAM,MAAA,GAAS,YAAA;AACf,EAAA,MAAM,MAAA,GAAS,SAAS,SAAA,CAAU,oBAAA;AAClC,EAAA,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,YAAY,EAAA,EAAI,KAAA,GAAQ,EAAA,EAAI,EAAA,EAAI,KAAA,GAAQ,MAAA,GAAS,EAAA,EAAI,CAAA,EAAG,QAAQ,CAAA;AACtF,EAAA,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,YAAY,EAAA,EAAI,KAAA,GAAQ,EAAA,EAAI,EAAA,EAAI,KAAA,GAAQ,MAAA,GAAS,EAAA,EAAI,CAAA,EAAG,QAAQ,CAAA;AAGtF,EAAA,MAAM,aAAA,GAAgB,MAAA,GAAS,SAAA,CAAU,cAAA,GAAiB,GAAA;AAC1D,EAAA,GAAA,CAAI,YAAY,IAAA,CAAK;AAAA,IACnB,UAAA,EAAY,EAAE,EAAA,EAAI,UAAA,EAAY,IAAA,EAAM,SAAS,EAAA,EAAI,OAAA,EAAS,SAAA,EAAW,IAAA,CAAK,cAAA,EAAe;AAAA,IACzF,EAAA;AAAA,IACA,EAAA,EAAI,aAAA;AAAA,IACJ,GAAG,SAAA,CAAU;AAAA,GACd,CAAA;AAED,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,SAAS,SAAA,CAAU,cAAA;AAAA,IACzB,OAAA,EAAS,UAAA;AAAA,IACT,MAAA,EAAQ;AAAA,GACV;AACF;AAEO,SAAS,UAAU,GAAA,EAA8B;AACtD,EAAA,MAAM,GAAA,GAAqB;AAAA,IACzB,KAAA,sBAAW,GAAA,EAAI;AAAA,IACf,SAAS,EAAC;AAAA,IACV,aAAa,EAAC;AAAA,IACd,MAAM,EAAC;AAAA,IACP,OAAO,EAAC;AAAA,IACR,OAAO,EAAC;AAAA,IACR,UAAA,sBAAgB,GAAA;AAAI,GACtB;AAGA,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,GAAA,EAAK,GAAA,CAAI,IAAI,CAAA;AACxC,EAAA,MAAM,EAAA,GAAK,SAAA,CAAU,QAAA,GAAW,SAAA,CAAU,KAAA,GAAQ,CAAA;AAGlD,EAAA,MAAM,SAAS,SAAA,CAAU,QAAA;AACzB,EAAA,MAAM,SAAS,SAAA,CAAU,GAAA,EAAK,KAAK,GAAA,CAAI,IAAA,EAAM,IAAI,MAAM,CAAA;AAIvD,EAAA,MAAM,QAAA,uBAAe,GAAA,EAA2B;AAChD,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,WAAA,EAAa;AAC/B,IAAA,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA,CAAE,IAAI,KAAK,CAAA,CAAE,EAAE,IAAI,CAAC,CAAA;AAAA,EACtC;AAIA,EAAA,MAAM,aAAA,GAA0B,kBAAA,CAAmB,GAAA,CAAI,IAAI,CAAA;AAC3D,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,aAAA,CAAc,MAAA,GAAS,GAAG,CAAA,EAAA,EAAK;AACjD,IAAA,MAAM,IAAA,GAAO,cAAc,CAAC,CAAA;AAC5B,IAAA,MAAM,EAAA,GAAK,aAAA,CAAc,CAAA,GAAI,CAAC,CAAA;AAC9B,IAAA,MAAM,IAAI,QAAA,CAAS,GAAA,CAAI,GAAG,IAAI,CAAA,EAAA,EAAK,EAAE,CAAA,CAAE,CAAA;AACvC,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,IAAI,CAAA;AACrC,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,EAAE,CAAA;AACjC,IAAA,IAAI,CAAC,KAAA,IAAS,CAAC,GAAA,EAAK;AACpB,IAAA,MAAM,IAAA,GAAA,CAAQ,KAAA,CAAM,EAAA,GAAK,SAAA,CAAU,WAAA,GAAc,IAAI,GAAA,CAAI,EAAA,GAAK,SAAA,CAAU,WAAA,GAAc,CAAA,IAAK,CAAA;AAC3F,IAAA,IAAI,CAAA,EAAG;AACL,MAAA,GAAA,CAAI,YAAY,IAAA,CAAK;AAAA,QACnB,UAAA,EAAY,CAAA;AAAA,QACZ,IAAI,KAAA,CAAM,EAAA;AAAA,QACV,EAAA,EAAI,IAAA;AAAA,QACJ,GAAG,SAAA,CAAU,gBAAA;AAAA,QACb,GAAI,EAAE,EAAA,GAAK,EAAE,IAAI,CAAA,CAAE,EAAA,KAAO;AAAC,OAC5B,CAAA;AAAA,IACH;AAEA,IAAA,GAAA,CAAI,MAAM,IAAA,CAAK;AAAA,MACb,MAAM,CAAA,EAAA,EAAK,KAAA,CAAM,EAAE,CAAA,CAAA,EAAI,KAAA,CAAM,KAAK,SAAA,CAAU,WAAA,GAAc,CAAC,CAAA,GAAA,EAAM,IAAI,EAAE,CAAA,CAAA,EAAI,IAAI,EAAA,GAAK,SAAA,CAAU,cAAc,CAAC,CAAA,CAAA;AAAA,MAC7G,GAAA,EAAK;AAAA,KACN,CAAA;AACD,IAAA,IAAI,GAAG,QAAA,CAAS,MAAA,CAAO,GAAG,IAAI,CAAA,EAAA,EAAK,EAAE,CAAA,CAAE,CAAA;AAAA,EACzC;AAGA,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,WAAA,EAAa;AAC/B,IAAA,IAAI,CAAC,QAAA,CAAS,GAAA,CAAI,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,EAAA,EAAK,CAAA,CAAE,EAAE,CAAA,CAAE,CAAA,EAAG;AACzC,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,EAAE,IAAI,CAAA;AACvC,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,EAAE,EAAE,CAAA;AACnC,IAAA,IAAI,CAAC,KAAA,IAAS,CAAC,GAAA,EAAK;AACpB,IAAA,MAAM,MAAA,GAAS,UAAU,CAAA,KAAM,CAAA;AAC/B,IAAA,OAAA,EAAA;AACA,IAAA,MAAM,OAAA,GAAU,MAAA,GACZ,SAAA,CAAU,QAAA,GAAW,SAAA,CAAU,aAAA,IACjB,SAAA,CAAU,KAAA,GAAQ,SAAA,CAAU,QAAA,GAAW,SAAA,CAAU,aAAA,CAAA;AACnE,IAAA,MAAM,KAAA,GAAQ,MAAA,GACV,KAAA,CAAM,EAAA,GAAK,SAAA,CAAU,aAAa,CAAA,GAClC,KAAA,CAAM,EAAA,GAAK,SAAA,CAAU,UAAA,GAAa,CAAA;AACtC,IAAA,MAAM,GAAA,GAAM,MAAA,GACR,GAAA,CAAI,EAAA,GAAK,SAAA,CAAU,aAAa,CAAA,GAChC,GAAA,CAAI,EAAA,GAAK,SAAA,CAAU,UAAA,GAAa,CAAA;AACpC,IAAA,MAAM,QAAQ,KAAA,CAAM,EAAA;AACpB,IAAA,MAAM,MAAM,GAAA,CAAI,EAAA;AAChB,IAAA,MAAMnG,QAAO,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,EAAI,KAAK,MAAM,OAAO,CAAA,CAAA,EAAI,KAAK,CAAA,GAAA,EAAM,OAAO,CAAA,CAAA,EAAI,GAAG,CAAA,GAAA,EAAM,GAAG,IAAI,GAAG,CAAA,CAAA;AAC1F,IAAA,GAAA,CAAI,MAAM,IAAA,CAAK;AAAA,MACb,YAAY,CAAA,CAAE,IAAA;AAAA,MACd,UAAU,CAAA,CAAE,EAAA;AAAA,MACZ,IAAA,EAAAA,KAAAA;AAAA,MACA,MAAA,EAAQ,OAAA,IAAW,MAAA,GAAS,EAAA,GAAK,CAAA,CAAA;AAAA,MACjC,MAAA,EAAA,CAAS,QAAQ,GAAA,IAAO,CAAA;AAAA,MACxB,WAAW,CAAA,CAAE,EAAA;AAAA,MACb,WAAW,CAAA,CAAE;AAAA,KACd,CAAA;AAAA,EACH;AAGA,EAAA,MAAM,KAAA,GAAQ,UAAU,KAAA,GAAQ,SAAA,CAAU,WAAW,CAAA,GAAI,SAAA,CAAU,gBAAgB,CAAA,GAAI,EAAA;AACvF,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,IAAA,GAAO,SAAA,CAAU,QAAA;AAEvC,EAAA,OAAO;AAAA,IACL,GAAA;AAAA,IACA,OAAO,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,QAAQ,CAAA;AAAA,IACpC,SAAS,GAAA,CAAI,OAAA;AAAA,IACb,aAAa,GAAA,CAAI,WAAA;AAAA,IACjB,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,OAAO,GAAA,CAAI,KAAA;AAAA,IACX,OAAO,GAAA,CAAI,KAAA;AAAA,IACX,KAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,mBAAmB,IAAA,EAA2B;AACrD,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,KAAA,MAAW,QAAQ,IAAA,EAAM;AACvB,IAAA,IAAI,KAAK,IAAA,KAAS,MAAA,EAAQ,GAAA,CAAI,IAAA,CAAK,KAAK,MAAM,CAAA;AAAA,EAKhD;AACA,EAAA,OAAO,GAAA;AACT;;;ACpeA,IAAMoG,OAAAA,GAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAoBR,SAAS,gBAAgB,MAAA,EAAiC;AAC/D,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,MAAM,OAAA,GAAUhG,oBAAA,CAAG,OAAA,EAAS,EAAC,EAAGE,2BAAA,CAAU8F,OAAM,CAAA,CAAE,OAAA,CAAQ,SAAA,EAAW,GAAG,CAAC,CAAA;AACzE,EAAA,MAAMC,YAAAA,GAAcjG,oBAAA;AAAA,IAClB,QAAA;AAAA,IACA;AAAA,MACE,EAAA,EAAI,WAAA;AAAA,MACJ,OAAA,EAAS,WAAA;AAAA,MACT,IAAA,EAAM,CAAA;AAAA,MAAG,IAAA,EAAM,CAAA;AAAA,MACf,WAAA,EAAa,CAAA;AAAA,MAAG,YAAA,EAAc,CAAA;AAAA,MAC9B,MAAA,EAAQ;AAAA,KACV;AAAA,IACA,CAACA,qBAAG,MAAA,EAAQ,EAAE,GAAG,uBAAA,EAAyB,IAAA,EAAM,MAAA,EAAQ,CAAC;AAAA,GAC3D;AACA,EAAA,KAAA,CAAM,KAAKS,sBAAA,CAAK,CAAC,OAAA,EAASwF,YAAW,CAAC,CAAC,CAAA;AACvC,EAAA,KAAA,CAAM,IAAA,CAAK/G,wBAAM,CAAA,KAAA,EAAQ,MAAA,CAAO,IAAI,KAAA,IAAS,2BAA2B,EAAE,CAAC,CAAA;AAC3E,EAAA,KAAA,CAAM,IAAA,CAAKa,sBAAA,CAAK,CAAA,SAAA,EAAY,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA,UAAA,EAAa,MAAA,CAAO,WAAA,CAAY,MAAM,CAAA,eAAA,CAAiB,CAAC,CAAA;AACvG,EAAA,KAAA,CAAM,KAAKN,sBAAA,CAAK,EAAE,KAAA,EAAO,WAAA,EAAa,GAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,OAAO,KAAA,EAAO,MAAA,EAAQ,MAAA,CAAO,MAAA,EAAQ,CAAC,CAAA;AAG/F,EAAA,IAAI,MAAA,CAAO,IAAI,KAAA,EAAO;AACpB,IAAA,KAAA,CAAM,IAAA,CAAKR,sBAAA;AAAA,MACT,EAAE,KAAA,EAAO,cAAA,EAAgB,CAAA,EAAG,MAAA,CAAO,QAAQ,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,aAAA,EAAe,QAAA,EAAS;AAAA,MAC7E,OAAO,GAAA,CAAI;AAAA,KACZ,CAAA;AAAA,EACH;AAGA,EAAA,KAAA,MAAW,CAAA,IAAK,OAAO,KAAA,EAAO;AAC5B,IAAA,KAAA,CAAM,IAAA,CAAKW,uBAAK,EAAE,KAAA,EAAO,eAAe,CAAA,EAAG,CAAA,CAAE,IAAA,EAAM,CAAC,CAAA;AAAA,EACtD;AAGA,EAAA,KAAA,MAAW,CAAA,IAAK,OAAO,IAAA,EAAM;AAC3B,IAAA,IAAI,CAAA,CAAE,IAAA,KAAS,SAAA,IAAa,CAAA,CAAE,SAAS,UAAA,EAAY;AACjD,MAAA,KAAA,CAAM,KAAKZ,sBAAA,CAAK,EAAE,OAAO,mBAAA,EAAqB,EAAA,EAAI,EAAE,EAAA,EAAI,EAAA,EAAI,CAAA,CAAE,CAAA,EAAG,IAAI,CAAA,CAAE,EAAA,EAAI,IAAI,CAAA,CAAE,CAAA,EAAG,CAAC,CAAA;AAAA,IACvF,CAAA,MAAO;AAEL,MAAA,KAAA,CAAM,KAAKA,sBAAA,CAAK,EAAE,OAAO,mBAAA,EAAqB,EAAA,EAAI,EAAE,EAAA,EAAI,EAAA,EAAI,CAAA,CAAE,CAAA,EAAG,IAAI,CAAA,CAAE,EAAA,EAAI,IAAI,CAAA,CAAE,CAAA,EAAG,CAAC,CAAA;AAAA,IACvF;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,CAAA,IAAK,OAAO,WAAA,EAAa;AAClC,IAAA,MAAM,CAAA,GAAI,CAAA,CAAE,EAAA,GAAK,CAAA,CAAE,CAAA;AACnB,IAAA,MAAM,CAAA,GAAI,CAAA,CAAE,EAAA,GAAK,SAAA,CAAU,gBAAA,GAAmB,CAAA;AAC9C,IAAA,KAAA,CAAM,KAAKS,sBAAA,CAAK;AAAA,MACd,KAAA,EAAO,uBAAA;AAAA,MACP,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,KAAA,EAAO,EAAE,CAAA,GAAI,CAAA;AAAA,MAAG,QAAQ,SAAA,CAAU;AAAA,KACzC,CAAC,CAAA;AACF,IAAA,IAAI,EAAE,EAAA,EAAI;AACR,MAAA,KAAA,CAAM,IAAA,CAAKR,sBAAA;AAAA,QACT,EAAE,KAAA,EAAO,sBAAA,EAAwB,CAAA,EAAG,CAAA,GAAI,GAAG,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,aAAA,EAAe,KAAA,EAAM;AAAA,QAC1E,CAAA,CAAE;AAAA,OACH,CAAA;AAAA,IACH;AACA,IAAA,KAAA,CAAM,IAAA,CAAKA,sBAAA;AAAA,MACT,EAAE,KAAA,EAAO,6BAAA,EAA+B,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,CAAA,GAAI,CAAA,EAAG,CAAA,EAAG,CAAA,GAAI,CAAA,EAAE;AAAA,MACrE,EAAE,UAAA,CAAW;AAAA,KACd,CAAA;AAAA,EACH;AAGA,EAAA,KAAA,MAAW,EAAA,IAAM,OAAO,KAAA,EAAO;AAC7B,IAAA,MAAM,YAAsB,EAAC;AAC7B,IAAA,SAAA,CAAU,KAAKQ,sBAAA,CAAK;AAAA,MAClB,KAAA,EAAO,kBAAA;AAAA,MACP,GAAG,EAAA,CAAG,CAAA;AAAA,MAAG,GAAG,EAAA,CAAG,CAAA;AAAA,MACf,OAAO,EAAA,CAAG,KAAA;AAAA,MAAO,QAAQ,EAAA,CAAG;AAAA,KAC7B,CAAC,CAAA;AACF,IAAA,IAAI,GAAG,IAAA,CAAK,IAAA,KAAS,aAAa,EAAA,CAAG,IAAA,CAAK,SAAS,OAAA,EAAS;AAC1D,MAAA,MAAM,MAAM,SAAA,CAAU,mBAAA;AACtB,MAAA,SAAA,CAAU,KAAKA,sBAAA,CAAK;AAAA,QAClB,KAAA,EAAO,mBAAA;AAAA,QACP,CAAA,EAAG,GAAG,CAAA,GAAI,GAAA;AAAA,QAAK,CAAA,EAAG,GAAG,CAAA,GAAI,GAAA;AAAA,QACzB,KAAA,EAAO,EAAA,CAAG,KAAA,GAAQ,GAAA,GAAM,CAAA;AAAA,QAAG,MAAA,EAAQ,EAAA,CAAG,MAAA,GAAS,GAAA,GAAM;AAAA,OACtD,CAAC,CAAA;AAAA,IACJ;AACA,IAAA,IAAI,EAAA,CAAG,IAAA,CAAK,IAAA,KAAS,OAAA,EAAS;AAC5B,MAAA,MAAM,GAAA,GAAM,UAAU,mBAAA,GAAsB,CAAA;AAC5C,MAAA,SAAA,CAAU,KAAKA,sBAAA,CAAK;AAAA,QAClB,KAAA,EAAO,mBAAA;AAAA,QACP,CAAA,EAAG,GAAG,CAAA,GAAI,GAAA;AAAA,QAAK,CAAA,EAAG,GAAG,CAAA,GAAI,GAAA;AAAA,QACzB,KAAA,EAAO,EAAA,CAAG,KAAA,GAAQ,GAAA,GAAM,CAAA;AAAA,QAAG,MAAA,EAAQ,EAAA,CAAG,MAAA,GAAS,GAAA,GAAM;AAAA,OACtD,CAAC,CAAA;AAAA,IACJ;AACA,IAAA,SAAA,CAAU,IAAA,CAAKR,sBAAA;AAAA,MACb,EAAE,KAAA,EAAO,kBAAA,EAAoB,CAAA,EAAG,EAAA,CAAG,IAAI,EAAA,CAAG,KAAA,GAAQ,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,GAAI,EAAA,CAAG,SAAS,CAAA,GAAI,CAAA,EAAG,eAAe,QAAA,EAAS;AAAA,MAC1G,EAAA,CAAG,IAAA,CAAK,KAAA,IAAS,EAAA,CAAG,IAAA,CAAK;AAAA,KAC1B,CAAA;AACD,IAAA,KAAA,CAAM,IAAA,CAAKY,uBAAA;AAAA,MACT,EAAE,KAAA,EAAO,aAAA,EAAe,cAAA,EAAgB,EAAA,CAAG,KAAK,EAAA,EAAI,gBAAA,EAAkB,EAAA,CAAG,IAAA,CAAK,IAAA,EAAK;AAAA,MACnF;AAAA,KACD,CAAA;AAGD,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,OAAA,CAAQ,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,MAAA,KAAW,EAAA,CAAG,IAAA,CAAK,EAAE,CAAA;AACtE,IAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,MAAA,KAAA,CAAM,KAAKb,sBAAA,CAAK;AAAA,QACd,KAAA,EAAO,aAAA;AAAA,QACP,EAAA,EAAI,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,KAAA;AAAA,QACd,EAAA,EAAI,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,MAAA,GAAS,CAAA;AAAA,QACvB,EAAA,EAAI,SAAA,CAAU,CAAC,CAAA,CAAE,CAAA;AAAA,QACjB,EAAA,EAAI,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,MAAA,GAAS;AAAA,OACxB,CAAC,CAAA;AAAA,IACJ;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,CAAA,IAAK,OAAO,OAAA,EAAS;AAC9B,IAAA,MAAM,KAAe,EAAC;AACtB,IAAA,EAAA,CAAG,KAAKS,sBAAA,CAAK;AAAA,MACX,KAAA,EAAO,yBAAA;AAAA,MACP,GAAG,CAAA,CAAE,CAAA;AAAA,MAAG,GAAG,CAAA,CAAE,CAAA;AAAA,MACb,OAAO,CAAA,CAAE,cAAA;AAAA,MAAgB,QAAQ,SAAA,CAAU;AAAA,KAC5C,CAAC,CAAA;AACF,IAAA,EAAA,CAAG,KAAKA,sBAAA,CAAK;AAAA,MACX,KAAA,EAAO,qBAAA;AAAA,MACP,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,cAAA;AAAA,MAAgB,GAAG,CAAA,CAAE,CAAA;AAAA,MAChC,KAAA,EAAO,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,cAAA;AAAA,MAAgB,QAAQ,SAAA,CAAU;AAAA,KACtD,CAAC,CAAA;AACF,IAAA,EAAA,CAAG,IAAA,CAAKR,sBAAA;AAAA,MACN,EAAE,KAAA,EAAO,8BAAA,EAAgC,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,CAAE,cAAA,GAAiB,CAAA,EAAG,CAAA,EAAG,EAAE,CAAA,GAAI,SAAA,CAAU,iBAAiB,CAAA,GAAI,CAAA,EAAG,eAAe,QAAA,EAAS;AAAA,MAC3I,EAAE,MAAA,CAAO;AAAA,KACV,CAAA;AACD,IAAA,EAAA,CAAG,IAAA,CAAKA,sBAAA;AAAA,MACN,EAAE,KAAA,EAAO,oBAAA,EAAsB,CAAA,EAAG,EAAE,CAAA,GAAI,CAAA,CAAE,cAAA,GAAiB,CAAA,EAAG,GAAG,CAAA,CAAE,CAAA,GAAI,SAAA,CAAU,cAAA,GAAiB,IAAI,CAAA,EAAE;AAAA,MACxG,EAAE,MAAA,CAAO;AAAA,KACV,CAAA;AACD,IAAA,IAAI,CAAA,CAAE,OAAO,IAAA,EAAM;AACjB,MAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,SAAA,CAAU,cAAA;AAC3B,MAAA,EAAA,CAAG,KAAKQ,sBAAA,CAAK;AAAA,QACX,KAAA,EAAO,qBAAA;AAAA,QACP,GAAG,CAAA,CAAE,CAAA;AAAA,QAAG,CAAA,EAAG,EAAA;AAAA,QACX,OAAO,CAAA,CAAE,KAAA;AAAA,QAAO,QAAQ,SAAA,CAAU;AAAA,OACnC,CAAC,CAAA;AACF,MAAA,EAAA,CAAG,IAAA,CAAKR,sBAAA;AAAA,QACN,EAAE,KAAA,EAAO,oBAAA,EAAsB,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,CAAA,EAAG,CAAA,EAAG,EAAA,GAAK,SAAA,CAAU,aAAA,GAAgB,CAAA,GAAI,CAAA,EAAE;AAAA,QACnF,EAAE,MAAA,CAAO;AAAA,OACV,CAAA;AAAA,IACH;AACA,IAAA,KAAA,CAAM,IAAA,CAAKY,uBAAA;AAAA,MACT,EAAE,KAAA,EAAO,uBAAA,EAAyB,cAAA,EAAgB,CAAA,CAAE,MAAA,EAAQ,mBAAA,EAAqB,CAAA,CAAE,KAAA,EAAO,gBAAA,EAAkB,CAAA,CAAE,MAAA,CAAO,SAAA,EAAU;AAAA,MAC/H;AAAA,KACD,CAAA;AAAA,EACH;AAGA,EAAA,KAAA,MAAW,CAAA,IAAK,OAAO,KAAA,EAAO;AAC5B,IAAA,KAAA,CAAM,IAAA,CAAKD,uBAAK,EAAE,KAAA,EAAO,eAAe,CAAA,EAAG,CAAA,CAAE,IAAA,EAAM,CAAC,CAAA;AACpD,IAAA,MAAM,aAAuB,EAAC;AAC9B,IAAA,IAAI,CAAA,CAAE,SAAA,EAAW,UAAA,CAAW,IAAA,CAAK,EAAE,SAAS,CAAA;AAC5C,IAAA,UAAA,CAAW,IAAA,CAAK,CAAA,OAAA,EAAK,CAAA,CAAE,SAAS,CAAA,CAAE,CAAA;AAClC,IAAA,KAAA,CAAM,IAAA,CAAKX,sBAAA;AAAA,MACT,EAAE,KAAA,EAAO,mBAAA,EAAqB,CAAA,EAAG,CAAA,CAAE,QAAQ,CAAA,EAAG,CAAA,CAAE,MAAA,EAAQ,aAAA,EAAe,QAAA,EAAS;AAAA,MAChF,UAAA,CAAW,KAAK,IAAI;AAAA,KACrB,CAAA;AAAA,EACH;AAEA,EAAA,OAAOgB,yBAAA;AAAA,IACL;AAAA,MACE,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,SAAS,CAAA,IAAA,EAAO,MAAA,CAAO,KAAK,CAAA,CAAA,EAAI,OAAO,MAAM,CAAA,CAAA;AAAA,MAC7C,KAAA,EAAO,QAAA;AAAA,MACP,mBAAA,EAAqB;AAAA,KACvB;AAAA,IACA;AAAA,GACF;AACF;AAEO,SAAS,UAAUhB,KAAAA,EAAsB;AAC9C,EAAA,MAAM,GAAA,GAAc,SAASA,KAAI,CAAA;AACjC,EAAA,MAAM,MAAA,GAAS,UAAU,GAAG,CAAA;AAC5B,EAAA,OAAO,gBAAgB,MAAM,CAAA;AAC/B;;;AC1MO,IAAM,GAAA,GAAqB;AAAA,EAChC,IAAA,EAAM,KAAA;AAAA,EACN,OAAOA,KAAAA,EAAuB;AAC5B,IAAA,MAAM,KAAA,GAAQA,KAAAA,CAAK,IAAA,EAAK,CAAE,KAAA,CAAM,IAAI,CAAA,CAAE,CAAC,CAAA,EAAG,IAAA,EAAK,CAAE,WAAA,EAAY,IAAK,EAAA;AAClE,IAAA,OAAO,KAAA,CAAM,WAAW,KAAK,CAAA;AAAA,EAC/B,CAAA;AAAA,EACA,KAAA,EAAO,QAAA;AAAA,EACP,OAAOA,KAAAA,EAAsB;AAC3B,IAAA,OAAO,UAAUA,KAAI,CAAA;AAAA,EACvB;AACF,CAAA;;;AC4EA,IAAM,OAAA,GAA2B;AAAA,EAC/BiH,0BAAA;AAAA,EACAC,wBAAA;AAAA,EACAC,0BAAA;AAAA,EACAC,uBAAA;AAAA,EACAC,2BAAA;AAAA,EACAC,wBAAA;AAAA,EACAC,uBAAA;AAAA,EACAC,yBAAA;AAAA,EACAC,8BAAA;AAAA,EACAC,wBAAA;AAAA,EACAC,qBAAA;AAAA,EACAC,wBAAA;AAAA,EACAC,0BAAA;AAAA,EACAC,sBAAA;AAAA,EACAC,2BAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACAC,0BAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,UAAA;AAAA,EACA,IAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA;AAEA,SAAS,YAAA,CAAahI,OAAc,MAAA,EAAyC;AAC3E,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA,MAAM,MAAA,GAAS,QAAQ,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,OAAO,IAAI,CAAA;AACzD,IAAA,IAAI,QAAQ,OAAO,MAAA;AAAA,EACrB;AACA,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,IAAI,MAAA,CAAO,MAAA,CAAOA,KAAI,CAAA,EAAG,OAAO,MAAA;AAAA,EAClC;AACA,EAAA,MAAM,IAAI,KAAA;AAAA,IACR;AAAA,GACF;AACF;AAWA,SAASkB,YAAWlB,KAAAA,EAAsB;AACxC,EAAA,MAAM,EAAE,IAAA,EAAM,IAAA,EAAK,GAAIiI,mCAAiBjI,KAAI,CAAA;AAC5C,EAAA,IAAI,CAAC,IAAA,CAAK,KAAA,EAAO,OAAO,IAAA;AAExB,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,MAAM,KAAK,CAAA;AAGhD,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC7B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,CAAC,CAAA,CAAG,IAAA,EAAK;AAC/B,IAAA,IAAI,YAAY,EAAA,EAAI;AAEpB,IAAA,IAAI,yBAAA,CAA0B,IAAA,CAAK,OAAO,CAAA,EAAG,OAAO,IAAA;AACpD,IAAA,KAAA,CAAM,CAAC,IAAI,KAAA,CAAM,CAAC,EAAG,OAAA,CAAQ,MAAA,EAAQ,CAAA,EAAA,EAAK,SAAS,CAAA,CAAA,CAAG,CAAA;AACtD,IAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACxB;AACA,EAAA,OAAO,IAAA;AACT;AAYO,SAAS,KAAA,CAAMA,OAAc,MAAA,EAAmC;AACrE,EAAA,MAAM,QAAA,GAAWkB,YAAWlB,KAAI,CAAA;AAChC,EAAA,MAAM,MAAA,GAAS,YAAA,CAAa,QAAA,EAAU,MAAM,CAAA;AAC5C,EAAA,IAAI,MAAA,CAAO,KAAA,EAAO,OAAO,MAAA,CAAO,MAAM,QAAQ,CAAA;AAC9C,EAAA,MAAM,IAAI,KAAA;AAAA,IACR,CAAA,cAAA,EAAiB,OAAO,IAAI,CAAA,uCAAA;AAAA,GAC9B;AACF;AAEO,SAAS,WAAA,CACdA,OACA,MAAA,EACsB;AACtB,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAWkB,YAAWlB,KAAI,CAAA;AAChC,IAAA,MAAA,GAAS,YAAA,CAAa,UAAU,MAAM,CAAA;AACtC,IAAA,IAAI,CAAC,OAAO,KAAA,EAAO;AACjB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,cAAA,EAAiB,OAAO,IAAI,CAAA,uCAAA;AAAA,OAC9B;AAAA,IACF;AACA,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAA;AACjC,IAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,MAAA,EAAQ,QAAQ,CAAA;AAC5C,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,IAAA;AAAA,MACJ,MAAA,EAAQ,WAAA,CAAY,MAAA,GAAS,CAAA,GAAI,SAAA,GAAY,OAAA;AAAA,MAC7C,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,GAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,SAAS,GAAA,EAAK;AACZ,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,KAAA;AAAA,MACJ,MAAA,EAAQ,SAAA;AAAA,MACR,IAAA,EAAM,MAAA,EAAQ,IAAA,IAAQ,MAAA,EAAQ,IAAA,IAAQ,IAAA;AAAA,MACtC,WAAA,EAAa,CAAC,mBAAA,CAAoB,GAAG,CAAC;AAAA,KACxC;AAAA,EACF;AACF;AAMA,SAAS,OAAA,CAAQ,QAAuB,QAAA,EAAyC;AAC/E,EAAA,IAAI,CAAC,MAAA,CAAO,IAAA,EAAM,OAAO,EAAC;AAC1B,EAAA,IAAI;AACF,IAAA,OAAO,MAAA,CAAO,KAAK,QAAQ,CAAA;AAAA,EAC7B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AAEO,SAAS,MAAA,CAAOA,OAAc,MAAA,EAAkC;AACrE,EAAA,IAAI,QAAQ,IAAA,KAAS,SAAA,SAAkB,YAAA,CAAaA,KAAAA,EAAM,MAAM,CAAA,CAAE,GAAA;AAElE,EAAA,MAAM,QAAA,GAAWkB,YAAWlB,KAAI,CAAA;AAChC,EAAA,MAAM,MAAA,GAAS,YAAA,CAAa,QAAA,EAAU,MAAM,CAAA;AAC5C,EAAA,OAAO,gBAAA,CAAiB,QAAA,EAAU,MAAA,EAAQ,MAAM,CAAA;AAClD;AAEO,SAAS,YAAA,CACdA,OACA,MAAA,EACuB;AACvB,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAWkB,YAAWlB,KAAI,CAAA;AAChC,IAAA,MAAA,GAAS,YAAA,CAAa,UAAU,MAAM,CAAA;AACtC,IAAA,MAAM,GAAA,GAAM,gBAAA,CAAiB,QAAA,EAAU,MAAA,EAAQ,MAAM,CAAA;AACrD,IAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,MAAA,EAAQ,QAAQ,CAAA;AAC5C,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,IAAA;AAAA,MACJ,MAAA,EAAQ,WAAA,CAAY,MAAA,GAAS,CAAA,GAAI,SAAA,GAAY,OAAA;AAAA,MAC7C,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,GAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,IAAA,GAAO,MAAA,EAAQ,IAAA,IAAQ,MAAA,EAAQ,IAAA,IAAQ,IAAA;AAC7C,IAAA,MAAM,WAAA,GAAc,CAAC,mBAAA,CAAoB,GAAG,CAAC,CAAA;AAC7C,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,KAAA;AAAA,MACJ,MAAA,EAAQ,SAAA;AAAA,MACR,IAAA;AAAA,MACA,GAAA,EAAK,mBAAA,CAAoB,WAAA,EAAa,IAAA,EAAM;AAAA,QAC1C,YAAY,MAAA,EAAQ;AAAA,OACrB,CAAA;AAAA,MACD;AAAA,KACF;AAAA,EACF;AACF;AAEO,SAAS,aAAA,CAAcA,OAAc,MAAA,EAAkC;AAC5E,EAAA,OAAO,YAAA,CAAaA,KAAAA,EAAM,MAAM,CAAA,CAAE,GAAA;AACpC;AAEA,SAAS,gBAAA,CACP,QAAA,EACA,MAAA,EACA,MAAA,EACQ;AACR,EAAA,MAAM,YAAA,GAA6B;AAAA,IACjC,UAAA,EAAY,QAAQ,UAAA,IAAc,sCAAA;AAAA,IAClC,QAAA,EAAU,EAAA;AAAA,IACV,KAAA,EAAO,QAAQ,KAAA,IAAS,SAAA;AAAA,IACxB,OAAA,EAAS,QAAQ,OAAA,IAAW;AAAA,GAC9B;AACA,EAAA,OAAO,MAAA,CAAO,MAAA,CAAO,QAAA,EAAU,YAAY,CAAA;AAC7C","file":"chunk-25ZON47K.cjs","sourcesContent":["import type {\n DTreeAST,\n DTreeBranchLabels,\n DTreeDirection,\n DTreeEdgeStyle,\n DTreeImpurity,\n DTreeMode,\n DTreeNode,\n} from \"./types\";\n\nexport class DTreeParseError extends Error {\n constructor(\n message: string,\n public line?: number,\n public column?: number,\n public source?: string\n ) {\n super(line !== undefined ? `Line ${line}: ${message}` : message);\n this.name = \"DTreeParseError\";\n }\n}\n\ninterface RawLine {\n indent: number;\n text: string;\n line: number;\n}\n\nfunction preprocess(src: string): RawLine[] {\n const out: RawLine[] = [];\n const lines = src.split(/\\r?\\n/);\n for (let i = 0; i < lines.length; i++) {\n const raw = lines[i];\n if (raw === undefined) continue;\n if (!raw.trim() || raw.trim().startsWith(\"#\") || raw.trim().startsWith(\"//\")) continue;\n const indentSpaces = raw.length - raw.replace(/^\\s+/, \"\").length;\n out.push({ indent: Math.floor(indentSpaces / 2), text: raw.trim(), line: i + 1 });\n }\n return out;\n}\n\n// ─── Tokenizer ───────────────────────────────────────────────\n// Split a line into tokens, honoring double-quoted strings and bracket lists.\nfunction tokenize(s: string): string[] {\n const tokens: string[] = [];\n let i = 0;\n while (i < s.length) {\n const ch = s[i]!;\n if (/\\s/.test(ch)) { i++; continue; }\n if (ch === '\"') {\n const end = s.indexOf('\"', i + 1);\n if (end < 0) throw new DTreeParseError(`Unterminated string: ${s}`);\n tokens.push(s.slice(i, end + 1));\n i = end + 1;\n continue;\n }\n // Read until whitespace or start of quoted string, but allow `=` and brackets inside\n let j = i;\n let bracket = 0;\n while (j < s.length) {\n const c = s[j]!;\n if (c === \"[\") bracket++;\n else if (c === \"]\") bracket--;\n else if (bracket === 0 && /\\s/.test(c)) break;\n else if (bracket === 0 && c === '\"') break;\n j++;\n }\n tokens.push(s.slice(i, j));\n i = j;\n }\n return tokens;\n}\n\nfunction unquote(s: string): string {\n if (s.startsWith('\"') && s.endsWith('\"')) return s.slice(1, -1);\n return s;\n}\n\nfunction parseKV(tokens: string[]): { keys: Record<string, string>; labels: string[]; rest: string[] } {\n const keys: Record<string, string> = {};\n const labels: string[] = [];\n const rest: string[] = [];\n for (const tok of tokens) {\n if (tok.startsWith('\"') && tok.endsWith('\"')) {\n labels.push(unquote(tok));\n } else if (tok.includes(\"=\")) {\n const idx = tok.indexOf(\"=\");\n const k = tok.slice(0, idx);\n const v = tok.slice(idx + 1);\n keys[k] = v;\n } else {\n rest.push(tok);\n }\n }\n return { keys, labels, rest };\n}\n\nfunction parseNumberList(s: string): number[] {\n const inner = s.replace(/^\\[/, \"\").replace(/\\]$/, \"\");\n return inner.split(\",\").map((p) => Number(p.trim())).filter((n) => !Number.isNaN(n));\n}\n\n// ─── Parser ──────────────────────────────────────────────────\n\nlet idCounter = 0;\nfunction nextId(prefix = \"n\"): string {\n idCounter++;\n return `${prefix}${idCounter}`;\n}\n\ninterface ParseContext {\n mode: DTreeMode;\n regression: boolean;\n}\n\nfunction parseDecisionLine(tokens: string[], _ctx: ParseContext, lineNum: number): DTreeNode {\n // First token is keyword; possible: decision, chance, end, choice, prob\n // prob/choice are edge-wrappers: they may be prefixes before a real node kind.\n let idx = 0;\n let incomingChoice: string | undefined;\n let incomingProb: number | undefined;\n\n if (tokens[idx] === \"choice\") {\n idx++;\n const next = tokens[idx];\n if (!next || !next.startsWith('\"')) throw new DTreeParseError(`\"choice\" requires a label`, lineNum);\n incomingChoice = unquote(next);\n idx++;\n // If no more tokens, choice is a wrapper — child will be nested. Return placeholder.\n if (idx >= tokens.length) {\n return {\n id: nextId(),\n kind: \"decision\", // placeholder; will be overridden if sole child exists\n label: \"\",\n children: [],\n incomingChoice,\n // special marker so parseBody knows this is a wrapper\n _wrapper: \"choice\",\n } as DTreeNode & { _wrapper?: string };\n }\n } else if (tokens[idx] === \"prob\") {\n idx++;\n const p = Number(tokens[idx]);\n if (Number.isNaN(p)) throw new DTreeParseError(`\"prob\" requires a numeric probability`, lineNum);\n incomingProb = p;\n idx++;\n }\n\n const kw = tokens[idx];\n if (!kw) throw new DTreeParseError(`Missing node kind`, lineNum);\n const rest = tokens.slice(idx + 1);\n const parsed = parseKV(rest);\n\n let kind: DTreeNode[\"kind\"];\n if (kw === \"decision\") kind = \"decision\";\n else if (kw === \"chance\") kind = \"chance\";\n else if (kw === \"end\" || kw === \"outcome\") kind = \"end\";\n else throw new DTreeParseError(`Unknown node kind \"${kw}\" in decision mode`, lineNum);\n\n const label = parsed.labels[0] ?? \"\";\n const payoffStr = parsed.keys.payoff;\n const payoff = payoffStr !== undefined ? Number(payoffStr) : undefined;\n\n return {\n id: nextId(),\n kind,\n label,\n children: [],\n incomingChoice,\n incomingProb,\n payoff,\n };\n}\n\nfunction parseMlLine(tokens: string[], ctx: ParseContext, lineNum: number): DTreeNode {\n // Optional `true`/`false` prefix for branch direction.\n let idx = 0;\n let mlBranch: \"true\" | \"false\" | undefined;\n if (tokens[idx] === \"true\" || tokens[idx] === \"false\") {\n mlBranch = tokens[idx] as \"true\" | \"false\";\n idx++;\n }\n\n const kw = tokens[idx];\n if (!kw) throw new DTreeParseError(`Missing ML node kind`, lineNum);\n idx++;\n const rest = tokens.slice(idx);\n const parsed = parseKV(rest);\n\n let kind: DTreeNode[\"kind\"];\n if (kw === \"split\") kind = \"split\";\n else if (kw === \"leaf\") kind = \"leaf\";\n else throw new DTreeParseError(`Unknown ML node kind \"${kw}\"`, lineNum);\n\n const label = parsed.labels[0] ?? \"\";\n const k = parsed.keys;\n\n let value: number[] | number | undefined;\n if (k.value !== undefined) {\n if (k.value.startsWith(\"[\")) value = parseNumberList(k.value);\n else value = Number(k.value);\n }\n if (typeof value === \"number\") ctx.regression = true;\n\n // Impurity number — extract from any of gini/entropy/mse/gain/impurity\n let impurity: number | undefined;\n for (const impKey of [\"gini\", \"entropy\", \"mse\", \"gain\", \"impurity\"]) {\n if (k[impKey] !== undefined) {\n impurity = Number(k[impKey]);\n break;\n }\n }\n\n return {\n id: nextId(),\n kind,\n label,\n children: [],\n feature: k.feature,\n op: k.op,\n threshold: k.threshold !== undefined ? (Number.isNaN(Number(k.threshold)) ? k.threshold : Number(k.threshold)) : undefined,\n samples: k.samples !== undefined ? Number(k.samples) : undefined,\n value,\n impurity,\n mlBranch,\n className: k.class,\n };\n}\n\nfunction parseTaxonomyLine(tokens: string[], _ctx: ParseContext, lineNum: number): DTreeNode {\n // Forms:\n // q \"...\" → question\n // question \"...\" → question\n // a \"...\" → answer / leaf\n // answer \"...\" → answer / leaf\n // leaf \"...\" → answer\n // yes: q \"...\" → question with branchLabel=\"yes\"\n // no: a \"...\" → answer with branchLabel=\"no\"\n // label \"X\": a \"Y\" → answer with branchLabel=\"X\"\n let idx = 0;\n let branchLabel: string | undefined;\n\n if (tokens[idx] === \"yes:\" || tokens[idx] === \"no:\") {\n branchLabel = tokens[idx]!.replace(\":\", \"\");\n idx++;\n } else if (tokens[idx] === \"label\") {\n idx++;\n const lbl = tokens[idx];\n if (!lbl || !lbl.startsWith('\"')) throw new DTreeParseError(`\"label\" requires a quoted string`, lineNum);\n // Allow trailing colon form: label \"X\": ...\n branchLabel = unquote(lbl.replace(/\":?$/, '\"'));\n // Handle `\"X\":` (colon attached)\n if (lbl.endsWith(':\"')) {/* unreachable */}\n idx++;\n if (tokens[idx] === \":\") idx++;\n }\n\n const kw = tokens[idx];\n if (!kw) throw new DTreeParseError(`Missing taxonomy node kind`, lineNum);\n idx++;\n const rest = tokens.slice(idx);\n const parsed = parseKV(rest);\n\n let kind: DTreeNode[\"kind\"];\n if (kw === \"q\" || kw === \"question\") kind = \"question\";\n else if (kw === \"a\" || kw === \"answer\" || kw === \"leaf\") kind = \"answer\";\n else throw new DTreeParseError(`Unknown taxonomy node kind \"${kw}\"`, lineNum);\n\n return {\n id: nextId(),\n kind,\n label: parsed.labels[0] ?? \"\",\n children: [],\n branchLabel,\n };\n}\n\nfunction parseNodeLine(text: string, mode: DTreeMode, ctx: ParseContext, lineNum: number): DTreeNode {\n // Handle `yes: q \"...\"` style where `yes:` is glued but tokenizer splits fine.\n // Handle `label \"X\":` pattern for taxonomy with inline colon.\n const normalized = text.replace(/\"\\s*:\\s*/g, '\" : ');\n const tokens = tokenize(normalized).filter((t) => t !== \":\");\n if (mode === \"decision\") return parseDecisionLine(tokens, ctx, lineNum);\n if (mode === \"ml\") return parseMlLine(tokens, ctx, lineNum);\n return parseTaxonomyLine(tokens, ctx, lineNum);\n}\n\nfunction buildTree(lines: RawLine[], mode: DTreeMode, ctx: ParseContext): DTreeNode {\n if (lines.length === 0) throw new DTreeParseError(\"No tree body\");\n const [first, ...rest] = lines;\n if (!first) throw new DTreeParseError(\"No tree body\");\n const root = parseNodeLine(first.text, mode, ctx, first.line);\n const stack: Array<{ node: DTreeNode; indent: number }> = [{ node: root, indent: first.indent }];\n\n for (const line of rest) {\n const node = parseNodeLine(line.text, mode, ctx, line.line);\n while (stack.length > 0 && stack[stack.length - 1]!.indent >= line.indent) stack.pop();\n const parent = stack[stack.length - 1];\n if (!parent) throw new DTreeParseError(`Orphan line (bad indent): ${line.text}`, line.line);\n parent.node.children.push(node);\n stack.push({ node, indent: line.indent });\n }\n\n return collapseWrappers(root);\n}\n\n// Collapse `choice` wrappers (they carry incomingChoice to their sole child)\nfunction collapseWrappers(node: DTreeNode): DTreeNode {\n node.children = node.children.map(collapseWrappers).flatMap((c) => {\n const anyC = c as DTreeNode & { _wrapper?: string };\n if (anyC._wrapper === \"choice\") {\n return c.children.map((gc) => ({ ...gc, incomingChoice: c.incomingChoice }));\n }\n return [c];\n });\n return node;\n}\n\n// ─── EV Rollback (decision mode) ─────────────────────────────\n\nfunction computeEV(node: DTreeNode): void {\n for (const c of node.children) computeEV(c);\n if (node.kind === \"end\") {\n node.ev = node.payoff ?? 0;\n return;\n }\n if (node.kind === \"chance\") {\n let sum = 0;\n for (const c of node.children) sum += (c.incomingProb ?? 0) * (c.ev ?? 0);\n node.ev = sum;\n return;\n }\n if (node.kind === \"decision\") {\n let best = -Infinity;\n for (const c of node.children) {\n if ((c.ev ?? -Infinity) > best) best = c.ev ?? -Infinity;\n }\n node.ev = best;\n for (const c of node.children) {\n if ((c.ev ?? -Infinity) === best) c.optimal = true;\n }\n return;\n }\n}\n\nfunction validateDecision(node: DTreeNode, lineMap: Map<string, number>): void {\n if (node.kind === \"chance\" && node.children.length > 0) {\n const sum = node.children.reduce((a, c) => a + (c.incomingProb ?? 0), 0);\n if (Math.abs(sum - 1) > 0.01) {\n throw new DTreeParseError(\n `chance \"${node.label}\" probabilities do not sum to 1.0 (got ${sum.toFixed(3)})`,\n );\n }\n }\n for (const c of node.children) validateDecision(c, lineMap);\n}\n\n// ─── Top-level ───────────────────────────────────────────────\n\nexport function parseDecisionTree(src: string): DTreeAST {\n idCounter = 0;\n const lines = preprocess(src);\n if (lines.length === 0) throw new DTreeParseError(\"Empty input\");\n\n // Header: `decisiontree[:mode] \"title\"?`\n const header = lines.shift()!;\n const headerMatch = header.text.match(/^decisiontree(?::(\\w+))?(?:\\s+\"([^\"]*)\")?\\s*$/i);\n if (!headerMatch) throw new DTreeParseError(`Invalid header: ${header.text}`, header.line);\n const modeRaw = (headerMatch[1] ?? \"taxonomy\").toLowerCase();\n const mode: DTreeMode =\n modeRaw === \"decision\" || modeRaw === \"da\" ? \"decision\"\n : modeRaw === \"ml\" ? \"ml\"\n : \"taxonomy\";\n const title = headerMatch[2];\n\n // Config block: lines with `key: value` before the tree body, at indent 0.\n // Tree body starts at the first line whose first token is a recognized node keyword.\n const nodeKeywords = new Set([\n \"decision\", \"chance\", \"end\", \"outcome\", \"choice\", \"prob\",\n \"split\", \"leaf\", \"true\", \"false\",\n \"q\", \"question\", \"a\", \"answer\", \"yes:\", \"no:\", \"label\",\n ]);\n const config: Record<string, string> = {};\n while (lines.length > 0) {\n const l = lines[0]!;\n const firstTok = l.text.split(/\\s+/)[0]!;\n if (nodeKeywords.has(firstTok)) break;\n const m = l.text.match(/^([a-zA-Z][\\w-]*)\\s*:\\s*(.+)$/);\n if (!m) break;\n config[m[1]!] = m[2]!.trim();\n lines.shift();\n }\n\n let direction: DTreeDirection = \"top-down\";\n if (config.direction === \"left-right\" || config.direction === \"lr\") direction = \"left-right\";\n if (mode === \"decision\" && !config.direction) direction = \"left-right\";\n\n const classes = config.classes\n ? config.classes.split(\",\").map((s) => s.trim()).filter(Boolean)\n : undefined;\n\n let impurityName: DTreeImpurity | undefined;\n if (config.impurity) {\n const v = config.impurity.toLowerCase();\n if (v === \"gini\" || v === \"entropy\" || v === \"mse\" || v === \"gain\") impurityName = v;\n }\n\n const branchLabels: DTreeBranchLabels | undefined =\n config.branchLabels === \"relation\" || config[\"branch-labels\"] === \"relation\" ? \"relation\" : \"boolean\";\n\n const branchLengthProb = config.branchLength === \"probability\" || config[\"branch-length\"] === \"probability\";\n\n let edgeStyle: DTreeEdgeStyle | undefined;\n const es = (config.edgeStyle || config[\"edge-style\"] || \"\").toLowerCase();\n if (es === \"diagonal\" || es === \"orthogonal\" || es === \"bracket\") edgeStyle = es;\n\n const ctx: ParseContext = { mode, regression: false };\n const root = buildTree(lines, mode, ctx);\n\n if (mode === \"decision\") {\n validateDecision(root, new Map());\n computeEV(root);\n }\n\n return {\n type: \"decisiontree\",\n mode,\n title,\n direction,\n classes,\n impurityName: impurityName ?? (mode === \"ml\" ? \"gini\" : undefined),\n branchLabels,\n branchLengthProb,\n edgeStyle,\n regression: ctx.regression,\n root,\n };\n}\n","import type {\n DTreeAST,\n DTreeEdgeStyle,\n DTreeLayoutEdge,\n DTreeLayoutNode,\n DTreeLayoutResult,\n DTreeNode,\n} from \"./types\";\n\ninterface NodeSize { w: number; h: number; }\n\nfunction sizeOf(node: DTreeNode, mode: DTreeAST[\"mode\"]): NodeSize {\n if (mode === \"decision\") {\n if (node.kind === \"decision\") return { w: 58, h: 36 };\n if (node.kind === \"chance\") return { w: 34, h: 34 };\n return { w: 22, h: 22 }; // end triangle\n }\n if (mode === \"ml\") {\n if (node.kind === \"split\") return { w: 200, h: 100 };\n return { w: 200, h: 82 };\n }\n return { w: 150, h: 50 };\n}\n\ninterface WN {\n node: DTreeNode;\n size: NodeSize;\n depth: number;\n parent?: WN;\n children: WN[];\n prelim: number;\n mod: number;\n xFinal: number;\n yFinal: number;\n}\n\nfunction wrap(node: DTreeNode, mode: DTreeAST[\"mode\"], depth: number, parent?: WN): WN {\n const w: WN = {\n node, size: sizeOf(node, mode), depth, parent,\n children: [], prelim: 0, mod: 0, xFinal: 0, yFinal: 0,\n };\n w.children = node.children.map((c) => wrap(c, mode, depth + 1, w));\n return w;\n}\n\nfunction collect(w: WN, out: WN[]): void { out.push(w); for (const c of w.children) collect(c, out); }\n\n/** Sibling-axis extent (perpendicular to depth growth). */\nfunction sibExtent(w: WN, sibH: boolean): number {\n return sibH ? w.size.w : w.size.h;\n}\n\n/**\n * Balanced layout. Each leaf gets 1 unit; a direct-leaf sibling of a tall subtree\n * still gets 1 unit but is PLACED with extra padding so the diagonal from the\n * parent doesn't cross the sibling subtree. The padding equals the sibling\n * subtree's half-extent.\n */\nfunction assignLeafPositions(w: WN, sibH: boolean, unit: number, leafGap: number, cursor: { v: number }): void {\n if (w.children.length === 0) {\n w.prelim = cursor.v;\n const extent = sibExtent(w, sibH);\n cursor.v += Math.max(extent, unit) + leafGap;\n return;\n }\n for (const c of w.children) assignLeafPositions(c, sibH, unit, leafGap, cursor);\n const first = w.children[0]!.prelim;\n const last = w.children[w.children.length - 1]!.prelim;\n w.prelim = (first + last) / 2;\n}\n\n/** Subtree min/max along sibling axis (uses current prelim values). */\nfunction subtreeSibRange(w: WN, sibH: boolean): { lo: number; hi: number } {\n const e = sibExtent(w, sibH);\n let lo = w.prelim - e / 2;\n let hi = w.prelim + e / 2;\n for (const c of w.children) {\n const cr = subtreeSibRange(c, sibH);\n if (cr.lo < lo) lo = cr.lo;\n if (cr.hi > hi) hi = cr.hi;\n }\n return { lo, hi };\n}\n\n/**\n * Ensure min sibling gap between adjacent SUBTREES, shifting right-subtree if too close.\n * This is what keeps a direct-leaf sibling visually separated from a tall subtree.\n */\nfunction enforceSibGap(w: WN, sibH: boolean, sibGap: number): void {\n for (const c of w.children) enforceSibGap(c, sibH, sibGap);\n for (let i = 1; i < w.children.length; i++) {\n const prev = w.children[i - 1]!;\n const cur = w.children[i]!;\n const prevR = subtreeSibRange(prev, sibH);\n const curR = subtreeSibRange(cur, sibH);\n const gap = curR.lo - prevR.hi;\n if (gap < sibGap) {\n shiftSubtree(cur, sibGap - gap);\n }\n }\n if (w.children.length > 0) {\n const first = w.children[0]!.prelim;\n const last = w.children[w.children.length - 1]!.prelim;\n w.prelim = (first + last) / 2;\n }\n}\n\nfunction shiftSubtree(w: WN, dx: number): void {\n w.prelim += dx;\n for (const c of w.children) shiftSubtree(c, dx);\n}\n\nfunction computeLevelOffsets(root: WN, sibH: boolean, levelGap: number): number[] {\n const depthSizes: number[] = [];\n const all: WN[] = [];\n collect(root, all);\n for (const n of all) {\n const dSize = sibH ? n.size.h : n.size.w;\n depthSizes[n.depth] = Math.max(depthSizes[n.depth] ?? 0, dSize);\n }\n const offsets: number[] = [];\n let acc = 0;\n for (let i = 0; i < depthSizes.length; i++) {\n if (i === 0) acc = 0;\n else acc += (depthSizes[i - 1]! / 2) + levelGap + (depthSizes[i]! / 2);\n offsets.push(acc);\n }\n return offsets;\n}\n\nfunction setFinal(w: WN, sibH: boolean, levelOffsets: number[]): void {\n const d = levelOffsets[w.depth] ?? 0;\n if (sibH) { w.xFinal = w.prelim; w.yFinal = d; }\n else { w.xFinal = d; w.yFinal = w.prelim; }\n for (const c of w.children) setFinal(c, sibH, levelOffsets);\n}\n\n// ─── Edge routing ────────────────────────────────────────────\n\ninterface EdgeGeom {\n path: string;\n labelX: number;\n labelY: number;\n angle: number; // degrees\n}\n\nfunction routeEdge(\n style: DTreeEdgeStyle,\n sibH: boolean,\n p: DTreeLayoutNode,\n c: DTreeLayoutNode,\n rail?: number,\n): EdgeGeom {\n const px = p.x, py = p.y, cx = c.x, cy = c.y;\n let startX: number, startY: number, endX: number, endY: number;\n if (sibH) {\n startX = px; startY = py + p.height / 2;\n endX = cx; endY = cy - c.height / 2;\n } else {\n startX = px + p.width / 2; startY = py;\n endX = cx - c.width / 2; endY = cy;\n }\n\n if (style === \"diagonal\") {\n // Place label at 68% along edge (toward child) — separates labels sharing a parent.\n const tLabel = 0.68;\n const lx = startX + (endX - startX) * tLabel;\n const ly = startY + (endY - startY) * tLabel;\n const dx = endX - startX;\n const dy = endY - startY;\n let angle = (Math.atan2(dy, dx) * 180) / Math.PI;\n if (angle > 90) angle -= 180;\n if (angle < -90) angle += 180;\n return {\n path: `M ${startX} ${startY} L ${endX} ${endY}`,\n labelX: lx,\n labelY: ly,\n angle,\n };\n }\n\n if (style === \"bracket\") {\n // Parent short stub, then diagonal to child\n if (sibH) {\n const stub = Math.min(18, Math.abs(endY - startY) * 0.25);\n const elbowY = startY + stub;\n const midX = (startX + endX) / 2;\n const midY = (elbowY + endY) / 2;\n const angle = (Math.atan2(endY - elbowY, endX - startX) * 180) / Math.PI;\n return {\n path: `M ${startX} ${startY} L ${startX} ${elbowY} L ${endX} ${endY}`,\n labelX: midX,\n labelY: midY,\n angle: angle > 90 ? angle - 180 : angle < -90 ? angle + 180 : angle,\n };\n }\n const stub = Math.min(18, Math.abs(endX - startX) * 0.25);\n const elbowX = startX + stub;\n return {\n path: `M ${startX} ${startY} L ${elbowX} ${startY} L ${endX} ${endY}`,\n labelX: (elbowX + endX) / 2,\n labelY: (startY + endY) / 2,\n angle: (Math.atan2(endY - startY, endX - elbowX) * 180) / Math.PI,\n };\n }\n\n // orthogonal L-shape — use per-level rail if provided so siblings align\n if (sibH) {\n const railY = rail ?? (startY + endY) / 2;\n return {\n path: `M ${startX} ${startY} L ${startX} ${railY} L ${endX} ${railY} L ${endX} ${endY}`,\n labelX: (startX + endX) / 2,\n labelY: railY,\n angle: 0,\n };\n }\n const railX = rail ?? (startX + endX) / 2;\n return {\n path: `M ${startX} ${startY} L ${railX} ${startY} L ${railX} ${endY} L ${endX} ${endY}`,\n labelX: railX,\n labelY: (startY + endY) / 2,\n angle: 0,\n };\n}\n\n/**\n * Route for an end-node that was snapped away from its natural column to align with\n * the payoff column. Diagonal from parent to the natural column at child's y, then\n * horizontal to the snapped triangle. Makes shallow end-nodes look like they \"extend\n * out\" to the rightmost column rather than a single ugly long diagonal.\n */\nfunction routeSnappedEnd(sibH: boolean, p: DTreeLayoutNode, c: DTreeLayoutNode): EdgeGeom {\n if (sibH) {\n // Top-down: rarely used for decision mode; fall back to plain diagonal.\n const startX = p.x, startY = p.y + p.height / 2;\n const endX = c.x, endY = c.y - c.height / 2;\n return {\n path: `M ${startX} ${startY} L ${endX} ${endY}`,\n labelX: (startX + endX) / 2, labelY: (startY + endY) / 2, angle: 0,\n };\n }\n // Left-right (the normal decision-mode direction).\n const startX = p.x + p.width / 2;\n const startY = p.y;\n const endX = c.x - c.width / 2;\n const endY = c.y;\n // Bend point: at natural child x, at child y. Clamp to be strictly right of parent.\n const naturalCx = c.naturalX ?? c.x;\n const bendX = Math.max(naturalCx, startX + 20);\n const dx = bendX - startX;\n const dy = endY - startY;\n let angle = (Math.atan2(dy, dx) * 180) / Math.PI;\n if (angle > 90) angle -= 180;\n if (angle < -90) angle += 180;\n // Label at 70% along the diagonal portion — stays on the diagonal, not the horizontal.\n const t = 0.7;\n const labelX = startX + (bendX - startX) * t;\n const labelY = startY + (endY - startY) * t;\n return {\n path: `M ${startX} ${startY} L ${bendX} ${endY} L ${endX} ${endY}`,\n labelX,\n labelY,\n angle,\n };\n}\n\n// ─── Main ────────────────────────────────────────────────────\n\nexport function layoutDecisionTree(ast: DTreeAST): DTreeLayoutResult {\n const sibH = ast.direction === \"top-down\";\n const root = wrap(ast.root, ast.mode, 0);\n\n // Mode-tuned spacing.\n const all: WN[] = []; collect(root, all);\n\n // Pad all nodes at the same depth to the same DEPTH-axis size (height in TD,\n // width in LR). This makes orthogonal rails align cleanly.\n const perDepthDepthSize: number[] = [];\n for (const w of all) {\n const d = sibH ? w.size.h : w.size.w;\n perDepthDepthSize[w.depth] = Math.max(perDepthDepthSize[w.depth] ?? 0, d);\n }\n for (const w of all) {\n const target = perDepthDepthSize[w.depth]!;\n if (sibH) w.size.h = target;\n else w.size.w = target;\n }\n\n const maxSibExtent = Math.max(...all.map((w) => sibExtent(w, sibH)));\n\n let leafGap: number, levelGap: number, sibGap: number;\n if (ast.mode === \"ml\") { leafGap = 40; levelGap = 80; sibGap = 40; }\n else if (ast.mode === \"decision\") { leafGap = sibH ? 40 : 36; levelGap = sibH ? 90 : 110; sibGap = 30; }\n else { leafGap = sibH ? 30 : 22; levelGap = sibH ? 80 : 90; sibGap = 26; }\n\n const unit = Math.max(maxSibExtent, sibH ? 120 : 50);\n const cursor = { v: 0 };\n assignLeafPositions(root, sibH, unit, leafGap, cursor);\n enforceSibGap(root, sibH, sibGap);\n\n const levelOffsets = computeLevelOffsets(root, sibH, levelGap);\n setFinal(root, sibH, levelOffsets);\n\n // Bounding box — extra left padding for decision-mode left-right (root label sits outside the rect)\n const PADDING = 40;\n const extraLeft = ast.mode === \"decision\" && !sibH ? 110 : 0;\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (const n of all) {\n minX = Math.min(minX, n.xFinal - n.size.w / 2);\n minY = Math.min(minY, n.yFinal - n.size.h / 2);\n maxX = Math.max(maxX, n.xFinal + n.size.w / 2);\n maxY = Math.max(maxY, n.yFinal + n.size.h / 2);\n }\n\n // For decision mode (left-right), reserve a rightmost column for payoff text.\n const needsPayoffCol = ast.mode === \"decision\" && !sibH;\n const payoffColGap = needsPayoffCol ? 110 : 0;\n const extraRight = needsPayoffCol ? 180 : ast.mode === \"decision\" ? 110 : 20;\n\n // Capture natural x BEFORE snapping — needed to route shallow end-node edges via\n // an L-shape (diagonal to natural column, then horizontal to snapped column).\n const naturalXMap = new Map<string, number>();\n for (const w of all) naturalXMap.set(w.node.id, w.xFinal);\n\n // If needed, snap all end nodes to the same rightmost x so payoffs align.\n if (needsPayoffCol) {\n let endMaxX = -Infinity;\n for (const w of all) if (w.node.kind === \"end\") endMaxX = Math.max(endMaxX, w.xFinal);\n for (const w of all) if (w.node.kind === \"end\") w.xFinal = endMaxX;\n // Recompute bounds after snap\n minX = Infinity; maxX = -Infinity;\n for (const n of all) {\n minX = Math.min(minX, n.xFinal - n.size.w / 2);\n maxX = Math.max(maxX, n.xFinal + n.size.w / 2);\n }\n }\n\n const offsetX = PADDING + extraLeft - minX;\n const offsetY = PADDING - minY;\n\n const layoutNodes: DTreeLayoutNode[] = all.map((w) => ({\n node: w.node,\n x: w.xFinal + offsetX,\n y: w.yFinal + offsetY,\n width: w.size.w,\n height: w.size.h,\n depth: w.depth,\n naturalX: (naturalXMap.get(w.node.id) ?? w.xFinal) + offsetX,\n naturalY: w.yFinal + offsetY,\n }));\n\n const nodeById = new Map(layoutNodes.map((n) => [n.node.id, n]));\n\n // Edge style resolution\n const edgeStyle: DTreeEdgeStyle =\n ast.edgeStyle ?? (ast.mode === \"decision\" ? \"diagonal\" : \"orthogonal\");\n\n // Level rails — for orthogonal, precompute the elbow position per child-depth so\n // all siblings at the same depth share the same rail (keeps True/False aligned).\n const levelRails: number[] = [];\n if (edgeStyle === \"orthogonal\") {\n // For each child depth d>=1, rail = midpoint between parent-level bottom and child-level top.\n for (let d = 1; d < perDepthDepthSize.length; d++) {\n const parentBotY = (levelOffsets[d - 1] ?? 0) + (perDepthDepthSize[d - 1]! / 2);\n const childTopY = (levelOffsets[d] ?? 0) - (perDepthDepthSize[d]! / 2);\n levelRails[d] = (parentBotY + childTopY) / 2 + (sibH ? offsetY : offsetX);\n }\n }\n\n const labelAnchors: Record<string, { x: number; y: number; angle: number }> = {};\n const edges: DTreeLayoutEdge[] = [];\n for (const w of all) {\n for (const c of w.children) {\n const pn = nodeById.get(w.node.id)!;\n const cn = nodeById.get(c.node.id)!;\n // Special route: end node snapped from its natural x to the payoff column.\n // Route as diagonal (parent → naturalX, childY) then horizontal to (snappedX, childY).\n const wasSnapped = needsPayoffCol && c.node.kind === \"end\" && cn.naturalX !== undefined && Math.abs(cn.naturalX - cn.x) > 1;\n const geom = wasSnapped\n ? routeSnappedEnd(sibH, pn, cn)\n : routeEdge(edgeStyle, sibH, pn, cn, levelRails[c.depth]);\n\n const isOptimal = c.node.optimal === true;\n let strokeWidth = 1.6;\n if (isOptimal) strokeWidth = 3;\n if (ast.branchLengthProb && c.node.incomingProb !== undefined) {\n strokeWidth = 1 + c.node.incomingProb * 2.5;\n }\n\n let label: string | undefined;\n if (ast.mode === \"decision\") {\n if (c.node.incomingChoice !== undefined) label = c.node.incomingChoice;\n else if (c.node.incomingProb !== undefined) label = formatProb(c.node.incomingProb);\n } else if (ast.mode === \"ml\") {\n if (c.node.mlBranch) {\n if (ast.branchLabels === \"relation\" && w.node.op && w.node.threshold !== undefined) {\n const op = c.node.mlBranch === \"true\" ? w.node.op : flipOp(w.node.op);\n label = `${op} ${w.node.threshold}`;\n } else {\n label = c.node.mlBranch === \"true\" ? \"True\" : \"False\";\n }\n }\n } else {\n if (c.node.branchLabel) label = c.node.branchLabel;\n }\n\n labelAnchors[c.node.id] = { x: geom.labelX, y: geom.labelY, angle: geom.angle };\n\n edges.push({ from: w.node.id, to: c.node.id, path: geom.path, label, isOptimal, strokeWidth });\n }\n }\n\n // Payoff column X (in final coordinates)\n let payoffColumnX: number | undefined;\n if (needsPayoffCol) {\n let endX = 0;\n for (const n of layoutNodes) if (n.node.kind === \"end\") endX = Math.max(endX, n.x + n.width / 2);\n payoffColumnX = endX + payoffColGap;\n }\n\n const width = Math.ceil(maxX - minX + PADDING * 2 + extraRight + extraLeft);\n const height = Math.ceil(maxY - minY + PADDING * 2);\n\n return {\n width,\n height,\n nodes: layoutNodes,\n edges,\n levelRails: edgeStyle === \"orthogonal\" ? levelRails : undefined,\n title: ast.title,\n mode: ast.mode,\n direction: ast.direction,\n edgeStyle,\n labelAnchors,\n payoffColumnX,\n };\n}\n\nfunction flipOp(op: string): string {\n if (op === \"<=\") return \">\";\n if (op === \"<\") return \">=\";\n if (op === \">=\") return \"<\";\n if (op === \">\") return \"<=\";\n return op;\n}\n\nfunction formatProb(p: number): string {\n if (p >= 0.01 && p <= 0.99) {\n const pct = Math.round(p * 100);\n if (Math.abs(p * 100 - pct) < 0.01) return `p=${pct}%`;\n }\n return `p=${p}`;\n}\n","import type { RenderConfig } from \"../../core/types\";\nimport {\n svgRoot,\n group,\n el,\n path as pathEl,\n text as textEl,\n title as titleEl,\n desc,\n rect,\n circle,\n polygon,\n escapeXml,\n} from \"../../core/svg\";\nimport { resolveBaseTheme, type BaseTheme } from \"../../core/theme\";\nimport { layoutDecisionTree } from \"./layout\";\nimport type { DTreeAST, DTreeLayoutNode, DTreeLayoutResult, DTreeNode } from \"./types\";\n\nconst CLASS_PALETTE = [\n \"#0ea5e9\", \"#10b981\", \"#f59e0b\", \"#f43f5e\", \"#8b5cf6\",\n \"#14b8a6\", \"#ec4899\", \"#84cc16\", \"#06b6d4\", \"#f97316\",\n];\n\nfunction buildCss(t: BaseTheme): string {\n return `\n.lt-dtree { font-family: system-ui, -apple-system, sans-serif; }\n.lt-dtree-title { font: 500 16px sans-serif; fill: ${t.text}; }\n.lt-dtree-edge { fill: none; stroke: ${t.stroke}; stroke-width: 1.6; stroke-linecap: round; stroke-linejoin: round; }\n.lt-dtree-edge-optimal { fill: none; stroke: ${t.positive}; stroke-width: 3; stroke-linecap: round; stroke-linejoin: round; }\n.lt-dtree-edge-leader { fill: none; stroke: ${t.stroke}; stroke-width: 1; stroke-dasharray: 2 2; opacity: 0.55; }\n.lt-dtree-edge-label { font: 500 11px sans-serif; fill: ${t.text}; text-anchor: middle; dominant-baseline: middle; }\n.lt-dtree-edge-prob { font: italic 400 10px sans-serif; fill: ${t.textMuted}; text-anchor: middle; dominant-baseline: middle; }\n.lt-dtree-edge-label-bg { fill: ${t.bg}; stroke: none; }\n.lt-dtree-decision { fill: #dbeafe; stroke: #1d4ed8; stroke-width: 1.6; }\n.lt-dtree-chance { fill: #fef3c7; stroke: #b45309; stroke-width: 1.6; }\n.lt-dtree-outcome { fill: #f1f5f9; stroke: ${t.stroke}; stroke-width: 1.4; }\n.lt-dtree-node-label { font: 500 12px sans-serif; fill: ${t.text}; }\n.lt-dtree-ev { font: 500 10px \"SF Mono\", monospace; fill: ${t.textMuted}; }\n.lt-dtree-ev-optimal { font: 600 10px \"SF Mono\", monospace; fill: ${t.positive}; }\n.lt-dtree-payoff { font: 600 12px \"SF Mono\", monospace; fill: ${t.text}; }\n.lt-dtree-payoff-neg { font: 600 12px \"SF Mono\", monospace; fill: ${t.negative ?? \"#dc2626\"}; }\n.lt-dtree-ml-rect { stroke: ${t.stroke}; stroke-width: 1; }\n.lt-dtree-ml-line-1 { font: 500 12px sans-serif; fill: ${t.text}; }\n.lt-dtree-ml-line-muted { font: 400 10px sans-serif; fill: ${t.textMuted}; }\n.lt-dtree-ml-mono { font: 400 10px \"SF Mono\", monospace; fill: ${t.textMuted}; }\n.lt-dtree-ml-class { font: 600 11px sans-serif; }\n.lt-dtree-taxon { fill: #eef2ff; stroke: #4f46e5; stroke-width: 1.4; }\n.lt-dtree-taxon-leaf { fill: #ecfdf5; stroke: #059669; stroke-width: 1.4; }\n.lt-dtree-taxon-label { font: 500 12px sans-serif; fill: ${t.text}; text-anchor: middle; }\n`.trim();\n}\n\n// ─── Decision-mode node rendering ────────────────────────────\n\nfunction renderDecisionNode(ln: DTreeLayoutNode, layout: DTreeLayoutResult): string {\n const n = ln.node;\n const parts: string[] = [];\n const sibH = layout.direction === \"top-down\";\n\n if (n.kind === \"decision\") {\n parts.push(rect({\n x: ln.x - ln.width / 2,\n y: ln.y - ln.height / 2,\n width: ln.width,\n height: ln.height,\n rx: 2,\n ry: 2,\n class: \"lt-dtree-decision\",\n }));\n if (n.label) {\n // Place label above (top-down) or to the left (left-right)\n if (sibH) {\n parts.push(textEl({\n x: ln.x, y: ln.y - ln.height / 2 - 8,\n class: \"lt-dtree-node-label\", \"text-anchor\": \"middle\",\n }, n.label));\n } else {\n parts.push(textEl({\n x: ln.x - ln.width / 2 - 8, y: ln.y + 4,\n class: \"lt-dtree-node-label\", \"text-anchor\": \"end\",\n }, n.label));\n }\n }\n if (n.ev !== undefined) {\n parts.push(textEl({\n x: ln.x, y: ln.y + ln.height / 2 + 13,\n class: \"lt-dtree-ev\", \"text-anchor\": \"middle\",\n }, `EV=${formatNum(n.ev)}`));\n }\n } else if (n.kind === \"chance\") {\n parts.push(circle({\n cx: ln.x, cy: ln.y, r: ln.width / 2,\n class: \"lt-dtree-chance\",\n }));\n if (n.label) {\n if (sibH) {\n parts.push(textEl({\n x: ln.x, y: ln.y - ln.height / 2 - 8,\n class: \"lt-dtree-node-label\", \"text-anchor\": \"middle\",\n }, n.label));\n } else {\n parts.push(textEl({\n x: ln.x, y: ln.y - ln.height / 2 - 6,\n class: \"lt-dtree-node-label\", \"text-anchor\": \"middle\",\n }, n.label));\n }\n }\n if (n.ev !== undefined) {\n parts.push(textEl({\n x: ln.x, y: ln.y + ln.height / 2 + 13,\n class: n.optimal ? \"lt-dtree-ev-optimal\" : \"lt-dtree-ev\",\n \"text-anchor\": \"middle\",\n }, `EV=${formatNum(n.ev)}`));\n }\n } else if (n.kind === \"end\") {\n // Right-pointing triangle\n const halfW = ln.width / 2;\n const halfH = ln.height / 2;\n const pts = [\n `${ln.x - halfW},${ln.y - halfH}`,\n `${ln.x + halfW},${ln.y}`,\n `${ln.x - halfW},${ln.y + halfH}`,\n ].join(\" \");\n parts.push(polygon({ points: pts, class: \"lt-dtree-outcome\" }));\n\n // Payoff column: if available, leader-line from triangle tip to column; else inline.\n const colX = layout.payoffColumnX;\n const tipX = ln.x + halfW;\n const textY = ln.y + 4;\n const payoffCls = n.payoff !== undefined && n.payoff < 0 ? \"lt-dtree-payoff-neg\" : \"lt-dtree-payoff\";\n const payoffStr = n.payoff !== undefined ? formatPayoff(n.payoff) : \"\";\n\n if (colX !== undefined && colX > tipX + 20) {\n // Leader line (dashed) to column\n parts.push(pathEl({\n d: `M ${tipX + 2} ${ln.y} L ${colX - 6} ${ln.y}`,\n class: \"lt-dtree-edge-leader\",\n }));\n // Outcome label above leader (midpoint)\n if (n.label) {\n parts.push(textEl({\n x: (tipX + colX) / 2, y: ln.y - 6,\n class: \"lt-dtree-edge-label\", \"text-anchor\": \"middle\",\n }, n.label));\n }\n if (payoffStr) {\n parts.push(textEl({\n x: colX, y: textY, class: payoffCls, \"text-anchor\": \"start\",\n }, payoffStr));\n }\n } else {\n const labelParts: string[] = [];\n if (payoffStr) labelParts.push(payoffStr);\n if (n.label) labelParts.push(n.label);\n if (labelParts.length > 0) {\n parts.push(textEl({\n x: tipX + 8, y: textY, class: payoffCls,\n }, labelParts.join(\" · \")));\n }\n }\n }\n\n return group({\n \"data-node-id\": n.id,\n \"data-node-kind\": n.kind,\n \"data-ev\": n.ev !== undefined ? String(n.ev) : \"\",\n }, parts);\n}\n\nfunction formatNum(n: number): string {\n if (Math.abs(n) >= 10000) return n.toLocaleString(undefined, { maximumFractionDigits: 0 });\n if (Number.isInteger(n)) return String(n);\n return n.toFixed(2);\n}\n\nfunction formatPayoff(n: number): string {\n const abs = Math.abs(n);\n const sign = n < 0 ? \"-\" : \"\";\n if (abs >= 1000000) return `${sign}$${(abs / 1000000).toFixed(abs >= 10000000 ? 0 : 1)}M`;\n if (abs >= 1000) return `${sign}$${abs.toLocaleString()}`;\n return String(n);\n}\n\n// ─── ML-mode node rendering ──────────────────────────────────\n\nfunction classColor(i: number): string { return CLASS_PALETTE[i % CLASS_PALETTE.length]!; }\n\nfunction mlNodeFillColor(n: DTreeNode): { fill: string } {\n if (!Array.isArray(n.value)) return { fill: \"#f1f5f9\" };\n const arr = n.value as number[];\n const sum = arr.reduce((a, b) => a + b, 0);\n if (sum === 0) return { fill: \"#f1f5f9\" };\n let maxIdx = 0;\n for (let i = 1; i < arr.length; i++) if (arr[i]! > arr[maxIdx]!) maxIdx = i;\n const purity = arr[maxIdx]! / sum;\n const nClasses = arr.length;\n const minPurity = 1 / nClasses;\n const alpha = Math.max(0.12, 0.12 + 0.8 * ((purity - minPurity) / (1 - minPurity)));\n return { fill: hexWithAlpha(classColor(maxIdx), alpha) };\n}\n\nfunction hexWithAlpha(hex: string, alpha: number): string {\n return hex + Math.round(alpha * 255).toString(16).padStart(2, \"0\");\n}\n\nfunction renderMlNode(ln: DTreeLayoutNode, ast: DTreeAST): string {\n const n = ln.node;\n const { fill } = mlNodeFillColor(n);\n const parts: string[] = [];\n const x = ln.x - ln.width / 2;\n const y = ln.y - ln.height / 2;\n\n parts.push(rect({\n x, y, width: ln.width, height: ln.height, rx: 6, ry: 6,\n fill, class: \"lt-dtree-ml-rect\",\n }));\n\n const textX = ln.x;\n let textY = y + 16;\n const lineH = 14;\n\n if (n.kind === \"split\" && n.feature) {\n const thresh = typeof n.threshold === \"number\" ? formatNum(n.threshold) : n.threshold ?? \"\";\n parts.push(textEl({ x: textX, y: textY, class: \"lt-dtree-ml-line-1\", \"text-anchor\": \"middle\" },\n `${n.feature} ${n.op ?? \"\"} ${thresh}`));\n textY += lineH;\n } else if (n.label) {\n parts.push(textEl({ x: textX, y: textY, class: \"lt-dtree-ml-line-1\", \"text-anchor\": \"middle\" }, n.label));\n textY += lineH;\n }\n if (n.impurity !== undefined) {\n const impName = ast.impurityName ?? \"gini\";\n parts.push(textEl({ x: textX, y: textY, class: \"lt-dtree-ml-line-muted\", \"text-anchor\": \"middle\" },\n `${impName} = ${formatNum(n.impurity)}`));\n textY += lineH;\n }\n if (n.samples !== undefined) {\n parts.push(textEl({ x: textX, y: textY, class: \"lt-dtree-ml-line-muted\", \"text-anchor\": \"middle\" },\n `samples = ${n.samples}`));\n textY += lineH;\n }\n if (n.value !== undefined) {\n const vStr = Array.isArray(n.value)\n ? `value = [${n.value.join(\", \")}]`\n : `value = ${formatNum(n.value)}`;\n parts.push(textEl({ x: textX, y: textY, class: \"lt-dtree-ml-mono\", \"text-anchor\": \"middle\" }, vStr));\n textY += lineH;\n }\n if (n.className) {\n let colorIdx = 0;\n if (ast.classes) {\n const idx = ast.classes.indexOf(n.className);\n if (idx >= 0) colorIdx = idx;\n }\n parts.push(textEl({ x: textX, y: textY, class: \"lt-dtree-ml-class\", \"text-anchor\": \"middle\", fill: classColor(colorIdx) },\n `class = ${n.className}`));\n textY += lineH;\n } else if (typeof n.value === \"number\") {\n parts.push(textEl({ x: textX, y: textY, class: \"lt-dtree-ml-class\", \"text-anchor\": \"middle\", fill: \"#0f172a\" },\n `predicted = ${formatNum(n.value)}`));\n textY += lineH;\n }\n\n if (Array.isArray(n.value) && ast.classes) {\n const arr = n.value as number[];\n const sum = arr.reduce((a, b) => a + b, 0);\n if (sum > 0) {\n const barY = y + ln.height - 10;\n const barX = x + 10;\n const barW = ln.width - 20;\n let cursor = barX;\n for (let i = 0; i < arr.length; i++) {\n const seg = (arr[i]! / sum) * barW;\n if (seg > 0) {\n parts.push(rect({ x: cursor, y: barY, width: seg, height: 5, fill: classColor(i), stroke: \"none\" }));\n }\n cursor += seg;\n }\n }\n }\n\n return group({\n \"data-node-id\": n.id,\n \"data-node-kind\": n.kind,\n \"data-samples\": n.samples !== undefined ? String(n.samples) : \"\",\n \"data-class\": n.className ?? \"\",\n }, parts);\n}\n\n// ─── Taxonomy-mode node rendering ────────────────────────────\n\nfunction renderTaxonomyNode(ln: DTreeLayoutNode): string {\n const n = ln.node;\n const isLeaf = n.kind === \"answer\" || n.children.length === 0;\n const cls = isLeaf ? \"lt-dtree-taxon-leaf\" : \"lt-dtree-taxon\";\n\n const parts: string[] = [];\n parts.push(rect({\n x: ln.x - ln.width / 2,\n y: ln.y - ln.height / 2,\n width: ln.width,\n height: ln.height,\n rx: 8,\n ry: 8,\n class: cls,\n }));\n\n const lines = wrapText(n.label, 22);\n const totalH = lines.length * 14;\n let ty = ln.y - totalH / 2 + 11;\n for (const line of lines) {\n parts.push(textEl({ x: ln.x, y: ty, class: \"lt-dtree-taxon-label\" }, line));\n ty += 14;\n }\n\n return group({\n \"data-node-id\": n.id,\n \"data-node-kind\": n.kind,\n \"data-leaf\": isLeaf ? \"true\" : \"false\",\n }, parts);\n}\n\nfunction wrapText(text: string, maxChars: number): string[] {\n if (text.length <= maxChars) return [text];\n const words = text.split(/\\s+/);\n const lines: string[] = [];\n let cur = \"\";\n for (const w of words) {\n if (!cur) cur = w;\n else if ((cur + \" \" + w).length > maxChars) { lines.push(cur); cur = w; }\n else cur = cur + \" \" + w;\n if (lines.length >= 1 && cur.length >= maxChars) { lines.push(cur); cur = \"\"; break; }\n }\n if (cur) lines.push(cur);\n return lines.slice(0, 2);\n}\n\n// ─── Top-level renderer ──────────────────────────────────────\n\nexport function renderDecisionTree(ast: DTreeAST, config?: RenderConfig): string {\n const t = resolveBaseTheme(config?.theme ?? \"default\");\n const layout = layoutDecisionTree(ast);\n\n const titleOffset = ast.title ? 36 : 10;\n const width = Math.ceil(layout.width);\n const height = Math.ceil(layout.height + titleOffset);\n\n const children: string[] = [];\n children.push(titleEl(ast.title ?? \"Decision Tree\"));\n children.push(desc(`Decision tree (${ast.mode} mode) with ${layout.nodes.length} nodes and ${layout.edges.length} edges`));\n children.push(el(\"style\", {}, buildCss(t)));\n\n if (ast.title) {\n children.push(textEl({ x: 20, y: 24, class: \"lt-dtree-title\" }, ast.title));\n }\n\n const inner: string[] = [];\n\n // Edges first (back layer)\n for (const e of layout.edges) {\n const cls = e.isOptimal ? \"lt-dtree-edge-optimal\" : \"lt-dtree-edge\";\n const attrs: Record<string, string | number> = { d: e.path, class: cls, \"data-edge\": `${e.from}->${e.to}` };\n if (e.strokeWidth !== undefined && !e.isOptimal) attrs[\"stroke-width\"] = e.strokeWidth;\n inner.push(pathEl(attrs));\n }\n\n // Edge labels — use layout.labelAnchors for accurate placement (works for all edge styles).\n const anchors = layout.labelAnchors ?? {};\n for (const e of layout.edges) {\n if (!e.label) continue;\n const a = anchors[e.to];\n if (!a) continue;\n\n // Decision mode: probability vs choice styling\n const isProb = ast.mode === \"decision\" && /^p=/i.test(e.label);\n const labelClass = isProb ? \"lt-dtree-edge-prob\" : \"lt-dtree-edge-label\";\n\n // For diagonal/bracket, nudge label slightly perpendicular to edge to avoid covering the line\n let lx = a.x;\n let ly = a.y;\n const absAngle = Math.abs(a.angle);\n const perpOffset = layout.edgeStyle === \"diagonal\" || layout.edgeStyle === \"bracket\" ? 9 : 0;\n if (perpOffset > 0 && absAngle > 1 && absAngle < 89) {\n // Move perpendicular to edge direction\n const rad = (a.angle * Math.PI) / 180;\n const nx = -Math.sin(rad);\n const ny = Math.cos(rad);\n // Flip so label sits \"above\" the edge consistently\n const flip = ny < 0 ? -1 : 1;\n lx += nx * perpOffset * flip;\n ly += ny * perpOffset * flip;\n }\n\n const charW = isProb ? 5.5 : 6.2;\n const w = Math.max(e.label.length * charW + 10, 18);\n const h = 14;\n inner.push(rect({\n x: lx - w / 2, y: ly - h / 2, width: w, height: h,\n class: \"lt-dtree-edge-label-bg\", rx: 3, ry: 3,\n }));\n inner.push(textEl({ x: lx, y: ly, class: labelClass }, e.label));\n }\n\n // Nodes on top\n for (const ln of layout.nodes) {\n if (ast.mode === \"decision\") inner.push(renderDecisionNode(ln, layout));\n else if (ast.mode === \"ml\") inner.push(renderMlNode(ln, ast));\n else inner.push(renderTaxonomyNode(ln));\n }\n\n children.push(group({ transform: `translate(0, ${titleOffset})`, \"data-mode\": ast.mode }, inner));\n\n return svgRoot({\n class: \"lt-dtree\",\n role: \"img\",\n \"aria-label\": escapeXml(ast.title ?? `Decision tree (${ast.mode})`),\n width,\n height,\n viewBox: `0 0 ${width} ${height}`,\n }, children);\n}\n","import type { DiagramPlugin, RenderConfig } from \"../../core/types\";\nimport { parseDecisionTree } from \"./parser\";\nimport { renderDecisionTree } from \"./renderer\";\n\nexport const decisiontree: DiagramPlugin = {\n type: \"decisiontree\" as DiagramPlugin[\"type\"],\n detect(text) {\n return /^\\s*decisiontree\\b/i.test(text);\n },\n parse: parseDecisionTree,\n\n render(text, config?: RenderConfig) {\n const ast = parseDecisionTree(text);\n return renderDecisionTree(ast, config);\n },\n};\n\nexport { parseDecisionTree, DTreeParseError } from \"./parser\";\nexport { renderDecisionTree } from \"./renderer\";\nexport { layoutDecisionTree } from \"./layout\";\nexport type * from \"./types\";\n","import type { TimelineDate } from \"./types\";\n\n/**\n * Parse a single DSL date token into a TimelineDate.\n *\n * Accepted forms:\n * - ISO 8601 date: 2024-11-05, 1969-07-20\n * - ISO year-month: 2024-11\n * - Year: 1969\n * - BC year (negative): -753\n * - BC year (suffix): 753BC, 753BCE\n * - Relative (geologic): 540Ma, 4.6Ga, 12ka\n */\nexport function parseDate(raw: string): TimelineDate {\n const s = raw.trim();\n\n // Ma / Ga / ka\n const mGeo = /^(-?\\d+(?:\\.\\d+)?)\\s*(Ma|Ga|ka)$/i.exec(s);\n if (mGeo) {\n const n = parseFloat(mGeo[1]!);\n const unit = mGeo[2]!.toLowerCase();\n const mult = unit === \"ga\" ? 1e9 : unit === \"ma\" ? 1e6 : 1e3;\n return {\n value: 1970 - n * mult,\n raw: s,\n precision: \"ma\",\n };\n }\n\n // BC suffix\n const mBC = /^(\\d+)\\s*(BC|BCE)$/i.exec(s);\n if (mBC) {\n return { value: -parseInt(mBC[1]!, 10), raw: s, precision: \"year\" };\n }\n\n // ISO date yyyy-mm-dd\n const mIso = /^(-?\\d{1,5})-(\\d{1,2})-(\\d{1,2})$/.exec(s);\n if (mIso) {\n const y = parseInt(mIso[1]!, 10);\n const mo = parseInt(mIso[2]!, 10);\n const d = parseInt(mIso[3]!, 10);\n return {\n value: y + (dayOfYear(y, mo, d) - 1) / daysInYear(y),\n raw: s,\n precision: \"day\",\n };\n }\n\n // ISO year-month\n const mYm = /^(-?\\d{1,5})-(\\d{1,2})$/.exec(s);\n if (mYm) {\n const y = parseInt(mYm[1]!, 10);\n const mo = parseInt(mYm[2]!, 10);\n return {\n value: y + (mo - 1) / 12,\n raw: s,\n precision: \"month\",\n };\n }\n\n // Year-Quarter (2026-Q1 style was caught above if QN part; handle separately)\n const mYq = /^(-?\\d{1,5})-?Q([1-4])$/i.exec(s);\n if (mYq) {\n const y = parseInt(mYq[1]!, 10);\n const q = parseInt(mYq[2]!, 10);\n return { value: y + (q - 1) * 0.25, raw: s, precision: \"month\" };\n }\n\n // Plain year (may be negative for BC)\n const mY = /^(-?\\d+)$/.exec(s);\n if (mY) {\n return { value: parseInt(mY[1]!, 10), raw: s, precision: \"year\" };\n }\n\n throw new Error(`Cannot parse date: \"${raw}\"`);\n}\n\n/**\n * Non-throwing variant of `parseDate`. Returns `null` when the raw token\n * cannot be parsed as any of the supported date forms — callers can fall\n * back to ordinal mode (using the raw string as a row label and the\n * declaration index for layout positioning).\n */\nexport function tryParseDate(raw: string): TimelineDate | null {\n try {\n return parseDate(raw);\n } catch {\n return null;\n }\n}\n\nfunction daysInYear(y: number): number {\n const leap = (y % 4 === 0 && y % 100 !== 0) || y % 400 === 0;\n return leap ? 366 : 365;\n}\n\nfunction dayOfYear(y: number, m: number, d: number): number {\n const dim = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n if ((y % 4 === 0 && y % 100 !== 0) || y % 400 === 0) dim[1] = 29;\n let total = d;\n for (let i = 0; i < m - 1; i++) total += dim[i]!;\n return total;\n}\n\n/**\n * Format a scalar `value` (fractional year) as a tick label, given a span.\n */\nexport function formatYear(value: number, span: number): string {\n const y = Math.round(value);\n if (span >= 2e6) return `${Math.round((1970 - value) / 1e6)} Ma`;\n if (span >= 2000) return y < 0 ? `${-y} BC` : `${y}`;\n if (span >= 50) return y < 0 ? `${-y} BC` : `${y}`;\n // For smaller spans show year (optionally with month)\n return y < 0 ? `${-y} BC` : `${y}`;\n}\n\n/**\n * Format a TimelineDate for display in its original precision.\n */\nexport function formatDate(d: TimelineDate): string {\n return d.raw;\n}\n","import type {\n TimelineAST,\n TimelineAxisPosition,\n TimelineDate,\n TimelineEra,\n TimelineEvent,\n TimelineEventShape,\n TimelineOrientation,\n TimelineScale,\n TimelineSide,\n TimelineStyle,\n} from \"./types\";\nimport { parseDate, tryParseDate } from \"./dates\";\n\nexport class TimelineParseError extends Error {\n constructor(\n message: string,\n public line?: number,\n public column?: number,\n public source?: string\n ) {\n super(line !== undefined ? `Line ${line}: ${message}` : message);\n this.name = \"TimelineParseError\";\n }\n}\n\ninterface RawLine {\n indent: number;\n text: string;\n line: number;\n}\n\nfunction preprocess(src: string): RawLine[] {\n const out: RawLine[] = [];\n const lines = src.split(/\\r?\\n/);\n for (let i = 0; i < lines.length; i++) {\n const raw = lines[i];\n if (raw === undefined) continue;\n const trimmed = raw.trim();\n if (!trimmed) continue;\n if (trimmed.startsWith(\"#\") || trimmed.startsWith(\"//\")) continue;\n const spaces = raw.length - raw.replace(/^\\s+/, \"\").length;\n out.push({ indent: Math.floor(spaces / 2), text: trimmed, line: i + 1 });\n }\n return out;\n}\n\n// Quoted string reader. Returns [string, rest].\nfunction readQuoted(s: string, lineNum: number): [string, string] {\n const t = s.trimStart();\n if (!t.startsWith('\"')) {\n throw new TimelineParseError(`Expected quoted string, got: ${s}`, lineNum);\n }\n const end = t.indexOf('\"', 1);\n if (end < 0) throw new TimelineParseError(`Unterminated string: ${s}`, lineNum);\n return [t.slice(1, end), t.slice(end + 1)];\n}\n\n// Parse trailing `[k: v, k2: v2]` properties.\nfunction parseProperties(s: string, lineNum: number): { props: Record<string, string>; rest: string } {\n const t = s.trimEnd();\n if (!t.endsWith(\"]\")) return { props: {}, rest: s };\n const open = t.lastIndexOf(\"[\");\n if (open < 0) return { props: {}, rest: s };\n const inner = t.slice(open + 1, -1);\n const props: Record<string, string> = {};\n const parts = splitTopLevel(inner, \",\");\n for (const p of parts) {\n const pt = p.trim();\n if (!pt) continue;\n const idx = pt.indexOf(\":\");\n if (idx < 0) {\n throw new TimelineParseError(`Invalid property (missing ':'): ${pt}`, lineNum);\n }\n const k = pt.slice(0, idx).trim();\n let v = pt.slice(idx + 1).trim();\n if (v.startsWith('\"') && v.endsWith('\"')) v = v.slice(1, -1);\n props[k] = v;\n }\n return { props, rest: t.slice(0, open).trimEnd() };\n}\n\nfunction splitTopLevel(s: string, sep: string): string[] {\n const out: string[] = [];\n let depth = 0;\n let inQuote = false;\n let start = 0;\n for (let i = 0; i < s.length; i++) {\n const ch = s[i]!;\n if (ch === '\"') inQuote = !inQuote;\n if (inQuote) continue;\n if (ch === \"[\" || ch === \"(\") depth++;\n else if (ch === \"]\" || ch === \")\") depth--;\n else if (ch === sep && depth === 0) {\n out.push(s.slice(start, i));\n start = i + 1;\n }\n }\n out.push(s.slice(start));\n return out;\n}\n\n/**\n * Split the leading \"date\" or \"date - date\" / \"date .. date\" segment from\n * `label-and-rest`. Returns [dateSegment, rest-after-colon].\n *\n * Tricky bit: a bare BC year is negative (`-753`), so we must distinguish the\n * date-range separator (space-hyphen-space or `..`) from an intra-date minus.\n */\nfunction splitDateAndBody(s: string, lineNum: number): { date: string; end?: string; body: string } {\n // Find the unquoted colon that separates row-key from body. Prefer a\n // colon with whitespace on both sides (matching the canonical ` : `\n // separator) — that way ordinal time-of-day keys like `14:30 : \"Standup\"`\n // stay intact instead of splitting at the colon inside the key. Fall\n // back to the first unquoted colon for back-compat with no-space forms.\n let inQuote = false;\n let colon = -1;\n for (let i = 0; i < s.length; i++) {\n const c = s[i]!;\n if (c === '\"') inQuote = !inQuote;\n if (inQuote) continue;\n if (c === \":\") {\n const lhsSpace = i === 0 || s[i - 1] === \" \" || s[i - 1] === \"\\t\";\n const rhsSpace = i === s.length - 1 || s[i + 1] === \" \" || s[i + 1] === \"\\t\";\n if (lhsSpace && rhsSpace) { colon = i; break; }\n }\n }\n if (colon < 0) {\n // Fallback: first unquoted colon regardless of spacing.\n inQuote = false;\n for (let i = 0; i < s.length; i++) {\n const c = s[i]!;\n if (c === '\"') inQuote = !inQuote;\n if (inQuote) continue;\n if (c === \":\") { colon = i; break; }\n }\n }\n if (colon < 0) throw new TimelineParseError(`Expected ':' after date: ${s}`, lineNum);\n const datePart = s.slice(0, colon).trim();\n const body = s.slice(colon + 1).trim();\n\n // Detect `..` range\n const dd = datePart.indexOf(\"..\");\n if (dd > 0) {\n return {\n date: datePart.slice(0, dd).trim(),\n end: datePart.slice(dd + 2).trim(),\n body,\n };\n }\n // Detect ` - ` (with surrounding whitespace) for range\n const mDash = / - /.exec(datePart);\n if (mDash && mDash.index > 0) {\n return {\n date: datePart.slice(0, mDash.index).trim(),\n end: datePart.slice(mDash.index + 3).trim(),\n body,\n };\n }\n return { date: datePart, body };\n}\n\nexport function parseTimeline(src: string): TimelineAST {\n const lines = preprocess(src);\n if (!lines.length) throw new TimelineParseError(\"Empty timeline\");\n\n const ast: TimelineAST = {\n type: \"timeline\",\n title: undefined,\n style: \"swimlane\",\n orientation: \"horizontal\",\n scale: \"proportional\",\n axis: \"bottom\",\n events: [],\n eras: [],\n tracks: [],\n };\n\n let i = 0;\n let autoId = 0;\n const nextId = (prefix: string) => `${prefix}-${++autoId}`;\n // Shared ordinal counter — incremented whenever a row key fails date\n // parsing and falls back to a string label.\n const ordinal = { index: 0 };\n\n // ─── header: `timeline \"Title\"` or `timeline` ───\n const first = lines[0]!;\n if (/^timeline\\b/i.test(first.text)) {\n const rest = first.text.replace(/^timeline\\b/i, \"\").trim();\n if (rest) {\n if (rest.startsWith('\"')) {\n const [title] = readQuoted(rest, first.line);\n ast.title = title;\n } else {\n ast.title = rest;\n }\n }\n i = 1;\n }\n\n while (i < lines.length) {\n const L = lines[i]!;\n const text = L.text;\n\n // config:\n if (/^config\\s*:/i.test(text)) {\n const body = text.replace(/^config\\s*:\\s*/i, \"\");\n const eq = body.indexOf(\"=\");\n if (eq < 0) throw new TimelineParseError(`Expected 'key = value' in config: ${text}`, L.line);\n const k = body.slice(0, eq).trim();\n const v = body.slice(eq + 1).trim();\n applyConfig(ast, k, v, L.line);\n i++;\n continue;\n }\n\n // era ...\n if (/^era\\b/i.test(text)) {\n const body = text.replace(/^era\\s+/i, \"\");\n const { props, rest } = parseProperties(body, L.line);\n const { date, end, body: labelPart } = splitDateAndBody(rest, L.line);\n if (!end) throw new TimelineParseError(`era requires a date range: ${text}`, L.line);\n const [label] = readQuoted(labelPart, L.line);\n const era: TimelineEra = {\n id: nextId(\"era\"),\n label,\n start: safeParseDate(date, L.line),\n end: safeParseDate(end, L.line),\n color: props[\"color\"],\n };\n ast.eras.push(era);\n i++;\n continue;\n }\n\n // `track \"Name\":` (indented body) OR `section \"Name\"` / `section Foo` (Mermaid-style, flat).\n const isTrack = /^track\\b/i.test(text);\n const isSection = /^section\\b/i.test(text);\n if (isTrack || isSection) {\n const keyword = isTrack ? \"track\" : \"section\";\n const body = text.replace(new RegExp(`^${keyword}\\\\s+`, \"i\"), \"\");\n let name: string;\n if (body.startsWith('\"')) {\n const [n] = readQuoted(body, L.line);\n name = n;\n } else {\n // Bare name (Mermaid-style). Strip trailing colon if present.\n name = body.replace(/:\\s*$/, \"\").trim();\n if (!name) {\n throw new TimelineParseError(`Expected name after '${keyword}'`, L.line);\n }\n }\n const trackId = nextId(\"track\");\n ast.tracks.push({ id: trackId, label: name });\n i++;\n // `track` requires deeper indent for its events; `section` is flat and\n // ends at the next section/track or EOF.\n const baseIndent = L.indent;\n while (i < lines.length) {\n const child = lines[i]!;\n if (child.indent <= baseIndent && /^(section|track)\\b/i.test(child.text)) break;\n if (isTrack && child.indent <= baseIndent) break;\n if (/^note\\s*:/i.test(child.text)) { i++; continue; }\n const parsed = parseEventLine(child.text, child.line, nextId, ordinal);\n if (!parsed) throw new TimelineParseError(`Unrecognized line in ${keyword}: ${child.text}`, child.line);\n parsed.event.trackId = trackId;\n ast.events.push(parsed.event);\n i++;\n if (i < lines.length && /^note\\s*:/i.test(lines[i]!.text) && lines[i]!.indent > child.indent) {\n const noteBody = lines[i]!.text.replace(/^note\\s*:\\s*/i, \"\");\n const [note] = readQuoted(noteBody, lines[i]!.line);\n parsed.event.note = note;\n i++;\n }\n }\n continue;\n }\n\n // Otherwise: flat event line\n const parsed = parseEventLine(text, L.line, nextId, ordinal);\n if (parsed) {\n ast.events.push(parsed.event);\n i++;\n // Optional note block on next line (indented)\n if (i < lines.length && /^note\\s*:/i.test(lines[i]!.text) && lines[i]!.indent > L.indent) {\n const noteBody = lines[i]!.text.replace(/^note\\s*:\\s*/i, \"\");\n const [note] = readQuoted(noteBody, lines[i]!.line);\n parsed.event.note = note;\n i++;\n }\n continue;\n }\n\n throw new TimelineParseError(`Unrecognized line: ${text}`, L.line);\n }\n\n return ast;\n}\n\nfunction safeParseDate(raw: string, line: number): TimelineDate {\n try {\n return parseDate(raw);\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n throw new TimelineParseError(msg, line);\n }\n}\n\n/**\n * Parse a row key, falling back to ordinal mode when the token is not a\n * recognisable date (e.g. \"Phase 1\", \"Q1 2024\", \"Spring\", non-Latin\n * season names). Ordinal events are positioned in declaration order via\n * a shared counter; the raw key is preserved as the display label.\n */\nfunction parseRowKey(\n raw: string,\n ordinal: { index: number }\n): TimelineDate {\n const parsed = tryParseDate(raw);\n if (parsed) return parsed;\n ordinal.index += 1;\n return {\n value: ordinal.index,\n raw,\n precision: \"ordinal\",\n };\n}\n\nfunction applyConfig(ast: TimelineAST, k: string, v: string, line: number): void {\n switch (k) {\n case \"style\": {\n const normalized = v === \"gantt-project\" ? \"gantt\" : v;\n if (normalized !== \"swimlane\" && normalized !== \"gantt\" && normalized !== \"lollipop\") {\n throw new TimelineParseError(`Invalid style: ${v}`, line);\n }\n ast.style = normalized as TimelineStyle;\n break;\n }\n case \"orientation\":\n if (v !== \"horizontal\" && v !== \"vertical\") {\n throw new TimelineParseError(`Invalid orientation: ${v}`, line);\n }\n ast.orientation = v as TimelineOrientation;\n break;\n case \"scale\":\n if (v !== \"proportional\" && v !== \"equidistant\" && v !== \"log\") {\n throw new TimelineParseError(`Invalid scale: ${v}`, line);\n }\n ast.scale = v as TimelineScale;\n break;\n case \"axis\":\n if (v !== \"bottom\" && v !== \"center\") {\n throw new TimelineParseError(`Invalid axis: ${v}`, line);\n }\n ast.axis = v as TimelineAxisPosition;\n break;\n default:\n (ast.metadata ??= {})[k] = v;\n }\n}\n\n/**\n * Parse a single event line. Returns `null` if the line isn't an event line\n * (e.g. unknown keyword).\n */\nfunction parseEventLine(\n text: string,\n line: number,\n nextId: (p: string) => string,\n ordinal: { index: number }\n): { event: TimelineEvent; hasNote: boolean } | null {\n const { props, rest } = parseProperties(text, line);\n const { date, end, body } = splitDateAndBody(rest, line);\n\n // body forms:\n // milestone \"label\"\n // \"label\"\n let kind: \"point\" | \"range\" | \"milestone\" = end ? \"range\" : \"point\";\n let bodyS = body.trim();\n if (/^milestone\\b/i.test(bodyS)) {\n kind = \"milestone\";\n bodyS = bodyS.replace(/^milestone\\s+/i, \"\");\n }\n if (!bodyS.startsWith('\"')) return null;\n const [label] = readQuoted(bodyS, line);\n\n const sideRaw = props[\"side\"];\n const side: TimelineSide | undefined =\n sideRaw === \"above\" || sideRaw === \"below\" ? sideRaw : undefined;\n\n const ev: TimelineEvent = {\n id: nextId(\"ev\"),\n label,\n kind,\n start: parseRowKey(date, ordinal),\n end: end ? parseRowKey(end, ordinal) : undefined,\n icon: props[\"icon\"],\n shape: props[\"shape\"] as TimelineEventShape | undefined,\n color: props[\"color\"],\n category: props[\"category\"],\n side,\n };\n return { event: ev, hasNote: false };\n}\n","import type {\n TimelineAST,\n TimelineCardLayout,\n TimelineEra,\n TimelineEraLayout,\n TimelineEvent,\n TimelineEventLayout,\n TimelineLaneLayout,\n TimelineLayoutResult,\n TimelineLegendItem,\n TimelinePinLayout,\n TimelineSide,\n TimelineTick,\n TimelineTrack,\n} from \"./types\";\nimport { formatYear } from \"./dates\";\n\nconst CANVAS_WIDTH = 960;\nconst PAD_LEFT_WITH_TRACKS = 140;\nconst PAD_LEFT_NO_TRACKS = 40;\nconst PAD_RIGHT = 40;\nconst PAD_TOP_BASE = 40;\nconst ERA_BAND_HEIGHT = 16;\nconst AXIS_HEIGHT = 40;\nconst LANE_HEIGHT_RANGE = 36;\nconst LANE_HEIGHT_POINT = 28;\nconst LANE_GAP = 8;\n\n// Palette used when a renderer-level theme palette isn't threaded through.\n// Kept in sync with BaseTheme.palette defaults so auto-pack colors look the\n// same in the swimlane baseline before theme tokens are applied.\nconst DEFAULT_CATEGORY_PALETTE = [\n \"#2563eb\", \"#059669\", \"#d97706\", \"#7c3aed\",\n \"#dc2626\", \"#0891b2\", \"#db2777\", \"#475569\",\n];\n\nexport function layoutTimeline(ast: TimelineAST): TimelineLayoutResult {\n switch (ast.style) {\n case \"gantt\": return layoutGantt(ast);\n case \"lollipop\": return layoutLollipop(ast);\n case \"swimlane\":\n default: return layoutSwimlane(ast);\n }\n}\n\n// ─── Shared helpers ──────────────────────────────────────\n\nfunction timeExtent(ast: TimelineAST): { min: number; max: number; span: number } {\n const starts = [\n ...ast.events.map(e => e.start.value),\n ...ast.eras.map(e => e.start.value),\n ];\n const ends = [\n ...ast.events.map(e => e.end?.value ?? e.start.value),\n ...ast.eras.map(e => e.end.value),\n ];\n if (!starts.length) return { min: 0, max: 1, span: 1 };\n const min = Math.min(...starts);\n const max = Math.max(...ends);\n const span = max - min || 1;\n return { min, max, span };\n}\n\nfunction buildScale(\n mode: TimelineAST[\"scale\"],\n events: TimelineEvent[],\n tMin: number,\n tMax: number,\n plotX: number,\n plotW: number,\n): (v: number) => number {\n if (mode === \"equidistant\") {\n const sorted = events.slice().sort((a, b) => a.start.value - b.start.value);\n const n = sorted.length || 1;\n const indexByValue = new Map<number, number>();\n sorted.forEach((e, i) => indexByValue.set(e.start.value, i));\n return (v: number) => {\n const idx = indexByValue.get(v);\n if (idx !== undefined) {\n return plotX + (n === 1 ? plotW / 2 : (idx / (n - 1)) * plotW);\n }\n return plotX + ((v - tMin) / (tMax - tMin)) * plotW;\n };\n }\n if (mode === \"log\") {\n const now = Math.max(tMax, 0);\n const toAgo = (v: number) => Math.max(1, now - v + 1);\n const minAgo = toAgo(tMax);\n const maxAgo = toAgo(tMin);\n const logMin = Math.log10(minAgo);\n const logMax = Math.log10(maxAgo);\n const range = logMax - logMin || 1;\n return (v: number) => {\n const frac = (logMax - Math.log10(toAgo(v))) / range;\n return plotX + frac * plotW;\n };\n }\n const span = tMax - tMin || 1;\n return (v: number) => plotX + ((v - tMin) / span) * plotW;\n}\n\nfunction packEraRows(eras: TimelineEra[]): { rows: number; rowOf: number[] } {\n if (!eras.length) return { rows: 0, rowOf: [] };\n const rowsEnd: number[] = [];\n const rowOf: number[] = [];\n for (const e of eras) {\n let placed = -1;\n for (let i = 0; i < rowsEnd.length; i++) {\n if (rowsEnd[i]! <= e.start.value) { placed = i; break; }\n }\n if (placed < 0) {\n rowsEnd.push(e.end.value);\n placed = rowsEnd.length - 1;\n } else {\n rowsEnd[placed] = e.end.value;\n }\n rowOf.push(placed);\n }\n return { rows: rowsEnd.length, rowOf };\n}\n\nfunction generateTicks(\n tMin: number,\n tMax: number,\n span: number,\n xScale: (v: number) => number,\n mode: TimelineAST[\"scale\"],\n): TimelineTick[] {\n const ticks: TimelineTick[] = [];\n\n if (mode === \"log\") {\n const now = Math.max(tMax, 0);\n const minAgo = Math.max(1, now - tMax + 1);\n const maxAgo = Math.max(1, now - tMin + 1);\n const logMin = Math.floor(Math.log10(minAgo));\n const logMax = Math.ceil(Math.log10(maxAgo));\n for (let p = logMin; p <= logMax; p++) {\n const ago = Math.pow(10, p);\n const v = now - ago;\n if (v < tMin || v > tMax) continue;\n const label = ago >= 1e6 ? `${ago / 1e6} Ma` : ago >= 1e3 ? `${ago / 1e3} ka` : `${ago} yr`;\n ticks.push({ value: v, x: xScale(v), label, major: true });\n }\n return ticks;\n }\n\n const step = niceStep(span);\n const start = Math.ceil(tMin / step) * step;\n for (let v = start; v <= tMax; v += step) {\n ticks.push({ value: v, x: xScale(v), label: formatYear(v, span), major: true });\n }\n return ticks;\n}\n\nfunction niceStep(span: number): number {\n const candidates = [\n 0.01, 0.02, 0.05, 0.1, 0.25, 0.5, 1, 2, 5, 10, 20, 25, 50,\n 100, 200, 500, 1000, 2000, 5000, 10000, 50000, 100000, 500000, 1e6,\n ];\n for (const c of candidates) {\n if (span / c <= 10) return c;\n }\n return Math.pow(10, Math.ceil(Math.log10(span / 10)));\n}\n\nfunction estimateLabelWidth(label: string, icon?: string): number {\n const iconW = icon ? 14 : 0;\n return 6.5 * label.length + iconW + 4;\n}\n\n// ─── Swimlane (default, baseline) ────────────────────────\n\nfunction layoutSwimlane(ast: TimelineAST): TimelineLayoutResult {\n const events = ast.events.slice().sort((a, b) => a.start.value - b.start.value);\n const allTracks = resolveTracks(ast, events);\n assignAutoTracks(events, allTracks);\n\n const { min: startVal, max: endVal, span } = timeExtent(ast);\n const paddedStart = startVal - span * 0.02;\n const paddedEnd = endVal + span * 0.02;\n\n const hasNamedTracks = ast.tracks.length > 0;\n const plotX = hasNamedTracks ? PAD_LEFT_WITH_TRACKS : PAD_LEFT_NO_TRACKS;\n const plotRight = CANVAS_WIDTH - PAD_RIGHT;\n const plotW = plotRight - plotX;\n\n const xScale = buildScale(ast.scale, events, paddedStart, paddedEnd, plotX, plotW);\n\n const eraRows = packEraRows(ast.eras);\n const eraBandTotal = eraRows.rows * (ERA_BAND_HEIGHT + 2);\n\n const titleOffset = ast.title ? 28 : 0;\n const plotY = PAD_TOP_BASE + titleOffset + eraBandTotal;\n\n const lanes: TimelineLaneLayout[] = [];\n let cursorY = plotY + 8;\n for (const t of allTracks) {\n const hasRange = events.some(e => e.trackId === t.id && e.kind === \"range\");\n const h = hasRange ? LANE_HEIGHT_RANGE : LANE_HEIGHT_POINT;\n lanes.push({ trackId: t.id, label: t.label, y: cursorY, height: h });\n cursorY += h + LANE_GAP;\n }\n const plotH = cursorY - plotY;\n const axisY = cursorY + 4;\n const height = axisY + AXIS_HEIGHT + 20;\n\n const eraLayouts: TimelineEraLayout[] = ast.eras.map((e, idx) => ({\n era: e,\n x: xScale(e.start.value),\n width: Math.max(2, xScale(e.end.value) - xScale(e.start.value)),\n bandRow: eraRows.rowOf[idx]!,\n }));\n\n const laneByTrack = new Map(lanes.map(l => [l.trackId, l]));\n const eventLayouts: TimelineEventLayout[] = [];\n const labelBoxes: Array<{ x1: number; x2: number; y: number }> = [];\n for (const ev of events) {\n const lane = laneByTrack.get(ev.trackId!)!;\n if (!lane) continue;\n if (ev.kind === \"range\") {\n const x = xScale(ev.start.value);\n const xe = xScale(ev.end!.value);\n const w = Math.max(4, xe - x);\n eventLayouts.push({\n event: ev,\n x,\n w,\n y: lane.y + 6,\n h: lane.height - 12,\n labelX: x + w / 2,\n labelY: lane.y + lane.height / 2 + 4,\n labelAnchor: \"middle\",\n });\n } else {\n const x = xScale(ev.start.value);\n const cy = lane.y + lane.height / 2;\n const labelW = estimateLabelWidth(ev.label, ev.icon);\n // Bidirectional cascade: try above first, then below, growing outward.\n // This roughly doubles the usable label slots compared to above-only.\n const candidates = [\n cy - 14, cy + 18, cy - 28, cy + 32,\n cy - 42, cy + 46, cy - 56, cy + 60,\n ];\n let labelY = candidates[0]!;\n for (const y of candidates) {\n const box = { x1: x - labelW / 2, x2: x + labelW / 2, y };\n const collide = labelBoxes.some(b => Math.abs(b.y - box.y) < 13 && b.x1 < box.x2 && b.x2 > box.x1);\n if (!collide) { labelY = y; labelBoxes.push(box); break; }\n }\n eventLayouts.push({\n event: ev,\n x,\n y: cy,\n h: LANE_HEIGHT_POINT,\n labelX: x,\n labelY,\n labelAnchor: \"middle\",\n noteX: ev.note ? x + 12 : undefined,\n noteY: ev.note ? cy + 16 : undefined,\n });\n }\n }\n\n return {\n width: CANVAS_WIDTH,\n height,\n style: \"swimlane\",\n plotX,\n plotY,\n plotW,\n plotH,\n lanes,\n events: eventLayouts,\n eras: eraLayouts,\n ticks: generateTicks(paddedStart, paddedEnd, span, xScale, ast.scale)\n .filter(t => t.x >= plotX - 2 && t.x <= plotX + plotW + 2),\n axisY,\n title: ast.title,\n };\n}\n\nfunction resolveTracks(ast: TimelineAST, events: TimelineEvent[]): TimelineTrack[] {\n const namedIds = new Set(ast.tracks.map(t => t.id));\n const tracks: TimelineTrack[] = ast.tracks.slice();\n for (const ev of events) {\n if (ev.trackId && !namedIds.has(ev.trackId)) {\n ev.trackId = undefined;\n }\n }\n return tracks;\n}\n\nfunction assignAutoTracks(events: TimelineEvent[], tracks: TimelineTrack[]): void {\n const unassigned = events.filter(e => !e.trackId);\n if (unassigned.length === 0) return;\n\n const pointsOnly = unassigned.every(e => e.kind !== \"range\");\n\n if (pointsOnly) {\n let lane = tracks.find(t => t.id === \"__auto_points__\");\n if (!lane) {\n lane = { id: \"__auto_points__\", label: \"\" };\n tracks.push(lane);\n }\n for (const ev of unassigned) ev.trackId = lane.id;\n return;\n }\n\n const packed: Array<{ id: string; endX: number }> = [];\n const pointLane: TimelineTrack = { id: \"__auto_points__\", label: \"\" };\n const pointEvents: TimelineEvent[] = [];\n\n for (const ev of unassigned) {\n if (ev.kind !== \"range\") {\n pointEvents.push(ev);\n continue;\n }\n let placed = false;\n for (const lane of packed) {\n if (ev.start.value >= lane.endX) {\n ev.trackId = lane.id;\n lane.endX = ev.end!.value;\n placed = true;\n break;\n }\n }\n if (!placed) {\n const id = `__auto_${packed.length}__`;\n tracks.push({ id, label: \"\" });\n packed.push({ id, endX: ev.end!.value });\n ev.trackId = id;\n }\n }\n if (pointEvents.length) {\n tracks.push(pointLane);\n for (const ev of pointEvents) ev.trackId = pointLane.id;\n }\n}\n\n// ─── Gantt (project-plan) ────────────────────────────────\n\nconst GANTT_PIN_ZONE = 70;\nconst GANTT_LANE_H = 30;\nconst GANTT_LEGEND_W = 140;\n\nfunction layoutGantt(ast: TimelineAST): TimelineLayoutResult {\n const events = ast.events.slice().sort((a, b) => a.start.value - b.start.value);\n const { min: startVal, max: endVal, span } = timeExtent(ast);\n const padSpan = span * 0.03;\n const paddedStart = startVal - padSpan;\n const paddedEnd = endVal + padSpan;\n\n // Derive categories from events that have `category`, then named tracks, then auto.\n const categories: string[] = [];\n const catSeen = new Set<string>();\n for (const ev of events) {\n const c = ev.category ?? (ev.kind === \"range\" ? ast.tracks.find(t => t.id === ev.trackId)?.label : undefined);\n if (c && !catSeen.has(c)) { catSeen.add(c); categories.push(c); }\n }\n // Fallback: if no categories but there are range events, put them under \"Tasks\".\n if (!categories.length && events.some(e => e.kind === \"range\")) {\n categories.push(\"Tasks\");\n }\n\n const hasLegend = categories.length > 0;\n const plotX = hasLegend ? PAD_LEFT_WITH_TRACKS - 20 : PAD_LEFT_NO_TRACKS;\n const plotRight = CANVAS_WIDTH - (hasLegend ? GANTT_LEGEND_W + 20 : PAD_RIGHT);\n const plotW = plotRight - plotX;\n\n const xScale = buildScale(ast.scale, events, paddedStart, paddedEnd, plotX, plotW);\n\n const eraRows = packEraRows(ast.eras);\n const eraBandTotal = eraRows.rows * (ERA_BAND_HEIGHT + 2);\n\n const titleOffset = ast.title ? 28 : 0;\n const pinZoneTop = PAD_TOP_BASE + titleOffset + eraBandTotal;\n const pinZoneBottom = pinZoneTop + GANTT_PIN_ZONE;\n const axisY = pinZoneBottom;\n\n const lanes: TimelineLaneLayout[] = categories.map((c, i) => ({\n trackId: `__cat_${i}__`,\n label: c,\n y: axisY + 14 + i * GANTT_LANE_H,\n height: GANTT_LANE_H - 8,\n }));\n\n const plotY = pinZoneTop;\n const plotH = (lanes.length ? (lanes[lanes.length - 1]!.y + lanes[lanes.length - 1]!.height - plotY) : GANTT_PIN_ZONE);\n const height = (lanes.length ? lanes[lanes.length - 1]!.y + lanes[lanes.length - 1]!.height + 40 : axisY + 60);\n\n const palette = DEFAULT_CATEGORY_PALETTE;\n const colorFor = (cat: string | undefined): string => {\n if (!cat) return palette[0]!;\n const idx = categories.indexOf(cat);\n return palette[(idx < 0 ? 0 : idx) % palette.length]!;\n };\n\n const laneByCat = new Map(lanes.map(l => [l.label, l]));\n\n // Events: split into pins (point/milestone above axis) and bars (range in lane).\n const pins: TimelinePinLayout[] = [];\n const eventLayouts: TimelineEventLayout[] = [];\n\n // Cascade pin label rows to minimize overlap\n const pinBoxes: Array<{ x1: number; x2: number; y: number }> = [];\n for (const ev of events) {\n if (ev.kind === \"range\") {\n const cat = ev.category ?? \"Tasks\";\n const lane = laneByCat.get(cat) ?? lanes[0];\n if (!lane) continue;\n const x = xScale(ev.start.value);\n const xe = xScale(ev.end!.value);\n const w = Math.max(4, xe - x);\n eventLayouts.push({\n event: ev,\n x,\n w,\n y: lane.y + 4,\n h: lane.height - 8,\n labelX: x + w / 2,\n labelY: lane.y + lane.height / 2 + 4,\n labelAnchor: \"middle\",\n });\n continue;\n }\n // Pin\n const x = xScale(ev.start.value);\n const labelW = estimateLabelWidth(ev.label, ev.icon);\n let labelY = pinZoneTop + 12;\n let step = 0;\n while (step < 4) {\n const box = { x1: x - labelW / 2, x2: x + labelW / 2, y: labelY };\n const collide = pinBoxes.some(b => Math.abs(b.y - box.y) < 14 && b.x1 < box.x2 && b.x2 > box.x1);\n if (!collide) { pinBoxes.push(box); break; }\n labelY += 16;\n step++;\n }\n pins.push({\n event: ev,\n x,\n labelY,\n axisY,\n color: colorFor(ev.category),\n });\n }\n\n const eraLayouts: TimelineEraLayout[] = ast.eras.map((e, idx) => ({\n era: e,\n x: xScale(e.start.value),\n width: Math.max(2, xScale(e.end.value) - xScale(e.start.value)),\n bandRow: eraRows.rowOf[idx]!,\n }));\n\n const legend: TimelineLegendItem[] = categories.map(c => ({ label: c, color: colorFor(c) }));\n\n return {\n width: CANVAS_WIDTH,\n height,\n style: \"gantt\",\n plotX,\n plotY,\n plotW,\n plotH,\n lanes,\n events: eventLayouts,\n eras: eraLayouts,\n ticks: generateTicks(paddedStart, paddedEnd, span, xScale, ast.scale)\n .filter(t => t.x >= plotX - 2 && t.x <= plotX + plotW + 2),\n axisY,\n title: ast.title,\n pins,\n legend: hasLegend ? legend : undefined,\n };\n}\n\n// ─── Lollipop (alternating cards) ────────────────────────\n\nconst LOLLIPOP_CARD_W = 180;\nconst LOLLIPOP_CARD_H = 54;\nconst LOLLIPOP_STEM_BASE = 26;\nconst LOLLIPOP_STEM_STACK = 18;\n\nfunction layoutLollipop(ast: TimelineAST): TimelineLayoutResult {\n const events = ast.events.slice().sort((a, b) => a.start.value - b.start.value);\n\n // Event-only time extent so the axis doesn't extend past the last event\n // just to accommodate an era that ends later.\n const eStarts = events.map(e => e.start.value);\n const eEnds = events.map(e => e.end?.value ?? e.start.value);\n const eStart = eStarts.length ? Math.min(...eStarts) : 0;\n const eEnd = eEnds.length ? Math.max(...eEnds) : 1;\n const span = Math.max(1e-9, eEnd - eStart);\n const padSpan = span * 0.02;\n const paddedStart = eStart - padSpan;\n const paddedEnd = eEnd + padSpan;\n\n const plotX = PAD_LEFT_NO_TRACKS + 20;\n const plotRight = CANVAS_WIDTH - PAD_RIGHT - 20;\n const plotW = plotRight - plotX;\n\n // Reserve half-card room at axis ends so cards can't overhang plot bounds.\n const CARD_HALF = LOLLIPOP_CARD_W / 2;\n const axisInset = CARD_HALF + 8;\n const axisStart = plotX + axisInset;\n const axisEnd = plotRight - axisInset;\n const axisW = Math.max(1, axisEnd - axisStart);\n\n const rawScale = buildScale(ast.scale, events, paddedStart, paddedEnd, axisStart, axisW);\n const xScale = (v: number) => Math.max(plotX, Math.min(plotRight, rawScale(v)));\n\n const eraRows = packEraRows(ast.eras);\n const eraBandTotal = eraRows.rows * (ERA_BAND_HEIGHT + 2);\n\n const titleOffset = ast.title ? 28 : 0;\n // Estimate 2 stacked rows per side at worst; compute actual after card assignment.\n const plotY = PAD_TOP_BASE + titleOffset + eraBandTotal;\n\n // Assign sides: explicit first, then alternate\n const cards: TimelineCardLayout[] = [];\n let alt: TimelineSide = \"above\";\n const palette = DEFAULT_CATEGORY_PALETTE;\n\n // Track column occupancy to stagger stems when cards would overlap.\n const aboveRows: number[] = []; // stores last-right-edge x per stack row\n const belowRows: number[] = [];\n\n for (let i = 0; i < events.length; i++) {\n const ev = events[i]!;\n if (ev.kind === \"range\") continue; // ranges rendered as thin bars on axis\n const side: TimelineSide = ev.side ?? alt;\n if (!ev.side) alt = alt === \"above\" ? \"below\" : \"above\";\n\n const x = xScale(ev.start.value);\n const cardX = x - LOLLIPOP_CARD_W / 2;\n const cardRight = cardX + LOLLIPOP_CARD_W;\n const rows = side === \"above\" ? aboveRows : belowRows;\n // Find first row where left edge doesn't collide. Allow 2px tolerance so\n // cards whose borders would just-barely kiss stay on the same row instead\n // of cascading up — equidistant layouts depend on this to keep all\n // same-side cards horizontally aligned.\n let row = 0;\n for (; row < rows.length; row++) {\n if (rows[row]! <= cardX + 2) { rows[row] = cardRight; break; }\n }\n if (row === rows.length) { rows.push(cardRight); }\n\n const stemLen = LOLLIPOP_STEM_BASE + row * LOLLIPOP_STEM_STACK;\n\n cards.push({\n event: ev,\n x,\n axisY: 0, // filled after we know axisY\n side,\n cardX,\n cardY: 0,\n cardW: LOLLIPOP_CARD_W,\n cardH: LOLLIPOP_CARD_H,\n stemY1: 0,\n stemY2: 0,\n color: ev.color ?? palette[i % palette.length]!,\n index: row,\n });\n // store stemLen in a transient property via cardH field hack? Use index+side map instead.\n (cards[cards.length - 1] as unknown as { _stemLen: number })._stemLen = stemLen;\n }\n\n const maxAboveStems = aboveRows.length;\n const maxBelowStems = belowRows.length;\n const topExtent = LOLLIPOP_CARD_H + LOLLIPOP_STEM_BASE + Math.max(0, maxAboveStems - 1) * LOLLIPOP_STEM_STACK;\n const realAxisY = plotY + topExtent + 10;\n const bottomExtent = LOLLIPOP_CARD_H + LOLLIPOP_STEM_BASE + Math.max(0, maxBelowStems - 1) * LOLLIPOP_STEM_STACK;\n const height = realAxisY + bottomExtent + 40;\n\n // Fill in card axis/stem/card positions now that we know realAxisY\n for (const c of cards) {\n const stemLen = (c as unknown as { _stemLen: number })._stemLen ?? LOLLIPOP_STEM_BASE;\n c.axisY = realAxisY;\n if (c.side === \"above\") {\n c.stemY1 = realAxisY - 3;\n c.stemY2 = realAxisY - stemLen;\n c.cardY = c.stemY2 - c.cardH;\n } else {\n c.stemY1 = realAxisY + 3;\n c.stemY2 = realAxisY + stemLen;\n c.cardY = c.stemY2;\n }\n delete (c as unknown as { _stemLen?: number })._stemLen;\n }\n\n // Ranges → thin bars on axis\n const eventLayouts: TimelineEventLayout[] = [];\n for (const ev of events) {\n if (ev.kind !== \"range\") continue;\n const x = xScale(ev.start.value);\n const xe = xScale(ev.end!.value);\n const w = Math.max(4, xe - x);\n eventLayouts.push({\n event: ev,\n x,\n w,\n y: realAxisY - 5,\n h: 10,\n labelX: x + w / 2,\n labelY: realAxisY - 10,\n labelAnchor: \"middle\",\n });\n }\n\n const eraLayouts: TimelineEraLayout[] = ast.eras.map((e, idx) => ({\n era: e,\n x: xScale(e.start.value),\n width: Math.max(2, xScale(e.end.value) - xScale(e.start.value)),\n bandRow: eraRows.rowOf[idx]!,\n }));\n\n // Per-row leftmost/rightmost extension: ensure era covers full plot width\n // so cards at axis extremes never overhang a gap.\n const leftmostIdxByRow = new Map<number, number>();\n const rightmostIdxByRow = new Map<number, number>();\n eraLayouts.forEach((e, i) => {\n const curL = leftmostIdxByRow.get(e.bandRow);\n if (curL === undefined || e.x < eraLayouts[curL]!.x) leftmostIdxByRow.set(e.bandRow, i);\n const curR = rightmostIdxByRow.get(e.bandRow);\n const right = e.x + e.width;\n if (curR === undefined || right > eraLayouts[curR]!.x + eraLayouts[curR]!.width) {\n rightmostIdxByRow.set(e.bandRow, i);\n }\n });\n for (const [, i] of leftmostIdxByRow) {\n const e = eraLayouts[i]!;\n const right = e.x + e.width;\n e.x = Math.min(e.x, plotX);\n e.width = right - e.x;\n }\n for (const [, i] of rightmostIdxByRow) {\n const e = eraLayouts[i]!;\n e.width = Math.max(e.width, plotRight - e.x);\n }\n\n return {\n width: CANVAS_WIDTH,\n height,\n style: \"lollipop\",\n plotX,\n plotY,\n plotW,\n plotH: height - plotY - 20,\n lanes: [],\n events: eventLayouts,\n eras: eraLayouts,\n ticks: generateTicks(paddedStart, paddedEnd, span, xScale, ast.scale)\n .filter(t => t.x >= plotX - 2 && t.x <= plotX + plotW + 2),\n axisY: realAxisY,\n title: ast.title,\n cards,\n };\n}\n","import type { RenderConfig } from \"../../core/types\";\nimport { svgRoot, group, rect, line, path, text as textEl, title as titleEl, desc as descEl, defs, circle, escapeXml } from \"../../core/svg\";\nimport { resolveTimelineTheme, cssCustomProperties, type ResolvedTheme, type TimelineTokens } from \"../../core/theme\";\nimport { parseTimeline } from \"./parser\";\nimport { layoutTimeline } from \"./layout\";\nimport type {\n TimelineCardLayout,\n TimelineEventLayout,\n TimelineLayoutResult,\n TimelinePinLayout,\n} from \"./types\";\n\ntype Theme = ResolvedTheme<TimelineTokens>;\n\nconst ERA_BAND_HEIGHT = 16;\nconst ERA_ROW_GAP = 2;\n\nexport function renderTimeline(src: string, config?: RenderConfig): string {\n const ast = parseTimeline(src);\n const layout = layoutTimeline(ast);\n const theme = resolveTimelineTheme(config?.theme ?? \"default\");\n\n const styleBlock = styleForTheme(theme, config?.fontFamily);\n\n const children: string[] = [\n titleEl(ast.title ? `Timeline — ${ast.title}` : \"Timeline\"),\n descEl(\"Schematex timeline diagram\"),\n defs([`<style>${styleBlock}</style>`]),\n ];\n\n if (ast.title) {\n children.push(\n textEl(\n { x: layout.width / 2, y: 26, \"text-anchor\": \"middle\", class: \"st-title\" },\n ast.title,\n ),\n );\n }\n\n children.push(renderEras(layout, theme));\n\n switch (layout.style) {\n case \"gantt\":\n children.push(renderGantt(layout, theme));\n break;\n case \"lollipop\":\n children.push(renderLollipop(layout, theme));\n break;\n case \"swimlane\":\n default:\n children.push(renderSwimlane(layout, theme));\n break;\n }\n\n children.push(renderAxis(layout));\n\n return svgRoot(\n {\n viewBox: `0 0 ${layout.width} ${layout.height}`,\n width: layout.width,\n height: layout.height,\n class: `st-timeline st-timeline-${layout.style}`,\n \"data-diagram-type\": \"timeline\",\n \"data-style\": layout.style,\n role: \"graphics-document\",\n },\n children,\n );\n}\n\n// ─── Styles ───────────────────────────────────────────────\n\nfunction styleForTheme(theme: Theme, fontFamily?: string): string {\n const font = fontFamily ?? \"system-ui, -apple-system, sans-serif\";\n return `\n .st-timeline { ${cssCustomProperties(theme)}\n --st-axis: ${theme.axis};\n --st-axis-label: ${theme.axisLabel};\n --st-era-label: ${theme.eraLabel};\n --st-lane-stripe: ${theme.laneStripe};\n --st-marker-ring: ${theme.markerRing};\n --st-marker-fill: ${theme.markerFill};\n --st-milestone-fill: ${theme.milestoneFill};\n --st-pin-shaft: ${theme.pinShaft};\n --st-card-bg: ${theme.cardBg};\n --st-card-stroke: ${theme.cardStroke};\n --st-card-text: ${theme.cardText};\n --st-legend-bg: ${theme.legendBg};\n --st-legend-stroke: ${theme.legendStroke};\n font-family: ${font}; }\n .st-title { font-size: 16px; font-weight: 600; fill: var(--schematex-text); }\n .st-axis-line { stroke: var(--st-axis); stroke-width: 1.5; fill: none; }\n .st-axis-tick { stroke: var(--st-axis); stroke-width: 1; opacity: 0.55; }\n .st-axis-label { font-size: 11px; fill: var(--st-axis-label); }\n .st-era-rect { opacity: ${theme.eraOpacity}; }\n .st-era-strip { opacity: ${theme.eraPlotOpacity}; }\n .st-era-label { font-size: 11px; font-weight: 500; fill: var(--st-era-label); }\n .st-event-dot { stroke: var(--st-marker-fill); stroke-width: 1.5; }\n .st-event-label { font-size: 12px; fill: var(--schematex-text); }\n .st-range-bar { opacity: 0.88; }\n .st-range-label { font-size: 11px; fill: #fff; font-weight: 500; }\n .st-milestone { stroke: var(--st-marker-fill); stroke-width: 2; }\n .st-milestone-label { font-size: 12px; fill: var(--schematex-text); font-weight: 600; }\n .st-track-label { font-size: 12px; font-weight: 600; fill: var(--schematex-text); }\n .st-lane-stripe { fill: var(--st-lane-stripe); opacity: ${theme.laneStripeOpacity}; }\n .st-callout-line { stroke: var(--st-axis); stroke-width: 0.8; stroke-dasharray: 2 2; opacity: 0.5; fill: none; }\n .st-callout-text { font-size: 10.5px; fill: var(--schematex-text-muted); }\n .st-label-leader { stroke: var(--st-axis); stroke-width: 0.75; opacity: 0.35; fill: none; }\n .st-icon { font-size: 14px; }\n /* Gantt */\n .st-pin-shaft { stroke: var(--st-pin-shaft); stroke-width: 1.25; stroke-dasharray: 3 2; fill: none; }\n .st-pin-label { font-size: 11.5px; fill: var(--schematex-text); font-weight: 500; }\n .st-pin-head { stroke: var(--st-marker-fill); stroke-width: 1.5; }\n .st-lane-label { font-size: 11px; fill: var(--schematex-text-muted); font-weight: 500; }\n .st-legend-box { fill: var(--st-legend-bg); stroke: var(--st-legend-stroke); stroke-width: 1; }\n .st-legend-title { font-size: 11px; font-weight: 600; fill: var(--schematex-text-muted); }\n .st-legend-label { font-size: 11px; fill: var(--schematex-text); }\n /* Lollipop */\n .st-card { fill: var(--st-card-bg); stroke: var(--st-card-stroke); stroke-width: 1; }\n .st-card-title { font-size: 12px; font-weight: 600; fill: var(--st-card-text); }\n .st-card-date { font-size: 10.5px; fill: var(--schematex-text-muted); }\n .st-card-icon { font-size: 16px; }\n .st-stem { stroke: var(--st-axis); stroke-width: 1.25; opacity: 0.55; fill: none; }\n .st-lp-marker-ring { stroke-width: 2.5; }\n .st-lp-marker-core { stroke: none; }\n `;\n}\n\n// ─── Shared sections ──────────────────────────────────────\n\nfunction renderEras(layout: TimelineLayoutResult, theme: Theme): string {\n if (!layout.eras.length) return \"\";\n const topBase = layout.title ? 54 : 40;\n const palette = theme.palette;\n // Find leftmost + rightmost eras per band row so we can extend their plot\n // strips to cover overhang (e.g. lollipop cards extending past plot edges).\n const leftmostOnRow = new Map<number, number>();\n const rightmostOnRow = new Map<number, number>();\n layout.eras.forEach((e, i) => {\n const l = leftmostOnRow.get(e.bandRow);\n if (l === undefined || e.x < layout.eras[l]!.x) leftmostOnRow.set(e.bandRow, i);\n const r = rightmostOnRow.get(e.bandRow);\n if (r === undefined || e.x + e.width > layout.eras[r]!.x + layout.eras[r]!.width) rightmostOnRow.set(e.bandRow, i);\n });\n const plotEnd = layout.plotX + layout.plotW;\n\n const items = layout.eras.map((e, i) => {\n const y = topBase + e.bandRow * (ERA_BAND_HEIGHT + ERA_ROW_GAP);\n const fill = e.era.color ?? palette[i % palette.length]!;\n const labelX = e.x + 6;\n // Plot strip extends to plot edges for the leftmost/rightmost era on its\n // band row — otherwise cards overhanging the first/last event sit on bare\n // background.\n const isLeftmost = leftmostOnRow.get(e.bandRow) === i;\n const isRightmost = rightmostOnRow.get(e.bandRow) === i;\n const stripX = isLeftmost ? Math.min(e.x, layout.plotX) : e.x;\n const stripEnd = isRightmost ? Math.max(e.x + e.width, plotEnd) : e.x + e.width;\n return [\n rect({\n x: e.x,\n y,\n width: e.width,\n height: ERA_BAND_HEIGHT,\n fill,\n class: \"st-era-rect\",\n \"data-era-id\": e.era.id,\n }),\n rect({\n x: stripX,\n y: layout.plotY,\n width: stripEnd - stripX,\n height: layout.plotH,\n fill,\n class: \"st-era-strip\",\n }),\n textEl(\n { x: labelX, y: y + 12, class: \"st-era-label\" },\n truncate(e.era.label, Math.max(4, Math.floor(e.width / 7))),\n ),\n ].join(\"\");\n });\n return group({ class: \"st-eras\" }, items);\n}\n\nfunction renderAxis(layout: TimelineLayoutResult): string {\n const ax = layout.axisY;\n const items: string[] = [\n line({ x1: layout.plotX, y1: ax, x2: layout.plotX + layout.plotW, y2: ax, class: \"st-axis-line\" }),\n ];\n for (const t of layout.ticks) {\n items.push(line({ x1: t.x, y1: ax, x2: t.x, y2: ax + 5, class: \"st-axis-tick\" }));\n items.push(textEl({ x: t.x, y: ax + 18, \"text-anchor\": \"middle\", class: \"st-axis-label\" }, t.label));\n }\n return group({ class: \"st-axis\" }, items);\n}\n\n// ─── Swimlane renderer ────────────────────────────────────\n\nfunction renderSwimlane(layout: TimelineLayoutResult, theme: Theme): string {\n const parts: string[] = [];\n parts.push(renderTrackLabels(layout));\n parts.push(renderLaneStripes(layout));\n parts.push(renderSwimlaneRanges(layout, theme));\n parts.push(renderSwimlanePoints(layout, theme));\n parts.push(renderLabels(layout));\n parts.push(renderNotes(layout));\n return parts.join(\"\");\n}\n\nfunction renderTrackLabels(layout: TimelineLayoutResult): string {\n const items = layout.lanes\n .filter(l => l.label)\n .map(l => textEl(\n { x: layout.plotX - 12, y: l.y + l.height / 2 + 4, \"text-anchor\": \"end\", class: \"st-track-label\" },\n l.label,\n ));\n return group({ class: \"st-track-labels\" }, items);\n}\n\nfunction renderLaneStripes(layout: TimelineLayoutResult): string {\n const items = layout.lanes.map((l, i) => {\n if (i % 2 !== 0) return \"\";\n return rect({\n x: layout.plotX,\n y: l.y,\n width: layout.plotW,\n height: l.height,\n class: \"st-lane-stripe\",\n });\n }).filter(Boolean);\n return group({ class: \"st-lanes\" }, items);\n}\n\nfunction renderSwimlaneRanges(layout: TimelineLayoutResult, theme: Theme): string {\n const items: string[] = [];\n // Map track id → palette index for stable color per lane.\n const trackOrder = layout.lanes.map(l => l.trackId);\n const palette = theme.categoryPalette;\n for (const ev of layout.events) {\n if (ev.event.kind !== \"range\") continue;\n const idx = trackOrder.indexOf(ev.event.trackId!);\n const fill = ev.event.color ?? palette[(idx < 0 ? 0 : idx) % palette.length]!;\n items.push(rect({\n x: ev.x,\n y: ev.y,\n width: ev.w ?? 4,\n height: ev.h,\n rx: 4,\n ry: 4,\n fill,\n class: \"st-range-bar\",\n \"data-event-id\": ev.event.id,\n }));\n const w = ev.w ?? 0;\n if (w >= 60) {\n items.push(textEl(\n { x: ev.labelX, y: ev.labelY, \"text-anchor\": \"middle\", class: \"st-range-label\" },\n truncate(ev.event.label, Math.floor(w / 6)),\n ));\n } else if (w > 0) {\n items.push(textEl(\n { x: ev.x + w + 4, y: ev.labelY, \"text-anchor\": \"start\", class: \"st-event-label\" },\n ev.event.label,\n ));\n }\n }\n return group({ class: \"st-ranges\" }, items);\n}\n\nfunction renderSwimlanePoints(layout: TimelineLayoutResult, theme: Theme): string {\n const items: string[] = [];\n for (const ev of layout.events) {\n if (ev.event.kind === \"range\") continue;\n const isMilestone = ev.event.kind === \"milestone\";\n const color = ev.event.color ?? (isMilestone ? theme.milestoneFill : theme.markerRing);\n const shape = ev.event.shape ?? (isMilestone ? \"star\" : \"circle\");\n items.push(renderMarker(ev, color, shape, isMilestone));\n }\n return group({ class: \"st-points\" }, items);\n}\n\nfunction renderMarker(\n ev: TimelineEventLayout,\n color: string,\n shape: \"circle\" | \"square\" | \"diamond\" | \"star\" | \"flag\",\n isMilestone: boolean,\n): string {\n const x = ev.x;\n const y = ev.y;\n const r = isMilestone ? 8 : 5;\n const klass = isMilestone ? \"st-milestone\" : \"st-event-dot\";\n switch (shape) {\n case \"square\":\n return rect({ x: x - r, y: y - r, width: r * 2, height: r * 2, fill: color, class: klass, \"data-event-id\": ev.event.id });\n case \"diamond\":\n return path({ d: `M ${x},${y - r} L ${x + r},${y} L ${x},${y + r} L ${x - r},${y} Z`, fill: color, class: klass, \"data-event-id\": ev.event.id });\n case \"star\":\n return path({ d: starPath(x, y, r + 2, (r + 2) / 2.5, 5), fill: color, class: klass, \"data-event-id\": ev.event.id });\n case \"flag\":\n return path({ d: `M ${x - r},${y + r} L ${x - r},${y - r - 4} L ${x + r + 4},${y - r - 1} L ${x - r},${y + 2}`, fill: color, class: klass, \"data-event-id\": ev.event.id });\n case \"circle\":\n default:\n return circle({ cx: x, cy: y, r, fill: color, class: klass, \"data-event-id\": ev.event.id });\n }\n}\n\nfunction renderLabels(layout: TimelineLayoutResult): string {\n const items: string[] = [];\n for (const ev of layout.events) {\n if (ev.event.kind === \"range\") continue;\n const cls = ev.event.kind === \"milestone\" ? \"st-milestone-label\" : \"st-event-label\";\n const text = ev.event.icon\n ? `${ev.event.icon} ${ev.event.label}`\n : ev.event.label;\n // Leader line when label was pushed far from marker by cascade.\n const dy = ev.labelY - ev.y;\n if (Math.abs(dy) > 22) {\n const y1 = dy < 0 ? ev.y - 6 : ev.y + 6;\n const y2 = dy < 0 ? ev.labelY + 3 : ev.labelY - 10;\n items.push(line({ x1: ev.x, y1, x2: ev.x, y2, class: \"st-label-leader\" }));\n }\n items.push(textEl(\n { x: ev.labelX, y: ev.labelY, \"text-anchor\": ev.labelAnchor, class: cls },\n text,\n ));\n }\n return group({ class: \"st-labels\" }, items);\n}\n\nfunction renderNotes(layout: TimelineLayoutResult): string {\n const items: string[] = [];\n for (const ev of layout.events) {\n if (!ev.event.note) continue;\n const x = ev.x;\n const ny = (ev.noteY ?? ev.y + 18);\n const nx = (ev.noteX ?? x + 10);\n const wrapped = wrapText(ev.event.note, 46);\n items.push(path({ d: `M ${x} ${ev.y + 6} Q ${x + 4} ${ny - 4} ${nx} ${ny}`, class: \"st-callout-line\" }));\n wrapped.forEach((ln, i) => {\n items.push(textEl(\n { x: nx, y: ny + i * 13, class: \"st-callout-text\" },\n ln,\n ));\n });\n }\n return group({ class: \"st-notes\" }, items);\n}\n\n// ─── Gantt renderer ───────────────────────────────────────\n\nfunction renderGantt(layout: TimelineLayoutResult, theme: Theme): string {\n const parts: string[] = [];\n // Lane stripes + labels\n parts.push(renderGanttLanes(layout));\n // Task bars (range events)\n parts.push(renderGanttBars(layout, theme));\n // Pins (point/milestone events)\n parts.push(renderGanttPins(layout));\n // Legend\n if (layout.legend && layout.legend.length) {\n parts.push(renderLegend(layout));\n }\n return parts.join(\"\");\n}\n\nfunction renderGanttLanes(layout: TimelineLayoutResult): string {\n const items: string[] = [];\n layout.lanes.forEach((l, i) => {\n if (i % 2 === 0) {\n items.push(rect({\n x: layout.plotX,\n y: l.y,\n width: layout.plotW,\n height: l.height,\n class: \"st-lane-stripe\",\n }));\n }\n items.push(textEl({\n x: layout.plotX - 10,\n y: l.y + l.height / 2 + 4,\n \"text-anchor\": \"end\",\n class: \"st-lane-label\",\n }, l.label));\n });\n return group({ class: \"st-gantt-lanes\" }, items);\n}\n\nfunction renderGanttBars(layout: TimelineLayoutResult, theme: Theme): string {\n const items: string[] = [];\n const laneByCat = new Map(layout.lanes.map(l => [l.label, l]));\n const legendByLabel = new Map((layout.legend ?? []).map(l => [l.label, l.color]));\n for (const ev of layout.events) {\n if (ev.event.kind !== \"range\") continue;\n const cat = ev.event.category ?? layout.lanes[0]?.label ?? \"\";\n const color = ev.event.color ?? legendByLabel.get(cat) ?? theme.categoryPalette[0]!;\n const w = ev.w ?? 4;\n items.push(rect({\n x: ev.x,\n y: ev.y,\n width: w,\n height: ev.h,\n rx: 5,\n ry: 5,\n fill: color,\n class: \"st-range-bar\",\n \"data-event-id\": ev.event.id,\n \"data-category\": cat,\n }));\n if (w >= 60) {\n items.push(textEl(\n { x: ev.labelX, y: ev.labelY, \"text-anchor\": \"middle\", class: \"st-range-label\" },\n truncate(ev.event.label, Math.floor(w / 6)),\n ));\n } else if (w > 0) {\n const lane = laneByCat.get(cat);\n const ly = lane ? lane.y + lane.height / 2 + 4 : ev.labelY;\n items.push(textEl(\n { x: ev.x + w + 4, y: ly, \"text-anchor\": \"start\", class: \"st-event-label\" },\n ev.event.label,\n ));\n }\n }\n return group({ class: \"st-gantt-bars\" }, items);\n}\n\nfunction renderGanttPins(layout: TimelineLayoutResult): string {\n const pins = layout.pins ?? [];\n if (!pins.length) return \"\";\n const items: string[] = [];\n for (const p of pins) {\n items.push(renderPin(p));\n }\n return group({ class: \"st-gantt-pins\" }, items);\n}\n\nfunction renderPin(p: TimelinePinLayout): string {\n const isMilestone = p.event.kind === \"milestone\";\n const shaft = path({\n d: `M ${p.x} ${p.labelY + 2} L ${p.x} ${p.axisY - 4}`,\n class: \"st-pin-shaft\",\n });\n const head = isMilestone\n ? path({\n d: starPath(p.x, p.axisY - 6, 7, 3, 5),\n fill: p.color,\n class: \"st-pin-head\",\n \"data-event-id\": p.event.id,\n })\n : circle({\n cx: p.x,\n cy: p.axisY - 6,\n r: 5,\n fill: p.color,\n class: \"st-pin-head\",\n \"data-event-id\": p.event.id,\n });\n const txt = p.event.icon ? `${p.event.icon} ${p.event.label}` : p.event.label;\n const label = textEl(\n { x: p.x, y: p.labelY, \"text-anchor\": \"middle\", class: \"st-pin-label\" },\n txt,\n );\n return shaft + head + label;\n}\n\nfunction renderLegend(layout: TimelineLayoutResult): string {\n const legend = layout.legend ?? [];\n if (!legend.length) return \"\";\n const boxW = 130;\n const padding = 10;\n const rowH = 18;\n const h = padding * 2 + 18 + legend.length * rowH;\n const x = layout.width - boxW - 16;\n const y = layout.plotY;\n const items: string[] = [\n rect({ x, y, width: boxW, height: h, rx: 6, ry: 6, class: \"st-legend-box\" }),\n textEl({ x: x + padding, y: y + padding + 12, class: \"st-legend-title\" }, \"Teams\"),\n ];\n legend.forEach((it, i) => {\n const rowY = y + padding + 18 + i * rowH + 8;\n items.push(rect({ x: x + padding, y: rowY - 7, width: 12, height: 12, rx: 2, ry: 2, fill: it.color }));\n items.push(textEl({ x: x + padding + 20, y: rowY + 3, class: \"st-legend-label\" }, truncate(it.label, 14)));\n });\n return group({ class: \"st-legend\" }, items);\n}\n\n// ─── Lollipop renderer ────────────────────────────────────\n\nfunction renderLollipop(layout: TimelineLayoutResult, theme: Theme): string {\n const parts: string[] = [];\n // Ranges as thin bars on axis\n parts.push(renderLollipopRanges(layout, theme));\n // Cards + stems + markers\n parts.push(renderLollipopCards(layout, theme));\n return parts.join(\"\");\n}\n\nfunction renderLollipopRanges(layout: TimelineLayoutResult, theme: Theme): string {\n const items: string[] = [];\n for (const ev of layout.events) {\n if (ev.event.kind !== \"range\") continue;\n const color = ev.event.color ?? theme.categoryPalette[0]!;\n items.push(rect({\n x: ev.x,\n y: ev.y,\n width: ev.w ?? 4,\n height: ev.h,\n rx: 3,\n ry: 3,\n fill: color,\n class: \"st-range-bar\",\n \"data-event-id\": ev.event.id,\n }));\n }\n return group({ class: \"st-lp-ranges\" }, items);\n}\n\nfunction renderLollipopCards(layout: TimelineLayoutResult, theme: Theme): string {\n const cards = layout.cards ?? [];\n if (!cards.length) return \"\";\n const items: string[] = [];\n for (const c of cards) {\n items.push(renderLollipopCard(c, theme));\n }\n return group({ class: \"st-lp-cards\" }, items);\n}\n\nfunction renderLollipopCard(c: TimelineCardLayout, theme: Theme): string {\n const parts: string[] = [];\n // Stem\n parts.push(path({ d: `M ${c.x} ${c.stemY1} L ${c.x} ${c.stemY2}`, class: \"st-stem\" }));\n // Marker on axis — ring with core\n parts.push(circle({ cx: c.x, cy: c.axisY, r: 7, fill: theme.markerFill, stroke: c.color, class: \"st-lp-marker-ring\" }));\n parts.push(circle({ cx: c.x, cy: c.axisY, r: 3.2, fill: c.color, class: \"st-lp-marker-core\" }));\n // Card\n parts.push(rect({\n x: c.cardX,\n y: c.cardY,\n width: c.cardW,\n height: c.cardH,\n rx: 8,\n ry: 8,\n class: \"st-card\",\n }));\n // Left color stripe\n parts.push(rect({\n x: c.cardX,\n y: c.cardY,\n width: 4,\n height: c.cardH,\n rx: 2,\n ry: 2,\n fill: c.color,\n }));\n const padX = c.cardX + 14;\n const titleText = c.event.icon ? `${c.event.icon} ${c.event.label}` : c.event.label;\n parts.push(textEl(\n { x: padX, y: c.cardY + 22, class: \"st-card-title\" },\n truncate(titleText, 26),\n ));\n parts.push(textEl(\n { x: padX, y: c.cardY + 40, class: \"st-card-date\" },\n c.event.start.raw,\n ));\n return parts.join(\"\");\n}\n\n// ─── Utilities ────────────────────────────────────────────\n\nfunction truncate(s: string, maxChars: number): string {\n if (s.length <= maxChars) return s;\n if (maxChars < 4) return \"\";\n return s.slice(0, maxChars - 1) + \"…\";\n}\n\nfunction wrapText(s: string, max: number): string[] {\n const words = s.split(/\\s+/);\n const out: string[] = [];\n let cur = \"\";\n for (const w of words) {\n if ((cur + \" \" + w).trim().length > max) {\n if (cur) out.push(cur);\n cur = w;\n } else {\n cur = (cur ? cur + \" \" : \"\") + w;\n }\n }\n if (cur) out.push(cur);\n return out.slice(0, 4);\n}\n\nfunction starPath(cx: number, cy: number, rOuter: number, rInner: number, points: number): string {\n const step = Math.PI / points;\n let d = \"\";\n for (let i = 0; i < points * 2; i++) {\n const r = i % 2 === 0 ? rOuter : rInner;\n const a = i * step - Math.PI / 2;\n const x = cx + r * Math.cos(a);\n const y = cy + r * Math.sin(a);\n d += (i === 0 ? \"M\" : \"L\") + x.toFixed(2) + \",\" + y.toFixed(2) + \" \";\n }\n return d + \"Z\";\n}\n\nvoid escapeXml;\n","import type { DiagramPlugin, RenderConfig } from \"../../core/types\";\nimport { parseTimeline } from \"./parser\";\nimport { renderTimeline } from \"./renderer\";\n\nexport const timeline: DiagramPlugin = {\n type: \"timeline\" as DiagramPlugin[\"type\"],\n detect(text) {\n return /^\\s*timeline\\b/i.test(text);\n },\n parse: parseTimeline,\n render(text, config?: RenderConfig) {\n return renderTimeline(text, config);\n },\n};\n\nexport { parseTimeline, TimelineParseError } from \"./parser\";\nexport { layoutTimeline } from \"./layout\";\nexport { renderTimeline } from \"./renderer\";\nexport type * from \"./types\";\n","import type {\n PseudoStateKind,\n StateActivity,\n StateDiagramAST,\n StateDirection,\n StateNode,\n StateNote,\n StateTransition,\n} from \"./types\";\n\nexport class StateParseError extends Error {\n constructor(message: string, public line?: number) {\n super(line !== undefined ? `Line ${line}: ${message}` : message);\n this.name = \"StateParseError\";\n }\n}\n\ninterface RawLine {\n indent: number;\n text: string;\n line: number;\n}\n\nconst PSEUDO_KEYWORDS: Record<string, PseudoStateKind> = {\n initial: \"initial\",\n final: \"final\",\n choice: \"choice\",\n junction: \"junction\",\n fork: \"fork\",\n join: \"join\",\n history: \"history\",\n dhistory: \"dhistory\",\n terminate: \"terminate\",\n entry_point: \"entry_point\",\n exit_point: \"exit_point\",\n};\n\n// Mermaid-style stereotype keywords: state X <<choice>>\nconst MERMAID_STEREOTYPE: Record<string, PseudoStateKind> = {\n choice: \"choice\",\n fork: \"fork\",\n join: \"join\",\n end: \"final\",\n};\n\nfunction preprocess(src: string): RawLine[] {\n const out: RawLine[] = [];\n const lines = src.split(/\\r?\\n/);\n for (let i = 0; i < lines.length; i++) {\n const raw = lines[i];\n if (raw === undefined) continue;\n const trimmed = raw.trim();\n if (!trimmed) continue;\n // Comment forms: # // and Mermaid's %%\n if (trimmed.startsWith(\"#\") || trimmed.startsWith(\"//\") || trimmed.startsWith(\"%%\")) continue;\n const indent = raw.length - raw.replace(/^\\s+/, \"\").length;\n out.push({ indent, text: trimmed, line: i + 1 });\n }\n return out;\n}\n\nfunction unquote(s: string): string {\n if (s.length >= 2 && s.startsWith('\"') && s.endsWith('\"')) {\n return s.slice(1, -1);\n }\n return s;\n}\n\nfunction parseProps(s: string): Record<string, string> {\n // [direction: LR, style: uml]\n const out: Record<string, string> = {};\n const inner = s.replace(/^\\[/, \"\").replace(/\\]$/, \"\");\n if (!inner.trim()) return out;\n for (const part of inner.split(\",\")) {\n const idx = part.indexOf(\":\");\n if (idx < 0) continue;\n out[part.slice(0, idx).trim()] = unquote(part.slice(idx + 1).trim());\n }\n return out;\n}\n\nfunction parseTransitionLabel(label: string): {\n trigger?: string;\n guard?: string;\n action?: string;\n} {\n const out: { trigger?: string; guard?: string; action?: string } = {};\n let rest = label.trim();\n if (!rest) return out;\n\n let depth = 0;\n let slashIdx = -1;\n for (let i = 0; i < rest.length; i++) {\n const c = rest[i];\n if (c === \"[\") depth++;\n else if (c === \"]\") depth--;\n else if (c === \"/\" && depth === 0) {\n slashIdx = i;\n break;\n }\n }\n if (slashIdx >= 0) {\n out.action = rest.slice(slashIdx + 1).trim();\n rest = rest.slice(0, slashIdx).trim();\n }\n\n const gMatch = rest.match(/^(?<trig>[^[]*?)\\s*\\[(?<guard>[^\\]]*)\\]\\s*$/);\n if (gMatch?.groups) {\n out.guard = gMatch.groups.guard.trim();\n const trig = gMatch.groups.trig.trim();\n if (trig) out.trigger = trig;\n } else if (rest.length) {\n out.trigger = rest;\n }\n return out;\n}\n\nfunction parseActivityLine(text: string): StateActivity | undefined {\n const match = text.match(/^(entry|exit|do)\\s*\\/\\s*(.*)$/);\n if (match) {\n return { kind: match[1] as \"entry\" | \"exit\" | \"do\", action: match[2].trim() };\n }\n const parsed = parseTransitionLabel(text);\n if (!parsed.trigger && !parsed.guard && !parsed.action) return undefined;\n return {\n kind: \"internal\",\n trigger: parsed.trigger,\n guard: parsed.guard,\n action: parsed.action,\n };\n}\n\ninterface ParseContext {\n states: StateNode[];\n transitions: StateTransition[];\n notes: StateNote[];\n pseudoCounter: number;\n noteCounter: number;\n transCounter: number;\n byId: Map<string, StateNode>;\n initialAlias?: string;\n finalAlias?: string;\n}\n\nfunction newPseudoId(ctx: ParseContext, kind: PseudoStateKind): string {\n ctx.pseudoCounter += 1;\n return `__${kind}_${ctx.pseudoCounter}`;\n}\n\nfunction ensureInitialAlias(ctx: ParseContext, parent?: StateNode): StateNode {\n if (!parent) {\n if (ctx.initialAlias) {\n const existing = ctx.byId.get(ctx.initialAlias);\n if (existing) return existing;\n }\n const node: StateNode = {\n id: newPseudoId(ctx, \"initial\"),\n label: \"\",\n kind: \"pseudo\",\n pseudoKind: \"initial\",\n activities: [],\n children: [],\n };\n ctx.initialAlias = node.id;\n ctx.byId.set(node.id, node);\n ctx.states.push(node);\n return node;\n }\n for (const child of parent.children) {\n if (child.id.startsWith(\"__initial_\") && child.label === \"\") return child;\n }\n const node: StateNode = {\n id: newPseudoId(ctx, \"initial\"),\n label: \"\",\n kind: \"pseudo\",\n pseudoKind: \"initial\",\n activities: [],\n children: [],\n parent: parent.id,\n };\n ctx.byId.set(node.id, node);\n parent.children.push(node);\n return node;\n}\n\nfunction ensureFinalAlias(ctx: ParseContext, parent?: StateNode): StateNode {\n if (!parent) {\n if (ctx.finalAlias) {\n const existing = ctx.byId.get(ctx.finalAlias);\n if (existing) return existing;\n }\n const node: StateNode = {\n id: newPseudoId(ctx, \"final\"),\n label: \"\",\n kind: \"pseudo\",\n pseudoKind: \"final\",\n activities: [],\n children: [],\n };\n ctx.finalAlias = node.id;\n ctx.byId.set(node.id, node);\n ctx.states.push(node);\n return node;\n }\n for (const child of parent.children) {\n if (child.id.startsWith(\"__final_\") && child.label === \"\") return child;\n }\n const node: StateNode = {\n id: newPseudoId(ctx, \"final\"),\n label: \"\",\n kind: \"pseudo\",\n pseudoKind: \"final\",\n activities: [],\n children: [],\n parent: parent.id,\n };\n ctx.byId.set(node.id, node);\n parent.children.push(node);\n return node;\n}\n\nfunction ensureSimpleState(\n ctx: ParseContext,\n id: string,\n parent?: StateNode\n): StateNode {\n const existing = ctx.byId.get(id);\n if (existing) return existing;\n const node: StateNode = {\n id,\n label: id,\n kind: \"simple\",\n activities: [],\n children: [],\n parent: parent?.id,\n };\n ctx.byId.set(id, node);\n if (parent) parent.children.push(node);\n else ctx.states.push(node);\n return node;\n}\n\nfunction isIdent(tok: string): boolean {\n return /^[A-Za-z_][A-Za-z0-9_]*$/.test(tok);\n}\n\n/**\n * Parse a state-diagram DSL.\n *\n * Accepts both the native Schematex syntax and the full Mermaid `stateDiagram-v2`\n * vocabulary as a strict superset:\n * - `[*]` for initial / final (direction-resolved)\n * - `state \"Long name\" as ID`\n * - `Foo: description` to label an existing/new state\n * - `state X <<choice>>` / `<<fork>>` / `<<join>>` / `<<end>>` stereotypes\n * - `note right of X` ... `end note` / `note right of X : single-line text`\n * - `--` (Mermaid) and `---` (Schematex) separators inside composites\n * - `%%`, `#`, `//` comments\n *\n * Composite blocks use `composite ID { ... }` (Schematex) or `state ID { ... }`\n * (Mermaid). Default direction is TB to match Mermaid's default — override\n * with `direction LR` (top-level statement) or `[direction: LR]` (header attrs).\n */\nexport function parseStateDiagram(src: string): StateDiagramAST {\n const lines = preprocess(src);\n if (lines.length === 0) {\n throw new StateParseError(\"Empty document\");\n }\n\n // Header: must start with `state` or `stateDiagram` (Mermaid-compat) or `stateDiagram-v2`.\n const header = lines[0]!;\n const headerTok = header.text.match(/^(stateDiagram-v2|stateDiagram|state)\\b/i);\n if (!headerTok) {\n throw new StateParseError(\n `Expected 'state' or 'stateDiagram' header, got '${header.text}'`,\n header.line\n );\n }\n\n let title: string | undefined;\n let direction: StateDirection = \"TB\";\n\n const headerRest = header.text.slice(headerTok[0].length).trim();\n // Parse optional `direction LR` on the header line itself (Mermaid permits this on a separate line too)\n const propsMatch = headerRest.match(/\\[[^\\]]*\\]\\s*$/);\n let beforeProps = headerRest;\n if (propsMatch) {\n const props = parseProps(propsMatch[0]);\n if (props.direction === \"TB\" || props.direction === \"LR\") direction = props.direction;\n beforeProps = headerRest.slice(0, propsMatch.index).trim();\n }\n if (beforeProps.startsWith('\"')) title = unquote(beforeProps);\n else if (beforeProps.length > 0) title = beforeProps;\n\n const ctx: ParseContext = {\n states: [],\n transitions: [],\n notes: [],\n pseudoCounter: 0,\n noteCounter: 0,\n transCounter: 0,\n byId: new Map(),\n };\n\n // Composite-stack: each entry is the current parent. Empty = root.\n const compositeStack: Array<{\n parent?: StateNode;\n regionMode: boolean;\n }> = [{ parent: undefined, regionMode: false }];\n\n let i = 1;\n while (i < lines.length) {\n const ln = lines[i]!;\n const text = ln.text;\n\n const ctxTop = compositeStack[compositeStack.length - 1]!;\n const parent = ctxTop.parent;\n\n // Closing `}`\n if (text === \"}\") {\n if (compositeStack.length <= 1) {\n throw new StateParseError(\"Unexpected '}'\", ln.line);\n }\n compositeStack.pop();\n i++;\n continue;\n }\n\n // Region separator `---` (Schematex) or `--` (Mermaid)\n if (text === \"---\" || text === \"--\") {\n if (!parent) {\n throw new StateParseError(\n \"Region separator only allowed inside a composite\",\n ln.line\n );\n }\n ctxTop.regionMode = true;\n if (!parent.regions) parent.regions = [];\n const lastIdx = parent.regions.reduce((s, r) => s + r.length, 0);\n const slice = parent.children.slice(lastIdx);\n parent.regions.push(slice);\n i++;\n continue;\n }\n\n // Top-level `direction LR` directive (Mermaid)\n const dirMatch = text.match(/^direction\\s+(TB|BT|LR|RL)\\s*$/);\n if (dirMatch) {\n const d = dirMatch[1] as \"TB\" | \"BT\" | \"LR\" | \"RL\";\n direction = d === \"BT\" ? \"TB\" : d === \"RL\" ? \"LR\" : (d as StateDirection);\n i++;\n continue;\n }\n\n // ── Composite definition: composite IDENT { OR state IDENT { (Mermaid) ──\n const compMatch = text.match(/^(?:composite|state)\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*\\{?\\s*$/);\n const isCompositeWithBrace = compMatch && text.endsWith(\"{\");\n if (isCompositeWithBrace) {\n const id = compMatch![1];\n const node = ensureSimpleState(ctx, id, parent);\n node.kind = \"composite\";\n compositeStack.push({ parent: node, regionMode: false });\n i++;\n continue;\n }\n\n // ── Mermaid alias: `state \"Long name\" as ID` ──\n const aliasMatch = text.match(/^state\\s+\"([^\"]*)\"\\s+as\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*$/);\n if (aliasMatch) {\n const node = ensureSimpleState(ctx, aliasMatch[2], parent);\n node.label = aliasMatch[1];\n i++;\n continue;\n }\n\n // ── Mermaid stereotype: `state ID <<choice>>` / `<<fork>>` / `<<join>>` / `<<end>>` ──\n const stereoMatch = text.match(/^state\\s+([A-Za-z_][A-Za-z0-9_]*)\\s+<<\\s*(choice|fork|join|end)\\s*>>\\s*$/);\n if (stereoMatch) {\n const id = stereoMatch[1];\n const kind = MERMAID_STEREOTYPE[stereoMatch[2]];\n const node: StateNode = {\n id,\n label: \"\",\n kind: \"pseudo\",\n pseudoKind: kind,\n activities: [],\n children: [],\n parent: parent?.id,\n };\n ctx.byId.set(id, node);\n if (parent) parent.children.push(node);\n else ctx.states.push(node);\n i++;\n continue;\n }\n\n // ── `state ID : description` (Mermaid declares + labels) ──\n const stateLabelMatch = text.match(/^state\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*:\\s*(.+)$/);\n if (stateLabelMatch) {\n const node = ensureSimpleState(ctx, stateLabelMatch[1], parent);\n node.label = unquote(stateLabelMatch[2].trim());\n i++;\n continue;\n }\n\n // ── Schematex pseudo-state declaration: initial X / fork F / etc. ──\n const pseudoMatch = text.match(\n /^(initial|final|choice|junction|fork|join|history|dhistory|terminate|entry_point|exit_point)\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*$/\n );\n if (pseudoMatch) {\n const kindKw = pseudoMatch[1];\n const id = pseudoMatch[2];\n const pkind = PSEUDO_KEYWORDS[kindKw];\n const node: StateNode = {\n id,\n label: \"\",\n kind: \"pseudo\",\n pseudoKind: pkind,\n activities: [],\n children: [],\n parent: parent?.id,\n };\n ctx.byId.set(id, node);\n if (parent) parent.children.push(node);\n else ctx.states.push(node);\n i++;\n continue;\n }\n\n // ── Activities inside composite ──\n if (parent) {\n const activity = parseActivityLine(text);\n if (activity && (activity.kind === \"entry\" || activity.kind === \"exit\" || activity.kind === \"do\")) {\n parent.activities.push(activity);\n i++;\n continue;\n }\n }\n\n // ── Notes ──\n // Single-line: `note right_of X : text` / `note right of X : text`\n const noteSimple = text.match(\n /^note\\s+(left[_ ]of|right[_ ]of)\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*:\\s*(.*)$/\n );\n if (noteSimple) {\n const side = noteSimple[1].startsWith(\"left\") ? \"left\" : \"right\";\n const target = noteSimple[2];\n ctx.noteCounter += 1;\n ctx.notes.push({\n id: `__note_${ctx.noteCounter}`,\n target,\n side,\n text: noteSimple[3].trim(),\n });\n i++;\n continue;\n }\n // Block forms:\n // Schematex: note X { ... } or note left_of X { ... }\n // Mermaid: note right of X \\n ... \\n end note\n const noteBlockMermaid = text.match(\n /^note\\s+(left[_ ]of|right[_ ]of)\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*$/\n );\n if (noteBlockMermaid) {\n const side = noteBlockMermaid[1].startsWith(\"left\") ? \"left\" : \"right\";\n const target = noteBlockMermaid[2];\n const buf: string[] = [];\n i++;\n while (i < lines.length) {\n const t = lines[i]!.text;\n if (t === \"end note\" || t === \"}\") break;\n buf.push(t);\n i++;\n }\n if (i >= lines.length) {\n throw new StateParseError(\"Unterminated note block\", ln.line);\n }\n i++; // consume end note / }\n ctx.noteCounter += 1;\n ctx.notes.push({\n id: `__note_${ctx.noteCounter}`,\n target,\n side,\n text: buf.join(\"\\n\"),\n });\n continue;\n }\n const noteBlockSchematex = text.match(\n /^note\\s+(left[_ ]of\\s+|right[_ ]of\\s+)?([A-Za-z_][A-Za-z0-9_]*)\\s*\\{\\s*$/\n );\n if (noteBlockSchematex) {\n const side = noteBlockSchematex[1]?.startsWith(\"left\") ? \"left\" : \"right\";\n const target = noteBlockSchematex[2];\n const buf: string[] = [];\n i++;\n while (i < lines.length && lines[i]!.text !== \"}\") {\n buf.push(lines[i]!.text);\n i++;\n }\n if (i >= lines.length) {\n throw new StateParseError(\"Unterminated note block\", ln.line);\n }\n i++;\n ctx.noteCounter += 1;\n ctx.notes.push({\n id: `__note_${ctx.noteCounter}`,\n target,\n side,\n text: buf.join(\"\\n\"),\n });\n continue;\n }\n\n // ── Transition: A -> B [: label] OR Mermaid `A --> B [: label]` ──\n const transMatch = text.match(\n /^(\\[\\*\\]|[A-Za-z_][A-Za-z0-9_]*)\\s*-+>\\s*(\\[\\*\\]|[A-Za-z_][A-Za-z0-9_]*)\\s*(?::\\s*(.*))?$/\n );\n if (transMatch) {\n const fromTok = transMatch[1];\n const toTok = transMatch[2];\n const labelRaw = transMatch[3];\n\n const resolveTok = (\n tok: string,\n position: \"from\" | \"to\"\n ): string => {\n if (tok === \"[*]\") {\n if (position === \"from\") return ensureInitialAlias(ctx, parent).id;\n return ensureFinalAlias(ctx, parent).id;\n }\n return ensureSimpleState(ctx, tok, parent).id;\n };\n\n const fromId = resolveTok(fromTok, \"from\");\n const toId = resolveTok(toTok, \"to\");\n\n ctx.transCounter += 1;\n const tid = `t${ctx.transCounter}`;\n const parsedLabel = labelRaw ? parseTransitionLabel(labelRaw) : {};\n ctx.transitions.push({\n id: tid,\n from: fromId,\n to: toId,\n trigger: parsedLabel.trigger,\n guard: parsedLabel.guard,\n action: parsedLabel.action,\n });\n i++;\n continue;\n }\n\n // ── Mermaid `Foo: description` to label an existing/new state ──\n const labelOnlyMatch = text.match(/^([A-Za-z_][A-Za-z0-9_]*)\\s*:\\s*(.+)$/);\n if (labelOnlyMatch && isIdent(labelOnlyMatch[1])) {\n const node = ensureSimpleState(ctx, labelOnlyMatch[1], parent);\n node.label = unquote(labelOnlyMatch[2].trim());\n i++;\n continue;\n }\n\n // ── Bare state declaration: `IDENT` ──\n const bareIdent = text.match(/^([A-Za-z_][A-Za-z0-9_]*)\\s*$/);\n if (bareIdent) {\n ensureSimpleState(ctx, bareIdent[1], parent);\n i++;\n continue;\n }\n\n throw new StateParseError(`Unparseable line: ${text}`, ln.line);\n }\n\n if (compositeStack.length > 1) {\n throw new StateParseError(\"Unclosed composite block (expected '}')\");\n }\n\n function finalizeRegions(node: StateNode) {\n if (node.regions) {\n const consumed = node.regions.reduce((s, r) => s + r.length, 0);\n if (node.children.length > consumed) {\n node.regions.push(node.children.slice(consumed));\n }\n }\n for (const child of node.children) finalizeRegions(child);\n }\n for (const s of ctx.states) finalizeRegions(s);\n\n return {\n type: \"state\",\n title,\n direction,\n states: ctx.states,\n transitions: ctx.transitions,\n notes: ctx.notes,\n };\n}\n","/**\n * State diagram layout — converts the StateDiagramAST into a synthetic\n * FlowchartAST and runs the existing Sugiyama-style flowchart layout\n * (cycle removal → layering → crossing-min → BK x-coords → Manhattan\n * routing). The state-specific renderer then draws state symbols at\n * the layout-computed positions.\n *\n * This gives us — for free — the same layout quality as the flowchart\n * diagram: cycle handling for state machines (idle ⇄ running),\n * orthogonal edge routing that detours around node bboxes, and\n * subgraph-aware composite-state rendering.\n */\n\nimport { layoutFlowchart } from \"../flowchart/layout\";\nimport type {\n FlowchartAST,\n FlowchartDirection,\n FlowchartEdge,\n FlowchartNode,\n FlowchartShape,\n FlowchartSubgraph,\n} from \"../../core/types\";\nimport type {\n StateDiagramAST,\n StateLayoutCluster,\n StateLayoutEdge,\n StateLayoutNode,\n StateLayoutNote,\n StateLayoutResult,\n StateNode,\n StateTransition,\n} from \"./types\";\n\n// ── Pseudo-state symbol sizes (rendered geometry; layout reserves bbox) ──\nconst PSEUDO_BBOX = {\n initial: { w: 22, h: 22 },\n final: { w: 28, h: 28 },\n choice: { w: 32, h: 32 },\n junction: { w: 16, h: 16 },\n fork: { w: 100, h: 8 }, // horizontal bar — rotated for LR direction below\n join: { w: 100, h: 8 },\n history: { w: 26, h: 26 },\n dhistory: { w: 30, h: 30 },\n terminate: { w: 22, h: 22 },\n entry_point: { w: 18, h: 18 },\n exit_point: { w: 18, h: 18 },\n} as const;\n\nconst NOTE_W = 180;\nconst NOTE_LINE_H = 14;\n\n// ── State → Flowchart conversion ────────────────────────────\n\ninterface ConversionResult {\n ast: FlowchartAST;\n /** state-id → its size override (so we can later restore pseudo bboxes if needed) */\n pseudoSizes: Map<string, { w: number; h: number }>;\n}\n\nfunction shapeForState(node: StateNode): FlowchartShape {\n if (node.kind === \"simple\") return \"round\";\n if (node.kind === \"composite\") return \"round\"; // becomes a subgraph; not actually drawn as node\n // pseudo\n switch (node.pseudoKind) {\n case \"initial\":\n case \"final\":\n case \"junction\":\n case \"history\":\n case \"dhistory\":\n case \"terminate\":\n case \"entry_point\":\n case \"exit_point\":\n return \"circle\";\n case \"choice\":\n return \"diamond\";\n case \"fork\":\n case \"join\":\n return \"rect\";\n default:\n return \"round\";\n }\n}\n\nfunction buildLabel(t: StateTransition): string | undefined {\n const parts: string[] = [];\n if (t.trigger) parts.push(t.trigger);\n if (t.guard) parts.push(`[${t.guard}]`);\n let s = parts.join(\" \");\n if (t.action) s = s ? `${s} / ${t.action}` : `/ ${t.action}`;\n return s.trim() || undefined;\n}\n\nfunction convertToFlowchart(ast: StateDiagramAST): ConversionResult {\n const fcNodes: FlowchartNode[] = [];\n const fcSubgraphs: FlowchartSubgraph[] = [];\n const pseudoSizes = new Map<string, { w: number; h: number }>();\n // composite-id → preferred entry/exit node id (for edges that target a composite)\n const compositeEntryFor = new Map<string, string>();\n const compositeExitFor = new Map<string, string>();\n\n const visit = (s: StateNode, parentId?: string): void => {\n if (s.kind === \"composite\") {\n // Composite → subgraph. Pick a representative entry/exit child:\n // entry = a child `initial` pseudo-state, else first child\n // exit = a child `final` pseudo-state, else last child\n const childIds: string[] = [];\n const childSgIds: string[] = [];\n for (const child of s.children) {\n if (child.kind === \"composite\") childSgIds.push(child.id);\n else childIds.push(child.id);\n }\n let entryChild: string | undefined;\n let exitChild: string | undefined;\n for (const child of s.children) {\n if (child.kind === \"pseudo\" && child.pseudoKind === \"initial\" && !entryChild) {\n entryChild = child.id;\n }\n if (child.kind === \"pseudo\" && child.pseudoKind === \"final\") {\n exitChild = child.id;\n }\n }\n if (!entryChild) entryChild = s.children[0]?.id;\n if (!exitChild) exitChild = s.children[s.children.length - 1]?.id;\n if (entryChild) compositeEntryFor.set(s.id, entryChild);\n if (exitChild) compositeExitFor.set(s.id, exitChild);\n\n fcSubgraphs.push({\n id: s.id,\n label: s.label || s.id,\n direction: ast.direction,\n children: childIds,\n subgraphs: childSgIds,\n });\n for (const child of s.children) visit(child, s.id);\n return;\n }\n // Simple or pseudo\n const node: FlowchartNode = {\n id: s.id,\n label: labelForFlowchart(s),\n shape: shapeForState(s),\n parent: parentId,\n };\n fcNodes.push(node);\n if (s.kind === \"pseudo\" && s.pseudoKind) {\n pseudoSizes.set(s.id, { ...PSEUDO_BBOX[s.pseudoKind] });\n }\n };\n\n for (const s of ast.states) visit(s, undefined);\n\n // Redirect transitions whose endpoint is a composite to the composite's\n // representative entry/exit child. Without this, flowchart's\n // auto-implicit-node creation would render a phantom box for the composite\n // (since the composite became a subgraph, not a node).\n const fcEdges: FlowchartEdge[] = ast.transitions.map((t) => {\n let from = t.from;\n let to = t.to;\n const fromExit = compositeExitFor.get(t.from);\n if (fromExit) from = fromExit;\n const toEntry = compositeEntryFor.get(t.to);\n if (toEntry) to = toEntry;\n return {\n id: t.id,\n from,\n to,\n kind: \"solid\",\n label: buildLabel(t),\n };\n });\n\n const fc: FlowchartAST = {\n type: \"flowchart\",\n title: ast.title,\n direction: ast.direction === \"LR\" ? \"LR\" : (\"TB\" as FlowchartDirection),\n nodes: fcNodes,\n edges: fcEdges,\n subgraphs: fcSubgraphs,\n classDefs: [],\n linkStyles: new Map(),\n };\n return { ast: fc, pseudoSizes };\n}\n\n/**\n * Flowchart auto-derives node bbox from label. For pseudo-states we want a\n * fixed small symbol. Trick: pass a single-character placeholder label so\n * minNodeWidth (72) still applies to keep the layout's spacing reasonable;\n * the renderer ignores the bbox and draws the appropriate symbol centered.\n *\n * For simple states with no activities we use the actual label so the\n * rounded-rect width hugs the text.\n */\nfunction labelForFlowchart(s: StateNode): string {\n if (s.kind === \"pseudo\") return \"\"; // becomes 0-width; flowchart clamps to minNodeWidth\n // simple state — use label, augmented with activity hint so the box is tall enough\n if (s.activities.length === 0) return s.label || s.id;\n // Reserve vertical space by appending newline-equivalent (flowchart layout\n // doesn't currently wrap, so just use the longest activity for sizing).\n const activityWidth = s.activities\n .map((a) => activityText(a).length)\n .reduce((m, n) => Math.max(m, n), 0);\n const label = s.label || s.id;\n return label.length >= activityWidth ? label : \"x\".repeat(activityWidth);\n}\n\nfunction activityText(a: { kind: string; trigger?: string; guard?: string; action?: string }): string {\n if (a.kind === \"entry\" || a.kind === \"exit\" || a.kind === \"do\") {\n return `${a.kind} / ${a.action ?? \"\"}`;\n }\n const parts: string[] = [];\n if (a.trigger) parts.push(a.trigger);\n if (a.guard) parts.push(`[${a.guard}]`);\n let s = parts.join(\" \");\n if (a.action) s = s ? `${s} / ${a.action}` : `/ ${a.action}`;\n return s;\n}\n\n// ── Note placement (post-layout) ────────────────────────────\n\nfunction wrapNoteText(text: string, charsPerLine = 28): string[] {\n const out: string[] = [];\n for (const para of text.split(/\\n/)) {\n const words = para.split(/\\s+/);\n let cur = \"\";\n for (const w of words) {\n if (!cur) cur = w;\n else if (cur.length + w.length + 1 <= charsPerLine) cur += ` ${w}`;\n else {\n out.push(cur);\n cur = w;\n }\n }\n if (cur) out.push(cur);\n if (para === \"\") out.push(\"\");\n }\n return out.length ? out : [\"\"];\n}\n\n// ── Self-loop arc generation ────────────────────────────────\n\nfunction selfLoopPath(\n cx: number,\n cy: number,\n w: number,\n h: number\n): { path: string; labelX: number; labelY: number } {\n // Loop on the right side of the node — from (right-edge, +0.25h) curving up\n // and back to (top-edge, +0.25w). Renderer handles the arrow marker.\n const startX = cx + w / 2;\n const startY = cy - h * 0.15;\n const endX = cx + w * 0.15;\n const endY = cy - h / 2;\n const c1x = startX + 28;\n const c1y = startY - 12;\n const c2x = endX + 28;\n const c2y = endY - 28;\n const path = `M ${startX} ${startY} C ${c1x} ${c1y}, ${c2x} ${c2y}, ${endX} ${endY}`;\n return { path, labelX: startX + 28, labelY: startY - 18 };\n}\n\n// ── Public entry point ──────────────────────────────────────\n\nexport function layoutStateDiagram(ast: StateDiagramAST): StateLayoutResult {\n const { ast: fcAst, pseudoSizes } = convertToFlowchart(ast);\n\n // Self-loops would confuse Sugiyama's layering (re-visiting a node creates\n // back-edges that get reversed). Strip them before running flowchart layout\n // and re-add after as decorations on top of the placed node.\n const selfLoops: StateTransition[] = [];\n fcAst.edges = fcAst.edges.filter((e) => {\n if (e.from === e.to) {\n const t = ast.transitions.find((tr) => tr.id === e.id);\n if (t) selfLoops.push(t);\n return false;\n }\n return true;\n });\n\n const fcResult = layoutFlowchart(fcAst);\n\n // Build state-id → AST node map for quick lookup\n const stateById = new Map<string, StateNode>();\n const collectStates = (s: StateNode): void => {\n stateById.set(s.id, s);\n for (const c of s.children) collectStates(c);\n };\n for (const s of ast.states) collectStates(s);\n\n // Convert flowchart layout nodes → state layout nodes.\n // Pseudo-states get their bbox shrunk to PSEUDO_BBOX values, centered on the\n // flowchart placement (so spacing stays generous but the symbol is small).\n const stateNodes: StateLayoutNode[] = [];\n for (const fcNode of fcResult.nodes) {\n if (fcNode.isDummy) continue;\n const s = stateById.get(fcNode.node.id);\n if (!s) continue;\n if (s.kind === \"composite\") continue; // composite handled as cluster\n\n const cx = fcNode.x + fcNode.width / 2;\n const cy = fcNode.y + fcNode.height / 2;\n\n let w = fcNode.width;\n let h = fcNode.height;\n if (s.kind === \"pseudo\" && s.pseudoKind) {\n const ps = pseudoSizes.get(s.id);\n if (ps) {\n // For fork/join, orient bar perpendicular to flow direction.\n if ((s.pseudoKind === \"fork\" || s.pseudoKind === \"join\") && ast.direction === \"LR\") {\n w = 8;\n h = 100;\n } else {\n w = ps.w;\n h = ps.h;\n }\n }\n }\n\n stateNodes.push({\n id: s.id,\n x: cx - w / 2,\n y: cy - h / 2,\n width: w,\n height: h,\n cx,\n cy,\n layer: fcNode.layer,\n node: s,\n parent: s.parent,\n });\n }\n\n // Composite clusters\n const clusters: StateLayoutCluster[] = fcResult.clusters.map((c) => {\n const s = stateById.get(c.subgraph.id);\n if (!s) {\n return {\n id: c.subgraph.id,\n state: { id: c.subgraph.id, label: c.subgraph.label, kind: \"composite\", activities: [], children: [] },\n x: c.x,\n y: c.y,\n width: c.width,\n height: c.height,\n };\n }\n return {\n id: c.subgraph.id,\n state: s,\n x: c.x,\n y: c.y,\n width: c.width,\n height: c.height,\n };\n });\n\n // Edges from the flowchart layout (already routed orthogonally + label anchored)\n const stateById2 = new Map(stateNodes.map((n) => [n.id, n] as const));\n const stateEdges: StateLayoutEdge[] = [];\n for (const fcEdge of fcResult.edges) {\n const t = ast.transitions.find((tr) => tr.id === fcEdge.edge.id);\n if (!t) continue;\n // The flowchart layout routed the edge to the bbox edge of each endpoint.\n // For pseudo-state nodes the bbox is much bigger than the visible symbol\n // (e.g. an initial dot is r=8 inside an 80×80 bbox), leaving a visible\n // gap between the arrow and the symbol. Extend the path endpoints inward\n // so they land on the actual symbol's perimeter.\n let path = fcEdge.path;\n const sourceNode = stateById2.get(fcEdge.edge.from);\n const targetNode = stateById2.get(fcEdge.edge.to);\n if (sourceNode && sourceNode.node.kind === \"pseudo\") {\n path = trimPathStart(path, sourceNode.cx, sourceNode.cy, symbolRadius(sourceNode));\n }\n if (targetNode && targetNode.node.kind === \"pseudo\") {\n path = trimPathEnd(path, targetNode.cx, targetNode.cy, symbolRadius(targetNode));\n }\n stateEdges.push({\n id: t.id,\n from: t.from,\n to: t.to,\n path,\n label: buildLabel(t),\n labelX: fcEdge.labelAnchor?.x ?? 0,\n labelY: fcEdge.labelAnchor?.y ?? 0,\n labelAnchor: fcEdge.labelAnchor?.textAnchor ?? \"middle\",\n });\n }\n\n // Re-add self-loops as arcs on top of their host node.\n for (const sl of selfLoops) {\n const host = stateById2.get(sl.from);\n if (!host) continue;\n const { path, labelX, labelY } = selfLoopPath(host.cx, host.cy, host.width, host.height);\n stateEdges.push({\n id: sl.id,\n from: sl.from,\n to: sl.to,\n path,\n label: buildLabel(sl),\n labelX,\n labelY,\n labelAnchor: \"start\",\n selfLoop: true,\n });\n }\n\n // Notes\n const notes: StateLayoutNote[] = [];\n for (const note of ast.notes) {\n const target = stateById2.get(note.target);\n if (!target) continue;\n const lines = wrapNoteText(note.text);\n const w = NOTE_W;\n const h = lines.length * NOTE_LINE_H + 14;\n let x: number;\n let y: number;\n let leaderX1: number;\n let leaderX2: number;\n if (note.side === \"left\") {\n x = target.x - w - 24;\n y = target.cy - h / 2;\n leaderX1 = target.x;\n leaderX2 = x + w;\n } else {\n x = target.x + target.width + 24;\n y = target.cy - h / 2;\n leaderX1 = target.x + target.width;\n leaderX2 = x;\n }\n notes.push({\n note,\n x,\n y,\n width: w,\n height: h,\n lines,\n leader: { x1: leaderX1, y1: target.cy, x2: leaderX2, y2: y + h / 2 },\n });\n }\n\n // Compute final bounds — flowchart layout already includes padding; expand\n // for notes and self-loop arcs. If left-side notes push content off the\n // left edge (negative x), shift everything right.\n let maxX = fcResult.width;\n let maxY = fcResult.height;\n let minX = 0;\n for (const n of notes) {\n maxX = Math.max(maxX, n.x + n.width + 8);\n maxY = Math.max(maxY, n.y + n.height + 8);\n minX = Math.min(minX, n.x - 8);\n }\n if (minX < 0) {\n const dx = -minX;\n for (const n of stateNodes) {\n n.x += dx;\n n.cx += dx;\n }\n for (const c of clusters) {\n c.x += dx;\n }\n for (const e of stateEdges) {\n e.path = shiftPathX(e.path, dx);\n e.labelX += dx;\n }\n for (const n of notes) {\n n.x += dx;\n n.leader.x1 += dx;\n n.leader.x2 += dx;\n }\n maxX += dx;\n }\n for (const e of stateEdges) {\n if (!e.selfLoop) continue;\n maxX = Math.max(maxX, e.labelX + 60);\n maxY = Math.max(maxY, e.labelY + 60);\n }\n\n // Title bar reserves vertical space.\n const titleOffset = ast.title ? 28 : 0;\n if (titleOffset) {\n for (const n of stateNodes) {\n n.y += titleOffset;\n n.cy += titleOffset;\n }\n for (const c of clusters) {\n c.y += titleOffset;\n }\n for (const e of stateEdges) {\n e.path = shiftPathY(e.path, titleOffset);\n e.labelY += titleOffset;\n }\n for (const n of notes) {\n n.y += titleOffset;\n n.leader.y1 += titleOffset;\n n.leader.y2 += titleOffset;\n }\n maxY += titleOffset;\n }\n\n return {\n width: maxX,\n height: maxY,\n nodes: stateNodes,\n edges: stateEdges,\n clusters,\n notes,\n title: ast.title,\n direction: ast.direction,\n };\n}\n\n/**\n * Visible-symbol radius for a pseudo-state. Used to extend Manhattan path\n * endpoints from the layout's bbox edge inward to land on the actual\n * symbol perimeter (the bbox is much larger than the rendered symbol).\n *\n * The values mirror the geometry the renderer draws (renderer.ts).\n */\nfunction symbolRadius(node: StateLayoutNode): number {\n const k = node.node.pseudoKind;\n switch (k) {\n case \"initial\": return 8;\n case \"final\": return 11;\n case \"choice\": return 14;\n case \"junction\": return 6;\n case \"history\": return 12;\n case \"dhistory\": return 13;\n case \"terminate\": return 8;\n case \"entry_point\":\n case \"exit_point\": return 7;\n case \"fork\":\n case \"join\":\n // bar — handled separately (long axis is `width` for TB, `height` for LR)\n return Math.min(node.width, node.height) / 2;\n default: return Math.min(node.width, node.height) / 2;\n }\n}\n\ninterface PathPoint { x: number; y: number; }\n\nfunction parsePathPoints(d: string): PathPoint[] | null {\n // Only Manhattan paths with M / L commands are produced by the flowchart\n // routing; a single C-spline (self-loop) is handled separately.\n if (/[CSQTA]/.test(d)) return null;\n const tokens = d.match(/[ML]\\s+(-?\\d+(?:\\.\\d+)?)\\s+(-?\\d+(?:\\.\\d+)?)/g) ?? [];\n const out: PathPoint[] = [];\n for (const tok of tokens) {\n const m = tok.match(/[ML]\\s+(-?\\d+(?:\\.\\d+)?)\\s+(-?\\d+(?:\\.\\d+)?)/);\n if (!m) continue;\n out.push({ x: parseFloat(m[1]), y: parseFloat(m[2]) });\n }\n return out;\n}\n\nfunction pointsToPath(pts: PathPoint[]): string {\n if (pts.length === 0) return \"\";\n const head = `M ${pts[0]!.x} ${pts[0]!.y}`;\n const rest = pts.slice(1).map((p) => `L ${p.x} ${p.y}`).join(\" \");\n return rest ? `${head} ${rest}` : head;\n}\n\n/**\n * Replace the FIRST point of the path with one that sits on the symbol's\n * perimeter (radius `r` from (cx,cy)). For a Manhattan path the first\n * segment is axis-aligned, so we move the start point along that axis.\n */\nfunction trimPathStart(d: string, cx: number, cy: number, r: number): string {\n const pts = parsePathPoints(d);\n if (!pts || pts.length < 2) return d;\n const p0 = pts[0]!;\n const p1 = pts[1]!;\n const newP0 = projectOnPerimeter(p0, p1, cx, cy, r);\n pts[0] = newP0;\n return pointsToPath(pts);\n}\n\nfunction trimPathEnd(d: string, cx: number, cy: number, r: number): string {\n const pts = parsePathPoints(d);\n if (!pts || pts.length < 2) return d;\n const last = pts[pts.length - 1]!;\n const prev = pts[pts.length - 2]!;\n const newLast = projectOnPerimeter(last, prev, cx, cy, r);\n pts[pts.length - 1] = newLast;\n return pointsToPath(pts);\n}\n\n/**\n * Given an axis-aligned segment (p_endpoint, p_neighbor) where p_endpoint sits\n * on the bbox edge of a node centered at (cx,cy), return a new endpoint that\n * sits at distance r from (cx,cy) along the same axis.\n */\nfunction projectOnPerimeter(\n endpoint: PathPoint,\n neighbor: PathPoint,\n cx: number,\n cy: number,\n r: number\n): PathPoint {\n const dx = endpoint.x - neighbor.x;\n const dy = endpoint.y - neighbor.y;\n if (Math.abs(dx) > Math.abs(dy)) {\n // horizontal segment — adjust x\n const sign = dx >= 0 ? 1 : -1;\n return { x: cx - sign * r, y: cy };\n }\n // vertical segment — adjust y\n const sign = dy >= 0 ? 1 : -1;\n return { x: cx, y: cy - sign * r };\n}\n\nfunction shiftPathX(d: string, dx: number): string {\n return d.replace(/([MLCQ])\\s*((?:-?\\d+(?:\\.\\d+)?\\s+){1,5}-?\\d+(?:\\.\\d+)?)/g, (_, cmd, args) => {\n const nums = args.trim().split(/\\s+/).map(Number);\n const out: number[] = [];\n for (let i = 0; i < nums.length; i++) {\n out.push(i % 2 === 0 ? nums[i] + dx : nums[i]);\n }\n return `${cmd} ${out.join(\" \")}`;\n });\n}\n\nfunction shiftPathY(d: string, dy: number): string {\n // Shift every (x y) coordinate pair in the path. Path format is the\n // flowchart routing's \"M x y L x y L ...\" with simple commands.\n return d.replace(/([MLCQ])\\s*((?:-?\\d+(?:\\.\\d+)?\\s+){1,5}-?\\d+(?:\\.\\d+)?)/g, (_, cmd, args) => {\n const nums = args.trim().split(/\\s+/).map(Number);\n const out: number[] = [];\n for (let i = 0; i < nums.length; i++) {\n // Every odd index is a Y coordinate (commands operate on x,y pairs).\n out.push(i % 2 === 1 ? nums[i] + dy : nums[i]);\n }\n return `${cmd} ${out.join(\" \")}`;\n });\n}\n","import { circle, defs, el, escapeXml, group, line, path, polygon, rect, svgRoot, text } from \"../../core/svg\";\nimport type { RenderConfig } from \"../../core/types\";\nimport { layoutStateDiagram } from \"./layout\";\nimport { parseStateDiagram } from \"./parser\";\nimport type {\n StateActivity,\n StateDiagramAST,\n StateLayoutCluster,\n StateLayoutEdge,\n StateLayoutNode,\n StateLayoutNote,\n StateLayoutResult,\n} from \"./types\";\n\nconst ARROW_MARKER_ID = \"lt-state-arrow\";\n\nconst STYLE = `\n.lt-state-body { fill: #ffffff; stroke: #2a2a2a; stroke-width: 1.6; }\n.lt-state-name { font: 600 12px system-ui, sans-serif; fill: #1a1a1a; }\n.lt-state-div { stroke: #2a2a2a; stroke-width: 1; }\n.lt-state-activity { font: 11px ui-monospace, monospace; fill: #444; }\n\n.lt-composite-body { fill: #fafafa; stroke: #2a2a2a; stroke-width: 1.6; }\n.lt-composite-title { font: 600 12px system-ui, sans-serif; fill: #1a1a1a; }\n.lt-composite-titlebar { fill: #f0f0f0; stroke: #2a2a2a; stroke-width: 1; }\n.lt-region-div { stroke: #888; stroke-width: 1; stroke-dasharray: 6 4; }\n\n.lt-ps-initial { fill: #1a1a1a; }\n.lt-ps-final-outer { fill: #ffffff; stroke: #1a1a1a; stroke-width: 1.6; }\n.lt-ps-final-inner { fill: #1a1a1a; }\n.lt-ps-choice { fill: #ffffff; stroke: #1a1a1a; stroke-width: 1.6; }\n.lt-ps-junction { fill: #1a1a1a; }\n.lt-ps-bar { fill: #1a1a1a; }\n.lt-ps-history-body { fill: #ffffff; stroke: #1a1a1a; stroke-width: 1.6; }\n.lt-ps-history-text { font: 600 11px serif; fill: #1a1a1a; }\n.lt-ps-terminate { stroke: #1a1a1a; stroke-width: 2; }\n.lt-ps-entrypoint { fill: #ffffff; stroke: #1a1a1a; stroke-width: 1.6; }\n.lt-ps-exitpoint { fill: #ffffff; stroke: #1a1a1a; stroke-width: 1.6; }\n\n.lt-transition { stroke: #2a2a2a; stroke-width: 1.4; fill: none; }\n.lt-transition-label { font: 11px system-ui, sans-serif; fill: #1a1a1a; }\n.lt-transition-label-bg { fill: #ffffff; opacity: 0.92; }\n\n.lt-note-body { fill: #fff8c5; stroke: #b79400; stroke-width: 1; }\n.lt-note-text { font: 11px system-ui, sans-serif; fill: #2a2a2a; }\n.lt-note-leader { stroke: #b79400; stroke-width: 1; stroke-dasharray: 3 3; fill: none; }\n\n.lt-title { font: 600 14px system-ui, sans-serif; fill: #1a1a1a; }\n`;\n\nfunction renderArrowMarker(): string {\n return el(\n \"marker\",\n {\n id: ARROW_MARKER_ID,\n markerWidth: 10,\n markerHeight: 10,\n refX: 9,\n refY: 3,\n orient: \"auto\",\n markerUnits: \"strokeWidth\",\n },\n [polygon({ points: \"0,0 10,3 0,6\", fill: \"#2a2a2a\" })]\n );\n}\n\n// ── Activity rendering helper ───────────────────────────────\n\nfunction activityText(a: StateActivity): string {\n if (a.kind === \"entry\" || a.kind === \"exit\" || a.kind === \"do\") {\n return `${a.kind} / ${a.action ?? \"\"}`;\n }\n const parts: string[] = [];\n if (a.trigger) parts.push(a.trigger);\n if (a.guard) parts.push(`[${a.guard}]`);\n let s = parts.join(\" \");\n if (a.action) s = s ? `${s} / ${a.action}` : `/ ${a.action}`;\n return s;\n}\n\n// ── Simple state ────────────────────────────────────────────\n\nfunction renderSimple(node: StateLayoutNode): string {\n const { x, y, width, height } = node;\n const children: string[] = [\n rect({ x, y, width, height, rx: 8, ry: 8, class: \"lt-state-body\" }),\n ];\n const label = node.node.label || node.id;\n\n if (node.node.activities.length === 0) {\n children.push(\n text(\n { x: x + width / 2, y: y + height / 2 + 4, \"text-anchor\": \"middle\", class: \"lt-state-name\" },\n label\n )\n );\n } else {\n children.push(\n text(\n { x: x + width / 2, y: y + 16, \"text-anchor\": \"middle\", class: \"lt-state-name\" },\n label\n )\n );\n children.push(\n line({ x1: x, y1: y + 22, x2: x + width, y2: y + 22, class: \"lt-state-div\" })\n );\n let cy = y + 36;\n for (const a of node.node.activities) {\n children.push(text({ x: x + 8, y: cy, class: \"lt-state-activity\" }, activityText(a)));\n cy += 14;\n }\n }\n return group({ class: \"lt-state lt-simple\", \"data-id\": node.id }, children);\n}\n\n// ── Composite cluster ───────────────────────────────────────\n\nfunction renderComposite(c: StateLayoutCluster): string {\n const { x, y, width, height } = c;\n const titleBarH = 22;\n const acts = c.state.activities;\n const actsH = acts.length ? acts.length * 14 + 6 : 0;\n\n const parts: string[] = [\n rect({ x, y, width, height, rx: 10, ry: 10, class: \"lt-composite-body\" }),\n // Title bar background — only the top strip\n path({\n d: `M ${x + 1} ${y + titleBarH} L ${x + width - 1} ${y + titleBarH}`,\n class: \"lt-state-div\",\n }),\n text(\n { x: x + 12, y: y + 16, class: \"lt-composite-title\" },\n c.state.label || c.state.id\n ),\n ];\n\n // Activity compartment beneath title (entry/exit/do)\n if (acts.length) {\n let cy = y + titleBarH + 14;\n for (const a of acts) {\n parts.push(text({ x: x + 12, y: cy, class: \"lt-state-activity\" }, activityText(a)));\n cy += 14;\n }\n parts.push(\n path({\n d: `M ${x + 1} ${y + titleBarH + actsH} L ${x + width - 1} ${y + titleBarH + actsH}`,\n class: \"lt-state-div\",\n })\n );\n }\n\n // Region dividers if requested\n if (c.regionDividers) {\n for (const yy of c.regionDividers) {\n parts.push(\n line({ x1: x + 1, y1: yy, x2: x + width - 1, y2: yy, class: \"lt-region-div\" })\n );\n }\n }\n\n return group(\n { class: \"lt-state lt-composite\", \"data-id\": c.id },\n parts\n );\n}\n\n// ── Pseudo-states ───────────────────────────────────────────\n\nfunction renderPseudo(node: StateLayoutNode): string {\n const cx = node.cx;\n const cy = node.cy;\n const k = node.node.pseudoKind;\n switch (k) {\n case \"initial\":\n return group(\n { class: \"lt-state lt-pseudo\", \"data-id\": node.id, \"data-kind\": \"initial\" },\n [circle({ cx, cy, r: 8, class: \"lt-ps-initial\" })]\n );\n case \"final\":\n return group(\n { class: \"lt-state lt-pseudo\", \"data-id\": node.id, \"data-kind\": \"final\" },\n [\n circle({ cx, cy, r: 11, class: \"lt-ps-final-outer\" }),\n circle({ cx, cy, r: 6, class: \"lt-ps-final-inner\" }),\n ]\n );\n case \"choice\": {\n const r = 14;\n return group(\n { class: \"lt-state lt-pseudo\", \"data-id\": node.id, \"data-kind\": \"choice\" },\n [\n polygon({\n points: `${cx},${cy - r} ${cx + r},${cy} ${cx},${cy + r} ${cx - r},${cy}`,\n class: \"lt-ps-choice\",\n }),\n ]\n );\n }\n case \"junction\":\n return group(\n { class: \"lt-state lt-pseudo\", \"data-id\": node.id, \"data-kind\": \"junction\" },\n [circle({ cx, cy, r: 6, class: \"lt-ps-junction\" })]\n );\n case \"fork\":\n case \"join\":\n return group(\n { class: \"lt-state lt-pseudo\", \"data-id\": node.id, \"data-kind\": k },\n [rect({ x: node.x, y: node.y, width: node.width, height: node.height, rx: 2, ry: 2, class: \"lt-ps-bar\" })]\n );\n case \"history\":\n return group(\n { class: \"lt-state lt-pseudo\", \"data-id\": node.id, \"data-kind\": \"history\" },\n [\n circle({ cx, cy, r: 12, class: \"lt-ps-history-body\" }),\n text({ x: cx, y: cy + 4, \"text-anchor\": \"middle\", class: \"lt-ps-history-text\" }, \"H\"),\n ]\n );\n case \"dhistory\":\n return group(\n { class: \"lt-state lt-pseudo\", \"data-id\": node.id, \"data-kind\": \"dhistory\" },\n [\n circle({ cx, cy, r: 13, class: \"lt-ps-history-body\" }),\n text({ x: cx, y: cy + 4, \"text-anchor\": \"middle\", class: \"lt-ps-history-text\" }, \"H*\"),\n ]\n );\n case \"terminate\":\n return group(\n { class: \"lt-state lt-pseudo\", \"data-id\": node.id, \"data-kind\": \"terminate\" },\n [\n line({ x1: cx - 8, y1: cy - 8, x2: cx + 8, y2: cy + 8, class: \"lt-ps-terminate\" }),\n line({ x1: cx + 8, y1: cy - 8, x2: cx - 8, y2: cy + 8, class: \"lt-ps-terminate\" }),\n ]\n );\n case \"entry_point\":\n return group(\n { class: \"lt-state lt-pseudo\", \"data-id\": node.id, \"data-kind\": \"entry_point\" },\n [circle({ cx, cy, r: 7, class: \"lt-ps-entrypoint\" })]\n );\n case \"exit_point\":\n return group(\n { class: \"lt-state lt-pseudo\", \"data-id\": node.id, \"data-kind\": \"exit_point\" },\n [\n circle({ cx, cy, r: 7, class: \"lt-ps-exitpoint\" }),\n line({ x1: cx - 4, y1: cy - 4, x2: cx + 4, y2: cy + 4, class: \"lt-ps-terminate\" }),\n line({ x1: cx + 4, y1: cy - 4, x2: cx - 4, y2: cy + 4, class: \"lt-ps-terminate\" }),\n ]\n );\n default:\n return \"\";\n }\n}\n\nfunction renderNode(node: StateLayoutNode): string {\n if (node.node.kind === \"pseudo\") return renderPseudo(node);\n return renderSimple(node);\n}\n\n// ── Edges + notes ──────────────────────────────────────────\n\nfunction renderEdge(edge: StateLayoutEdge): string {\n const parts: string[] = [\n path({\n d: edge.path,\n class: \"lt-transition\",\n \"marker-end\": `url(#${ARROW_MARKER_ID})`,\n \"data-from\": edge.from,\n \"data-to\": edge.to,\n }),\n ];\n if (edge.label) {\n const w = Math.max(20, edge.label.length * 6.4 + 8);\n const anchor = edge.labelAnchor ?? \"middle\";\n const dx = anchor === \"start\" ? 0 : anchor === \"end\" ? -w : -w / 2;\n parts.push(\n rect({\n x: edge.labelX + dx,\n y: edge.labelY - 10,\n width: w,\n height: 14,\n rx: 2,\n ry: 2,\n class: \"lt-transition-label-bg\",\n })\n );\n parts.push(\n text(\n {\n x: edge.labelX,\n y: edge.labelY,\n \"text-anchor\": anchor,\n class: \"lt-transition-label\",\n },\n edge.label\n )\n );\n }\n return group({ class: \"lt-edge\", \"data-edge-id\": edge.id }, parts);\n}\n\nfunction renderNote(n: StateLayoutNote): string {\n const parts: string[] = [\n line({\n x1: n.leader.x1,\n y1: n.leader.y1,\n x2: n.leader.x2,\n y2: n.leader.y2,\n class: \"lt-note-leader\",\n }),\n rect({ x: n.x, y: n.y, width: n.width, height: n.height, rx: 4, ry: 4, class: \"lt-note-body\" }),\n ];\n let yy = n.y + 14;\n for (const ln of n.lines) {\n parts.push(text({ x: n.x + 8, y: yy, class: \"lt-note-text\" }, ln));\n yy += 14;\n }\n return group({ class: \"lt-note\", \"data-target\": n.note.target }, parts);\n}\n\n// ── Public API ──────────────────────────────────────────────\n\nexport function renderStateDiagram(\n ast: StateDiagramAST,\n _config?: RenderConfig\n): string {\n const layout = layoutStateDiagram(ast);\n return renderLayout(layout);\n}\n\nexport function renderState(text: string, config?: RenderConfig): string {\n const ast = parseStateDiagram(text);\n return renderStateDiagram(ast, config);\n}\n\nfunction renderLayout(layout: StateLayoutResult): string {\n const titleNode = layout.title\n ? text({ x: 16, y: 22, class: \"lt-title\" }, layout.title)\n : \"\";\n\n return svgRoot(\n {\n width: layout.width,\n height: layout.height,\n viewBox: `0 0 ${layout.width} ${layout.height}`,\n class: \"lt-state\",\n \"data-diagram-type\": \"state\",\n },\n [\n el(\"title\", {}, escapeXml(`State Diagram${layout.title ? \" — \" + layout.title : \"\"}`)),\n el(\"desc\", {}, \"UML 2.5 / Harel statechart rendered by Schematex\"),\n defs([renderArrowMarker(), el(\"style\", {}, STYLE)]),\n titleNode,\n // Composite clusters first so simple-state bodies sit on top.\n group({ class: \"lt-clusters\" }, layout.clusters.map(renderComposite)),\n group({ class: \"lt-state-bodies\" }, layout.nodes.map(renderNode)),\n group({ class: \"lt-edges\" }, layout.edges.map(renderEdge)),\n group({ class: \"lt-notes\" }, layout.notes.map(renderNote)),\n ]\n );\n}\n","import type { DiagramPlugin, RenderConfig } from \"../../core/types\";\nimport { parseStateDiagram } from \"./parser\";\nimport { renderStateDiagram } from \"./renderer\";\n\nexport const state: DiagramPlugin = {\n type: \"state\" as DiagramPlugin[\"type\"],\n detect(text) {\n return /^\\s*(?:state\\b|stateDiagram(?:-v2)?\\b)/i.test(text);\n },\n parse: parseStateDiagram,\n render(text, config?: RenderConfig) {\n const ast = parseStateDiagram(text);\n return renderStateDiagram(ast, config);\n },\n};\n\nexport { parseStateDiagram, StateParseError } from \"./parser\";\nexport { renderStateDiagram, renderState } from \"./renderer\";\nexport { layoutStateDiagram } from \"./layout\";\nexport type * from \"./types\";\n","import type {\n PidAST,\n PidAnchor,\n PidDirection,\n PidEquipType,\n PidEquipment,\n PidInstrument,\n PidInstrumentCategory,\n PidLine,\n PidLineType,\n} from \"./types\";\n\nexport class PidParseError extends Error {\n constructor(message: string, public line?: number) {\n super(line !== undefined ? `Line ${line}: ${message}` : message);\n this.name = \"PidParseError\";\n }\n}\n\nconst EQUIP_TYPES = new Set<PidEquipType>([\n \"tank_atm\", \"tank_cone_roof\",\n \"vessel_v\", \"vessel_h\", \"sphere\",\n \"column_tray\", \"column_packed\",\n \"hx_shell_tube\", \"hx_air_cooled\", \"reboiler\", \"condenser\",\n \"pump_centrifugal\", \"pump_pd\",\n \"compressor\", \"blower\",\n \"reactor_cstr\", \"reactor_pfr\",\n \"filter\", \"cyclone\", \"flare\", \"cooling_tower\",\n \"valve_gate\", \"valve_ball\", \"valve_globe\", \"valve_butterfly\",\n \"valve_check\", \"valve_control\", \"valve_psv\",\n]);\n\nconst LINE_TYPES = new Set<PidLineType>([\n \"process\", \"process_minor\", \"pneumatic\", \"electric\",\n \"hydraulic\", \"capillary\", \"software\", \"mechanical\",\n]);\n\nconst INST_CATEGORIES = new Set<PidInstrumentCategory>([\n \"field_discrete\", \"field_shared\", \"field_computer\", \"field_plc\",\n \"cr_discrete\", \"cr_shared\", \"cr_computer\", \"cr_plc\",\n \"local_discrete\", \"local_shared\",\n]);\n\ninterface RawLine {\n text: string;\n indent: number;\n line: number;\n}\n\nfunction preprocess(src: string): RawLine[] {\n const out: RawLine[] = [];\n const lines = src.split(/\\r?\\n/);\n for (let i = 0; i < lines.length; i++) {\n const raw = lines[i];\n if (raw === undefined) continue;\n let stripped = \"\";\n let inQuote = false;\n for (const ch of raw) {\n if (ch === '\"') inQuote = !inQuote;\n if (ch === \"#\" && !inQuote) break;\n stripped += ch;\n }\n const trimmed = stripped.trim();\n if (!trimmed) continue;\n const indent = stripped.length - stripped.replace(/^\\s+/, \"\").length;\n out.push({ text: trimmed, indent, line: i + 1 });\n }\n return out;\n}\n\nfunction unquote(s: string): string {\n const t = s.trim();\n if (t.length >= 2 && t.startsWith('\"') && t.endsWith('\"')) {\n // Handle escaped quotes \\\" → \"\n return t.slice(1, -1).replace(/\\\\\"/g, '\"');\n }\n return t;\n}\n\nfunction parseAttrList(inside: string): Record<string, string> {\n const out: Record<string, string> = {};\n const parts: string[] = [];\n let depth = 0;\n let inQuote = false;\n let cur = \"\";\n for (const ch of inside) {\n if (ch === '\"') inQuote = !inQuote;\n if (!inQuote && ch === \"[\") depth++;\n if (!inQuote && ch === \"]\") depth--;\n if (!inQuote && depth === 0 && ch === \",\") {\n parts.push(cur);\n cur = \"\";\n } else {\n cur += ch;\n }\n }\n if (cur.trim()) parts.push(cur);\n for (const p of parts) {\n const idx = p.indexOf(\":\");\n if (idx < 0) continue;\n const key = p.slice(0, idx).trim();\n const val = unquote(p.slice(idx + 1).trim());\n out[key] = val;\n }\n return out;\n}\n\nfunction extractAttrs(text: string): { rest: string; attrs: Record<string, string> } {\n // Find a trailing [...] (respecting quotes & brackets).\n let depth = 0;\n let inQuote = false;\n let openIdx = -1;\n for (let i = 0; i < text.length; i++) {\n const ch = text[i];\n if (ch === '\"') inQuote = !inQuote;\n if (inQuote) continue;\n if (ch === \"[\") {\n if (depth === 0) openIdx = i;\n depth++;\n } else if (ch === \"]\") {\n depth--;\n if (depth === 0 && i === text.length - 1) {\n const inside = text.slice(openIdx + 1, i);\n return {\n rest: text.slice(0, openIdx).trim(),\n attrs: parseAttrList(inside),\n };\n }\n }\n }\n return { rest: text, attrs: {} };\n}\n\nfunction parseAnchor(tok: string): PidAnchor {\n const dot = tok.indexOf(\".\");\n if (dot < 0) return { id: tok };\n return { id: tok.slice(0, dot), port: tok.slice(dot + 1) };\n}\n\nfunction tokenize(s: string): string[] {\n const out: string[] = [];\n let i = 0;\n while (i < s.length) {\n const ch = s[i]!;\n if (/\\s/.test(ch)) { i++; continue; }\n if (ch === '\"') {\n const end = s.indexOf('\"', i + 1);\n if (end < 0) throw new PidParseError(`Unterminated string: ${s}`);\n out.push(s.slice(i, end + 1));\n i = end + 1;\n continue;\n }\n let j = i;\n let bracket = 0;\n while (j < s.length) {\n const c = s[j]!;\n if (c === \"[\") bracket++;\n else if (c === \"]\") bracket--;\n else if (bracket === 0 && /\\s/.test(c)) break;\n j++;\n }\n out.push(s.slice(i, j));\n i = j;\n }\n return out;\n}\n\nexport function parsePid(src: string): PidAST {\n const lines = preprocess(src);\n if (lines.length === 0) {\n throw new PidParseError(\"Empty document\");\n }\n\n const header = lines[0]!;\n if (!/^pid\\b/i.test(header.text)) {\n throw new PidParseError(`Expected 'pid' header, got '${header.text}'`, header.line);\n }\n\n let title: string | undefined;\n let direction: PidDirection = \"LR\";\n\n // header: pid \"title\" [direction: LR]\n const headerRest = header.text.replace(/^pid\\b/i, \"\").trim();\n const { rest, attrs: headerAttrs } = extractAttrs(headerRest);\n if (headerAttrs.direction === \"TB\") direction = \"TB\";\n if (headerAttrs.direction === \"LR\") direction = \"LR\";\n if (rest) title = unquote(rest);\n\n const equipment: PidEquipment[] = [];\n const linesAst: PidLine[] = [];\n const instruments: PidInstrument[] = [];\n\n let lineIdCounter = 0;\n\n // Track current statement context (e.g. instrument followed by indented `measures`/`controls`).\n let currentInst: PidInstrument | undefined;\n\n for (let idx = 1; idx < lines.length; idx++) {\n const ln = lines[idx]!;\n const text = ln.text;\n\n // ── Indented continuation for an instrument ───────────\n const measuresMatch = text.match(/^measures\\s+(.+)$/);\n if (measuresMatch && currentInst) {\n currentInst.measures = measuresMatch[1].trim();\n continue;\n }\n const controlsMatch = text.match(/^controls\\s+(.+)$/);\n if (controlsMatch && currentInst) {\n currentInst.controls = controlsMatch[1].trim();\n continue;\n }\n // Reset the contextual instrument on any non-continuation line.\n currentInst = undefined;\n\n // ── equip ID : type [attrs] ───────────────────────────\n const equipMatch = text.match(/^equip\\s+([A-Za-z][A-Za-z0-9_-]*)\\s*:\\s*(.+)$/);\n if (equipMatch) {\n const id = equipMatch[1];\n const tail = equipMatch[2];\n const { rest: typeRest, attrs } = extractAttrs(tail);\n const equipType = typeRest.trim() as PidEquipType;\n if (!EQUIP_TYPES.has(equipType)) {\n throw new PidParseError(`Unknown equipment type '${equipType}'`, ln.line);\n }\n equipment.push({\n id,\n equipType,\n tag: attrs.tag ?? id,\n attrs,\n });\n continue;\n }\n\n // ── line ID from X.port to Y.port [attrs] ─────────────\n const lineMatch = text.match(/^line\\s+([A-Za-z0-9_-]+)\\s+from\\s+(\\S+)\\s+to\\s+(\\S+)\\s*(.*)$/);\n if (lineMatch) {\n const id = lineMatch[1];\n const fromTok = lineMatch[2];\n const toTok = lineMatch[3];\n const tail = lineMatch[4];\n const { attrs } = extractAttrs(tail);\n const lt = (attrs.type ?? \"process\") as PidLineType;\n if (!LINE_TYPES.has(lt)) {\n throw new PidParseError(`Unknown line type '${lt}'`, ln.line);\n }\n linesAst.push({\n id,\n from: parseAnchor(fromTok),\n to: parseAnchor(toTok),\n lineType: lt,\n tag: attrs.tag,\n size: attrs.size,\n service: attrs.service,\n attrs,\n });\n lineIdCounter += 1;\n continue;\n }\n\n // ── inst TAG : category [attrs] ───────────────────────\n const instMatch = text.match(/^inst\\s+([A-Z][A-Z0-9]*-[A-Za-z0-9]+)\\s*:\\s*(.+)$/);\n if (instMatch) {\n const tag = instMatch[1];\n const { rest: catRest, attrs } = extractAttrs(instMatch[2]);\n const category = catRest.trim() as PidInstrumentCategory;\n if (!INST_CATEGORIES.has(category)) {\n throw new PidParseError(`Unknown instrument category '${category}'`, ln.line);\n }\n const inst: PidInstrument = {\n tag,\n category,\n attrs,\n };\n instruments.push(inst);\n currentInst = inst;\n continue;\n }\n\n throw new PidParseError(`Unparseable line: ${text}`, ln.line);\n }\n\n // Strip unused id counter — it's just there to silence linter's unused-var.\n void lineIdCounter;\n void tokenize;\n\n return {\n type: \"pid\",\n title,\n direction,\n equipment,\n lines: linesAst,\n instruments,\n };\n}\n","import { circle, group, line, path, polygon, rect, text } from \"../../core/svg\";\nimport type { PidEquipType } from \"./types\";\n\n/**\n * Symbol library for ISA-5.1 / ISO 10628 equipment.\n *\n * Each symbol returns SVG centered at (0, 0). The geometry record below\n * encodes the bounding box and the standard set of port anchors (relative\n * to the center) used by the layout engine.\n */\n\nexport interface PortMap {\n [name: string]: { x: number; y: number };\n}\n\nexport interface SymbolGeometry {\n width: number;\n height: number;\n /** Port name → (x,y) relative to the symbol's CENTER. */\n ports: PortMap;\n}\n\nconst HALF = (n: number) => n / 2;\n\nexport const GEOMETRY: Record<PidEquipType, SymbolGeometry> = {\n // ── Tanks & vessels ─────────────────────────────────────\n tank_atm: {\n width: 90,\n height: 90,\n ports: {\n top: { x: 0, y: -45 },\n bottom: { x: 0, y: 45 },\n left: { x: -45, y: 0 },\n right: { x: 45, y: 0 },\n in: { x: -45, y: 0 },\n out: { x: 45, y: 0 },\n },\n },\n tank_cone_roof: {\n width: 90,\n height: 100,\n ports: {\n top: { x: 0, y: -50 },\n bottom: { x: 0, y: 50 },\n left: { x: -45, y: 0 },\n right: { x: 45, y: 0 },\n },\n },\n vessel_v: {\n width: 70,\n height: 130,\n ports: {\n top: { x: 0, y: -65 },\n bottom: { x: 0, y: 65 },\n left: { x: -35, y: 0 },\n right: { x: 35, y: 0 },\n in: { x: -35, y: -25 },\n out: { x: 35, y: 25 },\n },\n },\n vessel_h: {\n width: 130,\n height: 70,\n ports: {\n top: { x: 0, y: -35 },\n bottom: { x: 0, y: 35 },\n left: { x: -65, y: 0 },\n right: { x: 65, y: 0 },\n in: { x: -65, y: 0 },\n out: { x: 65, y: 0 },\n },\n },\n sphere: {\n width: 90,\n height: 90,\n ports: {\n top: { x: 0, y: -45 },\n bottom: { x: 0, y: 45 },\n left: { x: -45, y: 0 },\n right: { x: 45, y: 0 },\n },\n },\n column_tray: {\n width: 60,\n height: 180,\n ports: {\n top: { x: 0, y: -90 },\n bottom: { x: 0, y: 90 },\n feed: { x: -30, y: 0 },\n reflux: { x: 0, y: -90 },\n bottom_return: { x: -30, y: 70 },\n vapor_out: { x: 0, y: -90 },\n liquid_out: { x: 0, y: 90 },\n },\n },\n column_packed: {\n width: 60,\n height: 180,\n ports: {\n top: { x: 0, y: -90 },\n bottom: { x: 0, y: 90 },\n feed: { x: -30, y: 0 },\n },\n },\n hx_shell_tube: {\n width: 130,\n height: 60,\n ports: {\n shell_in: { x: 0, y: -30 },\n shell_out: { x: 0, y: 30 },\n tube_in: { x: -65, y: 0 },\n tube_out: { x: 65, y: 0 },\n in: { x: -65, y: 0 },\n out: { x: 65, y: 0 },\n },\n },\n hx_air_cooled: {\n width: 130,\n height: 80,\n ports: {\n in: { x: -65, y: 10 },\n out: { x: 65, y: 10 },\n },\n },\n reboiler: {\n width: 110,\n height: 60,\n ports: {\n in: { x: -55, y: 0 },\n out: { x: 55, y: 0 },\n bottom: { x: 0, y: 30 },\n },\n },\n condenser: {\n width: 130,\n height: 60,\n ports: {\n shell_in: { x: -50, y: -30 },\n shell_out: { x: 50, y: 30 },\n tube_in: { x: -65, y: 0 },\n tube_out: { x: 65, y: 0 },\n in: { x: -65, y: 0 },\n out: { x: 65, y: 0 },\n },\n },\n pump_centrifugal: {\n width: 70,\n height: 60,\n ports: {\n in: { x: -30, y: 0 },\n out: { x: 28, y: -22 },\n top: { x: 28, y: -22 },\n left: { x: -30, y: 0 },\n right: { x: 28, y: -22 },\n },\n },\n pump_pd: {\n width: 70,\n height: 60,\n ports: {\n in: { x: -35, y: 0 },\n out: { x: 35, y: 0 },\n },\n },\n compressor: {\n width: 90,\n height: 60,\n ports: {\n in: { x: -45, y: 0 },\n out: { x: 45, y: 0 },\n },\n },\n blower: {\n width: 70,\n height: 60,\n ports: {\n in: { x: -35, y: 0 },\n out: { x: 35, y: 0 },\n },\n },\n reactor_cstr: {\n width: 90,\n height: 110,\n ports: {\n top: { x: 0, y: -55 },\n bottom: { x: 0, y: 55 },\n in: { x: -45, y: -10 },\n out: { x: 0, y: 55 },\n },\n },\n reactor_pfr: {\n width: 130,\n height: 50,\n ports: {\n in: { x: -65, y: 0 },\n out: { x: 65, y: 0 },\n },\n },\n filter: {\n width: 70,\n height: 70,\n ports: {\n in: { x: -35, y: 0 },\n out: { x: 35, y: 0 },\n },\n },\n cyclone: {\n width: 70,\n height: 100,\n ports: {\n top: { x: 0, y: -50 },\n in: { x: -35, y: -30 },\n bottom: { x: 0, y: 50 },\n out: { x: 0, y: -50 },\n },\n },\n flare: {\n width: 30,\n height: 110,\n ports: {\n top: { x: 0, y: -55 },\n bottom: { x: 0, y: 55 },\n in: { x: 0, y: 55 },\n },\n },\n cooling_tower: {\n width: 100,\n height: 90,\n ports: {\n top: { x: 0, y: -45 },\n in: { x: -50, y: 0 },\n out: { x: 50, y: 0 },\n },\n },\n\n // ── Valves (in-line) ──────────────────────────────────\n valve_gate: {\n width: 36,\n height: 22,\n ports: { in: { x: -18, y: 0 }, out: { x: 18, y: 0 }, left: { x: -18, y: 0 }, right: { x: 18, y: 0 } },\n },\n valve_ball: {\n width: 36,\n height: 22,\n ports: { in: { x: -18, y: 0 }, out: { x: 18, y: 0 } },\n },\n valve_globe: {\n width: 36,\n height: 28,\n ports: { in: { x: -18, y: 0 }, out: { x: 18, y: 0 } },\n },\n valve_butterfly: {\n width: 36,\n height: 22,\n ports: { in: { x: -18, y: 0 }, out: { x: 18, y: 0 } },\n },\n valve_check: {\n width: 36,\n height: 22,\n ports: { in: { x: -18, y: 0 }, out: { x: 18, y: 0 } },\n },\n valve_control: {\n width: 36,\n height: 60,\n ports: { in: { x: -18, y: 12 }, out: { x: 18, y: 12 }, top: { x: 0, y: -22 } },\n },\n valve_psv: {\n width: 36,\n height: 60,\n ports: { in: { x: -18, y: 12 }, out: { x: 18, y: -8 } },\n },\n};\n\n// ── Renderers — each draws around (0,0). ─────────────────────\n\nconst STROKE_BLACK = \"#1d1d1d\";\nconst FILL_WHITE = \"#ffffff\";\n\nfunction bowtie(): string {\n // Two triangles meeting at center.\n return polygon({\n points: \"-18,-11 0,0 -18,11 18,11 0,0 18,-11\",\n class: \"lt-pid-valve-body\",\n });\n}\n\nexport function renderEquip(type: PidEquipType, label: string): string {\n switch (type) {\n case \"tank_atm\": {\n const w = 90;\n const h = 90;\n const cylTop = -h / 2 + 14;\n const parts = [\n // dome top\n path({\n d: `M ${-w / 2} ${cylTop} A ${w / 2} 14 0 0 1 ${w / 2} ${cylTop}`,\n class: \"lt-pid-equip\",\n }),\n // body\n rect({\n x: -w / 2,\n y: cylTop,\n width: w,\n height: h - 14,\n class: \"lt-pid-equip\",\n }),\n // tag\n text(\n { x: 0, y: 4, \"text-anchor\": \"middle\", class: \"lt-pid-equip-tag\" },\n label\n ),\n ];\n return group({ class: \"lt-pid-equip-group\" }, parts);\n }\n case \"tank_cone_roof\": {\n const w = 90;\n const h = 100;\n const roofH = 18;\n const top = -h / 2;\n return group({}, [\n polygon({\n points: `${-w / 2},${top + roofH} 0,${top} ${w / 2},${top + roofH}`,\n class: \"lt-pid-equip\",\n }),\n rect({\n x: -w / 2,\n y: top + roofH,\n width: w,\n height: h - roofH,\n class: \"lt-pid-equip\",\n }),\n text({ x: 0, y: 4, \"text-anchor\": \"middle\", class: \"lt-pid-equip-tag\" }, label),\n ]);\n }\n case \"vessel_v\": {\n const w = 70;\n const h = 130;\n const headH = 16;\n const top = -h / 2;\n const bot = h / 2;\n return group({}, [\n path({\n d: `M ${-w / 2} ${top + headH}\n A ${w / 2} ${headH} 0 0 1 ${w / 2} ${top + headH}\n L ${w / 2} ${bot - headH}\n A ${w / 2} ${headH} 0 0 1 ${-w / 2} ${bot - headH}\n Z`,\n class: \"lt-pid-equip\",\n }),\n text(\n { x: 0, y: 4, \"text-anchor\": \"middle\", class: \"lt-pid-equip-tag\" },\n label\n ),\n ]);\n }\n case \"vessel_h\": {\n const w = 130;\n const h = 70;\n const headW = 14;\n const left = -w / 2;\n const right = w / 2;\n return group({}, [\n path({\n d: `M ${left + headW} ${-h / 2}\n L ${right - headW} ${-h / 2}\n A ${headW} ${h / 2} 0 0 1 ${right - headW} ${h / 2}\n L ${left + headW} ${h / 2}\n A ${headW} ${h / 2} 0 0 1 ${left + headW} ${-h / 2}\n Z`,\n class: \"lt-pid-equip\",\n }),\n text(\n { x: 0, y: 4, \"text-anchor\": \"middle\", class: \"lt-pid-equip-tag\" },\n label\n ),\n ]);\n }\n case \"sphere\": {\n return group({}, [\n circle({ cx: 0, cy: 0, r: 45, class: \"lt-pid-equip\" }),\n text({ x: 0, y: 4, \"text-anchor\": \"middle\", class: \"lt-pid-equip-tag\" }, label),\n ]);\n }\n case \"column_tray\": {\n const w = 60;\n const h = 180;\n const headH = 12;\n const trays = 12;\n const inner = h - headH * 2;\n const traySpacing = inner / (trays + 1);\n const trayLines: string[] = [];\n for (let i = 1; i <= trays; i++) {\n const y = -h / 2 + headH + traySpacing * i;\n trayLines.push(\n line({\n x1: -w / 2 + 6,\n y1: y,\n x2: w / 2 - 6,\n y2: y,\n class: \"lt-pid-tray-line\",\n })\n );\n }\n return group({}, [\n path({\n d: `M ${-w / 2} ${-h / 2 + headH}\n A ${w / 2} ${headH} 0 0 1 ${w / 2} ${-h / 2 + headH}\n L ${w / 2} ${h / 2 - headH}\n A ${w / 2} ${headH} 0 0 1 ${-w / 2} ${h / 2 - headH}\n Z`,\n class: \"lt-pid-equip\",\n }),\n ...trayLines,\n text(\n {\n x: 0,\n y: -h / 2 - 6,\n \"text-anchor\": \"middle\",\n class: \"lt-pid-equip-tag\",\n },\n label\n ),\n ]);\n }\n case \"column_packed\": {\n const w = 60;\n const h = 180;\n const headH = 12;\n // X-shaped packing pattern, rendered as repeated `<` and `>` characters\n const packing = path({\n d: `M ${-w / 2 + 6} ${-h / 2 + headH + 6}\n L ${w / 2 - 6} ${h / 2 - headH - 6}\n M ${w / 2 - 6} ${-h / 2 + headH + 6}\n L ${-w / 2 + 6} ${h / 2 - headH - 6}`,\n class: \"lt-pid-tray-line\",\n });\n return group({}, [\n path({\n d: `M ${-w / 2} ${-h / 2 + headH}\n A ${w / 2} ${headH} 0 0 1 ${w / 2} ${-h / 2 + headH}\n L ${w / 2} ${h / 2 - headH}\n A ${w / 2} ${headH} 0 0 1 ${-w / 2} ${h / 2 - headH}\n Z`,\n class: \"lt-pid-equip\",\n }),\n packing,\n text(\n {\n x: 0,\n y: -h / 2 - 6,\n \"text-anchor\": \"middle\",\n class: \"lt-pid-equip-tag\",\n },\n label\n ),\n ]);\n }\n case \"hx_shell_tube\": {\n const w = 130;\n const h = 60;\n const headW = 12;\n const left = -w / 2;\n const right = w / 2;\n const tubes: string[] = [];\n for (let yy = -h / 2 + 12; yy <= h / 2 - 12; yy += 8) {\n tubes.push(\n line({\n x1: left + headW + 4,\n y1: yy,\n x2: right - headW - 4,\n y2: yy,\n class: \"lt-pid-tray-line\",\n })\n );\n }\n return group({}, [\n path({\n d: `M ${left + headW} ${-h / 2}\n L ${right - headW} ${-h / 2}\n A ${headW} ${h / 2} 0 0 1 ${right - headW} ${h / 2}\n L ${left + headW} ${h / 2}\n A ${headW} ${h / 2} 0 0 1 ${left + headW} ${-h / 2}\n Z`,\n class: \"lt-pid-equip\",\n }),\n ...tubes,\n text(\n {\n x: 0,\n y: h / 2 + 14,\n \"text-anchor\": \"middle\",\n class: \"lt-pid-equip-tag\",\n },\n label\n ),\n ]);\n }\n case \"hx_air_cooled\": {\n const w = 130;\n const h = 80;\n return group({}, [\n rect({\n x: -w / 2,\n y: -h / 2 + 18,\n width: w,\n height: h - 18,\n class: \"lt-pid-equip\",\n }),\n circle({ cx: 0, cy: -h / 2 + 14, r: 18, class: \"lt-pid-equip\" }),\n // 3-blade fan\n path({\n d: `M 0 ${-h / 2 + 14} L 14 ${-h / 2 + 6}\n M 0 ${-h / 2 + 14} L -14 ${-h / 2 + 6}\n M 0 ${-h / 2 + 14} L 0 ${-h / 2 + 30}`,\n class: \"lt-pid-tray-line\",\n }),\n text(\n { x: 0, y: h / 2 + 14, \"text-anchor\": \"middle\", class: \"lt-pid-equip-tag\" },\n label\n ),\n ]);\n }\n case \"reboiler\": {\n const w = 110;\n const h = 60;\n const headW = 14;\n return group({}, [\n path({\n d: `M ${-w / 2 + headW} ${-h / 2}\n L ${w / 2 - headW} ${-h / 2}\n A ${headW} ${h / 2} 0 0 1 ${w / 2 - headW} ${h / 2}\n L ${-w / 2 + headW} ${h / 2}\n A ${headW} ${h / 2} 0 0 1 ${-w / 2 + headW} ${-h / 2}\n Z`,\n class: \"lt-pid-equip\",\n }),\n line({\n x1: -w / 2 + headW + 4,\n y1: -10,\n x2: w / 2 - headW - 4,\n y2: -10,\n class: \"lt-pid-tray-line\",\n }),\n line({\n x1: -w / 2 + headW + 4,\n y1: 0,\n x2: w / 2 - headW - 4,\n y2: 0,\n class: \"lt-pid-tray-line\",\n }),\n line({\n x1: -w / 2 + headW + 4,\n y1: 10,\n x2: w / 2 - headW - 4,\n y2: 10,\n class: \"lt-pid-tray-line\",\n }),\n text({ x: 0, y: h / 2 + 14, \"text-anchor\": \"middle\", class: \"lt-pid-equip-tag\" }, label),\n ]);\n }\n case \"condenser\": {\n // Visually identical to a horizontal HX with a label hint.\n const w = 130;\n const h = 60;\n const headW = 12;\n const left = -w / 2;\n const right = w / 2;\n const tubes: string[] = [];\n for (let yy = -h / 2 + 12; yy <= h / 2 - 12; yy += 10) {\n tubes.push(\n line({\n x1: left + headW + 4,\n y1: yy,\n x2: right - headW - 4,\n y2: yy,\n class: \"lt-pid-tray-line\",\n })\n );\n }\n return group({}, [\n path({\n d: `M ${left + headW} ${-h / 2}\n L ${right - headW} ${-h / 2}\n A ${headW} ${h / 2} 0 0 1 ${right - headW} ${h / 2}\n L ${left + headW} ${h / 2}\n A ${headW} ${h / 2} 0 0 1 ${left + headW} ${-h / 2}\n Z`,\n class: \"lt-pid-equip\",\n }),\n ...tubes,\n text({ x: 0, y: h / 2 + 14, \"text-anchor\": \"middle\", class: \"lt-pid-equip-tag\" }, label),\n ]);\n }\n case \"pump_centrifugal\": {\n // Circle + right-side triangle outlet.\n const r = 22;\n return group({}, [\n circle({ cx: 0, cy: 0, r, class: \"lt-pid-equip\" }),\n polygon({\n points: `${r * 0.4},${-r * 0.9} ${r + 6},${-r * 0.9} ${r * 0.4},${0}`,\n class: \"lt-pid-equip\",\n }),\n text(\n { x: 0, y: r + 14, \"text-anchor\": \"middle\", class: \"lt-pid-equip-tag\" },\n label\n ),\n ]);\n }\n case \"pump_pd\": {\n const r = 22;\n return group({}, [\n circle({ cx: 0, cy: 0, r, class: \"lt-pid-equip\" }),\n circle({ cx: -8, cy: 0, r: 6, class: \"lt-pid-tray-line\", fill: \"none\" }),\n circle({ cx: 8, cy: 0, r: 6, class: \"lt-pid-tray-line\", fill: \"none\" }),\n text(\n { x: 0, y: r + 14, \"text-anchor\": \"middle\", class: \"lt-pid-equip-tag\" },\n label\n ),\n ]);\n }\n case \"compressor\": {\n // Trapezoid (left wide → right narrow inverted = compressor)\n return group({}, [\n polygon({\n points: \"-45,-20 45,-12 45,12 -45,20\",\n class: \"lt-pid-equip\",\n }),\n text({ x: 0, y: 36, \"text-anchor\": \"middle\", class: \"lt-pid-equip-tag\" }, label),\n ]);\n }\n case \"blower\": {\n const r = 22;\n return group({}, [\n circle({ cx: 0, cy: 0, r, class: \"lt-pid-equip\" }),\n path({\n d: `M 0 0 L ${r * 0.8} ${-r * 0.5} M 0 0 L ${-r * 0.6} ${-r * 0.6} M 0 0 L 0 ${r * 0.8}`,\n class: \"lt-pid-tray-line\",\n }),\n text({ x: 0, y: r + 14, \"text-anchor\": \"middle\", class: \"lt-pid-equip-tag\" }, label),\n ]);\n }\n case \"reactor_cstr\": {\n const w = 90;\n const h = 110;\n const headH = 14;\n const top = -h / 2;\n const bot = h / 2;\n return group({}, [\n path({\n d: `M ${-w / 2} ${top + headH}\n A ${w / 2} ${headH} 0 0 1 ${w / 2} ${top + headH}\n L ${w / 2} ${bot - headH}\n A ${w / 2} ${headH} 0 0 1 ${-w / 2} ${bot - headH}\n Z`,\n class: \"lt-pid-equip\",\n }),\n // agitator shaft + paddle\n line({ x1: 0, y1: top - 14, x2: 0, y2: 4, class: \"lt-pid-tray-line\" }),\n rect({ x: -10, y: 4, width: 20, height: 4, class: \"lt-pid-equip\" }),\n text(\n { x: 0, y: bot + 14, \"text-anchor\": \"middle\", class: \"lt-pid-equip-tag\" },\n label\n ),\n ]);\n }\n case \"reactor_pfr\": {\n const w = 130;\n const h = 50;\n const headW = 12;\n const left = -w / 2;\n const right = w / 2;\n // Packed-bed style fill\n const dots: string[] = [];\n for (let xx = left + headW + 8; xx <= right - headW - 8; xx += 12) {\n for (let yy = -h / 2 + 12; yy <= h / 2 - 8; yy += 10) {\n dots.push(circle({ cx: xx, cy: yy, r: 1.6, fill: STROKE_BLACK }));\n }\n }\n return group({}, [\n path({\n d: `M ${left + headW} ${-h / 2}\n L ${right - headW} ${-h / 2}\n A ${headW} ${h / 2} 0 0 1 ${right - headW} ${h / 2}\n L ${left + headW} ${h / 2}\n A ${headW} ${h / 2} 0 0 1 ${left + headW} ${-h / 2}\n Z`,\n class: \"lt-pid-equip\",\n }),\n ...dots,\n text({ x: 0, y: h / 2 + 14, \"text-anchor\": \"middle\", class: \"lt-pid-equip-tag\" }, label),\n ]);\n }\n case \"filter\": {\n const w = 70;\n const h = 70;\n // diagonal hatch via 3 lines\n return group({}, [\n rect({ x: -w / 2, y: -h / 2, width: w, height: h, class: \"lt-pid-equip\" }),\n line({ x1: -w / 2, y1: 0, x2: w / 2, y2: 0, class: \"lt-pid-tray-line\" }),\n line({ x1: -w / 2 + 8, y1: -h / 2 + 8, x2: w / 2 - 8, y2: -8, class: \"lt-pid-tray-line\" }),\n line({ x1: -w / 2 + 8, y1: 8, x2: w / 2 - 8, y2: h / 2 - 8, class: \"lt-pid-tray-line\" }),\n text({ x: 0, y: h / 2 + 14, \"text-anchor\": \"middle\", class: \"lt-pid-equip-tag\" }, label),\n ]);\n }\n case \"cyclone\": {\n const w = 70;\n const h = 100;\n const cyl = 30;\n return group({}, [\n path({\n d: `M ${-w / 2} ${-h / 2}\n L ${w / 2} ${-h / 2}\n L ${w / 2} ${-h / 2 + cyl}\n L 0 ${h / 2}\n L ${-w / 2} ${-h / 2 + cyl}\n Z`,\n class: \"lt-pid-equip\",\n }),\n text({ x: 0, y: h / 2 + 14, \"text-anchor\": \"middle\", class: \"lt-pid-equip-tag\" }, label),\n ]);\n }\n case \"flare\": {\n const w = 30;\n const h = 110;\n return group({}, [\n rect({ x: -w / 2, y: -h / 2, width: w, height: h, class: \"lt-pid-equip\" }),\n polygon({\n points: `${-8},${-h / 2 - 4} 0,${-h / 2 - 22} 8,${-h / 2 - 4}`,\n fill: \"#ff7755\",\n stroke: STROKE_BLACK,\n }),\n text({ x: 0, y: h / 2 + 14, \"text-anchor\": \"middle\", class: \"lt-pid-equip-tag\" }, label),\n ]);\n }\n case \"cooling_tower\": {\n const w = 100;\n const h = 90;\n return group({}, [\n path({\n d: `M ${-w / 2} ${-h / 2}\n L ${w / 2} ${-h / 2}\n L ${w / 4} 0\n L ${w / 2} ${h / 2}\n L ${-w / 2} ${h / 2}\n L ${-w / 4} 0\n Z`,\n class: \"lt-pid-equip\",\n }),\n text({ x: 0, y: h / 2 + 14, \"text-anchor\": \"middle\", class: \"lt-pid-equip-tag\" }, label),\n ]);\n }\n\n // ── Valves ──────────────────────────────────────────\n case \"valve_gate\":\n return group({}, [\n bowtie(),\n text({ x: 0, y: 22, \"text-anchor\": \"middle\", class: \"lt-pid-equip-tag\" }, label),\n ]);\n case \"valve_ball\":\n return group({}, [\n bowtie(),\n circle({ cx: 0, cy: 0, r: 4, fill: STROKE_BLACK }),\n text({ x: 0, y: 22, \"text-anchor\": \"middle\", class: \"lt-pid-equip-tag\" }, label),\n ]);\n case \"valve_globe\":\n return group({}, [\n bowtie(),\n circle({ cx: 0, cy: -5, r: 5, class: \"lt-pid-valve-body\", fill: FILL_WHITE }),\n text({ x: 0, y: 22, \"text-anchor\": \"middle\", class: \"lt-pid-equip-tag\" }, label),\n ]);\n case \"valve_butterfly\":\n return group({}, [\n bowtie(),\n line({ x1: 0, y1: -10, x2: 0, y2: 10, class: \"lt-pid-tray-line\" }),\n text({ x: 0, y: 22, \"text-anchor\": \"middle\", class: \"lt-pid-equip-tag\" }, label),\n ]);\n case \"valve_check\":\n return group({}, [\n bowtie(),\n path({ d: \"M -10 -8 A 10 10 0 0 1 -10 8\", class: \"lt-pid-tray-line\", fill: \"none\" }),\n text({ x: 0, y: 22, \"text-anchor\": \"middle\", class: \"lt-pid-equip-tag\" }, label),\n ]);\n case \"valve_control\":\n return group({}, [\n bowtie(),\n // actuator: diaphragm\n line({ x1: 0, y1: -11, x2: 0, y2: -22, class: \"lt-pid-tray-line\" }),\n path({ d: \"M -14 -22 A 14 8 0 0 1 14 -22 L -14 -22 Z\", class: \"lt-pid-equip\" }),\n text({ x: 0, y: 24, \"text-anchor\": \"middle\", class: \"lt-pid-equip-tag\" }, label),\n ]);\n case \"valve_psv\":\n return group({}, [\n bowtie(),\n // diagonal outlet (45°)\n line({\n x1: 18, y1: -11,\n x2: 26, y2: -22,\n class: \"lt-pid-process\",\n }),\n // spring stack\n path({\n d: \"M -6 -11 L -10 -16 L -2 -20 L -10 -24 L -2 -28\",\n class: \"lt-pid-tray-line\",\n fill: \"none\",\n }),\n text({ x: 0, y: 24, \"text-anchor\": \"middle\", class: \"lt-pid-equip-tag\" }, label),\n ]);\n\n default:\n return group({}, [\n rect({ x: -30, y: -20, width: 60, height: 40, class: \"lt-pid-equip\" }),\n text({ x: 0, y: 4, \"text-anchor\": \"middle\", class: \"lt-pid-equip-tag\" }, label),\n ]);\n }\n}\n\n// ── Instrument bubble renderer ──────────────────────────────\n\nexport function renderInstrument(\n category: string,\n letterCode: string,\n loopNumber: string\n): string {\n const r = 14;\n\n const isComputer = category.endsWith(\"computer\");\n const isPlc = category.endsWith(\"plc\");\n const isShared = category.endsWith(\"shared\");\n const isControlRoom = category.startsWith(\"cr_\");\n const isLocal = category.startsWith(\"local_\");\n\n const parts: string[] = [];\n\n // Outer body\n if (isComputer) {\n // Diamond inscribed\n parts.push(circle({ cx: 0, cy: 0, r, class: \"lt-inst-body\" }));\n parts.push(\n polygon({\n points: `0,${-r + 1} ${r - 1},0 0,${r - 1} ${-(r - 1)},0`,\n class: \"lt-inst-body\",\n fill: \"none\",\n })\n );\n } else if (isPlc) {\n // Square inscribed\n parts.push(circle({ cx: 0, cy: 0, r, class: \"lt-inst-body\" }));\n const side = r * Math.SQRT1_2 * 2 - 2;\n parts.push(\n rect({\n x: -side / 2,\n y: -side / 2,\n width: side,\n height: side,\n class: \"lt-inst-body\",\n fill: \"none\",\n })\n );\n } else if (isShared) {\n // Hexagon inscribed (point-up)\n parts.push(circle({ cx: 0, cy: 0, r, class: \"lt-inst-body\" }));\n const hex: string[] = [];\n for (let i = 0; i < 6; i++) {\n const a = (Math.PI / 3) * i - Math.PI / 2;\n hex.push(`${(r - 2) * Math.cos(a)},${(r - 2) * Math.sin(a)}`);\n }\n parts.push(\n polygon({\n points: hex.join(\" \"),\n class: \"lt-inst-body\",\n fill: \"none\",\n })\n );\n } else {\n // discrete — circle only\n parts.push(circle({ cx: 0, cy: 0, r, class: \"lt-inst-body\" }));\n }\n\n // Location indicator (horizontal line for control room; dashed for local).\n if (isControlRoom) {\n parts.push(line({ x1: -r, y1: 0, x2: r, y2: 0, class: \"lt-inst-cr-line\" }));\n } else if (isLocal) {\n parts.push(line({ x1: -r, y1: 0, x2: r, y2: 0, class: \"lt-inst-local-line\" }));\n }\n\n // Tag text — split into letter-code + loop-number, one above and one below center.\n parts.push(\n text(\n {\n x: 0,\n y: -3,\n \"text-anchor\": \"middle\",\n class: \"lt-inst-tag\",\n },\n letterCode\n )\n );\n parts.push(\n text(\n {\n x: 0,\n y: 9,\n \"text-anchor\": \"middle\",\n class: \"lt-inst-tag\",\n },\n loopNumber\n )\n );\n\n return group({ class: \"lt-inst-symbol\" }, parts);\n}\n\nvoid HALF;\n","import { GEOMETRY } from \"./symbols\";\nimport type {\n PidAST,\n PidEquipment,\n PidLayoutEquipment,\n PidLayoutInstrument,\n PidLayoutLine,\n PidLayoutResult,\n PidLine,\n} from \"./types\";\n\nconst PADDING = 30;\nconst TITLE_AREA = 26;\nconst EQUIP_GAP_X = 70;\nconst INST_RADIUS = 14;\nconst INST_OFFSET = 38; // distance from equipment edge to instrument\n\ninterface AnchorPoint {\n x: number;\n y: number;\n /** Outward direction relative to the equipment edge (used for routing offsets). */\n side: \"left\" | \"right\" | \"top\" | \"bottom\";\n}\n\nfunction defaultPort(direction: \"in\" | \"out\", equip: PidEquipment): string {\n // Sensible defaults per equipment family.\n if (equip.equipType === \"tank_atm\" || equip.equipType === \"tank_cone_roof\") {\n return direction === \"out\" ? \"bottom\" : \"top\";\n }\n if (equip.equipType === \"vessel_v\" || equip.equipType === \"column_tray\" || equip.equipType === \"column_packed\") {\n return direction === \"out\" ? \"bottom\" : \"top\";\n }\n return direction === \"out\" ? \"out\" : \"in\";\n}\n\nfunction resolveSide(port: string): \"left\" | \"right\" | \"top\" | \"bottom\" {\n if (port === \"top\" || port === \"vapor_out\" || port === \"reflux\") return \"top\";\n if (port === \"bottom\" || port === \"liquid_out\" || port === \"bottom_return\") return \"bottom\";\n if (port === \"left\" || port === \"in\" || port === \"feed\" || port === \"tube_in\" || port === \"shell_in\") return \"left\";\n return \"right\";\n}\n\nfunction getAnchor(\n layoutEq: PidLayoutEquipment,\n port: string | undefined,\n fallback: \"in\" | \"out\"\n): AnchorPoint {\n const ports = layoutEq.ports;\n let key = port;\n if (!key || !(key in ports)) {\n key = defaultPort(fallback, layoutEq.equip);\n }\n const p = ports[key] ?? ports.right ?? ports.out ?? ports.left ?? ports.in;\n if (!p) return { x: layoutEq.cx, y: layoutEq.cy, side: \"right\" };\n return { x: p.x, y: p.y, side: resolveSide(key ?? \"right\") };\n}\n\nfunction manhattanPath(\n fromX: number,\n fromY: number,\n fromSide: AnchorPoint[\"side\"],\n toX: number,\n toY: number,\n toSide: AnchorPoint[\"side\"]\n): { d: string; midX: number; midY: number } {\n // Choose elbow strategy based on the originating side.\n // For horizontal exits (left/right) we route H → V → H.\n // For vertical exits (top/bottom) we route V → H → V.\n const isHFrom = fromSide === \"left\" || fromSide === \"right\";\n const isHTo = toSide === \"left\" || toSide === \"right\";\n\n if (isHFrom && isHTo) {\n const midX = (fromX + toX) / 2;\n return {\n d: `M ${fromX} ${fromY} L ${midX} ${fromY} L ${midX} ${toY} L ${toX} ${toY}`,\n midX,\n midY: (fromY + toY) / 2,\n };\n }\n if (!isHFrom && !isHTo) {\n const midY = (fromY + toY) / 2;\n return {\n d: `M ${fromX} ${fromY} L ${fromX} ${midY} L ${toX} ${midY} L ${toX} ${toY}`,\n midX: (fromX + toX) / 2,\n midY,\n };\n }\n // Mixed: simple L-shape.\n if (isHFrom) {\n return {\n d: `M ${fromX} ${fromY} L ${toX} ${fromY} L ${toX} ${toY}`,\n midX: toX,\n midY: (fromY + toY) / 2,\n };\n }\n return {\n d: `M ${fromX} ${fromY} L ${fromX} ${toY} L ${toX} ${toY}`,\n midX: (fromX + toX) / 2,\n midY: toY,\n };\n}\n\nexport function layoutPid(ast: PidAST): PidLayoutResult {\n // 1. Place equipment in declaration order along the primary direction.\n const equipment: PidLayoutEquipment[] = [];\n const equipById = new Map<string, PidLayoutEquipment>();\n\n // Determine row Y based on max equipment height for alignment.\n const heights = ast.equipment.map((e) => GEOMETRY[e.equipType]?.height ?? 60);\n const maxH = Math.max(...heights, 0);\n const rowY = PADDING + TITLE_AREA + maxH / 2 + 30; // give room for top labels\n\n let cursorX = PADDING + 40;\n\n for (const equip of ast.equipment) {\n const geo = GEOMETRY[equip.equipType] ?? { width: 60, height: 40, ports: {} };\n const cx = cursorX + geo.width / 2;\n const cy = rowY;\n const x = cx - geo.width / 2;\n const y = cy - geo.height / 2;\n\n const ports: Record<string, { x: number; y: number }> = {};\n for (const [name, p] of Object.entries(geo.ports)) {\n ports[name] = { x: cx + p.x, y: cy + p.y };\n }\n\n const layoutEq: PidLayoutEquipment = {\n equip,\n x,\n y,\n width: geo.width,\n height: geo.height,\n cx,\n cy,\n ports,\n };\n equipment.push(layoutEq);\n equipById.set(equip.id, layoutEq);\n cursorX += geo.width + EQUIP_GAP_X;\n }\n\n // 2. Place instruments.\n // Field instruments → near their measured equipment (below it).\n // Control-room instruments → above the equipment row (in a virtual control-room band).\n const instruments: PidLayoutInstrument[] = [];\n const instById = new Map<string, PidLayoutInstrument>();\n\n const crBandY = PADDING + TITLE_AREA + 40;\n // Stagger CR instrument x positions to avoid overlap.\n let crSlot = 0;\n for (const inst of ast.instruments) {\n let cx = 0;\n let cy = 0;\n if (inst.category.startsWith(\"cr_\")) {\n // place in CR band; x aligns roughly to the controlled valve or the measured equipment.\n const tgt = inst.controls ?? inst.measures ?? \"\";\n const tgtEq = equipById.get(tgt);\n cx = tgtEq ? tgtEq.cx : PADDING + 80 + crSlot * (INST_RADIUS * 2 + 28);\n cy = crBandY;\n crSlot += 1;\n } else if (inst.category.startsWith(\"local_\")) {\n cy = rowY + maxH / 2 + INST_OFFSET + INST_RADIUS;\n const tgt = inst.measures ?? inst.controls ?? \"\";\n const tgtEq = equipById.get(tgt);\n cx = tgtEq ? tgtEq.cx : PADDING + 80;\n } else {\n // field — directly below the related equipment\n cy = rowY + maxH / 2 + INST_OFFSET;\n const tgt = inst.measures ?? inst.controls ?? \"\";\n const tgtEq = equipById.get(tgt);\n cx = tgtEq ? tgtEq.cx : PADDING + 80;\n }\n\n const lay: PidLayoutInstrument = {\n inst,\n cx,\n cy,\n r: INST_RADIUS,\n };\n instruments.push(lay);\n instById.set(inst.tag, lay);\n }\n\n // Avoid overlapping field/local instruments by nudging their x where needed.\n const sameRow = (a: PidLayoutInstrument, b: PidLayoutInstrument) =>\n Math.abs(a.cy - b.cy) < INST_RADIUS && Math.abs(a.cx - b.cx) < INST_RADIUS * 2 + 8;\n const sortedByX = [...instruments].sort((a, b) => a.cx - b.cx);\n for (let i = 1; i < sortedByX.length; i++) {\n const prev = sortedByX[i - 1]!;\n const cur = sortedByX[i]!;\n if (sameRow(prev, cur)) {\n cur.cx = prev.cx + INST_RADIUS * 2 + 14;\n }\n }\n\n // 3. Route lines.\n const lines: PidLayoutLine[] = [];\n for (const ln of ast.lines) {\n const path = routeLine(ln, equipById, instById);\n if (path) lines.push(path);\n }\n\n // 4. Compute total bounds.\n const allX: number[] = [];\n const allY: number[] = [];\n for (const e of equipment) {\n // Pad horizontally so equipment tags (which can extend beyond the symbol's\n // bounding box) aren't clipped at the SVG edge.\n const tagPad = Math.max(0, ((e.equip.tag ?? e.equip.id).length * 6.6 - e.width) / 2 + 4);\n allX.push(e.x - tagPad, e.x + e.width + tagPad);\n allY.push(e.y, e.y + e.height + 30);\n }\n for (const i of instruments) {\n allX.push(i.cx - i.r, i.cx + i.r);\n allY.push(i.cy - i.r, i.cy + i.r + 14);\n }\n if (allX.length === 0) { allX.push(0, 400); allY.push(0, 200); }\n const maxX = Math.max(...allX);\n const maxY = Math.max(...allY);\n\n return {\n width: Math.max(maxX + PADDING, 400),\n height: Math.max(maxY + PADDING, 200),\n equipment,\n instruments,\n lines,\n title: ast.title,\n };\n}\n\nfunction routeLine(\n ln: PidLine,\n equipById: Map<string, PidLayoutEquipment>,\n instById: Map<string, PidLayoutInstrument>\n): PidLayoutLine | undefined {\n const fromAnchor = resolveAnchor(ln.from.id, ln.from.port, \"out\", equipById, instById);\n const toAnchor = resolveAnchor(ln.to.id, ln.to.port, \"in\", equipById, instById);\n if (!fromAnchor || !toAnchor) return undefined;\n\n const { d, midX, midY } = manhattanPath(\n fromAnchor.x,\n fromAnchor.y,\n fromAnchor.side,\n toAnchor.x,\n toAnchor.y,\n toAnchor.side\n );\n\n return {\n line: ln,\n path: d,\n midX,\n midY,\n };\n}\n\nfunction resolveAnchor(\n id: string,\n port: string | undefined,\n fallback: \"in\" | \"out\",\n equipById: Map<string, PidLayoutEquipment>,\n instById: Map<string, PidLayoutInstrument>\n): AnchorPoint | undefined {\n const eq = equipById.get(id);\n if (eq) return getAnchor(eq, port, fallback);\n\n const inst = instById.get(id);\n if (inst) {\n return {\n x: inst.cx,\n y: inst.cy,\n side: fallback === \"out\" ? \"right\" : \"left\",\n };\n }\n // If the line references the id of another line (e.g. `measures L2`), no anchor is generated.\n return undefined;\n}\n","import { defs, el, escapeXml, group, line as lineEl, path as pathEl, polygon, rect, svgRoot, text as textEl } from \"../../core/svg\";\nimport type { RenderConfig } from \"../../core/types\";\nimport { layoutPid } from \"./layout\";\nimport { parsePid } from \"./parser\";\nimport { renderEquip, renderInstrument } from \"./symbols\";\nimport type { PidAST, PidLayoutLine, PidLayoutResult } from \"./types\";\n\nconst STYLE = `\n.lt-pid-equip { fill: #ffffff; stroke: #1d1d1d; stroke-width: 1.6; }\n.lt-pid-equip-tag { font: 600 11px system-ui, sans-serif; fill: #1d1d1d; }\n.lt-pid-tray-line { stroke: #555; stroke-width: 1; fill: none; }\n\n.lt-pid-process { stroke: #1d1d1d; stroke-width: 2.6; fill: none; }\n.lt-pid-process-min { stroke: #1d1d1d; stroke-width: 1.5; fill: none; }\n.lt-pid-pneumatic { stroke: #1d1d1d; stroke-width: 1.4; fill: none; }\n.lt-pid-electric { stroke: #1d1d1d; stroke-width: 1.4; fill: none; stroke-dasharray: 6 4; }\n.lt-pid-hydraulic { stroke: #1d1d1d; stroke-width: 1.4; fill: none; stroke-dasharray: 10 4; }\n.lt-pid-capillary { stroke: #1d1d1d; stroke-width: 1.4; fill: none; stroke-dasharray: 1 5; stroke-linecap: round; }\n.lt-pid-software { stroke: #6a6a6a; stroke-width: 1.3; fill: none; stroke-dasharray: 2 4; }\n.lt-pid-mechanical { stroke: #1d1d1d; stroke-width: 1.4; fill: none; stroke-dasharray: 3 2 1 2; }\n\n.lt-pid-pneumatic-tick { stroke: #1d1d1d; stroke-width: 1.2; }\n\n.lt-inst-body { fill: #ffffff; stroke: #1d1d1d; stroke-width: 1.4; }\n.lt-inst-tag { font: 600 9.5px system-ui, sans-serif; fill: #1d1d1d; }\n.lt-inst-cr-line { stroke: #1d1d1d; stroke-width: 1; }\n.lt-inst-local-line { stroke: #1d1d1d; stroke-width: 1; stroke-dasharray: 2 2; }\n.lt-pid-valve-body { fill: #ffffff; stroke: #1d1d1d; stroke-width: 1.4; }\n\n.lt-pid-line-tag-bg { fill: #ffffff; stroke: #1d1d1d; stroke-width: 0.6; }\n.lt-pid-line-tag-text { font: 9px ui-monospace, monospace; fill: #1d1d1d; }\n\n.lt-pid-title { font: 600 14px system-ui, sans-serif; fill: #1d1d1d; }\n`;\n\nconst ARROW_ID = \"lt-pid-arrow\";\n\nfunction lineClass(t: PidLayoutLine[\"line\"][\"lineType\"]): string {\n return `lt-pid-${t.replace(\"_\", \"-\")}`;\n}\n\nfunction renderLine(l: PidLayoutLine): string {\n const cls = lineClass(l.line.lineType);\n const parts: string[] = [\n pathEl({\n d: l.path,\n class: cls,\n \"data-line-id\": l.line.id,\n \"data-service\": l.line.service ?? \"\",\n }),\n ];\n\n // Pneumatic: overlay tick marks every ~30 px along the path.\n if (l.line.lineType === \"pneumatic\") {\n parts.push(...pneumaticTicks(l.path));\n }\n\n // Render the line tag in the middle of the segment, if provided.\n if (l.line.tag) {\n const w = Math.max(28, l.line.tag.length * 6);\n parts.push(\n rect({\n x: l.midX - w / 2,\n y: l.midY - 8,\n width: w,\n height: 14,\n rx: 2,\n ry: 2,\n class: \"lt-pid-line-tag-bg\",\n })\n );\n parts.push(\n textEl(\n {\n x: l.midX,\n y: l.midY + 3,\n \"text-anchor\": \"middle\",\n class: \"lt-pid-line-tag-text\",\n },\n l.line.tag\n )\n );\n }\n\n return group({ class: \"lt-pid-line\", \"data-id\": l.line.id }, parts);\n}\n\nfunction pneumaticTicks(d: string): string[] {\n // Simple approach: parse \"M x y L x y L ...\" and emit ticks along straight segments.\n const tokens = d.match(/([MLC])\\s+(-?\\d+(?:\\.\\d+)?)\\s+(-?\\d+(?:\\.\\d+)?)/g) ?? [];\n const points: Array<{ x: number; y: number }> = [];\n for (const t of tokens) {\n const m = t.match(/[MLC]\\s+(-?\\d+(?:\\.\\d+)?)\\s+(-?\\d+(?:\\.\\d+)?)/);\n if (!m) continue;\n points.push({ x: parseFloat(m[1]), y: parseFloat(m[2]) });\n }\n const ticks: string[] = [];\n for (let i = 1; i < points.length; i++) {\n const a = points[i - 1]!;\n const b = points[i]!;\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const len = Math.hypot(dx, dy);\n if (len < 12) continue;\n const ux = dx / len;\n const uy = dy / len;\n // perpendicular unit\n const px = -uy;\n const py = ux;\n for (let s = 18; s < len; s += 26) {\n const cx = a.x + ux * s;\n const cy = a.y + uy * s;\n ticks.push(\n lineEl({\n x1: cx + px * 4 - ux * 4,\n y1: cy + py * 4 - uy * 4,\n x2: cx - px * 4 + ux * 4,\n y2: cy - py * 4 + uy * 4,\n class: \"lt-pid-pneumatic-tick\",\n })\n );\n }\n }\n return ticks;\n}\n\nexport function renderPidAST(ast: PidAST, _config?: RenderConfig): string {\n const layout = layoutPid(ast);\n return renderLayout(layout);\n}\n\nexport function renderPid(text: string, config?: RenderConfig): string {\n const ast = parsePid(text);\n return renderPidAST(ast, config);\n}\n\nfunction renderLayout(layout: PidLayoutResult): string {\n const equipNodes = layout.equipment.map((eq) => {\n const symbol = renderEquip(eq.equip.equipType, eq.equip.tag ?? eq.equip.id);\n return group(\n {\n class: \"lt-pid-equip-wrap\",\n \"data-id\": eq.equip.id,\n \"data-type\": eq.equip.equipType,\n transform: `translate(${eq.cx} ${eq.cy})`,\n },\n [symbol]\n );\n });\n\n const instNodes = layout.instruments.map((i) => {\n const { letter, number } = parseTag(i.inst.tag);\n return group(\n {\n class: \"lt-inst\",\n \"data-tag\": i.inst.tag,\n \"data-category\": i.inst.category,\n transform: `translate(${i.cx} ${i.cy})`,\n },\n [renderInstrument(i.inst.category, letter, number)]\n );\n });\n\n // Auto-generate signal connections from instrument relations:\n // - measures: dashed signal line from instrument to the measured equipment center\n // - controls: pneumatic signal line from instrument to the controlled valve actuator (or center)\n const autoSignals: string[] = [];\n for (const i of layout.instruments) {\n if (i.inst.measures) {\n const eq = layout.equipment.find((e) => e.equip.id === i.inst.measures);\n if (eq) {\n const ax = i.cx;\n const ay = i.cy;\n const bx = eq.cx;\n const by = eq.cy + eq.height / 2;\n autoSignals.push(\n pathEl({\n d: `M ${ax} ${ay} L ${ax} ${by + 8} L ${bx} ${by + 8} L ${bx} ${by}`,\n class: \"lt-pid-electric\",\n })\n );\n }\n }\n if (i.inst.controls) {\n const eq = layout.equipment.find((e) => e.equip.id === i.inst.controls);\n if (eq) {\n const ax = i.cx;\n const ay = i.cy + i.r;\n const bx = eq.cx;\n const by = eq.y;\n autoSignals.push(\n pathEl({\n d: `M ${ax} ${ay} L ${bx} ${ay} L ${bx} ${by}`,\n class: \"lt-pid-pneumatic\",\n })\n );\n }\n }\n }\n\n const titleNode = layout.title\n ? textEl({ x: 16, y: 22, class: \"lt-pid-title\" }, layout.title)\n : \"\";\n\n return svgRoot(\n {\n width: layout.width,\n height: layout.height,\n viewBox: `0 0 ${layout.width} ${layout.height}`,\n class: \"lt-pid\",\n \"data-diagram-type\": \"pid\",\n },\n [\n el(\"title\", {}, escapeXml(`P&ID${layout.title ? \" — \" + layout.title : \"\"}`)),\n el(\"desc\", {}, \"ISA-5.1 / ISO 10628 P&ID rendered by Schematex\"),\n defs([\n el(\n \"marker\",\n {\n id: ARROW_ID,\n markerWidth: 10,\n markerHeight: 10,\n refX: 9,\n refY: 3,\n orient: \"auto\",\n markerUnits: \"strokeWidth\",\n },\n [polygon({ points: \"0,0 10,3 0,6\", fill: \"#1d1d1d\" })]\n ),\n el(\"style\", {}, STYLE),\n ]),\n titleNode,\n group({ class: \"lt-pid-equipment\" }, equipNodes),\n group({ class: \"lt-pid-lines\" }, layout.lines.map(renderLine)),\n group({ class: \"lt-pid-signals\" }, autoSignals),\n group({ class: \"lt-pid-instruments\" }, instNodes),\n ]\n );\n}\n\nfunction parseTag(tag: string): { letter: string; number: string } {\n const idx = tag.indexOf(\"-\");\n if (idx < 0) return { letter: tag, number: \"\" };\n return { letter: tag.slice(0, idx), number: tag.slice(idx + 1) };\n}\n","import type { SchematexDiagnostic } from \"../../core/diagnostics\";\nimport type { PidAST, PidInstrument, PidLineType } from \"./types\";\nimport { parsePid } from \"./parser\";\n\n/**\n * ISA-5.1 instrument-loop completeness lint.\n *\n * The engine never *invents* missing loop elements (that would be guessing at\n * the engineer's intent) — it only flags loops the DSL describes incompletely\n * so a control engineer can trust the diagram at the element level:\n *\n * 1. PID_LOOP_INCOMPLETE — an instrument that `measures` a variable but has no\n * signal path reaching a controller (the classic \"transmitter with a\n * dangling output\" mistake).\n * 2. PID_SIGNAL_TYPE_MISMATCH — a signal line whose type contradicts ISA-5.1\n * §5.2 convention for the devices it connects (transmitter→controller is\n * electric; controller→control-valve is pneumatic).\n */\nexport function lintPid(text: string): SchematexDiagnostic[] {\n let ast: PidAST;\n try {\n ast = parsePid(text);\n } catch {\n // Parse failures are reported by the normal error path; lint stays silent.\n return [];\n }\n return lintPidAst(ast);\n}\n\n// Instrument signal lines (everything that isn't a process pipe).\nconst SIGNAL_TYPES = new Set<PidLineType>([\n \"pneumatic\",\n \"electric\",\n \"software\",\n \"capillary\",\n \"hydraulic\",\n \"mechanical\",\n]);\n\n/** Identification letters (the part before the tag number, e.g. `FIC` of `FIC-201`). */\nfunction idLetters(tag: string): string {\n const head = tag.split(\"-\")[0] ?? tag;\n return head.replace(/[^A-Za-z]/g, \"\").toUpperCase();\n}\n\n/** ISA succeeding-letter `C` = controller (FIC, FC, LIC, PIC, TIC, …). */\nfunction isController(tag: string): boolean {\n return idLetters(tag).slice(1).includes(\"C\");\n}\n\n/** ISA succeeding-letter `T` = transmitter (FT, LT, PT, TT, FIT, …). */\nfunction isTransmitter(tag: string): boolean {\n return idLetters(tag).slice(1).includes(\"T\");\n}\n\nexport function lintPidAst(ast: PidAST): SchematexDiagnostic[] {\n const out: SchematexDiagnostic[] = [];\n\n const instByTag = new Map<string, PidInstrument>();\n for (const inst of ast.instruments) instByTag.set(inst.tag, inst);\n\n const controlValveIds = new Set(\n ast.equipment.filter((e) => e.equipType === \"valve_control\").map((e) => e.id)\n );\n\n // ── Adjacency among instruments via signal lines ───────────────\n const signalAdj = new Map<string, Set<string>>();\n const addEdge = (a: string, b: string) => {\n if (!signalAdj.has(a)) signalAdj.set(a, new Set());\n signalAdj.get(a)!.add(b);\n };\n for (const ln of ast.lines) {\n if (!SIGNAL_TYPES.has(ln.lineType)) continue;\n const a = ln.from.id;\n const b = ln.to.id;\n if (instByTag.has(a) && instByTag.has(b)) {\n addEdge(a, b);\n addEdge(b, a);\n }\n }\n\n const canReachController = (start: string): boolean => {\n const seen = new Set<string>([start]);\n const queue = [start];\n while (queue.length) {\n const cur = queue.shift()!;\n if (cur !== start && isController(cur)) return true;\n for (const nxt of signalAdj.get(cur) ?? []) {\n if (!seen.has(nxt)) {\n seen.add(nxt);\n queue.push(nxt);\n }\n }\n }\n return false;\n };\n\n // ── Rule 1: loop completeness ───────────────────────────────────\n for (const inst of ast.instruments) {\n // A sensing element / transmitter participates in a loop when it `measures`\n // a variable. A controller is itself the loop's brain, so skip those.\n if (!inst.measures || isController(inst.tag)) continue;\n if (!canReachController(inst.tag)) {\n out.push({\n severity: \"warning\",\n code: \"PID_LOOP_INCOMPLETE\",\n message: `instrument loop ${inst.tag} has no signal path to a controller`,\n hint: `${inst.tag} measures '${inst.measures}' but no signal line (electric/pneumatic/…) connects it to a controller instrument (e.g. a tag with a 'C' function letter such as FIC). Add a signal line from ${inst.tag} to the controller.`,\n fatal: false,\n });\n }\n }\n\n // ── Rule 2: signal-line type vs device-type consistency ─────────\n for (const ln of ast.lines) {\n if (!SIGNAL_TYPES.has(ln.lineType)) continue;\n const a = ln.from.id;\n const b = ln.to.id;\n const aInst = instByTag.get(a);\n const bInst = instByTag.get(b);\n\n // transmitter ↔ controller → expect electric (4–20 mA analog signal)\n const txToCtrl =\n (aInst && isTransmitter(a) && !isController(a) && bInst && isController(b)) ||\n (bInst && isTransmitter(b) && !isController(b) && aInst && isController(a));\n if (txToCtrl && ln.lineType !== \"electric\") {\n out.push({\n severity: \"warning\",\n code: \"PID_SIGNAL_TYPE_MISMATCH\",\n message: `signal line ${a}→${b} is '${ln.lineType}' but a transmitter→controller link should be 'electric' (ISA-5.1 §5.2)`,\n hint: `Set [type: electric] on this line, or rename the devices if the connection is not a transmitter→controller measurement signal.`,\n fatal: false,\n });\n continue;\n }\n\n // controller ↔ control valve → expect pneumatic (3–15 psi to actuator)\n const ctrlToValve =\n (aInst && isController(a) && controlValveIds.has(b)) ||\n (bInst && isController(b) && controlValveIds.has(a));\n if (ctrlToValve && ln.lineType !== \"pneumatic\") {\n out.push({\n severity: \"warning\",\n code: \"PID_SIGNAL_TYPE_MISMATCH\",\n message: `signal line ${a}→${b} is '${ln.lineType}' but a controller→control-valve link should be 'pneumatic' (ISA-5.1 §5.2)`,\n hint: `Set [type: pneumatic] on this line, or use [type: electric] only if the valve has an electric actuator.`,\n fatal: false,\n });\n }\n }\n\n return out;\n}\n","import type { DiagramPlugin, RenderConfig } from \"../../core/types\";\nimport { parsePid } from \"./parser\";\nimport { renderPidAST } from \"./renderer\";\nimport { lintPid } from \"./lint\";\n\nexport const pid: DiagramPlugin = {\n type: \"pid\" as DiagramPlugin[\"type\"],\n detect(text) {\n return /^\\s*pid\\b/i.test(text);\n },\n parse: parsePid,\n lint: lintPid,\n render(text, config?: RenderConfig) {\n const ast = parsePid(text);\n return renderPidAST(ast, config);\n },\n};\n\nexport { lintPid, lintPidAst } from \"./lint\";\nexport { parsePid, PidParseError } from \"./parser\";\nexport { renderPid, renderPidAST } from \"./renderer\";\nexport { layoutPid } from \"./layout\";\nexport type * from \"./types\";\n","/**\n * PRISMA 2020 DSL parser.\n *\n * Indentation-significant (2 spaces per level), comments via `#` / `//`.\n * Spec: docs/reference/28-PRISMA-STANDARD.md §6\n */\n\nimport type {\n PrismaAST,\n PrismaEligibility,\n PrismaExclusion,\n PrismaIdentificationDatabases,\n PrismaIdentificationOther,\n PrismaIncluded,\n PrismaKind,\n PrismaMode,\n PrismaPreviousStudies,\n PrismaReason,\n PrismaScreening,\n PrismaSource,\n PrismaValidateCounts,\n} from \"./types\";\n\nexport class PrismaParseError extends Error {\n constructor(\n message: string,\n public line?: number,\n ) {\n super(line !== undefined ? `Line ${line}: ${message}` : message);\n this.name = \"PrismaParseError\";\n }\n}\n\ninterface RawLine {\n indent: number;\n text: string;\n line: number;\n}\n\nfunction preprocess(src: string): RawLine[] {\n const out: RawLine[] = [];\n const rows = src.split(/\\r?\\n/);\n for (let i = 0; i < rows.length; i++) {\n const raw = rows[i] ?? \"\";\n // Strip end-of-line comments but preserve `#` inside quotes.\n const stripped = stripComment(raw);\n if (!stripped.trim()) continue;\n const indentSpaces = stripped.length - stripped.replace(/^\\s+/, \"\").length;\n out.push({\n indent: Math.floor(indentSpaces / 2),\n text: stripped.trim(),\n line: i + 1,\n });\n }\n return out;\n}\n\nfunction stripComment(raw: string): string {\n // Lines starting with # or // are full-line comments.\n const t = raw.trimStart();\n if (t.startsWith(\"#\") || t.startsWith(\"//\")) return \"\";\n // End-of-line `# …` (only if # is not inside quotes — sources/reasons can include \"#\" via quoting; keep simple: respect quotes).\n let inQ = false;\n for (let i = 0; i < raw.length; i++) {\n const c = raw[i];\n if (c === '\"') inQ = !inQ;\n else if (!inQ && c === \"#\") return raw.slice(0, i);\n }\n return raw;\n}\n\nfunction parseInt10(s: string, lineNum: number): number {\n const cleaned = s.replace(/[,_\\s]/g, \"\");\n if (!/^-?\\d+$/.test(cleaned)) {\n throw new PrismaParseError(`expected integer, got \"${s}\"`, lineNum);\n }\n return Number.parseInt(cleaned, 10);\n}\n\nfunction splitKV(text: string, lineNum: number): { key: string; value: string } {\n const colon = text.indexOf(\":\");\n if (colon < 0) throw new PrismaParseError(`expected \"key: value\", got \"${text}\"`, lineNum);\n return {\n key: text.slice(0, colon).trim().toLowerCase(),\n value: text.slice(colon + 1).trim(),\n };\n}\n\n/**\n * Split \"name=count, other name=count\" into pairs. Honours double-quoted names\n * for items with spaces or commas.\n */\nfunction parsePairs(value: string, lineNum: number): Array<{ name: string; count: number }> {\n const out: Array<{ name: string; count: number }> = [];\n if (!value.trim()) return out;\n const tokens: string[] = [];\n let buf = \"\";\n let inQ = false;\n for (let i = 0; i < value.length; i++) {\n const c = value[i];\n if (c === '\"') { inQ = !inQ; buf += c; continue; }\n if (!inQ && c === \",\") {\n if (buf.trim()) tokens.push(buf.trim());\n buf = \"\";\n continue;\n }\n buf += c;\n }\n if (buf.trim()) tokens.push(buf.trim());\n\n for (const tok of tokens) {\n const eq = tok.lastIndexOf(\"=\");\n if (eq < 0) {\n throw new PrismaParseError(`expected \"name=count\", got \"${tok}\"`, lineNum);\n }\n let name = tok.slice(0, eq).trim();\n const countStr = tok.slice(eq + 1).trim();\n if (name.startsWith('\"') && name.endsWith('\"')) name = name.slice(1, -1);\n if (!name) throw new PrismaParseError(`empty name in pair \"${tok}\"`, lineNum);\n out.push({ name, count: parseInt10(countStr, lineNum) });\n }\n return out;\n}\n\n/**\n * Consume contiguous child lines whose indent > parentIndent. Returns them,\n * and advances `cursor.i`.\n */\nfunction consumeBlock(\n lines: RawLine[],\n cursor: { i: number },\n parentIndent: number,\n): RawLine[] {\n const out: RawLine[] = [];\n while (cursor.i < lines.length) {\n const l = lines[cursor.i]!;\n if (l.indent <= parentIndent) break;\n out.push(l);\n cursor.i++;\n }\n return out;\n}\n\n/** Group a block of children by their first-level keys. */\nfunction splitChildren(block: RawLine[]): Map<string, { header: RawLine; children: RawLine[] }> {\n const out = new Map<string, { header: RawLine; children: RawLine[] }>();\n if (block.length === 0) return out;\n const baseIndent = block[0]!.indent;\n for (let i = 0; i < block.length; i++) {\n const l = block[i]!;\n if (l.indent !== baseIndent) {\n throw new PrismaParseError(\n `unexpected indent in block (expected ${baseIndent * 2} spaces, got ${l.indent * 2})`,\n l.line,\n );\n }\n const { key, value } = splitKV(l.text, l.line);\n // Find children whose indent is greater than this base, contiguous.\n const childs: RawLine[] = [];\n let j = i + 1;\n while (j < block.length && block[j]!.indent > baseIndent) {\n childs.push(block[j]!);\n j++;\n }\n // Re-pack: the line itself goes in as \"header\" so the value (if any) can be read.\n out.set(key, { header: { ...l, text: value ? `${key}: ${value}` : `${key}:` }, children: childs });\n i = j - 1;\n }\n return out;\n}\n\nfunction readScalar(map: Map<string, { header: RawLine; children: RawLine[] }>, key: string): { value: string; line: number } | undefined {\n const entry = map.get(key);\n if (!entry) return undefined;\n if (entry.children.length > 0) {\n throw new PrismaParseError(`\"${key}\" must be a single-line value, not a block`, entry.header.line);\n }\n const { value } = splitKV(entry.header.text, entry.header.line);\n return { value, line: entry.header.line };\n}\n\nfunction readInt(map: Map<string, { header: RawLine; children: RawLine[] }>, key: string): number | undefined {\n const r = readScalar(map, key);\n if (r === undefined) return undefined;\n return parseInt10(r.value, r.line);\n}\n\nfunction readSources(map: Map<string, { header: RawLine; children: RawLine[] }>, key: string): PrismaSource[] | undefined {\n const r = readScalar(map, key);\n if (r === undefined) return undefined;\n return parsePairs(r.value, r.line);\n}\n\nfunction readReasons(map: Map<string, { header: RawLine; children: RawLine[] }>, key: string): PrismaReason[] | undefined {\n const r = readScalar(map, key);\n if (r === undefined) return undefined;\n return parsePairs(r.value, r.line);\n}\n\nfunction readBlock(map: Map<string, { header: RawLine; children: RawLine[] }>, key: string): RawLine[] | undefined {\n const entry = map.get(key);\n if (!entry) return undefined;\n return entry.children;\n}\n\nfunction requireInt(\n map: Map<string, { header: RawLine; children: RawLine[] }>,\n key: string,\n contextLine: number,\n context: string,\n): number {\n const v = readInt(map, key);\n if (v === undefined) {\n throw new PrismaParseError(`${context} is missing required field \"${key}\"`, contextLine);\n }\n return v;\n}\n\nconst ALLOWED_IDENT_DB = new Set([\n \"n\",\n \"sources\",\n \"duplicates-removed\",\n \"ineligible-automation\",\n \"other-removed\",\n]);\nconst ALLOWED_IDENT_OTHER = new Set([\"n\", \"sources\"]);\nconst ALLOWED_SCREENING = new Set([\n \"records-screened\",\n \"excluded\",\n \"reports-sought\",\n \"reports-not-retrieved\",\n]);\nconst ALLOWED_ELIGIBILITY = new Set([\"full-text-assessed\", \"excluded\"]);\nconst ALLOWED_INCLUDED = new Set([\"studies\", \"reports\", \"participants\"]);\nconst ALLOWED_EXCLUDED = new Set([\"n\", \"reasons\"]);\nconst ALLOWED_PREVIOUS = new Set([\"n\", \"reports\", \"sources\"]);\nconst ALLOWED_IDENT_TOP = new Set([\"databases\", \"other\"]);\n\nfunction assertKeys(\n map: Map<string, { header: RawLine; children: RawLine[] }>,\n allowed: Set<string>,\n context: string,\n): void {\n for (const [k, entry] of map.entries()) {\n if (!allowed.has(k)) {\n throw new PrismaParseError(`unknown key \"${k}\" in ${context}`, entry.header.line);\n }\n }\n}\n\nfunction parseExclusion(block: RawLine[], contextLine: number): PrismaExclusion {\n const map = splitChildren(block);\n assertKeys(map, ALLOWED_EXCLUDED, \"excluded\");\n const n = requireInt(map, \"n\", contextLine, \"excluded\");\n const reasons = readReasons(map, \"reasons\");\n return reasons ? { n, reasons } : { n };\n}\n\nfunction parsePreviousBlock(block: RawLine[], contextLine: number): PrismaPreviousStudies {\n const map = splitChildren(block);\n assertKeys(map, ALLOWED_PREVIOUS, \"previous-studies\");\n const n = requireInt(map, \"n\", contextLine, \"previous-studies\");\n const reports = readInt(map, \"reports\");\n const sources = readSources(map, \"sources\");\n const out: PrismaPreviousStudies = { n };\n if (reports !== undefined) out.reports = reports;\n if (sources) out.sources = sources;\n return out;\n}\n\nfunction parseIdentificationDatabases(block: RawLine[], contextLine: number): PrismaIdentificationDatabases {\n const map = splitChildren(block);\n assertKeys(map, ALLOWED_IDENT_DB, \"identification.databases\");\n const n = requireInt(map, \"n\", contextLine, \"identification.databases\");\n const sources = readSources(map, \"sources\");\n const duplicatesRemoved = readInt(map, \"duplicates-removed\");\n const ineligibleAutomation = readInt(map, \"ineligible-automation\");\n const otherRemoved = readInt(map, \"other-removed\");\n const out: PrismaIdentificationDatabases = { n };\n if (sources) out.sources = sources;\n if (duplicatesRemoved !== undefined) out.duplicatesRemoved = duplicatesRemoved;\n if (ineligibleAutomation !== undefined) out.ineligibleAutomation = ineligibleAutomation;\n if (otherRemoved !== undefined) out.otherRemoved = otherRemoved;\n return out;\n}\n\nfunction parseIdentificationOther(block: RawLine[], contextLine: number): PrismaIdentificationOther {\n const map = splitChildren(block);\n assertKeys(map, ALLOWED_IDENT_OTHER, \"identification.other\");\n const n = requireInt(map, \"n\", contextLine, \"identification.other\");\n const sources = readSources(map, \"sources\");\n return sources ? { n, sources } : { n };\n}\n\nfunction parseScreening(block: RawLine[], contextLine: number): PrismaScreening {\n const map = splitChildren(block);\n assertKeys(map, ALLOWED_SCREENING, \"screening\");\n const recordsScreened = requireInt(map, \"records-screened\", contextLine, \"screening\");\n const excludedBlock = readBlock(map, \"excluded\");\n if (!excludedBlock || excludedBlock.length === 0) {\n throw new PrismaParseError(`screening is missing required \"excluded:\" block`, contextLine);\n }\n const excluded = parseExclusion(excludedBlock, map.get(\"excluded\")!.header.line);\n const reportsSought = readInt(map, \"reports-sought\");\n const reportsNotRetrieved = readInt(map, \"reports-not-retrieved\");\n const out: PrismaScreening = { recordsScreened, excluded };\n if (reportsSought !== undefined) out.reportsSought = reportsSought;\n if (reportsNotRetrieved !== undefined) out.reportsNotRetrieved = reportsNotRetrieved;\n return out;\n}\n\nfunction parseEligibility(block: RawLine[], contextLine: number): PrismaEligibility {\n const map = splitChildren(block);\n assertKeys(map, ALLOWED_ELIGIBILITY, \"eligibility\");\n const fullTextAssessed = requireInt(map, \"full-text-assessed\", contextLine, \"eligibility\");\n const excludedBlock = readBlock(map, \"excluded\");\n if (!excludedBlock || excludedBlock.length === 0) {\n throw new PrismaParseError(`eligibility is missing required \"excluded:\" block`, contextLine);\n }\n const excluded = parseExclusion(excludedBlock, map.get(\"excluded\")!.header.line);\n return { fullTextAssessed, excluded };\n}\n\nfunction parseIncluded(block: RawLine[], contextLine: number): PrismaIncluded {\n const map = splitChildren(block);\n assertKeys(map, ALLOWED_INCLUDED, \"included\");\n const studies = requireInt(map, \"studies\", contextLine, \"included\");\n const reports = readInt(map, \"reports\");\n const participants = readInt(map, \"participants\");\n const out: PrismaIncluded = { studies };\n if (reports !== undefined) out.reports = reports;\n if (participants !== undefined) out.participants = participants;\n return out;\n}\n\nfunction parseMode(value: string, line: number): PrismaMode {\n const v = value.trim().toLowerCase();\n if (v === \"2020-single\" || v === \"2020-dual\" || v === \"2009\") return v;\n throw new PrismaParseError(`unknown mode \"${value}\" — expected 2020-single, 2020-dual, or 2009`, line);\n}\n\nfunction parseKind(value: string, line: number): PrismaKind {\n const v = value.trim().toLowerCase();\n if (v === \"systematic-review\" || v === \"scoping-review\" || v === \"ipd\" || v === \"nma\") return v;\n throw new PrismaParseError(`unknown kind \"${value}\" — expected systematic-review, scoping-review, ipd, or nma`, line);\n}\n\nfunction parseValidate(value: string, line: number): PrismaValidateCounts {\n const v = value.trim().toLowerCase();\n if (v === \"strict\" || v === \"warn\" || v === \"off\") return v;\n throw new PrismaParseError(`validate-counts must be strict|warn|off, got \"${value}\"`, line);\n}\n\nconst STAGE_KEYS = new Set([\n \"previous-studies\",\n \"identification\",\n \"screening\",\n \"eligibility\",\n \"included\",\n]);\n\nexport function parsePrisma(src: string): PrismaAST {\n const lines = preprocess(src);\n if (lines.length === 0) throw new PrismaParseError(\"empty input\");\n\n const header = lines.shift()!;\n if (header.indent !== 0 || header.text.toLowerCase() !== \"prisma\") {\n throw new PrismaParseError(`first non-blank line must be \"prisma\", got \"${header.text}\"`, header.line);\n }\n\n // Meta lines: indent 0, \"key: value\", before any stage block.\n let mode: PrismaMode = \"2020-single\";\n let kind: PrismaKind = \"systematic-review\";\n let validateCounts: PrismaValidateCounts = \"warn\";\n let title: string | undefined;\n let reviewId: string | undefined;\n\n while (lines.length > 0 && lines[0]!.indent === 0) {\n const l = lines[0]!;\n const firstTok = l.text.split(\":\")[0]!.trim().toLowerCase();\n if (STAGE_KEYS.has(firstTok)) break;\n const { key, value } = splitKV(l.text, l.line);\n switch (key) {\n case \"mode\":\n mode = parseMode(value, l.line);\n break;\n case \"kind\":\n case \"review-kind\":\n kind = parseKind(value, l.line);\n break;\n case \"validate-counts\":\n validateCounts = parseValidate(value, l.line);\n break;\n case \"title\":\n title = unquote(value);\n break;\n case \"review-id\":\n reviewId = unquote(value);\n break;\n case \"direction\":\n if (!/^(TB|TD)$/i.test(value.trim())) {\n throw new PrismaParseError(`direction must be TB (top-to-bottom); PRISMA is vertical by standard`, l.line);\n }\n break;\n default:\n throw new PrismaParseError(`unknown meta key \"${key}\"`, l.line);\n }\n lines.shift();\n }\n\n // Stage blocks.\n const cursor = { i: 0 };\n let previousStudies: PrismaPreviousStudies | undefined;\n let identification: PrismaIdentificationDatabases | undefined;\n let identificationOther: PrismaIdentificationOther | undefined;\n let screening: PrismaScreening | undefined;\n let eligibility: PrismaEligibility | undefined;\n let included: PrismaIncluded | undefined;\n\n while (cursor.i < lines.length) {\n const head = lines[cursor.i]!;\n if (head.indent !== 0) {\n throw new PrismaParseError(`unexpected indented line at top level: \"${head.text}\"`, head.line);\n }\n const { key } = splitKV(head.text, head.line);\n cursor.i++;\n const block = consumeBlock(lines, cursor, head.indent);\n switch (key) {\n case \"previous-studies\":\n previousStudies = parsePreviousBlock(block, head.line);\n break;\n case \"identification\": {\n const sub = splitChildren(block);\n assertKeys(sub, ALLOWED_IDENT_TOP, \"identification\");\n const dbBlock = readBlock(sub, \"databases\");\n if (!dbBlock || dbBlock.length === 0) {\n throw new PrismaParseError(`identification is missing required \"databases:\" block`, head.line);\n }\n identification = parseIdentificationDatabases(dbBlock, sub.get(\"databases\")!.header.line);\n const otherBlock = readBlock(sub, \"other\");\n if (otherBlock && otherBlock.length > 0) {\n identificationOther = parseIdentificationOther(otherBlock, sub.get(\"other\")!.header.line);\n }\n break;\n }\n case \"screening\":\n screening = parseScreening(block, head.line);\n break;\n case \"eligibility\":\n eligibility = parseEligibility(block, head.line);\n break;\n case \"included\":\n included = parseIncluded(block, head.line);\n break;\n default:\n throw new PrismaParseError(`unknown stage \"${key}\"`, head.line);\n }\n }\n\n if (!identification) throw new PrismaParseError(`required stage \"identification\" is missing`);\n if (!screening) throw new PrismaParseError(`required stage \"screening\" is missing`);\n if (!eligibility) throw new PrismaParseError(`required stage \"eligibility\" is missing`);\n if (!included) throw new PrismaParseError(`required stage \"included\" is missing`);\n\n // If user wrote 2020-dual but supplied no \"other:\" pipeline, downgrade to single with warning.\n // If user wrote 2020-single but supplied \"other:\", upgrade to 2020-dual.\n const warnings: string[] = [];\n if (mode === \"2020-dual\" && !identificationOther) {\n warnings.push(`mode is \"2020-dual\" but no \"other:\" pipeline was provided — falling back to single column`);\n mode = \"2020-single\";\n } else if (mode !== \"2020-dual\" && identificationOther) {\n warnings.push(`an \"other:\" identification pipeline was supplied — switching mode to \"2020-dual\"`);\n mode = \"2020-dual\";\n }\n\n const ast: PrismaAST = {\n type: \"prisma\",\n mode,\n kind,\n validateCounts,\n identification,\n screening,\n eligibility,\n included,\n warnings,\n };\n if (title !== undefined) ast.title = title;\n if (reviewId !== undefined) ast.reviewId = reviewId;\n if (previousStudies) ast.previousStudies = previousStudies;\n if (identificationOther) ast.identificationOther = identificationOther;\n\n runArithmeticValidation(ast);\n\n return ast;\n}\n\nfunction unquote(s: string): string {\n const t = s.trim();\n if (t.startsWith('\"') && t.endsWith('\"')) return t.slice(1, -1);\n return t;\n}\n\n// ─── Count arithmetic ───────────────────────────────────────────\n\nfunction runArithmeticValidation(ast: PrismaAST): void {\n if (ast.validateCounts === \"off\") return;\n\n const issues: string[] = [];\n const id = ast.identification;\n const other = ast.identificationOther;\n\n const identifiedTotal =\n id.n + (other ? other.n : 0);\n const removedBeforeScreening =\n (id.duplicatesRemoved ?? 0) +\n (id.ineligibleAutomation ?? 0) +\n (id.otherRemoved ?? 0);\n const expectedScreened = identifiedTotal - removedBeforeScreening;\n const actualScreened = ast.screening.recordsScreened;\n if (expectedScreened !== actualScreened) {\n issues.push(\n `records-screened expected ${formatN(expectedScreened)} ` +\n `(identified ${formatN(identifiedTotal)} − removed ${formatN(removedBeforeScreening)}), ` +\n `got ${formatN(actualScreened)} (off by ${formatN(actualScreened - expectedScreened)})`,\n );\n }\n\n const screened = ast.screening.recordsScreened;\n const screenedExcluded = ast.screening.excluded.n;\n const afterScreening = screened - screenedExcluded;\n // Allow either: afterScreening == reports-sought, or afterScreening == full-text-assessed.\n const sought = ast.screening.reportsSought;\n const notRetrieved = ast.screening.reportsNotRetrieved ?? 0;\n const fullText = ast.eligibility.fullTextAssessed;\n if (sought !== undefined) {\n if (sought !== afterScreening) {\n issues.push(\n `reports-sought expected ${formatN(afterScreening)} ` +\n `(screened ${formatN(screened)} − excluded ${formatN(screenedExcluded)}), got ${formatN(sought)}`,\n );\n }\n if (fullText !== sought - notRetrieved) {\n issues.push(\n `full-text-assessed expected ${formatN(sought - notRetrieved)} ` +\n `(reports-sought ${formatN(sought)} − not-retrieved ${formatN(notRetrieved)}), got ${formatN(fullText)}`,\n );\n }\n } else {\n if (fullText !== afterScreening) {\n issues.push(\n `full-text-assessed expected ${formatN(afterScreening)} ` +\n `(screened ${formatN(screened)} − excluded ${formatN(screenedExcluded)}), got ${formatN(fullText)}`,\n );\n }\n }\n\n const eligExcluded = ast.eligibility.excluded.n;\n const includedExpected = fullText - eligExcluded;\n const reports = ast.included.reports ?? ast.included.studies;\n if (reports < includedExpected) {\n issues.push(\n `included reports/studies (${formatN(reports)}) is less than full-text-assessed − reports-excluded (${formatN(includedExpected)})`,\n );\n }\n\n // Source breakdown sums.\n if (id.sources && id.sources.length > 0) {\n const sum = id.sources.reduce((a, s) => a + s.count, 0);\n if (sum !== id.n) {\n issues.push(\n `identification.databases sources sum to ${formatN(sum)} but n = ${formatN(id.n)} (off by ${formatN(sum - id.n)})`,\n );\n }\n }\n if (other && other.sources && other.sources.length > 0) {\n const sum = other.sources.reduce((a, s) => a + s.count, 0);\n if (sum !== other.n) {\n issues.push(\n `identification.other sources sum to ${formatN(sum)} but n = ${formatN(other.n)}`,\n );\n }\n }\n if (ast.screening.excluded.reasons && ast.screening.excluded.reasons.length > 0) {\n const sum = ast.screening.excluded.reasons.reduce((a, r) => a + r.count, 0);\n if (sum !== screenedExcluded) {\n issues.push(\n `screening.excluded reasons sum to ${formatN(sum)} but n = ${formatN(screenedExcluded)}`,\n );\n }\n }\n if (ast.eligibility.excluded.reasons && ast.eligibility.excluded.reasons.length > 0) {\n const sum = ast.eligibility.excluded.reasons.reduce((a, r) => a + r.count, 0);\n if (sum !== eligExcluded) {\n issues.push(\n `eligibility.excluded reasons sum to ${formatN(sum)} but n = ${formatN(eligExcluded)}`,\n );\n }\n }\n\n if (issues.length === 0) return;\n\n if (ast.validateCounts === \"strict\") {\n throw new PrismaParseError(`count-arithmetic validation failed:\\n - ${issues.join(\"\\n - \")}`);\n }\n ast.warnings.push(...issues);\n}\n\nfunction formatN(n: number): string {\n return n.toLocaleString(\"en-US\");\n}\n","/**\n * PRISMA 2020 flow diagram layout.\n *\n * Rigid 4-row vertical layout (Identification → Screening → Eligibility → Included),\n * with optional \"previous-studies\" row on top and optional second Identification\n * column (\"other methods\") in 2020-dual mode. Layout is deterministic and\n * geometry-only — no font metrics; widths are estimated from an average char width.\n *\n * Spec: docs/reference/28-PRISMA-STANDARD.md §7\n */\n\nimport type {\n PrismaAST,\n PrismaBox,\n PrismaBoxRole,\n PrismaColumnHeader,\n PrismaEdge,\n PrismaIdentificationDatabases,\n PrismaIdentificationOther,\n PrismaIncluded,\n PrismaKind,\n PrismaLayoutResult,\n PrismaPreviousStudies,\n PrismaReason,\n PrismaStageBand,\n PrismaTextLine,\n} from \"./types\";\n\n// ─── Tunables ───────────────────────────────────────────────────\n\nexport const PRISMA_CONST = {\n ROW_GAP: 56,\n /** Extra gap below the dual-pipeline identification row so the Y-junction\n * trunk has room to breathe before the screening box. */\n DUAL_MERGE_GAP: 84,\n COL_GAP: 80, // gap between main pipeline and exclusion side-box\n DUAL_COL_GAP: 56, // gap between left/right Identification boxes\n OUTER_PAD_X: 24,\n OUTER_PAD_TOP: 20,\n OUTER_PAD_BOTTOM: 20,\n TITLE_HEIGHT: 36, // reserved when ast.title is set\n WARNING_LINE_HEIGHT: 14,\n\n BOX_PAD_X: 16,\n BOX_PAD_Y: 12,\n LINE_HEIGHT: 17,\n LABEL_LINE_HEIGHT: 19,\n COUNT_LINE_HEIGHT: 18,\n BOX_RADIUS: 8,\n GAP_AFTER_LABEL: 2,\n GAP_BEFORE_BREAKDOWN: 2,\n\n MIN_MAIN_WIDTH: 220,\n MAX_MAIN_WIDTH: 380,\n MIN_SIDE_WIDTH: 200,\n MAX_SIDE_WIDTH: 320,\n\n ARROWHEAD_LEN: 8,\n\n // Approx char widths (px) for default font stack at 12px.\n CHAR_W_LABEL: 7.0, // bold 12px label / count\n CHAR_W_BODY: 6.4, // regular 12px source / reason\n CHAR_W_SUBTITLE: 6.0,\n\n // Aggregation rule for long reason lists.\n MAX_REASON_LINES: 8,\n\n // Stage band on the left (rotated text: Identification / Screening / Included).\n LEFT_BAND_WIDTH: 34,\n LEFT_BAND_GAP: 10,\n // Top header bar above each identification column-group. Rendered as an\n // independent horizontal bar separated from the boxes by a gap (mirrors the\n // standalone left-side stage bands).\n TOP_HEADER_LINE_HEIGHT: 16,\n TOP_HEADER_PAD_Y: 6,\n TOP_HEADER_PAD_X: 10,\n TOP_HEADER_GAP: 12,\n CHAR_W_HEADER: 6.8, // bold 12px white-on-accent header text\n} as const;\n\ninterface BoxSpec {\n role: PrismaBoxRole;\n variant: \"main\" | \"exclusion\" | \"previous\";\n lines: PrismaTextLine[];\n minWidth: number;\n maxWidth: number;\n}\n\n// ─── Vocabulary ────────────────────────────────────────────────\n\nfunction vocab(kind: PrismaKind) {\n const scoping = kind === \"scoping-review\";\n return {\n identificationHeader: scoping ? \"Identification of sources via databases and registers\" : \"Identification of studies via databases and registers\",\n identificationOtherHeader: scoping ? \"Identification of sources via other methods\" : \"Identification of studies via other methods\",\n recordsIdentified: scoping ? \"Sources identified from:\" : \"Records identified from:\",\n recordsRemovedLabel: scoping ? \"Sources removed before screening\" : \"Records removed before screening\",\n duplicatesLabel: \"Duplicate records removed\",\n automationLabel: \"Records marked as ineligible by automation tools\",\n otherRemovedLabel: \"Records removed for other reasons\",\n recordsScreened: scoping ? \"Sources screened\" : \"Records screened\",\n recordsExcluded: scoping ? \"Sources excluded\" : \"Records excluded\",\n reportsSought: \"Reports sought for retrieval\",\n reportsNotRetrieved: \"Reports not retrieved\",\n fullTextAssessed: scoping ? \"Sources assessed for eligibility\" : \"Reports assessed for eligibility\",\n reportsExcluded: scoping ? \"Sources excluded, with reasons:\" : \"Reports excluded, with reasons:\",\n includedHeader: scoping ? \"Sources of evidence included in review\" : \"Studies included in review\",\n studiesLabel: scoping ? \"Sources of evidence included\" : \"Studies included\",\n reportsLabel: scoping ? \"Reports of included sources\" : \"Reports of included studies\",\n participantsLabel: \"Participants in included studies\",\n previousHeader: scoping ? \"Previous sources\" : \"Previous studies\",\n } as const;\n}\n\n// ─── Source / reason aggregation ────────────────────────────────\n\nfunction aggregateReasons(reasons: PrismaReason[] | undefined): { lines: PrismaReason[]; truncated: number } {\n if (!reasons || reasons.length === 0) return { lines: [], truncated: 0 };\n if (reasons.length <= PRISMA_CONST.MAX_REASON_LINES) return { lines: reasons, truncated: 0 };\n const sorted = [...reasons].sort((a, b) => b.count - a.count);\n const head = sorted.slice(0, PRISMA_CONST.MAX_REASON_LINES - 1);\n const tail = sorted.slice(PRISMA_CONST.MAX_REASON_LINES - 1);\n const otherSum = tail.reduce((a, r) => a + r.count, 0);\n return {\n lines: [...head, { name: `Other (${tail.length} reasons)`, count: otherSum }],\n truncated: tail.length,\n };\n}\n\n// ─── Box content builders ──────────────────────────────────────\n\nfunction nFmt(n: number): string {\n return n.toLocaleString(\"en-US\");\n}\n\nfunction buildPreviousBox(prev: PrismaPreviousStudies, kind: PrismaKind): BoxSpec {\n const v = vocab(kind);\n const lines: PrismaTextLine[] = [\n { text: v.previousHeader, style: \"label\" },\n { text: `Studies (n = ${nFmt(prev.n)})`, style: \"count\" },\n ];\n if (prev.reports !== undefined) {\n lines.push({ text: `Reports (n = ${nFmt(prev.reports)})`, style: \"count\" });\n }\n if (prev.sources) {\n for (const s of prev.sources) {\n lines.push({ text: `${s.name} (n = ${nFmt(s.count)})`, style: \"source\", indent: 1 });\n }\n }\n return { role: \"previous\", variant: \"previous\", lines, minWidth: PRISMA_CONST.MIN_MAIN_WIDTH, maxWidth: PRISMA_CONST.MAX_MAIN_WIDTH };\n}\n\nfunction buildIdentificationDatabasesBox(\n id: PrismaIdentificationDatabases,\n kind: PrismaKind,\n): BoxSpec {\n const v = vocab(kind);\n const lines: PrismaTextLine[] = [];\n lines.push({ text: v.recordsIdentified, style: \"label\" });\n if (id.sources && id.sources.length > 0) {\n for (const s of id.sources) {\n lines.push({ text: `${s.name} (n = ${nFmt(s.count)})`, style: \"source\", indent: 1 });\n }\n }\n lines.push({ text: `Total (n = ${nFmt(id.n)})`, style: \"count\" });\n return {\n role: \"id-databases\",\n variant: \"main\",\n lines,\n minWidth: PRISMA_CONST.MIN_MAIN_WIDTH,\n maxWidth: PRISMA_CONST.MAX_MAIN_WIDTH,\n };\n}\n\n/** \"Records removed before screening\" — its own box in the right column, covered\n * by the same section header as the identified box. Returns null when there is\n * nothing to remove. */\nfunction buildIdentificationRemovedBox(\n id: PrismaIdentificationDatabases,\n kind: PrismaKind,\n): BoxSpec | null {\n const v = vocab(kind);\n const removed: string[] = [];\n if (id.duplicatesRemoved !== undefined && id.duplicatesRemoved > 0) {\n removed.push(`Duplicate records removed (n = ${nFmt(id.duplicatesRemoved)})`);\n }\n if (id.ineligibleAutomation !== undefined && id.ineligibleAutomation > 0) {\n removed.push(`Marked ineligible by automation (n = ${nFmt(id.ineligibleAutomation)})`);\n }\n if (id.otherRemoved !== undefined && id.otherRemoved > 0) {\n removed.push(`Removed for other reasons (n = ${nFmt(id.otherRemoved)})`);\n }\n if (removed.length === 0) return null;\n const lines: PrismaTextLine[] = [{ text: v.recordsRemovedLabel, style: \"label\" }];\n for (const r of removed) {\n lines.push({ text: r, style: \"reason\", indent: 1 });\n }\n return {\n role: \"id-removed\",\n variant: \"exclusion\",\n lines,\n minWidth: PRISMA_CONST.MIN_SIDE_WIDTH,\n maxWidth: PRISMA_CONST.MAX_SIDE_WIDTH,\n };\n}\n\nfunction buildIdentificationOtherBox(other: PrismaIdentificationOther, kind: PrismaKind): BoxSpec {\n const v = vocab(kind);\n const lines: PrismaTextLine[] = [];\n lines.push({ text: v.identificationOtherHeader, style: \"label\" });\n if (other.sources && other.sources.length > 0) {\n for (const s of other.sources) {\n lines.push({ text: `${s.name} (n = ${nFmt(s.count)})`, style: \"source\", indent: 1 });\n }\n }\n lines.push({ text: `Total (n = ${nFmt(other.n)})`, style: \"count\" });\n return {\n role: \"id-other\",\n variant: \"main\",\n lines,\n minWidth: PRISMA_CONST.MIN_MAIN_WIDTH,\n maxWidth: PRISMA_CONST.MAX_MAIN_WIDTH,\n };\n}\n\nfunction buildScreeningBox(\n recordsScreened: number,\n reportsSought: number | undefined,\n reportsNotRetrieved: number | undefined,\n kind: PrismaKind,\n): BoxSpec {\n const v = vocab(kind);\n const lines: PrismaTextLine[] = [\n { text: v.recordsScreened, style: \"label\" },\n { text: `n = ${nFmt(recordsScreened)}`, style: \"count\" },\n ];\n if (reportsSought !== undefined) {\n lines.push({ text: v.reportsSought, style: \"subtitle\" });\n lines.push({ text: `n = ${nFmt(reportsSought)}`, style: \"count\" });\n }\n if (reportsNotRetrieved !== undefined) {\n lines.push({ text: `${v.reportsNotRetrieved} (n = ${nFmt(reportsNotRetrieved)})`, style: \"source\" });\n }\n return {\n role: \"screening\",\n variant: \"main\",\n lines,\n minWidth: PRISMA_CONST.MIN_MAIN_WIDTH,\n maxWidth: PRISMA_CONST.MAX_MAIN_WIDTH,\n };\n}\n\nfunction buildScreeningExcludedBox(n: number, reasons: PrismaReason[] | undefined, kind: PrismaKind): BoxSpec {\n const v = vocab(kind);\n const { lines: items } = aggregateReasons(reasons);\n const out: PrismaTextLine[] = [\n { text: v.recordsExcluded, style: \"label\" },\n { text: `n = ${nFmt(n)}`, style: \"count\" },\n ];\n for (const r of items) {\n out.push({ text: `${r.name} (n = ${nFmt(r.count)})`, style: \"reason\", indent: 1 });\n }\n return {\n role: \"screening-excluded\",\n variant: \"exclusion\",\n lines: out,\n minWidth: PRISMA_CONST.MIN_SIDE_WIDTH,\n maxWidth: PRISMA_CONST.MAX_SIDE_WIDTH,\n };\n}\n\nfunction buildEligibilityBox(fullTextAssessed: number, kind: PrismaKind): BoxSpec {\n const v = vocab(kind);\n return {\n role: \"eligibility\",\n variant: \"main\",\n lines: [\n { text: v.fullTextAssessed, style: \"label\" },\n { text: `n = ${nFmt(fullTextAssessed)}`, style: \"count\" },\n ],\n minWidth: PRISMA_CONST.MIN_MAIN_WIDTH,\n maxWidth: PRISMA_CONST.MAX_MAIN_WIDTH,\n };\n}\n\nfunction buildEligibilityExcludedBox(n: number, reasons: PrismaReason[] | undefined, kind: PrismaKind): BoxSpec {\n const v = vocab(kind);\n const { lines: items } = aggregateReasons(reasons);\n const out: PrismaTextLine[] = [\n { text: v.reportsExcluded, style: \"label\" },\n { text: `n = ${nFmt(n)}`, style: \"count\" },\n ];\n for (const r of items) {\n out.push({ text: `${r.name} (n = ${nFmt(r.count)})`, style: \"reason\", indent: 1 });\n }\n return {\n role: \"eligibility-excluded\",\n variant: \"exclusion\",\n lines: out,\n minWidth: PRISMA_CONST.MIN_SIDE_WIDTH,\n maxWidth: PRISMA_CONST.MAX_SIDE_WIDTH,\n };\n}\n\nfunction buildIncludedBox(inc: PrismaIncluded, kind: PrismaKind): BoxSpec {\n const v = vocab(kind);\n const lines: PrismaTextLine[] = [{ text: v.includedHeader, style: \"label\" }];\n lines.push({ text: `${v.studiesLabel} (n = ${nFmt(inc.studies)})`, style: \"count\" });\n if (inc.reports !== undefined) {\n lines.push({ text: `${v.reportsLabel} (n = ${nFmt(inc.reports)})`, style: \"count\" });\n }\n if (inc.participants !== undefined) {\n lines.push({ text: `${v.participantsLabel} (n = ${nFmt(inc.participants)})`, style: \"count\" });\n }\n return {\n role: \"included\",\n variant: \"main\",\n lines,\n minWidth: PRISMA_CONST.MIN_MAIN_WIDTH,\n maxWidth: PRISMA_CONST.MAX_MAIN_WIDTH,\n };\n}\n\n// ─── Sizing ─────────────────────────────────────────────────────\n\nfunction charWidthFor(style: PrismaTextLine[\"style\"]): number {\n switch (style) {\n case \"label\":\n case \"count\":\n return PRISMA_CONST.CHAR_W_LABEL;\n case \"subtitle\":\n return PRISMA_CONST.CHAR_W_SUBTITLE;\n default:\n return PRISMA_CONST.CHAR_W_BODY;\n }\n}\n\nfunction lineHeightFor(style: PrismaTextLine[\"style\"]): number {\n switch (style) {\n case \"label\":\n return PRISMA_CONST.LABEL_LINE_HEIGHT;\n case \"count\":\n return PRISMA_CONST.COUNT_LINE_HEIGHT;\n default:\n return PRISMA_CONST.LINE_HEIGHT;\n }\n}\n\nfunction naturalWidthFor(line: PrismaTextLine): number {\n const indentPx = (line.indent ?? 0) * 10;\n return Math.ceil(line.text.length * charWidthFor(line.style) + indentPx);\n}\n\nfunction wrapLine(line: PrismaTextLine, contentWidth: number): PrismaTextLine[] {\n const indentPx = (line.indent ?? 0) * 10;\n const available = Math.max(40, contentWidth - indentPx);\n const cw = charWidthFor(line.style);\n const maxChars = Math.max(8, Math.floor(available / cw));\n if (line.text.length <= maxChars) return [line];\n // Greedy word wrap.\n const words = line.text.split(/\\s+/);\n const out: PrismaTextLine[] = [];\n let cur = \"\";\n for (const w of words) {\n if (!cur) { cur = w; continue; }\n if ((cur + \" \" + w).length > maxChars) {\n out.push({ ...line, text: cur });\n cur = w;\n } else {\n cur = cur + \" \" + w;\n }\n }\n if (cur) out.push({ ...line, text: cur });\n return out;\n}\n\nfunction sizeBox(spec: BoxSpec): { width: number; height: number; wrappedLines: PrismaTextLine[] } {\n const natural = spec.lines.reduce((m, l) => Math.max(m, naturalWidthFor(l)), 0);\n const contentWidth = Math.min(\n Math.max(natural, spec.minWidth - 2 * PRISMA_CONST.BOX_PAD_X),\n spec.maxWidth - 2 * PRISMA_CONST.BOX_PAD_X,\n );\n const wrappedLines: PrismaTextLine[] = [];\n for (const l of spec.lines) {\n wrappedLines.push(...wrapLine(l, contentWidth));\n }\n const innerHeight = wrappedLines.reduce((h, l) => h + lineHeightFor(l.style), 0);\n return {\n width: Math.ceil(contentWidth + 2 * PRISMA_CONST.BOX_PAD_X),\n height: Math.ceil(innerHeight + 2 * PRISMA_CONST.BOX_PAD_Y),\n wrappedLines,\n };\n}\n\n// ─── Layout ─────────────────────────────────────────────────────\n\nexport function layoutPrisma(ast: PrismaAST): PrismaLayoutResult {\n const boxes: PrismaBox[] = [];\n const edges: PrismaEdge[] = [];\n const warnings = [...ast.warnings];\n\n const dual = ast.mode === \"2020-dual\" && !!ast.identificationOther;\n\n // Build & size every box.\n const previousSpec = ast.previousStudies ? buildPreviousBox(ast.previousStudies, ast.kind) : null;\n const previousSized = previousSpec ? sizeBox(previousSpec) : null;\n\n const idLeftSpec = buildIdentificationDatabasesBox(ast.identification, ast.kind);\n const idLeftSized = sizeBox(idLeftSpec);\n\n const idRemovedSpec = buildIdentificationRemovedBox(ast.identification, ast.kind);\n const idRemovedSized = idRemovedSpec ? sizeBox(idRemovedSpec) : null;\n\n const idRightSpec = dual ? buildIdentificationOtherBox(ast.identificationOther!, ast.kind) : null;\n const idRightSized = idRightSpec ? sizeBox(idRightSpec) : null;\n\n const screeningSpec = buildScreeningBox(\n ast.screening.recordsScreened,\n ast.screening.reportsSought,\n ast.screening.reportsNotRetrieved,\n ast.kind,\n );\n const screeningSized = sizeBox(screeningSpec);\n\n const screeningExcSpec = buildScreeningExcludedBox(\n ast.screening.excluded.n,\n ast.screening.excluded.reasons,\n ast.kind,\n );\n const screeningExcSized = sizeBox(screeningExcSpec);\n\n const eligibilitySpec = buildEligibilityBox(ast.eligibility.fullTextAssessed, ast.kind);\n const eligibilitySized = sizeBox(eligibilitySpec);\n\n const eligibilityExcSpec = buildEligibilityExcludedBox(\n ast.eligibility.excluded.n,\n ast.eligibility.excluded.reasons,\n ast.kind,\n );\n const eligibilityExcSized = sizeBox(eligibilityExcSpec);\n\n const includedSpec = buildIncludedBox(ast.included, ast.kind);\n const includedSized = sizeBox(includedSpec);\n\n // ── Column widths ─────────────────────────────────────────────\n // Main pipeline column (identified / screened / assessed / included).\n const mainW = Math.max(\n idLeftSized.width,\n screeningSized.width,\n eligibilitySized.width,\n includedSized.width,\n previousSized ? previousSized.width : 0,\n PRISMA_CONST.MIN_MAIN_WIDTH,\n );\n // Right column — the \"removed / excluded\" column. id-removed and the two\n // excluded boxes share one width so they line up vertically.\n const rightColW = Math.max(\n screeningExcSized.width,\n eligibilityExcSized.width,\n idRemovedSized ? idRemovedSized.width : 0,\n PRISMA_CONST.MIN_SIDE_WIDTH,\n );\n // Other-methods column (dual only).\n const otherColW =\n dual && idRightSized\n ? Math.max(idRightSized.width, PRISMA_CONST.MIN_MAIN_WIDTH)\n : 0;\n\n // ── X geometry (canonical, left-aligned column layout) ────────\n // [band] [main col] (gap) [right col: removed/excluded] (gap) [other col]\n const leftBandOffset = PRISMA_CONST.LEFT_BAND_WIDTH + PRISMA_CONST.LEFT_BAND_GAP;\n const mainColLeft = PRISMA_CONST.OUTER_PAD_X + leftBandOffset + PRISMA_CONST.OUTER_PAD_X;\n const mainColCenterX = mainColLeft + mainW / 2;\n const rightColLeft = mainColLeft + mainW + PRISMA_CONST.COL_GAP;\n const otherColLeft = rightColLeft + rightColW + PRISMA_CONST.COL_GAP;\n const otherColCenterX = otherColLeft + otherColW / 2;\n const rightmost = dual ? otherColLeft + otherColW : rightColLeft + rightColW;\n const pageWidth = Math.ceil(rightmost + PRISMA_CONST.OUTER_PAD_X);\n\n // ── Section headers (column-group banners) ────────────────────\n const v = vocab(ast.kind);\n const headers: PrismaColumnHeader[] = [];\n // The orange \"databases & registers\" banner spans the identification-row\n // columns it covers: id-databases, plus id-removed when present.\n const dbSectionLeft = mainColLeft;\n const dbSectionRight = idRemovedSpec ? rightColLeft + rightColW : mainColLeft + mainW;\n const dbHeaderW = dbSectionRight - dbSectionLeft;\n const otherHeaderW = otherColW;\n const dbHeaderLines = wrapHeaderLabel(v.identificationHeader, dbHeaderW);\n const otherHeaderLines = dual ? wrapHeaderLabel(v.identificationOtherHeader, otherHeaderW) : [];\n const headerLineCount = Math.max(dbHeaderLines.length, otherHeaderLines.length, 1);\n const headerHeight = headerHeightFor(headerLineCount);\n\n // ── Vertical positions ────────────────────────────────────────\n const titleH = ast.title ? PRISMA_CONST.TITLE_HEIGHT : 0;\n let cursorY = PRISMA_CONST.OUTER_PAD_TOP + titleH;\n\n // Previous studies row (optional) — main column, above the section header.\n let identificationBandTop = -1;\n let previousBoxBottom = -1;\n let previousBoxCenterX = mainColCenterX;\n if (previousSpec && previousSized) {\n identificationBandTop = cursorY;\n boxes.push({\n role: \"previous\",\n variant: \"previous\",\n stage: \"identification\",\n x: mainColLeft,\n y: cursorY,\n width: mainW,\n height: previousSized.height,\n lines: previousSized.wrappedLines,\n });\n previousBoxBottom = cursorY + previousSized.height;\n previousBoxCenterX = mainColCenterX;\n cursorY = previousBoxBottom + PRISMA_CONST.ROW_GAP;\n }\n\n // Section header row (independent column-group banner above the id boxes).\n const headerRowY = cursorY;\n cursorY += headerHeight + PRISMA_CONST.TOP_HEADER_GAP;\n\n // Identification row.\n const idRowY = cursorY;\n // The vertical stage band brackets the cards only — it starts at the id-box\n // top, not the header bar (which is its own standalone horizontal banner).\n if (identificationBandTop < 0) identificationBandTop = idRowY;\n const idDbBox = resizeBoxToWidth(idLeftSpec, mainW);\n boxes.push({\n role: \"id-databases\",\n variant: \"main\",\n stage: \"identification\",\n x: mainColLeft,\n y: idRowY,\n width: mainW,\n height: idDbBox.height,\n lines: idDbBox.wrappedLines,\n });\n headers.push({\n column: \"databases\",\n labelLines: dbHeaderLines,\n x: dbSectionLeft,\n y: headerRowY,\n width: dbHeaderW,\n height: headerHeight,\n });\n let idRowBottom = idRowY + idDbBox.height;\n\n // Records removed before screening (right column).\n let idRemovedHeight = 0;\n if (idRemovedSpec) {\n const removedBox = resizeBoxToWidth(idRemovedSpec, rightColW);\n idRemovedHeight = removedBox.height;\n boxes.push({\n role: \"id-removed\",\n variant: \"exclusion\",\n stage: \"identification\",\n x: rightColLeft,\n y: idRowY,\n width: rightColW,\n height: removedBox.height,\n lines: removedBox.wrappedLines,\n });\n idRowBottom = Math.max(idRowBottom, idRowY + removedBox.height);\n }\n\n // Identification via other methods (other column, dual).\n let idOtherHeight = 0;\n if (dual && idRightSpec) {\n const otherBox = resizeBoxToWidth(idRightSpec, otherColW);\n idOtherHeight = otherBox.height;\n boxes.push({\n role: \"id-other\",\n variant: \"main\",\n stage: \"identification\",\n x: otherColLeft,\n y: idRowY,\n width: otherColW,\n height: otherBox.height,\n lines: otherBox.wrappedLines,\n });\n headers.push({\n column: \"other\",\n labelLines: otherHeaderLines,\n x: otherColLeft,\n y: headerRowY,\n width: otherColW,\n height: headerHeight,\n });\n idRowBottom = Math.max(idRowBottom, idRowY + otherBox.height);\n }\n\n const identificationBandBottom = idRowBottom;\n const afterIdGap = dual ? PRISMA_CONST.DUAL_MERGE_GAP : PRISMA_CONST.ROW_GAP;\n cursorY = idRowBottom + afterIdGap;\n\n // Screening row.\n const screeningY = cursorY;\n const screeningResized = resizeBoxToWidth(screeningSpec, mainW);\n boxes.push({\n role: \"screening\",\n variant: \"main\",\n stage: \"screening\",\n x: mainColLeft,\n y: screeningY,\n width: mainW,\n height: screeningResized.height,\n lines: screeningResized.wrappedLines,\n });\n const screeningExcResized = resizeBoxToWidth(screeningExcSpec, rightColW);\n const screeningExcY = screeningY;\n boxes.push({\n role: \"screening-excluded\",\n variant: \"exclusion\",\n stage: \"screening\",\n x: rightColLeft,\n y: screeningExcY,\n width: rightColW,\n height: screeningExcResized.height,\n lines: screeningExcResized.wrappedLines,\n });\n const screeningRowBottom = Math.max(\n screeningY + screeningResized.height,\n screeningExcY + screeningExcResized.height,\n );\n cursorY = screeningRowBottom + PRISMA_CONST.ROW_GAP;\n\n // Eligibility row.\n const eligY = cursorY;\n const eligResized = resizeBoxToWidth(eligibilitySpec, mainW);\n boxes.push({\n role: \"eligibility\",\n variant: \"main\",\n stage: \"screening\",\n x: mainColLeft,\n y: eligY,\n width: mainW,\n height: eligResized.height,\n lines: eligResized.wrappedLines,\n });\n const eligExcResized = resizeBoxToWidth(eligibilityExcSpec, rightColW);\n const eligExcY = eligY;\n boxes.push({\n role: \"eligibility-excluded\",\n variant: \"exclusion\",\n stage: \"screening\",\n x: rightColLeft,\n y: eligExcY,\n width: rightColW,\n height: eligExcResized.height,\n lines: eligExcResized.wrappedLines,\n });\n const eligRowBottom = Math.max(\n eligY + eligResized.height,\n eligExcY + eligExcResized.height,\n );\n cursorY = eligRowBottom + PRISMA_CONST.ROW_GAP;\n\n // Included row.\n const incY = cursorY;\n const incResized = resizeBoxToWidth(includedSpec, mainW);\n boxes.push({\n role: \"included\",\n variant: \"main\",\n stage: \"included\",\n x: mainColLeft,\n y: incY,\n width: mainW,\n height: incResized.height,\n lines: incResized.wrappedLines,\n });\n cursorY = incY + incResized.height + PRISMA_CONST.OUTER_PAD_BOTTOM;\n\n // ── Edges ─────────────────────────────────────────────────────\n const arrow = (x1: number, y1: number, x2: number, y2: number): string =>\n `M ${x1} ${y1} L ${x2} ${y2}`;\n const mainColRight = mainColLeft + mainW;\n const rightColArrowEnd = rightColLeft - PRISMA_CONST.ARROWHEAD_LEN;\n\n // Horizontal: Records identified → Records removed before screening.\n if (idRemovedSpec) {\n const ay = idRowY + Math.min(idDbBox.height, idRemovedHeight) / 2;\n edges.push({\n kind: \"exclusion\",\n from: \"id-databases\",\n to: \"id-removed\",\n d: arrow(mainColRight, ay, rightColArrowEnd, ay),\n });\n }\n\n // Identification → screening (+ dual merge of the other-methods stream).\n if (dual && idRightSpec) {\n const midY = idRowBottom + afterIdGap / 2;\n // Databases stream is the trunk: straight down at the main column centre.\n edges.push({\n kind: \"merge-trunk\",\n from: \"id-databases\",\n to: \"screening\",\n d: arrow(mainColCenterX, idRowY + idDbBox.height, mainColCenterX, screeningY - PRISMA_CONST.ARROWHEAD_LEN),\n });\n // Other-methods stream drops, then runs left to join the trunk at the midline.\n edges.push({\n kind: \"merge-leg\",\n from: \"id-other\",\n to: \"merge-junction\",\n d: `M ${otherColCenterX} ${idRowY + idOtherHeight} L ${otherColCenterX} ${midY} L ${mainColCenterX} ${midY}`,\n });\n } else {\n edges.push({\n kind: \"main\",\n from: \"id-databases\",\n to: \"screening\",\n d: arrow(mainColCenterX, idRowY + idDbBox.height, mainColCenterX, screeningY - PRISMA_CONST.ARROWHEAD_LEN),\n });\n }\n\n // Previous studies → identification section (dashed arrow into the header cap).\n if (previousBoxBottom >= 0) {\n edges.push({\n kind: \"previous\",\n from: \"previous\",\n to: \"id-databases\",\n d: arrow(previousBoxCenterX, previousBoxBottom, mainColCenterX, headerRowY - PRISMA_CONST.ARROWHEAD_LEN),\n });\n }\n\n // Screening → Eligibility → Included (main pipeline).\n edges.push({\n kind: \"main\",\n from: \"screening\",\n to: \"eligibility\",\n d: arrow(mainColCenterX, screeningY + screeningResized.height, mainColCenterX, eligY - PRISMA_CONST.ARROWHEAD_LEN),\n });\n edges.push({\n kind: \"main\",\n from: \"eligibility\",\n to: \"included\",\n d: arrow(mainColCenterX, eligY + eligResized.height, mainColCenterX, incY - PRISMA_CONST.ARROWHEAD_LEN),\n });\n\n // Horizontal exclusion arrows (main → right-column excluded box).\n const screeningArrowY = screeningY + screeningResized.height / 2;\n edges.push({\n kind: \"exclusion\",\n from: \"screening\",\n to: \"screening-excluded\",\n d: arrow(mainColRight, screeningArrowY, rightColArrowEnd, screeningArrowY),\n });\n const eligArrowY = eligY + eligResized.height / 2;\n edges.push({\n kind: \"exclusion\",\n from: \"eligibility\",\n to: \"eligibility-excluded\",\n d: arrow(mainColRight, eligArrowY, rightColArrowEnd, eligArrowY),\n });\n\n // Warnings row — reserve space if there are any to print.\n let pageHeight = cursorY;\n if (warnings.length > 0) {\n pageHeight += warnings.length * PRISMA_CONST.WARNING_LINE_HEIGHT + 8;\n }\n\n // ── Stage bands (left) ────────────────────────────────────────\n // Three canonical bands (PRISMA 2020): Identification / Screening / Included.\n // Screening band covers the screening + eligibility rows; previous-studies, if\n // present, is conceptually part of Identification.\n const bandX = PRISMA_CONST.OUTER_PAD_X;\n const bandW = PRISMA_CONST.LEFT_BAND_WIDTH;\n\n // Identification band: from the top of the header bar (or prev row) down to the\n // bottom of the identification row.\n const idBandTop = identificationBandTop;\n const idBandBottom = identificationBandBottom;\n // Screening band: covers screening row + eligibility row.\n const scrBandTop = screeningY;\n const scrBandBottom = eligRowBottom;\n // Included band: just the included row.\n const incBandTop = incY;\n const incBandBottom = incY + incResized.height;\n\n const bands: PrismaStageBand[] = [\n {\n stage: \"identification\",\n label: \"Identification\",\n x: bandX,\n y: idBandTop,\n width: bandW,\n height: Math.max(40, idBandBottom - idBandTop),\n },\n {\n stage: \"screening\",\n label: \"Screening\",\n x: bandX,\n y: scrBandTop,\n width: bandW,\n height: Math.max(40, scrBandBottom - scrBandTop),\n },\n {\n stage: \"included\",\n label: \"Included\",\n x: bandX,\n y: incBandTop,\n width: bandW,\n height: Math.max(40, incBandBottom - incBandTop),\n },\n ];\n\n const result: PrismaLayoutResult = {\n width: pageWidth,\n height: Math.ceil(pageHeight),\n boxes,\n edges,\n bands,\n headers,\n warnings,\n mode: ast.mode,\n kind: ast.kind,\n };\n if (ast.title !== undefined) result.title = ast.title;\n return result;\n}\n\n/** Re-flow the box content to fit a chosen final width (since the natural width may have been smaller than `mainW`). */\nfunction resizeBoxToWidth(spec: BoxSpec, targetWidth: number): { width: number; height: number; wrappedLines: PrismaTextLine[] } {\n const contentWidth = Math.max(40, targetWidth - 2 * PRISMA_CONST.BOX_PAD_X);\n const wrappedLines: PrismaTextLine[] = [];\n for (const l of spec.lines) {\n wrappedLines.push(...wrapLine(l, contentWidth));\n }\n const innerHeight = wrappedLines.reduce((h, l) => h + lineHeightFor(l.style), 0);\n return {\n width: targetWidth,\n height: Math.ceil(innerHeight + 2 * PRISMA_CONST.BOX_PAD_Y),\n wrappedLines,\n };\n}\n\nexport function lineHeightForLine(style: PrismaTextLine[\"style\"]): number {\n return lineHeightFor(style);\n}\n\n/** Wrap a column-header label so it fits the column width. At most 2 lines; if\n * even after wrapping the longest word is too wide, the line will simply overflow\n * visually (we don't truncate, to preserve the canonical wording). */\nfunction wrapHeaderLabel(label: string, columnWidth: number): string[] {\n const inner = Math.max(40, columnWidth - 2 * PRISMA_CONST.TOP_HEADER_PAD_X);\n const cw = PRISMA_CONST.CHAR_W_HEADER;\n const maxChars = Math.max(8, Math.floor(inner / cw));\n if (label.length <= maxChars) return [label];\n\n const words = label.split(/\\s+/);\n // Two-line greedy balanced wrap: find the split index that minimises the\n // length difference between the two lines while still fitting maxChars.\n let best: [string, string] | null = null;\n for (let i = 1; i < words.length; i++) {\n const a = words.slice(0, i).join(\" \");\n const b = words.slice(i).join(\" \");\n if (a.length <= maxChars && b.length <= maxChars) {\n if (!best || Math.abs(a.length - b.length) < Math.abs(best[0].length - best[1].length)) {\n best = [a, b];\n }\n }\n }\n if (best) return best;\n // Fallback: simple greedy 2-line wrap.\n let cur = \"\";\n const lines: string[] = [];\n for (const w of words) {\n const next = cur ? cur + \" \" + w : w;\n if (next.length > maxChars && cur) {\n lines.push(cur);\n cur = w;\n if (lines.length === 1) {\n // Second line keeps the rest as-is.\n const rest = words.slice(words.indexOf(w) + 1);\n if (rest.length > 0) cur = cur + \" \" + rest.join(\" \");\n break;\n }\n } else {\n cur = next;\n }\n }\n if (cur) lines.push(cur);\n return lines.slice(0, 2);\n}\n\nfunction headerHeightFor(lineCount: number): number {\n return Math.max(1, lineCount) * PRISMA_CONST.TOP_HEADER_LINE_HEIGHT + 2 * PRISMA_CONST.TOP_HEADER_PAD_Y;\n}\n","/**\n * PRISMA 2020 flow diagram renderer.\n *\n * Spec: docs/reference/28-PRISMA-STANDARD.md §9\n */\n\nimport type { RenderConfig } from \"../../core/types\";\nimport {\n svgRoot,\n group,\n el,\n rect,\n path as pathEl,\n text as textEl,\n title as titleEl,\n desc,\n defs,\n escapeXml,\n} from \"../../core/svg\";\nimport { resolveBaseTheme, type BaseTheme } from \"../../core/theme\";\nimport { layoutPrisma, lineHeightForLine, PRISMA_CONST } from \"./layout\";\nimport type {\n PrismaAST,\n PrismaBox,\n PrismaColumnHeader,\n PrismaLayoutResult,\n PrismaStageBand,\n} from \"./types\";\nimport { parsePrisma } from \"./parser\";\n\nfunction buildCss(t: BaseTheme): string {\n // Stage palette (sampled from canonical PRISMA reference renderings):\n // identification: blue family — band #1565c0 / box fill #e3f2fd\n // screening: teal family — band #00838f / box fill #e0f7fa\n // included: green family — band #2e7d32 / box fill #e8f5e9\n // Column headers use a warm orange (databases) and neutral slate (other),\n // matching the canonical Haddaway template.\n return `\n.prisma { font-family: system-ui, -apple-system, sans-serif; }\n.prisma-title { font: 600 17px sans-serif; fill: ${t.text}; }\n.prisma-subtitle { font: 400 12px sans-serif; fill: ${t.textMuted}; }\n\n.prisma-stage { stroke-width: 1.1; stroke: #90a4ae; }\n.prisma-stage-identification { fill: #e8f1fb; }\n.prisma-stage-screening { fill: #e3f5f7; }\n.prisma-stage-included { fill: #e9f6ea; }\n.prisma-exclusion { stroke-width: 1.1; stroke: #90a4ae; fill: #f4fafb; }\n.prisma-stage-previous { stroke-width: 1.4; stroke-dasharray: 5 3; fill: #e8f1fb; stroke: #1976d2; }\n\n.prisma-stage-label { font: 600 13px sans-serif; fill: ${t.text}; }\n.prisma-stage-count { font: 700 13px sans-serif; fill: ${t.text}; }\n.prisma-stage-source { font: 400 11.5px sans-serif; fill: ${t.textMuted}; }\n.prisma-stage-subtitle { font: italic 500 11.5px sans-serif; fill: ${t.textMuted}; }\n.prisma-exclusion-reason { font: 400 11.5px sans-serif; fill: ${t.textMuted}; }\n\n.prisma-arrow-main { fill: none; stroke: #475569; stroke-width: 1.6; marker-end: url(#prisma-arrow); }\n.prisma-arrow-exclusion { fill: none; stroke: #475569; stroke-width: 1.6; marker-end: url(#prisma-arrow); }\n.prisma-arrow-merge-leg { fill: none; stroke: #475569; stroke-width: 1.6; }\n.prisma-arrow-merge-trunk { fill: none; stroke: #475569; stroke-width: 1.6; marker-end: url(#prisma-arrow); }\n.prisma-arrow-previous { fill: none; stroke: #1976d2; stroke-width: 1.5; stroke-dasharray: 5 3; marker-end: url(#prisma-arrow-accent); }\n.prisma-warning { font: italic 400 11px sans-serif; fill: ${t.warn}; }\n\n.prisma-band { stroke: none; }\n.prisma-band-identification { fill: #1565c0; }\n.prisma-band-screening { fill: #00838f; }\n.prisma-band-included { fill: #2e7d32; }\n.prisma-band-label { font: 700 12px sans-serif; fill: #ffffff; letter-spacing: 0.8px; text-transform: uppercase; }\n\n.prisma-col-header { stroke: #90a4ae; stroke-width: 1.1; }\n.prisma-col-header-databases { fill: #ef8a3c; }\n.prisma-col-header-other { fill: #6b8694; }\n.prisma-col-header-label { font: 600 12px sans-serif; fill: #ffffff; }\n`.trim();\n}\n\nfunction arrowMarker(t: BaseTheme): string {\n return defs([\n el(\n \"marker\",\n {\n id: \"prisma-arrow\",\n viewBox: \"0 0 10 10\",\n refX: 9,\n refY: 5,\n markerWidth: 8,\n markerHeight: 8,\n orient: \"auto-start-reverse\",\n },\n [el(\"path\", { d: \"M0,0 L10,5 L0,10 z\", fill: t.stroke })],\n ),\n el(\n \"marker\",\n {\n id: \"prisma-arrow-accent\",\n viewBox: \"0 0 10 10\",\n refX: 9,\n refY: 5,\n markerWidth: 8,\n markerHeight: 8,\n orient: \"auto-start-reverse\",\n },\n [el(\"path\", { d: \"M0,0 L10,5 L0,10 z\", fill: t.accent })],\n ),\n ]);\n}\n\nfunction classForBox(box: PrismaBox): string {\n if (box.variant === \"previous\") return \"prisma-stage-previous\";\n const base = box.variant === \"exclusion\" ? \"prisma-exclusion\" : \"prisma-stage\";\n return `${base} prisma-stage-${box.stage}`;\n}\n\nfunction classForLine(style: string): string {\n switch (style) {\n case \"label\":\n return \"prisma-stage-label\";\n case \"count\":\n return \"prisma-stage-count\";\n case \"subtitle\":\n return \"prisma-stage-subtitle\";\n case \"reason\":\n return \"prisma-exclusion-reason\";\n default:\n return \"prisma-stage-source\";\n }\n}\n\nfunction classForEdge(kind: string): string {\n switch (kind) {\n case \"exclusion\":\n return \"prisma-arrow-exclusion\";\n case \"merge-leg\":\n return \"prisma-arrow-merge-leg\";\n case \"merge-trunk\":\n return \"prisma-arrow-merge-trunk\";\n case \"previous\":\n return \"prisma-arrow-previous\";\n default:\n return \"prisma-arrow-main\";\n }\n}\n\nfunction renderBand(band: PrismaStageBand): string {\n // Capsule shape: round ends with rx = width/2.\n const r = rect({\n x: band.x,\n y: band.y,\n width: band.width,\n height: band.height,\n rx: band.width / 2,\n ry: band.width / 2,\n class: `prisma-band prisma-band-${band.stage}`,\n \"data-stage\": band.stage,\n });\n // Vertical label: rotate -90deg about the band's center; reads bottom-to-top.\n const cx = band.x + band.width / 2;\n const cy = band.y + band.height / 2;\n const txt = textEl(\n {\n x: cx,\n y: cy,\n class: \"prisma-band-label\",\n \"text-anchor\": \"middle\",\n \"dominant-baseline\": \"central\",\n transform: `rotate(-90 ${cx} ${cy})`,\n },\n band.label,\n );\n return group({ \"data-band\": band.stage }, [r, txt]);\n}\n\nfunction renderHeader(h: PrismaColumnHeader): string {\n // Independent horizontal bar with capsule ends (mirrors the left stage bands).\n const r = rect({\n x: h.x,\n y: h.y,\n width: h.width,\n height: h.height,\n rx: h.height / 2,\n ry: h.height / 2,\n class: `prisma-col-header prisma-col-header-${h.column}`,\n \"data-column\": h.column,\n });\n const lineH = PRISMA_CONST.TOP_HEADER_LINE_HEIGHT;\n const total = h.labelLines.length * lineH;\n const startY = h.y + (h.height - total) / 2 + lineH * 0.75;\n const cx = h.x + h.width / 2;\n const lines = h.labelLines.map((ln, i) =>\n textEl(\n {\n x: cx,\n y: startY + i * lineH,\n class: \"prisma-col-header-label\",\n \"text-anchor\": \"middle\",\n },\n ln,\n ),\n );\n return group({ \"data-header\": h.column }, [r, ...lines]);\n}\n\nfunction renderBox(box: PrismaBox): string {\n const r = rect({\n x: box.x,\n y: box.y,\n width: box.width,\n height: box.height,\n rx: PRISMA_CONST.BOX_RADIUS,\n ry: PRISMA_CONST.BOX_RADIUS,\n class: classForBox(box),\n \"data-role\": box.role,\n });\n\n // Text layout: top-level lines (indent=0) are centered horizontally for the\n // canonical \"headline\" look. Indented breakdown lines (sources / reasons) are\n // grouped into a left-aligned block that, as a whole, is horizontally\n // centred within the box — this preserves a tidy list inside an otherwise\n // centered layout.\n const innerLeft = box.x + PRISMA_CONST.BOX_PAD_X;\n const innerRight = box.x + box.width - PRISMA_CONST.BOX_PAD_X;\n const centerX = box.x + box.width / 2;\n\n // Compute the widest indented line so we can left-align them as a block,\n // centred within the box.\n let widestIndented = 0;\n for (const line of box.lines) {\n if ((line.indent ?? 0) > 0) {\n const w = approxLineWidth(line);\n if (w > widestIndented) widestIndented = w;\n }\n }\n const indentedBlockLeft = Math.max(\n innerLeft,\n Math.min(centerX - widestIndented / 2, innerRight - widestIndented),\n );\n\n let textY = box.y + PRISMA_CONST.BOX_PAD_Y;\n const textEls: string[] = [];\n for (const line of box.lines) {\n const lh = lineHeightForLine(line.style);\n const baseline = textY + Math.round(lh * 0.75);\n const indented = (line.indent ?? 0) > 0;\n if (indented) {\n textEls.push(\n textEl(\n { x: indentedBlockLeft, y: baseline, class: classForLine(line.style) },\n line.text,\n ),\n );\n } else {\n textEls.push(\n textEl(\n {\n x: centerX,\n y: baseline,\n class: classForLine(line.style),\n \"text-anchor\": \"middle\",\n },\n line.text,\n ),\n );\n }\n textY += lh;\n }\n\n return group(\n {\n \"data-prisma-role\": box.role,\n \"data-prisma-variant\": box.variant,\n \"data-prisma-stage\": box.stage,\n },\n [r, ...textEls],\n );\n}\n\n/** Approximate the rendered width of a text line for centring decisions. */\nfunction approxLineWidth(line: { text: string; style: string }): number {\n const charW =\n line.style === \"label\" || line.style === \"count\" ? 7.4 : 6.4;\n return line.text.length * charW;\n}\n\nexport function renderPrismaLayout(layout: PrismaLayoutResult, config?: RenderConfig): string {\n const t = resolveBaseTheme(config?.theme ?? \"default\");\n\n const children: string[] = [];\n children.push(titleEl(layout.title ?? \"PRISMA 2020 flow diagram\"));\n children.push(\n desc(\n `PRISMA 2020 flow diagram (${layout.mode}, ${layout.kind}) — ${layout.boxes.length} boxes, ${layout.edges.length} arrows` +\n (layout.warnings.length > 0\n ? `. Warnings: ${layout.warnings.join(\"; \")}`\n : \"\"),\n ),\n );\n children.push(el(\"style\", {}, buildCss(t)));\n children.push(arrowMarker(t));\n\n if (layout.title) {\n children.push(\n textEl(\n { x: layout.width / 2, y: PRISMA_CONST.OUTER_PAD_TOP + 20, class: \"prisma-title\", \"text-anchor\": \"middle\" },\n layout.title,\n ),\n );\n }\n\n // Stage bands (behind everything else).\n const bandEls: string[] = [];\n for (const b of layout.bands) bandEls.push(renderBand(b));\n children.push(group({ class: \"prisma-bands\" }, bandEls));\n\n // Top column headers (above identification row).\n const headerEls: string[] = [];\n for (const h of layout.headers) headerEls.push(renderHeader(h));\n children.push(group({ class: \"prisma-col-headers\" }, headerEls));\n\n // Edges (under boxes).\n const edgeEls: string[] = [];\n for (const e of layout.edges) {\n edgeEls.push(\n pathEl({\n d: e.d,\n class: classForEdge(e.kind),\n \"data-edge\": `${e.from}->${e.to}`,\n }),\n );\n }\n children.push(group({ class: \"prisma-edges\" }, edgeEls));\n\n // Boxes.\n const boxEls: string[] = [];\n for (const b of layout.boxes) boxEls.push(renderBox(b));\n children.push(group({ class: \"prisma-boxes\" }, boxEls));\n\n // Warnings (bottom of diagram, optional).\n if (layout.warnings.length > 0) {\n const startY = layout.height - layout.warnings.length * PRISMA_CONST.WARNING_LINE_HEIGHT - 4;\n const wEls: string[] = [];\n for (let i = 0; i < layout.warnings.length; i++) {\n wEls.push(\n textEl(\n {\n x: PRISMA_CONST.OUTER_PAD_X,\n y: startY + (i + 1) * PRISMA_CONST.WARNING_LINE_HEIGHT,\n class: \"prisma-warning\",\n },\n `⚠ ${layout.warnings[i]}`,\n ),\n );\n }\n children.push(group({ class: \"prisma-warnings\" }, wEls));\n }\n\n return svgRoot(\n {\n class: \"prisma\",\n role: \"img\",\n \"aria-label\": escapeXml(layout.title ?? \"PRISMA 2020 flow diagram\"),\n width: layout.width,\n height: layout.height,\n viewBox: `0 0 ${layout.width} ${layout.height}`,\n },\n children,\n );\n}\n\nexport function renderPrisma(textOrAst: string | PrismaAST, config?: RenderConfig): string {\n const ast = typeof textOrAst === \"string\" ? parsePrisma(textOrAst) : textOrAst;\n const layout = layoutPrisma(ast);\n return renderPrismaLayout(layout, config);\n}\n","import type { DiagramPlugin, RenderConfig } from \"../../core/types\";\nimport { parsePrisma } from \"./parser\";\nimport { renderPrisma } from \"./renderer\";\n\nexport const prisma: DiagramPlugin = {\n type: \"prisma\" as DiagramPlugin[\"type\"],\n detect(text: string): boolean {\n for (const raw of text.split(/\\r?\\n/)) {\n const t = raw.trim();\n if (!t) continue;\n if (t.startsWith(\"#\") || t.startsWith(\"//\")) continue;\n return /^prisma\\b/i.test(t);\n }\n return false;\n },\n parse: parsePrisma,\n render(text: string, config?: RenderConfig): string {\n return renderPrisma(text, config);\n },\n};\n\nexport { parsePrisma, PrismaParseError } from \"./parser\";\nexport { renderPrisma, renderPrismaLayout } from \"./renderer\";\nexport { layoutPrisma, PRISMA_CONST } from \"./layout\";\nexport type * from \"./types\";\n","/**\n * UML Use Case DSL parser.\n *\n * Accepts the declarative form (`actor:`, `usecase:`, relations) and the\n * PlantUML-aligned inline form (`:Name:`, `(Name)`). Both desugar to the\n * same AST.\n *\n * Spec: docs/reference/29-USECASE-STANDARD.md §7\n */\n\nimport type {\n UsecaseActor,\n UsecaseActorKind,\n UsecaseActorSide,\n UsecaseAst,\n UsecaseDirection,\n UsecaseNode,\n UsecaseNote,\n UsecaseRelKind,\n UsecaseRelation,\n} from \"./types\";\n\nexport class UsecaseParseError extends Error {\n line?: number;\n constructor(message: string, line?: number) {\n super(line !== undefined ? `Line ${line}: ${message}` : message);\n this.name = \"UsecaseParseError\";\n if (line !== undefined) this.line = line;\n }\n}\n\ninterface RawLine {\n text: string;\n line: number;\n}\n\nfunction preprocess(src: string): RawLine[] {\n const out: RawLine[] = [];\n const rows = src.split(/\\r?\\n/);\n for (let i = 0; i < rows.length; i++) {\n const raw = rows[i] ?? \"\";\n const trimmed = raw.trim();\n if (!trimmed) continue;\n if (trimmed.startsWith(\"#\") || trimmed.startsWith(\"//\")) continue;\n // Strip end-of-line comments (# or //) outside quotes.\n let inQ = false;\n let cut = raw.length;\n for (let j = 0; j < raw.length; j++) {\n const c = raw[j];\n if (c === '\"') { inQ = !inQ; continue; }\n if (inQ) continue;\n if (c === \"#\") { cut = j; break; }\n if (c === \"/\" && raw[j + 1] === \"/\") { cut = j; break; }\n }\n const stripped = raw.slice(0, cut).trim();\n if (!stripped) continue;\n out.push({ text: stripped, line: i + 1 });\n }\n return out;\n}\n\n// ─── Endpoint + relation helpers ────────────────────────────────\n\ninterface Tok { kind: \"ident\" | \"quoted\"; text: string }\n\nfunction tokenizeEndpoint(s: string, lineNo: number): Tok[] {\n const out: Tok[] = [];\n let i = 0;\n const trimmed = s.trim();\n while (i < trimmed.length) {\n while (i < trimmed.length && /\\s/.test(trimmed[i])) i++;\n if (i >= trimmed.length) break;\n if (trimmed[i] === '\"') {\n const end = trimmed.indexOf('\"', i + 1);\n if (end < 0) {\n throw new UsecaseParseError(`unterminated quoted string in \"${s}\"`, lineNo);\n }\n out.push({ kind: \"quoted\", text: trimmed.slice(i + 1, end) });\n i = end + 1;\n } else {\n let j = i;\n while (j < trimmed.length && !/\\s/.test(trimmed[j])) j++;\n out.push({ kind: \"ident\", text: trimmed.slice(i, j) });\n i = j;\n }\n }\n return out;\n}\n\nfunction isMultiplicityText(s: string): boolean {\n return /^[0-9*]+(?:\\.\\.[0-9*]+)?$/.test(s);\n}\n\nfunction parseSourceEndpoint(s: string, lineNo: number): { id: string; mult?: string } {\n const toks = tokenizeEndpoint(s, lineNo);\n if (toks.length === 0) {\n throw new UsecaseParseError(`empty source endpoint`, lineNo);\n }\n if (toks.length === 1) {\n return { id: toks[0].text };\n }\n if (\n toks.length === 2 &&\n toks[1].kind === \"quoted\" &&\n isMultiplicityText(toks[1].text)\n ) {\n return { id: toks[0].text, mult: toks[1].text };\n }\n throw new UsecaseParseError(`cannot parse endpoint \"${s}\"`, lineNo);\n}\n\nfunction parseTargetEndpoint(s: string, lineNo: number): { id: string; mult?: string } {\n const toks = tokenizeEndpoint(s, lineNo);\n if (toks.length === 0) {\n throw new UsecaseParseError(`empty target endpoint`, lineNo);\n }\n if (toks.length === 1) {\n return { id: toks[0].text };\n }\n if (\n toks.length === 2 &&\n toks[0].kind === \"quoted\" &&\n isMultiplicityText(toks[0].text)\n ) {\n return { mult: toks[0].text, id: toks[1].text };\n }\n // Some DSLs put source-side mult after the operator on the source side\n // (rare, but allow a trailing quoted multiplicity gracefully).\n if (\n toks.length === 2 &&\n toks[1].kind === \"quoted\" &&\n isMultiplicityText(toks[1].text)\n ) {\n return { id: toks[0].text, mult: toks[1].text };\n }\n throw new UsecaseParseError(`cannot parse endpoint \"${s}\"`, lineNo);\n}\n\nconst REL_OPS = [\"--|>\", \"..>\", \"<..\", \"-->\", \"--\"] as const;\n\nfunction findRelOp(line: string): { op: string; start: number; end: number } | null {\n let inQ = false;\n for (let i = 0; i < line.length; i++) {\n const c = line[i];\n if (c === '\"') { inQ = !inQ; continue; }\n if (inQ) continue;\n for (const op of REL_OPS) {\n if (line.startsWith(op, i)) {\n // Ensure the operator isn't a substring of a longer one\n // (e.g. `--` inside `--|>`). Since we iterate longest-first, the\n // first match wins.\n return { op, start: i, end: i + op.length };\n }\n }\n }\n return null;\n}\n\nfunction findLabelColon(s: string): number {\n let inQ = false;\n for (let i = 0; i < s.length; i++) {\n const c = s[i];\n if (c === '\"') { inQ = !inQ; continue; }\n if (inQ) continue;\n if (c === \":\") return i;\n }\n return -1;\n}\n\ninterface LabelParts {\n stereotype?: string;\n condition?: string;\n extPointRef?: string;\n}\n\nfunction parseLabelClause(raw: string): LabelParts {\n const out: LabelParts = {};\n let s = raw.trim();\n // stereotype: «...» or <<...>>\n let m = s.match(/^«([^»]+)»\\s*/);\n if (!m) m = s.match(/^<<([^>]+)>>\\s*/);\n if (m) {\n out.stereotype = m[1].trim();\n s = s.slice(m[0].length);\n }\n // condition: [...]\n m = s.match(/^\\[([^\\]]+)\\]\\s*/);\n if (m) {\n out.condition = m[1].trim();\n s = s.slice(m[0].length);\n }\n // extension point ref: (extension point: name)\n m = s.match(/^\\(extension\\s+point\\s*:\\s*([^)]+)\\)\\s*/i);\n if (m) {\n out.extPointRef = m[1].trim();\n s = s.slice(m[0].length);\n }\n // Anything left and we don't have a stereotype yet — treat as freeform\n // stereotype label (e.g., `«include»` parsed already, leftover is fine).\n if (!out.stereotype && s.trim()) {\n out.stereotype = s.trim().replace(/^«|»$/g, \"\");\n }\n return out;\n}\n\n// ─── Parser state ────────────────────────────────────────────────\n\ninterface ParserState {\n ast: UsecaseAst;\n /** Identifier table → kind (\"actor\" | \"usecase\"). */\n idTable: Map<string, \"actor\" | \"usecase\">;\n lines: RawLine[];\n i: number;\n}\n\nfunction declareId(state: ParserState, id: string, kind: \"actor\" | \"usecase\", lineNo: number): void {\n const prior = state.idTable.get(id);\n if (prior !== undefined) {\n throw new UsecaseParseError(\n `identifier '${id}' already declared (line ${lineNo})`,\n lineNo,\n );\n }\n state.idTable.set(id, kind);\n}\n\nfunction parseHeader(state: ParserState): void {\n if (state.i >= state.lines.length) {\n throw new UsecaseParseError(\"empty document — expected 'usecase' header\", 1);\n }\n const first = state.lines[state.i];\n if (!/^usecase\\b/i.test(first.text)) {\n throw new UsecaseParseError(\n `first non-comment line must start with 'usecase' (got: ${first.text})`,\n first.line,\n );\n }\n // optional inline title: `usecase \"Some Title\"`\n const tail = first.text.replace(/^usecase\\b/i, \"\").trim();\n if (tail) {\n const m = tail.match(/^\"([^\"]+)\"$/);\n if (m) state.ast.title = m[1];\n }\n state.i++;\n\n while (state.i < state.lines.length) {\n const ln = state.lines[state.i];\n const m = ln.text.match(/^(title|system|direction|generalization)\\s*:\\s*(.+)$/i);\n if (!m) break;\n const key = m[1].toLowerCase();\n const valueRaw = m[2].trim();\n const value = stripQuotes(valueRaw);\n if (key === \"title\") state.ast.title = value;\n else if (key === \"system\") state.ast.system = value;\n else if (key === \"direction\") {\n const d = value.toUpperCase();\n if (d !== \"LR\" && d !== \"TB\") {\n throw new UsecaseParseError(`direction must be LR or TB (got: ${value})`, ln.line);\n }\n state.ast.direction = d as UsecaseDirection;\n } else if (key === \"generalization\") {\n const v = value.toLowerCase();\n if (v === \"tree\") state.ast.generalizationTree = true;\n else if (v === \"individual\") state.ast.generalizationTree = false;\n else throw new UsecaseParseError(`generalization must be 'tree' or 'individual'`, ln.line);\n }\n state.i++;\n }\n}\n\nfunction stripQuotes(s: string): string {\n const t = s.trim();\n if (t.startsWith('\"') && t.endsWith('\"') && t.length >= 2) return t.slice(1, -1);\n return t;\n}\n\n// actor: Name [as ID] [(kind)] [«stereotype»]\nfunction parseActorDecl(ln: RawLine, state: ParserState): boolean {\n const m = ln.text.match(/^actor\\s*:\\s*(.+)$/i);\n if (!m) return false;\n let rest = m[1].trim();\n // optional stereotype at end\n let stereotype: string | undefined;\n const ster = rest.match(/«([^»]+)»\\s*$/) || rest.match(/<<([^>]+)>>\\s*$/);\n if (ster) {\n stereotype = ster[1].trim();\n rest = rest.slice(0, ster.index).trim();\n }\n // optional kind in parens\n let kind: UsecaseActorKind = \"human\";\n let side: UsecaseActorSide | undefined;\n const kindMatch = rest.match(/\\((external|business|system|left|right)\\)\\s*$/i);\n if (kindMatch) {\n const k = kindMatch[1].toLowerCase();\n if (k === \"left\" || k === \"right\") side = k as UsecaseActorSide;\n else kind = k as UsecaseActorKind;\n rest = rest.slice(0, kindMatch.index).trim();\n }\n // accept a second parens (rare): allow both `(external)` and `(left)` chained\n const kindMatch2 = rest.match(/\\((external|business|system|left|right)\\)\\s*$/i);\n if (kindMatch2) {\n const k = kindMatch2[1].toLowerCase();\n if (k === \"left\" || k === \"right\") side = k as UsecaseActorSide;\n else kind = k as UsecaseActorKind;\n rest = rest.slice(0, kindMatch2.index).trim();\n }\n // optional `as ID`\n let id: string | undefined;\n const asMatch = rest.match(/\\s+as\\s+([A-Za-z_]\\w*)\\s*$/);\n if (asMatch) {\n id = asMatch[1];\n rest = rest.slice(0, asMatch.index).trim();\n }\n // remaining is the name (quoted or bare)\n const name = stripQuotes(rest);\n if (!name) throw new UsecaseParseError(`actor declaration missing name`, ln.line);\n const actorId = id ?? defaultIdFor(name);\n declareId(state, actorId, \"actor\", ln.line);\n const actor: UsecaseActor = {\n id: actorId,\n name,\n kind,\n line: ln.line,\n };\n if (stereotype !== undefined) actor.stereotype = stereotype;\n if (side !== undefined) actor.side = side;\n state.ast.actors.push(actor);\n return true;\n}\n\n// usecase: \"Name\" [as ID] [«stereotype»] [{ extension point: ... }]\nfunction parseUsecaseDecl(ln: RawLine, state: ParserState): boolean {\n const m = ln.text.match(/^usecase\\s*:\\s*(.+)$/i);\n if (!m) return false;\n let rest = m[1].trim();\n // possible trailing `{` opening a block\n let opensBlock = false;\n if (rest.endsWith(\"{\")) {\n opensBlock = true;\n rest = rest.slice(0, -1).trim();\n }\n // optional stereotype\n let stereotype: string | undefined;\n const ster = rest.match(/«([^»]+)»\\s*$/) || rest.match(/<<([^>]+)>>\\s*$/);\n if (ster) {\n stereotype = ster[1].trim();\n rest = rest.slice(0, ster.index).trim();\n }\n // optional `as ID`\n let id: string | undefined;\n const asMatch = rest.match(/\\s+as\\s+([A-Za-z_]\\w*)\\s*$/);\n if (asMatch) {\n id = asMatch[1];\n rest = rest.slice(0, asMatch.index).trim();\n }\n const name = stripQuotes(rest);\n if (!name) throw new UsecaseParseError(`usecase declaration missing name`, ln.line);\n const ucId = id ?? defaultIdFor(name);\n declareId(state, ucId, \"usecase\", ln.line);\n const node: UsecaseNode = {\n id: ucId,\n name,\n extensionPoints: [],\n line: ln.line,\n };\n if (stereotype !== undefined) node.stereotype = stereotype;\n state.ast.usecases.push(node);\n\n if (opensBlock) {\n state.i++;\n while (state.i < state.lines.length) {\n const inner = state.lines[state.i];\n if (inner.text === \"}\") {\n return true;\n }\n const epMatch = inner.text.match(/^extension\\s+point\\s*:\\s*(.+)$/i);\n if (epMatch) {\n node.extensionPoints.push(epMatch[1].trim());\n state.i++;\n continue;\n }\n throw new UsecaseParseError(\n `expected 'extension point: ...' or '}' inside use-case block`,\n inner.line,\n );\n }\n throw new UsecaseParseError(`unterminated use-case block (missing '}')`, ln.line);\n }\n return true;\n}\n\n// PlantUML inline form: :Name: [as ID] or (Name) [as ID]\nfunction parsePlantUmlInline(ln: RawLine, state: ParserState): boolean {\n // Actor: :Name:\n let m = ln.text.match(/^:([^:]+):\\s*(?:as\\s+([A-Za-z_]\\w*))?\\s*$/);\n if (m) {\n const name = m[1].trim();\n const id = m[2] ?? defaultIdFor(name);\n declareId(state, id, \"actor\", ln.line);\n state.ast.actors.push({ id, name, kind: \"human\", line: ln.line });\n return true;\n }\n // Use case: (Name)\n m = ln.text.match(/^\\(([^()]+)\\)\\s*(?:as\\s+([A-Za-z_]\\w*))?\\s*$/);\n if (m) {\n const name = m[1].trim();\n const id = m[2] ?? defaultIdFor(name);\n declareId(state, id, \"usecase\", ln.line);\n state.ast.usecases.push({\n id,\n name,\n extensionPoints: [],\n line: ln.line,\n });\n return true;\n }\n return false;\n}\n\nfunction parseNote(ln: RawLine, state: ParserState): boolean {\n const m = ln.text.match(/^note\\s+(?:\"([^\"]+)\"|([^{]+))\\s*\\{\\s*$/i);\n if (!m) return false;\n const text = (m[1] ?? m[2] ?? \"\").trim();\n state.i++;\n const members: string[] = [];\n while (state.i < state.lines.length) {\n const inner = state.lines[state.i];\n if (inner.text === \"}\") {\n const note: UsecaseNote = { text, members, line: ln.line };\n state.ast.notes.push(note);\n return true;\n }\n for (const tok of inner.text.split(\",\").map((t) => t.trim()).filter(Boolean)) {\n members.push(tok);\n }\n state.i++;\n }\n throw new UsecaseParseError(`unterminated note block`, ln.line);\n}\n\nfunction defaultIdFor(name: string): string {\n // Convert quoted name with spaces into a synthetic id by stripping non-word chars.\n // Used when the user omits `as <id>`.\n const safe = name.replace(/[^A-Za-z0-9_]/g, \"_\");\n return /^[A-Za-z_]/.test(safe) ? safe : \"_\" + safe;\n}\n\nfunction parseRelation(ln: RawLine, state: ParserState): boolean {\n const op = findRelOp(ln.text);\n if (!op) return false;\n const lhs = ln.text.slice(0, op.start).trim();\n const remainder = ln.text.slice(op.end);\n const colonIdx = findLabelColon(remainder);\n const rhs = (colonIdx >= 0 ? remainder.slice(0, colonIdx) : remainder).trim();\n const labelRaw = colonIdx >= 0 ? remainder.slice(colonIdx + 1).trim() : \"\";\n const src = parseSourceEndpoint(lhs, ln.line);\n const tgt = parseTargetEndpoint(rhs, ln.line);\n\n // Auto-declare endpoints if user forgot to declare them up-front. Default to\n // use-case for unknown ids inside `()`-style usage; for relations we err on\n // the side of erroring so typos are caught.\n for (const idTok of [src.id, tgt.id]) {\n if (!state.idTable.has(idTok)) {\n throw new UsecaseParseError(`unknown identifier '${idTok}'`, ln.line);\n }\n }\n\n const label = parseLabelClause(labelRaw);\n\n let kind: UsecaseRelKind;\n let sourceId = src.id;\n let targetId = tgt.id;\n\n switch (op.op) {\n case \"--\":\n kind = \"association\";\n break;\n case \"-->\":\n kind = \"directed\";\n break;\n case \"..>\":\n // Default include; allow «extend» label to override.\n if (label.stereotype && /^extend\\b/i.test(label.stereotype)) {\n kind = \"extend\";\n } else {\n kind = \"include\";\n }\n break;\n case \"<..\":\n // `A <.. B`: the LHS is the extension, the RHS is the base (the use case\n // being extended). Canonical AST keeps source=extension, target=base, and\n // the renderer normalises the arrowhead to point at the base. The `<..`\n // glyph only signals \"this is an extend, written base-on-the-right\".\n if (label.stereotype && /^include\\b/i.test(label.stereotype)) {\n // include with reversed glyph — the RHS includes the LHS.\n kind = \"include\";\n [sourceId, targetId] = [targetId, sourceId];\n } else {\n kind = \"extend\";\n }\n break;\n case \"--|>\":\n kind = \"generalization\";\n break;\n default:\n throw new UsecaseParseError(`unknown operator '${op.op}'`, ln.line);\n }\n\n // Validation per §7.10\n const srcKind = state.idTable.get(sourceId)!;\n const tgtKind = state.idTable.get(targetId)!;\n validateRelation(kind, srcKind, tgtKind, sourceId, targetId, ln.line);\n\n const rel: UsecaseRelation = {\n kind,\n source: sourceId,\n target: targetId,\n line: ln.line,\n };\n // Multiplicities follow the DSL-written endpoints. If an include glyph was\n // reversed (`<..` with «include»), swap them to match the re-oriented ids.\n let srcMult = src.mult;\n let tgtMult = tgt.mult;\n if (op.op === \"<..\" && kind === \"include\") {\n [srcMult, tgtMult] = [tgtMult, srcMult];\n }\n if (srcMult !== undefined) rel.sourceMultiplicity = srcMult;\n if (tgtMult !== undefined) rel.targetMultiplicity = tgtMult;\n // Stereotype: ignore if it just restates the default keyword.\n if (label.stereotype) {\n const ls = label.stereotype.toLowerCase();\n if (kind === \"include\" && ls !== \"include\") rel.stereotype = label.stereotype;\n else if (kind === \"extend\" && ls !== \"extend\") rel.stereotype = label.stereotype;\n else if (kind === \"association\" || kind === \"directed\") {\n rel.stereotype = label.stereotype;\n }\n }\n if (label.condition !== undefined) rel.condition = label.condition;\n if (label.extPointRef !== undefined) rel.extensionPointRef = label.extPointRef;\n\n // Validate extension-point reference (must exist on the base use case).\n if (kind === \"extend\" && rel.extensionPointRef) {\n const base = state.ast.usecases.find((u) => u.id === targetId);\n if (base && !base.extensionPoints.includes(rel.extensionPointRef)) {\n throw new UsecaseParseError(\n `extension point '${rel.extensionPointRef}' is not declared on use case '${base.name}'`,\n ln.line,\n );\n }\n }\n\n state.ast.relations.push(rel);\n return true;\n}\n\nfunction validateRelation(\n kind: UsecaseRelKind,\n srcKind: \"actor\" | \"usecase\",\n tgtKind: \"actor\" | \"usecase\",\n srcId: string,\n tgtId: string,\n lineNo: number,\n): void {\n if (kind === \"association\" || kind === \"directed\") {\n if (srcKind === \"actor\" && tgtKind === \"actor\") {\n throw new UsecaseParseError(\n `association must connect an actor and a use case, not two actors ('${srcId}' and '${tgtId}')`,\n lineNo,\n );\n }\n if (srcKind === \"usecase\" && tgtKind === \"usecase\") {\n throw new UsecaseParseError(\n `to relate two use cases use «include» (..>) or «extend» (<..), not association`,\n lineNo,\n );\n }\n return;\n }\n if (kind === \"include\" || kind === \"extend\") {\n if (srcKind !== \"usecase\" || tgtKind !== \"usecase\") {\n const which = kind === \"include\" ? \"include\" : \"extend\";\n throw new UsecaseParseError(\n `«${which}» relationship endpoints must be use cases (got actor)`,\n lineNo,\n );\n }\n return;\n }\n if (kind === \"generalization\") {\n if (srcKind !== tgtKind) {\n throw new UsecaseParseError(\n `generalization must connect two actors or two use cases, not actor and use case`,\n lineNo,\n );\n }\n return;\n }\n}\n\n// ─── Top-level driver ────────────────────────────────────────────\n\nexport function parseUsecase(src: string): UsecaseAst {\n const ast: UsecaseAst = {\n type: \"usecase\",\n direction: \"LR\",\n generalizationTree: true,\n actors: [],\n usecases: [],\n relations: [],\n notes: [],\n warnings: [],\n };\n const state: ParserState = {\n ast,\n idTable: new Map(),\n lines: preprocess(src),\n i: 0,\n };\n parseHeader(state);\n\n while (state.i < state.lines.length) {\n const ln = state.lines[state.i];\n // Try declarations first\n if (parseActorDecl(ln, state)) { state.i++; continue; }\n if (parseUsecaseDecl(ln, state)) { state.i++; continue; }\n if (parsePlantUmlInline(ln, state)) { state.i++; continue; }\n if (parseNote(ln, state)) { state.i++; continue; }\n if (parseRelation(ln, state)) { state.i++; continue; }\n throw new UsecaseParseError(`unrecognised statement: ${ln.text}`, ln.line);\n }\n\n // Soft warnings\n if (!ast.system && ast.usecases.length >= 3) {\n ast.warnings.push(\n \"system: header omitted; subject (system boundary) will not be drawn.\",\n );\n }\n return ast;\n}\n","/**\n * UML Use Case layout.\n *\n * Deterministic, seedless layered placement:\n * 1. Size each use-case ellipse from its text stack.\n * 2. Assign a *depth* (column) to each use case from the include / extend /\n * generalization chains; use cases connected only to actors are depth 0,\n * included / extended / parent use cases sit one column deeper.\n * 3. Order use cases within each column by a barycenter of their neighbours so\n * include chains line up on roughly the same row.\n * 4. Wrap the use-case block in a subject (system boundary) rectangle.\n * 5. Flank the subject with actor stacks (primary left, supporting right).\n * 6. Route associations (straight, clamped to ellipse perimeter),\n * include / extend (dashed, arrow toward the included / base), and\n * generalization (hollow triangle toward the parent, optionally merged\n * into one shared head for ≥3 siblings).\n *\n * Spec: docs/reference/29-USECASE-STANDARD.md §8\n */\n\nimport type {\n UsecaseActor,\n UsecaseActorBox,\n UsecaseAst,\n UsecaseEdge,\n UsecaseEdgeLabel,\n UsecaseEllipse,\n UsecaseGeneralizationTree,\n UsecaseLayoutResult,\n UsecaseNode,\n UsecaseRelation,\n UsecaseSubject,\n} from \"./types\";\n\nexport const USECASE_CONST = {\n COL_GAP: 84, // horizontal gap between adjacent use-case columns (edge-to-edge)\n ROW_PITCH: 104, // vertical center-to-center between use cases\n ROW_GAP_MIN: 22, // minimum vertical gap between ellipse edges in a column\n\n MIN_RX: 70,\n MIN_RY: 30,\n ELLIPSE_PAD_X: 22,\n ELLIPSE_PAD_Y: 16,\n CHAR_W_NAME: 6.9,\n CHAR_W_EXT: 5.8,\n NAME_LH: 15,\n STEREO_LH: 13,\n EXTPOINT_LH: 13,\n EXT_HEADER: \"extension points\",\n\n ACTOR_W: 40,\n ACTOR_H: 60,\n ACTOR_LABEL_H: 16,\n EXTERNAL_W: 132,\n EXTERNAL_H: 48,\n ACTOR_GAP: 60, // gap from subject edge to actor bounding box\n ACTOR_PITCH: 120, // vertical center-to-center between actors on one side\n\n SUBJECT_PAD: 34,\n SUBJECT_TOP_PAD: 54,\n SUBJECT_BOTTOM_PAD: 30,\n\n MARGIN: 24,\n TITLE_H: 34,\n\n GEN_TREE_THRESHOLD: 3,\n GEN_JUNCTION_OFFSET: 38,\n} as const;\n\n// ─── geometry helpers ───────────────────────────────────────────\n\nfunction ellipsePerimeterPoint(\n cx: number,\n cy: number,\n rx: number,\n ry: number,\n tx: number,\n ty: number,\n): { x: number; y: number } {\n const dx = tx - cx;\n const dy = ty - cy;\n if (dx === 0 && dy === 0) return { x: cx + rx, y: cy };\n const t = 1 / Math.sqrt((dx / rx) ** 2 + (dy / ry) ** 2);\n return { x: cx + dx * t, y: cy + dy * t };\n}\n\nfunction isWideGlyph(cp: number): boolean {\n // CJK Unified (incl. ext A), Hiragana/Katakana, Hangul, and full/half-width forms.\n return (\n (cp >= 0x3000 && cp <= 0x9fff) ||\n (cp >= 0xac00 && cp <= 0xd7a3) ||\n (cp >= 0xff00 && cp <= 0xffef)\n );\n}\n\nfunction estimateTextWidth(s: string, charW: number): number {\n let w = 0;\n for (const ch of s) {\n // CJK / full-width glyphs render roughly 1.7x the Latin advance width.\n w += isWideGlyph(ch.codePointAt(0) ?? 0) ? charW * 1.7 : charW;\n }\n return w;\n}\n\n// ─── ellipse sizing ─────────────────────────────────────────────\n\nfunction sizeEllipse(uc: UsecaseNode): { rx: number; ry: number; dividerY?: number } {\n const C = USECASE_CONST;\n const nameW = estimateTextWidth(uc.name, C.CHAR_W_NAME);\n let widest = nameW;\n if (uc.stereotype) {\n widest = Math.max(widest, estimateTextWidth(`«${uc.stereotype}»`, C.CHAR_W_EXT));\n }\n\n // Vertical text stack height\n let stack = 0;\n if (uc.stereotype) stack += C.STEREO_LH;\n stack += C.NAME_LH;\n\n const hasExt = uc.extensionPoints.length > 0;\n if (hasExt) {\n stack += 8; // divider gap\n stack += C.EXTPOINT_LH; // header\n stack += uc.extensionPoints.length * C.EXTPOINT_LH;\n widest = Math.max(widest, estimateTextWidth(C.EXT_HEADER, C.CHAR_W_EXT));\n for (const ep of uc.extensionPoints) {\n widest = Math.max(widest, estimateTextWidth(ep, C.CHAR_W_EXT) + 16);\n }\n }\n\n // Ellipse must enclose the text rectangle: a w×h rectangle fits an ellipse of\n // semi-axes (w/√2, h/√2). Add padding, then enforce minimums.\n const rx = Math.max(C.MIN_RX, (widest / 2) * Math.SQRT2 + C.ELLIPSE_PAD_X);\n const ry = Math.max(C.MIN_RY, (stack / 2) * Math.SQRT2 + C.ELLIPSE_PAD_Y);\n\n const result: { rx: number; ry: number; dividerY?: number } = {\n rx: Math.round(rx),\n ry: Math.round(ry),\n };\n return result;\n}\n\n// ─── depth assignment ───────────────────────────────────────────\n\ninterface DeepEdge {\n from: string; // shallower\n to: string; // deeper\n}\n\nfunction buildDeepEdges(ast: UsecaseAst, ucIds: Set<string>): DeepEdge[] {\n const edges: DeepEdge[] = [];\n for (const r of ast.relations) {\n if (!ucIds.has(r.source) || !ucIds.has(r.target)) continue;\n if (r.kind === \"include\") {\n // includer (source) shallow, included (target) deep\n edges.push({ from: r.source, to: r.target });\n } else if (r.kind === \"extend\") {\n // canonical: source = extension (deep), target = base (shallow)\n edges.push({ from: r.target, to: r.source });\n } else if (r.kind === \"generalization\") {\n // child (source) shallow, parent (target) deep\n edges.push({ from: r.source, to: r.target });\n }\n }\n return edges;\n}\n\nfunction assignDepths(ucs: UsecaseNode[], deepEdges: DeepEdge[]): Map<string, number> {\n const depth = new Map<string, number>();\n for (const u of ucs) depth.set(u.id, 0);\n // Longest-path relaxation, bounded to avoid runaway on accidental cycles.\n const maxPasses = ucs.length + 1;\n for (let pass = 0; pass < maxPasses; pass++) {\n let changed = false;\n for (const e of deepEdges) {\n const d = (depth.get(e.from) ?? 0) + 1;\n if (d > (depth.get(e.to) ?? 0)) {\n depth.set(e.to, d);\n changed = true;\n }\n }\n if (!changed) break;\n }\n return depth;\n}\n\n// ─── actor side classification ──────────────────────────────────\n\n/**\n * Assign each actor to the left or right column. Generalization-related actors\n * are pulled onto the *same* side (the side of their earliest-declared member)\n * so a specialisation hierarchy reads as one compact stack instead of arrows\n * crossing the whole subject.\n */\nfunction classifyActorSides(ast: UsecaseAst): Map<string, \"left\" | \"right\"> {\n const actorIds = new Set(ast.actors.map((a) => a.id));\n const idx = new Map<string, number>();\n ast.actors.forEach((a, i) => idx.set(a.id, i));\n\n // union-find over actor↔actor generalization edges\n const parent = new Map<string, string>();\n const find = (x: string): string => {\n let r = x;\n while ((parent.get(r) ?? r) !== r) r = parent.get(r) ?? r;\n let c = x;\n while ((parent.get(c) ?? c) !== c) {\n const next = parent.get(c) ?? c;\n parent.set(c, r);\n c = next;\n }\n return r;\n };\n const union = (a: string, b: string): void => {\n const ra = find(a);\n const rb = find(b);\n if (ra === rb) return;\n // keep the earlier-declared id as the root for deterministic side choice\n if ((idx.get(ra) ?? 0) <= (idx.get(rb) ?? 0)) parent.set(rb, ra);\n else parent.set(ra, rb);\n };\n for (const a of ast.actors) parent.set(a.id, a.id);\n for (const r of ast.relations) {\n if (r.kind === \"generalization\" && actorIds.has(r.source) && actorIds.has(r.target)) {\n union(r.source, r.target);\n }\n }\n\n // base side per actor\n const baseSide = (a: UsecaseActor, i: number): \"left\" | \"right\" =>\n a.side === \"left\" ? \"left\" : a.side === \"right\" ? \"right\" : i === 0 ? \"left\" : \"right\";\n\n // resolve component side: explicit hint wins, else side of earliest member\n const componentSide = new Map<string, \"left\" | \"right\">();\n ast.actors.forEach((a, i) => {\n const root = find(a.id);\n if (a.side === \"left\" || a.side === \"right\") {\n componentSide.set(root, a.side);\n } else if (!componentSide.has(root)) {\n componentSide.set(root, baseSide(a, i));\n }\n });\n\n const sides = new Map<string, \"left\" | \"right\">();\n ast.actors.forEach((a, i) => {\n const root = find(a.id);\n sides.set(a.id, componentSide.get(root) ?? baseSide(a, i));\n });\n return sides;\n}\n\n// ─── main layout ────────────────────────────────────────────────\n\nexport function layoutUsecase(ast: UsecaseAst): UsecaseLayoutResult {\n const C = USECASE_CONST;\n const ucIds = new Set(ast.usecases.map((u) => u.id));\n const actorById = new Map(ast.actors.map((a) => [a.id, a]));\n\n // 1. size ellipses\n const sizes = new Map<string, { rx: number; ry: number }>();\n for (const u of ast.usecases) sizes.set(u.id, sizeEllipse(u));\n\n // 2. depth\n const deepEdges = buildDeepEdges(ast, ucIds);\n const depth = assignDepths(ast.usecases, deepEdges);\n let maxDepth = 0;\n for (const d of depth.values()) maxDepth = Math.max(maxDepth, d);\n\n // 3. ordering within columns\n const actorIndex = new Map<string, number>();\n ast.actors.forEach((a, i) => actorIndex.set(a.id, i));\n const sides = classifyActorSides(ast);\n\n // connected actors per use case\n const connectedActors = new Map<string, string[]>();\n for (const u of ast.usecases) connectedActors.set(u.id, []);\n for (const r of ast.relations) {\n if (r.kind !== \"association\" && r.kind !== \"directed\") continue;\n const aId = actorById.has(r.source) ? r.source : actorById.has(r.target) ? r.target : null;\n const uId = ucIds.has(r.source) ? r.source : ucIds.has(r.target) ? r.target : null;\n if (aId && uId) connectedActors.get(uId)!.push(aId);\n }\n\n const columns: UsecaseNode[][] = [];\n for (let d = 0; d <= maxDepth; d++) columns.push([]);\n for (const u of ast.usecases) columns[depth.get(u.id) ?? 0].push(u);\n\n // predecessors in deepEdges (shallower neighbours pointing into a node)\n const preds = new Map<string, string[]>();\n for (const u of ast.usecases) preds.set(u.id, []);\n for (const e of deepEdges) preds.get(e.to)!.push(e.from);\n\n const declIndex = new Map<string, number>();\n ast.usecases.forEach((u, i) => declIndex.set(u.id, i));\n\n // initial order for column 0: by average connected-actor index, then decl order\n const rowPos = new Map<string, number>();\n const col0 = columns[0];\n col0.sort((a, b) => {\n const ka = avgActorKey(connectedActors.get(a.id)!, actorIndex);\n const kb = avgActorKey(connectedActors.get(b.id)!, actorIndex);\n if (ka !== kb) return ka - kb;\n return declIndex.get(a.id)! - declIndex.get(b.id)!;\n });\n col0.forEach((u, i) => rowPos.set(u.id, i));\n\n // deeper columns: barycenter of predecessors, fall back to decl order\n for (let d = 1; d <= maxDepth; d++) {\n const col = columns[d];\n for (const u of col) {\n const ps = preds.get(u.id)!.filter((p) => rowPos.has(p));\n if (ps.length > 0) {\n const sum = ps.reduce((acc, p) => acc + (rowPos.get(p) ?? 0), 0);\n rowPos.set(u.id, sum / ps.length);\n } else {\n rowPos.set(u.id, declIndex.get(u.id)! );\n }\n }\n // resolve to distinct slots while preserving relative order\n col.sort((a, b) => {\n const ra = rowPos.get(a.id)!;\n const rb = rowPos.get(b.id)!;\n if (ra !== rb) return ra - rb;\n return declIndex.get(a.id)! - declIndex.get(b.id)!;\n });\n let prev = -Infinity;\n for (const u of col) {\n let r = rowPos.get(u.id)!;\n if (r <= prev) r = prev + 1;\n rowPos.set(u.id, r);\n prev = r;\n }\n }\n\n // 4. compute geometry — column x positions (dynamic from max rx per column)\n const colMaxRx: number[] = columns.map((col) =>\n col.reduce((m, u) => Math.max(m, sizes.get(u.id)!.rx), C.MIN_RX as number),\n );\n const colCenterX: number[] = [];\n let cursorX = 0;\n for (let d = 0; d <= maxDepth; d++) {\n cursorX += colMaxRx[d];\n colCenterX[d] = cursorX;\n cursorX += colMaxRx[d] + C.COL_GAP;\n }\n\n // global row pitch big enough for tallest ellipse\n let maxRy: number = C.MIN_RY;\n for (const s of sizes.values()) maxRy = Math.max(maxRy, s.ry);\n const rowPitch = Math.max(C.ROW_PITCH, 2 * maxRy + C.ROW_GAP_MIN);\n\n // place ellipses (relative coords; offset later)\n const ellipses: UsecaseEllipse[] = [];\n const ellById = new Map<string, UsecaseEllipse>();\n for (let d = 0; d <= maxDepth; d++) {\n for (const u of columns[d]) {\n const s = sizes.get(u.id)!;\n const e: UsecaseEllipse = {\n usecase: u,\n cx: colCenterX[d],\n cy: rowPos.get(u.id)! * rowPitch,\n rx: s.rx,\n ry: s.ry,\n };\n if (u.extensionPoints.length > 0) e.dividerY = e.cy + 6;\n ellipses.push(e);\n ellById.set(u.id, e);\n }\n }\n\n // resolve residual vertical overlaps per column\n for (let d = 0; d <= maxDepth; d++) {\n const colE = columns[d].map((u) => ellById.get(u.id)!).sort((a, b) => a.cy - b.cy);\n for (let i = 1; i < colE.length; i++) {\n const prev = colE[i - 1];\n const cur = colE[i];\n const minGap = prev.ry + cur.ry + C.ROW_GAP_MIN;\n if (cur.cy - prev.cy < minGap) {\n cur.cy = prev.cy + minGap;\n if (cur.dividerY !== undefined) cur.dividerY = cur.cy + 6;\n }\n }\n }\n\n // bounding box of use-case block\n let ucMinX = Infinity, ucMaxX = -Infinity, ucMinY = Infinity, ucMaxY = -Infinity;\n for (const e of ellipses) {\n ucMinX = Math.min(ucMinX, e.cx - e.rx);\n ucMaxX = Math.max(ucMaxX, e.cx + e.rx);\n ucMinY = Math.min(ucMinY, e.cy - e.ry);\n ucMaxY = Math.max(ucMaxY, e.cy + e.ry);\n }\n if (!isFinite(ucMinX)) { ucMinX = 0; ucMaxX = 200; ucMinY = 0; ucMaxY = 100; }\n\n // 5. subject box\n const hasSubject = !!ast.system;\n const subjLeft = ucMinX - C.SUBJECT_PAD;\n const subjRight = ucMaxX + C.SUBJECT_PAD;\n const subjTop = ucMinY - C.SUBJECT_TOP_PAD;\n const subjBottom = ucMaxY + C.SUBJECT_BOTTOM_PAD;\n\n // 6. actors — left and right stacks, vertically centered against the subject\n const leftActors = ast.actors.filter((a) => sides.get(a.id) === \"left\");\n const rightActors = ast.actors.filter((a) => sides.get(a.id) === \"right\");\n\n const actorBoxes: UsecaseActorBox[] = [];\n const actorById2 = new Map<string, UsecaseActorBox>();\n\n const subjCenterY = (subjTop + subjBottom) / 2;\n\n function placeStack(actors: UsecaseActor[], side: \"left\" | \"right\"): void {\n if (actors.length === 0) return;\n const totalH = (actors.length - 1) * C.ACTOR_PITCH;\n let cy = subjCenterY - totalH / 2;\n for (const a of actors) {\n const isRect = a.kind === \"external\" || a.kind === \"system\";\n const w = isRect ? C.EXTERNAL_W : C.ACTOR_W;\n const h = isRect ? C.EXTERNAL_H : C.ACTOR_H;\n // box top-left\n let x: number;\n if (side === \"left\") {\n x = subjLeft - C.ACTOR_GAP - w;\n } else {\n x = subjRight + C.ACTOR_GAP;\n }\n const y = cy - h / 2;\n // Single unified anchor per actor: all association lines fan out from this\n // one point on the facing side, at torso height for stick figures.\n const anchorX = side === \"left\" ? x + w : x;\n const anchorY = isRect ? cy : cy - 6;\n const box: UsecaseActorBox = {\n actor: a,\n x,\n y,\n width: w,\n height: h,\n side,\n anchorX,\n anchorY,\n };\n actorBoxes.push(box);\n actorById2.set(a.id, box);\n cy += C.ACTOR_PITCH;\n }\n }\n placeStack(leftActors, \"left\");\n placeStack(rightActors, \"right\");\n\n // 7. compute overall bounds (include actors + labels)\n let minX = subjLeft, maxX = subjRight, minY = subjTop, maxY = subjBottom;\n for (const b of actorBoxes) {\n let left = b.x;\n let right = b.x + b.width;\n const isRect = b.actor.kind === \"external\" || b.actor.kind === \"system\";\n if (!isRect) {\n // the name label is centered under the stick figure and can be wider\n const labelW = estimateTextWidth(b.actor.name, 6.4);\n const cx = b.x + b.width / 2;\n left = Math.min(left, cx - labelW / 2);\n right = Math.max(right, cx + labelW / 2);\n }\n minX = Math.min(minX, left);\n maxX = Math.max(maxX, right);\n minY = Math.min(minY, b.y);\n // include name label below figure\n maxY = Math.max(maxY, b.y + b.height + C.ACTOR_LABEL_H);\n }\n\n // translate so everything sits at margin offset, leaving room for a title.\n const titleSpace = ast.title ? C.TITLE_H : 0;\n const offsetX = C.MARGIN - minX;\n const offsetY = C.MARGIN + titleSpace - minY;\n\n const translate = (px: number, py: number) => ({ x: px + offsetX, y: py + offsetY });\n\n for (const e of ellipses) {\n const p = translate(e.cx, e.cy);\n e.cx = p.x;\n e.cy = p.y;\n if (e.dividerY !== undefined) e.dividerY += offsetY;\n }\n for (const b of actorBoxes) {\n b.x += offsetX;\n b.y += offsetY;\n b.anchorX += offsetX;\n b.anchorY += offsetY;\n }\n const subject: UsecaseSubject | undefined = hasSubject\n ? {\n x: subjLeft + offsetX,\n y: subjTop + offsetY,\n width: subjRight - subjLeft,\n height: subjBottom - subjTop,\n }\n : undefined;\n if (subject && ast.system) subject.name = ast.system;\n\n const width = maxX - minX + 2 * C.MARGIN;\n const height = maxY - minY + 2 * C.MARGIN + titleSpace;\n\n // 8. route edges\n const edges: UsecaseEdge[] = [];\n const trees: UsecaseGeneralizationTree[] = [];\n\n // group generalization relations by parent for tree merging\n const genByParent = new Map<string, UsecaseRelation[]>();\n for (const r of ast.relations) {\n if (r.kind !== \"generalization\") continue;\n if (!genByParent.has(r.target)) genByParent.set(r.target, []);\n genByParent.get(r.target)!.push(r);\n }\n const handledGen = new Set<UsecaseRelation>();\n\n function nodeCenter(id: string): { cx: number; cy: number; rx: number; ry: number } | null {\n const e = ellById.get(id);\n if (e) return { cx: e.cx, cy: e.cy, rx: e.rx, ry: e.ry };\n const b = actorById2.get(id);\n if (b) {\n return {\n cx: b.x + b.width / 2,\n cy: b.y + b.height / 2,\n rx: b.width / 2,\n ry: b.height / 2,\n };\n }\n return null;\n }\n\n function perimeter(id: string, towardX: number, towardY: number): { x: number; y: number } {\n const e = ellById.get(id);\n if (e) return ellipsePerimeterPoint(e.cx, e.cy, e.rx, e.ry, towardX, towardY);\n const b = actorById2.get(id)!;\n // clamp to actor box edge facing the target\n const cx = b.x + b.width / 2;\n const cy = b.y + b.height / 2;\n return clampToRect(b.width, b.height, cx, cy, towardX, towardY);\n }\n\n // Generalization on actors connects at the *outer* edge of the stick figure\n // (left side → left edge, right side → right edge), so the bus runs clear of\n // the use-case associations and the name labels.\n function actorGenAnchor(id: string, side: \"left\" | \"right\"): { x: number; y: number } {\n const b = actorById2.get(id)!;\n const isRect = b.actor.kind === \"external\" || b.actor.kind === \"system\";\n const y = isRect ? b.y + b.height / 2 : b.y + 22; // torso line on a stick figure\n const x = side === \"left\" ? b.x + 4 : b.x + b.width - 4;\n return { x, y };\n }\n\n for (const [parentId, rels] of genByParent) {\n const useTree = ast.generalizationTree && rels.length >= C.GEN_TREE_THRESHOLD;\n const allActors =\n actorById2.has(parentId) && rels.every((r) => actorById2.has(r.source));\n\n if (allActors) {\n // route as a vertical bus on the outer side of the actor stack\n const side = sides.get(parentId) ?? \"left\";\n const pAnchor = actorGenAnchor(parentId, side);\n const childAnchors = rels.map((r) => ({ r, p: actorGenAnchor(r.source, side) }));\n const xs = [pAnchor.x, ...childAnchors.map((c) => c.p.x)];\n const ys = [pAnchor.y, ...childAnchors.map((c) => c.p.y)];\n const busX =\n side === \"left\" ? Math.min(...xs) - 20 : Math.max(...xs) + 20;\n const minY = Math.min(...ys);\n const maxY = Math.max(...ys);\n\n if (useTree) {\n const legPaths: string[] = [\n `M ${round(busX)} ${round(minY)} L ${round(busX)} ${round(maxY)}`,\n ];\n for (const c of childAnchors) {\n legPaths.push(`M ${round(c.p.x)} ${round(c.p.y)} L ${round(busX)} ${round(c.p.y)}`);\n handledGen.add(c.r);\n }\n trees.push({\n parentId,\n childIds: rels.map((r) => r.source),\n stemX: busX,\n stemTop: minY,\n stemBottom: maxY,\n trunkD: `M ${round(busX)} ${round(pAnchor.y)} L ${round(pAnchor.x)} ${round(pAnchor.y)}`,\n legPaths,\n });\n } else {\n // individual L-routes that still share the outer bus column\n for (const c of childAnchors) {\n edges.push({\n relation: c.r,\n d:\n `M ${round(c.p.x)} ${round(c.p.y)} ` +\n `L ${round(busX)} ${round(c.p.y)} ` +\n `L ${round(busX)} ${round(pAnchor.y)} ` +\n `L ${round(pAnchor.x)} ${round(pAnchor.y)}`,\n arrowKind: \"hollow\",\n dashed: false,\n });\n handledGen.add(c.r);\n }\n }\n continue;\n }\n\n if (!useTree) continue;\n // use-case (or mixed) generalization tree — star-merge toward the parent\n const parent = nodeCenter(parentId);\n if (!parent) continue;\n const childCenters = rels\n .map((r) => nodeCenter(r.source))\n .filter((c): c is NonNullable<typeof c> => c !== null);\n if (childCenters.length === 0) continue;\n const avgX = childCenters.reduce((s, c) => s + c.cx, 0) / childCenters.length;\n const avgY = childCenters.reduce((s, c) => s + c.cy, 0) / childCenters.length;\n const pPt = perimeter(parentId, avgX, avgY);\n const dirX = avgX - parent.cx;\n const dirY = avgY - parent.cy;\n const len = Math.hypot(dirX, dirY) || 1;\n const jx = pPt.x + (dirX / len) * C.GEN_JUNCTION_OFFSET;\n const jy = pPt.y + (dirY / len) * C.GEN_JUNCTION_OFFSET;\n const legPaths: string[] = [];\n for (const r of rels) {\n const cPt = perimeter(r.source, jx, jy);\n legPaths.push(`M ${round(cPt.x)} ${round(cPt.y)} L ${round(jx)} ${round(jy)}`);\n handledGen.add(r);\n }\n trees.push({\n parentId,\n childIds: rels.map((r) => r.source),\n stemX: jx,\n stemTop: jy,\n stemBottom: jy,\n trunkD: `M ${round(jx)} ${round(jy)} L ${round(pPt.x)} ${round(pPt.y)}`,\n legPaths,\n });\n }\n\n for (const r of ast.relations) {\n if (handledGen.has(r)) continue;\n const a = nodeCenter(r.source);\n const b = nodeCenter(r.target);\n if (!a || !b) continue;\n\n // actor↔actor generalization not caught above (single child, individual mode)\n if (r.kind === \"generalization\" && actorById2.has(r.source) && actorById2.has(r.target)) {\n const side = sides.get(r.target) ?? \"left\";\n const pAnchor = actorGenAnchor(r.target, side);\n const cAnchor = actorGenAnchor(r.source, side);\n const busX = side === \"left\"\n ? Math.min(pAnchor.x, cAnchor.x) - 20\n : Math.max(pAnchor.x, cAnchor.x) + 20;\n edges.push({\n relation: r,\n d:\n `M ${round(cAnchor.x)} ${round(cAnchor.y)} ` +\n `L ${round(busX)} ${round(cAnchor.y)} ` +\n `L ${round(busX)} ${round(pAnchor.y)} ` +\n `L ${round(pAnchor.x)} ${round(pAnchor.y)}`,\n arrowKind: \"hollow\",\n dashed: false,\n });\n continue;\n }\n\n // Endpoints. For actor↔use-case associations, anchor the actor end at its\n // single unified point so every line from that actor fans out from one spot\n // (canonical UML rendering); the use-case end aims at that anchor.\n const srcActor = actorById2.get(r.source);\n const tgtActor = actorById2.get(r.target);\n let pa: { x: number; y: number };\n let pb: { x: number; y: number };\n if (srcActor && !tgtActor) {\n pa = { x: srcActor.anchorX, y: srcActor.anchorY };\n pb = perimeter(r.target, pa.x, pa.y);\n } else if (tgtActor && !srcActor) {\n pb = { x: tgtActor.anchorX, y: tgtActor.anchorY };\n pa = perimeter(r.source, pb.x, pb.y);\n } else {\n pa = perimeter(r.source, b.cx, b.cy);\n pb = perimeter(r.target, a.cx, a.cy);\n }\n\n const dashed = r.kind === \"include\" || r.kind === \"extend\";\n let arrowKind: UsecaseEdge[\"arrowKind\"] = \"none\";\n if (r.kind === \"directed\" || r.kind === \"include\" || r.kind === \"extend\") arrowKind = \"open\";\n else if (r.kind === \"generalization\") arrowKind = \"hollow\";\n\n const edge: UsecaseEdge = {\n relation: r,\n d: `M ${round(pa.x)} ${round(pa.y)} L ${round(pb.x)} ${round(pb.y)}`,\n arrowKind,\n dashed,\n };\n\n // label for include / extend\n if (r.kind === \"include\" || r.kind === \"extend\") {\n const rows: string[] = [];\n const keyword = r.kind === \"include\" ? \"include\" : \"extend\";\n rows.push(`«${r.stereotype ?? keyword}»`);\n if (r.condition) rows.push(`[${r.condition}]`);\n if (r.extensionPointRef) rows.push(`(extension point: ${r.extensionPointRef})`);\n const label: UsecaseEdgeLabel = {\n rows,\n cx: (pa.x + pb.x) / 2,\n cy: (pa.y + pb.y) / 2,\n };\n edge.label = label;\n } else if ((r.kind === \"association\" || r.kind === \"directed\") && r.stereotype) {\n edge.label = {\n rows: [`«${r.stereotype}»`],\n cx: (pa.x + pb.x) / 2,\n cy: (pa.y + pb.y) / 2,\n };\n }\n\n // multiplicities near endpoints\n if (r.sourceMultiplicity) {\n edge.multiplicityFrom = placeMultiplicity(pa, pb, r.sourceMultiplicity);\n }\n if (r.targetMultiplicity) {\n edge.multiplicityTo = placeMultiplicity(pb, pa, r.targetMultiplicity);\n }\n\n edges.push(edge);\n }\n\n const result: UsecaseLayoutResult = {\n width: Math.round(width),\n height: Math.round(height),\n actors: actorBoxes,\n usecases: ellipses,\n edges,\n trees,\n warnings: ast.warnings,\n ast,\n };\n if (ast.title) result.title = ast.title;\n if (subject) result.subject = subject;\n return result;\n}\n\nfunction avgActorKey(actorIds: string[], idx: Map<string, number>): number {\n if (actorIds.length === 0) return Number.MAX_SAFE_INTEGER / 2;\n const sum = actorIds.reduce((s, a) => s + (idx.get(a) ?? 0), 0);\n return sum / actorIds.length;\n}\n\nfunction clampToRect(\n w: number,\n h: number,\n cx: number,\n cy: number,\n tx: number,\n ty: number,\n): { x: number; y: number } {\n // Intersect the ray from (cx,cy) toward (tx,ty) with the rectangle border.\n const dx = tx - cx;\n const dy = ty - cy;\n if (dx === 0 && dy === 0) return { x: cx, y: cy };\n const halfW = w / 2;\n const halfH = h / 2;\n const scaleX = dx !== 0 ? halfW / Math.abs(dx) : Infinity;\n const scaleY = dy !== 0 ? halfH / Math.abs(dy) : Infinity;\n const s = Math.min(scaleX, scaleY);\n return { x: cx + dx * s, y: cy + dy * s };\n}\n\nfunction placeMultiplicity(\n near: { x: number; y: number },\n far: { x: number; y: number },\n text: string,\n): { text: string; x: number; y: number } {\n const dx = far.x - near.x;\n const dy = far.y - near.y;\n const len = Math.hypot(dx, dy) || 1;\n const ox = (dx / len) * 14;\n const oy = (dy / len) * 14;\n // offset perpendicular a touch so it doesn't sit on the line\n const px = (-dy / len) * 9;\n const py = (dx / len) * 9;\n return { text, x: round(near.x + ox + px), y: round(near.y + oy + py) };\n}\n\nfunction round(n: number): number {\n return Math.round(n * 100) / 100;\n}\n","/**\n * UML Use Case renderer — SVG output.\n *\n * Spec: docs/reference/29-USECASE-STANDARD.md §6, §10\n */\n\nimport type { RenderConfig } from \"../../core/types\";\nimport {\n svgRoot,\n group,\n el,\n rect,\n circle,\n line,\n path as pathEl,\n text as textEl,\n title as titleEl,\n desc,\n defs,\n escapeXml,\n} from \"../../core/svg\";\nimport { resolveBaseTheme, type BaseTheme } from \"../../core/theme\";\nimport { parseUsecase } from \"./parser\";\nimport { layoutUsecase } from \"./layout\";\nimport type {\n UsecaseActorBox,\n UsecaseAst,\n UsecaseEdge,\n UsecaseEllipse,\n UsecaseGeneralizationTree,\n UsecaseLayoutResult,\n} from \"./types\";\n\nfunction buildCss(t: BaseTheme): string {\n // Palette tuned to match the polished house style: soft blue use-case fills,\n // a quiet rounded subject boundary, and crisp dark actor strokes.\n const ucFill = \"#eaf2fc\";\n const ucStroke = \"#5b85c0\";\n const subjectStroke = \"#c2cede\";\n const assocStroke = \"#475569\";\n return `\n.sx-uc { font-family: system-ui, -apple-system, sans-serif; }\n.sx-uc-subject rect { stroke: ${subjectStroke}; stroke-width: 1.4; fill: #fafbfd; }\n.sx-uc-subject-title { font: 700 14px sans-serif; fill: ${t.text}; letter-spacing: 0.2px; }\n.sx-uc-actor circle, .sx-uc-actor line { stroke: ${t.stroke}; stroke-width: 1.6; fill: none; stroke-linecap: round; }\n.sx-uc-actor-head { fill: ${t.bg}; }\n.sx-uc-actor-name { font: 600 12px sans-serif; fill: ${t.text}; }\n.sx-uc-actor-system rect { stroke: ${ucStroke}; stroke-width: 1.4; fill: ${ucFill}; }\n.sx-uc-usecase ellipse { stroke: ${ucStroke}; stroke-width: 1.4; fill: ${ucFill}; }\n.sx-uc-name { font: 600 12px sans-serif; fill: ${t.text}; }\n.sx-uc-stereotype { font: italic 10px sans-serif; fill: ${t.textMuted}; }\n.sx-uc-extpoint-head { font: italic 10px sans-serif; fill: ${t.textMuted}; }\n.sx-uc-extpoint { font: 10px sans-serif; fill: ${t.textMuted}; }\n.sx-uc-div { stroke: ${ucStroke}; stroke-width: 1; opacity: 0.5; }\n.sx-uc-assoc { stroke: ${assocStroke}; stroke-width: 1.4; fill: none; }\n.sx-uc-include { stroke: ${assocStroke}; stroke-width: 1.4; fill: none; stroke-dasharray: 5 3; }\n.sx-uc-extend { stroke: ${t.accent}; stroke-width: 1.4; fill: none; stroke-dasharray: 5 3; }\n.sx-uc-general { stroke: ${assocStroke}; stroke-width: 1.4; fill: none; }\n.sx-uc-pill { fill: ${t.bg}; opacity: 0.92; }\n.sx-uc-edge-label { font: italic 10px sans-serif; fill: ${t.textMuted}; }\n.sx-uc-edge-label-accent { fill: ${t.accent}; }\n.sx-uc-mult { font: 10px sans-serif; fill: ${t.textMuted}; }\n.sx-uc-title { font: 700 16px sans-serif; fill: ${t.text}; }\n`.trim();\n}\n\nfunction markers(t: BaseTheme): string {\n return defs([\n el(\n \"marker\",\n {\n id: \"sx-uc-open-arrow\",\n viewBox: \"0 0 10 8\",\n refX: 9,\n refY: 4,\n markerWidth: 11,\n markerHeight: 9,\n orient: \"auto\",\n },\n [el(\"polyline\", { points: \"0,0 9,4 0,8\", fill: \"none\", stroke: t.stroke, \"stroke-width\": 1.5 })],\n ),\n el(\n \"marker\",\n {\n id: \"sx-uc-open-arrow-accent\",\n viewBox: \"0 0 10 8\",\n refX: 9,\n refY: 4,\n markerWidth: 11,\n markerHeight: 9,\n orient: \"auto\",\n },\n [el(\"polyline\", { points: \"0,0 9,4 0,8\", fill: \"none\", stroke: t.accent, \"stroke-width\": 1.5 })],\n ),\n el(\n \"marker\",\n {\n id: \"sx-uc-gen-arrow\",\n viewBox: \"0 0 12 10\",\n refX: 11,\n refY: 5,\n markerWidth: 13,\n markerHeight: 11,\n orient: \"auto\",\n },\n [el(\"polygon\", { points: \"0,0 11,5 0,10\", fill: t.bg, stroke: t.stroke, \"stroke-width\": 1.5 })],\n ),\n ]);\n}\n\nconst C = {\n // stick figure proportions, scaled to the 40×60 bounding box\n HEAD_R: 6,\n HEAD_CY: 8,\n BODY_TOP: 14,\n BODY_BOT: 36,\n ARM_Y: 22,\n ARM_X1: 6,\n ARM_X2: 34,\n LEG_Y: 56,\n LEG_X1: 8,\n LEG_X2: 32,\n NAME_DY: 72,\n CHAR_W: 6.4,\n} as const;\n\nfunction renderActor(b: UsecaseActorBox): string {\n const a = b.actor;\n const isRect = a.kind === \"external\" || a.kind === \"system\";\n if (isRect) {\n return group(\n { class: \"sx-uc-actor sx-uc-actor-system\", \"data-id\": a.id, transform: `translate(${b.x}, ${b.y})` },\n [\n rect({ x: 0, y: 0, width: b.width, height: b.height, rx: 2, ry: 2 }),\n textEl(\n { class: \"sx-uc-stereotype\", x: b.width / 2, y: 18, \"text-anchor\": \"middle\" },\n `«${a.stereotype ?? \"actor\"}»`,\n ),\n textEl(\n { class: \"sx-uc-actor-name\", x: b.width / 2, y: 36, \"text-anchor\": \"middle\" },\n a.name,\n ),\n ],\n );\n }\n\n // stick figure\n const fig: string[] = [\n circle({ class: \"sx-uc-actor-head\", cx: 20, cy: C.HEAD_CY, r: C.HEAD_R }),\n line({ x1: 20, y1: C.BODY_TOP, x2: 20, y2: C.BODY_BOT }),\n line({ x1: C.ARM_X1, y1: C.ARM_Y, x2: C.ARM_X2, y2: C.ARM_Y }),\n line({ x1: 20, y1: C.BODY_BOT, x2: C.LEG_X1, y2: C.LEG_Y }),\n line({ x1: 20, y1: C.BODY_BOT, x2: C.LEG_X2, y2: C.LEG_Y }),\n ];\n if (a.kind === \"business\") {\n // diagonal slash across the torso (upper-left to lower-right)\n fig.push(line({ class: \"sx-uc-actor-slash\", x1: 8, y1: C.BODY_TOP, x2: 32, y2: C.BODY_BOT }));\n }\n if (a.stereotype) {\n fig.push(\n textEl(\n { class: \"sx-uc-stereotype\", x: 20, y: -2, \"text-anchor\": \"middle\" },\n `«${a.stereotype}»`,\n ),\n );\n }\n fig.push(\n textEl({ class: \"sx-uc-actor-name\", x: 20, y: C.NAME_DY, \"text-anchor\": \"middle\" }, a.name),\n );\n return group(\n { class: \"sx-uc-actor\", \"data-id\": a.id, transform: `translate(${b.x}, ${b.y})` },\n fig,\n );\n}\n\nfunction renderUsecaseEllipse(e: UsecaseEllipse): string {\n const u = e.usecase;\n const parts: string[] = [\n el(\"ellipse\", { cx: e.cx, cy: e.cy, rx: e.rx, ry: e.ry }),\n ];\n\n // vertical text stack centered in the ellipse\n let topY: number;\n const hasExt = u.extensionPoints.length > 0;\n if (hasExt) {\n // name sits in upper half, extension points in lower\n topY = e.cy - e.ry + 18 + (u.stereotype ? 12 : 0);\n } else {\n topY = e.cy + 4;\n }\n\n if (u.stereotype) {\n parts.push(\n textEl(\n { class: \"sx-uc-stereotype\", x: e.cx, y: (hasExt ? e.cy - e.ry + 16 : e.cy - 12), \"text-anchor\": \"middle\" },\n `«${u.stereotype}»`,\n ),\n );\n }\n parts.push(\n textEl(\n { class: \"sx-uc-name\", x: e.cx, y: hasExt ? topY : e.cy + 4, \"text-anchor\": \"middle\" },\n u.name,\n ),\n );\n\n if (hasExt) {\n const divY = (hasExt ? topY : e.cy) + 8;\n parts.push(line({ class: \"sx-uc-div\", x1: e.cx - e.rx + 8, y1: divY, x2: e.cx + e.rx - 8, y2: divY }));\n let ty = divY + 14;\n const leftX = e.cx - e.rx + 16;\n parts.push(textEl({ class: \"sx-uc-extpoint-head\", x: leftX, y: ty }, \"extension points\"));\n ty += 13;\n for (const ep of u.extensionPoints) {\n parts.push(textEl({ class: \"sx-uc-extpoint\", x: leftX, y: ty }, ep));\n ty += 13;\n }\n }\n\n return group({ class: \"sx-uc-usecase\", \"data-id\": u.id }, parts);\n}\n\nfunction classForEdge(e: UsecaseEdge): string {\n switch (e.relation.kind) {\n case \"include\":\n return \"sx-uc-include\";\n case \"extend\":\n return \"sx-uc-extend\";\n case \"generalization\":\n return \"sx-uc-general\";\n default:\n return \"sx-uc-assoc\";\n }\n}\n\nfunction markerFor(e: UsecaseEdge): string | undefined {\n if (e.arrowKind === \"hollow\") return \"url(#sx-uc-gen-arrow)\";\n if (e.arrowKind === \"open\") {\n return e.relation.kind === \"extend\"\n ? \"url(#sx-uc-open-arrow-accent)\"\n : \"url(#sx-uc-open-arrow)\";\n }\n return undefined;\n}\n\nfunction renderEdge(e: UsecaseEdge): string {\n const attrs: Record<string, string | number> = {\n class: classForEdge(e),\n d: e.d,\n \"data-source\": e.relation.source,\n \"data-target\": e.relation.target,\n };\n const marker = markerFor(e);\n if (marker) attrs[\"marker-end\"] = marker;\n return pathEl(attrs);\n}\n\nfunction renderEdgeLabel(e: UsecaseEdge): string | null {\n if (!e.label) return null;\n const rows = e.label.rows;\n const lineH = 12;\n const totalH = rows.length * lineH;\n const widest = rows.reduce((m, r) => Math.max(m, r.length), 0);\n const pillW = widest * 6.0 + 8;\n const pillH = totalH + 4;\n const startY = e.label.cy - totalH / 2 + 9;\n const accent = e.relation.kind === \"extend\";\n const parts: string[] = [\n rect({\n class: \"sx-uc-pill\",\n x: e.label.cx - pillW / 2,\n y: e.label.cy - pillH / 2,\n width: pillW,\n height: pillH,\n rx: 4,\n ry: 4,\n }),\n ];\n rows.forEach((r, i) => {\n parts.push(\n textEl(\n {\n class: accent && i === 0 ? \"sx-uc-edge-label sx-uc-edge-label-accent\" : \"sx-uc-edge-label\",\n x: e.label!.cx,\n y: startY + i * lineH,\n \"text-anchor\": \"middle\",\n },\n r,\n ),\n );\n });\n return group({ class: \"sx-uc-edge-label-g\" }, parts);\n}\n\nfunction renderMultiplicities(e: UsecaseEdge): string[] {\n const out: string[] = [];\n if (e.multiplicityFrom) {\n out.push(\n textEl(\n { class: \"sx-uc-mult\", x: e.multiplicityFrom.x, y: e.multiplicityFrom.y, \"text-anchor\": \"middle\" },\n e.multiplicityFrom.text,\n ),\n );\n }\n if (e.multiplicityTo) {\n out.push(\n textEl(\n { class: \"sx-uc-mult\", x: e.multiplicityTo.x, y: e.multiplicityTo.y, \"text-anchor\": \"middle\" },\n e.multiplicityTo.text,\n ),\n );\n }\n return out;\n}\n\nfunction renderTree(tr: UsecaseGeneralizationTree): string {\n const parts: string[] = [];\n for (const leg of tr.legPaths) {\n parts.push(pathEl({ class: \"sx-uc-general\", d: leg }));\n }\n parts.push(pathEl({ class: \"sx-uc-general\", d: tr.trunkD, \"marker-end\": \"url(#sx-uc-gen-arrow)\" }));\n return group(\n { class: \"sx-uc-gen-tree\", \"data-parent\": tr.parentId },\n parts,\n );\n}\n\nexport function renderUsecaseLayout(layout: UsecaseLayoutResult, config?: RenderConfig): string {\n const t = resolveBaseTheme(config?.theme ?? \"default\");\n const children: string[] = [];\n\n const nInclude = layout.ast.relations.filter((r) => r.kind === \"include\").length;\n const nExtend = layout.ast.relations.filter((r) => r.kind === \"extend\").length;\n children.push(titleEl(`Use Case Diagram${layout.title ? \" — \" + layout.title : \"\"}`));\n children.push(\n desc(\n `${layout.subject ? \"Subject: \" + layout.subject.name + \". \" : \"\"}` +\n `${layout.actors.length} actors, ${layout.usecases.length} use cases, ${nInclude} include, ${nExtend} extend.`,\n ),\n );\n children.push(el(\"style\", {}, buildCss(t)));\n children.push(markers(t));\n\n if (layout.title) {\n children.push(\n textEl(\n { x: layout.width / 2, y: 24, class: \"sx-uc-title\", \"text-anchor\": \"middle\" },\n layout.title,\n ),\n );\n }\n\n // subject (behind everything)\n if (layout.subject) {\n const s = layout.subject;\n const subjParts: string[] = [\n rect({ x: s.x, y: s.y, width: s.width, height: s.height, rx: 8, ry: 8 }),\n ];\n if (s.name) {\n subjParts.push(\n textEl(\n { class: \"sx-uc-subject-title\", x: s.x + s.width / 2, y: s.y + 24, \"text-anchor\": \"middle\" },\n s.name,\n ),\n );\n }\n children.push(group({ class: \"sx-uc-subject\", \"data-id\": \"subject\" }, subjParts));\n }\n\n // edges under nodes\n const edgeEls: string[] = [];\n for (const e of layout.edges) edgeEls.push(renderEdge(e));\n for (const tr of layout.trees) edgeEls.push(renderTree(tr));\n children.push(group({ class: \"sx-uc-edges\" }, edgeEls));\n\n // actors\n const actorEls: string[] = [];\n for (const a of layout.actors) actorEls.push(renderActor(a));\n children.push(group({ class: \"sx-uc-actors\" }, actorEls));\n\n // use cases\n const ucEls: string[] = [];\n for (const u of layout.usecases) ucEls.push(renderUsecaseEllipse(u));\n children.push(group({ class: \"sx-uc-usecases\" }, ucEls));\n\n // labels + multiplicities on top\n const labelEls: string[] = [];\n for (const e of layout.edges) {\n const lbl = renderEdgeLabel(e);\n if (lbl) labelEls.push(lbl);\n labelEls.push(...renderMultiplicities(e));\n }\n children.push(group({ class: \"sx-uc-labels\" }, labelEls));\n\n return svgRoot(\n {\n class: \"sx-uc\",\n role: \"img\",\n \"aria-label\": escapeXml(layout.title ?? \"UML use case diagram\"),\n width: layout.width,\n height: layout.height,\n viewBox: `0 0 ${layout.width} ${layout.height}`,\n \"data-diagram-type\": \"usecase\",\n },\n children,\n );\n}\n\nexport function renderUsecase(textOrAst: string | UsecaseAst, config?: RenderConfig): string {\n const ast = typeof textOrAst === \"string\" ? parseUsecase(textOrAst) : textOrAst;\n const layout = layoutUsecase(ast);\n return renderUsecaseLayout(layout, config);\n}\n","import type { DiagramPlugin, RenderConfig } from \"../../core/types\";\nimport { parseUsecase } from \"./parser\";\nimport { renderUsecase } from \"./renderer\";\n\nexport const usecase: DiagramPlugin = {\n type: \"usecase\" as DiagramPlugin[\"type\"],\n detect(text: string): boolean {\n for (const raw of text.split(/\\r?\\n/)) {\n const t = raw.trim();\n if (!t) continue;\n if (t.startsWith(\"#\") || t.startsWith(\"//\")) continue;\n return /^usecase\\b/i.test(t);\n }\n return false;\n },\n parse: parseUsecase,\n render(text: string, config?: RenderConfig): string {\n return renderUsecase(text, config);\n },\n};\n\nexport { parseUsecase, UsecaseParseError } from \"./parser\";\nexport { renderUsecase, renderUsecaseLayout } from \"./renderer\";\nexport { layoutUsecase, USECASE_CONST } from \"./layout\";\nexport type * from \"./types\";\n","/**\n * PERT / CPM DSL parser (recursive descent, hand-written).\n *\n * Grammar: docs/reference/32-PERT-STANDARD.md §7\n *\n * pert\n * title: \"...\" unit: days|weeks|hours|abstract\n * direction: LR|TB layout: network|timescaled\n * critical-tolerance: 0 show-sentinels: false\n *\n * task <id> \"<label>\" duration: <d|O/M/P> [after: <ref-list>] [milestone] [tags: a,b] [class: c]\n *\n * Dependency references: `A`, `A+2`, `A+2d`, `A FS`, `A FS+2d`, `B SS-1`, `I FF`, `G SF+1`.\n */\n\nimport type {\n PertAst,\n PertDependency,\n PertDepType,\n PertDirection,\n PertLayoutMode,\n PertTask,\n PertThreePoint,\n PertUnit,\n} from \"./types\";\n\nexport class PertParseError extends Error {\n line?: number;\n constructor(message: string, line?: number) {\n super(line !== undefined ? `Line ${line}: ${message}` : message);\n this.name = \"PertParseError\";\n if (line !== undefined) this.line = line;\n }\n}\n\ninterface RawLine {\n text: string;\n line: number;\n}\n\nconst UNIT_SUFFIX: Record<PertUnit, string | null> = {\n days: \"d\",\n weeks: \"w\",\n hours: \"h\",\n abstract: null,\n};\n\n/** Normalise smart / CJK quotes to straight ASCII quotes (AI-friendly). */\nfunction normalizeQuotes(s: string): string {\n return s\n .replace(/[“”〝〞"]/g, '\"')\n .replace(/[‘’]/g, \"'\")\n .replace(/[「」『』]/g, '\"');\n}\n\nfunction preprocess(src: string): RawLine[] {\n const out: RawLine[] = [];\n const rows = normalizeQuotes(src).split(/\\r?\\n/);\n for (let i = 0; i < rows.length; i++) {\n const raw = rows[i] ?? \"\";\n const trimmed = raw.trim();\n if (!trimmed) continue;\n if (trimmed.startsWith(\"#\") || trimmed.startsWith(\"//\")) continue;\n // Strip end-of-line comments outside quotes.\n let inQ = false;\n let cut = raw.length;\n for (let j = 0; j < raw.length; j++) {\n const c = raw[j];\n if (c === '\"') {\n inQ = !inQ;\n continue;\n }\n if (inQ) continue;\n if (c === \"#\") {\n cut = j;\n break;\n }\n if (c === \"/\" && raw[j + 1] === \"/\") {\n cut = j;\n break;\n }\n }\n const stripped = raw.slice(0, cut).trim();\n if (!stripped) continue;\n out.push({ text: stripped, line: i + 1 });\n }\n return out;\n}\n\nfunction stripQuotes(s: string): string {\n const t = s.trim();\n if (t.length >= 2 && ((t.startsWith('\"') && t.endsWith('\"')) || (t.startsWith(\"'\") && t.endsWith(\"'\")))) {\n return t.slice(1, -1);\n }\n return t;\n}\n\nfunction parseNumber(s: string, lineNo: number, what: string): number {\n if (!/^-?\\d+(?:\\.\\d+)?$/.test(s.trim())) {\n throw new PertParseError(`${what} must be a number (got '${s}')`, lineNo);\n }\n return Number(s.trim());\n}\n\n// ─── Header ──────────────────────────────────────────────────────\n\nfunction parseHeaderLine(ln: RawLine, ast: PertAst): boolean {\n const m = ln.text.match(/^([a-zA-Z-]+)\\s*:\\s*(.+)$/);\n if (!m) return false;\n const key = m[1].toLowerCase();\n const valueRaw = m[2].trim();\n const value = stripQuotes(valueRaw);\n switch (key) {\n case \"title\":\n ast.title = value;\n return true;\n case \"unit\": {\n const u = value.toLowerCase();\n if (u !== \"days\" && u !== \"weeks\" && u !== \"hours\" && u !== \"abstract\") {\n throw new PertParseError(`unit must be days, weeks, hours, or abstract (got '${value}')`, ln.line);\n }\n ast.unit = u as PertUnit;\n return true;\n }\n case \"direction\": {\n const d = value.toUpperCase();\n if (d !== \"LR\" && d !== \"TB\") {\n throw new PertParseError(`direction must be LR or TB (got '${value}')`, ln.line);\n }\n ast.direction = d as PertDirection;\n return true;\n }\n case \"layout\": {\n const l = value.toLowerCase();\n if (l !== \"network\" && l !== \"timescaled\" && l !== \"aoa\") {\n throw new PertParseError(`layout must be network, timescaled, or aoa (got '${value}')`, ln.line);\n }\n ast.layout = l as PertLayoutMode;\n return true;\n }\n case \"critical-tolerance\":\n ast.criticalTolerance = parseNumber(value, ln.line, \"critical-tolerance\");\n return true;\n case \"show-sentinels\":\n ast.showSentinels = /^(true|yes|on)$/i.test(value);\n return true;\n default:\n return false;\n }\n}\n\n// ─── Duration ────────────────────────────────────────────────────\n\ninterface DurationResult {\n duration: number;\n threePoint?: PertThreePoint;\n variance?: number;\n}\n\nfunction parseDuration(raw: string, lineNo: number): DurationResult {\n const s = raw.trim();\n const tri = s.match(/^(\\d+(?:\\.\\d+)?)\\/(\\d+(?:\\.\\d+)?)\\/(\\d+(?:\\.\\d+)?)$/);\n if (tri) {\n const o = Number(tri[1]);\n const m = Number(tri[2]);\n const p = Number(tri[3]);\n if (!(o <= m && m <= p)) {\n throw new PertParseError(`three-point estimate must satisfy O ≤ M ≤ P (got ${o}/${m}/${p})`, lineNo);\n }\n if (o < 0) {\n throw new PertParseError(`three-point optimistic value must be ≥ 0 (got ${o})`, lineNo);\n }\n const te = (o + 4 * m + p) / 6;\n const variance = ((p - o) / 6) ** 2;\n return { duration: te, threePoint: { o, m, p }, variance };\n }\n if (/^\\d+(?:\\.\\d+)?$/.test(s)) {\n return { duration: Number(s) };\n }\n throw new PertParseError(`duration must be a number or three-point 'O/M/P' (got '${raw}')`, lineNo);\n}\n\n// ─── Dependency references ───────────────────────────────────────\n\nfunction parseDepRef(raw: string, unit: PertUnit, lineNo: number): PertDependency {\n const ref = raw.trim();\n if (!ref) throw new PertParseError(`empty predecessor reference`, lineNo);\n const expectedSuffix = UNIT_SUFFIX[unit];\n\n const checkUnit = (suf: string | undefined): void => {\n if (!suf) return;\n if (expectedSuffix === null) {\n throw new PertParseError(\n `lag unit '${suf}' is not allowed when unit: abstract — drop the suffix in '${ref}'`,\n lineNo,\n );\n }\n if (suf !== expectedSuffix) {\n throw new PertParseError(\n `lag unit '${suf}' does not match the diagram unit '${unit}' in '${ref}'`,\n lineNo,\n );\n }\n };\n\n // Form 1: <id> <TYPE>[<sign><lag>][<unit>]\n const typed = ref.match(/^(\\S+)\\s+(FS|SS|FF|SF)\\s*([+-]\\d+(?:\\.\\d+)?)?\\s*([dwh])?$/i);\n if (typed) {\n checkUnit(typed[4]?.toLowerCase());\n return {\n pred: typed[1],\n type: typed[2].toUpperCase() as PertDepType,\n lag: typed[3] ? Number(typed[3]) : 0,\n };\n }\n\n // Form 2: <id>+<lag>[<unit>] (attached FS lag sugar; only '+' to avoid dash-id ambiguity)\n const attached = ref.match(/^([A-Za-z_][\\w-]*)\\+(\\d+(?:\\.\\d+)?)([dwh])?$/);\n if (attached) {\n checkUnit(attached[3]?.toLowerCase());\n return { pred: attached[1], type: \"FS\", lag: Number(attached[2]) };\n }\n\n // Form 3: bare id (FS, zero lag)\n if (/^[A-Za-z_][\\w-]*$/.test(ref)) {\n return { pred: ref, type: \"FS\", lag: 0 };\n }\n\n throw new PertParseError(`cannot parse predecessor reference '${ref}'`, lineNo);\n}\n\n// ─── Task line ───────────────────────────────────────────────────\n\nconst KEY_RE = /\\b(duration|after|tags|class|lane)\\s*:/gi;\n\nfunction parseTaskLine(ln: RawLine, ast: PertAst): void {\n const head = ln.text.match(/^task\\s+(\\S+)\\s*(.*)$/i);\n if (!head) {\n throw new PertParseError(`malformed task line: ${ln.text}`, ln.line);\n }\n const id = head[1];\n if (!/^[A-Za-z_][\\w-]*$/.test(id)) {\n throw new PertParseError(`invalid task id '${id}' (letters, digits, dashes, underscores; must start with a letter or _)`, ln.line);\n }\n let rest = head[2].trim();\n\n // Extract a quoted label if present at the start.\n let label = id;\n if (rest.startsWith('\"') || rest.startsWith(\"'\")) {\n const q = rest[0];\n const end = rest.indexOf(q, 1);\n if (end < 0) throw new PertParseError(`unterminated label string in task '${id}'`, ln.line);\n label = rest.slice(1, end);\n rest = rest.slice(end + 1).trim();\n } else {\n // Bare token label only if the next token is not a known key/flag.\n const firstTok = rest.split(/\\s+/)[0] ?? \"\";\n if (firstTok && !/^(duration|after|tags|class)\\s*:/i.test(firstTok) && !/^milestone$/i.test(firstTok)) {\n label = firstTok;\n rest = rest.slice(firstTok.length).trim();\n }\n }\n\n // Pull out the standalone `milestone` flag.\n let milestone = false;\n rest = rest.replace(/\\bmilestone\\b/i, () => {\n milestone = true;\n return \"\";\n }).trim();\n\n // Split remaining attributes by key markers.\n const markers: { key: string; start: number; valStart: number }[] = [];\n KEY_RE.lastIndex = 0;\n let mm: RegExpExecArray | null;\n while ((mm = KEY_RE.exec(rest)) !== null) {\n markers.push({ key: mm[1].toLowerCase(), start: mm.index, valStart: mm.index + mm[0].length });\n }\n\n const values: Record<string, string> = {};\n for (let i = 0; i < markers.length; i++) {\n const cur = markers[i];\n const nextStart = i + 1 < markers.length ? markers[i + 1].start : rest.length;\n const val = rest.slice(cur.valStart, nextStart).trim();\n if (cur.key in values) {\n throw new PertParseError(`duplicate '${cur.key}:' on task '${id}'`, ln.line);\n }\n values[cur.key] = val;\n }\n // Anything before the first marker that isn't whitespace is unexpected.\n const preamble = (markers.length ? rest.slice(0, markers[0].start) : rest).trim();\n if (preamble) {\n throw new PertParseError(`unexpected text '${preamble}' in task '${id}'`, ln.line);\n }\n\n let duration = 0;\n let threePoint: PertThreePoint | undefined;\n let variance: number | undefined;\n if (values.duration !== undefined) {\n const d = parseDuration(values.duration, ln.line);\n duration = d.duration;\n threePoint = d.threePoint;\n variance = d.variance;\n } else if (!milestone) {\n throw new PertParseError(`task '${id}' is missing 'duration:' (or mark it 'milestone')`, ln.line);\n }\n if (duration === 0) milestone = true; // diamond when either marker present (§15 Q7)\n\n const deps: PertDependency[] = [];\n if (values.after !== undefined && values.after !== \"\") {\n for (const part of values.after.split(\",\").map((p) => p.trim()).filter(Boolean)) {\n const dep = parseDepRef(part, ast.unit, ln.line);\n if (dep.pred === id) {\n throw new PertParseError(`task '${id}' cannot depend on itself`, ln.line);\n }\n deps.push(dep);\n }\n }\n\n const tags = values.tags\n ? values.tags.split(\",\").map((t) => t.trim()).filter(Boolean)\n : [];\n const className = values.class ? values.class.trim() : undefined;\n const lane = values.lane ? stripQuotes(values.lane) : undefined;\n\n const task: PertTask = {\n id,\n label,\n duration,\n milestone,\n deps,\n tags,\n line: ln.line,\n };\n if (threePoint) task.threePoint = threePoint;\n if (variance !== undefined) task.variance = variance;\n if (className) task.className = className;\n if (lane) task.lane = lane;\n ast.tasks.push(task);\n}\n\n// ─── Driver ──────────────────────────────────────────────────────\n\nexport function parsePert(src: string): PertAst {\n const ast: PertAst = {\n type: \"pert\",\n unit: \"days\",\n direction: \"LR\",\n layout: \"network\",\n criticalTolerance: 0,\n showSentinels: false,\n tasks: [],\n warnings: [],\n };\n\n const lines = preprocess(src);\n if (lines.length === 0) {\n throw new PertParseError(\"empty document — expected 'pert' header\", 1);\n }\n const first = lines[0];\n if (!/^pert\\b/i.test(first.text)) {\n throw new PertParseError(`first non-comment line must start with 'pert' (got: ${first.text})`, first.line);\n }\n const inlineTitle = first.text.replace(/^pert\\b/i, \"\").trim();\n if (inlineTitle) {\n const m = inlineTitle.match(/^\"([^\"]+)\"$/) || inlineTitle.match(/^'([^']+)'$/);\n if (m) ast.title = m[1];\n }\n\n let unitSeen = false;\n for (let i = 1; i < lines.length; i++) {\n const ln = lines[i];\n if (/^task\\b/i.test(ln.text)) {\n parseTaskLine(ln, ast);\n continue;\n }\n // Track duplicate unit declarations (§7.9).\n if (/^unit\\s*:/i.test(ln.text)) {\n if (unitSeen) throw new PertParseError(\"unit: declared more than once\", ln.line);\n unitSeen = true;\n }\n if (parseHeaderLine(ln, ast)) continue;\n throw new PertParseError(`unrecognised statement: ${ln.text}`, ln.line);\n }\n\n if (ast.tasks.length === 0) {\n throw new PertParseError(\"no tasks declared\", 1);\n }\n\n // Duplicate-id check + reference resolution (forward refs allowed).\n const ids = new Set<string>();\n for (const t of ast.tasks) {\n if (ids.has(t.id)) {\n throw new PertParseError(`duplicate task id '${t.id}'`, t.line);\n }\n ids.add(t.id);\n }\n for (const t of ast.tasks) {\n for (const dep of t.deps) {\n if (!ids.has(dep.pred)) {\n throw new PertParseError(`task '${t.id}' references undeclared predecessor '${dep.pred}'`, t.line);\n }\n }\n }\n\n return ast;\n}\n","/**\n * PERT / CPM scheduler — the unique value of this engine.\n *\n * Algorithm: docs/reference/32-PERT-STANDARD.md §5\n * - topological sort (with cycle detection)\n * - forward pass → ES / EF\n * - backward pass → LS / LF\n * - total slack + critical path\n * - three-point project variance\n *\n * Synthetic `__start__` / `__finish__` sentinels give the passes a unique\n * source and sink so terminal/initial activities need no special-casing.\n */\n\nimport type {\n PertAst,\n PertComputed,\n PertDepType,\n PertScheduleResult,\n} from \"./types\";\n\nexport const START = \"__start__\";\nexport const FINISH = \"__finish__\";\n\nexport class PertScheduleError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"PertScheduleError\";\n }\n}\n\ninterface Edge {\n from: string;\n to: string;\n type: PertDepType;\n lag: number;\n}\n\ninterface Graph {\n nodes: string[];\n duration: Map<string, number>;\n incoming: Map<string, Edge[]>;\n outgoing: Map<string, Edge[]>;\n edges: Edge[];\n}\n\nfunction buildGraph(ast: PertAst): Graph {\n const duration = new Map<string, number>();\n const incoming = new Map<string, Edge[]>();\n const outgoing = new Map<string, Edge[]>();\n const nodes: string[] = [START, FINISH];\n duration.set(START, 0);\n duration.set(FINISH, 0);\n for (const id of [START, FINISH]) {\n incoming.set(id, []);\n outgoing.set(id, []);\n }\n for (const t of ast.tasks) {\n nodes.push(t.id);\n duration.set(t.id, t.duration);\n incoming.set(t.id, []);\n outgoing.set(t.id, []);\n }\n\n const edges: Edge[] = [];\n const addEdge = (e: Edge): void => {\n edges.push(e);\n outgoing.get(e.from)!.push(e);\n incoming.get(e.to)!.push(e);\n };\n\n // Real dependencies + synthetic start edges for source activities.\n const usedAsPred = new Set<string>();\n for (const t of ast.tasks) {\n if (t.deps.length === 0) {\n addEdge({ from: START, to: t.id, type: \"FS\", lag: 0 });\n } else {\n for (const dep of t.deps) {\n addEdge({ from: dep.pred, to: t.id, type: dep.type, lag: dep.lag });\n usedAsPred.add(dep.pred);\n }\n }\n }\n // Terminal activities (never used as a predecessor) feed the finish sentinel.\n for (const t of ast.tasks) {\n if (!usedAsPred.has(t.id)) {\n addEdge({ from: t.id, to: FINISH, type: \"FS\", lag: 0 });\n }\n }\n\n return { nodes, duration, incoming, outgoing, edges };\n}\n\nfunction topoSort(g: Graph): string[] {\n const indeg = new Map<string, number>();\n for (const n of g.nodes) indeg.set(n, 0);\n for (const e of g.edges) indeg.set(e.to, (indeg.get(e.to) ?? 0) + 1);\n\n const queue: string[] = [];\n for (const n of g.nodes) if ((indeg.get(n) ?? 0) === 0) queue.push(n);\n\n const order: string[] = [];\n while (queue.length) {\n const n = queue.shift()!;\n order.push(n);\n for (const e of g.outgoing.get(n)!) {\n const d = (indeg.get(e.to) ?? 0) - 1;\n indeg.set(e.to, d);\n if (d === 0) queue.push(e.to);\n }\n }\n\n if (order.length !== g.nodes.length) {\n const stuck = g.nodes.filter((n) => (indeg.get(n) ?? 0) > 0 && n !== START && n !== FINISH);\n throw new PertScheduleError(\n `dependency cycle detected involving: ${stuck.join(\" → \")}. PERT networks must be acyclic.`,\n );\n }\n return order;\n}\n\nexport function schedulePert(ast: PertAst): PertScheduleResult {\n const g = buildGraph(ast);\n const order = topoSort(g);\n\n const es = new Map<string, number>();\n const ef = new Map<string, number>();\n const ls = new Map<string, number>();\n const lf = new Map<string, number>();\n\n // ─── Forward pass ───\n es.set(START, 0);\n ef.set(START, 0);\n for (const v of order) {\n if (v === START) continue;\n const d = g.duration.get(v)!;\n const inc = g.incoming.get(v)!;\n let start = 0;\n let hasConstraint = false;\n for (const e of inc) {\n let c: number;\n switch (e.type) {\n case \"FS\":\n c = ef.get(e.from)! + e.lag;\n break;\n case \"SS\":\n c = es.get(e.from)! + e.lag;\n break;\n case \"FF\":\n c = ef.get(e.from)! + e.lag - d;\n break;\n case \"SF\":\n c = es.get(e.from)! + e.lag - d;\n break;\n }\n if (!hasConstraint || c > start) {\n start = c;\n hasConstraint = true;\n }\n }\n const esv = Math.max(0, start);\n es.set(v, esv);\n ef.set(v, esv + d);\n }\n\n const projectDuration = ef.get(FINISH)!;\n\n // ─── Backward pass ───\n lf.set(FINISH, projectDuration);\n ls.set(FINISH, projectDuration);\n for (let i = order.length - 1; i >= 0; i--) {\n const v = order[i];\n if (v === FINISH) continue;\n const d = g.duration.get(v)!;\n const out = g.outgoing.get(v)!;\n let finish = projectDuration;\n let hasConstraint = false;\n for (const e of out) {\n let c: number;\n switch (e.type) {\n case \"FS\":\n c = ls.get(e.to)! - e.lag;\n break;\n case \"SS\":\n c = ls.get(e.to)! - e.lag + d;\n break;\n case \"FF\":\n c = lf.get(e.to)! - e.lag;\n break;\n case \"SF\":\n c = lf.get(e.to)! - e.lag + d;\n break;\n }\n if (!hasConstraint || c < finish) {\n finish = c;\n hasConstraint = true;\n }\n }\n lf.set(v, finish);\n ls.set(v, finish - d);\n }\n\n // ─── Slack + critical ───\n const tol = ast.criticalTolerance;\n const computed = new Map<string, PertComputed>();\n const realOrder = order.filter((n) => n !== START && n !== FINISH);\n let negativeSlack = false;\n for (const id of realOrder) {\n const slack = round(ls.get(id)! - es.get(id)!);\n if (slack < -1e-9) negativeSlack = true;\n computed.set(id, {\n es: round(es.get(id)!),\n ef: round(ef.get(id)!),\n ls: round(ls.get(id)!),\n lf: round(lf.get(id)!),\n slack,\n critical: slack <= tol + 1e-9,\n });\n }\n\n // ─── Critical-path extraction (representative chain) ───\n const criticalPath = extractCriticalPath(ast, g, computed);\n const criticalCount = realOrder.filter((id) => computed.get(id)!.critical).length;\n\n // ─── Three-point project variance (over critical activities) ───\n let projectVariance: number | undefined;\n let projectStdDev: number | undefined;\n const hasVariance = ast.tasks.some((t) => t.variance !== undefined);\n if (hasVariance) {\n let sum = 0;\n for (const t of ast.tasks) {\n if (t.variance !== undefined && computed.get(t.id)!.critical) sum += t.variance;\n }\n projectVariance = round(sum);\n projectStdDev = round(Math.sqrt(sum));\n }\n\n const depCount = ast.tasks.reduce((n, t) => n + t.deps.length, 0);\n\n if (negativeSlack) {\n ast.warnings.push(\n \"schedule has negative slack — a lead (negative lag) pushed an activity before the project start; ES was clamped at 0.\",\n );\n }\n\n const result: PertScheduleResult = {\n computed,\n order: realOrder,\n projectDuration: round(projectDuration),\n criticalPath,\n criticalCount,\n depCount,\n };\n if (projectVariance !== undefined) result.projectVariance = projectVariance;\n if (projectStdDev !== undefined) result.projectStdDev = projectStdDev;\n return result;\n}\n\nfunction extractCriticalPath(\n ast: PertAst,\n g: Graph,\n computed: Map<string, PertComputed>,\n): string[] {\n const isCritical = (id: string): boolean => computed.get(id)?.critical ?? false;\n const realSucc = new Map<string, string[]>();\n const hasCriticalPred = new Map<string, boolean>();\n for (const t of ast.tasks) realSucc.set(t.id, []);\n for (const e of g.edges) {\n if (e.from === START || e.from === FINISH || e.to === START || e.to === FINISH) continue;\n realSucc.get(e.from)!.push(e.to);\n if (isCritical(e.from) && isCritical(e.to)) hasCriticalPred.set(e.to, true);\n }\n\n const order = ast.tasks.map((t) => t.id).filter(isCritical);\n order.sort((a, b) => computed.get(a)!.es - computed.get(b)!.es);\n const start = order.find((id) => !hasCriticalPred.get(id)) ?? order[0];\n if (!start) return [];\n\n const path: string[] = [];\n const seen = new Set<string>();\n let cur: string | undefined = start;\n while (cur && !seen.has(cur)) {\n path.push(cur);\n seen.add(cur);\n const cands: string[] = (realSucc.get(cur) ?? []).filter(isCritical);\n if (cands.length === 0) break;\n // Prefer the binding successor (whose ES equals this activity's EF).\n const ef = computed.get(cur)!.ef;\n cands.sort((a: string, b: string) => {\n const da = Math.abs(computed.get(a)!.es - ef);\n const db = Math.abs(computed.get(b)!.es - ef);\n if (da !== db) return da - db;\n return computed.get(a)!.es - computed.get(b)!.es;\n });\n cur = cands[0];\n }\n return path;\n}\n\n/** Round to 4 dp to absorb IEEE-754 noise from three-point durations. */\nfunction round(n: number): number {\n return Math.round(n * 1e4) / 1e4;\n}\n","/**\n * Activity-on-Arrow (AOA / ADM) layout.\n *\n * Spec: docs/reference/32-PERT-STANDARD.md §4.2 (legacy notation, opt-in).\n *\n * AOA draws *events* (milestones) as numbered circles and *activities* as\n * arrows between them. Schematex builds the AOA graph from the same AON model\n * by event-merging: every activity gets its own head event; activities with\n * ≥2 predecessors converge through a merge event fed by dotted **dummy**\n * activities. This construction is correct (it never shares an activity head,\n * so no false dependencies) though not guaranteed minimal-dummy.\n *\n * AOA can only express finish-to-start logic — SS/FF/SF and lag/lead are\n * flattened to FS with a warning.\n */\n\nimport type {\n AoaArc,\n AoaEvent,\n PertAst,\n PertLayoutResult,\n PertScheduleResult,\n} from \"./types\";\nimport { schedulePert } from \"./scheduler\";\n\nconst AOA = {\n R: 19,\n COL: 158,\n VGAP: 86,\n PAD: 30,\n TITLE_H: 40,\n FOOTER_H: 34,\n} as const;\n\ninterface RawArc {\n from: number; // internal event index\n to: number;\n taskId?: string;\n label?: string;\n duration: number;\n dummy: boolean;\n}\n\nexport function layoutAoa(ast: PertAst, schedule?: PertScheduleResult): PertLayoutResult {\n const sched = schedule ?? schedulePert(ast);\n\n // ── Build the event graph ──\n let nEvents = 0;\n const newEvent = (): number => nEvents++;\n const START = newEvent();\n const head = new Map<string, number>();\n for (const t of ast.tasks) head.set(t.id, newEvent());\n\n const arcs: RawArc[] = [];\n const mergeCache = new Map<string, number>();\n let nonFs = false;\n\n for (const t of ast.tasks) {\n const preds = t.deps.map((d) => d.pred);\n for (const d of t.deps) if (d.type !== \"FS\" || d.lag !== 0) nonFs = true;\n let tail: number;\n if (preds.length === 0) {\n tail = START;\n } else if (preds.length === 1) {\n tail = head.get(preds[0])!;\n } else {\n const key = [...preds].sort().join(\"\u0001\");\n const cached = mergeCache.get(key);\n if (cached !== undefined) {\n tail = cached;\n } else {\n const m = newEvent();\n for (const p of preds) arcs.push({ from: head.get(p)!, to: m, duration: 0, dummy: true });\n mergeCache.set(key, m);\n tail = m;\n }\n }\n arcs.push({\n from: tail,\n to: head.get(t.id)!,\n taskId: t.id,\n label: t.label,\n duration: t.duration,\n dummy: false,\n });\n }\n\n if (nonFs) {\n ast.warnings.push(\n \"Activity-on-arrow (AOA) expresses finish-to-start logic only; SS/FF/SF and lag/lead were flattened to FS.\",\n );\n }\n\n // ── Single sink (END) ──\n const hasOut = new Set<number>();\n for (const a of arcs) hasOut.add(a.from);\n const sinks: number[] = [];\n for (let e = 0; e < nEvents; e++) if (!hasOut.has(e)) sinks.push(e);\n if (sinks.length > 1) {\n const END = newEvent();\n for (const s of sinks) arcs.push({ from: s, to: END, duration: 0, dummy: true });\n }\n\n // ── Rank events by longest path (edge count) ──\n const outAdj: number[][] = Array.from({ length: nEvents }, () => []);\n const inAdj: number[][] = Array.from({ length: nEvents }, () => []);\n arcs.forEach((a, i) => {\n outAdj[a.from].push(i);\n inAdj[a.to].push(i);\n });\n const indeg = new Array(nEvents).fill(0);\n for (const a of arcs) indeg[a.to]++;\n const queue: number[] = [];\n for (let e = 0; e < nEvents; e++) if (indeg[e] === 0) queue.push(e);\n const topo: number[] = [];\n const rank = new Array(nEvents).fill(0);\n const q = [...queue];\n while (q.length) {\n const e = q.shift()!;\n topo.push(e);\n for (const ai of outAdj[e]) {\n const to = arcs[ai].to;\n rank[to] = Math.max(rank[to], rank[e] + 1);\n if (--indeg[to] === 0) q.push(to);\n }\n }\n\n // ── Event times (forward / backward pass on the event graph) ──\n const te = new Array(nEvents).fill(0);\n for (const e of topo) {\n for (const ai of inAdj[e]) {\n const a = arcs[ai];\n te[e] = Math.max(te[e], te[a.from] + a.duration);\n }\n }\n const T = Math.max(0, ...te);\n const tl = new Array(nEvents).fill(T);\n for (let i = topo.length - 1; i >= 0; i--) {\n const e = topo[i];\n if (outAdj[e].length === 0) {\n tl[e] = te[e];\n } else {\n let m = Infinity;\n for (const ai of outAdj[e]) {\n const a = arcs[ai];\n m = Math.min(m, tl[a.to] - a.duration);\n }\n tl[e] = m;\n }\n }\n const tol = ast.criticalTolerance + 1e-9;\n const eventCritical = (e: number): boolean => Math.abs(tl[e] - te[e]) <= tol;\n\n // ── Order within rank (barycenter) + coordinates ──\n const maxRank = Math.max(0, ...rank);\n const layers: number[][] = Array.from({ length: maxRank + 1 }, () => []);\n for (let e = 0; e < nEvents; e++) layers[rank[e]].push(e);\n const pos = new Array(nEvents).fill(0);\n layers.forEach((layer) => layer.forEach((e, i) => (pos[e] = i)));\n const predEvents = (e: number): number[] => inAdj[e].map((ai) => arcs[ai].from);\n const succEvents = (e: number): number[] => outAdj[e].map((ai) => arcs[ai].to);\n for (let iter = 0; iter < 4; iter++) {\n for (let r = 1; r <= maxRank; r++) {\n layers[r] = sortByBary(layers[r], predEvents, pos);\n refresh(layers, pos);\n }\n for (let r = maxRank - 1; r >= 0; r--) {\n layers[r] = sortByBary(layers[r], succEvents, pos);\n refresh(layers, pos);\n }\n }\n\n const titleH = ast.title ? AOA.TITLE_H : 0;\n const topY = AOA.PAD + titleH;\n const maxRows = Math.max(1, ...layers.map((l) => l.length));\n const contentH = (maxRows - 1) * AOA.VGAP + 2 * AOA.R;\n\n const cx = new Array(nEvents).fill(0);\n const cy = new Array(nEvents).fill(0);\n for (let r = 0; r <= maxRank; r++) {\n const layer = layers[r];\n const colH = (layer.length - 1) * AOA.VGAP;\n const y0 = topY + AOA.R + (contentH - 2 * AOA.R - colH) / 2;\n layer.forEach((e, i) => {\n cx[e] = AOA.PAD + AOA.R + r * AOA.COL;\n cy[e] = y0 + i * AOA.VGAP;\n });\n }\n\n // ── Display numbering: ascending by (rank, y) so tail id < head id ──\n const ordered = [...Array(nEvents).keys()].sort((a, b) => rank[a] - rank[b] || cy[a] - cy[b]);\n const displayId = new Array(nEvents).fill(0);\n ordered.forEach((e, i) => (displayId[e] = i + 1));\n\n const events: AoaEvent[] = ordered.map((e) => ({\n id: displayId[e],\n x: cx[e],\n y: cy[e],\n r: AOA.R,\n te: round(te[e]),\n tl: round(tl[e]),\n critical: eventCritical(e),\n }));\n\n const outArcs: AoaArc[] = arcs.map((a) => {\n const critical = a.dummy\n ? eventCritical(a.from) && eventCritical(a.to) && Math.abs(te[a.to] - te[a.from] - a.duration) <= tol\n : sched.computed.get(a.taskId!)!.critical;\n const geo = arcGeometry(cx[a.from], cy[a.from], cx[a.to], cy[a.to], AOA.R);\n const arc: AoaArc = {\n from: displayId[a.from],\n to: displayId[a.to],\n dummy: a.dummy,\n critical,\n d: geo.d,\n labelX: geo.mx,\n labelY: geo.my,\n };\n if (a.taskId !== undefined) arc.taskId = a.taskId;\n if (a.label !== undefined) arc.label = a.label;\n if (!a.dummy) arc.duration = a.duration;\n return arc;\n });\n\n const width = AOA.PAD + AOA.R + maxRank * AOA.COL + AOA.R + AOA.PAD;\n const footerY = topY + contentH + 14;\n const height = footerY + AOA.FOOTER_H;\n\n return {\n width: Math.ceil(width),\n height: Math.ceil(height),\n title: ast.title,\n direction: \"LR\",\n mode: \"aoa\",\n unit: ast.unit,\n boxes: [],\n edges: [],\n sentinels: [],\n aoa: { events, arcs: outArcs },\n summary: buildAoaSummary(ast, sched),\n warnings: ast.warnings,\n ast,\n };\n}\n\nfunction refresh(layers: number[][], pos: number[]): void {\n layers.forEach((layer) => layer.forEach((e, i) => (pos[e] = i)));\n}\n\nfunction sortByBary(layer: number[], neighbors: (e: number) => number[], pos: number[]): number[] {\n return layer\n .map((e, i) => {\n const ns = neighbors(e);\n const bary = ns.length ? ns.reduce((s, n) => s + pos[n], 0) / ns.length : pos[e];\n return { e, i, bary };\n })\n .sort((a, b) => (a.bary !== b.bary ? a.bary - b.bary : a.i - b.i))\n .map((x) => x.e);\n}\n\nfunction arcGeometry(\n tx: number,\n ty: number,\n hx: number,\n hy: number,\n r: number,\n): { d: string; mx: number; my: number } {\n const dx = hx - tx;\n const dy = hy - ty;\n const len = Math.hypot(dx, dy) || 1;\n const ux = dx / len;\n const uy = dy / len;\n const sx = tx + ux * r;\n const sy = ty + uy * r;\n const ex = hx - ux * r;\n const ey = hy - uy * r;\n return { d: `M ${round(sx)} ${round(sy)} L ${round(ex)} ${round(ey)}`, mx: (sx + ex) / 2, my: (sy + ey) / 2 };\n}\n\nfunction buildAoaSummary(ast: PertAst, sched: PertScheduleResult): PertLayoutResult[\"summary\"] {\n const summary: PertLayoutResult[\"summary\"] = {\n projectDuration: sched.projectDuration,\n taskCount: ast.tasks.length,\n depCount: sched.depCount,\n criticalCount: sched.criticalCount,\n unit: ast.unit,\n criticalPath: sched.criticalPath,\n };\n if (sched.projectStdDev !== undefined) summary.projectStdDev = sched.projectStdDev;\n return summary;\n}\n\nfunction round(n: number): number {\n return Math.round(n * 1e3) / 1e3;\n}\n","/**\n * PERT layout — network (layered AON) and timescaled modes.\n *\n * Rules: docs/reference/32-PERT-STANDARD.md §9\n *\n * Network mode: layered DAG. Layer = longest-path rank (each dependency edge\n * advances at least one column), barycenter ordering within a layer, critical\n * activities biased toward the top so the critical path reads as an unbroken\n * line. Edges are orthogonal with a single mid-axis bend.\n *\n * Timescaled mode: x ∝ ES, width ∝ duration; activities are greedily packed\n * into lanes; a unit time axis is drawn beneath the chart.\n */\n\nimport type {\n PertAst,\n PertAxisTick,\n PertBox,\n PertComputed,\n PertDepType,\n PertEdge,\n PertLane,\n PertLayoutResult,\n PertScheduleResult,\n PertSentinel,\n PertTask,\n PertUnit,\n} from \"./types\";\nimport { schedulePert } from \"./scheduler\";\nimport { layoutAoa } from \"./aoa\";\n\nexport const PERT_CONST = {\n BOX_W: 180,\n BOX_H: 90,\n MS_W: 90,\n H_GAP: 66,\n V_GAP: 34,\n PAD: 24,\n TITLE_H: 40,\n FOOTER_H: 34,\n SENT_R: 14,\n // timescaled\n TS_BOX_H: 54,\n TS_LANE_GAP: 42,\n TS_MIN_W: 88,\n TS_MS_W: 30,\n TS_GAP: 26,\n AXIS_H: 46,\n // swimlane\n LANE_LABEL_W: 132,\n LANE_PAD: 18,\n} as const;\n\nfunction unitSuffix(unit: PertUnit): string {\n switch (unit) {\n case \"days\":\n return \"d\";\n case \"weeks\":\n return \"w\";\n case \"hours\":\n return \"h\";\n default:\n return \"\";\n }\n}\n\nfunction fmt(n: number): string {\n return String(parseFloat(n.toFixed(2)));\n}\n\nfunction edgeLabel(type: PertDepType, lag: number, unit: PertUnit): string | null {\n const suf = unitSuffix(unit);\n const lagPart = lag === 0 ? \"\" : `${lag > 0 ? \"+\" : \"\"}${fmt(lag)}${suf}`;\n if (type === \"FS\") return lag === 0 ? null : `FS${lagPart}`;\n return `${type}${lagPart}`;\n}\n\n// ─── Network rank assignment (longest path by edges) ─────────────\n\nfunction assignRanks(ast: PertAst): { rank: Map<string, number>; maxRank: number } {\n const byId = new Map<string, PertTask>();\n for (const t of ast.tasks) byId.set(t.id, t);\n const rank = new Map<string, number>();\n const visiting = new Set<string>();\n const compute = (id: string): number => {\n const cached = rank.get(id);\n if (cached !== undefined) return cached;\n if (visiting.has(id)) return 0; // cycle guard (scheduler already validated)\n visiting.add(id);\n const t = byId.get(id)!;\n let r = 0;\n for (const dep of t.deps) r = Math.max(r, compute(dep.pred) + 1);\n visiting.delete(id);\n rank.set(id, r);\n return r;\n };\n let maxRank = 0;\n for (const t of ast.tasks) maxRank = Math.max(maxRank, compute(t.id));\n return { rank, maxRank };\n}\n\n// ─── Within-layer ordering (barycenter + critical-first) ─────────\n\nfunction orderLayers(\n ast: PertAst,\n schedule: PertScheduleResult,\n rank: Map<string, number>,\n maxRank: number,\n): string[][] {\n const declIndex = new Map<string, number>();\n ast.tasks.forEach((t, i) => declIndex.set(t.id, i));\n const succ = new Map<string, string[]>();\n const pred = new Map<string, string[]>();\n for (const t of ast.tasks) {\n succ.set(t.id, []);\n pred.set(t.id, []);\n }\n for (const t of ast.tasks) {\n for (const dep of t.deps) {\n succ.get(dep.pred)!.push(t.id);\n pred.get(t.id)!.push(dep.pred);\n }\n }\n\n const layers: string[][] = Array.from({ length: maxRank + 1 }, () => []);\n for (const t of ast.tasks) layers[rank.get(t.id)!].push(t.id);\n\n const crit = (id: string): boolean => schedule.computed.get(id)!.critical;\n const es = (id: string): number => schedule.computed.get(id)!.es;\n // Initial order: critical first (by ES), then the rest by declaration order.\n for (const layer of layers) {\n layer.sort((a, b) => {\n const ca = crit(a) ? 0 : 1;\n const cb = crit(b) ? 0 : 1;\n if (ca !== cb) return ca - cb;\n if (ca === 0 && es(a) !== es(b)) return es(a) - es(b);\n return declIndex.get(a)! - declIndex.get(b)!;\n });\n }\n\n const pos = new Map<string, number>();\n const refreshPos = (): void => {\n for (const layer of layers) layer.forEach((id, i) => pos.set(id, i));\n };\n refreshPos();\n\n const barycenter = (id: string, neighbors: string[]): number => {\n if (neighbors.length === 0) return pos.get(id)!;\n let s = 0;\n for (const n of neighbors) s += pos.get(n)!;\n return s / neighbors.length;\n };\n\n for (let iter = 0; iter < 4; iter++) {\n // forward (use predecessors)\n for (let r = 1; r <= maxRank; r++) {\n layers[r] = stableSortByKey(layers[r], (id) => {\n const bc = barycenter(id, pred.get(id)!);\n return crit(id) ? bc - 0.4 : bc;\n });\n refreshPos();\n }\n // backward (use successors)\n for (let r = maxRank - 1; r >= 0; r--) {\n layers[r] = stableSortByKey(layers[r], (id) => {\n const bc = barycenter(id, succ.get(id)!);\n return crit(id) ? bc - 0.4 : bc;\n });\n refreshPos();\n }\n }\n\n return layers;\n}\n\nfunction stableSortByKey(arr: string[], key: (id: string) => number): string[] {\n return arr\n .map((id, i) => ({ id, i, k: key(id) }))\n .sort((a, b) => (a.k !== b.k ? a.k - b.k : a.i - b.i))\n .map((x) => x.id);\n}\n\n// ─── Edge routing helpers ────────────────────────────────────────\n\nfunction routeEdge(\n s: PertBox,\n t: PertBox,\n direction: \"LR\" | \"TB\",\n): { d: string; labelX: number; labelY: number } {\n if (direction === \"TB\") {\n const sx = s.x + s.width / 2;\n const sy = s.y + s.height;\n const tx = t.x + t.width / 2;\n const ty = t.y;\n const mid = (sy + ty) / 2;\n const d = `M ${sx} ${sy} L ${sx} ${mid} L ${tx} ${mid} L ${tx} ${ty}`;\n return { d, labelX: (sx + tx) / 2, labelY: mid };\n }\n const sx = s.x + s.width;\n const sy = s.y + s.height / 2;\n const tx = t.x;\n const ty = t.y + t.height / 2;\n const mid = (sx + tx) / 2;\n const d = `M ${sx} ${sy} L ${mid} ${sy} L ${mid} ${ty} L ${tx} ${ty}`;\n return { d, labelX: mid, labelY: (sy + ty) / 2 };\n}\n\n// ─── Network layout ──────────────────────────────────────────────\n\nfunction layoutNetwork(ast: PertAst, schedule: PertScheduleResult): PertLayoutResult {\n const C = PERT_CONST;\n const { rank, maxRank } = assignRanks(ast);\n const layers = orderLayers(ast, schedule, rank, maxRank);\n const dir = ast.direction;\n\n const byId = new Map<string, PertTask>();\n for (const t of ast.tasks) byId.set(t.id, t);\n\n // Column heights (cross-axis extent of each layer).\n const colExtent = layers.map((layer) => {\n const n = layer.length;\n if (n === 0) return 0;\n const unit = dir === \"TB\" ? C.BOX_W : C.BOX_H;\n const gap = dir === \"TB\" ? C.H_GAP : C.V_GAP;\n return n * unit + (n - 1) * gap;\n });\n const maxExtent = Math.max(0, ...colExtent);\n\n const hasSentinels = ast.showSentinels;\n const sentLead = hasSentinels ? C.SENT_R * 2 + C.H_GAP : 0;\n\n const titleH = ast.title ? C.TITLE_H : 0;\n // Title sits at the top (y). For LR the cross axis is y; for TB the primary\n // (rank) axis is y — so the title offset lands on a different axis each way.\n const originPrimary = dir === \"TB\" ? C.PAD + titleH + sentLead : C.PAD + sentLead;\n const originCross = dir === \"TB\" ? C.PAD : C.PAD + titleH;\n\n const boxes: PertBox[] = [];\n const boxById = new Map<string, PertBox>();\n\n for (let r = 0; r <= maxRank; r++) {\n const layer = layers[r];\n const extent = colExtent[r];\n const crossStart = originCross + (maxExtent - extent) / 2;\n let cursor = crossStart;\n for (const id of layer) {\n const t = byId.get(id)!;\n const computed = schedule.computed.get(id)!;\n const w = t.milestone ? C.MS_W : C.BOX_W;\n const h = C.BOX_H;\n let x: number;\n let y: number;\n if (dir === \"TB\") {\n // rank axis = y, cross axis = x\n const rankPos = originPrimary + r * (C.BOX_H + C.H_GAP);\n x = cursor + (C.BOX_W - w) / 2;\n y = rankPos;\n cursor += C.BOX_W + C.H_GAP;\n } else {\n const rankPos = originPrimary + r * (C.BOX_W + C.H_GAP);\n x = rankPos + (C.BOX_W - w) / 2;\n y = cursor;\n cursor += C.BOX_H + C.V_GAP;\n }\n const box: PertBox = {\n id,\n task: t,\n computed,\n x,\n y,\n width: w,\n height: h,\n milestone: t.milestone,\n rank: r,\n };\n boxes.push(box);\n boxById.set(id, box);\n }\n }\n\n // Edges (real dependencies).\n const edges: PertEdge[] = [];\n for (const t of ast.tasks) {\n for (const dep of t.deps) {\n const s = boxById.get(dep.pred);\n const tg = boxById.get(t.id);\n if (!s || !tg) continue;\n const critical =\n schedule.computed.get(dep.pred)!.critical && schedule.computed.get(t.id)!.critical;\n const { d, labelX, labelY } = routeEdge(s, tg, dir);\n const edge: PertEdge = {\n from: dep.pred,\n to: t.id,\n type: dep.type,\n lag: dep.lag,\n d,\n critical,\n };\n const lbl = edgeLabel(dep.type, dep.lag, ast.unit);\n if (lbl) edge.label = { text: lbl, x: labelX, y: labelY };\n edges.push(edge);\n }\n }\n\n // Bounds.\n let maxPrimary = 0;\n let maxCross = 0;\n for (const b of boxes) {\n maxPrimary = Math.max(maxPrimary, dir === \"TB\" ? b.y + b.height : b.x + b.width);\n maxCross = Math.max(maxCross, dir === \"TB\" ? b.x + b.width : b.y + b.height);\n }\n\n // Sentinels.\n const sentinels: PertSentinel[] = [];\n if (hasSentinels) {\n const contentMidCross = originCross + maxExtent / 2;\n const startPrimary = C.PAD + C.SENT_R;\n const finishPrimary = maxPrimary + C.H_GAP + C.SENT_R;\n const place = (primary: number): { cx: number; cy: number } =>\n dir === \"TB\" ? { cx: contentMidCross, cy: primary } : { cx: primary, cy: contentMidCross };\n sentinels.push({ id: \"__start__\", label: \"Start\", r: C.SENT_R, ...place(startPrimary) });\n sentinels.push({ id: \"__finish__\", label: \"Finish\", r: C.SENT_R, ...place(finishPrimary) });\n\n // sentinel edges\n const usedAsPred = new Set<string>();\n for (const t of ast.tasks) for (const dep of t.deps) usedAsPred.add(dep.pred);\n const startSent = sentinels[0];\n const finishSent = sentinels[1];\n for (const t of ast.tasks) {\n const b = boxById.get(t.id)!;\n if (t.deps.length === 0) {\n edges.push(sentinelEdge(startSent, b, dir, true, schedule.computed.get(t.id)!));\n }\n if (!usedAsPred.has(t.id)) {\n edges.push(sentinelEdge(finishSent, b, dir, false, schedule.computed.get(t.id)!));\n }\n }\n maxPrimary = finishPrimary + C.SENT_R;\n }\n\n const crossEnd = Math.max(maxCross, originCross + maxExtent);\n let width: number;\n let footerY: number;\n if (dir === \"TB\") {\n width = crossEnd + C.PAD;\n footerY = maxPrimary + 14;\n } else {\n width = maxPrimary + C.PAD;\n footerY = crossEnd + 14;\n }\n const height = footerY + C.FOOTER_H;\n\n return {\n width: Math.ceil(width),\n height: Math.ceil(height),\n title: ast.title,\n direction: dir,\n mode: \"network\",\n unit: ast.unit,\n boxes,\n edges,\n sentinels,\n summary: buildSummary(ast, schedule),\n warnings: ast.warnings,\n ast,\n };\n}\n\nfunction sentinelEdge(\n sent: PertSentinel,\n b: PertBox,\n dir: \"LR\" | \"TB\",\n fromStart: boolean,\n computed: PertComputed,\n): PertEdge {\n let sx: number;\n let sy: number;\n let tx: number;\n let ty: number;\n if (dir === \"TB\") {\n if (fromStart) {\n sx = sent.cx;\n sy = sent.cy + sent.r;\n tx = b.x + b.width / 2;\n ty = b.y;\n } else {\n sx = b.x + b.width / 2;\n sy = b.y + b.height;\n tx = sent.cx;\n ty = sent.cy - sent.r;\n }\n const mid = (sy + ty) / 2;\n return mkSentinelEdge(sent, b, fromStart, `M ${sx} ${sy} L ${sx} ${mid} L ${tx} ${mid} L ${tx} ${ty}`, computed);\n }\n if (fromStart) {\n sx = sent.cx + sent.r;\n sy = sent.cy;\n tx = b.x;\n ty = b.y + b.height / 2;\n } else {\n sx = b.x + b.width;\n sy = b.y + b.height / 2;\n tx = sent.cx - sent.r;\n ty = sent.cy;\n }\n const mid = (sx + tx) / 2;\n return mkSentinelEdge(sent, b, fromStart, `M ${sx} ${sy} L ${mid} ${sy} L ${mid} ${ty} L ${tx} ${ty}`, computed);\n}\n\nfunction mkSentinelEdge(\n sent: PertSentinel,\n b: PertBox,\n fromStart: boolean,\n d: string,\n computed: PertComputed,\n): PertEdge {\n return {\n from: fromStart ? sent.id : b.id,\n to: fromStart ? b.id : sent.id,\n type: \"FS\",\n lag: 0,\n d,\n critical: computed.critical,\n };\n}\n\n// ─── Swimlane layout (AON grouped into lanes) ────────────────────\n\nfunction buildDependencyEdges(\n ast: PertAst,\n schedule: PertScheduleResult,\n boxById: Map<string, PertBox>,\n dir: \"LR\" | \"TB\",\n): PertEdge[] {\n const edges: PertEdge[] = [];\n for (const t of ast.tasks) {\n for (const dep of t.deps) {\n const s = boxById.get(dep.pred);\n const tg = boxById.get(t.id);\n if (!s || !tg) continue;\n const critical =\n schedule.computed.get(dep.pred)!.critical && schedule.computed.get(t.id)!.critical;\n const { d, labelX, labelY } = routeEdge(s, tg, dir);\n const edge: PertEdge = { from: dep.pred, to: t.id, type: dep.type, lag: dep.lag, d, critical };\n const lbl = edgeLabel(dep.type, dep.lag, ast.unit);\n if (lbl) edge.label = { text: lbl, x: labelX, y: labelY };\n edges.push(edge);\n }\n }\n return edges;\n}\n\nfunction layoutSwimlane(ast: PertAst, schedule: PertScheduleResult): PertLayoutResult {\n const C = PERT_CONST;\n const { rank, maxRank } = assignRanks(ast);\n const byId = new Map<string, PertTask>();\n for (const t of ast.tasks) byId.set(t.id, t);\n\n const laneOrder: string[] = [];\n const laneOf = new Map<string, string>();\n for (const t of ast.tasks) {\n const ln = t.lane ?? \"\";\n laneOf.set(t.id, ln);\n if (!laneOrder.includes(ln)) laneOrder.push(ln);\n }\n\n const declIndex = new Map<string, number>();\n ast.tasks.forEach((t, i) => declIndex.set(t.id, i));\n const crit = (id: string): boolean => schedule.computed.get(id)!.critical;\n const es = (id: string): number => schedule.computed.get(id)!.es;\n\n // Group tasks by (lane, rank) cell.\n const cell = new Map<string, string[]>();\n const key = (lane: string, r: number): string => `${lane}\u0000${r}`;\n for (const t of ast.tasks) {\n const k = key(laneOf.get(t.id)!, rank.get(t.id)!);\n if (!cell.has(k)) cell.set(k, []);\n cell.get(k)!.push(t.id);\n }\n for (const arr of cell.values()) {\n arr.sort((a, b) => {\n const ca = crit(a) ? 0 : 1;\n const cb = crit(b) ? 0 : 1;\n if (ca !== cb) return ca - cb;\n if (es(a) !== es(b)) return es(a) - es(b);\n return declIndex.get(a)! - declIndex.get(b)!;\n });\n }\n\n const titleH = ast.title ? C.TITLE_H : 0;\n const topY = C.PAD + titleH;\n const colX = (r: number): number => C.LANE_LABEL_W + C.PAD + r * (C.BOX_W + C.H_GAP);\n\n // Lane bands.\n const lanes: PertLane[] = [];\n const laneY = new Map<string, number>();\n const laneH = new Map<string, number>();\n let cursor = topY;\n laneOrder.forEach((lane, i) => {\n let stack = 1;\n for (let r = 0; r <= maxRank; r++) {\n const arr = cell.get(key(lane, r));\n if (arr) stack = Math.max(stack, arr.length);\n }\n const bandH = stack * C.BOX_H + (stack - 1) * C.V_GAP + 2 * C.LANE_PAD;\n laneY.set(lane, cursor);\n laneH.set(lane, bandH);\n lanes.push({ name: lane, y: cursor, height: bandH, alt: i % 2 === 1 });\n cursor += bandH;\n });\n const contentBottom = cursor;\n\n // Place boxes — each column centred within its lane band.\n const boxes: PertBox[] = [];\n const boxById = new Map<string, PertBox>();\n for (const lane of laneOrder) {\n const bandTop = laneY.get(lane)!;\n const bandH = laneH.get(lane)!;\n for (let r = 0; r <= maxRank; r++) {\n const arr = cell.get(key(lane, r));\n if (!arr) continue;\n const colInnerH = arr.length * C.BOX_H + (arr.length - 1) * C.V_GAP;\n const y0 = bandTop + (bandH - colInnerH) / 2;\n arr.forEach((id, idx) => {\n const t = byId.get(id)!;\n const w = t.milestone ? C.MS_W : C.BOX_W;\n const x = colX(r) + (C.BOX_W - w) / 2;\n const y = y0 + idx * (C.BOX_H + C.V_GAP);\n const box: PertBox = {\n id,\n task: t,\n computed: schedule.computed.get(id)!,\n x,\n y,\n width: w,\n height: C.BOX_H,\n milestone: t.milestone,\n rank: r,\n };\n boxes.push(box);\n boxById.set(id, box);\n });\n }\n }\n\n const edges = buildDependencyEdges(ast, schedule, boxById, \"LR\");\n const width = colX(maxRank) + C.BOX_W + C.PAD;\n const footerY = contentBottom + 14;\n const height = footerY + C.FOOTER_H;\n\n return {\n width: Math.ceil(width),\n height: Math.ceil(height),\n title: ast.title,\n direction: \"LR\",\n mode: \"network\",\n unit: ast.unit,\n boxes,\n edges,\n sentinels: [],\n lanes,\n summary: buildSummary(ast, schedule),\n warnings: ast.warnings,\n ast,\n };\n}\n\n// ─── Timescaled layout ───────────────────────────────────────────\n\nfunction layoutTimescaled(ast: PertAst, schedule: PertScheduleResult): PertLayoutResult {\n const C = PERT_CONST;\n const T = schedule.projectDuration || 1;\n // Spread the time axis out generously so boxes breathe.\n const pxPerUnit = Math.min(56, Math.max(16, 1300 / T));\n const titleH = ast.title ? C.TITLE_H : 0;\n const leftPad = C.PAD;\n const topPad = C.PAD + titleH + 14; // extra room for task labels above the bars\n\n // Build interval boxes ordered by ES.\n interface Interval {\n id: string;\n x: number;\n w: number;\n }\n const intervals: Interval[] = ast.tasks.map((t) => {\n const c = schedule.computed.get(t.id)!;\n if (t.milestone) {\n const cx = leftPad + c.es * pxPerUnit;\n return { id: t.id, x: cx - C.TS_MS_W / 2, w: C.TS_MS_W };\n }\n const x = leftPad + c.es * pxPerUnit;\n const w = Math.max(C.TS_MIN_W, t.duration * pxPerUnit);\n return { id: t.id, x, w };\n });\n intervals.sort((a, b) => a.x - b.x || a.w - b.w);\n\n // Greedy lane packing.\n const laneRight: number[] = [];\n const laneOf = new Map<string, number>();\n for (const iv of intervals) {\n let placed = -1;\n for (let l = 0; l < laneRight.length; l++) {\n if (iv.x >= laneRight[l] + C.TS_GAP) {\n placed = l;\n break;\n }\n }\n if (placed === -1) {\n placed = laneRight.length;\n laneRight.push(0);\n }\n laneRight[placed] = iv.x + iv.w;\n laneOf.set(iv.id, placed);\n }\n const laneCount = Math.max(1, laneRight.length);\n\n const byId = new Map<string, PertTask>();\n for (const t of ast.tasks) byId.set(t.id, t);\n const intervalById = new Map<string, Interval>();\n for (const iv of intervals) intervalById.set(iv.id, iv);\n\n const boxes: PertBox[] = [];\n const boxById = new Map<string, PertBox>();\n for (const t of ast.tasks) {\n const iv = intervalById.get(t.id)!;\n const lane = laneOf.get(t.id)!;\n const y = topPad + lane * (C.TS_BOX_H + C.TS_LANE_GAP);\n const box: PertBox = {\n id: t.id,\n task: t,\n computed: schedule.computed.get(t.id)!,\n x: iv.x,\n y,\n width: iv.w,\n height: C.TS_BOX_H,\n milestone: t.milestone,\n rank: 0,\n };\n boxes.push(box);\n boxById.set(t.id, box);\n }\n\n const edges: PertEdge[] = [];\n for (const t of ast.tasks) {\n for (const dep of t.deps) {\n const s = boxById.get(dep.pred);\n const tg = boxById.get(t.id);\n if (!s || !tg) continue;\n const critical =\n schedule.computed.get(dep.pred)!.critical && schedule.computed.get(t.id)!.critical;\n const { d, labelX, labelY } = routeEdge(s, tg, \"LR\");\n const edge: PertEdge = {\n from: dep.pred,\n to: t.id,\n type: dep.type,\n lag: dep.lag,\n d,\n critical,\n };\n const lbl = edgeLabel(dep.type, dep.lag, ast.unit);\n if (lbl) edge.label = { text: lbl, x: labelX, y: labelY };\n edges.push(edge);\n }\n }\n\n const contentBottom = topPad + laneCount * C.TS_BOX_H + (laneCount - 1) * C.TS_LANE_GAP;\n const axisBaseline = contentBottom + 22;\n const timeEnd = leftPad + T * pxPerUnit;\n let maxRight = timeEnd;\n for (const b of boxes) maxRight = Math.max(maxRight, b.x + b.width);\n\n // Axis ticks.\n const majorStep = chooseStep(T);\n const minorEvery = pxPerUnit >= 9 ? 1 : majorStep;\n const ticks: PertAxisTick[] = [];\n for (let v = 0; v <= T + 1e-9; v += minorEvery) {\n const rounded = Math.round(v * 1e4) / 1e4;\n ticks.push({\n pos: leftPad + rounded * pxPerUnit,\n value: rounded,\n major: Math.abs(rounded % majorStep) < 1e-9,\n });\n }\n\n const width = Math.ceil(Math.max(maxRight, timeEnd) + C.PAD);\n const height = Math.ceil(axisBaseline + C.AXIS_H + C.FOOTER_H);\n\n return {\n width,\n height,\n title: ast.title,\n direction: \"LR\",\n mode: \"timescaled\",\n unit: ast.unit,\n boxes,\n edges,\n sentinels: [],\n axis: { ticks, baseline: axisBaseline, start: leftPad, end: timeEnd },\n summary: buildSummary(ast, schedule),\n warnings: ast.warnings,\n ast,\n };\n}\n\nfunction chooseStep(T: number): number {\n const candidates = [1, 2, 5, 10, 20, 25, 50, 100, 200, 500];\n for (const c of candidates) {\n if (T / c <= 16) return c;\n }\n return 1000;\n}\n\nfunction buildSummary(ast: PertAst, schedule: PertScheduleResult): PertLayoutResult[\"summary\"] {\n const summary: PertLayoutResult[\"summary\"] = {\n projectDuration: schedule.projectDuration,\n taskCount: ast.tasks.length,\n depCount: schedule.depCount,\n criticalCount: schedule.criticalCount,\n unit: ast.unit,\n criticalPath: schedule.criticalPath,\n };\n if (schedule.projectStdDev !== undefined) summary.projectStdDev = schedule.projectStdDev;\n return summary;\n}\n\n// ─── Entry point ─────────────────────────────────────────────────\n\nexport function layoutPert(ast: PertAst, schedule?: PertScheduleResult): PertLayoutResult {\n const sched = schedule ?? schedulePert(ast);\n if (ast.layout === \"aoa\") return layoutAoa(ast, sched);\n if (ast.layout === \"timescaled\") return layoutTimescaled(ast, sched);\n // Swimlanes kick in automatically when any task declares a `lane:`.\n if (ast.tasks.some((t) => t.lane)) return layoutSwimlane(ast, sched);\n return layoutNetwork(ast, sched);\n}\n","/**\n * PERT renderer — semantic SVG output.\n *\n * Spec: docs/reference/32-PERT-STANDARD.md §6, §9.4\n *\n * Every computed schedule field is mirrored onto `data-*` attributes so the\n * SVG is queryable without re-running the scheduler.\n */\n\nimport type { RenderConfig } from \"../../core/types\";\nimport {\n svgRoot,\n group,\n el,\n rect,\n circle,\n line,\n path as pathEl,\n polygon,\n text as textEl,\n title as titleEl,\n desc,\n defs,\n escapeXml,\n} from \"../../core/svg\";\nimport { resolveBaseTheme, type BaseTheme } from \"../../core/theme\";\nimport { parsePert } from \"./parser\";\nimport { schedulePert } from \"./scheduler\";\nimport { layoutPert, PERT_CONST } from \"./layout\";\nimport type {\n PertAoa,\n PertAst,\n PertAxis,\n PertBox,\n PertEdge,\n PertLane,\n PertLayoutResult,\n PertSentinel,\n PertSummary,\n PertUnit,\n} from \"./types\";\n\nfunction fmtVal(n: number): string {\n return String(parseFloat(n.toFixed(2)));\n}\n\nfunction unitWord(unit: PertUnit): string {\n return unit === \"abstract\" ? \"\" : unit;\n}\n\n// House palette: soft blue is the resting state; a quiet red is reserved as\n// the *accent* that marks the critical path — never a full-bleed red wash.\nconst PALETTE = {\n border: \"#6f93c4\",\n band: \"#e7f0fb\",\n fill: \"#fbfdff\",\n div: \"#d4e1f1\",\n name: \"#234567\",\n field: \"#2c4257\",\n fieldLabel: \"#8497ad\",\n idColor: \"#728198\",\n edge: \"#9fb0c6\",\n critBorder: \"#d2604f\",\n critBand: \"#fbe6e0\",\n critFill: \"#fffaf8\",\n critName: \"#8a3322\",\n critDiv: \"#f0d0c7\",\n critEdge: \"#d2604f\",\n sentinelFill: \"#eef2f8\",\n sentinelStroke: \"#8497ad\",\n axis: \"#aebccf\",\n axisBaseline: \"#8497ad\",\n grid: \"#e3eaf3\",\n} as const;\n\nfunction buildCss(t: BaseTheme): string {\n const P = PALETTE;\n return `\n.sx-pert { font-family: system-ui, -apple-system, sans-serif; }\n.sx-pert-task .task-box { fill: ${P.fill}; stroke: ${P.border}; stroke-width: 1.4; }\n.sx-pert-task .name-band { fill: ${P.band}; }\n.sx-pert-task.critical .task-box { stroke: ${P.critBorder}; stroke-width: 2.2; fill: ${P.critFill}; }\n.sx-pert-task.critical .name-band { fill: ${P.critBand}; }\n.sx-pert-div { stroke: ${P.div}; stroke-width: 1; }\n.sx-pert-task.critical .sx-pert-div { stroke: ${P.critDiv}; }\n.sx-pert-field { font-size: 11px; fill: ${P.field}; }\n.sx-pert-field-label { font-size: 8px; fill: ${P.fieldLabel}; letter-spacing: 0.3px; }\n.sx-pert-name { font-size: 13px; font-weight: 600; fill: ${P.name}; }\n.sx-pert-task.critical .sx-pert-name { fill: ${P.critName}; }\n.sx-pert-id { font-size: 10px; fill: ${P.idColor}; }\n.sx-pert-sigma { font-size: 9px; fill: ${P.fieldLabel}; }\n.sx-pert-task.critical .slack { font-weight: 700; fill: ${P.critBorder}; }\n.sx-pert-ms { fill: ${P.band}; stroke: ${P.border}; stroke-width: 1.4; }\n.sx-pert-task.critical .sx-pert-ms { fill: ${P.critBand}; stroke: ${P.critBorder}; stroke-width: 2.2; }\n.sx-pert-task .ts-bar { fill: ${P.band}; stroke: ${P.border}; stroke-width: 1.4; }\n.sx-pert-task.critical .ts-bar { fill: ${P.critBand}; stroke: ${P.critBorder}; stroke-width: 2.2; }\n.sx-pert-edge { stroke: ${P.edge}; stroke-width: 1.5; fill: none; }\n.sx-pert-edge.critical { stroke: ${P.critEdge}; stroke-width: 2.2; }\n.sx-pert-edge-label { font-size: 10px; fill: ${P.field}; }\n.sx-pert-edge-label.critical { fill: ${P.critBorder}; }\n.sx-pert-edge-halo { fill: ${t.bg}; opacity: 0.92; }\n.sx-pert-sentinel circle { fill: ${P.sentinelFill}; stroke: ${P.sentinelStroke}; stroke-width: 1.4; }\n.sx-pert-sentinel text { font-size: 10px; fill: ${P.idColor}; }\n.sx-pert-title { font-size: 16px; font-weight: 700; fill: ${t.text}; }\n.sx-pert-lane line { stroke: ${P.div}; stroke-width: 1; }\n.sx-pert-lane .lane-fill { fill: #f6f9fd; }\n.sx-pert-lane .lane-fill.alt { fill: #eef3fa; }\n.sx-pert-lane-label { font-size: 12px; font-weight: 600; fill: ${P.name}; }\n.sx-pert-axis line { stroke: ${P.axis}; }\n.sx-pert-axis .baseline { stroke: ${P.axisBaseline}; stroke-width: 1.2; }\n.sx-pert-axis text { font-size: 9px; fill: ${P.idColor}; }\n.sx-pert-grid { stroke: ${P.grid}; stroke-width: 1; }\n.sx-pert-summary { font-size: 11px; fill: ${P.idColor}; }\n.sx-pert-summary .crit { fill: ${P.critBorder}; font-weight: 600; }\n.sx-pert-aoa-event circle { fill: ${P.band}; stroke: ${P.border}; stroke-width: 1.6; }\n.sx-pert-aoa-event.critical circle { fill: ${P.critBand}; stroke: ${P.critBorder}; stroke-width: 2.4; }\n.sx-pert-aoa-event text { font-size: 13px; font-weight: 700; fill: ${P.name}; }\n.sx-pert-aoa-event.critical text { fill: ${P.critName}; }\n.sx-pert-aoa-arc { stroke: ${P.edge}; stroke-width: 1.6; fill: none; }\n.sx-pert-aoa-arc.critical { stroke: ${P.critEdge}; stroke-width: 2.4; }\n.sx-pert-aoa-arc.dummy { stroke: ${P.edge}; stroke-width: 1.3; stroke-dasharray: 5 4; }\n.sx-pert-aoa-name { font-size: 11px; font-weight: 600; fill: ${P.name}; }\n.sx-pert-aoa-name.critical { fill: ${P.critBorder}; }\n.sx-pert-aoa-dur { font-size: 10px; fill: ${P.fieldLabel}; }\n.sx-pert-aoa-dur.critical { fill: ${P.critBorder}; }\n`.trim();\n}\n\nfunction markers(): string {\n const tri = (id: string, color: string): string =>\n el(\n \"marker\",\n {\n id,\n viewBox: \"0 0 10 10\",\n refX: 9,\n refY: 5,\n markerWidth: 8,\n markerHeight: 8,\n orient: \"auto-start-reverse\",\n },\n [polygon({ points: \"0,0 10,5 0,10\", fill: color })],\n );\n return defs([tri(\"sx-pert-arrow\", PALETTE.edge), tri(\"sx-pert-arrow-crit\", PALETTE.critEdge)]);\n}\n\n// ─── Activity box (six-field) ────────────────────────────────────\n\nfunction renderBox(b: PertBox, mode: PertLayoutResult[\"mode\"]): string {\n if (b.milestone) return renderMilestone(b);\n if (mode === \"timescaled\") return renderTimescaledBar(b);\n return renderSixField(b);\n}\n\nfunction dataAttrs(b: PertBox): Record<string, string | number> {\n const c = b.computed;\n const attrs: Record<string, string | number> = {\n class: `sx-pert-task${c.critical ? \" critical\" : \"\"}${b.task.className ? \" \" + b.task.className : \"\"}`,\n \"data-id\": b.id,\n \"data-es\": fmtVal(c.es),\n \"data-ef\": fmtVal(c.ef),\n \"data-ls\": fmtVal(c.ls),\n \"data-lf\": fmtVal(c.lf),\n \"data-slack\": fmtVal(c.slack),\n \"data-duration\": fmtVal(b.task.duration),\n \"data-critical\": String(c.critical),\n };\n if (b.task.tags.length) attrs[\"data-tag\"] = b.task.tags.join(\" \");\n if (b.task.threePoint) {\n const tp = b.task.threePoint;\n attrs[\"data-pert-triple\"] = `${fmtVal(tp.o)}/${fmtVal(tp.m)}/${fmtVal(tp.p)}`;\n if (b.task.variance !== undefined) attrs[\"data-pert-variance\"] = fmtVal(b.task.variance);\n }\n return attrs;\n}\n\nfunction renderSixField(b: PertBox): string {\n const { x, y, width: w, height: h } = b;\n const c = b.computed;\n const col = w / 3;\n const topH = 22;\n const botH = 22;\n const yTop = y + topH;\n const yBot = y + h - botH;\n const cx = x + w / 2;\n\n const parts: string[] = [\n rect({ class: \"task-box\", x, y, width: w, height: h, rx: 4, ry: 4 }),\n rect({ class: \"name-band\", x: x + 0.7, y: yTop, width: w - 1.4, height: yBot - yTop }),\n line({ class: \"sx-pert-div\", x1: x, y1: yTop, x2: x + w, y2: yTop }),\n line({ class: \"sx-pert-div\", x1: x, y1: yBot, x2: x + w, y2: yBot }),\n line({ class: \"sx-pert-div\", x1: x + col, y1: y, x2: x + col, y2: yTop }),\n line({ class: \"sx-pert-div\", x1: x + 2 * col, y1: y, x2: x + 2 * col, y2: yTop }),\n line({ class: \"sx-pert-div\", x1: x + col, y1: yBot, x2: x + col, y2: y + h }),\n line({ class: \"sx-pert-div\", x1: x + 2 * col, y1: yBot, x2: x + 2 * col, y2: y + h }),\n ];\n\n const field = (\n fx: number,\n label: string,\n value: string,\n cls = \"sx-pert-field\",\n ): string =>\n group({}, [\n textEl({ class: \"sx-pert-field-label\", x: fx, y: y + 9, \"text-anchor\": \"middle\" }, label),\n textEl({ class: cls, x: fx, y: y + 19, \"text-anchor\": \"middle\" }, value),\n ]);\n\n parts.push(field(x + col / 2, \"ES\", fmtVal(c.es)));\n parts.push(field(x + col * 1.5, \"DUR\", fmtVal(b.task.duration)));\n parts.push(field(x + col * 2.5, \"EF\", fmtVal(c.ef)));\n\n // Bottom row\n const fieldBot = (fx: number, label: string, value: string, cls = \"sx-pert-field\"): string =>\n group({}, [\n textEl({ class: cls, x: fx, y: yBot + 13, \"text-anchor\": \"middle\" }, value),\n textEl({ class: \"sx-pert-field-label\", x: fx, y: yBot + 21, \"text-anchor\": \"middle\" }, label),\n ]);\n parts.push(fieldBot(x + col / 2, \"LS\", fmtVal(c.ls)));\n parts.push(fieldBot(x + col * 1.5, \"SLACK\", fmtVal(c.slack), \"sx-pert-field slack\"));\n parts.push(fieldBot(x + col * 2.5, \"LF\", fmtVal(c.lf)));\n\n // Middle row: name + id (+ sigma)\n const hasSigma = b.task.variance !== undefined;\n const nameY = hasSigma ? y + topH + 18 : y + topH + 19;\n parts.push(textEl({ class: \"sx-pert-name\", x: cx, y: nameY, \"text-anchor\": \"middle\" }, b.task.label));\n parts.push(textEl({ class: \"sx-pert-id\", x: cx, y: nameY + 14, \"text-anchor\": \"middle\" }, b.id));\n if (hasSigma) {\n parts.push(\n textEl(\n { class: \"sx-pert-sigma\", x: cx, y: nameY + 27, \"text-anchor\": \"middle\" },\n `σ=${fmtVal(Math.sqrt(b.task.variance!))}`,\n ),\n );\n }\n\n return group(dataAttrs(b), parts);\n}\n\nfunction renderMilestone(b: PertBox): string {\n const { x, y, width: w, height: h } = b;\n const cx = x + w / 2;\n const cy = y + h / 2;\n const pts = `${cx},${y} ${x + w},${cy} ${cx},${y + h} ${x},${cy}`;\n const parts: string[] = [\n polygon({ class: \"sx-pert-ms\", points: pts }),\n textEl({ class: \"sx-pert-name\", x: cx, y: cy - 2, \"text-anchor\": \"middle\" }, b.task.label),\n textEl({ class: \"sx-pert-id\", x: cx, y: cy + 12, \"text-anchor\": \"middle\" }, `@ ${fmtVal(b.computed.es)}`),\n ];\n return group(dataAttrs(b), parts);\n}\n\nfunction renderTimescaledBar(b: PertBox): string {\n const { x, y, width: w, height: h } = b;\n const c = b.computed;\n const cx = x + w / 2;\n const parts: string[] = [rect({ class: \"task-box ts-bar\", x, y, width: w, height: h, rx: 5, ry: 5 })];\n // task name sits above the bar (Gantt convention) so it never overflows\n parts.push(textEl({ class: \"sx-pert-name\", x, y: y - 6, \"text-anchor\": \"start\" }, `${b.task.label}`));\n // id centred in the bar\n parts.push(textEl({ class: \"sx-pert-id\", x: cx, y: y + h / 2 + 4, \"text-anchor\": \"middle\" }, b.id));\n const wide = w >= 104;\n if (wide) {\n parts.push(textEl({ class: \"sx-pert-field-label\", x: x + 7, y: y + 15, \"text-anchor\": \"start\" }, `ES ${fmtVal(c.es)}`));\n parts.push(textEl({ class: \"sx-pert-field-label\", x: x + w - 7, y: y + 15, \"text-anchor\": \"end\" }, `EF ${fmtVal(c.ef)}`));\n parts.push(\n textEl(\n { class: `sx-pert-field-label${c.critical ? \" slack\" : \"\"}`, x: cx, y: y + h - 8, \"text-anchor\": \"middle\" },\n `slack ${fmtVal(c.slack)}`,\n ),\n );\n }\n return group(dataAttrs(b), parts);\n}\n\n// ─── Edges ───────────────────────────────────────────────────────\n\nfunction renderEdge(e: PertEdge): string {\n const cls = `sx-pert-edge${e.critical ? \" critical\" : \"\"}`;\n const marker = e.critical ? \"url(#sx-pert-arrow-crit)\" : \"url(#sx-pert-arrow)\";\n return pathEl({\n class: cls,\n d: e.d,\n \"marker-end\": marker,\n \"data-from\": e.from,\n \"data-to\": e.to,\n \"data-type\": e.type,\n \"data-lag\": e.lag,\n \"data-critical\": String(e.critical),\n });\n}\n\nfunction renderEdgeLabel(e: PertEdge): string | null {\n if (!e.label) return null;\n const w = e.label.text.length * 6 + 6;\n const hh = 14;\n return group({ class: \"sx-pert-edge-label-g\" }, [\n rect({\n class: \"sx-pert-edge-halo\",\n x: e.label.x - w / 2,\n y: e.label.y - hh / 2,\n width: w,\n height: hh,\n rx: 3,\n ry: 3,\n }),\n textEl(\n {\n class: `sx-pert-edge-label${e.critical ? \" critical\" : \"\"}`,\n x: e.label.x,\n y: e.label.y + 3.5,\n \"text-anchor\": \"middle\",\n },\n e.label.text,\n ),\n ]);\n}\n\nfunction renderLanes(lanes: PertLane[], width: number): string {\n if (lanes.length === 0) return \"\";\n const last = lanes[lanes.length - 1];\n const bottom = last.y + last.height;\n const parts: string[] = [];\n for (const ln of lanes) {\n parts.push(rect({ class: `lane-fill${ln.alt ? \" alt\" : \"\"}`, x: 0, y: ln.y, width, height: ln.height }));\n }\n for (const ln of lanes) {\n parts.push(line({ x1: 0, y1: ln.y, x2: width, y2: ln.y }));\n }\n parts.push(line({ x1: 0, y1: bottom, x2: width, y2: bottom }));\n parts.push(line({ x1: PERT_CONST.LANE_LABEL_W, y1: lanes[0].y, x2: PERT_CONST.LANE_LABEL_W, y2: bottom }));\n for (const ln of lanes) {\n if (!ln.name) continue;\n parts.push(\n textEl({ class: \"sx-pert-lane-label\", x: 16, y: ln.y + ln.height / 2 + 4, \"text-anchor\": \"start\" }, ln.name),\n );\n }\n return group({ class: \"sx-pert-lane\" }, parts);\n}\n\nfunction renderSentinel(s: PertSentinel): string {\n return group({ class: \"sx-pert-sentinel\", \"data-id\": s.id }, [\n circle({ cx: s.cx, cy: s.cy, r: s.r }),\n textEl({ x: s.cx, y: s.cy + 3.5, \"text-anchor\": \"middle\" }, s.label),\n ]);\n}\n\nfunction renderAxis(axis: PertAxis, gridTop: number): string {\n const parts: string[] = [];\n // gridlines at major ticks\n for (const tk of axis.ticks) {\n if (tk.major) {\n parts.push(line({ class: \"sx-pert-grid\", x1: tk.pos, y1: gridTop, x2: tk.pos, y2: axis.baseline }));\n }\n }\n parts.push(line({ class: \"baseline\", x1: axis.start, y1: axis.baseline, x2: axis.end, y2: axis.baseline }));\n for (const tk of axis.ticks) {\n const len = tk.major ? 7 : 4;\n parts.push(line({ x1: tk.pos, y1: axis.baseline, x2: tk.pos, y2: axis.baseline + len }));\n if (tk.major) {\n parts.push(\n textEl({ x: tk.pos, y: axis.baseline + 18, \"text-anchor\": \"middle\" }, fmtVal(tk.value)),\n );\n }\n }\n return group({ class: \"sx-pert-axis\" }, parts);\n}\n\nfunction renderAoa(aoa: PertAoa): string {\n const arcEls: string[] = [];\n const labelEls: string[] = [];\n for (const a of aoa.arcs) {\n const cls = `sx-pert-aoa-arc${a.dummy ? \" dummy\" : \"\"}${a.critical ? \" critical\" : \"\"}`;\n const marker = a.critical ? \"url(#sx-pert-arrow-crit)\" : \"url(#sx-pert-arrow)\";\n arcEls.push(\n pathEl({\n class: cls,\n d: a.d,\n \"marker-end\": marker,\n \"data-from\": a.from,\n \"data-to\": a.to,\n \"data-task\": a.taskId ?? \"\",\n \"data-dummy\": String(a.dummy),\n \"data-critical\": String(a.critical),\n }),\n );\n if (!a.dummy && a.label) {\n const critCls = a.critical ? \" critical\" : \"\";\n const durStr = fmtVal(a.duration ?? 0);\n const w = Math.max(a.label.length * 6.2, durStr.length * 6) + 8;\n labelEls.push(\n rect({ class: \"sx-pert-edge-halo\", x: a.labelX - w / 2, y: a.labelY - 16, width: w, height: 31, rx: 3, ry: 3 }),\n );\n labelEls.push(\n textEl({ class: `sx-pert-aoa-name${critCls}`, x: a.labelX, y: a.labelY - 4, \"text-anchor\": \"middle\" }, a.label),\n );\n labelEls.push(\n textEl({ class: `sx-pert-aoa-dur${critCls}`, x: a.labelX, y: a.labelY + 12, \"text-anchor\": \"middle\" }, durStr),\n );\n }\n }\n const eventEls: string[] = [];\n for (const e of aoa.events) {\n eventEls.push(\n group({ class: `sx-pert-aoa-event${e.critical ? \" critical\" : \"\"}`, \"data-event\": e.id }, [\n circle({ cx: e.x, cy: e.y, r: e.r }),\n textEl({ x: e.x, y: e.y + 4.5, \"text-anchor\": \"middle\" }, String(e.id)),\n ]),\n );\n }\n return group({ class: \"sx-pert-aoa\" }, [\n group({ class: \"sx-pert-aoa-arcs\" }, arcEls),\n group({ class: \"sx-pert-aoa-labels\" }, labelEls),\n group({ class: \"sx-pert-aoa-events\" }, eventEls),\n ]);\n}\n\nfunction summaryText(summary: PertSummary): { plain: string; critPath: string } {\n const u = unitWord(summary.unit);\n const dur = `${fmtVal(summary.projectDuration)}${u ? \" \" + u : \"\"}`;\n const sigma = summary.projectStdDev !== undefined ? ` · σ ≈ ${fmtVal(summary.projectStdDev)}` : \"\";\n const plain = `Project duration ${dur} · ${summary.taskCount} tasks · ${summary.depCount} dependencies · ${summary.criticalCount} critical${sigma}`;\n const critPath = summary.criticalPath.map((id) => id).join(\" → \");\n return { plain, critPath };\n}\n\n// ─── Top-level ───────────────────────────────────────────────────\n\nexport function renderPertLayout(layout: PertLayoutResult, config?: RenderConfig): string {\n const t = resolveBaseTheme(config?.theme ?? \"default\");\n const children: string[] = [];\n\n const cp = layout.summary.criticalPath;\n children.push(titleEl(`PERT network${layout.title ? \" — \" + layout.title : \"\"}`));\n children.push(\n desc(\n `${layout.summary.taskCount} activities, project duration ${fmtVal(layout.summary.projectDuration)} ${unitWord(layout.unit)}` +\n (cp.length ? `, critical path ${cp.join(\" → \")}` : \"\") +\n \".\",\n ),\n );\n children.push(el(\"style\", {}, buildCss(t)));\n children.push(markers());\n\n if (layout.title) {\n children.push(\n textEl({ x: layout.width / 2, y: 26, class: \"sx-pert-title\", \"text-anchor\": \"middle\" }, layout.title),\n );\n }\n\n if (layout.aoa) {\n children.push(renderAoa(layout.aoa));\n } else {\n // swimlane bands (under everything)\n if (layout.lanes && layout.lanes.length) {\n children.push(renderLanes(layout.lanes, layout.width));\n }\n\n // axis (under boxes)\n if (layout.axis) {\n let minBoxY = Infinity;\n for (const b of layout.boxes) minBoxY = Math.min(minBoxY, b.y);\n children.push(renderAxis(layout.axis, isFinite(minBoxY) ? minBoxY : layout.axis.baseline - 20));\n }\n\n // edges first (under boxes)\n const edgeEls: string[] = [];\n for (const e of layout.edges) edgeEls.push(renderEdge(e));\n children.push(group({ class: \"sx-pert-edges\" }, edgeEls));\n\n // sentinels\n if (layout.sentinels.length) {\n children.push(group({ class: \"sx-pert-sentinels\" }, layout.sentinels.map(renderSentinel)));\n }\n\n // boxes\n const boxEls: string[] = [];\n for (const b of layout.boxes) boxEls.push(renderBox(b, layout.mode));\n children.push(group({ class: \"sx-pert-tasks\" }, boxEls));\n\n // edge labels on top\n const labelEls: string[] = [];\n for (const e of layout.edges) {\n const lbl = renderEdgeLabel(e);\n if (lbl) labelEls.push(lbl);\n }\n children.push(group({ class: \"sx-pert-labels\" }, labelEls));\n }\n\n // summary footer\n const { plain, critPath } = summaryText(layout.summary);\n const footerY = layout.height - 12;\n const footerParts: string[] = [\n textEl({ class: \"sx-pert-summary\", x: PERT_PAD, y: footerY, \"text-anchor\": \"start\" }, plain),\n ];\n if (critPath) {\n footerParts.push(\n textEl(\n { class: \"sx-pert-summary crit\", x: layout.width - PERT_PAD, y: footerY, \"text-anchor\": \"end\" },\n `Critical path: ${critPath}`,\n ),\n );\n }\n children.push(group({ class: \"sx-pert-footer\" }, footerParts));\n\n return svgRoot(\n {\n class: \"sx-pert\",\n role: \"img\",\n \"aria-label\": escapeXml(layout.title ?? \"PERT network diagram\"),\n width: layout.width,\n height: layout.height,\n viewBox: `0 0 ${layout.width} ${layout.height}`,\n \"data-diagram-type\": \"pert\",\n },\n children,\n );\n}\n\nconst PERT_PAD = 24;\n\nexport function renderPert(textOrAst: string | PertAst, config?: RenderConfig): string {\n const ast = typeof textOrAst === \"string\" ? parsePert(textOrAst) : textOrAst;\n const schedule = schedulePert(ast);\n const layout = layoutPert(ast, schedule);\n return renderPertLayout(layout, config);\n}\n","import type { DiagramPlugin, RenderConfig } from \"../../core/types\";\nimport { parsePert } from \"./parser\";\nimport { renderPert } from \"./renderer\";\n\nexport const pert: DiagramPlugin = {\n type: \"pert\" as DiagramPlugin[\"type\"],\n detect(text: string): boolean {\n for (const raw of text.split(/\\r?\\n/)) {\n const t = raw.trim();\n if (!t) continue;\n if (t.startsWith(\"#\") || t.startsWith(\"//\")) continue;\n return /^pert\\b/i.test(t);\n }\n return false;\n },\n parse: parsePert,\n render(text: string, config?: RenderConfig): string {\n return renderPert(text, config);\n },\n};\n\nexport { parsePert, PertParseError } from \"./parser\";\nexport { schedulePert, PertScheduleError } from \"./scheduler\";\nexport { layoutPert, PERT_CONST } from \"./layout\";\nexport { layoutAoa } from \"./aoa\";\nexport { renderPert, renderPertLayout } from \"./renderer\";\nexport type * from \"./types\";\n","/**\n * UML Sequence diagram — recursive-descent parser.\n *\n * Spec: docs/reference/33-SEQUENCE-STANDARD.md §4\n *\n * Hand-written, zero-dependency. Line-oriented with recursion for nested\n * combined fragments.\n */\n\nimport { stripQuotes, matchQuotedTitle } from \"../../core/quotes\";\nimport type {\n SeqArrowKind,\n SeqAst,\n SeqFragment,\n SeqFragmentOp,\n SeqMessage,\n SeqNote,\n SeqNotePlacement,\n SeqOperand,\n SeqParticipant,\n SeqParticipantKind,\n SeqStatement,\n} from \"./types\";\n\nexport class SequenceParseError extends Error {\n line?: number;\n constructor(message: string, line?: number) {\n super(line ? `${message} (line ${line})` : message);\n this.name = \"SequenceParseError\";\n this.line = line;\n }\n}\n\nconst KINDS = new Set<SeqParticipantKind>([\n \"participant\",\n \"actor\",\n \"boundary\",\n \"control\",\n \"entity\",\n \"database\",\n \"collections\",\n \"queue\",\n]);\n\nconst SIMPLE_FRAG = new Set<SeqFragmentOp>([\n \"opt\",\n \"loop\",\n \"break\",\n \"critical\",\n \"neg\",\n \"ignore\",\n \"consider\",\n \"assert\",\n]);\nconst MULTI_FRAG = new Set<SeqFragmentOp>([\"par\", \"seq\", \"strict\"]);\n/** `ignore`/`consider` carry a `{m1, m2}` message-name set after the keyword. */\nconst MSGSET_FRAG = new Set<SeqFragmentOp>([\"ignore\", \"consider\"]);\nconst ALL_FRAG = new Set<SeqFragmentOp>([\n \"alt\",\n ...SIMPLE_FRAG,\n ...MULTI_FRAG,\n]);\n\n/** Arrow tokens, ordered longest-first so the regex matches greedily. */\nconst ARROW_RE = /(-->|->>|o->|-x|->)/;\n\nfunction arrowKind(token: string): SeqArrowKind {\n switch (token) {\n case \"-->\":\n return \"reply\";\n case \"->>\":\n return \"async\";\n case \"o->\":\n return \"found\";\n case \"-x\":\n return \"lost\";\n default:\n return \"sync\";\n }\n}\n\ninterface Line {\n text: string;\n n: number;\n}\n\nfunction firstWord(s: string): string {\n const m = /^(\\S+)/.exec(s);\n return m ? m[1]! : \"\";\n}\n\n/** Strip a leading `[guard]` / `(n)` / `(n,m)` clause; returns its inner text. */\nfunction extractGuard(rest: string): string | undefined {\n const t = rest.trim();\n if (!t) return undefined;\n if (t.startsWith(\"[\") && t.endsWith(\"]\")) return t.slice(1, -1).trim();\n if (t.startsWith(\"(\") && t.endsWith(\")\")) return t.slice(1, -1).trim();\n return t;\n}\n\nexport class SequenceParser {\n private lines: Line[];\n private i = 0;\n private order: string[] = [];\n private byId = new Map<string, SeqParticipant>();\n private warnings: string[] = [];\n\n constructor(source: string) {\n this.lines = source.split(/\\r?\\n/).map((raw, idx) => ({\n text: raw.trim(),\n n: idx + 1,\n }));\n }\n\n parse(): SeqAst {\n const header = this.consumeHeader();\n const ast: SeqAst = {\n type: \"sequence\",\n participants: [],\n statements: [],\n warnings: this.warnings,\n };\n if (header.title) ast.title = header.title;\n\n const statements = this.parseBlock();\n\n // A leftover terminator at top level is a dangling `end`/`else`/`and`.\n const leftover = this.peek();\n if (leftover) {\n const fw = firstWord(leftover.text).toLowerCase();\n throw new SequenceParseError(\n `'${fw}' without a matching combined fragment`,\n leftover.n,\n );\n }\n\n if (this.autonumberSpec) ast.autonumber = this.autonumberSpec;\n ast.statements = statements;\n ast.participants = this.order.map((id) => this.byId.get(id)!);\n return ast;\n }\n\n private autonumberSpec?: { start: number; step: number };\n\n // ── line cursor ──────────────────────────────────────────────\n\n private peek(): Line | null {\n while (this.i < this.lines.length) {\n const ln = this.lines[this.i]!;\n if (ln.text === \"\" || ln.text.startsWith(\"#\") || ln.text.startsWith(\"//\")) {\n this.i++;\n continue;\n }\n return ln;\n }\n return null;\n }\n\n private next(): Line | null {\n const ln = this.peek();\n if (ln) this.i++;\n return ln;\n }\n\n // ── header ───────────────────────────────────────────────────\n\n private consumeHeader(): { title?: string } {\n const ln = this.next();\n if (!ln || !/^sequence\\b/i.test(ln.text)) {\n throw new SequenceParseError(\n \"A sequence diagram must start with the keyword 'sequence'\",\n ln?.n,\n );\n }\n const title = matchQuotedTitle(ln.text);\n return title ? { title } : {};\n }\n\n // ── participants ─────────────────────────────────────────────\n\n private ensure(id: string, kind: SeqParticipantKind = \"participant\", line?: number): SeqParticipant {\n let p = this.byId.get(id);\n if (!p) {\n p = { id, name: id, kind, line };\n this.byId.set(id, p);\n this.order.push(id);\n }\n return p;\n }\n\n private declare(line: Line): void {\n const fw = firstWord(line.text);\n const kind = fw.toLowerCase() as SeqParticipantKind;\n let rest = line.text.slice(fw.length).trim();\n // pull out an optional «stereotype» / <<stereotype>> (may sit before or after `as`)\n let stereotype: string | undefined;\n const stereoMatch = /«([^»]*)»|<<([^>]*)>>/.exec(rest);\n if (stereoMatch) {\n stereotype = (stereoMatch[1] ?? stereoMatch[2] ?? \"\").trim();\n rest = (rest.slice(0, stereoMatch.index) + rest.slice(stereoMatch.index + stereoMatch[0].length)).trim();\n }\n // split on \" as \" (case-insensitive), respecting the rest as the label\n let id: string;\n let name: string;\n const asMatch = /\\sas\\s/i.exec(rest);\n if (asMatch) {\n id = stripQuotes(rest.slice(0, asMatch.index).trim());\n name = stripQuotes(rest.slice(asMatch.index + asMatch[0].length).trim());\n } else {\n id = stripQuotes(rest);\n name = id;\n }\n if (!id) {\n throw new SequenceParseError(`'${fw}' declaration needs a name`, line.n);\n }\n const existing = this.byId.get(id);\n if (existing) {\n existing.kind = kind;\n existing.name = name;\n if (stereotype) existing.stereotype = stereotype;\n } else {\n const p: SeqParticipant = { id, name, kind, line: line.n };\n if (stereotype) p.stereotype = stereotype;\n this.byId.set(id, p);\n this.order.push(id);\n }\n }\n\n // ── block / statement dispatch ───────────────────────────────\n\n /** Parse statements until a terminator (`end`/`else`/`and`) or EOF. Terminators are left unconsumed. */\n private parseBlock(): SeqStatement[] {\n const out: SeqStatement[] = [];\n for (;;) {\n const ln = this.peek();\n if (!ln) break;\n const fw = firstWord(ln.text).toLowerCase();\n if (fw === \"end\" || fw === \"else\" || fw === \"and\") break;\n\n if (KINDS.has(fw as SeqParticipantKind)) {\n this.i++;\n this.declare(ln);\n continue;\n }\n if (ALL_FRAG.has(fw as SeqFragmentOp)) {\n out.push(this.parseFragment(ln));\n continue;\n }\n this.i++;\n const stmt = this.parseSimpleStatement(ln);\n if (stmt) out.push(stmt);\n }\n return out;\n }\n\n private parseFragment(open: Line): SeqFragment {\n const fw = firstWord(open.text).toLowerCase() as SeqFragmentOp;\n this.i++; // consume the opening line\n let rest = open.text.slice(fw.length);\n\n // ignore/consider: pull the `{m1, m2}` message-name set out first\n let messageSet: string[] | undefined;\n if (MSGSET_FRAG.has(fw)) {\n const bm = /\\{([^}]*)\\}/.exec(rest);\n if (bm) {\n messageSet = bm[1]!.split(\",\").map((s) => s.trim()).filter(Boolean);\n rest = rest.slice(0, bm.index) + rest.slice(bm.index + bm[0].length);\n }\n }\n\n const firstGuard = extractGuard(rest);\n const operands: SeqOperand[] = [\n { guard: firstGuard, statements: this.parseBlock() },\n ];\n\n for (;;) {\n const ln = this.peek();\n if (!ln) {\n throw new SequenceParseError(`Unterminated '${fw}' fragment`, open.n);\n }\n const term = firstWord(ln.text).toLowerCase();\n if (term === \"end\") {\n this.i++;\n break;\n }\n if (term === \"else\") {\n if (fw !== \"alt\") {\n throw new SequenceParseError(\n `'else' is only valid inside an 'alt' fragment, not '${fw}'`,\n ln.n,\n );\n }\n this.i++;\n operands.push({\n guard: extractGuard(ln.text.slice(4)),\n statements: this.parseBlock(),\n });\n continue;\n }\n if (term === \"and\") {\n if (!MULTI_FRAG.has(fw)) {\n throw new SequenceParseError(\n `'and' is only valid inside par/seq/strict, not '${fw}'`,\n ln.n,\n );\n }\n this.i++;\n const label = ln.text.slice(3).trim();\n operands.push({\n guard: label ? extractGuard(label) : undefined,\n statements: this.parseBlock(),\n });\n continue;\n }\n // unreachable: parseBlock only stops at end/else/and\n throw new SequenceParseError(`Unexpected '${term}' in '${fw}'`, ln.n);\n }\n\n const frag: SeqFragment = { kind: \"fragment\", op: fw, operands, line: open.n };\n if (messageSet && messageSet.length) frag.messageSet = messageSet;\n return frag;\n }\n\n /** Non-fragment, non-participant statements. */\n private parseSimpleStatement(ln: Line): SeqStatement | null {\n const text = ln.text;\n const fw = firstWord(text).toLowerCase();\n\n if (fw === \"activate\" || fw === \"deactivate\") {\n const m = /^(?:de)?activate\\s+(\\S+)$/i.exec(text);\n if (!m) throw new SequenceParseError(`Malformed ${fw} statement`, ln.n);\n this.ensure(m[1]!, \"participant\", ln.n);\n return { kind: fw, id: m[1]!, line: ln.n };\n }\n\n if (fw === \"note\") {\n return this.parseNote(ln);\n }\n\n if (fw === \"ref\") {\n const m = /^ref\\s+over\\s+(.+?)\\s*:\\s*(.*)$/i.exec(text);\n if (!m) throw new SequenceParseError(\"Malformed ref (expected: ref over A, B : text)\", ln.n);\n const ids = m[1]!.split(\",\").map((s) => stripQuotes(s.trim())).filter(Boolean);\n ids.forEach((id) => this.ensure(id, \"participant\", ln.n));\n return { kind: \"ref\", ids, text: m[2]!.trim(), line: ln.n };\n }\n\n if (text.startsWith(\"==\")) {\n const m = /^==\\s*(.*?)\\s*==\\s*$/.exec(text);\n return { kind: \"divider\", text: m ? m[1]!.trim() : \"\", line: ln.n };\n }\n\n if (fw === \"state\") {\n const m = /^state\\s+(\\S+)\\s*:\\s*(.*)$/i.exec(text);\n if (!m) throw new SequenceParseError(\"Malformed state invariant (expected: state A : text)\", ln.n);\n this.ensure(m[1]!, \"participant\", ln.n);\n return { kind: \"invariant\", id: m[1]!, text: m[2]!.trim(), line: ln.n };\n }\n\n if (fw === \"destroy\") {\n const m = /^destroy\\s+(\\S+)$/i.exec(text);\n if (!m) throw new SequenceParseError(\"Malformed destroy statement\", ln.n);\n this.ensure(m[1]!, \"participant\", ln.n);\n return { kind: \"destroy\", id: m[1]!, line: ln.n };\n }\n\n if (fw === \"autonumber\") {\n const m = /^autonumber(?:\\s+(\\d+))?(?:\\s+(\\d+))?$/i.exec(text);\n const start = m && m[1] ? parseInt(m[1], 10) : 1;\n const step = m && m[2] ? parseInt(m[2], 10) : 1;\n this.autonumberSpec = { start, step };\n return null;\n }\n\n return this.parseMessage(ln);\n }\n\n private parseNote(ln: Line): SeqNote {\n const m = /^note\\s+(over|left of|right of)\\s+(.+?)\\s*:\\s*(.*)$/i.exec(ln.text);\n if (!m) {\n throw new SequenceParseError(\n \"Malformed note (expected: note over|left of|right of A[, B] : text)\",\n ln.n,\n );\n }\n const placementRaw = m[1]!.toLowerCase();\n const placement: SeqNotePlacement =\n placementRaw === \"over\" ? \"over\" : placementRaw.startsWith(\"left\") ? \"left\" : \"right\";\n const ids = m[2]!.split(\",\").map((s) => stripQuotes(s.trim())).filter(Boolean);\n ids.forEach((id) => this.ensure(id, \"participant\", ln.n));\n return { kind: \"note\", placement, ids, text: m[3]!.trim(), line: ln.n };\n }\n\n private parseMessage(ln: Line): SeqMessage {\n const text = ln.text;\n const arrowMatch = ARROW_RE.exec(text);\n if (!arrowMatch) {\n throw new SequenceParseError(`Cannot parse statement: \"${text}\"`, ln.n);\n }\n const token = arrowMatch[1]!;\n const at = arrowMatch.index;\n const leftRaw = text.slice(0, at);\n let rightRaw = text.slice(at + token.length);\n\n // label after the first ':'\n let label: string | undefined;\n const colon = rightRaw.indexOf(\":\");\n if (colon >= 0) {\n label = rightRaw.slice(colon + 1).trim();\n rightRaw = rightRaw.slice(0, colon);\n }\n\n // activation suffixes: leftRaw may end with +/- ; rightRaw may start with +/-\n let activateTarget = false;\n let deactivateSource = false;\n let left = leftRaw.trim();\n if (left.endsWith(\"+\")) {\n activateTarget = true;\n left = left.slice(0, -1).trim();\n } else if (left.endsWith(\"-\")) {\n deactivateSource = true;\n left = left.slice(0, -1).trim();\n }\n let right = rightRaw.trim();\n if (right.startsWith(\"+\")) {\n activateTarget = true;\n right = right.slice(1).trim();\n } else if (right.startsWith(\"-\")) {\n deactivateSource = true;\n right = right.slice(1).trim();\n }\n\n const arrow = arrowKind(token);\n\n // create form: right id prefixed with '*'\n let create = false;\n if (right.startsWith(\"*\")) {\n create = true;\n right = right.slice(1).trim();\n }\n\n const from = arrow === \"found\" ? \"\" : stripQuotes(left);\n const to = arrow === \"lost\" ? \"\" : stripQuotes(right);\n\n if (from) this.ensure(from, \"participant\", ln.n);\n if (to) {\n const p = this.ensure(to, \"participant\", ln.n);\n if (create) p.createdInline = true;\n }\n\n const msg: SeqMessage = {\n kind: \"message\",\n from,\n to,\n arrow,\n line: ln.n,\n };\n if (label) msg.label = label;\n if (activateTarget) msg.activateTarget = true;\n if (deactivateSource) msg.deactivateSource = true;\n if (create) msg.create = true;\n return msg;\n }\n}\n\nexport function parseSequence(text: string): SeqAst {\n return new SequenceParser(text).parse();\n}\n","/**\n * UML Sequence diagram — layout engine.\n *\n * Spec: docs/reference/33-SEQUENCE-STANDARD.md §5\n *\n * The vertical axis is event order (not real time). Layout is deterministic:\n * a single horizontal pass sizes the lifeline columns (label-aware so messages\n * never collide), then a recursive vertical walk assigns y to every event and\n * frames the combined fragments.\n */\n\nimport type {\n SeqActivationBar,\n SeqAst,\n SeqDividerBar,\n SeqFragmentFrame,\n SeqFragmentOperandGeom,\n SeqInvariantBox,\n SeqLayoutResult,\n SeqLifeline,\n SeqMessage,\n SeqMessageRow,\n SeqNote,\n SeqNoteBox,\n SeqRefFrame,\n SeqStatement,\n} from \"./types\";\n\nexport const SEQ_CONST = {\n HEAD_W_MIN: 90,\n HEAD_H: 38,\n HEAD_PAD_X: 14,\n LIFELINE_GAP: 140,\n LEFT_MARGIN: 24,\n RIGHT_PAD: 28,\n TOP_PAD: 16,\n HEAD_TO_FIRST: 30,\n EVENT_GAP: 38,\n BOTTOM_PAD: 30,\n SELF_GAP: 30,\n SELF_LOOP_W: 48,\n ACT_W: 10,\n ACT_NEST_DX: 6,\n ACT_STEP: 30,\n FRAG_PAD_X: 10,\n FRAG_LABEL_H: 18,\n FRAG_PAD_TOP: 16,\n FRAG_PAD_BOTTOM: 12,\n FRAG_GAP_BEFORE: 12,\n FRAG_OPERAND_GAP: 18,\n FRAG_NEST_INSET: 8,\n REF_H: 40,\n REF_GAP_BEFORE: 12,\n NOTE_GAP_BEFORE: 10,\n NOTE_PAD: 8,\n NOTE_MIN_W: 70,\n NOTE_LINE_H: 15,\n NOTE_SIDE_GAP: 16,\n DIV_H: 26,\n DIV_GAP_BEFORE: 8,\n INV_GAP_BEFORE: 10,\n INV_PAD: 10,\n INV_H: 24,\n LABEL_GAP_PAD: 26,\n LOST_LEN: 72,\n} as const;\n\nconst LABEL_SIZE = 11;\nconst HEAD_TEXT_SIZE = 12.5;\n\nfunction textWidth(s: string, size: number): number {\n let w = 0;\n for (const ch of s) {\n w += /[⺀-]/.test(ch) ? size : size * 0.55;\n }\n return w;\n}\n\ninterface OpenBar {\n x: number;\n yTop: number;\n level: number;\n}\n\ninterface ColAcc {\n min: number;\n max: number;\n}\n\nclass SequenceLayout {\n private ast: SeqAst;\n private lifelines: SeqLifeline[] = [];\n private colOf = new Map<string, number>();\n private llById = new Map<string, SeqLifeline>();\n private x: number[] = [];\n private headW: number[] = [];\n\n private y = 0;\n private open = new Map<string, OpenBar[]>();\n private colAccStack: ColAcc[] = [];\n\n private messages: SeqMessageRow[] = [];\n private activations: SeqActivationBar[] = [];\n private fragments: SeqFragmentFrame[] = [];\n private refs: SeqRefFrame[] = [];\n private notes: SeqNoteBox[] = [];\n private dividers: SeqDividerBar[] = [];\n private invariants: SeqInvariantBox[] = [];\n private destroys: { x: number; y: number }[] = [];\n private warnings: string[] = [];\n\n private autoCounter: number | null = null;\n private contentRight = 0;\n\n constructor(ast: SeqAst) {\n this.ast = ast;\n }\n\n run(): SeqLayoutResult {\n this.buildColumns();\n if (this.ast.autonumber) this.autoCounter = this.ast.autonumber.start;\n\n // vertical cursor sits one EVENT_GAP above the first event row\n const headBottom = SEQ_CONST.TOP_PAD + SEQ_CONST.HEAD_H;\n this.y = headBottom + SEQ_CONST.HEAD_TO_FIRST - SEQ_CONST.EVENT_GAP;\n\n this.walk(this.ast.statements, 0);\n\n // close any activation bars still open at the end of the interaction\n const bottomY = this.y + SEQ_CONST.EVENT_GAP;\n for (const [id, stack] of this.open) {\n while (stack.length) {\n const b = stack.pop()!;\n this.activations.push({ id, x: b.x, yTop: b.yTop, yBottom: bottomY, level: b.level });\n }\n }\n\n const bodyBottom = bottomY + SEQ_CONST.BOTTOM_PAD;\n for (const ll of this.lifelines) {\n if (!ll.destroyed) ll.axisBottom = bodyBottom;\n }\n\n const lastCenter = this.x[this.x.length - 1] ?? SEQ_CONST.LEFT_MARGIN;\n const lastHalf = (this.headW[this.headW.length - 1] ?? SEQ_CONST.HEAD_W_MIN) / 2;\n this.contentRight = Math.max(this.contentRight, lastCenter + lastHalf);\n const width = Math.round(this.contentRight + SEQ_CONST.RIGHT_PAD);\n const height = Math.round(bodyBottom);\n\n for (const d of this.dividers) d.width = width;\n\n const result: SeqLayoutResult = {\n width,\n height,\n lifelines: this.lifelines,\n messages: this.messages,\n activations: this.activations,\n fragments: this.fragments,\n refs: this.refs,\n notes: this.notes,\n dividers: this.dividers,\n invariants: this.invariants,\n destroys: this.destroys,\n warnings: this.warnings.concat(this.ast.warnings),\n ast: this.ast,\n };\n if (this.ast.title) result.title = this.ast.title;\n return result;\n }\n\n // ── horizontal pass ──────────────────────────────────────────\n\n private buildColumns(): void {\n const ps = this.ast.participants;\n this.headW = ps.map((p) =>\n Math.max(SEQ_CONST.HEAD_W_MIN, Math.ceil(textWidth(p.name, HEAD_TEXT_SIZE)) + SEQ_CONST.HEAD_PAD_X * 2),\n );\n ps.forEach((p, i) => this.colOf.set(p.id, i));\n\n const n = ps.length;\n const gaps = new Array(Math.max(0, n - 1)).fill(SEQ_CONST.LIFELINE_GAP);\n // head boxes must not overlap\n for (let k = 0; k < gaps.length; k++) {\n gaps[k] = Math.max(gaps[k], this.headW[k]! / 2 + this.headW[k + 1]! / 2 + 28);\n }\n\n // label-aware widening\n const msgs = collectMessages(this.ast.statements);\n for (const m of msgs) {\n const label = m.label ?? \"\";\n const w = textWidth(label, LABEL_SIZE) + SEQ_CONST.LABEL_GAP_PAD;\n const cf = this.colOf.get(m.from);\n const ct = this.colOf.get(m.to);\n if (cf === undefined && ct === undefined) continue;\n if (cf === undefined || ct === undefined) continue; // lost/found: width handled later\n if (cf === ct) {\n if (cf < gaps.length) gaps[cf] = Math.max(gaps[cf]!, SEQ_CONST.SELF_LOOP_W + w);\n continue;\n }\n const i = Math.min(cf, ct);\n const j = Math.max(cf, ct);\n if (j === i + 1) {\n gaps[i] = Math.max(gaps[i]!, w);\n } else {\n let span = 0;\n for (let k = i; k < j; k++) span += gaps[k]!;\n if (span < w) {\n const add = (w - span) / (j - i);\n for (let k = i; k < j; k++) gaps[k]! += add;\n }\n }\n }\n\n this.x = new Array(n);\n let cx = SEQ_CONST.LEFT_MARGIN + (this.headW[0] ?? SEQ_CONST.HEAD_W_MIN) / 2;\n for (let i = 0; i < n; i++) {\n this.x[i] = cx;\n if (i < gaps.length) cx += gaps[i]!;\n }\n\n ps.forEach((p, i) => {\n const created = p.createdInline === true;\n const headY = created ? -1 : SEQ_CONST.TOP_PAD;\n const ll: SeqLifeline = {\n participant: p,\n index: i,\n x: this.x[i]!,\n headX: this.x[i]! - this.headW[i]! / 2,\n headY,\n headW: this.headW[i]!,\n headH: SEQ_CONST.HEAD_H,\n axisTop: created ? -1 : SEQ_CONST.TOP_PAD + SEQ_CONST.HEAD_H,\n axisBottom: 0,\n destroyed: false,\n };\n this.lifelines.push(ll);\n this.llById.set(p.id, ll);\n });\n }\n\n // ── column accounting (for fragment extents) ─────────────────\n\n private touch(col: number | undefined): void {\n if (col === undefined) return;\n for (const acc of this.colAccStack) {\n if (col < acc.min) acc.min = col;\n if (col > acc.max) acc.max = col;\n }\n }\n\n private noteRight(x: number, w: number): void {\n this.contentRight = Math.max(this.contentRight, x + w);\n }\n\n // ── activation bars ──────────────────────────────────────────\n\n private openBar(id: string): void {\n const col = this.colOf.get(id);\n if (col === undefined) return;\n const stack = this.open.get(id) ?? [];\n const level = stack.length;\n const x = this.x[col]! - SEQ_CONST.ACT_W / 2 + level * SEQ_CONST.ACT_NEST_DX;\n stack.push({ x, yTop: this.y, level });\n this.open.set(id, stack);\n }\n\n private closeBar(id: string): void {\n const stack = this.open.get(id);\n if (!stack || stack.length === 0) {\n this.warnings.push(`deactivate '${id}' with no matching activation`);\n return;\n }\n const b = stack.pop()!;\n this.activations.push({ id, x: b.x, yTop: b.yTop, yBottom: this.y, level: b.level });\n }\n\n private faceEdge(id: string, col: number, towardRight: boolean, extraLevel = 0): number {\n const stack = this.open.get(id) ?? [];\n const levels = stack.length + extraLevel;\n if (levels <= 0) return this.x[col]!;\n if (!towardRight) return this.x[col]! - SEQ_CONST.ACT_W / 2;\n return this.x[col]! + SEQ_CONST.ACT_W / 2 + (levels - 1) * SEQ_CONST.ACT_NEST_DX;\n }\n\n // ── vertical walk ────────────────────────────────────────────\n\n private walk(stmts: SeqStatement[], depth: number): void {\n for (const s of stmts) {\n switch (s.kind) {\n case \"message\":\n this.placeMessage(s);\n break;\n case \"activate\":\n this.y += SEQ_CONST.ACT_STEP;\n this.openBar(s.id);\n this.touch(this.colOf.get(s.id));\n break;\n case \"deactivate\":\n this.y += SEQ_CONST.ACT_STEP;\n this.closeBar(s.id);\n this.touch(this.colOf.get(s.id));\n break;\n case \"note\":\n this.placeNote(s);\n break;\n case \"ref\":\n this.placeRef(s.ids, s.text);\n break;\n case \"divider\":\n this.y += SEQ_CONST.DIV_GAP_BEFORE;\n this.dividers.push({ text: s.text, y: this.y + SEQ_CONST.DIV_H / 2, width: 0 });\n this.y += SEQ_CONST.DIV_H;\n break;\n case \"invariant\":\n this.placeInvariant(s.id, s.text);\n break;\n case \"destroy\":\n this.placeDestroy(s.id);\n break;\n case \"fragment\":\n this.placeFragment(s.op, s.operands, depth, s.messageSet);\n break;\n }\n }\n }\n\n private nextNumber(): number | undefined {\n if (this.autoCounter === null || !this.ast.autonumber) return undefined;\n const n = this.autoCounter;\n this.autoCounter += this.ast.autonumber.step;\n return n;\n }\n\n private placeMessage(m: SeqMessage): void {\n this.y += SEQ_CONST.EVENT_GAP;\n const y = this.y;\n const cf = this.colOf.get(m.from);\n const ct = this.colOf.get(m.to);\n const self = m.from !== \"\" && m.from === m.to;\n\n let x1: number;\n let x2: number;\n\n if (m.arrow === \"found\") {\n // sender outside scope: filled circle to the left of the receiver\n const c = ct!;\n x2 = this.faceEdge(m.to, c, false);\n x1 = x2 - SEQ_CONST.LOST_LEN;\n } else if (m.arrow === \"lost\") {\n // receiver outside scope: filled circle to the right of the sender\n const c = cf!;\n x1 = this.faceEdge(m.from, c, true);\n x2 = x1 + SEQ_CONST.LOST_LEN;\n } else if (self) {\n const c = cf!;\n x1 = this.faceEdge(m.from, c, true);\n x2 = x1 + SEQ_CONST.SELF_LOOP_W;\n } else {\n const fromRight = (ct ?? 0) > (cf ?? 0);\n x1 = this.faceEdge(m.from, cf!, fromRight);\n if (m.create) {\n // a create arrow terminates on the side of the new participant's head box\n const halfW = this.headW[ct!]! / 2;\n x2 = fromRight ? this.x[ct!]! - halfW : this.x[ct!]! + halfW;\n } else {\n x2 = this.faceEdge(m.to, ct!, !fromRight, m.activateTarget ? 1 : 0);\n }\n }\n\n const row: SeqMessageRow = { message: m, y, x1, x2, self };\n const num = this.nextNumber();\n if (num !== undefined) row.number = num;\n if (self) {\n row.selfBottomY = y + SEQ_CONST.SELF_GAP;\n this.y = row.selfBottomY;\n }\n this.messages.push(row);\n this.contentRight = Math.max(this.contentRight, x1, x2);\n this.touch(cf);\n this.touch(ct);\n\n // create: pull the receiver head down to the arrival row\n if (m.create && ct !== undefined) {\n const ll = this.llById.get(m.to)!;\n ll.headY = y - SEQ_CONST.HEAD_H / 2;\n ll.axisTop = ll.headY + SEQ_CONST.HEAD_H;\n }\n // activation side-effects apply at the arrival row\n if (m.activateTarget && ct !== undefined) this.openBar(m.to);\n if (m.deactivateSource && cf !== undefined) this.closeBar(m.from);\n }\n\n private placeNote(note: SeqNote): void {\n this.y += SEQ_CONST.NOTE_GAP_BEFORE;\n const lines = note.text.split(/<br\\s*\\/?>|\\\\n/);\n const textW = lines.reduce((mx, l) => Math.max(mx, textWidth(l, LABEL_SIZE)), 0);\n const w = Math.max(SEQ_CONST.NOTE_MIN_W, Math.ceil(textW) + SEQ_CONST.NOTE_PAD * 2);\n const h = lines.length * SEQ_CONST.NOTE_LINE_H + SEQ_CONST.NOTE_PAD * 2;\n const top = this.y;\n\n const cols = note.ids.map((id) => this.colOf.get(id)).filter((c): c is number => c !== undefined);\n cols.forEach((c) => this.touch(c));\n\n let x: number;\n let boxW = w;\n if (note.placement === \"over\" && cols.length >= 2) {\n const a = this.x[Math.min(...cols)]!;\n const b = this.x[Math.max(...cols)]!;\n const span = b - a + this.headW[Math.min(...cols)]! / 2 + this.headW[Math.max(...cols)]! / 2;\n boxW = Math.max(w, span);\n x = (a + b) / 2 - boxW / 2;\n } else if (note.placement === \"left\" && cols.length) {\n x = this.x[cols[0]!]! - SEQ_CONST.NOTE_SIDE_GAP - w;\n } else if (note.placement === \"right\" && cols.length) {\n x = this.x[cols[0]!]! + SEQ_CONST.NOTE_SIDE_GAP;\n } else {\n const c = cols[0] ?? 0;\n x = this.x[c]! - w / 2;\n }\n\n this.notes.push({ note, x, y: top, width: boxW, height: h });\n this.noteRight(x, boxW);\n this.y = top + h;\n }\n\n private placeRef(ids: string[], text: string): void {\n this.y += SEQ_CONST.REF_GAP_BEFORE;\n const cols = ids.map((id) => this.colOf.get(id)).filter((c): c is number => c !== undefined);\n cols.forEach((c) => this.touch(c));\n const minC = cols.length ? Math.min(...cols) : 0;\n const maxC = cols.length ? Math.max(...cols) : 0;\n const left = this.x[minC]! - SEQ_CONST.FRAG_PAD_X;\n const right = this.x[maxC]! + SEQ_CONST.FRAG_PAD_X;\n const top = this.y;\n this.refs.push({ text, x: left, y: top, width: right - left, height: SEQ_CONST.REF_H });\n this.noteRight(left, right - left);\n this.y = top + SEQ_CONST.REF_H;\n }\n\n private placeInvariant(id: string, text: string): void {\n this.y += SEQ_CONST.INV_GAP_BEFORE;\n const col = this.colOf.get(id);\n this.touch(col);\n const w = Math.ceil(textWidth(text, LABEL_SIZE)) + SEQ_CONST.INV_PAD * 2;\n const cx = col !== undefined ? this.x[col]! : SEQ_CONST.LEFT_MARGIN;\n const top = this.y;\n this.invariants.push({ text, cx, y: top, width: w, height: SEQ_CONST.INV_H });\n this.noteRight(cx - w / 2, w);\n this.y = top + SEQ_CONST.INV_H;\n }\n\n private placeDestroy(id: string): void {\n this.y += SEQ_CONST.EVENT_GAP / 2;\n const ll = this.llById.get(id);\n const col = this.colOf.get(id);\n if (ll && col !== undefined) {\n ll.destroyed = true;\n ll.axisBottom = this.y;\n this.destroys.push({ x: this.x[col]!, y: this.y });\n this.touch(col);\n }\n }\n\n private placeFragment(\n op: SeqFragmentFrame[\"op\"],\n operands: { guard?: string; statements: SeqStatement[] }[],\n depth: number,\n messageSet?: string[],\n ): void {\n const frameTop = this.y + SEQ_CONST.FRAG_GAP_BEFORE;\n const acc: ColAcc = { min: Number.POSITIVE_INFINITY, max: Number.NEGATIVE_INFINITY };\n this.colAccStack.push(acc);\n\n const operandGeom: SeqFragmentOperandGeom[] = [];\n\n // first operand\n this.y = frameTop + SEQ_CONST.FRAG_LABEL_H + SEQ_CONST.FRAG_PAD_TOP - SEQ_CONST.EVENT_GAP;\n const firstGeom: SeqFragmentOperandGeom = {};\n if (operands[0]?.guard) firstGeom.guard = operands[0].guard;\n operandGeom.push(firstGeom);\n this.walk(operands[0]?.statements ?? [], depth + 1);\n\n // subsequent operands (else / and)\n for (let oi = 1; oi < operands.length; oi++) {\n const sepY = this.y + SEQ_CONST.FRAG_OPERAND_GAP;\n const geom: SeqFragmentOperandGeom = { sepY };\n if (operands[oi]!.guard) geom.guard = operands[oi]!.guard;\n operandGeom.push(geom);\n this.y = sepY + SEQ_CONST.FRAG_PAD_TOP - SEQ_CONST.EVENT_GAP;\n this.walk(operands[oi]!.statements, depth + 1);\n }\n\n const frameBottom = this.y + SEQ_CONST.FRAG_PAD_BOTTOM;\n this.colAccStack.pop();\n\n // resolve horizontal extent from covered columns, with depth-based inset so\n // nested frames sit strictly inside their parent.\n let minC = acc.min;\n let maxC = acc.max;\n if (!isFinite(minC)) {\n minC = 0;\n maxC = Math.max(0, this.lifelines.length - 1);\n }\n const inset = depth * SEQ_CONST.FRAG_NEST_INSET;\n let left = this.x[minC]! - SEQ_CONST.FRAG_PAD_X + inset;\n let right = this.x[maxC]! + SEQ_CONST.FRAG_PAD_X - inset;\n if (right - left < 40) {\n // keep a sane minimum width\n const mid = (left + right) / 2;\n left = mid - 20;\n right = mid + 20;\n }\n\n const frame: SeqFragmentFrame = {\n op,\n x: left,\n y: frameTop,\n width: right - left,\n height: frameBottom - frameTop,\n operands: operandGeom,\n };\n if (messageSet && messageSet.length) frame.messageSet = messageSet;\n this.fragments.push(frame);\n this.noteRight(left, right - left);\n this.y = frameBottom;\n }\n}\n\n/** Recursively flatten messages in document order (for the horizontal sizing pass). */\nfunction collectMessages(stmts: SeqStatement[]): SeqMessage[] {\n const out: SeqMessage[] = [];\n for (const s of stmts) {\n if (s.kind === \"message\") out.push(s);\n else if (s.kind === \"fragment\") {\n for (const op of s.operands) out.push(...collectMessages(op.statements));\n }\n }\n return out;\n}\n\nexport function layoutSequence(ast: SeqAst): SeqLayoutResult {\n return new SequenceLayout(ast).run();\n}\n","/**\n * UML Sequence diagram — SVG renderer.\n *\n * Spec: docs/reference/33-SEQUENCE-STANDARD.md §3, §7\n */\n\nimport type { RenderConfig } from \"../../core/types\";\nimport {\n svgRoot,\n group,\n el,\n rect,\n circle,\n line,\n path as pathEl,\n text as textEl,\n title as titleEl,\n desc,\n defs,\n polygon,\n escapeXml,\n} from \"../../core/svg\";\nimport { resolveBaseTheme, type BaseTheme } from \"../../core/theme\";\nimport { parseSequence } from \"./parser\";\nimport { layoutSequence } from \"./layout\";\nimport type {\n SeqActivationBar,\n SeqAst,\n SeqDividerBar,\n SeqFragmentFrame,\n SeqInvariantBox,\n SeqLayoutResult,\n SeqLifeline,\n SeqMessageRow,\n SeqNoteBox,\n SeqRefFrame,\n} from \"./types\";\n\nconst HEAD = \"#e8f0fb\";\nconst HEAD_STROKE = \"#5b85c0\";\n\nfunction buildCss(t: BaseTheme): string {\n return `\n.sx-seq { font-family: system-ui, -apple-system, sans-serif; }\n.sx-seq-axis { stroke: ${t.neutral}; stroke-width: 1; stroke-dasharray: 4 4; }\n.sx-seq-head rect, .sx-seq-head path { fill: ${HEAD}; stroke: ${HEAD_STROKE}; stroke-width: 1.4; }\n.sx-seq-head-name { font: 600 12.5px sans-serif; fill: ${t.text}; }\n.sx-seq-head-stereo { font: italic 10px sans-serif; fill: ${t.textMuted}; }\n.sx-seq-actor line, .sx-seq-actor circle { stroke: ${t.stroke}; stroke-width: 1.6; fill: none; stroke-linecap: round; }\n.sx-seq-actor-head { fill: ${t.bg}; }\n.sx-seq-icon { fill: ${t.bg}; stroke: ${HEAD_STROKE}; stroke-width: 1.6; }\n.sx-seq-icon-line { stroke: ${HEAD_STROKE}; stroke-width: 1.6; fill: none; stroke-linecap: round; }\n.sx-seq-icon-fill { fill: ${HEAD_STROKE}; stroke: none; }\n.sx-seq-act { fill: ${t.bg}; stroke: ${HEAD_STROKE}; stroke-width: 1.2; }\n.sx-seq-msg { stroke: ${t.stroke}; stroke-width: 1.5; fill: none; }\n.sx-seq-msg-reply { stroke: ${t.stroke}; stroke-width: 1.4; fill: none; stroke-dasharray: 6 4; }\n.sx-seq-msg-label { font: 11px sans-serif; fill: ${t.text}; }\n.sx-seq-msg-num { font: 600 10px sans-serif; fill: ${t.textMuted}; }\n.sx-seq-endpoint { fill: ${t.stroke}; }\n.sx-seq-frame { fill: none; stroke: ${t.neutral}; stroke-width: 1.2; }\n.sx-seq-frame-neg { fill: ${t.negative}; fill-opacity: 0.06; }\n.sx-seq-frame-sep { stroke: ${t.neutral}; stroke-width: 1; stroke-dasharray: 5 4; }\n.sx-seq-frame-tab { fill: ${t.fillMuted}; stroke: ${t.neutral}; stroke-width: 1.2; }\n.sx-seq-frame-op { font: 700 11px sans-serif; fill: ${t.text}; }\n.sx-seq-guard { font: italic 10.5px sans-serif; fill: ${t.textMuted}; }\n.sx-seq-ref-name { font: 600 12px sans-serif; fill: ${t.text}; }\n.sx-seq-note rect { fill: #fdf6da; stroke: #d9c97e; stroke-width: 1.1; }\n.sx-seq-note path { fill: #efe2a6; stroke: #d9c97e; stroke-width: 1.1; }\n.sx-seq-note-text { font: 11px sans-serif; fill: ${t.text}; }\n.sx-seq-div line { stroke: ${t.neutral}; stroke-width: 1; }\n.sx-seq-div rect { fill: ${t.fillMuted}; stroke: ${t.neutral}; stroke-width: 1; }\n.sx-seq-div-text { font: 600 11px sans-serif; fill: ${t.textMuted}; }\n.sx-seq-inv rect { fill: ${t.bg}; stroke: ${t.neutral}; stroke-width: 1.1; }\n.sx-seq-inv-text { font: italic 10.5px sans-serif; fill: ${t.textMuted}; }\n.sx-seq-destroy { stroke: ${t.negative}; stroke-width: 2; }\n.sx-seq-title { font: 700 16px sans-serif; fill: ${t.text}; }\n`.trim();\n}\n\nfunction markers(t: BaseTheme): string {\n return defs([\n el(\n \"marker\",\n { id: \"sx-seq-filled\", viewBox: \"0 0 12 10\", refX: 10, refY: 5, markerWidth: 11, markerHeight: 9, orient: \"auto\" },\n [el(\"polygon\", { points: \"0,0 11,5 0,10\", fill: t.stroke })],\n ),\n el(\n \"marker\",\n { id: \"sx-seq-open\", viewBox: \"0 0 12 10\", refX: 10, refY: 5, markerWidth: 12, markerHeight: 10, orient: \"auto\" },\n [el(\"polyline\", { points: \"0,0 10,5 0,10\", fill: \"none\", stroke: t.stroke, \"stroke-width\": 1.5 })],\n ),\n ]);\n}\n\nconst CHAR_W = 6.0;\n\n// ── lifelines ──────────────────────────────────────────────────\n\nfunction renderLifeline(ll: SeqLifeline): string {\n const parts: string[] = [];\n // time axis\n parts.push(line({ class: \"sx-seq-axis\", x1: ll.x, y1: ll.axisTop, x2: ll.x, y2: ll.axisBottom }));\n parts.push(renderHead(ll));\n return group({ class: \"sx-seq-lifeline\", \"data-id\": ll.participant.id, \"data-kind\": ll.participant.kind }, parts);\n}\n\nfunction renderHead(ll: SeqLifeline): string {\n const p = ll.participant;\n const cx = ll.x;\n const stereo = p.stereotype ? `«${p.stereotype}»` : null;\n\n if (p.kind === \"actor\") {\n const topY = ll.headY;\n const fig: string[] = [];\n if (stereo) {\n fig.push(textEl({ class: \"sx-seq-head-stereo\", x: cx, y: topY - 4, \"text-anchor\": \"middle\" }, stereo));\n }\n fig.push(\n circle({ class: \"sx-seq-actor-head\", cx, cy: topY + 6, r: 4.5 }),\n line({ x1: cx, y1: topY + 10, x2: cx, y2: topY + 22 }),\n line({ x1: cx - 8, y1: topY + 14, x2: cx + 8, y2: topY + 14 }),\n line({ x1: cx, y1: topY + 22, x2: cx - 7, y2: topY + 32 }),\n line({ x1: cx, y1: topY + 22, x2: cx + 7, y2: topY + 32 }),\n textEl({ class: \"sx-seq-head-name\", x: cx, y: topY + 44, \"text-anchor\": \"middle\" }, p.name),\n );\n return group({ class: \"sx-seq-actor sx-seq-head\" }, fig);\n }\n\n if (p.kind === \"boundary\" || p.kind === \"control\" || p.kind === \"entity\") {\n return renderRobustnessIcon(ll, stereo);\n }\n\n if (p.kind === \"database\") {\n const w = ll.headW;\n const h = ll.headH;\n const x = ll.headX;\n const y = ll.headY;\n const ry = 5;\n const d = `M ${x} ${y + ry} a ${w / 2} ${ry} 0 0 1 ${w} 0 v ${h - 2 * ry} a ${w / 2} ${ry} 0 0 1 ${-w} 0 Z M ${x} ${y + ry} a ${w / 2} ${ry} 0 0 0 ${w} 0`;\n return group({ class: \"sx-seq-head\" }, [\n pathEl({ d }),\n textEl({ class: \"sx-seq-head-name\", x: cx, y: y + h / 2 + 6, \"text-anchor\": \"middle\" }, p.name),\n ]);\n }\n\n const parts: string[] = [\n rect({ x: ll.headX, y: ll.headY, width: ll.headW, height: ll.headH, rx: 3, ry: 3 }),\n ];\n // collections/queue carry their kind label by default; any kind can be overridden\n // with a custom stereotype.\n const stereoText = stereo ?? (p.kind === \"collections\" || p.kind === \"queue\" ? `«${p.kind}»` : null);\n if (stereoText) {\n parts.push(\n textEl({ class: \"sx-seq-head-stereo\", x: cx, y: ll.headY + 14, \"text-anchor\": \"middle\" }, stereoText),\n );\n parts.push(\n textEl({ class: \"sx-seq-head-name\", x: cx, y: ll.headY + 28, \"text-anchor\": \"middle\" }, p.name),\n );\n } else {\n parts.push(\n textEl({ class: \"sx-seq-head-name\", x: cx, y: ll.headY + ll.headH / 2 + 5, \"text-anchor\": \"middle\" }, p.name),\n );\n }\n return group({ class: \"sx-seq-head\" }, parts);\n}\n\n/** Jacobson analysis-class icons (UML robustness): boundary / control / entity. */\nfunction renderRobustnessIcon(ll: SeqLifeline, stereo: string | null): string {\n const p = ll.participant;\n const cx = ll.x;\n const R = 11;\n const cy = ll.headY + 14;\n const parts: string[] = [];\n if (stereo) {\n parts.push(textEl({ class: \"sx-seq-head-stereo\", x: cx, y: ll.headY - 2, \"text-anchor\": \"middle\" }, stereo));\n }\n parts.push(circle({ class: \"sx-seq-icon\", cx, cy, r: R }));\n if (p.kind === \"boundary\") {\n const bx = cx - R - 9;\n parts.push(line({ class: \"sx-seq-icon-line\", x1: bx, y1: cy - R, x2: bx, y2: cy + R }));\n parts.push(line({ class: \"sx-seq-icon-line\", x1: bx, y1: cy, x2: cx - R, y2: cy }));\n } else if (p.kind === \"entity\") {\n parts.push(line({ class: \"sx-seq-icon-line\", x1: cx - R - 2, y1: cy + R + 1, x2: cx + R + 2, y2: cy + R + 1 }));\n } else {\n // control: small arrowhead nub at the top of the circle\n parts.push(\n polygon({ class: \"sx-seq-icon-fill\", points: `${cx - 2},${cy - R - 6} ${cx + 5},${cy - R - 1} ${cx - 3},${cy - R + 2}` }),\n );\n }\n parts.push(textEl({ class: \"sx-seq-head-name\", x: cx, y: ll.headY + 44, \"text-anchor\": \"middle\" }, p.name));\n return group({ class: \"sx-seq-head sx-seq-icon-head\", \"data-icon\": p.kind }, parts);\n}\n\n// ── activation bars ─────────────────────────────────────────────\n\nfunction renderActivation(a: SeqActivationBar): string {\n const h = Math.max(6, a.yBottom - a.yTop);\n return rect({\n class: \"sx-seq-act\",\n \"data-id\": a.id,\n x: a.x,\n y: a.yTop,\n width: 10,\n height: h,\n });\n}\n\n// ── messages ────────────────────────────────────────────────────\n\nfunction renderMessage(m: SeqMessageRow): string {\n const k = m.message.arrow;\n const lineClass = k === \"reply\" ? \"sx-seq-msg-reply\" : \"sx-seq-msg\";\n const markerEnd = k === \"async\" || k === \"reply\" ? \"url(#sx-seq-open)\" : \"url(#sx-seq-filled)\";\n const parts: string[] = [];\n\n if (m.self) {\n const bottom = m.selfBottomY ?? m.y + 28;\n const right = m.x2;\n const d = `M ${m.x1} ${m.y} H ${right} V ${bottom} H ${m.x1}`;\n parts.push(pathEl({ class: lineClass, d, \"marker-end\": markerEnd }));\n if (m.message.label) {\n parts.push(\n textEl(\n { class: \"sx-seq-msg-label\", x: right + 6, y: (m.y + bottom) / 2 + 3 },\n numbered(m, m.message.label),\n ),\n );\n }\n } else {\n parts.push(line({ class: lineClass, x1: m.x1, y1: m.y, x2: m.x2, y2: m.y, \"marker-end\": markerEnd }));\n // lost / found endpoint circle\n if (k === \"lost\") parts.push(circle({ class: \"sx-seq-endpoint\", cx: m.x2, cy: m.y, r: 4 }));\n if (k === \"found\") parts.push(circle({ class: \"sx-seq-endpoint\", cx: m.x1, cy: m.y, r: 4 }));\n if (m.message.label) {\n const mid = (m.x1 + m.x2) / 2;\n parts.push(\n textEl(\n { class: \"sx-seq-msg-label\", x: mid, y: m.y - 6, \"text-anchor\": \"middle\" },\n numbered(m, m.message.label),\n ),\n );\n }\n }\n\n return group(\n {\n class: \"sx-seq-message\",\n \"data-kind\": k,\n \"data-from\": m.message.from,\n \"data-to\": m.message.to,\n },\n parts,\n );\n}\n\nfunction numbered(m: SeqMessageRow, label: string): string {\n return m.number !== undefined ? `${m.number}. ${label}` : label;\n}\n\n// ── combined fragments ──────────────────────────────────────────\n\nfunction tabWidth(f: SeqFragmentFrame): number {\n return Math.max(40, f.op.length * 8 + 22);\n}\n\n/** Frame box + operand separators — drawn *behind* activation bars. */\nfunction renderFragmentBox(f: SeqFragmentFrame): string {\n const frameClass = f.op === \"neg\" ? \"sx-seq-frame sx-seq-frame-neg\" : \"sx-seq-frame\";\n const parts: string[] = [\n rect({ class: frameClass, x: f.x, y: f.y, width: f.width, height: f.height, rx: 2, ry: 2 }),\n ];\n for (const op of f.operands) {\n if (op.sepY !== undefined) {\n parts.push(line({ class: \"sx-seq-frame-sep\", x1: f.x, y1: op.sepY, x2: f.x + f.width, y2: op.sepY }));\n }\n }\n return group({ class: \"sx-seq-fragment\", \"data-op\": f.op }, parts);\n}\n\n/** Operator tab + guards — drawn *above* activation bars so labels stay readable. */\nfunction renderFragmentTab(f: SeqFragmentFrame): string {\n const tabW = tabWidth(f);\n const tabH = 18;\n const fold = 6;\n const tx = f.x;\n const ty = f.y;\n const tab = `M ${tx} ${ty} H ${tx + tabW} V ${ty + tabH - fold} L ${tx + tabW - fold} ${ty + tabH} H ${tx} Z`;\n const parts: string[] = [\n pathEl({ class: \"sx-seq-frame-tab\", d: tab }),\n textEl({ class: \"sx-seq-frame-op\", x: tx + 8, y: ty + 13 }, f.op),\n ];\n\n // ignore/consider message-name set, shown just right of the operator tab\n if (f.messageSet && f.messageSet.length) {\n parts.push(\n textEl({ class: \"sx-seq-guard\", x: tx + tabW + 8, y: ty + 13 }, `{${f.messageSet.join(\", \")}}`),\n );\n }\n\n f.operands.forEach((op, i) => {\n if (!op.guard) return;\n const gx = i === 0 ? f.x + tabW + 8 : f.x + 8;\n const gy = i === 0 ? f.y + 13 : (op.sepY ?? f.y) + 14;\n parts.push(textEl({ class: \"sx-seq-guard\", x: gx, y: gy }, `[${op.guard}]`));\n });\n\n return group({ class: \"sx-seq-fragment-tab-g\", \"data-op\": f.op }, parts);\n}\n\nfunction renderRef(r: SeqRefFrame): string {\n const tabW = 40;\n const tabH = 18;\n const fold = 6;\n const tab = `M ${r.x} ${r.y} H ${r.x + tabW} V ${r.y + tabH - fold} L ${r.x + tabW - fold} ${r.y + tabH} H ${r.x} Z`;\n return group({ class: \"sx-seq-fragment\", \"data-op\": \"ref\" }, [\n rect({ class: \"sx-seq-frame\", x: r.x, y: r.y, width: r.width, height: r.height, rx: 2, ry: 2 }),\n pathEl({ class: \"sx-seq-frame-tab\", d: tab }),\n textEl({ class: \"sx-seq-frame-op\", x: r.x + 8, y: r.y + 13 }, \"ref\"),\n textEl(\n { class: \"sx-seq-ref-name\", x: r.x + r.width / 2, y: r.y + r.height / 2 + 8, \"text-anchor\": \"middle\" },\n r.text,\n ),\n ]);\n}\n\n// ── notes / dividers / invariants ───────────────────────────────\n\nfunction renderNote(nb: SeqNoteBox): string {\n const fold = 8;\n const x = nb.x;\n const y = nb.y;\n const w = nb.width;\n const h = nb.height;\n const body = `M ${x} ${y} H ${x + w - fold} L ${x + w} ${y + fold} V ${y + h} H ${x} Z`;\n const corner = `M ${x + w - fold} ${y} V ${y + fold} H ${x + w} Z`;\n const lines = nb.note.text.split(/<br\\s*\\/?>|\\\\n/);\n const startY = y + h / 2 - ((lines.length - 1) * 15) / 2 + 4;\n const texts = lines.map((l, i) =>\n textEl({ class: \"sx-seq-note-text\", x: x + w / 2, y: startY + i * 15, \"text-anchor\": \"middle\" }, l),\n );\n return group({ class: \"sx-seq-note\" }, [pathEl({ d: body }), pathEl({ d: corner }), ...texts]);\n}\n\nfunction renderDivider(d: SeqDividerBar): string {\n const labelW = Math.max(60, d.text.length * CHAR_W + 24);\n const cx = d.width / 2;\n const parts: string[] = [\n line({ x1: 8, y1: d.y, x2: cx - labelW / 2, y2: d.y }),\n line({ x1: cx + labelW / 2, y1: d.y, x2: d.width - 8, y2: d.y }),\n rect({ x: cx - labelW / 2, y: d.y - 11, width: labelW, height: 22, rx: 4, ry: 4 }),\n textEl({ class: \"sx-seq-div-text\", x: cx, y: d.y + 4, \"text-anchor\": \"middle\" }, d.text),\n ];\n return group({ class: \"sx-seq-div\" }, parts);\n}\n\nfunction renderInvariant(iv: SeqInvariantBox): string {\n return group({ class: \"sx-seq-inv\" }, [\n rect({ x: iv.cx - iv.width / 2, y: iv.y, width: iv.width, height: iv.height, rx: iv.height / 2, ry: iv.height / 2 }),\n textEl({ class: \"sx-seq-inv-text\", x: iv.cx, y: iv.y + iv.height / 2 + 4, \"text-anchor\": \"middle\" }, `{${iv.text}}`),\n ]);\n}\n\nfunction renderDestroy(d: { x: number; y: number }): string {\n const r = 7;\n return group({ class: \"sx-seq-destroy-g\" }, [\n line({ class: \"sx-seq-destroy\", x1: d.x - r, y1: d.y - r, x2: d.x + r, y2: d.y + r }),\n line({ class: \"sx-seq-destroy\", x1: d.x - r, y1: d.y + r, x2: d.x + r, y2: d.y - r }),\n ]);\n}\n\n// ── top-level ───────────────────────────────────────────────────\n\nexport function renderSequenceLayout(layout: SeqLayoutResult, config?: RenderConfig): string {\n const t = resolveBaseTheme(config?.theme ?? \"default\");\n const children: string[] = [];\n\n const nMsg = layout.messages.length;\n const nFrag = layout.fragments.length;\n children.push(titleEl(`Sequence Diagram${layout.title ? \" — \" + layout.title : \"\"}`));\n children.push(\n desc(\n `${layout.lifelines.length} participants, ${nMsg} messages, ${nFrag} combined fragments.`,\n ),\n );\n children.push(el(\"style\", {}, buildCss(t)));\n children.push(markers(t));\n\n const titleBand = layout.title ? 32 : 0;\n if (layout.title) {\n children.push(\n textEl({ x: layout.width / 2, y: 22, class: \"sx-seq-title\", \"text-anchor\": \"middle\" }, layout.title),\n );\n }\n\n const body: string[] = [];\n // lifelines (axes + heads) underneath\n body.push(group({ class: \"sx-seq-lifelines\" }, layout.lifelines.map(renderLifeline)));\n // fragment boxes behind everything (so activation bars sit inside them)\n body.push(group({ class: \"sx-seq-frames\" }, layout.fragments.map(renderFragmentBox)));\n // activation bars over the axis and frame boxes\n body.push(group({ class: \"sx-seq-acts\" }, layout.activations.map(renderActivation)));\n // operator tabs + ref frames above the bars so their labels stay readable\n body.push(group({ class: \"sx-seq-frame-tabs\" }, layout.fragments.map(renderFragmentTab)));\n body.push(group({ class: \"sx-seq-refs\" }, layout.refs.map(renderRef)));\n // messages\n body.push(group({ class: \"sx-seq-messages\" }, layout.messages.map(renderMessage)));\n // notes / dividers / invariants / destroys on top\n body.push(group({ class: \"sx-seq-notes\" }, layout.notes.map(renderNote)));\n body.push(group({ class: \"sx-seq-divs\" }, layout.dividers.map(renderDivider)));\n body.push(group({ class: \"sx-seq-invs\" }, layout.invariants.map(renderInvariant)));\n body.push(group({ class: \"sx-seq-destroys\" }, layout.destroys.map(renderDestroy)));\n\n children.push(\n titleBand ? group({ transform: `translate(0, ${titleBand})` }, body) : group({}, body),\n );\n\n const height = layout.height + titleBand;\n return svgRoot(\n {\n class: \"sx-seq\",\n role: \"img\",\n \"aria-label\": escapeXml(layout.title ?? \"UML sequence diagram\"),\n width: layout.width,\n height,\n viewBox: `0 0 ${layout.width} ${height}`,\n \"data-diagram-type\": \"sequence\",\n },\n children,\n );\n}\n\nexport function renderSequence(textOrAst: string | SeqAst, config?: RenderConfig): string {\n const ast = typeof textOrAst === \"string\" ? parseSequence(textOrAst) : textOrAst;\n const layout = layoutSequence(ast);\n return renderSequenceLayout(layout, config);\n}\n","import type { DiagramPlugin, RenderConfig } from \"../../core/types\";\nimport { parseSequence } from \"./parser\";\nimport { renderSequence } from \"./renderer\";\n\nexport const sequence: DiagramPlugin = {\n type: \"sequence\",\n detect(text: string): boolean {\n for (const raw of text.split(/\\r?\\n/)) {\n const t = raw.trim();\n if (!t) continue;\n if (t.startsWith(\"#\") || t.startsWith(\"//\")) continue;\n // `\\b` after \"sequence\" rejects Mermaid's \"sequenceDiagram\" header.\n return /^sequence\\b/i.test(t);\n }\n return false;\n },\n parse: parseSequence,\n render(text: string, config?: RenderConfig): string {\n return renderSequence(text, config);\n },\n};\n\nexport { parseSequence, SequenceParseError } from \"./parser\";\nexport { renderSequence, renderSequenceLayout } from \"./renderer\";\nexport { layoutSequence, SEQ_CONST } from \"./layout\";\nexport type * from \"./types\";\n","/**\n * Petri net DSL parser — hand-written, line-based recursive descent.\n *\n * Spec: docs/reference/34-PETRINET-STANDARD.md §4\n */\n\nimport type {\n PetriArc,\n PetriArcType,\n PetriAst,\n PetriDirection,\n PetriPlace,\n PetriTokenStyle,\n PetriTransition,\n} from \"./types\";\n\nexport class PetriParseError extends Error {\n line?: number;\n constructor(message: string, line?: number) {\n super(line !== undefined ? `${message} (line ${line})` : message);\n this.name = \"PetriParseError\";\n this.line = line;\n }\n}\n\n// ─── Tokenizer ───────────────────────────────────────────────────\n\nconst OPENERS = ['\"', \"“\", \"「\", \"『\", \"«\"]; // \" “ 「 『 «\nconst CLOSERS = ['\"', \"”\", \"」\", \"』\", \"»\"]; // \" ” 」 』 »\n\ninterface Tok {\n text: string;\n quoted: boolean;\n}\n\nfunction tokenize(s: string): Tok[] {\n const out: Tok[] = [];\n let i = 0;\n while (i < s.length) {\n const c = s[i]!;\n if (c === \" \" || c === \"\\t\") {\n i++;\n continue;\n }\n const oi = OPENERS.indexOf(c);\n if (oi >= 0) {\n const close = CLOSERS[oi]!;\n let j = i + 1;\n let buf = \"\";\n while (j < s.length && s[j] !== close && s[j] !== '\"') {\n buf += s[j];\n j++;\n }\n out.push({ text: buf, quoted: true });\n i = j + 1;\n continue;\n }\n let j = i;\n let buf = \"\";\n while (j < s.length && s[j] !== \" \" && s[j] !== \"\\t\") {\n buf += s[j];\n j++;\n }\n out.push({ text: buf, quoted: false });\n i = j;\n }\n return out;\n}\n\n/** Glue `key: 3` / `key : 3` into `key:3` so the tokenizer yields one token. */\nfunction normalizeKeyNums(line: string): string {\n return line.replace(/([A-Za-z]+)\\s*:\\s*(-?\\d+(?:\\.\\d+)?)/g, \"$1:$2\");\n}\n\nconst DOT_RE = /^[•●・]+$/; // • ● ・\nconst ARC_RE = /^(\\S+?)\\s*(->|-o|=>|--)\\s*(\\S+)(.*)$/;\n\nfunction toInt(raw: string, what: string, line: number): number {\n if (!/^-?\\d+$/.test(raw)) {\n throw new PetriParseError(`${what} must be an integer, got \"${raw}\"`, line);\n }\n return parseInt(raw, 10);\n}\n\n// ─── Parser ──────────────────────────────────────────────────────\n\nexport function parsePetri(text: string): PetriAst {\n const rawLines = text.split(/\\r?\\n/);\n const ast: PetriAst = {\n type: \"petri\",\n direction: \"lr\",\n tokenStyle: \"auto\",\n places: [],\n transitions: [],\n arcs: [],\n fireSequence: [],\n warnings: [],\n };\n\n const placeIds = new Set<string>();\n const transIds = new Set<string>();\n let sawHeader = false;\n\n for (let ln = 0; ln < rawLines.length; ln++) {\n const rawLine = rawLines[ln]!;\n const lineNo = ln + 1;\n const trimmed = rawLine.trim();\n if (!trimmed) continue;\n if (trimmed.startsWith(\"#\") || trimmed.startsWith(\"//\")) continue;\n\n // ── header ──\n if (!sawHeader && /^petri(net)?\\b/i.test(trimmed)) {\n sawHeader = true;\n const toks = tokenize(trimmed);\n const titleTok = toks.find((t, idx) => idx > 0 && t.quoted);\n if (titleTok) ast.title = titleTok.text;\n else if (toks[1] && !toks[1].quoted) ast.title = toks.slice(1).map((t) => t.text).join(\" \");\n continue;\n }\n if (!sawHeader) {\n // tolerate a missing header keyword on the very first content line\n if (/^petri(net)?\\b/i.test(trimmed)) {\n sawHeader = true;\n continue;\n }\n }\n\n const lower = trimmed.toLowerCase();\n\n // ── directives ──\n if (lower.startsWith(\"layout:\")) {\n const v = trimmed.slice(trimmed.indexOf(\":\") + 1).trim().toLowerCase();\n if (v === \"lr\" || v === \"tb\") ast.direction = v as PetriDirection;\n else ast.warnings.push(`Unknown layout \"${v}\" (line ${lineNo}); using lr.`);\n continue;\n }\n if (lower.startsWith(\"tokens:\")) {\n const v = trimmed.slice(trimmed.indexOf(\":\") + 1).trim().toLowerCase();\n if (v === \"dots\" || v === \"count\" || v === \"auto\") ast.tokenStyle = v as PetriTokenStyle;\n else ast.warnings.push(`Unknown token style \"${v}\" (line ${lineNo}); using auto.`);\n continue;\n }\n if (lower.startsWith(\"marking:\")) {\n parseMarking(trimmed.slice(trimmed.indexOf(\":\") + 1), lineNo, ast, placeIds);\n continue;\n }\n if (lower.startsWith(\"fire:\")) {\n const ids = trimmed\n .slice(trimmed.indexOf(\":\") + 1)\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n ast.fireSequence.push(...ids);\n continue;\n }\n\n // ── place ──\n if (/^place\\b/i.test(trimmed)) {\n ast.places.push(parsePlace(trimmed, lineNo, placeIds, transIds));\n continue;\n }\n\n // ── transition ──\n if (/^transition\\b/i.test(trimmed)) {\n ast.transitions.push(parseTransition(rawLine.trim(), lineNo, placeIds, transIds));\n continue;\n }\n\n // ── arc ──\n const arcM = ARC_RE.exec(trimmed);\n if (arcM) {\n ast.arcs.push(parseArc(arcM, lineNo, placeIds, transIds));\n continue;\n }\n\n ast.warnings.push(`Unrecognized line ${lineNo}: \"${trimmed}\"`);\n }\n\n // ── post-parse validation referenced by the fire sequence ──\n for (const id of ast.fireSequence) {\n if (!transIds.has(id)) {\n throw new PetriParseError(`fire: references unknown transition \"${id}\"`);\n }\n }\n\n return ast;\n}\n\nfunction declareDup(\n id: string,\n lineNo: number,\n placeIds: Set<string>,\n transIds: Set<string>,\n): void {\n if (placeIds.has(id) || transIds.has(id)) {\n throw new PetriParseError(`duplicate node id \"${id}\"`, lineNo);\n }\n}\n\nfunction parsePlace(\n line: string,\n lineNo: number,\n placeIds: Set<string>,\n transIds: Set<string>,\n): PetriPlace {\n const toks = tokenize(normalizeKeyNums(line));\n // toks[0] === \"place\"\n const idTok = toks[1];\n if (!idTok || idTok.quoted) throw new PetriParseError(`place is missing an id`, lineNo);\n const id = idTok.text;\n declareDup(id, lineNo, placeIds, transIds);\n\n const place: PetriPlace = { id, tokens: 0, line: lineNo };\n const labelParts: string[] = [];\n\n for (let i = 2; i < toks.length; i++) {\n const t = toks[i]!;\n if (t.quoted) {\n labelParts.push(t.text);\n continue;\n }\n const txt = t.text;\n if (/^\\*\\d+$/.test(txt)) {\n place.tokens = parseInt(txt.slice(1), 10);\n } else if (DOT_RE.test(txt)) {\n place.tokens = [...txt].length;\n } else if (/^tokens:/i.test(txt)) {\n place.tokens = toInt(txt.slice(txt.indexOf(\":\") + 1), \"tokens\", lineNo);\n } else if (/^capacity:/i.test(txt)) {\n const k = toInt(txt.slice(txt.indexOf(\":\") + 1), \"capacity\", lineNo);\n if (k <= 0) throw new PetriParseError(`capacity must be a positive integer`, lineNo);\n place.capacity = k;\n } else {\n labelParts.push(txt);\n }\n }\n if (place.tokens < 0) throw new PetriParseError(`token count cannot be negative`, lineNo);\n if (labelParts.length) place.label = labelParts.join(\" \");\n placeIds.add(id);\n return place;\n}\n\nfunction parseTransition(\n line: string,\n lineNo: number,\n placeIds: Set<string>,\n transIds: Set<string>,\n): PetriTransition {\n // Extract a [guard] first (may contain spaces), then tokenize the rest.\n let guard: string | undefined;\n const stripped = line.replace(/\\[([^\\]]*)\\]/, (_m, g) => {\n guard = String(g).trim();\n return \" \";\n });\n const toks = tokenize(normalizeKeyNums(stripped));\n const idTok = toks[1];\n if (!idTok || idTok.quoted) throw new PetriParseError(`transition is missing an id`, lineNo);\n const id = idTok.text;\n declareDup(id, lineNo, placeIds, transIds);\n\n const tr: PetriTransition = { id, kind: \"immediate\", line: lineNo };\n if (guard) tr.guard = guard;\n const labelParts: string[] = [];\n\n for (let i = 2; i < toks.length; i++) {\n const t = toks[i]!;\n if (t.quoted) {\n labelParts.push(t.text);\n continue;\n }\n const txt = t.text;\n const low = txt.toLowerCase();\n if (low === \"immediate\") tr.kind = \"immediate\";\n else if (low === \"timed\") tr.kind = \"timed\";\n else if (/^rate:/i.test(txt)) {\n tr.rate = parseFloat(txt.slice(txt.indexOf(\":\") + 1));\n tr.kind = \"timed\";\n } else if (/^(prio|priority):/i.test(txt)) {\n tr.priority = toInt(txt.slice(txt.indexOf(\":\") + 1), \"priority\", lineNo);\n } else {\n labelParts.push(txt);\n }\n }\n if (labelParts.length) tr.label = labelParts.join(\" \");\n transIds.add(id);\n return tr;\n}\n\nconst ARROW_TYPE: Record<string, PetriArcType> = {\n \"->\": \"standard\",\n \"-o\": \"inhibitor\",\n \"--\": \"read\",\n \"=>\": \"reset\",\n};\n\nfunction parseArc(\n m: RegExpExecArray,\n lineNo: number,\n placeIds: Set<string>,\n transIds: Set<string>,\n): PetriArc {\n const from = m[1]!;\n const arrow = m[2]!;\n const to = m[3]!;\n const rest = m[4] ?? \"\";\n const type = ARROW_TYPE[arrow]!;\n\n const known = (id: string): \"place\" | \"transition\" | null =>\n placeIds.has(id) ? \"place\" : transIds.has(id) ? \"transition\" : null;\n const kf = known(from);\n const kt = known(to);\n if (!kf) throw new PetriParseError(`arc references unknown node \"${from}\" — declare it as a place or transition first`, lineNo);\n if (!kt) throw new PetriParseError(`arc references unknown node \"${to}\" — declare it as a place or transition first`, lineNo);\n if (kf === kt) {\n throw new PetriParseError(\n `arc connects two ${kf}s — a Petri net arc must go place→transition or transition→place`,\n lineNo,\n );\n }\n if ((type === \"inhibitor\" || type === \"reset\") && kf !== \"place\") {\n throw new PetriParseError(`${type} arcs are place→transition only`, lineNo);\n }\n\n const arc: PetriArc = { from, to, type, weight: 1, line: lineNo };\n const toks = tokenize(normalizeKeyNums(rest));\n const labelParts: string[] = [];\n for (const t of toks) {\n if (t.quoted) {\n labelParts.push(t.text);\n continue;\n }\n const txt = t.text;\n if (/^\\*\\d+$/.test(txt)) arc.weight = parseInt(txt.slice(1), 10);\n else if (/^weight:/i.test(txt)) arc.weight = toInt(txt.slice(txt.indexOf(\":\") + 1), \"weight\", lineNo);\n else labelParts.push(txt);\n }\n if (arc.weight <= 0) throw new PetriParseError(`arc weight must be a positive integer`, lineNo);\n if (labelParts.length) arc.label = labelParts.join(\" \");\n return arc;\n}\n\nfunction parseMarking(\n body: string,\n lineNo: number,\n ast: PetriAst,\n placeIds: Set<string>,\n): void {\n for (const part of body.split(\",\")) {\n const p = part.trim();\n if (!p) continue;\n const eq = p.indexOf(\"=\");\n if (eq < 0) {\n ast.warnings.push(`Bad marking entry \"${p}\" (line ${lineNo}); expected id=n.`);\n continue;\n }\n const id = p.slice(0, eq).trim();\n const n = toInt(p.slice(eq + 1).trim(), \"marking\", lineNo);\n if (!placeIds.has(id)) {\n throw new PetriParseError(`marking references unknown place \"${id}\"`, lineNo);\n }\n const place = ast.places.find((pl) => pl.id === id);\n if (place) place.tokens = n;\n }\n}\n","/**\n * Petri net layout — layered bipartite DAG + firing dynamics.\n *\n * Reuses the Sugiyama idea (cycle removal → longest-path layering → barycenter\n * ordering → coordinate assignment) in a compact, dependency-free form. The\n * bipartite structure means place/transition layers alternate naturally.\n *\n * The engine also computes the *dynamics*: it applies the `fire:` sequence to\n * the initial marking and reports which transitions are enabled in the result.\n *\n * Spec: docs/reference/34-PETRINET-STANDARD.md §5, §2.2\n */\n\nimport type {\n PetriArc,\n PetriArcGeom,\n PetriAst,\n PetriLayoutResult,\n PetriPlaceBox,\n PetriPoint,\n PetriTransitionBox,\n} from \"./types\";\n\nexport const PETRI_CONST = {\n PLACE_R: 18,\n TRANS_BAR_W: 8,\n TRANS_BAR_H: 44,\n TRANS_BOX_W: 26,\n TRANS_BOX_H: 40,\n LAYER_GAP: 70,\n RANK_GAP: 46,\n TOKEN_R: 3.5,\n TOKEN_GRID_GAP: 4,\n TOKEN_COUNT_MAX_DOTS: 4,\n ARC_WEIGHT_OFFSET: 9,\n LABEL_GAP: 6,\n ARROW_LEN: 8,\n MARGIN: 22,\n BACKEDGE_BOW: 30,\n LABEL_LINE_H: 13,\n CHAR_W: 6.2,\n} as const;\n\ntype Kind = \"place\" | \"transition\";\n\ninterface NodeGeom {\n id: string;\n kind: Kind;\n cx: number;\n cy: number;\n halfW: number;\n halfH: number;\n /** circle radius (places only) */\n r: number;\n layer: number;\n}\n\ninterface BBox {\n minX: number;\n minY: number;\n maxX: number;\n maxY: number;\n}\n\nexport function layoutPetri(ast: PetriAst): PetriLayoutResult {\n const C = PETRI_CONST;\n const dir = ast.direction;\n const warnings = [...ast.warnings];\n\n // ── node set ──\n const kindOf = new Map<string, Kind>();\n for (const p of ast.places) kindOf.set(p.id, \"place\");\n for (const t of ast.transitions) kindOf.set(t.id, \"transition\");\n const ids = [...ast.places.map((p) => p.id), ...ast.transitions.map((t) => t.id)];\n const declOrder = new Map<string, number>();\n ids.forEach((id, i) => declOrder.set(id, i));\n\n // ── layering edges (use arc.from→arc.to direction; read arcs too) ──\n interface Edge {\n from: string;\n to: string;\n reversed: boolean;\n }\n const edges: Edge[] = ast.arcs.map((a) => ({ from: a.from, to: a.to, reversed: false }));\n\n // cycle removal via DFS — edges to a node on the recursion stack are back-edges\n const adj = new Map<string, number[]>();\n ids.forEach((id) => adj.set(id, []));\n edges.forEach((e, i) => adj.get(e.from)!.push(i));\n const state = new Map<string, 0 | 1 | 2>(); // 0 unvisited,1 on-stack,2 done\n ids.forEach((id) => state.set(id, 0));\n const dfs = (u: string): void => {\n state.set(u, 1);\n for (const ei of adj.get(u)!) {\n const e = edges[ei]!;\n const s = state.get(e.to)!;\n if (s === 1) e.reversed = true; // back-edge\n else if (s === 0) dfs(e.to);\n }\n state.set(u, 2);\n };\n // start DFS from declaration order so the result is deterministic\n for (const id of ids) if (state.get(id) === 0) dfs(id);\n\n // layering adjacency with back-edges flipped\n const succ = new Map<string, string[]>();\n const indeg = new Map<string, number>();\n ids.forEach((id) => {\n succ.set(id, []);\n indeg.set(id, 0);\n });\n for (const e of edges) {\n const [from, to] = e.reversed ? [e.to, e.from] : [e.from, e.to];\n succ.get(from)!.push(to);\n indeg.set(to, indeg.get(to)! + 1);\n }\n\n // longest-path layering (Kahn topological order)\n const layer = new Map<string, number>();\n ids.forEach((id) => layer.set(id, 0));\n const queue = ids.filter((id) => indeg.get(id) === 0);\n const indegWork = new Map(indeg);\n let qi = 0;\n const topo: string[] = [];\n const q = [...queue];\n while (qi < q.length) {\n const u = q[qi++]!;\n topo.push(u);\n for (const v of succ.get(u)!) {\n layer.set(v, Math.max(layer.get(v)!, layer.get(u)! + 1));\n indegWork.set(v, indegWork.get(v)! - 1);\n if (indegWork.get(v) === 0) q.push(v);\n }\n }\n\n // ── group by layer, initial order by declaration ──\n const maxLayer = Math.max(0, ...ids.map((id) => layer.get(id)!));\n const layers: string[][] = Array.from({ length: maxLayer + 1 }, () => []);\n for (const id of ids) layers[layer.get(id)!]!.push(id);\n layers.forEach((arr) => arr.sort((a, b) => declOrder.get(a)! - declOrder.get(b)!));\n\n // ── barycenter crossing reduction (a few sweeps) ──\n const pos = new Map<string, number>();\n const reindex = (): void => layers.forEach((arr) => arr.forEach((id, i) => pos.set(id, i)));\n reindex();\n const preds = new Map<string, string[]>();\n const sucs = new Map<string, string[]>();\n ids.forEach((id) => {\n preds.set(id, []);\n sucs.set(id, []);\n });\n for (const e of edges) {\n const [from, to] = e.reversed ? [e.to, e.from] : [e.from, e.to];\n sucs.get(from)!.push(to);\n preds.get(to)!.push(from);\n }\n const bary = (id: string, neigh: Map<string, string[]>): number => {\n const ns = neigh.get(id)!;\n if (!ns.length) return pos.get(id)!;\n return ns.reduce((s, n) => s + pos.get(n)!, 0) / ns.length;\n };\n for (let sweep = 0; sweep < 4; sweep++) {\n const downward = sweep % 2 === 0;\n const range = downward\n ? [...Array(layers.length).keys()].slice(1)\n : [...Array(layers.length).keys()].slice(0, -1).reverse();\n for (const L of range) {\n const neigh = downward ? preds : sucs;\n layers[L]!.sort((a, b) => bary(a, neigh) - bary(b, neigh) || declOrder.get(a)! - declOrder.get(b)!);\n reindex();\n }\n }\n\n // ── geometry sizing ──\n const sizeOf = (id: string): { halfW: number; halfH: number; r: number } => {\n if (kindOf.get(id) === \"place\") return { halfW: C.PLACE_R, halfH: C.PLACE_R, r: C.PLACE_R };\n const tr = ast.transitions.find((t) => t.id === id)!;\n const long = tr.kind === \"timed\" ? C.TRANS_BOX_H : C.TRANS_BAR_H;\n const thin = tr.kind === \"timed\" ? C.TRANS_BOX_W : C.TRANS_BAR_W;\n // long axis is perpendicular to the flow axis\n const halfW = dir === \"lr\" ? thin / 2 : long / 2;\n const halfH = dir === \"lr\" ? long / 2 : thin / 2;\n return { halfW, halfH, r: 0 };\n };\n\n // flow extent (along layer axis) half, per layer\n const flowHalf = (id: string): number => {\n const s = sizeOf(id);\n return dir === \"lr\" ? s.halfW : s.halfH;\n };\n const crossHalf = (id: string): number => {\n const s = sizeOf(id);\n return dir === \"lr\" ? s.halfH : s.halfW;\n };\n\n const layerHalf = layers.map((arr) => Math.max(0, ...arr.map(flowHalf)));\n const slot = Math.max(0, ...ids.map(crossHalf)) * 2 + C.RANK_GAP;\n const maxCount = Math.max(1, ...layers.map((a) => a.length));\n const crossCenter = C.MARGIN + C.LABEL_LINE_H * 2 + (maxCount * slot) / 2;\n\n // flow centers\n const flowCenter: number[] = [];\n let acc = C.MARGIN + C.LABEL_LINE_H * 2;\n for (let L = 0; L < layers.length; L++) {\n acc += layerHalf[L]!;\n flowCenter[L] = acc;\n acc += layerHalf[L]! + C.LAYER_GAP;\n }\n\n const geom = new Map<string, NodeGeom>();\n layers.forEach((arr, L) => {\n const n = arr.length;\n const total = (n - 1) * slot;\n arr.forEach((id, i) => {\n const cross = crossCenter - total / 2 + i * slot;\n const flow = flowCenter[L]!;\n const cx = dir === \"lr\" ? flow : cross;\n const cy = dir === \"lr\" ? cross : flow;\n const s = sizeOf(id);\n geom.set(id, { id, kind: kindOf.get(id)!, cx, cy, halfW: s.halfW, halfH: s.halfH, r: s.r, layer: L });\n });\n });\n\n // ── dynamics: apply fire sequence, compute marking + enabled set ──\n const marking = new Map<string, number>();\n for (const p of ast.places) marking.set(p.id, p.tokens);\n const inArcs = (tid: string): PetriArc[] => ast.arcs.filter((a) => a.to === tid);\n const outArcs = (tid: string): PetriArc[] => ast.arcs.filter((a) => a.from === tid);\n const capOf = (pid: string): number | undefined => ast.places.find((p) => p.id === pid)?.capacity;\n\n const isEnabled = (tid: string, M: Map<string, number>): boolean => {\n for (const a of inArcs(tid)) {\n const have = M.get(a.from) ?? 0;\n if (a.type === \"standard\" || a.type === \"read\") {\n if (have < a.weight) return false;\n } else if (a.type === \"inhibitor\") {\n if (have >= a.weight) return false;\n }\n // reset arcs impose no precondition\n }\n for (const a of outArcs(tid)) {\n const cap = capOf(a.to);\n if (cap !== undefined && (M.get(a.to) ?? 0) + a.weight > cap) return false;\n }\n return true;\n };\n const applyFire = (tid: string, M: Map<string, number>): void => {\n for (const a of inArcs(tid)) {\n if (a.type === \"standard\") M.set(a.from, (M.get(a.from) ?? 0) - a.weight);\n else if (a.type === \"reset\") M.set(a.from, 0);\n }\n for (const a of outArcs(tid)) M.set(a.to, (M.get(a.to) ?? 0) + a.weight);\n };\n ast.fireSequence.forEach((tid, i) => {\n if (isEnabled(tid, marking)) applyFire(tid, marking);\n else warnings.push(`fire step ${i + 1}: transition \"${tid}\" is not enabled in the current marking; skipped.`);\n });\n\n const producers = (pid: string): number =>\n ast.arcs.filter((a) => a.to === pid && a.type === \"standard\").length;\n const enabledIds: string[] = [];\n const deadIds = new Set<string>();\n for (const tr of ast.transitions) {\n if (isEnabled(tr.id, marking)) {\n enabledIds.push(tr.id);\n continue;\n }\n // dead heuristic: a required input from a producer-less place that can't satisfy the weight\n const dead = inArcs(tr.id).some(\n (a) =>\n (a.type === \"standard\" || a.type === \"read\") &&\n (marking.get(a.from) ?? 0) < a.weight &&\n producers(a.from) === 0,\n );\n if (dead) deadIds.add(tr.id);\n }\n\n // ── arc geometry ──\n const boundary = (g: NodeGeom, dx: number, dy: number): PetriPoint => {\n const len = Math.hypot(dx, dy) || 1;\n const ux = dx / len;\n const uy = dy / len;\n if (g.kind === \"place\") return { x: g.cx + ux * g.r, y: g.cy + uy * g.r };\n const tx = ux !== 0 ? g.halfW / Math.abs(ux) : Infinity;\n const ty = uy !== 0 ? g.halfH / Math.abs(uy) : Infinity;\n const t = Math.min(tx, ty);\n return { x: g.cx + ux * t, y: g.cy + uy * t };\n };\n\n const bandMaxCross = Math.max(...[...geom.values()].map((g) => (dir === \"lr\" ? g.cy + g.halfH : g.cx + g.halfW)));\n\n const arcGeoms: PetriArcGeom[] = ast.arcs.map((a, i) => {\n const A = geom.get(a.from)!;\n const B = geom.get(a.to)!;\n const reversed = edges[i]!.reversed;\n let points: PetriPoint[];\n if (!reversed) {\n const pA = boundary(A, B.cx - A.cx, B.cy - A.cy);\n const pB = boundary(B, A.cx - B.cx, A.cy - B.cy);\n points = [pA, pB];\n } else {\n // back-edge: bow around the outer side of the band\n if (dir === \"lr\") {\n const pA = boundary(A, 0, 1);\n const pB = boundary(B, 0, 1);\n const bowY = bandMaxCross + C.BACKEDGE_BOW;\n points = [pA, { x: pA.x, y: bowY }, { x: pB.x, y: bowY }, pB];\n } else {\n const pA = boundary(A, 1, 0);\n const pB = boundary(B, 1, 0);\n const bowX = bandMaxCross + C.BACKEDGE_BOW;\n points = [pA, { x: bowX, y: pA.y }, { x: bowX, y: pB.y }, pB];\n }\n }\n // weight label anchor: arc midpoint, offset perpendicular\n const p0 = points[0]!;\n const p1 = points[points.length - 1]!;\n const mx = (p0.x + p1.x) / 2;\n const my = (p0.y + p1.y) / 2;\n const ddx = p1.x - p0.x;\n const ddy = p1.y - p0.y;\n const dl = Math.hypot(ddx, ddy) || 1;\n const labelX = mx - (ddy / dl) * C.ARC_WEIGHT_OFFSET;\n const labelY = my + (ddx / dl) * C.ARC_WEIGHT_OFFSET;\n return { arc: a, type: a.type, weight: a.weight, points, reversed, labelX, labelY };\n });\n\n // ── place / transition boxes ──\n const hasIncoming = (pid: string): boolean => ast.arcs.some((a) => a.to === pid);\n const hasOutgoing = (pid: string): boolean => ast.arcs.some((a) => a.from === pid);\n\n const placeBoxes: PetriPlaceBox[] = ast.places.map((p) => {\n const g = geom.get(p.id)!;\n return {\n place: p,\n cx: g.cx,\n cy: g.cy,\n r: g.r,\n tokens: marking.get(p.id) ?? 0,\n isSource: !hasIncoming(p.id),\n isSink: !hasOutgoing(p.id),\n };\n });\n const transBoxes: PetriTransitionBox[] = ast.transitions.map((t) => {\n const g = geom.get(t.id)!;\n return {\n transition: t,\n cx: g.cx,\n cy: g.cy,\n w: g.halfW * 2,\n h: g.halfH * 2,\n enabled: enabledIds.includes(t.id),\n dead: deadIds.has(t.id),\n };\n });\n\n // ── bounding box (nodes + labels + arcs) ──\n const bb: BBox = { minX: Infinity, minY: Infinity, maxX: -Infinity, maxY: -Infinity };\n const addBox = (x0: number, y0: number, x1: number, y1: number): void => {\n bb.minX = Math.min(bb.minX, x0, x1);\n bb.minY = Math.min(bb.minY, y0, y1);\n bb.maxX = Math.max(bb.maxX, x0, x1);\n bb.maxY = Math.max(bb.maxY, y0, y1);\n };\n const addPt = (p: PetriPoint): void => addBox(p.x, p.y, p.x, p.y);\n const labelW = (s?: string): number => (s ? s.length * C.CHAR_W : 0);\n\n for (const pb of placeBoxes) {\n addBox(pb.cx - pb.r, pb.cy - pb.r, pb.cx + pb.r, pb.cy + pb.r);\n const lw = Math.max(labelW(pb.place.id), labelW(pb.place.label)) / 2;\n addBox(pb.cx - lw, pb.cy - pb.r - C.LABEL_LINE_H * 2, pb.cx + lw, pb.cy);\n if (pb.place.capacity !== undefined) addBox(pb.cx, pb.cy + pb.r, pb.cx + 24, pb.cy + pb.r + C.LABEL_LINE_H);\n }\n for (const tb of transBoxes) {\n addBox(tb.cx - tb.w / 2, tb.cy - tb.h / 2, tb.cx + tb.w / 2, tb.cy + tb.h / 2);\n const lw = Math.max(labelW(tb.transition.id), labelW(tb.transition.label)) / 2;\n addBox(tb.cx - lw, tb.cy - tb.h / 2 - C.LABEL_LINE_H * 2, tb.cx + lw, tb.cy);\n }\n for (const ag of arcGeoms) {\n ag.points.forEach(addPt);\n if (ag.weight > 1) addBox(ag.labelX - 6, ag.labelY - 8, ag.labelX + 6, ag.labelY + 4);\n }\n\n // normalize so top-left content sits at MARGIN\n const dx = C.MARGIN - bb.minX;\n const dy = C.MARGIN - bb.minY;\n const shift = (p: PetriPoint): PetriPoint => ({ x: p.x + dx, y: p.y + dy });\n placeBoxes.forEach((pb) => {\n pb.cx += dx;\n pb.cy += dy;\n });\n transBoxes.forEach((tb) => {\n tb.cx += dx;\n tb.cy += dy;\n });\n arcGeoms.forEach((ag) => {\n ag.points = ag.points.map(shift);\n ag.labelX += dx;\n ag.labelY += dy;\n });\n\n const width = bb.maxX - bb.minX + 2 * C.MARGIN;\n const height = bb.maxY - bb.minY + 2 * C.MARGIN;\n\n // ── structural subclass detection ──\n const subclass = detectSubclass(ast);\n\n return {\n width: Math.round(width),\n height: Math.round(height),\n title: ast.title,\n direction: dir,\n places: placeBoxes,\n transitions: transBoxes,\n arcs: arcGeoms,\n subclass,\n enabledIds,\n warnings,\n ast,\n };\n}\n\nfunction detectSubclass(ast: PetriAst): string | undefined {\n if (!ast.transitions.length || !ast.places.length) return undefined;\n const inT = (tid: string) => ast.arcs.filter((a) => a.to === tid).length;\n const outT = (tid: string) => ast.arcs.filter((a) => a.from === tid).length;\n const inP = (pid: string) => ast.arcs.filter((a) => a.to === pid).length;\n const outP = (pid: string) => ast.arcs.filter((a) => a.from === pid).length;\n\n const stateMachine = ast.transitions.every((t) => inT(t.id) === 1 && outT(t.id) === 1);\n const markedGraph = ast.places.every((p) => inP(p.id) === 1 && outP(p.id) === 1);\n const sources = ast.places.filter((p) => inP(p.id) === 0);\n const sinks = ast.places.filter((p) => outP(p.id) === 0);\n const workflowNet = sources.length === 1 && sinks.length === 1;\n\n const tags: string[] = [];\n if (stateMachine) tags.push(\"state machine\");\n if (markedGraph) tags.push(\"marked graph\");\n if (workflowNet) tags.push(\"workflow net\");\n return tags.length ? tags.join(\", \") : undefined;\n}\n","/**\n * Petri net — SVG renderer.\n *\n * Spec: docs/reference/34-PETRINET-STANDARD.md §3, §6, §8\n */\n\nimport type { RenderConfig } from \"../../core/types\";\nimport {\n svgRoot,\n group,\n el,\n rect,\n circle,\n path as pathEl,\n text as textEl,\n title as titleEl,\n desc,\n defs,\n polygon,\n escapeXml,\n} from \"../../core/svg\";\nimport { resolvePetriTheme, type PetriTokens, type ResolvedTheme } from \"../../core/theme\";\nimport { parsePetri } from \"./parser\";\nimport { layoutPetri, PETRI_CONST as C } from \"./layout\";\nimport type {\n PetriArcGeom,\n PetriAst,\n PetriLayoutResult,\n PetriPlaceBox,\n PetriPoint,\n PetriTransitionBox,\n} from \"./types\";\n\ntype Theme = ResolvedTheme<PetriTokens>;\n\nfunction buildCss(t: Theme): string {\n return `\n.sx-petri { font-family: system-ui, -apple-system, sans-serif; }\n.sx-petri-place { fill: ${t.placeFill}; stroke: ${t.placeStroke}; stroke-width: 2; }\n.sx-petri-place-cap { stroke-dasharray: 4 3; }\n.sx-petri-token { fill: ${t.tokenFill}; stroke: none; }\n.sx-petri-token-num { font: 600 11px sans-serif; fill: ${t.tokenFill}; }\n.sx-petri-bar { fill: ${t.transitionBarFill}; stroke: ${t.transitionStroke}; stroke-width: 2; }\n.sx-petri-box { fill: ${t.transitionBoxFill}; stroke: ${t.transitionStroke}; stroke-width: 2; }\n.sx-petri-enabled { fill: ${t.enabledFill}; stroke: ${t.enabledStroke}; stroke-width: 3; }\n.sx-petri-dead .sx-petri-bar, .sx-petri-dead .sx-petri-box { stroke: ${t.deadStroke}; }\n.sx-petri-dead { opacity: 0.7; }\n.sx-petri-label { font: 12px sans-serif; fill: ${t.text}; }\n.sx-petri-sublabel { font: italic 10px sans-serif; fill: ${t.textMuted}; }\n.sx-petri-cap { font: 9px sans-serif; fill: ${t.textMuted}; }\n.sx-petri-rate { font: italic 9px sans-serif; fill: ${t.textMuted}; }\n.sx-petri-arc { stroke: ${t.arcStroke}; stroke-width: 2; fill: none; }\n.sx-petri-arc-inhibitor, .sx-petri-arc-reset { stroke: ${t.inhibitorStroke}; }\n.sx-petri-inhibitor-dot { fill: ${t.placeFill}; stroke: ${t.inhibitorStroke}; stroke-width: 2; }\n.sx-petri-weight { font: 600 9px sans-serif; fill: ${t.weightLabel}; }\n.sx-petri-title { font: 700 16px sans-serif; fill: ${t.text}; }\n`.trim();\n}\n\nfunction markers(t: Theme): string {\n return defs([\n el(\n \"marker\",\n { id: \"sx-petri-head\", viewBox: \"0 0 10 10\", refX: 9, refY: 5, markerWidth: 8, markerHeight: 8, orient: \"auto-start-reverse\" },\n [polygon({ points: \"0,0 9,5 0,10\", fill: t.arcStroke })],\n ),\n el(\n \"marker\",\n { id: \"sx-petri-head-reset\", viewBox: \"0 0 16 10\", refX: 15, refY: 5, markerWidth: 13, markerHeight: 9, orient: \"auto-start-reverse\" },\n [\n polygon({ points: \"0,0 7,5 0,10\", fill: t.inhibitorStroke }),\n polygon({ points: \"7,0 14,5 7,10\", fill: t.inhibitorStroke }),\n ],\n ),\n ]);\n}\n\n// ── token dots ──────────────────────────────────────────────────\n\nfunction tokenPositions(n: number): PetriPoint[] {\n const d = C.TOKEN_R + 2.2;\n switch (n) {\n case 1:\n return [{ x: 0, y: 0 }];\n case 2:\n return [\n { x: -d, y: 0 },\n { x: d, y: 0 },\n ];\n case 3:\n return [\n { x: 0, y: -d },\n { x: -d, y: d },\n { x: d, y: d },\n ];\n default:\n return [\n { x: -d, y: -d },\n { x: d, y: -d },\n { x: -d, y: d },\n { x: d, y: d },\n ];\n }\n}\n\nfunction renderTokens(pb: PetriPlaceBox, style: PetriAst[\"tokenStyle\"]): string {\n const n = pb.tokens;\n if (n <= 0) return \"\";\n const asDots = style !== \"count\" && n <= C.TOKEN_COUNT_MAX_DOTS;\n if (asDots) {\n return tokenPositions(n)\n .map((p) => circle({ class: \"sx-petri-token\", cx: pb.cx + p.x, cy: pb.cy + p.y, r: C.TOKEN_R }))\n .join(\"\");\n }\n return textEl(\n { class: \"sx-petri-token-num\", x: pb.cx, y: pb.cy + 4, \"text-anchor\": \"middle\" },\n String(n),\n );\n}\n\n// ── places ──────────────────────────────────────────────────────\n\nfunction renderPlace(pb: PetriPlaceBox, style: PetriAst[\"tokenStyle\"]): string {\n const cls = pb.place.capacity !== undefined ? \"sx-petri-place sx-petri-place-cap\" : \"sx-petri-place\";\n const parts: string[] = [circle({ class: cls, cx: pb.cx, cy: pb.cy, r: pb.r })];\n parts.push(renderTokens(pb, style));\n // id (+ optional human label) above the circle\n const labelY = pb.cy - pb.r - C.LABEL_GAP;\n parts.push(textEl({ class: \"sx-petri-label\", x: pb.cx, y: labelY, \"text-anchor\": \"middle\" }, pb.place.id));\n if (pb.place.label) {\n parts.push(\n textEl({ class: \"sx-petri-sublabel\", x: pb.cx, y: labelY - C.LABEL_LINE_H, \"text-anchor\": \"middle\" }, pb.place.label),\n );\n }\n if (pb.place.capacity !== undefined) {\n parts.push(\n textEl({ class: \"sx-petri-cap\", x: pb.cx + pb.r + 3, y: pb.cy + pb.r + 9 }, `K=${pb.place.capacity}`),\n );\n }\n const attrs: Record<string, string | number | undefined> = {\n class: \"sx-petri-place-g\",\n \"data-id\": pb.place.id,\n \"data-tokens\": pb.tokens,\n };\n if (pb.place.capacity !== undefined) attrs[\"data-capacity\"] = pb.place.capacity;\n if (pb.isSource) attrs[\"data-source\"] = \"true\";\n if (pb.isSink) attrs[\"data-sink\"] = \"true\";\n return group(attrs, parts);\n}\n\n// ── transitions ─────────────────────────────────────────────────\n\nfunction renderTransition(tb: PetriTransitionBox): string {\n const x = tb.cx - tb.w / 2;\n const y = tb.cy - tb.h / 2;\n const parts: string[] = [];\n if (tb.enabled) {\n parts.push(\n rect({ class: \"sx-petri-enabled\", x: x - 4, y: y - 4, width: tb.w + 8, height: tb.h + 8, rx: 4, ry: 4 }),\n );\n }\n const shapeClass = tb.transition.kind === \"timed\" ? \"sx-petri-box\" : \"sx-petri-bar\";\n parts.push(rect({ class: shapeClass, x, y, width: tb.w, height: tb.h, rx: 1, ry: 1 }));\n\n // id above the shape\n const labelY = y - C.LABEL_GAP;\n parts.push(textEl({ class: \"sx-petri-label\", x: tb.cx, y: labelY, \"text-anchor\": \"middle\" }, tb.transition.id));\n if (tb.transition.label) {\n parts.push(\n textEl({ class: \"sx-petri-sublabel\", x: tb.cx, y: labelY - C.LABEL_LINE_H, \"text-anchor\": \"middle\" }, tb.transition.label),\n );\n }\n if (tb.transition.kind === \"timed\" && tb.transition.rate !== undefined) {\n parts.push(textEl({ class: \"sx-petri-rate\", x: tb.cx, y: y + tb.h + 10, \"text-anchor\": \"middle\" }, `λ=${tb.transition.rate}`));\n }\n if (tb.transition.guard) {\n parts.push(textEl({ class: \"sx-petri-rate\", x: tb.cx + tb.w / 2 + 4, y: tb.cy + 3 }, `[${tb.transition.guard}]`));\n }\n return group(\n {\n class: tb.dead ? \"sx-petri-trans-g sx-petri-dead\" : \"sx-petri-trans-g\",\n \"data-id\": tb.transition.id,\n \"data-kind\": tb.transition.kind,\n \"data-enabled\": tb.enabled ? \"true\" : \"false\",\n },\n parts,\n );\n}\n\n// ── arcs ─────────────────────────────────────────────────────────\n\nfunction arcPath(ag: PetriArcGeom): string {\n const p = ag.points;\n if (p.length === 4) {\n return `M ${p[0]!.x} ${p[0]!.y} C ${p[1]!.x} ${p[1]!.y} ${p[2]!.x} ${p[2]!.y} ${p[3]!.x} ${p[3]!.y}`;\n }\n return `M ${p[0]!.x} ${p[0]!.y} L ${p[p.length - 1]!.x} ${p[p.length - 1]!.y}`;\n}\n\nfunction renderArc(ag: PetriArcGeom): string {\n const parts: string[] = [];\n let cls = \"sx-petri-arc\";\n let markerEnd: string | undefined;\n if (ag.type === \"standard\") {\n markerEnd = \"url(#sx-petri-head)\";\n } else if (ag.type === \"reset\") {\n cls += \" sx-petri-arc-reset\";\n markerEnd = \"url(#sx-petri-head-reset)\";\n } else if (ag.type === \"inhibitor\") {\n cls += \" sx-petri-arc-inhibitor\";\n } // read: no head, base class\n\n parts.push(pathEl({ class: cls, d: arcPath(ag), ...(markerEnd ? { \"marker-end\": markerEnd } : {}) }));\n\n // inhibitor: hollow circle at the transition end\n if (ag.type === \"inhibitor\") {\n const pts = ag.points;\n const last = pts[pts.length - 1]!;\n const prev = pts[pts.length - 2]!;\n const dx = last.x - prev.x;\n const dy = last.y - prev.y;\n const len = Math.hypot(dx, dy) || 1;\n const r = 4;\n const cx = last.x - (dx / len) * r;\n const cy = last.y - (dy / len) * r;\n parts.push(circle({ class: \"sx-petri-inhibitor-dot\", cx, cy, r }));\n }\n\n if (ag.weight > 1) {\n parts.push(\n textEl({ class: \"sx-petri-weight\", x: ag.labelX, y: ag.labelY + 3, \"text-anchor\": \"middle\" }, String(ag.weight)),\n );\n }\n return group(\n { class: \"sx-petri-arc-g\", \"data-from\": ag.arc.from, \"data-to\": ag.arc.to, \"data-type\": ag.type, \"data-weight\": ag.weight },\n parts,\n );\n}\n\n// ── top-level ────────────────────────────────────────────────────\n\nexport function renderPetriLayout(layout: PetriLayoutResult, config?: RenderConfig): string {\n const t = resolvePetriTheme(config?.theme ?? \"default\");\n const children: string[] = [];\n\n const marking = layout.places\n .filter((p) => p.tokens > 0)\n .map((p) => `${p.place.id}:${p.tokens}`)\n .join(\", \");\n const descParts = [\n `${layout.places.length} places, ${layout.transitions.length} transitions, ${layout.arcs.length} arcs.`,\n marking ? `Marking {${marking}}.` : \"Empty marking.\",\n layout.enabledIds.length ? `Enabled: ${layout.enabledIds.join(\", \")}.` : \"No enabled transitions.\",\n layout.subclass ? `Class: ${layout.subclass}.` : \"\",\n ].filter(Boolean);\n\n children.push(titleEl(`Petri net${layout.title ? \" — \" + layout.title : \"\"}`));\n children.push(desc(descParts.join(\" \")));\n children.push(el(\"style\", {}, buildCss(t)));\n children.push(markers(t));\n\n const titleBand = layout.title ? 32 : 0;\n if (layout.title) {\n children.push(textEl({ x: layout.width / 2, y: 22, class: \"sx-petri-title\", \"text-anchor\": \"middle\" }, layout.title));\n }\n\n const body: string[] = [];\n body.push(group({ class: \"sx-petri-arcs\" }, layout.arcs.map(renderArc)));\n body.push(group({ class: \"sx-petri-places\" }, layout.places.map((p) => renderPlace(p, layout.ast.tokenStyle))));\n body.push(group({ class: \"sx-petri-transitions\" }, layout.transitions.map(renderTransition)));\n\n children.push(titleBand ? group({ transform: `translate(0, ${titleBand})` }, body) : group({}, body));\n\n const height = layout.height + titleBand;\n return svgRoot(\n {\n class: \"sx-petri\",\n role: \"img\",\n \"aria-label\": escapeXml(layout.title ?? \"Petri net\"),\n width: layout.width,\n height,\n viewBox: `0 0 ${layout.width} ${height}`,\n \"data-diagram-type\": \"petri\",\n },\n children,\n );\n}\n\nexport function renderPetri(textOrAst: string | PetriAst, config?: RenderConfig): string {\n const ast = typeof textOrAst === \"string\" ? parsePetri(textOrAst) : textOrAst;\n const layout = layoutPetri(ast);\n return renderPetriLayout(layout, config);\n}\n","import type { DiagramPlugin, RenderConfig } from \"../../core/types\";\nimport { parsePetri } from \"./parser\";\nimport { renderPetri } from \"./renderer\";\n\nexport const petri: DiagramPlugin = {\n type: \"petri\",\n detect(text: string): boolean {\n for (const raw of text.split(/\\r?\\n/)) {\n const t = raw.trim();\n if (!t) continue;\n if (t.startsWith(\"#\") || t.startsWith(\"//\")) continue;\n return /^petri(net)?\\b/i.test(t);\n }\n return false;\n },\n parse: parsePetri,\n render(text: string, config?: RenderConfig): string {\n return renderPetri(text, config);\n },\n};\n\nexport { parsePetri, PetriParseError } from \"./parser\";\nexport { renderPetri, renderPetriLayout } from \"./renderer\";\nexport { layoutPetri, PETRI_CONST } from \"./layout\";\nexport type * from \"./types\";\n","/**\n * Network topology — DSL parser (text → NetworkAst).\n *\n * Hand-written, indentation-tolerant, AI-friendly. Spec: §4.\n */\n\nimport type {\n CameraType,\n DeviceKind,\n DeviceTier,\n GroupKind,\n LinkType,\n NetworkAst,\n NetworkDevice,\n NetworkGroup,\n NetworkLayoutMode,\n NetworkLink,\n} from \"./types\";\n\nexport class NetworkParseError extends Error {\n override name = \"NetworkParseError\";\n}\n\n// ─── Vocabulary ──────────────────────────────────────────────────\n\nconst DEVICE_KINDS = new Set<DeviceKind>([\n \"router\", \"switch\", \"l3switch\", \"firewall\", \"loadbalancer\", \"ap\", \"wlc\",\n \"gateway\", \"modem\", \"ids\", \"proxy\", \"vpngw\",\n \"server\", \"serverfarm\", \"pc\", \"laptop\", \"mobile\", \"ipphone\", \"printer\", \"storage\",\n \"camera\", \"nvr\", \"dvr\", \"poeswitch\", \"encoder\", \"monitor\",\n \"internet\", \"wan\", \"cloud\", \"pstn\", \"lan\",\n]);\n\n/** Aliases → canonical device kind. */\nconst KIND_ALIASES: Record<string, DeviceKind> = {\n multilayer: \"l3switch\",\n wifi: \"ap\",\n workstation: \"pc\",\n phone: \"mobile\",\n voip: \"ipphone\",\n nas: \"storage\",\n san: \"storage\",\n servers: \"serverfarm\",\n ips: \"ids\",\n decoder: \"encoder\",\n videowall: \"monitor\",\n segment: \"lan\",\n};\n\nconst GROUP_KINDS = new Set<string>([\"site\", \"building\", \"campus\", \"rack\", \"subnet\", \"vlan\", \"zone\", \"dmz\"]);\nconst GROUP_KIND_ALIAS: Record<string, GroupKind> = { building: \"site\", campus: \"site\" };\n\nconst TIERS = new Set<DeviceTier>([\"edge\", \"core\", \"distribution\", \"access\"]);\nconst CAMERA_TYPES = new Set<CameraType>([\"fixed\", \"bullet\", \"dome\", \"ptz\", \"turret\"]);\nconst LAYOUT_MODES = new Set<NetworkLayoutMode>([\n \"tiered\", \"tree\", \"star\", \"ring\", \"bus\", \"mesh\", \"spine-leaf\", \"manual\",\n]);\n\nconst LINK_TYPE_KEYWORDS: Record<string, LinkType> = {\n copper: \"copper\", ethernet: \"copper\",\n fiber: \"fiber\", fibre: \"fiber\",\n wireless: \"wireless\", wifi: \"wireless\",\n serial: \"serial\", wan: \"serial\",\n poe: \"poe\",\n vpn: \"vpn\",\n lag: \"lag\", portchannel: \"lag\",\n};\n\nconst CONNECTORS = new Set([\"--\", \"->\", \"==\"]);\nconst SPEED_RE = /^\\d+(?:\\.\\d+)?[MGT]$/;\n\n// ─── Tokenizer ───────────────────────────────────────────────────\n\ninterface Token {\n value: string;\n /** True when the token came from a quoted string (label). */\n str: boolean;\n}\n\nconst QUOTE_RE = /\"([^\"]*)\"|「([^」]*)」|『([^』]*)』|“([^”]*)”|«([^»]*)»|'([^']*)'/g;\n\n/** Drop a trailing `#`/`//` comment that is not inside a quoted region. */\nfunction stripComment(line: string): string {\n let inQuote = false;\n let close = \"\";\n const pairs: Record<string, string> = { '\"': '\"', \"「\": \"」\", \"『\": \"』\", \"“\": \"”\", \"«\": \"»\", \"'\": \"'\" };\n for (let i = 0; i < line.length; i++) {\n const ch = line[i]!;\n if (inQuote) {\n if (ch === close) inQuote = false;\n continue;\n }\n if (pairs[ch]) {\n inQuote = true;\n close = pairs[ch]!;\n continue;\n }\n if (ch === \"#\") return line.slice(0, i);\n if (ch === \"/\" && line[i + 1] === \"/\") return line.slice(0, i);\n }\n return line;\n}\n\n/** Split a (comment-stripped) line on `;` statement separators outside quotes. */\nfunction splitStatements(line: string): string[] {\n const out: string[] = [];\n let buf = \"\";\n let inQuote = false;\n let close = \"\";\n const pairs: Record<string, string> = { '\"': '\"', \"「\": \"」\", \"『\": \"』\", \"“\": \"”\", \"«\": \"»\", \"'\": \"'\" };\n for (let i = 0; i < line.length; i++) {\n const ch = line[i]!;\n if (inQuote) {\n if (ch === close) inQuote = false;\n buf += ch;\n continue;\n }\n if (pairs[ch]) { inQuote = true; close = pairs[ch]!; buf += ch; continue; }\n if (ch === \";\") { out.push(buf); buf = \"\"; continue; }\n buf += ch;\n }\n out.push(buf);\n return out;\n}\n\nfunction tokenize(raw: string): Token[] {\n const line = stripComment(raw);\n const strings: string[] = [];\n // Mask quoted regions so connector/colon splitting never touches label text.\n const masked = line.replace(QUOTE_RE, (...m) => {\n const inner = m.slice(1, 7).find((g) => g !== undefined) ?? \"\";\n strings.push(inner);\n return ` @@${strings.length - 1}@@ `;\n });\n // Space-pad connectors so `a--b` == `a -- b`.\n const spaced = masked.replace(/(--|->|==)/g, \" $1 \");\n const out: Token[] = [];\n for (const w of spaced.split(/\\s+/)) {\n if (!w) continue;\n const sm = /^@@(\\d+)@@$/.exec(w);\n if (sm) {\n out.push({ value: strings[Number(sm[1])] ?? \"\", str: true });\n } else {\n out.push({ value: w, str: false });\n }\n }\n return out;\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────\n\nfunction levenshtein(a: string, b: string): number {\n const m = a.length, n = b.length;\n const d = Array.from({ length: m + 1 }, (_, i) => [i, ...Array(n).fill(0)]);\n for (let j = 0; j <= n; j++) d[0]![j] = j;\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n const cost = a[i - 1] === b[j - 1] ? 0 : 1;\n d[i]![j] = Math.min(d[i - 1]![j]! + 1, d[i]![j - 1]! + 1, d[i - 1]![j - 1]! + cost);\n }\n }\n return d[m]![n]!;\n}\n\nfunction nearestKind(bad: string): string | undefined {\n let best: string | undefined;\n let bestDist = Infinity;\n for (const k of [...DEVICE_KINDS, ...Object.keys(KIND_ALIASES)]) {\n const dist = levenshtein(bad.toLowerCase(), k);\n if (dist < bestDist) { bestDist = dist; best = k; }\n }\n return bestDist <= 3 ? best : undefined;\n}\n\nfunction ipToInt(ip: string): number | null {\n const parts = ip.split(\".\");\n if (parts.length !== 4) return null;\n let v = 0;\n for (const p of parts) {\n const n = Number(p);\n if (!Number.isInteger(n) || n < 0 || n > 255) return null;\n v = v * 256 + n;\n }\n return v >>> 0;\n}\n\n/** True if `ip` falls inside CIDR `net/prefix`. Null when the CIDR is unparseable. */\nfunction ipInCidr(ip: string, cidr: string): boolean | null {\n const m = /^(\\d+\\.\\d+\\.\\d+\\.\\d+)\\s*\\/\\s*(\\d+)$/.exec(cidr.trim());\n if (!m) return null;\n const netInt = ipToInt(m[1]!);\n const prefix = Number(m[2]);\n const hostInt = ipToInt(ip.split(\"/\")[0]!);\n if (netInt === null || hostInt === null || prefix < 0 || prefix > 32) return null;\n const mask = prefix === 0 ? 0 : (0xffffffff << (32 - prefix)) >>> 0;\n return (netInt & mask) === (hostInt & mask);\n}\n\nconst SWITCH_CLASS = new Set<DeviceKind>([\"switch\", \"l3switch\", \"poeswitch\"]);\n\n// ─── Parser ──────────────────────────────────────────────────────\n\nexport function parseNetwork(text: string): NetworkAst {\n const ast: NetworkAst = {\n type: \"network\",\n layout: \"tiered\",\n direction: \"tb\",\n spines: [],\n leaves: [],\n devices: [],\n links: [],\n groups: [],\n warnings: [],\n };\n\n const deviceById = new Map<string, NetworkDevice>();\n const groupById = new Map<string, NetworkGroup>();\n const groupStack: NetworkGroup[] = [];\n let headerSeen = false;\n\n const rawLines = text.split(/\\r?\\n/);\n\n const addDevice = (d: NetworkDevice, lineNo: number) => {\n if (deviceById.has(d.id)) {\n throw new NetworkParseError(`device id \"${d.id}\" already declared (line ${lineNo})`);\n }\n deviceById.set(d.id, d);\n ast.devices.push(d);\n const top = groupStack[groupStack.length - 1];\n if (top && !top.members.includes(d.id)) top.members.push(d.id);\n };\n\n const ensureDevice = (id: string, kind: DeviceKind): NetworkDevice => {\n let d = deviceById.get(id);\n if (!d) {\n d = { id, kind, groups: [] };\n deviceById.set(id, d);\n ast.devices.push(d);\n }\n return d;\n };\n\n // Parse `key:`/value attribute pairs onto a device.\n const applyAttrs = (d: NetworkDevice, toks: Token[], start: number, lineNo: number) => {\n let i = start;\n while (i < toks.length) {\n const tk = toks[i]!;\n if (tk.str) { i++; continue; }\n const key = tk.value.endsWith(\":\") ? tk.value.slice(0, -1) : null;\n if (key === null) { i++; continue; }\n const val = toks[i + 1];\n i += 2;\n if (!val) continue;\n switch (key) {\n case \"tier\":\n if (TIERS.has(val.value as DeviceTier)) d.tier = val.value as DeviceTier;\n break;\n case \"type\":\n if (CAMERA_TYPES.has(val.value as CameraType)) d.cameraType = val.value as CameraType;\n break;\n case \"ip\": d.ip = val.value; break;\n case \"model\": d.model = val.value; break;\n case \"count\": { const n = Number(val.value); if (Number.isFinite(n)) d.count = n; break; }\n case \"icon\": d.icon = val.value; break;\n case \"at\": {\n const mm = /^(-?\\d+(?:\\.\\d+)?),(-?\\d+(?:\\.\\d+)?)$/.exec(val.value);\n if (mm) d.at = { x: Number(mm[1]), y: Number(mm[2]) };\n break;\n }\n default:\n ast.warnings.push(`unknown attribute \"${key}:\" on device \"${d.id}\" (line ${lineNo})`);\n }\n }\n };\n\n const statements: Array<{ text: string; no: number }> = [];\n rawLines.forEach((raw, i) => {\n for (const seg of splitStatements(stripComment(raw))) statements.push({ text: seg, no: i + 1 });\n });\n\n for (const stmt of statements) {\n const lineNo = stmt.no;\n const toks = tokenize(stmt.text);\n if (toks.length === 0) continue;\n const t0 = toks[0]!;\n\n // ── header ──\n if (!headerSeen) {\n if (!t0.str && /^(network|topology)$/i.test(t0.value)) {\n headerSeen = true;\n if (toks[1]?.str) ast.title = toks[1]!.value;\n continue;\n }\n throw new NetworkParseError(\n `network diagram must start with \"network\" or \"topology\" (line ${lineNo})`,\n );\n }\n\n // ── group close ──\n if (toks.length === 1 && t0.value === \"}\") {\n if (groupStack.length === 0) {\n throw new NetworkParseError(`unmatched \"}\" (line ${lineNo})`);\n }\n groupStack.pop();\n continue;\n }\n\n // ── directive (key: ... at line start) ──\n if (!t0.str && t0.value.endsWith(\":\")) {\n const key = t0.value.slice(0, -1).toLowerCase();\n const rest = toks.slice(1);\n switch (key) {\n case \"layout\": {\n const v = rest[0]?.value as NetworkLayoutMode | undefined;\n if (v && LAYOUT_MODES.has(v)) ast.layout = v;\n else if (v) ast.warnings.push(`unknown layout \"${v}\" — using \"tiered\" (line ${lineNo})`);\n break;\n }\n case \"direction\": {\n const v = rest[0]?.value?.toLowerCase();\n if (v === \"tb\" || v === \"lr\") ast.direction = v;\n break;\n }\n case \"title\": if (rest[0]) ast.title = rest[0]!.value; break;\n case \"spines\": ast.spines.push(...rest.filter((r) => !r.str).map((r) => r.value)); break;\n case \"leaves\": ast.leaves.push(...rest.filter((r) => !r.str).map((r) => r.value)); break;\n case \"legend\": break; // parsed-and-ignored in v0.1\n default: ast.warnings.push(`unknown directive \"${key}:\" (line ${lineNo})`);\n }\n continue;\n }\n\n // ── link (contains a connector token) ──\n const ci = toks.findIndex((t) => !t.str && CONNECTORS.has(t.value));\n if (ci >= 0) {\n const fromT = toks[ci - 1];\n const toT = toks[ci + 1];\n if (!fromT || !toT || fromT.str || toT.str) {\n throw new NetworkParseError(`malformed link (line ${lineNo})`);\n }\n const conn = toks[ci]!.value;\n const link: NetworkLink = {\n from: fromT.value,\n to: toT.value,\n directed: conn === \"->\",\n linkType: conn === \"==\" ? \"lag\" : \"copper\",\n line: lineNo,\n };\n // spec after the target (skip an optional \":\" separator)\n let si = ci + 2;\n if (toks[si] && !toks[si]!.str && toks[si]!.value === \":\") si++;\n while (si < toks.length) {\n const tk = toks[si]!;\n if (tk.str) { link.label = tk.value; si++; continue; }\n const low = tk.value.toLowerCase();\n if (LINK_TYPE_KEYWORDS[low]) { link.linkType = LINK_TYPE_KEYWORDS[low]!; si++; continue; }\n if (low === \"trunk\" || low === \"access\") { link.mode = low; si++; continue; }\n if (SPEED_RE.test(tk.value)) { link.speed = tk.value; si++; continue; }\n if (low === \"vlan:\") {\n const v = toks[si + 1];\n if (v) {\n link.vlans = v.value.split(\",\").map((s) => Number(s.trim())).filter((n) => Number.isFinite(n));\n for (const vid of link.vlans) {\n if (vid < 1 || vid > 4094) {\n ast.warnings.push(`VLAN id ${vid} out of range 1–4094 (line ${lineNo})`);\n }\n }\n }\n si += 2; continue;\n }\n if (low === \"port:\") {\n const v = toks[si + 1];\n if (v) { const [near, far] = v.value.split(\">\"); link.portNear = near; if (far) link.portFar = far; }\n si += 2; continue;\n }\n if (low === \"ip:\") { link.ip = toks[si + 1]?.value; si += 2; continue; }\n si++;\n }\n ast.links.push(link);\n continue;\n }\n\n // ── group open (`<groupkind> id [\"label\"] {`) ──\n if (!t0.str && GROUP_KINDS.has(t0.value) && toks[toks.length - 1]!.value === \"{\") {\n const idT = toks[1];\n if (!idT || idT.str) throw new NetworkParseError(`group needs an id (line ${lineNo})`);\n const kind = (GROUP_KIND_ALIAS[t0.value] ?? t0.value) as GroupKind;\n const label = toks[2]?.str ? toks[2]!.value : undefined;\n if (groupById.has(idT.value)) {\n throw new NetworkParseError(`group id \"${idT.value}\" already declared (line ${lineNo})`);\n }\n const parent = groupStack[groupStack.length - 1];\n const g: NetworkGroup = {\n id: idT.value, kind, label, members: [], children: [], parent: parent?.id, line: lineNo,\n };\n if (parent) parent.children.push(g.id);\n groupById.set(g.id, g);\n ast.groups.push(g);\n groupStack.push(g);\n continue;\n }\n\n // ── device declaration (`<kind> id [\"label\"] attrs`) ──\n const canonKind = (KIND_ALIASES[t0.value] ?? t0.value) as DeviceKind;\n if (!t0.str && DEVICE_KINDS.has(canonKind)) {\n const idT = toks[1];\n if (!idT || idT.str) throw new NetworkParseError(`device \"${t0.value}\" needs an id (line ${lineNo})`);\n let idx = 2;\n let label: string | undefined;\n if (toks[2]?.str) { label = toks[2]!.value; idx = 3; }\n const d: NetworkDevice = { id: idT.value, kind: canonKind, label, groups: groupStack.map((g) => g.id) };\n applyAttrs(d, toks, idx, lineNo);\n addDevice(d, lineNo);\n continue;\n }\n\n // ── shorthand (`id id ... : kind attrs`) ──\n const sep = toks.findIndex((t) => !t.str && t.value === \":\");\n if (sep > 0) {\n const ids = toks.slice(0, sep);\n const kindT = toks[sep + 1];\n if (kindT && !kindT.str && ids.every((t) => !t.str)) {\n const k = (KIND_ALIASES[kindT.value] ?? kindT.value) as DeviceKind;\n if (!DEVICE_KINDS.has(k)) {\n const hint = nearestKind(kindT.value);\n throw new NetworkParseError(\n `unknown device kind \"${kindT.value}\"${hint ? ` — did you mean \"${hint}\"?` : \"\"} (line ${lineNo})`,\n );\n }\n for (const idT of ids) {\n const d: NetworkDevice = { id: idT.value, kind: k, groups: groupStack.map((g) => g.id) };\n applyAttrs(d, toks, sep + 2, lineNo);\n addDevice(d, lineNo);\n }\n continue;\n }\n }\n\n // ── lone id inside a group → membership reference ──\n if (toks.length === 1 && !t0.str && groupStack.length > 0) {\n const top = groupStack[groupStack.length - 1]!;\n if (!top.members.includes(t0.value)) top.members.push(t0.value);\n continue;\n }\n\n // ── otherwise: looks like an attempted device decl with a bad kind ──\n if (!t0.str && toks.length >= 2 && !toks[1]!.str) {\n const hint = nearestKind(t0.value);\n throw new NetworkParseError(\n `unknown device kind \"${t0.value}\"${hint ? ` — did you mean \"${hint}\"?` : \"\"} (line ${lineNo})`,\n );\n }\n throw new NetworkParseError(`cannot parse line ${lineNo}: \"${stmt.text.trim()}\"`);\n }\n\n if (groupStack.length > 0) {\n throw new NetworkParseError(`unclosed group \"${groupStack[groupStack.length - 1]!.id}\"`);\n }\n\n // ── spine-leaf: auto-declare spine/leaf devices ──\n for (const id of ast.spines) ensureDevice(id, \"l3switch\");\n for (const id of ast.leaves) ensureDevice(id, \"switch\");\n\n // ── validation: link endpoints must be declared devices ──\n for (const link of ast.links) {\n for (const end of [link.from, link.to]) {\n if (!deviceById.has(end)) {\n throw new NetworkParseError(\n `link references undeclared device \"${end}\" (line ${link.line ?? \"?\"})`,\n );\n }\n }\n // trunk endpoints should be switch-class (soft warning)\n if (link.mode === \"trunk\") {\n const a = deviceById.get(link.from)!, b = deviceById.get(link.to)!;\n if (!SWITCH_CLASS.has(a.kind) && !SWITCH_CLASS.has(b.kind)) {\n ast.warnings.push(`trunk link ${link.from}–${link.to} connects no switch-class device (line ${link.line ?? \"?\"})`);\n }\n }\n }\n\n // ── subnet membership: device ip must fall inside the subnet CIDR ──\n for (const g of ast.groups) {\n if (g.kind !== \"subnet\" || !g.label) continue;\n for (const memberId of g.members) {\n const d = deviceById.get(memberId);\n if (!d?.ip) continue;\n const inside = ipInCidr(d.ip, g.label);\n if (inside === false) {\n throw new NetworkParseError(\n `${d.id} ip ${d.ip} is not inside subnet ${g.label} (line ${d.line ?? g.line ?? \"?\"})`,\n );\n }\n }\n }\n\n return ast;\n}\n","/**\n * Network topology — device symbol catalog.\n *\n * Original line-art following the Cisco-convention silhouettes (§3, §10).\n * Each icon draws inside a box (x, y, w, h) using theme CSS classes only —\n * no inline styles (hard constraint #3). Per the EE-ICON-ROADMAP rule, this\n * catalog is local to the network diagram (no central Icon interface).\n */\n\nimport { group, rect, circle, line, path as pathEl, polygon, text as textEl } from \"../../core/svg\";\nimport type { DeviceKind, NetworkDevice } from \"./types\";\n\n// CSS classes (defined by the renderer's <style> block):\nconst BODY = \"sx-net-body\"; // main icon body: deviceFill + deviceStroke\nconst DET = \"sx-net-detail\"; // stroke detail lines (deviceStroke), no fill\nconst GLY = \"sx-net-glyph\"; // filled glyph/arrow (deviceAccent)\nconst GLYL = \"sx-net-glyph-line\"; // stroked glyph (deviceAccent), no fill\nconst ITX = \"sx-net-icontext\"; // small text inside an icon (deviceAccent)\nconst CLOUD = \"sx-net-cloud-body\"; // cloud abstraction\nconst CTX = \"sx-net-cloudtext\"; // text inside a cloud\n\ninterface Box { x: number; y: number; w: number; h: number; }\n\nconst r2 = (n: number) => Math.round(n * 100) / 100;\n\n/** A line ending in a small filled arrowhead (head colour = GLY). */\nfunction arrow(x1: number, y1: number, x2: number, y2: number, hs = 4): string {\n const ang = Math.atan2(y2 - y1, x2 - x1);\n const a1 = ang + Math.PI - 0.5;\n const a2 = ang + Math.PI + 0.5;\n const p1x = r2(x2 + hs * Math.cos(a1)), p1y = r2(y2 + hs * Math.sin(a1));\n const p2x = r2(x2 + hs * Math.cos(a2)), p2y = r2(y2 + hs * Math.sin(a2));\n return (\n line({ class: GLYL, x1: r2(x1), y1: r2(y1), x2: r2(x2), y2: r2(y2) }) +\n polygon({ class: GLY, points: `${r2(x2)},${r2(y2)} ${p1x},${p1y} ${p2x},${p2y}` })\n );\n}\n\n// ─── Infrastructure ──────────────────────────────────────────────\n\nfunction router(b: Box): string {\n const cx = b.x + b.w / 2, cy = b.y + b.h / 2;\n const rw = b.w * 0.78, rh = b.h * 0.62;\n const x = cx - rw / 2, y = cy - rh / 2;\n const parts: string[] = [\n rect({ class: BODY, x: r2(x), y: r2(y), width: r2(rw), height: r2(rh), rx: rh / 2, ry: rh / 2 }),\n ];\n // four directional arrows: two out (right), two in (left) — the router glyph\n parts.push(arrow(cx - 2, cy - rh * 0.18, x + rw - 5, cy - rh * 0.18));\n parts.push(arrow(cx + 2, cy + rh * 0.18, x + 5, cy + rh * 0.18));\n parts.push(arrow(cx + rw * 0.18, cy + 2, cx + rw * 0.18, y + rh - 4));\n parts.push(arrow(cx - rw * 0.18, cy - 2, cx - rw * 0.18, y + 4));\n return group({}, parts);\n}\n\nfunction switchBox(b: Box, glyph: \"straight\" | \"circular\"): string {\n const cx = b.x + b.w / 2, cy = b.y + b.h / 2;\n const rw = b.w * 0.86, rh = b.h * 0.5;\n const x = cx - rw / 2, y = cy - rh / 2;\n const parts: string[] = [\n rect({ class: BODY, x: r2(x), y: r2(y), width: r2(rw), height: r2(rh), rx: 3, ry: 3 }),\n ];\n if (glyph === \"circular\") {\n // two curved arrows suggesting routing\n parts.push(arrow(x + rw * 0.25, cy - rh * 0.16, x + rw * 0.75, cy - rh * 0.16));\n parts.push(arrow(x + rw * 0.75, cy + rh * 0.16, x + rw * 0.25, cy + rh * 0.16));\n parts.push(arrow(x + rw * 0.62, cy - rh * 0.16, x + rw * 0.78, cy - rh * 0.16));\n } else {\n parts.push(arrow(x + rw * 0.2, cy - rh * 0.18, x + rw * 0.8, cy - rh * 0.18));\n parts.push(arrow(x + rw * 0.8, cy + rh * 0.18, x + rw * 0.2, cy + rh * 0.18));\n }\n return group({}, parts);\n}\n\nfunction poeSwitch(b: Box): string {\n const cx = b.x + b.w / 2;\n return group({}, [switchBox(b, \"straight\"), textEl({ class: ITX, x: r2(cx), y: r2(b.y + b.h * 0.78 + 8), \"text-anchor\": \"middle\" }, \"PoE\")]);\n}\n\nfunction firewall(b: Box): string {\n const cx = b.x + b.w / 2, cy = b.y + b.h / 2;\n const rw = b.w * 0.78, rh = b.h * 0.62;\n const x = cx - rw / 2, y = cy - rh / 2;\n const parts: string[] = [rect({ class: BODY, x: r2(x), y: r2(y), width: r2(rw), height: r2(rh), rx: 2, ry: 2 })];\n const rows = 3;\n const rhh = rh / rows;\n for (let i = 1; i < rows; i++) parts.push(line({ class: DET, x1: r2(x), y1: r2(y + i * rhh), x2: r2(x + rw), y2: r2(y + i * rhh) }));\n // offset vertical mortar lines (brick courses)\n for (let i = 0; i < rows; i++) {\n const yy = y + i * rhh;\n const offset = i % 2 === 0 ? rw / 3 : rw / 6;\n for (let vx = x + offset; vx < x + rw - 2; vx += rw / 3) {\n parts.push(line({ class: DET, x1: r2(vx), y1: r2(yy), x2: r2(vx), y2: r2(yy + rhh) }));\n }\n }\n return group({}, parts);\n}\n\nfunction brickless(b: Box, glyph: string): string {\n // generic rounded box with a centered text glyph (loadbalancer, ids, proxy, modem fallback)\n const cx = b.x + b.w / 2, cy = b.y + b.h / 2;\n const rw = b.w * 0.78, rh = b.h * 0.6;\n const x = cx - rw / 2, y = cy - rh / 2;\n return group({}, [\n rect({ class: BODY, x: r2(x), y: r2(y), width: r2(rw), height: r2(rh), rx: 3, ry: 3 }),\n textEl({ class: ITX, x: r2(cx), y: r2(cy + 4), \"text-anchor\": \"middle\" }, glyph),\n ]);\n}\n\nfunction accessPoint(b: Box): string {\n const cx = b.x + b.w / 2, cy = b.y + b.h * 0.62;\n const rw = b.w * 0.5, rh = b.h * 0.34;\n const parts: string[] = [\n rect({ class: BODY, x: r2(cx - rw / 2), y: r2(cy - rh / 2), width: r2(rw), height: r2(rh), rx: rh / 2, ry: rh / 2 }),\n ];\n // radio arcs above\n for (let i = 1; i <= 2; i++) {\n const rr = i * b.w * 0.16;\n parts.push(pathEl({ class: GLYL, d: `M ${r2(cx - rr)} ${r2(cy - rh / 2 - 2)} A ${r2(rr)} ${r2(rr)} 0 0 1 ${r2(cx + rr)} ${r2(cy - rh / 2 - 2)}` }));\n }\n return group({}, parts);\n}\n\n// ─── Endpoints ───────────────────────────────────────────────────\n\nfunction server(b: Box): string {\n const cx = b.x + b.w / 2, cy = b.y + b.h / 2;\n const rw = b.w * 0.46, rh = b.h * 0.82;\n const x = cx - rw / 2, y = cy - rh / 2;\n const parts: string[] = [rect({ class: BODY, x: r2(x), y: r2(y), width: r2(rw), height: r2(rh), rx: 2, ry: 2 })];\n for (let i = 1; i <= 3; i++) parts.push(line({ class: DET, x1: r2(x + 4), y1: r2(y + i * (rh / 4)), x2: r2(x + rw - 4), y2: r2(y + i * (rh / 4)) }));\n parts.push(circle({ class: GLY, cx: r2(x + rw - 7), cy: r2(y + 6), r: 1.6 }));\n return group({}, parts);\n}\n\nfunction serverFarm(b: Box, d: NetworkDevice): string {\n const parts: string[] = [];\n const off = Math.min(6, b.w * 0.1);\n for (let i = 2; i >= 0; i--) {\n parts.push(server({ x: b.x + i * off, y: b.y - i * off * 0.5, w: b.w - 2 * off, h: b.h - off }));\n }\n if (d.count) parts.push(textEl({ class: ITX, x: r2(b.x + b.w - 6), y: r2(b.y + b.h - 2), \"text-anchor\": \"end\" }, `×${d.count}`));\n return group({}, parts);\n}\n\nfunction pc(b: Box): string {\n const cx = b.x + b.w / 2;\n const sw = b.w * 0.7, sh = b.h * 0.52;\n const sx = cx - sw / 2, sy = b.y + b.h * 0.12;\n return group({}, [\n rect({ class: BODY, x: r2(sx), y: r2(sy), width: r2(sw), height: r2(sh), rx: 2, ry: 2 }),\n rect({ class: DET, x: r2(sx + 3), y: r2(sy + 3), width: r2(sw - 6), height: r2(sh - 6), rx: 1, ry: 1, fill: \"none\" }),\n line({ class: DET, x1: r2(cx), y1: r2(sy + sh), x2: r2(cx), y2: r2(sy + sh + b.h * 0.16) }),\n line({ class: DET, x1: r2(cx - sw * 0.28), y1: r2(b.y + b.h - 2), x2: r2(cx + sw * 0.28), y2: r2(b.y + b.h - 2) }),\n ]);\n}\n\nfunction laptop(b: Box): string {\n const cx = b.x + b.w / 2;\n const sw = b.w * 0.6, sh = b.h * 0.46;\n const sx = cx - sw / 2, sy = b.y + b.h * 0.16;\n return group({}, [\n rect({ class: BODY, x: r2(sx), y: r2(sy), width: r2(sw), height: r2(sh), rx: 2, ry: 2 }),\n polygon({ class: BODY, points: `${r2(sx - sw * 0.18)},${r2(sy + sh + b.h * 0.18)} ${r2(sx + sw + sw * 0.18)},${r2(sy + sh + b.h * 0.18)} ${r2(sx + sw)},${r2(sy + sh)} ${r2(sx)},${r2(sy + sh)}` }),\n ]);\n}\n\nfunction mobile(b: Box): string {\n const cx = b.x + b.w / 2, cy = b.y + b.h / 2;\n const rw = b.w * 0.32, rh = b.h * 0.82;\n return group({}, [\n rect({ class: BODY, x: r2(cx - rw / 2), y: r2(cy - rh / 2), width: r2(rw), height: r2(rh), rx: 3, ry: 3 }),\n line({ class: DET, x1: r2(cx - rw * 0.2), y1: r2(cy + rh / 2 - 4), x2: r2(cx + rw * 0.2), y2: r2(cy + rh / 2 - 4) }),\n ]);\n}\n\nfunction ipphone(b: Box): string {\n const cx = b.x + b.w / 2, cy = b.y + b.h / 2;\n const rw = b.w * 0.6, rh = b.h * 0.6;\n const x = cx - rw / 2, y = cy - rh / 2;\n return group({}, [\n rect({ class: BODY, x: r2(x), y: r2(y), width: r2(rw), height: r2(rh * 0.7), rx: 2, ry: 2 }),\n pathEl({ class: GLYL, d: `M ${r2(x + rw * 0.2)} ${r2(y + 5)} q ${r2(rw * 0.3)} ${r2(rh * 0.5)} ${r2(rw * 0.6)} 0` }),\n ]);\n}\n\nfunction printer(b: Box): string {\n const cx = b.x + b.w / 2, cy = b.y + b.h / 2;\n const rw = b.w * 0.7, rh = b.h * 0.42;\n const x = cx - rw / 2, y = cy - rh * 0.1;\n return group({}, [\n rect({ class: DET, x: r2(x + rw * 0.18), y: r2(y - rh * 0.7), width: r2(rw * 0.64), height: r2(rh * 0.7), fill: \"none\" }),\n rect({ class: BODY, x: r2(x), y: r2(y), width: r2(rw), height: r2(rh), rx: 2, ry: 2 }),\n rect({ class: DET, x: r2(x + rw * 0.18), y: r2(y + rh - 2), width: r2(rw * 0.64), height: r2(rh * 0.5), fill: \"none\" }),\n circle({ class: GLY, cx: r2(x + rw - 7), cy: r2(y + rh / 2), r: 1.6 }),\n ]);\n}\n\nfunction storage(b: Box): string {\n const cx = b.x + b.w / 2, cy = b.y + b.h / 2;\n const rw = b.w * 0.5, rh = b.h * 0.78;\n const x = cx - rw / 2, y = cy - rh / 2;\n const ry = rw * 0.18;\n const parts: string[] = [\n pathEl({ class: BODY, d: `M ${r2(x)} ${r2(y + ry)} A ${r2(rw / 2)} ${r2(ry)} 0 0 1 ${r2(x + rw)} ${r2(y + ry)} L ${r2(x + rw)} ${r2(y + rh - ry)} A ${r2(rw / 2)} ${r2(ry)} 0 0 1 ${r2(x)} ${r2(y + rh - ry)} Z` }),\n pathEl({ class: DET, fill: \"none\", d: `M ${r2(x)} ${r2(y + ry)} A ${r2(rw / 2)} ${r2(ry)} 0 0 0 ${r2(x + rw)} ${r2(y + ry)}` }),\n ];\n return group({}, parts);\n}\n\n// ─── CCTV / security ─────────────────────────────────────────────\n\nfunction camera(b: Box, d: NetworkDevice): string {\n const t = d.cameraType ?? \"fixed\";\n const cx = b.x + b.w / 2, cy = b.y + b.h / 2;\n if (t === \"dome\" || t === \"ptz\") {\n const rr = b.w * (t === \"ptz\" ? 0.34 : 0.28);\n const parts = [\n pathEl({ class: BODY, d: `M ${r2(cx - rr)} ${r2(cy + rr * 0.2)} A ${r2(rr)} ${r2(rr)} 0 0 1 ${r2(cx + rr)} ${r2(cy + rr * 0.2)} Z` }),\n rect({ class: BODY, x: r2(cx - rr * 1.15), y: r2(cy + rr * 0.2), width: r2(rr * 2.3), height: r2(b.h * 0.12), rx: 1, ry: 1 }),\n circle({ class: GLY, cx: r2(cx), cy: r2(cy - rr * 0.15), r: r2(rr * 0.3) }),\n ];\n return group({}, parts);\n }\n if (t === \"bullet\") {\n const bw = b.w * 0.6, bh = b.h * 0.34;\n const x = cx - bw / 2, y = cy - bh / 2;\n return group({}, [\n rect({ class: BODY, x: r2(x), y: r2(y), width: r2(bw), height: r2(bh), rx: bh / 2, ry: bh / 2 }),\n circle({ class: GLY, cx: r2(x + bw - 4), cy: r2(cy), r: r2(bh * 0.28) }),\n line({ class: DET, x1: r2(cx), y1: r2(y + bh), x2: r2(cx), y2: r2(y + bh + b.h * 0.16) }),\n ]);\n }\n // fixed / turret: box body + lens\n const bw = b.w * 0.5, bh = b.h * 0.42;\n const x = cx - bw / 2, y = cy - bh / 2;\n return group({}, [\n rect({ class: BODY, x: r2(x), y: r2(y), width: r2(bw), height: r2(bh), rx: 2, ry: 2 }),\n circle({ class: GLY, cx: r2(cx), cy: r2(cy), r: r2(bh * 0.3) }),\n ]);\n}\n\nfunction recorder(b: Box, label: string): string {\n const cx = b.x + b.w / 2, cy = b.y + b.h / 2;\n const rw = b.w * 0.82, rh = b.h * 0.46;\n const x = cx - rw / 2, y = cy - rh / 2;\n return group({}, [\n rect({ class: BODY, x: r2(x), y: r2(y), width: r2(rw), height: r2(rh), rx: 2, ry: 2 }),\n circle({ class: GLY, cx: r2(x + rw * 0.22), cy: r2(y + rh * 0.32), r: 2 }),\n circle({ class: GLY, cx: r2(x + rw * 0.4), cy: r2(y + rh * 0.32), r: 2 }),\n textEl({ class: ITX, x: r2(cx), y: r2(y + rh * 0.85), \"text-anchor\": \"middle\" }, label),\n ]);\n}\n\nfunction monitor(b: Box, grid: boolean): string {\n const cx = b.x + b.w / 2;\n const sw = b.w * 0.84, sh = b.h * 0.56;\n const sx = cx - sw / 2, sy = b.y + b.h * 0.1;\n const parts: string[] = [rect({ class: BODY, x: r2(sx), y: r2(sy), width: r2(sw), height: r2(sh), rx: 2, ry: 2 })];\n if (grid) {\n parts.push(line({ class: DET, x1: r2(cx), y1: r2(sy), x2: r2(cx), y2: r2(sy + sh) }));\n parts.push(line({ class: DET, x1: r2(sx), y1: r2(sy + sh / 2), x2: r2(sx + sw), y2: r2(sy + sh / 2) }));\n }\n parts.push(line({ class: DET, x1: r2(cx), y1: r2(sy + sh), x2: r2(cx), y2: r2(sy + sh + b.h * 0.14) }));\n parts.push(line({ class: DET, x1: r2(cx - sw * 0.2), y1: r2(b.y + b.h - 2), x2: r2(cx + sw * 0.2), y2: r2(b.y + b.h - 2) }));\n return group({}, parts);\n}\n\n// ─── Clouds ──────────────────────────────────────────────────────\n\nfunction cloud(b: Box, label: string): string {\n // Symmetric cloud authored in a 200×110 design space, mapped into the box so\n // stroke width stays uniform (no non-uniform scale transform).\n const mx = (dx: number) => r2(b.x + (dx / 200) * b.w);\n const my = (dy: number) => r2(b.y + (dy / 110) * b.h);\n const d =\n `M ${mx(50)} ${my(96)} ` +\n `C ${mx(24)} ${my(96)} ${mx(24)} ${my(62)} ${mx(50)} ${my(58)} ` +\n `C ${mx(50)} ${my(30)} ${mx(94)} ${my(26)} ${mx(100)} ${my(50)} ` +\n `C ${mx(106)} ${my(26)} ${mx(150)} ${my(30)} ${mx(150)} ${my(58)} ` +\n `C ${mx(176)} ${my(62)} ${mx(176)} ${my(96)} ${mx(150)} ${my(96)} ` +\n `Z`;\n return group({}, [\n pathEl({ class: CLOUD, d }),\n textEl({ class: CTX, x: r2(b.x + b.w / 2), y: my(80), \"text-anchor\": \"middle\" }, label),\n ]);\n}\n\nfunction busBar(b: Box): string {\n const y = b.y + b.h / 2;\n return line({ class: \"sx-net-bus\", x1: r2(b.x), y1: r2(y), x2: r2(b.x + b.w), y2: r2(y) });\n}\n\n// ─── Dispatch ────────────────────────────────────────────────────\n\n/** Default icon box footprint per kind (clouds/lan are wider). */\nexport function iconSize(kind: DeviceKind): { w: number; h: number } {\n if (kind === \"internet\" || kind === \"wan\" || kind === \"cloud\" || kind === \"pstn\") return { w: 110, h: 64 };\n if (kind === \"lan\") return { w: 150, h: 24 };\n if (kind === \"serverfarm\") return { w: 74, h: 58 };\n return { w: 64, h: 48 };\n}\n\nexport function drawDeviceIcon(d: NetworkDevice, b: Box): string {\n switch (d.kind) {\n case \"router\": return router(b);\n case \"gateway\": return group({}, [router(b), textEl({ class: ITX, x: r2(b.x + b.w / 2), y: r2(b.y + b.h - 1), \"text-anchor\": \"middle\" }, \"GW\")]);\n case \"vpngw\": return group({}, [router(b), textEl({ class: ITX, x: r2(b.x + b.w / 2), y: r2(b.y + b.h - 1), \"text-anchor\": \"middle\" }, \"VPN\")]);\n case \"switch\": return switchBox(b, \"straight\");\n case \"l3switch\": return switchBox(b, \"circular\");\n case \"poeswitch\": return poeSwitch(b);\n case \"firewall\": return firewall(b);\n case \"loadbalancer\": return brickless(b, \"LB\");\n case \"ids\": return brickless(b, \"IDS\");\n case \"proxy\": return brickless(b, \"PXY\");\n case \"modem\": return brickless(b, \"MDM\");\n case \"wlc\": return brickless(b, \"WLC\");\n case \"ap\": return accessPoint(b);\n case \"server\": return server(b);\n case \"serverfarm\": return serverFarm(b, d);\n case \"pc\": return pc(b);\n case \"laptop\": return laptop(b);\n case \"mobile\": return mobile(b);\n case \"ipphone\": return ipphone(b);\n case \"printer\": return printer(b);\n case \"storage\": return storage(b);\n case \"camera\": return camera(b, d);\n case \"nvr\": return recorder(b, \"NVR\");\n case \"dvr\": return recorder(b, \"DVR\");\n case \"encoder\": return brickless(b, \"ENC\");\n case \"monitor\": return monitor(b, (d.icon === \"videowall\"));\n case \"internet\": return cloud(b, d.label ?? \"Internet\");\n case \"wan\": return cloud(b, d.label ?? \"WAN\");\n case \"pstn\": return cloud(b, d.label ?? \"PSTN\");\n case \"cloud\": return cloud(b, d.label ?? \"Cloud\");\n case \"lan\": return busBar(b);\n default: return brickless(b, \"?\");\n }\n}\n\n/** Kinds rendered as a cloud (label sits inside the shape, not below it). */\nexport function isCloudKind(kind: DeviceKind): boolean {\n return kind === \"internet\" || kind === \"wan\" || kind === \"pstn\" || kind === \"cloud\";\n}\n","/**\n * Network topology — layout engine.\n *\n * Deterministic placement across eight topology modes (§5). No randomness, so\n * golden-string e2e tests are stable. Boundary boxes are the union of member\n * geometry inflated by padding (§5.5), mirroring C4.\n */\n\nimport { iconSize, isCloudKind } from \"./symbols\";\nimport type {\n DeviceBox,\n GroupBox,\n LinkGeom,\n NetPoint,\n NetworkAst,\n NetworkDevice,\n NetworkLayoutResult,\n NetworkLink,\n TopologyClass,\n} from \"./types\";\n\nexport const NET_CONST = {\n DEVICE_W: 64,\n DEVICE_H: 48,\n TIER_BAND_GAP: 104,\n SIBLING_GAP: 44,\n RING_RADIUS_MIN: 120,\n STAR_HUB_GAP: 130,\n SPINE_LEAF_GAP: 140,\n LABEL_GAP: 6,\n LABEL_H: 15,\n SUBLABEL_H: 12,\n GROUP_PAD: 18,\n GROUP_LABEL_INSET: 12,\n GROUP_HEADER: 16,\n CHAR_W: 6.3,\n PAD: 30,\n} as const;\n\nconst ENDPOINT_KINDS = new Set([\n \"pc\", \"laptop\", \"mobile\", \"ipphone\", \"printer\", \"camera\",\n \"server\", \"serverfarm\", \"storage\", \"monitor\", \"nvr\", \"dvr\",\n]);\n\n// ─── small geometry helpers ──────────────────────────────────────\n\nfunction labelExtra(d: NetworkDevice): number {\n if (isCloudKind(d.kind)) return 0;\n let h = NET_CONST.LABEL_GAP + NET_CONST.LABEL_H;\n if (d.ip || d.model) h += NET_CONST.SUBLABEL_H;\n return h;\n}\n\nfunction labelText(d: NetworkDevice): string {\n return d.label ?? d.id;\n}\n\nfunction deviceFootprint(d: NetworkDevice): { w: number; h: number } {\n return iconSize(d.kind);\n}\n\n/** Effective bounding box including the label rendered below the icon. */\nfunction effBox(box: DeviceBox): { left: number; top: number; right: number; bottom: number } {\n const labelW = Math.max(box.w, labelText(box.device).length * NET_CONST.CHAR_W + 6);\n const half = labelW / 2;\n return {\n left: box.cx - half,\n top: box.y,\n right: box.cx + half,\n bottom: box.y + box.h + labelExtra(box.device),\n };\n}\n\n/** Point on a box boundary in the direction of (tx, ty). */\nfunction edgePoint(box: DeviceBox, tx: number, ty: number): NetPoint {\n const dx = tx - box.cx;\n const dy = ty - box.cy;\n if (dx === 0 && dy === 0) return { x: box.cx, y: box.cy };\n const hw = box.w / 2;\n const hh = box.h / 2;\n const sx = dx !== 0 ? hw / Math.abs(dx) : Infinity;\n const sy = dy !== 0 ? hh / Math.abs(dy) : Infinity;\n const s = Math.min(sx, sy);\n return { x: box.cx + dx * s, y: box.cy + dy * s };\n}\n\n// ─── banded placement (tiered + tree share this) ─────────────────\n\nfunction placeBanded(\n ast: NetworkAst,\n ranks: Map<string, number>,\n): Map<string, NetPoint> {\n const lr = ast.direction === \"lr\";\n // group device ids by rank, preserving declaration order\n const byRank = new Map<number, NetworkDevice[]>();\n for (const d of ast.devices) {\n const r = ranks.get(d.id) ?? 0;\n if (!byRank.has(r)) byRank.set(r, []);\n byRank.get(r)!.push(d);\n }\n const rankValues = [...byRank.keys()].sort((a, b) => a - b);\n\n // cross-axis size of each row = max footprint along the cross axis\n const pos = new Map<string, NetPoint>();\n // compute total cross-axis width per row to center rows\n let maxRowSpan = 0;\n const rowSpans = new Map<number, number>();\n for (const r of rankValues) {\n const devs = byRank.get(r)!;\n let span = 0;\n devs.forEach((d, i) => {\n const fp = deviceFootprint(d);\n const cross = lr ? fp.h + labelExtra(d) : Math.max(fp.w, labelText(d).length * NET_CONST.CHAR_W + 6);\n span += cross + (i > 0 ? NET_CONST.SIBLING_GAP : 0);\n });\n rowSpans.set(r, span);\n maxRowSpan = Math.max(maxRowSpan, span);\n }\n\n rankValues.forEach((r, rowIdx) => {\n const devs = byRank.get(r)!;\n const along = rowIdx * NET_CONST.TIER_BAND_GAP;\n let cursor = (maxRowSpan - rowSpans.get(r)!) / 2;\n for (const d of devs) {\n const fp = deviceFootprint(d);\n const cross = lr ? fp.h + labelExtra(d) : Math.max(fp.w, labelText(d).length * NET_CONST.CHAR_W + 6);\n const center = cursor + cross / 2;\n if (lr) pos.set(d.id, { x: along, y: center });\n else pos.set(d.id, { x: center, y: along });\n cursor += cross + NET_CONST.SIBLING_GAP;\n }\n });\n return pos;\n}\n\nfunction adjacency(devices: NetworkDevice[], links: NetworkLink[]): Map<string, Set<string>> {\n const adj = new Map<string, Set<string>>();\n for (const d of devices) adj.set(d.id, new Set());\n for (const l of links) {\n adj.get(l.from)?.add(l.to);\n adj.get(l.to)?.add(l.from);\n }\n return adj;\n}\n\nfunction tieredRanks(ast: NetworkAst, links: NetworkLink[]): Map<string, number> {\n const TIER_RANK: Record<string, number> = { edge: 1, core: 2, distribution: 3, access: 4 };\n const rank = new Map<string, number>();\n for (const d of ast.devices) {\n if (isCloudKind(d.kind)) rank.set(d.id, 0);\n else if (d.tier) rank.set(d.id, TIER_RANK[d.tier]!);\n }\n const adj = adjacency(ast.devices, links);\n // iterative relaxation for unranked devices\n for (let pass = 0; pass < ast.devices.length + 4; pass++) {\n let changed = false;\n for (const d of ast.devices) {\n if (rank.has(d.id)) continue;\n const known: number[] = [];\n for (const n of adj.get(d.id) ?? []) {\n const r = rank.get(n);\n if (r !== undefined) known.push(r);\n }\n if (known.length === 0) continue;\n const next = ENDPOINT_KINDS.has(d.kind)\n ? Math.max(...known) + 1\n : Math.min(...known) + 1;\n rank.set(d.id, next);\n changed = true;\n }\n if (!changed) break;\n }\n // fallback for isolated/unresolved devices\n const maxR = Math.max(0, ...[...rank.values()]);\n for (const d of ast.devices) {\n if (!rank.has(d.id)) rank.set(d.id, ENDPOINT_KINDS.has(d.kind) ? maxR + 1 : 2);\n }\n return rank;\n}\n\nfunction treeRanks(ast: NetworkAst, links: NetworkLink[]): Map<string, number> {\n const adj = adjacency(ast.devices, links);\n const rank = new Map<string, number>();\n // root: first cloud, else highest-degree, else first device\n let root = ast.devices.find((d) => isCloudKind(d.kind));\n if (!root) {\n let best = -1;\n for (const d of ast.devices) {\n const deg = adj.get(d.id)?.size ?? 0;\n if (deg > best) { best = deg; root = d; }\n }\n }\n if (!root) return rank;\n const queue: string[] = [root.id];\n rank.set(root.id, 0);\n while (queue.length) {\n const id = queue.shift()!;\n const r = rank.get(id)!;\n for (const n of adj.get(id) ?? []) {\n if (!rank.has(n)) { rank.set(n, r + 1); queue.push(n); }\n }\n }\n // disconnected devices → rank 0\n for (const d of ast.devices) if (!rank.has(d.id)) rank.set(d.id, 0);\n return rank;\n}\n\nfunction placeCircle(ast: NetworkAst, radiusBase: number): Map<string, NetPoint> {\n const pos = new Map<string, NetPoint>();\n const n = ast.devices.length;\n const radius = Math.max(radiusBase, (n * 56) / (2 * Math.PI));\n ast.devices.forEach((d, i) => {\n const ang = (i / Math.max(1, n)) * 2 * Math.PI - Math.PI / 2;\n pos.set(d.id, { x: radius * Math.cos(ang), y: radius * Math.sin(ang) });\n });\n return pos;\n}\n\nfunction placeStar(ast: NetworkAst, links: NetworkLink[]): Map<string, NetPoint> {\n const adj = adjacency(ast.devices, links);\n let hub = ast.devices[0];\n let best = -1;\n for (const d of ast.devices) {\n const deg = adj.get(d.id)?.size ?? 0;\n if (deg > best) { best = deg; hub = d; }\n }\n const pos = new Map<string, NetPoint>();\n if (!hub) return pos;\n pos.set(hub.id, { x: 0, y: 0 });\n const spokes = ast.devices.filter((d) => d.id !== hub!.id);\n const radius = Math.max(NET_CONST.STAR_HUB_GAP, (spokes.length * 50) / (2 * Math.PI));\n spokes.forEach((d, i) => {\n const ang = (i / Math.max(1, spokes.length)) * 2 * Math.PI - Math.PI / 2;\n pos.set(d.id, { x: radius * Math.cos(ang), y: radius * Math.sin(ang) });\n });\n return pos;\n}\n\nfunction placeBus(ast: NetworkAst): Map<string, NetPoint> {\n const pos = new Map<string, NetPoint>();\n let cursor = 0;\n for (const d of ast.devices) {\n const fp = deviceFootprint(d);\n pos.set(d.id, { x: cursor + fp.w / 2, y: 0 });\n cursor += fp.w + NET_CONST.SIBLING_GAP;\n }\n return pos;\n}\n\nfunction placeSpineLeaf(ast: NetworkAst, links: NetworkLink[]): Map<string, NetPoint> {\n const pos = new Map<string, NetPoint>();\n const spineSet = new Set(ast.spines);\n const leafSet = new Set(ast.leaves);\n const rowGap = NET_CONST.SPINE_LEAF_GAP;\n const step = NET_CONST.DEVICE_W + NET_CONST.SIBLING_GAP;\n\n const centerRow = (ids: string[], y: number) => {\n const span = (ids.length - 1) * step;\n ids.forEach((id, i) => pos.set(id, { x: i * step - span / 2, y }));\n };\n centerRow(ast.spines, 0);\n centerRow(ast.leaves, rowGap);\n\n // hosts = everything else; hang below the leaf they connect to (else sequential)\n const adj = adjacency(ast.devices, links);\n const hosts = ast.devices.filter((d) => !spineSet.has(d.id) && !leafSet.has(d.id));\n let seq = 0;\n for (const h of hosts) {\n let anchorX: number | undefined;\n for (const n of adj.get(h.id) ?? []) {\n if (leafSet.has(n)) { anchorX = pos.get(n)?.x; break; }\n }\n pos.set(h.id, { x: anchorX ?? (seq++ * step), y: rowGap * 2 });\n }\n return pos;\n}\n\nfunction placeManual(ast: NetworkAst): Map<string, NetPoint> {\n const pos = new Map<string, NetPoint>();\n let fallback = 0;\n for (const d of ast.devices) {\n if (d.at) pos.set(d.id, { x: d.at.x, y: d.at.y });\n else { pos.set(d.id, { x: fallback * 120, y: 0 }); fallback++; }\n }\n return pos;\n}\n\n// ─── spine-leaf auto-mesh links ──────────────────────────────────\n\nfunction withAutoLinks(ast: NetworkAst): NetworkLink[] {\n if (ast.layout !== \"spine-leaf\" || ast.spines.length === 0 || ast.leaves.length === 0) {\n return ast.links;\n }\n const have = new Set(ast.links.map((l) => [l.from, l.to].sort().join(\"↔\")));\n const extra: NetworkLink[] = [];\n for (const s of ast.spines) {\n for (const lf of ast.leaves) {\n const key = [s, lf].sort().join(\"↔\");\n if (!have.has(key)) {\n extra.push({ from: s, to: lf, directed: false, linkType: \"copper\", auto: true });\n have.add(key);\n }\n }\n }\n return [...ast.links, ...extra];\n}\n\n// ─── topology classification ─────────────────────────────────────\n\nfunction classify(ast: NetworkAst): TopologyClass {\n if (ast.devices.length === 2 && ast.links.length === 1) return \"point-to-point\";\n switch (ast.layout) {\n case \"star\": return \"star\";\n case \"ring\": return \"ring\";\n case \"bus\": return \"bus\";\n case \"mesh\": return \"mesh\";\n case \"spine-leaf\": return \"spine-leaf\";\n case \"tree\": return \"tree\";\n case \"tiered\": return ast.devices.some((d) => d.tier) ? \"hierarchical\" : \"tree\";\n default: return \"general\";\n }\n}\n\n// ─── main ────────────────────────────────────────────────────────\n\nexport function layoutNetwork(ast: NetworkAst): NetworkLayoutResult {\n const links = withAutoLinks(ast);\n\n // 1. centers per mode\n let centers: Map<string, NetPoint>;\n switch (ast.layout) {\n case \"tree\": centers = placeBanded(ast, treeRanks(ast, links)); break;\n case \"star\": centers = placeStar(ast, links); break;\n case \"ring\": centers = placeCircle(ast, NET_CONST.RING_RADIUS_MIN); break;\n case \"mesh\": centers = placeCircle(ast, NET_CONST.RING_RADIUS_MIN); break;\n case \"bus\": centers = placeBus(ast); break;\n case \"spine-leaf\": centers = placeSpineLeaf(ast, links); break;\n case \"manual\": centers = placeManual(ast); break;\n case \"tiered\":\n default: centers = placeBanded(ast, tieredRanks(ast, links)); break;\n }\n\n // 2. device boxes\n const boxes: DeviceBox[] = ast.devices.map((d) => {\n const fp = deviceFootprint(d);\n const c = centers.get(d.id) ?? { x: 0, y: 0 };\n return {\n device: d,\n cx: c.x,\n cy: c.y,\n x: c.x - fp.w / 2,\n y: c.y - fp.h / 2,\n w: fp.w,\n h: fp.h,\n band: 0,\n };\n });\n const boxById = new Map(boxes.map((b) => [b.device.id, b]));\n\n // 3. group boxes (inner first), union of member geometry + padding\n const groupBoxesRaw = new Map<string, { left: number; top: number; right: number; bottom: number; depth: number }>();\n const depthOf = (id: string): number => {\n let depth = 0;\n let g = ast.groups.find((x) => x.id === id);\n while (g?.parent) { depth++; g = ast.groups.find((x) => x.id === g!.parent); }\n return depth;\n };\n // process deepest groups first so parents can include child boxes\n const groupsByDepth = [...ast.groups].sort((a, b) => depthOf(b.id) - depthOf(a.id));\n for (const g of groupsByDepth) {\n let l = Infinity, t = Infinity, r = -Infinity, bm = -Infinity;\n const addBox = (e: { left: number; top: number; right: number; bottom: number }) => {\n l = Math.min(l, e.left); t = Math.min(t, e.top); r = Math.max(r, e.right); bm = Math.max(bm, e.bottom);\n };\n for (const mid of g.members) { const mb = boxById.get(mid); if (mb) addBox(effBox(mb)); }\n for (const cid of g.children) { const cb = groupBoxesRaw.get(cid); if (cb) addBox(cb); }\n if (l === Infinity) continue; // empty group\n const depth = depthOf(g.id);\n const pad = NET_CONST.GROUP_PAD;\n groupBoxesRaw.set(g.id, {\n left: l - pad,\n top: t - pad - NET_CONST.GROUP_HEADER,\n right: r + pad,\n bottom: bm + pad,\n depth,\n });\n }\n\n // 4. normalize coordinates (shift so min extent = PAD)\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (const b of boxes) {\n const e = effBox(b);\n minX = Math.min(minX, e.left); minY = Math.min(minY, e.top);\n maxX = Math.max(maxX, e.right); maxY = Math.max(maxY, e.bottom);\n }\n for (const gb of groupBoxesRaw.values()) {\n minX = Math.min(minX, gb.left); minY = Math.min(minY, gb.top);\n maxX = Math.max(maxX, gb.right); maxY = Math.max(maxY, gb.bottom);\n }\n if (!Number.isFinite(minX)) { minX = 0; minY = 0; maxX = NET_CONST.DEVICE_W; maxY = NET_CONST.DEVICE_H; }\n\n const dx = NET_CONST.PAD - minX;\n const dy = NET_CONST.PAD - minY;\n for (const b of boxes) { b.x += dx; b.y += dy; b.cx += dx; b.cy += dy; }\n\n const groups: GroupBox[] = [];\n for (const g of ast.groups) {\n const gb = groupBoxesRaw.get(g.id);\n if (!gb) continue;\n groups.push({\n group: g,\n x: gb.left + dx,\n y: gb.top + dy,\n w: gb.right - gb.left,\n h: gb.bottom - gb.top,\n depth: gb.depth,\n });\n }\n\n // 5. link geometry (straight, clipped to box boundaries)\n const linkGeoms: LinkGeom[] = links.map((link) => {\n const a = boxById.get(link.from)!;\n const b = boxById.get(link.to)!;\n const p1 = edgePoint(a, b.cx, b.cy);\n const p2 = edgePoint(b, a.cx, a.cy);\n return {\n link,\n points: [p1, p2],\n labelX: (p1.x + p2.x) / 2,\n labelY: (p1.y + p2.y) / 2,\n };\n });\n\n const width = maxX - minX + 2 * NET_CONST.PAD;\n const height = maxY - minY + 2 * NET_CONST.PAD;\n\n return {\n ast,\n width: Math.max(width, 120),\n height: Math.max(height, 80),\n devices: boxes,\n links: linkGeoms,\n groups,\n topologyClass: classify(ast),\n warnings: ast.warnings,\n title: ast.title,\n };\n}\n","/**\n * Network topology — SVG renderer.\n *\n * Spec: docs/reference/35-NETWORK-STANDARD.md §3, §6, §8.\n */\n\nimport type { RenderConfig } from \"../../core/types\";\nimport {\n svgRoot,\n group,\n el,\n rect,\n line,\n polygon,\n text as textEl,\n title as titleEl,\n desc,\n escapeXml,\n} from \"../../core/svg\";\nimport { resolveNetworkTheme, type NetworkTokens, type ResolvedTheme } from \"../../core/theme\";\nimport { parseNetwork } from \"./parser\";\nimport { layoutNetwork, NET_CONST as C } from \"./layout\";\nimport { drawDeviceIcon, isCloudKind } from \"./symbols\";\nimport type { DeviceBox, GroupBox, LinkGeom, NetworkAst, NetworkLayoutResult, NetworkLink } from \"./types\";\n\ntype Theme = ResolvedTheme<NetworkTokens>;\n\nconst r2 = (n: number) => Math.round(n * 100) / 100;\n\nfunction buildCss(t: Theme): string {\n return `\n.sx-net { font-family: system-ui, -apple-system, sans-serif; }\n.sx-net-body { fill: ${t.deviceFill}; stroke: ${t.deviceStroke}; stroke-width: 2; }\n.sx-net-detail { fill: none; stroke: ${t.deviceStroke}; stroke-width: 1; }\n.sx-net-glyph { fill: ${t.deviceAccent}; stroke: none; }\n.sx-net-glyph-line { fill: none; stroke: ${t.deviceAccent}; stroke-width: 1.4; }\n.sx-net-icontext { font: 700 8px sans-serif; fill: ${t.deviceAccent}; }\n.sx-net-cloud-body { fill: ${t.cloudFill}; stroke: ${t.cloudStroke}; stroke-width: 2; }\n.sx-net-cloudtext { font: 600 13px sans-serif; fill: ${t.text}; }\n.sx-net-bus { stroke: ${t.deviceStroke}; stroke-width: 4; stroke-linecap: round; }\n.sx-net-label { font: 12px sans-serif; fill: ${t.label}; }\n.sx-net-sublabel { font: 10px sans-serif; fill: ${t.subLabel}; }\n.sx-net-link { fill: none; stroke-width: 2; }\n.sx-net-link-wireless, .sx-net-link-vpn { stroke-dasharray: 5 4; }\n.sx-net-link-lag { stroke-width: 3; }\n.sx-net-linklabel { font: 9px sans-serif; fill: ${t.linkLabel}; paint-order: stroke; stroke: ${t.bg}; stroke-width: 3px; stroke-linejoin: round; }\n.sx-net-port { font: 8px sans-serif; fill: ${t.linkLabel}; paint-order: stroke; stroke: ${t.bg}; stroke-width: 2.5px; stroke-linejoin: round; }\n.sx-net-boundary-site { fill: none; stroke: ${t.siteStroke}; stroke-width: 1.5; }\n.sx-net-boundary-rack { fill: none; stroke: ${t.siteStroke}; stroke-width: 1.5; stroke-dasharray: 1 2; }\n.sx-net-boundary-subnet, .sx-net-boundary-vlan { fill: ${t.subnetFill}; stroke: ${t.subnetStroke}; stroke-width: 1.2; stroke-dasharray: 5 3; }\n.sx-net-boundary-zone, .sx-net-boundary-dmz { fill: none; stroke: ${t.zoneStroke}; stroke-width: 1.2; stroke-dasharray: 5 3; }\n.sx-net-boundary-label { font: 600 10px sans-serif; }\n.sx-net-title { font: 700 16px sans-serif; fill: ${t.text}; }\n`.trim();\n}\n\n// ── link colour & class ──────────────────────────────────────────\n\nfunction linkColor(t: Theme, link: NetworkLink): string {\n if (link.linkType === \"copper\" && link.vlans && link.vlans.length === 1) {\n const vid = link.vlans[0]!;\n // Tint by VLAN, but skip the reserved alarm-red (it means DMZ/zone, not \"a VLAN\").\n const pal = t.vlanPalette.filter((c) => c !== t.negative);\n const safe = pal.length ? pal : t.vlanPalette;\n return safe[vid % safe.length]!;\n }\n switch (link.linkType) {\n case \"fiber\": return t.linkFiber;\n case \"wireless\": return t.linkWireless;\n case \"serial\": return t.linkSerial;\n case \"poe\": return t.linkPoe;\n case \"vpn\": return t.linkVpn;\n case \"lag\": return t.linkLag;\n default: return t.linkCopper;\n }\n}\n\nfunction annotation(link: NetworkLink): string {\n const parts: string[] = [];\n if (link.mode) parts.push(link.mode === \"trunk\" ? \"Trunk\" : \"Access\");\n if (link.vlans?.length) parts.push(`VLAN ${link.vlans.join(\",\")}`);\n if (link.speed) parts.push(link.speed);\n if (link.linkType === \"poe\") parts.push(\"PoE\");\n if (link.linkType === \"vpn\") parts.push(\"VPN\");\n if (link.label) parts.push(link.label);\n return parts.join(\" · \");\n}\n\nfunction arrowHead(x1: number, y1: number, x2: number, y2: number, color: string, hs = 6): string {\n const ang = Math.atan2(y2 - y1, x2 - x1);\n const a1 = ang + Math.PI - 0.45;\n const a2 = ang + Math.PI + 0.45;\n return polygon({\n fill: color,\n points: `${r2(x2)},${r2(y2)} ${r2(x2 + hs * Math.cos(a1))},${r2(y2 + hs * Math.sin(a1))} ${r2(x2 + hs * Math.cos(a2))},${r2(y2 + hs * Math.sin(a2))}`,\n });\n}\n\nfunction renderLink(lg: LinkGeom, t: Theme): string {\n const { link } = lg;\n const p1 = lg.points[0]!;\n const p2 = lg.points[lg.points.length - 1]!;\n const color = linkColor(t, link);\n const cls = `sx-net-link sx-net-link-${link.linkType}`;\n const parts: string[] = [];\n\n if (link.linkType === \"lag\") {\n // double line: two parallel offsets perpendicular to the run\n const ang = Math.atan2(p2.y - p1.y, p2.x - p1.x) + Math.PI / 2;\n const ox = 1.8 * Math.cos(ang);\n const oy = 1.8 * Math.sin(ang);\n parts.push(line({ class: cls, stroke: color, x1: r2(p1.x + ox), y1: r2(p1.y + oy), x2: r2(p2.x + ox), y2: r2(p2.y + oy) }));\n parts.push(line({ class: cls, stroke: color, x1: r2(p1.x - ox), y1: r2(p1.y - oy), x2: r2(p2.x - ox), y2: r2(p2.y - oy) }));\n } else {\n parts.push(el(\"polyline\", { class: cls, stroke: color, points: lg.points.map((p) => `${r2(p.x)},${r2(p.y)}`).join(\" \") }));\n }\n\n if (link.directed) parts.push(arrowHead(p1.x, p1.y, p2.x, p2.y, color));\n\n // fiber slash ticks\n if (link.linkType === \"fiber\") {\n const ang = Math.atan2(p2.y - p1.y, p2.x - p1.x) + Math.PI / 2;\n for (const f of [0.4, 0.55]) {\n const mx = p1.x + (p2.x - p1.x) * f;\n const my = p1.y + (p2.y - p1.y) * f;\n parts.push(line({ class: cls, stroke: color, x1: r2(mx - 3 * Math.cos(ang)), y1: r2(my - 3 * Math.sin(ang)), x2: r2(mx + 3 * Math.cos(ang)), y2: r2(my + 3 * Math.sin(ang)) }));\n }\n }\n\n // mid-link annotation\n const ann = annotation(link);\n if (ann) parts.push(textEl({ class: \"sx-net-linklabel\", x: r2(lg.labelX), y: r2(lg.labelY - 3), \"text-anchor\": \"middle\" }, ann));\n\n // port labels near endpoints\n if (link.portNear) parts.push(textEl({ class: \"sx-net-port\", x: r2(p1.x + (p2.x - p1.x) * 0.16), y: r2(p1.y + (p2.y - p1.y) * 0.16 - 3), \"text-anchor\": \"middle\" }, link.portNear));\n if (link.portFar) parts.push(textEl({ class: \"sx-net-port\", x: r2(p2.x + (p1.x - p2.x) * 0.16), y: r2(p2.y + (p1.y - p2.y) * 0.16 - 3), \"text-anchor\": \"middle\" }, link.portFar));\n\n return group(\n {\n class: \"sx-net-link-g\",\n \"data-from\": link.from,\n \"data-to\": link.to,\n \"data-type\": link.linkType,\n ...(link.vlans?.length ? { \"data-vlan\": link.vlans.join(\",\") } : {}),\n ...(link.speed ? { \"data-speed\": link.speed } : {}),\n ...(link.mode ? { \"data-mode\": link.mode } : {}),\n },\n parts,\n );\n}\n\n// ── boundaries ───────────────────────────────────────────────────\n\nfunction renderGroup(gb: GroupBox, t: Theme): string {\n const k = gb.group.kind;\n const cls = `sx-net-boundary-${k}`;\n const labelColor =\n k === \"zone\" || k === \"dmz\" ? t.zoneStroke\n : k === \"subnet\" || k === \"vlan\" ? t.subnetStroke\n : t.siteStroke;\n const label = gb.group.label ?? gb.group.id;\n const tag = k === \"vlan\" ? `VLAN ${label}` : label;\n return group(\n { class: \"sx-net-boundary\", \"data-kind\": k, \"data-label\": escapeXml(label) },\n [\n rect({ class: cls, x: r2(gb.x), y: r2(gb.y), width: r2(gb.w), height: r2(gb.h), rx: 8, ry: 8 }),\n textEl({ class: \"sx-net-boundary-label\", fill: labelColor, x: r2(gb.x + C.GROUP_LABEL_INSET), y: r2(gb.y + 13) }, tag),\n ],\n );\n}\n\n// ── devices ──────────────────────────────────────────────────────\n\nfunction renderDevice(b: DeviceBox, t: Theme): string {\n const d = b.device;\n const parts: string[] = [drawDeviceIcon(d, { x: b.x, y: b.y, w: b.w, h: b.h })];\n\n if (!isCloudKind(d.kind)) {\n const labelY = b.y + b.h + C.LABEL_GAP + 11;\n parts.push(textEl({ class: \"sx-net-label\", x: r2(b.cx), y: r2(labelY), \"text-anchor\": \"middle\" }, d.label ?? d.id));\n const sub = d.ip ?? d.model;\n if (sub) parts.push(textEl({ class: \"sx-net-sublabel\", x: r2(b.cx), y: r2(labelY + C.SUBLABEL_H), \"text-anchor\": \"middle\" }, sub));\n }\n\n const attrs: Record<string, string | number | undefined> = {\n class: \"sx-net-device\",\n \"data-id\": d.id,\n \"data-kind\": d.kind,\n };\n if (d.tier) attrs[\"data-tier\"] = d.tier;\n if (d.ip) attrs[\"data-ip\"] = d.ip;\n if (d.cameraType) attrs[\"data-type\"] = d.cameraType;\n void t;\n return group(attrs, parts);\n}\n\n// ── top level ────────────────────────────────────────────────────\n\nexport function renderNetworkLayout(layout: NetworkLayoutResult, config?: RenderConfig): string {\n const t = resolveNetworkTheme(config?.theme ?? \"default\");\n const children: string[] = [];\n\n const counts = new Map<string, number>();\n for (const b of layout.devices) counts.set(b.device.kind, (counts.get(b.device.kind) ?? 0) + 1);\n const linkTypes = new Map<string, number>();\n for (const l of layout.links) linkTypes.set(l.link.linkType, (linkTypes.get(l.link.linkType) ?? 0) + 1);\n\n const descParts = [\n `${layout.devices.length} devices, ${layout.links.length} links, ${layout.groups.length} boundaries.`,\n `Topology: ${layout.topologyClass}.`,\n linkTypes.size ? `Links: ${[...linkTypes].map(([k, n]) => `${n} ${k}`).join(\", \")}.` : \"\",\n layout.warnings.length ? `Warnings: ${layout.warnings.join(\"; \")}.` : \"\",\n ].filter(Boolean);\n\n children.push(titleEl(`Network diagram${layout.title ? \" — \" + layout.title : \"\"}`));\n children.push(desc(descParts.join(\" \")));\n children.push(el(\"style\", {}, buildCss(t)));\n\n const titleBand = layout.title ? 30 : 0;\n if (layout.title) {\n children.push(textEl({ x: r2(layout.width / 2), y: 21, class: \"sx-net-title\", \"text-anchor\": \"middle\" }, layout.title));\n }\n\n const body: string[] = [];\n // boundaries behind, outermost first\n const sortedGroups = [...layout.groups].sort((a, b) => a.depth - b.depth);\n body.push(group({ class: \"sx-net-boundaries\" }, sortedGroups.map((g) => renderGroup(g, t))));\n body.push(group({ class: \"sx-net-links\" }, layout.links.map((l) => renderLink(l, t))));\n body.push(group({ class: \"sx-net-devices\" }, layout.devices.map((b) => renderDevice(b, t))));\n\n children.push(titleBand ? group({ transform: `translate(0, ${titleBand})` }, body) : group({}, body));\n\n const height = layout.height + titleBand;\n return svgRoot(\n {\n class: \"sx-net\",\n role: \"img\",\n \"aria-label\": escapeXml(layout.title ?? \"Network diagram\"),\n width: r2(layout.width),\n height: r2(height),\n viewBox: `0 0 ${r2(layout.width)} ${r2(height)}`,\n \"data-diagram-type\": \"network\",\n },\n children,\n );\n}\n\nexport function renderNetwork(textOrAst: string | NetworkAst, config?: RenderConfig): string {\n const ast = typeof textOrAst === \"string\" ? parseNetwork(textOrAst) : textOrAst;\n const layout = layoutNetwork(ast);\n return renderNetworkLayout(layout, config);\n}\n","import type { DiagramPlugin, RenderConfig } from \"../../core/types\";\nimport { parseNetwork } from \"./parser\";\nimport { renderNetwork } from \"./renderer\";\n\nexport const network: DiagramPlugin = {\n type: \"network\",\n detect(text: string): boolean {\n for (const raw of text.split(/\\r?\\n/)) {\n const t = raw.trim();\n if (!t) continue;\n if (t.startsWith(\"#\") || t.startsWith(\"//\")) continue;\n return /^(network|topology)\\b/i.test(t);\n }\n return false;\n },\n parse: parseNetwork,\n render(text: string, config?: RenderConfig): string {\n return renderNetwork(text, config);\n },\n};\n\nexport { parseNetwork, NetworkParseError } from \"./parser\";\nexport { renderNetwork, renderNetworkLayout } from \"./renderer\";\nexport { layoutNetwork, NET_CONST } from \"./layout\";\nexport type * from \"./types\";\n","import type { DiagramType } from \"./types\";\nimport {\n desc,\n el,\n escapeXml,\n rect,\n svgRoot,\n text,\n title,\n} from \"./svg\";\n\nexport type SchematexResultStatus = \"valid\" | \"partial\" | \"invalid\";\n\nexport interface SchematexDiagnostic {\n severity: \"error\" | \"warning\";\n code: string;\n message: string;\n line?: number;\n column?: number;\n source?: string;\n hint?: string;\n fatal: boolean;\n}\n\nexport type SchematexParseResult =\n | {\n ok: true;\n status: \"valid\" | \"partial\";\n type: DiagramType;\n ast: unknown;\n diagnostics: SchematexDiagnostic[];\n }\n | {\n ok: false;\n status: \"invalid\";\n type: DiagramType | null;\n diagnostics: SchematexDiagnostic[];\n };\n\nexport type SchematexRenderResult =\n | {\n ok: true;\n status: \"valid\" | \"partial\";\n type: DiagramType;\n svg: string;\n diagnostics: SchematexDiagnostic[];\n }\n | {\n ok: false;\n status: \"invalid\";\n type: DiagramType | null;\n svg: string;\n diagnostics: SchematexDiagnostic[];\n };\n\nconst ENGINE_BUG_NAMES = new Set([\n \"ReferenceError\",\n \"TypeError\",\n \"RangeError\",\n]);\n\nexport function diagnosticFromError(err: unknown): SchematexDiagnostic {\n if (err instanceof Error) {\n const anyErr = err as Error & {\n line?: number;\n column?: number;\n source?: string;\n hint?: string;\n };\n const hasParseFields = typeof anyErr.line === \"number\";\n const isEngineBug = !hasParseFields && ENGINE_BUG_NAMES.has(err.name);\n const source =\n typeof anyErr.source === \"string\"\n ? anyErr.source\n : isEngineBug\n ? firstStackFrame(err.stack)\n : undefined;\n\n return {\n severity: \"error\",\n code: isEngineBug ? \"ENGINE_BUG\" : \"DSL_INVALID\",\n line: typeof anyErr.line === \"number\" ? anyErr.line : undefined,\n column: typeof anyErr.column === \"number\" ? anyErr.column : undefined,\n source,\n message: isEngineBug\n ? `[engine bug: ${err.name}] ${err.message}`\n : err.message,\n hint:\n typeof anyErr.hint === \"string\"\n ? anyErr.hint\n : isEngineBug\n ? \"This looks like a Schematex internal error rather than a DSL syntax problem. Keep the failing DSL and file an issue.\"\n : undefined,\n fatal: true,\n };\n }\n\n return {\n severity: \"error\",\n code: \"UNKNOWN_THROW\",\n message: String(err),\n fatal: true,\n };\n}\n\nexport function renderDiagnosticSvg(\n diagnostics: SchematexDiagnostic[],\n type: DiagramType | null,\n config: { fontFamily?: string } = {}\n): string {\n const headline = type\n ? `${type} preview could not be rendered`\n : \"Diagram preview could not be rendered\";\n const detail =\n diagnostics[0]?.message ?? \"Schematex could not parse this DSL.\";\n const lines = wrapText(detail, 88).slice(0, 5);\n const source = diagnostics[0]?.source\n ? wrapText(`Source: ${diagnostics[0].source}`, 88).slice(0, 2)\n : [];\n const foot = \"Strict validation failed before a diagram could be drawn.\";\n const width = 760;\n const lineHeight = 20;\n const height = 174 + (lines.length + source.length) * lineHeight;\n const fontFamily =\n config.fontFamily ?? \"system-ui, -apple-system, sans-serif\";\n\n const children = [\n title(headline),\n desc(`${headline}. ${detail}`),\n el(\n \"style\",\n {},\n `\n.schematex-preview-error { font-family: ${escapeXml(fontFamily)}; }\n.schematex-preview-error-frame { fill: #fff7ed; stroke: #c2410c; stroke-width: 1.5; }\n.schematex-preview-error-mark { fill: #c2410c; }\n.schematex-preview-error-title { fill: #7c2d12; font-size: 18px; font-weight: 600; }\n.schematex-preview-error-copy { fill: #431407; font-size: 13px; }\n.schematex-preview-error-muted { fill: #9a3412; font-size: 12px; }\n`\n ),\n el(\"g\", { class: \"schematex-preview-error\" }, [\n rect({\n x: 1,\n y: 1,\n width: width - 2,\n height: height - 2,\n rx: 6,\n class: \"schematex-preview-error-frame\",\n }),\n rect({\n x: 28,\n y: 30,\n width: 8,\n height: 34,\n rx: 4,\n class: \"schematex-preview-error-mark\",\n }),\n rect({\n x: 28,\n y: 72,\n width: 8,\n height: 8,\n rx: 4,\n class: \"schematex-preview-error-mark\",\n }),\n text(\n { x: 58, y: 49, class: \"schematex-preview-error-title\" },\n headline\n ),\n text(\n { x: 58, y: 76, class: \"schematex-preview-error-muted\" },\n \"The DSL is still available to repair or retry.\"\n ),\n ...renderRows(lines, 58, 112, lineHeight, \"schematex-preview-error-copy\"),\n ...renderRows(\n source,\n 58,\n 112 + lines.length * lineHeight + 10,\n lineHeight,\n \"schematex-preview-error-muted\"\n ),\n text(\n { x: 58, y: height - 28, class: \"schematex-preview-error-muted\" },\n foot\n ),\n ]),\n ];\n\n return svgRoot(\n {\n width,\n height,\n viewBox: `0 0 ${width} ${height}`,\n role: \"img\",\n \"aria-label\": headline,\n \"data-schematex-status\": \"invalid\",\n },\n children\n );\n}\n\nfunction renderRows(\n rows: string[],\n x: number,\n y: number,\n lineHeight: number,\n className: string\n): string[] {\n return rows.map((row, idx) =>\n text({ x, y: y + idx * lineHeight, class: className }, row)\n );\n}\n\nfunction wrapText(value: string, max: number): string[] {\n const words = value.replace(/\\s+/g, \" \").trim().split(\" \");\n const rows: string[] = [];\n let current = \"\";\n\n for (const word of words) {\n if (!current) {\n current = word;\n continue;\n }\n if (current.length + word.length + 1 <= max) {\n current += ` ${word}`;\n continue;\n }\n rows.push(current);\n current = word;\n }\n if (current) rows.push(current);\n return rows.length > 0 ? rows : [value];\n}\n\nfunction firstStackFrame(stack: string | undefined): string | undefined {\n if (!stack) return undefined;\n for (const line of stack.split(\"\\n\")) {\n const trimmed = line.trim();\n if (trimmed.startsWith(\"at \")) {\n return trimmed.replace(/\\((?:.*\\/)?([^/]+)\\)/, \"($1)\");\n }\n }\n return undefined;\n}\n","import type { InlineToken } from \"../../core/types\";\n\n/**\n * Inline markdown tokenizer for mindmap labels.\n *\n * Supported (Phase A):\n * **bold**, *italic*\n * `code`\n * [text](url)\n * leading `[ ]` / `[x]` → checkbox token (task list)\n *\n * Phase B adds wrap() for multi-line layout.\n *\n * Deliberately tiny — ~150 lines, no dep on marked/markdown-it. Not a\n * conforming CommonMark parser: nested bold+italic within links works, but\n * we don't try to handle every edge case (unbalanced `**`, escapes in code,\n * etc.). Unmatched delimiters fall through as literal text.\n */\n\nconst RE_TASK = /^\\[( |x|X)\\]\\s+(.*)$/;\n\nexport function tokenizeInline(raw: string): InlineToken[] {\n const tokens: InlineToken[] = [];\n let text = raw;\n\n // Leading task-list checkbox\n const task = text.match(RE_TASK);\n if (task) {\n tokens.push({ kind: \"checkbox\", checked: task[1].toLowerCase() === \"x\" });\n text = task[2];\n }\n\n parseInto(text, tokens, { bold: false, italic: false });\n return tokens;\n}\n\ninterface Style {\n bold: boolean;\n italic: boolean;\n}\n\n// Walks `src` appending tokens into `out`. Handles code/link/bold/italic.\nfunction parseInto(src: string, out: InlineToken[], style: Style): void {\n let i = 0;\n let plain = \"\";\n const flushPlain = () => {\n if (plain.length === 0) return;\n out.push({ kind: \"text\", value: plain, bold: style.bold || undefined, italic: style.italic || undefined });\n plain = \"\";\n };\n\n while (i < src.length) {\n const ch = src[i];\n\n // `code` — terminated by matching backtick; no formatting inside\n if (ch === \"`\") {\n const end = src.indexOf(\"`\", i + 1);\n if (end > i) {\n flushPlain();\n out.push({ kind: \"code\", value: src.slice(i + 1, end) });\n i = end + 1;\n continue;\n }\n }\n\n // [text](url)\n if (ch === \"[\") {\n const closeBracket = findUnescaped(src, \"]\", i + 1);\n if (closeBracket > 0 && src[closeBracket + 1] === \"(\") {\n const closeParen = findUnescaped(src, \")\", closeBracket + 2);\n if (closeParen > 0) {\n flushPlain();\n const inner: InlineToken[] = [];\n parseInto(src.slice(i + 1, closeBracket), inner, style);\n out.push({ kind: \"link\", href: src.slice(closeBracket + 2, closeParen), value: inner });\n i = closeParen + 1;\n continue;\n }\n }\n }\n\n // **bold**\n if (ch === \"*\" && src[i + 1] === \"*\") {\n const end = src.indexOf(\"**\", i + 2);\n if (end > i) {\n flushPlain();\n parseInto(src.slice(i + 2, end), out, { ...style, bold: true });\n i = end + 2;\n continue;\n }\n }\n\n // *italic*\n if (ch === \"*\") {\n const end = src.indexOf(\"*\", i + 1);\n if (end > i && src[end + 1] !== \"*\") {\n flushPlain();\n parseInto(src.slice(i + 1, end), out, { ...style, italic: true });\n i = end + 1;\n continue;\n }\n }\n\n plain += ch;\n i++;\n }\n flushPlain();\n}\n\nfunction findUnescaped(s: string, ch: string, from: number): number {\n for (let i = from; i < s.length; i++) {\n if (s[i] === \"\\\\\") { i++; continue; }\n if (s[i] === ch) return i;\n }\n return -1;\n}\n\n// ─── Measurement ─────────────────────────────────────────────────────────\n\n// Per-em width multipliers. Heuristic — refined by font but single-factor is\n// close enough for layout purposes (we give labels some padding anyway).\nconst EM_REGULAR = 0.58;\nconst EM_BOLD = 0.62;\nconst EM_CODE = 0.62;\nconst CHECKBOX_EM = 1.05; // checkbox + trailing space, in units of fontSize\n\nexport function measureTokens(tokens: readonly InlineToken[], fontSize: number): number {\n let w = 0;\n for (const t of tokens) {\n w += tokenWidth(t, fontSize);\n }\n return w;\n}\n\nfunction tokenWidth(t: InlineToken, fs: number): number {\n switch (t.kind) {\n case \"text\": {\n const em = t.bold ? EM_BOLD : EM_REGULAR;\n return t.value.length * fs * em;\n }\n case \"code\":\n // +4px for code background horizontal padding (2px each side)\n return t.value.length * fs * EM_CODE + 4;\n case \"link\":\n return measureTokens(t.value, fs);\n case \"checkbox\":\n return fs * CHECKBOX_EM;\n }\n}\n\n// ─── Plain-text extraction (for aria-label / title / tooltip) ────────────\n\nexport function tokensToPlainText(tokens: readonly InlineToken[]): string {\n let out = \"\";\n for (const t of tokens) {\n switch (t.kind) {\n case \"text\":\n case \"code\":\n out += t.value;\n break;\n case \"link\":\n out += tokensToPlainText(t.value);\n break;\n case \"checkbox\":\n out += t.checked ? \"[x] \" : \"[ ] \";\n break;\n }\n }\n return out;\n}\n\n// ─── Phase B: line wrapping ──────────────────────────────────────────────\n\nexport interface TokenLine {\n tokens: InlineToken[];\n width: number;\n}\n\n/**\n * Wrap tokens to `maxWidth`. Breaks at word boundaries within text tokens;\n * code/link/checkbox are atomic (not split). Words longer than maxWidth go\n * on their own line (overflow rather than hyphenate).\n *\n * Returns at least one line (possibly empty if tokens are empty).\n */\nexport function wrapTokens(\n tokens: readonly InlineToken[],\n maxWidth: number,\n fontSize: number\n): TokenLine[] {\n const lines: TokenLine[] = [];\n let line: InlineToken[] = [];\n let lineW = 0;\n\n const pushLine = () => {\n lines.push({ tokens: line, width: lineW });\n line = [];\n lineW = 0;\n };\n\n const pushAtomic = (t: InlineToken, w: number) => {\n if (lineW > 0 && lineW + w > maxWidth) pushLine();\n line.push(t);\n lineW += w;\n };\n\n for (const t of tokens) {\n if (t.kind === \"text\") {\n // Split on spaces but preserve them by appending to preceding word.\n const words = splitWordsWithTrailingSpace(t.value);\n for (const w of words) {\n const wt: InlineToken = { kind: \"text\", value: w, bold: t.bold, italic: t.italic };\n const ww = tokenWidth(wt, fontSize);\n if (lineW > 0 && lineW + ww > maxWidth) {\n // Current word wraps to new line; strip leading space\n pushLine();\n const trimmed = w.replace(/^ +/, \"\");\n if (trimmed.length === 0) continue;\n const tt: InlineToken = { kind: \"text\", value: trimmed, bold: t.bold, italic: t.italic };\n line.push(tt);\n lineW = tokenWidth(tt, fontSize);\n } else {\n line.push(wt);\n lineW += ww;\n }\n }\n } else {\n pushAtomic(t, tokenWidth(t, fontSize));\n }\n }\n pushLine();\n return lines;\n}\n\n// Split \"foo bar baz\" into [\"foo \", \"bar \", \" baz\"]-ish — each word keeps\n// its trailing space so measurements stay stable across the split.\nfunction splitWordsWithTrailingSpace(s: string): string[] {\n if (s.length === 0) return [];\n const out: string[] = [];\n const re = /(\\S+\\s*)|(\\s+)/g;\n let m: RegExpExecArray | null;\n while ((m = re.exec(s)) !== null) {\n out.push(m[0]);\n }\n return out.length > 0 ? out : [s];\n}\n","import type { MindmapAST, MindmapNode, MindmapStyle } from \"../../core/types\";\nimport { tokenizeInline } from \"./inline\";\n\n/**\n * Mindmap DSL parser — markdown-heading + bullet list with inline markdown.\n *\n * Grammar (EBNF):\n * document = directive* heading (heading | bullet)*\n * directive = \"%%\" key \":\" value NEWLINE\n * heading = \"#\"+ SPACE text NEWLINE\n * bullet = INDENT (\"-\" | \"*\" | \"+\") SPACE text NEWLINE\n * INDENT = / *\\/ (2 spaces = 1 level)\n *\n * `text` may contain inline markdown (bold / italic / code / link /\n * leading `[ ]` task checkbox). Tokens are parsed here and attached to\n * the node; layout & renderer consume `tokens` rather than `label`.\n *\n * Directives: `style`, `theme`, `maxLabelWidth`.\n */\n\nexport class MindmapParseError extends Error {\n constructor(\n message: string,\n public line?: number,\n public column?: number,\n public source?: string\n ) {\n super(line !== undefined ? `Line ${line}: ${message}` : message);\n this.name = \"MindmapParseError\";\n }\n}\n\nconst VALID_STYLES: readonly MindmapStyle[] = [\"map\", \"logic-right\"];\nconst DEFAULT_MAX_LABEL_WIDTH = 240;\n\ninterface Directives {\n style: MindmapStyle;\n themeOverride?: string;\n maxLabelWidth: number;\n}\n\nfunction parseDirective(line: string, out: Directives): void {\n const body = line.replace(/^%%\\s*/, \"\").trim();\n const idx = body.indexOf(\":\");\n if (idx < 0) return;\n const key = body.slice(0, idx).trim().toLowerCase();\n const val = body.slice(idx + 1).trim();\n if (key === \"style\" && (VALID_STYLES as readonly string[]).includes(val)) {\n out.style = val as MindmapStyle;\n } else if (key === \"theme\") {\n out.themeOverride = val;\n } else if (key === \"maxlabelwidth\") {\n const n = Number(val);\n if (Number.isFinite(n) && n >= 80 && n <= 1000) out.maxLabelWidth = n;\n }\n}\n\nfunction makeNode(id: string, label: string, depth: number): MindmapNode {\n return { id, label, tokens: tokenizeInline(label), depth, children: [] };\n}\n\nexport function parseMindmap(text: string): MindmapAST {\n const allLines = text.split(/\\r?\\n/);\n let lineOffset = 0;\n\n // Skip optional leading \"mindmap\" marker.\n if (allLines[0]?.trim().toLowerCase() === \"mindmap\") {\n allLines.shift();\n lineOffset = 1;\n }\n const lines = allLines;\n\n const directives: Directives = { style: \"map\", maxLabelWidth: DEFAULT_MAX_LABEL_WIDTH };\n let root: MindmapNode | null = null;\n let idCounter = 0;\n const nextId = () => `n${idCounter++}`;\n\n // Parent stack — tracks (node, depth). Bullet depth = lastHeadingDepth + 1 + floor(indent / 2).\n const stack: { node: MindmapNode; depth: number }[] = [];\n let lastHeadingDepth = 0;\n\n const attach = (node: MindmapNode, depth: number, lineNo: number, source: string) => {\n while (stack.length && stack[stack.length - 1].depth >= depth) stack.pop();\n const parent = stack[stack.length - 1]?.node;\n if (!parent) throw new MindmapParseError(\"orphan node — expected root # heading first\", lineNo, undefined, source);\n node.depth = parent.depth + 1;\n parent.children.push(node);\n stack.push({ node, depth });\n };\n\n for (let i = 0; i < lines.length; i++) {\n const raw = lines[i] ?? \"\";\n const lineNo = i + 1 + lineOffset;\n const line = raw.replace(/\\s+$/, \"\");\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n if (trimmed.startsWith(\"%%\")) {\n parseDirective(trimmed, directives);\n continue;\n }\n\n const heading = line.match(/^\\s*(#{1,6})\\s+(.+)$/);\n if (heading) {\n const depth = heading[1].length - 1; // H1 → 0 (root), H2 → 1, ...\n const label = heading[2].trim();\n const node = makeNode(nextId(), label, depth);\n if (depth === 0) {\n if (root) throw new MindmapParseError(\"multiple `#` center nodes not allowed\", lineNo, undefined, line);\n root = node;\n stack.length = 0;\n stack.push({ node, depth: 0 });\n } else {\n attach(node, depth, lineNo, line);\n }\n lastHeadingDepth = depth;\n continue;\n }\n\n const bullet = line.match(/^(\\s*)[-*+]\\s+(.+)$/);\n if (bullet) {\n const indent = bullet[1].length;\n const depth = lastHeadingDepth + 1 + Math.floor(indent / 2);\n const label = bullet[2].trim();\n const node = makeNode(nextId(), label, depth);\n attach(node, depth, lineNo, line);\n continue;\n }\n }\n\n if (!root) throw new MindmapParseError(\"missing central topic — start with `# Title`\");\n\n const ast: MindmapAST = {\n type: \"mindmap\",\n style: directives.style,\n root,\n maxLabelWidth: directives.maxLabelWidth,\n };\n if (directives.themeOverride) ast.themeOverride = directives.themeOverride;\n return ast;\n}\n","import type {\n MindmapAST,\n MindmapLabelLine,\n MindmapLayoutEdge,\n MindmapLayoutNode,\n MindmapLayoutResult,\n MindmapNode,\n MindmapStyle,\n} from \"../../core/types\";\nimport { measureTokens, wrapTokens } from \"./inline\";\n\n/**\n * Mindmap layout — two XMind-inspired styles:\n * map — center + branches split left/right, each side vertically stacked\n * logic-right — root on left, tidy tree extending right (markmap-compatible)\n *\n * Layout invariants:\n * • Each node's n.x is its label's horizontal CENTER. Text renders\n * anchor-middle at n.x.\n * • Labels can be multi-line (inline markdown wrapped at maxLabelWidth).\n * labelHeight = lines × lineHeight + padding; labelWidth = max line width.\n * • Per-depth columns are globally aligned to the max label width at that\n * depth (incl. post-wrap width), so sibling branches stay flush.\n * • Tidy-tree packing uses each node's true labelHeight, so rich labels\n * automatically push neighbors apart without overlap.\n * • Bezier edges travel from parent's outer label edge to child's inner\n * label edge. Main-branch underlines merge visually with the curve.\n */\n\nconst PADDING = 40;\nconst SIBLING_GAP = 18; // vertical gap between sibling subtree rects\nconst MAIN_GAP = 44; // vertical gap between main branches on same side\nconst UNDERLINE_GAP = 4; // px between text bottom and underline stroke\nconst LINE_GAP = 4; // extra px between wrapped lines\n\n// Horizontal span of the Bezier curve between consecutive slot columns.\nfunction bezierGapFor(childDepth: number): number {\n if (childDepth <= 1) return 90;\n if (childDepth === 2) return 60;\n return 45;\n}\n\nconst FONT_CENTRAL = 20;\nconst FONT_MAIN = 15;\nconst FONT_SUB = 13;\n\nfunction fontSizeOf(depth: number): number {\n if (depth === 0) return FONT_CENTRAL;\n if (depth === 1) return FONT_MAIN;\n return FONT_SUB;\n}\n\nfunction lineHeightOf(fs: number): number {\n return fs + LINE_GAP;\n}\n\n// Root font (20pt) is ~1.5× sub font (13pt), so a single maxLabelWidth budget\n// would wrap root text far sooner than body text. Scale the budget by depth\n// so root gets room to breathe before wrapping.\nfunction widthBudget(depth: number, maxLabelWidth: number): number {\n if (depth === 0) return maxLabelWidth * 1.5;\n return maxLabelWidth;\n}\n\n// ─── Label measurement ──────────────────────────────────────────────────\n\ninterface LabelMetrics {\n lines: MindmapLabelLine[];\n width: number; // max line width\n height: number; // lines × lineHeight + padding (for leaves)\n}\n\nfunction measureLabel(node: MindmapNode, maxWidth: number): LabelMetrics {\n const fs = fontSizeOf(node.depth);\n // Unwrapped width first — if it fits, skip wrapping.\n const raw = measureTokens(node.tokens, fs);\n let lines: MindmapLabelLine[];\n if (raw <= maxWidth) {\n lines = [{ tokens: node.tokens.slice(), width: raw }];\n } else {\n lines = wrapTokens(node.tokens, maxWidth, fs);\n }\n let maxW = 0;\n for (const ln of lines) if (ln.width > maxW) maxW = ln.width;\n const lh = lineHeightOf(fs);\n // Label block = text lines + underline gap. No surrounding box/padding —\n // underline sits at the bottom edge, edges enter/leave at that y.\n const height = lines.length * lh + UNDERLINE_GAP;\n return { lines, width: Math.max(32, maxW), height };\n}\n\n// ─── Column bookkeeping ──────────────────────────────────────────────────\n\ninterface Columns {\n center: number[];\n}\n\n// Scan subtree(s) and return the max measured label width at each depth.\n// Used both for column positioning AND for equalizing every node's rendered\n// underline width at its depth (so sibling bezier curves span identical gaps).\nfunction computeMaxLW(\n subtreeRoots: MindmapNode[],\n maxLabelWidth: number\n): number[] {\n const maxLW: number[] = [];\n const walk = (n: MindmapNode) => {\n const m = measureLabel(n, widthBudget(n.depth, maxLabelWidth));\n if (maxLW[n.depth] === undefined || m.width > maxLW[n.depth]) maxLW[n.depth] = m.width;\n for (const c of n.children) walk(c);\n };\n for (const r of subtreeRoots) walk(r);\n return maxLW;\n}\n\nfunction buildColumns(\n maxLW: number[],\n firstColStartX: number,\n rootDepth: number\n): Columns {\n const center: number[] = [];\n if (maxLW[rootDepth] === undefined) return { center };\n let slotLeft = firstColStartX;\n center[rootDepth] = slotLeft + maxLW[rootDepth] / 2;\n for (let d = rootDepth + 1; d < maxLW.length; d++) {\n slotLeft = slotLeft + maxLW[d - 1] + bezierGapFor(d);\n center[d] = slotLeft + (maxLW[d] ?? 0) / 2;\n }\n return { center };\n}\n\n// ─── Tidy tree extending rightward ──────────────────────────────────────\n\nfunction tidyRight(\n node: MindmapNode,\n yTop: number,\n branchIdx: number,\n columns: Columns,\n maxLabelWidth: number,\n maxLW: number[],\n out: MindmapLayoutNode[]\n): { layoutNode: MindmapLayoutNode; height: number } {\n const m = measureLabel(node, widthBudget(node.depth, maxLabelWidth));\n const x = columns.center[node.depth];\n const fs = fontSizeOf(node.depth);\n // Expand to the max width at this depth so all same-depth nodes share\n // the same underline length and bezier endpoints stay consistent.\n const labelWidth = Math.max(m.width, maxLW[node.depth] ?? m.width);\n\n if (node.children.length === 0) {\n const ln: MindmapLayoutNode = {\n node,\n x,\n y: yTop + m.height / 2,\n side: \"right\",\n branchIndex: branchIdx,\n labelWidth,\n labelHeight: m.height,\n fontSize: fs,\n lines: m.lines,\n };\n out.push(ln);\n return { layoutNode: ln, height: m.height };\n }\n\n let cursor = yTop;\n const childLayouts: MindmapLayoutNode[] = [];\n for (let i = 0; i < node.children.length; i++) {\n if (i > 0) cursor += SIBLING_GAP;\n const { layoutNode: cln, height } = tidyRight(\n node.children[i],\n cursor,\n branchIdx,\n columns,\n maxLabelWidth,\n maxLW,\n out\n );\n childLayouts.push(cln);\n cursor += height;\n }\n const totalH = Math.max(m.height, cursor - yTop);\n\n const firstY = childLayouts[0].y;\n const lastY = childLayouts[childLayouts.length - 1].y;\n const parentY = (firstY + lastY) / 2;\n\n const ln: MindmapLayoutNode = {\n node,\n x,\n y: parentY,\n side: \"right\",\n branchIndex: branchIdx,\n labelWidth,\n labelHeight: m.height,\n fontSize: fs,\n lines: m.lines,\n };\n out.push(ln);\n return { layoutNode: ln, height: totalH };\n}\n\n// ─── Edge geometry helpers ───────────────────────────────────────────────\n\nfunction labelEdgeX(n: MindmapLayoutNode, outward: boolean): number {\n if (n.side === \"center\") return n.x;\n const dir = n.side === \"left\" ? -1 : 1;\n return n.x + (outward ? dir : -dir) * n.labelWidth / 2;\n}\n\nfunction bezierH(x1: number, y1: number, x2: number, y2: number): string {\n const k = (x2 - x1) * 0.55;\n return `M ${x1.toFixed(1)} ${y1.toFixed(1)} C ${(x1 + k).toFixed(1)} ${y1.toFixed(1)}, ${(x2 - k).toFixed(1)} ${y2.toFixed(1)}, ${x2.toFixed(1)} ${y2.toFixed(1)}`;\n}\n\nfunction edgeWidthFor(depth: number): number {\n if (depth <= 1) return 2.2;\n if (depth === 2) return 1.6;\n return 1.2;\n}\n\n/** Underline stroke width for a node at this depth. */\nfunction underlineWidthFor(depth: number): number {\n if (depth === 0) return 2.4;\n if (depth === 1) return 2.2;\n if (depth === 2) return 1.6;\n return 1.2;\n}\n\n// ─── Canvas normalization ────────────────────────────────────────────────\n\nfunction normalize(nodes: MindmapLayoutNode[]): { width: number; height: number } {\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (const n of nodes) {\n const lw = n.labelWidth;\n const lh = n.labelHeight;\n const leftX = n.x - lw / 2;\n const rightX = n.x + lw / 2;\n minX = Math.min(minX, leftX);\n maxX = Math.max(maxX, rightX);\n minY = Math.min(minY, n.y - lh / 2);\n maxY = Math.max(maxY, n.y + lh / 2);\n }\n const dx = PADDING - minX;\n const dy = PADDING - minY;\n for (const n of nodes) {\n n.x += dx;\n n.y += dy;\n }\n return { width: (maxX - minX) + PADDING * 2, height: (maxY - minY) + PADDING * 2 };\n}\n\n/** y of a node's bottom underline — where edges enter/leave.\n * Matches renderer: stroke sits mid-UNDERLINE_GAP, not at the raw bottom. */\nfunction underlineY(n: MindmapLayoutNode): number {\n return n.y + n.labelHeight / 2 - UNDERLINE_GAP / 2;\n}\n\nfunction buildEdges(root: MindmapNode, byId: Map<string, MindmapLayoutNode>): MindmapLayoutEdge[] {\n const edges: MindmapLayoutEdge[] = [];\n const walk = (parent: MindmapNode) => {\n const pln = byId.get(parent.id)!;\n const pUY = underlineY(pln);\n for (const c of parent.children) {\n const cln = byId.get(c.id)!;\n let fromX: number;\n if (pln.side === \"center\") {\n const halfW = pln.labelWidth / 2;\n fromX = cln.side === \"left\" ? pln.x - halfW : pln.x + halfW;\n } else {\n fromX = labelEdgeX(pln, true);\n }\n const toX = labelEdgeX(cln, false);\n edges.push({\n from: parent.id,\n to: c.id,\n path: bezierH(fromX, pUY, toX, underlineY(cln)),\n color: \"\",\n width: edgeWidthFor(c.depth),\n });\n walk(c);\n }\n };\n walk(root);\n return edges;\n}\n\n// ─── Style: Map (balanced left/right) ────────────────────────────────────\n\nfunction layoutMap(ast: MindmapAST): MindmapLayoutResult {\n const root = ast.root;\n const mains = root.children;\n const rightCount = Math.ceil(mains.length / 2);\n const rightMains = mains.slice(0, rightCount);\n const leftMains = mains.slice(rightCount);\n\n const nodes: MindmapLayoutNode[] = [];\n const mw = ast.maxLabelWidth;\n\n const rootM = measureLabel(root, widthBudget(0, mw));\n const firstColLeft = rootM.width / 2 + bezierGapFor(1);\n\n // Single global maxLW scan over both sides so L/R siblings share width.\n const maxLW = computeMaxLW([...rightMains, ...leftMains], mw);\n const cols = buildColumns(maxLW, firstColLeft, 1);\n\n let rightCursor = 0;\n for (let i = 0; i < rightMains.length; i++) {\n if (i > 0) rightCursor += MAIN_GAP;\n const { height } = tidyRight(rightMains[i], rightCursor, i, cols, mw, maxLW, nodes);\n rightCursor += height;\n }\n const rightHeight = rightCursor;\n\n const leftStart = nodes.length;\n let leftCursor = 0;\n for (let i = 0; i < leftMains.length; i++) {\n if (i > 0) leftCursor += MAIN_GAP;\n const { height } = tidyRight(leftMains[i], leftCursor, rightCount + i, cols, mw, maxLW, nodes);\n leftCursor += height;\n }\n const leftHeight = leftCursor;\n for (let k = leftStart; k < nodes.length; k++) {\n nodes[k].x = -nodes[k].x;\n nodes[k].side = \"left\";\n }\n\n const rootY = Math.max(rightHeight, leftHeight) / 2;\n const rootNode: MindmapLayoutNode = {\n node: root,\n x: 0,\n y: rootY,\n side: \"center\",\n branchIndex: -1,\n labelWidth: rootM.width,\n labelHeight: rootM.height,\n fontSize: fontSizeOf(0),\n lines: rootM.lines,\n };\n nodes.push(rootNode);\n\n const { width, height } = normalize(nodes);\n const byId = new Map(nodes.map((n) => [n.node.id, n]));\n const edges = buildEdges(root, byId);\n\n return { width, height, style: \"map\", nodes, edges, title: ast.title };\n}\n\n// ─── Style: Logic-Right (horizontal tidy tree) ───────────────────────────\n\nfunction layoutLogicRight(ast: MindmapAST): MindmapLayoutResult {\n const root = ast.root;\n const nodes: MindmapLayoutNode[] = [];\n const mw = ast.maxLabelWidth;\n\n const rootM = measureLabel(root, widthBudget(0, mw));\n const firstColLeft = rootM.width / 2 + bezierGapFor(1);\n\n const maxLW = computeMaxLW(root.children, mw);\n const cols = buildColumns(maxLW, firstColLeft, 1);\n let cursor = 0;\n for (let i = 0; i < root.children.length; i++) {\n if (i > 0) cursor += MAIN_GAP;\n const { height } = tidyRight(root.children[i], cursor, i, cols, mw, maxLW, nodes);\n cursor += height;\n }\n const totalHeight = cursor;\n\n const rootNode: MindmapLayoutNode = {\n node: root,\n x: 0,\n y: totalHeight / 2,\n side: \"center\",\n branchIndex: -1,\n labelWidth: rootM.width,\n labelHeight: rootM.height,\n fontSize: fontSizeOf(0),\n lines: rootM.lines,\n };\n nodes.push(rootNode);\n\n const { width, height } = normalize(nodes);\n const byId = new Map(nodes.map((n) => [n.node.id, n]));\n const edges = buildEdges(root, byId);\n\n return { width, height, style: \"logic-right\", nodes, edges, title: ast.title };\n}\n\n// ─── Dispatcher ──────────────────────────────────────────────────────────\n\nexport function layoutMindmap(ast: MindmapAST): MindmapLayoutResult {\n const style: MindmapStyle = ast.style;\n if (style === \"logic-right\") return layoutLogicRight(ast);\n return layoutMap(ast);\n}\n\nexport { fontSizeOf, lineHeightOf, LINE_GAP, UNDERLINE_GAP, underlineWidthFor };\n","import type { InlineToken, MindmapAST, MindmapLayoutNode, MindmapLabelLine } from \"../../core/types\";\nimport { resolveMindmapTheme, type MindmapTokens } from \"../../core/theme\";\nimport type { ResolvedTheme } from \"../../core/theme\";\nimport {\n svgRoot,\n group,\n rect,\n path as svgPath,\n title as svgTitle,\n desc as svgDesc,\n el,\n escapeXml,\n} from \"../../core/svg\";\nimport { parseMindmap } from \"./parser\";\nimport { layoutMindmap, lineHeightOf, UNDERLINE_GAP, underlineWidthFor } from \"./layout\";\nimport { tokensToPlainText } from \"./inline\";\n\ntype Theme = ResolvedTheme<MindmapTokens>;\n\n// Monochrome theme halves all stroke widths so a pure-black line doesn't\n// overpower the text. Applied uniformly via this scale factor.\nfunction strokeScale(theme: Theme): number {\n return theme.branchPalette.length <= 1 ? 0.7 : 1;\n}\n\nfunction paletteColor(theme: Theme, branchIndex: number): string {\n if (branchIndex < 0) return theme.centralFill;\n return theme.branchPalette[branchIndex % theme.branchPalette.length];\n}\n\n// ─── Inline-token rendering ──────────────────────────────────────────────\n//\n// Each `MindmapLabelLine` becomes one `<text>` element positioned at its\n// baseline y. The line's tokens are emitted as `<tspan>`s, each with its\n// own font-weight/style/fill and a measured x offset. Code tokens additionally\n// get a background `<rect>` drawn BEFORE the text element (rect list returned\n// separately so it renders under the tspans). Link tokens wrap in `<a>`.\n\ninterface LineRenderResult {\n textElement: string;\n decorations: string[]; // rects/lines drawn under text (code bg, checkbox)\n}\n\nfunction renderLine(\n line: MindmapLabelLine,\n leftX: number, // fixed left edge for all lines in this node (left-aligned)\n cy: number, // vertical center of the line\n fontSize: number,\n fontFamily: string,\n fontWeight: number,\n theme: Theme\n): LineRenderResult {\n const baselineY = cy + fontSize * 0.35;\n\n // Build tspans AND decorations in sequence, tracking cursor.\n const tspans: string[] = [];\n const decorations: string[] = [];\n let cursor = leftX;\n\n const emit = (tok: InlineToken, inheritedHref?: string) => {\n switch (tok.kind) {\n case \"text\": {\n const w = measureToken(tok, fontSize);\n tspans.push(\n tspan({\n x: cursor,\n y: baselineY,\n fill: inheritedHref ? theme.linkColor : theme.text,\n \"font-weight\": tok.bold ? 700 : fontWeight,\n \"font-style\": tok.italic ? \"italic\" : undefined,\n \"text-decoration\": inheritedHref ? \"underline\" : undefined,\n }, tok.value)\n );\n cursor += w;\n break;\n }\n case \"code\": {\n const w = measureToken(tok, fontSize);\n // Background pill — sits under text\n decorations.push(rect({\n x: cursor,\n y: cy - fontSize * 0.6,\n width: w,\n height: fontSize * 1.2,\n rx: 3,\n ry: 3,\n fill: theme.codeBg,\n }));\n tspans.push(\n tspan({\n x: cursor + 2,\n y: baselineY,\n fill: theme.codeFg,\n \"font-family\": \"ui-monospace, SFMono-Regular, Menlo, Consolas, monospace\",\n \"font-size\": fontSize * 0.92,\n }, tok.value)\n );\n cursor += w;\n break;\n }\n case \"link\": {\n // Render inner tokens as if link-styled; wrap in <a>\n const aStart = `<a href=\"${escapeXml(tok.href)}\" target=\"_blank\" rel=\"noopener\">`;\n const innerStart = tspans.length;\n for (const inner of tok.value) emit(inner, tok.href);\n // Wrap the inner tspans in <a>\n const innerTspans = tspans.splice(innerStart).join(\"\");\n tspans.push(aStart + innerTspans + \"</a>\");\n break;\n }\n case \"checkbox\": {\n const size = fontSize * 0.85;\n const boxX = cursor;\n const boxY = cy - size / 2;\n decorations.push(rect({\n x: boxX,\n y: boxY,\n width: size,\n height: size,\n rx: 2,\n ry: 2,\n fill: tok.checked ? theme.checkboxFill : \"none\",\n stroke: tok.checked ? theme.checkboxFill : theme.checkboxStroke,\n \"stroke-width\": 1.5,\n }));\n if (tok.checked) {\n // Check mark\n const p = `M ${(boxX + size * 0.2).toFixed(1)} ${(boxY + size * 0.5).toFixed(1)} L ${(boxX + size * 0.42).toFixed(1)} ${(boxY + size * 0.72).toFixed(1)} L ${(boxX + size * 0.82).toFixed(1)} ${(boxY + size * 0.28).toFixed(1)}`;\n decorations.push(svgPath({\n d: p,\n fill: \"none\",\n stroke: \"#ffffff\",\n \"stroke-width\": 2,\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n }));\n }\n cursor += size + fontSize * 0.25;\n break;\n }\n }\n };\n\n for (const tok of line.tokens) emit(tok);\n\n const textElement = el(\"text\", {\n \"font-family\": fontFamily,\n \"font-size\": fontSize,\n \"font-weight\": fontWeight,\n }, tspans.join(\"\"));\n return { textElement, decorations };\n}\n\nfunction measureToken(tok: InlineToken, fs: number): number {\n switch (tok.kind) {\n case \"text\":\n return tok.value.length * fs * (tok.bold ? 0.62 : 0.58);\n case \"code\":\n return tok.value.length * fs * 0.62 + 4;\n case \"link\": {\n let w = 0;\n for (const t of tok.value) w += measureToken(t, fs);\n return w;\n }\n case \"checkbox\":\n return fs * 0.85 + fs * 0.25;\n }\n}\n\n// Manual tspan builder — svg.ts doesn't have one.\nfunction tspan(attrs: Record<string, string | number | undefined>, content: string): string {\n const pairs: string[] = [];\n for (const [k, v] of Object.entries(attrs)) {\n if (v === undefined) continue;\n pairs.push(`${k}=\"${typeof v === \"number\" ? String(v) : escapeXml(String(v))}\"`);\n }\n return `<tspan ${pairs.join(\" \")}>${escapeXml(content)}</tspan>`;\n}\n\n// ─── Unified node renderer (markmap-style underline) ────────────────────\n//\n// All nodes — root included — use the same visual model: text sits above a\n// horizontal underline that spans the label width. The incoming edge bezier\n// terminates at one end of the underline and flows seamlessly into it; the\n// outgoing bezier departs from the other end. No box, no pill, no border.\n//\n// Root uses `centralFill` (neutral) for its underline to distinguish it as\n// the trunk; branch nodes inherit their branch's palette color. Underline\n// stroke width tapers with depth — root & main branches are thickest,\n// deeper leaves thinner — keeping the visual hierarchy legible.\n\nfunction renderNode(\n n: MindmapLayoutNode,\n color: string,\n theme: Theme,\n fontFamily: string\n): string {\n const isRoot = n.node.depth === 0;\n const isMain = n.node.depth === 1;\n const fs = n.fontSize;\n const lh = lineHeightOf(fs);\n const lineCount = n.lines.length;\n\n // Label block: text block sits at TOP of labelHeight, underline at BOTTOM.\n // Text top is at (n.y - labelHeight/2); lines center at top + (i+0.5)*lh.\n const topY = n.y - n.labelHeight / 2;\n const underlineY = n.y + n.labelHeight / 2 - UNDERLINE_GAP / 2;\n\n const children: string[] = [];\n const decorations: string[] = [];\n const weight = isRoot ? 700 : isMain ? 600 : 400;\n\n // All lines start at the column's left edge (same as underline left).\n // Uses equalized labelWidth so all same-depth nodes are flush-left aligned.\n const textLeft = n.x - n.labelWidth / 2;\n\n for (let i = 0; i < lineCount; i++) {\n const line = n.lines[i];\n const cy = topY + (i + 0.5) * lh;\n const r = renderLine(line, textLeft, cy, fs, fontFamily, weight, theme);\n decorations.push(...r.decorations);\n children.push(r.textElement);\n }\n\n // Underline — matches the incoming bezier's terminus Y, so edge+line\n // read as one continuous stroke.\n const ux1 = n.x - n.labelWidth / 2;\n const ux2 = n.x + n.labelWidth / 2;\n const sw = underlineWidthFor(n.node.depth) * strokeScale(theme);\n children.push(\n el(\"line\", {\n x1: ux1,\n y1: underlineY,\n x2: ux2,\n y2: underlineY,\n stroke: color,\n \"stroke-width\": sw,\n \"stroke-linecap\": \"round\",\n })\n );\n\n const cls = isRoot\n ? \"schematex-mindmap-central\"\n : isMain\n ? \"schematex-mindmap-main\"\n : \"schematex-mindmap-leaf\";\n\n return group(\n {\n class: cls,\n \"data-node-id\": n.node.id,\n \"data-depth\": n.node.depth,\n \"data-branch-idx\": n.branchIndex,\n },\n [...decorations, ...children]\n );\n}\n\n// ─── Top-level render ────────────────────────────────────────────────────\n\nexport function renderMindmapAST(\n ast: MindmapAST,\n themeName = \"default\",\n fontFamily = \"system-ui, -apple-system, sans-serif\"\n): string {\n const theme = resolveMindmapTheme(ast.themeOverride ?? themeName);\n const layout = layoutMindmap(ast);\n const byId = new Map(layout.nodes.map((n) => [n.node.id, n]));\n\n const edgeSvgs: string[] = [];\n for (const e of layout.edges) {\n const target = byId.get(e.to);\n if (!target) continue;\n const color = paletteColor(theme, target.branchIndex);\n edgeSvgs.push(\n svgPath({\n d: e.path,\n fill: \"none\",\n stroke: color,\n \"stroke-width\": e.width,\n \"stroke-linecap\": \"round\",\n })\n );\n }\n\n const nodeSvgs: string[] = [];\n for (const n of layout.nodes) {\n const color = n.node.depth === 0 ? theme.centralFill : paletteColor(theme, n.branchIndex);\n nodeSvgs.push(renderNode(n, color, theme, fontFamily));\n }\n\n const title = ast.title ?? tokensToPlainText(ast.root.tokens);\n\n return svgRoot(\n {\n viewBox: `0 0 ${layout.width.toFixed(1)} ${layout.height.toFixed(1)}`,\n width: layout.width.toFixed(1),\n height: layout.height.toFixed(1),\n role: \"graphics-document\",\n \"aria-label\": `Mindmap: ${escapeXml(title)}`,\n },\n [\n svgTitle(title),\n svgDesc(`${layout.style} mindmap with ${layout.nodes.length} nodes`),\n rect({ x: 0, y: 0, width: layout.width, height: layout.height, fill: theme.bg }),\n group({ class: \"schematex-mindmap-edges\", \"aria-hidden\": \"true\" }, edgeSvgs),\n group({ class: \"schematex-mindmap-nodes\" }, nodeSvgs),\n ]\n );\n}\n\nexport function renderMindmap(text: string, opts?: { theme?: string; fontFamily?: string }): string {\n const ast = parseMindmap(text);\n return renderMindmapAST(ast, opts?.theme, opts?.fontFamily);\n}\n","import type { DiagramPlugin, RenderConfig } from \"../../core/types\";\nimport { parseMindmap } from \"./parser\";\nimport { renderMindmap } from \"./renderer\";\n\nexport const mindmap: DiagramPlugin = {\n type: \"mindmap\",\n detect(text: string): boolean {\n const lines = text.trim().split(\"\\n\");\n const first = lines[0]?.trim().toLowerCase() ?? \"\";\n if (first.startsWith(\"mindmap\")) return true;\n // Detect markdown-heading DSL: first non-directive line starts with `# `\n for (const ln of lines) {\n const t = ln.trim();\n if (!t) continue;\n if (t.startsWith(\"%%\")) continue;\n return /^#\\s+\\S/.test(t);\n }\n return false;\n },\n parse: parseMindmap,\n\n render(text: string, config?: RenderConfig): string {\n return renderMindmap(text, {\n theme: config?.theme,\n fontFamily: config?.fontFamily,\n });\n },\n};\n\nexport { parseMindmap } from \"./parser\";\nexport { layoutMindmap } from \"./layout\";\nexport { renderMindmap, renderMindmapAST } from \"./renderer\";\n","import type {\n MatrixAST,\n MatrixAxis,\n MatrixQuadrantAnnotation,\n MatrixTemplate,\n MatrixCellLabel,\n} from \"./types\";\n\nexport interface TemplateSpec {\n title?: string;\n grid: \"2x2\" | \"3x3\" | \"NxM\";\n cols?: number;\n rows?: number;\n mode?: \"quadrant\" | \"heatmap\";\n xAxis: MatrixAxis;\n yAxis: MatrixAxis;\n annotations?: MatrixQuadrantAnnotation[];\n cellLabels?: MatrixCellLabel[];\n rowLabels?: string[];\n colLabels?: string[];\n}\n\nexport const TEMPLATES: Record<MatrixTemplate, TemplateSpec> = {\n \"eisenhower\": {\n grid: \"2x2\",\n xAxis: { low: \"Urgent\", high: \"Not Urgent\" },\n yAxis: { low: \"Not Important\", high: \"Important\" },\n annotations: [\n { q: 1, label: \"Schedule\" },\n { q: 2, label: \"Do First\" },\n { q: 3, label: \"Delete\" },\n { q: 4, label: \"Delegate\" },\n ],\n },\n \"impact-effort\": {\n grid: \"2x2\",\n xAxis: { low: \"Low Effort\", high: \"High Effort\" },\n yAxis: { low: \"Low Impact\", high: \"High Impact\" },\n annotations: [\n { q: 1, label: \"Major Projects\" },\n { q: 2, label: \"Quick Wins\" },\n { q: 3, label: \"Fill-ins\" },\n { q: 4, label: \"Thankless\" },\n ],\n },\n \"rice\": {\n grid: \"2x2\",\n xAxis: { low: \"Low Effort\", high: \"High Effort\" },\n yAxis: { low: \"Low Reach × Impact\", high: \"High Reach × Impact\" },\n annotations: [\n { q: 1, label: \"Strategic Bets\" },\n { q: 2, label: \"High RICE\" },\n { q: 3, label: \"Backlog\" },\n { q: 4, label: \"Reconsider\" },\n ],\n },\n \"bcg\": {\n grid: \"2x2\",\n // BCG convention: high market share on left (x-axis reversed)\n xAxis: { low: \"High Market Share\", high: \"Low Market Share\" },\n yAxis: { low: \"Low Growth\", high: \"High Growth\" },\n annotations: [\n { q: 1, label: \"Question Marks\" },\n { q: 2, label: \"Stars\" },\n { q: 3, label: \"Cash Cows\" },\n { q: 4, label: \"Dogs\" },\n ],\n },\n \"ansoff\": {\n grid: \"2x2\",\n xAxis: { low: \"Existing Products\", high: \"New Products\" },\n yAxis: { low: \"Existing Markets\", high: \"New Markets\" },\n annotations: [\n { q: 1, label: \"Diversification\" },\n { q: 2, label: \"Market Development\" },\n { q: 3, label: \"Market Penetration\" },\n { q: 4, label: \"Product Development\" },\n ],\n },\n \"johari\": {\n grid: \"2x2\",\n xAxis: { low: \"Known to Self\", high: \"Not Known to Self\" },\n yAxis: { low: \"Not Known to Others\", high: \"Known to Others\" },\n annotations: [\n { q: 1, label: \"Blind\" },\n { q: 2, label: \"Open / Arena\" },\n { q: 3, label: \"Hidden / Façade\" },\n { q: 4, label: \"Unknown\" },\n ],\n },\n \"9-box\": {\n grid: \"3x3\",\n cols: 3,\n rows: 3,\n xAxis: { low: \"Low Performance\", high: \"High Performance\" },\n yAxis: { low: \"Low Potential\", high: \"High Potential\" },\n cellLabels: [\n { col: 0, row: 2, label: \"Enigma\" },\n { col: 1, row: 2, label: \"Growth Employee\" },\n { col: 2, row: 2, label: \"Future Leader\" },\n { col: 0, row: 1, label: \"Dilemma\" },\n { col: 1, row: 1, label: \"Core Player\" },\n { col: 2, row: 1, label: \"High Impact\" },\n { col: 0, row: 0, label: \"Under-performer\" },\n { col: 1, row: 0, label: \"Effective\" },\n { col: 2, row: 0, label: \"Trusted Pro\" },\n ],\n },\n \"risk-matrix\": {\n grid: \"NxM\",\n mode: \"heatmap\",\n cols: 5,\n rows: 5,\n xAxis: { low: \"Negligible\", high: \"Severe\" },\n yAxis: { low: \"Rare\", high: \"Certain\" },\n rowLabels: [\"Rare\", \"Unlikely\", \"Possible\", \"Likely\", \"Certain\"],\n colLabels: [\"Negligible\", \"Minor\", \"Moderate\", \"Major\", \"Severe\"],\n },\n};\n\nexport function resolveTemplate(name: string): TemplateSpec | undefined {\n if (name in TEMPLATES) return TEMPLATES[name as MatrixTemplate];\n return undefined;\n}\n\n/**\n * Apply a template's defaults to an AST in-place (fills axes / annotations /\n * cell labels only when the DSL hasn't already set them).\n */\nexport function applyTemplateDefaults(ast: MatrixAST, spec: TemplateSpec): void {\n if (spec.grid === \"3x3\") {\n ast.grid = \"3x3\";\n ast.cols = 3;\n ast.rows = 3;\n } else if (spec.grid === \"NxM\") {\n ast.grid = \"NxM\";\n ast.cols = spec.cols ?? 5;\n ast.rows = spec.rows ?? 5;\n } else {\n ast.grid = \"2x2\";\n ast.cols = 2;\n ast.rows = 2;\n }\n if (spec.mode) ast.mode = spec.mode;\n if (!ast.xAxis.low && !ast.xAxis.high) ast.xAxis = { ...spec.xAxis };\n if (!ast.yAxis.low && !ast.yAxis.high) ast.yAxis = { ...spec.yAxis };\n if (spec.annotations && ast.annotations.length === 0) {\n ast.annotations = spec.annotations.map((a) => ({ ...a }));\n }\n if (spec.cellLabels && ast.cellLabels.length === 0) {\n ast.cellLabels = spec.cellLabels.map((c) => ({ ...c }));\n }\n if (spec.rowLabels && !ast.rowLabels) ast.rowLabels = [...spec.rowLabels];\n if (spec.colLabels && !ast.colLabels) ast.colLabels = [...spec.colLabels];\n}\n","import type {\n MatrixAST,\n MatrixPoint,\n MatrixCell,\n MatrixConfig,\n MatrixAxis,\n LabelCollisionMode,\n MatrixTemplate,\n} from \"./types\";\nimport { resolveTemplate, applyTemplateDefaults } from \"./templates\";\n\nconst TEMPLATE_NAMES: ReadonlySet<string> = new Set([\n \"eisenhower\",\n \"impact-effort\",\n \"rice\",\n \"bcg\",\n \"ansoff\",\n \"johari\",\n \"9-box\",\n \"risk-matrix\",\n]);\n\nconst DEFAULT_CONFIG: MatrixConfig = {\n quadrantBg: true,\n gridLines: true,\n axisArrows: true,\n labelCollision: \"auto\",\n bubbleScale: \"area\",\n quadrantAnnotations: true,\n legendPosition: \"bottom-right\",\n offChartPolicy: \"clamp-badge\",\n showAxis: \"auto\",\n margins: false,\n};\n\ninterface ParseState {\n ast: MatrixAST;\n pointIdSeq: number;\n}\n\nfunction emptyAxis(): MatrixAxis {\n return { low: \"\", high: \"\" };\n}\n\nfunction quadrantToCell(q: 1 | 2 | 3 | 4): { col: number; row: number } {\n // 2×2 mapping: Q1=top-right, Q2=top-left, Q3=bottom-left, Q4=bottom-right\n // (rows: 0=bottom, 1=top)\n switch (q) {\n case 1: return { col: 1, row: 1 };\n case 2: return { col: 0, row: 1 };\n case 3: return { col: 0, row: 0 };\n case 4: return { col: 1, row: 0 };\n }\n}\n\nfunction newAST(): MatrixAST {\n return {\n type: \"matrix\",\n mode: \"quadrant\",\n grid: \"2x2\",\n cols: 2,\n rows: 2,\n xAxis: emptyAxis(),\n yAxis: emptyAxis(),\n points: [],\n cells: [],\n cellLabels: [],\n annotations: [],\n config: { ...DEFAULT_CONFIG },\n };\n}\n\nfunction stripQuotes(s: string): string {\n const t = s.trim();\n if ((t.startsWith('\"') && t.endsWith('\"')) || (t.startsWith(\"'\") && t.endsWith(\"'\"))) {\n return t.slice(1, -1);\n }\n return t;\n}\n\nfunction readQuoted(line: string, from: number): { text: string; next: number } | null {\n // skip whitespace\n let i = from;\n while (i < line.length && /\\s/.test(line[i]!)) i++;\n if (line[i] !== '\"' && line[i] !== \"'\") return null;\n const quote = line[i]!;\n const start = i + 1;\n let end = start;\n while (end < line.length && line[end] !== quote) end++;\n if (end >= line.length) return null;\n return { text: line.slice(start, end), next: end + 1 };\n}\n\nfunction parseAxis(raw: string): MatrixAxis {\n // \"Low Effort → High Effort\" or \"High Market Share ← Low Market Share\"\n // or \"Low → High\" or \"Low ↑ High\" etc.\n const arrowMatch = raw.match(/\\s*(→|↑|->|>|↓|←|<-|<)\\s*/);\n if (arrowMatch) {\n const arrow = arrowMatch[1]!;\n const idx = arrowMatch.index!;\n const left = raw.slice(0, idx).trim();\n const right = raw.slice(idx + arrowMatch[0].length).trim();\n const reversed = arrow === \"←\" || arrow === \"<-\" || arrow === \"<\";\n if (reversed) {\n return { low: right, high: left, reversed: true };\n }\n return { low: left, high: right };\n }\n // Plain text: treat as high label, low stays empty\n return { low: \"\", high: raw.trim() };\n}\n\nfunction parseNumberList(raw: string): string[] {\n // \"[A, B, C]\" → [\"A\",\"B\",\"C\"]\n const t = raw.trim();\n const inner = t.startsWith(\"[\") && t.endsWith(\"]\") ? t.slice(1, -1) : t;\n return inner\n .split(\",\")\n .map((s) => stripQuotes(s.trim()))\n .filter((s) => s.length > 0);\n}\n\nfunction parseProperties(\n raw: string,\n point: MatrixPoint\n): void {\n // e.g. size: 5 category: design note: \"foo\" highlight: true\n let i = 0;\n while (i < raw.length) {\n // skip whitespace\n while (i < raw.length && /\\s/.test(raw[i]!)) i++;\n if (i >= raw.length) break;\n // read key\n const keyMatch = raw.slice(i).match(/^([a-zA-Z_-]+)\\s*:\\s*/);\n if (!keyMatch) break;\n const key = keyMatch[1]!.toLowerCase();\n i += keyMatch[0].length;\n // read value: quoted, number, true/false, or bareword\n if (raw[i] === '\"' || raw[i] === \"'\") {\n const q = readQuoted(raw, i);\n if (!q) break;\n if (key === \"note\") point.note = q.text;\n else if (key === \"label\") point.label = q.text;\n i = q.next;\n } else {\n // bareword until whitespace + next \"key:\"\n const rest = raw.slice(i);\n const endMatch = rest.match(/\\s+[a-zA-Z_-]+\\s*:/);\n const end = endMatch ? endMatch.index! : rest.length;\n const val = rest.slice(0, end).trim();\n i += end;\n if (key === \"size\") {\n const n = Number(val);\n if (!Number.isNaN(n)) point.size = n;\n } else if (key === \"category\") {\n point.category = val;\n } else if (key === \"color\") {\n point.color = val;\n } else if (key === \"shape\") {\n if (val === \"circle\" || val === \"square\" || val === \"triangle\" || val === \"diamond\") {\n point.shape = val;\n }\n } else if (key === \"highlight\") {\n point.highlight = val === \"true\" || val === \"1\";\n }\n }\n }\n}\n\nfunction parsePointLine(line: string, st: ParseState): boolean {\n // `\"Label\" at (x, y) size: 3 category: infra`\n const q = readQuoted(line, 0);\n if (!q) return false;\n const rest = line.slice(q.next).trim();\n const atMatch = rest.match(/^at\\s*\\(\\s*(-?\\d+(?:\\.\\d+)?)\\s*,\\s*(-?\\d+(?:\\.\\d+)?)\\s*\\)\\s*(.*)$/);\n if (!atMatch) return false;\n const x = Number(atMatch[1]);\n const y = Number(atMatch[2]);\n const props = atMatch[3]!;\n const offChart = x < 0 || x > 1 || y < 0 || y > 1;\n const clampedX = Math.max(0, Math.min(1, x));\n const clampedY = Math.max(0, Math.min(1, y));\n const point: MatrixPoint = {\n id: `p${st.pointIdSeq++}`,\n label: q.text,\n x: clampedX,\n y: clampedY,\n offChart,\n origX: offChart ? x : undefined,\n origY: offChart ? y : undefined,\n };\n if (props) parseProperties(props, point);\n st.ast.points.push(point);\n return true;\n}\n\nfunction parseCellLine(line: string, st: ParseState): boolean {\n // `cell (i,j) value: 9 label: \"foo\"`\n const m = line.match(/^cell\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)\\s*(.*)$/i);\n if (!m) return false;\n const col = Number(m[1]);\n const row = Number(m[2]);\n const rest = m[3]!;\n const cell: MatrixCell = { col, row };\n const valMatch = rest.match(/value:\\s*(-?\\d+(?:\\.\\d+)?)/i);\n if (valMatch) cell.value = Number(valMatch[1]);\n const labMatch = rest.match(/label:\\s*\"([^\"]*)\"/i);\n if (labMatch) cell.label = labMatch[1]!;\n const lvlMatch = rest.match(/level:\\s*(strong|medium|weak)\\b/i);\n if (lvlMatch) {\n const lv = lvlMatch[1]!.toLowerCase() as \"strong\" | \"medium\" | \"weak\";\n cell.level = lv;\n if (cell.value === undefined) cell.value = lv === \"strong\" ? 3 : lv === \"medium\" ? 2 : 1;\n }\n st.ast.cells.push(cell);\n if (cell.label) {\n st.ast.cellLabels.push({ col, row, label: cell.label });\n }\n return true;\n}\n\nfunction parseConfigLine(key: string, value: string, ast: MatrixAST): void {\n const k = key.trim().toLowerCase();\n const v = value.trim();\n if (k === \"quadrantbg\") ast.config.quadrantBg = v === \"true\";\n else if (k === \"gridlines\") ast.config.gridLines = v === \"true\";\n else if (k === \"axisarrows\") ast.config.axisArrows = v === \"true\";\n else if (k === \"labelcollision\") ast.config.labelCollision = v.replace(/\"/g, \"\") as LabelCollisionMode;\n else if (k === \"bubblescale\") ast.config.bubbleScale = v === \"radius\" ? \"radius\" : \"area\";\n else if (k === \"quadrantannotations\") ast.config.quadrantAnnotations = v === \"true\";\n else if (k === \"legendposition\") {\n const t = v.replace(/\"/g, \"\") as MatrixConfig[\"legendPosition\"];\n ast.config.legendPosition = t;\n } else if (k === \"offchartpolicy\") {\n const t = v.replace(/\"/g, \"\") as MatrixConfig[\"offChartPolicy\"];\n ast.config.offChartPolicy = t;\n }\n}\n\nfunction parseHeader(line: string, ast: MatrixAST): MatrixTemplate | undefined {\n // `matrix eisenhower \"Week\"` / `matrix \"Title\"` / `matrix heatmap 5x5`\n const t = line.trim();\n const rest = t.slice(\"matrix\".length).trim();\n // heatmap NxM\n const heatMatch = rest.match(/^heatmap\\s+(\\d+)\\s*x\\s*(\\d+)\\s*(.*)$/i);\n if (heatMatch) {\n ast.mode = \"heatmap\";\n ast.grid = \"NxM\";\n ast.cols = Number(heatMatch[1]);\n ast.rows = Number(heatMatch[2]);\n const title = heatMatch[3]!.trim();\n if (title) ast.title = stripQuotes(title);\n return undefined;\n }\n // correlation [NxM] \"title\" — rows/cols come from rows:/cols: directive if not here\n const corrMatch = rest.match(/^correlation\\s*(?:(\\d+)\\s*x\\s*(\\d+))?\\s*(.*)$/i);\n if (corrMatch) {\n ast.mode = \"correlation\";\n ast.grid = \"NxM\";\n if (corrMatch[1] && corrMatch[2]) {\n ast.cols = Number(corrMatch[1]);\n ast.rows = Number(corrMatch[2]);\n }\n const title = corrMatch[3]!.trim();\n if (title) ast.title = stripQuotes(title);\n return undefined;\n }\n // template name + optional title\n const tokenMatch = rest.match(/^([a-zA-Z0-9_-]+)\\s*(.*)$/);\n if (tokenMatch) {\n const tok = tokenMatch[1]!.toLowerCase();\n const remainder = tokenMatch[2]!.trim();\n if (TEMPLATE_NAMES.has(tok)) {\n if (remainder) ast.title = stripQuotes(remainder);\n return tok as MatrixTemplate;\n }\n // treat as quoted title\n if (rest.startsWith('\"') || rest.startsWith(\"'\")) {\n ast.title = stripQuotes(rest);\n } else if (rest.length > 0) {\n ast.title = stripQuotes(rest);\n }\n }\n return undefined;\n}\n\nexport function parseMatrix(text: string): MatrixAST {\n const st: ParseState = { ast: newAST(), pointIdSeq: 0 };\n const lines = text.split(/\\r?\\n/);\n let templateName: MatrixTemplate | undefined;\n let inConfig = false;\n\n for (const raw of lines) {\n // strip trailing comments (but keep # inside quotes)\n let line = raw;\n const hashIdx = findCommentStart(line);\n if (hashIdx >= 0) line = line.slice(0, hashIdx);\n line = line.trim();\n if (!line) {\n inConfig = false;\n continue;\n }\n\n if (/^matrix\\b/i.test(line)) {\n templateName = parseHeader(line, st.ast);\n continue;\n }\n\n if (/^config\\s*:/i.test(line)) {\n inConfig = true;\n continue;\n }\n\n // config key: value (indented under `config:`)\n if (inConfig) {\n const kv = line.match(/^([a-zA-Z]+)\\s*:\\s*(.+)$/);\n if (kv) {\n parseConfigLine(kv[1]!, kv[2]!, st.ast);\n continue;\n }\n inConfig = false;\n }\n\n if (/^title\\s*:/i.test(line)) {\n st.ast.title = stripQuotes(line.replace(/^title\\s*:\\s*/i, \"\"));\n continue;\n }\n if (/^x-axis\\s*:/i.test(line)) {\n st.ast.xAxis = parseAxis(line.replace(/^x-axis\\s*:\\s*/i, \"\"));\n continue;\n }\n if (/^y-axis\\s*:/i.test(line)) {\n st.ast.yAxis = parseAxis(line.replace(/^y-axis\\s*:\\s*/i, \"\"));\n continue;\n }\n if (/^rows\\s*:/i.test(line)) {\n st.ast.rowLabels = parseNumberList(line.replace(/^rows\\s*:\\s*/i, \"\"));\n if (st.ast.mode !== \"quadrant\") st.ast.rows = st.ast.rowLabels.length;\n continue;\n }\n if (/^cols\\s*:/i.test(line)) {\n st.ast.colLabels = parseNumberList(line.replace(/^cols\\s*:\\s*/i, \"\"));\n if (st.ast.mode !== \"quadrant\") st.ast.cols = st.ast.colLabels.length;\n continue;\n }\n if (/^grid\\s*:/i.test(line)) {\n const v = line.replace(/^grid\\s*:\\s*/i, \"\").trim().toLowerCase();\n const gm = v.match(/^(\\d+)\\s*x\\s*(\\d+)$/);\n if (gm) {\n const c = Number(gm[1]);\n const r = Number(gm[2]);\n st.ast.cols = c;\n st.ast.rows = r;\n if (c === 2 && r === 2) st.ast.grid = \"2x2\";\n else if (c === 3 && r === 3) st.ast.grid = \"3x3\";\n else st.ast.grid = \"NxM\";\n }\n continue;\n }\n if (/^quadrant\\s+/i.test(line)) {\n // `quadrant Q1 \"Do First\" description: \"...\"`\n const m = line.match(/^quadrant\\s+(?:Q)?(\\d)\\s*\"([^\"]*)\"(.*)$/i);\n if (m) {\n const q = Number(m[1]) as 1 | 2 | 3 | 4;\n const rest = m[3]!.trim();\n const descMatch = rest.match(/description:\\s*\"([^\"]*)\"/i);\n const description = descMatch ? descMatch[1]! : undefined;\n if (q >= 1 && q <= 4) {\n const existing = st.ast.annotations.find((a) => a.q === q);\n if (existing) {\n existing.label = m[2]!;\n if (description) existing.description = description;\n } else {\n st.ast.annotations.push({ q, label: m[2]!, description });\n }\n }\n }\n continue;\n }\n\n if (/^axis\\s*:/i.test(line)) {\n const v = line.replace(/^axis\\s*:\\s*/i, \"\").trim().toLowerCase().replace(/\"/g, \"\");\n if (v === \"none\" || v === \"off\" || v === \"hidden\") st.ast.config.showAxis = \"off\";\n else if (v === \"on\" || v === \"show\" || v === \"visible\") st.ast.config.showAxis = \"on\";\n else st.ast.config.showAxis = \"auto\";\n continue;\n }\n\n if (/^margins\\s*:/i.test(line)) {\n const v = line.replace(/^margins\\s*:\\s*/i, \"\").trim().toLowerCase();\n st.ast.config.margins = v === \"true\" || v === \"on\" || v === \"1\";\n continue;\n }\n\n if (/^style\\s*:/i.test(line)) {\n const v = line.replace(/^style\\s*:\\s*/i, \"\").trim().toLowerCase().replace(/\"/g, \"\");\n if (v === \"table\") {\n st.ast.config.showAxis = \"off\";\n st.ast.config.axisArrows = false;\n st.ast.config.gridLines = false;\n st.ast.config.quadrantAnnotations = false;\n st.ast.style = \"table\";\n }\n continue;\n }\n\n if (/^cell\\s*\\(/i.test(line)) {\n parseCellLine(line, st);\n continue;\n }\n\n // `Q1: \"label\"` shorthand for 2×2 cellLabel (Q1=TR, Q2=TL, Q3=BL, Q4=BR)\n const qShort = line.match(/^q([1-4])\\s*:\\s*(.+)$/i);\n if (qShort) {\n const q = Number(qShort[1]) as 1 | 2 | 3 | 4;\n const labelRaw = qShort[2]!.trim();\n const label = stripQuotes(labelRaw);\n const cell = quadrantToCell(q);\n st.ast.cellLabels.push({ col: cell.col, row: cell.row, label });\n continue;\n }\n\n // point line (starts with a quote)\n if (line.startsWith('\"') || line.startsWith(\"'\")) {\n if (parsePointLine(line, st)) continue;\n }\n }\n\n // Apply template defaults last (so explicit x-axis/y-axis override template)\n if (templateName) {\n const spec = resolveTemplate(templateName);\n if (spec) {\n applyTemplateDefaults(st.ast, spec);\n st.ast.template = templateName;\n }\n }\n\n // Promote 3x3 / NxM where cols/rows already say so but grid wasn't set\n if (st.ast.cols === 3 && st.ast.rows === 3 && st.ast.grid !== \"NxM\") {\n st.ast.grid = \"3x3\";\n }\n if (st.ast.mode === \"heatmap\" || st.ast.mode === \"correlation\") st.ast.grid = \"NxM\";\n\n return st.ast;\n}\n\nfunction findCommentStart(line: string): number {\n let inQuote: string | null = null;\n for (let i = 0; i < line.length; i++) {\n const ch = line[i]!;\n if (inQuote) {\n if (ch === inQuote) inQuote = null;\n } else if (ch === '\"' || ch === \"'\") {\n inQuote = ch;\n } else if (ch === \"#\") {\n return i;\n }\n }\n return -1;\n}\n\n// also export for testing\nexport { DEFAULT_CONFIG };\n","import type { MatrixAST, MatrixPoint } from \"./types\";\n\nexport interface PlotBox {\n x0: number;\n y0: number;\n w: number;\n h: number;\n}\n\nexport interface PointLayout {\n point: MatrixPoint;\n /** Center px */\n px: number;\n py: number;\n /** Bubble radius px */\n r: number;\n /** Estimated label bbox */\n label: LabelLayout;\n}\n\nexport interface LabelLayout {\n text: string;\n /** anchor pos (where the leader line starts if external) */\n ax: number;\n ay: number;\n /** label center pos */\n lx: number;\n ly: number;\n width: number;\n height: number;\n external: boolean;\n textAnchor: \"start\" | \"middle\" | \"end\";\n}\n\nexport interface MatrixLayoutResult {\n canvasWidth: number;\n canvasHeight: number;\n plot: PlotBox;\n points: PointLayout[];\n categories: string[];\n}\n\nconst CANVAS_W = 720;\nconst CANVAS_H = 560;\nconst PADDING_X = 110;\nconst PADDING_Y = 90;\nconst CHAR_W = 6.2;\nconst LABEL_H = 14;\n\nfunction estimateWidth(text: string): number {\n // crude monospace-ish estimate — wider for CJK handled trivially\n const cjk = (text.match(/[\\u3000-\\u9fff]/g) ?? []).length;\n return (text.length - cjk) * CHAR_W + cjk * 12 + 8;\n}\n\nfunction clamp01(v: number): number {\n return Math.max(0.02, Math.min(0.98, v));\n}\n\nfunction placePoint(p: MatrixPoint, plot: PlotBox): { px: number; py: number } {\n const nx = clamp01(p.x);\n const ny = clamp01(p.y);\n const px = plot.x0 + nx * plot.w;\n const py = plot.y0 + (1 - ny) * plot.h;\n return { px, py };\n}\n\nfunction computeRadius(p: MatrixPoint, maxSize: number, plot: PlotBox, scale: \"area\" | \"radius\"): number {\n if (p.size === undefined) return 6;\n const maxRadius = Math.max(14, plot.h * 0.08);\n const minRadius = 4;\n if (maxSize <= 0) return 6;\n const ratio = p.size / maxSize;\n if (scale === \"radius\") {\n return Math.max(minRadius, ratio * maxRadius);\n }\n // area-proportional (Tufte)\n const maxArea = Math.PI * maxRadius * maxRadius;\n const area = ratio * maxArea;\n const r = Math.sqrt(area / Math.PI);\n return Math.max(minRadius, r);\n}\n\n/**\n * Force-based label collision avoidance.\n * Starts each label offset NE of its point; iterates pushing overlapping\n * bboxes apart. If a label ends up far from its point, switches it to\n * external + leader line.\n */\nfunction resolveLabelCollisions(\n points: PointLayout[],\n plot: PlotBox,\n mode: \"auto\" | \"offset-only\" | \"leader-only\" | \"off\"\n): void {\n if (mode === \"off\") {\n for (const p of points) {\n p.label.lx = p.px + p.r + 4 + p.label.width / 2;\n p.label.ly = p.py - p.r - 4;\n }\n return;\n }\n\n // init anchor\n for (const p of points) {\n p.label.ax = p.px;\n p.label.ay = p.py;\n p.label.lx = p.px + p.r + 4 + p.label.width / 2;\n p.label.ly = p.py - p.r - 4;\n p.label.external = false;\n p.label.textAnchor = \"middle\";\n }\n\n if (mode === \"leader-only\") {\n // force all to leader mode immediately\n for (const p of points) {\n p.label.external = true;\n p.label.lx = p.px + p.r + 12 + p.label.width / 2;\n p.label.ly = p.py;\n p.label.textAnchor = \"middle\";\n }\n return;\n }\n\n const PAD = 3;\n for (let iter = 0; iter < 30; iter++) {\n let moved = false;\n for (let i = 0; i < points.length; i++) {\n for (let j = i + 1; j < points.length; j++) {\n const a = points[i]!.label;\n const b = points[j]!.label;\n const ax0 = a.lx - a.width / 2 - PAD;\n const ax1 = a.lx + a.width / 2 + PAD;\n const ay0 = a.ly - a.height / 2 - PAD;\n const ay1 = a.ly + a.height / 2 + PAD;\n const bx0 = b.lx - b.width / 2 - PAD;\n const bx1 = b.lx + b.width / 2 + PAD;\n const by0 = b.ly - b.height / 2 - PAD;\n const by1 = b.ly + b.height / 2 + PAD;\n const overlapX = Math.min(ax1, bx1) - Math.max(ax0, bx0);\n const overlapY = Math.min(ay1, by1) - Math.max(ay0, by0);\n if (overlapX > 0 && overlapY > 0) {\n // push along y (smaller dimension usually), then x\n const dx = (a.lx - b.lx) || 0.1;\n const dy = (a.ly - b.ly) || 0.1;\n const len = Math.hypot(dx, dy) || 1;\n const ux = dx / len;\n const uy = dy / len;\n const step = Math.min(3, Math.min(overlapX, overlapY) / 2 + 0.5);\n a.lx += ux * step;\n a.ly += uy * step;\n b.lx -= ux * step;\n b.ly -= uy * step;\n moved = true;\n }\n }\n // keep label within plot bounds\n const lb = points[i]!.label;\n if (lb.lx - lb.width / 2 < plot.x0 + 2) lb.lx = plot.x0 + 2 + lb.width / 2;\n if (lb.lx + lb.width / 2 > plot.x0 + plot.w - 2) lb.lx = plot.x0 + plot.w - 2 - lb.width / 2;\n if (lb.ly - lb.height / 2 < plot.y0 + 2) lb.ly = plot.y0 + 2 + lb.height / 2;\n if (lb.ly + lb.height / 2 > plot.y0 + plot.h - 2) lb.ly = plot.y0 + plot.h - 2 - lb.height / 2;\n }\n if (!moved) break;\n }\n\n // Upgrade to leader line if drift is too large\n if (mode === \"auto\") {\n for (const p of points) {\n const dx = p.label.lx - p.px;\n const dy = p.label.ly - p.py;\n if (Math.hypot(dx, dy) > 40) {\n p.label.external = true;\n }\n }\n }\n}\n\nexport function layoutMatrix(ast: MatrixAST): MatrixLayoutResult {\n const canvasWidth = CANVAS_W;\n const canvasHeight = CANVAS_H;\n const plot: PlotBox = {\n x0: PADDING_X,\n y0: PADDING_Y - 30,\n w: canvasWidth - PADDING_X * 2,\n h: canvasHeight - PADDING_Y * 2,\n };\n\n const points: PointLayout[] = [];\n const categoriesSet = new Set<string>();\n\n if (ast.mode === \"quadrant\") {\n // Determine max size for bubble scaling\n let maxSize = 0;\n for (const p of ast.points) {\n if (p.size !== undefined && p.size > maxSize) maxSize = p.size;\n }\n\n for (const p of ast.points) {\n const { px, py } = placePoint(p, plot);\n const r = computeRadius(p, maxSize, plot, ast.config.bubbleScale);\n const width = estimateWidth(p.label);\n const label: LabelLayout = {\n text: p.label,\n ax: px,\n ay: py,\n lx: px + r + 4 + width / 2,\n ly: py - r - 4,\n width,\n height: LABEL_H,\n external: false,\n textAnchor: \"middle\",\n };\n points.push({ point: p, px, py, r, label });\n if (p.category) categoriesSet.add(p.category);\n }\n\n resolveLabelCollisions(points, plot, ast.config.labelCollision);\n }\n\n return {\n canvasWidth,\n canvasHeight,\n plot,\n points,\n categories: [...categoriesSet],\n };\n}\n","import type { MatrixAST, MatrixPoint } from \"./types\";\nimport { parseMatrix } from \"./parser\";\nimport { layoutMatrix, type MatrixLayoutResult, type PointLayout } from \"./layout\";\nimport {\n svgRoot,\n group,\n rect,\n circle,\n line as lineEl,\n text as textEl,\n title as titleEl,\n desc as descEl,\n polygon,\n defs,\n el,\n escapeXml,\n} from \"../../core/svg\";\n\n// Category palette (colorblind-friendly set)\nconst CATEGORY_COLORS = [\n \"#2563eb\", \"#16a34a\", \"#dc2626\", \"#9333ea\",\n \"#ea580c\", \"#0891b2\", \"#ca8a04\", \"#db2777\",\n];\n\nconst QUADRANT_TINTS: [string, string, string, string] = [\n // Q1 TR, Q2 TL, Q3 BL, Q4 BR\n \"#dbeafe\", \"#dcfce7\", \"#f3f4f6\", \"#fed7aa\",\n];\n\nconst HEAT_RAMP = [\n \"#f0fdf4\", \"#bbf7d0\", \"#fde68a\", \"#fdba74\", \"#f87171\", \"#ef4444\", \"#b91c1c\",\n];\n\nconst CSS = `\n.sx-matrix { font-family: system-ui, -apple-system, \"Segoe UI\", sans-serif; }\n.sx-matrix-title { font: 600 16px sans-serif; fill: #111; }\n.sx-matrix-grid { stroke: #e5e7eb; stroke-width: 1; fill: none; }\n.sx-matrix-mid { stroke: #9ca3af; stroke-width: 1.2; stroke-dasharray: 4 3; fill: none; }\n.sx-matrix-plot-border { stroke: #374151; stroke-width: 1.2; fill: none; }\n.sx-matrix-axis-label { font: 500 12px sans-serif; fill: #374151; }\n.sx-matrix-axis-end { font: 500 11px sans-serif; fill: #6b7280; }\n.sx-matrix-quad-annot { font: 600 13px sans-serif; fill: #475569; opacity: 0.75; }\n.sx-matrix-quad-desc { font: 400 10.5px sans-serif; fill: #64748b; opacity: 0.85; }\n.sx-matrix-corr-header { font: 600 11.5px sans-serif; fill: #1f2937; text-anchor: middle; }\n.sx-matrix-corr-rowlabel { font: 500 11.5px sans-serif; fill: #1f2937; text-anchor: end; dominant-baseline: central; }\n.sx-matrix-corr-margin { font: 500 11px sans-serif; fill: #374151; text-anchor: middle; dominant-baseline: central; }\n.sx-matrix-corr-margin-best { font: 700 11.5px sans-serif; fill: #111; text-anchor: middle; dominant-baseline: central; }\n.sx-matrix-corr-grid { stroke: #d1d5db; stroke-width: 0.8; fill: none; }\n.sx-matrix-corr-rowbg-a { fill: #f0fdf4; }\n.sx-matrix-corr-rowbg-b { fill: #fff; }\n.sx-matrix-cell-label { font: 500 12px sans-serif; fill: #1f2937; text-anchor: middle; }\n.sx-matrix-cell-title { font: 600 13px sans-serif; fill: #111827; }\n.sx-matrix-cell-subtitle { font: 400 11px sans-serif; fill: #6b7280; }\n.sx-matrix-cell-item { font: 500 12px sans-serif; fill: #1f2937; }\n.sx-matrix-cell-value { font: 600 18px sans-serif; fill: #111; text-anchor: middle; }\n.sx-matrix-bubble { stroke-width: 1.5; }\n.sx-matrix-label { font: 500 11px sans-serif; fill: #111827; text-anchor: middle; dominant-baseline: central; pointer-events: none; }\n.sx-matrix-leader { stroke: #94a3b8; stroke-width: 0.6; opacity: 0.7; fill: none; }\n.sx-matrix-legend-text { font: 500 11px sans-serif; fill: #374151; }\n.sx-matrix-offchart { fill: #ea580c; }\n`.trim();\n\nfunction axisArrow(): string {\n return el(\n \"marker\",\n {\n id: \"sx-matrix-arrow\",\n viewBox: \"0 0 10 10\",\n refX: 8,\n refY: 5,\n markerWidth: 8,\n markerHeight: 8,\n orient: \"auto-start-reverse\",\n },\n [el(\"path\", { d: \"M0,0 L10,5 L0,10 z\", fill: \"#374151\" })]\n );\n}\n\nfunction bubbleFill(p: MatrixPoint, categories: string[]): string {\n if (p.color) return p.color;\n if (p.category) {\n const idx = categories.indexOf(p.category);\n if (idx >= 0) return CATEGORY_COLORS[idx % CATEGORY_COLORS.length]!;\n }\n return \"#2563eb\";\n}\n\nfunction renderQuadrantBackground(ast: MatrixAST, lay: MatrixLayoutResult): string {\n if (!ast.config.quadrantBg) return \"\";\n const { plot } = lay;\n\n if (ast.grid === \"2x2\") {\n const halfW = plot.w / 2;\n const halfH = plot.h / 2;\n // Q1 TR, Q2 TL, Q3 BL, Q4 BR\n const rects = [\n { x: plot.x0 + halfW, y: plot.y0, w: halfW, h: halfH, fill: QUADRANT_TINTS[0] },\n { x: plot.x0, y: plot.y0, w: halfW, h: halfH, fill: QUADRANT_TINTS[1] },\n { x: plot.x0, y: plot.y0 + halfH, w: halfW, h: halfH, fill: QUADRANT_TINTS[2] },\n { x: plot.x0 + halfW, y: plot.y0 + halfH, w: halfW, h: halfH, fill: QUADRANT_TINTS[3] },\n ];\n return group(\n { id: \"sx-matrix-quad-bg\" },\n rects.map((r) =>\n rect({ x: r.x, y: r.y, width: r.w, height: r.h, fill: r.fill, \"fill-opacity\": 0.55 })\n )\n );\n }\n\n // 3×3 table mode: subtle diagonal heatmap (top-right green, mid yellow, bottom-left red).\n // Convention used in GE/McKinsey 9-box: anti-diagonal severity from \"stars\" → \"PIP\".\n if (ast.grid === \"3x3\" && ast.style === \"table\") {\n const cellW = plot.w / 3;\n const cellH = plot.h / 3;\n // score = col + row (0..4). 4 = top-right (best), 0 = bottom-left (worst).\n const TINT_3x3 = [\n \"#fee2e2\", // 0: red-100\n \"#fef3c7\", // 1: amber-100\n \"#fef3c7\", // 2: amber-100\n \"#dcfce7\", // 3: green-100\n \"#dcfce7\", // 4: green-100\n ];\n const cells: string[] = [];\n for (let col = 0; col < 3; col++) {\n for (let row = 0; row < 3; row++) {\n const score = col + row;\n const fill = TINT_3x3[score]!;\n const x = plot.x0 + col * cellW;\n const y = plot.y0 + (2 - row) * cellH;\n cells.push(\n rect({ x, y, width: cellW, height: cellH, fill, \"fill-opacity\": 0.6 })\n );\n }\n }\n return group({ id: \"sx-matrix-quad-bg\" }, cells);\n }\n\n return \"\";\n}\n\nfunction renderTableChrome(ast: MatrixAST, lay: MatrixLayoutResult): string {\n // Always draw grid lines + outer border in table mode (overrides gridLines:false\n // that style:table sets). Without this, cells are invisible — text floats.\n if (ast.style !== \"table\") return \"\";\n if (ast.mode !== \"quadrant\") return \"\";\n const { plot } = lay;\n const lines: string[] = [];\n for (let i = 1; i < ast.cols; i++) {\n const x = plot.x0 + (plot.w * i) / ast.cols;\n lines.push(lineEl({ x1: x, y1: plot.y0, x2: x, y2: plot.y0 + plot.h, class: \"sx-matrix-grid\" }));\n }\n for (let j = 1; j < ast.rows; j++) {\n const y = plot.y0 + (plot.h * j) / ast.rows;\n lines.push(lineEl({ x1: plot.x0, y1: y, x2: plot.x0 + plot.w, y2: y, class: \"sx-matrix-grid\" }));\n }\n lines.push(\n rect({\n x: plot.x0,\n y: plot.y0,\n width: plot.w,\n height: plot.h,\n class: \"sx-matrix-plot-border\",\n fill: \"none\",\n })\n );\n return group({ id: \"sx-matrix-table-chrome\" }, lines);\n}\n\nfunction renderGrid(ast: MatrixAST, lay: MatrixLayoutResult): string {\n if (!ast.config.gridLines) return \"\";\n if (ast.mode === \"correlation\") return \"\"; // correlation draws its own grid\n const { plot } = lay;\n const lines: string[] = [];\n const cols = ast.cols;\n const rows = ast.rows;\n for (let i = 1; i < cols; i++) {\n const x = plot.x0 + (plot.w * i) / cols;\n const cls = cols === 2 && i === 1 ? \"sx-matrix-mid\" : \"sx-matrix-grid\";\n lines.push(lineEl({ x1: x, y1: plot.y0, x2: x, y2: plot.y0 + plot.h, class: cls }));\n }\n for (let j = 1; j < rows; j++) {\n const y = plot.y0 + (plot.h * j) / rows;\n const cls = rows === 2 && j === 1 ? \"sx-matrix-mid\" : \"sx-matrix-grid\";\n lines.push(lineEl({ x1: plot.x0, y1: y, x2: plot.x0 + plot.w, y2: y, class: cls }));\n }\n // plot border\n lines.push(\n rect({\n x: plot.x0,\n y: plot.y0,\n width: plot.w,\n height: plot.h,\n class: \"sx-matrix-plot-border\",\n fill: \"none\",\n })\n );\n return group({ id: \"sx-matrix-grid\" }, lines);\n}\n\nfunction shouldShowAxis(ast: MatrixAST): boolean {\n if (ast.config.showAxis === \"on\") return true;\n if (ast.config.showAxis === \"off\") return false;\n return ast.mode === \"quadrant\";\n}\n\nfunction renderAxes(ast: MatrixAST, lay: MatrixLayoutResult): string {\n if (!shouldShowAxis(ast)) return \"\";\n const { plot } = lay;\n const els: string[] = [];\n const marker = ast.config.axisArrows ? { \"marker-end\": \"url(#sx-matrix-arrow)\" } : {};\n\n // x-axis line at bottom of plot\n const xy = plot.y0 + plot.h + 14;\n const yx = plot.x0 - 14;\n els.push(\n lineEl({\n x1: plot.x0,\n y1: xy,\n x2: plot.x0 + plot.w,\n y2: xy,\n stroke: \"#374151\",\n \"stroke-width\": 1.2,\n ...marker,\n })\n );\n els.push(\n lineEl({\n x1: yx,\n y1: plot.y0 + plot.h,\n x2: yx,\n y2: plot.y0,\n stroke: \"#374151\",\n \"stroke-width\": 1.2,\n ...marker,\n })\n );\n\n // x-axis end labels\n if (ast.xAxis.low) {\n els.push(\n textEl(\n { x: plot.x0, y: xy + 20, class: \"sx-matrix-axis-end\", \"text-anchor\": \"start\" },\n ast.xAxis.low\n )\n );\n }\n if (ast.xAxis.high) {\n els.push(\n textEl(\n { x: plot.x0 + plot.w, y: xy + 20, class: \"sx-matrix-axis-end\", \"text-anchor\": \"end\" },\n ast.xAxis.high\n )\n );\n }\n // y-axis end labels (rotated)\n if (ast.yAxis.low) {\n els.push(\n textEl(\n {\n x: yx - 24,\n y: plot.y0 + plot.h,\n class: \"sx-matrix-axis-end\",\n \"text-anchor\": \"end\",\n transform: `rotate(-90 ${yx - 24} ${plot.y0 + plot.h})`,\n },\n ast.yAxis.low\n )\n );\n }\n if (ast.yAxis.high) {\n els.push(\n textEl(\n {\n x: yx - 24,\n y: plot.y0,\n class: \"sx-matrix-axis-end\",\n \"text-anchor\": \"start\",\n transform: `rotate(-90 ${yx - 24} ${plot.y0})`,\n },\n ast.yAxis.high\n )\n );\n }\n return group({ id: \"sx-matrix-axes\" }, els);\n}\n\nfunction renderQuadAnnotations(ast: MatrixAST, lay: MatrixLayoutResult): string {\n if (!ast.config.quadrantAnnotations || ast.grid !== \"2x2\" || ast.annotations.length === 0) return \"\";\n // table style renders annotations as cell-titles inside renderCellTable\n if (ast.style === \"table\") return \"\";\n const { plot } = lay;\n const halfW = plot.w / 2;\n const halfH = plot.h / 2;\n const padding = 14;\n const positions: Record<1 | 2 | 3 | 4, { x: number; y: number; anchor: string }> = {\n 1: { x: plot.x0 + plot.w - padding, y: plot.y0 + padding + 14, anchor: \"end\" }, // TR\n 2: { x: plot.x0 + padding, y: plot.y0 + padding + 14, anchor: \"start\" }, // TL\n 3: { x: plot.x0 + padding, y: plot.y0 + plot.h - padding, anchor: \"start\" }, // BL\n 4: { x: plot.x0 + plot.w - padding, y: plot.y0 + plot.h - padding, anchor: \"end\" }, // BR\n };\n // suppress unused warnings\n void halfW;\n void halfH;\n\n const nodes: string[] = [];\n for (const a of ast.annotations) {\n const pos = positions[a.q];\n const growsUp = a.q === 3 || a.q === 4;\n const descLines = a.description ? wrapLabel(a.description, 28) : [];\n // For bottom quadrants, stack label + desc so description goes ABOVE label.\n const labelY = growsUp && descLines.length > 0 ? pos.y - descLines.length * 12 : pos.y;\n nodes.push(\n textEl(\n { x: pos.x, y: labelY, class: \"sx-matrix-quad-annot\", \"text-anchor\": pos.anchor },\n a.label\n )\n );\n for (let i = 0; i < descLines.length; i++) {\n nodes.push(\n textEl(\n {\n x: pos.x,\n y: labelY + 14 + i * 12,\n class: \"sx-matrix-quad-desc\",\n \"text-anchor\": pos.anchor,\n },\n descLines[i]!\n )\n );\n }\n }\n return group({ id: \"sx-matrix-quad-annot\" }, nodes);\n}\n\nfunction wrapLabel(text: string, maxChars: number): string[] {\n const words = text.split(/\\s+/);\n const out: string[] = [];\n let cur = \"\";\n for (const w of words) {\n if ((cur + \" \" + w).trim().length > maxChars) {\n if (cur) out.push(cur);\n cur = w;\n } else {\n cur = (cur ? cur + \" \" : \"\") + w;\n }\n }\n if (cur) out.push(cur);\n return out;\n}\n\nfunction quadrantOf(col: number, row: number, cols: number, rows: number): 1 | 2 | 3 | 4 | undefined {\n if (cols !== 2 || rows !== 2) return undefined;\n if (col === 1 && row === 1) return 1; // TR\n if (col === 0 && row === 1) return 2; // TL\n if (col === 0 && row === 0) return 3; // BL\n if (col === 1 && row === 0) return 4; // BR\n return undefined;\n}\n\nfunction renderCellLabels(ast: MatrixAST, lay: MatrixLayoutResult): string {\n if (ast.mode !== \"quadrant\" || ast.cellLabels.length === 0) return \"\";\n if (ast.grid !== \"2x2\" && ast.grid !== \"3x3\") return \"\";\n\n const { plot } = lay;\n const cellW = plot.w / ast.cols;\n const cellH = plot.h / ast.rows;\n // Group cellLabels by (col,row) so multiple `cell (..)` lines stack as a list\n const buckets = new Map<string, string[]>();\n for (const cl of ast.cellLabels) {\n const k = `${cl.col},${cl.row}`;\n const arr = buckets.get(k) ?? [];\n arr.push(cl.label);\n buckets.set(k, arr);\n }\n\n const nodes: string[] = [];\n const maxCharsPerLine = Math.max(8, Math.floor((cellW - 24) / 6.6));\n const tableMode = ast.style === \"table\";\n\n // In table mode, also render cell titles for annotated quadrants that have NO items —\n // gives the canonical \"Eisenhower 4-quadrant grid\" feel even with sparse data.\n if (tableMode && ast.grid === \"2x2\") {\n for (const a of ast.annotations) {\n const cell = (() => {\n switch (a.q) {\n case 1: return { col: 1, row: 1 };\n case 2: return { col: 0, row: 1 };\n case 3: return { col: 0, row: 0 };\n case 4: return { col: 1, row: 0 };\n }\n })();\n const k = `${cell.col},${cell.row}`;\n if (!buckets.has(k)) buckets.set(k, []);\n }\n }\n\n for (const [k, items] of buckets) {\n const [col, row] = k.split(\",\").map(Number) as [number, number];\n const cellX = plot.x0 + cellW * col;\n const cellY = plot.y0 + cellH * (ast.rows - 1 - row);\n\n // Single label, no quadrant title → keep classic centered placement (3x3 9-box look)\n if (items.length === 1 && !tableMode) {\n const cx = cellX + cellW / 2;\n const cy = cellY + cellH / 2;\n nodes.push(textEl({ x: cx, y: cy, class: \"sx-matrix-cell-label\" }, items[0]!));\n continue;\n }\n\n // Table-style: optional cell-title (quadrant annotation) + bullet list, top-anchored\n const padX = 14;\n const padY = 14;\n let cursorY = cellY + padY + 12;\n\n if (tableMode) {\n const q = quadrantOf(col, row, ast.cols, ast.rows);\n const annot = q ? ast.annotations.find((a) => a.q === q) : undefined;\n if (annot) {\n nodes.push(\n textEl(\n { x: cellX + cellW / 2, y: cursorY, class: \"sx-matrix-cell-title\", \"text-anchor\": \"middle\" },\n annot.label,\n ),\n );\n cursorY += 22;\n if (annot.description) {\n const descLines = wrapLabel(annot.description, Math.max(12, maxCharsPerLine));\n for (const dl of descLines) {\n nodes.push(\n textEl(\n { x: cellX + cellW / 2, y: cursorY, class: \"sx-matrix-cell-subtitle\", \"text-anchor\": \"middle\" },\n dl,\n ),\n );\n cursorY += 13;\n }\n cursorY += 4;\n }\n }\n }\n\n for (const item of items) {\n const lines = wrapLabel(item, maxCharsPerLine);\n for (let i = 0; i < lines.length; i++) {\n const prefix = tableMode ? (i === 0 ? \"• \" : \" \") : \"\";\n nodes.push(\n textEl(\n { x: cellX + padX, y: cursorY, class: \"sx-matrix-cell-item\", \"text-anchor\": \"start\" },\n prefix + lines[i]!,\n ),\n );\n cursorY += 16;\n }\n }\n }\n\n return group({ id: \"sx-matrix-cell-labels\" }, nodes);\n}\n\nfunction renderHeatmap(ast: MatrixAST, lay: MatrixLayoutResult): string {\n if (ast.mode !== \"heatmap\") return \"\";\n const { plot } = lay;\n const cellW = plot.w / ast.cols;\n const cellH = plot.h / ast.rows;\n const maxVal = Math.max(\n 1,\n ...ast.cells.map((c) => c.value ?? (c.col + 1) * (c.row + 1))\n );\n\n const cells: string[] = [];\n\n // Color every cell in the grid (use cell.value if set, else derived product)\n for (let col = 0; col < ast.cols; col++) {\n for (let row = 0; row < ast.rows; row++) {\n const found = ast.cells.find((c) => c.col === col && c.row === row);\n const value = found?.value ?? (col + 1) * (row + 1);\n const ratio = Math.min(1, value / maxVal);\n const idx = Math.min(HEAT_RAMP.length - 1, Math.floor(ratio * HEAT_RAMP.length));\n const color = HEAT_RAMP[idx]!;\n const x = plot.x0 + col * cellW;\n const y = plot.y0 + (ast.rows - 1 - row) * cellH;\n cells.push(\n rect({\n x,\n y,\n width: cellW,\n height: cellH,\n fill: color,\n stroke: \"#fff\",\n \"stroke-width\": 2,\n })\n );\n }\n }\n\n // Row labels (outside plot, left side)\n if (ast.rowLabels) {\n for (let row = 0; row < ast.rows; row++) {\n const lbl = ast.rowLabels[row];\n if (!lbl) continue;\n const y = plot.y0 + (ast.rows - 1 - row + 0.5) * cellH;\n cells.push(\n textEl(\n {\n x: plot.x0 - 8,\n y,\n class: \"sx-matrix-axis-end\",\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"central\",\n },\n lbl\n )\n );\n }\n }\n // Col labels (bottom)\n if (ast.colLabels) {\n for (let col = 0; col < ast.cols; col++) {\n const lbl = ast.colLabels[col];\n if (!lbl) continue;\n const x = plot.x0 + (col + 0.5) * cellW;\n cells.push(\n textEl(\n {\n x,\n y: plot.y0 + plot.h + 16,\n class: \"sx-matrix-axis-end\",\n \"text-anchor\": \"middle\",\n },\n lbl\n )\n );\n }\n }\n\n // Cell labels\n for (const cl of ast.cellLabels) {\n const cx = plot.x0 + cellW * (cl.col + 0.5);\n const cy = plot.y0 + cellH * (ast.rows - 1 - cl.row + 0.5);\n // wrap labels\n const words = cl.label.split(/\\s+/);\n const lines: string[] = [];\n let cur = \"\";\n for (const w of words) {\n if ((cur + \" \" + w).trim().length > 14) {\n if (cur) lines.push(cur);\n cur = w;\n } else {\n cur = (cur ? cur + \" \" : \"\") + w;\n }\n }\n if (cur) lines.push(cur);\n const lineH = 13;\n const startY = cy - ((lines.length - 1) * lineH) / 2;\n for (let i = 0; i < lines.length; i++) {\n cells.push(\n textEl(\n {\n x: cx,\n y: startY + i * lineH,\n class: \"sx-matrix-cell-label\",\n \"dominant-baseline\": \"central\",\n },\n lines[i]!\n )\n );\n }\n }\n\n return group({ id: \"sx-matrix-heatmap\" }, cells);\n}\n\nconst DOT_COLORS: Record<\"strong\" | \"medium\" | \"weak\", string> = {\n strong: \"#16a34a\",\n medium: \"#86efac\",\n weak: \"#9ca3af\",\n};\n\nfunction levelFromValue(v: number): \"strong\" | \"medium\" | \"weak\" {\n if (v >= 3) return \"strong\";\n if (v >= 2) return \"medium\";\n return \"weak\";\n}\n\nfunction renderCorrelation(ast: MatrixAST, lay: MatrixLayoutResult): string {\n if (ast.mode !== \"correlation\") return \"\";\n const { plot } = lay;\n const marginCols = ast.config.margins ? 2 : 0; // Score, Rank\n const marginRows = ast.config.margins ? 2 : 0;\n const cellW = plot.w / (ast.cols + marginCols);\n const cellH = plot.h / (ast.rows + marginRows);\n const gridW = cellW * ast.cols;\n const gridH = cellH * ast.rows;\n const nodes: string[] = [];\n\n // alternating row-band backgrounds for readability (image-1 style)\n for (let row = 0; row < ast.rows; row++) {\n const y = plot.y0 + (ast.rows - 1 - row) * cellH;\n nodes.push(\n rect({\n x: plot.x0,\n y,\n width: gridW,\n height: cellH,\n class: row % 2 === 0 ? \"sx-matrix-corr-rowbg-a\" : \"sx-matrix-corr-rowbg-b\",\n })\n );\n }\n\n // grid lines\n for (let i = 0; i <= ast.cols; i++) {\n const x = plot.x0 + i * cellW;\n nodes.push(lineEl({ x1: x, y1: plot.y0, x2: x, y2: plot.y0 + gridH, class: \"sx-matrix-corr-grid\" }));\n }\n for (let j = 0; j <= ast.rows; j++) {\n const y = plot.y0 + j * cellH;\n nodes.push(lineEl({ x1: plot.x0, y1: y, x2: plot.x0 + gridW, y2: y, class: \"sx-matrix-corr-grid\" }));\n }\n\n // dots\n const dotR = Math.max(4, Math.min(cellW, cellH) * 0.28);\n const rowSums = new Array(ast.rows).fill(0);\n const colSums = new Array(ast.cols).fill(0);\n for (const c of ast.cells) {\n if (c.col < 0 || c.col >= ast.cols || c.row < 0 || c.row >= ast.rows) continue;\n const v = c.value ?? (c.level ? (c.level === \"strong\" ? 3 : c.level === \"medium\" ? 2 : 1) : 0);\n if (v <= 0) continue;\n rowSums[c.row] += v;\n colSums[c.col] += v;\n const lvl = c.level ?? levelFromValue(v);\n const cx = plot.x0 + (c.col + 0.5) * cellW;\n const cy = plot.y0 + (ast.rows - 1 - c.row + 0.5) * cellH;\n nodes.push(\n circle({\n cx,\n cy,\n r: dotR,\n fill: DOT_COLORS[lvl],\n stroke: DOT_COLORS[lvl],\n \"stroke-width\": 1,\n })\n );\n }\n\n // col headers (top)\n if (ast.colLabels) {\n for (let col = 0; col < ast.cols; col++) {\n const label = ast.colLabels[col];\n if (!label) continue;\n const cx = plot.x0 + (col + 0.5) * cellW;\n const lines = wrapLabel(label, 10);\n const startY = plot.y0 - 8 - (lines.length - 1) * 12;\n for (let i = 0; i < lines.length; i++) {\n nodes.push(\n textEl(\n { x: cx, y: startY + i * 12, class: \"sx-matrix-corr-header\" },\n lines[i]!\n )\n );\n }\n }\n }\n\n // row labels (left)\n if (ast.rowLabels) {\n for (let row = 0; row < ast.rows; row++) {\n const label = ast.rowLabels[row];\n if (!label) continue;\n const y = plot.y0 + (ast.rows - 1 - row + 0.5) * cellH;\n nodes.push(\n textEl({ x: plot.x0 - 8, y, class: \"sx-matrix-corr-rowlabel\" }, label)\n );\n }\n }\n\n if (ast.config.margins) {\n // compute ranks (1 = highest)\n const rowRanks = rankOf(rowSums);\n const colRanks = rankOf(colSums);\n const bestRow = rowSums.length > 0 ? Math.max(...rowSums) : 0;\n const bestCol = colSums.length > 0 ? Math.max(...colSums) : 0;\n\n // right: Score col + Rank col\n const scoreColX = plot.x0 + gridW + cellW * 0.5;\n const rankColX = plot.x0 + gridW + cellW * 1.5;\n nodes.push(textEl({ x: scoreColX, y: plot.y0 - 8, class: \"sx-matrix-corr-header\" }, \"Score\"));\n nodes.push(textEl({ x: rankColX, y: plot.y0 - 8, class: \"sx-matrix-corr-header\" }, \"Rank\"));\n for (let row = 0; row < ast.rows; row++) {\n const y = plot.y0 + (ast.rows - 1 - row + 0.5) * cellH;\n const sum = rowSums[row];\n const rank = rowRanks[row];\n const cls = sum === bestRow && sum > 0\n ? \"sx-matrix-corr-margin-best\"\n : \"sx-matrix-corr-margin\";\n nodes.push(textEl({ x: scoreColX, y, class: cls }, String(sum)));\n nodes.push(\n textEl({ x: rankColX, y, class: rank === 1 ? \"sx-matrix-corr-margin-best\" : \"sx-matrix-corr-margin\" }, String(rank))\n );\n }\n // bottom: Score row + Rank row\n const scoreRowY = plot.y0 + gridH + cellH * 0.5;\n const rankRowY = plot.y0 + gridH + cellH * 1.5;\n nodes.push(\n textEl(\n { x: plot.x0 - 8, y: scoreRowY, class: \"sx-matrix-corr-rowlabel\" },\n \"Score\"\n )\n );\n nodes.push(\n textEl(\n { x: plot.x0 - 8, y: rankRowY, class: \"sx-matrix-corr-rowlabel\" },\n \"Rank\"\n )\n );\n for (let col = 0; col < ast.cols; col++) {\n const cx = plot.x0 + (col + 0.5) * cellW;\n const sum = colSums[col];\n const rank = colRanks[col];\n nodes.push(\n textEl(\n {\n x: cx,\n y: scoreRowY,\n class: sum === bestCol && sum > 0 ? \"sx-matrix-corr-margin-best\" : \"sx-matrix-corr-margin\",\n },\n String(sum)\n )\n );\n nodes.push(\n textEl(\n {\n x: cx,\n y: rankRowY,\n class: rank === 1 ? \"sx-matrix-corr-margin-best\" : \"sx-matrix-corr-margin\",\n },\n String(rank)\n )\n );\n }\n }\n\n return group({ id: \"sx-matrix-correlation\" }, nodes);\n}\n\nfunction rankOf(vals: number[]): number[] {\n const sorted = [...vals].map((v, i) => ({ v, i })).sort((a, b) => b.v - a.v);\n const ranks = new Array(vals.length).fill(0);\n let prev = -Infinity;\n let rank = 0;\n let seen = 0;\n for (const e of sorted) {\n seen++;\n if (e.v !== prev) {\n rank = seen;\n prev = e.v;\n }\n ranks[e.i] = rank;\n }\n return ranks;\n}\n\nfunction renderCorrelationLegend(ast: MatrixAST, lay: MatrixLayoutResult): string {\n if (ast.mode !== \"correlation\") return \"\";\n const xBase = lay.plot.x0 + lay.plot.w + 20;\n const yBase = lay.plot.y0 + 8;\n const items: Array<[\"strong\" | \"medium\" | \"weak\", string]> = [\n [\"strong\", \"Strong (3)\"],\n [\"medium\", \"Medium (2)\"],\n [\"weak\", \"Weak (1)\"],\n ];\n const rows = items.map((it, i) =>\n group({ transform: `translate(${xBase}, ${yBase + i * 18})` }, [\n circle({ cx: 6, cy: 6, r: 5, fill: DOT_COLORS[it[0]], stroke: DOT_COLORS[it[0]] }),\n textEl({ x: 18, y: 10, class: \"sx-matrix-legend-text\" }, it[1]),\n ])\n );\n return group({ id: \"sx-matrix-corr-legend\" }, rows);\n}\n\nfunction renderPoints(ast: MatrixAST, lay: MatrixLayoutResult): string {\n if (ast.mode !== \"quadrant\") return \"\";\n const nodes: string[] = [];\n for (const p of lay.points) {\n nodes.push(renderOnePoint(p, lay.categories));\n }\n return group({ id: \"sx-matrix-points\" }, nodes);\n}\n\nfunction renderOnePoint(pl: PointLayout, categories: string[]): string {\n const p = pl.point;\n const color = bubbleFill(p, categories);\n const shape = p.shape ?? \"circle\";\n let shapeEl: string;\n const stroke = p.highlight ? \"#111\" : color;\n const strokeWidth = p.highlight ? 2.2 : 1.5;\n const fillOpacity = p.size !== undefined ? 0.45 : 0.75;\n if (shape === \"circle\") {\n shapeEl = circle({\n cx: pl.px,\n cy: pl.py,\n r: pl.r,\n fill: color,\n \"fill-opacity\": fillOpacity,\n stroke,\n \"stroke-width\": strokeWidth,\n class: \"sx-matrix-bubble\",\n });\n } else if (shape === \"square\") {\n shapeEl = rect({\n x: pl.px - pl.r,\n y: pl.py - pl.r,\n width: pl.r * 2,\n height: pl.r * 2,\n fill: color,\n \"fill-opacity\": fillOpacity,\n stroke,\n \"stroke-width\": strokeWidth,\n class: \"sx-matrix-bubble\",\n });\n } else if (shape === \"diamond\") {\n const r = pl.r;\n shapeEl = polygon({\n points: `${pl.px},${pl.py - r} ${pl.px + r},${pl.py} ${pl.px},${pl.py + r} ${pl.px - r},${pl.py}`,\n fill: color,\n \"fill-opacity\": fillOpacity,\n stroke,\n \"stroke-width\": strokeWidth,\n class: \"sx-matrix-bubble\",\n });\n } else {\n // triangle\n const r = pl.r;\n shapeEl = polygon({\n points: `${pl.px},${pl.py - r} ${pl.px + r},${pl.py + r * 0.8} ${pl.px - r},${pl.py + r * 0.8}`,\n fill: color,\n \"fill-opacity\": fillOpacity,\n stroke,\n \"stroke-width\": strokeWidth,\n class: \"sx-matrix-bubble\",\n });\n }\n\n const leader = pl.label.external\n ? lineEl({\n x1: pl.px,\n y1: pl.py,\n x2: pl.label.lx,\n y2: pl.label.ly,\n class: \"sx-matrix-leader\",\n })\n : \"\";\n\n const label = textEl(\n { x: pl.label.lx, y: pl.label.ly, class: \"sx-matrix-label\" },\n pl.label.text\n );\n\n // off-chart badge\n let badge = \"\";\n if (p.offChart) {\n const bx = pl.px;\n const by = pl.py;\n badge = textEl(\n { x: bx + pl.r + 4, y: by - pl.r - 2, class: \"sx-matrix-offchart\", \"font-size\": 14, \"font-weight\": 700 },\n \"↗\"\n );\n }\n\n const titleStr = p.note\n ? `${p.label} · (${p.origX ?? p.x}, ${p.origY ?? p.y}) — ${p.note}`\n : `${p.label} · (${(p.origX ?? p.x).toFixed(2)}, ${(p.origY ?? p.y).toFixed(2)})${p.size !== undefined ? ` · size ${p.size}` : \"\"}`;\n\n return group(\n {\n class: \"sx-matrix-point\",\n \"data-point-id\": p.id,\n \"data-label\": p.label,\n ...(p.category ? { \"data-category\": p.category } : {}),\n },\n [titleEl(titleStr), shapeEl, leader, label, badge].filter((s) => s.length > 0)\n );\n}\n\nfunction renderLegend(ast: MatrixAST, lay: MatrixLayoutResult): string {\n if (ast.config.legendPosition === \"none\") return \"\";\n if (ast.mode === \"heatmap\") {\n // color ramp\n const x = lay.plot.x0 + lay.plot.w - 220;\n const y = lay.plot.y0 + lay.plot.h + 40;\n const w = 210;\n const h = 10;\n const stops = HEAT_RAMP.map((c, i) =>\n el(\"stop\", { offset: `${(i / (HEAT_RAMP.length - 1)) * 100}%`, \"stop-color\": c })\n );\n const grad = el(\n \"linearGradient\",\n { id: \"sx-matrix-heatgrad\", x1: \"0%\", x2: \"100%\" },\n stops\n );\n return group({ id: \"sx-matrix-legend\" }, [\n el(\"defs\", {}, [grad]),\n rect({ x, y, width: w, height: h, fill: \"url(#sx-matrix-heatgrad)\", stroke: \"#d1d5db\" }),\n textEl({ x, y: y - 4, class: \"sx-matrix-legend-text\", \"text-anchor\": \"start\" }, \"Low\"),\n textEl(\n { x: x + w, y: y - 4, class: \"sx-matrix-legend-text\", \"text-anchor\": \"end\" },\n \"High\"\n ),\n ]);\n }\n if (lay.categories.length === 0) return \"\";\n const xBase = lay.plot.x0 + lay.plot.w + 12;\n const yBase = lay.plot.y0 + 8;\n const rows: string[] = lay.categories.map((cat, i) => {\n const color = CATEGORY_COLORS[i % CATEGORY_COLORS.length]!;\n return group({ transform: `translate(${xBase}, ${yBase + i * 18})` }, [\n circle({ cx: 6, cy: 6, r: 5, fill: color, \"fill-opacity\": 0.7, stroke: color }),\n textEl({ x: 18, y: 10, class: \"sx-matrix-legend-text\" }, cat),\n ]);\n });\n return group({ id: \"sx-matrix-legend\" }, rows);\n}\n\nfunction renderTitle(ast: MatrixAST, lay: MatrixLayoutResult): string {\n if (!ast.title) return \"\";\n return textEl(\n { x: lay.canvasWidth / 2, y: 28, class: \"sx-matrix-title\", \"text-anchor\": \"middle\" },\n ast.title\n );\n}\n\nexport function renderMatrixAST(ast: MatrixAST): string {\n const lay = layoutMatrix(ast);\n const needsLegendSpace =\n lay.categories.length > 0 || ast.mode === \"correlation\";\n const extraWidth =\n needsLegendSpace && lay.plot.x0 + lay.plot.w + 140 > lay.canvasWidth ? 160 : 0;\n const canvasWidth = lay.canvasWidth + extraWidth;\n\n const body = [\n renderTitle(ast, lay),\n renderQuadrantBackground(ast, lay),\n renderGrid(ast, lay),\n renderTableChrome(ast, lay),\n renderQuadAnnotations(ast, lay),\n renderCellLabels(ast, lay),\n renderHeatmap(ast, lay),\n renderCorrelation(ast, lay),\n renderAxes(ast, lay),\n renderPoints(ast, lay),\n renderLegend(ast, lay),\n renderCorrelationLegend(ast, lay),\n ].filter((s) => s.length > 0);\n\n return svgRoot(\n {\n class: \"sx-matrix\",\n \"data-diagram-type\": \"matrix\",\n \"data-mode\": ast.mode,\n width: canvasWidth,\n height: lay.canvasHeight,\n viewBox: `0 0 ${canvasWidth} ${lay.canvasHeight}`,\n role: \"graphics-document\",\n },\n [\n titleEl(ast.title ? `Matrix — ${escapeXml(ast.title)}` : \"Matrix diagram\"),\n descEl(\n `Matrix diagram${ast.template ? ` (${ast.template} template)` : \"\"}, ${ast.mode} mode, ${ast.points.length} point(s)`\n ),\n defs([el(\"style\", {}, CSS), axisArrow()]),\n ...body,\n ]\n );\n}\n\nexport function renderMatrix(text: string): string {\n const ast = parseMatrix(text);\n return renderMatrixAST(ast);\n}\n","import type { DiagramPlugin } from \"../../core/types\";\nimport { parseMatrix } from \"./parser\";\nimport { renderMatrix } from \"./renderer\";\n\nexport const matrix: DiagramPlugin = {\n type: \"matrix\",\n detect(text: string): boolean {\n const first = text.trim().split(\"\\n\")[0]?.trim().toLowerCase() ?? \"\";\n return first.startsWith(\"matrix\");\n },\n parse: parseMatrix,\n\n render(text: string): string {\n return renderMatrix(text);\n },\n};\n\nexport { parseMatrix } from \"./parser\";\nexport { renderMatrix, renderMatrixAST } from \"./renderer\";\nexport { layoutMatrix } from \"./layout\";\n","import type {\n ErdAst,\n ErdAttribute,\n ErdCardinality,\n ErdEntity,\n ErdNotation,\n ErdRef,\n} from \"../../core/types\";\n\nexport class ErdParseError extends Error {\n constructor(message: string, public lineNumber?: number) {\n super(lineNumber !== undefined ? `[line ${lineNumber}] ${message}` : message);\n this.name = \"ErdParseError\";\n }\n}\n\n// ─── Lexical helpers ──────────────────────────────────────────\n\nfunction stripComment(s: string): string {\n let out = \"\";\n let inQuote = false;\n for (let i = 0; i < s.length; i++) {\n const ch = s[i];\n if (ch === '\"') inQuote = !inQuote;\n if (!inQuote) {\n if (ch === \"/\" && s[i + 1] === \"/\") break;\n if (ch === \"#\") break;\n }\n out += ch;\n }\n return out;\n}\n\nfunction unquote(v: string): string {\n const t = v.trim();\n if (t.length >= 2 && t.startsWith('\"') && t.endsWith('\"')) return t.slice(1, -1);\n return t;\n}\n\n// ─── Cardinality tokens ───────────────────────────────────────\n\nconst NAMED_CARDS: Record<string, ErdCardinality> = {\n \"one-mandatory\": \"one-mandatory\",\n \"one-optional\": \"one-optional\",\n \"many-mandatory\": \"many-mandatory\",\n \"many-optional\": \"many-optional\",\n \"1..1\": \"one-mandatory\",\n \"0..1\": \"one-optional\",\n \"1..n\": \"many-mandatory\",\n \"0..n\": \"many-optional\",\n \"1..*\": \"many-mandatory\",\n \"0..*\": \"many-optional\",\n};\n\n/**\n * Mermaid ASCII glyph parser. Reads either a left-side or right-side glyph.\n * Left side examples: `||`, `|o`, `}o`, `}|`\n * Right side examples: `||`, `o|`, `o{`, `|{`\n */\nfunction parseMermaidGlyph(token: string, side: \"left\" | \"right\"): ErdCardinality | null {\n // Normalize to a stable key.\n const t = token.toLowerCase();\n if (side === \"left\") {\n if (t === \"||\") return \"one-mandatory\";\n if (t === \"|o\") return \"one-optional\";\n if (t === \"}|\") return \"many-mandatory\";\n if (t === \"}o\") return \"many-optional\";\n } else {\n if (t === \"||\") return \"one-mandatory\";\n if (t === \"o|\") return \"one-optional\";\n if (t === \"|{\") return \"many-mandatory\";\n if (t === \"o{\") return \"many-optional\";\n }\n return null;\n}\n\nfunction parseCardToken(raw: string, side: \"left\" | \"right\"): ErdCardinality | null {\n const tok = raw.trim().toLowerCase();\n if (!tok) return null;\n if (NAMED_CARDS[tok]) return NAMED_CARDS[tok];\n // Mermaid ASCII fallback.\n return parseMermaidGlyph(tok, side);\n}\n\n// ─── Top-level parser ─────────────────────────────────────────\n\ninterface RawLine {\n text: string;\n lineNumber: number;\n}\n\nfunction lex(text: string): RawLine[] {\n return text.split(/\\r?\\n/).map((raw, i) => ({\n text: stripComment(raw).trim(),\n lineNumber: i + 1,\n })).filter((l) => l.text.length > 0);\n}\n\nexport function parseErd(text: string): ErdAst {\n const lines = lex(text);\n if (lines.length === 0) throw new ErdParseError(\"Empty input\");\n\n // Header.\n const header = lines[0]!;\n const headerWords = header.text.split(/\\s+/);\n if (headerWords[0]?.toLowerCase() !== \"erd\") {\n throw new ErdParseError(`Expected 'erd' header, got: ${header.text}`, header.lineNumber);\n }\n\n let i = 1;\n let notation: ErdNotation = \"crowsfoot\";\n let direction: \"LR\" | \"TB\" = \"LR\";\n let title: string | undefined;\n\n // Header attribute lines (notation:, direction:, title:) — order-insensitive, before the first table/ref.\n while (i < lines.length) {\n const line = lines[i]!;\n const t = line.text;\n const lower = t.toLowerCase();\n if (lower.startsWith(\"notation:\")) {\n const v = t.slice(\"notation:\".length).trim().toLowerCase();\n if (v !== \"crowsfoot\" && v !== \"chen\" && v !== \"barker\") {\n throw new ErdParseError(`Unknown notation '${v}'. Supported: crowsfoot.`, line.lineNumber);\n }\n if (v !== \"crowsfoot\") {\n // v0.1 only renders crow's foot. Fail loudly so callers know.\n throw new ErdParseError(\n `notation '${v}' is documented but not yet implemented in v0.1; use 'crowsfoot'.`,\n line.lineNumber\n );\n }\n notation = v;\n i++;\n continue;\n }\n if (lower.startsWith(\"direction:\")) {\n const v = t.slice(\"direction:\".length).trim().toUpperCase();\n if (v !== \"LR\" && v !== \"TB\") {\n throw new ErdParseError(`Unknown direction '${v}'. Use LR or TB.`, line.lineNumber);\n }\n direction = v;\n i++;\n continue;\n }\n if (lower.startsWith(\"title:\")) {\n title = unquote(t.slice(\"title:\".length).trim());\n i++;\n continue;\n }\n break;\n }\n\n const entities: ErdEntity[] = [];\n const refs: ErdRef[] = [];\n\n while (i < lines.length) {\n const line = lines[i]!;\n const t = line.text;\n const head = t.split(/\\s+/)[0]?.toLowerCase();\n\n if (head === \"table\") {\n const consumed = parseTableBlock(lines, i, entities);\n i = consumed;\n continue;\n }\n\n if (head === \"ref\") {\n parseRefLine(t, line.lineNumber, refs);\n i++;\n continue;\n }\n\n throw new ErdParseError(`Unexpected line: ${t}`, line.lineNumber);\n }\n\n // Validate FK targets exist (warn-style: we add anyway, but reject obvious typos).\n const entityIds = new Set(entities.map((e) => e.id.toLowerCase()));\n for (const e of entities) {\n for (const a of e.attributes) {\n if (a.fkTarget) {\n const [tableName] = a.fkTarget.split(\".\");\n if (tableName && !entityIds.has(tableName.toLowerCase())) {\n throw new ErdParseError(\n `FK target table '${tableName}' (in ${e.id}.${a.name}) does not exist.`\n );\n }\n }\n }\n }\n\n return {\n type: \"erd\",\n notation,\n direction,\n title,\n entities,\n refs,\n };\n}\n\n// ─── `table` block parser ─────────────────────────────────────\n\nfunction parseTableBlock(\n lines: RawLine[],\n startIdx: number,\n outEntities: ErdEntity[]\n): number {\n const head = lines[startIdx]!;\n // Two accepted shapes:\n // table Name { (multi-line: attributes follow)\n // table Name { id int PK; email varchar UK } (single-line: ; separated)\n const inlineMatch = /^table\\s+(.+?)\\s*\\{\\s*(.*?)\\s*\\}\\s*$/i.exec(head.text);\n if (inlineMatch) {\n const declRaw = inlineMatch[1]!.trim();\n const inside = inlineMatch[2]!.trim();\n const { id, name } = splitDecl(declRaw, head.lineNumber);\n if (outEntities.some((e) => e.id === id)) {\n throw new ErdParseError(`Duplicate table id '${id}'.`, head.lineNumber);\n }\n const attributes: ErdAttribute[] = [];\n if (inside.length > 0) {\n const attrLines = inside.split(\";\").map((s) => s.trim()).filter(Boolean);\n for (const a of attrLines) {\n attributes.push(parseAttributeLine(a, head.lineNumber, id));\n }\n }\n outEntities.push({ id, name, attributes });\n return startIdx + 1;\n }\n\n const m = /^table\\s+(.+?)\\s*\\{$/i.exec(head.text);\n if (!m) {\n throw new ErdParseError(\n `Expected 'table NAME {' (with brace at end of line) or 'table NAME { ... }' inline form, got: ${head.text}`,\n head.lineNumber\n );\n }\n const declRaw = m[1]!.trim();\n const { id, name } = splitDecl(declRaw, head.lineNumber);\n\n if (outEntities.some((e) => e.id === id)) {\n throw new ErdParseError(`Duplicate table id '${id}'.`, head.lineNumber);\n }\n\n const attributes: ErdAttribute[] = [];\n let i = startIdx + 1;\n while (i < lines.length) {\n const line = lines[i]!;\n if (line.text === \"}\") {\n outEntities.push({ id, name, attributes });\n return i + 1;\n }\n const attr = parseAttributeLine(line.text, line.lineNumber, id);\n attributes.push(attr);\n i++;\n }\n throw new ErdParseError(`Unterminated table block '${id}'.`, head.lineNumber);\n}\n\nfunction splitDecl(declRaw: string, lineNumber: number): { id: string; name: string } {\n void lineNumber;\n const aliasMatch = /^\"([^\"]+)\"\\s+as\\s+([A-Za-z_][\\w]*)$/i.exec(declRaw);\n if (aliasMatch) {\n return { id: aliasMatch[2]!, name: aliasMatch[1]! };\n }\n const idOnly = declRaw.replace(/^\"|\"$/g, \"\");\n return { id: idOnly, name: idOnly };\n}\n\n/**\n * Attribute line grammar:\n * name [type] [marker]* [-> Other.col] [: \"comment\"]\n * markers ∈ {PK, FK, UK, NN, *, !}, case-insensitive\n * `*` and `!` are aliases for NOT NULL (Barker convention)\n */\nfunction parseAttributeLine(raw: string, lineNumber: number, tableId: string): ErdAttribute {\n let s = raw.trim();\n // Comment after ':' at end (only if not part of \"type\" — types do not contain ':').\n let comment: string | undefined;\n const colonIdx = findUnquotedChar(s, \":\");\n if (colonIdx >= 0) {\n comment = unquote(s.slice(colonIdx + 1).trim());\n s = s.slice(0, colonIdx).trim();\n }\n\n // FK target: ` -> Table.col` or ` => Table.col`\n let fkTarget: string | undefined;\n const arrowMatch = /\\s+(?:->|=>)\\s+([A-Za-z_][\\w]*\\.[A-Za-z_][\\w]*)\\s*$/.exec(s);\n if (arrowMatch) {\n fkTarget = arrowMatch[1];\n s = s.slice(0, arrowMatch.index).trim();\n }\n\n const tokens = s.split(/\\s+/).filter(Boolean);\n if (tokens.length === 0) {\n throw new ErdParseError(`Empty attribute in table '${tableId}'.`, lineNumber);\n }\n\n const name = tokens[0]!;\n const rest = tokens.slice(1);\n\n const flags = { pk: false, fk: false, uk: false, nn: false };\n const typeParts: string[] = [];\n for (const tok of rest) {\n const upper = tok.toUpperCase();\n if (upper === \"PK\") flags.pk = true;\n else if (upper === \"FK\") flags.fk = true;\n else if (upper === \"UK\" || upper === \"UNIQUE\") flags.uk = true;\n else if (upper === \"NN\" || upper === \"NOT-NULL\" || upper === \"NOTNULL\") flags.nn = true;\n else if (tok === \"*\" || tok === \"!\") flags.nn = true;\n else typeParts.push(tok);\n }\n\n if (fkTarget) flags.fk = true;\n if (flags.pk) flags.nn = true; // PK implies NOT NULL.\n\n return {\n name,\n type: typeParts.length > 0 ? typeParts.join(\" \") : undefined,\n pk: flags.pk || undefined,\n fk: flags.fk || undefined,\n uk: flags.uk || undefined,\n notNull: flags.nn || undefined,\n fkTarget,\n comment,\n };\n}\n\nfunction findUnquotedChar(s: string, ch: string): number {\n let inQuote = false;\n for (let i = 0; i < s.length; i++) {\n if (s[i] === '\"') inQuote = !inQuote;\n if (!inQuote && s[i] === ch) return i;\n }\n return -1;\n}\n\n// ─── `ref` line parser ────────────────────────────────────────\n\n/**\n * Two accepted forms:\n *\n * ref Source <leftCard> -- <rightCard> Target [: \"label\"]\n *\n * where leftCard / rightCard are named cardinalities, e.g.\n * `many-mandatory`, `one-optional`, `0..1`, `1..N`.\n *\n * ref Source <mermaidGlyph><line><mermaidGlyph> Target [: \"label\"]\n *\n * where line is `--` (identifying) or `..` (non-identifying), and\n * glyphs are Mermaid: `}o`, `}|`, `|o`, `||`, `o{`, `|{`, `o|`.\n *\n * Source / Target may be `Table` or `Table.column`.\n */\nfunction parseRefLine(raw: string, lineNumber: number, outRefs: ErdRef[]): void {\n // Strip leading 'ref'.\n let s = raw.replace(/^ref\\s+/i, \"\").trim();\n\n // Optional trailing : \"label\"\n let label: string | undefined;\n const colonIdx = findUnquotedChar(s, \":\");\n if (colonIdx >= 0) {\n label = unquote(s.slice(colonIdx + 1).trim());\n s = s.slice(0, colonIdx).trim();\n }\n\n // Try Mermaid-style: <left-glyph><line><right-glyph>\n // line is one of: --, .., ~~ (treated as non-identifying)\n const merm = /^(\\S+)\\s+([}|o][o|]|\\|\\||\\|o)(\\.\\.|--|~~)([}|o][{|]|\\|\\||o\\|)\\s+(\\S+)$/.exec(s);\n if (merm) {\n const [, src, lg, line, rg, tgt] = merm;\n const fromCard = parseMermaidGlyph(lg!, \"left\");\n const toCard = parseMermaidGlyph(rg!, \"right\");\n if (!fromCard || !toCard) {\n throw new ErdParseError(`Invalid Mermaid cardinality glyph in: ${raw}`, lineNumber);\n }\n outRefs.push({\n from: src!,\n to: tgt!,\n fromCard,\n toCard,\n identifying: line === \"--\",\n label,\n });\n return;\n }\n\n // Named-cardinality form. Split on the line-style token (-- or ..).\n // Capture left card (1+ tokens), then \"--\" or \"..\", then right card (1 token), then target.\n const named = /^(\\S+)\\s+(\\S+(?:[-_/]\\S+)*|\\d+\\.\\.\\d+|\\d+\\.\\.[Nn*])\\s+(--|\\.\\.|~~)\\s+(\\S+(?:[-_/]\\S+)*|\\d+\\.\\.\\d+|\\d+\\.\\.[Nn*])\\s+(\\S+)$/.exec(s);\n if (named) {\n const [, src, leftCard, line, rightCard, tgt] = named;\n const fromCard = parseCardToken(leftCard!, \"left\");\n const toCard = parseCardToken(rightCard!, \"right\");\n if (!fromCard) {\n throw new ErdParseError(`Unknown left cardinality '${leftCard}'.`, lineNumber);\n }\n if (!toCard) {\n throw new ErdParseError(`Unknown right cardinality '${rightCard}'.`, lineNumber);\n }\n outRefs.push({\n from: src!,\n to: tgt!,\n fromCard,\n toCard,\n identifying: line === \"--\",\n label,\n });\n return;\n }\n\n throw new ErdParseError(\n `Unrecognized ref line: ${raw}\\n` +\n `Expected: ref Source <card> -- <card> Target [: \"label\"] or Mermaid form e.g. ref A }o--|| B`,\n lineNumber\n );\n}\n","import type {\n ErdAst,\n ErdEntity,\n ErdLayoutEdge,\n ErdLayoutEntity,\n ErdLayoutResult,\n ErdLayoutRow,\n ErdRef,\n} from \"../../core/types\";\n\n// ─── Layout constants ─────────────────────────────────────────\n\nexport const ERD_CONST = {\n ENTITY_MIN_WIDTH: 180,\n ENTITY_PADDING_X: 14,\n HEADER_HEIGHT: 28,\n ROW_HEIGHT: 22,\n ROW_PAD_Y: 4,\n COL_GAP: 90,\n ROW_GAP: 56,\n PADDING: 32,\n\n HEADER_FONT_PX: 13,\n ROW_FONT_PX: 12,\n MARKER_FONT_PX: 10,\n CHAR_W_HEADER: 7.6,\n CHAR_W_ROW: 6.7,\n CHAR_W_MARKER: 6,\n TYPE_GAP: 16,\n\n GLYPH_OFFSET: 18, // distance from entity edge to glyph anchor\n GLYPH_FOOT_LEN: 10, // crow's-foot fan length\n GLYPH_BAR_HALF: 6, // bar half-length perpendicular to line\n GLYPH_CIRCLE_R: 4, // open-circle radius\n LABEL_OFFSET: 6,\n\n /** Pixels between adjacent vertical-segment x-coordinates of nearby edges\n * to keep their bend points from overlapping. */\n EDGE_BEND_STAGGER: 10,\n};\n\n// ─── Entity sizing ────────────────────────────────────────────\n\nfunction measureEntity(ent: ErdEntity): { width: number; height: number; rows: ErdLayoutRow[] } {\n const C = ERD_CONST;\n\n const headerWidth = C.ENTITY_PADDING_X * 2 + ent.name.length * C.CHAR_W_HEADER;\n\n let widest = headerWidth;\n const rows: ErdLayoutRow[] = [];\n for (let i = 0; i < ent.attributes.length; i++) {\n const a = ent.attributes[i]!;\n const namePart = a.name;\n const typePart = a.type ?? \"\";\n const markerCount =\n (a.pk ? 1 : 0) + (a.fk ? 1 : 0) + (a.uk ? 1 : 0) + (a.notNull && !a.pk ? 1 : 0);\n const markerWidth = markerCount * (C.CHAR_W_MARKER * 2.4 + 4);\n const w =\n C.ENTITY_PADDING_X * 2 +\n namePart.length * C.CHAR_W_ROW +\n (typePart ? C.TYPE_GAP + typePart.length * C.CHAR_W_ROW : 0) +\n markerWidth;\n if (w > widest) widest = w;\n\n const yCenter = C.HEADER_HEIGHT + i * C.ROW_HEIGHT + C.ROW_HEIGHT / 2;\n rows.push({ attribute: a, yCenter });\n }\n\n const width = Math.max(widest, C.ENTITY_MIN_WIDTH);\n const height = C.HEADER_HEIGHT + ent.attributes.length * C.ROW_HEIGHT + C.ROW_PAD_Y;\n return { width, height, rows };\n}\n\n// ─── Layer assignment ─────────────────────────────────────────\n\ninterface RefPair {\n from: string;\n to: string;\n}\n\nfunction buildColumnAssignment(ast: ErdAst): Map<string, number> {\n const ids = ast.entities.map((e) => e.id);\n const idToIdx = new Map(ids.map((id, i) => [id, i] as const));\n\n const pairs: RefPair[] = [];\n for (const r of ast.refs) {\n const f = parseRefSide(r.from);\n const t = parseRefSide(r.to);\n if (idToIdx.has(f.table) && idToIdx.has(t.table)) {\n const oneIsTo = isOne(r.toCard) && !isOne(r.fromCard);\n const oneIsFrom = isOne(r.fromCard) && !isOne(r.toCard);\n if (oneIsTo) pairs.push({ from: t.table, to: f.table });\n else if (oneIsFrom) pairs.push({ from: f.table, to: t.table });\n else pairs.push({ from: f.table, to: t.table });\n }\n }\n\n const layer = new Map<string, number>();\n for (const id of ids) layer.set(id, 0);\n let changed = true;\n let guard = 0;\n while (changed && guard < ids.length + 4) {\n changed = false;\n for (const p of pairs) {\n const lf = layer.get(p.from) ?? 0;\n const lt = layer.get(p.to) ?? 0;\n if (lt < lf + 1) {\n layer.set(p.to, lf + 1);\n changed = true;\n }\n }\n guard++;\n }\n return layer;\n}\n\nfunction parseRefSide(s: string): { table: string; column?: string } {\n const dot = s.indexOf(\".\");\n if (dot < 0) return { table: s };\n return { table: s.slice(0, dot), column: s.slice(dot + 1) };\n}\n\nfunction isOne(c: ErdRef[\"fromCard\"]): boolean {\n return c === \"one-mandatory\" || c === \"one-optional\";\n}\n\n// ─── Within-layer barycenter ordering ─────────────────────────\n\n/**\n * Reorder entities within each layer to reduce expected edge crossings,\n * using a multi-pass barycenter heuristic (Sugiyama phase 3). Each entity\n * is sorted by the median index of its neighbors in the adjacent layer.\n */\nfunction reorderByBarycenter(\n layerToEnts: Map<number, string[]>,\n layers: number[],\n refs: ErdRef[]\n): void {\n if (layers.length < 2) return;\n\n const neighbors = new Map<string, Set<string>>();\n for (const r of refs) {\n const a = parseRefSide(r.from).table;\n const b = parseRefSide(r.to).table;\n if (!neighbors.has(a)) neighbors.set(a, new Set());\n if (!neighbors.has(b)) neighbors.set(b, new Set());\n neighbors.get(a)!.add(b);\n neighbors.get(b)!.add(a);\n }\n\n function sweep(direction: \"down\" | \"up\"): void {\n const ordered = direction === \"down\" ? layers : [...layers].reverse();\n for (let i = 1; i < ordered.length; i++) {\n const prev = ordered[i - 1]!;\n const cur = ordered[i]!;\n const prevList = layerToEnts.get(prev)!;\n const curList = layerToEnts.get(cur)!;\n const prevIdx = new Map(prevList.map((id, idx) => [id, idx] as const));\n const baryByEnt = new Map<string, number>();\n for (let j = 0; j < curList.length; j++) {\n const id = curList[j]!;\n const ns = neighbors.get(id);\n if (!ns) {\n baryByEnt.set(id, j);\n continue;\n }\n const indices: number[] = [];\n for (const n of ns) {\n if (prevIdx.has(n)) indices.push(prevIdx.get(n)!);\n }\n if (indices.length === 0) {\n baryByEnt.set(id, j);\n } else {\n // Median is more robust than mean for graphs with hubs.\n indices.sort((x, y) => x - y);\n const m = indices.length;\n const med = m % 2 === 1\n ? indices[(m - 1) / 2]!\n : (indices[m / 2 - 1]! + indices[m / 2]!) / 2;\n baryByEnt.set(id, med);\n }\n }\n curList.sort((a, b) => {\n const da = baryByEnt.get(a) ?? 0;\n const db = baryByEnt.get(b) ?? 0;\n if (da === db) return 0;\n return da - db;\n });\n }\n }\n\n // Down-up-down typically converges for ERD-shaped graphs.\n sweep(\"down\");\n sweep(\"up\");\n sweep(\"down\");\n}\n\n// ─── Brandes-Köpf-lite y-coordinate assignment ────────────────\n\ninterface PlacedSlot {\n id: string;\n /** Top-edge y of the entity. */\n y: number;\n height: number;\n width: number;\n /** Order of the entity inside its layer. */\n layerOrder: number;\n}\n\n/**\n * For each layer (left-to-right), place entities at a y-coordinate that\n * approximates the average of their already-placed neighbors' y-centers.\n * Falls back to top-down packing with collision avoidance.\n *\n * After the forward pass we run a backward refinement pass — entities with\n * slack above (no forward-pass neighbor pulled them down) get nudged toward\n * their backward-pass barycenter target, which evens out chains where the\n * primary \"anchor\" is in a later layer.\n */\nfunction assignYCoordinates(\n orderedLayers: { layer: number; ids: string[] }[],\n measured: Map<string, { width: number; height: number }>,\n neighbors: Map<string, Set<string>>\n): Map<string, number> {\n const C = ERD_CONST;\n const placed = new Map<string, PlacedSlot>();\n\n // Forward pass.\n for (const ls of orderedLayers) {\n let prevBottom = C.PADDING - C.ROW_GAP;\n for (let i = 0; i < ls.ids.length; i++) {\n const id = ls.ids[i]!;\n const m = measured.get(id)!;\n const ns = neighbors.get(id);\n let target = C.PADDING;\n if (ns) {\n const placedNeighborCenters: number[] = [];\n for (const n of ns) {\n const p = placed.get(n);\n if (p) placedNeighborCenters.push(p.y + p.height / 2);\n }\n if (placedNeighborCenters.length > 0) {\n placedNeighborCenters.sort((a, b) => a - b);\n const k = placedNeighborCenters.length;\n const med = k % 2 === 1\n ? placedNeighborCenters[(k - 1) / 2]!\n : (placedNeighborCenters[k / 2 - 1]! + placedNeighborCenters[k / 2]!) / 2;\n target = med - m.height / 2;\n }\n }\n const y = Math.max(target, prevBottom + C.ROW_GAP);\n placed.set(id, {\n id,\n y,\n height: m.height,\n width: m.width,\n layerOrder: i,\n });\n prevBottom = y + m.height;\n }\n }\n\n // Backward refinement pass: for each layer right-to-left, try to pull\n // entities upward toward their full-graph barycenter while preserving\n // ordering and minimum spacing.\n for (let li = orderedLayers.length - 1; li >= 0; li--) {\n const ls = orderedLayers[li]!;\n let prevBottom = C.PADDING - C.ROW_GAP;\n for (let i = 0; i < ls.ids.length; i++) {\n const id = ls.ids[i]!;\n const slot = placed.get(id)!;\n const ns = neighbors.get(id);\n let target = slot.y;\n if (ns && ns.size > 0) {\n const centers: number[] = [];\n for (const n of ns) {\n const p = placed.get(n);\n if (p) centers.push(p.y + p.height / 2);\n }\n if (centers.length > 0) {\n centers.sort((a, b) => a - b);\n const k = centers.length;\n const med = k % 2 === 1\n ? centers[(k - 1) / 2]!\n : (centers[k / 2 - 1]! + centers[k / 2]!) / 2;\n target = med - slot.height / 2;\n }\n }\n // Maintain monotone non-overlap with the previous entity in this layer.\n const lower = prevBottom + C.ROW_GAP;\n // Don't move BELOW current y (forward pass already enforced that path);\n // we only relax UPWARD here so chains can pull together.\n const newY = Math.max(lower, Math.min(slot.y, target));\n slot.y = newY;\n prevBottom = newY + slot.height;\n }\n }\n\n const out = new Map<string, number>();\n for (const [id, p] of placed) out.set(id, p.y);\n return out;\n}\n\n// ─── Main layout ──────────────────────────────────────────────\n\nexport function layoutErd(ast: ErdAst): ErdLayoutResult {\n const C = ERD_CONST;\n const isLR = ast.direction === \"LR\";\n\n // Measure all entities first.\n const measured = new Map<string, { ent: ErdEntity; width: number; height: number; rows: ErdLayoutRow[] }>();\n for (const e of ast.entities) {\n const m = measureEntity(e);\n measured.set(e.id, { ent: e, ...m });\n }\n\n const layer = buildColumnAssignment(ast);\n\n // Group entities by layer.\n const layerToEnts = new Map<number, string[]>();\n for (const e of ast.entities) {\n const l = layer.get(e.id) ?? 0;\n if (!layerToEnts.has(l)) layerToEnts.set(l, []);\n layerToEnts.get(l)!.push(e.id);\n }\n const layers = Array.from(layerToEnts.keys()).sort((a, b) => a - b);\n\n // Within-layer ordering: barycenter sort to minimize expected crossings.\n reorderByBarycenter(layerToEnts, layers, ast.refs);\n\n // Build undirected neighbor map (for y-coordinate assignment).\n const neighbors = new Map<string, Set<string>>();\n for (const r of ast.refs) {\n const a = parseRefSide(r.from).table;\n const b = parseRefSide(r.to).table;\n if (!neighbors.has(a)) neighbors.set(a, new Set());\n if (!neighbors.has(b)) neighbors.set(b, new Set());\n neighbors.get(a)!.add(b);\n neighbors.get(b)!.add(a);\n }\n\n // Per-layer max width / max height (the layer occupies one column or one row).\n const layerSizes = layers.map((l) => {\n const ids = layerToEnts.get(l)!;\n return {\n layer: l,\n ids,\n maxWidth: Math.max(...ids.map((id) => measured.get(id)!.width)),\n maxHeight: Math.max(...ids.map((id) => measured.get(id)!.height)),\n };\n });\n\n // For LR: sizing dim = max width per column, ordering dim = y.\n // For TB: sizing dim = max height per row, ordering dim = x.\n // We assign the ordering coordinate using neighbor-aware barycenter targets.\n // The \"measured\" map for assignYCoordinates needs the right (ordering, sizing) pair.\n const orderedLayers = layerSizes.map((ls) => ({ layer: ls.layer, ids: ls.ids }));\n\n // For y-assignment in LR mode (and x-assignment in TB mode), we need\n // entity height when packing y, entity width when packing x.\n const measureForOrdering = new Map<string, { width: number; height: number }>();\n if (isLR) {\n for (const [id, m] of measured) {\n measureForOrdering.set(id, { width: m.width, height: m.height });\n }\n } else {\n // Swap so the algorithm's \"height\" is treated as the entity's width\n // (the dimension we pack along the x axis).\n for (const [id, m] of measured) {\n measureForOrdering.set(id, { width: m.height, height: m.width });\n }\n }\n const orderingCoord = assignYCoordinates(orderedLayers, measureForOrdering, neighbors);\n\n const placed: ErdLayoutEntity[] = [];\n\n if (isLR) {\n let cursorX = C.PADDING;\n for (const ls of layerSizes) {\n for (const id of ls.ids) {\n const m = measured.get(id)!;\n const x = cursorX + (ls.maxWidth - m.width) / 2;\n const y = orderingCoord.get(id) ?? C.PADDING;\n placed.push({\n entity: m.ent,\n x,\n y,\n width: m.width,\n height: m.height,\n headerHeight: C.HEADER_HEIGHT,\n rows: m.rows,\n });\n }\n cursorX += ls.maxWidth + C.COL_GAP;\n }\n } else {\n let cursorY = C.PADDING;\n for (const ls of layerSizes) {\n for (const id of ls.ids) {\n const m = measured.get(id)!;\n // In TB mode, the ordering coord IS x (we swapped width/height above).\n const x = orderingCoord.get(id) ?? C.PADDING;\n const y = cursorY + (ls.maxHeight - m.height) / 2;\n placed.push({\n entity: m.ent,\n x,\n y,\n width: m.width,\n height: m.height,\n headerHeight: C.HEADER_HEIGHT,\n rows: m.rows,\n });\n }\n cursorY += ls.maxHeight + C.ROW_GAP;\n }\n }\n\n // Compute overall bounds.\n let maxX = 0;\n let maxY = 0;\n for (const e of placed) {\n if (e.x + e.width > maxX) maxX = e.x + e.width;\n if (e.y + e.height > maxY) maxY = e.y + e.height;\n }\n const width = maxX + C.PADDING;\n const height = maxY + C.PADDING;\n\n // Edges: orthogonal Manhattan with bend-point staggering.\n const placedById = new Map(placed.map((p) => [p.entity.id, p] as const));\n const edges: ErdLayoutEdge[] = [];\n const bendBucketUses = new Map<string, number>();\n\n for (const r of ast.refs) {\n const fromTable = parseRefSide(r.from).table;\n const toTable = parseRefSide(r.to).table;\n const a = placedById.get(fromTable);\n const b = placedById.get(toTable);\n if (!a || !b) continue;\n\n const fromCol = parseRefSide(r.from).column;\n const toCol = parseRefSide(r.to).column;\n const route = routeOrthogonal(a, b, fromCol, toCol, bendBucketUses);\n edges.push({\n ref: r,\n path: route.path,\n fromAnchor: route.fromAnchor,\n toAnchor: route.toAnchor,\n labelAt: route.labelAt,\n });\n }\n\n return {\n ast,\n entities: placed,\n edges,\n width,\n height,\n };\n}\n\n// ─── Orthogonal routing (single-bend Manhattan w/ stagger) ────\n\nfunction rowYByColumn(e: ErdLayoutEntity, col: string | undefined): number {\n if (col) {\n const idx = e.rows.findIndex((r) => r.attribute.name.toLowerCase() === col.toLowerCase());\n if (idx >= 0) return e.y + e.rows[idx]!.yCenter;\n }\n return e.y + e.height / 2;\n}\n\nfunction routeOrthogonal(\n a: ErdLayoutEntity,\n b: ErdLayoutEntity,\n fromCol: string | undefined,\n toCol: string | undefined,\n bendBucketUses: Map<string, number>\n): {\n path: string;\n fromAnchor: ErdLayoutEdge[\"fromAnchor\"];\n toAnchor: ErdLayoutEdge[\"toAnchor\"];\n labelAt: { x: number; y: number };\n} {\n const C = ERD_CONST;\n\n const aCenterX = a.x + a.width / 2;\n const bCenterX = b.x + b.width / 2;\n const aCenterY = a.y + a.height / 2;\n const bCenterY = b.y + b.height / 2;\n\n const dx = bCenterX - aCenterX;\n const dy = bCenterY - aCenterY;\n\n type Side = \"left\" | \"right\" | \"top\" | \"bottom\";\n let aSide: Side;\n let bSide: Side;\n if (Math.abs(dx) >= Math.abs(dy)) {\n aSide = dx >= 0 ? \"right\" : \"left\";\n bSide = dx >= 0 ? \"left\" : \"right\";\n } else {\n aSide = dy >= 0 ? \"bottom\" : \"top\";\n bSide = dy >= 0 ? \"top\" : \"bottom\";\n }\n\n const aAnchor = sideAnchor(a, aSide, fromCol);\n const bAnchor = sideAnchor(b, bSide, toCol);\n\n if (aSide === \"right\" || aSide === \"left\") {\n const baseMidX = (aAnchor.x + bAnchor.x) / 2;\n // Bucket by integer midX to detect collisions; stagger by use count.\n const bucketKey = `H:${Math.round(baseMidX / 4) * 4}`;\n const useIdx = bendBucketUses.get(bucketKey) ?? 0;\n bendBucketUses.set(bucketKey, useIdx + 1);\n // Alternate left / right of the base midpoint by stagger amount.\n const sign = useIdx % 2 === 0 ? 1 : -1;\n const stagger = Math.ceil(useIdx / 2) * C.EDGE_BEND_STAGGER * sign;\n const midX = baseMidX + stagger;\n\n const path =\n `M ${aAnchor.x} ${aAnchor.y} ` +\n `L ${midX} ${aAnchor.y} ` +\n `L ${midX} ${bAnchor.y} ` +\n `L ${bAnchor.x} ${bAnchor.y}`;\n return {\n path,\n fromAnchor: { x: aAnchor.x, y: aAnchor.y, side: aSide },\n toAnchor: { x: bAnchor.x, y: bAnchor.y, side: bSide },\n labelAt: { x: midX, y: (aAnchor.y + bAnchor.y) / 2 - C.LABEL_OFFSET },\n };\n } else {\n const baseMidY = (aAnchor.y + bAnchor.y) / 2;\n const bucketKey = `V:${Math.round(baseMidY / 4) * 4}`;\n const useIdx = bendBucketUses.get(bucketKey) ?? 0;\n bendBucketUses.set(bucketKey, useIdx + 1);\n const sign = useIdx % 2 === 0 ? 1 : -1;\n const stagger = Math.ceil(useIdx / 2) * C.EDGE_BEND_STAGGER * sign;\n const midY = baseMidY + stagger;\n\n const path =\n `M ${aAnchor.x} ${aAnchor.y} ` +\n `L ${aAnchor.x} ${midY} ` +\n `L ${bAnchor.x} ${midY} ` +\n `L ${bAnchor.x} ${bAnchor.y}`;\n return {\n path,\n fromAnchor: { x: aAnchor.x, y: aAnchor.y, side: aSide },\n toAnchor: { x: bAnchor.x, y: bAnchor.y, side: bSide },\n labelAt: { x: (aAnchor.x + bAnchor.x) / 2, y: midY - C.LABEL_OFFSET },\n };\n }\n}\n\nfunction sideAnchor(\n e: ErdLayoutEntity,\n side: \"left\" | \"right\" | \"top\" | \"bottom\",\n col: string | undefined\n): { x: number; y: number } {\n switch (side) {\n case \"right\":\n return { x: e.x + e.width, y: rowYByColumn(e, col) };\n case \"left\":\n return { x: e.x, y: rowYByColumn(e, col) };\n case \"top\":\n return { x: e.x + e.width / 2, y: e.y };\n case \"bottom\":\n return { x: e.x + e.width / 2, y: e.y + e.height };\n }\n}\n","import type {\n ErdAttribute,\n ErdCardinality,\n ErdLayoutEdge,\n ErdLayoutEntity,\n ErdLayoutResult,\n RenderConfig,\n} from \"../../core/types\";\nimport {\n svgRoot,\n group,\n rect,\n path as pathEl,\n line as lineEl,\n circle as circleEl,\n text as textEl,\n title as titleEl,\n desc as descEl,\n el,\n escapeXml,\n} from \"../../core/svg\";\nimport { resolveBaseTheme, type BaseTheme } from \"../../core/theme\";\nimport { layoutErd, ERD_CONST } from \"./layout\";\nimport { parseErd } from \"./parser\";\n\n// ─── CSS ──────────────────────────────────────────────────────\n\nfunction buildCss(t: BaseTheme): string {\n return `\n.lt-erd { font-family: system-ui, -apple-system, sans-serif; }\n.lt-erd-title { font: bold 16px sans-serif; fill: ${t.text}; }\n.lt-erd-entity-bg { fill: ${t.bg}; stroke: ${t.stroke}; stroke-width: 1.5; }\n.lt-erd-entity-header-bg { fill: ${t.fill}; stroke: ${t.stroke}; stroke-width: 1.5; }\n.lt-erd-entity-header { font: 600 13px sans-serif; fill: ${t.text}; text-anchor: middle; dominant-baseline: middle; }\n.lt-erd-attr-name { font: 500 12px sans-serif; fill: ${t.text}; dominant-baseline: middle; }\n.lt-erd-attr-name-pk { font: 600 12px sans-serif; fill: ${t.text}; text-decoration: underline; dominant-baseline: middle; }\n.lt-erd-attr-type { font: 11px monospace; fill: ${t.textMuted}; dominant-baseline: middle; }\n.lt-erd-attr-marker { font: 700 10px sans-serif; fill: ${t.bg}; text-anchor: middle; dominant-baseline: middle; letter-spacing: 0.3px; }\n.lt-erd-attr-marker-bg-pk { fill: ${t.accent}; stroke: none; }\n.lt-erd-attr-marker-bg-fk { fill: ${t.warn}; stroke: none; }\n.lt-erd-attr-marker-bg-uk { fill: ${t.positive}; stroke: none; }\n.lt-erd-attr-marker-bg-nn { fill: ${t.neutral}; stroke: none; }\n.lt-erd-row-divider { stroke: ${t.fillMuted}; stroke-width: 1; }\n.lt-erd-edge { fill: none; stroke: ${t.stroke}; stroke-width: 1.5; }\n.lt-erd-edge-non-identifying { stroke-dasharray: 5,4; }\n.lt-erd-glyph { stroke: ${t.stroke}; stroke-width: 1.5; fill: none; }\n.lt-erd-glyph-circle { stroke: ${t.stroke}; stroke-width: 1.5; fill: ${t.bg}; }\n.lt-erd-edge-label-bg { fill: ${t.bg}; stroke: ${t.fillMuted}; stroke-width: 1; }\n.lt-erd-edge-label { font: 500 10px sans-serif; fill: ${t.textMuted}; text-anchor: middle; dominant-baseline: middle; }\n`.trim();\n}\n\n// ─── Marker rendering helpers ─────────────────────────────────\n\nfunction attrMarkers(a: ErdAttribute): { label: string; cls: string }[] {\n const out: { label: string; cls: string }[] = [];\n if (a.pk) out.push({ label: \"PK\", cls: \"lt-erd-attr-marker-bg-pk\" });\n if (a.fk) out.push({ label: \"FK\", cls: \"lt-erd-attr-marker-bg-fk\" });\n if (a.uk) out.push({ label: \"UK\", cls: \"lt-erd-attr-marker-bg-uk\" });\n if (a.notNull && !a.pk) out.push({ label: \"*\", cls: \"lt-erd-attr-marker-bg-nn\" });\n return out;\n}\n\nfunction renderEntity(e: ErdLayoutEntity): string {\n const C = ERD_CONST;\n const body: string[] = [];\n\n // Outer frame.\n body.push(\n rect({\n x: e.x,\n y: e.y,\n width: e.width,\n height: e.height,\n rx: 4,\n class: \"lt-erd-entity-bg\",\n })\n );\n\n // Header background (top portion only) — drawn as a separate filled rect.\n body.push(\n pathEl({\n d:\n `M ${e.x} ${e.y + 4} ` +\n `Q ${e.x} ${e.y} ${e.x + 4} ${e.y} ` +\n `L ${e.x + e.width - 4} ${e.y} ` +\n `Q ${e.x + e.width} ${e.y} ${e.x + e.width} ${e.y + 4} ` +\n `L ${e.x + e.width} ${e.y + e.headerHeight} ` +\n `L ${e.x} ${e.y + e.headerHeight} Z`,\n class: \"lt-erd-entity-header-bg\",\n })\n );\n\n // Header label.\n body.push(\n textEl(\n {\n x: e.x + e.width / 2,\n y: e.y + e.headerHeight / 2,\n class: \"lt-erd-entity-header\",\n },\n e.entity.name\n )\n );\n\n // Attribute rows.\n for (let i = 0; i < e.rows.length; i++) {\n const row = e.rows[i]!;\n const a = row.attribute;\n const cy = e.y + row.yCenter;\n\n // Row divider above (skip first).\n if (i > 0) {\n body.push(\n lineEl({\n x1: e.x,\n y1: e.y + e.headerHeight + i * C.ROW_HEIGHT,\n x2: e.x + e.width,\n y2: e.y + e.headerHeight + i * C.ROW_HEIGHT,\n class: \"lt-erd-row-divider\",\n })\n );\n }\n\n // Name (PK gets underline).\n body.push(\n textEl(\n {\n x: e.x + C.ENTITY_PADDING_X,\n y: cy,\n class: a.pk ? \"lt-erd-attr-name-pk\" : \"lt-erd-attr-name\",\n },\n a.name\n )\n );\n\n // Type (right-aligned-ish: drawn at center-ish, before markers).\n const markers = attrMarkers(a);\n const markerW = 26;\n const markerGap = 4;\n const markersBlockW = markers.length * markerW + (markers.length - 1) * markerGap;\n const markersStartX = e.x + e.width - C.ENTITY_PADDING_X - markersBlockW;\n\n if (a.type) {\n body.push(\n textEl(\n {\n x: markersStartX - 8,\n y: cy,\n class: \"lt-erd-attr-type\",\n \"text-anchor\": \"end\",\n },\n a.type\n )\n );\n }\n\n // Marker pills.\n for (let j = 0; j < markers.length; j++) {\n const m = markers[j]!;\n const px = markersStartX + j * (markerW + markerGap);\n body.push(\n rect({\n x: px,\n y: cy - 8,\n width: markerW,\n height: 16,\n rx: 3,\n class: m.cls,\n })\n );\n body.push(\n textEl(\n {\n x: px + markerW / 2,\n y: cy + 1,\n class: \"lt-erd-attr-marker\",\n },\n m.label\n )\n );\n }\n }\n\n return group(\n {\n class: \"lt-erd-entity\",\n \"data-id\": e.entity.id,\n },\n body\n );\n}\n\n// ─── Crow's-foot endpoint glyph ───────────────────────────────\n\n/**\n * Produce a small SVG fragment representing the cardinality glyph.\n * Anchor (ax, ay) is the tip of the line on the entity edge; the glyph extends\n * INWARD along the line (toward the bend). `dirX`/`dirY` is the unit vector\n * pointing from the entity along the line (i.e. away from the entity).\n */\nfunction renderGlyph(\n ax: number,\n ay: number,\n dirX: number,\n dirY: number,\n card: ErdCardinality\n): string {\n const C = ERD_CONST;\n // Perpendicular vector (rotate dir by 90°).\n const px = -dirY;\n const py = dirX;\n\n // The bar / circle sits at `barDist` along the line, the crow's-foot fan span.\n const barDist = C.GLYPH_OFFSET; // distance from edge to bar/circle\n const barX = ax + dirX * barDist;\n const barY = ay + dirY * barDist;\n\n // The \"many\" foot fans out at the entity edge (inside `barDist`).\n const footTipX = ax;\n const footTipY = ay;\n const footBaseX = ax + dirX * C.GLYPH_FOOT_LEN;\n const footBaseY = ay + dirY * C.GLYPH_FOOT_LEN;\n\n const parts: string[] = [];\n\n switch (card) {\n case \"one-mandatory\": {\n // Single perpendicular bar at barDist.\n parts.push(\n lineEl({\n x1: barX + px * C.GLYPH_BAR_HALF,\n y1: barY + py * C.GLYPH_BAR_HALF,\n x2: barX - px * C.GLYPH_BAR_HALF,\n y2: barY - py * C.GLYPH_BAR_HALF,\n class: \"lt-erd-glyph\",\n })\n );\n break;\n }\n case \"one-optional\": {\n // Open circle at barDist.\n parts.push(\n circleEl({\n cx: barX,\n cy: barY,\n r: C.GLYPH_CIRCLE_R,\n class: \"lt-erd-glyph-circle\",\n })\n );\n break;\n }\n case \"many-mandatory\": {\n // Bar at barDist + crow's foot fanning to entity edge.\n parts.push(\n lineEl({\n x1: barX + px * C.GLYPH_BAR_HALF,\n y1: barY + py * C.GLYPH_BAR_HALF,\n x2: barX - px * C.GLYPH_BAR_HALF,\n y2: barY - py * C.GLYPH_BAR_HALF,\n class: \"lt-erd-glyph\",\n })\n );\n // Three legs from footBase to spread points at the entity edge.\n parts.push(\n lineEl({ x1: footBaseX, y1: footBaseY, x2: footTipX, y2: footTipY, class: \"lt-erd-glyph\" })\n );\n parts.push(\n lineEl({\n x1: footBaseX,\n y1: footBaseY,\n x2: footTipX + px * C.GLYPH_BAR_HALF,\n y2: footTipY + py * C.GLYPH_BAR_HALF,\n class: \"lt-erd-glyph\",\n })\n );\n parts.push(\n lineEl({\n x1: footBaseX,\n y1: footBaseY,\n x2: footTipX - px * C.GLYPH_BAR_HALF,\n y2: footTipY - py * C.GLYPH_BAR_HALF,\n class: \"lt-erd-glyph\",\n })\n );\n break;\n }\n case \"many-optional\": {\n // Open circle at barDist + crow's foot.\n parts.push(\n circleEl({\n cx: barX,\n cy: barY,\n r: C.GLYPH_CIRCLE_R,\n class: \"lt-erd-glyph-circle\",\n })\n );\n parts.push(\n lineEl({ x1: footBaseX, y1: footBaseY, x2: footTipX, y2: footTipY, class: \"lt-erd-glyph\" })\n );\n parts.push(\n lineEl({\n x1: footBaseX,\n y1: footBaseY,\n x2: footTipX + px * C.GLYPH_BAR_HALF,\n y2: footTipY + py * C.GLYPH_BAR_HALF,\n class: \"lt-erd-glyph\",\n })\n );\n parts.push(\n lineEl({\n x1: footBaseX,\n y1: footBaseY,\n x2: footTipX - px * C.GLYPH_BAR_HALF,\n y2: footTipY - py * C.GLYPH_BAR_HALF,\n class: \"lt-erd-glyph\",\n })\n );\n break;\n }\n }\n\n return parts.join(\"\");\n}\n\nfunction sideToOutwardDir(side: \"left\" | \"right\" | \"top\" | \"bottom\"): { x: number; y: number } {\n switch (side) {\n case \"right\":\n return { x: 1, y: 0 };\n case \"left\":\n return { x: -1, y: 0 };\n case \"bottom\":\n return { x: 0, y: 1 };\n case \"top\":\n return { x: 0, y: -1 };\n }\n}\n\n// ─── Edge rendering ───────────────────────────────────────────\n\nfunction renderEdge(edge: ErdLayoutEdge): string {\n const parts: string[] = [];\n parts.push(\n pathEl({\n d: edge.path,\n class: edge.ref.identifying ? \"lt-erd-edge\" : \"lt-erd-edge lt-erd-edge-non-identifying\",\n })\n );\n\n const fromDir = sideToOutwardDir(edge.fromAnchor.side);\n const toDir = sideToOutwardDir(edge.toAnchor.side);\n\n parts.push(\n renderGlyph(\n edge.fromAnchor.x,\n edge.fromAnchor.y,\n fromDir.x,\n fromDir.y,\n edge.ref.fromCard\n )\n );\n parts.push(\n renderGlyph(\n edge.toAnchor.x,\n edge.toAnchor.y,\n toDir.x,\n toDir.y,\n edge.ref.toCard\n )\n );\n\n if (edge.ref.label && edge.labelAt) {\n const label = edge.ref.label;\n const w = label.length * 6 + 14;\n parts.push(\n rect({\n x: edge.labelAt.x - w / 2,\n y: edge.labelAt.y - 9,\n width: w,\n height: 16,\n rx: 3,\n class: \"lt-erd-edge-label-bg\",\n })\n );\n parts.push(\n textEl(\n {\n x: edge.labelAt.x,\n y: edge.labelAt.y,\n class: \"lt-erd-edge-label\",\n },\n label\n )\n );\n }\n\n return group({ class: \"lt-erd-edge-group\" }, parts);\n}\n\n// ─── Top-level render ─────────────────────────────────────────\n\nexport function renderErdAst(\n result: ErdLayoutResult,\n themeName: \"default\" | \"monochrome\" | \"dark\" = \"default\"\n): string {\n const theme = resolveBaseTheme(themeName);\n const { entities, edges, width, height, ast } = result;\n\n const cssBlock = el(\"style\", {}, buildCss(theme));\n const titleNode = titleEl(ast.title ?? \"Schematex ERD\");\n const descNode = descEl(\n `Entity-Relationship Diagram with ${entities.length} entities and ${edges.length} relationships.`\n );\n\n const titleSvgBlock = ast.title\n ? textEl(\n {\n x: 12,\n y: 18,\n class: \"lt-erd-title\",\n },\n ast.title\n )\n : \"\";\n\n const offset = ast.title ? 28 : 0;\n\n const entitiesG = group(\n { class: \"lt-erd-entities\", transform: `translate(0, ${offset})` },\n entities.map(renderEntity)\n );\n const edgesG = group(\n { class: \"lt-erd-edges\", transform: `translate(0, ${offset})` },\n edges.map(renderEdge)\n );\n\n return svgRoot(\n {\n width,\n height: height + offset,\n viewBox: `0 0 ${width} ${height + offset}`,\n class: \"lt-erd\",\n },\n [titleNode, descNode, cssBlock, titleSvgBlock, edgesG, entitiesG]\n );\n}\n\nexport function renderErd(\n text: string,\n config?: RenderConfig\n): string {\n const ast = parseErd(text);\n const layout = layoutErd(ast);\n const themeName = ((config?.theme as \"default\" | \"monochrome\" | \"dark\") ?? \"default\");\n return renderErdAst(layout, themeName);\n}\n\n// Suppress unused-import warning for escapeXml; kept for future label escaping.\nvoid escapeXml;\n","import type { DiagramPlugin, RenderConfig } from \"../../core/types\";\nimport { parseErd } from \"./parser\";\nimport { renderErd } from \"./renderer\";\n\nexport const erd: DiagramPlugin = {\n type: \"erd\",\n detect(text: string): boolean {\n for (const raw of text.split(/\\r?\\n/)) {\n const t = raw.trim();\n if (t.length === 0) continue;\n if (t.startsWith(\"//\") || t.startsWith(\"#\")) continue;\n const first = t.split(/\\s+/)[0]?.toLowerCase() ?? \"\";\n return first === \"erd\";\n }\n return false;\n },\n parse: parseErd,\n render(text: string, config?: RenderConfig): string {\n return renderErd(text, config);\n },\n};\n\nexport { parseErd } from \"./parser\";\nexport { renderErd, renderErdAst } from \"./renderer\";\nexport { layoutErd, ERD_CONST } from \"./layout\";\n","/**\n * Breadboard DSL parser. Section-based:\n *\n * breadboard\n * board: half | full | mini\n * title: \"...\"\n * parts\n * id : kind [arg=value ...] @placement\n * wires\n * <endpoint> --color-- <endpoint> [via @coord]\n */\n\nimport type {\n BreadboardAst,\n BreadboardCoord,\n BreadboardEndpoint,\n BreadboardForm,\n BreadboardPart,\n BreadboardPartKind,\n BreadboardPlacement,\n BreadboardRail,\n BreadboardSidePlacement,\n BreadboardWire,\n BreadboardWireColor,\n} from \"../../core/types\";\n\nexport class BreadboardParseError extends Error {\n constructor(message: string, public lineNumber?: number) {\n super(lineNumber !== undefined ? `[line ${lineNumber}] ${message}` : message);\n this.name = \"BreadboardParseError\";\n }\n}\n\n// ─── Lex helpers ─────────────────────────────────────────────\n\nfunction stripComment(s: string): string {\n let out = \"\";\n let inQuote = false;\n for (let i = 0; i < s.length; i++) {\n const ch = s[i];\n if (ch === '\"') inQuote = !inQuote;\n if (!inQuote) {\n if (ch === \"/\" && s[i + 1] === \"/\") break;\n if (ch === \"#\") break;\n }\n out += ch;\n }\n return out;\n}\n\nfunction unquote(v: string): string {\n const t = v.trim();\n if (t.length >= 2 && t.startsWith('\"') && t.endsWith('\"')) return t.slice(1, -1);\n return t;\n}\n\ninterface RawLine { text: string; lineNumber: number; }\n\nfunction lex(text: string): RawLine[] {\n return text.split(/\\r?\\n/).map((raw, i) => ({\n text: stripComment(raw).trimEnd().replace(/^\\s+/, \"\"),\n lineNumber: i + 1,\n })).filter((l) => l.text.length > 0);\n}\n\n// ─── Coordinate parser ───────────────────────────────────────\n\nconst ROW_LETTERS = new Set([\"a\", \"b\", \"c\", \"d\", \"e\", \"f\", \"g\", \"h\", \"i\", \"j\"]);\n\nexport function parseCoord(token: string, lineNumber: number): BreadboardCoord {\n const t = token.startsWith(\"@\") ? token.slice(1) : token;\n // Rail forms: +t8, -t8, +b14, -b14\n const railMatch = /^([+-])([tb])(\\d+)$/.exec(t);\n if (railMatch) {\n const sign = railMatch[1] as \"+\" | \"-\";\n const half = railMatch[2] as \"t\" | \"b\";\n const col = parseInt(railMatch[3]!, 10);\n if (col < 1) throw new BreadboardParseError(`Rail column must be ≥ 1, got ${col}`, lineNumber);\n return { kind: \"rail\", rail: `${sign}${half}` as BreadboardRail, col };\n }\n // Hole forms: 5e, 12g\n const holeMatch = /^(\\d+)([a-jA-J])$/.exec(t);\n if (holeMatch) {\n const col = parseInt(holeMatch[1]!, 10);\n const row = holeMatch[2]!.toLowerCase();\n if (col < 1) throw new BreadboardParseError(`Column must be ≥ 1, got ${col}`, lineNumber);\n if (!ROW_LETTERS.has(row)) throw new BreadboardParseError(`Unknown row '${row}'`, lineNumber);\n return { kind: \"hole\", col, row: row as \"a\" };\n }\n throw new BreadboardParseError(`Invalid coordinate '${token}' (expected @5e, @+t8, @-b14, etc.)`, lineNumber);\n}\n\nconst SIDE_PLACEMENTS = new Set([\"beside-left\", \"beside-right\", \"above\", \"below\"]);\n\nfunction parsePlacement(rest: string, lineNumber: number): BreadboardPlacement {\n const t = rest.trim();\n if (!t.startsWith(\"@\")) {\n throw new BreadboardParseError(`Placement must start with '@', got '${t}'`, lineNumber);\n }\n const body = t.slice(1).trim();\n if (SIDE_PLACEMENTS.has(body)) {\n return { kind: \"side\", side: body as BreadboardSidePlacement };\n }\n // span: @5e..9e\n const spanIdx = body.indexOf(\"..\");\n if (spanIdx >= 0) {\n const fromRaw = body.slice(0, spanIdx).trim();\n const toRaw = body.slice(spanIdx + 2).trim();\n return {\n kind: \"span\",\n from: parseCoord(fromRaw, lineNumber),\n to: parseCoord(toRaw, lineNumber),\n };\n }\n return { kind: \"point\", at: parseCoord(body, lineNumber) };\n}\n\n// ─── Part declaration parser ─────────────────────────────────\n\nconst KIND_ALIASES: Record<string, BreadboardPartKind> = {\n resistor: \"resistor\",\n led: \"led\",\n cap: \"cap-elec\",\n \"cap-elec\": \"cap-elec\",\n \"cap-ceramic\": \"cap-ceramic\",\n diode: \"diode\",\n button: \"button\",\n dip: \"dip\",\n header: \"header\",\n // multi-token forms handled separately: \"mcu uno\", \"sensor hcsr04\", etc.\n};\n\nconst MCU_SUBTYPES: Record<string, BreadboardPartKind> = {\n uno: \"mcu-uno\", nano: \"mcu-nano\", esp32: \"mcu-esp32\", pico: \"mcu-pico\",\n};\n\nconst SENSOR_SUBTYPES: Record<string, BreadboardPartKind> = {\n hcsr04: \"sensor-hcsr04\", \"hc-sr04\": \"sensor-hcsr04\",\n dht11: \"sensor-dht11\", dht22: \"sensor-dht22\",\n};\n\nconst DISPLAY_SUBTYPES: Record<string, BreadboardPartKind> = {\n \"oled-ssd1306\": \"display-oled-ssd1306\",\n oled: \"display-oled-ssd1306\",\n \"lcd-1602-i2c\": \"display-lcd-1602-i2c\",\n lcd: \"display-lcd-1602-i2c\",\n};\n\nconst MODULE_SUBTYPES: Record<string, BreadboardPartKind> = {\n \"rotary-ky040\": \"module-rotary-ky040\",\n rotary: \"module-rotary-ky040\",\n};\n\nconst ACTUATOR_SUBTYPES: Record<string, BreadboardPartKind> = {\n \"servo-sg90\": \"actuator-servo-sg90\",\n servo: \"actuator-servo-sg90\",\n};\n\nfunction resolveKind(tokens: string[], lineNumber: number): { kind: BreadboardPartKind; consumed: number } {\n const head = tokens[0]?.toLowerCase() ?? \"\";\n if (head === \"mcu\") {\n const sub = tokens[1]?.toLowerCase() ?? \"\";\n if (!MCU_SUBTYPES[sub]) throw new BreadboardParseError(`Unknown mcu subtype '${sub}'`, lineNumber);\n return { kind: MCU_SUBTYPES[sub]!, consumed: 2 };\n }\n if (head === \"sensor\") {\n const sub = tokens[1]?.toLowerCase() ?? \"\";\n if (!SENSOR_SUBTYPES[sub]) throw new BreadboardParseError(`Unknown sensor subtype '${sub}'`, lineNumber);\n return { kind: SENSOR_SUBTYPES[sub]!, consumed: 2 };\n }\n if (head === \"display\") {\n const sub = tokens[1]?.toLowerCase() ?? \"\";\n if (!DISPLAY_SUBTYPES[sub]) throw new BreadboardParseError(`Unknown display subtype '${sub}'`, lineNumber);\n return { kind: DISPLAY_SUBTYPES[sub]!, consumed: 2 };\n }\n if (head === \"module\") {\n const sub = tokens[1]?.toLowerCase() ?? \"\";\n if (!MODULE_SUBTYPES[sub]) throw new BreadboardParseError(`Unknown module subtype '${sub}'`, lineNumber);\n return { kind: MODULE_SUBTYPES[sub]!, consumed: 2 };\n }\n if (head === \"actuator\") {\n const sub = tokens[1]?.toLowerCase() ?? \"\";\n if (!ACTUATOR_SUBTYPES[sub]) throw new BreadboardParseError(`Unknown actuator subtype '${sub}'`, lineNumber);\n return { kind: ACTUATOR_SUBTYPES[sub]!, consumed: 2 };\n }\n if (KIND_ALIASES[head]) return { kind: KIND_ALIASES[head]!, consumed: 1 };\n throw new BreadboardParseError(`Unknown part kind '${head}'`, lineNumber);\n}\n\nfunction parsePart(rawLine: string, lineNumber: number): BreadboardPart {\n // id : kind [args] @placement\n const colonIdx = rawLine.indexOf(\":\");\n if (colonIdx < 0) {\n throw new BreadboardParseError(`Part declaration must use 'id: kind ...' syntax`, lineNumber);\n }\n const id = rawLine.slice(0, colonIdx).trim();\n if (!/^[a-zA-Z][\\w-]*$/.test(id)) {\n throw new BreadboardParseError(`Invalid part id '${id}'`, lineNumber);\n }\n const after = rawLine.slice(colonIdx + 1).trim();\n // Split on '@' to separate kind+args from placement.\n const atIdx = after.indexOf(\"@\");\n if (atIdx < 0) {\n throw new BreadboardParseError(`Part '${id}' missing placement (use '@5e' or '@beside-left')`, lineNumber);\n }\n const kindAndArgs = after.slice(0, atIdx).trim();\n const placementStr = after.slice(atIdx).trim();\n\n const tokens = kindAndArgs.split(/\\s+/).filter((t) => t.length > 0);\n if (tokens.length === 0) throw new BreadboardParseError(`Part '${id}' missing kind`, lineNumber);\n const { kind, consumed } = resolveKind(tokens, lineNumber);\n const argTokens = tokens.slice(consumed);\n\n const args: Record<string, string | number> = {};\n for (const tok of argTokens) {\n const eq = tok.indexOf(\"=\");\n if (eq >= 0) {\n const k = tok.slice(0, eq).trim();\n const v = tok.slice(eq + 1).trim();\n const n = Number(v);\n args[k] = Number.isFinite(n) && /^-?\\d/.test(v) ? n : v;\n } else {\n // Bare token treated as the canonical \"value\" arg (e.g. resistor 220 → value=220, led red → color=red)\n const n = Number(tok);\n if (Number.isFinite(n) && /^-?\\d/.test(tok)) args.value = n;\n else if (kind === \"led\") args.color = tok;\n else args.value = tok;\n }\n }\n\n // Resistor with span placement — derive cols from span length so part width matches exactly.\n const placement = parsePlacement(placementStr, lineNumber);\n if (kind === \"resistor\" && placement.kind === \"span\") {\n const colSpan = Math.abs(getCol(placement.to) - getCol(placement.from));\n if (colSpan > 0) args.cols = colSpan;\n }\n if (kind === \"diode\" && placement.kind === \"span\") {\n const colSpan = Math.abs(getCol(placement.to) - getCol(placement.from));\n if (colSpan > 0) args.cols = colSpan;\n }\n\n return { id, kind, args, placement };\n}\n\nfunction getCol(c: BreadboardCoord): number {\n return c.col;\n}\n\n// ─── Wire parser ─────────────────────────────────────────────\n\nconst WIRE_COLORS: Record<string, BreadboardWireColor> = {\n red: \"red\", black: \"black\", blue: \"blue\", yellow: \"yellow\",\n orange: \"orange\", green: \"green\", white: \"white\", purple: \"purple\",\n brown: \"brown\", grey: \"grey\", gray: \"grey\",\n};\n\nfunction parseEndpoint(token: string, lineNumber: number): BreadboardEndpoint {\n if (token.startsWith(\"@\")) {\n return { kind: \"coord\", at: parseCoord(token, lineNumber) };\n }\n const colonIdx = token.indexOf(\":\");\n if (colonIdx <= 0) {\n throw new BreadboardParseError(`Wire endpoint must be '@<coord>' or 'partId:pin', got '${token}'`, lineNumber);\n }\n const partId = token.slice(0, colonIdx).trim();\n const pin = token.slice(colonIdx + 1).trim();\n if (!partId || !pin) throw new BreadboardParseError(`Malformed pin endpoint '${token}'`, lineNumber);\n return { kind: \"pin\", partId, pin };\n}\n\nfunction parseWire(rawLine: string, lineNumber: number): BreadboardWire {\n // <ep1> --color-- <ep2> [via @coord]\n // The color sits between two double-dashes.\n const m = /^(\\S+)\\s+--([a-zA-Z]+)--\\s+(\\S+)(?:\\s+via\\s+(\\S+))?\\s*$/.exec(rawLine);\n if (!m) {\n throw new BreadboardParseError(`Malformed wire line '${rawLine}' (expected '<ep> --color-- <ep>')`, lineNumber);\n }\n const fromTok = m[1]!;\n const colorTok = m[2]!.toLowerCase();\n const toTok = m[3]!;\n const viaTok = m[4];\n\n const color = WIRE_COLORS[colorTok];\n if (!color) {\n throw new BreadboardParseError(`Unknown wire color '${colorTok}'`, lineNumber);\n }\n const wire: BreadboardWire = {\n from: parseEndpoint(fromTok, lineNumber),\n to: parseEndpoint(toTok, lineNumber),\n color,\n };\n if (viaTok) wire.via = parseCoord(viaTok, lineNumber);\n return wire;\n}\n\n// ─── Top-level parser ────────────────────────────────────────\n\nconst VALID_BOARDS = new Set<BreadboardForm>([\"mini\", \"half\", \"full\"]);\n\nexport function parseBreadboard(text: string): BreadboardAst {\n const lines = lex(text);\n if (lines.length === 0) throw new BreadboardParseError(\"Empty input\");\n\n // Header.\n const header = lines[0]!;\n if (header.text.split(/\\s+/)[0]?.toLowerCase() !== \"breadboard\") {\n throw new BreadboardParseError(`Expected 'breadboard' header, got: ${header.text}`, header.lineNumber);\n }\n\n let i = 1;\n let board: BreadboardForm = \"half\";\n let title: string | undefined;\n\n // Header attributes: board:, title: (order-insensitive, before first section).\n while (i < lines.length) {\n const line = lines[i]!;\n const lower = line.text.toLowerCase();\n if (lower.startsWith(\"board:\")) {\n const v = line.text.slice(\"board:\".length).trim().toLowerCase() as BreadboardForm;\n if (!VALID_BOARDS.has(v)) {\n throw new BreadboardParseError(`Unknown board '${v}'. Use mini | half | full.`, line.lineNumber);\n }\n board = v;\n i++;\n continue;\n }\n if (lower.startsWith(\"title:\")) {\n title = unquote(line.text.slice(\"title:\".length).trim());\n i++;\n continue;\n }\n break;\n }\n\n const parts: BreadboardPart[] = [];\n const wires: BreadboardWire[] = [];\n\n // Section dispatch.\n let mode: \"parts\" | \"wires\" | null = null;\n while (i < lines.length) {\n const line = lines[i]!;\n const t = line.text;\n const lower = t.toLowerCase();\n if (lower === \"parts\") { mode = \"parts\"; i++; continue; }\n if (lower === \"wires\") { mode = \"wires\"; i++; continue; }\n if (mode === \"parts\") {\n parts.push(parsePart(t, line.lineNumber));\n } else if (mode === \"wires\") {\n wires.push(parseWire(t, line.lineNumber));\n } else {\n throw new BreadboardParseError(`Unexpected line outside parts/wires section: '${t}'`, line.lineNumber);\n }\n i++;\n }\n\n // Validation.\n const partIds = new Set(parts.map((p) => p.id));\n for (const part of parts) {\n if (parts.filter((p) => p.id === part.id).length > 1) {\n throw new BreadboardParseError(`Duplicate part id '${part.id}'`);\n }\n }\n for (const wire of wires) {\n for (const ep of [wire.from, wire.to]) {\n if (ep.kind === \"pin\" && !partIds.has(ep.partId)) {\n throw new BreadboardParseError(`Wire references unknown part '${ep.partId}'`);\n }\n }\n }\n // Mini boards have no rails — reject rail coordinates.\n if (board === \"mini\") {\n const checkCoord = (c: BreadboardCoord) => {\n if (c.kind === \"rail\") {\n throw new BreadboardParseError(`Mini boards have no power rails; '${railToken(c)}' is invalid`);\n }\n };\n for (const part of parts) {\n if (part.placement.kind === \"point\") checkCoord(part.placement.at);\n if (part.placement.kind === \"span\") { checkCoord(part.placement.from); checkCoord(part.placement.to); }\n }\n for (const wire of wires) {\n for (const ep of [wire.from, wire.to]) {\n if (ep.kind === \"coord\") checkCoord(ep.at);\n }\n if (wire.via) checkCoord(wire.via);\n }\n }\n\n return { type: \"breadboard\", board, title, parts, wires };\n}\n\nfunction railToken(c: BreadboardCoord): string {\n if (c.kind === \"rail\") return `@${c.rail}${c.col}`;\n return `@${c.col}${c.row}`;\n}\n","/**\n * Breadboard part catalog. Each entry describes a kind's footprint, pin\n * positions (relative to the part's local origin), and an SVG fragment\n * builder. The catalog is the single source of truth for both layout\n * (which uses footprint + pin positions) and renderer (which calls\n * `svg(part, theme)`).\n *\n * Coordinate convention for part-local space:\n * x → grows to the right\n * y → grows downward\n * For span parts, origin is the *first* pin (the @start coordinate);\n * for point parts, origin is the part center.\n */\n\nimport type {\n BreadboardPart,\n BreadboardPartKind,\n} from \"../../core/types\";\nimport { el, escapeXml } from \"../../core/svg\";\n\nexport interface PartPin {\n /** Pin label, e.g. \"5V\", \"GND\", \"D2\", \"1\", \"VCC\", \"ANODE\". */\n name: string;\n /** Pin center, relative to part-local origin. */\n x: number;\n y: number;\n}\n\nexport interface PartSpec {\n kind: BreadboardPartKind;\n /** \"grid\" parts snap to breadboard holes (resistor, led, dip).\n * \"side\" parts sit beside the substrate (Arduino Uno).\n * \"module\" parts have their own PCB footprint placed at a hole anchor. */\n category: \"grid\" | \"side\" | \"module\";\n /** Bounding box width / height in canvas px. */\n width: number;\n height: number;\n pins: PartPin[];\n /** Whether the part spans the trough (DIPs, MCUs that straddle). */\n straddlesTrough?: boolean;\n /** SVG body. Receives part, args, and the resolved width/height. */\n body: (part: BreadboardPart, w: number, h: number) => string;\n}\n\nconst PITCH = 14;\n\n// ─── helpers ─────────────────────────────────────────────────\n\nfunction rectShape(x: number, y: number, w: number, h: number, attrs: Record<string, string | number>): string {\n return el(\"rect\", { x, y, width: w, height: h, ...attrs });\n}\n\nfunction circShape(cx: number, cy: number, r: number, attrs: Record<string, string | number>): string {\n return el(\"circle\", { cx, cy, r, ...attrs });\n}\n\nfunction lineShape(x1: number, y1: number, x2: number, y2: number, attrs: Record<string, string | number>): string {\n return el(\"line\", { x1, y1, x2, y2, ...attrs });\n}\n\nfunction pathShape(d: string, attrs: Record<string, string | number>): string {\n return el(\"path\", { d, ...attrs });\n}\n\nfunction textShape(x: number, y: number, content: string, attrs: Record<string, string | number>): string {\n return el(\"text\", { x, y, ...attrs }, escapeXml(content));\n}\n\n// ─── Resistor color bands (decorative) ────────────────────────\n\nconst BAND_COLORS: Record<string, string> = {\n \"0\": \"#1f2937\", \"1\": \"#92400e\", \"2\": \"#dc2626\", \"3\": \"#f97316\",\n \"4\": \"#facc15\", \"5\": \"#16a34a\", \"6\": \"#2563eb\", \"7\": \"#7c3aed\",\n \"8\": \"#6b7280\", \"9\": \"#f3f4f6\",\n};\n\nfunction resistorBands(value: string | number | undefined): string[] {\n if (value === undefined) return [\"#92400e\", \"#92400e\", \"#1f2937\", \"#facc15\"];\n const s = String(value).replace(/[^\\d.kKmMrRΩ]/g, \"\");\n // Crude: parse leading number, treat 'k' = ×1000, 'M' = ×1e6.\n const m = s.match(/^([\\d.]+)\\s*([kKmM]?)/);\n if (!m) return [\"#92400e\", \"#92400e\", \"#1f2937\", \"#facc15\"];\n const num = parseFloat(m[1]!);\n const mult = m[2] === \"k\" || m[2] === \"K\" ? 1000 : m[2] === \"m\" || m[2] === \"M\" ? 1e6 : 1;\n const ohms = Math.round(num * mult);\n if (!Number.isFinite(ohms) || ohms <= 0) return [\"#92400e\", \"#92400e\", \"#1f2937\", \"#facc15\"];\n const str = String(ohms);\n if (str.length <= 1) return [BAND_COLORS[\"0\"]!, BAND_COLORS[str[0]!]!, BAND_COLORS[\"0\"]!, \"#facc15\"];\n const d1 = str[0]!;\n const d2 = str[1]!;\n const exp = String(str.length - 2);\n return [\n BAND_COLORS[d1] ?? \"#1f2937\",\n BAND_COLORS[d2] ?? \"#1f2937\",\n BAND_COLORS[exp] ?? \"#1f2937\",\n \"#facc15\", // gold tolerance band\n ];\n}\n\n// ─── Catalog entries ─────────────────────────────────────────\n\nconst RESISTOR: PartSpec = {\n kind: \"resistor\",\n category: \"grid\",\n width: 4 * PITCH,\n height: PITCH,\n pins: [\n { name: \"1\", x: 0, y: 0 },\n { name: \"2\", x: 4 * PITCH, y: 0 },\n ],\n body: (part, w, h) => {\n const bands = resistorBands(part.args.value);\n const cy = h / 2;\n const bodyW = w * 0.55;\n const bodyX = (w - bodyW) / 2;\n const lead1 = pathShape(`M 0 ${cy} L ${bodyX} ${cy}`, { class: \"lt-bb-lead\" });\n const lead2 = pathShape(`M ${bodyX + bodyW} ${cy} L ${w} ${cy}`, { class: \"lt-bb-lead\" });\n const body = rectShape(bodyX, cy - 4, bodyW, 8, { class: \"lt-bb-resistor\", rx: 3 });\n const bandW = 2;\n const bandStart = bodyX + bodyW * 0.18;\n const bandGap = (bodyW * 0.64) / Math.max(1, bands.length - 1);\n const bandEls = bands.map((color, i) =>\n rectShape(bandStart + i * bandGap - bandW / 2, cy - 4, bandW, 8, { fill: color })\n ).join(\"\");\n return lead1 + lead2 + body + bandEls;\n },\n};\n\nconst LED: PartSpec = {\n kind: \"led\",\n category: \"grid\",\n width: PITCH,\n height: PITCH,\n pins: [\n { name: \"anode\", x: 0, y: 0 },\n { name: \"cathode\", x: PITCH, y: 0 },\n ],\n body: (part, w, h) => {\n const color = String(part.args.color ?? \"red\").toLowerCase();\n const fill = ({\n red: \"#dc2626\", green: \"#16a34a\", blue: \"#2563eb\",\n yellow: \"#facc15\", white: \"#f3f4f6\", orange: \"#f97316\",\n } as Record<string, string>)[color] ?? \"#dc2626\";\n const cx = w / 2;\n const cy = h / 2 - 4;\n return [\n // Leads: anode = long (left), cathode = short (right)\n pathShape(`M 0 ${h / 2} L ${cx - 5} ${cy + 1}`, { class: \"lt-bb-lead\" }),\n pathShape(`M ${w} ${h / 2} L ${cx + 5} ${cy + 3}`, { class: \"lt-bb-lead\" }),\n circShape(cx, cy, 6, { fill, stroke: \"#0f172a\", \"stroke-width\": 1, opacity: 0.92 }),\n // highlight\n circShape(cx - 1.5, cy - 1.5, 1.6, { fill: \"#fff\", opacity: 0.6 }),\n // cathode flat-flag (small bar near right lead)\n lineShape(cx + 4, cy - 4, cx + 4, cy + 4, { stroke: \"#0f172a\", \"stroke-width\": 1.2 }),\n ].join(\"\");\n },\n};\n\nconst CAP_ELEC: PartSpec = {\n kind: \"cap-elec\",\n category: \"grid\",\n width: PITCH,\n height: PITCH,\n pins: [\n { name: \"+\", x: 0, y: 0 },\n { name: \"-\", x: PITCH, y: 0 },\n ],\n body: (_part, w, h) => {\n const cx = w / 2;\n const cy = h / 2 - 4;\n return [\n pathShape(`M 0 ${h / 2} L ${cx - 4} ${cy + 4}`, { class: \"lt-bb-lead\" }),\n pathShape(`M ${w} ${h / 2} L ${cx + 4} ${cy + 4}`, { class: \"lt-bb-lead\" }),\n circShape(cx, cy, 7, { class: \"lt-bb-cap-can\" }),\n // negative stripe\n pathShape(`M ${cx + 2} ${cy - 7} A 7 7 0 0 1 ${cx + 2} ${cy + 7}`, { fill: \"#94a3b8\", opacity: 0.7 }),\n textShape(cx + 4, cy + 1, \"−\", { fill: \"#fff\", \"font-size\": 7, \"font-weight\": 700, \"text-anchor\": \"middle\", \"dominant-baseline\": \"middle\" }),\n ].join(\"\");\n },\n};\n\nconst CAP_CERAMIC: PartSpec = {\n kind: \"cap-ceramic\",\n category: \"grid\",\n width: PITCH,\n height: PITCH,\n pins: [\n { name: \"1\", x: 0, y: 0 },\n { name: \"2\", x: PITCH, y: 0 },\n ],\n body: (_part, w, h) => {\n const cx = w / 2;\n const cy = h / 2 - 4;\n return [\n pathShape(`M 0 ${h / 2} L ${cx - 3} ${cy + 4}`, { class: \"lt-bb-lead\" }),\n pathShape(`M ${w} ${h / 2} L ${cx + 3} ${cy + 4}`, { class: \"lt-bb-lead\" }),\n circShape(cx, cy, 6, { fill: \"#facc15\", stroke: \"#a16207\", \"stroke-width\": 0.8 }),\n ].join(\"\");\n },\n};\n\nconst DIODE: PartSpec = {\n kind: \"diode\",\n category: \"grid\",\n width: 3 * PITCH,\n height: PITCH,\n pins: [\n { name: \"anode\", x: 0, y: 0 },\n { name: \"cathode\", x: 3 * PITCH, y: 0 },\n ],\n body: (_part, w, h) => {\n const cy = h / 2;\n const bodyW = w * 0.55;\n const bodyX = (w - bodyW) / 2;\n return [\n pathShape(`M 0 ${cy} L ${bodyX} ${cy}`, { class: \"lt-bb-lead\" }),\n pathShape(`M ${bodyX + bodyW} ${cy} L ${w} ${cy}`, { class: \"lt-bb-lead\" }),\n rectShape(bodyX, cy - 4, bodyW, 8, { fill: \"#1f2937\", rx: 2 }),\n rectShape(bodyX + bodyW * 0.78, cy - 4, 2, 8, { fill: \"#e5e7eb\" }),\n ].join(\"\");\n },\n};\n\nconst BUTTON: PartSpec = {\n kind: \"button\",\n category: \"grid\",\n width: 2 * PITCH,\n height: 5 * PITCH,\n pins: [\n // tactile: 4 leads at ±1 col / ±2 rows. Pin1=top-left, Pin2=top-right, Pin3=bottom-left, Pin4=bottom-right\n { name: \"1\", x: 0, y: 0 },\n { name: \"2\", x: 2 * PITCH, y: 0 },\n { name: \"3\", x: 0, y: 5 * PITCH },\n { name: \"4\", x: 2 * PITCH, y: 5 * PITCH },\n ],\n straddlesTrough: true,\n body: (_part, w, h) => {\n const bx = w / 2 - 9;\n const by = h / 2 - 9;\n return [\n rectShape(bx, by, 18, 18, { class: \"lt-bb-button\" }),\n circShape(w / 2, h / 2, 5, { fill: \"#1f2937\" }),\n ].join(\"\");\n },\n};\n\nfunction dipSpec(): PartSpec {\n return {\n kind: \"dip\",\n category: \"grid\",\n // width depends on pin count (set by layout based on args.pins)\n width: 7 * PITCH,\n height: 3 * PITCH,\n pins: [],\n straddlesTrough: true,\n body: (part, w, h) => {\n const pins = Math.max(4, Number(part.args.pins ?? 8));\n const perSide = pins / 2;\n const bodyMargin = PITCH / 2;\n return [\n rectShape(bodyMargin, 4, w - 2 * bodyMargin, h - 8, { class: \"lt-bb-dip-body\", rx: 2 }),\n // notch\n circShape(bodyMargin + 6, h / 2, 3, { fill: \"#0f172a\", stroke: \"#475569\", \"stroke-width\": 0.5 }),\n // pin 1 dot\n circShape(bodyMargin + PITCH * 0.6, h / 2 + (h / 2 - 6), 1.2, { fill: \"#fbbf24\" }),\n textShape(w / 2, h / 2 + 1, `IC${perSide * 2}`, { class: \"lt-bb-dip-silk\", \"text-anchor\": \"middle\", \"dominant-baseline\": \"middle\" }),\n ].join(\"\");\n },\n };\n}\n\nconst HEADER: PartSpec = {\n kind: \"header\",\n category: \"grid\",\n width: 4 * PITCH,\n height: PITCH,\n pins: [],\n body: (part, _w, h) => {\n const pins = Math.max(2, Number(part.args.pins ?? 4));\n const dots: string[] = [];\n for (let i = 0; i < pins; i++) {\n dots.push(circShape(i * PITCH, h / 2, 2, { fill: \"#facc15\", stroke: \"#a16207\", \"stroke-width\": 0.6 }));\n }\n return rectShape(-3, h / 2 - 4, pins * PITCH - 8, 8, { fill: \"#0f172a\", rx: 1 }) + dots.join(\"\");\n },\n};\n\n// ─── MCUs (off-board) ────────────────────────────────────────\n\ninterface McuPinSlot { name: string; side: \"left\" | \"right\" | \"top\" | \"bottom\"; idx: number; }\n\nfunction mcuSpec(\n kind: BreadboardPartKind,\n pcbColor: string,\n label: string,\n slots: McuPinSlot[],\n geometry: { width: number; height: number; cornerR: number }\n): PartSpec {\n const { width, height, cornerR } = geometry;\n const pins: PartPin[] = slots.map((s) => {\n const stride = 12;\n if (s.side === \"left\") return { name: s.name, x: 4, y: 14 + s.idx * stride };\n if (s.side === \"right\") return { name: s.name, x: width - 4, y: 14 + s.idx * stride };\n if (s.side === \"top\") return { name: s.name, x: 14 + s.idx * stride, y: 4 };\n return { name: s.name, x: 14 + s.idx * stride, y: height - 4 };\n });\n return {\n kind,\n category: \"side\",\n width,\n height,\n pins,\n body: () => {\n const board = rectShape(0, 0, width, height, { fill: pcbColor, stroke: \"#1e293b\", \"stroke-width\": 1, rx: cornerR });\n const dotEls = pins.map((p) =>\n circShape(p.x, p.y, 2.5, { fill: \"#0f172a\", stroke: \"#facc15\", \"stroke-width\": 0.8 })\n ).join(\"\");\n // pin labels (small text just inside the PCB)\n const labelEls = slots.map((s, i) => {\n const p = pins[i]!;\n const dx = s.side === \"left\" ? 8 : s.side === \"right\" ? -8 : 0;\n const dy = s.side === \"top\" ? 8 : s.side === \"bottom\" ? -8 : 0;\n const anchor = s.side === \"left\" ? \"start\" : s.side === \"right\" ? \"end\" : \"middle\";\n return textShape(p.x + dx, p.y + dy + 3, s.name, {\n class: \"lt-bb-pin-label\",\n \"text-anchor\": anchor,\n });\n }).join(\"\");\n const titleEl = textShape(width / 2, height - 8, label, {\n class: \"lt-bb-board-title\",\n \"text-anchor\": \"middle\",\n });\n return board + dotEls + labelEls + titleEl;\n },\n };\n}\n\n// Subset of Uno pinout: power + commonly-used digital + analog\nconst UNO_SLOTS: McuPinSlot[] = [\n // right edge: digital 13 → 0 (top→bottom)\n { name: \"D13\", side: \"right\", idx: 0 },\n { name: \"D12\", side: \"right\", idx: 1 },\n { name: \"D11\", side: \"right\", idx: 2 },\n { name: \"D10\", side: \"right\", idx: 3 },\n { name: \"D9\", side: \"right\", idx: 4 },\n { name: \"D8\", side: \"right\", idx: 5 },\n { name: \"D7\", side: \"right\", idx: 6 },\n { name: \"D6\", side: \"right\", idx: 7 },\n { name: \"D5\", side: \"right\", idx: 8 },\n { name: \"D4\", side: \"right\", idx: 9 },\n { name: \"D3\", side: \"right\", idx: 10 },\n { name: \"D2\", side: \"right\", idx: 11 },\n { name: \"TX\", side: \"right\", idx: 12 },\n { name: \"RX\", side: \"right\", idx: 13 },\n // left edge: power + analog\n { name: \"RST\", side: \"left\", idx: 0 },\n { name: \"3V3\", side: \"left\", idx: 1 },\n { name: \"5V\", side: \"left\", idx: 2 },\n { name: \"GND\", side: \"left\", idx: 3 },\n { name: \"VIN\", side: \"left\", idx: 4 },\n { name: \"A0\", side: \"left\", idx: 6 },\n { name: \"A1\", side: \"left\", idx: 7 },\n { name: \"A2\", side: \"left\", idx: 8 },\n { name: \"A3\", side: \"left\", idx: 9 },\n { name: \"A4\", side: \"left\", idx: 10 },\n { name: \"A5\", side: \"left\", idx: 11 },\n];\n\nconst ESP32_SLOTS: McuPinSlot[] = [\n { name: \"3V3\", side: \"left\", idx: 0 },\n { name: \"GND\", side: \"left\", idx: 1 },\n { name: \"GPIO15\", side: \"left\", idx: 2 },\n { name: \"GPIO2\", side: \"left\", idx: 3 },\n { name: \"GPIO4\", side: \"left\", idx: 4 },\n { name: \"GPIO5\", side: \"left\", idx: 5 },\n { name: \"GPIO18\", side: \"left\", idx: 6 },\n { name: \"GPIO19\", side: \"left\", idx: 7 },\n { name: \"GPIO21\", side: \"left\", idx: 8 },\n { name: \"GPIO22\", side: \"left\", idx: 9 },\n { name: \"VIN\", side: \"right\", idx: 0 },\n { name: \"GND\", side: \"right\", idx: 1 },\n { name: \"GPIO13\", side: \"right\", idx: 2 },\n { name: \"GPIO12\", side: \"right\", idx: 3 },\n { name: \"GPIO14\", side: \"right\", idx: 4 },\n { name: \"GPIO27\", side: \"right\", idx: 5 },\n { name: \"GPIO26\", side: \"right\", idx: 6 },\n { name: \"GPIO25\", side: \"right\", idx: 7 },\n { name: \"GPIO33\", side: \"right\", idx: 8 },\n { name: \"GPIO32\", side: \"right\", idx: 9 },\n];\n\n// ─── Sensor / display modules ────────────────────────────────\n\nfunction moduleSpec(\n kind: BreadboardPartKind,\n width: number,\n height: number,\n pcbColor: string,\n pinNames: string[],\n label: string\n): PartSpec {\n const stride = (width - 16) / Math.max(1, pinNames.length - 1);\n const pins: PartPin[] = pinNames.map((name, i) => ({\n name,\n x: 8 + i * stride,\n y: height - 4,\n }));\n return {\n kind,\n category: \"module\",\n width,\n height,\n pins,\n body: () => {\n const board = rectShape(0, 0, width, height, { fill: pcbColor, stroke: \"#0f172a\", \"stroke-width\": 1, rx: 4 });\n const headerStrip = rectShape(4, height - 8, width - 8, 5, { fill: \"#0f172a\", rx: 1 });\n const pinDots = pins.map((p) =>\n circShape(p.x, p.y, 2, { fill: \"#facc15\", stroke: \"#a16207\", \"stroke-width\": 0.5 })\n ).join(\"\");\n const pinLabels = pinNames.map((name, i) => {\n const p = pins[i]!;\n return textShape(p.x, height - 12, name, {\n class: \"lt-bb-pin-label-sensor\",\n \"text-anchor\": \"middle\",\n });\n }).join(\"\");\n const titleEl = textShape(width / 2, 18, label, {\n class: \"lt-bb-board-title-sensor\",\n \"text-anchor\": \"middle\",\n });\n return board + headerStrip + pinDots + pinLabels + titleEl;\n },\n };\n}\n\n// ─── Catalog map ─────────────────────────────────────────────\n\nexport const PART_CATALOG: Record<BreadboardPartKind, PartSpec> = {\n resistor: RESISTOR,\n led: LED,\n \"cap-elec\": CAP_ELEC,\n \"cap-ceramic\": CAP_CERAMIC,\n diode: DIODE,\n button: BUTTON,\n dip: dipSpec(),\n header: HEADER,\n \"mcu-uno\": mcuSpec(\"mcu-uno\", \"#0d9488\", \"Arduino Uno\", UNO_SLOTS, { width: 110, height: 200, cornerR: 6 }),\n \"mcu-nano\": mcuSpec(\"mcu-nano\", \"#0d9488\", \"Arduino Nano\", UNO_SLOTS.slice(0, 18), { width: 90, height: 180, cornerR: 4 }),\n \"mcu-esp32\": mcuSpec(\"mcu-esp32\", \"#1e293b\", \"ESP32 DevKit\", ESP32_SLOTS, { width: 110, height: 180, cornerR: 4 }),\n \"mcu-pico\": mcuSpec(\"mcu-pico\", \"#1e3a8a\", \"Raspberry Pi Pico\", ESP32_SLOTS, { width: 100, height: 180, cornerR: 4 }),\n \"sensor-hcsr04\": moduleSpec(\"sensor-hcsr04\", 100, 60, \"#1e3a8a\", [\"VCC\", \"TRIG\", \"ECHO\", \"GND\"], \"HC-SR04\"),\n \"sensor-dht11\": moduleSpec(\"sensor-dht11\", 70, 60, \"#1e40af\", [\"VCC\", \"DATA\", \"GND\"], \"DHT11\"),\n \"sensor-dht22\": moduleSpec(\"sensor-dht22\", 70, 60, \"#1e40af\", [\"VCC\", \"DATA\", \"GND\"], \"DHT22\"),\n \"display-oled-ssd1306\": moduleSpec(\"display-oled-ssd1306\", 90, 60, \"#0f172a\", [\"GND\", \"VCC\", \"SCL\", \"SDA\"], \"OLED 128×64\"),\n \"display-lcd-1602-i2c\": moduleSpec(\"display-lcd-1602-i2c\", 130, 60, \"#166534\", [\"GND\", \"VCC\", \"SDA\", \"SCL\"], \"LCD 1602 I²C\"),\n \"module-rotary-ky040\": moduleSpec(\"module-rotary-ky040\", 80, 60, \"#7c2d12\", [\"CLK\", \"DT\", \"SW\", \"VCC\", \"GND\"], \"KY-040\"),\n \"actuator-servo-sg90\": moduleSpec(\"actuator-servo-sg90\", 60, 60, \"#475569\", [\"GND\", \"VCC\", \"SIG\"], \"Servo SG90\"),\n};\n\nexport function partSpec(kind: BreadboardPartKind, args: Record<string, string | number> = {}): PartSpec {\n const base = PART_CATALOG[kind];\n if (!base) throw new Error(`Unknown breadboard part kind: ${kind}`);\n\n // Resistor: width grows with span (cols arg, default 4)\n if (kind === \"resistor\") {\n const cols = Math.max(2, Number(args.cols ?? 4));\n return {\n ...base,\n width: cols * PITCH,\n pins: [\n { name: \"1\", x: 0, y: 0 },\n { name: \"2\", x: cols * PITCH, y: 0 },\n ],\n };\n }\n // Diode: same pattern\n if (kind === \"diode\") {\n const cols = Math.max(2, Number(args.cols ?? 3));\n return {\n ...base,\n width: cols * PITCH,\n pins: [\n { name: \"anode\", x: 0, y: 0 },\n { name: \"cathode\", x: cols * PITCH, y: 0 },\n ],\n };\n }\n // DIP: width = (pins/2) cols; pins along long edges\n if (kind === \"dip\") {\n const pinCount = Math.max(4, Number(args.pins ?? 8));\n const perSide = pinCount / 2;\n const w = perSide * PITCH;\n const h = 3 * PITCH; // straddles trough: 3 rows tall (top half row e + trough + bottom half row f)\n const pins: PartPin[] = [];\n for (let i = 0; i < perSide; i++) {\n pins.push({ name: String(i + 1), x: i * PITCH, y: 0 });\n pins.push({ name: String(pinCount - i), x: i * PITCH, y: h });\n }\n return { ...base, width: w, height: h, pins };\n }\n // Header: width grows with pins\n if (kind === \"header\") {\n const pinCount = Math.max(2, Number(args.pins ?? 4));\n const pins: PartPin[] = [];\n for (let i = 0; i < pinCount; i++) pins.push({ name: String(i + 1), x: i * PITCH, y: 0 });\n return { ...base, width: pinCount * PITCH, pins };\n }\n // LED color is rendered via body() — same footprint regardless of color.\n return base;\n}\n\n// ─── Public utilities ────────────────────────────────────────\n\n/** The default hole pitch in canvas pixels. Exported so layout / renderer agree. */\nexport const HOLE_PITCH = PITCH;\n","/**\n * Breadboard layout. Resolves DSL coordinates to canvas pixels:\n * 1. Determine substrate geometry (cols, rails, trough).\n * 2. Place grid parts at hole-snapped coordinates.\n * 3. Place side-placed MCUs to left/right/above/below the substrate\n * with padding so pin labels are readable.\n * 4. Resolve wire endpoints to canvas px and compute Bézier paths.\n */\n\nimport type {\n BreadboardAst,\n BreadboardCoord,\n BreadboardEndpoint,\n BreadboardLayoutPart,\n BreadboardLayoutResult,\n BreadboardLayoutSubstrate,\n BreadboardLayoutWire,\n BreadboardPart,\n} from \"../../core/types\";\nimport { partSpec, HOLE_PITCH } from \"./parts\";\n\nexport const BB_CONST = {\n PITCH: HOLE_PITCH,\n RAIL_HEIGHT: 18,\n TROUGH: HOLE_PITCH,\n BOARD_PAD_X: 24,\n BOARD_PAD_Y: 16,\n ROW_LABEL_W: 14,\n COL_LABEL_H: 12,\n MCU_GAP: 28,\n MARGIN: 24,\n} as const;\n\nconst ROW_INDEX: Record<string, number> = { a: 0, b: 1, c: 2, d: 3, e: 4, f: 5, g: 6, h: 7, i: 8, j: 9 };\n\n// ─── Substrate sizing ────────────────────────────────────────\n\nfunction substrateGeom(form: BreadboardAst[\"board\"]): {\n cols: number;\n hasRails: boolean;\n railsBreak: boolean;\n} {\n if (form === \"mini\") return { cols: 17, hasRails: false, railsBreak: false };\n if (form === \"half\") return { cols: 30, hasRails: true, railsBreak: false };\n return { cols: 63, hasRails: true, railsBreak: true };\n}\n\nfunction buildSubstrate(form: BreadboardAst[\"board\"], originX: number, originY: number): BreadboardLayoutSubstrate {\n const { cols, hasRails, railsBreak } = substrateGeom(form);\n const PITCH = BB_CONST.PITCH;\n // Inner grid: 10 rows (a..j). Plus 2 rails on top, 2 rails on bottom (if hasRails).\n const innerW = (cols + 1) * PITCH + BB_CONST.ROW_LABEL_W * 2;\n const railH = hasRails ? BB_CONST.RAIL_HEIGHT * 2 : 0;\n const gridH = 10 * PITCH + BB_CONST.TROUGH;\n const innerH = railH + gridH + BB_CONST.COL_LABEL_H * 2;\n const x = originX;\n const y = originY;\n const width = innerW + BB_CONST.BOARD_PAD_X * 2;\n const height = innerH + BB_CONST.BOARD_PAD_Y * 2;\n // Trough sits between row e and row f. Top rails (if any) → col labels → rows a..e → trough → rows f..j → col labels → bottom rails.\n const topRailsH = hasRails ? BB_CONST.RAIL_HEIGHT : 0;\n const troughY = y + BB_CONST.BOARD_PAD_Y + topRailsH + BB_CONST.COL_LABEL_H + 5 * PITCH + PITCH / 2;\n return {\n x, y, width, height, pitch: PITCH, cols, hasRails, railsBreak,\n troughY, troughHeight: BB_CONST.TROUGH,\n };\n}\n\n// ─── Coord → canvas px ───────────────────────────────────────\n\nfunction holeXY(sub: BreadboardLayoutSubstrate, c: BreadboardCoord): { x: number; y: number } {\n const PITCH = sub.pitch;\n const gridX0 = sub.x + BB_CONST.BOARD_PAD_X + BB_CONST.ROW_LABEL_W + PITCH / 2;\n const topRailsH = sub.hasRails ? BB_CONST.RAIL_HEIGHT : 0;\n const gridY0 = sub.y + BB_CONST.BOARD_PAD_Y + topRailsH + BB_CONST.COL_LABEL_H + PITCH / 2;\n if (c.kind === \"hole\") {\n const colX = gridX0 + (c.col - 1) * PITCH;\n const rowI = ROW_INDEX[c.row]!;\n let rowY = gridY0 + rowI * PITCH;\n if (rowI >= 5) rowY += BB_CONST.TROUGH; // gap between e and f\n return { x: colX, y: rowY };\n }\n // Rail: top or bottom edge, positive or negative stripe.\n const railColX = gridX0 + (c.col - 1) * PITCH;\n const isTop = c.rail.endsWith(\"t\");\n const isPositive = c.rail.startsWith(\"+\");\n if (isTop) {\n const railsTopY = sub.y + BB_CONST.BOARD_PAD_Y;\n const stripY = isPositive ? railsTopY + 4 : railsTopY + BB_CONST.RAIL_HEIGHT - 4;\n return { x: railColX, y: stripY };\n }\n const railsBottomY = sub.y + sub.height - BB_CONST.BOARD_PAD_Y - BB_CONST.RAIL_HEIGHT;\n const stripY = isPositive ? railsBottomY + 4 : railsBottomY + BB_CONST.RAIL_HEIGHT - 4;\n return { x: railColX, y: stripY };\n}\n\n// ─── Part placement ─────────────────────────────────────────\n\nfunction placePart(\n sub: BreadboardLayoutSubstrate,\n part: BreadboardPart,\n reservedSides: { left: number; right: number; above: number; below: number }\n): BreadboardLayoutPart {\n const spec = partSpec(part.kind, part.args);\n if (spec.category === \"side\") {\n const placement = part.placement.kind === \"side\" ? part.placement.side : \"beside-left\";\n let x = 0, y = 0;\n if (placement === \"beside-left\") {\n x = sub.x - BB_CONST.MCU_GAP - spec.width;\n y = sub.y + (sub.height - spec.height) / 2;\n } else if (placement === \"beside-right\") {\n x = sub.x + sub.width + BB_CONST.MCU_GAP;\n y = sub.y + (sub.height - spec.height) / 2;\n } else if (placement === \"above\") {\n x = sub.x + (sub.width - spec.width) / 2;\n y = sub.y - BB_CONST.MCU_GAP - spec.height;\n } else {\n x = sub.x + (sub.width - spec.width) / 2;\n y = sub.y + sub.height + BB_CONST.MCU_GAP;\n }\n const pins: Record<string, { x: number; y: number }> = {};\n for (const p of spec.pins) pins[p.name] = { x: x + p.x, y: y + p.y };\n // track reservations\n if (placement === \"beside-left\") reservedSides.left = Math.max(reservedSides.left, spec.width + BB_CONST.MCU_GAP);\n if (placement === \"beside-right\") reservedSides.right = Math.max(reservedSides.right, spec.width + BB_CONST.MCU_GAP);\n if (placement === \"above\") reservedSides.above = Math.max(reservedSides.above, spec.height + BB_CONST.MCU_GAP);\n if (placement === \"below\") reservedSides.below = Math.max(reservedSides.below, spec.height + BB_CONST.MCU_GAP);\n return {\n part, x, y, width: spec.width, height: spec.height, rotation: 0, pins,\n };\n }\n\n // Grid / module: anchor on first pin coordinate.\n let anchor: BreadboardCoord;\n if (part.placement.kind === \"point\") anchor = part.placement.at;\n else if (part.placement.kind === \"span\") anchor = part.placement.from;\n else throw new Error(`Grid/module part '${part.id}' must use @coord placement`);\n const anchorXY = holeXY(sub, anchor);\n\n // For module parts (sensors / displays): anchor is the first pin (lower-left of module),\n // so module sits *above* the anchor with pin row at its bottom edge.\n if (spec.category === \"module\") {\n // Compute total pin span:\n const lastPin = spec.pins[spec.pins.length - 1]!;\n const pinSpanX = lastPin.x - spec.pins[0]!.x;\n // Position module so first pin lands on anchor.\n const x = anchorXY.x - spec.pins[0]!.x;\n const y = anchorXY.y - spec.pins[0]!.y; // pin y is near bottom of module body\n void pinSpanX;\n const pins: Record<string, { x: number; y: number }> = {};\n for (const p of spec.pins) pins[p.name] = { x: x + p.x, y: y + p.y };\n return { part, x, y, width: spec.width, height: spec.height, rotation: 0, pins };\n }\n\n // Grid part: pins[0] sits at anchor.\n const x = anchorXY.x;\n let y = anchorXY.y;\n // For DIPs / button which straddle trough: anchor is row e, top edge — body extends across trough.\n if (spec.straddlesTrough) {\n // Center body so pin row 1 (y=0) stays at anchor row, pin row 2 (y=h) reaches the matching row across trough.\n // anchor y is the *top* pin row; the layout coord anchor must be on row e (or symmetrical).\n }\n // Adjust y so pin centerline aligns with anchor when part is one-row tall.\n if (spec.height === BB_CONST.PITCH) {\n y = anchorXY.y - spec.height / 2;\n }\n const pins: Record<string, { x: number; y: number }> = {};\n for (const p of spec.pins) pins[p.name] = { x: x + p.x, y: y + p.y };\n return { part, x, y, width: spec.width, height: spec.height, rotation: 0, pins };\n}\n\n// ─── Wire endpoint resolution ───────────────────────────────\n\nfunction endpointXY(\n ep: BreadboardEndpoint,\n parts: BreadboardLayoutPart[],\n sub: BreadboardLayoutSubstrate\n): { x: number; y: number } {\n if (ep.kind === \"coord\") return holeXY(sub, ep.at);\n const part = parts.find((p) => p.part.id === ep.partId);\n if (!part) throw new Error(`Wire references unknown part '${ep.partId}'`);\n const pin = part.pins[ep.pin];\n if (!pin) throw new Error(`Part '${ep.partId}' has no pin named '${ep.pin}'`);\n // Return a copy so post-layout translation doesn't double-shift this point\n // through both part.pins[name] and lw.fromXY.\n return { x: pin.x, y: pin.y };\n}\n\nfunction bezierPath(p1: { x: number; y: number }, p2: { x: number; y: number }, via?: { x: number; y: number }): string {\n const dx = p2.x - p1.x;\n const dy = p2.y - p1.y;\n const dist = Math.sqrt(dx * dx + dy * dy);\n if (dist < 1) return `M ${p1.x} ${p1.y} L ${p2.x} ${p2.y}`;\n // Perpendicular unit vector\n const nx = -dy / dist;\n const ny = dx / dist;\n // Magnitude: 0.4 × max(|dx|,|dy|), but at least 14 so short wires still arc visibly.\n const mag = Math.max(14, 0.4 * Math.max(Math.abs(dx), Math.abs(dy)));\n // For \"natural\" arc: bow upward (negative y) when chord runs left→right horizontally;\n // bow rightward when chord runs top→bottom.\n // We pick perpendicular sign so the wire arcs away from the substrate center for off-board MCUs,\n // but a single-sign default works fine: use +nx,+ny for left→right, flip for right→left.\n const sign = dx >= 0 ? 1 : -1;\n let cp1x: number, cp1y: number, cp2x: number, cp2y: number;\n if (via) {\n // Steer both control points toward 'via'.\n cp1x = (p1.x + via.x) / 2;\n cp1y = (p1.y + via.y) / 2;\n cp2x = (via.x + p2.x) / 2;\n cp2y = (via.y + p2.y) / 2;\n } else {\n const offX = nx * mag * sign;\n const offY = ny * mag * sign;\n cp1x = p1.x + dx * 0.25 + offX;\n cp1y = p1.y + dy * 0.25 + offY;\n cp2x = p1.x + dx * 0.75 + offX;\n cp2y = p1.y + dy * 0.75 + offY;\n }\n return `M ${p1.x.toFixed(2)} ${p1.y.toFixed(2)} C ${cp1x.toFixed(2)} ${cp1y.toFixed(2)} ${cp2x.toFixed(2)} ${cp2y.toFixed(2)} ${p2.x.toFixed(2)} ${p2.y.toFixed(2)}`;\n}\n\n// ─── Public API ─────────────────────────────────────────────\n\nexport function layoutBreadboard(ast: BreadboardAst): BreadboardLayoutResult {\n // Place parts to discover side reservations.\n const reserved = { left: 0, right: 0, above: 0, below: 0 };\n // Pre-scan side-placed parts only to compute final substrate offset.\n for (const part of ast.parts) {\n if (part.placement.kind === \"side\") {\n const spec = partSpec(part.kind, part.args);\n const side = part.placement.side;\n if (side === \"beside-left\") reserved.left = Math.max(reserved.left, spec.width + BB_CONST.MCU_GAP);\n if (side === \"beside-right\") reserved.right = Math.max(reserved.right, spec.width + BB_CONST.MCU_GAP);\n if (side === \"above\") reserved.above = Math.max(reserved.above, spec.height + BB_CONST.MCU_GAP);\n if (side === \"below\") reserved.below = Math.max(reserved.below, spec.height + BB_CONST.MCU_GAP);\n }\n }\n\n // Final substrate origin: shift right by `reserved.left`, down by `reserved.above`.\n const sub = buildSubstrate(\n ast.board,\n BB_CONST.MARGIN + reserved.left,\n BB_CONST.MARGIN + reserved.above + (ast.title ? 30 : 0)\n );\n\n // Now place all parts against final substrate.\n const reservedFinal = { left: 0, right: 0, above: 0, below: 0 };\n const parts: BreadboardLayoutPart[] = ast.parts.map((p) => placePart(sub, p, reservedFinal));\n\n // Wires.\n const wires: BreadboardLayoutWire[] = ast.wires.map((wire) => {\n const fromXY = endpointXY(wire.from, parts, sub);\n const toXY = endpointXY(wire.to, parts, sub);\n return {\n wire,\n path: \"\", // computed after final shift below\n fromXY,\n toXY,\n color: wire.color,\n };\n });\n\n // Canvas size — bounding box across substrate + side parts + wires.\n let minX = sub.x;\n let minY = sub.y;\n let maxX = sub.x + sub.width;\n let maxY = sub.y + sub.height;\n for (const lp of parts) {\n minX = Math.min(minX, lp.x);\n minY = Math.min(minY, lp.y);\n maxX = Math.max(maxX, lp.x + lp.width);\n maxY = Math.max(maxY, lp.y + lp.height);\n }\n for (const lw of wires) {\n minX = Math.min(minX, lw.fromXY.x, lw.toXY.x);\n minY = Math.min(minY, lw.fromXY.y, lw.toXY.y);\n maxX = Math.max(maxX, lw.fromXY.x, lw.toXY.x);\n maxY = Math.max(maxY, lw.fromXY.y, lw.toXY.y);\n }\n // Translate everything so origin is at (MARGIN, MARGIN).\n const shiftX = BB_CONST.MARGIN - minX;\n const shiftY = BB_CONST.MARGIN - minY;\n if (shiftX !== 0 || shiftY !== 0) {\n sub.x += shiftX;\n sub.y += shiftY;\n sub.troughY += shiftY;\n for (const lp of parts) {\n lp.x += shiftX;\n lp.y += shiftY;\n for (const k of Object.keys(lp.pins)) {\n lp.pins[k]!.x += shiftX;\n lp.pins[k]!.y += shiftY;\n }\n }\n for (const lw of wires) {\n lw.fromXY.x += shiftX;\n lw.fromXY.y += shiftY;\n lw.toXY.x += shiftX;\n lw.toXY.y += shiftY;\n }\n }\n // Render wire paths AFTER the substrate-relative shift so via coords also align.\n for (let i = 0; i < wires.length; i++) {\n const lw = wires[i]!;\n const wire = ast.wires[i]!;\n const viaXY = wire.via ? holeXY(sub, wire.via) : undefined;\n lw.path = bezierPath(lw.fromXY, lw.toXY, viaXY);\n }\n const width = (maxX - minX) + BB_CONST.MARGIN * 2;\n const height = (maxY - minY) + BB_CONST.MARGIN * 2;\n\n return { ast, substrate: sub, parts, wires, width, height };\n}\n","/**\n * Breadboard renderer. Z-order: substrate → rails/labels → holes → parts → wires.\n */\n\nimport type {\n BreadboardLayoutPart,\n BreadboardLayoutResult,\n BreadboardLayoutSubstrate,\n RenderConfig,\n} from \"../../core/types\";\nimport {\n svgRoot,\n group,\n rect as rectEl,\n circle as circleEl,\n text as textEl,\n path as pathEl,\n title as titleEl,\n desc as descEl,\n el,\n escapeXml,\n} from \"../../core/svg\";\nimport { resolveBaseTheme, type BaseTheme } from \"../../core/theme\";\nimport { partSpec } from \"./parts\";\nimport { layoutBreadboard, BB_CONST } from \"./layout\";\nimport { parseBreadboard } from \"./parser\";\n\nconst WIRE_COLOR_MAP: Record<string, string> = {\n red: \"#dc2626\",\n black: \"#1f2937\",\n blue: \"#2563eb\",\n yellow: \"#facc15\",\n orange: \"#f97316\",\n green: \"#16a34a\",\n white: \"#f3f4f6\",\n purple: \"#7c3aed\",\n brown: \"#78350f\",\n grey: \"#64748b\",\n};\n\nfunction buildCss(t: BaseTheme): string {\n return `\n.lt-bb { font-family: system-ui, -apple-system, sans-serif; }\n.lt-bb-title { font: 600 16px sans-serif; fill: ${t.text}; }\n.lt-bb-substrate { fill: #e7d8b6; stroke: #b08c4f; stroke-width: 1.5; }\n.lt-bb-rail-pos { fill: #fde2e2; stroke: #dc2626; stroke-width: 0.6; }\n.lt-bb-rail-neg { fill: #dde7fa; stroke: #2563eb; stroke-width: 0.6; }\n.lt-bb-rail-stripe-pos { stroke: #dc2626; stroke-width: 1.2; }\n.lt-bb-rail-stripe-neg { stroke: #2563eb; stroke-width: 1.2; }\n.lt-bb-trough { fill: #fcfaf3; stroke: #b08c4f; stroke-width: 0.6; }\n.lt-bb-hole { fill: #fafaf6; stroke: #78350f; stroke-width: 0.4; }\n.lt-bb-hole-rail { fill: #fafaf6; stroke: #78350f; stroke-width: 0.4; }\n.lt-bb-col-label { font: 7px sans-serif; fill: #78350f; text-anchor: middle; }\n.lt-bb-row-label { font: 7px sans-serif; fill: #78350f; text-anchor: middle; dominant-baseline: middle; }\n.lt-bb-lead { stroke: #94a3b8; stroke-width: 1.6; fill: none; stroke-linecap: round; }\n.lt-bb-resistor { fill: #f5e9c8; stroke: #92400e; stroke-width: 0.7; }\n.lt-bb-cap-can { fill: #94a3b8; stroke: #1f2937; stroke-width: 0.8; }\n.lt-bb-button { fill: #475569; stroke: #1e293b; stroke-width: 0.8; rx: 1; }\n.lt-bb-dip-body { fill: #1f2937; stroke: #475569; stroke-width: 0.8; }\n.lt-bb-dip-silk { font: 600 8px sans-serif; fill: #f3f4f6; }\n.lt-bb-pin-label { font: 6.5px sans-serif; fill: #f3f4f6; dominant-baseline: middle; }\n.lt-bb-pin-label-sensor { font: 6.5px sans-serif; fill: #f3f4f6; dominant-baseline: middle; }\n.lt-bb-board-title { font: 600 9px sans-serif; fill: #f3f4f6; }\n.lt-bb-board-title-sensor { font: 600 9px sans-serif; fill: #f3f4f6; }\n.lt-bb-part-label { font: 600 9px sans-serif; fill: ${t.text}; text-anchor: middle; }\n.lt-bb-wire { fill: none; stroke-width: 2.4; stroke-linecap: round; opacity: 0.95; }\n.lt-bb-wire-dot { stroke: #0f172a; stroke-width: 0.6; }\n`.trim();\n}\n\n// ─── Substrate rendering ─────────────────────────────────────\n\nfunction renderSubstrate(sub: BreadboardLayoutSubstrate): string {\n const PITCH = sub.pitch;\n const elements: string[] = [];\n\n // Substrate body\n elements.push(rectEl({\n x: sub.x, y: sub.y, width: sub.width, height: sub.height,\n rx: 6, class: \"lt-bb-substrate\",\n }));\n\n // Trough\n elements.push(rectEl({\n x: sub.x + BB_CONST.BOARD_PAD_X,\n y: sub.troughY - sub.troughHeight / 2,\n width: sub.width - BB_CONST.BOARD_PAD_X * 2,\n height: sub.troughHeight,\n class: \"lt-bb-trough\",\n }));\n\n // Rails\n if (sub.hasRails) {\n const rails = [\n { y: sub.y + BB_CONST.BOARD_PAD_Y, type: \"top\" },\n { y: sub.y + sub.height - BB_CONST.BOARD_PAD_Y - BB_CONST.RAIL_HEIGHT, type: \"bottom\" },\n ];\n for (const r of rails) {\n // Positive stripe (red, top half of rail strip)\n elements.push(pathEl({\n d: `M ${sub.x + BB_CONST.BOARD_PAD_X} ${r.y + 4} L ${sub.x + sub.width - BB_CONST.BOARD_PAD_X} ${r.y + 4}`,\n class: \"lt-bb-rail-stripe-pos\",\n }));\n // Negative stripe (blue)\n elements.push(pathEl({\n d: `M ${sub.x + BB_CONST.BOARD_PAD_X} ${r.y + BB_CONST.RAIL_HEIGHT - 4} L ${sub.x + sub.width - BB_CONST.BOARD_PAD_X} ${r.y + BB_CONST.RAIL_HEIGHT - 4}`,\n class: \"lt-bb-rail-stripe-neg\",\n }));\n // Rail break (only on full board)\n if (sub.railsBreak) {\n const breakX1 = sub.x + BB_CONST.BOARD_PAD_X + BB_CONST.ROW_LABEL_W + (30) * PITCH - PITCH / 2;\n const breakX2 = breakX1 + PITCH;\n elements.push(rectEl({\n x: breakX1, y: r.y, width: breakX2 - breakX1, height: BB_CONST.RAIL_HEIGHT,\n fill: \"#e7d8b6\",\n }));\n }\n // Rail holes\n for (let c = 1; c <= sub.cols; c++) {\n const cx = sub.x + BB_CONST.BOARD_PAD_X + BB_CONST.ROW_LABEL_W + PITCH / 2 + (c - 1) * PITCH;\n elements.push(circleEl({ cx, cy: r.y + 4, r: 1.4, class: \"lt-bb-hole-rail\" }));\n elements.push(circleEl({ cx, cy: r.y + BB_CONST.RAIL_HEIGHT - 4, r: 1.4, class: \"lt-bb-hole-rail\" }));\n }\n }\n }\n\n // Column labels (every 5)\n const topRailsH = sub.hasRails ? BB_CONST.RAIL_HEIGHT : 0;\n const colLabelY = sub.y + BB_CONST.BOARD_PAD_Y + topRailsH + 8;\n for (let c = 5; c <= sub.cols; c += 5) {\n const cx = sub.x + BB_CONST.BOARD_PAD_X + BB_CONST.ROW_LABEL_W + PITCH / 2 + (c - 1) * PITCH;\n elements.push(textEl({ x: cx, y: colLabelY, class: \"lt-bb-col-label\" }, String(c)));\n }\n // Bottom column labels\n const colLabelY2 = sub.y + sub.height - BB_CONST.BOARD_PAD_Y - (sub.hasRails ? BB_CONST.RAIL_HEIGHT : 0) - 4;\n for (let c = 5; c <= sub.cols; c += 5) {\n const cx = sub.x + BB_CONST.BOARD_PAD_X + BB_CONST.ROW_LABEL_W + PITCH / 2 + (c - 1) * PITCH;\n elements.push(textEl({ x: cx, y: colLabelY2, class: \"lt-bb-col-label\" }, String(c)));\n }\n\n // Row labels (a..e top, f..j bottom) on left and right sides\n const rowsTop = [\"a\", \"b\", \"c\", \"d\", \"e\"];\n const rowsBot = [\"f\", \"g\", \"h\", \"i\", \"j\"];\n const gridY0 = sub.y + BB_CONST.BOARD_PAD_Y + topRailsH + BB_CONST.COL_LABEL_H + PITCH / 2;\n for (let i = 0; i < 5; i++) {\n const yTop = gridY0 + i * PITCH;\n const yBot = gridY0 + (i + 5) * PITCH + BB_CONST.TROUGH;\n elements.push(textEl({ x: sub.x + BB_CONST.BOARD_PAD_X + 4, y: yTop, class: \"lt-bb-row-label\" }, rowsTop[i]!));\n elements.push(textEl({ x: sub.x + sub.width - BB_CONST.BOARD_PAD_X - 4, y: yTop, class: \"lt-bb-row-label\" }, rowsTop[i]!));\n elements.push(textEl({ x: sub.x + BB_CONST.BOARD_PAD_X + 4, y: yBot, class: \"lt-bb-row-label\" }, rowsBot[i]!));\n elements.push(textEl({ x: sub.x + sub.width - BB_CONST.BOARD_PAD_X - 4, y: yBot, class: \"lt-bb-row-label\" }, rowsBot[i]!));\n }\n\n // Holes (10 rows × cols)\n for (let c = 1; c <= sub.cols; c++) {\n for (let r = 0; r < 10; r++) {\n const cx = sub.x + BB_CONST.BOARD_PAD_X + BB_CONST.ROW_LABEL_W + PITCH / 2 + (c - 1) * PITCH;\n let cy = gridY0 + r * PITCH;\n if (r >= 5) cy += BB_CONST.TROUGH;\n elements.push(circleEl({ cx, cy, r: 1.6, class: \"lt-bb-hole\" }));\n }\n }\n\n return group({ class: \"lt-bb-substrate-group\" }, elements);\n}\n\n// ─── Parts ───────────────────────────────────────────────────\n\nfunction renderPart(lp: BreadboardLayoutPart): string {\n const spec = partSpec(lp.part.kind, lp.part.args);\n const body = spec.body(lp.part, lp.width, lp.height);\n const labelText = lp.part.label ?? defaultPartLabel(lp);\n const labelEl = labelText\n ? textEl({\n x: lp.x + lp.width / 2,\n y: spec.category === \"side\" ? lp.y - 6 : lp.y - 4,\n class: \"lt-bb-part-label\",\n }, labelText)\n : \"\";\n return group(\n { class: `lt-bb-part lt-bb-part-${lp.part.kind}`, transform: `translate(${lp.x.toFixed(2)} ${lp.y.toFixed(2)})` },\n [body]\n ) + labelEl;\n}\n\nfunction defaultPartLabel(lp: BreadboardLayoutPart): string | undefined {\n const id = lp.part.id;\n const args = lp.part.args;\n if (lp.part.kind === \"resistor\" && args.value !== undefined) {\n return `${id.toUpperCase()} ${args.value}Ω`;\n }\n if (lp.part.kind === \"led\" && args.color) {\n return `${id.toUpperCase()} (${String(args.color)})`;\n }\n if (lp.part.kind.startsWith(\"mcu-\") || lp.part.kind.startsWith(\"sensor-\") || lp.part.kind.startsWith(\"display-\") || lp.part.kind.startsWith(\"module-\") || lp.part.kind.startsWith(\"actuator-\")) {\n return undefined; // module body draws its own title\n }\n return id.toUpperCase();\n}\n\n// ─── Wires ───────────────────────────────────────────────────\n\nfunction renderWire(lw: BreadboardLayoutResult[\"wires\"][number]): string {\n const stroke = WIRE_COLOR_MAP[lw.color] ?? \"#475569\";\n const path = pathEl({ d: lw.path, class: \"lt-bb-wire\", stroke });\n const dot1 = circleEl({ cx: lw.fromXY.x, cy: lw.fromXY.y, r: 1.8, fill: stroke, class: \"lt-bb-wire-dot\" });\n const dot2 = circleEl({ cx: lw.toXY.x, cy: lw.toXY.y, r: 1.8, fill: stroke, class: \"lt-bb-wire-dot\" });\n return path + dot1 + dot2;\n}\n\n// ─── Public API ─────────────────────────────────────────────\n\nexport function renderBreadboardLayout(layout: BreadboardLayoutResult, config?: RenderConfig): string {\n const theme = resolveBaseTheme(config?.theme ?? \"default\");\n const css = buildCss(theme);\n\n const titleStr = layout.ast.title ?? \"Breadboard\";\n\n const titleNode = layout.ast.title\n ? textEl({ x: BB_CONST.MARGIN, y: 22, class: \"lt-bb-title\" }, layout.ast.title)\n : \"\";\n\n const substrate = renderSubstrate(layout.substrate);\n const parts = layout.parts.map(renderPart).join(\"\\n\");\n const wires = layout.wires.map(renderWire).join(\"\\n\");\n\n const inner = [\n titleEl(escapeXml(titleStr)),\n descEl(\"Breadboard wiring diagram generated by Schematex\"),\n el(\"style\", {}, css),\n titleNode,\n substrate,\n group({ class: \"lt-bb-parts\" }, [parts]),\n group({ class: \"lt-bb-wires\" }, [wires]),\n ];\n\n return svgRoot(\n {\n width: layout.width,\n height: layout.height,\n viewBox: `0 0 ${layout.width} ${layout.height}`,\n class: \"lt-bb\",\n },\n inner\n );\n}\n\nexport function renderBreadboard(text: string, config?: RenderConfig): string {\n const ast = parseBreadboard(text);\n const layout = layoutBreadboard(ast);\n return renderBreadboardLayout(layout, config);\n}\n","import type { DiagramPlugin, RenderConfig } from \"../../core/types\";\nimport { parseBreadboard } from \"./parser\";\nimport { renderBreadboard } from \"./renderer\";\n\nexport const breadboard: DiagramPlugin = {\n type: \"breadboard\",\n detect(text: string): boolean {\n for (const raw of text.split(/\\r?\\n/)) {\n const t = raw.trim();\n if (t.length === 0) continue;\n if (t.startsWith(\"//\") || t.startsWith(\"#\")) continue;\n const first = t.split(/\\s+/)[0]?.toLowerCase() ?? \"\";\n return first === \"breadboard\";\n }\n return false;\n },\n parse: parseBreadboard,\n render(text: string, config?: RenderConfig): string {\n return renderBreadboard(text, config);\n },\n};\n\nexport { parseBreadboard, BreadboardParseError } from \"./parser\";\nexport { renderBreadboard, renderBreadboardLayout } from \"./renderer\";\nexport { layoutBreadboard, BB_CONST } from \"./layout\";\nexport { partSpec, PART_CATALOG, HOLE_PITCH } from \"./parts\";\n","/**\n * BPMN parser — DSL → BpmnAst.\n *\n * Grammar (v0.1, see docs/reference/25-BPMN-STANDARD.md §5):\n *\n * bpmn\n * direction: LR | TB\n * title: \"...\"\n *\n * pool \"Customer\" blackbox\n *\n * pool \"Bank\" {\n * lane \"Clerk\" {\n * id: start \"label\"\n * id: task user \"label\"\n * id: gateway xor \"label\"\n * id: end \"label\"\n * }\n * }\n *\n * flows\n * A --> B\n * G1 --? \"yes\" --> C\n * G1 --* \"default\" --> F\n * \"Customer\" ~~> A : \"Submit\"\n *\n * Validation enforced here:\n * - Pool / lane / object id uniqueness within a pool.\n * - Black-box pools have no children.\n * - Sequence flow stays inside one pool.\n * - Message flow crosses pool boundaries.\n * - At most one default flow per gateway.\n */\nimport type {\n BpmnActivity,\n BpmnAst,\n BpmnDirection,\n BpmnEvent,\n BpmnFlow,\n BpmnFlowKind,\n BpmnGateway,\n BpmnGatewayKind,\n BpmnLane,\n BpmnPool,\n BpmnTaskMarker,\n} from \"../../core/types\";\n\nexport class BpmnParseError extends Error {\n constructor(message: string, public line: number) {\n super(`bpmn:${line}: ${message}`);\n this.name = \"BpmnParseError\";\n }\n}\n\ninterface Line {\n /** Trimmed source. */\n text: string;\n /** 1-based source line number. */\n no: number;\n}\n\nconst STRING_RE = /\"((?:\\\\.|[^\"\\\\])*)\"/;\n\nfunction unquote(s: string): string {\n return s.replace(/^\"|\"$/g, \"\").replace(/\\\\\"/g, '\"');\n}\n\nfunction takeQuoted(rest: string): { value: string; rest: string } | null {\n const m = rest.match(/^\\s*\"((?:\\\\.|[^\"\\\\])*)\"\\s*/);\n if (!m) return null;\n return { value: m[1]!.replace(/\\\\\"/g, '\"'), rest: rest.slice(m[0].length) };\n}\n\nfunction preprocessLines(text: string): Line[] {\n const out: Line[] = [];\n const raw = text.split(/\\r?\\n/);\n for (let i = 0; i < raw.length; i++) {\n let s = raw[i]!;\n // strip line comments — // and # at column start (or after whitespace)\n // Don't strip inside quoted strings: walk char-by-char.\n let inStr = false;\n let stripFrom = -1;\n for (let j = 0; j < s.length; j++) {\n const c = s[j]!;\n if (c === '\"' && (j === 0 || s[j - 1] !== \"\\\\\")) inStr = !inStr;\n if (inStr) continue;\n if (c === \"/\" && s[j + 1] === \"/\") { stripFrom = j; break; }\n if (c === \"#\") { stripFrom = j; break; }\n }\n if (stripFrom >= 0) s = s.slice(0, stripFrom);\n s = s.trim();\n if (s.length === 0) continue;\n out.push({ text: s, no: i + 1 });\n }\n return out;\n}\n\nexport function parseBpmn(text: string): BpmnAst {\n const lines = preprocessLines(text);\n if (lines.length === 0) throw new BpmnParseError(\"empty input\", 1);\n\n // Header: \"bpmn\" must be the first line.\n if (lines[0]!.text.toLowerCase().split(/\\s+/)[0] !== \"bpmn\") {\n throw new BpmnParseError(\n \"diagram must start with `bpmn` keyword\",\n lines[0]!.no\n );\n }\n\n let direction: BpmnDirection = \"LR\";\n let title: string | undefined;\n const pools: BpmnPool[] = [];\n const lanesById = new Map<string, BpmnLane>();\n const events: BpmnEvent[] = [];\n const activities: BpmnActivity[] = [];\n const gateways: BpmnGateway[] = [];\n const flows: BpmnFlow[] = [];\n\n // Object id → owning pool/lane (for cross-checks during flow parsing).\n const objectOwner = new Map<string, { poolId: string; laneId: string }>();\n // Pool labels can be referenced by quoted name in message flows.\n const poolByLabel = new Map<string, BpmnPool>();\n\n let cursor = 1;\n\n // ── Header lines: direction / title / pools / flows ─────────\n while (cursor < lines.length) {\n const ln = lines[cursor]!;\n const lower = ln.text.toLowerCase();\n\n if (lower.startsWith(\"direction:\")) {\n const v = ln.text.slice(\"direction:\".length).trim().toUpperCase();\n if (v !== \"LR\" && v !== \"TB\") {\n throw new BpmnParseError(\n `direction must be LR or TB (got '${v}')`,\n ln.no\n );\n }\n direction = v as BpmnDirection;\n cursor++;\n continue;\n }\n if (lower.startsWith(\"title:\")) {\n const rest = ln.text.slice(\"title:\".length).trim();\n const q = takeQuoted(rest);\n if (q) title = q.value;\n else title = rest;\n cursor++;\n continue;\n }\n\n if (lower === \"flows\" || lower.startsWith(\"flows \")) {\n cursor++;\n while (cursor < lines.length) {\n parseFlowLine(lines[cursor]!, flows, objectOwner, poolByLabel);\n cursor++;\n }\n break;\n }\n\n if (lower.startsWith(\"pool\")) {\n cursor = parsePool(lines, cursor, pools, lanesById, events, activities, gateways, objectOwner, poolByLabel);\n continue;\n }\n\n throw new BpmnParseError(\n `unexpected token at top level: '${ln.text.slice(0, 32)}'`,\n ln.no\n );\n }\n\n // ── Cross-validations ──────────────────────────────────────\n\n // Black-box pools must have zero objects.\n for (const p of pools) {\n if (!p.blackbox) continue;\n const hasObjs = [...events, ...activities, ...gateways].some(\n (o) => o.poolId === p.id\n );\n if (hasObjs) {\n throw new BpmnParseError(\n `black-box pool \"${p.label}\" cannot contain flow objects`,\n 1\n );\n }\n }\n\n // Sequence/conditional/default flows must stay in the same pool.\n // Message flows must cross pool boundaries.\n for (const f of flows) {\n if (f.kind === \"message\") continue;\n const fromOwn = objectOwner.get(f.from);\n const toOwn = objectOwner.get(f.to);\n if (!fromOwn) throw new BpmnParseError(`unknown source '${f.from}' in sequence flow`, 1);\n if (!toOwn) throw new BpmnParseError(`unknown target '${f.to}' in sequence flow`, 1);\n if (fromOwn.poolId !== toOwn.poolId) {\n throw new BpmnParseError(\n `sequence flow '${f.from} --> ${f.to}' crosses pool boundary — use message flow (~~>)`,\n 1\n );\n }\n }\n for (const f of flows) {\n if (f.kind !== \"message\") continue;\n const fromIsPool = poolByLabel.has(f.from);\n const toIsPool = poolByLabel.has(f.to);\n const fromOwn = objectOwner.get(f.from);\n const toOwn = objectOwner.get(f.to);\n const fromPool = fromIsPool ? poolByLabel.get(f.from)!.id : fromOwn?.poolId;\n const toPool = toIsPool ? poolByLabel.get(f.to)!.id : toOwn?.poolId;\n if (!fromPool || !toPool) {\n throw new BpmnParseError(\n `unknown endpoint in message flow '${f.from} ~~> ${f.to}'`,\n 1\n );\n }\n if (fromPool === toPool) {\n throw new BpmnParseError(\n `message flow '${f.from} ~~> ${f.to}' must cross pool boundaries`,\n 1\n );\n }\n }\n\n // ≤1 default flow per gateway.\n const defaultsBySrc = new Map<string, number>();\n for (const f of flows) {\n if (f.kind !== \"default\") continue;\n defaultsBySrc.set(f.from, (defaultsBySrc.get(f.from) ?? 0) + 1);\n }\n for (const [src, n] of defaultsBySrc) {\n if (n > 1) {\n throw new BpmnParseError(\n `gateway '${src}' has ${n} default flows (max 1)`,\n 1\n );\n }\n }\n\n return {\n type: \"bpmn\",\n direction,\n title,\n pools,\n lanes: pools.flatMap((p) => p.lanes.map((id) => lanesById.get(id)!).filter(Boolean)),\n events,\n activities,\n gateways,\n flows,\n };\n}\n\n// ─── Pool / lane parsing ───────────────────────────────────────\n\nfunction parsePool(\n lines: Line[],\n startIdx: number,\n pools: BpmnPool[],\n lanesById: Map<string, BpmnLane>,\n events: BpmnEvent[],\n activities: BpmnActivity[],\n gateways: BpmnGateway[],\n objectOwner: Map<string, { poolId: string; laneId: string }>,\n poolByLabel: Map<string, BpmnPool>\n): number {\n const ln = lines[startIdx]!;\n // pool \"Label\" [blackbox] [{]\n const m = ln.text.match(/^pool\\s+(\"(?:\\\\.|[^\"\\\\])*\")\\s*(.*)$/);\n if (!m) throw new BpmnParseError(\"malformed pool declaration\", ln.no);\n const label = unquote(m[1]!);\n const tail = m[2]!.trim();\n\n let blackbox = false;\n let hasBrace = false;\n let after = tail;\n if (after.startsWith(\"blackbox\")) {\n blackbox = true;\n after = after.slice(\"blackbox\".length).trim();\n }\n if (after === \"{\") hasBrace = true;\n else if (after.length > 0)\n throw new BpmnParseError(`unexpected tokens after pool header: '${after}'`, ln.no);\n\n const poolId = `__pool_${pools.length}`;\n const pool: BpmnPool = { id: poolId, label, blackbox, lanes: [] };\n pools.push(pool);\n if (poolByLabel.has(label)) {\n throw new BpmnParseError(`duplicate pool label \"${label}\"`, ln.no);\n }\n poolByLabel.set(label, pool);\n\n if (!hasBrace) {\n // Single-line pool declaration (typical for blackbox).\n return startIdx + 1;\n }\n\n let i = startIdx + 1;\n while (i < lines.length) {\n const cur = lines[i]!;\n if (cur.text === \"}\") return i + 1;\n\n if (cur.text.toLowerCase().startsWith(\"lane\")) {\n i = parseLane(lines, i, pool, lanesById, events, activities, gateways, objectOwner);\n continue;\n }\n\n // Pool with no lanes — flow objects directly inside pool. Treat as a\n // single implicit lane.\n if (cur.text.match(/^[A-Za-z_][\\w]*\\s*:/)) {\n // create implicit lane lazily\n let implicit = pool.lanes\n .map((id) => lanesById.get(id))\n .find((l) => l?.label === \"\");\n if (!implicit) {\n const laneId = `${poolId}__lane_implicit`;\n implicit = { id: laneId, label: \"\", poolId, children: [] };\n lanesById.set(laneId, implicit);\n pool.lanes.push(laneId);\n }\n i = parseFlowObject(lines, i, pool, implicit, events, activities, gateways, objectOwner);\n continue;\n }\n\n throw new BpmnParseError(\n `unexpected token inside pool: '${cur.text.slice(0, 32)}'`,\n cur.no\n );\n }\n throw new BpmnParseError(`unterminated pool block (missing '}')`, ln.no);\n}\n\nfunction parseLane(\n lines: Line[],\n startIdx: number,\n pool: BpmnPool,\n lanesById: Map<string, BpmnLane>,\n events: BpmnEvent[],\n activities: BpmnActivity[],\n gateways: BpmnGateway[],\n objectOwner: Map<string, { poolId: string; laneId: string }>\n): number {\n const ln = lines[startIdx]!;\n const m = ln.text.match(/^lane\\s+(\"(?:\\\\.|[^\"\\\\])*\")\\s*\\{?\\s*$/);\n if (!m) throw new BpmnParseError(\"malformed lane declaration\", ln.no);\n const label = unquote(m[1]!);\n const hasBrace = ln.text.endsWith(\"{\");\n\n if (pool.blackbox) {\n throw new BpmnParseError(\n `black-box pool \"${pool.label}\" cannot contain lanes`,\n ln.no\n );\n }\n\n const laneId = `${pool.id}__lane_${pool.lanes.length}`;\n const lane: BpmnLane = { id: laneId, label, poolId: pool.id, children: [] };\n lanesById.set(laneId, lane);\n pool.lanes.push(laneId);\n\n if (!hasBrace) return startIdx + 1;\n\n let i = startIdx + 1;\n while (i < lines.length) {\n const cur = lines[i]!;\n if (cur.text === \"}\") return i + 1;\n i = parseFlowObject(lines, i, pool, lane, events, activities, gateways, objectOwner);\n }\n throw new BpmnParseError(`unterminated lane block (missing '}')`, ln.no);\n}\n\n// ─── Flow-object parsing ───────────────────────────────────────\n\nfunction parseFlowObject(\n lines: Line[],\n idx: number,\n pool: BpmnPool,\n lane: BpmnLane,\n events: BpmnEvent[],\n activities: BpmnActivity[],\n gateways: BpmnGateway[],\n objectOwner: Map<string, { poolId: string; laneId: string }>\n): number {\n const ln = lines[idx]!;\n const m = ln.text.match(/^([A-Za-z_][\\w]*)\\s*:\\s*(.+)$/);\n if (!m) {\n throw new BpmnParseError(\n `expected 'id: kind ...' (got '${ln.text.slice(0, 40)}')`,\n ln.no\n );\n }\n const id = m[1]!;\n let body = m[2]!.trim();\n\n if (objectOwner.has(id)) {\n throw new BpmnParseError(`duplicate id '${id}'`, ln.no);\n }\n\n // peel off keyword\n const kw = body.split(/\\s+/)[0]!.toLowerCase();\n body = body.slice(kw.length).trim();\n\n if (kw === \"start\" || kw === \"end\" || kw === \"intermediate\") {\n // optional trigger keyword\n let trigger: BpmnEvent[\"trigger\"] = \"none\";\n const next = body.split(/\\s+/)[0]?.toLowerCase() ?? \"\";\n if (next === \"message\" || next === \"timer\" || next === \"none\") {\n trigger = next as BpmnEvent[\"trigger\"];\n body = body.slice(next.length).trim();\n }\n let label: string | undefined;\n const q = takeQuoted(body);\n if (q) label = q.value;\n // throw vs catch: end events with a trigger throw; start always catch;\n // intermediate without context catch (v0.1 simplification).\n let throwCatch: BpmnEvent[\"throwCatch\"] = \"catch\";\n if (kw === \"end\" && trigger !== \"none\") throwCatch = \"throw\";\n if (kw === \"end\" && trigger === \"none\") throwCatch = \"throw\"; // none-end is a terminator\n const ev: BpmnEvent = {\n id,\n kind: kw as BpmnEvent[\"kind\"],\n trigger,\n throwCatch,\n label,\n laneId: lane.id,\n poolId: pool.id,\n };\n events.push(ev);\n lane.children.push(id);\n objectOwner.set(id, { poolId: pool.id, laneId: lane.id });\n return idx + 1;\n }\n\n if (kw === \"task\") {\n // optional marker + label\n let marker: BpmnTaskMarker = \"abstract\";\n const next = body.split(/\\s+/)[0]?.toLowerCase() ?? \"\";\n if (\n next === \"user\" || next === \"service\" || next === \"send\" ||\n next === \"receive\" || next === \"manual\" || next === \"script\"\n ) {\n marker = next as BpmnTaskMarker;\n body = body.slice(next.length).trim();\n }\n const q = takeQuoted(body);\n if (!q) {\n throw new BpmnParseError(`task '${id}' must have a quoted label`, ln.no);\n }\n const a: BpmnActivity = {\n id,\n kind: \"task\",\n marker,\n label: q.value,\n laneId: lane.id,\n poolId: pool.id,\n };\n activities.push(a);\n lane.children.push(id);\n objectOwner.set(id, { poolId: pool.id, laneId: lane.id });\n return idx + 1;\n }\n\n if (kw === \"subprocess\") {\n const q = takeQuoted(body);\n if (!q) {\n throw new BpmnParseError(\n `subprocess '${id}' must have a quoted label`,\n ln.no\n );\n }\n const after = q.rest.trim();\n if (after !== \"\" && after !== \"collapsed\") {\n throw new BpmnParseError(\n `subprocess '${id}': v0.1 supports collapsed subprocesses only (got '${after}')`,\n ln.no\n );\n }\n const a: BpmnActivity = {\n id,\n kind: \"subprocess-collapsed\",\n marker: \"abstract\",\n label: q.value,\n laneId: lane.id,\n poolId: pool.id,\n };\n activities.push(a);\n lane.children.push(id);\n objectOwner.set(id, { poolId: pool.id, laneId: lane.id });\n return idx + 1;\n }\n\n if (kw === \"gateway\") {\n const next = body.split(/\\s+/)[0]?.toLowerCase() ?? \"\";\n let gatewayKind: BpmnGatewayKind;\n if (next === \"xor\" || next === \"or\" || next === \"and\" || next === \"event\") {\n gatewayKind = next as BpmnGatewayKind;\n body = body.slice(next.length).trim();\n } else {\n throw new BpmnParseError(\n `gateway '${id}' kind must be xor / or / and / event (got '${next}')`,\n ln.no\n );\n }\n let label: string | undefined;\n const q = takeQuoted(body);\n if (q) label = q.value;\n const g: BpmnGateway = {\n id,\n gatewayKind,\n label,\n laneId: lane.id,\n poolId: pool.id,\n };\n gateways.push(g);\n lane.children.push(id);\n objectOwner.set(id, { poolId: pool.id, laneId: lane.id });\n return idx + 1;\n }\n\n throw new BpmnParseError(\n `unknown flow-object kind '${kw}' for id '${id}'`,\n ln.no\n );\n}\n\n// ─── Flow-line parsing ────────────────────────────────────────\n\nfunction parseFlowLine(\n ln: Line,\n flows: BpmnFlow[],\n objectOwner: Map<string, { poolId: string; laneId: string }>,\n poolByLabel: Map<string, BpmnPool>\n): void {\n // Tolerate stand-alone \"flows\" repeats.\n if (ln.text.toLowerCase() === \"flows\") return;\n\n const text = ln.text;\n\n // Endpoint: bare id OR quoted pool name.\n function takeEndpoint(s: string): { ep: string; rest: string } | null {\n const t = s.trimStart();\n if (t.startsWith('\"')) {\n const q = takeQuoted(t);\n if (!q) return null;\n return { ep: q.value, rest: q.rest };\n }\n const m = t.match(/^([A-Za-z_][\\w]*)\\s*/);\n if (!m) return null;\n return { ep: m[1]!, rest: t.slice(m[0].length) };\n }\n\n const head = takeEndpoint(text);\n if (!head) {\n throw new BpmnParseError(\n `flow line: cannot parse source endpoint`,\n ln.no\n );\n }\n let rest = head.rest.trimStart();\n\n // Detect connector kind.\n let kind: BpmnFlowKind;\n let connectorLen: number;\n let connectorLabel: string | undefined;\n\n if (rest.startsWith(\"~~>\")) {\n kind = \"message\";\n connectorLen = 3;\n } else if (rest.startsWith(\"--?\")) {\n // conditional with inline quoted label, then -->\n kind = \"conditional\";\n let r = rest.slice(3).trimStart();\n const q = takeQuoted(r);\n if (q) {\n connectorLabel = q.value;\n r = q.rest.trimStart();\n }\n if (!r.startsWith(\"-->\")) {\n throw new BpmnParseError(\n `conditional flow must end with --> (got '${r.slice(0, 20)}')`,\n ln.no\n );\n }\n connectorLen = rest.length - r.length + 3;\n } else if (rest.startsWith(\"--*\")) {\n kind = \"default\";\n let r = rest.slice(3).trimStart();\n const q = takeQuoted(r);\n if (q) {\n connectorLabel = q.value;\n r = q.rest.trimStart();\n }\n if (!r.startsWith(\"-->\")) {\n throw new BpmnParseError(\n `default flow must end with --> (got '${r.slice(0, 20)}')`,\n ln.no\n );\n }\n connectorLen = rest.length - r.length + 3;\n } else if (rest.startsWith(\"-->\")) {\n kind = \"sequence\";\n connectorLen = 3;\n } else {\n throw new BpmnParseError(\n `unknown flow connector at '${rest.slice(0, 20)}' — use --> / --? / --* / ~~>`,\n ln.no\n );\n }\n\n rest = rest.slice(connectorLen).trimStart();\n const tail = takeEndpoint(rest);\n if (!tail) {\n throw new BpmnParseError(`flow line: cannot parse target endpoint`, ln.no);\n }\n const trailing = tail.rest.trimStart();\n\n // Optional `: \"label\"` (mainly for message flows but allowed everywhere).\n let label: string | undefined = connectorLabel;\n if (trailing.startsWith(\":\")) {\n const q = takeQuoted(trailing.slice(1));\n if (q) label = q.value;\n }\n\n // For message flows, endpoints may be pool names (quoted) — keep raw.\n // Sequence-class flows must have flow-object ids on both ends.\n if (kind !== \"message\") {\n if (poolByLabel.has(head.ep) || poolByLabel.has(tail.ep)) {\n throw new BpmnParseError(\n `non-message flow cannot use a pool name as endpoint`,\n ln.no\n );\n }\n if (!objectOwner.has(head.ep)) {\n throw new BpmnParseError(`unknown source id '${head.ep}'`, ln.no);\n }\n if (!objectOwner.has(tail.ep)) {\n throw new BpmnParseError(`unknown target id '${tail.ep}'`, ln.no);\n }\n } else {\n const fromOk = poolByLabel.has(head.ep) || objectOwner.has(head.ep);\n const toOk = poolByLabel.has(tail.ep) || objectOwner.has(tail.ep);\n if (!fromOk) throw new BpmnParseError(`unknown source '${head.ep}' in message flow`, ln.no);\n if (!toOk) throw new BpmnParseError(`unknown target '${tail.ep}' in message flow`, ln.no);\n }\n\n flows.push({ from: head.ep, to: tail.ep, kind, label });\n}\n\n// Re-export helpers in case tests want them.\nexport { STRING_RE };\n","/**\n * BPMN layout — BpmnAst → BpmnLayoutResult.\n *\n * Strategy (v0.1):\n * 1. Per pool, run longest-path layering using sequence/conditional/default\n * flows to get each object's column index.\n * 2. Within each lane, place objects at their column's X. If multiple\n * objects from the same lane share a column, stack them vertically\n * inside the lane.\n * 3. Lane height = max stack count × row pitch + padding.\n * 4. Pools stacked vertically with a gap; black-box pools render as a\n * thin label band.\n * 5. Routing: Manhattan / orthogonal. Sequence flows bend at the channel\n * midpoint between adjacent columns. Message flows escape upward\n * from the source pool to a routing channel, traverse horizontally,\n * and descend into the target pool.\n */\nimport type {\n BpmnAst,\n BpmnFlowObject,\n BpmnLayoutFlow,\n BpmnLayoutLane,\n BpmnLayoutObject,\n BpmnLayoutPool,\n BpmnLayoutResult,\n BpmnPool,\n} from \"../../core/types\";\n\nexport const BPMN_CONST = {\n taskWidth: 110,\n taskHeight: 60,\n eventRadius: 18,\n gatewaySize: 44,\n /** Horizontal column pitch (center-to-center). */\n colPitch: 150,\n /** Vertical row pitch within a lane (center-to-center). */\n rowPitch: 92,\n /** Padding inside a lane around its content. */\n lanePadX: 28,\n lanePadY: 18,\n /** Lane label band width on left edge. */\n laneLabelWidth: 22,\n /** Pool label band width on left edge. */\n poolLabelWidth: 26,\n /** Minimum lane height. */\n minLaneHeight: 90,\n /** Vertical gap between pools. */\n poolGap: 36,\n /** Top/left page padding. */\n padding: 16,\n /** Black-box pool height. */\n blackboxHeight: 60,\n /** Char width approximation at 12px. */\n charW: 6.4,\n cjkCharW: 12,\n charH: 16,\n} as const;\n\nfunction isCJK(code: number): boolean {\n return (\n (code >= 0x3000 && code <= 0x9fff) ||\n (code >= 0xac00 && code <= 0xd7af) ||\n (code >= 0xff00 && code <= 0xffef)\n );\n}\n\nfunction measureWidth(s: string): number {\n let w = 0;\n for (const ch of s) {\n const c = ch.codePointAt(0) ?? 0;\n w += isCJK(c) ? BPMN_CONST.cjkCharW : BPMN_CONST.charW;\n }\n return w;\n}\n\nfunction objBox(o: BpmnFlowObject): { w: number; h: number } {\n if (\"kind\" in o && (o.kind === \"task\" || o.kind === \"subprocess-collapsed\")) {\n const lblW = measureWidth(o.label) + 26;\n return {\n w: Math.max(BPMN_CONST.taskWidth, Math.min(180, lblW)),\n h: BPMN_CONST.taskHeight,\n };\n }\n if (\"gatewayKind\" in o) {\n return { w: BPMN_CONST.gatewaySize, h: BPMN_CONST.gatewaySize };\n }\n // event\n const r = BPMN_CONST.eventRadius;\n return { w: r * 2, h: r * 2 };\n}\n\nexport function layoutBpmn(ast: BpmnAst): BpmnLayoutResult {\n const allObjects: BpmnFlowObject[] = [\n ...ast.events,\n ...ast.activities,\n ...ast.gateways,\n ];\n const objById = new Map<string, BpmnFlowObject>();\n for (const o of allObjects) objById.set(o.id, o);\n\n // ── 1. Per-pool layering (longest path from sources via sequence-type flows)\n const colByObj = new Map<string, number>();\n for (const pool of ast.pools) {\n if (pool.blackbox) continue;\n layerPool(ast, pool, colByObj);\n }\n\n // ── 2. Per-lane stacking within columns (when multiple lane-objs share col)\n // Within each lane: assign a row index to each object based on column order.\n const rowByObj = new Map<string, number>();\n const laneStackHeight = new Map<string, number>(); // laneId → max rows\n\n for (const lane of ast.lanes) {\n // Group lane children by column.\n const byCol = new Map<number, string[]>();\n for (const childId of lane.children) {\n const col = colByObj.get(childId) ?? 0;\n if (!byCol.has(col)) byCol.set(col, []);\n byCol.get(col)!.push(childId);\n }\n // Stable row assignment: within each column the order in lane.children wins.\n let maxRows = 1;\n for (const [, ids] of byCol) {\n ids.forEach((id, ri) => rowByObj.set(id, ri));\n if (ids.length > maxRows) maxRows = ids.length;\n }\n laneStackHeight.set(lane.id, maxRows);\n }\n\n // ── 3. Compute number of columns globally (pools share x-grid for visual alignment).\n let maxCol = 0;\n for (const c of colByObj.values()) if (c > maxCol) maxCol = c;\n const numCols = maxCol + 1;\n\n // ── 4. Pool / lane geometry.\n const padding = BPMN_CONST.padding;\n const colPitch = BPMN_CONST.colPitch;\n const rowPitch = BPMN_CONST.rowPitch;\n const labelBand = BPMN_CONST.poolLabelWidth + BPMN_CONST.laneLabelWidth;\n\n const innerW = numCols * colPitch + 2 * BPMN_CONST.lanePadX;\n const poolWidth = labelBand + innerW;\n\n const poolLayouts: BpmnLayoutPool[] = [];\n const laneLayouts: BpmnLayoutLane[] = [];\n const objectLayouts: BpmnLayoutObject[] = [];\n\n let cursorY = padding;\n\n for (const pool of ast.pools) {\n const poolY = cursorY;\n\n if (pool.blackbox) {\n const h = BPMN_CONST.blackboxHeight;\n poolLayouts.push({\n pool,\n x: padding,\n y: poolY,\n width: poolWidth,\n height: h,\n labelX: padding,\n labelY: poolY,\n labelWidth: BPMN_CONST.poolLabelWidth,\n });\n cursorY += h + BPMN_CONST.poolGap;\n continue;\n }\n\n // Lanes: stack vertically inside the pool.\n let laneCursor = poolY;\n const poolLaneIds = pool.lanes;\n const poolLaneStartY = poolY;\n let poolH = 0;\n\n for (const laneId of poolLaneIds) {\n const lane = ast.lanes.find((l) => l.id === laneId)!;\n const rows = laneStackHeight.get(lane.id) ?? 1;\n const laneH = Math.max(\n BPMN_CONST.minLaneHeight,\n rows * rowPitch + 2 * BPMN_CONST.lanePadY\n );\n const laneX = padding + BPMN_CONST.poolLabelWidth;\n const laneW = poolWidth - BPMN_CONST.poolLabelWidth;\n laneLayouts.push({\n lane,\n x: laneX,\n y: laneCursor,\n width: laneW,\n height: laneH,\n labelX: laneX,\n labelY: laneCursor,\n labelHeight: BPMN_CONST.laneLabelWidth,\n });\n\n // Place lane children within this lane band.\n const laneInnerLeft = laneX + BPMN_CONST.laneLabelWidth + BPMN_CONST.lanePadX;\n const laneInnerTop = laneCursor + BPMN_CONST.lanePadY;\n\n for (const childId of lane.children) {\n const obj = objById.get(childId)!;\n const col = colByObj.get(childId) ?? 0;\n const row = rowByObj.get(childId) ?? 0;\n const cx = laneInnerLeft + col * colPitch + colPitch / 2;\n const cy = laneInnerTop + row * rowPitch + rowPitch / 2;\n const { w, h } = objBox(obj);\n objectLayouts.push({\n obj,\n x: cx - w / 2,\n y: cy - h / 2,\n width: w,\n height: h,\n });\n }\n\n laneCursor += laneH;\n poolH += laneH;\n }\n\n poolLayouts.push({\n pool,\n x: padding,\n y: poolLaneStartY,\n width: poolWidth,\n height: poolH,\n labelX: padding,\n labelY: poolLaneStartY,\n labelWidth: BPMN_CONST.poolLabelWidth,\n });\n\n cursorY = poolLaneStartY + poolH + BPMN_CONST.poolGap;\n }\n\n const totalHeight = cursorY - BPMN_CONST.poolGap + padding;\n const totalWidth = padding + poolWidth + padding;\n\n // ── 5. Flow routing (Manhattan).\n const objCenter = new Map<string, { x: number; y: number; w: number; h: number }>();\n for (const ol of objectLayouts) {\n objCenter.set(ol.obj.id, {\n x: ol.x + ol.width / 2,\n y: ol.y + ol.height / 2,\n w: ol.width,\n h: ol.height,\n });\n }\n const poolCenter = new Map<string, BpmnLayoutPool>();\n for (const p of poolLayouts) poolCenter.set(p.pool.label, p);\n\n const flowLayouts: BpmnLayoutFlow[] = [];\n for (const f of ast.flows) {\n if (f.kind === \"message\") {\n flowLayouts.push(routeMessageFlow(f, objCenter, poolCenter));\n } else {\n const path = routeSequenceFlow(f, objCenter, objById);\n flowLayouts.push(path);\n }\n }\n\n return {\n ast,\n pools: poolLayouts,\n lanes: laneLayouts,\n objects: objectLayouts,\n flows: flowLayouts,\n width: totalWidth,\n height: totalHeight,\n };\n}\n\n// ─── Per-pool layering ────────────────────────────────────────\n\nfunction layerPool(\n ast: BpmnAst,\n pool: BpmnPool,\n colByObj: Map<string, number>\n): void {\n // Collect objects in this pool.\n const inPool = (id: string): boolean => {\n const ev = ast.events.find((e) => e.id === id);\n if (ev) return ev.poolId === pool.id;\n const a = ast.activities.find((x) => x.id === id);\n if (a) return a.poolId === pool.id;\n const g = ast.gateways.find((x) => x.id === id);\n if (g) return g.poolId === pool.id;\n return false;\n };\n const ids = [\n ...ast.events.filter((e) => e.poolId === pool.id).map((e) => e.id),\n ...ast.activities.filter((a) => a.poolId === pool.id).map((a) => a.id),\n ...ast.gateways.filter((g) => g.poolId === pool.id).map((g) => g.id),\n ];\n\n // Adjacency from sequence-type flows.\n const adj = new Map<string, string[]>();\n const inDeg = new Map<string, number>();\n for (const id of ids) {\n adj.set(id, []);\n inDeg.set(id, 0);\n }\n const allEdges: Array<[string, string]> = [];\n for (const f of ast.flows) {\n if (f.kind === \"message\") continue;\n if (!inPool(f.from) || !inPool(f.to)) continue;\n if (f.from === f.to) continue;\n adj.get(f.from)!.push(f.to);\n inDeg.set(f.to, (inDeg.get(f.to) ?? 0) + 1);\n allEdges.push([f.from, f.to]);\n }\n\n // Cycle break via DFS — back edges (u→v where v is ancestor of u in the\n // DFS tree) get tagged and excluded from longest-path layering. BPMN\n // rework loops (D → C → G → D) are common, so we must handle them.\n const backEdges = new Set<string>();\n const color = new Map<string, number>(); // 0=white, 1=gray, 2=black\n for (const id of ids) color.set(id, 0);\n const dfs = (v: string): void => {\n color.set(v, 1);\n for (const w of adj.get(v) ?? []) {\n const c = color.get(w) ?? 0;\n if (c === 1) {\n // back edge\n backEdges.add(`${v}\\0${w}`);\n } else if (c === 0) {\n dfs(w);\n }\n }\n color.set(v, 2);\n };\n // Start DFS from start events first, then any remaining whites.\n const starts = ast.events.filter((e) => e.poolId === pool.id && e.kind === \"start\").map((e) => e.id);\n for (const s of starts) if ((color.get(s) ?? 0) === 0) dfs(s);\n for (const id of ids) if ((color.get(id) ?? 0) === 0) dfs(id);\n\n // Forward-edge longest path (back edges excluded).\n const fwdAdj = new Map<string, string[]>();\n for (const id of ids) fwdAdj.set(id, []);\n for (const [u, v] of allEdges) {\n if (backEdges.has(`${u}\\0${v}`)) continue;\n fwdAdj.get(u)!.push(v);\n }\n // Topo sort over forward DAG.\n const fwdInDeg = new Map<string, number>();\n for (const id of ids) fwdInDeg.set(id, 0);\n for (const [u, v] of allEdges) {\n if (backEdges.has(`${u}\\0${v}`)) continue;\n fwdInDeg.set(v, (fwdInDeg.get(v) ?? 0) + 1);\n }\n const queue: string[] = [];\n for (const id of ids) if ((fwdInDeg.get(id) ?? 0) === 0) queue.push(id);\n const order: string[] = [];\n const remIn = new Map(fwdInDeg);\n while (queue.length > 0) {\n const v = queue.shift()!;\n order.push(v);\n for (const w of fwdAdj.get(v) ?? []) {\n const d = (remIn.get(w) ?? 0) - 1;\n remIn.set(w, d);\n if (d === 0) queue.push(w);\n }\n }\n for (const id of ids) if (!order.includes(id)) order.push(id);\n\n for (const id of ids) colByObj.set(id, 0);\n for (const v of order) {\n const lv = colByObj.get(v) ?? 0;\n for (const w of fwdAdj.get(v) ?? []) {\n const lw = colByObj.get(w) ?? 0;\n if (lw < lv + 1) colByObj.set(w, lv + 1);\n }\n }\n}\n\n// ─── Routing ──────────────────────────────────────────────────\n\nfunction fmt(n: number): string {\n return (Math.round(n * 100) / 100).toString();\n}\n\nfunction routeSequenceFlow(\n f: BpmnAst[\"flows\"][number],\n objCenter: Map<string, { x: number; y: number; w: number; h: number }>,\n objById: Map<string, BpmnFlowObject>\n): BpmnLayoutFlow {\n const a = objCenter.get(f.from)!;\n const b = objCenter.get(f.to)!;\n // Choose entry/exit sides based on relative position.\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n\n let from = { x: a.x, y: a.y };\n let to = { x: b.x, y: b.y };\n\n // Exit point on source.\n if (Math.abs(dx) >= Math.abs(dy)) {\n from = { x: a.x + (dx >= 0 ? a.w / 2 : -a.w / 2), y: a.y };\n to = { x: b.x + (dx >= 0 ? -b.w / 2 : b.w / 2), y: b.y };\n } else {\n from = { x: a.x, y: a.y + (dy >= 0 ? a.h / 2 : -a.h / 2) };\n to = { x: b.x, y: b.y + (dy >= 0 ? -b.h / 2 : b.h / 2) };\n }\n\n // Adjust for diamond/circle shapes (use square exit for simplicity in v0.1).\n void objById;\n\n // Manhattan: midpoint bend on the dominant axis.\n let path: string;\n let labelAnchor: { x: number; y: number } | undefined;\n if (Math.abs(dx) >= Math.abs(dy)) {\n const midX = (from.x + to.x) / 2;\n path =\n `M ${fmt(from.x)} ${fmt(from.y)} ` +\n `L ${fmt(midX)} ${fmt(from.y)} ` +\n `L ${fmt(midX)} ${fmt(to.y)} ` +\n `L ${fmt(to.x)} ${fmt(to.y)}`;\n labelAnchor = { x: midX, y: (from.y + to.y) / 2 - 6 };\n } else {\n const midY = (from.y + to.y) / 2;\n path =\n `M ${fmt(from.x)} ${fmt(from.y)} ` +\n `L ${fmt(from.x)} ${fmt(midY)} ` +\n `L ${fmt(to.x)} ${fmt(midY)} ` +\n `L ${fmt(to.x)} ${fmt(to.y)}`;\n labelAnchor = { x: (from.x + to.x) / 2, y: midY - 6 };\n }\n\n return { flow: f, path, labelAnchor };\n}\n\nfunction routeMessageFlow(\n f: BpmnAst[\"flows\"][number],\n objCenter: Map<string, { x: number; y: number; w: number; h: number }>,\n poolByLabel: Map<string, BpmnLayoutPool>\n): BpmnLayoutFlow {\n // Endpoint = either pool label (use pool's edge midpoint) or object center.\n const endpoint = (\n ep: string\n ): { x: number; y: number; isPool: boolean; poolY?: number; poolH?: number } => {\n if (poolByLabel.has(ep)) {\n const p = poolByLabel.get(ep)!;\n return {\n x: p.x + p.width / 2,\n y: p.y + p.height / 2,\n isPool: true,\n poolY: p.y,\n poolH: p.height,\n };\n }\n const c = objCenter.get(ep)!;\n return { x: c.x, y: c.y, isPool: false };\n };\n const A = endpoint(f.from);\n const B = endpoint(f.to);\n\n // Strategy: route via vertical channel between the two y's, with a\n // horizontal segment at the midpoint. Sufficient for v0.1.\n const midY = (A.y + B.y) / 2;\n const path =\n `M ${fmt(A.x)} ${fmt(A.y)} ` +\n `L ${fmt(A.x)} ${fmt(midY)} ` +\n `L ${fmt(B.x)} ${fmt(midY)} ` +\n `L ${fmt(B.x)} ${fmt(B.y)}`;\n return { flow: f, path, labelAnchor: { x: (A.x + B.x) / 2, y: midY - 6 } };\n}\n","/**\n * BPMN renderer — BpmnLayoutResult → SVG.\n *\n * Z-order: pools → lanes → flows → objects → labels.\n * Defs include arrowhead markers (filled-triangle for sequence,\n * open-triangle for message) and the small source-end glyphs\n * (conditional diamond, default slash, message-start circle).\n */\nimport {\n defs,\n desc,\n el,\n group,\n multilineText,\n path,\n rect,\n svgRoot,\n text,\n title,\n} from \"../../core/svg\";\nimport type {\n BpmnActivity,\n BpmnEvent,\n BpmnGateway,\n BpmnLayoutFlow,\n BpmnLayoutObject,\n BpmnLayoutPool,\n BpmnLayoutResult,\n RenderConfig,\n} from \"../../core/types\";\nimport { parseBpmn } from \"./parser\";\nimport { layoutBpmn, BPMN_CONST } from \"./layout\";\n\nconst FONT_FAMILY = \"system-ui, -apple-system, 'Segoe UI', sans-serif\";\nconst STROKE = \"#1f2937\";\nconst STROKE_LIGHT = \"#94a3b8\";\nconst POOL_FILL = \"#ffffff\";\nconst LANE_FILL = \"#fafbfc\";\nconst TASK_FILL = \"#ffffff\";\nconst GATEWAY_FILL = \"#fffbeb\";\nconst EVENT_FILL = \"#ffffff\";\nconst LABEL_BAND_FILL = \"#f1f5f9\";\n\nexport function renderBpmn(textInput: string, config?: RenderConfig): string {\n const ast = parseBpmn(textInput);\n const layout = layoutBpmn(ast);\n return renderBpmnLayout(layout, config);\n}\n\nexport function renderBpmnLayout(\n layout: BpmnLayoutResult,\n _config?: RenderConfig\n): string {\n const { width, height, ast } = layout;\n\n const out: string[] = [];\n out.push(title(ast.title ?? \"BPMN diagram\"));\n out.push(desc(`BPMN ${ast.direction} — ${ast.pools.length} pool(s), ${layout.objects.length} flow object(s).`));\n\n out.push(buildDefs());\n\n // Pools\n for (const pl of layout.pools) out.push(renderPool(pl));\n\n // Lanes\n for (const lan of layout.lanes) {\n out.push(\n group({ class: \"schematex-bpmn-lane\" }, [\n rect({\n x: lan.x + lan.labelHeight,\n y: lan.y,\n width: lan.width - lan.labelHeight,\n height: lan.height,\n fill: LANE_FILL,\n stroke: STROKE,\n \"stroke-width\": 1,\n }),\n rect({\n x: lan.x,\n y: lan.y,\n width: lan.labelHeight,\n height: lan.height,\n fill: LABEL_BAND_FILL,\n stroke: STROKE,\n \"stroke-width\": 1,\n }),\n text(\n {\n x: lan.x + lan.labelHeight / 2,\n y: lan.y + lan.height / 2,\n transform: `rotate(-90 ${lan.x + lan.labelHeight / 2} ${lan.y + lan.height / 2})`,\n \"text-anchor\": \"middle\",\n \"dominant-baseline\": \"middle\",\n \"font-family\": FONT_FAMILY,\n \"font-size\": 12,\n fill: STROKE,\n },\n lan.lane.label\n ),\n ])\n );\n }\n\n // Sequence/message flows beneath objects so arrowheads sit clean.\n for (const fl of layout.flows) out.push(renderFlow(fl));\n\n // Objects\n for (const ol of layout.objects) out.push(renderObject(ol));\n\n return svgRoot(\n {\n width,\n height,\n viewBox: `0 0 ${width} ${height}`,\n class: \"schematex-bpmn\",\n },\n out\n );\n}\n\n// ─── Defs (arrow markers) ──────────────────────────────────────\n\nfunction buildDefs(): string {\n return defs([\n // Sequence flow — filled triangle.\n el(\n \"marker\",\n {\n id: \"bpmn-arrow-seq\",\n viewBox: \"0 0 10 10\",\n refX: 9,\n refY: 5,\n markerWidth: 8,\n markerHeight: 8,\n orient: \"auto-start-reverse\",\n },\n [\n el(\"path\", {\n d: \"M 0 0 L 10 5 L 0 10 z\",\n fill: STROKE,\n }),\n ]\n ),\n // Message flow — open triangle.\n el(\n \"marker\",\n {\n id: \"bpmn-arrow-msg\",\n viewBox: \"0 0 10 10\",\n refX: 9,\n refY: 5,\n markerWidth: 9,\n markerHeight: 9,\n orient: \"auto-start-reverse\",\n },\n [\n el(\"path\", {\n d: \"M 0 0 L 10 5 L 0 10 z\",\n fill: \"#ffffff\",\n stroke: STROKE,\n \"stroke-width\": 1,\n }),\n ]\n ),\n // Message source dot.\n el(\n \"marker\",\n {\n id: \"bpmn-msg-start\",\n viewBox: \"0 0 10 10\",\n refX: 5,\n refY: 5,\n markerWidth: 6,\n markerHeight: 6,\n orient: \"auto\",\n },\n [\n el(\"circle\", { cx: 5, cy: 5, r: 3, fill: \"#ffffff\", stroke: STROKE }),\n ]\n ),\n ]);\n}\n\n// ─── Pool ──────────────────────────────────────────────────────\n\nfunction renderPool(pl: BpmnLayoutPool): string {\n const labelCx = pl.labelX + pl.labelWidth / 2;\n const labelCy = pl.labelY + pl.height / 2;\n if (pl.pool.blackbox) {\n return group({ class: \"schematex-bpmn-pool blackbox\" }, [\n rect({\n x: pl.x,\n y: pl.y,\n width: pl.width,\n height: pl.height,\n fill: POOL_FILL,\n stroke: STROKE,\n \"stroke-width\": 1.5,\n }),\n rect({\n x: pl.x,\n y: pl.y,\n width: pl.labelWidth,\n height: pl.height,\n fill: LABEL_BAND_FILL,\n stroke: STROKE,\n \"stroke-width\": 1,\n }),\n text(\n {\n x: labelCx,\n y: labelCy,\n transform: `rotate(-90 ${labelCx} ${labelCy})`,\n \"text-anchor\": \"middle\",\n \"dominant-baseline\": \"middle\",\n \"font-family\": FONT_FAMILY,\n \"font-size\": 13,\n \"font-weight\": \"bold\",\n fill: STROKE,\n },\n pl.pool.label\n ),\n ]);\n }\n return group({ class: \"schematex-bpmn-pool\" }, [\n rect({\n x: pl.x,\n y: pl.y,\n width: pl.width,\n height: pl.height,\n fill: POOL_FILL,\n stroke: STROKE,\n \"stroke-width\": 1.5,\n }),\n rect({\n x: pl.x,\n y: pl.y,\n width: pl.labelWidth,\n height: pl.height,\n fill: LABEL_BAND_FILL,\n stroke: STROKE,\n \"stroke-width\": 1,\n }),\n text(\n {\n x: labelCx,\n y: labelCy,\n transform: `rotate(-90 ${labelCx} ${labelCy})`,\n \"text-anchor\": \"middle\",\n \"dominant-baseline\": \"middle\",\n \"font-family\": FONT_FAMILY,\n \"font-size\": 13,\n \"font-weight\": \"bold\",\n fill: STROKE,\n },\n pl.pool.label\n ),\n ]);\n}\n\n// ─── Flow object ──────────────────────────────────────────────\n\nfunction renderObject(ol: BpmnLayoutObject): string {\n const o = ol.obj;\n if (\"gatewayKind\" in o) return renderGateway(ol);\n if (\"marker\" in o) return renderActivity(ol);\n return renderEvent(ol);\n}\n\nfunction renderActivity(ol: BpmnLayoutObject): string {\n const a = ol.obj as BpmnActivity;\n const isSubproc = a.kind === \"subprocess-collapsed\";\n const cx = ol.x + ol.width / 2;\n const cy = ol.y + ol.height / 2;\n const children: string[] = [\n rect({\n x: ol.x,\n y: ol.y,\n width: ol.width,\n height: ol.height,\n rx: 10,\n ry: 10,\n fill: TASK_FILL,\n stroke: STROKE,\n \"stroke-width\": 1.5,\n }),\n multilineText(\n {\n x: cx,\n y: cy,\n \"text-anchor\": \"middle\",\n \"dominant-baseline\": \"middle\",\n \"font-family\": FONT_FAMILY,\n \"font-size\": 12,\n fill: STROKE,\n },\n a.label,\n 14\n ),\n ];\n // Task marker — small icon top-left (8px from edge).\n if (a.kind === \"task\" && a.marker !== \"abstract\") {\n children.push(taskMarker(ol.x + 6, ol.y + 6, a.marker));\n }\n // Collapsed subprocess [+] marker, bottom-center.\n if (isSubproc) {\n const mx = cx;\n const my = ol.y + ol.height - 10;\n children.push(\n rect({\n x: mx - 6,\n y: my - 6,\n width: 12,\n height: 12,\n fill: \"none\",\n stroke: STROKE,\n \"stroke-width\": 1,\n }),\n el(\"path\", {\n d: `M ${mx - 4} ${my} L ${mx + 4} ${my} M ${mx} ${my - 4} L ${mx} ${my + 4}`,\n stroke: STROKE,\n \"stroke-width\": 1,\n })\n );\n }\n return group({ class: `schematex-bpmn-task marker-${a.marker}` }, children);\n}\n\nfunction taskMarker(x: number, y: number, marker: string): string {\n const cx = x + 7;\n const cy = y + 7;\n if (marker === \"user\") {\n return el(\"g\", { class: \"marker-user\" }, [\n el(\"circle\", { cx, cy: cy - 1, r: 2.5, fill: \"none\", stroke: STROKE, \"stroke-width\": 1 }),\n el(\"path\", {\n d: `M ${cx - 5} ${cy + 6} Q ${cx} ${cy + 1} ${cx + 5} ${cy + 6}`,\n fill: \"none\",\n stroke: STROKE,\n \"stroke-width\": 1,\n }),\n ]);\n }\n if (marker === \"service\") {\n // Two overlapping gears (simplified).\n return el(\"g\", { class: \"marker-service\" }, [\n el(\"circle\", { cx, cy, r: 4, fill: \"none\", stroke: STROKE, \"stroke-width\": 1 }),\n el(\"circle\", { cx, cy, r: 1.5, fill: STROKE }),\n el(\"path\", {\n d: `M ${cx} ${cy - 6} L ${cx} ${cy - 4} M ${cx} ${cy + 4} L ${cx} ${cy + 6} M ${cx - 6} ${cy} L ${cx - 4} ${cy} M ${cx + 4} ${cy} L ${cx + 6} ${cy}`,\n stroke: STROKE,\n \"stroke-width\": 1,\n }),\n ]);\n }\n if (marker === \"send\") {\n return el(\"g\", { class: \"marker-send\" }, [\n el(\"rect\", { x: cx - 5, y: cy - 3, width: 10, height: 7, fill: STROKE }),\n el(\"path\", { d: `M ${cx - 5} ${cy - 3} L ${cx} ${cy + 1} L ${cx + 5} ${cy - 3}`, stroke: \"#ffffff\", \"stroke-width\": 1, fill: \"none\" }),\n ]);\n }\n if (marker === \"receive\") {\n return el(\"g\", { class: \"marker-receive\" }, [\n el(\"rect\", { x: cx - 5, y: cy - 3, width: 10, height: 7, fill: \"none\", stroke: STROKE, \"stroke-width\": 1 }),\n el(\"path\", { d: `M ${cx - 5} ${cy - 3} L ${cx} ${cy + 1} L ${cx + 5} ${cy - 3}`, stroke: STROKE, \"stroke-width\": 1, fill: \"none\" }),\n ]);\n }\n if (marker === \"manual\") {\n // Hand silhouette (simplified up-pointing finger).\n return el(\"g\", { class: \"marker-manual\" }, [\n el(\"path\", {\n d: `M ${cx - 3} ${cy + 4} L ${cx - 3} ${cy} L ${cx - 1.5} ${cy} L ${cx - 1.5} ${cy - 4} L ${cx} ${cy - 4} L ${cx} ${cy} L ${cx + 1.5} ${cy} L ${cx + 1.5} ${cy + 1} L ${cx + 3} ${cy + 1} L ${cx + 3} ${cy + 4} z`,\n fill: \"none\",\n stroke: STROKE,\n \"stroke-width\": 1,\n }),\n ]);\n }\n if (marker === \"script\") {\n return el(\"g\", { class: \"marker-script\" }, [\n el(\"path\", {\n d: `M ${cx - 4} ${cy - 5} Q ${cx - 6} ${cy} ${cx - 4} ${cy + 5} L ${cx + 4} ${cy + 5} Q ${cx + 2} ${cy} ${cx + 4} ${cy - 5} z`,\n fill: \"none\",\n stroke: STROKE,\n \"stroke-width\": 1,\n }),\n el(\"path\", {\n d: `M ${cx - 2} ${cy - 2} L ${cx + 2} ${cy - 2} M ${cx - 2} ${cy} L ${cx + 2} ${cy} M ${cx - 2} ${cy + 2} L ${cx + 2} ${cy + 2}`,\n stroke: STROKE,\n \"stroke-width\": 0.8,\n }),\n ]);\n }\n return \"\";\n}\n\nfunction renderGateway(ol: BpmnLayoutObject): string {\n const g = ol.obj as BpmnGateway;\n const cx = ol.x + ol.width / 2;\n const cy = ol.y + ol.height / 2;\n const r = ol.width / 2;\n const points = `${cx},${cy - r} ${cx + r},${cy} ${cx},${cy + r} ${cx - r},${cy}`;\n const inner: string[] = [];\n if (g.gatewayKind === \"xor\") {\n // X glyph (Silver default).\n const a = r * 0.42;\n inner.push(\n el(\"path\", {\n d: `M ${cx - a} ${cy - a} L ${cx + a} ${cy + a} M ${cx + a} ${cy - a} L ${cx - a} ${cy + a}`,\n stroke: STROKE,\n \"stroke-width\": 2.5,\n \"stroke-linecap\": \"round\",\n })\n );\n } else if (g.gatewayKind === \"and\") {\n const a = r * 0.5;\n inner.push(\n el(\"path\", {\n d: `M ${cx - a} ${cy} L ${cx + a} ${cy} M ${cx} ${cy - a} L ${cx} ${cy + a}`,\n stroke: STROKE,\n \"stroke-width\": 2.5,\n \"stroke-linecap\": \"round\",\n })\n );\n } else if (g.gatewayKind === \"or\") {\n inner.push(\n el(\"circle\", {\n cx,\n cy,\n r: r * 0.45,\n fill: \"none\",\n stroke: STROKE,\n \"stroke-width\": 2,\n })\n );\n } else if (g.gatewayKind === \"event\") {\n // Pentagon inscribed in circle.\n inner.push(\n el(\"circle\", {\n cx,\n cy,\n r: r * 0.55,\n fill: \"none\",\n stroke: STROKE,\n \"stroke-width\": 1,\n })\n );\n const pr = r * 0.32;\n const pts: string[] = [];\n for (let k = 0; k < 5; k++) {\n const ang = -Math.PI / 2 + (k * 2 * Math.PI) / 5;\n pts.push(`${cx + pr * Math.cos(ang)},${cy + pr * Math.sin(ang)}`);\n }\n inner.push(\n el(\"polygon\", {\n points: pts.join(\" \"),\n fill: \"none\",\n stroke: STROKE,\n \"stroke-width\": 1.2,\n })\n );\n }\n const labelStr = g.label ?? \"\";\n const labelEl = labelStr\n ? text(\n {\n x: cx,\n y: ol.y - 6,\n \"text-anchor\": \"middle\",\n \"font-family\": FONT_FAMILY,\n \"font-size\": 11,\n fill: STROKE,\n },\n labelStr\n )\n : \"\";\n return group({ class: `schematex-bpmn-gateway kind-${g.gatewayKind}` }, [\n el(\"polygon\", {\n points,\n fill: GATEWAY_FILL,\n stroke: STROKE,\n \"stroke-width\": 1.5,\n }),\n ...inner,\n labelEl,\n ]);\n}\n\nfunction renderEvent(ol: BpmnLayoutObject): string {\n const e = ol.obj as BpmnEvent;\n const cx = ol.x + ol.width / 2;\n const cy = ol.y + ol.height / 2;\n const r = ol.width / 2;\n const isEnd = e.kind === \"end\";\n const isIntermediate = e.kind === \"intermediate\";\n const strokeW = isEnd ? 3 : 1.2;\n const children: string[] = [];\n children.push(\n el(\"circle\", {\n cx,\n cy,\n r,\n fill: EVENT_FILL,\n stroke: STROKE,\n \"stroke-width\": strokeW,\n })\n );\n if (isIntermediate) {\n children.push(\n el(\"circle\", {\n cx,\n cy,\n r: r - 3,\n fill: \"none\",\n stroke: STROKE,\n \"stroke-width\": 1.2,\n })\n );\n }\n // Trigger glyph\n const filled = e.throwCatch === \"throw\" && (isIntermediate || isEnd);\n if (e.trigger === \"message\") {\n children.push(messageGlyph(cx, cy, r * 0.55, filled));\n } else if (e.trigger === \"timer\") {\n children.push(timerGlyph(cx, cy, r * 0.55));\n }\n // End-event terminator (none trigger): a thick filled disk indicates terminate\n // — we render plain none-end as just the thick ring (no inner glyph).\n // Label below.\n if (e.label) {\n children.push(\n text(\n {\n x: cx,\n y: ol.y + ol.height + 14,\n \"text-anchor\": \"middle\",\n \"font-family\": FONT_FAMILY,\n \"font-size\": 11,\n fill: STROKE,\n },\n e.label\n )\n );\n }\n return group({ class: `schematex-bpmn-event kind-${e.kind} trigger-${e.trigger}` }, children);\n}\n\nfunction messageGlyph(cx: number, cy: number, size: number, filled: boolean): string {\n const w = size;\n const h = size * 0.7;\n const x = cx - w / 2;\n const y = cy - h / 2;\n return el(\"g\", { class: \"trigger-message\" }, [\n el(\"rect\", {\n x,\n y,\n width: w,\n height: h,\n fill: filled ? STROKE : \"#ffffff\",\n stroke: STROKE,\n \"stroke-width\": 1,\n }),\n el(\"path\", {\n d: `M ${x} ${y} L ${cx} ${y + h * 0.55} L ${x + w} ${y}`,\n stroke: filled ? \"#ffffff\" : STROKE,\n \"stroke-width\": 1,\n fill: \"none\",\n }),\n ]);\n}\n\nfunction timerGlyph(cx: number, cy: number, size: number): string {\n const r = size / 2;\n // Clock outline + 12 / 3 / 6 / 9 ticks + hands.\n const ticks: string[] = [];\n for (let k = 0; k < 12; k++) {\n const ang = (k * Math.PI) / 6 - Math.PI / 2;\n const t1x = cx + (r - 1.5) * Math.cos(ang);\n const t1y = cy + (r - 1.5) * Math.sin(ang);\n const t2x = cx + r * Math.cos(ang);\n const t2y = cy + r * Math.sin(ang);\n ticks.push(`M ${t1x} ${t1y} L ${t2x} ${t2y}`);\n }\n return el(\"g\", { class: \"trigger-timer\" }, [\n el(\"circle\", { cx, cy, r, fill: \"none\", stroke: STROKE, \"stroke-width\": 1 }),\n el(\"path\", { d: ticks.join(\" \"), stroke: STROKE, \"stroke-width\": 0.8 }),\n // Hands\n el(\"path\", {\n d: `M ${cx} ${cy} L ${cx} ${cy - r * 0.7} M ${cx} ${cy} L ${cx + r * 0.5} ${cy}`,\n stroke: STROKE,\n \"stroke-width\": 1.2,\n \"stroke-linecap\": \"round\",\n }),\n ]);\n}\n\n// ─── Flow rendering ───────────────────────────────────────────\n\nfunction renderFlow(fl: BpmnLayoutFlow): string {\n const f = fl.flow;\n const isMessage = f.kind === \"message\";\n const dasharray = isMessage ? \"6 4\" : undefined;\n const markerStart = isMessage ? \"url(#bpmn-msg-start)\" : undefined;\n const markerEnd = isMessage ? \"url(#bpmn-arrow-msg)\" : \"url(#bpmn-arrow-seq)\";\n const children: string[] = [\n path({\n d: fl.path,\n fill: \"none\",\n stroke: isMessage ? STROKE_LIGHT : STROKE,\n \"stroke-width\": 1.4,\n \"stroke-dasharray\": dasharray,\n \"marker-start\": markerStart,\n \"marker-end\": markerEnd,\n }),\n ];\n // Conditional flow: small diamond at source.\n if (f.kind === \"conditional\") {\n const head = parseStart(fl.path);\n if (head) {\n children.push(\n el(\"polygon\", {\n points: diamondPoints(head.x, head.y, 5),\n fill: \"#ffffff\",\n stroke: STROKE,\n \"stroke-width\": 1,\n })\n );\n }\n }\n // Default flow: small slash at source.\n if (f.kind === \"default\") {\n const head = parseStart(fl.path);\n if (head) {\n children.push(\n el(\"path\", {\n d: `M ${head.x - 4} ${head.y + 4} L ${head.x + 4} ${head.y - 4}`,\n stroke: STROKE,\n \"stroke-width\": 1.5,\n })\n );\n }\n }\n // Edge label.\n if (f.label && fl.labelAnchor) {\n children.push(\n text(\n {\n x: fl.labelAnchor.x,\n y: fl.labelAnchor.y,\n \"text-anchor\": \"middle\",\n \"font-family\": FONT_FAMILY,\n \"font-size\": 10,\n fill: STROKE,\n },\n f.label\n )\n );\n }\n return group({ class: `schematex-bpmn-flow kind-${f.kind}` }, children);\n}\n\nfunction parseStart(d: string): { x: number; y: number } | null {\n const m = d.match(/^M\\s+(-?\\d+(?:\\.\\d+)?)\\s+(-?\\d+(?:\\.\\d+)?)/);\n if (!m) return null;\n return { x: parseFloat(m[1]!), y: parseFloat(m[2]!) };\n}\n\nfunction diamondPoints(cx: number, cy: number, r: number): string {\n return `${cx - r},${cy} ${cx},${cy - r} ${cx + r},${cy} ${cx},${cy + r}`;\n}\n\n// Re-export const for tests.\nexport { BPMN_CONST };\n","import type { DiagramPlugin, RenderConfig } from \"../../core/types\";\nimport { parseBpmn } from \"./parser\";\nimport { renderBpmn } from \"./renderer\";\n\nexport const bpmn: DiagramPlugin = {\n type: \"bpmn\",\n detect(text: string): boolean {\n for (const raw of text.split(/\\r?\\n/)) {\n const t = raw.trim();\n if (t.length === 0) continue;\n if (t.startsWith(\"//\") || t.startsWith(\"#\") || t.startsWith(\"%%\")) continue;\n const first = t.split(/\\s+/)[0]?.toLowerCase() ?? \"\";\n return first === \"bpmn\";\n }\n return false;\n },\n parse: parseBpmn,\n render(text: string, config?: RenderConfig): string {\n return renderBpmn(text, config);\n },\n};\n\nexport { parseBpmn, BpmnParseError } from \"./parser\";\nexport { renderBpmn, renderBpmnLayout } from \"./renderer\";\nexport { layoutBpmn, BPMN_CONST } from \"./layout\";\n","/**\n * FBD standard-block port specs.\n *\n * Each std block declares its input/output port names, types, and rendering hints\n * (header label, inner symbol). Used by the parser to validate calls and infer\n * port wiring, and by the renderer to draw the right inner glyph.\n *\n * IEC 61131-3 §2.5.1 / §6.4 reference.\n */\n\nimport type { FbdDataType, FbdStdBlockName, FbdPortSide } from \"../../core/types\";\n\nexport interface PortSpec {\n name: string;\n side: FbdPortSide;\n dataType: FbdDataType;\n /** True if this port is variadic (accepts INn for n=1..N). Boolean ANDs, ORs, ADDs etc. */\n variadic?: boolean;\n}\n\nexport interface BlockSpec {\n name: FbdStdBlockName;\n /** Header text rendered at top of block. Defaults to name. */\n header?: string;\n /** Inner symbol drawn inside (IEC distinctive — `&`, `≥1`, `1`, `=1`). */\n innerSymbol?: string;\n /** Output port has a negation bubble in IEC convention (NAND/NOR/NOT/XNOR). */\n outputNegated?: boolean;\n ports: PortSpec[];\n /** Default number of inputs for variadic boolean blocks (AND/OR/NAND/NOR). */\n defaultInputs?: number;\n /** Primary output port (used when LHS = ... wires to a variable). */\n primaryOut?: string;\n}\n\nexport const BLOCK_SPECS: Record<FbdStdBlockName, BlockSpec> = {\n // ─── Boolean Logic ───────────────────────────────────────\n AND: {\n name: \"AND\",\n innerSymbol: \"&\",\n ports: [\n { name: \"IN1\", side: \"in\", dataType: \"bool\", variadic: true },\n { name: \"IN2\", side: \"in\", dataType: \"bool\", variadic: true },\n { name: \"OUT\", side: \"out\", dataType: \"bool\" },\n ],\n defaultInputs: 2,\n primaryOut: \"OUT\",\n },\n OR: {\n name: \"OR\",\n innerSymbol: \"≥1\",\n ports: [\n { name: \"IN1\", side: \"in\", dataType: \"bool\", variadic: true },\n { name: \"IN2\", side: \"in\", dataType: \"bool\", variadic: true },\n { name: \"OUT\", side: \"out\", dataType: \"bool\" },\n ],\n defaultInputs: 2,\n primaryOut: \"OUT\",\n },\n NOT: {\n name: \"NOT\",\n innerSymbol: \"1\",\n outputNegated: true,\n ports: [\n { name: \"IN\", side: \"in\", dataType: \"bool\" },\n { name: \"OUT\", side: \"out\", dataType: \"bool\" },\n ],\n primaryOut: \"OUT\",\n },\n NAND: {\n name: \"NAND\",\n innerSymbol: \"&\",\n outputNegated: true,\n ports: [\n { name: \"IN1\", side: \"in\", dataType: \"bool\", variadic: true },\n { name: \"IN2\", side: \"in\", dataType: \"bool\", variadic: true },\n { name: \"OUT\", side: \"out\", dataType: \"bool\" },\n ],\n defaultInputs: 2,\n primaryOut: \"OUT\",\n },\n NOR: {\n name: \"NOR\",\n innerSymbol: \"≥1\",\n outputNegated: true,\n ports: [\n { name: \"IN1\", side: \"in\", dataType: \"bool\", variadic: true },\n { name: \"IN2\", side: \"in\", dataType: \"bool\", variadic: true },\n { name: \"OUT\", side: \"out\", dataType: \"bool\" },\n ],\n defaultInputs: 2,\n primaryOut: \"OUT\",\n },\n XOR: {\n name: \"XOR\",\n innerSymbol: \"=1\",\n ports: [\n { name: \"IN1\", side: \"in\", dataType: \"bool\" },\n { name: \"IN2\", side: \"in\", dataType: \"bool\" },\n { name: \"OUT\", side: \"out\", dataType: \"bool\" },\n ],\n primaryOut: \"OUT\",\n },\n XNOR: {\n name: \"XNOR\",\n innerSymbol: \"=1\",\n outputNegated: true,\n ports: [\n { name: \"IN1\", side: \"in\", dataType: \"bool\" },\n { name: \"IN2\", side: \"in\", dataType: \"bool\" },\n { name: \"OUT\", side: \"out\", dataType: \"bool\" },\n ],\n primaryOut: \"OUT\",\n },\n BUF: {\n name: \"BUF\",\n innerSymbol: \"1\",\n ports: [\n { name: \"IN\", side: \"in\", dataType: \"bool\" },\n { name: \"OUT\", side: \"out\", dataType: \"bool\" },\n ],\n primaryOut: \"OUT\",\n },\n\n // ─── Edge Detect ─────────────────────────────────────────\n R_TRIG: {\n name: \"R_TRIG\",\n ports: [\n { name: \"CLK\", side: \"in\", dataType: \"bool\" },\n { name: \"Q\", side: \"out\", dataType: \"bool\" },\n ],\n primaryOut: \"Q\",\n },\n F_TRIG: {\n name: \"F_TRIG\",\n ports: [\n { name: \"CLK\", side: \"in\", dataType: \"bool\" },\n { name: \"Q\", side: \"out\", dataType: \"bool\" },\n ],\n primaryOut: \"Q\",\n },\n\n // ─── Bistable ────────────────────────────────────────────\n SR: {\n name: \"SR\",\n ports: [\n { name: \"S1\", side: \"in\", dataType: \"bool\" },\n { name: \"R\", side: \"in\", dataType: \"bool\" },\n { name: \"Q1\", side: \"out\", dataType: \"bool\" },\n ],\n primaryOut: \"Q1\",\n },\n RS: {\n name: \"RS\",\n ports: [\n { name: \"S\", side: \"in\", dataType: \"bool\" },\n { name: \"R1\", side: \"in\", dataType: \"bool\" },\n { name: \"Q1\", side: \"out\", dataType: \"bool\" },\n ],\n primaryOut: \"Q1\",\n },\n\n // ─── Timers ──────────────────────────────────────────────\n TON: {\n name: \"TON\",\n ports: [\n { name: \"IN\", side: \"in\", dataType: \"bool\" },\n { name: \"PT\", side: \"in\", dataType: \"time\" },\n { name: \"Q\", side: \"out\", dataType: \"bool\" },\n { name: \"ET\", side: \"out\", dataType: \"time\" },\n ],\n primaryOut: \"Q\",\n },\n TOF: {\n name: \"TOF\",\n ports: [\n { name: \"IN\", side: \"in\", dataType: \"bool\" },\n { name: \"PT\", side: \"in\", dataType: \"time\" },\n { name: \"Q\", side: \"out\", dataType: \"bool\" },\n { name: \"ET\", side: \"out\", dataType: \"time\" },\n ],\n primaryOut: \"Q\",\n },\n TP: {\n name: \"TP\",\n ports: [\n { name: \"IN\", side: \"in\", dataType: \"bool\" },\n { name: \"PT\", side: \"in\", dataType: \"time\" },\n { name: \"Q\", side: \"out\", dataType: \"bool\" },\n { name: \"ET\", side: \"out\", dataType: \"time\" },\n ],\n primaryOut: \"Q\",\n },\n\n // ─── Counters ────────────────────────────────────────────\n CTU: {\n name: \"CTU\",\n ports: [\n { name: \"CU\", side: \"in\", dataType: \"bool\" },\n { name: \"R\", side: \"in\", dataType: \"bool\" },\n { name: \"PV\", side: \"in\", dataType: \"int\" },\n { name: \"Q\", side: \"out\", dataType: \"bool\" },\n { name: \"CV\", side: \"out\", dataType: \"int\" },\n ],\n primaryOut: \"Q\",\n },\n CTD: {\n name: \"CTD\",\n ports: [\n { name: \"CD\", side: \"in\", dataType: \"bool\" },\n { name: \"LD\", side: \"in\", dataType: \"bool\" },\n { name: \"PV\", side: \"in\", dataType: \"int\" },\n { name: \"Q\", side: \"out\", dataType: \"bool\" },\n { name: \"CV\", side: \"out\", dataType: \"int\" },\n ],\n primaryOut: \"Q\",\n },\n\n // ─── Math ────────────────────────────────────────────────\n ADD: {\n name: \"ADD\",\n ports: [\n { name: \"IN1\", side: \"in\", dataType: \"real\", variadic: true },\n { name: \"IN2\", side: \"in\", dataType: \"real\", variadic: true },\n { name: \"OUT\", side: \"out\", dataType: \"real\" },\n ],\n defaultInputs: 2,\n primaryOut: \"OUT\",\n },\n SUB: {\n name: \"SUB\",\n ports: [\n { name: \"IN1\", side: \"in\", dataType: \"real\" },\n { name: \"IN2\", side: \"in\", dataType: \"real\" },\n { name: \"OUT\", side: \"out\", dataType: \"real\" },\n ],\n primaryOut: \"OUT\",\n },\n MUL: {\n name: \"MUL\",\n ports: [\n { name: \"IN1\", side: \"in\", dataType: \"real\", variadic: true },\n { name: \"IN2\", side: \"in\", dataType: \"real\", variadic: true },\n { name: \"OUT\", side: \"out\", dataType: \"real\" },\n ],\n defaultInputs: 2,\n primaryOut: \"OUT\",\n },\n DIV: {\n name: \"DIV\",\n ports: [\n { name: \"IN1\", side: \"in\", dataType: \"real\" },\n { name: \"IN2\", side: \"in\", dataType: \"real\" },\n { name: \"OUT\", side: \"out\", dataType: \"real\" },\n ],\n primaryOut: \"OUT\",\n },\n MOD: {\n name: \"MOD\",\n ports: [\n { name: \"IN1\", side: \"in\", dataType: \"int\" },\n { name: \"IN2\", side: \"in\", dataType: \"int\" },\n { name: \"OUT\", side: \"out\", dataType: \"int\" },\n ],\n primaryOut: \"OUT\",\n },\n ABS: {\n name: \"ABS\",\n ports: [\n { name: \"IN\", side: \"in\", dataType: \"real\" },\n { name: \"OUT\", side: \"out\", dataType: \"real\" },\n ],\n primaryOut: \"OUT\",\n },\n NEG: {\n name: \"NEG\",\n ports: [\n { name: \"IN\", side: \"in\", dataType: \"real\" },\n { name: \"OUT\", side: \"out\", dataType: \"real\" },\n ],\n primaryOut: \"OUT\",\n },\n MOVE: {\n name: \"MOVE\",\n ports: [\n { name: \"IN\", side: \"in\", dataType: \"any\" },\n { name: \"OUT\", side: \"out\", dataType: \"any\" },\n ],\n primaryOut: \"OUT\",\n },\n\n // ─── Comparison ──────────────────────────────────────────\n EQ: {\n name: \"EQ\",\n ports: [\n { name: \"IN1\", side: \"in\", dataType: \"any\" },\n { name: \"IN2\", side: \"in\", dataType: \"any\" },\n { name: \"OUT\", side: \"out\", dataType: \"bool\" },\n ],\n primaryOut: \"OUT\",\n },\n NE: {\n name: \"NE\",\n ports: [\n { name: \"IN1\", side: \"in\", dataType: \"any\" },\n { name: \"IN2\", side: \"in\", dataType: \"any\" },\n { name: \"OUT\", side: \"out\", dataType: \"bool\" },\n ],\n primaryOut: \"OUT\",\n },\n GT: {\n name: \"GT\",\n ports: [\n { name: \"IN1\", side: \"in\", dataType: \"any\" },\n { name: \"IN2\", side: \"in\", dataType: \"any\" },\n { name: \"OUT\", side: \"out\", dataType: \"bool\" },\n ],\n primaryOut: \"OUT\",\n },\n GE: {\n name: \"GE\",\n ports: [\n { name: \"IN1\", side: \"in\", dataType: \"any\" },\n { name: \"IN2\", side: \"in\", dataType: \"any\" },\n { name: \"OUT\", side: \"out\", dataType: \"bool\" },\n ],\n primaryOut: \"OUT\",\n },\n LT: {\n name: \"LT\",\n ports: [\n { name: \"IN1\", side: \"in\", dataType: \"any\" },\n { name: \"IN2\", side: \"in\", dataType: \"any\" },\n { name: \"OUT\", side: \"out\", dataType: \"bool\" },\n ],\n primaryOut: \"OUT\",\n },\n LE: {\n name: \"LE\",\n ports: [\n { name: \"IN1\", side: \"in\", dataType: \"any\" },\n { name: \"IN2\", side: \"in\", dataType: \"any\" },\n { name: \"OUT\", side: \"out\", dataType: \"bool\" },\n ],\n primaryOut: \"OUT\",\n },\n\n // ─── Selection ───────────────────────────────────────────\n SEL: {\n name: \"SEL\",\n ports: [\n { name: \"G\", side: \"in\", dataType: \"bool\" },\n { name: \"IN0\", side: \"in\", dataType: \"any\" },\n { name: \"IN1\", side: \"in\", dataType: \"any\" },\n { name: \"OUT\", side: \"out\", dataType: \"any\" },\n ],\n primaryOut: \"OUT\",\n },\n MUX: {\n name: \"MUX\",\n ports: [\n { name: \"K\", side: \"in\", dataType: \"int\" },\n { name: \"IN0\", side: \"in\", dataType: \"any\", variadic: true },\n { name: \"IN1\", side: \"in\", dataType: \"any\", variadic: true },\n { name: \"OUT\", side: \"out\", dataType: \"any\" },\n ],\n primaryOut: \"OUT\",\n },\n MAX: {\n name: \"MAX\",\n ports: [\n { name: \"IN1\", side: \"in\", dataType: \"real\", variadic: true },\n { name: \"IN2\", side: \"in\", dataType: \"real\", variadic: true },\n { name: \"OUT\", side: \"out\", dataType: \"real\" },\n ],\n defaultInputs: 2,\n primaryOut: \"OUT\",\n },\n MIN: {\n name: \"MIN\",\n ports: [\n { name: \"IN1\", side: \"in\", dataType: \"real\", variadic: true },\n { name: \"IN2\", side: \"in\", dataType: \"real\", variadic: true },\n { name: \"OUT\", side: \"out\", dataType: \"real\" },\n ],\n defaultInputs: 2,\n primaryOut: \"OUT\",\n },\n LIMIT: {\n name: \"LIMIT\",\n ports: [\n { name: \"MN\", side: \"in\", dataType: \"real\" },\n { name: \"IN\", side: \"in\", dataType: \"real\" },\n { name: \"MX\", side: \"in\", dataType: \"real\" },\n { name: \"OUT\", side: \"out\", dataType: \"real\" },\n ],\n primaryOut: \"OUT\",\n },\n};\n\nexport function isStdBlock(name: string): name is FbdStdBlockName {\n return name in BLOCK_SPECS;\n}\n\nexport function getBlockSpec(name: FbdStdBlockName): BlockSpec {\n return BLOCK_SPECS[name];\n}\n","/**\n * FBD parser — IEC 61131-3 §6.4.\n *\n * Pipeline:\n * 1. Tokenize lines, strip comments.\n * 2. Split into header / variables / networks.\n * 3. Within each network, parse each statement as an assignment of the\n * form `Inst = BLOCK(args)` — args can be nested calls (recursive).\n * 4. Build blocks + wires; wires reference port outputs or declared variables.\n *\n * v0.1 scope: standard blocks only (no user-defined FB pins_in/pins_out, no\n * EN/ENO rails, no page connectors). See 23-FBD-STANDARD.md §11 priority.\n */\n\nimport type {\n FbdAst,\n FbdBlock,\n FbdNetwork,\n FbdPort,\n FbdVarDecl,\n FbdVarScope,\n FbdDataType,\n FbdWire,\n} from \"../../core/types\";\nimport { matchQuotedTitle } from \"../../core/quotes\";\nimport { BLOCK_SPECS, isStdBlock, getBlockSpec } from \"./blocks\";\n\nexport class FbdParseError extends Error {\n line?: number;\n source?: string;\n constructor(message: string, line?: number, source?: string) {\n super(message);\n this.name = \"FbdParseError\";\n if (line !== undefined) this.line = line;\n if (source !== undefined) this.source = source;\n }\n}\n\nconst VALID_DATA_TYPES: FbdDataType[] = [\n \"bool\", \"int\", \"dint\", \"uint\", \"udint\",\n \"real\", \"lreal\", \"time\", \"date\", \"tod\",\n \"string\", \"wstring\", \"byte\", \"word\", \"dword\",\n \"timer\", \"counter\",\n];\n\nconst SCOPE_KEYWORDS: Record<string, FbdVarScope> = {\n var: \"local\",\n var_input: \"input\",\n var_output: \"output\",\n var_in_out: \"in_out\",\n var_global: \"global\",\n var_external: \"external\",\n};\n\ninterface RawLine {\n text: string;\n indent: number;\n lineNo: number;\n}\n\nfunction tokenizeLines(text: string): RawLine[] {\n const out: RawLine[] = [];\n const lines = text.split(\"\\n\");\n for (let i = 0; i < lines.length; i++) {\n const raw = lines[i].replace(/\\r$/, \"\");\n // Strip `#` line comment but keep `#` inside time literals (T#...) and strings.\n let stripped = \"\";\n let inStr = false;\n for (let j = 0; j < raw.length; j++) {\n const ch = raw[j];\n if (ch === '\"') inStr = !inStr;\n if (!inStr && ch === \"#\") {\n const prev = raw[j - 1];\n if (prev === undefined || /\\s/.test(prev)) break;\n }\n stripped += ch;\n }\n if (!stripped.trim()) continue;\n let indent = 0;\n while (indent < stripped.length && (stripped[indent] === \" \" || stripped[indent] === \"\\t\")) {\n indent += stripped[indent] === \"\\t\" ? 4 : 1;\n }\n out.push({ text: stripped.trim(), indent, lineNo: i + 1 });\n }\n return out;\n}\n\nfunction stripBrackets(s: string): string {\n return s.trim().replace(/^\\[|\\]$/g, \"\").trim();\n}\n\nfunction parseVarDecl(line: RawLine): FbdVarDecl | null {\n const m = line.text.match(/^(var|var_input|var_output|var_in_out|var_global|var_external)\\s+([a-zA-Z_]\\w*)\\s*:\\s*([a-zA-Z_]\\w*)\\s*(?:=\\s*(.+))?$/i);\n if (!m) return null;\n const scope = SCOPE_KEYWORDS[m[1].toLowerCase()] ?? \"local\";\n const name = m[2];\n const typeRaw = m[3].toLowerCase();\n const init = m[4]?.trim();\n const isPrimitive = (VALID_DATA_TYPES as string[]).includes(typeRaw);\n const decl: FbdVarDecl = {\n name,\n scope,\n dataType: isPrimitive ? (typeRaw as FbdDataType) : m[3],\n isUserFb: !isPrimitive,\n };\n if (init !== undefined) decl.initValue = init;\n return decl;\n}\n\ninterface NetworkHeader {\n index: number;\n title?: string;\n}\n\nfunction parseNetworkHeader(line: RawLine): NetworkHeader | null {\n // network 0 \"title\": or network \"title\": or network 1: or network:\n const m = line.text.match(/^network(?:\\s+(\\d+))?(?:\\s+\"([^\"]*)\")?(?:\\s*\\[[^\\]]*\\])?\\s*:\\s*$/i);\n if (!m) return null;\n return {\n index: m[1] ? parseInt(m[1], 10) : -1, // -1 = auto-assigned\n title: m[2],\n };\n}\n\n/**\n * Tokenize the call-arguments string into top-level token segments,\n * respecting parentheses depth and double-quoted strings.\n */\nfunction splitArgs(s: string): string[] {\n const out: string[] = [];\n let depth = 0;\n let inStr = false;\n let buf = \"\";\n for (let i = 0; i < s.length; i++) {\n const ch = s[i];\n if (ch === '\"') {\n inStr = !inStr;\n buf += ch;\n continue;\n }\n if (!inStr) {\n if (ch === \"(\" || ch === \"[\") depth++;\n else if (ch === \")\" || ch === \"]\") depth--;\n else if (ch === \",\" && depth === 0) {\n out.push(buf.trim());\n buf = \"\";\n continue;\n }\n }\n buf += ch;\n }\n if (buf.trim()) out.push(buf.trim());\n return out;\n}\n\ninterface ParsedArg {\n name?: string;\n raw: string;\n negated: boolean;\n}\n\nfunction parseArg(arg: string): ParsedArg {\n let s = arg.trim();\n let name: string | undefined;\n // named? IDENT: value\n const nm = s.match(/^([A-Za-z_]\\w*)\\s*:\\s*(.+)$/);\n if (nm) {\n name = nm[1];\n s = nm[2].trim();\n }\n let negated = false;\n if (s.startsWith(\"~\")) {\n negated = true;\n s = s.slice(1).trim();\n }\n return { name, raw: s, negated };\n}\n\nconst TIME_LIT_RE = /^T#\\d+(ms|s|m|h)(\\d+(ms|s|m|h))*$/i;\nconst NUM_LIT_RE = /^-?\\d+(\\.\\d+)?$/;\n\nfunction isLiteral(s: string): boolean {\n if (TIME_LIT_RE.test(s)) return true;\n if (NUM_LIT_RE.test(s)) return true;\n if (/^(true|false)$/i.test(s)) return true;\n if (/^\"[^\"]*\"$/.test(s)) return true;\n return false;\n}\n\ninterface ParserState {\n variables: FbdVarDecl[];\n varByName: Map<string, FbdVarDecl>;\n blocks: FbdBlock[];\n blocksById: Map<string, FbdBlock>;\n wires: FbdWire[];\n networkIndex: number;\n blockCounter: number;\n /** Variables auto-declared during expression parsing (as bool by default).\n * Mirrors logic engine playbook — be lenient with LLM-generated DSL. */\n autoVars: Set<string>;\n}\n\nfunction freshBlockId(state: ParserState, baseHint?: string): string {\n state.blockCounter++;\n if (baseHint) {\n let id = baseHint;\n let n = 1;\n while (state.blocksById.has(id)) {\n id = `${baseHint}_${n++}`;\n }\n return id;\n }\n return `_blk${state.blockCounter}`;\n}\n\nfunction ensureVar(state: ParserState, name: string, dataType: FbdDataType = \"bool\"): void {\n if (state.varByName.has(name)) return;\n const decl: FbdVarDecl = { name, scope: \"local\", dataType };\n state.variables.push(decl);\n state.varByName.set(name, decl);\n state.autoVars.add(name);\n}\n\n/**\n * Parse a block call string `BLOCK(args)` and return the created block id.\n * Recursive: nested calls produce child blocks.\n *\n * @param callStr the raw `BLOCK(args)` text (no leading instance assignment)\n * @param targetInstance optional instance name to use; if undefined a synthetic id is generated.\n * @param attrs any [props] extracted from the suffix\n */\nfunction parseCall(\n state: ParserState,\n callStr: string,\n targetInstance: string | undefined,\n attrs: Map<string, string>,\n lineNo: number\n): { blockId: string; outPort: string; outType: FbdDataType } {\n // Split BLOCK and args e.g. AND(IN1: A, IN2: B)\n const m = callStr.match(/^([A-Za-z_]\\w*)\\s*\\((.*)\\)\\s*$/);\n if (!m) {\n throw new FbdParseError(`Invalid block call: ${callStr}`, lineNo, callStr);\n }\n const blockType = m[1];\n const argsRaw = m[2];\n\n if (!isStdBlock(blockType.toUpperCase())) {\n throw new FbdParseError(\n `Unknown function block: ${blockType} (v0.1 supports IEC standard blocks only)`,\n lineNo,\n callStr\n );\n }\n const upper = blockType.toUpperCase();\n const spec = getBlockSpec(upper as keyof typeof BLOCK_SPECS);\n\n const args = splitArgs(argsRaw);\n\n // Determine input count for variadic blocks\n let inputCount = spec.defaultInputs ?? 0;\n const inputsAttr = attrs.get(\"inputs\");\n if (inputsAttr) {\n inputCount = Math.max(2, parseInt(inputsAttr, 10) || 2);\n }\n // For pure variadic (AND/OR/etc.), use number of positional args if larger.\n const posArgsCount = args.filter((a) => !/^[A-Za-z_]\\w*\\s*:/.test(a)).length;\n if (spec.defaultInputs !== undefined && posArgsCount > inputCount) {\n inputCount = posArgsCount;\n }\n\n // Build expanded port list for variadic blocks\n const ports: FbdPort[] = [];\n for (const ps of spec.ports) {\n if (ps.variadic && ps.side === \"in\" && spec.defaultInputs !== undefined) {\n // Skip — we'll generate IN1..INn below for the block as a whole.\n continue;\n }\n ports.push({\n name: ps.name,\n side: ps.side,\n dataType: ps.dataType,\n });\n }\n if (spec.defaultInputs !== undefined) {\n // Generate IN1..INn at the front\n const variadicIn: FbdPort[] = [];\n const refType = spec.ports.find((p) => p.variadic && p.side === \"in\")?.dataType ?? \"bool\";\n for (let i = 1; i <= inputCount; i++) {\n variadicIn.push({ name: `IN${i}`, side: \"in\", dataType: refType });\n }\n ports.unshift(...variadicIn);\n }\n\n const blockId = targetInstance ?? freshBlockId(state);\n if (state.blocksById.has(blockId)) {\n throw new FbdParseError(`Duplicate instance name: ${blockId}`, lineNo, callStr);\n }\n const block: FbdBlock = {\n instance: targetInstance,\n blockType: upper,\n isStd: true,\n ports,\n networkIndex: state.networkIndex,\n id: blockId,\n };\n state.blocks.push(block);\n state.blocksById.set(blockId, block);\n\n // Wire each argument to its port\n // Resolve argument-to-port mapping: named first, else positional over the\n // input ports in declaration order.\n const inputPorts = ports.filter((p) => p.side === \"in\");\n const usedPorts = new Set<string>();\n\n // First pass: named\n const positional: ParsedArg[] = [];\n for (const argStr of args) {\n const a = parseArg(argStr);\n if (a.name) {\n bindArg(state, block, a, a.name, lineNo);\n usedPorts.add(a.name);\n } else {\n positional.push(a);\n }\n }\n // Second pass: positional fills remaining input ports in order\n let pi = 0;\n for (const arg of positional) {\n while (pi < inputPorts.length && usedPorts.has(inputPorts[pi].name)) pi++;\n if (pi >= inputPorts.length) {\n throw new FbdParseError(\n `Too many positional arguments for ${upper} (max ${inputPorts.length})`,\n lineNo,\n callStr\n );\n }\n bindArg(state, block, arg, inputPorts[pi].name, lineNo);\n usedPorts.add(inputPorts[pi].name);\n pi++;\n }\n\n const outPortName = spec.primaryOut ?? \"OUT\";\n const outPort = ports.find((p) => p.name === outPortName && p.side === \"out\");\n return {\n blockId,\n outPort: outPortName,\n outType: outPort?.dataType ?? \"any\",\n };\n}\n\nfunction bindArg(\n state: ParserState,\n block: FbdBlock,\n arg: ParsedArg,\n portName: string,\n lineNo: number\n): void {\n const port = block.ports.find((p) => p.name === portName && p.side === \"in\");\n if (!port) {\n throw new FbdParseError(\n `Block ${block.blockType} has no input port \"${portName}\"`,\n lineNo,\n arg.raw\n );\n }\n\n // Inline literal?\n if (isLiteral(arg.raw)) {\n port.constant = arg.raw;\n if (arg.negated) port.negated = true;\n return;\n }\n\n // Nested call?\n if (/^[A-Za-z_]\\w*\\s*\\(/.test(arg.raw)) {\n const sub = parseCall(state, arg.raw, undefined, new Map(), lineNo);\n state.wires.push({\n from: { kind: \"port\", blockId: sub.blockId, portName: sub.outPort },\n to: { kind: \"port\", blockId: block.id, portName },\n dataType: sub.outType,\n negatedAtSink: arg.negated,\n });\n return;\n }\n\n // Port reference Inst.PortName ?\n const portRef = arg.raw.match(/^([A-Za-z_]\\w*)\\.([A-Za-z_]\\w*)$/);\n if (portRef) {\n const srcId = portRef[1];\n const srcPort = portRef[2];\n if (!state.blocksById.has(srcId)) {\n throw new FbdParseError(\n `Unknown instance \"${srcId}\" referenced in ${arg.raw}`,\n lineNo,\n arg.raw\n );\n }\n const srcBlock = state.blocksById.get(srcId)!;\n const srcPortObj = srcBlock.ports.find((p) => p.name === srcPort && p.side === \"out\");\n if (!srcPortObj) {\n throw new FbdParseError(\n `Instance \"${srcId}\" (${srcBlock.blockType}) has no output port \"${srcPort}\"`,\n lineNo,\n arg.raw\n );\n }\n state.wires.push({\n from: { kind: \"port\", blockId: srcId, portName: srcPort },\n to: { kind: \"port\", blockId: block.id, portName },\n dataType: srcPortObj.dataType,\n negatedAtSink: arg.negated,\n });\n return;\n }\n\n // Plain variable reference\n const varName = arg.raw;\n if (!/^[A-Za-z_]\\w*$/.test(varName)) {\n throw new FbdParseError(`Invalid argument: ${arg.raw}`, lineNo, arg.raw);\n }\n ensureVar(state, varName, port.dataType === \"any\" ? \"bool\" : port.dataType);\n state.wires.push({\n from: { kind: \"var\", name: varName },\n to: { kind: \"port\", blockId: block.id, portName },\n dataType: state.varByName.get(varName)!.dataType as FbdDataType,\n negatedAtSink: arg.negated,\n });\n}\n\n/** Top-level parser entrypoint. */\nexport function parseFbd(text: string): FbdAst {\n const lines = tokenizeLines(text);\n if (lines.length === 0) {\n throw new FbdParseError(\"Empty FBD program\");\n }\n const headLine = lines[0];\n if (!/^fbd\\b/i.test(headLine.text)) {\n throw new FbdParseError(`First non-comment line must start with \"fbd\" (got: ${headLine.text})`, headLine.lineNo);\n }\n const title = matchQuotedTitle(headLine.text);\n\n const state: ParserState = {\n variables: [],\n varByName: new Map(),\n blocks: [],\n blocksById: new Map(),\n wires: [],\n networkIndex: 0,\n blockCounter: 0,\n autoVars: new Set(),\n };\n\n const networks: FbdNetwork[] = [];\n\n let i = 1;\n let nextNetworkIndex = 0;\n\n // Parse declarations (variables) until we hit a `network` line\n while (i < lines.length) {\n const ln = lines[i];\n if (/^network\\b/i.test(ln.text)) break;\n const decl = parseVarDecl(ln);\n if (decl) {\n if (state.varByName.has(decl.name)) {\n throw new FbdParseError(`Duplicate variable: ${decl.name}`, ln.lineNo, ln.text);\n }\n state.variables.push(decl);\n state.varByName.set(decl.name, decl);\n i++;\n continue;\n }\n throw new FbdParseError(`Unrecognized line at top level: ${ln.text}`, ln.lineNo, ln.text);\n }\n\n // Parse networks\n while (i < lines.length) {\n const head = lines[i];\n const nh = parseNetworkHeader(head);\n if (!nh) {\n throw new FbdParseError(`Expected \"network ...:\" (got: ${head.text})`, head.lineNo, head.text);\n }\n i++;\n const idx = nh.index === -1 ? nextNetworkIndex : nh.index;\n nextNetworkIndex = idx + 1;\n state.networkIndex = idx;\n\n // Snapshot current block/wire pointers so we can collect this network's\n const blocksBefore = state.blocks.length;\n const wiresBefore = state.wires.length;\n\n // Read indented body\n while (i < lines.length && lines[i].indent > head.indent) {\n const stmt = lines[i];\n parseStatement(state, stmt);\n i++;\n }\n const network: FbdNetwork = {\n index: idx,\n blocks: state.blocks.slice(blocksBefore),\n wires: state.wires.slice(wiresBefore),\n };\n if (nh.title !== undefined) network.title = nh.title;\n networks.push(network);\n }\n\n // Final pass: any block whose instance/output id matches a declared variable\n // wires from outPort to that variable.\n for (const block of state.blocks) {\n if (!block.instance) continue;\n const v = state.varByName.get(block.instance);\n if (!v) continue;\n const spec = getBlockSpec(block.blockType as keyof typeof BLOCK_SPECS);\n const outPort = spec?.primaryOut ?? \"OUT\";\n const out = block.ports.find((p) => p.name === outPort && p.side === \"out\");\n if (!out) continue;\n state.wires.push({\n from: { kind: \"port\", blockId: block.id, portName: outPort },\n to: { kind: \"var\", name: block.instance },\n dataType: out.dataType,\n });\n // Add to the network's wire list too.\n const net = networks.find((n) => n.index === block.networkIndex);\n if (net) {\n net.wires.push(state.wires[state.wires.length - 1]);\n }\n }\n\n const ast: FbdAst = {\n type: \"fbd\",\n variables: state.variables,\n networks,\n };\n if (title !== undefined) ast.title = title;\n return ast;\n}\n\nfunction parseStatement(state: ParserState, line: RawLine): void {\n const text = line.text;\n // Form A: Inst = BLOCK(args) [props]\n const m = text.match(/^([A-Za-z_]\\w*)\\s*=\\s*([A-Za-z_]\\w*\\s*\\(.*\\))\\s*(\\[[^\\]]*\\])?\\s*$/);\n if (m) {\n const lhs = m[1];\n const callStr = m[2];\n const propsRaw = m[3];\n const attrs = parseAttrs(propsRaw, line);\n parseCall(state, callStr, lhs, attrs, line.lineNo);\n return;\n }\n // Form B: bare BLOCK(args) (rare; instance auto-named)\n const mB = text.match(/^([A-Za-z_]\\w*\\s*\\(.*\\))\\s*(\\[[^\\]]*\\])?\\s*$/);\n if (mB) {\n const callStr = mB[1];\n const propsRaw = mB[2];\n const attrs = parseAttrs(propsRaw, line);\n parseCall(state, callStr, undefined, attrs, line.lineNo);\n return;\n }\n throw new FbdParseError(`Unrecognized network statement: ${text}`, line.lineNo, text);\n}\n\nfunction parseAttrs(raw: string | undefined, line: RawLine): Map<string, string> {\n const out = new Map<string, string>();\n if (!raw) return out;\n const inner = stripBrackets(raw);\n for (const part of inner.split(\",\")) {\n const t = part.trim();\n if (!t) continue;\n const colon = t.indexOf(\":\");\n if (colon < 0) {\n out.set(t.toLowerCase(), \"true\");\n } else {\n const key = t.slice(0, colon).trim().toLowerCase();\n const val = t.slice(colon + 1).trim().replace(/^\"|\"$/g, \"\");\n out.set(key, val);\n }\n }\n void line;\n return out;\n}\n","/**\n * FBD layout — layered DAG with named ports.\n *\n * Per network:\n * 1. Build dependency graph from wires (block → block edges).\n * 2. Longest-path layering (sources at layer 0).\n * 3. Compute each block's bbox from port count.\n * 4. Within-layer y-packing.\n * 5. Place input variable terminals on the left of layer 0; output variable\n * terminals on the right of the last layer.\n * 6. Manhattan-route each wire from src port to sink port.\n *\n * Networks stack vertically with NETWORK_GAP_Y.\n */\n\nimport type {\n FbdAst,\n FbdBlock,\n FbdLayoutBlock,\n FbdLayoutNetwork,\n FbdLayoutPort,\n FbdLayoutResult,\n FbdLayoutVarTerm,\n FbdLayoutWire,\n FbdNetwork,\n FbdPort,\n FbdWire,\n} from \"../../core/types\";\nimport { getBlockSpec, isStdBlock } from \"./blocks\";\n\nexport const FBD_CONST = {\n block_min_width: 64,\n block_min_height: 40,\n port_pitch: 18,\n port_stub_length: 12,\n block_padding_x: 8,\n block_padding_y: 6,\n block_header_h: 18,\n network_gap_y: 36,\n network_padding_x: 16,\n network_padding_y: 24,\n layer_spacing: 80,\n inter_block_gap: 20,\n wire_grid: 10,\n negation_bubble_r: 4,\n var_term_w: 90,\n var_term_h: 22,\n var_term_gap: 60,\n network_label_h: 18,\n};\n\nconst FONT_W_HEAD = 7.5; // monospace bold approx 12px\nconst FONT_W_PORT = 6.2; // monospace 10px\n\nfunction computeBlockSize(block: FbdBlock): { w: number; h: number } {\n const inputs = block.ports.filter((p) => p.side === \"in\");\n const outputs = block.ports.filter((p) => p.side === \"out\");\n const maxPorts = Math.max(inputs.length, outputs.length, 1);\n\n const headerText = block.blockType;\n const innerSym = isStdBlock(block.blockType) ? getBlockSpec(block.blockType).innerSymbol : undefined;\n const symW = innerSym ? Math.max(20, innerSym.length * 8) : 0;\n\n const leftLabelW = inputs.reduce((m, p) => Math.max(m, p.name.length * FONT_W_PORT), 0);\n const rightLabelW = outputs.reduce((m, p) => Math.max(m, p.name.length * FONT_W_PORT), 0);\n const headerW = headerText.length * FONT_W_HEAD;\n\n const width = Math.max(\n FBD_CONST.block_min_width,\n leftLabelW + rightLabelW + symW + 24,\n headerW + 16\n );\n const height = Math.max(\n FBD_CONST.block_min_height,\n FBD_CONST.block_header_h + maxPorts * FBD_CONST.port_pitch + FBD_CONST.block_padding_y\n );\n return { w: width, h: height };\n}\n\nfunction buildPorts(block: FbdBlock, x: number, y: number, w: number): FbdLayoutPort[] {\n const inputs = block.ports.filter((p) => p.side === \"in\");\n const outputs = block.ports.filter((p) => p.side === \"out\");\n const portsOut: FbdLayoutPort[] = [];\n inputs.forEach((p, i) => {\n const py = y + FBD_CONST.block_header_h + (i + 0.5) * FBD_CONST.port_pitch;\n portsOut.push(makePort(p, \"left\", x, x - FBD_CONST.port_stub_length, py));\n });\n outputs.forEach((p, i) => {\n const py = y + FBD_CONST.block_header_h + (i + 0.5) * FBD_CONST.port_pitch;\n const ex = x + w;\n portsOut.push(makePort(p, \"right\", ex, ex + FBD_CONST.port_stub_length, py));\n });\n return portsOut;\n}\n\nfunction makePort(p: FbdPort, side: \"left\" | \"right\", edgeX: number, x: number, y: number): FbdLayoutPort {\n const port: FbdLayoutPort = {\n name: p.name,\n side: side === \"left\" ? \"in\" : \"out\",\n x,\n y,\n edgeX,\n dataType: p.dataType,\n };\n if (p.constant !== undefined) port.constant = p.constant;\n if (p.negated) port.negated = true;\n return port;\n}\n\ninterface NetworkGraph {\n /** block id → set of block ids this block depends on (incoming). */\n incoming: Map<string, Set<string>>;\n outgoing: Map<string, Set<string>>;\n /** variable references the block needs as input (left terminals). */\n inputVars: Map<string, Set<string>>; // blockId -> var names\n /** variables the block emits to (right terminals). */\n outputVars: Map<string, Set<string>>; // blockId -> var names\n}\n\nfunction buildGraph(network: FbdNetwork): NetworkGraph {\n const incoming = new Map<string, Set<string>>();\n const outgoing = new Map<string, Set<string>>();\n const inputVars = new Map<string, Set<string>>();\n const outputVars = new Map<string, Set<string>>();\n for (const b of network.blocks) {\n incoming.set(b.id, new Set());\n outgoing.set(b.id, new Set());\n inputVars.set(b.id, new Set());\n outputVars.set(b.id, new Set());\n }\n for (const w of network.wires) {\n if (w.from.kind === \"port\" && w.to.kind === \"port\") {\n incoming.get(w.to.blockId)?.add(w.from.blockId);\n outgoing.get(w.from.blockId)?.add(w.to.blockId);\n } else if (w.from.kind === \"var\" && w.to.kind === \"port\") {\n inputVars.get(w.to.blockId)?.add(w.from.name);\n } else if (w.from.kind === \"port\" && w.to.kind === \"var\") {\n outputVars.get(w.from.blockId)?.add(w.to.name);\n }\n }\n return { incoming, outgoing, inputVars, outputVars };\n}\n\n/** Longest-path layering. Returns blockId -> layer. */\nfunction assignLayers(network: FbdNetwork, graph: NetworkGraph): Map<string, number> {\n const layer = new Map<string, number>();\n const visited = new Set<string>();\n const visiting = new Set<string>();\n\n const visit = (id: string): number => {\n if (layer.has(id)) return layer.get(id)!;\n if (visiting.has(id)) {\n // cycle — break by treating as layer 0\n return 0;\n }\n visiting.add(id);\n let max = 0;\n for (const dep of graph.incoming.get(id) ?? []) {\n max = Math.max(max, visit(dep) + 1);\n }\n visiting.delete(id);\n layer.set(id, max);\n return max;\n };\n\n for (const b of network.blocks) visit(b.id);\n void visited;\n return layer;\n}\n\nfunction layoutNetwork(network: FbdNetwork, originX: number, originY: number): FbdLayoutNetwork {\n const graph = buildGraph(network);\n\n // Compute sizes\n const sizes = new Map<string, { w: number; h: number }>();\n for (const b of network.blocks) sizes.set(b.id, computeBlockSize(b));\n\n // Layering\n const layerOf = assignLayers(network, graph);\n const maxLayer = Math.max(0, ...Array.from(layerOf.values()));\n\n // Group blocks per layer in declaration order\n const byLayer: string[][] = Array.from({ length: maxLayer + 1 }, () => []);\n for (const b of network.blocks) byLayer[layerOf.get(b.id)!].push(b.id);\n\n // Identify input + output variable terminals that need columns\n const inputVarsAll = new Set<string>();\n const outputVarsAll = new Set<string>();\n for (const b of network.blocks) {\n for (const v of graph.inputVars.get(b.id) ?? []) inputVarsAll.add(v);\n for (const v of graph.outputVars.get(b.id) ?? []) outputVarsAll.add(v);\n }\n const inputVars = Array.from(inputVarsAll);\n const outputVars = Array.from(outputVarsAll);\n\n // X positions: pre-layer var-term column, then per-layer columns, then output-var column.\n const layerX: number[] = [];\n let cursorX = originX + FBD_CONST.network_padding_x;\n if (inputVars.length > 0) {\n cursorX += FBD_CONST.var_term_w + FBD_CONST.var_term_gap;\n } else {\n cursorX += FBD_CONST.var_term_gap;\n }\n // Compute max block width per layer\n const layerWidths: number[] = byLayer.map((ids) =>\n ids.reduce((m, id) => Math.max(m, sizes.get(id)!.w), FBD_CONST.block_min_width)\n );\n for (let l = 0; l <= maxLayer; l++) {\n layerX.push(cursorX);\n cursorX += layerWidths[l] + FBD_CONST.layer_spacing;\n }\n\n // Y positions: per-layer pack from top\n const blockBboxes = new Map<string, { x: number; y: number; w: number; h: number }>();\n let yMax = 0;\n for (let l = 0; l <= maxLayer; l++) {\n let y = originY + FBD_CONST.network_padding_y + FBD_CONST.network_label_h;\n for (const id of byLayer[l]) {\n const sz = sizes.get(id)!;\n const x = layerX[l];\n blockBboxes.set(id, { x, y, w: sz.w, h: sz.h });\n y += sz.h + FBD_CONST.inter_block_gap;\n }\n yMax = Math.max(yMax, y);\n }\n\n // Build layout blocks + ports\n const layoutBlocks: FbdLayoutBlock[] = [];\n for (const b of network.blocks) {\n const bb = blockBboxes.get(b.id)!;\n layoutBlocks.push({\n block: b,\n x: bb.x,\n y: bb.y,\n width: bb.w,\n height: bb.h,\n ports: buildPorts(b, bb.x, bb.y, bb.w),\n });\n }\n\n // Place variable terminals\n const varTerms: FbdLayoutVarTerm[] = [];\n if (inputVars.length > 0) {\n const xCol = originX + FBD_CONST.network_padding_x;\n const startY = originY + FBD_CONST.network_padding_y + FBD_CONST.network_label_h + 4;\n inputVars.forEach((v, idx) => {\n varTerms.push({\n name: v,\n x: xCol,\n y: startY + idx * (FBD_CONST.var_term_h + 6),\n width: FBD_CONST.var_term_w,\n height: FBD_CONST.var_term_h,\n side: \"left\",\n dataType: \"bool\",\n });\n });\n }\n if (outputVars.length > 0) {\n const xCol = layerX[maxLayer] + layerWidths[maxLayer] + FBD_CONST.var_term_gap;\n const startY = originY + FBD_CONST.network_padding_y + FBD_CONST.network_label_h + 4;\n outputVars.forEach((v, idx) => {\n varTerms.push({\n name: v,\n x: xCol,\n y: startY + idx * (FBD_CONST.var_term_h + 6),\n width: FBD_CONST.var_term_w,\n height: FBD_CONST.var_term_h,\n side: \"right\",\n dataType: \"bool\",\n });\n });\n cursorX = xCol + FBD_CONST.var_term_w + FBD_CONST.network_padding_x;\n } else {\n cursorX = layerX[maxLayer] + layerWidths[maxLayer] + FBD_CONST.network_padding_x;\n }\n\n // Wires\n const wires: FbdLayoutWire[] = [];\n const junctions: { x: number; y: number }[] = [];\n // Track fan-out points to render junction circles\n const fanOutCounts = new Map<string, number>();\n for (const w of network.wires) {\n if (w.from.kind === \"port\") {\n const key = `${w.from.blockId}.${w.from.portName}`;\n fanOutCounts.set(key, (fanOutCounts.get(key) ?? 0) + 1);\n } else if (w.from.kind === \"var\") {\n const key = `var:${w.from.name}`;\n fanOutCounts.set(key, (fanOutCounts.get(key) ?? 0) + 1);\n }\n }\n\n const portByKey = new Map<string, FbdLayoutPort>();\n for (const lb of layoutBlocks) {\n for (const p of lb.ports) {\n portByKey.set(`${lb.block.id}.${p.name}`, p);\n }\n }\n const varTermByName = new Map<string, FbdLayoutVarTerm>();\n for (const t of varTerms) varTermByName.set(t.name, t);\n\n // Track per-layer column-x cursors so parallel wires don't overlap\n const colCursor: Map<number, number> = new Map();\n\n for (const w of network.wires) {\n const path = routeWire(w, portByKey, varTermByName, colCursor, layerX, layerWidths);\n if (path) {\n wires.push({ wire: w, path });\n }\n }\n\n // Junctions at fan-out source points\n for (const [key, count] of fanOutCounts) {\n if (count < 2) continue;\n if (key.startsWith(\"var:\")) {\n const name = key.slice(4);\n const t = varTermByName.get(name);\n if (t && t.side === \"left\") {\n junctions.push({ x: t.x + t.width, y: t.y + t.height / 2 });\n }\n } else {\n const p = portByKey.get(key);\n if (p) junctions.push({ x: p.x, y: p.y });\n }\n }\n\n const width = cursorX - originX;\n const height = Math.max(\n yMax - originY + FBD_CONST.network_padding_y,\n FBD_CONST.block_min_height + FBD_CONST.network_label_h + FBD_CONST.network_padding_y * 2\n );\n\n return {\n network,\n x: originX,\n y: originY,\n width,\n height,\n blocks: layoutBlocks,\n wires,\n varTerms,\n junctions,\n };\n}\n\nfunction routeWire(\n w: FbdWire,\n portByKey: Map<string, FbdLayoutPort>,\n varTermByName: Map<string, FbdLayoutVarTerm>,\n colCursor: Map<number, number>,\n layerX: number[],\n layerWidths: number[]\n): string | undefined {\n let sx = 0, sy = 0, ex = 0, ey = 0;\n\n if (w.from.kind === \"port\") {\n const p = portByKey.get(`${w.from.blockId}.${w.from.portName}`);\n if (!p) return undefined;\n sx = p.x;\n sy = p.y;\n } else {\n const t = varTermByName.get(w.from.name);\n if (!t) return undefined;\n sx = t.x + t.width;\n sy = t.y + t.height / 2;\n }\n\n if (w.to.kind === \"port\") {\n const p = portByKey.get(`${w.to.blockId}.${w.to.portName}`);\n if (!p) return undefined;\n ex = p.x;\n ey = p.y;\n } else {\n const t = varTermByName.get(w.to.name);\n if (!t) return undefined;\n ex = t.x;\n ey = t.y + t.height / 2;\n }\n\n // Manhattan with one mid column\n const midX = sx + (ex - sx) / 2;\n // Find layer index between source and sink for column offset\n let layerIdx = -1;\n for (let i = 0; i < layerX.length - 1; i++) {\n const between = layerX[i] + layerWidths[i];\n const next = layerX[i + 1];\n if (sx >= between - 1 && ex <= next + 1) {\n layerIdx = i;\n break;\n }\n }\n let column = midX;\n if (layerIdx >= 0) {\n const offset = colCursor.get(layerIdx) ?? 0;\n column = layerX[layerIdx] + layerWidths[layerIdx] + 16 + offset;\n colCursor.set(layerIdx, offset + FBD_CONST.wire_grid);\n }\n\n if (Math.abs(sy - ey) < 0.5) {\n return `M ${sx} ${sy} L ${ex} ${ey}`;\n }\n return `M ${sx} ${sy} L ${column} ${sy} L ${column} ${ey} L ${ex} ${ey}`;\n}\n\nexport function layoutFbd(ast: FbdAst): FbdLayoutResult {\n const networks: FbdLayoutNetwork[] = [];\n let cursorY = 0;\n let maxWidth = 0;\n for (const net of ast.networks) {\n const ln = layoutNetwork(net, 0, cursorY);\n networks.push(ln);\n cursorY = ln.y + ln.height + FBD_CONST.network_gap_y;\n maxWidth = Math.max(maxWidth, ln.width);\n }\n // Normalize all networks to share the max width (so frames line up)\n for (const n of networks) n.width = maxWidth;\n return {\n ast,\n networks,\n width: maxWidth,\n height: cursorY,\n };\n}\n","/**\n * FBD renderer — Function Block Diagram SVG output.\n * IEC 61131-3 §6.4 visual conventions; see 23-FBD-STANDARD.md.\n */\n\nimport type { FbdAst, FbdDataType, FbdLayoutBlock, FbdLayoutNetwork, FbdLayoutResult } from \"../../core/types\";\nimport { defs, el, group, line, path, rect, svgRoot, text, title, desc, circle, escapeXml } from \"../../core/svg\";\nimport { parseFbd } from \"./parser\";\nimport { layoutFbd, FBD_CONST } from \"./layout\";\nimport { isStdBlock, getBlockSpec } from \"./blocks\";\n\nconst STYLES = `\n.lt-fbd-bg { fill: #ffffff; }\n.lt-fbd-block-body { fill: #ffffff; stroke: #333; stroke-width: 1.5; }\n.lt-fbd-block-header { fill: #f0f0f0; stroke: #333; stroke-width: 1.5; }\n.lt-fbd-block-name { font-family: ui-monospace, \"SFMono-Regular\", Menlo, Consolas, monospace; font-size: 12px; font-weight: 700; fill: #111; }\n.lt-fbd-inner-symbol { font-family: ui-monospace, \"SFMono-Regular\", Menlo, Consolas, monospace; font-size: 18px; font-weight: 700; fill: #111; }\n.lt-fbd-instance-tag { font-family: ui-monospace, \"SFMono-Regular\", Menlo, Consolas, monospace; font-style: italic; font-size: 10px; fill: #555; }\n.lt-fbd-port-label { font-family: ui-monospace, \"SFMono-Regular\", Menlo, Consolas, monospace; font-size: 10px; fill: #333; }\n.lt-fbd-const-box { fill: #fffde7; stroke: #c9b14b; stroke-width: 1; }\n.lt-fbd-const-text { font-family: ui-monospace, \"SFMono-Regular\", Menlo, Consolas, monospace; font-size: 10px; fill: #5a4a00; }\n.lt-fbd-var-term { fill: #eef4ff; stroke: #3a5fbf; stroke-width: 1.2; }\n.lt-fbd-var-term-text { font-family: ui-monospace, \"SFMono-Regular\", Menlo, Consolas, monospace; font-size: 11px; font-weight: 600; fill: #1a3380; }\n.lt-fbd-wire-bool { stroke: #000; stroke-width: 1.5; fill: none; }\n.lt-fbd-wire-int { stroke: #1976d2; stroke-width: 1.5; fill: none; }\n.lt-fbd-wire-real { stroke: #f57c00; stroke-width: 1.5; fill: none; }\n.lt-fbd-wire-time { stroke: #c2185b; stroke-width: 1.5; fill: none; }\n.lt-fbd-wire-string { stroke: #2e7d32; stroke-width: 1.5; fill: none; }\n.lt-fbd-wire-bits { stroke: #000; stroke-width: 1.5; stroke-dasharray: 5 3; fill: none; }\n.lt-fbd-wire-any { stroke: #555; stroke-width: 1.5; fill: none; }\n.lt-fbd-junction { fill: #000; }\n.lt-fbd-negation { fill: #fff; stroke: #333; stroke-width: 1; }\n.lt-fbd-port-stub { stroke: #333; stroke-width: 1.2; fill: none; }\n.lt-fbd-network-frame { fill: none; stroke: #bbb; stroke-dasharray: 4 3; }\n.lt-fbd-network-title { font-family: ui-monospace, \"SFMono-Regular\", Menlo, Consolas, monospace; font-size: 11px; fill: #555; }\n.lt-fbd-title { font-family: ui-monospace, \"SFMono-Regular\", Menlo, Consolas, monospace; font-size: 14px; font-weight: 700; fill: #111; }\n`;\n\nfunction wireClass(t: FbdDataType): string {\n switch (t) {\n case \"bool\": return \"lt-fbd-wire-bool\";\n case \"int\":\n case \"dint\":\n case \"uint\":\n case \"udint\": return \"lt-fbd-wire-int\";\n case \"real\":\n case \"lreal\": return \"lt-fbd-wire-real\";\n case \"time\":\n case \"date\":\n case \"tod\": return \"lt-fbd-wire-time\";\n case \"string\":\n case \"wstring\": return \"lt-fbd-wire-string\";\n case \"byte\":\n case \"word\":\n case \"dword\": return \"lt-fbd-wire-bits\";\n default: return \"lt-fbd-wire-any\";\n }\n}\n\nfunction renderBlock(lb: FbdLayoutBlock): string {\n const { x, y, width, height, block } = lb;\n const headerH = FBD_CONST.block_header_h;\n const parts: string[] = [];\n\n // Body\n parts.push(rect({ class: \"lt-fbd-block-body\", x, y, width, height, rx: 2, ry: 2 }));\n // Header bar\n parts.push(rect({ class: \"lt-fbd-block-header\", x, y, width, height: headerH }));\n // Header label\n parts.push(text(\n { class: \"lt-fbd-block-name\", x: x + width / 2, y: y + headerH * 0.7, \"text-anchor\": \"middle\" },\n block.blockType\n ));\n\n // Instance tag (italic above header)\n if (block.instance && block.instance !== block.id) {\n parts.push(text(\n { class: \"lt-fbd-instance-tag\", x: x + width / 2, y: y - 4, \"text-anchor\": \"middle\" },\n block.instance\n ));\n }\n\n // Inner IEC symbol\n if (isStdBlock(block.blockType)) {\n const spec = getBlockSpec(block.blockType);\n if (spec.innerSymbol) {\n parts.push(text(\n { class: \"lt-fbd-inner-symbol\", x: x + width / 2, y: y + headerH + (height - headerH) / 2 + 4, \"text-anchor\": \"middle\" },\n spec.innerSymbol\n ));\n }\n }\n\n // Ports\n for (const p of lb.ports) {\n // Port stub line\n parts.push(line({\n class: \"lt-fbd-port-stub\",\n x1: p.edgeX, y1: p.y,\n x2: p.x, y2: p.y,\n }));\n // Port label inside the block\n if (p.side === \"in\") {\n parts.push(text(\n { class: \"lt-fbd-port-label\", x: p.edgeX + 4, y: p.y + 3 },\n p.name\n ));\n } else {\n parts.push(text(\n { class: \"lt-fbd-port-label\", x: p.edgeX - 4, y: p.y + 3, \"text-anchor\": \"end\" },\n p.name\n ));\n }\n // Negation bubble at port outer end\n if (p.negated) {\n const cx = p.side === \"in\" ? p.x - FBD_CONST.negation_bubble_r : p.x + FBD_CONST.negation_bubble_r;\n parts.push(circle({ class: \"lt-fbd-negation\", cx, cy: p.y, r: FBD_CONST.negation_bubble_r }));\n }\n // Inline constant box\n if (p.constant !== undefined) {\n const tw = Math.max(28, p.constant.length * 6 + 8);\n const bx = p.x - tw - 2;\n const by = p.y - 8;\n parts.push(rect({ class: \"lt-fbd-const-box\", x: bx, y: by, width: tw, height: 14, rx: 2, ry: 2 }));\n parts.push(text(\n { class: \"lt-fbd-const-text\", x: bx + tw / 2, y: by + 10, \"text-anchor\": \"middle\" },\n p.constant\n ));\n }\n }\n\n // Output negation (overall) — IEC NAND/NOR/NOT/XNOR\n if (isStdBlock(block.blockType)) {\n const spec = getBlockSpec(block.blockType);\n if (spec.outputNegated) {\n const outPort = lb.ports.find((p) => p.side === \"out\");\n if (outPort) {\n parts.push(circle({\n class: \"lt-fbd-negation\",\n cx: outPort.edgeX + FBD_CONST.negation_bubble_r,\n cy: outPort.y,\n r: FBD_CONST.negation_bubble_r,\n }));\n }\n }\n }\n\n return group(\n {\n class: \"lt-fbd-block\",\n \"data-block-type\": block.blockType,\n \"data-instance\": block.instance ?? \"\",\n },\n parts\n );\n}\n\nfunction renderNetwork(ln: FbdLayoutNetwork): string {\n const parts: string[] = [];\n // Frame\n parts.push(rect({\n class: \"lt-fbd-network-frame\",\n x: ln.x + 4, y: ln.y + 4,\n width: ln.width - 8,\n height: ln.height - 8,\n rx: 4, ry: 4,\n }));\n // Title\n const titleText = ln.network.title\n ? `${ln.network.index} — ${ln.network.title}`\n : `network ${ln.network.index}`;\n parts.push(text(\n { class: \"lt-fbd-network-title\", x: ln.x + 12, y: ln.y + 16 },\n titleText\n ));\n\n // Variable terminals\n for (const t of ln.varTerms) {\n parts.push(rect({\n class: \"lt-fbd-var-term\",\n x: t.x, y: t.y, width: t.width, height: t.height, rx: 3, ry: 3,\n }));\n parts.push(text(\n { class: \"lt-fbd-var-term-text\", x: t.x + t.width / 2, y: t.y + t.height / 2 + 4, \"text-anchor\": \"middle\" },\n t.name\n ));\n }\n\n // Wires\n for (const wl of ln.wires) {\n parts.push(path({\n class: wireClass(wl.wire.dataType),\n d: wl.path,\n \"data-wire-type\": wl.wire.dataType,\n }));\n if (wl.wire.negatedAtSink) {\n // Find sink point — last point of path\n const m = wl.path.match(/L\\s+([\\d.-]+)\\s+([\\d.-]+)\\s*$/);\n if (m) {\n const sx = parseFloat(m[1]);\n const sy = parseFloat(m[2]);\n parts.push(circle({\n class: \"lt-fbd-negation\",\n cx: sx - FBD_CONST.negation_bubble_r,\n cy: sy,\n r: FBD_CONST.negation_bubble_r,\n }));\n }\n }\n }\n\n // Junctions\n for (const j of ln.junctions) {\n parts.push(circle({ class: \"lt-fbd-junction\", cx: j.x, cy: j.y, r: 3 }));\n }\n\n // Blocks (drawn after wires so they sit on top)\n for (const b of ln.blocks) parts.push(renderBlock(b));\n\n return group({ class: \"lt-fbd-network\", \"data-network\": ln.network.index }, parts);\n}\n\nexport function renderFbdLayout(layout: FbdLayoutResult): string {\n const margin = 24;\n const w = layout.width + margin * 2 + 16;\n const h = layout.height + margin * 2;\n const styleBlock = el(\"style\", {}, escapeXml(STYLES).replace(/"/g, '\"'));\n const titleEl = title(`FBD: ${layout.ast.title ?? \"Function Block Diagram\"}`);\n const descEl = desc(`FBD with ${layout.networks.length} network(s).`);\n const root = group(\n { transform: `translate(${margin},${margin})` },\n layout.networks.map(renderNetwork)\n );\n\n return svgRoot(\n {\n width: w,\n height: h,\n viewBox: `0 0 ${w} ${h}`,\n class: \"lt-fbd\",\n \"data-diagram-type\": \"fbd\",\n },\n [\n defs([styleBlock]),\n titleEl,\n descEl,\n rect({ class: \"lt-fbd-bg\", x: 0, y: 0, width: w, height: h }),\n root,\n ]\n );\n}\n\nexport function renderFbd(text: string): string {\n const ast: FbdAst = parseFbd(text);\n const layout = layoutFbd(ast);\n return renderFbdLayout(layout);\n}\n","import type { DiagramPlugin } from \"../../core/types\";\nimport { parseFbd } from \"./parser\";\nimport { renderFbd } from \"./renderer\";\n\nexport const fbd: DiagramPlugin = {\n type: \"fbd\",\n detect(text: string): boolean {\n const first = text.trim().split(\"\\n\")[0]?.trim().toLowerCase() ?? \"\";\n return first.startsWith(\"fbd\");\n },\n parse: parseFbd,\n render(text: string): string {\n return renderFbd(text);\n },\n};\n\nexport { parseFbd } from \"./parser\";\nexport { renderFbd, renderFbdLayout } from \"./renderer\";\nexport { layoutFbd } from \"./layout\";\n","/**\n * SFC parser — IEC 61131-3 §6.5.\n *\n * Indent-sensitive grammar for steps, transitions, and branch blocks\n * (`alt`/`sim`). Conditions are stored as opaque strings.\n *\n * v0.1 scope: linear sequences, alt, sim, jumps, action qualifiers\n * (N/S/R/L/D/P/P0/P1/SD/DS/SL). Defers nested-of-nested branches and the\n * full ST condition parser; condition text passes through verbatim.\n */\n\nimport type {\n SfcAltBranch,\n SfcAst,\n SfcAction,\n SfcActionQualifier,\n SfcNode,\n SfcSimBranch,\n SfcStep,\n SfcStepKind,\n SfcTransition,\n SfcVarDecl,\n SfcVarType,\n} from \"../../core/types\";\nimport { matchQuotedTitle } from \"../../core/quotes\";\n\nexport class SfcParseError extends Error {\n line?: number;\n source?: string;\n constructor(message: string, line?: number, source?: string) {\n super(message);\n this.name = \"SfcParseError\";\n if (line !== undefined) this.line = line;\n if (source !== undefined) this.source = source;\n }\n}\n\nconst QUALIFIERS: SfcActionQualifier[] = [\n \"N\", \"S\", \"R\", \"L\", \"D\", \"P\", \"P0\", \"P1\", \"SD\", \"DS\", \"SL\",\n];\n\nconst PRIM_TYPES = new Set([\"bool\", \"int\", \"real\", \"time\", \"timer\", \"counter\"]);\n\ninterface RawLine {\n text: string;\n indent: number;\n lineNo: number;\n}\n\nfunction tokenizeLines(text: string): RawLine[] {\n const out: RawLine[] = [];\n const lines = text.split(\"\\n\");\n for (let i = 0; i < lines.length; i++) {\n const raw = lines[i].replace(/\\r$/, \"\");\n // Strip `#` line comment but keep `#` inside time literals (T#...) and strings.\n let stripped = \"\";\n let inStr = false;\n for (let j = 0; j < raw.length; j++) {\n const ch = raw[j];\n if (ch === '\"') inStr = !inStr;\n if (!inStr && ch === \"#\") {\n const prev = raw[j - 1];\n // Treat as comment only when preceded by whitespace or at line start.\n if (prev === undefined || /\\s/.test(prev)) break;\n }\n stripped += ch;\n }\n if (!stripped.trim()) continue;\n let indent = 0;\n while (indent < stripped.length && (stripped[indent] === \" \" || stripped[indent] === \"\\t\")) {\n indent += stripped[indent] === \"\\t\" ? 4 : 1;\n }\n out.push({ text: stripped.trim(), indent, lineNo: i + 1 });\n }\n return out;\n}\n\nfunction parseVarDecl(line: RawLine): SfcVarDecl | null {\n const m = line.text.match(/^var\\s+([a-zA-Z_]\\w*)\\s*:\\s*([a-zA-Z_]\\w*)\\s*(?:=\\s*(.+))?$/i);\n if (!m) return null;\n const dt = m[2].toLowerCase();\n const decl: SfcVarDecl = {\n name: m[1],\n dataType: PRIM_TYPES.has(dt) ? (dt as SfcVarType) : m[2],\n };\n if (m[3] !== undefined) decl.initValue = m[3].trim();\n return decl;\n}\n\ninterface ParseState {\n variables: SfcVarDecl[];\n steps: Map<string, SfcStep>;\n transitions: SfcTransition[];\n body: SfcNode[];\n /** Line cursor. */\n lines: RawLine[];\n i: number;\n /** Track first-declared step (becomes the initial step's id if none has [initial]). */\n initialId?: string;\n /** Auto-generated transition ids when not specified. */\n transitionCounter: number;\n}\n\nfunction parseStepHead(line: RawLine): { id: string; kind: SfcStepKind; label?: string } | null {\n const m = line.text.match(/^step\\s+([a-zA-Z_]\\w*)\\s*(\\[[^\\]]*\\])?\\s*$/);\n if (!m) return null;\n const attrs = parseAttrs(m[2]);\n let kind: SfcStepKind = \"normal\";\n if (attrs.has(\"initial\")) kind = \"initial\";\n else if (attrs.has(\"final\")) kind = \"final\";\n const result: { id: string; kind: SfcStepKind; label?: string } = { id: m[1], kind };\n const label = attrs.get(\"label\");\n if (label) result.label = label;\n return result;\n}\n\nfunction parseAttrs(raw: string | undefined): Map<string, string> {\n const out = new Map<string, string>();\n if (!raw) return out;\n const inner = raw.replace(/^\\[|\\]$/g, \"\").trim();\n for (const part of inner.split(\",\")) {\n const t = part.trim();\n if (!t) continue;\n const colon = t.indexOf(\":\");\n if (colon < 0) {\n out.set(t.toLowerCase(), \"true\");\n } else {\n const k = t.slice(0, colon).trim().toLowerCase();\n const v = t.slice(colon + 1).trim().replace(/^\"|\"$/g, \"\");\n out.set(k, v);\n }\n }\n return out;\n}\n\nfunction parseAction(line: RawLine): SfcAction | null {\n // Format: QUAL ActionBody [TIME_LIT]\n // Examples: N FillValve_Open\n // D Mixer_Run T#10s\n // S \"ST inline assignment := 5\"\n const m = line.text.match(/^(N|S|R|L|D|P|P0|P1|SD|DS|SL)\\s+(.+)$/);\n if (!m) return null;\n const qual = m[1] as SfcActionQualifier;\n if (!QUALIFIERS.includes(qual)) return null;\n let body = m[2].trim();\n let time: string | undefined;\n // Trailing T#... ?\n const tm = body.match(/^(.+?)\\s+(T#[0-9]+(?:ms|s|m|h)(?:[0-9]+(?:ms|s|m|h))*)$/i);\n if (tm) {\n body = tm[1].trim();\n time = tm[2];\n }\n // Quoted body\n if (body.startsWith('\"') && body.endsWith('\"')) {\n body = body.slice(1, -1);\n }\n const action: SfcAction = { qualifier: qual, body };\n if (time !== undefined) action.time = time;\n return action;\n}\n\nfunction expectStep(state: ParseState, indent: number): SfcStep | null {\n if (state.i >= state.lines.length) return null;\n const ln = state.lines[state.i];\n if (ln.indent !== indent) return null;\n const head = parseStepHead(ln);\n if (!head) return null;\n state.i++;\n\n const step: SfcStep = {\n id: head.id,\n kind: head.kind,\n actions: [],\n };\n if (head.label !== undefined) step.label = head.label;\n\n // Parse following indented action lines\n while (state.i < state.lines.length) {\n const a = state.lines[state.i];\n if (a.indent <= indent) break;\n const action = parseAction(a);\n if (!action) break;\n step.actions.push(action);\n state.i++;\n }\n if (state.steps.has(step.id)) {\n throw new SfcParseError(`Duplicate step id: ${step.id}`, ln.lineNo, ln.text);\n }\n state.steps.set(step.id, step);\n if (step.kind === \"initial\") {\n if (state.initialId && state.initialId !== step.id) {\n throw new SfcParseError(`Multiple [initial] steps: ${state.initialId} and ${step.id}`, ln.lineNo, ln.text);\n }\n state.initialId = step.id;\n }\n return step;\n}\n\nfunction parseTransitionLine(line: RawLine): SfcTransition | null {\n // transition [id] from: A to: B: condition\n const m = line.text.match(/^transition(?:\\s+([a-zA-Z_]\\w*))?\\s+from\\s*:\\s*([a-zA-Z_]\\w*)\\s+to\\s*:\\s*([a-zA-Z_]\\w*)\\s*:\\s*(.+)$/);\n if (!m) return null;\n const t: SfcTransition = {\n from: m[2],\n to: m[3],\n condition: m[4].trim(),\n };\n if (m[1] !== undefined) t.id = m[1];\n return t;\n}\n\nfunction parseAltBlock(state: ParseState, indent: number): SfcNode | null {\n if (state.i >= state.lines.length) return null;\n const head = state.lines[state.i];\n if (head.indent !== indent) return null;\n const m = head.text.match(/^alt\\s+from\\s*:\\s*([a-zA-Z_]\\w*)\\s*:\\s*$/);\n if (!m) return null;\n state.i++;\n\n const branches: SfcAltBranch[] = [];\n while (state.i < state.lines.length) {\n const ln = state.lines[state.i];\n if (ln.indent <= indent) break;\n const bm = ln.text.match(/^branch\\s*(\\[[^\\]]*\\])?\\s*:\\s*$/);\n if (!bm) break;\n const attrs = parseAttrs(bm[1]);\n state.i++;\n\n // Read branch body: required entry transition, then steps, then exit transition\n const branchIndent = ln.indent;\n let entry: string | undefined;\n let exitCond: string | undefined;\n const body: SfcNode[] = [];\n while (state.i < state.lines.length) {\n const bb = state.lines[state.i];\n if (bb.indent <= branchIndent) break;\n // transition: condition\n const tm = bb.text.match(/^transition\\s*:\\s*(.+)$/);\n if (tm) {\n if (entry === undefined) entry = tm[1].trim();\n else exitCond = tm[1].trim();\n state.i++;\n continue;\n }\n // nested step\n const step = expectStep(state, bb.indent);\n if (step) {\n body.push({ kind: \"step\", stepId: step.id });\n continue;\n }\n // nested alt/sim\n const sub = parseAltBlock(state, bb.indent) ?? parseSimBlock(state, bb.indent);\n if (sub) {\n body.push(sub);\n continue;\n }\n throw new SfcParseError(`Unexpected line in alt branch: ${bb.text}`, bb.lineNo, bb.text);\n }\n const branch: SfcAltBranch = {\n entryCondition: entry ?? \"TRUE\",\n body,\n exitCondition: exitCond ?? \"TRUE\",\n };\n const prio = attrs.get(\"priority\");\n if (prio !== undefined) branch.priority = parseInt(prio, 10);\n branches.push(branch);\n }\n\n // merge_to: STEP\n if (state.i >= state.lines.length) {\n throw new SfcParseError(`alt block missing merge_to clause`, head.lineNo, head.text);\n }\n const mergeLine = state.lines[state.i];\n const mm = mergeLine.text.match(/^merge_to\\s*:\\s*([a-zA-Z_]\\w*)\\s*$/);\n if (!mm) {\n throw new SfcParseError(`Expected \"merge_to: STEP\" (got: ${mergeLine.text})`, mergeLine.lineNo, mergeLine.text);\n }\n state.i++;\n return { kind: \"alt\", branches, mergeTo: mm[1] };\n}\n\nfunction parseSimBlock(state: ParseState, indent: number): SfcNode | null {\n if (state.i >= state.lines.length) return null;\n const head = state.lines[state.i];\n if (head.indent !== indent) return null;\n const m = head.text.match(/^sim\\s+from\\s*:\\s*([a-zA-Z_]\\w*)\\s*:\\s*(.+)$/);\n if (!m) return null;\n const condition = m[2].trim();\n state.i++;\n\n const branches: SfcSimBranch[] = [];\n while (state.i < state.lines.length) {\n const ln = state.lines[state.i];\n if (ln.indent <= indent) break;\n const bm = ln.text.match(/^branch\\s*:\\s*$/);\n if (!bm) break;\n state.i++;\n const branchIndent = ln.indent;\n const body: SfcNode[] = [];\n while (state.i < state.lines.length) {\n const bb = state.lines[state.i];\n if (bb.indent <= branchIndent) break;\n const step = expectStep(state, bb.indent);\n if (step) {\n body.push({ kind: \"step\", stepId: step.id });\n continue;\n }\n const sub = parseAltBlock(state, bb.indent) ?? parseSimBlock(state, bb.indent);\n if (sub) {\n body.push(sub);\n continue;\n }\n throw new SfcParseError(`Unexpected line in sim branch: ${bb.text}`, bb.lineNo, bb.text);\n }\n branches.push({ body });\n }\n\n if (state.i >= state.lines.length) {\n throw new SfcParseError(`sim block missing merge_to clause`, head.lineNo, head.text);\n }\n const mergeLine = state.lines[state.i];\n const mm = mergeLine.text.match(/^merge_to\\s*:\\s*([a-zA-Z_]\\w*)\\s*:\\s*(.+)$/);\n if (!mm) {\n throw new SfcParseError(`Expected \"merge_to: STEP: condition\" (got: ${mergeLine.text})`, mergeLine.lineNo, mergeLine.text);\n }\n state.i++;\n return {\n kind: \"sim\",\n condition,\n branches,\n mergeTo: mm[1],\n mergeCondition: mm[2].trim(),\n };\n}\n\nexport function parseSfc(text: string): SfcAst {\n const lines = tokenizeLines(text);\n if (lines.length === 0) throw new SfcParseError(\"Empty SFC program\");\n if (!/^sfc\\b/i.test(lines[0].text)) {\n throw new SfcParseError(`First non-comment line must start with \"sfc\" (got: ${lines[0].text})`, lines[0].lineNo, lines[0].text);\n }\n const title = matchQuotedTitle(lines[0].text);\n\n const state: ParseState = {\n variables: [],\n steps: new Map(),\n transitions: [],\n body: [],\n lines,\n i: 1,\n transitionCounter: 0,\n };\n\n // Parse variable decls until first step / alt / sim / transition\n while (state.i < lines.length) {\n const ln = lines[state.i];\n const decl = parseVarDecl(ln);\n if (decl) {\n state.variables.push(decl);\n state.i++;\n continue;\n }\n break;\n }\n\n // Parse top-level body — sequence of step / alt / sim entries plus transition lines\n // We scan the file once and build state.body for `step`, alt, sim;\n // transitions go to state.transitions.\n const bodyIndent = state.i < lines.length ? lines[state.i].indent : 0;\n while (state.i < lines.length) {\n const ln = lines[state.i];\n if (ln.indent < bodyIndent) break;\n\n // transition\n const tline = parseTransitionLine(ln);\n if (tline) {\n if (!tline.id) {\n tline.id = `T${state.transitionCounter++}`;\n }\n state.transitions.push(tline);\n state.i++;\n continue;\n }\n // jump\n const jm = ln.text.match(/^jump\\s+from\\s*:\\s*([a-zA-Z_]\\w*)\\s+to\\s*:\\s*([a-zA-Z_]\\w*)\\s*$/);\n if (jm) {\n // Treat as a transition with TRUE condition; no special node type for v0.1.\n state.transitions.push({\n id: `J${state.transitionCounter++}`,\n from: jm[1],\n to: jm[2],\n condition: \"TRUE\",\n });\n state.i++;\n continue;\n }\n\n // step\n const step = expectStep(state, ln.indent);\n if (step) {\n state.body.push({ kind: \"step\", stepId: step.id });\n continue;\n }\n // alt\n const altNode = parseAltBlock(state, ln.indent);\n if (altNode) {\n state.body.push(altNode);\n continue;\n }\n // sim\n const simNode = parseSimBlock(state, ln.indent);\n if (simNode) {\n state.body.push(simNode);\n continue;\n }\n throw new SfcParseError(`Unrecognized SFC line: ${ln.text}`, ln.lineNo, ln.text);\n }\n\n if (!state.initialId) {\n // Promote the first declared step to initial.\n const firstStep = state.steps.values().next().value as SfcStep | undefined;\n if (!firstStep) {\n throw new SfcParseError(\"SFC chart has no steps\");\n }\n firstStep.kind = \"initial\";\n state.initialId = firstStep.id;\n }\n\n // Validate all transitions reference declared steps.\n for (const t of state.transitions) {\n if (!state.steps.has(t.from)) {\n throw new SfcParseError(`Transition references unknown step: ${t.from}`, undefined, `transition from ${t.from}`);\n }\n if (!state.steps.has(t.to)) {\n throw new SfcParseError(`Transition references unknown step: ${t.to}`, undefined, `transition to ${t.to}`);\n }\n }\n\n const ast: SfcAst = {\n type: \"sfc\",\n variables: state.variables,\n steps: state.steps,\n body: state.body,\n transitions: state.transitions,\n };\n if (title !== undefined) ast.title = title;\n return ast;\n}\n","/**\n * SFC layout — strict top-to-bottom.\n *\n * The body is a tree of nodes (steps, alt-blocks, sim-blocks). We compute\n * each node's bounding box by recursive sizing then assign coordinates in a\n * second pass. Branch regions divide horizontally; linear chains stack\n * vertically with `vertical_pitch` between step centers.\n *\n * Free-floating transitions declared via `transition from: A to: B: cond` are\n * placed as bars between linearly-adjacent steps in `body` order; transitions\n * that don't match a body adjacency are rendered as margin jump arrows.\n */\n\nimport type {\n SfcAltBranch,\n SfcAst,\n SfcLayoutAction,\n SfcLayoutBar,\n SfcLayoutJump,\n SfcLayoutResult,\n SfcLayoutStep,\n SfcLayoutTransition,\n SfcLayoutWire,\n SfcNode,\n SfcStep,\n SfcTransition,\n} from \"../../core/types\";\n\nexport const SFC_CONST = {\n step_width: 160,\n step_height: 36,\n step_initial_offset: 4,\n transition_bar_w: 24,\n transition_bar_h: 3,\n simultaneous_bar_gap: 4,\n vertical_pitch: 56,\n branch_x_spacing: 40,\n action_block_w: 200,\n action_block_h: 24,\n action_qualifier_w: 26,\n action_time_h: 14,\n action_gap_x: 8,\n wire_thickness: 1.5,\n branch_wire_clearance: 16,\n margin_x: 60,\n margin_y: 40,\n jump_margin_x: 36,\n};\n\ninterface SizeInfo {\n width: number;\n height: number;\n /** y-distance from top to step center (used to align convergence wire). */\n centerOffsetTop?: number;\n}\n\ninterface PlacedStep {\n step: SfcStep;\n cx: number; // center x\n cy: number; // center y of step rectangle\n}\n\ninterface LayoutContext {\n steps: Map<string, SfcLayoutStep>;\n actions: SfcLayoutAction[];\n transitions: SfcLayoutTransition[];\n bars: SfcLayoutBar[];\n wires: SfcLayoutWire[];\n jumps: SfcLayoutJump[];\n /** Map from step id → placed center coords (for jump routing). */\n placedById: Map<string, PlacedStep>;\n}\n\nfunction actionBlockFullHeight(): number {\n return SFC_CONST.action_block_h; // base; +action_time_h added when time present\n}\n\nfunction sizeStepWithActions(step: SfcStep): SizeInfo {\n const width = SFC_CONST.step_width;\n const height = SFC_CONST.step_height;\n void step;\n return { width, height };\n}\n\nfunction sizeBody(ast: SfcAst, body: SfcNode[]): SizeInfo {\n // Linear stack: take max width, sum heights with vertical_pitch gaps between nodes (transition bars).\n let maxW = SFC_CONST.step_width;\n let totalH = 0;\n for (let i = 0; i < body.length; i++) {\n const node = body[i];\n const sz = sizeNode(ast, node);\n if (sz.width > maxW) maxW = sz.width;\n totalH += sz.height;\n if (i < body.length - 1) {\n totalH += SFC_CONST.vertical_pitch;\n }\n }\n return { width: maxW, height: totalH };\n}\n\nfunction sizeNode(ast: SfcAst, node: SfcNode): SizeInfo {\n if (node.kind === \"step\") {\n const step = ast.steps.get(node.stepId);\n if (!step) return { width: SFC_CONST.step_width, height: SFC_CONST.step_height };\n return sizeStepWithActions(step);\n }\n if (node.kind === \"alt\") {\n let totalW = 0;\n let maxH = 0;\n for (const br of node.branches) {\n const sz = sizeAltBranch(ast, br);\n totalW += sz.width;\n if (sz.height > maxH) maxH = sz.height;\n }\n totalW += (node.branches.length - 1) * SFC_CONST.branch_x_spacing;\n // Plus divergence + convergence overhead: ~2 transition gaps\n const totalH = maxH + SFC_CONST.vertical_pitch * 2;\n return { width: Math.max(totalW, SFC_CONST.step_width), height: totalH };\n }\n // sim\n let totalW = 0;\n let maxH = 0;\n for (const br of node.branches) {\n const sz = sizeBody(ast, br.body);\n totalW += sz.width;\n if (sz.height > maxH) maxH = sz.height;\n }\n totalW += (node.branches.length - 1) * SFC_CONST.branch_x_spacing;\n // shared transition above + double bar + body + double bar + shared transition below\n const totalH = SFC_CONST.vertical_pitch * 3 + maxH;\n return { width: Math.max(totalW, SFC_CONST.step_width), height: totalH };\n}\n\nfunction sizeAltBranch(ast: SfcAst, br: SfcAltBranch): SizeInfo {\n // entry transition + body + exit transition\n let bodyW = SFC_CONST.step_width;\n let bodyH = 0;\n for (let i = 0; i < br.body.length; i++) {\n const sz = sizeNode(ast, br.body[i]);\n if (sz.width > bodyW) bodyW = sz.width;\n bodyH += sz.height;\n if (i < br.body.length - 1) bodyH += SFC_CONST.vertical_pitch;\n }\n return {\n width: bodyW,\n height: bodyH + SFC_CONST.vertical_pitch * 2, // entry + exit transitions\n };\n}\n\n/** Place a linear body returning the y-coordinate at the bottom (for chaining). */\nfunction placeBody(\n ctx: LayoutContext,\n ast: SfcAst,\n body: SfcNode[],\n cx: number,\n startY: number\n): { endY: number; firstStepCy?: number; lastStepCy?: number; firstStepId?: string; lastStepId?: string } {\n let y = startY;\n let firstCy: number | undefined;\n let firstId: string | undefined;\n let lastCy: number | undefined;\n let lastId: string | undefined;\n for (let i = 0; i < body.length; i++) {\n const node = body[i];\n if (i > 0) y += SFC_CONST.vertical_pitch; // gap with transition between\n const placed = placeNode(ctx, ast, node, cx, y);\n if (i === 0) {\n firstCy = placed.firstCy;\n if (placed.firstStepId) firstId = placed.firstStepId;\n }\n lastCy = placed.lastCy;\n if (placed.lastStepId) lastId = placed.lastStepId;\n y = placed.endY;\n }\n return { endY: y, firstStepCy: firstCy, lastStepCy: lastCy, firstStepId: firstId, lastStepId: lastId };\n}\n\ninterface PlaceResult {\n endY: number;\n firstCy: number;\n lastCy: number;\n firstStepId?: string;\n lastStepId?: string;\n}\n\nfunction placeNode(ctx: LayoutContext, ast: SfcAst, node: SfcNode, cx: number, startY: number): PlaceResult {\n if (node.kind === \"step\") {\n const step = ast.steps.get(node.stepId);\n if (!step) {\n return { endY: startY + SFC_CONST.step_height, firstCy: startY + SFC_CONST.step_height / 2, lastCy: startY + SFC_CONST.step_height / 2 };\n }\n return placeStep(ctx, step, cx, startY);\n }\n if (node.kind === \"alt\") {\n return placeAlt(ctx, ast, node, cx, startY);\n }\n return placeSim(ctx, ast, node, cx, startY);\n}\n\nfunction placeStep(ctx: LayoutContext, step: SfcStep, cx: number, y: number): PlaceResult {\n const w = SFC_CONST.step_width;\n const h = SFC_CONST.step_height;\n const x = cx - w / 2;\n const layoutStep: SfcLayoutStep = { step, x, y, width: w, height: h };\n ctx.steps.set(step.id, layoutStep);\n ctx.placedById.set(step.id, { step, cx, cy: y + h / 2 });\n\n // Action blocks to the right\n let ay = y;\n step.actions.forEach((a, idx) => {\n const ax = x + w + SFC_CONST.action_gap_x;\n const ah = a.time ? actionBlockFullHeight() + SFC_CONST.action_time_h : actionBlockFullHeight();\n ctx.actions.push({\n action: a,\n stepId: step.id,\n index: idx,\n x: ax,\n y: ay,\n width: SFC_CONST.action_block_w,\n height: ah,\n qualifierWidth: SFC_CONST.action_qualifier_w,\n });\n ay += ah;\n });\n\n return {\n endY: y + h,\n firstCy: y + h / 2,\n lastCy: y + h / 2,\n firstStepId: step.id,\n lastStepId: step.id,\n };\n}\n\nfunction placeAlt(ctx: LayoutContext, ast: SfcAst, node: Extract<SfcNode, { kind: \"alt\" }>, cx: number, startY: number): PlaceResult {\n // Compute total width\n const branchSizes = node.branches.map((br) => sizeAltBranch(ast, br));\n const totalW = branchSizes.reduce((s, b) => s + b.width, 0)\n + (node.branches.length - 1) * SFC_CONST.branch_x_spacing;\n const leftX = cx - totalW / 2;\n\n // Divergence bar\n const divY = startY + SFC_CONST.vertical_pitch / 2;\n ctx.bars.push({\n kind: \"alt-div\",\n x1: leftX - 12,\n x2: leftX + totalW + 12,\n y: divY,\n });\n\n // Place each branch\n let bx = leftX;\n let maxBranchEnd = 0;\n const branchEndIds: { id: string; cx: number }[] = [];\n for (let bi = 0; bi < node.branches.length; bi++) {\n const br = node.branches[bi];\n const sz = branchSizes[bi];\n const branchCx = bx + sz.width / 2;\n\n // Entry transition (between div bar and first step)\n const entryY = divY + (SFC_CONST.vertical_pitch - SFC_CONST.transition_bar_h) / 2 + SFC_CONST.transition_bar_h;\n const entryT: SfcTransition = {\n id: `_alt${bi}_entry`,\n from: \"_div\", to: \"_div\",\n condition: br.entryCondition,\n };\n ctx.transitions.push({\n transition: entryT,\n cx: branchCx,\n cy: divY + SFC_CONST.vertical_pitch * 0.5,\n w: SFC_CONST.transition_bar_w,\n });\n void entryY;\n\n // Place body inside branch\n const bodyStartY = divY + SFC_CONST.vertical_pitch;\n const placed = placeBody(ctx, ast, br.body, branchCx, bodyStartY);\n const branchEndY = placed.endY;\n // Exit transition\n ctx.transitions.push({\n transition: { id: `_alt${bi}_exit`, from: \"_div\", to: \"_conv\", condition: br.exitCondition },\n cx: branchCx,\n cy: branchEndY + SFC_CONST.vertical_pitch * 0.5,\n w: SFC_CONST.transition_bar_w,\n });\n if (placed.lastStepId) branchEndIds.push({ id: placed.lastStepId, cx: branchCx });\n if (placed.firstStepCy !== undefined) {\n // wire from div bar to entry transition to first step\n ctx.wires.push({ path: `M ${branchCx} ${divY} L ${branchCx} ${placed.firstStepCy - SFC_CONST.step_height / 2}`, cls: \"wire\" });\n }\n if (placed.lastStepCy !== undefined) {\n // wire from last step to exit transition then to conv\n ctx.wires.push({\n path: `M ${branchCx} ${placed.lastStepCy + SFC_CONST.step_height / 2} L ${branchCx} ${branchEndY + SFC_CONST.vertical_pitch}`,\n cls: \"wire\",\n });\n }\n bx += sz.width + SFC_CONST.branch_x_spacing;\n if (branchEndY + SFC_CONST.vertical_pitch > maxBranchEnd) maxBranchEnd = branchEndY + SFC_CONST.vertical_pitch;\n }\n\n // Convergence bar\n const convY = maxBranchEnd;\n ctx.bars.push({\n kind: \"alt-conv\",\n x1: leftX - 12,\n x2: leftX + totalW + 12,\n y: convY,\n });\n\n // Wire from main upstream into div bar (handled by parent body chain).\n // Wire from conv bar onward (handled by body chain).\n return {\n endY: convY,\n firstCy: divY,\n lastCy: convY,\n };\n}\n\nfunction placeSim(ctx: LayoutContext, ast: SfcAst, node: Extract<SfcNode, { kind: \"sim\" }>, cx: number, startY: number): PlaceResult {\n // Compute total width\n const branchSizes = node.branches.map((br) => sizeBody(ast, br.body));\n const totalW = branchSizes.reduce((s, b) => s + b.width, 0)\n + (node.branches.length - 1) * SFC_CONST.branch_x_spacing;\n const leftX = cx - totalW / 2;\n\n // Shared transition (above the double bar)\n const sharedTopY = startY + SFC_CONST.vertical_pitch * 0.5;\n ctx.transitions.push({\n transition: { id: \"_sim_in\", from: \"_pre\", to: \"_div\", condition: node.condition },\n cx,\n cy: sharedTopY,\n w: SFC_CONST.transition_bar_w,\n });\n\n // Double divergence bar\n const divY1 = startY + SFC_CONST.vertical_pitch;\n const divY2 = divY1 + SFC_CONST.simultaneous_bar_gap;\n ctx.bars.push({ kind: \"sim-div\", x1: leftX - 12, x2: leftX + totalW + 12, y: divY1 });\n ctx.bars.push({ kind: \"sim-div\", x1: leftX - 12, x2: leftX + totalW + 12, y: divY2 });\n\n // Place each branch\n let bx = leftX;\n let maxBranchEnd = 0;\n for (let bi = 0; bi < node.branches.length; bi++) {\n const br = node.branches[bi];\n const sz = branchSizes[bi];\n const branchCx = bx + sz.width / 2;\n const placed = placeBody(ctx, ast, br.body, branchCx, divY2 + SFC_CONST.vertical_pitch);\n if (placed.firstStepCy !== undefined) {\n ctx.wires.push({ path: `M ${branchCx} ${divY2} L ${branchCx} ${placed.firstStepCy - SFC_CONST.step_height / 2}`, cls: \"wire\" });\n }\n if (placed.lastStepCy !== undefined) {\n ctx.wires.push({ path: `M ${branchCx} ${placed.lastStepCy + SFC_CONST.step_height / 2} L ${branchCx} ${placed.endY + SFC_CONST.vertical_pitch}`, cls: \"wire\" });\n }\n bx += sz.width + SFC_CONST.branch_x_spacing;\n if (placed.endY + SFC_CONST.vertical_pitch > maxBranchEnd) maxBranchEnd = placed.endY + SFC_CONST.vertical_pitch;\n }\n\n // Double convergence bar\n const convY1 = maxBranchEnd;\n const convY2 = convY1 + SFC_CONST.simultaneous_bar_gap;\n ctx.bars.push({ kind: \"sim-conv\", x1: leftX - 12, x2: leftX + totalW + 12, y: convY1 });\n ctx.bars.push({ kind: \"sim-conv\", x1: leftX - 12, x2: leftX + totalW + 12, y: convY2 });\n\n // Shared transition (below the double bar)\n const sharedBottomY = convY2 + SFC_CONST.vertical_pitch * 0.5;\n ctx.transitions.push({\n transition: { id: \"_sim_out\", from: \"_conv\", to: \"_post\", condition: node.mergeCondition },\n cx,\n cy: sharedBottomY,\n w: SFC_CONST.transition_bar_w,\n });\n\n return {\n endY: convY2 + SFC_CONST.vertical_pitch,\n firstCy: sharedTopY,\n lastCy: convY2,\n };\n}\n\nexport function layoutSfc(ast: SfcAst): SfcLayoutResult {\n const ctx: LayoutContext = {\n steps: new Map(),\n actions: [],\n transitions: [],\n bars: [],\n wires: [],\n jumps: [],\n placedById: new Map(),\n };\n\n // Estimate total width from sized body\n const totalSize = sizeBody(ast, ast.body);\n const cx = SFC_CONST.margin_x + totalSize.width / 2;\n\n // Place body\n const startY = SFC_CONST.margin_y;\n const placed = placeBody(ctx, ast, ast.body, cx, startY);\n\n // Connect adjacent body steps with vertical wires + transition bars from explicit transitions.\n // Build a quick adjacency table of explicit transitions.\n const trByPair = new Map<string, SfcTransition>();\n for (const t of ast.transitions) {\n trByPair.set(`${t.from}\\0${t.to}`, t);\n }\n\n // Walk body to extract linear chain (step ids only at the top level).\n // Add transition bars between adjacent step nodes.\n const linearStepIds: string[] = collectLinearSteps(ast.body);\n for (let i = 0; i < linearStepIds.length - 1; i++) {\n const from = linearStepIds[i];\n const to = linearStepIds[i + 1];\n const t = trByPair.get(`${from}\\0${to}`);\n const fromS = ctx.placedById.get(from);\n const toS = ctx.placedById.get(to);\n if (!fromS || !toS) continue;\n const midY = (fromS.cy + SFC_CONST.step_height / 2 + toS.cy - SFC_CONST.step_height / 2) / 2;\n if (t) {\n ctx.transitions.push({\n transition: t,\n cx: fromS.cx,\n cy: midY,\n w: SFC_CONST.transition_bar_w,\n ...(t.id ? { id: t.id } : {}),\n });\n }\n // Vertical wire (always)\n ctx.wires.push({\n path: `M ${fromS.cx} ${fromS.cy + SFC_CONST.step_height / 2} L ${toS.cx} ${toS.cy - SFC_CONST.step_height / 2}`,\n cls: \"wire\",\n });\n if (t) trByPair.delete(`${from}\\0${to}`);\n }\n\n // Remaining transitions are jumps — draw as margin arrows.\n let jumpIdx = 0;\n for (const t of ast.transitions) {\n if (!trByPair.has(`${t.from}\\0${t.to}`)) continue;\n const fromS = ctx.placedById.get(t.from);\n const toS = ctx.placedById.get(t.to);\n if (!fromS || !toS) continue;\n const onLeft = jumpIdx % 2 === 0;\n jumpIdx++;\n const marginX = onLeft\n ? SFC_CONST.margin_x - SFC_CONST.jump_margin_x\n : (placed.endY, totalSize.width + SFC_CONST.margin_x + SFC_CONST.jump_margin_x);\n const fromX = onLeft\n ? fromS.cx - SFC_CONST.step_width / 2\n : fromS.cx + SFC_CONST.step_width / 2;\n const toX = onLeft\n ? toS.cx - SFC_CONST.step_width / 2\n : toS.cx + SFC_CONST.step_width / 2;\n const fromY = fromS.cy;\n const toY = toS.cy;\n const path = `M ${fromX} ${fromY} L ${marginX} ${fromY} L ${marginX} ${toY} L ${toX} ${toY}`;\n ctx.jumps.push({\n fromStepId: t.from,\n toStepId: t.to,\n path,\n labelX: marginX + (onLeft ? -8 : 8),\n labelY: (fromY + toY) / 2,\n labelText: t.to,\n condition: t.condition,\n });\n }\n\n // Compute final width/height\n const width = totalSize.width + SFC_CONST.margin_x * 2 + SFC_CONST.jump_margin_x * 2 + 80;\n const height = placed.endY + SFC_CONST.margin_y;\n\n return {\n ast,\n steps: Array.from(ctx.steps.values()),\n actions: ctx.actions,\n transitions: ctx.transitions,\n bars: ctx.bars,\n wires: ctx.wires,\n jumps: ctx.jumps,\n width,\n height,\n };\n}\n\nfunction collectLinearSteps(body: SfcNode[]): string[] {\n const out: string[] = [];\n for (const node of body) {\n if (node.kind === \"step\") out.push(node.stepId);\n // alt/sim represent a single \"logical step slot\" but we don't include\n // their internal step ids as part of the linear chain — the chain\n // continues at the merge_to step which appears as a separate step node\n // later in body. Branch internals get wired by the placer.\n }\n return out;\n}\n","/**\n * SFC renderer — Sequential Function Chart SVG output.\n * IEC 61131-3 §6.5 visual conventions; see 24-SFC-STANDARD.md.\n */\n\nimport type { SfcAst, SfcLayoutResult } from \"../../core/types\";\nimport { defs, el, group, line, path, rect, svgRoot, text, title, desc, escapeXml } from \"../../core/svg\";\nimport { parseSfc } from \"./parser\";\nimport { layoutSfc, SFC_CONST } from \"./layout\";\n\nconst STYLES = `\n.lt-sfc-bg { fill: #ffffff; }\n.lt-sfc-step-body { fill: #ffffff; stroke: #333; stroke-width: 1.5; }\n.lt-sfc-step-inner { fill: none; stroke: #333; stroke-width: 1.2; }\n.lt-sfc-step-name { font-family: ui-monospace, \"SFMono-Regular\", Menlo, Consolas, monospace; font-size: 12px; font-weight: 600; fill: #111; }\n.lt-sfc-transition-bar { fill: #000; }\n.lt-sfc-transition-condition { font-family: ui-monospace, \"SFMono-Regular\", Menlo, Consolas, monospace; font-size: 11px; fill: #333; }\n.lt-sfc-transition-id { font-family: ui-monospace, \"SFMono-Regular\", Menlo, Consolas, monospace; font-size: 10px; fill: #888; }\n.lt-sfc-branch-bar { stroke: #000; stroke-width: 1.5; fill: none; }\n.lt-sfc-wire { stroke: #000; stroke-width: 1.5; fill: none; }\n.lt-sfc-action-block { fill: #fafafa; stroke: #333; stroke-width: 1; }\n.lt-sfc-action-qualifier { fill: #f0f0f0; stroke: #333; stroke-width: 1; }\n.lt-sfc-action-qualifier-text { font-family: ui-monospace, \"SFMono-Regular\", Menlo, Consolas, monospace; font-weight: 700; font-size: 11px; fill: #111; }\n.lt-sfc-action-body { font-family: ui-monospace, \"SFMono-Regular\", Menlo, Consolas, monospace; font-size: 11px; fill: #222; }\n.lt-sfc-action-time { font-family: ui-monospace, \"SFMono-Regular\", Menlo, Consolas, monospace; font-size: 10px; fill: #555; }\n.lt-sfc-jump { stroke: #000; stroke-width: 1.5; fill: none; marker-end: url(#sfc-arrow); }\n.lt-sfc-jump-label { font-family: ui-monospace, \"SFMono-Regular\", Menlo, Consolas, monospace; font-size: 10px; fill: #555; }\n.lt-sfc-title { font-family: ui-monospace, \"SFMono-Regular\", Menlo, Consolas, monospace; font-size: 14px; font-weight: 700; fill: #111; }\n`;\n\nexport function renderSfcLayout(layout: SfcLayoutResult): string {\n const parts: string[] = [];\n\n const styleEl = el(\"style\", {}, escapeXml(STYLES).replace(/"/g, '\"'));\n const arrowMarker = el(\n \"marker\",\n {\n id: \"sfc-arrow\",\n viewBox: \"0 0 10 10\",\n refX: 9, refY: 5,\n markerWidth: 8, markerHeight: 8,\n orient: \"auto-start-reverse\",\n },\n [el(\"path\", { d: \"M 0 0 L 10 5 L 0 10 z\", fill: \"#000\" })]\n );\n parts.push(defs([styleEl, arrowMarker]));\n parts.push(title(`SFC: ${layout.ast.title ?? \"Sequential Function Chart\"}`));\n parts.push(desc(`SFC with ${layout.steps.length} step(s), ${layout.transitions.length} transition(s).`));\n parts.push(rect({ class: \"lt-sfc-bg\", x: 0, y: 0, width: layout.width, height: layout.height }));\n\n // Title\n if (layout.ast.title) {\n parts.push(text(\n { class: \"lt-sfc-title\", x: layout.width / 2, y: 22, \"text-anchor\": \"middle\" },\n layout.ast.title\n ));\n }\n\n // Wires (under steps so they don't overlap step rects)\n for (const w of layout.wires) {\n parts.push(path({ class: \"lt-sfc-wire\", d: w.path }));\n }\n\n // Branch bars\n for (const b of layout.bars) {\n if (b.kind === \"alt-div\" || b.kind === \"alt-conv\") {\n parts.push(line({ class: \"lt-sfc-branch-bar\", x1: b.x1, y1: b.y, x2: b.x2, y2: b.y }));\n } else {\n // Simultaneous = single line; second line is its own bar entry from the layout\n parts.push(line({ class: \"lt-sfc-branch-bar\", x1: b.x1, y1: b.y, x2: b.x2, y2: b.y }));\n }\n }\n\n // Transitions\n for (const t of layout.transitions) {\n const x = t.cx - t.w;\n const y = t.cy - SFC_CONST.transition_bar_h / 2;\n parts.push(rect({\n class: \"lt-sfc-transition-bar\",\n x, y, width: t.w * 2, height: SFC_CONST.transition_bar_h,\n }));\n if (t.id) {\n parts.push(text(\n { class: \"lt-sfc-transition-id\", x: x - 4, y: y + 4, \"text-anchor\": \"end\" },\n t.id\n ));\n }\n parts.push(text(\n { class: \"lt-sfc-transition-condition\", x: x + t.w * 2 + 6, y: y + 4 },\n t.transition.condition\n ));\n }\n\n // Steps\n for (const ls of layout.steps) {\n const stepGroup: string[] = [];\n stepGroup.push(rect({\n class: \"lt-sfc-step-body\",\n x: ls.x, y: ls.y,\n width: ls.width, height: ls.height,\n }));\n if (ls.step.kind === \"initial\" || ls.step.kind === \"final\") {\n const off = SFC_CONST.step_initial_offset;\n stepGroup.push(rect({\n class: \"lt-sfc-step-inner\",\n x: ls.x + off, y: ls.y + off,\n width: ls.width - off * 2, height: ls.height - off * 2,\n }));\n }\n if (ls.step.kind === \"final\") {\n const off = SFC_CONST.step_initial_offset + 3;\n stepGroup.push(rect({\n class: \"lt-sfc-step-inner\",\n x: ls.x + off, y: ls.y + off,\n width: ls.width - off * 2, height: ls.height - off * 2,\n }));\n }\n stepGroup.push(text(\n { class: \"lt-sfc-step-name\", x: ls.x + ls.width / 2, y: ls.y + ls.height / 2 + 4, \"text-anchor\": \"middle\" },\n ls.step.label ?? ls.step.id\n ));\n parts.push(group(\n { class: \"lt-sfc-step\", \"data-step-id\": ls.step.id, \"data-step-kind\": ls.step.kind },\n stepGroup\n ));\n\n // Connect step to action blocks (small horizontal stub)\n const myActions = layout.actions.filter((a) => a.stepId === ls.step.id);\n if (myActions.length > 0) {\n parts.push(line({\n class: \"lt-sfc-wire\",\n x1: ls.x + ls.width,\n y1: ls.y + ls.height / 2,\n x2: myActions[0].x,\n y2: ls.y + ls.height / 2,\n }));\n }\n }\n\n // Action blocks\n for (const a of layout.actions) {\n const ag: string[] = [];\n ag.push(rect({\n class: \"lt-sfc-action-qualifier\",\n x: a.x, y: a.y,\n width: a.qualifierWidth, height: SFC_CONST.action_block_h,\n }));\n ag.push(rect({\n class: \"lt-sfc-action-block\",\n x: a.x + a.qualifierWidth, y: a.y,\n width: a.width - a.qualifierWidth, height: SFC_CONST.action_block_h,\n }));\n ag.push(text(\n { class: \"lt-sfc-action-qualifier-text\", x: a.x + a.qualifierWidth / 2, y: a.y + SFC_CONST.action_block_h / 2 + 4, \"text-anchor\": \"middle\" },\n a.action.qualifier\n ));\n ag.push(text(\n { class: \"lt-sfc-action-body\", x: a.x + a.qualifierWidth + 6, y: a.y + SFC_CONST.action_block_h / 2 + 4 },\n a.action.body\n ));\n if (a.action.time) {\n const ty = a.y + SFC_CONST.action_block_h;\n ag.push(rect({\n class: \"lt-sfc-action-block\",\n x: a.x, y: ty,\n width: a.width, height: SFC_CONST.action_time_h,\n }));\n ag.push(text(\n { class: \"lt-sfc-action-time\", x: a.x + 6, y: ty + SFC_CONST.action_time_h / 2 + 4 },\n a.action.time\n ));\n }\n parts.push(group(\n { class: \"lt-sfc-action-block-g\", \"data-step-id\": a.stepId, \"data-action-index\": a.index, \"data-qualifier\": a.action.qualifier },\n ag\n ));\n }\n\n // Jumps\n for (const j of layout.jumps) {\n parts.push(path({ class: \"lt-sfc-jump\", d: j.path }));\n const labelParts: string[] = [];\n if (j.condition) labelParts.push(j.condition);\n labelParts.push(`→ ${j.labelText}`);\n parts.push(text(\n { class: \"lt-sfc-jump-label\", x: j.labelX, y: j.labelY, \"text-anchor\": \"middle\" },\n labelParts.join(\" \")\n ));\n }\n\n return svgRoot(\n {\n width: layout.width,\n height: layout.height,\n viewBox: `0 0 ${layout.width} ${layout.height}`,\n class: \"lt-sfc\",\n \"data-diagram-type\": \"sfc\",\n },\n parts\n );\n}\n\nexport function renderSfc(text: string): string {\n const ast: SfcAst = parseSfc(text);\n const layout = layoutSfc(ast);\n return renderSfcLayout(layout);\n}\n","import type { DiagramPlugin } from \"../../core/types\";\nimport { parseSfc } from \"./parser\";\nimport { renderSfc } from \"./renderer\";\n\nexport const sfc: DiagramPlugin = {\n type: \"sfc\",\n detect(text: string): boolean {\n const first = text.trim().split(\"\\n\")[0]?.trim().toLowerCase() ?? \"\";\n return first.startsWith(\"sfc\");\n },\n parse: parseSfc,\n render(text: string): string {\n return renderSfc(text);\n },\n};\n\nexport { parseSfc } from \"./parser\";\nexport { renderSfc, renderSfcLayout } from \"./renderer\";\nexport { layoutSfc } from \"./layout\";\n","import type { DiagramPlugin, RenderConfig } from \"./types\";\nimport { parseFrontmatter } from \"./dsl-preprocess\";\nimport {\n diagnosticFromError,\n renderDiagnosticSvg,\n type SchematexDiagnostic,\n type SchematexParseResult,\n type SchematexRenderResult,\n} from \"./diagnostics\";\nimport { genogram } from \"../diagrams/genogram\";\nimport { ecomap } from \"../diagrams/ecomap\";\nimport { pedigree } from \"../diagrams/pedigree\";\nimport { phylo } from \"../diagrams/phylo\";\nimport { sociogram } from \"../diagrams/sociogram\";\nimport { timing } from \"../diagrams/timing\";\nimport { logic } from \"../diagrams/logic\";\nimport { circuit } from \"../diagrams/circuit\";\nimport { blockdiagram } from \"../diagrams/blockdiagram\";\nimport { ladder } from \"../diagrams/ladder\";\nimport { sld } from \"../diagrams/sld\";\nimport { entity } from \"../diagrams/entity\";\nimport { fishbone } from \"../diagrams/fishbone\";\nimport { venn } from \"../diagrams/venn\";\nimport { flowchart } from \"../diagrams/flowchart\";\nimport { mindmap } from \"../diagrams/mindmap\";\nimport { matrix } from \"../diagrams/matrix\";\nimport { orgchart } from \"../diagrams/orgchart\";\nimport { decisiontree } from \"../diagrams/decisiontree\";\nimport { timeline } from \"../diagrams/timeline\";\nimport { state } from \"../diagrams/state\";\nimport { pid } from \"../diagrams/pid\";\nimport { erd } from \"../diagrams/erd\";\nimport { breadboard } from \"../diagrams/breadboard\";\nimport { bpmn } from \"../diagrams/bpmn\";\nimport { fbd } from \"../diagrams/fbd\";\nimport { sfc } from \"../diagrams/sfc\";\nimport { prisma } from \"../diagrams/prisma\";\nimport { usecase } from \"../diagrams/usecase\";\nimport { pert } from \"../diagrams/pert\";\nimport { sequence } from \"../diagrams/sequence\";\nimport { petri } from \"../diagrams/petri\";\nimport { network } from \"../diagrams/network\";\n\nexport interface SchematexConfig {\n type?:\n | \"genogram\"\n | \"ecomap\"\n | \"pedigree\"\n | \"phylo\"\n | \"sociogram\"\n | \"timing\"\n | \"logic\"\n | \"circuit\"\n | \"blockdiagram\"\n | \"ladder\"\n | \"sld\"\n | \"entity\"\n | \"fishbone\"\n | \"venn\"\n | \"flowchart\"\n | \"mindmap\"\n | \"matrix\"\n | \"orgchart\"\n | \"decisiontree\"\n | \"timeline\"\n | \"state\"\n | \"pid\"\n | \"erd\"\n | \"breadboard\"\n | \"bpmn\"\n | \"fbd\"\n | \"sfc\"\n | \"prisma\"\n | \"usecase\"\n | \"pert\"\n | \"sequence\"\n | \"petri\"\n | \"network\";\n width?: number;\n height?: number;\n padding?: number;\n theme?: string;\n fontFamily?: string;\n /**\n * `strict` preserves the historical throw-on-error API.\n * `preview` returns a visible diagnostic SVG instead of an empty surface.\n */\n mode?: \"strict\" | \"preview\";\n}\n\nconst plugins: DiagramPlugin[] = [\n genogram,\n ecomap,\n pedigree,\n phylo,\n sociogram,\n timing,\n logic,\n circuit,\n blockdiagram,\n ladder,\n sld,\n entity,\n fishbone,\n venn,\n flowchart,\n mindmap,\n matrix,\n orgchart,\n decisiontree,\n timeline,\n state,\n pid,\n erd,\n breadboard,\n bpmn,\n fbd,\n sfc,\n prisma,\n usecase,\n pert,\n sequence,\n petri,\n network,\n];\n\nfunction detectPlugin(text: string, config?: SchematexConfig): DiagramPlugin {\n if (config?.type) {\n const plugin = plugins.find((p) => p.type === config.type);\n if (plugin) return plugin;\n }\n for (const plugin of plugins) {\n if (plugin.detect(text)) return plugin;\n }\n throw new Error(\n \"Cannot detect diagram type. Start your text with 'genogram', 'ecomap', 'pedigree', 'phylo', 'sociogram', 'timing', 'logic', 'circuit', 'blockdiagram', 'ladder', 'sld', 'entity-structure', 'fishbone', 'venn', 'flowchart', 'mindmap', 'matrix', 'orgchart', 'state', 'pid', 'erd', 'breadboard', 'bpmn', 'fbd', 'sfc', 'prisma', 'usecase', 'pert', 'sequence', 'petri', or 'network'.\"\n );\n}\n\n/**\n * Run the Mermaid-compat frontmatter pass and merge any `title:` into the\n * first header line as a quoted suffix (`flowchart TD` → `flowchart TD \"T\"`).\n *\n * Most per-diagram header regexes already accept a trailing quoted title, or\n * tolerate trailing tokens. Diagram types whose grammar would reject the\n * appended title are left alone — the frontmatter is silently dropped rather\n * than producing a misleading parse error.\n */\nfunction preprocess(text: string): string {\n const { data, body } = parseFrontmatter(text);\n if (!data.title) return body;\n // Strip the title here — `data.title` was already unquoted by parseFrontmatter.\n const safeTitle = data.title.replace(/\"/g, '\\\\\"');\n // Find the first non-blank line in body and append the title if it doesn't\n // already carry a quoted region.\n const lines = body.split(\"\\n\");\n for (let i = 0; i < lines.length; i++) {\n const trimmed = lines[i]!.trim();\n if (trimmed === \"\") continue;\n // Already has a quoted title — frontmatter loses.\n if (/[\"“「『«][^\"”」』»]+[\"”」』»]/.test(trimmed)) return body;\n lines[i] = lines[i]!.replace(/\\s*$/, ` \"${safeTitle}\"`);\n return lines.join(\"\\n\");\n }\n return body;\n}\n\n/**\n * Parse DSL text to the diagram's AST and return it as a plain object.\n * Useful for JSON serialization, programmatic inspection, or custom renderers.\n *\n * @example\n * ```ts\n * const ast = parse('genogram\\n alice [female]');\n * console.log(JSON.stringify(ast, null, 2));\n * ```\n */\nexport function parse(text: string, config?: SchematexConfig): unknown {\n const prepared = preprocess(text);\n const plugin = detectPlugin(prepared, config);\n if (plugin.parse) return plugin.parse(prepared);\n throw new Error(\n `Diagram type '${plugin.type}' does not yet expose a parse() method.`\n );\n}\n\nexport function parseResult(\n text: string,\n config?: SchematexConfig\n): SchematexParseResult {\n let plugin: DiagramPlugin | undefined;\n try {\n const prepared = preprocess(text);\n plugin = detectPlugin(prepared, config);\n if (!plugin.parse) {\n throw new Error(\n `Diagram type '${plugin.type}' does not yet expose a parse() method.`\n );\n }\n const ast = plugin.parse(prepared);\n const diagnostics = runLint(plugin, prepared);\n return {\n ok: true,\n status: diagnostics.length > 0 ? \"partial\" : \"valid\",\n type: plugin.type,\n ast,\n diagnostics,\n };\n } catch (err) {\n return {\n ok: false,\n status: \"invalid\",\n type: plugin?.type ?? config?.type ?? null,\n diagnostics: [diagnosticFromError(err)],\n };\n }\n}\n\n/**\n * Run a plugin's optional lint pass defensively — a lint hook must never break\n * parsing/rendering, so any throw is swallowed and treated as \"no warnings\".\n */\nfunction runLint(plugin: DiagramPlugin, prepared: string): SchematexDiagnostic[] {\n if (!plugin.lint) return [];\n try {\n return plugin.lint(prepared);\n } catch {\n return [];\n }\n}\n\nexport function render(text: string, config?: SchematexConfig): string {\n if (config?.mode === \"preview\") return renderResult(text, config).svg;\n\n const prepared = preprocess(text);\n const plugin = detectPlugin(prepared, config);\n return renderWithPlugin(prepared, plugin, config);\n}\n\nexport function renderResult(\n text: string,\n config?: SchematexConfig\n): SchematexRenderResult {\n let plugin: DiagramPlugin | undefined;\n try {\n const prepared = preprocess(text);\n plugin = detectPlugin(prepared, config);\n const svg = renderWithPlugin(prepared, plugin, config);\n const diagnostics = runLint(plugin, prepared);\n return {\n ok: true,\n status: diagnostics.length > 0 ? \"partial\" : \"valid\",\n type: plugin.type,\n svg,\n diagnostics,\n };\n } catch (err) {\n const type = plugin?.type ?? config?.type ?? null;\n const diagnostics = [diagnosticFromError(err)];\n return {\n ok: false,\n status: \"invalid\",\n type,\n svg: renderDiagnosticSvg(diagnostics, type, {\n fontFamily: config?.fontFamily,\n }),\n diagnostics,\n };\n }\n}\n\nexport function renderPreview(text: string, config?: SchematexConfig): string {\n return renderResult(text, config).svg;\n}\n\nfunction renderWithPlugin(\n prepared: string,\n plugin: DiagramPlugin,\n config?: SchematexConfig\n): string {\n const renderConfig: RenderConfig = {\n fontFamily: config?.fontFamily ?? \"system-ui, -apple-system, sans-serif\",\n fontSize: 12,\n theme: config?.theme ?? \"default\",\n padding: config?.padding ?? 20,\n };\n return plugin.render(prepared, renderConfig);\n}\n"]}
|