schematex 0.3.0 → 0.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ai/ai-sdk.cjs +25 -25
- package/dist/ai/ai-sdk.d.cts +1 -1
- package/dist/ai/ai-sdk.d.ts +1 -1
- package/dist/ai/ai-sdk.js +20 -20
- package/dist/ai/index.cjs +28 -28
- package/dist/ai/index.d.cts +1 -1
- package/dist/ai/index.d.ts +1 -1
- package/dist/ai/index.js +20 -20
- package/dist/browser.cjs +22 -22
- package/dist/browser.js +20 -20
- package/dist/{chunk-HDKDQAEQ.cjs → chunk-3WNW5Y7P.cjs} +54 -2
- package/dist/chunk-3WNW5Y7P.cjs.map +1 -0
- package/dist/{chunk-B6INLQBU.cjs → chunk-55UEHL57.cjs} +46 -46
- package/dist/{chunk-B6INLQBU.cjs.map → chunk-55UEHL57.cjs.map} +1 -1
- package/dist/{chunk-JDTB7IKL.js → chunk-5U2W3HQA.js} +3 -3
- package/dist/{chunk-JDTB7IKL.js.map → chunk-5U2W3HQA.js.map} +1 -1
- package/dist/{chunk-ULYRO2KY.cjs → chunk-5UCXMYE7.cjs} +44 -44
- package/dist/{chunk-ULYRO2KY.cjs.map → chunk-5UCXMYE7.cjs.map} +1 -1
- package/dist/{chunk-UGCUNADI.js → chunk-66XQBGX7.js} +35 -16
- package/dist/chunk-66XQBGX7.js.map +1 -0
- package/dist/{chunk-45KP67RR.js → chunk-6TIN33CA.js} +5 -5
- package/dist/chunk-6TIN33CA.js.map +1 -0
- package/dist/{chunk-NNU4RGT3.js → chunk-6YUP3QMA.js} +39 -27
- package/dist/chunk-6YUP3QMA.js.map +1 -0
- package/dist/{chunk-COLTVQWR.cjs → chunk-7EWFVNYD.cjs} +25 -25
- package/dist/{chunk-COLTVQWR.cjs.map → chunk-7EWFVNYD.cjs.map} +1 -1
- package/dist/{chunk-RP5UATRA.js → chunk-AC3XH3LB.js} +4 -4
- package/dist/{chunk-RP5UATRA.js.map → chunk-AC3XH3LB.js.map} +1 -1
- package/dist/{chunk-XTATRNUN.cjs → chunk-APV4AWQ5.cjs} +442 -430
- package/dist/chunk-APV4AWQ5.cjs.map +1 -0
- package/dist/{chunk-NZH4GWE6.cjs → chunk-AVIKQZSX.cjs} +37 -37
- package/dist/{chunk-NZH4GWE6.cjs.map → chunk-AVIKQZSX.cjs.map} +1 -1
- package/dist/{chunk-X7RPFTTR.cjs → chunk-CWZKP3CJ.cjs} +26 -26
- package/dist/{chunk-X7RPFTTR.cjs.map → chunk-CWZKP3CJ.cjs.map} +1 -1
- package/dist/{chunk-TYCHEOQX.js → chunk-FIVUMDLF.js} +49 -24
- package/dist/chunk-FIVUMDLF.js.map +1 -0
- package/dist/{chunk-DNZFOCV7.js → chunk-FO7BLCEW.js} +3 -3
- package/dist/{chunk-DNZFOCV7.js.map → chunk-FO7BLCEW.js.map} +1 -1
- package/dist/{chunk-OC22GGQN.js → chunk-GLFBHQSQ.js} +54 -4
- package/dist/chunk-GLFBHQSQ.js.map +1 -0
- package/dist/{chunk-XZNPAD6E.js → chunk-GVCPFBAV.js} +59 -8
- package/dist/chunk-GVCPFBAV.js.map +1 -0
- package/dist/{chunk-B37IKTI7.cjs → chunk-HOI6QKC6.cjs} +97 -47
- package/dist/chunk-HOI6QKC6.cjs.map +1 -0
- package/dist/{chunk-A5D2IMOX.cjs → chunk-IAEABLIV.cjs} +47 -47
- package/dist/{chunk-A5D2IMOX.cjs.map → chunk-IAEABLIV.cjs.map} +1 -1
- package/dist/{chunk-5YYAYW67.js → chunk-IQRRZPVZ.js} +3 -3
- package/dist/{chunk-5YYAYW67.js.map → chunk-IQRRZPVZ.js.map} +1 -1
- package/dist/{chunk-VLMK7MQK.js → chunk-MNOO7STY.js} +25 -6
- package/dist/chunk-MNOO7STY.js.map +1 -0
- package/dist/{chunk-ZNOD4VZT.cjs → chunk-N56YC75X.cjs} +46 -46
- package/dist/{chunk-ZNOD4VZT.cjs.map → chunk-N56YC75X.cjs.map} +1 -1
- package/dist/{chunk-YQANC7HQ.js → chunk-PAG3BNIV.js} +3 -3
- package/dist/{chunk-YQANC7HQ.js.map → chunk-PAG3BNIV.js.map} +1 -1
- package/dist/{chunk-QSQX77S2.cjs → chunk-PG6TDGKI.cjs} +21 -21
- package/dist/{chunk-QSQX77S2.cjs.map → chunk-PG6TDGKI.cjs.map} +1 -1
- package/dist/{chunk-WYFXOXVK.cjs → chunk-Q5OFA4I2.cjs} +35 -35
- package/dist/{chunk-WYFXOXVK.cjs.map → chunk-Q5OFA4I2.cjs.map} +1 -1
- package/dist/{chunk-MJGDP3CS.cjs → chunk-QOLBWCF5.cjs} +488 -109
- package/dist/chunk-QOLBWCF5.cjs.map +1 -0
- package/dist/{chunk-MCFQAUQV.cjs → chunk-QXL7AY2H.cjs} +58 -39
- package/dist/chunk-QXL7AY2H.cjs.map +1 -0
- package/dist/chunk-SYYBKDL7.js +122 -0
- package/dist/chunk-SYYBKDL7.js.map +1 -0
- package/dist/{chunk-H2OEUBPO.js → chunk-TQU44E46.js} +441 -62
- package/dist/chunk-TQU44E46.js.map +1 -0
- package/dist/{chunk-FCGHV6ZK.js → chunk-U3KRKXF7.js} +4 -4
- package/dist/{chunk-FCGHV6ZK.js.map → chunk-U3KRKXF7.js.map} +1 -1
- package/dist/{chunk-3YZ6FPQW.cjs → chunk-UDGU73RL.cjs} +131 -131
- package/dist/{chunk-3YZ6FPQW.cjs.map → chunk-UDGU73RL.cjs.map} +1 -1
- package/dist/{chunk-U6L3FAML.js → chunk-UDJ2KN2A.js} +3 -3
- package/dist/{chunk-U6L3FAML.js.map → chunk-UDJ2KN2A.js.map} +1 -1
- package/dist/{chunk-FE6GAUNW.js → chunk-UT4TIDAA.js} +5 -5
- package/dist/{chunk-FE6GAUNW.js.map → chunk-UT4TIDAA.js.map} +1 -1
- package/dist/{chunk-SQKLKBBK.cjs → chunk-UWRTV6IV.cjs} +27 -8
- package/dist/chunk-UWRTV6IV.cjs.map +1 -0
- package/dist/{chunk-NB56L5QK.js → chunk-WTF6JXHN.js} +4 -4
- package/dist/{chunk-NB56L5QK.js.map → chunk-WTF6JXHN.js.map} +1 -1
- package/dist/{chunk-ZNDIGQJD.js → chunk-X5QJO4ZD.js} +3 -3
- package/dist/{chunk-ZNDIGQJD.js.map → chunk-X5QJO4ZD.js.map} +1 -1
- package/dist/{chunk-M5B2UUNW.js → chunk-XV2DTN6G.js} +4 -4
- package/dist/{chunk-M5B2UUNW.js.map → chunk-XV2DTN6G.js.map} +1 -1
- package/dist/{chunk-K2SOC3XF.cjs → chunk-YUPG2M3I.cjs} +71 -20
- package/dist/chunk-YUPG2M3I.cjs.map +1 -0
- package/dist/{chunk-2JDVJRR3.cjs → chunk-ZCW7YH3C.cjs} +28 -28
- package/dist/chunk-ZCW7YH3C.cjs.map +1 -0
- package/dist/{chunk-3FKS4KQK.cjs → chunk-ZFNZ2FYI.cjs} +88 -63
- package/dist/chunk-ZFNZ2FYI.cjs.map +1 -0
- package/dist/{chunk-5AEN2PLB.cjs → chunk-ZZJDGGC3.cjs} +33 -33
- package/dist/{chunk-5AEN2PLB.cjs.map → chunk-ZZJDGGC3.cjs.map} +1 -1
- package/dist/diagrams/blockdiagram/index.cjs +6 -6
- package/dist/diagrams/blockdiagram/index.d.cts +1 -1
- package/dist/diagrams/blockdiagram/index.d.ts +1 -1
- package/dist/diagrams/blockdiagram/index.js +2 -2
- 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 +8 -8
- package/dist/diagrams/ecomap/index.d.cts +1 -1
- package/dist/diagrams/ecomap/index.d.ts +1 -1
- package/dist/diagrams/ecomap/index.js +3 -3
- 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 +10 -10
- package/dist/diagrams/genogram/index.d.cts +1 -1
- package/dist/diagrams/genogram/index.d.ts +1 -1
- package/dist/diagrams/genogram/index.js +3 -3
- 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 +8 -8
- package/dist/diagrams/pedigree/index.d.cts +1 -1
- package/dist/diagrams/pedigree/index.d.ts +1 -1
- package/dist/diagrams/pedigree/index.js +3 -3
- 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 +6 -6
- package/dist/diagrams/sld/index.d.cts +1 -1
- package/dist/diagrams/sld/index.d.ts +1 -1
- package/dist/diagrams/sld/index.js +2 -2
- package/dist/diagrams/sociogram/index.cjs +7 -7
- package/dist/diagrams/sociogram/index.d.cts +1 -1
- package/dist/diagrams/sociogram/index.d.ts +1 -1
- package/dist/diagrams/sociogram/index.js +3 -3
- package/dist/diagrams/timing/index.cjs +5 -5
- package/dist/diagrams/timing/index.d.cts +1 -1
- package/dist/diagrams/timing/index.d.ts +1 -1
- package/dist/diagrams/timing/index.js +2 -2
- 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-CUwp4GXI.d.ts → index-D3u6vcA4.d.ts} +1 -1
- package/dist/{index-ivhNGsyU.d.cts → index-bdfj6FpQ.d.cts} +1 -1
- package/dist/index.cjs +41 -41
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +19 -19
- package/dist/react.cjs +20 -20
- package/dist/react.cjs.map +1 -1
- package/dist/react.js +19 -19
- package/dist/react.js.map +1 -1
- package/dist/{types-Bl-Pn7Wj.d.cts → types-DnU2UlWz.d.cts} +26 -3
- package/dist/{types-Bl-Pn7Wj.d.ts → types-DnU2UlWz.d.ts} +26 -3
- package/package.json +1 -1
- package/dist/chunk-2JDVJRR3.cjs.map +0 -1
- package/dist/chunk-3FKS4KQK.cjs.map +0 -1
- package/dist/chunk-45KP67RR.js.map +0 -1
- package/dist/chunk-B37IKTI7.cjs.map +0 -1
- package/dist/chunk-H2OEUBPO.js.map +0 -1
- package/dist/chunk-HDKDQAEQ.cjs.map +0 -1
- package/dist/chunk-K2SOC3XF.cjs.map +0 -1
- package/dist/chunk-KLJEK547.js +0 -71
- package/dist/chunk-KLJEK547.js.map +0 -1
- package/dist/chunk-MCFQAUQV.cjs.map +0 -1
- package/dist/chunk-MJGDP3CS.cjs.map +0 -1
- package/dist/chunk-NNU4RGT3.js.map +0 -1
- package/dist/chunk-OC22GGQN.js.map +0 -1
- package/dist/chunk-SQKLKBBK.cjs.map +0 -1
- package/dist/chunk-TYCHEOQX.js.map +0 -1
- package/dist/chunk-UGCUNADI.js.map +0 -1
- package/dist/chunk-VLMK7MQK.js.map +0 -1
- package/dist/chunk-XTATRNUN.cjs.map +0 -1
- package/dist/chunk-XZNPAD6E.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/diagrams/entity/parser.ts","../src/diagrams/entity/layout.ts","../src/diagrams/entity/renderer.ts","../src/diagrams/entity/index.ts"],"names":["text","title","path","textHalf"],"mappings":";;;;AAUO,IAAM,gBAAA,GAAN,cAA+B,KAAA,CAAM;AAAA,EAC1C,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,kBAAA;AAAA,EACd;AACF,CAAA;AAEA,IAAM,iBAAA,GAAgD;AAAA,EACpD,IAAA,EAAM,MAAA;AAAA,EACN,WAAA,EAAa,MAAA;AAAA,EACb,GAAA,EAAK,MAAA;AAAA,EACL,GAAA,EAAK,KAAA;AAAA,EACL,GAAA,EAAK,KAAA;AAAA,EACL,IAAA,EAAM,KAAA;AAAA,EACN,EAAA,EAAI,KAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,IAAA,EAAM,IAAA;AAAA,EACN,IAAA,EAAM,IAAA;AAAA,EACN,KAAA,EAAO,OAAA;AAAA,EACP,UAAA,EAAY,YAAA;AAAA,EACZ,MAAA,EAAQ,YAAA;AAAA,EACR,UAAA,EAAY,YAAA;AAAA,EACZ,GAAA,EAAK,YAAA;AAAA,EACL,WAAA,EAAa,aAAA;AAAA,EACb,MAAA,EAAQ,aAAA;AAAA,EACR,IAAA,EAAM,MAAA;AAAA,EACN,WAAA,EAAa,aAAA;AAAA,EACb,GAAA,EAAK;AACP,CAAA;AAEA,SAAS,aAAa,CAAA,EAAmB;AACvC,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,KAAA,MAAW,MAAM,CAAA,EAAG;AAClB,IAAA,IAAI,EAAA,KAAO,GAAA,EAAK,OAAA,GAAU,CAAC,OAAA;AAC3B,IAAA,IAAI,EAAA,KAAO,GAAA,IAAO,CAAC,OAAA,EAAS;AAC5B,IAAA,GAAA,IAAO,EAAA;AAAA,EACT;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,YAAY,CAAA,EAAmB;AACtC,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;AAGA,SAAS,oBAAoB,MAAA,EAA0B;AACrD,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,KAAA,MAAW,MAAM,MAAA,EAAQ;AACvB,IAAA,IAAI,EAAA,KAAO,GAAA,EAAK,OAAA,GAAU,CAAC,OAAA;AAC3B,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,IAAI,OAAO,GAAA,EAAK,KAAA,EAAA;AAAA,WAAA,IACP,OAAO,GAAA,EAAK,KAAA,EAAA;AAAA,IACvB;AACA,IAAA,IAAI,EAAA,KAAO,GAAA,IAAO,CAAC,OAAA,IAAW,UAAU,CAAA,EAAG;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,OAAO,KAAA;AACT;AAEA,SAAS,WAAW,MAAA,EAAwC;AAC1D,EAAA,MAAM,MAA8B,EAAC;AACrC,EAAA,KAAA,MAAW,CAAA,IAAK,mBAAA,CAAoB,MAAM,CAAA,EAAG;AAC3C,IAAA,MAAM,CAAA,GAAI,EAAE,IAAA,EAAK;AACjB,IAAA,IAAI,CAAC,CAAA,EAAG;AACR,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,OAAA,CAAQ,GAAG,CAAA;AAC3B,IAAA,IAAI,QAAQ,CAAA,EAAG,MAAM,IAAI,gBAAA,CAAiB,CAAA,kBAAA,EAAqB,CAAC,CAAA,eAAA,CAAiB,CAAA;AACjF,IAAA,MAAM,CAAA,GAAI,EAAE,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA,CAAE,IAAA,GAAO,WAAA,EAAY;AAC/C,IAAA,MAAM,IAAI,CAAA,CAAE,KAAA,CAAM,KAAA,GAAQ,CAAC,EAAE,IAAA,EAAK;AAClC,IAAA,GAAA,CAAI,CAAC,CAAA,GAAI,CAAA;AAAA,EACX;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,YAAY,CAAA,EAAqB;AACxC,EAAA,MAAM,CAAA,GAAI,EAAE,IAAA,EAAK;AACjB,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,KAAA,CACJ,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CACnB,MAAA,CAAO,OAAO,CAAA;AACnB;AAGA,SAAS,aAAa,KAAA,EAA2B;AAC/C,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,KAAA,MAAW,OAAO,KAAA,EAAO;AACvB,IAAA,MAAM,IAAA,GAAO,aAAa,GAAG,CAAA;AAC7B,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,EAAK,IAAK,UAAU,CAAA,EAAG;AAC/B,MAAA,IAAI,GAAA,EAAK;AACP,QAAA,GAAA,CAAI,KAAK,GAAG,CAAA;AACZ,QAAA,GAAA,GAAM,EAAA;AAAA,MACR;AACA,MAAA,GAAA,CAAI,KAAK,EAAE,CAAA;AACX,MAAA;AAAA,IACF;AACA,IAAA,KAAA,MAAW,MAAM,IAAA,EAAM;AACrB,MAAA,IAAI,OAAO,GAAA,EAAK,KAAA,EAAA;AAAA,WAAA,IACP,OAAO,GAAA,EAAK,KAAA,GAAQ,KAAK,GAAA,CAAI,CAAA,EAAG,QAAQ,CAAC,CAAA;AAAA,IACpD;AACA,IAAA,GAAA,GAAM,GAAA,GAAM,GAAA,GAAM,GAAA,GAAM,IAAA,CAAK,MAAK,GAAI,IAAA;AACtC,IAAA,IAAI,UAAU,CAAA,EAAG;AACf,MAAA,GAAA,CAAI,KAAK,GAAG,CAAA;AACZ,MAAA,GAAA,GAAM,EAAA;AAAA,IACR;AAAA,EACF;AACA,EAAA,IAAI,GAAA,EAAK,GAAA,CAAI,IAAA,CAAK,GAAG,CAAA;AACrB,EAAA,OAAO,GAAA;AACT;AAEA,IAAM,QAAA,GAAuD;AAAA;AAAA,EAE3D,EAAE,KAAA,EAAO,KAAA,EAAO,EAAA,EAAI,QAAA,EAAS;AAAA,EAC7B,EAAE,KAAA,EAAO,MAAA,EAAQ,EAAA,EAAI,MAAA,EAAO;AAAA,EAC5B,EAAE,KAAA,EAAO,MAAA,EAAQ,EAAA,EAAI,SAAA,EAAU;AAAA,EAC/B,EAAE,KAAA,EAAO,KAAA,EAAO,EAAA,EAAI,cAAA,EAAe;AAAA,EACnC,EAAE,KAAA,EAAO,IAAA,EAAM,EAAA,EAAI,WAAA;AACrB,CAAA;AAEA,SAAS,YAAY,IAAA,EAAqE;AACxF,EAAA,KAAA,MAAW,EAAE,KAAA,EAAO,EAAA,EAAG,IAAK,QAAA,EAAU;AAEpC,IAAA,MAAM,GAAA,GAAM,aAAA,CAAc,IAAA,EAAM,KAAK,CAAA;AACrC,IAAA,IAAI,GAAA,IAAO,GAAG,OAAO,EAAE,IAAI,GAAA,EAAK,GAAA,EAAK,MAAM,MAAA,EAAO;AAAA,EACpD;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,aAAA,CAAc,MAAc,KAAA,EAAuB;AAC1D,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,EAAA,GAAK,KAAK,CAAC,CAAA;AACjB,IAAA,IAAI,EAAA,KAAO,GAAA,EAAK,OAAA,GAAU,CAAC,OAAA;AAC3B,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,IAAI,OAAO,GAAA,EAAK,KAAA,EAAA;AAAA,WAAA,IACP,OAAO,GAAA,EAAK,KAAA,GAAQ,KAAK,GAAA,CAAI,CAAA,EAAG,QAAQ,CAAC,CAAA;AAAA,IACpD;AACA,IAAA,IAAI,CAAC,WAAW,KAAA,KAAU,CAAA,IAAK,KAAK,UAAA,CAAW,KAAA,EAAO,CAAC,CAAA,EAAG;AACxD,MAAA,OAAO,CAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,EAAA;AACT;AAEO,SAAS,eAAeA,KAAAA,EAAyB;AACtD,EAAA,MAAM,QAAA,GAAWA,KAAAA,CAAK,KAAA,CAAM,IAAI,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAC,CAAA;AACjE,EAAA,MAAM,KAAA,GAAQ,aAAa,QAAQ,CAAA;AAEnC,EAAA,IAAIC,MAAAA;AACJ,EAAA,MAAM,WAAyB,EAAC;AAChC,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAwB;AAC9C,EAAA,MAAM,QAAsB,EAAC;AAC7B,EAAA,MAAM,gBAAmC,EAAC;AAC1C,EAAA,MAAM,eAAA,uBAAsB,GAAA,EAA6B;AACzD,EAAA,MAAM,WAAyB,EAAC;AAEhC,EAAA,IAAI,cAAA,GAAiB,CAAA;AAErB,EAAA,KAAA,MAAW,OAAO,KAAA,EAAO;AACvB,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,EAAK;AACtB,IAAA,IAAI,CAAC,IAAA,EAAM;AAGX,IAAA,IAAI,sBAAA,CAAuB,IAAA,CAAK,IAAI,CAAA,EAAG;AACrC,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,WAAW,CAAA;AAChC,MAAA,IAAI,CAAA,EAAGA,MAAAA,GAAQ,CAAA,CAAE,CAAC,CAAA;AAClB,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,WAAW,IAAA,CAAK,KAAA;AAAA,MACpB;AAAA,KACF;AACA,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,CAAC,CAAA,CAAE,WAAA,EAAY;AACrC,MAAA,MAAM,IAAA,GAAO,SAAS,CAAC,CAAA;AACvB,MAAA,MAAM,KAAA,GAAQ,SAAS,CAAC,CAAA,GAAI,WAAW,QAAA,CAAS,CAAC,CAAC,CAAA,GAAI,EAAC;AACvD,MAAA,MAAM,GAAA,GAAuB,EAAE,IAAA,EAAM,IAAA,EAAK;AAC1C,MAAA,IAAI,MAAM,KAAA,EAAO,GAAA,CAAI,KAAA,GAAQ,WAAA,CAAY,MAAM,KAAK,CAAA;AACpD,MAAA,aAAA,CAAc,KAAK,GAAG,CAAA;AACtB,MAAA,eAAA,CAAgB,GAAA,CAAI,MAAM,GAAG,CAAA;AAC7B,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,+CAA+C,CAAA;AAC/E,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,MAAM,KAAA,GAAQ,aAAa,CAAC,CAAA;AAC5B,MAAA,MAAM,KAAA,GAAQ,aAAa,CAAC,CAAA,GAAI,WAAW,YAAA,CAAa,CAAC,CAAC,CAAA,GAAI,EAAC;AAC/D,MAAA,MAAM,GAAA,GAAkB;AAAA,QACtB,EAAA,EAAI,CAAA,QAAA,EAAW,EAAE,cAAc,CAAA,CAAA;AAAA,QAC/B,KAAA;AAAA,QACA,SAAS,KAAA,CAAM,OAAA,GAAU,YAAY,KAAA,CAAM,OAAO,IAAI;AAAC,OACzD;AACA,MAAA,IAAI,MAAM,KAAA,EAAO,GAAA,CAAI,KAAA,GAAQ,WAAA,CAAY,MAAM,KAAK,CAAA;AACpD,MAAA,QAAA,CAAS,KAAK,GAAG,CAAA;AACjB,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,cAAc,IAAA,CAAK,KAAA;AAAA,MACvB;AAAA,KACF;AACA,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,MAAM,EAAA,GAAK,YAAY,CAAC,CAAA;AACxB,MAAA,MAAM,IAAA,GAAO,YAAY,CAAC,CAAA;AAC1B,MAAA,MAAM,OAAA,GAAU,WAAA,CAAY,CAAC,CAAA,CAAE,WAAA,EAAY;AAC3C,MAAA,MAAM,gBAAA,GAAmB,WAAA,CAAY,CAAC,CAAA,EAAG,WAAA,EAAY;AACrD,MAAA,MAAM,QAAA,GAAW,YAAY,CAAC,CAAA;AAC9B,MAAA,MAAM,UAAA,GAAa,kBAAkB,OAAO,CAAA;AAC5C,MAAA,IAAI,CAAC,UAAA,EAAY;AACf,QAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,qBAAA,EAAwB,OAAO,CAAA,OAAA,EAAU,EAAE,CAAA,CAAA,CAAG,CAAA;AAAA,MAC3E;AACA,MAAA,IAAI,SAAA,CAAU,GAAA,CAAI,EAAE,CAAA,EAAG;AACrB,QAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,qBAAA,EAAwB,EAAE,CAAA,CAAA,CAAG,CAAA;AAAA,MAC1D;AACA,MAAA,MAAM,IAAA,GAAmB,EAAE,EAAA,EAAI,IAAA,EAAM,UAAA,EAAW;AAChD,MAAA,IAAI,gBAAA,OAAuB,YAAA,GAAe,gBAAA;AAC1C,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,MAAM,KAAA,GAAQ,WAAW,QAAQ,CAAA;AACjC,QAAA,IAAI,MAAM,MAAA,EAAQ,IAAA,CAAK,MAAA,GAAS,WAAA,CAAY,MAAM,MAAM,CAAA;AACxD,QAAA,IAAI,MAAM,GAAA,EAAK,IAAA,CAAK,QAAA,GAAW,WAAA,CAAY,MAAM,GAAG,CAAA;AACpD,QAAA,IAAI,MAAM,IAAA,EAAM,IAAA,CAAK,IAAA,GAAO,WAAA,CAAY,MAAM,IAAI,CAAA;AAClD,QAAA,IAAI,MAAM,IAAA,EAAM,IAAA,CAAK,IAAA,GAAO,WAAA,CAAY,MAAM,IAAI,CAAA;AAClD,QAAA,IAAI,MAAM,GAAA,EAAK,IAAA,CAAK,aAAA,GAAgB,WAAA,CAAY,MAAM,GAAG,CAAA;AAEzD,QAAA,MAAM,QAAA,uBAAe,GAAA,CAAI,CAAC,UAAU,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,KAAK,CAAC,CAAA;AACjE,QAAA,MAAM,SAAiC,EAAC;AACxC,QAAA,KAAA,MAAW,CAAA,IAAK,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,EAAG;AAClC,UAAA,IAAI,CAAC,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,EAAG,MAAA,CAAO,CAAC,CAAA,GAAI,WAAA,CAAY,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,QACxD;AACA,QAAA,IAAI,OAAO,IAAA,CAAK,MAAM,CAAA,CAAE,MAAA,OAAa,UAAA,GAAa,MAAA;AAAA,MACpD;AACA,MAAA,QAAA,CAAS,KAAK,IAAI,CAAA;AAClB,MAAA,SAAA,CAAU,GAAA,CAAI,IAAI,IAAI,CAAA;AACtB,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,QAAA,GAAW,YAAY,IAAI,CAAA;AACjC,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,OAAO,IAAA,CAAK,KAAA,CAAM,GAAG,QAAA,CAAS,GAAG,EAAE,IAAA,EAAK;AAC9C,MAAA,MAAM,IAAA,GAAO,KAAK,KAAA,CAAM,QAAA,CAAS,MAAM,QAAA,CAAS,GAAG,EAAE,IAAA,EAAK;AAC1D,MAAA,IAAI,CAAC,0BAAA,CAA2B,IAAA,CAAK,IAAI,CAAA,EAAG;AAC1C,QAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,6BAAA,EAAgC,IAAI,CAAA,CAAE,CAAA;AAAA,MACnE;AAEA,MAAA,MAAM,YAAY,IAAA,CAAK,KAAA;AAAA,QACrB;AAAA,OACF;AACA,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,mBAAA,EAAsB,IAAI,CAAA,CAAE,CAAA;AAAA,MACzD;AACA,MAAA,MAAM,EAAA,GAAK,UAAU,CAAC,CAAA;AACtB,MAAA,MAAM,GAAA,GAAM,SAAA,CAAU,CAAC,CAAA,EAAG,IAAA,EAAK;AAC/B,MAAA,MAAM,QAAA,GAAW,UAAU,CAAC,CAAA;AAC5B,MAAA,MAAM,OAAmB,EAAE,IAAA,EAAM,MAAM,EAAA,EAAI,EAAA,EAAI,SAAS,EAAA,EAAG;AAC3D,MAAA,IAAI,GAAA,OAAU,UAAA,GAAa,GAAA;AAC3B,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,MAAM,KAAA,GAAQ,WAAW,QAAQ,CAAA;AACjC,QAAA,IAAI,MAAM,KAAA,EAAO,IAAA,CAAK,UAAA,GAAa,WAAA,CAAY,MAAM,KAAK,CAAA;AAC1D,QAAA,IAAI,MAAM,KAAA,EAAO,IAAA,CAAK,KAAA,GAAQ,WAAA,CAAY,MAAM,KAAK,CAAA;AAAA,MACvD;AACA,MAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AACf,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,mBAAA,EAAsB,IAAI,CAAA,CAAE,CAAA;AAAA,EACzD;AAGA,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,IAAI,CAAC,SAAA,CAAU,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA,EAAG;AAC1B,MAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,gCAAA,EAAmC,CAAA,CAAE,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,IACzE;AACA,IAAA,IAAI,CAAC,SAAA,CAAU,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,EAAG;AACxB,MAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,gCAAA,EAAmC,CAAA,CAAE,EAAE,CAAA,CAAA,CAAG,CAAA;AAAA,IACvE;AAAA,EACF;AAEA,EAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,IAAA,MAAM,IAAI,iBAAiB,0CAA0C,CAAA;AAAA,EACvE;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,QAAA;AAAA,IACN,KAAA,EAAAA,MAAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACF;AACF;;;ACzQA,IAAM,QAAA,GAAW,GAAA;AACjB,IAAM,KAAA,GAAQ,EAAA;AACd,IAAM,OAAA,GAAU,EAAA;AAChB,IAAM,eAAA,GAAkB,EAAA;AACxB,IAAM,aAAA,GAAgB,EAAA;AAEf,SAAS,YAAY,IAAA,EAAqD;AAC/E,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,OAAA;AACH,MAAA,OAAO,EAAE,KAAA,EAAO,GAAA,EAAK,MAAA,EAAQ,EAAA,EAAG;AAAA;AAAA,IAClC,KAAK,YAAA;AACH,MAAA,OAAO,EAAE,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,EAAA,EAAG;AAAA;AAAA,IACjC,KAAK,YAAA;AACH,MAAA,OAAO,EAAE,KAAA,EAAO,GAAA,EAAK,MAAA,EAAQ,EAAA,EAAG;AAAA,IAClC,KAAK,MAAA;AAAA,IACL,KAAK,aAAA;AAAA,IACL,KAAK,aAAA;AAAA,IACL,KAAK,MAAA;AAAA,IACL,KAAK,KAAA;AAAA,IACL,KAAK,IAAA;AAAA,IACL;AACE,MAAA,OAAO,EAAE,KAAA,EAAO,GAAA,EAAK,MAAA,EAAQ,EAAA,EAAG;AAAA;AAEtC;AAEA,SAAS,aAAa,GAAA,EAAqC;AACzD,EAAA,MAAM,OAAA,uBAAc,GAAA,EAA0B;AAC9C,EAAA,MAAM,QAAA,uBAAe,GAAA,EAA0B;AAC/C,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,QAAA,EAAU;AAC5B,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,EAAE,CAAA;AACpB,IAAA,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,EAAE,CAAA;AAAA,EACvB;AACA,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,KAAA,EAAO;AACzB,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,EAAG,KAAK,CAAC,CAAA;AACzB,IAAA,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA,EAAG,KAAK,CAAC,CAAA;AAAA,EAC9B;AAIA,EAAA,MAAM,WAAA,GAAc,CAAC,CAAA,KACnB,CAAA,CAAE,EAAA,KAAO,eAAe,CAAA,CAAE,EAAA,KAAO,QAAA,IAAY,CAAA,CAAE,EAAA,KAAO,MAAA;AAExD,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAoB;AAEtC,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,QAAA,EAAU;AAC5B,IAAA,MAAM,MAAA,GAAA,CAAU,QAAQ,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,IAAK,EAAC,EAAG,MAAA,CAAO,WAAW,CAAA;AAC3D,IAAA,IAAI,OAAO,MAAA,KAAW,CAAA,QAAS,GAAA,CAAI,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,EAC5C;AAEA,EAAA,MAAM,OAAA,GAAU,GAAA,CAAI,QAAA,CAAS,MAAA,GAAS,CAAA;AACtC,EAAA,KAAA,IAAS,IAAA,GAAO,CAAA,EAAG,IAAA,GAAO,OAAA,EAAS,IAAA,EAAA,EAAQ;AACzC,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,KAAA,MAAW,CAAA,IAAK,IAAI,KAAA,EAAO;AACzB,MAAA,IAAI,CAAC,WAAA,CAAY,CAAC,CAAA,EAAG;AACrB,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA;AAC9B,MAAA,IAAI,UAAU,MAAA,EAAW;AACzB,MAAA,MAAM,OAAO,KAAA,GAAQ,CAAA;AACrB,MAAA,MAAM,GAAA,GAAM,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA;AAC1B,MAAA,IAAI,GAAA,KAAQ,MAAA,IAAa,IAAA,GAAO,GAAA,EAAK;AACnC,QAAA,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,IAAI,CAAA;AACpB,QAAA,OAAA,GAAU,IAAA;AAAA,MACZ;AAAA,IACF;AACA,IAAA,IAAI,CAAC,OAAA,EAAS;AAAA,EAChB;AAGA,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,KAAA,EAAO;AACzB,IAAA,IAAI,WAAA,CAAY,CAAC,CAAA,EAAG;AACpB,IAAA,IAAI,CAAC,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,EAAG;AACpB,MAAA,MAAM,GAAA,GAAM,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA;AAC5B,MAAA,IAAI,QAAQ,MAAA,EAAW,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,IAAI,GAAG,CAAA;AAAA,IAC5C;AACA,IAAA,IAAI,CAAC,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA,EAAG;AACtB,MAAA,MAAM,GAAA,GAAM,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA;AAC1B,MAAA,IAAI,QAAQ,MAAA,EAAW,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,MAAM,GAAG,CAAA;AAAA,IAC9C;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,QAAA,EAAU;AAC5B,IAAA,IAAI,CAAC,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,EAAE,GAAG,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,CAAC,CAAA;AAAA,EACzC;AACA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,aAAa,GAAA,EAAoC;AAC/D,EAAA,MAAM,KAAA,GAAQ,aAAa,GAAG,CAAA;AAC9B,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAG,MAAM,IAAA,CAAK,KAAA,CAAM,MAAA,EAAQ,CAAC,CAAA;AAGzD,EAAA,MAAM,MAAA,uBAAa,GAAA,EAA0B;AAC7C,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,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;AAGA,EAAA,MAAM,cAAkC,EAAC;AACzC,EAAA,MAAM,IAAA,uBAAW,GAAA,EAA8B;AAC/C,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,QAAA,EAAU;AAC5B,IAAA,MAAM,CAAA,GAAI,WAAA,CAAY,CAAA,CAAE,UAAU,CAAA;AAClC,IAAA,MAAM,CAAA,GAAI,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,IAAK,CAAA;AAC7B,IAAA,MAAM,EAAA,GAAuB;AAAA,MAC3B,IAAA,EAAM,CAAA;AAAA,MACN,CAAA,EAAG,CAAA;AAAA,MACH,CAAA,EAAG,OAAA,GAAU,CAAA,GAAI,QAAA,GAAW,EAAE,MAAA,GAAS,CAAA;AAAA,MACvC,IAAA,EAAM,CAAA;AAAA,MACN,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,QAAQ,CAAA,CAAE,MAAA;AAAA,MACV,IAAA,EAAM,CAAA;AAAA,MACN,OAAA,EAAS;AAAA,KACX;AACA,IAAA,EAAA,CAAG,IAAA,GAAO,EAAA,CAAG,CAAA,GAAI,CAAA,CAAE,MAAA,GAAS,CAAA;AAC5B,IAAA,EAAA,CAAG,OAAA,GAAU,EAAA,CAAG,CAAA,GAAI,CAAA,CAAE,MAAA,GAAS,CAAA;AAC/B,IAAA,WAAA,CAAY,KAAK,EAAE,CAAA;AACnB,IAAA,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,EAAE,CAAA;AAAA,EACnB;AAGA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,OAAA,EAAS,CAAA,EAAA,EAAK;AACjC,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,GAAA,CAAI,CAAC,KAAK,EAAC;AAChC,IAAA,IAAI,EAAA,GAAK,OAAA;AACT,IAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA;AACxB,MAAA,EAAA,IAAM,GAAG,KAAA,GAAQ,CAAA;AACjB,MAAA,EAAA,CAAG,CAAA,GAAI,EAAA;AACP,MAAA,EAAA,IAAM,EAAA,CAAG,QAAQ,CAAA,GAAI,KAAA;AAAA,IACvB;AAAA,EACF;AAGA,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAsB;AAC3C,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAsB;AAC1C,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,QAAA,EAAU;AAC5B,IAAA,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,EAAE,CAAA;AACrB,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,EAAE,CAAA;AAAA,EACtB;AACA,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,KAAA,EAAO;AACzB,IAAA,IAAI,CAAA,CAAE,OAAO,WAAA,IAAe,CAAA,CAAE,OAAO,QAAA,IAAY,CAAA,CAAE,OAAO,MAAA,EAAQ;AAChE,MAAA,QAAA,CAAS,IAAI,CAAA,CAAE,IAAI,CAAA,EAAG,IAAA,CAAK,EAAE,EAAE,CAAA;AAC/B,MAAA,OAAA,CAAQ,IAAI,CAAA,CAAE,EAAE,CAAA,EAAG,IAAA,CAAK,EAAE,IAAI,CAAA;AAAA,IAChC;AAAA,EACF;AAGA,EAAA,KAAA,IAAS,IAAA,GAAO,CAAA,EAAG,IAAA,GAAO,CAAA,EAAG,IAAA,EAAA,EAAQ;AACnC,IAAA,KAAA,IAAS,CAAA,GAAI,OAAA,GAAU,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACrC,MAAA,MAAM,SAAA,GAAY,MAAA,CAAO,GAAA,CAAI,CAAC,KAAK,EAAC;AACpC,MAAA,KAAA,MAAW,KAAK,SAAA,EAAW;AACzB,QAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA;AACxB,QAAA,MAAM,WAAW,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,EAAE,KAAK,EAAC;AACxC,QAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AAC3B,QAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AAGzB,UAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,QAAA,CAAS,CAAC,CAAC,CAAA;AAClC,UAAA,IAAI,CAAC,KAAA,EAAO;AACZ,UAAA,MAAM,cAAA,GAAA,CAAkB,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,IAAA,CAAK,EAAE,CAAA,IAAK,EAAC,EACpD,GAAA,CAAI,CAAC,GAAA,KAAQ,KAAK,GAAA,CAAI,GAAG,CAAC,CAAA,CAC1B,MAAA,CAAO,CAAC,CAAA,KAA6B,CAAC,CAAC,CAAA,IAAK,CAAA,CAAE,IAAA,KAAS,CAAC,CAAA;AAC3D,UAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAC7B,YAAA,cAAA,CAAe,IAAA;AAAA,cACb,CAAC,GAAG,CAAA,KAAA,CACD,MAAA,CAAO,IAAI,CAAC,CAAA,IAAK,EAAC,EAAG,OAAA,CAAQ,EAAE,IAAI,CAAA,GAAA,CACnC,OAAO,GAAA,CAAI,CAAC,KAAK,EAAC,EAAG,OAAA,CAAQ,CAAA,CAAE,IAAI;AAAA,aACxC;AACA,YAAA,MAAM,aAAa,cAAA,CAAe,MAAA;AAAA,cAChC,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,GAAM,kBAAA,CAAmB,CAAC,CAAA,GAAI,CAAA;AAAA,cAC1C;AAAA,aACF;AACA,YAAA,MAAM,SAAS,IAAA,CAAK,GAAA;AAAA,cAClB,KAAA,GAAA,CAAS,mBAAmB,EAAE,CAAA,GAAI,mBAAmB,cAAA,CAAe,CAAC,CAAC,CAAA,IAAK,CAAA;AAAA,cAC3E,aAAa,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,cAAA,CAAe,SAAS,CAAC;AAAA,aACpD;AACA,YAAA,MAAM,GAAA,GAAM,cAAA,CAAe,OAAA,CAAQ,EAAE,CAAA;AACrC,YAAA,MAAM,KAAK,cAAA,CAAe,MAAA;AAC1B,YAAA,EAAA,CAAG,IAAI,KAAA,CAAM,CAAA,GAAA,CAAK,GAAA,GAAA,CAAO,EAAA,GAAK,KAAK,CAAA,IAAK,MAAA;AAAA,UAC1C,CAAA,MAAO;AACL,YAAA,EAAA,CAAG,IAAI,KAAA,CAAM,CAAA;AAAA,UACf;AACA,UAAA;AAAA,QACF;AACA,QAAA,MAAM,EAAA,GAAK,QAAA,CACR,GAAA,CAAI,CAAC,MAAM,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG,CAAC,CAAA,CACzB,MAAA,CAAO,CAAC,CAAA,KAAmB,MAAM,MAAS,CAAA;AAC7C,QAAA,IAAI,EAAA,CAAG,SAAS,CAAA,EAAG;AACjB,UAAA,EAAA,CAAG,CAAA,GAAA,CAAK,IAAA,CAAK,GAAA,CAAI,GAAG,EAAE,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,EAAE,CAAA,IAAK,CAAA;AAAA,QAC/C;AAAA,MACF;AAAA,IACF;AAGA,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,OAAA,EAAS,CAAA,EAAA,EAAK;AACjC,MAAA,MAAM,SAAA,GAAY,MAAA,CAAO,GAAA,CAAI,CAAC,KAAK,EAAC;AACpC,MAAA,KAAA,MAAW,KAAK,SAAA,EAAW;AACzB,QAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA;AACxB,QAAA,MAAM,YAAY,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,EAAE,KAAK,EAAC;AACxC,QAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AAC1B,QAAA,MAAM,EAAA,GAAK,SAAA,CACR,GAAA,CAAI,CAAC,MAAM,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG,CAAC,CAAA,CACzB,MAAA,CAAO,CAAC,CAAA,KAAmB,MAAM,MAAS,CAAA;AAC7C,QAAA,IAAI,EAAA,CAAG,SAAS,CAAA,EAAG;AACjB,UAAA,EAAA,CAAG,CAAA,GAAA,CAAK,IAAA,CAAK,GAAA,CAAI,GAAG,EAAE,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,EAAE,CAAA,IAAK,CAAA;AAAA,QAC/C;AAAA,MACF;AAAA,IACF;AAGA,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,OAAA,EAAS,CAAA,EAAA,EAAK;AACjC,MAAA,MAAM,SAAA,GAAA,CAAa,OAAO,GAAA,CAAI,CAAC,KAAK,EAAC,EAClC,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,IAAI,CAAA,CAAE,EAAE,CAAE,CAAA,CAC1B,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA;AAC3B,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,SAAA,CAAU,QAAQ,CAAA,EAAA,EAAK;AACzC,QAAA,MAAM,IAAA,GAAO,SAAA,CAAU,CAAA,GAAI,CAAC,CAAA;AAC5B,QAAA,MAAM,GAAA,GAAM,UAAU,CAAC,CAAA;AACvB,QAAA,MAAM,MAAM,kBAAA,CAAmB,IAAI,CAAA,GAAI,kBAAA,CAAmB,GAAG,CAAA,GAAI,KAAA;AACjE,QAAA,IAAI,GAAA,CAAI,IAAI,IAAA,CAAK,CAAA,GAAI,KAAK,GAAA,CAAI,CAAA,GAAI,KAAK,CAAA,GAAI,GAAA;AAAA,MAC7C;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,OAAA,GAAU,QAAA;AACd,EAAA,KAAA,MAAW,MAAM,WAAA,EAAa;AAC5B,IAAA,MAAM,IAAA,GAAO,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,KAAA,GAAQ,CAAA;AAC/B,IAAA,IAAI,IAAA,GAAO,SAAS,OAAA,GAAU,IAAA;AAAA,EAChC;AACA,EAAA,MAAM,QAAQ,OAAA,GAAU,OAAA;AACxB,EAAA,IAAI,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,GAAI,GAAA,EAAK;AACzB,IAAA,KAAA,MAAW,EAAA,IAAM,WAAA,EAAa,EAAA,CAAG,CAAA,IAAK,KAAA;AAAA,EACxC;AAaA,EAAA,MAAM,QAA4B,EAAC;AACnC,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,KAAA,EAAO;AACzB,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA;AAC5B,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA;AACxB,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,EAAA,EAAI;AAElB,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,KAAS,EAAA,CAAG,IAAA;AAClC,IAAA,IAAIC,KAAAA;AACJ,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI,MAAA;AAEJ,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,CAAA,GAAI,EAAA,CAAG,CAAA;AAC9B,MAAA,MAAM,EAAA,GAAK,SAAA,GAAY,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,GAAI,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,KAAA,GAAQ,CAAA;AACvE,MAAA,MAAM,EAAA,GAAK,SAAA,GAAY,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,QAAQ,CAAA,GAAI,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,KAAA,GAAQ,CAAA;AAC/D,MAAAA,KAAAA,GAAO,CAAA,EAAA,EAAK,EAAE,CAAA,CAAA,EAAI,IAAA,CAAK,CAAC,CAAA,GAAA,EAAM,EAAE,CAAA,CAAA,EAAI,EAAA,CAAG,CAAC,CAAA,CAAA;AACxC,MAAA,MAAA,GAAA,CAAU,KAAK,EAAA,IAAM,CAAA;AACrB,MAAA,MAAA,GAAS,KAAK,CAAA,GAAI,CAAA;AAAA,IACpB,CAAA,MAAO;AACL,MAAA,MAAM,KAAK,IAAA,CAAK,CAAA;AAChB,MAAA,MAAM,KAAK,IAAA,CAAK,OAAA;AAChB,MAAA,MAAM,KAAK,EAAA,CAAG,CAAA;AACd,MAAA,MAAM,KAAK,EAAA,CAAG,IAAA;AACd,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,EAAE,CAAA,GAAI,GAAA;AAErC,MAAA,IAAI,QAAA,EAAU;AAEZ,QAAAA,KAAAA,GAAO,KAAK,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,GAAA,EAAM,EAAE,IAAI,EAAE,CAAA,CAAA;AAClC,QAAA,MAAA,GAAS,EAAA;AACT,QAAA,MAAA,GAAA,CAAU,KAAK,EAAA,IAAM,CAAA;AAAA,MACvB,CAAA,MAAO;AAIL,QAAA,MAAM,IAAA,GAAA,CAAQ,KAAK,EAAA,IAAM,CAAA;AACzB,QAAAA,QAAO,CAAA,EAAA,EAAK,EAAE,CAAA,CAAA,EAAI,EAAE,MAAM,EAAE,CAAA,CAAA,EAAI,IAAI,CAAA,GAAA,EAAM,EAAE,CAAA,CAAA,EAAI,IAAI,CAAA,GAAA,EAAM,EAAE,IAAI,EAAE,CAAA,CAAA;AAElE,QAAA,MAAM,MAAA,GACJ,EAAE,EAAA,KAAO,WAAA,IAAe,EAAE,EAAA,KAAO,QAAA,IAAY,EAAE,EAAA,KAAO,MAAA;AACxD,QAAA,MAAM,WAAA,GAAc,UAAU,OAAA,CAAQ,GAAA,CAAI,EAAE,EAAE,CAAA,IAAK,EAAC,EAAG,MAAA,GAAS,CAAA;AAChE,QAAA,MAAM,QAAQ,WAAA,GAAc,CAAA;AAO5B,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,MAAA,GAAS,EAAA;AACT,UAAA,MAAA,GAAS,IAAA;AAAA,QACX,CAAA,MAAO;AACL,UAAA,MAAA,GAAS,EAAA;AACT,UAAA,MAAA,GAAS,IAAA;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAEA,IAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA,EAAG,MAAAA,KAAAA,EAAM,MAAA,EAAQ,QAAQ,CAAA;AAAA,EAC9C;AAGA,EAAA,MAAM,iBAAwC,EAAC;AAC/C,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAEhC,EAAA,MAAM,SAAA,GAAY,EAAA;AAElB,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,QAAA,EAAU;AAC5B,IAAA,MAAM,UAAU,CAAA,CAAE,OAAA,CACf,GAAA,CAAI,CAAC,OAAO,IAAA,CAAK,GAAA,CAAI,EAAE,CAAC,EACxB,MAAA,CAAO,CAAC,CAAA,KAA6B,CAAC,CAAC,CAAC,CAAA;AAC3C,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC1B,IAAA,MAAM,MAAA,GAAS,YAAY,OAAO,CAAA;AAClC,IAAA,cAAA,CAAe,IAAA,CAAK;AAAA,MAClB,IAAI,CAAA,CAAE,EAAA;AAAA,MACN,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,CAAA,EAAG,OAAO,IAAA,GAAO,eAAA;AAAA,MACjB,CAAA,EAAG,MAAA,CAAO,IAAA,GAAO,eAAA,GAAkB,SAAA;AAAA,MACnC,KAAA,EAAO,MAAA,CAAO,IAAA,GAAO,MAAA,CAAO,OAAO,eAAA,GAAkB,CAAA;AAAA,MACrD,QAAQ,MAAA,CAAO,IAAA,GAAO,MAAA,CAAO,IAAA,GAAO,kBAAkB,CAAA,GAAI;AAAA,KAC3D,CAAA;AACD,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,KAAK,EAAE,CAAA;AAAA,EAChD;AAGA,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,aAAA,EAAe;AACjC,IAAA,MAAM,UAAU,WAAA,CAAY,MAAA;AAAA,MAC1B,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,CAAK,YAAA,KAAiB,CAAA,CAAE,IAAA,IAAQ,CAAC,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,IAAA,CAAK,EAAE;AAAA,KACjE;AACA,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC1B,IAAA,MAAM,MAAA,GAAS,YAAY,OAAO,CAAA;AAClC,IAAA,cAAA,CAAe,IAAA,CAAK;AAAA,MAClB,EAAA,EAAI,CAAA,IAAA,EAAO,CAAA,CAAE,IAAI,CAAA,CAAA;AAAA,MACjB,OAAO,CAAA,CAAE,IAAA;AAAA,MACT,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,CAAA,EAAG,OAAO,IAAA,GAAO,eAAA;AAAA,MACjB,CAAA,EAAG,MAAA,CAAO,IAAA,GAAO,eAAA,GAAkB,SAAA;AAAA,MACnC,KAAA,EAAO,MAAA,CAAO,IAAA,GAAO,MAAA,CAAO,OAAO,eAAA,GAAkB,CAAA;AAAA,MACrD,QAAQ,MAAA,CAAO,IAAA,GAAO,MAAA,CAAO,IAAA,GAAO,kBAAkB,CAAA,GAAI;AAAA,KAC3D,CAAA;AACD,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,KAAK,EAAE,CAAA;AAAA,EAChD;AAKA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,cAAA,CAAe,QAAQ,CAAA,EAAA,EAAK;AAC9C,IAAA,KAAA,IAAS,IAAI,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,cAAA,CAAe,QAAQ,CAAA,EAAA,EAAK;AAClD,MAAA,MAAM,CAAA,GAAI,eAAe,CAAC,CAAA;AAC1B,MAAA,MAAM,CAAA,GAAI,eAAe,CAAC,CAAA;AAC1B,MAAA,MAAM,QAAA,GAAW,EAAE,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,CAAA,IAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,CAAA,CAAA;AAC5D,MAAA,MAAM,QAAA,GAAW,EAAE,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,MAAA,GAAS,CAAA,CAAE,CAAA,IAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,MAAA,GAAS,CAAA,CAAE,CAAA,CAAA;AAC9D,MAAA,IAAI,CAAC,QAAA,IAAY,CAAC,QAAA,EAAU;AAE5B,MAAA,MAAM,CAAC,GAAA,EAAK,GAAG,CAAA,GAAI,EAAE,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,CAAC,CAAA,EAAG,CAAC,CAAA,GAAI,CAAC,GAAG,CAAC,CAAA;AAC7C,MAAA,MAAM,IAAA,GAAO,IAAI,CAAA,GAAI,aAAA;AACrB,MAAA,IAAI,GAAA,CAAI,CAAA,GAAI,GAAA,CAAI,MAAA,GAAS,IAAA,EAAM,GAAA,CAAI,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAA,GAAO,GAAA,CAAI,CAAC,CAAA;AAAA,IACvE;AAAA,EACF;AAGA,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,KAAA,MAAW,MAAM,WAAA,EAAa;AAC5B,IAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,KAAA,GAAQ,CAAA;AAChC,IAAA,MAAM,MAAA,GAAS,GAAG,OAAA,GAAU,EAAA;AAC5B,IAAA,IAAI,KAAA,GAAQ,MAAM,IAAA,GAAO,KAAA;AACzB,IAAA,IAAI,MAAA,GAAS,MAAM,IAAA,GAAO,MAAA;AAAA,EAC5B;AACA,EAAA,KAAA,MAAW,KAAK,cAAA,EAAgB;AAC9B,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,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,OAAO,OAAO,CAAA;AAC1C,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,OAAO,OAAO,CAAA;AAE3C,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,MAAA;AAAA,IACA,KAAA,EAAO,WAAA;AAAA,IACP,QAAA,EAAU,IAAA;AAAA,IACV,KAAA;AAAA,IACA,QAAA,EAAU;AAAA,GACZ;AACF;AAOA,SAAS,mBAAmB,EAAA,EAA8B;AACxD,EAAA,MAAM,IAAI,EAAA,CAAG,IAAA;AACb,EAAA,MAAM,SAAA,GAAY,GAAG,KAAA,GAAQ,CAAA;AAC7B,EAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAwB,CAAA,GAAI,EAAE,MAAA,GAAS,CAAA;AACxD,EAAA,IAAI,CAAA,CAAE,eAAe,YAAA,EAAc;AACjC,IAAA,MAAM,UAAU,IAAA,CAAK,GAAA;AAAA,MACnB,OAAA,CAAQ,EAAE,IAAI,CAAA;AAAA,MACd,OAAA,CAAQ,EAAE,IAAI,CAAA;AAAA,MACd,OAAA,CAAQ,EAAE,IAAI;AAAA,KAChB;AACA,IAAA,MAAMC,SAAAA,GAAY,OAAA,GAAU,GAAA,GAAO,CAAA,GAAI,CAAA;AACvC,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,SAAA,EAAWA,SAAQ,CAAA;AAAA,EACrC;AAEA,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,CAAA,CAAE,IAAI,CAAA,EAAG,OAAA,CAAQ,CAAA,CAAE,IAAI,CAAC,CAAA;AAC9D,EAAA,MAAM,QAAA,GAAY,YAAA,GAAe,CAAA,GAAK,CAAA,GAAI,CAAA;AAC1C,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,SAAA,EAAW,QAAQ,CAAA;AACrC;AAEA,SAAS,YAAY,KAAA,EAKnB;AACA,EAAA,IAAI,IAAA,GAAO,QAAA;AACX,EAAA,IAAI,IAAA,GAAO,CAAA,QAAA;AACX,EAAA,IAAI,IAAA,GAAO,QAAA;AACX,EAAA,IAAI,IAAA,GAAO,CAAA,QAAA;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,QAAQ,CAAC,CAAA;AACvC,IAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,CAAA,CAAE,IAAI,CAAA;AAC5B,IAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,CAAA,CAAE,UAAU,EAAE,CAAA;AAAA,EACtC;AACA,EAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAK;AAClC;;;AC1cA,SAAS,SAAS,CAAA,EAAsB;AACtC,EAAA,OAAO;AAAA,yBAAA,EACkB,EAAE,EAAE,CAAA;AAAA,qDAAA,EACwB,EAAE,IAAI,CAAA;AAAA,mDAAA,EACR,EAAE,IAAI,CAAA;AAAA,mDAAA,EACN,EAAE,SAAS,CAAA;AAAA,sDAAA,EACR,EAAE,SAAS,CAAA;AAAA,+CAAA,EAClB,EAAE,SAAS,CAAA;AAAA,4BAAA,EAC9B,CAAA,CAAE,EAAE,CAAA,UAAA,EAAa,CAAA,CAAE,OAAO,CAAA;AAAA,wDAAA,EACE,EAAE,IAAI,CAAA;AAAA,0BAAA,EACpC,EAAE,MAAM,CAAA;AAAA,iCAAA,EACD,EAAE,MAAM,CAAA;AAAA,+BAAA,EACV,EAAE,OAAO,CAAA;AAAA,kCAAA,EACN,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,uCAAA,EACP,EAAE,QAAQ,CAAA;AAAA,sCAAA,EACX,EAAE,MAAM,CAAA;AAAA,4BAAA,EAClB,CAAA,CAAE,EAAE,CAAA,UAAA,EAAa,CAAA,CAAE,OAAO,CAAA;AAAA,oDAAA,EACF,EAAE,IAAI,CAAA;AAAA,uDAAA,EACH,EAAE,SAAS,CAAA;AAAA;AAAA,oCAAA,EAE9B,EAAE,EAAE,CAAA;AAAA;AAAA,gCAAA,EAER,EAAE,QAAQ,CAAA;AAAA,uCAAA,EACH,EAAE,QAAQ,CAAA;AAAA,qCAAA,EACZ,EAAE,IAAI,CAAA;AAAA;AAAA,CAAA,CAE3C,IAAA,EAAK;AACP;AAEA,IAAM,IAAA,GAA+B;AAAA,EACnC,IAAA,EAAM,SAAA;AAAA,EACN,GAAA,EAAK,SAAA;AAAA,EACL,EAAA,EAAI,SAAA;AAAA,EACJ,KAAA,EAAO,SAAA;AAAA,EACP,UAAA,EAAY,SAAA;AAAA,EACZ,UAAA,EAAY,SAAA;AAAA,EACZ,WAAA,EAAa,SAAA;AAAA,EACb,IAAA,EAAM,SAAA;AAAA,EACN,WAAA,EAAa;AACf,CAAA;AAEA,IAAM,UAAA,GAAqC;AAAA,EACzC,IAAA,EAAM,aAAA;AAAA,EACN,GAAA,EAAK,KAAA;AAAA,EACL,EAAA,EAAI,WAAA;AAAA,EACJ,KAAA,EAAO,OAAA;AAAA,EACP,UAAA,EAAY,YAAA;AAAA,EACZ,UAAA,EAAY,YAAA;AAAA,EACZ,WAAA,EAAa,oBAAA;AAAA,EACb,IAAA,EAAM,eAAA;AAAA,EACN,WAAA,EAAa;AACf,CAAA;AAEA,SAAS,YAAY,IAAA,EAAsC;AACzD,EAAA,QAAQ,KAAK,MAAA;AAAQ,IACnB,KAAK,KAAA;AACH,MAAA,OAAO,sBAAA;AAAA,IACT,KAAK,YAAA;AACH,MAAA,OAAO,6BAAA;AAAA,IACT,KAAK,UAAA;AACH,MAAA,OAAO,2BAAA;AAAA,IACT;AACE,MAAA,OAAO,MAAA;AAAA;AAEb;AAEA,SAAS,WAAA,CAAY,IAAsB,CAAA,EAAsB;AAC/D,EAAA,MAAM,IAAI,EAAA,CAAG,IAAA;AACb,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,CAAA,CAAE,UAAU,KAAK,CAAA,CAAE,EAAA;AACrC,EAAA,MAAM,EAAA,GAAK,YAAY,CAAC,CAAA;AACxB,EAAA,MAAM,WAAA,GAA+C;AAAA,IACnD,IAAA;AAAA,IACA,QAAQ,CAAA,CAAE,MAAA;AAAA,IACV,cAAA,EAAgB;AAAA,GAClB;AACA,EAAA,IAAI,EAAA,EAAI;AACN,IAAA,WAAA,CAAY,KAAA,GAAQ,EAAA;AAAA,EACtB;AAEA,EAAA,MAAM,MAAA,GACJ,EAAE,UAAA,KAAe,aAAA,IACjB,EAAE,UAAA,KAAe,aAAA,IACjB,EAAE,UAAA,KAAe,MAAA;AAEnB,EAAA,MAAM,WAAW,MAAA,GAAS,EAAE,kBAAA,EAAoB,KAAA,KAAU,EAAC;AAC3D,EAAA,MAAM,OAAA,GAAU,EAAE,UAAA,KAAe,aAAA,GAAgB,EAAE,OAAA,EAAS,IAAA,KAAS,EAAC;AAEtE,EAAA,MAAM,CAAA,GAAI,CAAC,EAAA,CAAG,KAAA,GAAQ,CAAA;AACtB,EAAA,MAAM,CAAA,GAAI,CAAC,EAAA,CAAG,MAAA,GAAS,CAAA;AAEvB,EAAA,QAAQ,EAAE,UAAA;AAAY,IACpB,KAAK,MAAA;AACH,MAAA,OAAO,IAAA,CAAK;AAAA,QACV,CAAA;AAAA,QACA,CAAA;AAAA,QACA,OAAO,EAAA,CAAG,KAAA;AAAA,QACV,QAAQ,EAAA,CAAG,MAAA;AAAA,QACX,EAAA,EAAI,CAAA;AAAA,QACJ,GAAG,WAAA;AAAA,QACH,GAAG;AAAA,OACJ,CAAA;AAAA,IACH,KAAK,KAAA;AACH,MAAA,OAAO,IAAA,CAAK;AAAA,QACV,CAAA;AAAA,QACA,CAAA;AAAA,QACA,OAAO,EAAA,CAAG,KAAA;AAAA,QACV,QAAQ,EAAA,CAAG,MAAA;AAAA,QACX,EAAA,EAAI,EAAA;AAAA,QACJ,EAAA,EAAI,EAAA;AAAA,QACJ,GAAG;AAAA,OACJ,CAAA;AAAA,IACH,KAAK,IAAA,EAAM;AAET,MAAA,MAAM,IAAI,EAAA,CAAG,KAAA;AACb,MAAA,MAAM,IAAI,EAAA,CAAG,MAAA;AACb,MAAA,MAAM,KAAA,GAAQ,EAAA;AACd,MAAA,MAAM,GAAA,GAAM;AAAA,QACV,CAAC,CAAA,GAAI,KAAA,EAAO,CAAC,CAAA;AAAA,QACb,CAAC,CAAA,GAAI,CAAA,GAAI,KAAA,EAAO,CAAC,CAAA;AAAA,QACjB,CAAC,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAK,CAAA;AAAA,QACjB,CAAC,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAC,CAAA;AAAA,QACb,CAAC,CAAA,EAAG,CAAA,GAAI,CAAC,CAAA;AAAA,QACT,CAAC,CAAA,EAAG,CAAA,GAAI,KAAK;AAAA,OACf,CACG,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,KAAK,GAAG,CAAC,CAAA,CACtB,IAAA,CAAK,GAAG,CAAA;AACX,MAAA,OAAO,QAAQ,EAAE,MAAA,EAAQ,GAAA,EAAK,GAAG,aAAa,CAAA;AAAA,IAChD;AAAA,IACA,KAAK,OAAA;AACH,MAAA,OAAO,GAAG,SAAA,EAAW;AAAA,QACnB,EAAA,EAAI,CAAA;AAAA,QACJ,EAAA,EAAI,CAAA;AAAA,QACJ,EAAA,EAAI,GAAG,KAAA,GAAQ,CAAA;AAAA,QACf,EAAA,EAAI,GAAG,MAAA,GAAS,CAAA;AAAA,QAChB,GAAG;AAAA,OACJ,CAAA;AAAA,IACH,KAAK,YAAA;AACH,MAAA,OAAO,MAAA,CAAO;AAAA,QACZ,EAAA,EAAI,CAAA;AAAA,QACJ,EAAA,EAAI,CAAA;AAAA,QACJ,CAAA,EAAG,KAAK,GAAA,CAAI,EAAA,CAAG,OAAO,EAAA,CAAG,MAAM,IAAI,CAAA,GAAI,CAAA;AAAA,QACvC,GAAG;AAAA,OACJ,CAAA;AAAA,IACH,KAAK,YAAA,EAAc;AACjB,MAAA,MAAM,IAAI,EAAA,CAAG,KAAA;AACb,MAAA,MAAM,IAAI,EAAA,CAAG,MAAA;AACb,MAAA,MAAM,GAAA,GAAM,EAAA;AACZ,MAAA,MAAM,GAAA,GAAM;AAAA,QACV,CAAC,CAAA,GAAI,CAAA,GAAI,CAAA,EAAG,IAAI,GAAG,CAAA;AAAA,QACnB,CAAC,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA;AAAA,QACT,CAAC,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAC,CAAA;AAAA,QACb,CAAC,CAAA,EAAG,CAAA,GAAI,CAAC,CAAA;AAAA,QACT,CAAC,GAAG,CAAC;AAAA,OACP,CACG,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,KAAK,GAAG,CAAC,CAAA,CACtB,IAAA,CAAK,GAAG,CAAA;AACX,MAAA,OAAO,QAAQ,EAAE,MAAA,EAAQ,GAAA,EAAK,GAAG,aAAa,CAAA;AAAA,IAChD;AAAA,IACA,KAAK,aAAA;AACH,MAAA,OAAO,IAAA,CAAK;AAAA,QACV,CAAA;AAAA,QACA,CAAA;AAAA,QACA,OAAO,EAAA,CAAG,KAAA;AAAA,QACV,QAAQ,EAAA,CAAG,MAAA;AAAA,QACX,GAAG,WAAA;AAAA,QACH,GAAG;AAAA,OACJ,CAAA;AAAA,IACH,KAAK,MAAA;AACH,MAAA,OAAO,IAAA,CAAK;AAAA,QACV,CAAA;AAAA,QACA,CAAA;AAAA,QACA,OAAO,EAAA,CAAG,KAAA;AAAA,QACV,QAAQ,EAAA,CAAG,MAAA;AAAA,QACX,EAAA,EAAI,CAAA;AAAA,QACJ,EAAA,EAAI,CAAA;AAAA,QACJ,GAAG,WAAA;AAAA,QACH,GAAG;AAAA,OACJ,CAAA;AAAA,IACH,KAAK,aAAA;AACH,MAAA,OAAO,IAAA,CAAK;AAAA,QACV,CAAA;AAAA,QACA,CAAA;AAAA,QACA,OAAO,EAAA,CAAG,KAAA;AAAA,QACV,QAAQ,EAAA,CAAG,MAAA;AAAA,QACX,EAAA,EAAI,CAAA;AAAA,QACJ,EAAA,EAAI,CAAA;AAAA,QACJ,GAAG,WAAA;AAAA,QACH,GAAG,QAAA;AAAA,QACH,GAAG;AAAA,OACJ,CAAA;AAAA;AAEP;AAEA,SAAS,YAAY,EAAA,EAA0C;AAC7D,EAAA,MAAM,CAAA,GAAI,GAAG,IAAA,CAAK,YAAA;AAClB,EAAA,IAAI,CAAC,GAAG,OAAO,MAAA;AACf,EAAA,MAAM,EAAA,GAAK,CAAA,CAAE,MAAA,IAAU,CAAA,GAAI,EAAA,GAAK,EAAA;AAChC,EAAA,MAAM,EAAA,GAAK,EAAA;AAEX,EAAA,MAAM,EAAA,GAAK,EAAA,CAAG,KAAA,GAAQ,CAAA,GAAI,EAAA,GAAK,CAAA;AAC/B,EAAA,MAAM,EAAA,GAAK,CAAC,EAAA,CAAG,MAAA,GAAS,CAAA,GAAI,CAAA;AAC5B,EAAA,OAAO,KAAA,CAAM,EAAC,EAAG;AAAA,IACf,IAAA,CAAK,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA,EAAI,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,EAAA,EAAI,EAAA,EAAI,CAAA,EAAG,KAAA,EAAO,sBAAsB,CAAA;AAAA,IAChF,IAAA;AAAA,MACE,EAAE,CAAA,EAAG,EAAA,GAAK,EAAA,GAAK,CAAA,EAAG,GAAG,EAAA,GAAK,EAAA,GAAK,CAAA,EAAG,KAAA,EAAO,sBAAA,EAAuB;AAAA,MAChE;AAAA;AACF,GACD,CAAA;AACH;AAEA,SAAS,eAAA,CAAgB,IAAsB,CAAA,EAAkC;AAC/E,EAAA,MAAM,IAAI,EAAA,CAAG,IAAA;AACb,EAAA,IAAI,CAAC,CAAA,CAAE,MAAA,IAAU,CAAA,CAAE,MAAA,KAAW,UAAU,OAAO,MAAA;AAC/C,EAAA,MAAM,GAAA,GAAwD;AAAA,IAC5D,KAAK,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,EAAE,QAAA,EAAS;AAAA,IACvC,YAAY,EAAE,KAAA,EAAO,YAAA,EAAc,KAAA,EAAO,EAAE,QAAA,EAAS;AAAA,IACrD,UAAU,EAAE,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,EAAE,IAAA;AAAK,GAC/C;AACA,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,CAAA,CAAE,MAAM,CAAA;AACzB,EAAA,IAAI,CAAC,MAAM,OAAO,MAAA;AAClB,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,CAAA;AAClC,EAAA,MAAM,CAAA,GAAI,EAAA;AACV,EAAA,MAAM,CAAA,GAAI,CAAC,EAAA,CAAG,KAAA,GAAQ,CAAA,GAAI,CAAA;AAC1B,EAAA,MAAM,CAAA,GAAI,CAAC,EAAA,CAAG,MAAA,GAAS,IAAI,CAAA,GAAI,CAAA;AAC/B,EAAA,OAAO,KAAA,CAAM,EAAC,EAAG;AAAA,IACf,IAAA,CAAK,EAAE,CAAA,EAAG,CAAA,EAAG,OAAO,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,EAAA,EAAI,GAAG,IAAA,EAAM,IAAA,CAAK,KAAA,EAAO,MAAA,EAAQ,QAAQ,CAAA;AAAA,IAC3E,IAAA;AAAA,MACE,EAAE,CAAA,EAAG,CAAA,GAAI,CAAA,GAAI,CAAA,EAAG,CAAA,EAAG,CAAA,GAAI,CAAA,GAAI,CAAA,EAAG,KAAA,EAAO,sBAAA,EAAwB,IAAA,EAAM,EAAE,EAAA,EAAG;AAAA,MACxE,IAAA,CAAK;AAAA;AACP,GACD,CAAA;AACH;AAEA,SAAS,iBAAiB,EAAA,EAAgC;AACxD,EAAA,MAAM,IAAI,EAAA,CAAG,IAAA;AACb,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,QAAA,GAAW,EAAE,UAAA,KAAe,YAAA;AAElC,EAAA,IAAI,QAAA,EAAU;AAEZ,IAAA,IAAI,CAAA,GAAI,EAAA,CAAG,MAAA,GAAS,CAAA,GAAI,EAAA;AACxB,IAAA,MAAA,CAAO,IAAA,CAAK,IAAA,CAAO,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,gBAAA,EAAiB,EAAG,CAAA,CAAE,IAAI,CAAC,CAAA;AAChE,IAAA,CAAA,IAAK,EAAA;AACL,IAAA,IAAI,EAAE,IAAA,EAAM;AACV,MAAA,MAAA,CAAO,IAAA,CAAK,IAAA,CAAO,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,gBAAA,EAAiB,EAAG,CAAA,CAAE,IAAI,CAAC,CAAA;AAChE,MAAA,CAAA,IAAK,EAAA;AAAA,IACP;AACA,IAAA,IAAI,EAAE,IAAA,EAAM;AACV,MAAA,MAAA,CAAO,IAAA,CAAK,IAAA,CAAO,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,gBAAA,EAAiB,EAAG,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,IAClE;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAIA,EAAA,MAAM,IAAA,GAAO,EAAA;AACb,EAAA,MAAA,CAAO,IAAA,CAAK,IAAA,CAAO,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,IAAA,EAAM,KAAA,EAAO,gBAAA,EAAiB,EAAG,CAAA,CAAE,IAAI,CAAC,CAAA;AACtE,EAAA,MAAA,CAAO,KAAK,IAAA,CAAO,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,IAAA,GAAO,EAAA,EAAI,KAAA,EAAO,gBAAA,IAAoB,UAAA,CAAW,CAAA,CAAE,UAAU,CAAA,IAAK,CAAA,CAAE,UAAU,CAAC,CAAA;AAG7G,EAAA,IAAI,MAAA,GAAS,EAAA,CAAG,MAAA,GAAS,CAAA,GAAI,EAAA;AAC7B,EAAA,IAAI,EAAE,IAAA,EAAM;AACV,IAAA,MAAA,CAAO,IAAA,CAAK,IAAA,CAAO,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,MAAA,EAAQ,KAAA,EAAO,gBAAA,EAAiB,EAAG,CAAA,CAAE,IAAI,CAAC,CAAA;AACxE,IAAA,MAAA,IAAU,EAAA;AAAA,EACZ;AACA,EAAA,IAAI,EAAE,IAAA,EAAM;AACV,IAAA,MAAA,CAAO,IAAA,CAAK,IAAA,CAAO,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,MAAA,EAAQ,KAAA,EAAO,gBAAA,EAAiB,EAAG,CAAA,CAAE,IAAI,CAAC,CAAA;AACxE,IAAA,MAAA,IAAU,EAAA;AAAA,EACZ;AACA,EAAA,IAAI,EAAE,aAAA,EAAe;AACnB,IAAA,MAAA,CAAO,IAAA;AAAA,MACL,IAAA,CAAO,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,MAAA,EAAQ,KAAA,EAAO,gBAAA,EAAiB,EAAG,CAAA,KAAA,EAAQ,CAAA,CAAE,aAAa,CAAA,CAAE;AAAA,KAChF;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,UAAU,IAAA,EAA0B;AAC3C,EAAA,QAAQ,KAAK,EAAA;AAAI,IACf,KAAK,MAAA;AACH,MAAA,OAAO,qBAAA;AAAA,IACT,KAAK,SAAA;AACH,MAAA,OAAO,wBAAA;AAAA,IACT,KAAK,cAAA;AACH,MAAA,OAAO,6BAAA;AAAA,IACT,KAAK,QAAA;AACH,MAAA,OAAO,4BAAA;AAAA,IACT,KAAK,WAAA;AAAA,IACL;AAEE,MAAA,IAAI,KAAK,UAAA,IAAc,cAAA,CAAe,IAAA,CAAK,IAAA,CAAK,UAAU,CAAA,EAAG;AAC3D,QAAA,OAAO,4BAAA;AAAA,MACT;AACA,MAAA,OAAO,gBAAA;AAAA;AAEb;AAEA,SAAS,gBAAgB,EAAA,EAA0C;AACjE,EAAA,MAAM,IAAI,EAAA,CAAG,IAAA;AACb,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,IAAI,CAAA,CAAE,UAAA,EAAY,KAAA,CAAM,IAAA,CAAK,EAAE,UAAU,CAAA;AACzC,EAAA,IAAI,CAAA,CAAE,KAAA,EAAO,KAAA,CAAM,IAAA,CAAK,EAAE,KAAK,CAAA;AAC/B,EAAA,MAAM,QAAA,GAAW,CAAC,CAAC,CAAA,CAAE,UAAA;AACrB,EAAA,IAAI,CAAC,KAAA,CAAM,MAAA,IAAU,CAAC,UAAU,OAAO,MAAA;AAEvC,EAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AACpB,EAAA,MAAM,GAAA,GAAM,MAAM,CAAC,CAAA;AACnB,EAAA,MAAM,UAAA,GAAa,QAAA,GAAW,CAAA,CAAE,UAAA,GAAa,MAAA;AAG7C,EAAA,MAAM,UAAU,IAAA,CAAK,GAAA;AAAA,IACnB,IAAA,GAAO,KAAK,MAAA,GAAS,CAAA;AAAA,IACrB,GAAA,GAAM,IAAI,MAAA,GAAS,CAAA;AAAA,IACnB,UAAA,GAAa,WAAW,MAAA,GAAS;AAAA,GACnC;AACA,EAAA,MAAM,IAAI,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,OAAA,GAAU,IAAI,EAAE,CAAA;AACvC,EAAA,MAAM,IAAA,GAAA,CAAQ,OAAO,CAAA,GAAI,CAAA,KAAM,MAAM,CAAA,GAAI,CAAA,CAAA,IAAM,aAAa,CAAA,GAAI,CAAA,CAAA;AAChE,EAAA,MAAM,CAAA,GAAI,IAAI,IAAA,GAAO,EAAA;AACrB,EAAA,MAAM,CAAA,GAAI,EAAA,CAAG,MAAA,GAAS,CAAA,GAAI,CAAA;AAC1B,EAAA,MAAM,CAAA,GAAI,EAAA,CAAG,MAAA,GAAS,CAAA,GAAI,CAAA;AAC1B,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,EAAE,CAAA,EAAG,GAAG,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,KAAA,EAAO,oBAAA,EAAsB,CAAC,CAAA;AACnF,EAAA,IAAI,KAAK,CAAA,GAAI,EAAA;AACb,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,MAAA,CAAO,IAAA,CAAK,IAAA,CAAO,EAAE,CAAA,EAAG,EAAA,CAAG,MAAA,EAAQ,CAAA,EAAG,EAAA,EAAI,KAAA,EAAO,iBAAA,EAAkB,EAAG,IAAI,CAAC,CAAA;AAC3E,IAAA,EAAA,IAAM,EAAA;AAAA,EACR;AACA,EAAA,IAAI,GAAA,EAAK;AACP,IAAA,MAAA,CAAO,IAAA,CAAK,IAAA,CAAO,EAAE,CAAA,EAAG,EAAA,CAAG,MAAA,EAAQ,CAAA,EAAG,EAAA,EAAI,KAAA,EAAO,qBAAA,EAAsB,EAAG,GAAG,CAAC,CAAA;AAC9E,IAAA,EAAA,IAAM,EAAA;AAAA,EACR;AACA,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,MAAA,CAAO,IAAA,CAAK,IAAA,CAAO,EAAE,CAAA,EAAG,EAAA,CAAG,MAAA,EAAQ,CAAA,EAAG,EAAA,EAAI,KAAA,EAAO,qBAAA,EAAsB,EAAG,UAAU,CAAC,CAAA;AAAA,EACvF;AACA,EAAA,OAAO,KAAA,CAAM,EAAC,EAAG,MAAM,CAAA;AACzB;AAEO,SAAS,YAAA,CAAa,KAAgB,MAAA,EAA+B;AAC1E,EAAA,MAAM,MAAA,GAAS,aAAa,GAAG,CAAA;AAC/B,EAAA,MAAM,CAAA,GAAI,gBAAA,CAAiB,MAAA,EAAQ,KAAA,IAAS,SAAS,CAAA;AACrD,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,CAAK,KAAA,CAAQ,GAAA,CAAI,KAAA,IAAS,0BAA0B,CAAC,CAAA;AAC9D,EAAA,QAAA,CAAS,IAAA;AAAA,IACP,IAAA;AAAA,MACE,iCAAiC,GAAA,CAAI,QAAA,CAAS,MAAM,CAAA,cAAA,EAAiB,GAAA,CAAI,MAAM,MAAM,CAAA,cAAA;AAAA;AACvF,GACF;AACA,EAAA,QAAA,CAAS,IAAA,CAAK,GAAG,OAAA,EAAS,IAAI,QAAA,CAAS,CAAC,CAAC,CAAC,CAAA;AAG1C,EAAA,QAAA,CAAS,IAAA;AAAA,IACP,IAAA,CAAK;AAAA,MACH,WAAA,CAAY,iBAAA,EAAmB,CAAA,CAAE,MAAM,CAAA;AAAA,MACvC,YAAY,wBAAA,EAA0B,CAAA,CAAE,QAAQ,CAAC,CAAA,IAAK,EAAE,MAAM,CAAA;AAAA,MAC9D,WAAA,CAAY,uBAAA,EAAyB,CAAA,CAAE,QAAQ,CAAA;AAAA,MAC/C,WAAA,CAAY,sBAAA,EAAwB,CAAA,CAAE,OAAO,CAAA;AAAA,MAC7C,WAAA,CAAY,sBAAA,EAAwB,CAAA,CAAE,MAAM;AAAA,KAC7C;AAAA,GACH;AAEA,EAAA,IAAI,IAAI,KAAA,EAAO;AACb,IAAA,QAAA,CAAS,IAAA,CAAK,IAAA,CAAO,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,KAAA,EAAO,iBAAA,EAAkB,EAAG,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA,EAC7E;AAEA,EAAA,MAAM,QAAkB,EAAC;AAGzB,EAAA,KAAA,MAAW,CAAA,IAAK,OAAO,QAAA,EAAU;AAC/B,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,KAAA,IAAS,CAAA,CAAE,OAAA;AAC3B,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,IAAA,CAAK;AAAA,QACH,GAAG,CAAA,CAAE,CAAA;AAAA,QACL,GAAG,CAAA,CAAE,CAAA;AAAA,QACL,OAAO,CAAA,CAAE,KAAA;AAAA,QACT,QAAQ,CAAA,CAAE,MAAA;AAAA,QACV,EAAA,EAAI,CAAA;AAAA,QACJ,MAAA,EAAQ,KAAA;AAAA,QACR,KAAA,EAAO;AAAA,OACR;AAAA,KACH;AACA,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,IAAA;AAAA,QACE,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,EAAA,EAAI,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,EAAA,EAAI,KAAA,EAAO,yBAAA,EAA2B,IAAA,EAAM,KAAA,EAAM;AAAA,QAC1E,CAAA,CAAE;AAAA;AACJ,KACF;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,EAAA,IAAM,OAAO,KAAA,EAAO;AAC7B,IAAA,MAAM,GAAA,GAAM,SAAA,CAAU,EAAA,CAAG,IAAI,CAAA;AAC7B,IAAA,MAAM,QAAA,GAAW,UAAA,CAAW,EAAA,CAAG,IAAA,EAAM,GAAG,CAAA;AACxC,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,IAAA,CAAO;AAAA,QACL,GAAG,EAAA,CAAG,IAAA;AAAA,QACN,KAAA,EAAO,GAAA;AAAA,QACP,YAAA,EAAc,QAAQ,QAAQ,CAAA,CAAA;AAAA,OAC/B;AAAA,KACH;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,EAAA,IAAM,OAAO,KAAA,EAAO;AAC7B,IAAA,MAAM,KAAA,GAAQ,gBAAgB,EAAE,CAAA;AAChC,IAAA,IAAI,KAAA,EAAO,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA;AAAA,EAC7B;AAGA,EAAA,KAAA,MAAW,EAAA,IAAM,OAAO,KAAA,EAAO;AAC7B,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,KAAA,CAAM,IAAA,CAAK,WAAA,CAAY,EAAA,EAAI,CAAC,CAAC,CAAA;AAC7B,IAAA,MAAM,KAAA,GAAQ,YAAY,EAAE,CAAA;AAC5B,IAAA,IAAI,KAAA,EAAO,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA;AAC3B,IAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,EAAA,EAAI,CAAC,CAAA;AACpC,IAAA,IAAI,MAAA,EAAQ,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA;AAC7B,IAAA,KAAA,MAAW,KAAK,gBAAA,CAAiB,EAAE,CAAA,EAAG,KAAA,CAAM,KAAK,CAAC,CAAA;AAClD,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,KAAA;AAAA,QACE;AAAA,UACE,WAAW,CAAA,UAAA,EAAa,EAAA,CAAG,CAAC,CAAA,EAAA,EAAK,GAAG,CAAC,CAAA,CAAA,CAAA;AAAA,UACrC,gBAAA,EAAkB,GAAG,IAAA,CAAK,EAAA;AAAA,UAC1B,kBAAA,EAAoB,GAAG,IAAA,CAAK,UAAA;AAAA,UAC5B,mBAAA,EAAqB,EAAA,CAAG,IAAA,CAAK,YAAA,IAAgB;AAAA,SAC/C;AAAA,QACA;AAAA;AACF,KACF;AAAA,EACF;AAEA,EAAA,MAAM,IAAA,GAAO,MAAM,EAAE,SAAA,EAAW,gBAAgB,WAAW,CAAA,CAAA,CAAA,IAAO,KAAK,CAAA;AACvE,EAAA,QAAA,CAAS,KAAK,IAAI,CAAA;AAElB,EAAA,OAAO,OAAA;AAAA,IACL;AAAA,MACE,KAAA,EAAO,WAAA;AAAA,MACP,IAAA,EAAM,KAAA;AAAA,MACN,YAAA,EAAc,SAAA,CAAU,GAAA,CAAI,KAAA,IAAS,0BAA0B,CAAA;AAAA,MAC/D,KAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAA,EAAS,CAAA,IAAA,EAAO,KAAK,CAAA,CAAA,EAAI,MAAM,CAAA;AAAA,KACjC;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,WAAA,CAAY,IAAY,KAAA,EAAuB;AACtD,EAAA,OAAO,EAAA;AAAA,IACL,QAAA;AAAA,IACA;AAAA,MACE,EAAA;AAAA,MACA,WAAA,EAAa,CAAA;AAAA,MACb,YAAA,EAAc,CAAA;AAAA,MACd,IAAA,EAAM,CAAA;AAAA,MACN,IAAA,EAAM,CAAA;AAAA,MACN,MAAA,EAAQ,MAAA;AAAA,MACR,WAAA,EAAa;AAAA,KACf;AAAA,IACA,CAAC,GAAG,MAAA,EAAQ,EAAE,GAAG,qBAAA,EAAuB,IAAA,EAAM,KAAA,EAAO,CAAC;AAAA,GACxD;AACF;AAEA,SAAS,UAAA,CAAW,OAAmB,GAAA,EAAqB;AAC1D,EAAA,IAAI,GAAA,KAAQ,0BAA0B,OAAO,wBAAA;AAC7C,EAAA,IAAI,GAAA,KAAQ,+BAA+B,OAAO,uBAAA;AAClD,EAAA,IAAI,GAAA,KAAQ,uBAAuB,OAAO,sBAAA;AAC1C,EAAA,IAAI,GAAA,KAAQ,8BAA8B,OAAO,sBAAA;AACjD,EAAA,OAAO,iBAAA;AACT;;;ACzeO,IAAM,MAAA,GAAwB;AAAA,EACnC,IAAA,EAAM,QAAA;AAAA,EACN,OAAOH,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,kBAAkB,CAAA;AAAA,EAC5C,CAAA;AAAA,EACA,KAAA,EAAO,cAAA;AAAA,EAEP,MAAA,CAAOA,OAAc,MAAA,EAAgB;AACnC,IAAA,MAAM,GAAA,GAAM,eAAeA,KAAI,CAAA;AAC/B,IAAA,OAAO,YAAA,CAAa,KAAK,MAAM,CAAA;AAAA,EACjC;AACF","file":"chunk-M5B2UUNW.js","sourcesContent":["import type {\n EntityAST,\n EntityNode,\n EntityType,\n EntityEdge,\n EntityEdgeOp,\n JurisdictionDef,\n ClusterDef,\n} from \"../../core/types\";\n\nexport class EntityParseError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"EntityParseError\";\n }\n}\n\nconst ENTITY_TYPE_ALIAS: Record<string, EntityType> = {\n corp: \"corp\",\n corporation: \"corp\",\n inc: \"corp\",\n llc: \"llc\",\n llp: \"llc\",\n gmbh: \"llc\",\n bv: \"llc\",\n lp: \"lp\",\n lllp: \"lp\",\n fund: \"lp\",\n trust: \"trust\",\n individual: \"individual\",\n person: \"individual\",\n foundation: \"foundation\",\n npo: \"foundation\",\n disregarded: \"disregarded\",\n branch: \"disregarded\",\n pool: \"pool\",\n placeholder: \"placeholder\",\n tbf: \"placeholder\",\n};\n\nfunction stripComment(s: string): string {\n let out = \"\";\n let inQuote = false;\n for (const ch of s) {\n if (ch === '\"') inQuote = !inQuote;\n if (ch === \"#\" && !inQuote) break;\n out += ch;\n }\n return out;\n}\n\nfunction stripQuotes(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/** Split by top-level commas (respecting quotes and bracket nesting) */\nfunction splitTopLevelCommas(inside: string): string[] {\n const parts: string[] = [];\n let cur = \"\";\n let inQuote = false;\n let depth = 0;\n for (const ch of inside) {\n if (ch === '\"') inQuote = !inQuote;\n if (!inQuote) {\n if (ch === \"[\") depth++;\n else if (ch === \"]\") depth--;\n }\n if (ch === \",\" && !inQuote && depth === 0) {\n parts.push(cur);\n cur = \"\";\n } else {\n cur += ch;\n }\n }\n if (cur.trim()) parts.push(cur);\n return parts;\n}\n\nfunction parseProps(inside: string): Record<string, string> {\n const out: Record<string, string> = {};\n for (const p of splitTopLevelCommas(inside)) {\n const s = p.trim();\n if (!s) continue;\n const colon = s.indexOf(\":\");\n if (colon < 0) throw new EntityParseError(`Invalid property \"${s}\" (missing \":\")`);\n const k = s.slice(0, colon).trim().toLowerCase();\n const v = s.slice(colon + 1).trim();\n out[k] = v;\n }\n return out;\n}\n\nfunction parseIdList(v: string): string[] {\n const t = v.trim();\n const inner = t.startsWith(\"[\") && t.endsWith(\"]\") ? t.slice(1, -1) : t;\n return inner\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n}\n\n/** Join lines so that a bracketed attribute block spans a single logical line. */\nfunction joinBrackets(lines: string[]): string[] {\n const out: string[] = [];\n let buf = \"\";\n let depth = 0;\n for (const raw of lines) {\n const line = stripComment(raw);\n if (!line.trim() && depth === 0) {\n if (buf) {\n out.push(buf);\n buf = \"\";\n }\n out.push(\"\");\n continue;\n }\n for (const ch of line) {\n if (ch === \"[\") depth++;\n else if (ch === \"]\") depth = Math.max(0, depth - 1);\n }\n buf = buf ? buf + \" \" + line.trim() : line;\n if (depth === 0) {\n out.push(buf);\n buf = \"\";\n }\n }\n if (buf) out.push(buf);\n return out;\n}\n\nconst EDGE_OPS: Array<{ token: string; op: EntityEdgeOp }> = [\n // Order matters: longer tokens first\n { token: \"==>\", op: \"voting\" },\n { token: \"-.->\", op: \"pool\" },\n { token: \"-~->\", op: \"license\" },\n { token: \"-->\", op: \"distribution\" },\n { token: \"->\", op: \"ownership\" },\n];\n\nfunction matchEdgeOp(line: string): { op: EntityEdgeOp; idx: number; len: number } | null {\n for (const { token, op } of EDGE_OPS) {\n // Find an instance flanked by non-alphanum (so \"->\" inside quoted label is skipped later)\n const idx = findEdgeToken(line, token);\n if (idx >= 0) return { op, idx, len: token.length };\n }\n return null;\n}\n\nfunction findEdgeToken(line: string, token: string): number {\n let inQuote = false;\n let depth = 0;\n for (let i = 0; i < line.length; i++) {\n const ch = line[i];\n if (ch === '\"') inQuote = !inQuote;\n if (!inQuote) {\n if (ch === \"[\") depth++;\n else if (ch === \"]\") depth = Math.max(0, depth - 1);\n }\n if (!inQuote && depth === 0 && line.startsWith(token, i)) {\n return i;\n }\n }\n return -1;\n}\n\nexport function parseEntityDSL(text: string): EntityAST {\n const rawLines = text.split(\"\\n\").map((l) => l.replace(/\\r$/, \"\"));\n const lines = joinBrackets(rawLines);\n\n let title: string | undefined;\n const entities: EntityNode[] = [];\n const entityMap = new Map<string, EntityNode>();\n const edges: EntityEdge[] = [];\n const jurisdictions: JurisdictionDef[] = [];\n const jurisdictionMap = new Map<string, JurisdictionDef>();\n const clusters: ClusterDef[] = [];\n\n let clusterCounter = 0;\n\n for (const raw of lines) {\n const line = raw.trim();\n if (!line) continue;\n\n // Header: entity-structure \"title\" or entity-structure: \"title\"\n if (/^entity-structure\\b/i.test(line)) {\n const m = line.match(/\"([^\"]*)\"/);\n if (m) title = m[1];\n continue;\n }\n\n // jurisdiction CODE \"name\" [color: \"...\"]\n const jurMatch = line.match(\n /^jurisdiction\\s+([A-Za-z]{2,3})\\s+\"([^\"]*)\"(?:\\s*\\[([^\\]]*)\\])?\\s*$/i\n );\n if (jurMatch) {\n const code = jurMatch[1].toUpperCase();\n const name = jurMatch[2];\n const props = jurMatch[3] ? parseProps(jurMatch[3]) : {};\n const def: JurisdictionDef = { code, name };\n if (props.color) def.color = stripQuotes(props.color);\n jurisdictions.push(def);\n jurisdictionMap.set(code, def);\n continue;\n }\n\n // cluster \"name\" [members: [ids], color: \"...\"]\n const clusterMatch = line.match(/^cluster\\s+\"([^\"]*)\"(?:\\s*\\[([^\\]]*)\\])?\\s*$/i);\n if (clusterMatch) {\n const label = clusterMatch[1];\n const props = clusterMatch[2] ? parseProps(clusterMatch[2]) : {};\n const def: ClusterDef = {\n id: `cluster-${++clusterCounter}`,\n label,\n members: props.members ? parseIdList(props.members) : [],\n };\n if (props.color) def.color = stripQuotes(props.color);\n clusters.push(def);\n continue;\n }\n\n // entity id \"Name\" type[@jurisdiction] [props]\n const entityMatch = line.match(\n /^entity\\s+([A-Za-z][A-Za-z0-9_-]*)\\s+\"([^\"]*)\"\\s+([a-zA-Z]+)(?:@([A-Za-z]{2,3}))?(?:\\s*\\[([^\\]]*)\\])?\\s*$/\n );\n if (entityMatch) {\n const id = entityMatch[1];\n const name = entityMatch[2];\n const typeStr = entityMatch[3].toLowerCase();\n const jurisdictionCode = entityMatch[4]?.toUpperCase();\n const propsStr = entityMatch[5];\n const entityType = ENTITY_TYPE_ALIAS[typeStr];\n if (!entityType) {\n throw new EntityParseError(`Unknown entity type \"${typeStr}\" for \"${id}\"`);\n }\n if (entityMap.has(id)) {\n throw new EntityParseError(`Duplicate entity id \"${id}\"`);\n }\n const node: EntityNode = { id, name, entityType };\n if (jurisdictionCode) node.jurisdiction = jurisdictionCode;\n if (propsStr) {\n const props = parseProps(propsStr);\n if (props.status) node.status = stripQuotes(props.status) as EntityNode[\"status\"];\n if (props.tax) node.taxClass = stripQuotes(props.tax);\n if (props.role) node.role = stripQuotes(props.role);\n if (props.note) node.note = stripQuotes(props.note);\n if (props.est) node.formationDate = stripQuotes(props.est);\n // Any other keys → properties\n const reserved = new Set([\"status\", \"tax\", \"role\", \"note\", \"est\"]);\n const extras: Record<string, string> = {};\n for (const k of Object.keys(props)) {\n if (!reserved.has(k)) extras[k] = stripQuotes(props[k]);\n }\n if (Object.keys(extras).length) node.properties = extras;\n }\n entities.push(node);\n entityMap.set(id, node);\n continue;\n }\n\n // edge: from <op> to [ : percentage ] [props]\n const edgeInfo = matchEdgeOp(line);\n if (edgeInfo) {\n const left = line.slice(0, edgeInfo.idx).trim();\n const rest = line.slice(edgeInfo.idx + edgeInfo.len).trim();\n if (!/^[A-Za-z][A-Za-z0-9_-]*$/.test(left)) {\n throw new EntityParseError(`Invalid edge source on line: ${line}`);\n }\n // rest: \"target [: pct] [props]\" OR \"target [props]\"\n const restMatch = rest.match(\n /^([A-Za-z][A-Za-z0-9_-]*)(?:\\s*:\\s*([^\\[]+?))?(?:\\s*\\[([^\\]]*)\\])?\\s*$/\n );\n if (!restMatch) {\n throw new EntityParseError(`Cannot parse edge: ${line}`);\n }\n const to = restMatch[1];\n const pct = restMatch[2]?.trim();\n const propsStr = restMatch[3];\n const edge: EntityEdge = { from: left, to, op: edgeInfo.op };\n if (pct) edge.percentage = pct;\n if (propsStr) {\n const props = parseProps(propsStr);\n if (props.class) edge.shareClass = stripQuotes(props.class);\n if (props.label) edge.label = stripQuotes(props.label);\n }\n edges.push(edge);\n continue;\n }\n\n throw new EntityParseError(`Cannot parse line: ${line}`);\n }\n\n // Validate edges reference known entities\n for (const e of edges) {\n if (!entityMap.has(e.from)) {\n throw new EntityParseError(`Edge references unknown entity \"${e.from}\"`);\n }\n if (!entityMap.has(e.to)) {\n throw new EntityParseError(`Edge references unknown entity \"${e.to}\"`);\n }\n }\n\n if (entities.length === 0) {\n throw new EntityParseError(\"Entity structure diagram has no entities\");\n }\n\n return {\n type: \"entity\",\n title,\n entities,\n edges,\n jurisdictions,\n clusters,\n };\n}\n","import type { EntityAST, EntityNode, EntityEdge, EntityType } from \"../../core/types\";\n\n/**\n * Tier-based top-down layout for entity structure diagrams.\n *\n * - Tier assigned via longest-path from sources (relaxation)\n * - Within-tier x placed by DFS declaration order\n * - Non-bus parents re-centered over children bottom-up\n * - Edges routed orthogonally (down → across → down)\n */\n\nexport interface EntityLayoutNode {\n node: EntityNode;\n x: number; // center x\n y: number; // center y\n tier: number;\n width: number;\n height: number;\n /** Top-center anchor for edge end */\n topY: number;\n bottomY: number;\n}\n\nexport interface EntityLayoutEdge {\n edge: EntityEdge;\n path: string;\n /** Label anchor (horizontal mid of the branch segment) */\n labelX: number;\n labelY: number;\n}\n\nexport interface EntityLayoutCluster {\n id: string;\n label: string;\n color?: string;\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface EntityLayoutResult {\n width: number;\n height: number;\n nodes: EntityLayoutNode[];\n nodeById: Map<string, EntityLayoutNode>;\n edges: EntityLayoutEdge[];\n clusters: EntityLayoutCluster[];\n}\n\nconst TIER_GAP = 170;\nconst H_GAP = 70;\nconst PADDING = 40;\nconst CLUSTER_PADDING = 26;\nconst CLUSTER_V_GAP = 16;\n\nexport function geometryFor(type: EntityType): { width: number; height: number } {\n switch (type) {\n case \"trust\":\n return { width: 200, height: 80 }; // ellipse bbox\n case \"individual\":\n return { width: 80, height: 80 }; // circle bbox; label rendered below\n case \"foundation\":\n return { width: 150, height: 80 };\n case \"pool\":\n case \"disregarded\":\n case \"placeholder\":\n case \"corp\":\n case \"llc\":\n case \"lp\":\n default:\n return { width: 170, height: 62 };\n }\n}\n\nfunction computeTiers(ast: EntityAST): Map<string, number> {\n const inEdges = new Map<string, EntityEdge[]>();\n const outEdges = new Map<string, EntityEdge[]>();\n for (const n of ast.entities) {\n inEdges.set(n.id, []);\n outEdges.set(n.id, []);\n }\n for (const e of ast.edges) {\n inEdges.get(e.to)?.push(e);\n outEdges.get(e.from)?.push(e);\n }\n\n // Only ownership-style edges define hierarchy. Lateral relationships\n // (license, distribution, management) should NOT force descendants.\n const isHierarchy = (e: EntityEdge): boolean =>\n e.op === \"ownership\" || e.op === \"voting\" || e.op === \"pool\";\n\n const tiers = new Map<string, number>();\n // Seed: entities with no hierarchical in-edges → tier 0\n for (const n of ast.entities) {\n const hierIn = (inEdges.get(n.id) ?? []).filter(isHierarchy);\n if (hierIn.length === 0) tiers.set(n.id, 0);\n }\n\n const maxIter = ast.entities.length + 4;\n for (let iter = 0; iter < maxIter; iter++) {\n let changed = false;\n for (const e of ast.edges) {\n if (!isHierarchy(e)) continue;\n const fromT = tiers.get(e.from);\n if (fromT === undefined) continue;\n const want = fromT + 1;\n const cur = tiers.get(e.to);\n if (cur === undefined || want > cur) {\n tiers.set(e.to, want);\n changed = true;\n }\n }\n if (!changed) break;\n }\n\n // Non-hierarchical targets: place at same tier as source if not already set\n for (const e of ast.edges) {\n if (isHierarchy(e)) continue;\n if (!tiers.has(e.to)) {\n const src = tiers.get(e.from);\n if (src !== undefined) tiers.set(e.to, src);\n }\n if (!tiers.has(e.from)) {\n const dst = tiers.get(e.to);\n if (dst !== undefined) tiers.set(e.from, dst);\n }\n }\n // Any orphans → tier 0\n for (const n of ast.entities) {\n if (!tiers.has(n.id)) tiers.set(n.id, 0);\n }\n return tiers;\n}\n\nexport function layoutEntity(ast: EntityAST): EntityLayoutResult {\n const tiers = computeTiers(ast);\n const maxTier = Math.max(0, ...Array.from(tiers.values()));\n\n // Group by tier, order by declaration\n const byTier = new Map<number, EntityNode[]>();\n for (const n of ast.entities) {\n const t = tiers.get(n.id) ?? 0;\n if (!byTier.has(t)) byTier.set(t, []);\n byTier.get(t)!.push(n);\n }\n\n // Build layout nodes\n const layoutNodes: EntityLayoutNode[] = [];\n const byId = new Map<string, EntityLayoutNode>();\n for (const n of ast.entities) {\n const g = geometryFor(n.entityType);\n const t = tiers.get(n.id) ?? 0;\n const ln: EntityLayoutNode = {\n node: n,\n x: 0,\n y: PADDING + t * TIER_GAP + g.height / 2,\n tier: t,\n width: g.width,\n height: g.height,\n topY: 0,\n bottomY: 0,\n };\n ln.topY = ln.y - g.height / 2;\n ln.bottomY = ln.y + g.height / 2;\n layoutNodes.push(ln);\n byId.set(n.id, ln);\n }\n\n // Assign sequential X per tier (declaration order)\n for (let t = 0; t <= maxTier; t++) {\n const nodes = byTier.get(t) ?? [];\n let cx = PADDING;\n for (const n of nodes) {\n const ln = byId.get(n.id)!;\n cx += ln.width / 2;\n ln.x = cx;\n cx += ln.width / 2 + H_GAP;\n }\n }\n\n // Parent/child maps for hierarchy only\n const children = new Map<string, string[]>();\n const parents = new Map<string, string[]>();\n for (const n of ast.entities) {\n children.set(n.id, []);\n parents.set(n.id, []);\n }\n for (const e of ast.edges) {\n if (e.op === \"ownership\" || e.op === \"voting\" || e.op === \"pool\") {\n children.get(e.from)?.push(e.to);\n parents.get(e.to)?.push(e.from);\n }\n }\n\n // Center parents over their children bottom-up\n for (let iter = 0; iter < 4; iter++) {\n for (let t = maxTier - 1; t >= 0; t--) {\n const tierNodes = byTier.get(t) ?? [];\n for (const n of tierNodes) {\n const ln = byId.get(n.id)!;\n const childIds = children.get(n.id) ?? [];\n if (childIds.length === 0) continue;\n if (childIds.length === 1) {\n // Cap-table convergence: if the only child has multiple same-tier parents,\n // spread parents around the child's x rather than collapsing them.\n const child = byId.get(childIds[0]);\n if (!child) continue;\n const siblingParents = (parents.get(child.node.id) ?? [])\n .map((pid) => byId.get(pid))\n .filter((p): p is EntityLayoutNode => !!p && p.tier === t);\n if (siblingParents.length > 1) {\n siblingParents.sort(\n (a, b) =>\n (byTier.get(t) ?? []).indexOf(a.node) -\n (byTier.get(t) ?? []).indexOf(b.node)\n );\n const totalWidth = siblingParents.reduce(\n (sum, p) => sum + effectiveHalfWidth(p) * 2,\n 0\n );\n const spread = Math.max(\n H_GAP + (effectiveHalfWidth(ln) + effectiveHalfWidth(siblingParents[0])) / 1,\n totalWidth / Math.max(1, siblingParents.length - 1)\n );\n const idx = siblingParents.indexOf(ln);\n const n2 = siblingParents.length;\n ln.x = child.x + (idx - (n2 - 1) / 2) * spread;\n } else {\n ln.x = child.x;\n }\n continue;\n }\n const xs = childIds\n .map((c) => byId.get(c)?.x)\n .filter((v): v is number => v !== undefined);\n if (xs.length > 0) {\n ln.x = (Math.min(...xs) + Math.max(...xs)) / 2;\n }\n }\n }\n\n // Center child over multiple parents (cap table convergence)\n for (let t = 1; t <= maxTier; t++) {\n const tierNodes = byTier.get(t) ?? [];\n for (const n of tierNodes) {\n const ln = byId.get(n.id)!;\n const parentIds = parents.get(n.id) ?? [];\n if (parentIds.length < 2) continue;\n const xs = parentIds\n .map((p) => byId.get(p)?.x)\n .filter((v): v is number => v !== undefined);\n if (xs.length > 0) {\n ln.x = (Math.min(...xs) + Math.max(...xs)) / 2;\n }\n }\n }\n\n // Resolve within-tier overlaps (preserve declaration order, label-aware)\n for (let t = 0; t <= maxTier; t++) {\n const tierNodes = (byTier.get(t) ?? [])\n .map((n) => byId.get(n.id)!)\n .sort((a, b) => a.x - b.x);\n for (let i = 1; i < tierNodes.length; i++) {\n const prev = tierNodes[i - 1];\n const cur = tierNodes[i];\n const gap = effectiveHalfWidth(prev) + effectiveHalfWidth(cur) + H_GAP;\n if (cur.x - prev.x < gap) cur.x = prev.x + gap;\n }\n }\n }\n\n // Shift so leftmost content sits at PADDING\n let minLeft = Infinity;\n for (const ln of layoutNodes) {\n const left = ln.x - ln.width / 2;\n if (left < minLeft) minLeft = left;\n }\n const shift = PADDING - minLeft;\n if (Math.abs(shift) > 0.5) {\n for (const ln of layoutNodes) ln.x += shift;\n }\n\n // Build edges with orthogonal routing.\n //\n // Label placement strategy for hierarchical (down) edges:\n // - fan-in (child has >1 parents, e.g. cap-table): label on child-side\n // vertical stub, just above child.topY. Owner-share reads naturally\n // as \"X% of [child]\".\n // - fan-out (parent has >1 children, e.g. holdco → subs): label on\n // parent-side vertical stub, just below parent.bottomY.\n // - 1:1 straight drop: label offset to the side of the vertical line.\n // - otherwise (branching both sides): label at midpoint of parent stub.\n // This avoids stacking multiple labels on the shared horizontal bar.\n const edges: EntityLayoutEdge[] = [];\n for (const e of ast.edges) {\n const from = byId.get(e.from);\n const to = byId.get(e.to);\n if (!from || !to) continue;\n\n const sameTier = from.tier === to.tier;\n let path: string;\n let labelX: number;\n let labelY: number;\n\n if (sameTier) {\n const leftFirst = from.x < to.x;\n const sx = leftFirst ? from.x + from.width / 2 : from.x - from.width / 2;\n const ex = leftFirst ? to.x - to.width / 2 : to.x + to.width / 2;\n path = `M ${sx} ${from.y} L ${ex} ${to.y}`;\n labelX = (sx + ex) / 2;\n labelY = from.y - 6;\n } else {\n const sx = from.x;\n const sy = from.bottomY;\n const ex = to.x;\n const ey = to.topY;\n const straight = Math.abs(sx - ex) < 0.5;\n\n if (straight) {\n // No corners → midpoint of the vertical line.\n path = `M ${sx} ${sy} L ${ex} ${ey}`;\n labelX = sx;\n labelY = (sy + ey) / 2;\n } else {\n // L-path has two corners: (sx, midY) top and (ex, midY) bottom.\n // Each edge owns its corners uniquely, so placing the label at a\n // corner avoids stacking on the shared horizontal branch.\n const midY = (sy + ey) / 2;\n path = `M ${sx} ${sy} L ${sx} ${midY} L ${ex} ${midY} L ${ex} ${ey}`;\n\n const isHier =\n e.op === \"ownership\" || e.op === \"voting\" || e.op === \"pool\";\n const parentCount = isHier ? (parents.get(e.to) ?? []).length : 0;\n const fanIn = parentCount > 1;\n\n // fan-in (many parents → one child): top corner (parent side) is\n // unique per parent.\n // fan-out (one parent → many children): bottom corner (child side)\n // is unique per child.\n // 1:1 offset: bottom corner — reads naturally as \"X% of [child]\".\n if (fanIn) {\n labelX = sx;\n labelY = midY;\n } else {\n labelX = ex;\n labelY = midY;\n }\n }\n }\n\n edges.push({ edge: e, path, labelX, labelY });\n }\n\n // Build cluster rectangles (explicit members only, or auto by jurisdiction)\n const layoutClusters: EntityLayoutCluster[] = [];\n const usedIds = new Set<string>();\n\n const LABEL_ROW = 22;\n\n for (const c of ast.clusters) {\n const members = c.members\n .map((id) => byId.get(id))\n .filter((n): n is EntityLayoutNode => !!n);\n if (members.length === 0) continue;\n const bounds = boundingBox(members);\n layoutClusters.push({\n id: c.id,\n label: c.label,\n color: c.color,\n x: bounds.minX - CLUSTER_PADDING,\n y: bounds.minY - CLUSTER_PADDING - LABEL_ROW,\n width: bounds.maxX - bounds.minX + CLUSTER_PADDING * 2,\n height: bounds.maxY - bounds.minY + CLUSTER_PADDING * 2 + LABEL_ROW,\n });\n for (const m of members) usedIds.add(m.node.id);\n }\n\n // Auto-cluster by declared jurisdiction (only those not already in explicit cluster)\n for (const j of ast.jurisdictions) {\n const members = layoutNodes.filter(\n (n) => n.node.jurisdiction === j.code && !usedIds.has(n.node.id)\n );\n if (members.length === 0) continue;\n const bounds = boundingBox(members);\n layoutClusters.push({\n id: `jur-${j.code}`,\n label: j.name,\n color: j.color,\n x: bounds.minX - CLUSTER_PADDING,\n y: bounds.minY - CLUSTER_PADDING - LABEL_ROW,\n width: bounds.maxX - bounds.minX + CLUSTER_PADDING * 2,\n height: bounds.maxY - bounds.minY + CLUSTER_PADDING * 2 + LABEL_ROW,\n });\n for (const m of members) usedIds.add(m.node.id);\n }\n\n // Resolve cluster vertical overlaps on the same band — if two clusters at\n // different tiers overlap vertically, shrink the top one's bottom and push\n // the bottom one's top so their borders don't cross.\n for (let i = 0; i < layoutClusters.length; i++) {\n for (let k = i + 1; k < layoutClusters.length; k++) {\n const a = layoutClusters[i];\n const b = layoutClusters[k];\n const hOverlap = !(a.x + a.width < b.x || b.x + b.width < a.x);\n const vOverlap = !(a.y + a.height < b.y || b.y + b.height < a.y);\n if (!hOverlap || !vOverlap) continue;\n // Determine which is above\n const [top, bot] = a.y < b.y ? [a, b] : [b, a];\n const want = bot.y - CLUSTER_V_GAP;\n if (top.y + top.height > want) top.height = Math.max(20, want - top.y);\n }\n }\n\n // Compute canvas\n let maxX = 0;\n let maxY = 0;\n for (const ln of layoutNodes) {\n const right = ln.x + ln.width / 2;\n const bottom = ln.bottomY + 40; // space for role/note label\n if (right > maxX) maxX = right;\n if (bottom > maxY) maxY = bottom;\n }\n for (const c of layoutClusters) {\n if (c.x + c.width > maxX) maxX = c.x + c.width;\n if (c.y + c.height > maxY) maxY = c.y + c.height;\n }\n const width = Math.max(400, maxX + PADDING);\n const height = Math.max(200, maxY + PADDING);\n\n return {\n width,\n height,\n nodes: layoutNodes,\n nodeById: byId,\n edges,\n clusters: layoutClusters,\n };\n}\n\n/**\n * Effective half-width for collision resolution — includes the label text that\n * extends beyond the shape (especially individuals where name/role are rendered\n * BELOW the circle, wider than the circle itself).\n */\nfunction effectiveHalfWidth(ln: EntityLayoutNode): number {\n const n = ln.node;\n const shapeHalf = ln.width / 2;\n const textLen = (s?: string): number => (s ? s.length : 0);\n if (n.entityType === \"individual\") {\n const longest = Math.max(\n textLen(n.name),\n textLen(n.role),\n textLen(n.note)\n );\n const textHalf = (longest * 6.2) / 2 + 4;\n return Math.max(shapeHalf, textHalf);\n }\n // For non-individual, below-node note can also overflow the shape\n const longestBelow = Math.max(textLen(n.note), textLen(n.role));\n const textHalf = (longestBelow * 6) / 2 + 4;\n return Math.max(shapeHalf, textHalf);\n}\n\nfunction boundingBox(nodes: EntityLayoutNode[]): {\n minX: number;\n maxX: number;\n minY: number;\n maxY: number;\n} {\n let minX = Infinity;\n let maxX = -Infinity;\n let minY = Infinity;\n let maxY = -Infinity;\n for (const n of nodes) {\n minX = Math.min(minX, n.x - n.width / 2);\n maxX = Math.max(maxX, n.x + n.width / 2);\n minY = Math.min(minY, n.topY);\n maxY = Math.max(maxY, n.bottomY + 26); // include space for below-node labels\n }\n return { minX, maxX, minY, maxY };\n}\n","import type { EntityAST, EntityNode, EntityEdge } from \"../../core/types\";\nimport 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 defs,\n rect,\n circle,\n polygon,\n escapeXml,\n} from \"../../core/svg\";\nimport { resolveBaseTheme, type BaseTheme } from \"../../core/theme\";\nimport {\n layoutEntity,\n type EntityLayoutNode,\n type EntityLayoutEdge,\n} from \"./layout\";\n\nfunction buildCss(t: BaseTheme): string {\n return `\n.lt-entity { background: ${t.bg}; font-family: system-ui, -apple-system, sans-serif; }\n.lt-entity-title { font: bold 16px sans-serif; fill: ${t.text}; }\n.lt-entity-name { font: 600 12px sans-serif; fill: ${t.text}; text-anchor: middle; }\n.lt-entity-type { font: 500 10px sans-serif; fill: ${t.textMuted}; text-anchor: middle; }\n.lt-entity-role { font: italic 10px sans-serif; fill: ${t.textMuted}; text-anchor: middle; }\n.lt-entity-note { font: 10px sans-serif; fill: ${t.textMuted}; text-anchor: middle; }\n.lt-entity-badge-bg { fill: ${t.bg}; stroke: ${t.neutral}; stroke-width: 1; }\n.lt-entity-badge-text { font: 600 9px sans-serif; fill: ${t.text}; text-anchor: middle; letter-spacing: 0.5px; }\n.lt-entity-edge { stroke: ${t.stroke}; stroke-width: 1.5; fill: none; }\n.lt-entity-edge-voting { stroke: ${t.stroke}; stroke-width: 1.2; fill: none; }\n.lt-entity-edge-pool { stroke: ${t.neutral}; stroke-width: 1.5; fill: none; stroke-dasharray: 5,4; }\n.lt-entity-edge-license { stroke: ${t.palette[3]}; stroke-width: 1.5; fill: none; stroke-dasharray: 5,4; }\n.lt-entity-edge-distribution { stroke: ${t.positive}; stroke-width: 1.5; fill: none; stroke-dasharray: 5,4; }\n.lt-entity-edge-voting-pref { stroke: ${t.accent}; stroke-width: 1.8; fill: none; }\n.lt-entity-label-bg { fill: ${t.bg}; stroke: ${t.neutral}; stroke-width: 1; }\n.lt-entity-label { font: 600 10px sans-serif; fill: ${t.text}; text-anchor: middle; }\n.lt-entity-label-sub { font: 500 9px sans-serif; fill: ${t.textMuted}; text-anchor: middle; }\n.lt-entity-cluster { fill: none; stroke-dasharray: 6,4; stroke-width: 1.2; }\n.lt-entity-cluster-label-bg { fill: ${t.bg}; }\n.lt-entity-cluster-label { font: 600 11px sans-serif; letter-spacing: 0.5px; }\n.lt-entity-status-new { stroke: ${t.positive}; stroke-width: 2.2; }\n.lt-entity-status-eliminated { stroke: ${t.negative}; stroke-width: 2.2; }\n.lt-entity-status-modified { stroke: ${t.warn}; stroke-width: 2.2; }\n.lt-entity-status-tag { font: 700 8px sans-serif; text-anchor: middle; letter-spacing: 0.5px; }\n`.trim();\n}\n\nconst FILL: Record<string, string> = {\n corp: \"#dbeafe\",\n llc: \"#dcfce7\",\n lp: \"#fef9c3\",\n trust: \"#ede9fe\",\n individual: \"#fed7aa\",\n foundation: \"#fef9c3\",\n disregarded: \"#f5f5f5\",\n pool: \"#f1f5f9\",\n placeholder: \"#f9fafb\",\n};\n\nconst TYPE_LABEL: Record<string, string> = {\n corp: \"Corporation\",\n llc: \"LLC\",\n lp: \"LP / Fund\",\n trust: \"Trust\",\n individual: \"Individual\",\n foundation: \"Foundation\",\n disregarded: \"Disregarded Entity\",\n pool: \"Reserved Pool\",\n placeholder: \"To Be Formed\",\n};\n\nfunction statusClass(node: EntityNode): string | undefined {\n switch (node.status) {\n case \"new\":\n return \"lt-entity-status-new\";\n case \"eliminated\":\n return \"lt-entity-status-eliminated\";\n case \"modified\":\n return \"lt-entity-status-modified\";\n default:\n return undefined;\n }\n}\n\nfunction renderShape(ln: EntityLayoutNode, t: BaseTheme): string {\n const n = ln.node;\n const fill = FILL[n.entityType] ?? t.bg;\n const sc = statusClass(n);\n const commonAttrs: Record<string, string | number> = {\n fill,\n stroke: t.stroke,\n \"stroke-width\": 1.4,\n };\n if (sc) {\n commonAttrs.class = sc;\n }\n // Dashed stroke for disregarded / placeholder / pool\n const dashed =\n n.entityType === \"disregarded\" ||\n n.entityType === \"placeholder\" ||\n n.entityType === \"pool\";\n\n const dashAttr = dashed ? { \"stroke-dasharray\": \"5,3\" } : {};\n const opacity = n.entityType === \"placeholder\" ? { opacity: 0.75 } : {};\n\n const x = -ln.width / 2;\n const y = -ln.height / 2;\n\n switch (n.entityType) {\n case \"corp\":\n return rect({\n x,\n y,\n width: ln.width,\n height: ln.height,\n rx: 0,\n ...commonAttrs,\n ...dashAttr,\n });\n case \"llc\":\n return rect({\n x,\n y,\n width: ln.width,\n height: ln.height,\n rx: 10,\n ry: 10,\n ...commonAttrs,\n });\n case \"lp\": {\n // Notched top corners polygon\n const w = ln.width;\n const h = ln.height;\n const notch = 12;\n const pts = [\n [x + notch, y],\n [x + w - notch, y],\n [x + w, y + notch],\n [x + w, y + h],\n [x, y + h],\n [x, y + notch],\n ]\n .map((p) => p.join(\",\"))\n .join(\" \");\n return polygon({ points: pts, ...commonAttrs });\n }\n case \"trust\":\n return el(\"ellipse\", {\n cx: 0,\n cy: 0,\n rx: ln.width / 2,\n ry: ln.height / 2,\n ...commonAttrs,\n });\n case \"individual\":\n return circle({\n cx: 0,\n cy: 0,\n r: Math.min(ln.width, ln.height) / 2 - 4,\n ...commonAttrs,\n });\n case \"foundation\": {\n const w = ln.width;\n const h = ln.height;\n const tip = 14;\n const pts = [\n [x + w / 2, y - tip],\n [x + w, y],\n [x + w, y + h],\n [x, y + h],\n [x, y],\n ]\n .map((p) => p.join(\",\"))\n .join(\" \");\n return polygon({ points: pts, ...commonAttrs });\n }\n case \"disregarded\":\n return rect({\n x,\n y,\n width: ln.width,\n height: ln.height,\n ...commonAttrs,\n ...dashAttr,\n });\n case \"pool\":\n return rect({\n x,\n y,\n width: ln.width,\n height: ln.height,\n rx: 8,\n ry: 8,\n ...commonAttrs,\n ...dashAttr,\n });\n case \"placeholder\":\n return rect({\n x,\n y,\n width: ln.width,\n height: ln.height,\n rx: 4,\n ry: 4,\n ...commonAttrs,\n ...dashAttr,\n ...opacity,\n });\n }\n}\n\nfunction renderBadge(ln: EntityLayoutNode): string | undefined {\n const j = ln.node.jurisdiction;\n if (!j) return undefined;\n const bw = j.length >= 3 ? 26 : 20;\n const bh = 13;\n // Top-right corner\n const bx = ln.width / 2 - bw - 4;\n const by = -ln.height / 2 + 4;\n return group({}, [\n rect({ x: bx, y: by, width: bw, height: bh, rx: 2, class: \"lt-entity-badge-bg\" }),\n textEl(\n { x: bx + bw / 2, y: by + bh - 3, class: \"lt-entity-badge-text\" },\n j\n ),\n ]);\n}\n\nfunction renderStatusTag(ln: EntityLayoutNode, t: BaseTheme): string | undefined {\n const n = ln.node;\n if (!n.status || n.status === \"normal\") return undefined;\n const map: Record<string, { label: string; color: string }> = {\n new: { label: \"NEW\", color: t.positive },\n eliminated: { label: \"ELIMINATED\", color: t.negative },\n modified: { label: \"MODIFIED\", color: t.warn },\n };\n const info = map[n.status];\n if (!info) return undefined;\n const w = info.label.length * 6 + 8;\n const h = 12;\n const x = -ln.width / 2 - 2;\n const y = -ln.height / 2 - h - 2;\n return group({}, [\n rect({ x, y, width: w, height: h, rx: 2, fill: info.color, stroke: \"none\" }),\n textEl(\n { x: x + w / 2, y: y + h - 3, class: \"lt-entity-status-tag\", fill: t.bg },\n info.label\n ),\n ]);\n}\n\nfunction renderNodeLabels(ln: EntityLayoutNode): string[] {\n const n = ln.node;\n const pieces: string[] = [];\n const isCircle = n.entityType === \"individual\";\n\n if (isCircle) {\n // Name and role rendered BELOW the circle\n let y = ln.height / 2 + 14;\n pieces.push(textEl({ x: 0, y, class: \"lt-entity-name\" }, n.name));\n y += 13;\n if (n.role) {\n pieces.push(textEl({ x: 0, y, class: \"lt-entity-role\" }, n.role));\n y += 12;\n }\n if (n.note) {\n pieces.push(textEl({ x: 0, y, class: \"lt-entity-note\" }, n.note));\n }\n return pieces;\n }\n\n // Inside-shape rendering\n // Name centered, type underneath\n const topY = -6;\n pieces.push(textEl({ x: 0, y: topY, class: \"lt-entity-name\" }, n.name));\n pieces.push(textEl({ x: 0, y: topY + 14, class: \"lt-entity-type\" }, TYPE_LABEL[n.entityType] ?? n.entityType));\n\n // Below-node: role, note, formation date\n let belowY = ln.height / 2 + 14;\n if (n.role) {\n pieces.push(textEl({ x: 0, y: belowY, class: \"lt-entity-role\" }, n.role));\n belowY += 12;\n }\n if (n.note) {\n pieces.push(textEl({ x: 0, y: belowY, class: \"lt-entity-note\" }, n.note));\n belowY += 12;\n }\n if (n.formationDate) {\n pieces.push(\n textEl({ x: 0, y: belowY, class: \"lt-entity-note\" }, `est. ${n.formationDate}`)\n );\n }\n return pieces;\n}\n\nfunction edgeClass(edge: EntityEdge): string {\n switch (edge.op) {\n case \"pool\":\n return \"lt-entity-edge-pool\";\n case \"license\":\n return \"lt-entity-edge-license\";\n case \"distribution\":\n return \"lt-entity-edge-distribution\";\n case \"voting\":\n return \"lt-entity-edge-voting-pref\";\n case \"ownership\":\n default:\n // Highlight preferred / Series share class\n if (edge.shareClass && /pref|series/i.test(edge.shareClass)) {\n return \"lt-entity-edge-voting-pref\";\n }\n return \"lt-entity-edge\";\n }\n}\n\nfunction renderEdgeLabel(le: EntityLayoutEdge): string | undefined {\n const e = le.edge;\n const lines: string[] = [];\n if (e.percentage) lines.push(e.percentage);\n if (e.label) lines.push(e.label);\n const hasClass = !!e.shareClass;\n if (!lines.length && !hasClass) return undefined;\n\n const main = lines[0];\n const sub = lines[1];\n const classLabel = hasClass ? e.shareClass : undefined;\n\n // Approximate width\n const maxText = Math.max(\n main ? main.length : 0,\n sub ? sub.length : 0,\n classLabel ? classLabel.length : 0\n );\n const w = Math.max(30, maxText * 6 + 10);\n const rows = (main ? 1 : 0) + (sub ? 1 : 0) + (classLabel ? 1 : 0);\n const h = 4 + rows * 12;\n const x = le.labelX - w / 2;\n const y = le.labelY - h / 2;\n const pieces: string[] = [];\n pieces.push(rect({ x, y, width: w, height: h, rx: 3, class: \"lt-entity-label-bg\" }));\n let ty = y + 12;\n if (main) {\n pieces.push(textEl({ x: le.labelX, y: ty, class: \"lt-entity-label\" }, main));\n ty += 12;\n }\n if (sub) {\n pieces.push(textEl({ x: le.labelX, y: ty, class: \"lt-entity-label-sub\" }, sub));\n ty += 12;\n }\n if (classLabel) {\n pieces.push(textEl({ x: le.labelX, y: ty, class: \"lt-entity-label-sub\" }, classLabel));\n }\n return group({}, pieces);\n}\n\nexport function renderEntity(ast: EntityAST, config?: RenderConfig): string {\n const layout = layoutEntity(ast);\n const t = resolveBaseTheme(config?.theme ?? \"default\");\n const titleOffset = ast.title ? 34 : 12;\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 ?? \"Entity Structure Diagram\"));\n children.push(\n desc(\n `Entity structure diagram with ${ast.entities.length} entities and ${ast.edges.length} relationships`\n )\n );\n children.push(el(\"style\", {}, buildCss(t)));\n\n // Arrow markers (per semantic role)\n children.push(\n defs([\n arrowMarker(\"lt-entity-arrow\", t.stroke),\n arrowMarker(\"lt-entity-arrow-purple\", t.palette[3] ?? t.stroke),\n arrowMarker(\"lt-entity-arrow-green\", t.positive),\n arrowMarker(\"lt-entity-arrow-grey\", t.neutral),\n arrowMarker(\"lt-entity-arrow-blue\", t.accent),\n ])\n );\n\n if (ast.title) {\n children.push(textEl({ x: 20, y: 22, class: \"lt-entity-title\" }, ast.title));\n }\n\n const inner: string[] = [];\n\n // Clusters (behind nodes) — label sits INSIDE the cluster top row\n for (const c of layout.clusters) {\n const color = c.color ?? t.neutral;\n inner.push(\n rect({\n x: c.x,\n y: c.y,\n width: c.width,\n height: c.height,\n rx: 8,\n stroke: color,\n class: \"lt-entity-cluster\",\n })\n );\n inner.push(\n textEl(\n { x: c.x + 12, y: c.y + 16, class: \"lt-entity-cluster-label\", fill: color },\n c.label\n )\n );\n }\n\n // Edges (before nodes so nodes sit on top)\n for (const le of layout.edges) {\n const cls = edgeClass(le.edge);\n const markerId = pickMarker(le.edge, cls);\n inner.push(\n pathEl({\n d: le.path,\n class: cls,\n \"marker-end\": `url(#${markerId})`,\n })\n );\n }\n // Edge labels AFTER paths so they cover lines\n for (const le of layout.edges) {\n const piece = renderEdgeLabel(le);\n if (piece) inner.push(piece);\n }\n\n // Nodes\n for (const ln of layout.nodes) {\n const parts: string[] = [];\n parts.push(renderShape(ln, t));\n const badge = renderBadge(ln);\n if (badge) parts.push(badge);\n const status = renderStatusTag(ln, t);\n if (status) parts.push(status);\n for (const p of renderNodeLabels(ln)) parts.push(p);\n inner.push(\n group(\n {\n transform: `translate(${ln.x}, ${ln.y})`,\n \"data-entity-id\": ln.node.id,\n \"data-entity-type\": ln.node.entityType,\n \"data-jurisdiction\": ln.node.jurisdiction ?? \"\",\n },\n parts\n )\n );\n }\n\n const wrap = group({ transform: `translate(0, ${titleOffset})` }, inner);\n children.push(wrap);\n\n return svgRoot(\n {\n class: \"lt-entity\",\n role: \"img\",\n \"aria-label\": escapeXml(ast.title ?? \"Entity structure diagram\"),\n width,\n height,\n viewBox: `0 0 ${width} ${height}`,\n },\n children\n );\n}\n\nfunction arrowMarker(id: string, color: string): string {\n return el(\n \"marker\",\n {\n id,\n markerWidth: 9,\n markerHeight: 9,\n refX: 7,\n refY: 3,\n orient: \"auto\",\n markerUnits: \"strokeWidth\",\n },\n [el(\"path\", { d: \"M 0 0 L 7 3 L 0 6 z\", fill: color })]\n );\n}\n\nfunction pickMarker(_edge: EntityEdge, cls: string): string {\n if (cls === \"lt-entity-edge-license\") return \"lt-entity-arrow-purple\";\n if (cls === \"lt-entity-edge-distribution\") return \"lt-entity-arrow-green\";\n if (cls === \"lt-entity-edge-pool\") return \"lt-entity-arrow-grey\";\n if (cls === \"lt-entity-edge-voting-pref\") return \"lt-entity-arrow-blue\";\n return \"lt-entity-arrow\";\n}\n","import type { DiagramPlugin } from \"../../core/types\";\nimport { parseEntityDSL } from \"./parser\";\nimport { renderEntity } from \"./renderer\";\n\nexport const entity: DiagramPlugin = {\n type: \"entity\",\n detect(text: string): boolean {\n const first = text.trim().split(\"\\n\")[0]?.trim().toLowerCase() ?? \"\";\n return first.startsWith(\"entity-structure\");\n },\n parse: parseEntityDSL,\n\n render(text: string, config): string {\n const ast = parseEntityDSL(text);\n return renderEntity(ast, config);\n },\n};\n\nexport { parseEntityDSL } from \"./parser\";\nexport { renderEntity } from \"./renderer\";\nexport { layoutEntity } from \"./layout\";\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/diagrams/entity/parser.ts","../src/diagrams/entity/layout.ts","../src/diagrams/entity/renderer.ts","../src/diagrams/entity/index.ts"],"names":["text","title","path","textHalf"],"mappings":";;;;AAUO,IAAM,gBAAA,GAAN,cAA+B,KAAA,CAAM;AAAA,EAC1C,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,kBAAA;AAAA,EACd;AACF,CAAA;AAEA,IAAM,iBAAA,GAAgD;AAAA,EACpD,IAAA,EAAM,MAAA;AAAA,EACN,WAAA,EAAa,MAAA;AAAA,EACb,GAAA,EAAK,MAAA;AAAA,EACL,GAAA,EAAK,KAAA;AAAA,EACL,GAAA,EAAK,KAAA;AAAA,EACL,IAAA,EAAM,KAAA;AAAA,EACN,EAAA,EAAI,KAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,IAAA,EAAM,IAAA;AAAA,EACN,IAAA,EAAM,IAAA;AAAA,EACN,KAAA,EAAO,OAAA;AAAA,EACP,UAAA,EAAY,YAAA;AAAA,EACZ,MAAA,EAAQ,YAAA;AAAA,EACR,UAAA,EAAY,YAAA;AAAA,EACZ,GAAA,EAAK,YAAA;AAAA,EACL,WAAA,EAAa,aAAA;AAAA,EACb,MAAA,EAAQ,aAAA;AAAA,EACR,IAAA,EAAM,MAAA;AAAA,EACN,WAAA,EAAa,aAAA;AAAA,EACb,GAAA,EAAK;AACP,CAAA;AAEA,SAAS,aAAa,CAAA,EAAmB;AACvC,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,KAAA,MAAW,MAAM,CAAA,EAAG;AAClB,IAAA,IAAI,EAAA,KAAO,GAAA,EAAK,OAAA,GAAU,CAAC,OAAA;AAC3B,IAAA,IAAI,EAAA,KAAO,GAAA,IAAO,CAAC,OAAA,EAAS;AAC5B,IAAA,GAAA,IAAO,EAAA;AAAA,EACT;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,YAAY,CAAA,EAAmB;AACtC,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;AAGA,SAAS,oBAAoB,MAAA,EAA0B;AACrD,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,KAAA,MAAW,MAAM,MAAA,EAAQ;AACvB,IAAA,IAAI,EAAA,KAAO,GAAA,EAAK,OAAA,GAAU,CAAC,OAAA;AAC3B,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,IAAI,OAAO,GAAA,EAAK,KAAA,EAAA;AAAA,WAAA,IACP,OAAO,GAAA,EAAK,KAAA,EAAA;AAAA,IACvB;AACA,IAAA,IAAI,EAAA,KAAO,GAAA,IAAO,CAAC,OAAA,IAAW,UAAU,CAAA,EAAG;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,OAAO,KAAA;AACT;AAEA,SAAS,WAAW,MAAA,EAAwC;AAC1D,EAAA,MAAM,MAA8B,EAAC;AACrC,EAAA,KAAA,MAAW,CAAA,IAAK,mBAAA,CAAoB,MAAM,CAAA,EAAG;AAC3C,IAAA,MAAM,CAAA,GAAI,EAAE,IAAA,EAAK;AACjB,IAAA,IAAI,CAAC,CAAA,EAAG;AACR,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,OAAA,CAAQ,GAAG,CAAA;AAC3B,IAAA,IAAI,QAAQ,CAAA,EAAG,MAAM,IAAI,gBAAA,CAAiB,CAAA,kBAAA,EAAqB,CAAC,CAAA,eAAA,CAAiB,CAAA;AACjF,IAAA,MAAM,CAAA,GAAI,EAAE,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA,CAAE,IAAA,GAAO,WAAA,EAAY;AAC/C,IAAA,MAAM,IAAI,CAAA,CAAE,KAAA,CAAM,KAAA,GAAQ,CAAC,EAAE,IAAA,EAAK;AAClC,IAAA,GAAA,CAAI,CAAC,CAAA,GAAI,CAAA;AAAA,EACX;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,YAAY,CAAA,EAAqB;AACxC,EAAA,MAAM,CAAA,GAAI,EAAE,IAAA,EAAK;AACjB,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,KAAA,CACJ,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CACnB,MAAA,CAAO,OAAO,CAAA;AACnB;AAGA,SAAS,aAAa,KAAA,EAA2B;AAC/C,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,KAAA,MAAW,OAAO,KAAA,EAAO;AACvB,IAAA,MAAM,IAAA,GAAO,aAAa,GAAG,CAAA;AAC7B,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,EAAK,IAAK,UAAU,CAAA,EAAG;AAC/B,MAAA,IAAI,GAAA,EAAK;AACP,QAAA,GAAA,CAAI,KAAK,GAAG,CAAA;AACZ,QAAA,GAAA,GAAM,EAAA;AAAA,MACR;AACA,MAAA,GAAA,CAAI,KAAK,EAAE,CAAA;AACX,MAAA;AAAA,IACF;AACA,IAAA,KAAA,MAAW,MAAM,IAAA,EAAM;AACrB,MAAA,IAAI,OAAO,GAAA,EAAK,KAAA,EAAA;AAAA,WAAA,IACP,OAAO,GAAA,EAAK,KAAA,GAAQ,KAAK,GAAA,CAAI,CAAA,EAAG,QAAQ,CAAC,CAAA;AAAA,IACpD;AACA,IAAA,GAAA,GAAM,GAAA,GAAM,GAAA,GAAM,GAAA,GAAM,IAAA,CAAK,MAAK,GAAI,IAAA;AACtC,IAAA,IAAI,UAAU,CAAA,EAAG;AACf,MAAA,GAAA,CAAI,KAAK,GAAG,CAAA;AACZ,MAAA,GAAA,GAAM,EAAA;AAAA,IACR;AAAA,EACF;AACA,EAAA,IAAI,GAAA,EAAK,GAAA,CAAI,IAAA,CAAK,GAAG,CAAA;AACrB,EAAA,OAAO,GAAA;AACT;AAEA,IAAM,QAAA,GAAuD;AAAA;AAAA,EAE3D,EAAE,KAAA,EAAO,KAAA,EAAO,EAAA,EAAI,QAAA,EAAS;AAAA,EAC7B,EAAE,KAAA,EAAO,MAAA,EAAQ,EAAA,EAAI,MAAA,EAAO;AAAA,EAC5B,EAAE,KAAA,EAAO,MAAA,EAAQ,EAAA,EAAI,SAAA,EAAU;AAAA,EAC/B,EAAE,KAAA,EAAO,KAAA,EAAO,EAAA,EAAI,cAAA,EAAe;AAAA,EACnC,EAAE,KAAA,EAAO,IAAA,EAAM,EAAA,EAAI,WAAA;AACrB,CAAA;AAEA,SAAS,YAAY,IAAA,EAAqE;AACxF,EAAA,KAAA,MAAW,EAAE,KAAA,EAAO,EAAA,EAAG,IAAK,QAAA,EAAU;AAEpC,IAAA,MAAM,GAAA,GAAM,aAAA,CAAc,IAAA,EAAM,KAAK,CAAA;AACrC,IAAA,IAAI,GAAA,IAAO,GAAG,OAAO,EAAE,IAAI,GAAA,EAAK,GAAA,EAAK,MAAM,MAAA,EAAO;AAAA,EACpD;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,aAAA,CAAc,MAAc,KAAA,EAAuB;AAC1D,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,EAAA,GAAK,KAAK,CAAC,CAAA;AACjB,IAAA,IAAI,EAAA,KAAO,GAAA,EAAK,OAAA,GAAU,CAAC,OAAA;AAC3B,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,IAAI,OAAO,GAAA,EAAK,KAAA,EAAA;AAAA,WAAA,IACP,OAAO,GAAA,EAAK,KAAA,GAAQ,KAAK,GAAA,CAAI,CAAA,EAAG,QAAQ,CAAC,CAAA;AAAA,IACpD;AACA,IAAA,IAAI,CAAC,WAAW,KAAA,KAAU,CAAA,IAAK,KAAK,UAAA,CAAW,KAAA,EAAO,CAAC,CAAA,EAAG;AACxD,MAAA,OAAO,CAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,EAAA;AACT;AAEO,SAAS,eAAeA,KAAAA,EAAyB;AACtD,EAAA,MAAM,QAAA,GAAWA,KAAAA,CAAK,KAAA,CAAM,IAAI,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAC,CAAA;AACjE,EAAA,MAAM,KAAA,GAAQ,aAAa,QAAQ,CAAA;AAEnC,EAAA,IAAIC,MAAAA;AACJ,EAAA,MAAM,WAAyB,EAAC;AAChC,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAwB;AAC9C,EAAA,MAAM,QAAsB,EAAC;AAC7B,EAAA,MAAM,gBAAmC,EAAC;AAC1C,EAAA,MAAM,eAAA,uBAAsB,GAAA,EAA6B;AACzD,EAAA,MAAM,WAAyB,EAAC;AAEhC,EAAA,IAAI,cAAA,GAAiB,CAAA;AAErB,EAAA,KAAA,MAAW,OAAO,KAAA,EAAO;AACvB,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,EAAK;AACtB,IAAA,IAAI,CAAC,IAAA,EAAM;AAGX,IAAA,IAAI,sBAAA,CAAuB,IAAA,CAAK,IAAI,CAAA,EAAG;AACrC,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,WAAW,CAAA;AAChC,MAAA,IAAI,CAAA,EAAGA,MAAAA,GAAQ,CAAA,CAAE,CAAC,CAAA;AAClB,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,WAAW,IAAA,CAAK,KAAA;AAAA,MACpB;AAAA,KACF;AACA,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,CAAC,CAAA,CAAE,WAAA,EAAY;AACrC,MAAA,MAAM,IAAA,GAAO,SAAS,CAAC,CAAA;AACvB,MAAA,MAAM,KAAA,GAAQ,SAAS,CAAC,CAAA,GAAI,WAAW,QAAA,CAAS,CAAC,CAAC,CAAA,GAAI,EAAC;AACvD,MAAA,MAAM,GAAA,GAAuB,EAAE,IAAA,EAAM,IAAA,EAAK;AAC1C,MAAA,IAAI,MAAM,KAAA,EAAO,GAAA,CAAI,KAAA,GAAQ,WAAA,CAAY,MAAM,KAAK,CAAA;AACpD,MAAA,aAAA,CAAc,KAAK,GAAG,CAAA;AACtB,MAAA,eAAA,CAAgB,GAAA,CAAI,MAAM,GAAG,CAAA;AAC7B,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,+CAA+C,CAAA;AAC/E,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,MAAM,KAAA,GAAQ,aAAa,CAAC,CAAA;AAC5B,MAAA,MAAM,KAAA,GAAQ,aAAa,CAAC,CAAA,GAAI,WAAW,YAAA,CAAa,CAAC,CAAC,CAAA,GAAI,EAAC;AAC/D,MAAA,MAAM,GAAA,GAAkB;AAAA,QACtB,EAAA,EAAI,CAAA,QAAA,EAAW,EAAE,cAAc,CAAA,CAAA;AAAA,QAC/B,KAAA;AAAA,QACA,SAAS,KAAA,CAAM,OAAA,GAAU,YAAY,KAAA,CAAM,OAAO,IAAI;AAAC,OACzD;AACA,MAAA,IAAI,MAAM,KAAA,EAAO,GAAA,CAAI,KAAA,GAAQ,WAAA,CAAY,MAAM,KAAK,CAAA;AACpD,MAAA,QAAA,CAAS,KAAK,GAAG,CAAA;AACjB,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,cAAc,IAAA,CAAK,KAAA;AAAA,MACvB;AAAA,KACF;AACA,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,MAAM,EAAA,GAAK,YAAY,CAAC,CAAA;AACxB,MAAA,MAAM,IAAA,GAAO,YAAY,CAAC,CAAA;AAC1B,MAAA,MAAM,OAAA,GAAU,WAAA,CAAY,CAAC,CAAA,CAAE,WAAA,EAAY;AAC3C,MAAA,MAAM,gBAAA,GAAmB,WAAA,CAAY,CAAC,CAAA,EAAG,WAAA,EAAY;AACrD,MAAA,MAAM,QAAA,GAAW,YAAY,CAAC,CAAA;AAC9B,MAAA,MAAM,UAAA,GAAa,kBAAkB,OAAO,CAAA;AAC5C,MAAA,IAAI,CAAC,UAAA,EAAY;AACf,QAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,qBAAA,EAAwB,OAAO,CAAA,OAAA,EAAU,EAAE,CAAA,CAAA,CAAG,CAAA;AAAA,MAC3E;AACA,MAAA,IAAI,SAAA,CAAU,GAAA,CAAI,EAAE,CAAA,EAAG;AACrB,QAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,qBAAA,EAAwB,EAAE,CAAA,CAAA,CAAG,CAAA;AAAA,MAC1D;AACA,MAAA,MAAM,IAAA,GAAmB,EAAE,EAAA,EAAI,IAAA,EAAM,UAAA,EAAW;AAChD,MAAA,IAAI,gBAAA,OAAuB,YAAA,GAAe,gBAAA;AAC1C,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,MAAM,KAAA,GAAQ,WAAW,QAAQ,CAAA;AACjC,QAAA,IAAI,MAAM,MAAA,EAAQ,IAAA,CAAK,MAAA,GAAS,WAAA,CAAY,MAAM,MAAM,CAAA;AACxD,QAAA,IAAI,MAAM,GAAA,EAAK,IAAA,CAAK,QAAA,GAAW,WAAA,CAAY,MAAM,GAAG,CAAA;AACpD,QAAA,IAAI,MAAM,IAAA,EAAM,IAAA,CAAK,IAAA,GAAO,WAAA,CAAY,MAAM,IAAI,CAAA;AAClD,QAAA,IAAI,MAAM,IAAA,EAAM,IAAA,CAAK,IAAA,GAAO,WAAA,CAAY,MAAM,IAAI,CAAA;AAClD,QAAA,IAAI,MAAM,GAAA,EAAK,IAAA,CAAK,aAAA,GAAgB,WAAA,CAAY,MAAM,GAAG,CAAA;AAEzD,QAAA,MAAM,QAAA,uBAAe,GAAA,CAAI,CAAC,UAAU,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,KAAK,CAAC,CAAA;AACjE,QAAA,MAAM,SAAiC,EAAC;AACxC,QAAA,KAAA,MAAW,CAAA,IAAK,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,EAAG;AAClC,UAAA,IAAI,CAAC,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,EAAG,MAAA,CAAO,CAAC,CAAA,GAAI,WAAA,CAAY,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,QACxD;AACA,QAAA,IAAI,OAAO,IAAA,CAAK,MAAM,CAAA,CAAE,MAAA,OAAa,UAAA,GAAa,MAAA;AAAA,MACpD;AACA,MAAA,QAAA,CAAS,KAAK,IAAI,CAAA;AAClB,MAAA,SAAA,CAAU,GAAA,CAAI,IAAI,IAAI,CAAA;AACtB,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,QAAA,GAAW,YAAY,IAAI,CAAA;AACjC,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,OAAO,IAAA,CAAK,KAAA,CAAM,GAAG,QAAA,CAAS,GAAG,EAAE,IAAA,EAAK;AAC9C,MAAA,MAAM,IAAA,GAAO,KAAK,KAAA,CAAM,QAAA,CAAS,MAAM,QAAA,CAAS,GAAG,EAAE,IAAA,EAAK;AAC1D,MAAA,IAAI,CAAC,0BAAA,CAA2B,IAAA,CAAK,IAAI,CAAA,EAAG;AAC1C,QAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,6BAAA,EAAgC,IAAI,CAAA,CAAE,CAAA;AAAA,MACnE;AAEA,MAAA,MAAM,YAAY,IAAA,CAAK,KAAA;AAAA,QACrB;AAAA,OACF;AACA,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,mBAAA,EAAsB,IAAI,CAAA,CAAE,CAAA;AAAA,MACzD;AACA,MAAA,MAAM,EAAA,GAAK,UAAU,CAAC,CAAA;AACtB,MAAA,MAAM,GAAA,GAAM,SAAA,CAAU,CAAC,CAAA,EAAG,IAAA,EAAK;AAC/B,MAAA,MAAM,QAAA,GAAW,UAAU,CAAC,CAAA;AAC5B,MAAA,MAAM,OAAmB,EAAE,IAAA,EAAM,MAAM,EAAA,EAAI,EAAA,EAAI,SAAS,EAAA,EAAG;AAC3D,MAAA,IAAI,GAAA,OAAU,UAAA,GAAa,GAAA;AAC3B,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,MAAM,KAAA,GAAQ,WAAW,QAAQ,CAAA;AACjC,QAAA,IAAI,MAAM,KAAA,EAAO,IAAA,CAAK,UAAA,GAAa,WAAA,CAAY,MAAM,KAAK,CAAA;AAC1D,QAAA,IAAI,MAAM,KAAA,EAAO,IAAA,CAAK,KAAA,GAAQ,WAAA,CAAY,MAAM,KAAK,CAAA;AAAA,MACvD;AACA,MAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AACf,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,mBAAA,EAAsB,IAAI,CAAA,CAAE,CAAA;AAAA,EACzD;AAGA,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,IAAI,CAAC,SAAA,CAAU,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA,EAAG;AAC1B,MAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,gCAAA,EAAmC,CAAA,CAAE,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,IACzE;AACA,IAAA,IAAI,CAAC,SAAA,CAAU,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,EAAG;AACxB,MAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,gCAAA,EAAmC,CAAA,CAAE,EAAE,CAAA,CAAA,CAAG,CAAA;AAAA,IACvE;AAAA,EACF;AAEA,EAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,IAAA,MAAM,IAAI,iBAAiB,0CAA0C,CAAA;AAAA,EACvE;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,QAAA;AAAA,IACN,KAAA,EAAAA,MAAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACF;AACF;;;ACzQA,IAAM,QAAA,GAAW,GAAA;AACjB,IAAM,KAAA,GAAQ,EAAA;AACd,IAAM,OAAA,GAAU,EAAA;AAChB,IAAM,eAAA,GAAkB,EAAA;AACxB,IAAM,aAAA,GAAgB,EAAA;AAEf,SAAS,YAAY,IAAA,EAAqD;AAC/E,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,OAAA;AACH,MAAA,OAAO,EAAE,KAAA,EAAO,GAAA,EAAK,MAAA,EAAQ,EAAA,EAAG;AAAA;AAAA,IAClC,KAAK,YAAA;AACH,MAAA,OAAO,EAAE,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,EAAA,EAAG;AAAA;AAAA,IACjC,KAAK,YAAA;AACH,MAAA,OAAO,EAAE,KAAA,EAAO,GAAA,EAAK,MAAA,EAAQ,EAAA,EAAG;AAAA,IAClC,KAAK,MAAA;AAAA,IACL,KAAK,aAAA;AAAA,IACL,KAAK,aAAA;AAAA,IACL,KAAK,MAAA;AAAA,IACL,KAAK,KAAA;AAAA,IACL,KAAK,IAAA;AAAA,IACL;AACE,MAAA,OAAO,EAAE,KAAA,EAAO,GAAA,EAAK,MAAA,EAAQ,EAAA,EAAG;AAAA;AAEtC;AAEA,SAAS,aAAa,GAAA,EAAqC;AACzD,EAAA,MAAM,OAAA,uBAAc,GAAA,EAA0B;AAC9C,EAAA,MAAM,QAAA,uBAAe,GAAA,EAA0B;AAC/C,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,QAAA,EAAU;AAC5B,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,EAAE,CAAA;AACpB,IAAA,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,EAAE,CAAA;AAAA,EACvB;AACA,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,KAAA,EAAO;AACzB,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,EAAG,KAAK,CAAC,CAAA;AACzB,IAAA,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA,EAAG,KAAK,CAAC,CAAA;AAAA,EAC9B;AAIA,EAAA,MAAM,WAAA,GAAc,CAAC,CAAA,KACnB,CAAA,CAAE,EAAA,KAAO,eAAe,CAAA,CAAE,EAAA,KAAO,QAAA,IAAY,CAAA,CAAE,EAAA,KAAO,MAAA;AAExD,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAoB;AAEtC,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,QAAA,EAAU;AAC5B,IAAA,MAAM,MAAA,GAAA,CAAU,QAAQ,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,IAAK,EAAC,EAAG,MAAA,CAAO,WAAW,CAAA;AAC3D,IAAA,IAAI,OAAO,MAAA,KAAW,CAAA,QAAS,GAAA,CAAI,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,EAC5C;AAEA,EAAA,MAAM,OAAA,GAAU,GAAA,CAAI,QAAA,CAAS,MAAA,GAAS,CAAA;AACtC,EAAA,KAAA,IAAS,IAAA,GAAO,CAAA,EAAG,IAAA,GAAO,OAAA,EAAS,IAAA,EAAA,EAAQ;AACzC,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,KAAA,MAAW,CAAA,IAAK,IAAI,KAAA,EAAO;AACzB,MAAA,IAAI,CAAC,WAAA,CAAY,CAAC,CAAA,EAAG;AACrB,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA;AAC9B,MAAA,IAAI,UAAU,MAAA,EAAW;AACzB,MAAA,MAAM,OAAO,KAAA,GAAQ,CAAA;AACrB,MAAA,MAAM,GAAA,GAAM,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA;AAC1B,MAAA,IAAI,GAAA,KAAQ,MAAA,IAAa,IAAA,GAAO,GAAA,EAAK;AACnC,QAAA,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,IAAI,CAAA;AACpB,QAAA,OAAA,GAAU,IAAA;AAAA,MACZ;AAAA,IACF;AACA,IAAA,IAAI,CAAC,OAAA,EAAS;AAAA,EAChB;AAGA,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,KAAA,EAAO;AACzB,IAAA,IAAI,WAAA,CAAY,CAAC,CAAA,EAAG;AACpB,IAAA,IAAI,CAAC,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,EAAG;AACpB,MAAA,MAAM,GAAA,GAAM,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA;AAC5B,MAAA,IAAI,QAAQ,MAAA,EAAW,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,IAAI,GAAG,CAAA;AAAA,IAC5C;AACA,IAAA,IAAI,CAAC,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA,EAAG;AACtB,MAAA,MAAM,GAAA,GAAM,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA;AAC1B,MAAA,IAAI,QAAQ,MAAA,EAAW,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,MAAM,GAAG,CAAA;AAAA,IAC9C;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,QAAA,EAAU;AAC5B,IAAA,IAAI,CAAC,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,EAAE,GAAG,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,CAAC,CAAA;AAAA,EACzC;AACA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,aAAa,GAAA,EAAoC;AAC/D,EAAA,MAAM,KAAA,GAAQ,aAAa,GAAG,CAAA;AAC9B,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAG,MAAM,IAAA,CAAK,KAAA,CAAM,MAAA,EAAQ,CAAC,CAAA;AAGzD,EAAA,MAAM,MAAA,uBAAa,GAAA,EAA0B;AAC7C,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,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;AAGA,EAAA,MAAM,cAAkC,EAAC;AACzC,EAAA,MAAM,IAAA,uBAAW,GAAA,EAA8B;AAC/C,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,QAAA,EAAU;AAC5B,IAAA,MAAM,CAAA,GAAI,WAAA,CAAY,CAAA,CAAE,UAAU,CAAA;AAClC,IAAA,MAAM,CAAA,GAAI,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,IAAK,CAAA;AAC7B,IAAA,MAAM,EAAA,GAAuB;AAAA,MAC3B,IAAA,EAAM,CAAA;AAAA,MACN,CAAA,EAAG,CAAA;AAAA,MACH,CAAA,EAAG,OAAA,GAAU,CAAA,GAAI,QAAA,GAAW,EAAE,MAAA,GAAS,CAAA;AAAA,MACvC,IAAA,EAAM,CAAA;AAAA,MACN,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,QAAQ,CAAA,CAAE,MAAA;AAAA,MACV,IAAA,EAAM,CAAA;AAAA,MACN,OAAA,EAAS;AAAA,KACX;AACA,IAAA,EAAA,CAAG,IAAA,GAAO,EAAA,CAAG,CAAA,GAAI,CAAA,CAAE,MAAA,GAAS,CAAA;AAC5B,IAAA,EAAA,CAAG,OAAA,GAAU,EAAA,CAAG,CAAA,GAAI,CAAA,CAAE,MAAA,GAAS,CAAA;AAC/B,IAAA,WAAA,CAAY,KAAK,EAAE,CAAA;AACnB,IAAA,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,EAAE,CAAA;AAAA,EACnB;AAGA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,OAAA,EAAS,CAAA,EAAA,EAAK;AACjC,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,GAAA,CAAI,CAAC,KAAK,EAAC;AAChC,IAAA,IAAI,EAAA,GAAK,OAAA;AACT,IAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA;AACxB,MAAA,EAAA,IAAM,GAAG,KAAA,GAAQ,CAAA;AACjB,MAAA,EAAA,CAAG,CAAA,GAAI,EAAA;AACP,MAAA,EAAA,IAAM,EAAA,CAAG,QAAQ,CAAA,GAAI,KAAA;AAAA,IACvB;AAAA,EACF;AAGA,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAsB;AAC3C,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAsB;AAC1C,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,QAAA,EAAU;AAC5B,IAAA,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,EAAE,CAAA;AACrB,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,EAAE,CAAA;AAAA,EACtB;AACA,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,KAAA,EAAO;AACzB,IAAA,IAAI,CAAA,CAAE,OAAO,WAAA,IAAe,CAAA,CAAE,OAAO,QAAA,IAAY,CAAA,CAAE,OAAO,MAAA,EAAQ;AAChE,MAAA,QAAA,CAAS,IAAI,CAAA,CAAE,IAAI,CAAA,EAAG,IAAA,CAAK,EAAE,EAAE,CAAA;AAC/B,MAAA,OAAA,CAAQ,IAAI,CAAA,CAAE,EAAE,CAAA,EAAG,IAAA,CAAK,EAAE,IAAI,CAAA;AAAA,IAChC;AAAA,EACF;AAGA,EAAA,KAAA,IAAS,IAAA,GAAO,CAAA,EAAG,IAAA,GAAO,CAAA,EAAG,IAAA,EAAA,EAAQ;AACnC,IAAA,KAAA,IAAS,CAAA,GAAI,OAAA,GAAU,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACrC,MAAA,MAAM,SAAA,GAAY,MAAA,CAAO,GAAA,CAAI,CAAC,KAAK,EAAC;AACpC,MAAA,KAAA,MAAW,KAAK,SAAA,EAAW;AACzB,QAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA;AACxB,QAAA,MAAM,WAAW,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,EAAE,KAAK,EAAC;AACxC,QAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AAC3B,QAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AAGzB,UAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,QAAA,CAAS,CAAC,CAAC,CAAA;AAClC,UAAA,IAAI,CAAC,KAAA,EAAO;AACZ,UAAA,MAAM,cAAA,GAAA,CAAkB,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,IAAA,CAAK,EAAE,CAAA,IAAK,EAAC,EACpD,GAAA,CAAI,CAAC,GAAA,KAAQ,KAAK,GAAA,CAAI,GAAG,CAAC,CAAA,CAC1B,MAAA,CAAO,CAAC,CAAA,KAA6B,CAAC,CAAC,CAAA,IAAK,CAAA,CAAE,IAAA,KAAS,CAAC,CAAA;AAC3D,UAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAC7B,YAAA,cAAA,CAAe,IAAA;AAAA,cACb,CAAC,GAAG,CAAA,KAAA,CACD,MAAA,CAAO,IAAI,CAAC,CAAA,IAAK,EAAC,EAAG,OAAA,CAAQ,EAAE,IAAI,CAAA,GAAA,CACnC,OAAO,GAAA,CAAI,CAAC,KAAK,EAAC,EAAG,OAAA,CAAQ,CAAA,CAAE,IAAI;AAAA,aACxC;AACA,YAAA,MAAM,aAAa,cAAA,CAAe,MAAA;AAAA,cAChC,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,GAAM,kBAAA,CAAmB,CAAC,CAAA,GAAI,CAAA;AAAA,cAC1C;AAAA,aACF;AACA,YAAA,MAAM,SAAS,IAAA,CAAK,GAAA;AAAA,cAClB,KAAA,GAAA,CAAS,mBAAmB,EAAE,CAAA,GAAI,mBAAmB,cAAA,CAAe,CAAC,CAAC,CAAA,IAAK,CAAA;AAAA,cAC3E,aAAa,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,cAAA,CAAe,SAAS,CAAC;AAAA,aACpD;AACA,YAAA,MAAM,GAAA,GAAM,cAAA,CAAe,OAAA,CAAQ,EAAE,CAAA;AACrC,YAAA,MAAM,KAAK,cAAA,CAAe,MAAA;AAC1B,YAAA,EAAA,CAAG,IAAI,KAAA,CAAM,CAAA,GAAA,CAAK,GAAA,GAAA,CAAO,EAAA,GAAK,KAAK,CAAA,IAAK,MAAA;AAAA,UAC1C,CAAA,MAAO;AACL,YAAA,EAAA,CAAG,IAAI,KAAA,CAAM,CAAA;AAAA,UACf;AACA,UAAA;AAAA,QACF;AACA,QAAA,MAAM,EAAA,GAAK,QAAA,CACR,GAAA,CAAI,CAAC,MAAM,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG,CAAC,CAAA,CACzB,MAAA,CAAO,CAAC,CAAA,KAAmB,MAAM,MAAS,CAAA;AAC7C,QAAA,IAAI,EAAA,CAAG,SAAS,CAAA,EAAG;AACjB,UAAA,EAAA,CAAG,CAAA,GAAA,CAAK,IAAA,CAAK,GAAA,CAAI,GAAG,EAAE,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,EAAE,CAAA,IAAK,CAAA;AAAA,QAC/C;AAAA,MACF;AAAA,IACF;AAGA,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,OAAA,EAAS,CAAA,EAAA,EAAK;AACjC,MAAA,MAAM,SAAA,GAAY,MAAA,CAAO,GAAA,CAAI,CAAC,KAAK,EAAC;AACpC,MAAA,KAAA,MAAW,KAAK,SAAA,EAAW;AACzB,QAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA;AACxB,QAAA,MAAM,YAAY,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,EAAE,KAAK,EAAC;AACxC,QAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AAC1B,QAAA,MAAM,EAAA,GAAK,SAAA,CACR,GAAA,CAAI,CAAC,MAAM,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG,CAAC,CAAA,CACzB,MAAA,CAAO,CAAC,CAAA,KAAmB,MAAM,MAAS,CAAA;AAC7C,QAAA,IAAI,EAAA,CAAG,SAAS,CAAA,EAAG;AACjB,UAAA,EAAA,CAAG,CAAA,GAAA,CAAK,IAAA,CAAK,GAAA,CAAI,GAAG,EAAE,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,EAAE,CAAA,IAAK,CAAA;AAAA,QAC/C;AAAA,MACF;AAAA,IACF;AAGA,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,OAAA,EAAS,CAAA,EAAA,EAAK;AACjC,MAAA,MAAM,SAAA,GAAA,CAAa,OAAO,GAAA,CAAI,CAAC,KAAK,EAAC,EAClC,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,IAAI,CAAA,CAAE,EAAE,CAAE,CAAA,CAC1B,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA;AAC3B,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,SAAA,CAAU,QAAQ,CAAA,EAAA,EAAK;AACzC,QAAA,MAAM,IAAA,GAAO,SAAA,CAAU,CAAA,GAAI,CAAC,CAAA;AAC5B,QAAA,MAAM,GAAA,GAAM,UAAU,CAAC,CAAA;AACvB,QAAA,MAAM,MAAM,kBAAA,CAAmB,IAAI,CAAA,GAAI,kBAAA,CAAmB,GAAG,CAAA,GAAI,KAAA;AACjE,QAAA,IAAI,GAAA,CAAI,IAAI,IAAA,CAAK,CAAA,GAAI,KAAK,GAAA,CAAI,CAAA,GAAI,KAAK,CAAA,GAAI,GAAA;AAAA,MAC7C;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,OAAA,GAAU,QAAA;AACd,EAAA,KAAA,MAAW,MAAM,WAAA,EAAa;AAC5B,IAAA,MAAM,IAAA,GAAO,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,KAAA,GAAQ,CAAA;AAC/B,IAAA,IAAI,IAAA,GAAO,SAAS,OAAA,GAAU,IAAA;AAAA,EAChC;AACA,EAAA,MAAM,QAAQ,OAAA,GAAU,OAAA;AACxB,EAAA,IAAI,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,GAAI,GAAA,EAAK;AACzB,IAAA,KAAA,MAAW,EAAA,IAAM,WAAA,EAAa,EAAA,CAAG,CAAA,IAAK,KAAA;AAAA,EACxC;AAaA,EAAA,MAAM,QAA4B,EAAC;AACnC,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,KAAA,EAAO;AACzB,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA;AAC5B,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA;AACxB,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,EAAA,EAAI;AAElB,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,KAAS,EAAA,CAAG,IAAA;AAClC,IAAA,IAAIC,KAAAA;AACJ,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI,MAAA;AAEJ,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,CAAA,GAAI,EAAA,CAAG,CAAA;AAC9B,MAAA,MAAM,EAAA,GAAK,SAAA,GAAY,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,GAAI,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,KAAA,GAAQ,CAAA;AACvE,MAAA,MAAM,EAAA,GAAK,SAAA,GAAY,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,QAAQ,CAAA,GAAI,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,KAAA,GAAQ,CAAA;AAC/D,MAAAA,KAAAA,GAAO,CAAA,EAAA,EAAK,EAAE,CAAA,CAAA,EAAI,IAAA,CAAK,CAAC,CAAA,GAAA,EAAM,EAAE,CAAA,CAAA,EAAI,EAAA,CAAG,CAAC,CAAA,CAAA;AACxC,MAAA,MAAA,GAAA,CAAU,KAAK,EAAA,IAAM,CAAA;AACrB,MAAA,MAAA,GAAS,KAAK,CAAA,GAAI,CAAA;AAAA,IACpB,CAAA,MAAO;AACL,MAAA,MAAM,KAAK,IAAA,CAAK,CAAA;AAChB,MAAA,MAAM,KAAK,IAAA,CAAK,OAAA;AAChB,MAAA,MAAM,KAAK,EAAA,CAAG,CAAA;AACd,MAAA,MAAM,KAAK,EAAA,CAAG,IAAA;AACd,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,EAAE,CAAA,GAAI,GAAA;AAErC,MAAA,IAAI,QAAA,EAAU;AAEZ,QAAAA,KAAAA,GAAO,KAAK,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,GAAA,EAAM,EAAE,IAAI,EAAE,CAAA,CAAA;AAClC,QAAA,MAAA,GAAS,EAAA;AACT,QAAA,MAAA,GAAA,CAAU,KAAK,EAAA,IAAM,CAAA;AAAA,MACvB,CAAA,MAAO;AAIL,QAAA,MAAM,IAAA,GAAA,CAAQ,KAAK,EAAA,IAAM,CAAA;AACzB,QAAAA,QAAO,CAAA,EAAA,EAAK,EAAE,CAAA,CAAA,EAAI,EAAE,MAAM,EAAE,CAAA,CAAA,EAAI,IAAI,CAAA,GAAA,EAAM,EAAE,CAAA,CAAA,EAAI,IAAI,CAAA,GAAA,EAAM,EAAE,IAAI,EAAE,CAAA,CAAA;AAElE,QAAA,MAAM,MAAA,GACJ,EAAE,EAAA,KAAO,WAAA,IAAe,EAAE,EAAA,KAAO,QAAA,IAAY,EAAE,EAAA,KAAO,MAAA;AACxD,QAAA,MAAM,WAAA,GAAc,UAAU,OAAA,CAAQ,GAAA,CAAI,EAAE,EAAE,CAAA,IAAK,EAAC,EAAG,MAAA,GAAS,CAAA;AAChE,QAAA,MAAM,QAAQ,WAAA,GAAc,CAAA;AAO5B,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,MAAA,GAAS,EAAA;AACT,UAAA,MAAA,GAAS,IAAA;AAAA,QACX,CAAA,MAAO;AACL,UAAA,MAAA,GAAS,EAAA;AACT,UAAA,MAAA,GAAS,IAAA;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAEA,IAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA,EAAG,MAAAA,KAAAA,EAAM,MAAA,EAAQ,QAAQ,CAAA;AAAA,EAC9C;AAGA,EAAA,MAAM,iBAAwC,EAAC;AAC/C,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAEhC,EAAA,MAAM,SAAA,GAAY,EAAA;AAElB,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,QAAA,EAAU;AAC5B,IAAA,MAAM,UAAU,CAAA,CAAE,OAAA,CACf,GAAA,CAAI,CAAC,OAAO,IAAA,CAAK,GAAA,CAAI,EAAE,CAAC,EACxB,MAAA,CAAO,CAAC,CAAA,KAA6B,CAAC,CAAC,CAAC,CAAA;AAC3C,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC1B,IAAA,MAAM,MAAA,GAAS,YAAY,OAAO,CAAA;AAClC,IAAA,cAAA,CAAe,IAAA,CAAK;AAAA,MAClB,IAAI,CAAA,CAAE,EAAA;AAAA,MACN,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,CAAA,EAAG,OAAO,IAAA,GAAO,eAAA;AAAA,MACjB,CAAA,EAAG,MAAA,CAAO,IAAA,GAAO,eAAA,GAAkB,SAAA;AAAA,MACnC,KAAA,EAAO,MAAA,CAAO,IAAA,GAAO,MAAA,CAAO,OAAO,eAAA,GAAkB,CAAA;AAAA,MACrD,QAAQ,MAAA,CAAO,IAAA,GAAO,MAAA,CAAO,IAAA,GAAO,kBAAkB,CAAA,GAAI;AAAA,KAC3D,CAAA;AACD,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,KAAK,EAAE,CAAA;AAAA,EAChD;AAGA,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,aAAA,EAAe;AACjC,IAAA,MAAM,UAAU,WAAA,CAAY,MAAA;AAAA,MAC1B,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,CAAK,YAAA,KAAiB,CAAA,CAAE,IAAA,IAAQ,CAAC,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,IAAA,CAAK,EAAE;AAAA,KACjE;AACA,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC1B,IAAA,MAAM,MAAA,GAAS,YAAY,OAAO,CAAA;AAClC,IAAA,cAAA,CAAe,IAAA,CAAK;AAAA,MAClB,EAAA,EAAI,CAAA,IAAA,EAAO,CAAA,CAAE,IAAI,CAAA,CAAA;AAAA,MACjB,OAAO,CAAA,CAAE,IAAA;AAAA,MACT,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,CAAA,EAAG,OAAO,IAAA,GAAO,eAAA;AAAA,MACjB,CAAA,EAAG,MAAA,CAAO,IAAA,GAAO,eAAA,GAAkB,SAAA;AAAA,MACnC,KAAA,EAAO,MAAA,CAAO,IAAA,GAAO,MAAA,CAAO,OAAO,eAAA,GAAkB,CAAA;AAAA,MACrD,QAAQ,MAAA,CAAO,IAAA,GAAO,MAAA,CAAO,IAAA,GAAO,kBAAkB,CAAA,GAAI;AAAA,KAC3D,CAAA;AACD,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,KAAK,EAAE,CAAA;AAAA,EAChD;AAKA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,cAAA,CAAe,QAAQ,CAAA,EAAA,EAAK;AAC9C,IAAA,KAAA,IAAS,IAAI,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,cAAA,CAAe,QAAQ,CAAA,EAAA,EAAK;AAClD,MAAA,MAAM,CAAA,GAAI,eAAe,CAAC,CAAA;AAC1B,MAAA,MAAM,CAAA,GAAI,eAAe,CAAC,CAAA;AAC1B,MAAA,MAAM,QAAA,GAAW,EAAE,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,CAAA,IAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,CAAA,CAAA;AAC5D,MAAA,MAAM,QAAA,GAAW,EAAE,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,MAAA,GAAS,CAAA,CAAE,CAAA,IAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,MAAA,GAAS,CAAA,CAAE,CAAA,CAAA;AAC9D,MAAA,IAAI,CAAC,QAAA,IAAY,CAAC,QAAA,EAAU;AAE5B,MAAA,MAAM,CAAC,GAAA,EAAK,GAAG,CAAA,GAAI,EAAE,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,CAAC,CAAA,EAAG,CAAC,CAAA,GAAI,CAAC,GAAG,CAAC,CAAA;AAC7C,MAAA,MAAM,IAAA,GAAO,IAAI,CAAA,GAAI,aAAA;AACrB,MAAA,IAAI,GAAA,CAAI,CAAA,GAAI,GAAA,CAAI,MAAA,GAAS,IAAA,EAAM,GAAA,CAAI,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAA,GAAO,GAAA,CAAI,CAAC,CAAA;AAAA,IACvE;AAAA,EACF;AAGA,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,KAAA,MAAW,MAAM,WAAA,EAAa;AAC5B,IAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,KAAA,GAAQ,CAAA;AAChC,IAAA,MAAM,MAAA,GAAS,GAAG,OAAA,GAAU,EAAA;AAC5B,IAAA,IAAI,KAAA,GAAQ,MAAM,IAAA,GAAO,KAAA;AACzB,IAAA,IAAI,MAAA,GAAS,MAAM,IAAA,GAAO,MAAA;AAAA,EAC5B;AACA,EAAA,KAAA,MAAW,KAAK,cAAA,EAAgB;AAC9B,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,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,OAAO,OAAO,CAAA;AAC1C,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,OAAO,OAAO,CAAA;AAE3C,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,MAAA;AAAA,IACA,KAAA,EAAO,WAAA;AAAA,IACP,QAAA,EAAU,IAAA;AAAA,IACV,KAAA;AAAA,IACA,QAAA,EAAU;AAAA,GACZ;AACF;AAOA,SAAS,mBAAmB,EAAA,EAA8B;AACxD,EAAA,MAAM,IAAI,EAAA,CAAG,IAAA;AACb,EAAA,MAAM,SAAA,GAAY,GAAG,KAAA,GAAQ,CAAA;AAC7B,EAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAwB,CAAA,GAAI,EAAE,MAAA,GAAS,CAAA;AACxD,EAAA,IAAI,CAAA,CAAE,eAAe,YAAA,EAAc;AACjC,IAAA,MAAM,UAAU,IAAA,CAAK,GAAA;AAAA,MACnB,OAAA,CAAQ,EAAE,IAAI,CAAA;AAAA,MACd,OAAA,CAAQ,EAAE,IAAI,CAAA;AAAA,MACd,OAAA,CAAQ,EAAE,IAAI;AAAA,KAChB;AACA,IAAA,MAAMC,SAAAA,GAAY,OAAA,GAAU,GAAA,GAAO,CAAA,GAAI,CAAA;AACvC,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,SAAA,EAAWA,SAAQ,CAAA;AAAA,EACrC;AAEA,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,CAAA,CAAE,IAAI,CAAA,EAAG,OAAA,CAAQ,CAAA,CAAE,IAAI,CAAC,CAAA;AAC9D,EAAA,MAAM,QAAA,GAAY,YAAA,GAAe,CAAA,GAAK,CAAA,GAAI,CAAA;AAC1C,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,SAAA,EAAW,QAAQ,CAAA;AACrC;AAEA,SAAS,YAAY,KAAA,EAKnB;AACA,EAAA,IAAI,IAAA,GAAO,QAAA;AACX,EAAA,IAAI,IAAA,GAAO,CAAA,QAAA;AACX,EAAA,IAAI,IAAA,GAAO,QAAA;AACX,EAAA,IAAI,IAAA,GAAO,CAAA,QAAA;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,QAAQ,CAAC,CAAA;AACvC,IAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,CAAA,CAAE,IAAI,CAAA;AAC5B,IAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,CAAA,CAAE,UAAU,EAAE,CAAA;AAAA,EACtC;AACA,EAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAK;AAClC;;;AC1cA,SAAS,SAAS,CAAA,EAAsB;AACtC,EAAA,OAAO;AAAA,yBAAA,EACkB,EAAE,EAAE,CAAA;AAAA,qDAAA,EACwB,EAAE,IAAI,CAAA;AAAA,mDAAA,EACR,EAAE,IAAI,CAAA;AAAA,mDAAA,EACN,EAAE,SAAS,CAAA;AAAA,sDAAA,EACR,EAAE,SAAS,CAAA;AAAA,+CAAA,EAClB,EAAE,SAAS,CAAA;AAAA,4BAAA,EAC9B,CAAA,CAAE,EAAE,CAAA,UAAA,EAAa,CAAA,CAAE,OAAO,CAAA;AAAA,wDAAA,EACE,EAAE,IAAI,CAAA;AAAA,0BAAA,EACpC,EAAE,MAAM,CAAA;AAAA,iCAAA,EACD,EAAE,MAAM,CAAA;AAAA,+BAAA,EACV,EAAE,OAAO,CAAA;AAAA,kCAAA,EACN,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,uCAAA,EACP,EAAE,QAAQ,CAAA;AAAA,sCAAA,EACX,EAAE,MAAM,CAAA;AAAA,4BAAA,EAClB,CAAA,CAAE,EAAE,CAAA,UAAA,EAAa,CAAA,CAAE,OAAO,CAAA;AAAA,oDAAA,EACF,EAAE,IAAI,CAAA;AAAA,uDAAA,EACH,EAAE,SAAS,CAAA;AAAA;AAAA,oCAAA,EAE9B,EAAE,EAAE,CAAA;AAAA;AAAA,gCAAA,EAER,EAAE,QAAQ,CAAA;AAAA,uCAAA,EACH,EAAE,QAAQ,CAAA;AAAA,qCAAA,EACZ,EAAE,IAAI,CAAA;AAAA;AAAA,CAAA,CAE3C,IAAA,EAAK;AACP;AAEA,IAAM,IAAA,GAA+B;AAAA,EACnC,IAAA,EAAM,SAAA;AAAA,EACN,GAAA,EAAK,SAAA;AAAA,EACL,EAAA,EAAI,SAAA;AAAA,EACJ,KAAA,EAAO,SAAA;AAAA,EACP,UAAA,EAAY,SAAA;AAAA,EACZ,UAAA,EAAY,SAAA;AAAA,EACZ,WAAA,EAAa,SAAA;AAAA,EACb,IAAA,EAAM,SAAA;AAAA,EACN,WAAA,EAAa;AACf,CAAA;AAEA,IAAM,UAAA,GAAqC;AAAA,EACzC,IAAA,EAAM,aAAA;AAAA,EACN,GAAA,EAAK,KAAA;AAAA,EACL,EAAA,EAAI,WAAA;AAAA,EACJ,KAAA,EAAO,OAAA;AAAA,EACP,UAAA,EAAY,YAAA;AAAA,EACZ,UAAA,EAAY,YAAA;AAAA,EACZ,WAAA,EAAa,oBAAA;AAAA,EACb,IAAA,EAAM,eAAA;AAAA,EACN,WAAA,EAAa;AACf,CAAA;AAEA,SAAS,YAAY,IAAA,EAAsC;AACzD,EAAA,QAAQ,KAAK,MAAA;AAAQ,IACnB,KAAK,KAAA;AACH,MAAA,OAAO,sBAAA;AAAA,IACT,KAAK,YAAA;AACH,MAAA,OAAO,6BAAA;AAAA,IACT,KAAK,UAAA;AACH,MAAA,OAAO,2BAAA;AAAA,IACT;AACE,MAAA,OAAO,MAAA;AAAA;AAEb;AAEA,SAAS,WAAA,CAAY,IAAsB,CAAA,EAAsB;AAC/D,EAAA,MAAM,IAAI,EAAA,CAAG,IAAA;AACb,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,CAAA,CAAE,UAAU,KAAK,CAAA,CAAE,EAAA;AACrC,EAAA,MAAM,EAAA,GAAK,YAAY,CAAC,CAAA;AACxB,EAAA,MAAM,WAAA,GAA+C;AAAA,IACnD,IAAA;AAAA,IACA,QAAQ,CAAA,CAAE,MAAA;AAAA,IACV,cAAA,EAAgB;AAAA,GAClB;AACA,EAAA,IAAI,EAAA,EAAI;AACN,IAAA,WAAA,CAAY,KAAA,GAAQ,EAAA;AAAA,EACtB;AAEA,EAAA,MAAM,MAAA,GACJ,EAAE,UAAA,KAAe,aAAA,IACjB,EAAE,UAAA,KAAe,aAAA,IACjB,EAAE,UAAA,KAAe,MAAA;AAEnB,EAAA,MAAM,WAAW,MAAA,GAAS,EAAE,kBAAA,EAAoB,KAAA,KAAU,EAAC;AAC3D,EAAA,MAAM,OAAA,GAAU,EAAE,UAAA,KAAe,aAAA,GAAgB,EAAE,OAAA,EAAS,IAAA,KAAS,EAAC;AAEtE,EAAA,MAAM,CAAA,GAAI,CAAC,EAAA,CAAG,KAAA,GAAQ,CAAA;AACtB,EAAA,MAAM,CAAA,GAAI,CAAC,EAAA,CAAG,MAAA,GAAS,CAAA;AAEvB,EAAA,QAAQ,EAAE,UAAA;AAAY,IACpB,KAAK,MAAA;AACH,MAAA,OAAO,IAAA,CAAK;AAAA,QACV,CAAA;AAAA,QACA,CAAA;AAAA,QACA,OAAO,EAAA,CAAG,KAAA;AAAA,QACV,QAAQ,EAAA,CAAG,MAAA;AAAA,QACX,EAAA,EAAI,CAAA;AAAA,QACJ,GAAG,WAAA;AAAA,QACH,GAAG;AAAA,OACJ,CAAA;AAAA,IACH,KAAK,KAAA;AACH,MAAA,OAAO,IAAA,CAAK;AAAA,QACV,CAAA;AAAA,QACA,CAAA;AAAA,QACA,OAAO,EAAA,CAAG,KAAA;AAAA,QACV,QAAQ,EAAA,CAAG,MAAA;AAAA,QACX,EAAA,EAAI,EAAA;AAAA,QACJ,EAAA,EAAI,EAAA;AAAA,QACJ,GAAG;AAAA,OACJ,CAAA;AAAA,IACH,KAAK,IAAA,EAAM;AAET,MAAA,MAAM,IAAI,EAAA,CAAG,KAAA;AACb,MAAA,MAAM,IAAI,EAAA,CAAG,MAAA;AACb,MAAA,MAAM,KAAA,GAAQ,EAAA;AACd,MAAA,MAAM,GAAA,GAAM;AAAA,QACV,CAAC,CAAA,GAAI,KAAA,EAAO,CAAC,CAAA;AAAA,QACb,CAAC,CAAA,GAAI,CAAA,GAAI,KAAA,EAAO,CAAC,CAAA;AAAA,QACjB,CAAC,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAK,CAAA;AAAA,QACjB,CAAC,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAC,CAAA;AAAA,QACb,CAAC,CAAA,EAAG,CAAA,GAAI,CAAC,CAAA;AAAA,QACT,CAAC,CAAA,EAAG,CAAA,GAAI,KAAK;AAAA,OACf,CACG,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,KAAK,GAAG,CAAC,CAAA,CACtB,IAAA,CAAK,GAAG,CAAA;AACX,MAAA,OAAO,QAAQ,EAAE,MAAA,EAAQ,GAAA,EAAK,GAAG,aAAa,CAAA;AAAA,IAChD;AAAA,IACA,KAAK,OAAA;AACH,MAAA,OAAO,GAAG,SAAA,EAAW;AAAA,QACnB,EAAA,EAAI,CAAA;AAAA,QACJ,EAAA,EAAI,CAAA;AAAA,QACJ,EAAA,EAAI,GAAG,KAAA,GAAQ,CAAA;AAAA,QACf,EAAA,EAAI,GAAG,MAAA,GAAS,CAAA;AAAA,QAChB,GAAG;AAAA,OACJ,CAAA;AAAA,IACH,KAAK,YAAA;AACH,MAAA,OAAO,MAAA,CAAO;AAAA,QACZ,EAAA,EAAI,CAAA;AAAA,QACJ,EAAA,EAAI,CAAA;AAAA,QACJ,CAAA,EAAG,KAAK,GAAA,CAAI,EAAA,CAAG,OAAO,EAAA,CAAG,MAAM,IAAI,CAAA,GAAI,CAAA;AAAA,QACvC,GAAG;AAAA,OACJ,CAAA;AAAA,IACH,KAAK,YAAA,EAAc;AACjB,MAAA,MAAM,IAAI,EAAA,CAAG,KAAA;AACb,MAAA,MAAM,IAAI,EAAA,CAAG,MAAA;AACb,MAAA,MAAM,GAAA,GAAM,EAAA;AACZ,MAAA,MAAM,GAAA,GAAM;AAAA,QACV,CAAC,CAAA,GAAI,CAAA,GAAI,CAAA,EAAG,IAAI,GAAG,CAAA;AAAA,QACnB,CAAC,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA;AAAA,QACT,CAAC,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAC,CAAA;AAAA,QACb,CAAC,CAAA,EAAG,CAAA,GAAI,CAAC,CAAA;AAAA,QACT,CAAC,GAAG,CAAC;AAAA,OACP,CACG,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,KAAK,GAAG,CAAC,CAAA,CACtB,IAAA,CAAK,GAAG,CAAA;AACX,MAAA,OAAO,QAAQ,EAAE,MAAA,EAAQ,GAAA,EAAK,GAAG,aAAa,CAAA;AAAA,IAChD;AAAA,IACA,KAAK,aAAA;AACH,MAAA,OAAO,IAAA,CAAK;AAAA,QACV,CAAA;AAAA,QACA,CAAA;AAAA,QACA,OAAO,EAAA,CAAG,KAAA;AAAA,QACV,QAAQ,EAAA,CAAG,MAAA;AAAA,QACX,GAAG,WAAA;AAAA,QACH,GAAG;AAAA,OACJ,CAAA;AAAA,IACH,KAAK,MAAA;AACH,MAAA,OAAO,IAAA,CAAK;AAAA,QACV,CAAA;AAAA,QACA,CAAA;AAAA,QACA,OAAO,EAAA,CAAG,KAAA;AAAA,QACV,QAAQ,EAAA,CAAG,MAAA;AAAA,QACX,EAAA,EAAI,CAAA;AAAA,QACJ,EAAA,EAAI,CAAA;AAAA,QACJ,GAAG,WAAA;AAAA,QACH,GAAG;AAAA,OACJ,CAAA;AAAA,IACH,KAAK,aAAA;AACH,MAAA,OAAO,IAAA,CAAK;AAAA,QACV,CAAA;AAAA,QACA,CAAA;AAAA,QACA,OAAO,EAAA,CAAG,KAAA;AAAA,QACV,QAAQ,EAAA,CAAG,MAAA;AAAA,QACX,EAAA,EAAI,CAAA;AAAA,QACJ,EAAA,EAAI,CAAA;AAAA,QACJ,GAAG,WAAA;AAAA,QACH,GAAG,QAAA;AAAA,QACH,GAAG;AAAA,OACJ,CAAA;AAAA;AAEP;AAEA,SAAS,YAAY,EAAA,EAA0C;AAC7D,EAAA,MAAM,CAAA,GAAI,GAAG,IAAA,CAAK,YAAA;AAClB,EAAA,IAAI,CAAC,GAAG,OAAO,MAAA;AACf,EAAA,MAAM,EAAA,GAAK,CAAA,CAAE,MAAA,IAAU,CAAA,GAAI,EAAA,GAAK,EAAA;AAChC,EAAA,MAAM,EAAA,GAAK,EAAA;AAEX,EAAA,MAAM,EAAA,GAAK,EAAA,CAAG,KAAA,GAAQ,CAAA,GAAI,EAAA,GAAK,CAAA;AAC/B,EAAA,MAAM,EAAA,GAAK,CAAC,EAAA,CAAG,MAAA,GAAS,CAAA,GAAI,CAAA;AAC5B,EAAA,OAAO,KAAA,CAAM,EAAC,EAAG;AAAA,IACf,IAAA,CAAK,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA,EAAI,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,EAAA,EAAI,EAAA,EAAI,CAAA,EAAG,KAAA,EAAO,sBAAsB,CAAA;AAAA,IAChF,IAAA;AAAA,MACE,EAAE,CAAA,EAAG,EAAA,GAAK,EAAA,GAAK,CAAA,EAAG,GAAG,EAAA,GAAK,EAAA,GAAK,CAAA,EAAG,KAAA,EAAO,sBAAA,EAAuB;AAAA,MAChE;AAAA;AACF,GACD,CAAA;AACH;AAEA,SAAS,eAAA,CAAgB,IAAsB,CAAA,EAAkC;AAC/E,EAAA,MAAM,IAAI,EAAA,CAAG,IAAA;AACb,EAAA,IAAI,CAAC,CAAA,CAAE,MAAA,IAAU,CAAA,CAAE,MAAA,KAAW,UAAU,OAAO,MAAA;AAC/C,EAAA,MAAM,GAAA,GAAwD;AAAA,IAC5D,KAAK,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,EAAE,QAAA,EAAS;AAAA,IACvC,YAAY,EAAE,KAAA,EAAO,YAAA,EAAc,KAAA,EAAO,EAAE,QAAA,EAAS;AAAA,IACrD,UAAU,EAAE,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,EAAE,IAAA;AAAK,GAC/C;AACA,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,CAAA,CAAE,MAAM,CAAA;AACzB,EAAA,IAAI,CAAC,MAAM,OAAO,MAAA;AAClB,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,CAAA;AAClC,EAAA,MAAM,CAAA,GAAI,EAAA;AACV,EAAA,MAAM,CAAA,GAAI,CAAC,EAAA,CAAG,KAAA,GAAQ,CAAA,GAAI,CAAA;AAC1B,EAAA,MAAM,CAAA,GAAI,CAAC,EAAA,CAAG,MAAA,GAAS,IAAI,CAAA,GAAI,CAAA;AAC/B,EAAA,OAAO,KAAA,CAAM,EAAC,EAAG;AAAA,IACf,IAAA,CAAK,EAAE,CAAA,EAAG,CAAA,EAAG,OAAO,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,EAAA,EAAI,GAAG,IAAA,EAAM,IAAA,CAAK,KAAA,EAAO,MAAA,EAAQ,QAAQ,CAAA;AAAA,IAC3E,IAAA;AAAA,MACE,EAAE,CAAA,EAAG,CAAA,GAAI,CAAA,GAAI,CAAA,EAAG,CAAA,EAAG,CAAA,GAAI,CAAA,GAAI,CAAA,EAAG,KAAA,EAAO,sBAAA,EAAwB,IAAA,EAAM,EAAE,EAAA,EAAG;AAAA,MACxE,IAAA,CAAK;AAAA;AACP,GACD,CAAA;AACH;AAEA,SAAS,iBAAiB,EAAA,EAAgC;AACxD,EAAA,MAAM,IAAI,EAAA,CAAG,IAAA;AACb,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,QAAA,GAAW,EAAE,UAAA,KAAe,YAAA;AAElC,EAAA,IAAI,QAAA,EAAU;AAEZ,IAAA,IAAI,CAAA,GAAI,EAAA,CAAG,MAAA,GAAS,CAAA,GAAI,EAAA;AACxB,IAAA,MAAA,CAAO,IAAA,CAAK,IAAA,CAAO,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,gBAAA,EAAiB,EAAG,CAAA,CAAE,IAAI,CAAC,CAAA;AAChE,IAAA,CAAA,IAAK,EAAA;AACL,IAAA,IAAI,EAAE,IAAA,EAAM;AACV,MAAA,MAAA,CAAO,IAAA,CAAK,IAAA,CAAO,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,gBAAA,EAAiB,EAAG,CAAA,CAAE,IAAI,CAAC,CAAA;AAChE,MAAA,CAAA,IAAK,EAAA;AAAA,IACP;AACA,IAAA,IAAI,EAAE,IAAA,EAAM;AACV,MAAA,MAAA,CAAO,IAAA,CAAK,IAAA,CAAO,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,gBAAA,EAAiB,EAAG,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,IAClE;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAIA,EAAA,MAAM,IAAA,GAAO,EAAA;AACb,EAAA,MAAA,CAAO,IAAA,CAAK,IAAA,CAAO,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,IAAA,EAAM,KAAA,EAAO,gBAAA,EAAiB,EAAG,CAAA,CAAE,IAAI,CAAC,CAAA;AACtE,EAAA,MAAA,CAAO,KAAK,IAAA,CAAO,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,IAAA,GAAO,EAAA,EAAI,KAAA,EAAO,gBAAA,IAAoB,UAAA,CAAW,CAAA,CAAE,UAAU,CAAA,IAAK,CAAA,CAAE,UAAU,CAAC,CAAA;AAG7G,EAAA,IAAI,MAAA,GAAS,EAAA,CAAG,MAAA,GAAS,CAAA,GAAI,EAAA;AAC7B,EAAA,IAAI,EAAE,IAAA,EAAM;AACV,IAAA,MAAA,CAAO,IAAA,CAAK,IAAA,CAAO,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,MAAA,EAAQ,KAAA,EAAO,gBAAA,EAAiB,EAAG,CAAA,CAAE,IAAI,CAAC,CAAA;AACxE,IAAA,MAAA,IAAU,EAAA;AAAA,EACZ;AACA,EAAA,IAAI,EAAE,IAAA,EAAM;AACV,IAAA,MAAA,CAAO,IAAA,CAAK,IAAA,CAAO,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,MAAA,EAAQ,KAAA,EAAO,gBAAA,EAAiB,EAAG,CAAA,CAAE,IAAI,CAAC,CAAA;AACxE,IAAA,MAAA,IAAU,EAAA;AAAA,EACZ;AACA,EAAA,IAAI,EAAE,aAAA,EAAe;AACnB,IAAA,MAAA,CAAO,IAAA;AAAA,MACL,IAAA,CAAO,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,MAAA,EAAQ,KAAA,EAAO,gBAAA,EAAiB,EAAG,CAAA,KAAA,EAAQ,CAAA,CAAE,aAAa,CAAA,CAAE;AAAA,KAChF;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,UAAU,IAAA,EAA0B;AAC3C,EAAA,QAAQ,KAAK,EAAA;AAAI,IACf,KAAK,MAAA;AACH,MAAA,OAAO,qBAAA;AAAA,IACT,KAAK,SAAA;AACH,MAAA,OAAO,wBAAA;AAAA,IACT,KAAK,cAAA;AACH,MAAA,OAAO,6BAAA;AAAA,IACT,KAAK,QAAA;AACH,MAAA,OAAO,4BAAA;AAAA,IACT,KAAK,WAAA;AAAA,IACL;AAEE,MAAA,IAAI,KAAK,UAAA,IAAc,cAAA,CAAe,IAAA,CAAK,IAAA,CAAK,UAAU,CAAA,EAAG;AAC3D,QAAA,OAAO,4BAAA;AAAA,MACT;AACA,MAAA,OAAO,gBAAA;AAAA;AAEb;AAEA,SAAS,gBAAgB,EAAA,EAA0C;AACjE,EAAA,MAAM,IAAI,EAAA,CAAG,IAAA;AACb,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,IAAI,CAAA,CAAE,UAAA,EAAY,KAAA,CAAM,IAAA,CAAK,EAAE,UAAU,CAAA;AACzC,EAAA,IAAI,CAAA,CAAE,KAAA,EAAO,KAAA,CAAM,IAAA,CAAK,EAAE,KAAK,CAAA;AAC/B,EAAA,MAAM,QAAA,GAAW,CAAC,CAAC,CAAA,CAAE,UAAA;AACrB,EAAA,IAAI,CAAC,KAAA,CAAM,MAAA,IAAU,CAAC,UAAU,OAAO,MAAA;AAEvC,EAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AACpB,EAAA,MAAM,GAAA,GAAM,MAAM,CAAC,CAAA;AACnB,EAAA,MAAM,UAAA,GAAa,QAAA,GAAW,CAAA,CAAE,UAAA,GAAa,MAAA;AAG7C,EAAA,MAAM,UAAU,IAAA,CAAK,GAAA;AAAA,IACnB,IAAA,GAAO,KAAK,MAAA,GAAS,CAAA;AAAA,IACrB,GAAA,GAAM,IAAI,MAAA,GAAS,CAAA;AAAA,IACnB,UAAA,GAAa,WAAW,MAAA,GAAS;AAAA,GACnC;AACA,EAAA,MAAM,IAAI,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,OAAA,GAAU,IAAI,EAAE,CAAA;AACvC,EAAA,MAAM,IAAA,GAAA,CAAQ,OAAO,CAAA,GAAI,CAAA,KAAM,MAAM,CAAA,GAAI,CAAA,CAAA,IAAM,aAAa,CAAA,GAAI,CAAA,CAAA;AAChE,EAAA,MAAM,CAAA,GAAI,IAAI,IAAA,GAAO,EAAA;AACrB,EAAA,MAAM,CAAA,GAAI,EAAA,CAAG,MAAA,GAAS,CAAA,GAAI,CAAA;AAC1B,EAAA,MAAM,CAAA,GAAI,EAAA,CAAG,MAAA,GAAS,CAAA,GAAI,CAAA;AAC1B,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,EAAE,CAAA,EAAG,GAAG,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,KAAA,EAAO,oBAAA,EAAsB,CAAC,CAAA;AACnF,EAAA,IAAI,KAAK,CAAA,GAAI,EAAA;AACb,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,MAAA,CAAO,IAAA,CAAK,IAAA,CAAO,EAAE,CAAA,EAAG,EAAA,CAAG,MAAA,EAAQ,CAAA,EAAG,EAAA,EAAI,KAAA,EAAO,iBAAA,EAAkB,EAAG,IAAI,CAAC,CAAA;AAC3E,IAAA,EAAA,IAAM,EAAA;AAAA,EACR;AACA,EAAA,IAAI,GAAA,EAAK;AACP,IAAA,MAAA,CAAO,IAAA,CAAK,IAAA,CAAO,EAAE,CAAA,EAAG,EAAA,CAAG,MAAA,EAAQ,CAAA,EAAG,EAAA,EAAI,KAAA,EAAO,qBAAA,EAAsB,EAAG,GAAG,CAAC,CAAA;AAC9E,IAAA,EAAA,IAAM,EAAA;AAAA,EACR;AACA,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,MAAA,CAAO,IAAA,CAAK,IAAA,CAAO,EAAE,CAAA,EAAG,EAAA,CAAG,MAAA,EAAQ,CAAA,EAAG,EAAA,EAAI,KAAA,EAAO,qBAAA,EAAsB,EAAG,UAAU,CAAC,CAAA;AAAA,EACvF;AACA,EAAA,OAAO,KAAA,CAAM,EAAC,EAAG,MAAM,CAAA;AACzB;AAEO,SAAS,YAAA,CAAa,KAAgB,MAAA,EAA+B;AAC1E,EAAA,MAAM,MAAA,GAAS,aAAa,GAAG,CAAA;AAC/B,EAAA,MAAM,CAAA,GAAI,gBAAA,CAAiB,MAAA,EAAQ,KAAA,IAAS,SAAS,CAAA;AACrD,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,CAAK,KAAA,CAAQ,GAAA,CAAI,KAAA,IAAS,0BAA0B,CAAC,CAAA;AAC9D,EAAA,QAAA,CAAS,IAAA;AAAA,IACP,IAAA;AAAA,MACE,iCAAiC,GAAA,CAAI,QAAA,CAAS,MAAM,CAAA,cAAA,EAAiB,GAAA,CAAI,MAAM,MAAM,CAAA,cAAA;AAAA;AACvF,GACF;AACA,EAAA,QAAA,CAAS,IAAA,CAAK,GAAG,OAAA,EAAS,IAAI,QAAA,CAAS,CAAC,CAAC,CAAC,CAAA;AAG1C,EAAA,QAAA,CAAS,IAAA;AAAA,IACP,IAAA,CAAK;AAAA,MACH,WAAA,CAAY,iBAAA,EAAmB,CAAA,CAAE,MAAM,CAAA;AAAA,MACvC,YAAY,wBAAA,EAA0B,CAAA,CAAE,QAAQ,CAAC,CAAA,IAAK,EAAE,MAAM,CAAA;AAAA,MAC9D,WAAA,CAAY,uBAAA,EAAyB,CAAA,CAAE,QAAQ,CAAA;AAAA,MAC/C,WAAA,CAAY,sBAAA,EAAwB,CAAA,CAAE,OAAO,CAAA;AAAA,MAC7C,WAAA,CAAY,sBAAA,EAAwB,CAAA,CAAE,MAAM;AAAA,KAC7C;AAAA,GACH;AAEA,EAAA,IAAI,IAAI,KAAA,EAAO;AACb,IAAA,QAAA,CAAS,IAAA,CAAK,IAAA,CAAO,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,KAAA,EAAO,iBAAA,EAAkB,EAAG,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA,EAC7E;AAEA,EAAA,MAAM,QAAkB,EAAC;AAGzB,EAAA,KAAA,MAAW,CAAA,IAAK,OAAO,QAAA,EAAU;AAC/B,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,KAAA,IAAS,CAAA,CAAE,OAAA;AAC3B,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,IAAA,CAAK;AAAA,QACH,GAAG,CAAA,CAAE,CAAA;AAAA,QACL,GAAG,CAAA,CAAE,CAAA;AAAA,QACL,OAAO,CAAA,CAAE,KAAA;AAAA,QACT,QAAQ,CAAA,CAAE,MAAA;AAAA,QACV,EAAA,EAAI,CAAA;AAAA,QACJ,MAAA,EAAQ,KAAA;AAAA,QACR,KAAA,EAAO;AAAA,OACR;AAAA,KACH;AACA,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,IAAA;AAAA,QACE,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,EAAA,EAAI,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,EAAA,EAAI,KAAA,EAAO,yBAAA,EAA2B,IAAA,EAAM,KAAA,EAAM;AAAA,QAC1E,CAAA,CAAE;AAAA;AACJ,KACF;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,EAAA,IAAM,OAAO,KAAA,EAAO;AAC7B,IAAA,MAAM,GAAA,GAAM,SAAA,CAAU,EAAA,CAAG,IAAI,CAAA;AAC7B,IAAA,MAAM,QAAA,GAAW,UAAA,CAAW,EAAA,CAAG,IAAA,EAAM,GAAG,CAAA;AACxC,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,IAAA,CAAO;AAAA,QACL,GAAG,EAAA,CAAG,IAAA;AAAA,QACN,KAAA,EAAO,GAAA;AAAA,QACP,YAAA,EAAc,QAAQ,QAAQ,CAAA,CAAA;AAAA,OAC/B;AAAA,KACH;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,EAAA,IAAM,OAAO,KAAA,EAAO;AAC7B,IAAA,MAAM,KAAA,GAAQ,gBAAgB,EAAE,CAAA;AAChC,IAAA,IAAI,KAAA,EAAO,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA;AAAA,EAC7B;AAGA,EAAA,KAAA,MAAW,EAAA,IAAM,OAAO,KAAA,EAAO;AAC7B,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,KAAA,CAAM,IAAA,CAAK,WAAA,CAAY,EAAA,EAAI,CAAC,CAAC,CAAA;AAC7B,IAAA,MAAM,KAAA,GAAQ,YAAY,EAAE,CAAA;AAC5B,IAAA,IAAI,KAAA,EAAO,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA;AAC3B,IAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,EAAA,EAAI,CAAC,CAAA;AACpC,IAAA,IAAI,MAAA,EAAQ,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA;AAC7B,IAAA,KAAA,MAAW,KAAK,gBAAA,CAAiB,EAAE,CAAA,EAAG,KAAA,CAAM,KAAK,CAAC,CAAA;AAClD,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,KAAA;AAAA,QACE;AAAA,UACE,WAAW,CAAA,UAAA,EAAa,EAAA,CAAG,CAAC,CAAA,EAAA,EAAK,GAAG,CAAC,CAAA,CAAA,CAAA;AAAA,UACrC,gBAAA,EAAkB,GAAG,IAAA,CAAK,EAAA;AAAA,UAC1B,kBAAA,EAAoB,GAAG,IAAA,CAAK,UAAA;AAAA,UAC5B,mBAAA,EAAqB,EAAA,CAAG,IAAA,CAAK,YAAA,IAAgB;AAAA,SAC/C;AAAA,QACA;AAAA;AACF,KACF;AAAA,EACF;AAEA,EAAA,MAAM,IAAA,GAAO,MAAM,EAAE,SAAA,EAAW,gBAAgB,WAAW,CAAA,CAAA,CAAA,IAAO,KAAK,CAAA;AACvE,EAAA,QAAA,CAAS,KAAK,IAAI,CAAA;AAElB,EAAA,OAAO,OAAA;AAAA,IACL;AAAA,MACE,KAAA,EAAO,WAAA;AAAA,MACP,IAAA,EAAM,KAAA;AAAA,MACN,YAAA,EAAc,SAAA,CAAU,GAAA,CAAI,KAAA,IAAS,0BAA0B,CAAA;AAAA,MAC/D,KAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAA,EAAS,CAAA,IAAA,EAAO,KAAK,CAAA,CAAA,EAAI,MAAM,CAAA;AAAA,KACjC;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,WAAA,CAAY,IAAY,KAAA,EAAuB;AACtD,EAAA,OAAO,EAAA;AAAA,IACL,QAAA;AAAA,IACA;AAAA,MACE,EAAA;AAAA,MACA,WAAA,EAAa,CAAA;AAAA,MACb,YAAA,EAAc,CAAA;AAAA,MACd,IAAA,EAAM,CAAA;AAAA,MACN,IAAA,EAAM,CAAA;AAAA,MACN,MAAA,EAAQ,MAAA;AAAA,MACR,WAAA,EAAa;AAAA,KACf;AAAA,IACA,CAAC,GAAG,MAAA,EAAQ,EAAE,GAAG,qBAAA,EAAuB,IAAA,EAAM,KAAA,EAAO,CAAC;AAAA,GACxD;AACF;AAEA,SAAS,UAAA,CAAW,OAAmB,GAAA,EAAqB;AAC1D,EAAA,IAAI,GAAA,KAAQ,0BAA0B,OAAO,wBAAA;AAC7C,EAAA,IAAI,GAAA,KAAQ,+BAA+B,OAAO,uBAAA;AAClD,EAAA,IAAI,GAAA,KAAQ,uBAAuB,OAAO,sBAAA;AAC1C,EAAA,IAAI,GAAA,KAAQ,8BAA8B,OAAO,sBAAA;AACjD,EAAA,OAAO,iBAAA;AACT;;;ACzeO,IAAM,MAAA,GAAwB;AAAA,EACnC,IAAA,EAAM,QAAA;AAAA,EACN,OAAOH,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,kBAAkB,CAAA;AAAA,EAC5C,CAAA;AAAA,EACA,KAAA,EAAO,cAAA;AAAA,EAEP,MAAA,CAAOA,OAAc,MAAA,EAAgB;AACnC,IAAA,MAAM,GAAA,GAAM,eAAeA,KAAI,CAAA;AAC/B,IAAA,OAAO,YAAA,CAAa,KAAK,MAAM,CAAA;AAAA,EACjC;AACF","file":"chunk-XV2DTN6G.js","sourcesContent":["import type {\n EntityAST,\n EntityNode,\n EntityType,\n EntityEdge,\n EntityEdgeOp,\n JurisdictionDef,\n ClusterDef,\n} from \"../../core/types\";\n\nexport class EntityParseError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"EntityParseError\";\n }\n}\n\nconst ENTITY_TYPE_ALIAS: Record<string, EntityType> = {\n corp: \"corp\",\n corporation: \"corp\",\n inc: \"corp\",\n llc: \"llc\",\n llp: \"llc\",\n gmbh: \"llc\",\n bv: \"llc\",\n lp: \"lp\",\n lllp: \"lp\",\n fund: \"lp\",\n trust: \"trust\",\n individual: \"individual\",\n person: \"individual\",\n foundation: \"foundation\",\n npo: \"foundation\",\n disregarded: \"disregarded\",\n branch: \"disregarded\",\n pool: \"pool\",\n placeholder: \"placeholder\",\n tbf: \"placeholder\",\n};\n\nfunction stripComment(s: string): string {\n let out = \"\";\n let inQuote = false;\n for (const ch of s) {\n if (ch === '\"') inQuote = !inQuote;\n if (ch === \"#\" && !inQuote) break;\n out += ch;\n }\n return out;\n}\n\nfunction stripQuotes(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/** Split by top-level commas (respecting quotes and bracket nesting) */\nfunction splitTopLevelCommas(inside: string): string[] {\n const parts: string[] = [];\n let cur = \"\";\n let inQuote = false;\n let depth = 0;\n for (const ch of inside) {\n if (ch === '\"') inQuote = !inQuote;\n if (!inQuote) {\n if (ch === \"[\") depth++;\n else if (ch === \"]\") depth--;\n }\n if (ch === \",\" && !inQuote && depth === 0) {\n parts.push(cur);\n cur = \"\";\n } else {\n cur += ch;\n }\n }\n if (cur.trim()) parts.push(cur);\n return parts;\n}\n\nfunction parseProps(inside: string): Record<string, string> {\n const out: Record<string, string> = {};\n for (const p of splitTopLevelCommas(inside)) {\n const s = p.trim();\n if (!s) continue;\n const colon = s.indexOf(\":\");\n if (colon < 0) throw new EntityParseError(`Invalid property \"${s}\" (missing \":\")`);\n const k = s.slice(0, colon).trim().toLowerCase();\n const v = s.slice(colon + 1).trim();\n out[k] = v;\n }\n return out;\n}\n\nfunction parseIdList(v: string): string[] {\n const t = v.trim();\n const inner = t.startsWith(\"[\") && t.endsWith(\"]\") ? t.slice(1, -1) : t;\n return inner\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n}\n\n/** Join lines so that a bracketed attribute block spans a single logical line. */\nfunction joinBrackets(lines: string[]): string[] {\n const out: string[] = [];\n let buf = \"\";\n let depth = 0;\n for (const raw of lines) {\n const line = stripComment(raw);\n if (!line.trim() && depth === 0) {\n if (buf) {\n out.push(buf);\n buf = \"\";\n }\n out.push(\"\");\n continue;\n }\n for (const ch of line) {\n if (ch === \"[\") depth++;\n else if (ch === \"]\") depth = Math.max(0, depth - 1);\n }\n buf = buf ? buf + \" \" + line.trim() : line;\n if (depth === 0) {\n out.push(buf);\n buf = \"\";\n }\n }\n if (buf) out.push(buf);\n return out;\n}\n\nconst EDGE_OPS: Array<{ token: string; op: EntityEdgeOp }> = [\n // Order matters: longer tokens first\n { token: \"==>\", op: \"voting\" },\n { token: \"-.->\", op: \"pool\" },\n { token: \"-~->\", op: \"license\" },\n { token: \"-->\", op: \"distribution\" },\n { token: \"->\", op: \"ownership\" },\n];\n\nfunction matchEdgeOp(line: string): { op: EntityEdgeOp; idx: number; len: number } | null {\n for (const { token, op } of EDGE_OPS) {\n // Find an instance flanked by non-alphanum (so \"->\" inside quoted label is skipped later)\n const idx = findEdgeToken(line, token);\n if (idx >= 0) return { op, idx, len: token.length };\n }\n return null;\n}\n\nfunction findEdgeToken(line: string, token: string): number {\n let inQuote = false;\n let depth = 0;\n for (let i = 0; i < line.length; i++) {\n const ch = line[i];\n if (ch === '\"') inQuote = !inQuote;\n if (!inQuote) {\n if (ch === \"[\") depth++;\n else if (ch === \"]\") depth = Math.max(0, depth - 1);\n }\n if (!inQuote && depth === 0 && line.startsWith(token, i)) {\n return i;\n }\n }\n return -1;\n}\n\nexport function parseEntityDSL(text: string): EntityAST {\n const rawLines = text.split(\"\\n\").map((l) => l.replace(/\\r$/, \"\"));\n const lines = joinBrackets(rawLines);\n\n let title: string | undefined;\n const entities: EntityNode[] = [];\n const entityMap = new Map<string, EntityNode>();\n const edges: EntityEdge[] = [];\n const jurisdictions: JurisdictionDef[] = [];\n const jurisdictionMap = new Map<string, JurisdictionDef>();\n const clusters: ClusterDef[] = [];\n\n let clusterCounter = 0;\n\n for (const raw of lines) {\n const line = raw.trim();\n if (!line) continue;\n\n // Header: entity-structure \"title\" or entity-structure: \"title\"\n if (/^entity-structure\\b/i.test(line)) {\n const m = line.match(/\"([^\"]*)\"/);\n if (m) title = m[1];\n continue;\n }\n\n // jurisdiction CODE \"name\" [color: \"...\"]\n const jurMatch = line.match(\n /^jurisdiction\\s+([A-Za-z]{2,3})\\s+\"([^\"]*)\"(?:\\s*\\[([^\\]]*)\\])?\\s*$/i\n );\n if (jurMatch) {\n const code = jurMatch[1].toUpperCase();\n const name = jurMatch[2];\n const props = jurMatch[3] ? parseProps(jurMatch[3]) : {};\n const def: JurisdictionDef = { code, name };\n if (props.color) def.color = stripQuotes(props.color);\n jurisdictions.push(def);\n jurisdictionMap.set(code, def);\n continue;\n }\n\n // cluster \"name\" [members: [ids], color: \"...\"]\n const clusterMatch = line.match(/^cluster\\s+\"([^\"]*)\"(?:\\s*\\[([^\\]]*)\\])?\\s*$/i);\n if (clusterMatch) {\n const label = clusterMatch[1];\n const props = clusterMatch[2] ? parseProps(clusterMatch[2]) : {};\n const def: ClusterDef = {\n id: `cluster-${++clusterCounter}`,\n label,\n members: props.members ? parseIdList(props.members) : [],\n };\n if (props.color) def.color = stripQuotes(props.color);\n clusters.push(def);\n continue;\n }\n\n // entity id \"Name\" type[@jurisdiction] [props]\n const entityMatch = line.match(\n /^entity\\s+([A-Za-z][A-Za-z0-9_-]*)\\s+\"([^\"]*)\"\\s+([a-zA-Z]+)(?:@([A-Za-z]{2,3}))?(?:\\s*\\[([^\\]]*)\\])?\\s*$/\n );\n if (entityMatch) {\n const id = entityMatch[1];\n const name = entityMatch[2];\n const typeStr = entityMatch[3].toLowerCase();\n const jurisdictionCode = entityMatch[4]?.toUpperCase();\n const propsStr = entityMatch[5];\n const entityType = ENTITY_TYPE_ALIAS[typeStr];\n if (!entityType) {\n throw new EntityParseError(`Unknown entity type \"${typeStr}\" for \"${id}\"`);\n }\n if (entityMap.has(id)) {\n throw new EntityParseError(`Duplicate entity id \"${id}\"`);\n }\n const node: EntityNode = { id, name, entityType };\n if (jurisdictionCode) node.jurisdiction = jurisdictionCode;\n if (propsStr) {\n const props = parseProps(propsStr);\n if (props.status) node.status = stripQuotes(props.status) as EntityNode[\"status\"];\n if (props.tax) node.taxClass = stripQuotes(props.tax);\n if (props.role) node.role = stripQuotes(props.role);\n if (props.note) node.note = stripQuotes(props.note);\n if (props.est) node.formationDate = stripQuotes(props.est);\n // Any other keys → properties\n const reserved = new Set([\"status\", \"tax\", \"role\", \"note\", \"est\"]);\n const extras: Record<string, string> = {};\n for (const k of Object.keys(props)) {\n if (!reserved.has(k)) extras[k] = stripQuotes(props[k]);\n }\n if (Object.keys(extras).length) node.properties = extras;\n }\n entities.push(node);\n entityMap.set(id, node);\n continue;\n }\n\n // edge: from <op> to [ : percentage ] [props]\n const edgeInfo = matchEdgeOp(line);\n if (edgeInfo) {\n const left = line.slice(0, edgeInfo.idx).trim();\n const rest = line.slice(edgeInfo.idx + edgeInfo.len).trim();\n if (!/^[A-Za-z][A-Za-z0-9_-]*$/.test(left)) {\n throw new EntityParseError(`Invalid edge source on line: ${line}`);\n }\n // rest: \"target [: pct] [props]\" OR \"target [props]\"\n const restMatch = rest.match(\n /^([A-Za-z][A-Za-z0-9_-]*)(?:\\s*:\\s*([^[]+?))?(?:\\s*\\[([^\\]]*)\\])?\\s*$/\n );\n if (!restMatch) {\n throw new EntityParseError(`Cannot parse edge: ${line}`);\n }\n const to = restMatch[1];\n const pct = restMatch[2]?.trim();\n const propsStr = restMatch[3];\n const edge: EntityEdge = { from: left, to, op: edgeInfo.op };\n if (pct) edge.percentage = pct;\n if (propsStr) {\n const props = parseProps(propsStr);\n if (props.class) edge.shareClass = stripQuotes(props.class);\n if (props.label) edge.label = stripQuotes(props.label);\n }\n edges.push(edge);\n continue;\n }\n\n throw new EntityParseError(`Cannot parse line: ${line}`);\n }\n\n // Validate edges reference known entities\n for (const e of edges) {\n if (!entityMap.has(e.from)) {\n throw new EntityParseError(`Edge references unknown entity \"${e.from}\"`);\n }\n if (!entityMap.has(e.to)) {\n throw new EntityParseError(`Edge references unknown entity \"${e.to}\"`);\n }\n }\n\n if (entities.length === 0) {\n throw new EntityParseError(\"Entity structure diagram has no entities\");\n }\n\n return {\n type: \"entity\",\n title,\n entities,\n edges,\n jurisdictions,\n clusters,\n };\n}\n","import type { EntityAST, EntityNode, EntityEdge, EntityType } from \"../../core/types\";\n\n/**\n * Tier-based top-down layout for entity structure diagrams.\n *\n * - Tier assigned via longest-path from sources (relaxation)\n * - Within-tier x placed by DFS declaration order\n * - Non-bus parents re-centered over children bottom-up\n * - Edges routed orthogonally (down → across → down)\n */\n\nexport interface EntityLayoutNode {\n node: EntityNode;\n x: number; // center x\n y: number; // center y\n tier: number;\n width: number;\n height: number;\n /** Top-center anchor for edge end */\n topY: number;\n bottomY: number;\n}\n\nexport interface EntityLayoutEdge {\n edge: EntityEdge;\n path: string;\n /** Label anchor (horizontal mid of the branch segment) */\n labelX: number;\n labelY: number;\n}\n\nexport interface EntityLayoutCluster {\n id: string;\n label: string;\n color?: string;\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface EntityLayoutResult {\n width: number;\n height: number;\n nodes: EntityLayoutNode[];\n nodeById: Map<string, EntityLayoutNode>;\n edges: EntityLayoutEdge[];\n clusters: EntityLayoutCluster[];\n}\n\nconst TIER_GAP = 170;\nconst H_GAP = 70;\nconst PADDING = 40;\nconst CLUSTER_PADDING = 26;\nconst CLUSTER_V_GAP = 16;\n\nexport function geometryFor(type: EntityType): { width: number; height: number } {\n switch (type) {\n case \"trust\":\n return { width: 200, height: 80 }; // ellipse bbox\n case \"individual\":\n return { width: 80, height: 80 }; // circle bbox; label rendered below\n case \"foundation\":\n return { width: 150, height: 80 };\n case \"pool\":\n case \"disregarded\":\n case \"placeholder\":\n case \"corp\":\n case \"llc\":\n case \"lp\":\n default:\n return { width: 170, height: 62 };\n }\n}\n\nfunction computeTiers(ast: EntityAST): Map<string, number> {\n const inEdges = new Map<string, EntityEdge[]>();\n const outEdges = new Map<string, EntityEdge[]>();\n for (const n of ast.entities) {\n inEdges.set(n.id, []);\n outEdges.set(n.id, []);\n }\n for (const e of ast.edges) {\n inEdges.get(e.to)?.push(e);\n outEdges.get(e.from)?.push(e);\n }\n\n // Only ownership-style edges define hierarchy. Lateral relationships\n // (license, distribution, management) should NOT force descendants.\n const isHierarchy = (e: EntityEdge): boolean =>\n e.op === \"ownership\" || e.op === \"voting\" || e.op === \"pool\";\n\n const tiers = new Map<string, number>();\n // Seed: entities with no hierarchical in-edges → tier 0\n for (const n of ast.entities) {\n const hierIn = (inEdges.get(n.id) ?? []).filter(isHierarchy);\n if (hierIn.length === 0) tiers.set(n.id, 0);\n }\n\n const maxIter = ast.entities.length + 4;\n for (let iter = 0; iter < maxIter; iter++) {\n let changed = false;\n for (const e of ast.edges) {\n if (!isHierarchy(e)) continue;\n const fromT = tiers.get(e.from);\n if (fromT === undefined) continue;\n const want = fromT + 1;\n const cur = tiers.get(e.to);\n if (cur === undefined || want > cur) {\n tiers.set(e.to, want);\n changed = true;\n }\n }\n if (!changed) break;\n }\n\n // Non-hierarchical targets: place at same tier as source if not already set\n for (const e of ast.edges) {\n if (isHierarchy(e)) continue;\n if (!tiers.has(e.to)) {\n const src = tiers.get(e.from);\n if (src !== undefined) tiers.set(e.to, src);\n }\n if (!tiers.has(e.from)) {\n const dst = tiers.get(e.to);\n if (dst !== undefined) tiers.set(e.from, dst);\n }\n }\n // Any orphans → tier 0\n for (const n of ast.entities) {\n if (!tiers.has(n.id)) tiers.set(n.id, 0);\n }\n return tiers;\n}\n\nexport function layoutEntity(ast: EntityAST): EntityLayoutResult {\n const tiers = computeTiers(ast);\n const maxTier = Math.max(0, ...Array.from(tiers.values()));\n\n // Group by tier, order by declaration\n const byTier = new Map<number, EntityNode[]>();\n for (const n of ast.entities) {\n const t = tiers.get(n.id) ?? 0;\n if (!byTier.has(t)) byTier.set(t, []);\n byTier.get(t)!.push(n);\n }\n\n // Build layout nodes\n const layoutNodes: EntityLayoutNode[] = [];\n const byId = new Map<string, EntityLayoutNode>();\n for (const n of ast.entities) {\n const g = geometryFor(n.entityType);\n const t = tiers.get(n.id) ?? 0;\n const ln: EntityLayoutNode = {\n node: n,\n x: 0,\n y: PADDING + t * TIER_GAP + g.height / 2,\n tier: t,\n width: g.width,\n height: g.height,\n topY: 0,\n bottomY: 0,\n };\n ln.topY = ln.y - g.height / 2;\n ln.bottomY = ln.y + g.height / 2;\n layoutNodes.push(ln);\n byId.set(n.id, ln);\n }\n\n // Assign sequential X per tier (declaration order)\n for (let t = 0; t <= maxTier; t++) {\n const nodes = byTier.get(t) ?? [];\n let cx = PADDING;\n for (const n of nodes) {\n const ln = byId.get(n.id)!;\n cx += ln.width / 2;\n ln.x = cx;\n cx += ln.width / 2 + H_GAP;\n }\n }\n\n // Parent/child maps for hierarchy only\n const children = new Map<string, string[]>();\n const parents = new Map<string, string[]>();\n for (const n of ast.entities) {\n children.set(n.id, []);\n parents.set(n.id, []);\n }\n for (const e of ast.edges) {\n if (e.op === \"ownership\" || e.op === \"voting\" || e.op === \"pool\") {\n children.get(e.from)?.push(e.to);\n parents.get(e.to)?.push(e.from);\n }\n }\n\n // Center parents over their children bottom-up\n for (let iter = 0; iter < 4; iter++) {\n for (let t = maxTier - 1; t >= 0; t--) {\n const tierNodes = byTier.get(t) ?? [];\n for (const n of tierNodes) {\n const ln = byId.get(n.id)!;\n const childIds = children.get(n.id) ?? [];\n if (childIds.length === 0) continue;\n if (childIds.length === 1) {\n // Cap-table convergence: if the only child has multiple same-tier parents,\n // spread parents around the child's x rather than collapsing them.\n const child = byId.get(childIds[0]);\n if (!child) continue;\n const siblingParents = (parents.get(child.node.id) ?? [])\n .map((pid) => byId.get(pid))\n .filter((p): p is EntityLayoutNode => !!p && p.tier === t);\n if (siblingParents.length > 1) {\n siblingParents.sort(\n (a, b) =>\n (byTier.get(t) ?? []).indexOf(a.node) -\n (byTier.get(t) ?? []).indexOf(b.node)\n );\n const totalWidth = siblingParents.reduce(\n (sum, p) => sum + effectiveHalfWidth(p) * 2,\n 0\n );\n const spread = Math.max(\n H_GAP + (effectiveHalfWidth(ln) + effectiveHalfWidth(siblingParents[0])) / 1,\n totalWidth / Math.max(1, siblingParents.length - 1)\n );\n const idx = siblingParents.indexOf(ln);\n const n2 = siblingParents.length;\n ln.x = child.x + (idx - (n2 - 1) / 2) * spread;\n } else {\n ln.x = child.x;\n }\n continue;\n }\n const xs = childIds\n .map((c) => byId.get(c)?.x)\n .filter((v): v is number => v !== undefined);\n if (xs.length > 0) {\n ln.x = (Math.min(...xs) + Math.max(...xs)) / 2;\n }\n }\n }\n\n // Center child over multiple parents (cap table convergence)\n for (let t = 1; t <= maxTier; t++) {\n const tierNodes = byTier.get(t) ?? [];\n for (const n of tierNodes) {\n const ln = byId.get(n.id)!;\n const parentIds = parents.get(n.id) ?? [];\n if (parentIds.length < 2) continue;\n const xs = parentIds\n .map((p) => byId.get(p)?.x)\n .filter((v): v is number => v !== undefined);\n if (xs.length > 0) {\n ln.x = (Math.min(...xs) + Math.max(...xs)) / 2;\n }\n }\n }\n\n // Resolve within-tier overlaps (preserve declaration order, label-aware)\n for (let t = 0; t <= maxTier; t++) {\n const tierNodes = (byTier.get(t) ?? [])\n .map((n) => byId.get(n.id)!)\n .sort((a, b) => a.x - b.x);\n for (let i = 1; i < tierNodes.length; i++) {\n const prev = tierNodes[i - 1];\n const cur = tierNodes[i];\n const gap = effectiveHalfWidth(prev) + effectiveHalfWidth(cur) + H_GAP;\n if (cur.x - prev.x < gap) cur.x = prev.x + gap;\n }\n }\n }\n\n // Shift so leftmost content sits at PADDING\n let minLeft = Infinity;\n for (const ln of layoutNodes) {\n const left = ln.x - ln.width / 2;\n if (left < minLeft) minLeft = left;\n }\n const shift = PADDING - minLeft;\n if (Math.abs(shift) > 0.5) {\n for (const ln of layoutNodes) ln.x += shift;\n }\n\n // Build edges with orthogonal routing.\n //\n // Label placement strategy for hierarchical (down) edges:\n // - fan-in (child has >1 parents, e.g. cap-table): label on child-side\n // vertical stub, just above child.topY. Owner-share reads naturally\n // as \"X% of [child]\".\n // - fan-out (parent has >1 children, e.g. holdco → subs): label on\n // parent-side vertical stub, just below parent.bottomY.\n // - 1:1 straight drop: label offset to the side of the vertical line.\n // - otherwise (branching both sides): label at midpoint of parent stub.\n // This avoids stacking multiple labels on the shared horizontal bar.\n const edges: EntityLayoutEdge[] = [];\n for (const e of ast.edges) {\n const from = byId.get(e.from);\n const to = byId.get(e.to);\n if (!from || !to) continue;\n\n const sameTier = from.tier === to.tier;\n let path: string;\n let labelX: number;\n let labelY: number;\n\n if (sameTier) {\n const leftFirst = from.x < to.x;\n const sx = leftFirst ? from.x + from.width / 2 : from.x - from.width / 2;\n const ex = leftFirst ? to.x - to.width / 2 : to.x + to.width / 2;\n path = `M ${sx} ${from.y} L ${ex} ${to.y}`;\n labelX = (sx + ex) / 2;\n labelY = from.y - 6;\n } else {\n const sx = from.x;\n const sy = from.bottomY;\n const ex = to.x;\n const ey = to.topY;\n const straight = Math.abs(sx - ex) < 0.5;\n\n if (straight) {\n // No corners → midpoint of the vertical line.\n path = `M ${sx} ${sy} L ${ex} ${ey}`;\n labelX = sx;\n labelY = (sy + ey) / 2;\n } else {\n // L-path has two corners: (sx, midY) top and (ex, midY) bottom.\n // Each edge owns its corners uniquely, so placing the label at a\n // corner avoids stacking on the shared horizontal branch.\n const midY = (sy + ey) / 2;\n path = `M ${sx} ${sy} L ${sx} ${midY} L ${ex} ${midY} L ${ex} ${ey}`;\n\n const isHier =\n e.op === \"ownership\" || e.op === \"voting\" || e.op === \"pool\";\n const parentCount = isHier ? (parents.get(e.to) ?? []).length : 0;\n const fanIn = parentCount > 1;\n\n // fan-in (many parents → one child): top corner (parent side) is\n // unique per parent.\n // fan-out (one parent → many children): bottom corner (child side)\n // is unique per child.\n // 1:1 offset: bottom corner — reads naturally as \"X% of [child]\".\n if (fanIn) {\n labelX = sx;\n labelY = midY;\n } else {\n labelX = ex;\n labelY = midY;\n }\n }\n }\n\n edges.push({ edge: e, path, labelX, labelY });\n }\n\n // Build cluster rectangles (explicit members only, or auto by jurisdiction)\n const layoutClusters: EntityLayoutCluster[] = [];\n const usedIds = new Set<string>();\n\n const LABEL_ROW = 22;\n\n for (const c of ast.clusters) {\n const members = c.members\n .map((id) => byId.get(id))\n .filter((n): n is EntityLayoutNode => !!n);\n if (members.length === 0) continue;\n const bounds = boundingBox(members);\n layoutClusters.push({\n id: c.id,\n label: c.label,\n color: c.color,\n x: bounds.minX - CLUSTER_PADDING,\n y: bounds.minY - CLUSTER_PADDING - LABEL_ROW,\n width: bounds.maxX - bounds.minX + CLUSTER_PADDING * 2,\n height: bounds.maxY - bounds.minY + CLUSTER_PADDING * 2 + LABEL_ROW,\n });\n for (const m of members) usedIds.add(m.node.id);\n }\n\n // Auto-cluster by declared jurisdiction (only those not already in explicit cluster)\n for (const j of ast.jurisdictions) {\n const members = layoutNodes.filter(\n (n) => n.node.jurisdiction === j.code && !usedIds.has(n.node.id)\n );\n if (members.length === 0) continue;\n const bounds = boundingBox(members);\n layoutClusters.push({\n id: `jur-${j.code}`,\n label: j.name,\n color: j.color,\n x: bounds.minX - CLUSTER_PADDING,\n y: bounds.minY - CLUSTER_PADDING - LABEL_ROW,\n width: bounds.maxX - bounds.minX + CLUSTER_PADDING * 2,\n height: bounds.maxY - bounds.minY + CLUSTER_PADDING * 2 + LABEL_ROW,\n });\n for (const m of members) usedIds.add(m.node.id);\n }\n\n // Resolve cluster vertical overlaps on the same band — if two clusters at\n // different tiers overlap vertically, shrink the top one's bottom and push\n // the bottom one's top so their borders don't cross.\n for (let i = 0; i < layoutClusters.length; i++) {\n for (let k = i + 1; k < layoutClusters.length; k++) {\n const a = layoutClusters[i];\n const b = layoutClusters[k];\n const hOverlap = !(a.x + a.width < b.x || b.x + b.width < a.x);\n const vOverlap = !(a.y + a.height < b.y || b.y + b.height < a.y);\n if (!hOverlap || !vOverlap) continue;\n // Determine which is above\n const [top, bot] = a.y < b.y ? [a, b] : [b, a];\n const want = bot.y - CLUSTER_V_GAP;\n if (top.y + top.height > want) top.height = Math.max(20, want - top.y);\n }\n }\n\n // Compute canvas\n let maxX = 0;\n let maxY = 0;\n for (const ln of layoutNodes) {\n const right = ln.x + ln.width / 2;\n const bottom = ln.bottomY + 40; // space for role/note label\n if (right > maxX) maxX = right;\n if (bottom > maxY) maxY = bottom;\n }\n for (const c of layoutClusters) {\n if (c.x + c.width > maxX) maxX = c.x + c.width;\n if (c.y + c.height > maxY) maxY = c.y + c.height;\n }\n const width = Math.max(400, maxX + PADDING);\n const height = Math.max(200, maxY + PADDING);\n\n return {\n width,\n height,\n nodes: layoutNodes,\n nodeById: byId,\n edges,\n clusters: layoutClusters,\n };\n}\n\n/**\n * Effective half-width for collision resolution — includes the label text that\n * extends beyond the shape (especially individuals where name/role are rendered\n * BELOW the circle, wider than the circle itself).\n */\nfunction effectiveHalfWidth(ln: EntityLayoutNode): number {\n const n = ln.node;\n const shapeHalf = ln.width / 2;\n const textLen = (s?: string): number => (s ? s.length : 0);\n if (n.entityType === \"individual\") {\n const longest = Math.max(\n textLen(n.name),\n textLen(n.role),\n textLen(n.note)\n );\n const textHalf = (longest * 6.2) / 2 + 4;\n return Math.max(shapeHalf, textHalf);\n }\n // For non-individual, below-node note can also overflow the shape\n const longestBelow = Math.max(textLen(n.note), textLen(n.role));\n const textHalf = (longestBelow * 6) / 2 + 4;\n return Math.max(shapeHalf, textHalf);\n}\n\nfunction boundingBox(nodes: EntityLayoutNode[]): {\n minX: number;\n maxX: number;\n minY: number;\n maxY: number;\n} {\n let minX = Infinity;\n let maxX = -Infinity;\n let minY = Infinity;\n let maxY = -Infinity;\n for (const n of nodes) {\n minX = Math.min(minX, n.x - n.width / 2);\n maxX = Math.max(maxX, n.x + n.width / 2);\n minY = Math.min(minY, n.topY);\n maxY = Math.max(maxY, n.bottomY + 26); // include space for below-node labels\n }\n return { minX, maxX, minY, maxY };\n}\n","import type { EntityAST, EntityNode, EntityEdge } from \"../../core/types\";\nimport 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 defs,\n rect,\n circle,\n polygon,\n escapeXml,\n} from \"../../core/svg\";\nimport { resolveBaseTheme, type BaseTheme } from \"../../core/theme\";\nimport {\n layoutEntity,\n type EntityLayoutNode,\n type EntityLayoutEdge,\n} from \"./layout\";\n\nfunction buildCss(t: BaseTheme): string {\n return `\n.lt-entity { background: ${t.bg}; font-family: system-ui, -apple-system, sans-serif; }\n.lt-entity-title { font: bold 16px sans-serif; fill: ${t.text}; }\n.lt-entity-name { font: 600 12px sans-serif; fill: ${t.text}; text-anchor: middle; }\n.lt-entity-type { font: 500 10px sans-serif; fill: ${t.textMuted}; text-anchor: middle; }\n.lt-entity-role { font: italic 10px sans-serif; fill: ${t.textMuted}; text-anchor: middle; }\n.lt-entity-note { font: 10px sans-serif; fill: ${t.textMuted}; text-anchor: middle; }\n.lt-entity-badge-bg { fill: ${t.bg}; stroke: ${t.neutral}; stroke-width: 1; }\n.lt-entity-badge-text { font: 600 9px sans-serif; fill: ${t.text}; text-anchor: middle; letter-spacing: 0.5px; }\n.lt-entity-edge { stroke: ${t.stroke}; stroke-width: 1.5; fill: none; }\n.lt-entity-edge-voting { stroke: ${t.stroke}; stroke-width: 1.2; fill: none; }\n.lt-entity-edge-pool { stroke: ${t.neutral}; stroke-width: 1.5; fill: none; stroke-dasharray: 5,4; }\n.lt-entity-edge-license { stroke: ${t.palette[3]}; stroke-width: 1.5; fill: none; stroke-dasharray: 5,4; }\n.lt-entity-edge-distribution { stroke: ${t.positive}; stroke-width: 1.5; fill: none; stroke-dasharray: 5,4; }\n.lt-entity-edge-voting-pref { stroke: ${t.accent}; stroke-width: 1.8; fill: none; }\n.lt-entity-label-bg { fill: ${t.bg}; stroke: ${t.neutral}; stroke-width: 1; }\n.lt-entity-label { font: 600 10px sans-serif; fill: ${t.text}; text-anchor: middle; }\n.lt-entity-label-sub { font: 500 9px sans-serif; fill: ${t.textMuted}; text-anchor: middle; }\n.lt-entity-cluster { fill: none; stroke-dasharray: 6,4; stroke-width: 1.2; }\n.lt-entity-cluster-label-bg { fill: ${t.bg}; }\n.lt-entity-cluster-label { font: 600 11px sans-serif; letter-spacing: 0.5px; }\n.lt-entity-status-new { stroke: ${t.positive}; stroke-width: 2.2; }\n.lt-entity-status-eliminated { stroke: ${t.negative}; stroke-width: 2.2; }\n.lt-entity-status-modified { stroke: ${t.warn}; stroke-width: 2.2; }\n.lt-entity-status-tag { font: 700 8px sans-serif; text-anchor: middle; letter-spacing: 0.5px; }\n`.trim();\n}\n\nconst FILL: Record<string, string> = {\n corp: \"#dbeafe\",\n llc: \"#dcfce7\",\n lp: \"#fef9c3\",\n trust: \"#ede9fe\",\n individual: \"#fed7aa\",\n foundation: \"#fef9c3\",\n disregarded: \"#f5f5f5\",\n pool: \"#f1f5f9\",\n placeholder: \"#f9fafb\",\n};\n\nconst TYPE_LABEL: Record<string, string> = {\n corp: \"Corporation\",\n llc: \"LLC\",\n lp: \"LP / Fund\",\n trust: \"Trust\",\n individual: \"Individual\",\n foundation: \"Foundation\",\n disregarded: \"Disregarded Entity\",\n pool: \"Reserved Pool\",\n placeholder: \"To Be Formed\",\n};\n\nfunction statusClass(node: EntityNode): string | undefined {\n switch (node.status) {\n case \"new\":\n return \"lt-entity-status-new\";\n case \"eliminated\":\n return \"lt-entity-status-eliminated\";\n case \"modified\":\n return \"lt-entity-status-modified\";\n default:\n return undefined;\n }\n}\n\nfunction renderShape(ln: EntityLayoutNode, t: BaseTheme): string {\n const n = ln.node;\n const fill = FILL[n.entityType] ?? t.bg;\n const sc = statusClass(n);\n const commonAttrs: Record<string, string | number> = {\n fill,\n stroke: t.stroke,\n \"stroke-width\": 1.4,\n };\n if (sc) {\n commonAttrs.class = sc;\n }\n // Dashed stroke for disregarded / placeholder / pool\n const dashed =\n n.entityType === \"disregarded\" ||\n n.entityType === \"placeholder\" ||\n n.entityType === \"pool\";\n\n const dashAttr = dashed ? { \"stroke-dasharray\": \"5,3\" } : {};\n const opacity = n.entityType === \"placeholder\" ? { opacity: 0.75 } : {};\n\n const x = -ln.width / 2;\n const y = -ln.height / 2;\n\n switch (n.entityType) {\n case \"corp\":\n return rect({\n x,\n y,\n width: ln.width,\n height: ln.height,\n rx: 0,\n ...commonAttrs,\n ...dashAttr,\n });\n case \"llc\":\n return rect({\n x,\n y,\n width: ln.width,\n height: ln.height,\n rx: 10,\n ry: 10,\n ...commonAttrs,\n });\n case \"lp\": {\n // Notched top corners polygon\n const w = ln.width;\n const h = ln.height;\n const notch = 12;\n const pts = [\n [x + notch, y],\n [x + w - notch, y],\n [x + w, y + notch],\n [x + w, y + h],\n [x, y + h],\n [x, y + notch],\n ]\n .map((p) => p.join(\",\"))\n .join(\" \");\n return polygon({ points: pts, ...commonAttrs });\n }\n case \"trust\":\n return el(\"ellipse\", {\n cx: 0,\n cy: 0,\n rx: ln.width / 2,\n ry: ln.height / 2,\n ...commonAttrs,\n });\n case \"individual\":\n return circle({\n cx: 0,\n cy: 0,\n r: Math.min(ln.width, ln.height) / 2 - 4,\n ...commonAttrs,\n });\n case \"foundation\": {\n const w = ln.width;\n const h = ln.height;\n const tip = 14;\n const pts = [\n [x + w / 2, y - tip],\n [x + w, y],\n [x + w, y + h],\n [x, y + h],\n [x, y],\n ]\n .map((p) => p.join(\",\"))\n .join(\" \");\n return polygon({ points: pts, ...commonAttrs });\n }\n case \"disregarded\":\n return rect({\n x,\n y,\n width: ln.width,\n height: ln.height,\n ...commonAttrs,\n ...dashAttr,\n });\n case \"pool\":\n return rect({\n x,\n y,\n width: ln.width,\n height: ln.height,\n rx: 8,\n ry: 8,\n ...commonAttrs,\n ...dashAttr,\n });\n case \"placeholder\":\n return rect({\n x,\n y,\n width: ln.width,\n height: ln.height,\n rx: 4,\n ry: 4,\n ...commonAttrs,\n ...dashAttr,\n ...opacity,\n });\n }\n}\n\nfunction renderBadge(ln: EntityLayoutNode): string | undefined {\n const j = ln.node.jurisdiction;\n if (!j) return undefined;\n const bw = j.length >= 3 ? 26 : 20;\n const bh = 13;\n // Top-right corner\n const bx = ln.width / 2 - bw - 4;\n const by = -ln.height / 2 + 4;\n return group({}, [\n rect({ x: bx, y: by, width: bw, height: bh, rx: 2, class: \"lt-entity-badge-bg\" }),\n textEl(\n { x: bx + bw / 2, y: by + bh - 3, class: \"lt-entity-badge-text\" },\n j\n ),\n ]);\n}\n\nfunction renderStatusTag(ln: EntityLayoutNode, t: BaseTheme): string | undefined {\n const n = ln.node;\n if (!n.status || n.status === \"normal\") return undefined;\n const map: Record<string, { label: string; color: string }> = {\n new: { label: \"NEW\", color: t.positive },\n eliminated: { label: \"ELIMINATED\", color: t.negative },\n modified: { label: \"MODIFIED\", color: t.warn },\n };\n const info = map[n.status];\n if (!info) return undefined;\n const w = info.label.length * 6 + 8;\n const h = 12;\n const x = -ln.width / 2 - 2;\n const y = -ln.height / 2 - h - 2;\n return group({}, [\n rect({ x, y, width: w, height: h, rx: 2, fill: info.color, stroke: \"none\" }),\n textEl(\n { x: x + w / 2, y: y + h - 3, class: \"lt-entity-status-tag\", fill: t.bg },\n info.label\n ),\n ]);\n}\n\nfunction renderNodeLabels(ln: EntityLayoutNode): string[] {\n const n = ln.node;\n const pieces: string[] = [];\n const isCircle = n.entityType === \"individual\";\n\n if (isCircle) {\n // Name and role rendered BELOW the circle\n let y = ln.height / 2 + 14;\n pieces.push(textEl({ x: 0, y, class: \"lt-entity-name\" }, n.name));\n y += 13;\n if (n.role) {\n pieces.push(textEl({ x: 0, y, class: \"lt-entity-role\" }, n.role));\n y += 12;\n }\n if (n.note) {\n pieces.push(textEl({ x: 0, y, class: \"lt-entity-note\" }, n.note));\n }\n return pieces;\n }\n\n // Inside-shape rendering\n // Name centered, type underneath\n const topY = -6;\n pieces.push(textEl({ x: 0, y: topY, class: \"lt-entity-name\" }, n.name));\n pieces.push(textEl({ x: 0, y: topY + 14, class: \"lt-entity-type\" }, TYPE_LABEL[n.entityType] ?? n.entityType));\n\n // Below-node: role, note, formation date\n let belowY = ln.height / 2 + 14;\n if (n.role) {\n pieces.push(textEl({ x: 0, y: belowY, class: \"lt-entity-role\" }, n.role));\n belowY += 12;\n }\n if (n.note) {\n pieces.push(textEl({ x: 0, y: belowY, class: \"lt-entity-note\" }, n.note));\n belowY += 12;\n }\n if (n.formationDate) {\n pieces.push(\n textEl({ x: 0, y: belowY, class: \"lt-entity-note\" }, `est. ${n.formationDate}`)\n );\n }\n return pieces;\n}\n\nfunction edgeClass(edge: EntityEdge): string {\n switch (edge.op) {\n case \"pool\":\n return \"lt-entity-edge-pool\";\n case \"license\":\n return \"lt-entity-edge-license\";\n case \"distribution\":\n return \"lt-entity-edge-distribution\";\n case \"voting\":\n return \"lt-entity-edge-voting-pref\";\n case \"ownership\":\n default:\n // Highlight preferred / Series share class\n if (edge.shareClass && /pref|series/i.test(edge.shareClass)) {\n return \"lt-entity-edge-voting-pref\";\n }\n return \"lt-entity-edge\";\n }\n}\n\nfunction renderEdgeLabel(le: EntityLayoutEdge): string | undefined {\n const e = le.edge;\n const lines: string[] = [];\n if (e.percentage) lines.push(e.percentage);\n if (e.label) lines.push(e.label);\n const hasClass = !!e.shareClass;\n if (!lines.length && !hasClass) return undefined;\n\n const main = lines[0];\n const sub = lines[1];\n const classLabel = hasClass ? e.shareClass : undefined;\n\n // Approximate width\n const maxText = Math.max(\n main ? main.length : 0,\n sub ? sub.length : 0,\n classLabel ? classLabel.length : 0\n );\n const w = Math.max(30, maxText * 6 + 10);\n const rows = (main ? 1 : 0) + (sub ? 1 : 0) + (classLabel ? 1 : 0);\n const h = 4 + rows * 12;\n const x = le.labelX - w / 2;\n const y = le.labelY - h / 2;\n const pieces: string[] = [];\n pieces.push(rect({ x, y, width: w, height: h, rx: 3, class: \"lt-entity-label-bg\" }));\n let ty = y + 12;\n if (main) {\n pieces.push(textEl({ x: le.labelX, y: ty, class: \"lt-entity-label\" }, main));\n ty += 12;\n }\n if (sub) {\n pieces.push(textEl({ x: le.labelX, y: ty, class: \"lt-entity-label-sub\" }, sub));\n ty += 12;\n }\n if (classLabel) {\n pieces.push(textEl({ x: le.labelX, y: ty, class: \"lt-entity-label-sub\" }, classLabel));\n }\n return group({}, pieces);\n}\n\nexport function renderEntity(ast: EntityAST, config?: RenderConfig): string {\n const layout = layoutEntity(ast);\n const t = resolveBaseTheme(config?.theme ?? \"default\");\n const titleOffset = ast.title ? 34 : 12;\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 ?? \"Entity Structure Diagram\"));\n children.push(\n desc(\n `Entity structure diagram with ${ast.entities.length} entities and ${ast.edges.length} relationships`\n )\n );\n children.push(el(\"style\", {}, buildCss(t)));\n\n // Arrow markers (per semantic role)\n children.push(\n defs([\n arrowMarker(\"lt-entity-arrow\", t.stroke),\n arrowMarker(\"lt-entity-arrow-purple\", t.palette[3] ?? t.stroke),\n arrowMarker(\"lt-entity-arrow-green\", t.positive),\n arrowMarker(\"lt-entity-arrow-grey\", t.neutral),\n arrowMarker(\"lt-entity-arrow-blue\", t.accent),\n ])\n );\n\n if (ast.title) {\n children.push(textEl({ x: 20, y: 22, class: \"lt-entity-title\" }, ast.title));\n }\n\n const inner: string[] = [];\n\n // Clusters (behind nodes) — label sits INSIDE the cluster top row\n for (const c of layout.clusters) {\n const color = c.color ?? t.neutral;\n inner.push(\n rect({\n x: c.x,\n y: c.y,\n width: c.width,\n height: c.height,\n rx: 8,\n stroke: color,\n class: \"lt-entity-cluster\",\n })\n );\n inner.push(\n textEl(\n { x: c.x + 12, y: c.y + 16, class: \"lt-entity-cluster-label\", fill: color },\n c.label\n )\n );\n }\n\n // Edges (before nodes so nodes sit on top)\n for (const le of layout.edges) {\n const cls = edgeClass(le.edge);\n const markerId = pickMarker(le.edge, cls);\n inner.push(\n pathEl({\n d: le.path,\n class: cls,\n \"marker-end\": `url(#${markerId})`,\n })\n );\n }\n // Edge labels AFTER paths so they cover lines\n for (const le of layout.edges) {\n const piece = renderEdgeLabel(le);\n if (piece) inner.push(piece);\n }\n\n // Nodes\n for (const ln of layout.nodes) {\n const parts: string[] = [];\n parts.push(renderShape(ln, t));\n const badge = renderBadge(ln);\n if (badge) parts.push(badge);\n const status = renderStatusTag(ln, t);\n if (status) parts.push(status);\n for (const p of renderNodeLabels(ln)) parts.push(p);\n inner.push(\n group(\n {\n transform: `translate(${ln.x}, ${ln.y})`,\n \"data-entity-id\": ln.node.id,\n \"data-entity-type\": ln.node.entityType,\n \"data-jurisdiction\": ln.node.jurisdiction ?? \"\",\n },\n parts\n )\n );\n }\n\n const wrap = group({ transform: `translate(0, ${titleOffset})` }, inner);\n children.push(wrap);\n\n return svgRoot(\n {\n class: \"lt-entity\",\n role: \"img\",\n \"aria-label\": escapeXml(ast.title ?? \"Entity structure diagram\"),\n width,\n height,\n viewBox: `0 0 ${width} ${height}`,\n },\n children\n );\n}\n\nfunction arrowMarker(id: string, color: string): string {\n return el(\n \"marker\",\n {\n id,\n markerWidth: 9,\n markerHeight: 9,\n refX: 7,\n refY: 3,\n orient: \"auto\",\n markerUnits: \"strokeWidth\",\n },\n [el(\"path\", { d: \"M 0 0 L 7 3 L 0 6 z\", fill: color })]\n );\n}\n\nfunction pickMarker(_edge: EntityEdge, cls: string): string {\n if (cls === \"lt-entity-edge-license\") return \"lt-entity-arrow-purple\";\n if (cls === \"lt-entity-edge-distribution\") return \"lt-entity-arrow-green\";\n if (cls === \"lt-entity-edge-pool\") return \"lt-entity-arrow-grey\";\n if (cls === \"lt-entity-edge-voting-pref\") return \"lt-entity-arrow-blue\";\n return \"lt-entity-arrow\";\n}\n","import type { DiagramPlugin } from \"../../core/types\";\nimport { parseEntityDSL } from \"./parser\";\nimport { renderEntity } from \"./renderer\";\n\nexport const entity: DiagramPlugin = {\n type: \"entity\",\n detect(text: string): boolean {\n const first = text.trim().split(\"\\n\")[0]?.trim().toLowerCase() ?? \"\";\n return first.startsWith(\"entity-structure\");\n },\n parse: parseEntityDSL,\n\n render(text: string, config): string {\n const ast = parseEntityDSL(text);\n return renderEntity(ast, config);\n },\n};\n\nexport { parseEntityDSL } from \"./parser\";\nexport { renderEntity } from \"./renderer\";\nexport { layoutEntity } from \"./layout\";\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var chunkD7EHZFK4_cjs = require('./chunk-D7EHZFK4.cjs');
|
|
4
|
-
var
|
|
4
|
+
var chunk3WNW5Y7P_cjs = require('./chunk-3WNW5Y7P.cjs');
|
|
5
5
|
|
|
6
6
|
// src/diagrams/circuit/netlist.ts
|
|
7
7
|
var NetlistParseError = class extends Error {
|
|
@@ -30,8 +30,10 @@ var PREFIX_MAP = {
|
|
|
30
30
|
U: { type: "generic_ic", pins: [] },
|
|
31
31
|
// pins declared via pins="..." attr
|
|
32
32
|
X: { type: "generic_ic", pins: [] },
|
|
33
|
-
W: { type: "wire", pins: ["start", "end"] }
|
|
33
|
+
W: { type: "wire", pins: ["start", "end"] },
|
|
34
34
|
// explicit wire (non-SPICE convention, common in EE textbooks)
|
|
35
|
+
T: { type: "terminal_block", pins: [] }
|
|
36
|
+
// pins via pins="..."
|
|
35
37
|
};
|
|
36
38
|
var TYPE_ALIASES = {
|
|
37
39
|
vsource: "voltage_source",
|
|
@@ -43,9 +45,16 @@ var TYPE_ALIASES = {
|
|
|
43
45
|
ic: "generic_ic",
|
|
44
46
|
reg: "voltage_regulator",
|
|
45
47
|
timer555: "555_timer",
|
|
46
|
-
transistor: "npn"
|
|
48
|
+
transistor: "npn",
|
|
49
|
+
tb: "terminal_block",
|
|
50
|
+
junction_box: "terminal_block",
|
|
51
|
+
jbox: "terminal_block",
|
|
52
|
+
enclosure: "terminal_block"
|
|
47
53
|
};
|
|
48
|
-
var
|
|
54
|
+
var GROUND_REF = /^(0|gnd|ground|earth|pe|agnd|dgnd|gnda|gndd|vss|com)(_\w+|\d+)?$/i;
|
|
55
|
+
function isGroundRef(s) {
|
|
56
|
+
return GROUND_REF.test(s);
|
|
57
|
+
}
|
|
49
58
|
function tokenize(line) {
|
|
50
59
|
const tokens = [];
|
|
51
60
|
let i = 0;
|
|
@@ -143,9 +152,12 @@ function parseNetlist(body, title2) {
|
|
|
143
152
|
} else if (defaults) {
|
|
144
153
|
cType = defaults.type;
|
|
145
154
|
pinOrder = defaults.pins;
|
|
155
|
+
} else if (isGroundRef(id)) {
|
|
156
|
+
cType = "ground";
|
|
157
|
+
pinOrder = ["start"];
|
|
146
158
|
} else {
|
|
147
159
|
throw new NetlistParseError(
|
|
148
|
-
`Cannot infer type from id "${id}"
|
|
160
|
+
`Cannot infer type from id "${id}". Either rename to a SPICE-prefix id (R*, C*, L*, D*, V*, I*, Q*, M*, J*, S*, F*, B*, K*, U*, X*, W*, T*) or pass an explicit \`type=<name>\` attribute (e.g. \`${id} ... type=resistor\`). Schematex circuit covers electrical schematics only \u2014 hydraulic/pneumatic prefixes (EV*, BOMBA*, TANK*, etc.) are not supported.`,
|
|
149
161
|
lineIdx + 1
|
|
150
162
|
);
|
|
151
163
|
}
|
|
@@ -171,6 +183,13 @@ function parseNetlist(body, title2) {
|
|
|
171
183
|
if (cType === "ground" || cType === "gnd_signal" || cType === "gnd_chassis" || cType === "gnd_digital") {
|
|
172
184
|
pinOrder = ["start"];
|
|
173
185
|
}
|
|
186
|
+
if (cType === "terminal_block") {
|
|
187
|
+
const pinsAttr = kv.pins ?? kv.terminals;
|
|
188
|
+
const labels = pinsAttr ? pinsAttr.split(",").map((s) => s.trim()).filter(Boolean) : Array.from({ length: Math.max(netRefs.length, 1) }, (_, i) => `t${i + 1}`);
|
|
189
|
+
pinOrder = labels.map(
|
|
190
|
+
(label, idx) => label.toLowerCase().replace(/[^a-z0-9]+/g, "_") || `t${idx + 1}`
|
|
191
|
+
);
|
|
192
|
+
}
|
|
174
193
|
if (netRefs.length < pinOrder.length) {
|
|
175
194
|
throw new NetlistParseError(
|
|
176
195
|
`Component ${id} (${cType}) expects ${pinOrder.length} nets, got ${netRefs.length}`,
|
|
@@ -180,7 +199,7 @@ function parseNetlist(body, title2) {
|
|
|
180
199
|
const pins = {};
|
|
181
200
|
for (let p = 0; p < pinOrder.length; p++) {
|
|
182
201
|
let net = netRefs[p];
|
|
183
|
-
if (
|
|
202
|
+
if (isGroundRef(net)) net = "GND";
|
|
184
203
|
pins[pinOrder[p]] = net;
|
|
185
204
|
ensureNet(net).anchors.push(`${id}.${pinOrder[p]}`);
|
|
186
205
|
}
|
|
@@ -1259,6 +1278,37 @@ var potentiometer = {
|
|
|
1259
1278
|
`<polygon points="25,-10 21,-16 29,-16" ${FILL}/>`
|
|
1260
1279
|
].join("")
|
|
1261
1280
|
};
|
|
1281
|
+
var terminal_block = {
|
|
1282
|
+
length: 80,
|
|
1283
|
+
anchors: { start: { x: 0, y: 0 }, end: { x: 80, y: 0 } },
|
|
1284
|
+
svg: (label, _value, attrs) => {
|
|
1285
|
+
const pinsAttr = attrs?.pins ?? attrs?.terminals ?? "1,2,3,4";
|
|
1286
|
+
const pins = pinsAttr.split(",").map((s) => s.trim()).filter(Boolean);
|
|
1287
|
+
const n = Math.max(pins.length, 1);
|
|
1288
|
+
const BODY_W = 80;
|
|
1289
|
+
const pitch = 18;
|
|
1290
|
+
const bodyH = pitch * (n + 1);
|
|
1291
|
+
const topY = -bodyH / 2;
|
|
1292
|
+
const parts = [];
|
|
1293
|
+
parts.push(
|
|
1294
|
+
`<rect x="0" y="${topY}" width="${BODY_W}" height="${bodyH}" rx="3" fill="white" stroke-width="2" ${BODY}/>`
|
|
1295
|
+
);
|
|
1296
|
+
if (label) {
|
|
1297
|
+
parts.push(
|
|
1298
|
+
`<text x="${BODY_W / 2}" y="${topY + 14}" text-anchor="middle" class="schematex-circuit-meter">${label}</text>`
|
|
1299
|
+
);
|
|
1300
|
+
}
|
|
1301
|
+
for (let i = 0; i < n; i++) {
|
|
1302
|
+
const y = topY + pitch * (i + 1) + (label ? 8 : 0);
|
|
1303
|
+
parts.push(`<line x1="-8" y1="${y}" x2="0" y2="${y}" ${WIRE}/>`);
|
|
1304
|
+
parts.push(`<circle cx="6" cy="${y}" r="2" ${FILL}/>`);
|
|
1305
|
+
parts.push(
|
|
1306
|
+
`<text x="12" y="${y + 3}" class="schematex-circuit-pol">${pins[i] ?? `T${i + 1}`}</text>`
|
|
1307
|
+
);
|
|
1308
|
+
}
|
|
1309
|
+
return parts.join("");
|
|
1310
|
+
}
|
|
1311
|
+
};
|
|
1262
1312
|
var SYMBOLS = {
|
|
1263
1313
|
resistor,
|
|
1264
1314
|
capacitor,
|
|
@@ -1311,6 +1361,7 @@ var SYMBOLS = {
|
|
|
1311
1361
|
no_connect,
|
|
1312
1362
|
antenna,
|
|
1313
1363
|
generic_ic,
|
|
1364
|
+
terminal_block,
|
|
1314
1365
|
"555_timer": timer_555,
|
|
1315
1366
|
voltage_regulator
|
|
1316
1367
|
// Lamp reuses buzzer slot? No, needs its own entry but our CircuitComponentType
|
|
@@ -1704,7 +1755,7 @@ function renderItem(it, offX, offY) {
|
|
|
1704
1755
|
return `<line x1="${tx}" y1="${ty}" x2="${x2}" y2="${y2}" class="schematex-circuit-wire"/>`;
|
|
1705
1756
|
}
|
|
1706
1757
|
if (comp.componentType === "dot") {
|
|
1707
|
-
return
|
|
1758
|
+
return chunk3WNW5Y7P_cjs.circle({
|
|
1708
1759
|
cx: tx,
|
|
1709
1760
|
cy: ty,
|
|
1710
1761
|
r: 3.5,
|
|
@@ -1717,7 +1768,7 @@ function renderItem(it, offX, offY) {
|
|
|
1717
1768
|
const anchor = dir === "left" ? "end" : dir === "right" ? "start" : "middle";
|
|
1718
1769
|
const dx = dir === "right" ? 6 : dir === "left" ? -6 : 0;
|
|
1719
1770
|
const dy = dir === "down" ? 14 : dir === "up" ? -6 : 4;
|
|
1720
|
-
return
|
|
1771
|
+
return chunk3WNW5Y7P_cjs.text(
|
|
1721
1772
|
{
|
|
1722
1773
|
x: tx + dx,
|
|
1723
1774
|
y: ty + dy,
|
|
@@ -1729,7 +1780,7 @@ function renderItem(it, offX, offY) {
|
|
|
1729
1780
|
}
|
|
1730
1781
|
const sym = getSymbol(comp.componentType);
|
|
1731
1782
|
if (!sym) {
|
|
1732
|
-
return `<rect x="${tx - 10}" y="${ty - 10}" width="20" height="20" fill="none" class="schematex-circuit-err" stroke-dasharray="3,2"/><text x="${tx}" y="${ty + 3}" text-anchor="middle" font-size="9" class="schematex-circuit-err">?${
|
|
1783
|
+
return `<rect x="${tx - 10}" y="${ty - 10}" width="20" height="20" fill="none" class="schematex-circuit-err" stroke-dasharray="3,2"/><text x="${tx}" y="${ty + 3}" text-anchor="middle" font-size="9" class="schematex-circuit-err">?${chunk3WNW5Y7P_cjs.escapeXml(comp.componentType)}</text>`;
|
|
1733
1784
|
}
|
|
1734
1785
|
const body = sym.svg(comp.label, comp.value, comp.attrs);
|
|
1735
1786
|
const transform = `translate(${tx}, ${ty}) rotate(${it.rotation})`;
|
|
@@ -1742,7 +1793,7 @@ function renderItem(it, offX, offY) {
|
|
|
1742
1793
|
const off = 16;
|
|
1743
1794
|
if (comp.label) {
|
|
1744
1795
|
labels.push(
|
|
1745
|
-
|
|
1796
|
+
chunk3WNW5Y7P_cjs.text(
|
|
1746
1797
|
{
|
|
1747
1798
|
x: labelX + perpDX * off,
|
|
1748
1799
|
y: labelY + perpDY * off - 2,
|
|
@@ -1755,7 +1806,7 @@ function renderItem(it, offX, offY) {
|
|
|
1755
1806
|
}
|
|
1756
1807
|
if (comp.value) {
|
|
1757
1808
|
labels.push(
|
|
1758
|
-
|
|
1809
|
+
chunk3WNW5Y7P_cjs.text(
|
|
1759
1810
|
{
|
|
1760
1811
|
x: labelX + perpDX * off,
|
|
1761
1812
|
y: labelY + perpDY * off + 10,
|
|
@@ -1767,7 +1818,7 @@ function renderItem(it, offX, offY) {
|
|
|
1767
1818
|
);
|
|
1768
1819
|
}
|
|
1769
1820
|
}
|
|
1770
|
-
return `<g transform="${transform}" data-id="${
|
|
1821
|
+
return `<g transform="${transform}" data-id="${chunk3WNW5Y7P_cjs.escapeXml(comp.id)}" data-type="${chunk3WNW5Y7P_cjs.escapeXml(comp.componentType)}">${body}</g>` + labels.join("");
|
|
1771
1822
|
}
|
|
1772
1823
|
function renderRoute(r, offX, offY) {
|
|
1773
1824
|
if (r.points.length < 2) return "";
|
|
@@ -1799,7 +1850,7 @@ function renderCircuit(ast, config) {
|
|
|
1799
1850
|
.schematex-circuit-title { font: bold 14px sans-serif; fill: ${t.text}; }
|
|
1800
1851
|
.schematex-circuit-err { stroke: ${t.error}; fill: ${t.error}; }
|
|
1801
1852
|
`.trim();
|
|
1802
|
-
const titleBar = ast.title ?
|
|
1853
|
+
const titleBar = ast.title ? chunk3WNW5Y7P_cjs.text(
|
|
1803
1854
|
{
|
|
1804
1855
|
x: width / 2,
|
|
1805
1856
|
y: 18,
|
|
@@ -1809,7 +1860,7 @@ function renderCircuit(ast, config) {
|
|
|
1809
1860
|
ast.title
|
|
1810
1861
|
) : "";
|
|
1811
1862
|
const topOff = ast.title ? 24 : 0;
|
|
1812
|
-
return
|
|
1863
|
+
return chunk3WNW5Y7P_cjs.svgRoot(
|
|
1813
1864
|
{
|
|
1814
1865
|
class: "schematex-circuit",
|
|
1815
1866
|
viewBox: `0 0 ${Math.round(width)} ${Math.round(height + topOff)}`,
|
|
@@ -1819,13 +1870,13 @@ function renderCircuit(ast, config) {
|
|
|
1819
1870
|
"data-diagram-type": "circuit"
|
|
1820
1871
|
},
|
|
1821
1872
|
[
|
|
1822
|
-
|
|
1823
|
-
|
|
1873
|
+
chunk3WNW5Y7P_cjs.title(ast.title ?? "Circuit Schematic"),
|
|
1874
|
+
chunk3WNW5Y7P_cjs.desc(
|
|
1824
1875
|
`Circuit schematic with ${ast.components.length} components`
|
|
1825
1876
|
),
|
|
1826
|
-
|
|
1877
|
+
chunk3WNW5Y7P_cjs.defs([chunk3WNW5Y7P_cjs.el("style", {}, css)]),
|
|
1827
1878
|
titleBar,
|
|
1828
|
-
|
|
1879
|
+
chunk3WNW5Y7P_cjs.group({ transform: `translate(0, ${topOff})` }, [routeSvg + items])
|
|
1829
1880
|
]
|
|
1830
1881
|
);
|
|
1831
1882
|
}
|
|
@@ -1850,5 +1901,5 @@ exports.layoutCircuitNetlist = layoutCircuitNetlist;
|
|
|
1850
1901
|
exports.parseCircuit = parseCircuit;
|
|
1851
1902
|
exports.parseNetlist = parseNetlist;
|
|
1852
1903
|
exports.renderCircuit = renderCircuit;
|
|
1853
|
-
//# sourceMappingURL=chunk-
|
|
1854
|
-
//# sourceMappingURL=chunk-
|
|
1904
|
+
//# sourceMappingURL=chunk-YUPG2M3I.cjs.map
|
|
1905
|
+
//# sourceMappingURL=chunk-YUPG2M3I.cjs.map
|