schematex 0.6.5 → 0.6.6
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 +22 -22
- package/dist/ai/ai-sdk.d.cts +3 -3
- package/dist/ai/ai-sdk.d.ts +3 -3
- package/dist/ai/ai-sdk.js +17 -17
- package/dist/ai/index.cjs +28 -28
- package/dist/ai/index.d.cts +3 -3
- package/dist/ai/index.d.ts +3 -3
- package/dist/ai/index.js +17 -17
- package/dist/{api-BXkOT7GL.d.cts → api-DA4-U-jn.d.cts} +2 -2
- package/dist/{api-BIqZjEDf.d.ts → api-QFMTlIi7.d.ts} +2 -2
- package/dist/browser.cjs +23 -23
- package/dist/browser.d.cts +3 -3
- package/dist/browser.d.ts +3 -3
- package/dist/browser.js +17 -17
- package/dist/{chunk-3C5DKCBJ.cjs → chunk-2SZJQVPN.cjs} +12 -12
- package/dist/{chunk-3C5DKCBJ.cjs.map → chunk-2SZJQVPN.cjs.map} +1 -1
- package/dist/{chunk-RVHOCGHT.js → chunk-3GAPHXCE.js} +3 -3
- package/dist/{chunk-RVHOCGHT.js.map → chunk-3GAPHXCE.js.map} +1 -1
- package/dist/{chunk-ZZHQBAC3.js → chunk-3HZW6K5I.js} +130 -4
- package/dist/chunk-3HZW6K5I.js.map +1 -0
- package/dist/{chunk-HCBXTBFA.cjs → chunk-5FYPSIGD.cjs} +12 -12
- package/dist/{chunk-HCBXTBFA.cjs.map → chunk-5FYPSIGD.cjs.map} +1 -1
- package/dist/{chunk-B7ATOBL7.js → chunk-6NUAGU6O.js} +3 -3
- package/dist/{chunk-B7ATOBL7.js.map → chunk-6NUAGU6O.js.map} +1 -1
- package/dist/{chunk-WZ5QBGPZ.cjs → chunk-77GPD4YQ.cjs} +4 -4
- package/dist/{chunk-WZ5QBGPZ.cjs.map → chunk-77GPD4YQ.cjs.map} +1 -1
- package/dist/{chunk-IPEHLRTI.js → chunk-7DAIEDQP.js} +3 -3
- package/dist/{chunk-IPEHLRTI.js.map → chunk-7DAIEDQP.js.map} +1 -1
- package/dist/{chunk-S2CHBZ4A.cjs → chunk-BL57NQKN.cjs} +13 -13
- package/dist/{chunk-S2CHBZ4A.cjs.map → chunk-BL57NQKN.cjs.map} +1 -1
- package/dist/{chunk-T3ZN5P32.cjs → chunk-CMZKAASF.cjs} +132 -6
- package/dist/{chunk-ZZHQBAC3.js.map → chunk-CMZKAASF.cjs.map} +1 -1
- package/dist/{chunk-XJJUJ2EF.cjs → chunk-DO2DDHTQ.cjs} +4 -4
- package/dist/{chunk-XJJUJ2EF.cjs.map → chunk-DO2DDHTQ.cjs.map} +1 -1
- package/dist/{chunk-I6UJR4SG.cjs → chunk-DR3DDDQY.cjs} +4 -4
- package/dist/{chunk-I6UJR4SG.cjs.map → chunk-DR3DDDQY.cjs.map} +1 -1
- package/dist/{chunk-W3IXH6BN.cjs → chunk-EUVUO3CL.cjs} +4 -4
- package/dist/chunk-EUVUO3CL.cjs.map +1 -0
- package/dist/{chunk-MI77LY6A.js → chunk-FOPOOV2P.js} +991 -377
- package/dist/chunk-FOPOOV2P.js.map +1 -0
- package/dist/{chunk-GV5QLYTW.js → chunk-HL5PS6MG.js} +3 -3
- package/dist/{chunk-GV5QLYTW.js.map → chunk-HL5PS6MG.js.map} +1 -1
- package/dist/{chunk-MKECYIWN.js → chunk-HPEAE3JM.js} +3 -3
- package/dist/{chunk-MKECYIWN.js.map → chunk-HPEAE3JM.js.map} +1 -1
- package/dist/{chunk-KPKGMOTS.js → chunk-JN6FHUC6.js} +3 -3
- package/dist/{chunk-KPKGMOTS.js.map → chunk-JN6FHUC6.js.map} +1 -1
- package/dist/{chunk-OHLNH7IO.js → chunk-K2D6VFLP.js} +3 -3
- package/dist/{chunk-OHLNH7IO.js.map → chunk-K2D6VFLP.js.map} +1 -1
- package/dist/{chunk-OANWVUBA.js → chunk-KCHUQXS3.js} +3 -3
- package/dist/chunk-KCHUQXS3.js.map +1 -0
- package/dist/{chunk-ZZFPXCAK.cjs → chunk-KGOZBABH.cjs} +12 -12
- package/dist/{chunk-ZZFPXCAK.cjs.map → chunk-KGOZBABH.cjs.map} +1 -1
- package/dist/{chunk-35XCP2E4.js → chunk-KJZCRHNR.js} +3 -3
- package/dist/{chunk-35XCP2E4.js.map → chunk-KJZCRHNR.js.map} +1 -1
- package/dist/{chunk-XO7WW3I6.cjs → chunk-LPAWZYDU.cjs} +4 -4
- package/dist/{chunk-XO7WW3I6.cjs.map → chunk-LPAWZYDU.cjs.map} +1 -1
- package/dist/{chunk-624UQ5R6.cjs → chunk-MLLARXOI.cjs} +1050 -435
- package/dist/chunk-MLLARXOI.cjs.map +1 -0
- package/dist/{chunk-ROX5KEZM.cjs → chunk-NFZMNKOR.cjs} +15 -15
- package/dist/{chunk-ROX5KEZM.cjs.map → chunk-NFZMNKOR.cjs.map} +1 -1
- package/dist/{chunk-R5E2LSN2.cjs → chunk-NZT5P2XZ.cjs} +73 -2
- package/dist/chunk-NZT5P2XZ.cjs.map +1 -0
- package/dist/{chunk-GPC5BWLI.js → chunk-OFKRELZK.js} +3 -3
- package/dist/{chunk-GPC5BWLI.js.map → chunk-OFKRELZK.js.map} +1 -1
- package/dist/{chunk-XEIVA2CT.js → chunk-T3FV73LM.js} +3 -3
- package/dist/{chunk-XEIVA2CT.js.map → chunk-T3FV73LM.js.map} +1 -1
- package/dist/{chunk-4THUHX2D.cjs → chunk-T5KHNJ67.cjs} +5 -5
- package/dist/{chunk-4THUHX2D.cjs.map → chunk-T5KHNJ67.cjs.map} +1 -1
- package/dist/{chunk-FXPOHPBE.cjs → chunk-TACTEF2N.cjs} +4 -4
- package/dist/{chunk-FXPOHPBE.cjs.map → chunk-TACTEF2N.cjs.map} +1 -1
- package/dist/{chunk-AORGFBEH.js → chunk-UK6HF6PE.js} +73 -3
- package/dist/chunk-UK6HF6PE.js.map +1 -0
- package/dist/{chunk-LGFB4H5B.js → chunk-WU2N6ZVM.js} +3 -3
- package/dist/{chunk-LGFB4H5B.js.map → chunk-WU2N6ZVM.js.map} +1 -1
- package/dist/{chunk-BXNOXOE4.cjs → chunk-XYHCAJMI.cjs} +4 -4
- package/dist/{chunk-BXNOXOE4.cjs.map → chunk-XYHCAJMI.cjs.map} +1 -1
- package/dist/{chunk-FHZTWWI6.js → chunk-YMZTXOUG.js} +3 -3
- package/dist/{chunk-FHZTWWI6.js.map → chunk-YMZTXOUG.js.map} +1 -1
- package/dist/{chunk-XSPENTEG.js → chunk-YTGOLTLJ.js} +3 -3
- package/dist/{chunk-XSPENTEG.js.map → chunk-YTGOLTLJ.js.map} +1 -1
- package/dist/{chunk-VZO2SX6Q.cjs → chunk-Z3A2UNK2.cjs} +4 -4
- package/dist/{chunk-VZO2SX6Q.cjs.map → chunk-Z3A2UNK2.cjs.map} +1 -1
- package/dist/{diagnostics-CzHW0RCo.d.cts → diagnostics-CSznf_sl.d.cts} +1 -1
- package/dist/{diagnostics-CzHW0RCo.d.ts → diagnostics-CSznf_sl.d.ts} +1 -1
- package/dist/diagrams/blockdiagram/index.d.cts +1 -1
- package/dist/diagrams/blockdiagram/index.d.ts +1 -1
- package/dist/diagrams/circuit/index.cjs +8 -8
- package/dist/diagrams/circuit/index.d.cts +1 -1
- package/dist/diagrams/circuit/index.d.ts +1 -1
- package/dist/diagrams/circuit/index.js +2 -2
- package/dist/diagrams/ecomap/index.cjs +7 -7
- package/dist/diagrams/ecomap/index.d.cts +1 -1
- package/dist/diagrams/ecomap/index.d.ts +1 -1
- package/dist/diagrams/ecomap/index.js +2 -2
- package/dist/diagrams/entity/index.cjs +6 -6
- package/dist/diagrams/entity/index.d.cts +1 -1
- package/dist/diagrams/entity/index.d.ts +1 -1
- package/dist/diagrams/entity/index.js +2 -2
- package/dist/diagrams/fishbone/index.cjs +8 -8
- package/dist/diagrams/fishbone/index.d.cts +1 -1
- package/dist/diagrams/fishbone/index.d.ts +1 -1
- package/dist/diagrams/fishbone/index.js +2 -2
- package/dist/diagrams/flowchart/index.cjs +8 -8
- package/dist/diagrams/flowchart/index.d.cts +2 -2
- package/dist/diagrams/flowchart/index.d.ts +2 -2
- package/dist/diagrams/flowchart/index.js +2 -2
- package/dist/diagrams/genogram/index.cjs +9 -9
- package/dist/diagrams/genogram/index.d.cts +1 -1
- package/dist/diagrams/genogram/index.d.ts +1 -1
- package/dist/diagrams/genogram/index.js +2 -2
- package/dist/diagrams/ladder/index.cjs +6 -6
- package/dist/diagrams/ladder/index.d.cts +1 -1
- package/dist/diagrams/ladder/index.d.ts +1 -1
- package/dist/diagrams/ladder/index.js +2 -2
- package/dist/diagrams/logic/index.cjs +8 -8
- package/dist/diagrams/logic/index.d.cts +1 -1
- package/dist/diagrams/logic/index.d.ts +1 -1
- package/dist/diagrams/logic/index.js +2 -2
- package/dist/diagrams/orgchart/index.cjs +7 -7
- package/dist/diagrams/orgchart/index.d.cts +1 -1
- package/dist/diagrams/orgchart/index.d.ts +1 -1
- package/dist/diagrams/orgchart/index.js +2 -2
- package/dist/diagrams/pedigree/index.cjs +7 -7
- package/dist/diagrams/pedigree/index.d.cts +1 -1
- package/dist/diagrams/pedigree/index.d.ts +1 -1
- package/dist/diagrams/pedigree/index.js +2 -2
- package/dist/diagrams/phylo/index.cjs +7 -7
- package/dist/diagrams/phylo/index.d.cts +1 -1
- package/dist/diagrams/phylo/index.d.ts +1 -1
- package/dist/diagrams/phylo/index.js +2 -2
- package/dist/diagrams/sld/index.cjs +8 -8
- 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 +6 -6
- package/dist/diagrams/sociogram/index.d.cts +1 -1
- package/dist/diagrams/sociogram/index.d.ts +1 -1
- package/dist/diagrams/sociogram/index.js +2 -2
- package/dist/diagrams/timing/index.d.cts +1 -1
- package/dist/diagrams/timing/index.d.ts +1 -1
- package/dist/diagrams/venn/index.cjs +9 -9
- package/dist/diagrams/venn/index.d.cts +1 -1
- package/dist/diagrams/venn/index.d.ts +1 -1
- package/dist/diagrams/venn/index.js +2 -2
- package/dist/{index-R0IwpG20.d.cts → index-CDpYuU7l.d.cts} +1 -1
- package/dist/{index-DdR1Auby.d.ts → index-jTwjudTW.d.ts} +1 -1
- package/dist/index.cjs +77 -73
- package/dist/index.d.cts +7 -5
- package/dist/index.d.ts +7 -5
- package/dist/index.js +21 -21
- package/dist/react.cjs +17 -17
- package/dist/react.d.cts +2 -2
- package/dist/react.d.ts +2 -2
- package/dist/react.js +16 -16
- package/dist/{tools-DHSVXHM9.d.cts → tools-CbuSbW6B.d.cts} +2 -2
- package/dist/{tools-B7EqXLgD.d.ts → tools-D344vOzR.d.ts} +2 -2
- package/package.json +1 -1
- package/dist/chunk-624UQ5R6.cjs.map +0 -1
- package/dist/chunk-AORGFBEH.js.map +0 -1
- package/dist/chunk-MI77LY6A.js.map +0 -1
- package/dist/chunk-OANWVUBA.js.map +0 -1
- package/dist/chunk-R5E2LSN2.cjs.map +0 -1
- package/dist/chunk-T3ZN5P32.cjs.map +0 -1
- package/dist/chunk-W3IXH6BN.cjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/diagrams/phylo/parser.ts","../src/diagrams/phylo/layout.ts","../src/diagrams/phylo/renderer.ts","../src/diagrams/phylo/index.ts"],"names":["name","num","line","children","idx","text","title","matchQuotedTitle","cssCustomProperties","STROKE_WIDTH","FONT_SIZE","group","rect","resolveBiologyTheme","path","circle","desc","el","svgRoot"],"mappings":";;;;;;;AAUO,IAAM,eAAA,GAAN,cAA8B,KAAA,CAAM;AAAA,EACzC,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AAAA,EACd;AACF;AAIA,IAAI,IAAA,GAAO,CAAA;AACX,IAAI,IAAA,GAAO,EAAA;AACX,IAAI,OAAA,GAAU,CAAA;AAEd,SAAS,KAAA,GAAgB;AACvB,EAAA,OAAO,KAAK,OAAA,EAAS,CAAA,CAAA;AACvB;AAEA,SAAS,IAAA,GAAe;AACtB,EAAA,OAAO,IAAA,CAAK,IAAI,CAAA,IAAK,EAAA;AACvB;AAEA,SAAS,OAAA,GAAkB;AACzB,EAAA,OAAO,IAAA,CAAK,MAAM,CAAA,IAAK,EAAA;AACzB;AAEA,SAAS,cAAA,GAAuB;AAC9B,EAAA,OAAO,IAAA,GAAO,KAAK,MAAA,IAAU,IAAA,CAAK,KAAK,IAAA,CAAK,IAAI,CAAC,CAAA,EAAG,IAAA,EAAA;AACtD;AAEA,SAAS,eAAA,GAA0B;AACjC,EAAA,cAAA,EAAe;AACf,EAAA,IAAI,IAAA,OAAW,GAAA,EAAK;AAClB,IAAA,OAAA,EAAQ;AACR,IAAA,IAAIA,KAAAA,GAAO,EAAA;AACX,IAAA,OAAO,IAAA,GAAO,KAAK,MAAA,EAAQ;AACzB,MAAA,IAAI,IAAA,OAAW,GAAA,EAAK;AAClB,QAAA,OAAA,EAAQ;AACR,QAAA,IAAI,IAAA,OAAW,GAAA,EAAK;AAClB,UAAAA,KAAAA,IAAQ,GAAA;AACR,UAAA,OAAA,EAAQ;AAAA,QACV,CAAA,MAAO;AACL,UAAA;AAAA,QACF;AAAA,MACF,CAAA,MAAO;AACL,QAAAA,SAAQ,OAAA,EAAQ;AAAA,MAClB;AAAA,IACF;AACA,IAAA,OAAOA,KAAAA;AAAA,EACT;AACA,EAAA,IAAI,IAAA,GAAO,EAAA;AACX,EAAA,OAAO,IAAA,GAAO,KAAK,MAAA,IAAU,CAAC,gBAAgB,IAAA,CAAK,IAAA,CAAK,IAAI,CAAC,CAAA,EAAG;AAC9D,IAAA,IAAA,IAAQ,OAAA,EAAQ;AAAA,EAClB;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,iBAAA,GAAwC;AAC/C,EAAA,cAAA,EAAe;AACf,EAAA,IAAI,IAAA,EAAK,KAAM,GAAA,EAAK,OAAO,MAAA;AAC3B,EAAA,OAAA,EAAQ;AACR,EAAA,cAAA,EAAe;AACf,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,OAAO,IAAA,GAAO,KAAK,MAAA,IAAU,YAAA,CAAa,KAAK,IAAA,CAAK,IAAI,CAAC,CAAA,EAAG;AAC1D,IAAA,MAAA,IAAU,OAAA,EAAQ;AAAA,EACpB;AACA,EAAA,IAAI,CAAC,QAAQ,OAAO,MAAA;AACpB,EAAA,MAAM,GAAA,GAAM,OAAO,MAAM,CAAA;AACzB,EAAA,OAAO,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA,GAAI,MAAA,GAAY,GAAA;AACzC;AAEA,SAAS,QAAA,GAA2E;AAClF,EAAA,cAAA,EAAe;AACf,EAAA,IAAI,IAAA,EAAK,KAAM,GAAA,EAAK,OAAO,MAAA;AAC3B,EAAA,MAAM,KAAA,GAAQ,IAAA;AACd,EAAA,OAAA,EAAQ;AACR,EAAA,IAAI,OAAA,GAAU,EAAA;AACd,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,OAAO,IAAA,GAAO,IAAA,CAAK,MAAA,IAAU,KAAA,GAAQ,CAAA,EAAG;AACtC,IAAA,IAAI,IAAA,OAAW,GAAA,EAAK,KAAA,EAAA;AACpB,IAAA,IAAI,IAAA,OAAW,GAAA,EAAK,KAAA,EAAA;AACpB,IAAA,IAAI,KAAA,GAAQ,CAAA,EAAG,OAAA,IAAW,OAAA,EAAQ;AAAA,SAC7B,OAAA,EAAQ;AAAA,EACf;AACA,EAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,QAAQ,CAAA,EAAG;AAChC,IAAA,MAAM,QAAQ,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAA,CAAE,MAAM,GAAG,CAAA;AACxC,IAAA,MAAM,MAA8B,EAAC;AACrC,IAAA,IAAI,OAAA;AACJ,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AAC3B,MAAA,IAAI,OAAO,EAAA,EAAI;AACf,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAC5B,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,CAAC,CAAA;AAC7B,MAAA,GAAA,CAAI,GAAG,CAAA,GAAI,GAAA;AACX,MAAA,IAAI,QAAQ,GAAA,EAAK;AACf,QAAA,MAAMC,IAAAA,GAAM,OAAO,GAAG,CAAA;AACtB,QAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAMA,IAAG,GAAG,OAAA,GAAUA,IAAAA;AAAA,MACpC;AAAA,IACF;AACA,IAAA,OAAO,EAAE,SAAS,GAAA,EAAI;AAAA,EACxB;AAEA,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,OAAA,CAAQ,IAAA,EAAM,CAAA;AACjC,EAAA,IAAI,CAAC,OAAO,KAAA,CAAM,GAAG,KAAK,OAAA,CAAQ,IAAA,EAAK,CAAE,MAAA,GAAS,CAAA,EAAG;AACnD,IAAA,OAAO,EAAE,SAAS,GAAA,EAAI;AAAA,EACxB;AAEA,EAAA,IAAA,GAAO,KAAA;AACP,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,kBAAA,GAAgC;AACvC,EAAA,cAAA,EAAe;AACf,EAAA,IAAI,WAAwB,EAAC;AAE7B,EAAA,IAAI,IAAA,OAAW,GAAA,EAAK;AAClB,IAAA,OAAA,EAAQ;AACR,IAAA,QAAA,GAAW,EAAC;AACZ,IAAA,QAAA,CAAS,IAAA,CAAK,oBAAoB,CAAA;AAClC,IAAA,cAAA,EAAe;AACf,IAAA,OAAO,IAAA,OAAW,GAAA,EAAK;AACrB,MAAA,OAAA,EAAQ;AACR,MAAA,QAAA,CAAS,IAAA,CAAK,oBAAoB,CAAA;AAClC,MAAA,cAAA,EAAe;AAAA,IACjB;AACA,IAAA,cAAA,EAAe;AACf,IAAA,IAAI,IAAA,EAAK,KAAM,GAAA,EAAK,OAAA,EAAQ;AAAA,EAC9B;AAEA,EAAA,MAAM,OAAO,eAAA,EAAgB;AAC7B,EAAA,MAAM,UAAU,QAAA,EAAS;AACzB,EAAA,MAAM,eAAe,iBAAA,EAAkB;AAEvC,EAAA,MAAM,QAAA,GAAW,OAAA,GAAU,MAAA,GAAY,QAAA,EAAS;AAChD,EAAA,MAAM,SAAS,OAAA,IAAW,QAAA;AAE1B,EAAA,MAAM,MAAA,GAAS,SAAS,MAAA,KAAW,CAAA;AACnC,EAAA,MAAM,EAAA,GAAK,QAAQ,KAAA,EAAM;AAEzB,EAAA,OAAO;AAAA,IACL,EAAA;AAAA,IACA,OAAO,IAAA,IAAQ,MAAA;AAAA,IACf,YAAA;AAAA,IACA,SAAS,MAAA,EAAQ,OAAA;AAAA,IACjB,QAAA;AAAA,IACA,MAAA;AAAA,IACA,KAAK,MAAA,EAAQ;AAAA,GACf;AACF;AAEO,SAAS,YAAY,MAAA,EAA2B;AACrD,EAAA,IAAA,GAAO,CAAA;AACP,EAAA,IAAA,GAAO,OAAO,IAAA,EAAK;AACnB,EAAA,OAAA,GAAU,CAAA;AAEV,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,EAAG;AACtB,IAAA,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,EACzB;AAEA,EAAA,MAAM,OAAO,kBAAA,EAAmB;AAChC,EAAA,OAAO,IAAA;AACT;AAWA,SAAS,gBAAgB,KAAA,EAA4B;AACnD,EAAA,OAAA,GAAU,CAAA;AACV,EAAA,MAAM,SAAuB,EAAC;AAE9B,EAAA,KAAA,MAAW,OAAO,KAAA,EAAO;AACvB,IAAA,IAAI,CAAC,IAAI,IAAA,EAAK,IAAK,IAAI,IAAA,EAAK,CAAE,UAAA,CAAW,GAAG,CAAA,EAAG;AAC/C,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA;AAC9B,IAAA,MAAM,OAAA,GAAU,IAAI,IAAA,EAAK;AAEzB,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI,YAAA;AACJ,IAAA,IAAI,OAAA;AAGJ,IAAA,IAAI,YAAA,GAAe,OAAA;AACnB,IAAA,MAAM,YAAA,GAAe,YAAA,CAAa,KAAA,CAAM,yBAAyB,CAAA;AACjE,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,OAAA,GAAU,MAAA,CAAO,YAAA,CAAa,CAAC,CAAC,CAAA;AAChC,MAAA,YAAA,GAAe,aAAa,KAAA,CAAM,CAAA,EAAG,YAAA,CAAa,KAAK,EAAE,IAAA,EAAK;AAAA,IAChE;AAGA,IAAA,MAAM,QAAA,GAAW,YAAA,CAAa,OAAA,CAAQ,GAAG,CAAA;AACzC,IAAA,IAAI,aAAa,EAAA,EAAI;AACnB,MAAA,IAAA,GAAO,YAAA;AAAA,IACT,CAAA,MAAO;AACL,MAAA,IAAA,GAAO,YAAA,CAAa,KAAA,CAAM,CAAA,EAAG,QAAQ,EAAE,IAAA,EAAK;AAC5C,MAAA,MAAM,SAAS,YAAA,CAAa,KAAA,CAAM,QAAA,GAAW,CAAC,EAAE,IAAA,EAAK;AACrD,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAM,GAAA,GAAM,OAAO,MAAM,CAAA;AACzB,QAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,GAAG,GAAG,YAAA,GAAe,GAAA;AAAA,MACzC;AAAA,IACF;AAEA,IAAA,MAAA,CAAO,KAAK,EAAE,MAAA,EAAQ,IAAA,EAAM,YAAA,EAAc,SAAS,CAAA;AAAA,EACrD;AAEA,EAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,IAAA,MAAM,IAAI,gBAAgB,8BAA8B,CAAA;AAAA,EAC1D;AAEA,EAAA,SAAS,SAAA,CAAU,UAAkB,YAAA,EAA4D;AAC/F,IAAA,MAAMC,KAAAA,GAAO,OAAO,QAAQ,CAAA;AAC5B,IAAA,MAAMC,YAAwB,EAAC;AAC/B,IAAA,IAAIC,OAAM,QAAA,GAAW,CAAA;AAErB,IAAA,OAAOA,OAAM,MAAA,CAAO,MAAA,IAAU,OAAOA,IAAG,CAAA,CAAE,SAAS,YAAA,EAAc;AAC/D,MAAA,IAAI,MAAA,CAAOA,IAAG,CAAA,CAAE,MAAA,KAAWF,KAAAA,CAAK,MAAA,GAAS,CAAA,IAAK,MAAA,CAAOE,IAAG,CAAA,CAAE,MAAA,GAASF,KAAAA,CAAK,MAAA,EAAQ;AAC9E,QAAA,MAAM,WAAA,GAAc,MAAA,CAAOE,IAAG,CAAA,CAAE,MAAA;AAChC,QAAA,MAAM,MAAA,GAAS,SAAA,CAAUA,IAAAA,EAAK,WAAW,CAAA;AACzC,QAAAD,SAAAA,CAAS,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA;AACzB,QAAAC,OAAM,MAAA,CAAO,OAAA;AAAA,MACf,CAAA,MAAO;AACL,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,EAAA,GAAKF,KAAAA,CAAK,IAAA,IAAQ,KAAA,EAAM;AAC9B,IAAA,OAAO;AAAA,MACL,IAAA,EAAM;AAAA,QACJ,EAAA;AAAA,QACA,KAAA,EAAOA,MAAK,IAAA,IAAQ,MAAA;AAAA,QACpB,cAAcA,KAAAA,CAAK,YAAA;AAAA,QACnB,SAASA,KAAAA,CAAK,OAAA;AAAA,QACd,QAAA,EAAAC,SAAAA;AAAA,QACA,MAAA,EAAQA,UAAS,MAAA,KAAW;AAAA,OAC9B;AAAA,MACA,OAAA,EAASC;AAAA,KACX;AAAA,EACF;AAGA,EAAA,MAAM,QAAA,GAAW,OAAO,CAAC,CAAA;AACzB,EAAA,MAAM,aAAa,QAAA,CAAS,MAAA;AAC5B,EAAA,MAAM,WAAwB,EAAC;AAC/B,EAAA,IAAI,GAAA,GAAM,CAAA;AAEV,EAAA,OAAO,GAAA,GAAM,OAAO,MAAA,EAAQ;AAC1B,IAAA,IAAI,MAAA,CAAO,GAAG,CAAA,CAAE,MAAA,GAAS,UAAA,EAAY;AACnC,MAAA,MAAM,SAAS,SAAA,CAAU,GAAA,EAAK,MAAA,CAAO,GAAG,EAAE,MAAM,CAAA;AAChD,MAAA,QAAA,CAAS,IAAA,CAAK,OAAO,IAAI,CAAA;AACzB,MAAA,GAAA,GAAM,MAAA,CAAO,OAAA;AAAA,IACf,CAAA,MAAO;AACL,MAAA;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,IAAA,IAAQ,KAAA,EAAM;AACtC,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,MAAA;AAAA,IACJ,KAAA,EAAO,SAAS,IAAA,IAAQ,MAAA;AAAA,IACxB,cAAc,QAAA,CAAS,YAAA;AAAA,IACvB,SAAS,QAAA,CAAS,OAAA;AAAA,IAClB,QAAA;AAAA,IACA,MAAA,EAAQ,SAAS,MAAA,KAAW;AAAA,GAC9B;AACF;AAIA,SAAS,iBAAiB,QAAA,EAOxB;AACA,EAAA,MAAM,MAAA,GAA8C;AAAA,IAClD,MAAA,EAAQ,aAAA;AAAA,IACR,IAAA,EAAM,WAAA;AAAA,IACN,QAAA,EAAU;AAAA,GACZ;AAEA,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,CAAE,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA;AACrD,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,SAAS,UAAA,EAAY;AACvB,MAAA,MAAA,CAAO,QAAA,GAAW,IAAA;AAClB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AACjC,IAAA,IAAI,aAAa,EAAA,EAAI;AACrB,IAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,QAAQ,EAAE,IAAA,EAAK;AACzC,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,CAAC,EAAE,IAAA,EAAK,CAAE,OAAA,CAAQ,cAAA,EAAgB,EAAE,CAAA;AAEtE,IAAA,QAAQ,GAAA;AAAK,MACX,KAAK,QAAA;AACH,QAAA,IAAI,CAAC,eAAe,SAAA,EAAW,UAAA,EAAY,UAAU,CAAA,CAAE,QAAA,CAAS,GAAG,CAAA,EAAG;AACpE,UAAA,MAAA,CAAO,MAAA,GAAS,GAAA;AAAA,QAClB;AACA,QAAA;AAAA,MACF,KAAK,MAAA;AACH,QAAA,IAAI,CAAC,WAAA,EAAa,WAAA,EAAa,YAAY,CAAA,CAAE,QAAA,CAAS,GAAG,CAAA,EAAG;AAC1D,UAAA,MAAA,CAAO,IAAA,GAAO,GAAA;AAAA,QAChB;AACA,QAAA;AAAA,MACF,KAAK,cAAA;AACH,QAAA,MAAA,CAAO,WAAA,GAAc,OAAO,GAAG,CAAA;AAC/B,QAAA;AAAA,MACF,KAAK,WAAA;AACH,QAAA,MAAA,CAAO,SAAA,GAAY,OAAO,GAAG,CAAA;AAC7B,QAAA;AAAA,MACF,KAAK,MAAA;AACH,QAAA,MAAA,CAAO,IAAA,GAAO,GAAA;AACd,QAAA;AAAA;AACJ,EACF;AAEA,EAAA,IAAI,MAAA,CAAO,WAAW,UAAA,EAAY;AAChC,IAAA,MAAA,CAAO,QAAA,GAAW,IAAA;AAAA,EACpB;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,eAAeF,KAAAA,EAA+B;AAErD,EAAA,MAAM,QAAQA,KAAAA,CAAK,KAAA;AAAA,IACjB;AAAA,GACF;AACA,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AAEnB,EAAA,MAAM,EAAA,GAAK,MAAM,CAAC,CAAA;AAClB,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,CAAC,CAAA,CAAE,MAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,OAAO,OAAO,CAAA;AACvE,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,CAAC,CAAA,IAAK,EAAA;AAE7B,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI,SAAA;AAEJ,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,MAAM,UAAA,GAAa,QAAA,CAAS,KAAA,CAAM,oBAAoB,CAAA;AACtD,IAAA,IAAI,UAAA,EAAY,KAAA,GAAQ,UAAA,CAAW,CAAC,CAAA;AACpC,IAAA,MAAM,UAAA,GAAa,QAAA,CAAS,KAAA,CAAM,oBAAoB,CAAA;AACtD,IAAA,IAAI,UAAA,EAAY,KAAA,GAAQ,UAAA,CAAW,CAAC,CAAA;AACpC,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,KAAA,CAAM,oBAAoB,CAAA;AACnD,IAAA,IAAI,OAAA,IAAW,CAAC,QAAA,EAAU,YAAA,EAAc,MAAM,EAAE,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAG;AACpE,MAAA,SAAA,GAAY,QAAQ,CAAC,CAAA;AAAA,IACvB;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,EAAA,EAAI,OAAA,EAAS,KAAA,EAAO,OAAO,SAAA,EAAU;AAChD;AAEO,SAAS,WAAWG,KAAAA,EAA4B;AACrD,EAAA,MAAM,KAAA,GAAQA,KAAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC7B,EAAA,IAAI,OAAA,GAAU,CAAA;AAGd,EAAA,OAAO,OAAA,GAAU,MAAM,MAAA,IAAU,CAAC,MAAM,OAAO,CAAA,CAAE,MAAK,EAAG,OAAA,EAAA;AAGzD,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,OAAO,CAAA,EAAG,MAAK,IAAK,EAAA;AAC7C,EAAA,IAAI,CAAC,UAAA,CAAW,WAAA,EAAY,CAAE,UAAA,CAAW,OAAO,CAAA,EAAG;AACjD,IAAA,MAAM,IAAI,gBAAgB,wCAAwC,CAAA;AAAA,EACpE;AACA,EAAA,OAAA,EAAA;AAEA,EAAA,MAAMC,MAAAA,GAA4BC,mCAAiB,UAAU,CAAA;AAE7D,EAAA,IAAI,WAAA,GAAmD;AAAA,IACrD,MAAA,EAAQ,aAAA;AAAA,IACR,IAAA,EAAM,WAAA;AAAA,IACN,QAAA,EAAU;AAAA,GACZ;AACA,EAAA,MAAM,UAAA,GAAa,UAAA,CAAW,KAAA,CAAM,cAAc,CAAA;AAClD,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,WAAA,GAAc,gBAAA,CAAiB,UAAA,CAAW,CAAC,CAAC,CAAA;AAAA,EAC9C;AAGA,EAAA,IAAI,IAAA,GAAyB,IAAA;AAC7B,EAAA,IAAI,UAAA;AACJ,EAAA,IAAI,QAAA;AACJ,EAAA,MAAM,SAAqB,EAAC;AAC5B,EAAA,MAAM,cAAwB,EAAC;AAC/B,EAAA,IAAI,YAAA,GAAe,KAAA;AAEnB,EAAA,OAAO,OAAA,GAAU,MAAM,MAAA,EAAQ;AAC7B,IAAA,MAAM,GAAA,GAAM,MAAM,OAAO,CAAA;AACzB,IAAA,MAAM,OAAA,GAAU,IAAI,IAAA,EAAK;AACzB,IAAA,OAAA,EAAA;AAEA,IAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,EAAG;AAGzC,IAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,SAAS,CAAA,EAAG;AACjC,MAAA,MAAM,SAAA,GAAY,QAAQ,KAAA,CAAM,CAAC,EAAE,IAAA,EAAK,CAAE,OAAA,CAAQ,cAAA,EAAgB,EAAE,CAAA;AACpE,MAAA,IAAA,GAAO,YAAY,SAAS,CAAA;AAC5B,MAAA,YAAA,GAAe,KAAA;AACf,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,OAAO,CAAA,EAAG;AAC/B,MAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,KAAA,CAAM,mBAAmB,CAAA;AACpD,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,UAAA,GAAa,WAAW,CAAC,CAAA;AAAA,MAC3B,CAAA,MAAO;AACL,QAAA,UAAA,GAAa,OAAA,CAAQ,MAAM,CAAC,CAAA,CAAE,MAAK,CAAE,OAAA,CAAQ,cAAA,EAAgB,EAAE,CAAA,IAAK,oBAAA;AAAA,MACtE;AACA,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,WAAW,CAAA,EAAG;AACnC,MAAA,QAAA,GAAW,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,EAAK;AACjC,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,QAAQ,CAAA,EAAG;AAChC,MAAA,MAAM,KAAA,GAAQ,eAAe,OAAO,CAAA;AACpC,MAAA,IAAI,KAAA,EAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA;AAC5B,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,OAAO,CAAA,EAAG;AAC/B,MAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,KAAA,CAAM,cAAc,CAAA;AAC/C,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,WAAA,GAAc,EAAE,GAAG,WAAA,EAAa,GAAG,iBAAiB,UAAA,CAAW,CAAC,CAAC,CAAA,EAAE;AAAA,MACrE;AACA,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,KAAM,OAAA,KAAY,WAAW,CAAC,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,CAAA,EAAI;AAC5E,MAAA,YAAA,GAAe,IAAA;AACf,MAAA,WAAA,CAAY,KAAK,GAAG,CAAA;AACpB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,WAAA,CAAY,KAAK,GAAG,CAAA;AACpB,MAAA;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,CAAC,IAAA,IAAQ,WAAA,CAAY,MAAA,GAAS,CAAA,EAAG;AACnC,IAAA,IAAA,GAAO,gBAAgB,WAAW,CAAA;AAAA,EACpC;AAEA,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,MAAM,IAAI,gBAAgB,mDAAmD,CAAA;AAAA,EAC/E;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,OAAA;AAAA,IACN,KAAA,EAAAD,MAAAA;AAAA,IACA,IAAA;AAAA,IACA,UAAU,WAAA,CAAY,QAAA;AAAA,IACtB,QAAQ,WAAA,CAAY,MAAA;AAAA,IACpB,MAAM,WAAA,CAAY,IAAA;AAAA,IAClB,MAAA;AAAA,IACA,UAAA;AAAA,IACA,MAAM,WAAA,CAAY,IAAA;AAAA,IAClB,QAAA;AAAA,IACA,UAAU;AAAC,GACb;AACF;;;ACtcA,SAAS,cAAc,IAAA,EAA8B;AACnD,EAAA,IAAI,IAAA,CAAK,MAAA,EAAQ,OAAO,CAAC,IAAI,CAAA;AAC7B,EAAA,MAAM,SAAsB,EAAC;AAC7B,EAAA,KAAA,MAAW,KAAA,IAAS,KAAK,QAAA,EAAU;AACjC,IAAA,MAAA,CAAO,IAAA,CAAK,GAAG,aAAA,CAAc,KAAK,CAAC,CAAA;AAAA,EACrC;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,YAAA,CAAa,MAAiB,SAAA,EAA2B;AAChE,EAAA,IAAI,IAAA,CAAK,QAAQ,OAAO,SAAA;AACxB,EAAA,IAAI,OAAA,GAAU,SAAA;AACd,EAAA,KAAA,MAAW,KAAA,IAAS,KAAK,QAAA,EAAU;AACjC,IAAA,MAAM,YAAY,YAAA,CAAa,KAAA,EAAO,SAAA,IAAa,KAAA,CAAM,gBAAgB,CAAA,CAAE,CAAA;AAC3E,IAAA,IAAI,SAAA,GAAY,SAAS,OAAA,GAAU,SAAA;AAAA,EACrC;AACA,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,SAAS,IAAA,EAAyB;AACzC,EAAA,IAAI,IAAA,CAAK,QAAQ,OAAO,CAAA;AACxB,EAAA,IAAI,GAAA,GAAM,CAAA;AACV,EAAA,KAAA,MAAW,KAAA,IAAS,KAAK,QAAA,EAAU;AACjC,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,KAAK,CAAA,GAAI,CAAA;AAC5B,IAAA,IAAI,CAAA,GAAI,KAAK,GAAA,GAAM,CAAA;AAAA,EACrB;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,mBAAmB,IAAA,EAAyB;AACnD,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,IAAS,IAAA,CAAK,EAAA;AACjC,EAAA,OAAO,KAAA,CAAM,SAAS,GAAA,GAAM,CAAA;AAC9B;AAIA,SAAS,cACP,GAAA,EACqB;AACrB,EAAA,MAAM,gBAAA,uBAAuB,GAAA,EAAoB;AAEjD,EAAA,KAAA,MAAW,KAAA,IAAS,IAAI,MAAA,EAAQ;AAC9B,IAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA;AACvC,IAAA,iBAAA,CAAkB,GAAA,CAAI,IAAA,EAAM,SAAA,EAAW,KAAA,CAAM,IAAI,gBAAgB,CAAA;AAAA,EACnE;AAEA,EAAA,OAAO,gBAAA;AACT;AAEA,SAAS,iBAAA,CACP,IAAA,EACA,SAAA,EACA,OAAA,EACA,MAAA,EACS;AACT,EAAA,IAAI,KAAK,MAAA,EAAQ;AACf,IAAA,OAAO,SAAA,CAAU,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA;AAAA,EAC9B;AAEA,EAAA,MAAM,eAA0B,EAAC;AACjC,EAAA,KAAA,MAAW,KAAA,IAAS,KAAK,QAAA,EAAU;AACjC,IAAA,YAAA,CAAa,KAAK,iBAAA,CAAkB,KAAA,EAAO,SAAA,EAAW,OAAA,EAAS,MAAM,CAAC,CAAA;AAAA,EACxE;AAEA,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,KAAA,CAAM,OAAO,CAAA;AACxC,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,IAAA,CAAK,OAAO,CAAA;AAEvC,EAAA,IAAI,SAAS,KAAA,EAAO;AAClB,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,QAAA,EAAU;AACjC,MAAA,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,EAAA,EAAI,OAAO,CAAA;AAAA,IAC9B;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AAC7C,IAAA,IAAI,YAAA,CAAa,CAAC,CAAA,EAAG;AACnB,MAAA,MAAA,CAAO,IAAI,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA,CAAE,IAAI,OAAO,CAAA;AAAA,IACzC;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AAIA,IAAM,WAAA,GAAc,EAAA;AACpB,IAAM,YAAA,GAAe,EAAA;AACrB,IAAM,aAAA,GAAgB,EAAA;AACtB,IAAM,WAAA,GAAc,EAAA;AACpB,IAAM,cAAA,GAAiB,EAAA;AAEhB,SAAS,YAAY,GAAA,EAAsC;AAChE,EAAA,MAAM,MAAA,GAAS,aAAA,CAAc,GAAA,CAAI,IAAI,CAAA;AACrC,EAAA,MAAM,YAAY,MAAA,CAAO,MAAA;AACzB,EAAA,MAAM,UAAA,GAAa,WAAA;AAGnB,EAAA,MAAM,aAAA,GAAgB,KAAK,GAAA,CAAI,GAAG,OAAO,GAAA,CAAI,kBAAkB,GAAG,EAAE,CAAA;AACpE,EAAA,MAAM,OAAA,GAAU,YAAA,CAAa,GAAA,CAAI,IAAA,EAAM,CAAC,CAAA;AACxC,EAAA,MAAM,WAAA,GAAc,IAAI,IAAA,KAAS,WAAA;AAEjC,EAAA,MAAM,iBAAiB,IAAA,CAAK,GAAA,CAAI,KAAK,SAAA,GAAY,EAAA,GAAK,gBAAgB,GAAG,CAAA;AACzE,EAAA,MAAM,SAAA,GAAY,cAAA,GAAiB,YAAA,GAAe,aAAA,GAAgB,aAAA;AAElE,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI,WAAA,IAAe,YAAY,CAAA,EAAG;AAChC,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA;AAC/B,IAAA,KAAA,GAAQ,KAAA,GAAQ,CAAA,GAAI,SAAA,GAAY,KAAA,GAAQ,SAAA;AAAA,EAC1C,CAAA,MAAO;AACL,IAAA,KAAA,GAAQ,SAAA,GAAY,OAAA;AAAA,EACtB;AAGA,EAAA,MAAM,OAAA,uBAAc,GAAA,EAA6B;AACjD,EAAA,IAAI,OAAA,GAAU,CAAA;AAEd,EAAA,SAAS,YAAY,IAAA,EAAuB;AAC1C,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,MAAM,CAAA,GAAI,cAAc,OAAA,GAAU,UAAA;AAClC,MAAA,OAAA,CAAQ,GAAA,CAAI,KAAK,EAAA,EAAI,EAAE,MAAM,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA;AACtC,MAAA,OAAA,EAAA;AACA,MAAA;AAAA,IACF;AACA,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,QAAA,EAAU;AACjC,MAAA,WAAA,CAAY,KAAK,CAAA;AAAA,IACnB;AAAA,EACF;AACA,EAAA,WAAA,CAAY,IAAI,IAAI,CAAA;AAGpB,EAAA,SAAS,gBAAgB,IAAA,EAAyB;AAChD,IAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA;AACpC,IAAA,IAAI,IAAA,CAAK,MAAA,IAAU,QAAA,EAAU,OAAO,QAAA,CAAS,CAAA;AAC7C,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,eAAe,CAAA;AACjD,IAAA,MAAM,CAAA,GAAA,CAAK,IAAA,CAAK,GAAA,CAAI,GAAG,OAAO,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,OAAO,CAAA,IAAK,CAAA;AAC1D,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,OAAA,CAAQ,GAAA,CAAI,KAAK,EAAA,EAAI,EAAE,MAAM,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA;AAAA,IACxC,CAAA,MAAO;AACL,MAAA,QAAA,CAAS,CAAA,GAAI,CAAA;AAAA,IACf;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,eAAA,CAAgB,IAAI,IAAI,CAAA;AAGxB,EAAA,SAAS,OAAA,CAAQ,IAAA,EAAiB,OAAA,EAAiB,KAAA,EAAqB;AACtE,IAAA,IAAI,CAAA;AACJ,IAAA,IAAI,IAAA,KAAS,IAAI,IAAA,EAAM;AACrB,MAAA,CAAA,GAAI,YAAA;AAAA,IACN,WAAW,WAAA,EAAa;AACtB,MAAA,IAAI,KAAK,MAAA,EAAQ;AACf,QAAA,CAAA,GAAI,YAAA,GAAe,SAAA;AAAA,MACrB,CAAA,MAAO;AACL,QAAA,CAAA,GAAI,YAAA,GAAe,KAAA,IAAS,SAAA,GAAY,QAAA,CAAS,IAAI,IAAI,CAAA,CAAA;AAAA,MAC3D;AAAA,IACF,CAAA,MAAO;AACL,MAAA,CAAA,GAAI,OAAA,GAAA,CAAW,IAAA,CAAK,YAAA,IAAgB,CAAA,IAAK,KAAA;AAAA,IAC3C;AAEA,IAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA;AACtC,IAAA,IAAI,UAAA,aAAuB,CAAA,GAAI,CAAA;AAE/B,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,QAAA,EAAU;AACjC,MAAA,OAAA,CAAQ,KAAA,EAAO,CAAA,EAAG,KAAA,GAAQ,CAAC,CAAA;AAAA,IAC7B;AAAA,EACF;AACA,EAAA,OAAA,CAAQ,GAAA,CAAI,IAAA,EAAM,YAAA,EAAc,CAAC,CAAA;AAGjC,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,wBAAA,CAAyB,GAAA,CAAI,MAAM,OAAO,CAAA;AAAA,EAC5C;AAGA,EAAA,MAAM,QAAA,GAAW,cAAc,GAAG,CAAA;AAGlC,EAAA,MAAM,WAA0B,EAAC;AAEjC,EAAA,SAAS,iBAAiB,IAAA,EAAuB;AAC/C,IAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA;AACxC,IAAA,IAAI,CAAC,YAAA,EAAc;AAEnB,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AAEhC,IAAA,MAAM,eAAe,IAAA,CAAK,QAAA,CACvB,GAAA,CAAI,CAAC,MAAM,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,EAAE,CAAC,CAAA,CAC5B,MAAA,CAAO,CAAC,CAAA,KAA4B,MAAM,MAAS,CAAA;AAEtD,IAAA,IAAI,YAAA,CAAa,WAAW,CAAA,EAAG;AAG/B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,GAAG,YAAA,CAAa,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,CAAC,CAAC,CAAA;AACrD,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,GAAG,YAAA,CAAa,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,CAAC,CAAC,CAAA;AAErD,IAAA,IAAI,GAAA,CAAI,WAAW,SAAA,EAAW;AAE5B,MAAA,KAAA,MAAW,KAAA,IAAS,KAAK,QAAA,EAAU;AACjC,QAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,EAAE,CAAA;AACxC,QAAA,IAAI,CAAC,WAAA,EAAa;AAClB,QAAA,MAAM,OAAA,GAAU,CAAA,EAAA,EAAK,YAAA,CAAa,CAAC,CAAA,CAAA,EAAI,YAAA,CAAa,CAAC,CAAA,GAAA,EAAM,WAAA,CAAY,CAAC,CAAA,CAAA,EAAI,WAAA,CAAY,CAAC,CAAA,CAAA;AACzF,QAAA,QAAA,CAAS,IAAA,CAAK;AAAA,UACZ,IAAA,EAAM,OAAA;AAAA,UACN,QAAQ,IAAA,CAAK,EAAA;AAAA,UACb,MAAM,KAAA,CAAM,EAAA;AAAA,UACZ,OAAA,EAAS,QAAA,CAAS,GAAA,CAAI,KAAA,CAAM,EAAE,CAAA;AAAA,UAC9B,WAAA,EAAa;AAAA,SACd,CAAA;AAAA,MACH;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,QAAA,CAAS,IAAA,CAAK;AAAA,QACZ,MAAM,CAAA,EAAA,EAAK,YAAA,CAAa,CAAC,CAAA,CAAA,EAAI,IAAI,MAAM,IAAI,CAAA,CAAA;AAAA,QAC3C,QAAQ,IAAA,CAAK,EAAA;AAAA,QACb,MAAM,IAAA,CAAK,EAAA;AAAA,QACX,WAAA,EAAa;AAAA,OACd,CAAA;AAED,MAAA,KAAA,MAAW,KAAA,IAAS,KAAK,QAAA,EAAU;AACjC,QAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,EAAE,CAAA;AACxC,QAAA,IAAI,CAAC,WAAA,EAAa;AAClB,QAAA,MAAM,OAAA,GAAU,KAAK,YAAA,CAAa,CAAC,IAAI,WAAA,CAAY,CAAC,CAAA,GAAA,EAAM,WAAA,CAAY,CAAC,CAAA,CAAA;AACvE,QAAA,QAAA,CAAS,IAAA,CAAK;AAAA,UACZ,IAAA,EAAM,OAAA;AAAA,UACN,QAAQ,IAAA,CAAK,EAAA;AAAA,UACb,MAAM,KAAA,CAAM,EAAA;AAAA,UACZ,OAAA,EAAS,QAAA,CAAS,GAAA,CAAI,KAAA,CAAM,EAAE,CAAA;AAAA,UAC9B,WAAA,EAAa;AAAA,SACd,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,QAAA,EAAU;AACjC,MAAA,gBAAA,CAAiB,KAAK,CAAA;AAAA,IACxB;AAAA,EACF;AAEA,EAAA,gBAAA,CAAiB,IAAI,IAAI,CAAA;AAGzB,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AAC5C,EAAA,IAAI,OAAO,IAAA,CAAK,GAAA,CAAI,GAAG,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,CAAA,IAAK,CAAA,CAAE,KAAK,MAAA,GAAS,kBAAA,CAAmB,EAAE,IAAI,CAAA,GAAI,EAAE,CAAC,CAAA;AAGlG,EAAA,IAAI,kBAAA,GAAqB,CAAA;AACzB,EAAA,KAAA,MAAW,KAAA,IAAS,IAAI,MAAA,EAAQ;AAC9B,IAAA,IAAI,MAAM,KAAA,IAAS,KAAA,CAAM,SAAA,IAAa,KAAA,CAAM,cAAc,QAAA,EAAU;AAClE,MAAA,MAAM,CAAA,GAAI,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,EAAA;AACnC,MAAA,IAAI,CAAA,GAAI,oBAAoB,kBAAA,GAAqB,CAAA;AAAA,IACnD;AAAA,EACF;AACA,EAAA,IAAA,IAAQ,kBAAA;AAER,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,GAAG,QAAA,CAAS,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,CAAC,CAAC,CAAA;AAErD,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,IAAA,GAAO,eAAe,cAAc,CAAA;AAC3D,EAAA,MAAM,MAAA,GAAS,WAAW,WAAA,GAAc,cAAA;AAExC,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,MAAA;AAAA,IACA,KAAA,EAAO,QAAA;AAAA,IACP,QAAA;AAAA,IACA,GAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,wBAAA,CACP,MACA,OAAA,EACQ;AACR,EAAA,IAAI,KAAK,MAAA,EAAQ;AACf,IAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,EAAE,GAAG,CAAA,IAAK,CAAA;AAAA,EACpC;AAEA,EAAA,IAAI,SAAA,GAAY,QAAA;AAChB,EAAA,KAAA,MAAW,KAAA,IAAS,KAAK,QAAA,EAAU;AACjC,IAAA,MAAM,MAAA,GAAS,wBAAA,CAAyB,KAAA,EAAO,OAAO,CAAA;AACtD,IAAA,IAAI,MAAA,GAAS,WAAW,SAAA,GAAY,MAAA;AAAA,EACtC;AAEA,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA;AAClC,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,MAAA,CAAO,IAAI,SAAA,GAAY,EAAA;AACvB,IAAA,IAAI,MAAA,CAAO,CAAA,GAAI,YAAA,EAAc,MAAA,CAAO,CAAA,GAAI,YAAA;AAAA,EAC1C;AAEA,EAAA,OAAO,QAAQ,CAAA,IAAK,YAAA;AACtB;;;AC5SA,IAAM,aAAA,GAAgB,CAAA;AACtB,IAAM,iBAAA,GAAoB,EAAA;AAE1B,SAAS,eAAA,CAAgB,OAAe,CAAA,EAAyC;AAC/E,EAAA,IAAI,KAAA,IAAS,EAAA,EAAI,OAAO,CAAA,CAAE,WAAA;AAC1B,EAAA,IAAI,KAAA,IAAS,EAAA,EAAI,OAAO,CAAA,CAAE,aAAA;AAC1B,EAAA,IAAI,KAAA,IAAS,EAAA,EAAI,OAAO,CAAA,CAAE,WAAA;AAC1B,EAAA,OAAO,CAAA,CAAE,UAAA;AACX;AAEA,SAAS,kBAAkB,KAAA,EAAwB;AACjD,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,EAAK,CAAE,MAAM,KAAK,CAAA;AACtC,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA;AAC/B,EAAA,OAAO,eAAA,CAAgB,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,KAAK,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AACnE;AAIA,SAAS,QAAA,CAAS,KAAmB,CAAA,EAAyC;AAC5E,EAAA,MAAM,cAAc,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,CAAC,GAAG,CAAA,KAAM;AAC3C,IAAA,MAAM,KAAA,GAAQ,EAAE,KAAA,IAAS,CAAA,CAAE,YAAY,CAAA,GAAI,CAAA,CAAE,YAAY,MAAM,CAAA;AAC/D,IAAA,OAAO,CAAA,uBAAA,EAA0B,CAAA,CAAE,EAAE,CAAA,WAAA,EAAc,KAAK,CAAA;AAAA,0BAAA,EAChC,CAAA,CAAE,EAAE,CAAA,SAAA,EAAY,KAAK,CAAA;AAAA,6BAAA,EAClB,CAAA,CAAE,EAAE,CAAA,SAAA,EAAY,KAAK,CAAA,GAAA,CAAA;AAAA,EAClD,CAAC,CAAA;AAED,EAAA,OAAO;AAAA,kBAAA,EACWE,qCAAA,CAAoB,CAAC,CAAC;AAAA;AAAA;AAAA,8CAAA,EAGM,CAAA,CAAE,IAAI,CAAA,gBAAA,EAAmBC,8BAAA,CAAa,MAAM,CAAA;AAAA,wDAAA,EAClC,CAAA,CAAE,IAAI,CAAA,gBAAA,EAAmBA,8BAAA,CAAa,MAAM,CAAA;AAAA,wCAAA,EAC5DC,2BAAA,CAAU,KAAK,CAAA,UAAA,EAAa,CAAA,CAAE,IAAI,CAAA;AAAA;AAAA,4CAAA,EAE9BA,2BAAA,CAAU,KAAK,CAAA,UAAA,EAAa,CAAA,CAAE,SAAS,CAAA;AAAA;AAAA,0CAAA,EAEzC,CAAA,CAAE,IAAI,CAAA,gBAAA,EAAmBD,8BAAA,CAAa,MAAM,CAAA;AAAA,yDAAA,EAC7B,EAAE,IAAI,CAAA;AAAA,sCAAA,EACzB,CAAA,CAAE,IAAI,CAAA,gBAAA,EAAmBA,8BAAA,CAAa,IAAI,CAAA;AAAA,oCAAA,EAC5CC,2BAAA,CAAU,KAAK,CAAA,6BAAA,EAAgC,CAAA,CAAE,IAAI,CAAA;AAAA;AAAA,mDAAA,EAEtC,CAAA,CAAE,IAAI,CAAA,gBAAA,EAAmBD,8BAAA,CAAa,MAAM,CAAA;AAAA,EAC/F,WAAA,CAAY,IAAA,CAAK,IAAI,CAAC;AAAA,CAAA,CACtB,IAAA,EAAK;AACP;AAIA,SAAS,eAAA,CACP,OACA,SAAA,EACqD;AACrD,EAAA,IAAI,KAAA,IAAS,GAAG,OAAO,EAAE,QAAQ,GAAA,EAAK,KAAA,EAAO,KAAA,EAAO,QAAA,EAAU,EAAA,EAAG;AAEjE,EAAA,MAAM,WAAW,SAAA,GAAY,GAAA;AAE7B,EAAA,MAAM,aAAa,CAAC,IAAA,EAAO,IAAA,EAAO,IAAA,EAAO,MAAM,IAAA,EAAM,IAAA,EAAM,GAAA,EAAK,GAAA,EAAK,KAAK,CAAA,EAAG,CAAA,EAAG,GAAG,EAAA,EAAI,EAAA,EAAI,IAAI,GAAG,CAAA;AAClG,EAAA,IAAI,IAAA,GAAO,WAAW,CAAC,CAAA;AACvB,EAAA,IAAI,QAAA,GAAW,QAAA;AAEf,EAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAC1B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,QAAQ,QAAQ,CAAA;AAC1C,IAAA,IAAI,OAAO,QAAA,EAAU;AACnB,MAAA,QAAA,GAAW,IAAA;AACX,MAAA,IAAA,GAAO,CAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,IAAA;AAAA,IACR,OAAO,IAAA,GAAO,IAAA,GAAO,KAAK,aAAA,EAAc,GAAI,OAAO,IAAI,CAAA;AAAA,IACvD,UAAU,IAAA,GAAO;AAAA,GACnB;AACF;AAEA,SAAS,cAAA,CACP,MAAA,EACA,CAAA,EACA,UAAA,EACQ;AACR,EAAA,IAAI,MAAA,CAAO,GAAA,CAAI,IAAA,KAAS,WAAA,EAAa,OAAO,EAAA;AAE5C,EAAA,MAAM,SAAA,GAAY,OAAO,KAAA,GAAQ,EAAA;AACjC,EAAA,MAAM,GAAA,GAAM,eAAA,CAAgB,MAAA,CAAO,KAAA,EAAO,SAAS,CAAA;AACnD,EAAA,IAAI,GAAA,CAAI,QAAA,GAAW,CAAA,EAAG,OAAO,EAAA;AAE7B,EAAA,MAAM,CAAA,GAAI,EAAA;AACV,EAAA,MAAM,CAAA,GAAI,OAAO,MAAA,GAAS,EAAA;AAE1B,EAAA,MAAM,QAAA,GAAW;AAAA,IACfP,sBAAA,CAAK,EAAE,EAAA,EAAI,CAAA,EAAG,IAAI,CAAA,EAAG,EAAA,EAAI,CAAA,GAAI,GAAA,CAAI,QAAA,EAAU,EAAA,EAAI,CAAA,EAAG,KAAA,EAAO,6BAA6B,CAAA;AAAA,IACtFA,sBAAA,CAAK,EAAE,EAAA,EAAI,CAAA,EAAG,IAAI,CAAA,GAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,GAAI,CAAA,EAAG,KAAA,EAAO,8BAA8B,CAAA;AAAA,IAChFA,uBAAK,EAAE,EAAA,EAAI,IAAI,GAAA,CAAI,QAAA,EAAU,IAAI,CAAA,GAAI,CAAA,EAAG,EAAA,EAAI,CAAA,GAAI,IAAI,QAAA,EAAU,EAAA,EAAI,IAAI,CAAA,EAAG,KAAA,EAAO,8BAA8B,CAAA;AAAA,IAC9GG,uBAAK,EAAE,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,WAAW,CAAA,EAAG,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,eAAe,QAAA,EAAU,KAAA,EAAO,2BAAA,EAA4B,EAAG,IAAI,KAAK;AAAA,GACrH;AAEA,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,QAAA,CAAS,IAAA;AAAA,MACPA,sBAAA;AAAA,QACE,EAAE,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,WAAW,CAAA,EAAG,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,eAAe,QAAA,EAAU,WAAA,EAAa,GAAA,EAAK,IAAA,EAAM,EAAE,SAAA,EAAU;AAAA,QACnG;AAAA;AACF,KACF;AAAA,EACF;AAEA,EAAA,OAAOM,uBAAA,CAAM,EAAE,KAAA,EAAO,2BAAA,IAA+B,QAAQ,CAAA;AAC/D;AAIA,SAAS,sBAAA,CAAuB,QAA2B,CAAA,EAA2C;AACpG,EAAA,MAAM,WAAqB,EAAC;AAE5B,EAAA,KAAA,IAAS,KAAK,CAAA,EAAG,EAAA,GAAK,OAAO,GAAA,CAAI,MAAA,CAAO,QAAQ,EAAA,EAAA,EAAM;AACpD,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,GAAA,CAAI,MAAA,CAAO,EAAE,CAAA;AAClC,IAAA,MAAM,EAAA,GAAK,MAAM,SAAA,IAAa,QAAA;AAC9B,IAAA,IAAI,OAAO,QAAA,EAAU;AAErB,IAAA,MAAM,WAAA,GAAc,OAAO,KAAA,CAAM,MAAA;AAAA,MAC/B,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,CAAK,MAAA,IAAU,MAAM,OAAA,CAAQ,QAAA,CAAS,CAAA,CAAE,IAAA,CAAK,EAAE;AAAA,KAC1D;AACA,IAAA,IAAI,WAAA,CAAY,WAAW,CAAA,EAAG;AAE9B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,GAAG,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,CAAC,CAAC,CAAA,GAAI,EAAA;AACxD,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,GAAG,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,CAAC,CAAC,CAAA,GAAI,EAAA;AACxD,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,GAAG,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,CAAC,CAAC,CAAA,GAAI,EAAA;AACxD,IAAA,MAAM,OAAO,IAAA,CAAK,GAAA,CAAI,GAAG,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,KAAM;AAC9C,MAAA,MAAM,MAAA,GAAA,CAAW,EAAE,IAAA,CAAK,KAAA,IAAS,EAAE,IAAA,CAAK,EAAA,EAAI,MAAA,GAAS,GAAA,GAAO,aAAA,GAAgB,CAAA;AAC5E,MAAA,OAAO,EAAE,CAAA,GAAI,MAAA;AAAA,IACf,CAAC,CAAC,CAAA;AAEF,IAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,IAAS,CAAA,CAAE,YAAY,EAAA,GAAK,CAAA,CAAE,YAAY,MAAM,CAAA;AAEpE,IAAA,QAAA,CAAS,IAAA;AAAA,MACPC,sBAAA,CAAK;AAAA,QACH,CAAA,EAAG,IAAA;AAAA,QACH,CAAA,EAAG,IAAA;AAAA,QACH,OAAO,IAAA,GAAO,IAAA;AAAA,QACd,QAAQ,IAAA,GAAO,IAAA;AAAA,QACf,EAAA,EAAI,CAAA;AAAA,QACJ,KAAA,EAAO,CAAA,kDAAA,EAAqD,KAAA,CAAM,EAAE,CAAA,CAAA;AAAA,QACpE,IAAA,EAAM,KAAA;AAAA,QACN,cAAA,EAAgB;AAAA,OACjB;AAAA,KACH;AAEA,IAAA,IAAI,MAAM,KAAA,EAAO;AACf,MAAA,QAAA,CAAS,IAAA;AAAA,QACPP,sBAAA;AAAA,UACE;AAAA,YACE,GAAG,IAAA,GAAO,CAAA;AAAA,YACV,CAAA,EAAA,CAAI,OAAO,IAAA,IAAQ,CAAA;AAAA,YACnB,KAAA,EAAO,CAAA,wDAAA,EAA2D,KAAA,CAAM,EAAE,CAAA,CAAA;AAAA,YAC1E,IAAA,EAAM,KAAA;AAAA,YACN,aAAA,EAAe,MAAA;AAAA,YACf,WAAA,EAAa,IAAA;AAAA,YACb,mBAAA,EAAqB;AAAA,WACvB;AAAA,UACA,KAAA,CAAM;AAAA;AACR,OACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,QAAA;AACT;AAIO,SAAS,YAAY,MAAA,EAAmC;AAC7D,EAAA,MAAM,EAAE,GAAA,EAAK,KAAA,EAAO,QAAA,EAAS,GAAI,MAAA;AACjC,EAAA,MAAM,CAAA,GAAIQ,qCAAA,CAAoB,GAAA,CAAI,QAAA,EAAU,SAAS,SAAS,CAAA;AAE9D,EAAA,MAAM,GAAA,GAAM,QAAA,CAAS,GAAA,EAAK,CAAC,CAAA;AAE3B,EAAA,MAAM,WAAA,GAAc,GAAA,CAAI,KAAA,GAAQ,EAAA,GAAK,CAAA;AACrC,EAAA,MAAM,WAAA,GAAc,OAAO,MAAA,GAAS,WAAA;AACpC,EAAA,MAAM,aAAa,MAAA,CAAO,KAAA;AAG1B,EAAA,MAAM,iBAA2B,EAAC;AAClC,EAAA,MAAM,eAAyB,EAAC;AAChC,EAAA,MAAM,gBAA0B,EAAC;AAGjC,EAAA,KAAA,MAAW,UAAU,QAAA,EAAU;AAC7B,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,OAAA,GACpB,GAAA,CAAI,MAAA,CAAO,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,MAAA,CAAO,OAAO,CAAA,GACnD,EAAA;AACJ,IAAA,MAAM,UAAA,GACJ,QAAA,IAAY,CAAA,GACR,GAAA,CAAI,OAAO,QAAQ,CAAA,CAAE,KAAA,IAAS,CAAA,CAAE,WAAA,CAAY,QAAA,GAAW,CAAA,CAAE,WAAA,CAAY,MAAM,CAAA,GAC3E,MAAA;AAEN,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,WAAA,GACf,yDAAA,GACA,CAAA,sDAAA,EAAyD,MAAA,CAAO,OAAA,GAAU,CAAA,uBAAA,EAA0B,MAAA,CAAO,OAAO,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA;AAE7H,IAAA,MAAM,KAAA,GAAqD;AAAA,MACzD,GAAG,MAAA,CAAO,IAAA;AAAA,MACV,KAAA,EAAO;AAAA,KACT;AACA,IAAA,IAAI,UAAA,IAAc,CAAC,MAAA,CAAO,WAAA,EAAa;AACrC,MAAA,KAAA,CAAM,MAAA,GAAS,UAAA;AAAA,IACjB;AAEA,IAAA,cAAA,CAAe,IAAA,CAAKC,sBAAA,CAAK,KAAK,CAAC,CAAA;AAAA,EACjC;AAGA,EAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,IAAI,IAAI,CAAA;AAGxD,EAAA,IAAI,UAAA,IAAc,CAAC,GAAA,CAAI,QAAA,EAAU;AAC/B,IAAA,YAAA,CAAa,IAAA;AAAA,MACXC,wBAAA,CAAO;AAAA,QACL,IAAI,UAAA,CAAW,CAAA;AAAA,QACf,IAAI,UAAA,CAAW,CAAA;AAAA,QACf,CAAA,EAAG,CAAA;AAAA,QACH,KAAA,EAAO;AAAA,OACR;AAAA,KACH;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,cAAc,KAAA,EAAO;AAC9B,IAAA,MAAM,EAAE,IAAA,EAAM,CAAA,EAAG,CAAA,EAAE,GAAI,UAAA;AAGvB,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,YAAY,MAAA,EAAW;AAC9C,MAAA,MAAM,UAAU,IAAA,CAAK,OAAA,GAAU,IAAI,IAAA,CAAK,OAAA,GAAU,KAAK,OAAA,GAAU,GAAA;AACjE,MAAA,IAAI,WAAW,iBAAA,EAAmB;AAChC,QAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,OAAA,EAAS,CAAC,CAAA;AACxC,QAAA,YAAA,CAAa,IAAA;AAAA,UACXA,wBAAA,CAAO;AAAA,YACL,EAAA,EAAI,CAAA;AAAA,YACJ,EAAA,EAAI,CAAA;AAAA,YACJ,CAAA,EAAG,CAAA;AAAA,YACH,KAAA,EAAO,6BAAA;AAAA,YACP,IAAA,EAAM;AAAA,WACP;AAAA,SACH;AACA,QAAA,aAAA,CAAc,IAAA;AAAA,UACZV,sBAAA;AAAA,YACE,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,OAAO,+BAAA,EAAgC;AAAA,YACtD,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,OAAO,CAAC;AAAA;AAC5B,SACF;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,IAAS,IAAA,CAAK,EAAA;AACjC,MAAA,MAAM,MAAA,GAAS,kBAAkB,KAAK,CAAA;AACtC,MAAA,MAAM,GAAA,GAAM,CAAA,yBAAA,EAA4B,MAAA,GAAS,mCAAA,GAAsC,EAAE,CAAA,CAAA;AAEzF,MAAA,aAAA,CAAc,IAAA;AAAA,QACZA,sBAAA;AAAA,UACE;AAAA,YACE,GAAG,CAAA,GAAI,aAAA;AAAA,YACP,CAAA;AAAA,YACA,KAAA,EAAO,GAAA;AAAA,YACP,YAAA,EAAc,SAAS,QAAA,GAAW,MAAA;AAAA,YAClC,iBAAiB,IAAA,CAAK;AAAA,WACxB;AAAA,UACA;AAAA;AACF,OACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,eAAA,GAAkB,sBAAA,CAAuB,MAAA,EAAQ,CAAC,CAAA;AAGxD,EAAA,MAAM,UAAA,GAAa,cAAA,CAAe,MAAA,EAAQ,CAAA,EAAG,IAAI,UAAU,CAAA;AAG3D,EAAA,MAAM,OAAA,GAAU,IAAI,KAAA,GAChBA,sBAAA;AAAA,IACE,EAAE,CAAA,EAAG,UAAA,GAAa,GAAG,CAAA,EAAG,EAAA,EAAI,OAAO,uBAAA,EAAwB;AAAA,IAC3D,GAAA,CAAI;AAAA,GACN,GACA,EAAA;AAGJ,EAAA,MAAM,SAAA,GAAY,MAAM,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,IAAA,CAAK,MAAM,CAAA,CAAE,MAAA;AACrD,EAAA,MAAM,UAAA,GAAa;AAAA,IACjBC,uBAAA,CAAM,oBAAoB,GAAA,CAAI,KAAA,GAAQ,KAAK,GAAA,CAAI,KAAK,CAAA,CAAA,GAAK,EAAE,CAAA,CAAE,CAAA;AAAA,IAC7DU,sBAAA,CAAK,0BAA0B,SAAS,CAAA,OAAA,EAAU,IAAI,IAAI,CAAA,OAAA,EAAU,GAAA,CAAI,MAAM,CAAA,OAAA,CAAS,CAAA;AAAA,IACvFC,oBAAA,CAAG,OAAA,EAAS,EAAC,EAAG,GAAG;AAAA,GACrB;AAEA,EAAA,IAAI,OAAA,EAAS,UAAA,CAAW,IAAA,CAAK,OAAO,CAAA;AAEpC,EAAA,MAAM,UAAA,GAAa,WAAA;AAEnB,EAAA,IAAI,eAAA,CAAgB,SAAS,CAAA,EAAG;AAC9B,IAAA,UAAA,CAAW,IAAA;AAAA,MACTN,uBAAA;AAAA,QACE,EAAE,OAAO,kCAAA,EAAoC,SAAA,EAAW,aAAa,CAAA,YAAA,EAAe,UAAU,MAAM,MAAA,EAAU;AAAA,QAC9G;AAAA;AACF,KACF;AAAA,EACF;AAEA,EAAA,UAAA,CAAW,IAAA;AAAA,IACTA,uBAAA;AAAA,MACE,EAAE,OAAO,0BAAA,EAA4B,SAAA,EAAW,aAAa,CAAA,YAAA,EAAe,UAAU,MAAM,MAAA,EAAU;AAAA,MACtG;AAAA;AACF,GACF;AAEA,EAAA,UAAA,CAAW,IAAA;AAAA,IACTA,uBAAA;AAAA,MACE,EAAE,OAAO,uBAAA,EAAyB,SAAA,EAAW,aAAa,CAAA,YAAA,EAAe,UAAU,MAAM,MAAA,EAAU;AAAA,MACnG;AAAA;AACF,GACF;AAEA,EAAA,UAAA,CAAW,IAAA;AAAA,IACTA,uBAAA;AAAA,MACE,EAAE,OAAO,wBAAA,EAA0B,SAAA,EAAW,aAAa,CAAA,YAAA,EAAe,UAAU,MAAM,MAAA,EAAU;AAAA,MACpG;AAAA;AACF,GACF;AAEA,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,UAAA,CAAW,IAAA;AAAA,MACTA,uBAAA;AAAA,QACE,EAAE,SAAA,EAAW,UAAA,GAAa,CAAA,YAAA,EAAe,UAAU,MAAM,MAAA,EAAU;AAAA,QACnE,CAAC,UAAU;AAAA;AACb,KACF;AAAA,EACF;AAEA,EAAA,OAAOO,yBAAA;AAAA,IACL;AAAA,MACE,KAAA,EAAO,mCAAA;AAAA,MACP,OAAA,EAAS,CAAA,IAAA,EAAO,UAAU,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA;AAAA,MACzC,KAAA,EAAO,UAAA;AAAA,MACP,MAAA,EAAQ;AAAA,KACV;AAAA,IACA;AAAA,GACF;AACF;;;ACrWO,IAAM,KAAA,GAAuB;AAAA,EAClC,IAAA,EAAM,OAAA;AAAA,EAEN,OAAOb,KAAAA,EAAuB;AAC5B,IAAA,MAAM,SAAA,GAAYA,KAAAA,CAAK,IAAA,EAAK,CAAE,KAAA,CAAM,IAAI,CAAA,CAAE,CAAC,CAAA,EAAG,IAAA,EAAK,CAAE,WAAA,EAAY,IAAK,EAAA;AACtE,IAAA,OAAO,SAAA,KAAc,OAAA,IAAW,SAAA,CAAU,UAAA,CAAW,QAAQ,CAAA;AAAA,EAC/D,CAAA;AAAA,EAEA,KAAA,EAAO,UAAA;AAAA,EAEP,OAAOA,KAAAA,EAAsB;AAC3B,IAAA,MAAM,GAAA,GAAM,WAAWA,KAAI,CAAA;AAC3B,IAAA,MAAM,MAAA,GAAS,YAAY,GAAG,CAAA;AAC9B,IAAA,OAAO,YAAY,MAAM,CAAA;AAAA,EAC3B;AACF","file":"chunk-S2CHBZ4A.cjs","sourcesContent":["import type {\n PhyloTreeAST,\n PhyloNode,\n PhyloLayout,\n PhyloMode,\n CladeDef,\n CladeHighlightMode,\n} from \"../../core/types\";\nimport { matchQuotedTitle } from \"../../core/quotes\";\n\nexport class PhyloParseError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"PhyloParseError\";\n }\n}\n\n// ─── Newick Parser ──────────────────────────────────────────\n\nlet _pos = 0;\nlet _src = \"\";\nlet _nextId = 0;\n\nfunction genId(): string {\n return `_n${_nextId++}`;\n}\n\nfunction peek(): string {\n return _src[_pos] ?? \"\";\n}\n\nfunction advance(): string {\n return _src[_pos++] ?? \"\";\n}\n\nfunction skipWhitespace(): void {\n while (_pos < _src.length && /\\s/.test(_src[_pos])) _pos++;\n}\n\nfunction parseNewickName(): string {\n skipWhitespace();\n if (peek() === \"'\") {\n advance();\n let name = \"\";\n while (_pos < _src.length) {\n if (peek() === \"'\") {\n advance();\n if (peek() === \"'\") {\n name += \"'\";\n advance();\n } else {\n break;\n }\n } else {\n name += advance();\n }\n }\n return name;\n }\n let name = \"\";\n while (_pos < _src.length && !/[\\s():,;[\\]']/.test(_src[_pos])) {\n name += advance();\n }\n return name;\n}\n\nfunction parseNewickLength(): number | undefined {\n skipWhitespace();\n if (peek() !== \":\") return undefined;\n advance();\n skipWhitespace();\n let numStr = \"\";\n while (_pos < _src.length && /[0-9eE.+-]/.test(_src[_pos])) {\n numStr += advance();\n }\n if (!numStr) return undefined;\n const val = Number(numStr);\n return Number.isNaN(val) ? undefined : val;\n}\n\nfunction parseNHX(): { support?: number; nhx?: Record<string, string> } | undefined {\n skipWhitespace();\n if (peek() !== \"[\") return undefined;\n const start = _pos;\n advance();\n let content = \"\";\n let depth = 1;\n while (_pos < _src.length && depth > 0) {\n if (peek() === \"[\") depth++;\n if (peek() === \"]\") depth--;\n if (depth > 0) content += advance();\n else advance();\n }\n if (content.startsWith(\"&&NHX:\")) {\n const pairs = content.slice(6).split(\":\");\n const nhx: Record<string, string> = {};\n let support: number | undefined;\n for (const pair of pairs) {\n const eq = pair.indexOf(\"=\");\n if (eq === -1) continue;\n const key = pair.slice(0, eq);\n const val = pair.slice(eq + 1);\n nhx[key] = val;\n if (key === \"B\") {\n const num = Number(val);\n if (!Number.isNaN(num)) support = num;\n }\n }\n return { support, nhx };\n }\n // Plain bootstrap value in brackets like [95]\n const num = Number(content.trim());\n if (!Number.isNaN(num) && content.trim().length > 0) {\n return { support: num };\n }\n // Unknown bracket content — rewind\n _pos = start;\n return undefined;\n}\n\nfunction parseNewickSubtree(): PhyloNode {\n skipWhitespace();\n let children: PhyloNode[] = [];\n\n if (peek() === \"(\") {\n advance();\n children = [];\n children.push(parseNewickSubtree());\n skipWhitespace();\n while (peek() === \",\") {\n advance();\n children.push(parseNewickSubtree());\n skipWhitespace();\n }\n skipWhitespace();\n if (peek() === \")\") advance();\n }\n\n const name = parseNewickName();\n const nhxData = parseNHX();\n const branchLength = parseNewickLength();\n // NHX can also appear after length\n const nhxData2 = nhxData ? undefined : parseNHX();\n const merged = nhxData ?? nhxData2;\n\n const isLeaf = children.length === 0;\n const id = name || genId();\n\n return {\n id,\n label: name || undefined,\n branchLength,\n support: merged?.support,\n children,\n isLeaf,\n nhx: merged?.nhx,\n };\n}\n\nexport function parseNewick(newick: string): PhyloNode {\n _pos = 0;\n _src = newick.trim();\n _nextId = 0;\n\n if (_src.endsWith(\";\")) {\n _src = _src.slice(0, -1);\n }\n\n const root = parseNewickSubtree();\n return root;\n}\n\n// ─── Indent DSL Parser ──────────────────────────────────────\n\ninterface IndentLine {\n indent: number;\n name: string;\n branchLength?: number;\n support?: number;\n}\n\nfunction parseIndentTree(lines: string[]): PhyloNode {\n _nextId = 0;\n const parsed: IndentLine[] = [];\n\n for (const raw of lines) {\n if (!raw.trim() || raw.trim().startsWith(\"#\")) continue;\n const indent = raw.search(/\\S/);\n const content = raw.trim();\n\n let name: string;\n let branchLength: number | undefined;\n let support: number | undefined;\n\n // Check for support value [N]\n let contentClean = content;\n const supportMatch = contentClean.match(/\\[(\\d+(?:\\.\\d+)?)\\]\\s*$/);\n if (supportMatch) {\n support = Number(supportMatch[1]);\n contentClean = contentClean.slice(0, supportMatch.index).trim();\n }\n\n // \"Name: length\" or \":length\" or \"Name:\" or \"Name\"\n const colonIdx = contentClean.indexOf(\":\");\n if (colonIdx === -1) {\n name = contentClean;\n } else {\n name = contentClean.slice(0, colonIdx).trim();\n const lenStr = contentClean.slice(colonIdx + 1).trim();\n if (lenStr) {\n const num = Number(lenStr);\n if (!Number.isNaN(num)) branchLength = num;\n }\n }\n\n parsed.push({ indent, name, branchLength, support });\n }\n\n if (parsed.length === 0) {\n throw new PhyloParseError(\"Empty indent tree definition\");\n }\n\n function buildTree(startIdx: number, parentIndent: number): { node: PhyloNode; nextIdx: number } {\n const line = parsed[startIdx];\n const children: PhyloNode[] = [];\n let idx = startIdx + 1;\n\n while (idx < parsed.length && parsed[idx].indent > parentIndent) {\n if (parsed[idx].indent === line.indent + 2 || parsed[idx].indent > line.indent) {\n const childIndent = parsed[idx].indent;\n const result = buildTree(idx, childIndent);\n children.push(result.node);\n idx = result.nextIdx;\n } else {\n break;\n }\n }\n\n const id = line.name || genId();\n return {\n node: {\n id,\n label: line.name || undefined,\n branchLength: line.branchLength,\n support: line.support,\n children,\n isLeaf: children.length === 0,\n },\n nextIdx: idx,\n };\n }\n\n // Build from the first line\n const rootLine = parsed[0];\n const rootIndent = rootLine.indent;\n const children: PhyloNode[] = [];\n let idx = 1;\n\n while (idx < parsed.length) {\n if (parsed[idx].indent > rootIndent) {\n const result = buildTree(idx, parsed[idx].indent);\n children.push(result.node);\n idx = result.nextIdx;\n } else {\n break;\n }\n }\n\n const rootId = rootLine.name || genId();\n return {\n id: rootId,\n label: rootLine.name || undefined,\n branchLength: rootLine.branchLength,\n support: rootLine.support,\n children,\n isLeaf: children.length === 0,\n };\n}\n\n// ─── Main Document Parser ───────────────────────────────────\n\nfunction parseHeaderProps(propsStr: string): {\n layout: PhyloLayout;\n mode: PhyloMode;\n unrooted: boolean;\n branchWidth?: number;\n openAngle?: number;\n mrsd?: string;\n} {\n const result: ReturnType<typeof parseHeaderProps> = {\n layout: \"rectangular\",\n mode: \"phylogram\",\n unrooted: false,\n };\n\n const pairs = propsStr.split(\",\").map((s) => s.trim());\n for (const pair of pairs) {\n if (pair === \"unrooted\") {\n result.unrooted = true;\n continue;\n }\n const colonIdx = pair.indexOf(\":\");\n if (colonIdx === -1) continue;\n const key = pair.slice(0, colonIdx).trim();\n const val = pair.slice(colonIdx + 1).trim().replace(/^[\"']|[\"']$/g, \"\");\n\n switch (key) {\n case \"layout\":\n if ([\"rectangular\", \"slanted\", \"circular\", \"unrooted\"].includes(val)) {\n result.layout = val as PhyloLayout;\n }\n break;\n case \"mode\":\n if ([\"phylogram\", \"cladogram\", \"chronogram\"].includes(val)) {\n result.mode = val as PhyloMode;\n }\n break;\n case \"branch-width\":\n result.branchWidth = Number(val);\n break;\n case \"openAngle\":\n result.openAngle = Number(val);\n break;\n case \"mrsd\":\n result.mrsd = val;\n break;\n }\n }\n\n if (result.layout === \"unrooted\") {\n result.unrooted = true;\n }\n\n return result;\n}\n\nfunction parseCladeLine(line: string): CladeDef | null {\n // clade ID = (member1, member2, ...) [color: \"#hex\", label: \"text\", highlight: mode]\n const match = line.match(\n /^clade\\s+(\\S+)\\s*=\\s*\\(([^)]+)\\)\\s*(?:\\[([^\\]]*)\\])?\\s*$/\n );\n if (!match) return null;\n\n const id = match[1];\n const members = match[2].split(\",\").map((s) => s.trim()).filter(Boolean);\n const propsStr = match[3] ?? \"\";\n\n let color: string | undefined;\n let label: string | undefined;\n let highlight: CladeHighlightMode | undefined;\n\n if (propsStr) {\n const colorMatch = propsStr.match(/color:\\s*\"([^\"]+)\"/);\n if (colorMatch) color = colorMatch[1];\n const labelMatch = propsStr.match(/label:\\s*\"([^\"]+)\"/);\n if (labelMatch) label = labelMatch[1];\n const hlMatch = propsStr.match(/highlight:\\s*(\\w+)/);\n if (hlMatch && [\"branch\", \"background\", \"both\"].includes(hlMatch[1])) {\n highlight = hlMatch[1] as CladeHighlightMode;\n }\n }\n\n return { id, members, color, label, highlight };\n}\n\nexport function parsePhylo(text: string): PhyloTreeAST {\n const lines = text.split(\"\\n\");\n let lineIdx = 0;\n\n // Skip empty lines\n while (lineIdx < lines.length && !lines[lineIdx].trim()) lineIdx++;\n\n // Parse header: phylo \"title\" [props]\n const headerLine = lines[lineIdx]?.trim() ?? \"\";\n if (!headerLine.toLowerCase().startsWith(\"phylo\")) {\n throw new PhyloParseError(\"Phylo document must start with 'phylo'\");\n }\n lineIdx++;\n\n const title: string | undefined = matchQuotedTitle(headerLine);\n\n let headerProps: ReturnType<typeof parseHeaderProps> = {\n layout: \"rectangular\",\n mode: \"phylogram\",\n unrooted: false,\n };\n const propsMatch = headerLine.match(/\\[([^\\]]+)\\]/);\n if (propsMatch) {\n headerProps = parseHeaderProps(propsMatch[1]);\n }\n\n // Parse body: newick, indent tree, scale, outgroup, clade definitions\n let root: PhyloNode | null = null;\n let scaleLabel: string | undefined;\n let outgroup: string | undefined;\n const clades: CladeDef[] = [];\n const indentLines: string[] = [];\n let inIndentTree = false;\n\n while (lineIdx < lines.length) {\n const raw = lines[lineIdx];\n const trimmed = raw.trim();\n lineIdx++;\n\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n\n // Newick definition\n if (trimmed.startsWith(\"newick:\")) {\n const newickStr = trimmed.slice(7).trim().replace(/^[\"']|[\"']$/g, \"\");\n root = parseNewick(newickStr);\n inIndentTree = false;\n continue;\n }\n\n // Scale definition\n if (trimmed.startsWith(\"scale\")) {\n const scaleMatch = trimmed.match(/scale\\s+\"([^\"]+)\"/);\n if (scaleMatch) {\n scaleLabel = scaleMatch[1];\n } else {\n scaleLabel = trimmed.slice(5).trim().replace(/^[\"']|[\"']$/g, \"\") || \"substitutions/site\";\n }\n continue;\n }\n\n // Outgroup\n if (trimmed.startsWith(\"outgroup:\")) {\n outgroup = trimmed.slice(9).trim();\n continue;\n }\n\n // Clade definition\n if (trimmed.startsWith(\"clade \")) {\n const clade = parseCladeLine(trimmed);\n if (clade) clades.push(clade);\n continue;\n }\n\n // Style line (alternative props)\n if (trimmed.startsWith(\"style\")) {\n const styleProps = trimmed.match(/\\[([^\\]]+)\\]/);\n if (styleProps) {\n headerProps = { ...headerProps, ...parseHeaderProps(styleProps[1]) };\n }\n continue;\n }\n\n // Indent tree definition\n if (trimmed.endsWith(\":\") && (trimmed === \"root:\" || !trimmed.includes(\" \"))) {\n inIndentTree = true;\n indentLines.push(raw);\n continue;\n }\n\n if (inIndentTree) {\n indentLines.push(raw);\n continue;\n }\n }\n\n // Parse indent tree if present and no Newick was found\n if (!root && indentLines.length > 0) {\n root = parseIndentTree(indentLines);\n }\n\n if (!root) {\n throw new PhyloParseError(\"No tree definition found (newick: or indent tree)\");\n }\n\n return {\n type: \"phylo\",\n title,\n root,\n unrooted: headerProps.unrooted,\n layout: headerProps.layout,\n mode: headerProps.mode,\n clades,\n scaleLabel,\n mrsd: headerProps.mrsd,\n outgroup,\n metadata: {},\n };\n}\n","import type {\n PhyloTreeAST,\n PhyloNode,\n PhyloLayoutNode,\n} from \"../../core/types\";\n\nexport interface PhyloLayoutResult {\n width: number;\n height: number;\n nodes: PhyloLayoutNode[];\n /** Branch paths: { path, cladeId?, isConnector } */\n branches: PhyloBranch[];\n ast: PhyloTreeAST;\n scale: number;\n}\n\nexport interface PhyloBranch {\n path: string;\n fromId: string;\n toId: string;\n /** Clade id if this branch belongs to a highlighted clade */\n cladeId?: string;\n /** Is this a vertical/arc connector (no length meaning) vs horizontal branch */\n isConnector: boolean;\n}\n\n// ─── Tree Utilities ─────────────────────────────────────────\n\nfunction collectLeaves(node: PhyloNode): PhyloNode[] {\n if (node.isLeaf) return [node];\n const leaves: PhyloNode[] = [];\n for (const child of node.children) {\n leaves.push(...collectLeaves(child));\n }\n return leaves;\n}\n\nfunction maxRootToTip(node: PhyloNode, distSoFar: number): number {\n if (node.isLeaf) return distSoFar;\n let maxDist = distSoFar;\n for (const child of node.children) {\n const childDist = maxRootToTip(child, distSoFar + (child.branchLength ?? 0));\n if (childDist > maxDist) maxDist = childDist;\n }\n return maxDist;\n}\n\nfunction maxDepth(node: PhyloNode): number {\n if (node.isLeaf) return 0;\n let max = 0;\n for (const child of node.children) {\n const d = maxDepth(child) + 1;\n if (d > max) max = d;\n }\n return max;\n}\n\nfunction estimateLabelWidth(node: PhyloNode): number {\n const label = node.label ?? node.id;\n return label.length * 7.2 + 6;\n}\n\n// ─── Clade Membership ───────────────────────────────────────\n\nfunction buildCladeMap(\n ast: PhyloTreeAST\n): Map<string, string> {\n const branchToCladeMap = new Map<string, string>();\n\n for (const clade of ast.clades) {\n const memberSet = new Set(clade.members);\n markCladeBranches(ast.root, memberSet, clade.id, branchToCladeMap);\n }\n\n return branchToCladeMap;\n}\n\nfunction markCladeBranches(\n node: PhyloNode,\n memberSet: Set<string>,\n cladeId: string,\n result: Map<string, string>\n): boolean {\n if (node.isLeaf) {\n return memberSet.has(node.id);\n }\n\n const childResults: boolean[] = [];\n for (const child of node.children) {\n childResults.push(markCladeBranches(child, memberSet, cladeId, result));\n }\n\n const allIn = childResults.every(Boolean);\n const anyIn = childResults.some(Boolean);\n\n if (allIn && anyIn) {\n for (const child of node.children) {\n result.set(child.id, cladeId);\n }\n return true;\n }\n\n // Partial — mark only children that are fully within\n for (let i = 0; i < node.children.length; i++) {\n if (childResults[i]) {\n result.set(node.children[i].id, cladeId);\n }\n }\n\n return false;\n}\n\n// ─── Rectangular Phylogram Layout ───────────────────────────\n\nconst TIP_SPACING = 20;\nconst PADDING_LEFT = 20;\nconst PADDING_RIGHT = 20;\nconst PADDING_TOP = 20;\nconst PADDING_BOTTOM = 40;\n\nexport function layoutPhylo(ast: PhyloTreeAST): PhyloLayoutResult {\n const leaves = collectLeaves(ast.root);\n const numLeaves = leaves.length;\n const tipSpacing = TIP_SPACING;\n\n // Compute scale\n const maxLabelWidth = Math.max(...leaves.map(estimateLabelWidth), 60);\n const maxDist = maxRootToTip(ast.root, 0);\n const isCladogram = ast.mode === \"cladogram\";\n\n const availableWidth = Math.max(300, numLeaves * 30 + maxLabelWidth + 100);\n const plotWidth = availableWidth - PADDING_LEFT - PADDING_RIGHT - maxLabelWidth;\n\n let scale: number;\n if (isCladogram || maxDist === 0) {\n const depth = maxDepth(ast.root);\n scale = depth > 0 ? plotWidth / depth : plotWidth;\n } else {\n scale = plotWidth / maxDist;\n }\n\n // Step 1: assign Y to leaves (in-order)\n const nodeMap = new Map<string, PhyloLayoutNode>();\n let leafIdx = 0;\n\n function assignLeafY(node: PhyloNode): void {\n if (node.isLeaf) {\n const y = PADDING_TOP + leafIdx * tipSpacing;\n nodeMap.set(node.id, { node, x: 0, y });\n leafIdx++;\n return;\n }\n for (const child of node.children) {\n assignLeafY(child);\n }\n }\n assignLeafY(ast.root);\n\n // Step 2: assign Y to internal nodes (mean of children)\n function assignInternalY(node: PhyloNode): number {\n const existing = nodeMap.get(node.id);\n if (node.isLeaf && existing) return existing.y;\n const childYs = node.children.map(assignInternalY);\n const y = (Math.min(...childYs) + Math.max(...childYs)) / 2;\n if (!existing) {\n nodeMap.set(node.id, { node, x: 0, y });\n } else {\n existing.y = y;\n }\n return y;\n }\n assignInternalY(ast.root);\n\n // Step 3: assign X (distance from root)\n function assignX(node: PhyloNode, parentX: number, depth: number): void {\n let x: number;\n if (node === ast.root) {\n x = PADDING_LEFT;\n } else if (isCladogram) {\n if (node.isLeaf) {\n x = PADDING_LEFT + plotWidth;\n } else {\n x = PADDING_LEFT + depth * (plotWidth / maxDepth(ast.root));\n }\n } else {\n x = parentX + (node.branchLength ?? 0) * scale;\n }\n\n const layoutNode = nodeMap.get(node.id);\n if (layoutNode) layoutNode.x = x;\n\n for (const child of node.children) {\n assignX(child, x, depth + 1);\n }\n }\n assignX(ast.root, PADDING_LEFT, 0);\n\n // For cladogram: recalculate internal node X as parent of children\n if (isCladogram) {\n assignCladogramInternalX(ast.root, nodeMap);\n }\n\n // Build clade membership map\n const cladeMap = buildCladeMap(ast);\n\n // Step 4: generate branch paths\n const branches: PhyloBranch[] = [];\n\n function generateBranches(node: PhyloNode): void {\n const parentLayout = nodeMap.get(node.id);\n if (!parentLayout) return;\n\n if (node.children.length === 0) return;\n\n const childLayouts = node.children\n .map((c) => nodeMap.get(c.id))\n .filter((l): l is PhyloLayoutNode => l !== undefined);\n\n if (childLayouts.length === 0) return;\n\n // Vertical connector from min child Y to max child Y at parent X\n const minY = Math.min(...childLayouts.map((c) => c.y));\n const maxY = Math.max(...childLayouts.map((c) => c.y));\n\n if (ast.layout === \"slanted\") {\n // Slanted: diagonal lines from parent to each child\n for (const child of node.children) {\n const childLayout = nodeMap.get(child.id);\n if (!childLayout) continue;\n const pathStr = `M ${parentLayout.x},${parentLayout.y} L ${childLayout.x},${childLayout.y}`;\n branches.push({\n path: pathStr,\n fromId: node.id,\n toId: child.id,\n cladeId: cladeMap.get(child.id),\n isConnector: false,\n });\n }\n } else {\n // Rectangular: vertical connector + horizontal branches\n branches.push({\n path: `M ${parentLayout.x},${minY} V ${maxY}`,\n fromId: node.id,\n toId: node.id,\n isConnector: true,\n });\n\n for (const child of node.children) {\n const childLayout = nodeMap.get(child.id);\n if (!childLayout) continue;\n const pathStr = `M ${parentLayout.x},${childLayout.y} H ${childLayout.x}`;\n branches.push({\n path: pathStr,\n fromId: node.id,\n toId: child.id,\n cladeId: cladeMap.get(child.id),\n isConnector: false,\n });\n }\n }\n\n for (const child of node.children) {\n generateBranches(child);\n }\n }\n\n generateBranches(ast.root);\n\n // Compute final dimensions\n const allNodes = Array.from(nodeMap.values());\n let maxX = Math.max(...allNodes.map((n) => n.x + (n.node.isLeaf ? estimateLabelWidth(n.node) : 0)));\n\n // Add space for clade labels (background/both mode places labels to the right)\n let maxCladeLabelWidth = 0;\n for (const clade of ast.clades) {\n if (clade.label && clade.highlight && clade.highlight !== \"branch\") {\n const w = clade.label.length * 8 + 30;\n if (w > maxCladeLabelWidth) maxCladeLabelWidth = w;\n }\n }\n maxX += maxCladeLabelWidth;\n\n const maxNodeY = Math.max(...allNodes.map((n) => n.y));\n\n const width = Math.max(maxX + PADDING_RIGHT, availableWidth);\n const height = maxNodeY + PADDING_TOP + PADDING_BOTTOM;\n\n return {\n width,\n height,\n nodes: allNodes,\n branches,\n ast,\n scale,\n };\n}\n\nfunction assignCladogramInternalX(\n node: PhyloNode,\n nodeMap: Map<string, PhyloLayoutNode>\n): number {\n if (node.isLeaf) {\n return nodeMap.get(node.id)?.x ?? 0;\n }\n\n let minChildX = Infinity;\n for (const child of node.children) {\n const childX = assignCladogramInternalX(child, nodeMap);\n if (childX < minChildX) minChildX = childX;\n }\n\n const layout = nodeMap.get(node.id);\n if (layout) {\n layout.x = minChildX - 40;\n if (layout.x < PADDING_LEFT) layout.x = PADDING_LEFT;\n }\n\n return layout?.x ?? PADDING_LEFT;\n}\n","import type { PhyloTreeAST } from \"../../core/types\";\nimport type { PhyloLayoutResult } from \"./layout\";\nimport {\n svgRoot,\n group,\n path,\n line,\n circle,\n text,\n title,\n desc,\n rect,\n el,\n} from \"../../core/svg\";\nimport { cssCustomProperties, resolveBiologyTheme, FONT_SIZE, STROKE_WIDTH, type ResolvedTheme, type BiologyTokens } from \"../../core/theme\";\n\n// ─── Constants ──────────────────────────────────────────────\n\nconst TIP_LABEL_GAP = 6;\nconst SUPPORT_THRESHOLD = 50;\n\nfunction getSupportColor(value: number, t: ResolvedTheme<BiologyTokens>): string {\n if (value >= 95) return t.supportGood;\n if (value >= 75) return t.supportMedium;\n if (value >= 50) return t.supportWarn;\n return t.supportBad;\n}\n\nfunction isSpeciesBinomial(label: string): boolean {\n const parts = label.trim().split(/\\s+/);\n if (parts.length !== 2) return false;\n return /^[A-Z][a-z]+$/.test(parts[0]) && /^[a-z]+$/.test(parts[1]);\n}\n\n// ─── CSS ────────────────────────────────────────────────────\n\nfunction buildCSS(ast: PhyloTreeAST, t: ResolvedTheme<BiologyTokens>): string {\n const cladeColors = ast.clades.map((c, i) => {\n const color = c.color ?? t.cladeColors[i % t.cladeColors.length];\n return `.schematex-phylo-clade-${c.id} { stroke: ${color}; }\n.schematex-phylo-clade-bg-${c.id} { fill: ${color}; fill-opacity: 0.12; }\n.schematex-phylo-clade-label-${c.id} { fill: ${color}; }`;\n });\n\n return `\n.schematex-phylo {${cssCustomProperties(t)}\n font-family: system-ui, -apple-system, sans-serif;\n}\n.schematex-phylo-branch { fill: none; stroke: ${t.text}; stroke-width: ${STROKE_WIDTH.normal}; stroke-linecap: round; }\n.schematex-phylo-branch-connector { fill: none; stroke: ${t.text}; stroke-width: ${STROKE_WIDTH.normal}; }\n.schematex-phylo-tip-label { font-size: ${FONT_SIZE.label}px; fill: ${t.text}; dominant-baseline: central; }\n.schematex-phylo-tip-label-italic { font-style: italic; }\n.schematex-phylo-support-label { font-size: ${FONT_SIZE.small}px; fill: ${t.textMuted}; text-anchor: middle; dominant-baseline: auto; }\n.schematex-phylo-support-dot { stroke: none; }\n.schematex-phylo-scale-bar line { stroke: ${t.text}; stroke-width: ${STROKE_WIDTH.normal}; }\n.schematex-phylo-scale-bar text { font-size: 10px; fill: ${t.text}; text-anchor: middle; }\n.schematex-phylo-scale-tick { stroke: ${t.text}; stroke-width: ${STROKE_WIDTH.thin}; }\n.schematex-phylo-title { font-size: ${FONT_SIZE.title}px; font-weight: bold; fill: ${t.text}; text-anchor: middle; }\n.schematex-phylo-clade-label { font-size: 13px; font-weight: bold; }\n.schematex-phylo-root-marker { fill: none; stroke: ${t.text}; stroke-width: ${STROKE_WIDTH.normal}; }\n${cladeColors.join(\"\\n\")}\n`.trim();\n}\n\n// ─── Scale Bar ──────────────────────────────────────────────\n\nfunction computeScaleBar(\n scale: number,\n plotWidth: number\n): { length: number; label: string; pxLength: number } {\n if (scale <= 0) return { length: 0.1, label: \"0.1\", pxLength: 50 };\n\n const targetPx = plotWidth * 0.2;\n\n const magnitudes = [0.001, 0.002, 0.005, 0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1, 2, 5, 10, 20, 50, 100];\n let best = magnitudes[0];\n let bestDiff = Infinity;\n\n for (const m of magnitudes) {\n const diff = Math.abs(m * scale - targetPx);\n if (diff < bestDiff) {\n bestDiff = diff;\n best = m;\n }\n }\n\n return {\n length: best,\n label: best < 0.01 ? best.toExponential() : String(best),\n pxLength: best * scale,\n };\n}\n\nfunction renderScaleBar(\n layout: PhyloLayoutResult,\n t: ResolvedTheme<BiologyTokens>,\n scaleLabel?: string\n): string {\n if (layout.ast.mode === \"cladogram\") return \"\";\n\n const plotWidth = layout.width - 40;\n const bar = computeScaleBar(layout.scale, plotWidth);\n if (bar.pxLength < 5) return \"\";\n\n const x = 20;\n const y = layout.height - 20;\n\n const elements = [\n line({ x1: x, y1: y, x2: x + bar.pxLength, y2: y, class: \"schematex-phylo-scale-bar\" }),\n line({ x1: x, y1: y - 4, x2: x, y2: y + 4, class: \"schematex-phylo-scale-tick\" }),\n line({ x1: x + bar.pxLength, y1: y - 4, x2: x + bar.pxLength, y2: y + 4, class: \"schematex-phylo-scale-tick\" }),\n text({ x: x + bar.pxLength / 2, y: y + 16, \"text-anchor\": \"middle\", class: \"schematex-phylo-scale-bar\" }, bar.label),\n ];\n\n if (scaleLabel) {\n elements.push(\n text(\n { x: x + bar.pxLength / 2, y: y + 28, \"text-anchor\": \"middle\", \"font-size\": \"9\", fill: t.textMuted },\n scaleLabel\n )\n );\n }\n\n return group({ class: \"schematex-phylo-scale-bar\" }, elements);\n}\n\n// ─── Clade Backgrounds ──────────────────────────────────────\n\nfunction renderCladeBackgrounds(layout: PhyloLayoutResult, t: ResolvedTheme<BiologyTokens>): string[] {\n const elements: string[] = [];\n\n for (let ci = 0; ci < layout.ast.clades.length; ci++) {\n const clade = layout.ast.clades[ci];\n const hl = clade.highlight ?? \"branch\";\n if (hl === \"branch\") continue;\n\n const memberNodes = layout.nodes.filter(\n (n) => n.node.isLeaf && clade.members.includes(n.node.id)\n );\n if (memberNodes.length === 0) continue;\n\n const minY = Math.min(...memberNodes.map((n) => n.y)) - 10;\n const maxY = Math.max(...memberNodes.map((n) => n.y)) + 10;\n const minX = Math.min(...memberNodes.map((n) => n.x)) - 20;\n const maxX = Math.max(...memberNodes.map((n) => {\n const labelW = ((n.node.label ?? n.node.id).length * 7.2) + TIP_LABEL_GAP + 8;\n return n.x + labelW;\n }));\n\n const color = clade.color ?? t.cladeColors[ci % t.cladeColors.length];\n\n elements.push(\n rect({\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY,\n rx: 4,\n class: `schematex-phylo-clade-bg schematex-phylo-clade-bg-${clade.id}`,\n fill: color,\n \"fill-opacity\": 0.12,\n })\n );\n\n if (clade.label) {\n elements.push(\n text(\n {\n x: maxX + 4,\n y: (minY + maxY) / 2,\n class: `schematex-phylo-clade-label schematex-phylo-clade-label-${clade.id}`,\n fill: color,\n \"font-weight\": \"bold\",\n \"font-size\": \"13\",\n \"dominant-baseline\": \"central\",\n },\n clade.label\n )\n );\n }\n }\n\n return elements;\n}\n\n// ─── Main Renderer ──────────────────────────────────────────\n\nexport function renderPhylo(layout: PhyloLayoutResult): string {\n const { ast, nodes, branches } = layout;\n const t = resolveBiologyTheme(ast.metadata?.theme ?? \"default\");\n\n const css = buildCSS(ast, t);\n\n const titleOffset = ast.title ? 30 : 0;\n const totalHeight = layout.height + titleOffset;\n const totalWidth = layout.width;\n\n // Build layers\n const branchElements: string[] = [];\n const nodeElements: string[] = [];\n const labelElements: string[] = [];\n\n // Branches\n for (const branch of branches) {\n const cladeIdx = branch.cladeId\n ? ast.clades.findIndex((c) => c.id === branch.cladeId)\n : -1;\n const cladeColor =\n cladeIdx >= 0\n ? ast.clades[cladeIdx].color ?? t.cladeColors[cladeIdx % t.cladeColors.length]\n : undefined;\n\n const cls = branch.isConnector\n ? \"schematex-phylo-branch schematex-phylo-branch-connector\"\n : `schematex-phylo-branch schematex-phylo-branch-internal${branch.cladeId ? ` schematex-phylo-clade-${branch.cladeId}` : \"\"}`;\n\n const attrs: Record<string, string | number | undefined> = {\n d: branch.path,\n class: cls,\n };\n if (cladeColor && !branch.isConnector) {\n attrs.stroke = cladeColor;\n }\n\n branchElements.push(path(attrs));\n }\n\n // Nodes (support dots + root marker + tip labels)\n const rootLayout = nodes.find((n) => n.node === ast.root);\n\n // Root marker\n if (rootLayout && !ast.unrooted) {\n nodeElements.push(\n circle({\n cx: rootLayout.x,\n cy: rootLayout.y,\n r: 5,\n class: \"schematex-phylo-root-marker\",\n })\n );\n }\n\n for (const layoutNode of nodes) {\n const { node, x, y } = layoutNode;\n\n // Support dots / labels for internal nodes\n if (!node.isLeaf && node.support !== undefined) {\n const support = node.support > 1 ? node.support : node.support * 100;\n if (support >= SUPPORT_THRESHOLD) {\n const color = getSupportColor(support, t);\n nodeElements.push(\n circle({\n cx: x,\n cy: y,\n r: 4,\n class: \"schematex-phylo-support-dot\",\n fill: color,\n })\n );\n labelElements.push(\n text(\n { x, y: y - 8, class: \"schematex-phylo-support-label\" },\n String(Math.round(support))\n )\n );\n }\n }\n\n // Tip labels\n if (node.isLeaf) {\n const label = node.label ?? node.id;\n const italic = isSpeciesBinomial(label);\n const cls = `schematex-phylo-tip-label${italic ? \" schematex-phylo-tip-label-italic\" : \"\"}`;\n\n labelElements.push(\n text(\n {\n x: x + TIP_LABEL_GAP,\n y,\n class: cls,\n \"font-style\": italic ? \"italic\" : undefined,\n \"data-taxon-id\": node.id,\n },\n label\n )\n );\n }\n }\n\n // Clade backgrounds\n const cladeBgElements = renderCladeBackgrounds(layout, t);\n\n // Scale bar\n const scaleBarEl = renderScaleBar(layout, t, ast.scaleLabel);\n\n // Title\n const titleEl = ast.title\n ? text(\n { x: totalWidth / 2, y: 20, class: \"schematex-phylo-title\" },\n ast.title\n )\n : \"\";\n\n // Assemble\n const leafCount = nodes.filter((n) => n.node.isLeaf).length;\n const svgContent = [\n title(`Phylogenetic Tree${ast.title ? `: ${ast.title}` : \"\"}`),\n desc(`Phylogenetic tree with ${leafCount} taxa, ${ast.mode} mode, ${ast.layout} layout`),\n el(\"style\", {}, css),\n ];\n\n if (titleEl) svgContent.push(titleEl);\n\n const transformY = titleOffset;\n\n if (cladeBgElements.length > 0) {\n svgContent.push(\n group(\n { class: \"schematex-phylo-clade-highlights\", transform: transformY ? `translate(0,${transformY})` : undefined },\n cladeBgElements\n )\n );\n }\n\n svgContent.push(\n group(\n { class: \"schematex-phylo-branches\", transform: transformY ? `translate(0,${transformY})` : undefined },\n branchElements\n )\n );\n\n svgContent.push(\n group(\n { class: \"schematex-phylo-nodes\", transform: transformY ? `translate(0,${transformY})` : undefined },\n nodeElements\n )\n );\n\n svgContent.push(\n group(\n { class: \"schematex-phylo-labels\", transform: transformY ? `translate(0,${transformY})` : undefined },\n labelElements\n )\n );\n\n if (scaleBarEl) {\n svgContent.push(\n group(\n { transform: transformY ? `translate(0,${transformY})` : undefined },\n [scaleBarEl]\n )\n );\n }\n\n return svgRoot(\n {\n class: \"schematex-diagram schematex-phylo\",\n viewBox: `0 0 ${totalWidth} ${totalHeight}`,\n width: totalWidth,\n height: totalHeight,\n },\n svgContent\n );\n}\n","import type { DiagramPlugin } from \"../../core/types\";\nimport { parsePhylo, PhyloParseError } from \"./parser\";\nimport { layoutPhylo } from \"./layout\";\nimport type { PhyloLayoutResult } from \"./layout\";\nimport { renderPhylo } from \"./renderer\";\n\nexport const phylo: DiagramPlugin = {\n type: \"phylo\",\n\n detect(text: string): boolean {\n const firstLine = text.trim().split(\"\\n\")[0]?.trim().toLowerCase() ?? \"\";\n return firstLine === \"phylo\" || firstLine.startsWith(\"phylo \");\n },\n\n parse: parsePhylo,\n\n render(text: string): string {\n const ast = parsePhylo(text);\n const layout = layoutPhylo(ast);\n return renderPhylo(layout);\n },\n};\n\nexport { parsePhylo, PhyloParseError, layoutPhylo, renderPhylo };\nexport type { PhyloLayoutResult };\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/diagrams/phylo/parser.ts","../src/diagrams/phylo/layout.ts","../src/diagrams/phylo/renderer.ts","../src/diagrams/phylo/index.ts"],"names":["name","num","line","children","idx","text","title","matchQuotedTitle","cssCustomProperties","STROKE_WIDTH","FONT_SIZE","group","rect","resolveBiologyTheme","path","circle","desc","el","svgRoot"],"mappings":"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","file":"chunk-BL57NQKN.cjs","sourcesContent":["import type {\n PhyloTreeAST,\n PhyloNode,\n PhyloLayout,\n PhyloMode,\n CladeDef,\n CladeHighlightMode,\n} from \"../../core/types\";\nimport { matchQuotedTitle } from \"../../core/quotes\";\n\nexport class PhyloParseError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"PhyloParseError\";\n }\n}\n\n// ─── Newick Parser ──────────────────────────────────────────\n\nlet _pos = 0;\nlet _src = \"\";\nlet _nextId = 0;\n\nfunction genId(): string {\n return `_n${_nextId++}`;\n}\n\nfunction peek(): string {\n return _src[_pos] ?? \"\";\n}\n\nfunction advance(): string {\n return _src[_pos++] ?? \"\";\n}\n\nfunction skipWhitespace(): void {\n while (_pos < _src.length && /\\s/.test(_src[_pos])) _pos++;\n}\n\nfunction parseNewickName(): string {\n skipWhitespace();\n if (peek() === \"'\") {\n advance();\n let name = \"\";\n while (_pos < _src.length) {\n if (peek() === \"'\") {\n advance();\n if (peek() === \"'\") {\n name += \"'\";\n advance();\n } else {\n break;\n }\n } else {\n name += advance();\n }\n }\n return name;\n }\n let name = \"\";\n while (_pos < _src.length && !/[\\s():,;[\\]']/.test(_src[_pos])) {\n name += advance();\n }\n return name;\n}\n\nfunction parseNewickLength(): number | undefined {\n skipWhitespace();\n if (peek() !== \":\") return undefined;\n advance();\n skipWhitespace();\n let numStr = \"\";\n while (_pos < _src.length && /[0-9eE.+-]/.test(_src[_pos])) {\n numStr += advance();\n }\n if (!numStr) return undefined;\n const val = Number(numStr);\n return Number.isNaN(val) ? undefined : val;\n}\n\nfunction parseNHX(): { support?: number; nhx?: Record<string, string> } | undefined {\n skipWhitespace();\n if (peek() !== \"[\") return undefined;\n const start = _pos;\n advance();\n let content = \"\";\n let depth = 1;\n while (_pos < _src.length && depth > 0) {\n if (peek() === \"[\") depth++;\n if (peek() === \"]\") depth--;\n if (depth > 0) content += advance();\n else advance();\n }\n if (content.startsWith(\"&&NHX:\")) {\n const pairs = content.slice(6).split(\":\");\n const nhx: Record<string, string> = {};\n let support: number | undefined;\n for (const pair of pairs) {\n const eq = pair.indexOf(\"=\");\n if (eq === -1) continue;\n const key = pair.slice(0, eq);\n const val = pair.slice(eq + 1);\n nhx[key] = val;\n if (key === \"B\") {\n const num = Number(val);\n if (!Number.isNaN(num)) support = num;\n }\n }\n return { support, nhx };\n }\n // Plain bootstrap value in brackets like [95]\n const num = Number(content.trim());\n if (!Number.isNaN(num) && content.trim().length > 0) {\n return { support: num };\n }\n // Unknown bracket content — rewind\n _pos = start;\n return undefined;\n}\n\nfunction parseNewickSubtree(): PhyloNode {\n skipWhitespace();\n let children: PhyloNode[] = [];\n\n if (peek() === \"(\") {\n advance();\n children = [];\n children.push(parseNewickSubtree());\n skipWhitespace();\n while (peek() === \",\") {\n advance();\n children.push(parseNewickSubtree());\n skipWhitespace();\n }\n skipWhitespace();\n if (peek() === \")\") advance();\n }\n\n const name = parseNewickName();\n const nhxData = parseNHX();\n const branchLength = parseNewickLength();\n // NHX can also appear after length\n const nhxData2 = nhxData ? undefined : parseNHX();\n const merged = nhxData ?? nhxData2;\n\n const isLeaf = children.length === 0;\n const id = name || genId();\n\n return {\n id,\n label: name || undefined,\n branchLength,\n support: merged?.support,\n children,\n isLeaf,\n nhx: merged?.nhx,\n };\n}\n\nexport function parseNewick(newick: string): PhyloNode {\n _pos = 0;\n _src = newick.trim();\n _nextId = 0;\n\n if (_src.endsWith(\";\")) {\n _src = _src.slice(0, -1);\n }\n\n const root = parseNewickSubtree();\n return root;\n}\n\n// ─── Indent DSL Parser ──────────────────────────────────────\n\ninterface IndentLine {\n indent: number;\n name: string;\n branchLength?: number;\n support?: number;\n}\n\nfunction parseIndentTree(lines: string[]): PhyloNode {\n _nextId = 0;\n const parsed: IndentLine[] = [];\n\n for (const raw of lines) {\n if (!raw.trim() || raw.trim().startsWith(\"#\")) continue;\n const indent = raw.search(/\\S/);\n const content = raw.trim();\n\n let name: string;\n let branchLength: number | undefined;\n let support: number | undefined;\n\n // Check for support value [N]\n let contentClean = content;\n const supportMatch = contentClean.match(/\\[(\\d+(?:\\.\\d+)?)\\]\\s*$/);\n if (supportMatch) {\n support = Number(supportMatch[1]);\n contentClean = contentClean.slice(0, supportMatch.index).trim();\n }\n\n // \"Name: length\" or \":length\" or \"Name:\" or \"Name\"\n const colonIdx = contentClean.indexOf(\":\");\n if (colonIdx === -1) {\n name = contentClean;\n } else {\n name = contentClean.slice(0, colonIdx).trim();\n const lenStr = contentClean.slice(colonIdx + 1).trim();\n if (lenStr) {\n const num = Number(lenStr);\n if (!Number.isNaN(num)) branchLength = num;\n }\n }\n\n parsed.push({ indent, name, branchLength, support });\n }\n\n if (parsed.length === 0) {\n throw new PhyloParseError(\"Empty indent tree definition\");\n }\n\n function buildTree(startIdx: number, parentIndent: number): { node: PhyloNode; nextIdx: number } {\n const line = parsed[startIdx];\n const children: PhyloNode[] = [];\n let idx = startIdx + 1;\n\n while (idx < parsed.length && parsed[idx].indent > parentIndent) {\n if (parsed[idx].indent === line.indent + 2 || parsed[idx].indent > line.indent) {\n const childIndent = parsed[idx].indent;\n const result = buildTree(idx, childIndent);\n children.push(result.node);\n idx = result.nextIdx;\n } else {\n break;\n }\n }\n\n const id = line.name || genId();\n return {\n node: {\n id,\n label: line.name || undefined,\n branchLength: line.branchLength,\n support: line.support,\n children,\n isLeaf: children.length === 0,\n },\n nextIdx: idx,\n };\n }\n\n // Build from the first line\n const rootLine = parsed[0];\n const rootIndent = rootLine.indent;\n const children: PhyloNode[] = [];\n let idx = 1;\n\n while (idx < parsed.length) {\n if (parsed[idx].indent > rootIndent) {\n const result = buildTree(idx, parsed[idx].indent);\n children.push(result.node);\n idx = result.nextIdx;\n } else {\n break;\n }\n }\n\n const rootId = rootLine.name || genId();\n return {\n id: rootId,\n label: rootLine.name || undefined,\n branchLength: rootLine.branchLength,\n support: rootLine.support,\n children,\n isLeaf: children.length === 0,\n };\n}\n\n// ─── Main Document Parser ───────────────────────────────────\n\nfunction parseHeaderProps(propsStr: string): {\n layout: PhyloLayout;\n mode: PhyloMode;\n unrooted: boolean;\n branchWidth?: number;\n openAngle?: number;\n mrsd?: string;\n} {\n const result: ReturnType<typeof parseHeaderProps> = {\n layout: \"rectangular\",\n mode: \"phylogram\",\n unrooted: false,\n };\n\n const pairs = propsStr.split(\",\").map((s) => s.trim());\n for (const pair of pairs) {\n if (pair === \"unrooted\") {\n result.unrooted = true;\n continue;\n }\n const colonIdx = pair.indexOf(\":\");\n if (colonIdx === -1) continue;\n const key = pair.slice(0, colonIdx).trim();\n const val = pair.slice(colonIdx + 1).trim().replace(/^[\"']|[\"']$/g, \"\");\n\n switch (key) {\n case \"layout\":\n if ([\"rectangular\", \"slanted\", \"circular\", \"unrooted\"].includes(val)) {\n result.layout = val as PhyloLayout;\n }\n break;\n case \"mode\":\n if ([\"phylogram\", \"cladogram\", \"chronogram\"].includes(val)) {\n result.mode = val as PhyloMode;\n }\n break;\n case \"branch-width\":\n result.branchWidth = Number(val);\n break;\n case \"openAngle\":\n result.openAngle = Number(val);\n break;\n case \"mrsd\":\n result.mrsd = val;\n break;\n }\n }\n\n if (result.layout === \"unrooted\") {\n result.unrooted = true;\n }\n\n return result;\n}\n\nfunction parseCladeLine(line: string): CladeDef | null {\n // clade ID = (member1, member2, ...) [color: \"#hex\", label: \"text\", highlight: mode]\n const match = line.match(\n /^clade\\s+(\\S+)\\s*=\\s*\\(([^)]+)\\)\\s*(?:\\[([^\\]]*)\\])?\\s*$/\n );\n if (!match) return null;\n\n const id = match[1];\n const members = match[2].split(\",\").map((s) => s.trim()).filter(Boolean);\n const propsStr = match[3] ?? \"\";\n\n let color: string | undefined;\n let label: string | undefined;\n let highlight: CladeHighlightMode | undefined;\n\n if (propsStr) {\n const colorMatch = propsStr.match(/color:\\s*\"([^\"]+)\"/);\n if (colorMatch) color = colorMatch[1];\n const labelMatch = propsStr.match(/label:\\s*\"([^\"]+)\"/);\n if (labelMatch) label = labelMatch[1];\n const hlMatch = propsStr.match(/highlight:\\s*(\\w+)/);\n if (hlMatch && [\"branch\", \"background\", \"both\"].includes(hlMatch[1])) {\n highlight = hlMatch[1] as CladeHighlightMode;\n }\n }\n\n return { id, members, color, label, highlight };\n}\n\nexport function parsePhylo(text: string): PhyloTreeAST {\n const lines = text.split(\"\\n\");\n let lineIdx = 0;\n\n // Skip empty lines\n while (lineIdx < lines.length && !lines[lineIdx].trim()) lineIdx++;\n\n // Parse header: phylo \"title\" [props]\n const headerLine = lines[lineIdx]?.trim() ?? \"\";\n if (!headerLine.toLowerCase().startsWith(\"phylo\")) {\n throw new PhyloParseError(\"Phylo document must start with 'phylo'\");\n }\n lineIdx++;\n\n const title: string | undefined = matchQuotedTitle(headerLine);\n\n let headerProps: ReturnType<typeof parseHeaderProps> = {\n layout: \"rectangular\",\n mode: \"phylogram\",\n unrooted: false,\n };\n const propsMatch = headerLine.match(/\\[([^\\]]+)\\]/);\n if (propsMatch) {\n headerProps = parseHeaderProps(propsMatch[1]);\n }\n\n // Parse body: newick, indent tree, scale, outgroup, clade definitions\n let root: PhyloNode | null = null;\n let scaleLabel: string | undefined;\n let outgroup: string | undefined;\n const clades: CladeDef[] = [];\n const indentLines: string[] = [];\n let inIndentTree = false;\n\n while (lineIdx < lines.length) {\n const raw = lines[lineIdx];\n const trimmed = raw.trim();\n lineIdx++;\n\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n\n // Newick definition\n if (trimmed.startsWith(\"newick:\")) {\n const newickStr = trimmed.slice(7).trim().replace(/^[\"']|[\"']$/g, \"\");\n root = parseNewick(newickStr);\n inIndentTree = false;\n continue;\n }\n\n // Scale definition\n if (trimmed.startsWith(\"scale\")) {\n const scaleMatch = trimmed.match(/scale\\s+\"([^\"]+)\"/);\n if (scaleMatch) {\n scaleLabel = scaleMatch[1];\n } else {\n scaleLabel = trimmed.slice(5).trim().replace(/^[\"']|[\"']$/g, \"\") || \"substitutions/site\";\n }\n continue;\n }\n\n // Outgroup\n if (trimmed.startsWith(\"outgroup:\")) {\n outgroup = trimmed.slice(9).trim();\n continue;\n }\n\n // Clade definition\n if (trimmed.startsWith(\"clade \")) {\n const clade = parseCladeLine(trimmed);\n if (clade) clades.push(clade);\n continue;\n }\n\n // Style line (alternative props)\n if (trimmed.startsWith(\"style\")) {\n const styleProps = trimmed.match(/\\[([^\\]]+)\\]/);\n if (styleProps) {\n headerProps = { ...headerProps, ...parseHeaderProps(styleProps[1]) };\n }\n continue;\n }\n\n // Indent tree definition\n if (trimmed.endsWith(\":\") && (trimmed === \"root:\" || !trimmed.includes(\" \"))) {\n inIndentTree = true;\n indentLines.push(raw);\n continue;\n }\n\n if (inIndentTree) {\n indentLines.push(raw);\n continue;\n }\n }\n\n // Parse indent tree if present and no Newick was found\n if (!root && indentLines.length > 0) {\n root = parseIndentTree(indentLines);\n }\n\n if (!root) {\n throw new PhyloParseError(\"No tree definition found (newick: or indent tree)\");\n }\n\n return {\n type: \"phylo\",\n title,\n root,\n unrooted: headerProps.unrooted,\n layout: headerProps.layout,\n mode: headerProps.mode,\n clades,\n scaleLabel,\n mrsd: headerProps.mrsd,\n outgroup,\n metadata: {},\n };\n}\n","import type {\n PhyloTreeAST,\n PhyloNode,\n PhyloLayoutNode,\n} from \"../../core/types\";\n\nexport interface PhyloLayoutResult {\n width: number;\n height: number;\n nodes: PhyloLayoutNode[];\n /** Branch paths: { path, cladeId?, isConnector } */\n branches: PhyloBranch[];\n ast: PhyloTreeAST;\n scale: number;\n}\n\nexport interface PhyloBranch {\n path: string;\n fromId: string;\n toId: string;\n /** Clade id if this branch belongs to a highlighted clade */\n cladeId?: string;\n /** Is this a vertical/arc connector (no length meaning) vs horizontal branch */\n isConnector: boolean;\n}\n\n// ─── Tree Utilities ─────────────────────────────────────────\n\nfunction collectLeaves(node: PhyloNode): PhyloNode[] {\n if (node.isLeaf) return [node];\n const leaves: PhyloNode[] = [];\n for (const child of node.children) {\n leaves.push(...collectLeaves(child));\n }\n return leaves;\n}\n\nfunction maxRootToTip(node: PhyloNode, distSoFar: number): number {\n if (node.isLeaf) return distSoFar;\n let maxDist = distSoFar;\n for (const child of node.children) {\n const childDist = maxRootToTip(child, distSoFar + (child.branchLength ?? 0));\n if (childDist > maxDist) maxDist = childDist;\n }\n return maxDist;\n}\n\nfunction maxDepth(node: PhyloNode): number {\n if (node.isLeaf) return 0;\n let max = 0;\n for (const child of node.children) {\n const d = maxDepth(child) + 1;\n if (d > max) max = d;\n }\n return max;\n}\n\nfunction estimateLabelWidth(node: PhyloNode): number {\n const label = node.label ?? node.id;\n return label.length * 7.2 + 6;\n}\n\n// ─── Clade Membership ───────────────────────────────────────\n\nfunction buildCladeMap(\n ast: PhyloTreeAST\n): Map<string, string> {\n const branchToCladeMap = new Map<string, string>();\n\n for (const clade of ast.clades) {\n const memberSet = new Set(clade.members);\n markCladeBranches(ast.root, memberSet, clade.id, branchToCladeMap);\n }\n\n return branchToCladeMap;\n}\n\nfunction markCladeBranches(\n node: PhyloNode,\n memberSet: Set<string>,\n cladeId: string,\n result: Map<string, string>\n): boolean {\n if (node.isLeaf) {\n return memberSet.has(node.id);\n }\n\n const childResults: boolean[] = [];\n for (const child of node.children) {\n childResults.push(markCladeBranches(child, memberSet, cladeId, result));\n }\n\n const allIn = childResults.every(Boolean);\n const anyIn = childResults.some(Boolean);\n\n if (allIn && anyIn) {\n for (const child of node.children) {\n result.set(child.id, cladeId);\n }\n return true;\n }\n\n // Partial — mark only children that are fully within\n for (let i = 0; i < node.children.length; i++) {\n if (childResults[i]) {\n result.set(node.children[i].id, cladeId);\n }\n }\n\n return false;\n}\n\n// ─── Rectangular Phylogram Layout ───────────────────────────\n\nconst TIP_SPACING = 20;\nconst PADDING_LEFT = 20;\nconst PADDING_RIGHT = 20;\nconst PADDING_TOP = 20;\nconst PADDING_BOTTOM = 40;\n\nexport function layoutPhylo(ast: PhyloTreeAST): PhyloLayoutResult {\n const leaves = collectLeaves(ast.root);\n const numLeaves = leaves.length;\n const tipSpacing = TIP_SPACING;\n\n // Compute scale\n const maxLabelWidth = Math.max(...leaves.map(estimateLabelWidth), 60);\n const maxDist = maxRootToTip(ast.root, 0);\n const isCladogram = ast.mode === \"cladogram\";\n\n const availableWidth = Math.max(300, numLeaves * 30 + maxLabelWidth + 100);\n const plotWidth = availableWidth - PADDING_LEFT - PADDING_RIGHT - maxLabelWidth;\n\n let scale: number;\n if (isCladogram || maxDist === 0) {\n const depth = maxDepth(ast.root);\n scale = depth > 0 ? plotWidth / depth : plotWidth;\n } else {\n scale = plotWidth / maxDist;\n }\n\n // Step 1: assign Y to leaves (in-order)\n const nodeMap = new Map<string, PhyloLayoutNode>();\n let leafIdx = 0;\n\n function assignLeafY(node: PhyloNode): void {\n if (node.isLeaf) {\n const y = PADDING_TOP + leafIdx * tipSpacing;\n nodeMap.set(node.id, { node, x: 0, y });\n leafIdx++;\n return;\n }\n for (const child of node.children) {\n assignLeafY(child);\n }\n }\n assignLeafY(ast.root);\n\n // Step 2: assign Y to internal nodes (mean of children)\n function assignInternalY(node: PhyloNode): number {\n const existing = nodeMap.get(node.id);\n if (node.isLeaf && existing) return existing.y;\n const childYs = node.children.map(assignInternalY);\n const y = (Math.min(...childYs) + Math.max(...childYs)) / 2;\n if (!existing) {\n nodeMap.set(node.id, { node, x: 0, y });\n } else {\n existing.y = y;\n }\n return y;\n }\n assignInternalY(ast.root);\n\n // Step 3: assign X (distance from root)\n function assignX(node: PhyloNode, parentX: number, depth: number): void {\n let x: number;\n if (node === ast.root) {\n x = PADDING_LEFT;\n } else if (isCladogram) {\n if (node.isLeaf) {\n x = PADDING_LEFT + plotWidth;\n } else {\n x = PADDING_LEFT + depth * (plotWidth / maxDepth(ast.root));\n }\n } else {\n x = parentX + (node.branchLength ?? 0) * scale;\n }\n\n const layoutNode = nodeMap.get(node.id);\n if (layoutNode) layoutNode.x = x;\n\n for (const child of node.children) {\n assignX(child, x, depth + 1);\n }\n }\n assignX(ast.root, PADDING_LEFT, 0);\n\n // For cladogram: recalculate internal node X as parent of children\n if (isCladogram) {\n assignCladogramInternalX(ast.root, nodeMap);\n }\n\n // Build clade membership map\n const cladeMap = buildCladeMap(ast);\n\n // Step 4: generate branch paths\n const branches: PhyloBranch[] = [];\n\n function generateBranches(node: PhyloNode): void {\n const parentLayout = nodeMap.get(node.id);\n if (!parentLayout) return;\n\n if (node.children.length === 0) return;\n\n const childLayouts = node.children\n .map((c) => nodeMap.get(c.id))\n .filter((l): l is PhyloLayoutNode => l !== undefined);\n\n if (childLayouts.length === 0) return;\n\n // Vertical connector from min child Y to max child Y at parent X\n const minY = Math.min(...childLayouts.map((c) => c.y));\n const maxY = Math.max(...childLayouts.map((c) => c.y));\n\n if (ast.layout === \"slanted\") {\n // Slanted: diagonal lines from parent to each child\n for (const child of node.children) {\n const childLayout = nodeMap.get(child.id);\n if (!childLayout) continue;\n const pathStr = `M ${parentLayout.x},${parentLayout.y} L ${childLayout.x},${childLayout.y}`;\n branches.push({\n path: pathStr,\n fromId: node.id,\n toId: child.id,\n cladeId: cladeMap.get(child.id),\n isConnector: false,\n });\n }\n } else {\n // Rectangular: vertical connector + horizontal branches\n branches.push({\n path: `M ${parentLayout.x},${minY} V ${maxY}`,\n fromId: node.id,\n toId: node.id,\n isConnector: true,\n });\n\n for (const child of node.children) {\n const childLayout = nodeMap.get(child.id);\n if (!childLayout) continue;\n const pathStr = `M ${parentLayout.x},${childLayout.y} H ${childLayout.x}`;\n branches.push({\n path: pathStr,\n fromId: node.id,\n toId: child.id,\n cladeId: cladeMap.get(child.id),\n isConnector: false,\n });\n }\n }\n\n for (const child of node.children) {\n generateBranches(child);\n }\n }\n\n generateBranches(ast.root);\n\n // Compute final dimensions\n const allNodes = Array.from(nodeMap.values());\n let maxX = Math.max(...allNodes.map((n) => n.x + (n.node.isLeaf ? estimateLabelWidth(n.node) : 0)));\n\n // Add space for clade labels (background/both mode places labels to the right)\n let maxCladeLabelWidth = 0;\n for (const clade of ast.clades) {\n if (clade.label && clade.highlight && clade.highlight !== \"branch\") {\n const w = clade.label.length * 8 + 30;\n if (w > maxCladeLabelWidth) maxCladeLabelWidth = w;\n }\n }\n maxX += maxCladeLabelWidth;\n\n const maxNodeY = Math.max(...allNodes.map((n) => n.y));\n\n const width = Math.max(maxX + PADDING_RIGHT, availableWidth);\n const height = maxNodeY + PADDING_TOP + PADDING_BOTTOM;\n\n return {\n width,\n height,\n nodes: allNodes,\n branches,\n ast,\n scale,\n };\n}\n\nfunction assignCladogramInternalX(\n node: PhyloNode,\n nodeMap: Map<string, PhyloLayoutNode>\n): number {\n if (node.isLeaf) {\n return nodeMap.get(node.id)?.x ?? 0;\n }\n\n let minChildX = Infinity;\n for (const child of node.children) {\n const childX = assignCladogramInternalX(child, nodeMap);\n if (childX < minChildX) minChildX = childX;\n }\n\n const layout = nodeMap.get(node.id);\n if (layout) {\n layout.x = minChildX - 40;\n if (layout.x < PADDING_LEFT) layout.x = PADDING_LEFT;\n }\n\n return layout?.x ?? PADDING_LEFT;\n}\n","import type { PhyloTreeAST } from \"../../core/types\";\nimport type { PhyloLayoutResult } from \"./layout\";\nimport {\n svgRoot,\n group,\n path,\n line,\n circle,\n text,\n title,\n desc,\n rect,\n el,\n} from \"../../core/svg\";\nimport { cssCustomProperties, resolveBiologyTheme, FONT_SIZE, STROKE_WIDTH, type ResolvedTheme, type BiologyTokens } from \"../../core/theme\";\n\n// ─── Constants ──────────────────────────────────────────────\n\nconst TIP_LABEL_GAP = 6;\nconst SUPPORT_THRESHOLD = 50;\n\nfunction getSupportColor(value: number, t: ResolvedTheme<BiologyTokens>): string {\n if (value >= 95) return t.supportGood;\n if (value >= 75) return t.supportMedium;\n if (value >= 50) return t.supportWarn;\n return t.supportBad;\n}\n\nfunction isSpeciesBinomial(label: string): boolean {\n const parts = label.trim().split(/\\s+/);\n if (parts.length !== 2) return false;\n return /^[A-Z][a-z]+$/.test(parts[0]) && /^[a-z]+$/.test(parts[1]);\n}\n\n// ─── CSS ────────────────────────────────────────────────────\n\nfunction buildCSS(ast: PhyloTreeAST, t: ResolvedTheme<BiologyTokens>): string {\n const cladeColors = ast.clades.map((c, i) => {\n const color = c.color ?? t.cladeColors[i % t.cladeColors.length];\n return `.schematex-phylo-clade-${c.id} { stroke: ${color}; }\n.schematex-phylo-clade-bg-${c.id} { fill: ${color}; fill-opacity: 0.12; }\n.schematex-phylo-clade-label-${c.id} { fill: ${color}; }`;\n });\n\n return `\n.schematex-phylo {${cssCustomProperties(t)}\n font-family: system-ui, -apple-system, sans-serif;\n}\n.schematex-phylo-branch { fill: none; stroke: ${t.text}; stroke-width: ${STROKE_WIDTH.normal}; stroke-linecap: round; }\n.schematex-phylo-branch-connector { fill: none; stroke: ${t.text}; stroke-width: ${STROKE_WIDTH.normal}; }\n.schematex-phylo-tip-label { font-size: ${FONT_SIZE.label}px; fill: ${t.text}; dominant-baseline: central; }\n.schematex-phylo-tip-label-italic { font-style: italic; }\n.schematex-phylo-support-label { font-size: ${FONT_SIZE.small}px; fill: ${t.textMuted}; text-anchor: middle; dominant-baseline: auto; }\n.schematex-phylo-support-dot { stroke: none; }\n.schematex-phylo-scale-bar line { stroke: ${t.text}; stroke-width: ${STROKE_WIDTH.normal}; }\n.schematex-phylo-scale-bar text { font-size: 10px; fill: ${t.text}; text-anchor: middle; }\n.schematex-phylo-scale-tick { stroke: ${t.text}; stroke-width: ${STROKE_WIDTH.thin}; }\n.schematex-phylo-title { font-size: ${FONT_SIZE.title}px; font-weight: bold; fill: ${t.text}; text-anchor: middle; }\n.schematex-phylo-clade-label { font-size: 13px; font-weight: bold; }\n.schematex-phylo-root-marker { fill: none; stroke: ${t.text}; stroke-width: ${STROKE_WIDTH.normal}; }\n${cladeColors.join(\"\\n\")}\n`.trim();\n}\n\n// ─── Scale Bar ──────────────────────────────────────────────\n\nfunction computeScaleBar(\n scale: number,\n plotWidth: number\n): { length: number; label: string; pxLength: number } {\n if (scale <= 0) return { length: 0.1, label: \"0.1\", pxLength: 50 };\n\n const targetPx = plotWidth * 0.2;\n\n const magnitudes = [0.001, 0.002, 0.005, 0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1, 2, 5, 10, 20, 50, 100];\n let best = magnitudes[0];\n let bestDiff = Infinity;\n\n for (const m of magnitudes) {\n const diff = Math.abs(m * scale - targetPx);\n if (diff < bestDiff) {\n bestDiff = diff;\n best = m;\n }\n }\n\n return {\n length: best,\n label: best < 0.01 ? best.toExponential() : String(best),\n pxLength: best * scale,\n };\n}\n\nfunction renderScaleBar(\n layout: PhyloLayoutResult,\n t: ResolvedTheme<BiologyTokens>,\n scaleLabel?: string\n): string {\n if (layout.ast.mode === \"cladogram\") return \"\";\n\n const plotWidth = layout.width - 40;\n const bar = computeScaleBar(layout.scale, plotWidth);\n if (bar.pxLength < 5) return \"\";\n\n const x = 20;\n const y = layout.height - 20;\n\n const elements = [\n line({ x1: x, y1: y, x2: x + bar.pxLength, y2: y, class: \"schematex-phylo-scale-bar\" }),\n line({ x1: x, y1: y - 4, x2: x, y2: y + 4, class: \"schematex-phylo-scale-tick\" }),\n line({ x1: x + bar.pxLength, y1: y - 4, x2: x + bar.pxLength, y2: y + 4, class: \"schematex-phylo-scale-tick\" }),\n text({ x: x + bar.pxLength / 2, y: y + 16, \"text-anchor\": \"middle\", class: \"schematex-phylo-scale-bar\" }, bar.label),\n ];\n\n if (scaleLabel) {\n elements.push(\n text(\n { x: x + bar.pxLength / 2, y: y + 28, \"text-anchor\": \"middle\", \"font-size\": \"9\", fill: t.textMuted },\n scaleLabel\n )\n );\n }\n\n return group({ class: \"schematex-phylo-scale-bar\" }, elements);\n}\n\n// ─── Clade Backgrounds ──────────────────────────────────────\n\nfunction renderCladeBackgrounds(layout: PhyloLayoutResult, t: ResolvedTheme<BiologyTokens>): string[] {\n const elements: string[] = [];\n\n for (let ci = 0; ci < layout.ast.clades.length; ci++) {\n const clade = layout.ast.clades[ci];\n const hl = clade.highlight ?? \"branch\";\n if (hl === \"branch\") continue;\n\n const memberNodes = layout.nodes.filter(\n (n) => n.node.isLeaf && clade.members.includes(n.node.id)\n );\n if (memberNodes.length === 0) continue;\n\n const minY = Math.min(...memberNodes.map((n) => n.y)) - 10;\n const maxY = Math.max(...memberNodes.map((n) => n.y)) + 10;\n const minX = Math.min(...memberNodes.map((n) => n.x)) - 20;\n const maxX = Math.max(...memberNodes.map((n) => {\n const labelW = ((n.node.label ?? n.node.id).length * 7.2) + TIP_LABEL_GAP + 8;\n return n.x + labelW;\n }));\n\n const color = clade.color ?? t.cladeColors[ci % t.cladeColors.length];\n\n elements.push(\n rect({\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY,\n rx: 4,\n class: `schematex-phylo-clade-bg schematex-phylo-clade-bg-${clade.id}`,\n fill: color,\n \"fill-opacity\": 0.12,\n })\n );\n\n if (clade.label) {\n elements.push(\n text(\n {\n x: maxX + 4,\n y: (minY + maxY) / 2,\n class: `schematex-phylo-clade-label schematex-phylo-clade-label-${clade.id}`,\n fill: color,\n \"font-weight\": \"bold\",\n \"font-size\": \"13\",\n \"dominant-baseline\": \"central\",\n },\n clade.label\n )\n );\n }\n }\n\n return elements;\n}\n\n// ─── Main Renderer ──────────────────────────────────────────\n\nexport function renderPhylo(layout: PhyloLayoutResult): string {\n const { ast, nodes, branches } = layout;\n const t = resolveBiologyTheme(ast.metadata?.theme ?? \"default\");\n\n const css = buildCSS(ast, t);\n\n const titleOffset = ast.title ? 30 : 0;\n const totalHeight = layout.height + titleOffset;\n const totalWidth = layout.width;\n\n // Build layers\n const branchElements: string[] = [];\n const nodeElements: string[] = [];\n const labelElements: string[] = [];\n\n // Branches\n for (const branch of branches) {\n const cladeIdx = branch.cladeId\n ? ast.clades.findIndex((c) => c.id === branch.cladeId)\n : -1;\n const cladeColor =\n cladeIdx >= 0\n ? ast.clades[cladeIdx].color ?? t.cladeColors[cladeIdx % t.cladeColors.length]\n : undefined;\n\n const cls = branch.isConnector\n ? \"schematex-phylo-branch schematex-phylo-branch-connector\"\n : `schematex-phylo-branch schematex-phylo-branch-internal${branch.cladeId ? ` schematex-phylo-clade-${branch.cladeId}` : \"\"}`;\n\n const attrs: Record<string, string | number | undefined> = {\n d: branch.path,\n class: cls,\n };\n if (cladeColor && !branch.isConnector) {\n attrs.stroke = cladeColor;\n }\n\n branchElements.push(path(attrs));\n }\n\n // Nodes (support dots + root marker + tip labels)\n const rootLayout = nodes.find((n) => n.node === ast.root);\n\n // Root marker\n if (rootLayout && !ast.unrooted) {\n nodeElements.push(\n circle({\n cx: rootLayout.x,\n cy: rootLayout.y,\n r: 5,\n class: \"schematex-phylo-root-marker\",\n })\n );\n }\n\n for (const layoutNode of nodes) {\n const { node, x, y } = layoutNode;\n\n // Support dots / labels for internal nodes\n if (!node.isLeaf && node.support !== undefined) {\n const support = node.support > 1 ? node.support : node.support * 100;\n if (support >= SUPPORT_THRESHOLD) {\n const color = getSupportColor(support, t);\n nodeElements.push(\n circle({\n cx: x,\n cy: y,\n r: 4,\n class: \"schematex-phylo-support-dot\",\n fill: color,\n })\n );\n labelElements.push(\n text(\n { x, y: y - 8, class: \"schematex-phylo-support-label\" },\n String(Math.round(support))\n )\n );\n }\n }\n\n // Tip labels\n if (node.isLeaf) {\n const label = node.label ?? node.id;\n const italic = isSpeciesBinomial(label);\n const cls = `schematex-phylo-tip-label${italic ? \" schematex-phylo-tip-label-italic\" : \"\"}`;\n\n labelElements.push(\n text(\n {\n x: x + TIP_LABEL_GAP,\n y,\n class: cls,\n \"font-style\": italic ? \"italic\" : undefined,\n \"data-taxon-id\": node.id,\n },\n label\n )\n );\n }\n }\n\n // Clade backgrounds\n const cladeBgElements = renderCladeBackgrounds(layout, t);\n\n // Scale bar\n const scaleBarEl = renderScaleBar(layout, t, ast.scaleLabel);\n\n // Title\n const titleEl = ast.title\n ? text(\n { x: totalWidth / 2, y: 20, class: \"schematex-phylo-title\" },\n ast.title\n )\n : \"\";\n\n // Assemble\n const leafCount = nodes.filter((n) => n.node.isLeaf).length;\n const svgContent = [\n title(`Phylogenetic Tree${ast.title ? `: ${ast.title}` : \"\"}`),\n desc(`Phylogenetic tree with ${leafCount} taxa, ${ast.mode} mode, ${ast.layout} layout`),\n el(\"style\", {}, css),\n ];\n\n if (titleEl) svgContent.push(titleEl);\n\n const transformY = titleOffset;\n\n if (cladeBgElements.length > 0) {\n svgContent.push(\n group(\n { class: \"schematex-phylo-clade-highlights\", transform: transformY ? `translate(0,${transformY})` : undefined },\n cladeBgElements\n )\n );\n }\n\n svgContent.push(\n group(\n { class: \"schematex-phylo-branches\", transform: transformY ? `translate(0,${transformY})` : undefined },\n branchElements\n )\n );\n\n svgContent.push(\n group(\n { class: \"schematex-phylo-nodes\", transform: transformY ? `translate(0,${transformY})` : undefined },\n nodeElements\n )\n );\n\n svgContent.push(\n group(\n { class: \"schematex-phylo-labels\", transform: transformY ? `translate(0,${transformY})` : undefined },\n labelElements\n )\n );\n\n if (scaleBarEl) {\n svgContent.push(\n group(\n { transform: transformY ? `translate(0,${transformY})` : undefined },\n [scaleBarEl]\n )\n );\n }\n\n return svgRoot(\n {\n class: \"schematex-diagram schematex-phylo\",\n viewBox: `0 0 ${totalWidth} ${totalHeight}`,\n width: totalWidth,\n height: totalHeight,\n },\n svgContent\n );\n}\n","import type { DiagramPlugin } from \"../../core/types\";\nimport { parsePhylo, PhyloParseError } from \"./parser\";\nimport { layoutPhylo } from \"./layout\";\nimport type { PhyloLayoutResult } from \"./layout\";\nimport { renderPhylo } from \"./renderer\";\n\nexport const phylo: DiagramPlugin = {\n type: \"phylo\",\n\n detect(text: string): boolean {\n const firstLine = text.trim().split(\"\\n\")[0]?.trim().toLowerCase() ?? \"\";\n return firstLine === \"phylo\" || firstLine.startsWith(\"phylo \");\n },\n\n parse: parsePhylo,\n\n render(text: string): string {\n const ast = parsePhylo(text);\n const layout = layoutPhylo(ast);\n return renderPhylo(layout);\n },\n};\n\nexport { parsePhylo, PhyloParseError, layoutPhylo, renderPhylo };\nexport type { PhyloLayoutResult };\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkMLLARXOI_cjs = require('./chunk-MLLARXOI.cjs');
|
|
4
4
|
|
|
5
5
|
// src/ai/registry.ts
|
|
6
6
|
var DIAGRAM_REGISTRY = [
|
|
@@ -284,6 +284,15 @@ var DIAGRAM_REGISTRY = [
|
|
|
284
284
|
standard: "NUREG-0492 Fault Tree Handbook + IEC 61025:2006 + NASA FT Handbook 2002; MOCUS cut sets (Fussell-Vesely 1972); see 37-FAULT-TREE-STANDARD.md",
|
|
285
285
|
syntaxKey: "faulttree"
|
|
286
286
|
},
|
|
287
|
+
{
|
|
288
|
+
type: "bowtie",
|
|
289
|
+
name: "Bowtie risk diagram",
|
|
290
|
+
tagline: "Barrier-based risk management \u2014 one hazard's top event (the knot) with threats fanning in through preventative barriers on the left and consequences fanning out through mitigative barriers on the right, the whole shaped like a bow tie.",
|
|
291
|
+
useWhen: 'Use for process-safety / barrier risk analysis (oil & gas, aviation SMS, chemical, rail): one hazard, one top event, the threats that could cause it and the consequences if it happens, with the controls (barriers) in between. Indentation-structured DSL mirrors the CCPS 7-step build: `hazard "\u2026"`, `topevent "\u2026"`, then each `threat "\u2026"` with indented `prevent "\u2026"` barrier chain, each `consequence "\u2026"` with indented `mitigate "\u2026"` chain; `escalation "\u2026"` nests under a barrier it degrades, `barrier "\u2026"` nests under an escalation. Correct-by-construction: the engine *rejects* a threat/consequence with no barrier and an escalation not attached to a barrier (CCPS/EI barrier rule set). Qualitative \u2014 no probability rollup (that is `faulttree`\'s job; a bowtie\'s left wing read backwards IS a fault tree). Distinct from `fishbone` (one-sided causes, no barriers) and `faulttree` (Boolean gates + cut sets, left wing only).',
|
|
292
|
+
cluster: "risk-reliability",
|
|
293
|
+
standard: "CCPS / Energy Institute 2018 (Bow Ties in Risk Management) + IEC 31010:2019 \xA7B.4.6 + ICAO Doc 9859; Swiss-cheese lineage (Reason 1990); see 38-BOWTIE-STANDARD.md",
|
|
294
|
+
syntaxKey: "bowtie"
|
|
295
|
+
},
|
|
287
296
|
// ── Generic process / flow ───────────────────────────────────
|
|
288
297
|
{
|
|
289
298
|
type: "flowchart",
|
|
@@ -379,7 +388,9 @@ var DIAGRAM_SINCE = {
|
|
|
379
388
|
// 0.6.4
|
|
380
389
|
umlclass: "0.6.4",
|
|
381
390
|
// 0.6.5
|
|
382
|
-
faulttree: "0.6.5"
|
|
391
|
+
faulttree: "0.6.5",
|
|
392
|
+
// 0.6.6
|
|
393
|
+
bowtie: "0.6.6"
|
|
383
394
|
};
|
|
384
395
|
function getDiagramSince(type) {
|
|
385
396
|
const resolved = resolveDiagramType(type);
|
|
@@ -444,6 +455,82 @@ var EXAMPLES = [
|
|
|
444
455
|
"dsl": 'blockdiagram "PID control loop"\nC = block("PID C(s)") [role: controller]\nG = block("Plant G(s)") [role: plant]\nerr = sum(+r, -y)\nr = signal("r (setpoint)")\ny = signal("y (output)")\nin -> r\nr -> err\nerr -> C\nC -> G\nG -> y\nG -> err',
|
|
445
456
|
"notes": '## Scenario\n\nThe standard closed-loop PID block diagram appears in every control systems textbook (Ogata, Franklin, \xC5str\xF6m) and every control system design spec sheet. Schematex renders it from a signal-flow description \u2014 not a generic flowchart \u2014 using proper summing junction symbols and automatic feedback routing.\n\n## Annotation key\n\n- `block("label") [role: ...]` \u2014 transfer function block; `role: controller` and `role: plant` affect visual styling\n- `sum(+r, -y)` \u2014 summing junction: adds the `+r` (reference) signal and subtracts the `-y` (output feedback)\n- `signal("label")` \u2014 named signal node\n- `G -> err` \u2014 the feedback path: plant output `y` routes back to the summing junction\n\n## How to read\n\nThe setpoint `r` enters the summing junction `err`, which subtracts the plant output `y` to compute the error signal. The PID controller `C(s)` processes the error and drives the plant `G(s)`. The plant output `y` is both the system output and the feedback signal. The loop is closed when `G -> err` feeds `y` back to the summing junction.'
|
|
446
457
|
},
|
|
458
|
+
{
|
|
459
|
+
"slug": "bowtie-hot-work-fire",
|
|
460
|
+
"diagram": "bowtie",
|
|
461
|
+
"title": "Hot work \u2014 ignition of flammable atmosphere",
|
|
462
|
+
"description": "A bowtie with escalation factors on both wings \u2014 a preventative and a mitigative barrier are each degraded by a named condition with its own escalation-factor barrier, exercising the full element vocabulary.",
|
|
463
|
+
"standard": "CCPS / Energy Institute 2018",
|
|
464
|
+
"tags": [
|
|
465
|
+
"bowtie",
|
|
466
|
+
"risk",
|
|
467
|
+
"escalation-factor",
|
|
468
|
+
"hot-work",
|
|
469
|
+
"fire",
|
|
470
|
+
"barrier"
|
|
471
|
+
],
|
|
472
|
+
"complexity": 3,
|
|
473
|
+
"featured": false,
|
|
474
|
+
"dsl": 'bowtie "Hot work \u2014 fire bowtie"\nhazard "Hot work near flammable materials"\ntopevent "Ignition of flammable atmosphere"\nthreat "Sparks / hot slag"\n prevent "Hot-work permit"\n prevent "Fire watch"\n escalation "Fire watch leaves post early"\n barrier "Post-work monitoring period (60 min)"\nthreat "Static discharge"\n prevent "Bonding + grounding"\n prevent "Antistatic PPE"\nconsequence "Flash fire"\n mitigate "Fixed fire suppression"\n escalation "Suppression isolated for maintenance"\n barrier "Impairment register + MoC"\nconsequence "Asset loss"\n mitigate "Fire-rated separation"\n mitigate "Business-continuity plan"',
|
|
475
|
+
"notes": '## What this shows\n\nThe complete element vocabulary, with **escalation factors on both wings** \u2014 because a mitigative barrier can be degraded just as a preventative one can. On the left, the "Fire watch" barrier is defeated if the watch leaves early, controlled by a mandatory post-work monitoring period. On the right, the "Fixed fire suppression" barrier is defeated when isolated for maintenance, controlled by an impairment register and management-of-change.\n\nThe left wing is taller than the right (its escalation drops deeper), so it sets the diagram height while the right wing stays centred about the knot. Each escalation hangs into the whitespace between bands on a muted *degrades* connector, never colliding with the next line.'
|
|
476
|
+
},
|
|
477
|
+
{
|
|
478
|
+
"slug": "bowtie-lpg-loss-of-containment",
|
|
479
|
+
"diagram": "bowtie",
|
|
480
|
+
"title": "LPG storage \u2014 loss of containment",
|
|
481
|
+
"description": "The canonical process-safety bowtie \u2014 three threats fan in through preventative barrier chains, three consequences fan out through mitigative chains, around the central loss-of-containment top event.",
|
|
482
|
+
"standard": "CCPS / Energy Institute 2018",
|
|
483
|
+
"tags": [
|
|
484
|
+
"bowtie",
|
|
485
|
+
"risk",
|
|
486
|
+
"process-safety",
|
|
487
|
+
"barrier",
|
|
488
|
+
"hazard",
|
|
489
|
+
"loss-of-containment"
|
|
490
|
+
],
|
|
491
|
+
"complexity": 3,
|
|
492
|
+
"featured": true,
|
|
493
|
+
"dsl": 'bowtie "LPG storage \u2014 loss of containment"\nhazard "LPG stored under pressure"\ntopevent "Loss of containment"\nthreat "Corrosion of vessel wall"\n prevent "Corrosion-resistant coating"\n prevent "UT thickness inspection"\nthreat "Overpressure during filling"\n prevent "High-pressure trip (SIL 2)"\n prevent "Pressure relief valve"\nthreat "Mechanical impact (vehicle)"\n prevent "Bollards / vehicle barriers"\n prevent "Site speed limit + banksman"\nconsequence "Jet fire"\n mitigate "Gas detection + ESD"\n mitigate "Deluge / water spray"\nconsequence "Vapour cloud explosion"\n mitigate "Ignition-source control (ATEX)"\n mitigate "Blast-resistant control room"\nconsequence "Toxic / asphyxiation exposure"\n mitigate "Personal gas monitors"\n mitigate "Emergency evacuation plan"',
|
|
494
|
+
"notes": '## What this shows\n\nThe integrating picture of barrier-based risk management for one major-accident scenario. The **hazard** ("LPG stored under pressure") sits above the central **top event** \u2014 the moment control is lost. To the **left**, three credible **threats** each fan in through a chain of **preventative barriers** (grey, on the line) that stop them reaching the knot. To the **right**, three **consequences** each fan out through a chain of **mitigative barriers** that limit the damage if the top event occurs.\n\nThis is the shape a process-safety reviewer expects on an A3: defence-in-depth depth on both wings, the knot in the middle, the hazard above. **Correct by construction** \u2014 the engine would reject any threat or consequence drawn with no barrier (a Swiss-cheese cartoon), so every line you see genuinely passes through a control.'
|
|
495
|
+
},
|
|
496
|
+
{
|
|
497
|
+
"slug": "bowtie-runway-excursion",
|
|
498
|
+
"diagram": "bowtie",
|
|
499
|
+
"title": "Runway excursion (aviation SMS)",
|
|
500
|
+
"description": "A non-process-industry bowtie \u2014 the same threat / barrier / consequence grammar applied to an aviation safety-management scenario, showing the vocabulary travels across domains.",
|
|
501
|
+
"standard": "ICAO Doc 9859 + CCPS / EI 2018",
|
|
502
|
+
"tags": [
|
|
503
|
+
"bowtie",
|
|
504
|
+
"risk",
|
|
505
|
+
"aviation",
|
|
506
|
+
"SMS",
|
|
507
|
+
"ICAO",
|
|
508
|
+
"barrier"
|
|
509
|
+
],
|
|
510
|
+
"complexity": 3,
|
|
511
|
+
"featured": false,
|
|
512
|
+
"dsl": 'bowtie "Runway excursion"\nhazard "Aircraft landing in adverse conditions"\ntopevent "Runway excursion on landing"\nthreat "Unstable approach"\n prevent "Stabilised-approach gate (go-around policy)"\n prevent "Approach monitoring + callouts"\nthreat "Contaminated runway"\n prevent "Runway condition reporting (RCR)"\n prevent "Landing performance assessment"\nthreat "Excessive landing speed"\n prevent "Speed / energy management SOP"\n prevent "Autobrake selection"\nconsequence "Hull damage"\n mitigate "Runway end safety area (RESA)"\n mitigate "Arrestor bed (EMAS)"\nconsequence "Injuries / fatalities"\n mitigate "Cabin-crew brace + evacuation"\n mitigate "Airport emergency response"',
|
|
513
|
+
"notes": "## What this shows\n\nThe bowtie is mandated well beyond process industries \u2014 ICAO's Safety Management Manual (Doc 9859) makes it a primary hazard-analysis tool for airlines. The grammar is identical: a **hazard** (landing in adverse conditions), a **top event** (the runway excursion), **threats** that could cause it through preventative barrier chains, and **consequences** limited by mitigative chains.\n\nIt reads the same to a non-specialist as a chemical-plant bowtie, which is exactly the point: one A3 puts the entire defence-in-depth story for a single scenario in front of a board or a regulator, regardless of industry."
|
|
514
|
+
},
|
|
515
|
+
{
|
|
516
|
+
"slug": "bowtie-working-at-height",
|
|
517
|
+
"diagram": "bowtie",
|
|
518
|
+
"title": "Working at height \u2014 fall from height",
|
|
519
|
+
"description": "A defence-in-depth bowtie with an escalation factor \u2014 a preventative barrier is degraded by a named condition, which is itself controlled by an escalation-factor barrier dropping below the line.",
|
|
520
|
+
"standard": "CCPS / Energy Institute 2018",
|
|
521
|
+
"tags": [
|
|
522
|
+
"bowtie",
|
|
523
|
+
"risk",
|
|
524
|
+
"escalation-factor",
|
|
525
|
+
"defence-in-depth",
|
|
526
|
+
"construction",
|
|
527
|
+
"safety"
|
|
528
|
+
],
|
|
529
|
+
"complexity": 2,
|
|
530
|
+
"featured": true,
|
|
531
|
+
"dsl": 'bowtie "Working at height"\nhazard "Working at height"\ntopevent "Person falls from height"\nthreat "Guardrail removed for access"\n prevent "Permit-to-work system"\n prevent "Temporary edge protection"\n escalation "Edge protection not inspected"\n barrier "Pre-use inspection regime"\n prevent "Spotter / banksman"\nthreat "Fragile roof surface"\n prevent "Crawling boards + signage"\n prevent "Roof-access risk assessment"\nconsequence "Fatality"\n mitigate "Fall-arrest harness + lanyard"\n mitigate "Rescue plan + first aid"\nconsequence "Serious injury"\n mitigate "Safety netting below"\n mitigate "On-site medic + evacuation"',
|
|
532
|
+
"notes": '## What this shows\n\nTwo threats, two consequences, multi-barrier chains \u2014 and an **escalation factor**, the element that makes a bowtie an honest defence-in-depth model rather than a wish list. The "Temporary edge protection" barrier is degraded by a specific named condition ("Edge protection not inspected", amber), which drops vertically below the barrier on a muted *degrades* connector. That escalation factor is itself controlled by an **escalation-factor barrier** ("Pre-use inspection regime") one level deeper.\n\nReading order along each line is declaration order: the first barrier is the **outermost** (first line of defence, nearest the threat); the last is the **innermost** (nearest the knot). The escalation hangs into the whitespace below without disturbing the symmetry of the two threat lines.'
|
|
533
|
+
},
|
|
447
534
|
{
|
|
448
535
|
"slug": "bpmn-incident-response",
|
|
449
536
|
"diagram": "bpmn",
|
|
@@ -2900,6 +2987,10 @@ var SYNTAX = {
|
|
|
2900
2987
|
"faulttree": {
|
|
2901
2988
|
"title": "Fault Tree Analysis",
|
|
2902
2989
|
"content": '## 1. Your first diagram\n\nEvery document starts with the `faulttree` keyword (alias `fta`), an optional title, then a flat list of declarations wired by id:\n\n```\nfaulttree "Both pumps fail"\n analysis: cutsets, probability\n top T "Both redundant pumps fail" = AND(PA, PB)\n basic PA "Pump A fails" p: 0.01\n basic PB "Pump B fails" p: 0.01\n```\n\n`top` declares the single root event and the gate that produces it; `basic` declares a leaf component failure with a probability. The engine computes the minimal cut set `{PA, PB}` and P(top) = 1.0e-4. The DSL is **flat declaration + reference** (not nested by indentation) \u2014 a fault tree is a DAG, so a shared event is just referenced by id from several gates.\n\nHeader directives:\n\n- `analysis: cutsets, probability` \u2014 what to compute (also `pathsets`, `none`).\n- `prob: rare | mcub | exact` \u2014 the probability method (default `rare`, a conservative upper bound).\n- `layout: tb | bt` \u2014 top-down (default) or bottom-up.\n\n---\n\n## 2. Events\n\n```\ntop T "System fails" = OR(A, B)\ngate G1 "Sub-fault" = AND(A, B)\nbasic A "Component A fails" p: 0.01\nundeveloped EXT "External fire (not modelled)"\nhouse HX "Power on" state: 1\n```\n\n- **`top`** \u2014 the one undesired event being analysed (rectangle, emphasised border). Exactly one is required.\n- **`gate`** \u2014 an intermediate event that is itself a gate output (rectangle).\n- **`basic`** \u2014 a primary component failure, the leaf that carries `p:` (circle).\n- **`undeveloped`** \u2014 an event not developed further (diamond); may carry `p:`.\n- **`house`** \u2014 a normally-expected event forced `state: 0` or `state: 1` (house glyph) \u2014 switches branches of the tree on/off.\n\nProbabilities accept decimals or scientific notation (`p: 0.004` or `p: 1e-6`); `p:` and `prob:` are interchangeable. An event with no probability is treated symbolically (cut sets still computed; P(top) reported as n/a).\n\n---\n\n## 3. Gates\n\n```\ntop T1 = AND(A, B, C) # all inputs occur\ntop T2 = OR(A, B) # at least one input occurs\ntop T3 = XOR(A, B) # exactly one (treated as OR for cut sets)\ntop T4 = VOTING(2/3; A, B, C) # at least k of n\ngate G1 = INHIBIT(A) if COND # A occurs AND the condition holds\ngate G2 = PAND(A, B) order: A, B # A then B (order rendered, AND for cut sets)\n```\n\nGates are drawn **output-up, inputs-down** (the mirror of a `logic` gate): AND is a flat-bottomed dome, OR/XOR/VOTING a shield, INHIBIT a hexagon. The conditioning event of an `INHIBIT`/`PAND` renders as an ellipse to the side. A gate may reference another gate or any event \u2014 and the same basic event may feed several gates (a repeated event).\n\n---\n\n## 4. Computed cut sets & probability\n\nThis is the differentiator. With `analysis: cutsets`, the engine runs **MOCUS**: AND gates grow the order of a cut set, OR gates multiply the number of cut sets, then idempotence (`A\u2227A=A`) and absorption (`X \u2286 Y \u21D2 drop Y`) minimise the result.\n\n- Each **minimal cut set** is boxed in red; an **order-1 cut set is a single point of failure** (strongest red, `data-spof`).\n- A **repeated event** (one basic event under several gates) is handled by absorption \u2014 the case a naive expander gets wrong.\n- **P(top)** is computed from per-event probabilities: `rare` (\u03A3 cut-set probs, default), `mcub` (1 \u2212 \u220F(1\u2212P)), or `exact` (inclusion-exclusion, which correctly de-duplicates a shared event). The method is shown next to the top event and noted in `<desc>`.\n- A `house state: 0` can make the top event unsatisfiable \u2014 reported as "no cut sets."\n\n---\n\n## 5. Repeated events\n\n```\nfaulttree "Safety function fails"\n analysis: cutsets, probability\n prob: exact\n top T "Safety function fails" = OR(C1, C2)\n gate C1 "Channel 1" = AND(S1, L1)\n gate C2 "Channel 2" = AND(S2, L1)\n basic S1 "Sensor 1 fails" p: 0.05\n basic S2 "Sensor 2 fails" p: 0.05\n basic L1 "Shared logic solver fails" p: 0.05\n```\n\n`L1` feeds both channels \u2014 it is drawn once per reference with a shared-event mark, but the cut-set engine treats every instance as one Boolean variable. Cut sets are `{S1, L1}` and `{S2, L1}`; `prob: exact` subtracts the overlap (L1 counted once over the union), giving 0.004875 rather than the rare-event 0.005.\n\n---\n\n## 6. Transfers\n\n```\ngate OVP "Sustained over-pressure" = INHIBIT(PUMP) if HEATER\ntransfer OVP -> "OVP-detail"\n```\n\nA `transfer ID -> "name"` draws the transfer-out triangle below an event whose development lives elsewhere; a matching `transfer "name" = gate_expr` defines that named subtree and is spliced in for cut-set computation. v0.1 resolves transfers in-document.\n\n---\n\n## 7. Validation\n\nThe parser fails fast with readable errors so the cut-set math is meaningful:\n\n- exactly one `top` is required (zero or several is an error);\n- a gate referencing an undeclared id reports the id by name;\n- cycles are rejected (a fault tree is a DAG);\n- a probability outside `[0, 1]`, a `VOTING k/n` with `k > n` or `n \u2260 input count`, or an `if` condition on a non-INHIBIT/PAND gate are all reported in plain English.\n\n---\n\n## 8. Theming\n\n`default` uses the house palette \u2014 soft slate-blue event boxes, **green gates** ("logic proceeds"), **red cut-set boxes** (the computed risk), blue probability numerals, a yellow house. `monochrome` reproduces the NUREG-0492 black-and-white textbook look, where the dome/shield shape (not colour) carries the gate type. All strokes/fills come from `ReliabilityTokens`; every element carries `data-*` (`data-cutset`, `data-spof`, `data-prob`, `data-gate`) so the computed analysis is inspectable downstream.'
|
|
2990
|
+
},
|
|
2991
|
+
"bowtie": {
|
|
2992
|
+
"title": "Bowtie Risk Diagram",
|
|
2993
|
+
"content": '## 1. Your first diagram\n\nEvery document starts with the `bowtie` keyword, an optional title, then the hazard, the top event, and the two wings:\n\n```\nbowtie\ntopevent "Loss of containment"\nthreat "Corrosion"\n prevent "Inspection programme"\nconsequence "Release to atmosphere"\n mitigate "Gas detection + ESD"\n```\n\n`topevent` declares the single knot at the centre (mandatory, exactly one). Each `threat` starts a left-wing line; each `consequence` ends a right-wing line. A barrier under a `threat` is **preventative** (`prevent`); under a `consequence` it is **mitigative** (`mitigate`). The diagram is laid out symmetrically about the knot \u2014 threats fan in from the left, consequences fan out to the right.\n\nThe DSL is **indentation-structured** and mirrors the CCPS 7-step build methodology: identify the hazard \u2192 the top event \u2192 the threats \u2192 the consequences \u2192 the preventative barriers \u2192 the mitigative barriers \u2192 the escalation factors.\n\nHeader directives (any order):\n\n- `layout: symmetric | compact` \u2014 band model (default `symmetric`).\n- `legend: on | off | bottom | top` \u2014 the auto-derived colour legend (default on).\n\n---\n\n## 2. Hazard and top event\n\n```\nhazard "Working at height"\ntopevent "Person falls from height"\n```\n\n- **`hazard`** \u2014 the operation or material with the potential to cause harm: the *context* the bowtie is about (e.g. "Working at height", "Hydrocarbon under pressure"). Optional; renders as a header box above the knot with a tie-line down to it. At most one.\n- **`topevent`** \u2014 the moment control of the hazard is **lost** (e.g. "Loss of containment", "Person falls from height"). The knot of the bowtie, drawn as a green circle. **Mandatory, exactly one.**\n\nA hazard is a *thing/activity*, not a failure; the top event is the precise moment of *loss of control* \u2014 not a cause, and not yet a consequence.\n\n---\n\n## 3. Threats and consequences\n\n```\nthreat "Guardrail removed for access"\n prevent "Permit-to-work system"\n\nconsequence "Fatality"\n mitigate "Fall-arrest harness + lanyard"\n```\n\n- A **threat** is a credible cause that, *on its own*, could trigger the top event. Each threat is the start of one left-wing line, drawn as an orange box on the left edge.\n- A **consequence** is a credible outcome *of the top event* (not of the threat), drawn as a red box on the right edge.\n\nThreats and consequences may be declared in any interleaved order \u2014 the parser groups all left-wing blocks and all right-wing blocks regardless of sequence. A bowtie needs **at least one of each**: a one-wing diagram is a fault tree (see `faulttree`) or an event tree, not a bowtie.\n\n---\n\n## 4. Barriers (the controls in between)\n\n```\nthreat "Guardrail removed for access"\n prevent "Permit-to-work system"\n prevent "Temporary edge protection"\n prevent "Spotter / banksman"\n```\n\nA **barrier** is a control that interrupts the threat \u2192 top-event path (preventative) or reduces the consequence after the top event (mitigative). Each is a grey box *on the line*. Chains are free length (1..n) \u2014 the wing simply extends.\n\n**Barrier order is declaration order**: the first declared is the **outermost** (closest to the threat/consequence, the first line of defence); the last declared is the **innermost** (closest to the knot). This matches the left-to-right reading of a real bowtie. Each barrier carries `data-order` (0 = outermost) and `data-side` (`prevent` / `mitigate`) for downstream interactivity.\n\nWhen chains differ in length, barriers are **centre-anchored**: the innermost barriers align in a neat column near the knot, and the threat/consequence boxes are ragged by chain depth \u2014 reading as defence-in-depth.\n\n---\n\n## 5. Escalation factors\n\n```\nthreat "Corrosion"\n prevent "UT thickness inspection"\n escalation "Inspection interval too long"\n barrier "Risk-based inspection scheme"\n```\n\nAn **escalation factor** (or degradation factor) is a condition that *degrades a specific barrier\'s effectiveness* \u2014 e.g. "Edge protection not inspected", "Operator fatigue". It attaches to **one** barrier (not to the line) and drops vertically below it as an amber box, joined by a muted "degrades" connector.\n\nAn **escalation-factor barrier** is a control placed on the escalation factor itself \u2014 it protects the barrier from being degraded (e.g. a pre-use inspection regime). It nests one level deeper, under the escalation factor, and renders as a grey box below it.\n\nIndentation binds the nesting: `prevent`/`mitigate` at 2 spaces, `escalation` at 4, `barrier` at 6.\n\n---\n\n## 6. Correct by construction (the barrier rule set)\n\nBefore it draws a single shape, the engine validates the structural half of the CCPS/EI barrier rule set and **refuses to render** on failure \u2014 exactly as `prisma` refuses missing counts:\n\n- **Exactly one top event** \u2014 zero or several is an error.\n- **Every threat has \u2265 1 preventative barrier** \u2014 a bare threat is a Swiss-cheese cartoon, not a bowtie.\n- **Every consequence has \u2265 1 mitigative barrier** \u2014 the mirror rule.\n- **Every escalation factor is attached to a barrier** \u2014 it cannot float on a line or on the top event.\n- **At least one threat and one consequence** \u2014 a one-wing diagram is an FTA or an ETA.\n\nMessages name the offending element and the rule in plain English, e.g. *"Threat \'Corrosion\' has no preventative barrier \u2014 every threat must reach the top event through at least one barrier (CCPS/EI barrier rule). Add a `prevent` line under it."* This is what separates a real bowtie from a doodle. The engine does **not** judge whether a barrier is truly *effective* or *independent* \u2014 that is the analyst\'s qualitative judgement.\n\n---\n\n## 7. Bowtie vs fault tree\n\nA fully-developed bowtie *is* a fault tree glued to an event tree at the top event: the left wing read backwards is the fault tree whose top event is the bowtie\'s knot, and the right wing is the event tree that propagates it into consequences. Schematex keeps them as two engines because their use differs:\n\n- **`bowtie`** is qualitative and symmetric \u2014 the barrier inventory and the at-a-glance defence-in-depth story; no probability arithmetic.\n- **`faulttree`** is quantitative and Boolean \u2014 AND/OR gates, basic-event probabilities, minimal cut sets, a probability rollup.\n\nWhere you want the gate-level detail behind a single threat, draw a separate `faulttree`.\n\n---\n\n## 8. Theming\n\n`default` uses the recognised BowTieXP / bowtiemaster palette \u2014 **orange threats** (left), **grey barriers** on the line, a **green top-event disc** (centre knot), **red consequences** (right), **amber escalation factors** dropping below \u2014 mapped onto Schematex\'s semantic slots so it stays coherent with `prisma` / `pert` / `petri`. `monochrome` reproduces the regulator-print black-and-white look, where element distinction rides on shape/border + position (escalation factors get a dashed border, the knot a doubled ring) rather than colour. `dark` follows Catppuccin Mocha. All strokes/fills come from `BowtieTokens`; every element carries `data-*` (`data-role`, `data-side`, `data-line`, `data-order`, `data-barrier`) so the structure is inspectable downstream.'
|
|
2903
2994
|
}
|
|
2904
2995
|
};
|
|
2905
2996
|
|
|
@@ -3430,6 +3521,41 @@ var PROFILES = {
|
|
|
3430
3521
|
"'VOTING k/n: n must equal the number of inputs' \u2014 make n match the listed inputs.",
|
|
3431
3522
|
"If P(top) shows 'n/a', a basic event in a cut set is missing its `p:`."
|
|
3432
3523
|
]
|
|
3524
|
+
},
|
|
3525
|
+
bowtie: {
|
|
3526
|
+
type: "bowtie",
|
|
3527
|
+
header: 'bowtie "Title"',
|
|
3528
|
+
mode: "indentation-structured: hazard + topevent, then threat/consequence blocks with indented barrier chains",
|
|
3529
|
+
forms: [
|
|
3530
|
+
'hazard "Working at height"',
|
|
3531
|
+
'topevent "Person falls from height"',
|
|
3532
|
+
'threat "Guardrail removed for access"',
|
|
3533
|
+
' prevent "Permit-to-work system"',
|
|
3534
|
+
' prevent "Temporary edge protection"',
|
|
3535
|
+
' escalation "Edge protection not inspected"',
|
|
3536
|
+
' barrier "Pre-use inspection regime"',
|
|
3537
|
+
'consequence "Fatality"',
|
|
3538
|
+
' mitigate "Fall-arrest harness"'
|
|
3539
|
+
],
|
|
3540
|
+
prefer: [
|
|
3541
|
+
"Single-word keyword is `bowtie`. Declare exactly one `topevent` (the knot) and an optional `hazard` header.",
|
|
3542
|
+
"Each `threat` needs \u2265 1 indented `prevent` barrier; each `consequence` needs \u2265 1 indented `mitigate` barrier (the engine rejects a bare threat/consequence).",
|
|
3543
|
+
"Barrier order = declaration order (first = outermost, nearest the threat/consequence; last = innermost, nearest the knot).",
|
|
3544
|
+
"`escalation` nests (4 spaces) under the `prevent`/`mitigate` barrier it degrades; an escalation-factor `barrier` nests (6 spaces) under the escalation.",
|
|
3545
|
+
"Bowtie is qualitative \u2014 no probabilities. For Boolean gates + cut sets behind one threat, use a separate `faulttree`."
|
|
3546
|
+
],
|
|
3547
|
+
avoid: [
|
|
3548
|
+
"Don't put a `prevent` before any `threat`, or a `mitigate` before any `consequence` \u2014 they bind to the most recent one.",
|
|
3549
|
+
"Don't leave a threat or consequence with no barrier \u2014 that is a Swiss-cheese cartoon, not a bowtie (it is rejected).",
|
|
3550
|
+
"Don't float an `escalation` on its own \u2014 it must follow a barrier line.",
|
|
3551
|
+
"Don't declare more than one `topevent` or more than one `hazard`."
|
|
3552
|
+
],
|
|
3553
|
+
repair: [
|
|
3554
|
+
"'has no preventative barrier' / 'no mitigative barrier' \u2014 add a `prevent`/`mitigate` line under the threat/consequence.",
|
|
3555
|
+
"'not attached to a barrier' \u2014 move the `escalation` so it follows a `prevent`/`mitigate` line.",
|
|
3556
|
+
"'needs at least one threat/consequence' \u2014 a one-wing diagram is a fault tree or event tree; add the missing wing.",
|
|
3557
|
+
"'exactly one top event' \u2014 keep a single `topevent` line."
|
|
3558
|
+
]
|
|
3433
3559
|
}
|
|
3434
3560
|
};
|
|
3435
3561
|
function getGenerationProfile(type) {
|
|
@@ -3513,7 +3639,7 @@ function getExamples(type, opts = {}) {
|
|
|
3513
3639
|
function validateDsl(type, dsl) {
|
|
3514
3640
|
const resolvedType = type ? resolveDiagramType(type) : void 0;
|
|
3515
3641
|
const config = type ? { type: resolvedType ?? type } : void 0;
|
|
3516
|
-
const result =
|
|
3642
|
+
const result = chunkMLLARXOI_cjs.parseResult(dsl, config);
|
|
3517
3643
|
if (result.ok) {
|
|
3518
3644
|
return { ok: true, type: result.type };
|
|
3519
3645
|
}
|
|
@@ -3531,7 +3657,7 @@ function renderDsl(type, dsl, options = {}) {
|
|
|
3531
3657
|
...options,
|
|
3532
3658
|
...type ? { type: resolvedType ?? type } : {}
|
|
3533
3659
|
};
|
|
3534
|
-
const result =
|
|
3660
|
+
const result = chunkMLLARXOI_cjs.renderResult(dsl, config);
|
|
3535
3661
|
if (result.ok) {
|
|
3536
3662
|
return {
|
|
3537
3663
|
ok: true,
|
|
@@ -3584,5 +3710,5 @@ exports.listDiagrams = listDiagrams;
|
|
|
3584
3710
|
exports.renderDsl = renderDsl;
|
|
3585
3711
|
exports.resolveDiagramType = resolveDiagramType;
|
|
3586
3712
|
exports.validateDsl = validateDsl;
|
|
3587
|
-
//# sourceMappingURL=chunk-
|
|
3588
|
-
//# sourceMappingURL=chunk-
|
|
3713
|
+
//# sourceMappingURL=chunk-CMZKAASF.cjs.map
|
|
3714
|
+
//# sourceMappingURL=chunk-CMZKAASF.cjs.map
|