@graphty/graph-io 0.3.48 → 0.3.50
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/chunks/{approximations-C2riR4NT.js → approximations-BRXsll0T.js} +2 -2
- package/dist/chunks/{approximations-C2riR4NT.js.map → approximations-BRXsll0T.js.map} +1 -1
- package/dist/chunks/bends-BGXjv_U4.js +129 -0
- package/dist/chunks/bends-BGXjv_U4.js.map +1 -0
- package/dist/chunks/{block-Cu22ewuS.js → block-yl0f_qLO.js} +931 -164
- package/dist/chunks/block-yl0f_qLO.js.map +1 -0
- package/dist/chunks/choose-CczZJaX_.js +717 -0
- package/dist/chunks/choose-CczZJaX_.js.map +1 -0
- package/dist/chunks/{codes-CV_Bhcyi.js → codes-BE2xir2k.js} +6 -2
- package/dist/chunks/codes-BE2xir2k.js.map +1 -0
- package/dist/chunks/{constants-D0LqcsLJ.js → constants-CKkYLPtt.js} +2 -2
- package/dist/chunks/{constants-D0LqcsLJ.js.map → constants-CKkYLPtt.js.map} +1 -1
- package/dist/chunks/{context-cgmmOxZ2.js → context-DizmppHy.js} +5 -4
- package/dist/chunks/{context-cgmmOxZ2.js.map → context-DizmppHy.js.map} +1 -1
- package/dist/chunks/{convert-BcQ8_jMo.js → convert-Ct2zelbQ.js} +7 -2
- package/dist/chunks/convert-Ct2zelbQ.js.map +1 -0
- package/dist/chunks/{credentials-BiQsnMTb.js → credentials-CmvJXYeH.js} +67 -16
- package/dist/chunks/credentials-CmvJXYeH.js.map +1 -0
- package/dist/chunks/{cx-export-BEeF6ymo.js → cx-export-Bt6NoqTQ.js} +3 -3
- package/dist/chunks/{cx-export-BEeF6ymo.js.map → cx-export-Bt6NoqTQ.js.map} +1 -1
- package/dist/chunks/descriptor-B28U25x4.js +60 -0
- package/dist/chunks/descriptor-B28U25x4.js.map +1 -0
- package/dist/chunks/{descriptor-BJ-W0Jd-.js → descriptor-Dhez_Cew.js} +11 -2
- package/dist/chunks/descriptor-Dhez_Cew.js.map +1 -0
- package/dist/chunks/{emit-CD8xnY8s.js → emit-7Jkpg0yd.js} +1788 -133
- package/dist/chunks/emit-7Jkpg0yd.js.map +1 -0
- package/dist/chunks/{escape-DH2Egt-l.js → escape-CuCIzNMB.js} +8 -8
- package/dist/chunks/{escape-DH2Egt-l.js.map → escape-CuCIzNMB.js.map} +1 -1
- package/dist/chunks/{export-CZ7VRm4I.js → export-Cha4dRFz.js} +45 -387
- package/dist/chunks/export-Cha4dRFz.js.map +1 -0
- package/dist/chunks/{exporter-ChjL5fmP.js → exporter-1Ajud15J.js} +9 -8
- package/dist/chunks/{exporter-ChjL5fmP.js.map → exporter-1Ajud15J.js.map} +1 -1
- package/dist/chunks/{exporter-BIdaoIgh.js → exporter-B6yvL3wy.js} +7 -7
- package/dist/chunks/{exporter-BIdaoIgh.js.map → exporter-B6yvL3wy.js.map} +1 -1
- package/dist/chunks/{exporter-Dcw7Ldtq.js → exporter-BP6otMO6.js} +6 -6
- package/dist/chunks/{exporter-Dcw7Ldtq.js.map → exporter-BP6otMO6.js.map} +1 -1
- package/dist/chunks/{exporter-DtVU80Fa.js → exporter-CA5q8ROP.js} +9 -8
- package/dist/chunks/{exporter-DtVU80Fa.js.map → exporter-CA5q8ROP.js.map} +1 -1
- package/dist/chunks/{exporter-bxxjOrDZ.js → exporter-CQQZFJ2v.js} +1284 -156
- package/dist/chunks/exporter-CQQZFJ2v.js.map +1 -0
- package/dist/chunks/format-BXiAb-1h.js +408 -0
- package/dist/chunks/format-BXiAb-1h.js.map +1 -0
- package/dist/chunks/{generic-CP6YD34u.js → generic-Dc21MAdg.js} +387 -31
- package/dist/chunks/generic-Dc21MAdg.js.map +1 -0
- package/dist/chunks/{importer-B87_fmVx.js → importer-C6NVpCXp.js} +327 -84
- package/dist/chunks/importer-C6NVpCXp.js.map +1 -0
- package/dist/chunks/{importer-DPZDN40-.js → importer-CKFe4q54.js} +25 -17
- package/dist/chunks/importer-CKFe4q54.js.map +1 -0
- package/dist/chunks/{importer-Bji2MeWr.js → importer-CKbUbsJA.js} +13 -10
- package/dist/chunks/{importer-Bji2MeWr.js.map → importer-CKbUbsJA.js.map} +1 -1
- package/dist/chunks/{importer-CB_zV5_L.js → importer-ClCsdgTJ.js} +208 -1104
- package/dist/chunks/importer-ClCsdgTJ.js.map +1 -0
- package/dist/chunks/{importer-e3huMZbm.js → importer-CyVZTrf0.js} +14 -10
- package/dist/chunks/importer-CyVZTrf0.js.map +1 -0
- package/dist/chunks/{importer-CVT-JyDE.js → importer-DgG4v1Ms.js} +1537 -355
- package/dist/chunks/importer-DgG4v1Ms.js.map +1 -0
- package/dist/chunks/{importer-Cyy6UseH.js → importer-asFUrIsj.js} +66 -13
- package/dist/chunks/importer-asFUrIsj.js.map +1 -0
- package/dist/chunks/{input-Ccg9I22A.js → input-CAxt_aV-.js} +4 -4
- package/dist/chunks/{input-Ccg9I22A.js.map → input-CAxt_aV-.js.map} +1 -1
- package/dist/chunks/{json-elements-By172SVq.js → json-elements-Cq76WjnZ.js} +4 -4
- package/dist/chunks/{json-elements-By172SVq.js.map → json-elements-Cq76WjnZ.js.map} +1 -1
- package/dist/chunks/{lexicon-u2SI5xcx.js → lexicon-IVRq2Uoo.js} +282 -74
- package/dist/chunks/lexicon-IVRq2Uoo.js.map +1 -0
- package/dist/chunks/{ontology-export-BwgMyuF0.js → ontology-export-OMo91mb0.js} +4 -4
- package/dist/chunks/{ontology-export-BwgMyuF0.js.map → ontology-export-OMo91mb0.js.map} +1 -1
- package/dist/chunks/{records-Cgvxz-Vx.js → records-NJiYvekn.js} +2 -2
- package/dist/chunks/{records-Cgvxz-Vx.js.map → records-NJiYvekn.js.map} +1 -1
- package/dist/chunks/{report-CgdsL9Hb.js → report-CwMfYa9J.js} +23 -23
- package/dist/chunks/{report-CgdsL9Hb.js.map → report-CwMfYa9J.js.map} +1 -1
- package/dist/chunks/round-trip-Cy3_SHRZ.js +79 -0
- package/dist/chunks/round-trip-Cy3_SHRZ.js.map +1 -0
- package/dist/chunks/{sigv4-LkAzsLAu.js → sigv4-BXwVbza3.js} +5 -5
- package/dist/chunks/sigv4-BXwVbza3.js.map +1 -0
- package/dist/chunks/{styles-CaABMoO1.js → styles-CAVmBLgp.js} +1237 -138
- package/dist/chunks/styles-CAVmBLgp.js.map +1 -0
- package/dist/chunks/styles-CPczw1Jz.js +1928 -0
- package/dist/chunks/styles-CPczw1Jz.js.map +1 -0
- package/dist/chunks/styles-boK6Ln54.js +2847 -0
- package/dist/chunks/styles-boK6Ln54.js.map +1 -0
- package/dist/chunks/{styles-yed-Cs1nmrjn.js → styles-yed-XeFBQ6VS.js} +506 -175
- package/dist/chunks/styles-yed-XeFBQ6VS.js.map +1 -0
- package/dist/chunks/{text-BuKQVMz2.js → text-ystE2bYi.js} +2 -2
- package/dist/chunks/{text-BuKQVMz2.js.map → text-ystE2bYi.js.map} +1 -1
- package/dist/csv.js +7 -7
- package/dist/cx.js +2 -2
- package/dist/cx2.js +2 -2
- package/dist/cys.js +1 -1
- package/dist/dot.js +8 -4
- package/dist/dot.js.map +1 -1
- package/dist/gexf.js +42 -12
- package/dist/gexf.js.map +1 -1
- package/dist/gml.js +848 -194
- package/dist/gml.js.map +1 -1
- package/dist/graph-io.js +230 -193
- package/dist/graph-io.js.map +1 -1
- package/dist/graphml.js +3 -3
- package/dist/json.js +3 -2
- package/dist/neo4j.js +6 -6
- package/dist/obo.js +1 -1
- package/dist/pajek.js +1 -1
- package/dist/positions.js +45 -3
- package/dist/positions.js.map +1 -1
- package/dist/sources-cypher.js +141 -23
- package/dist/sources-cypher.js.map +1 -1
- package/dist/sources-ndex.js +2 -2
- package/dist/sources-rest.js +32 -6
- package/dist/sources-rest.js.map +1 -1
- package/dist/sources-sparql.d.ts +1 -0
- package/dist/sources-sparql.js +439 -0
- package/dist/sources-sparql.js.map +1 -0
- package/dist/src/formats/cx/importer.d.ts.map +1 -1
- package/dist/src/formats/cx/importer.js +5 -1
- package/dist/src/formats/cx/importer.js.map +1 -1
- package/dist/src/formats/cx/styles.d.ts +24 -1
- package/dist/src/formats/cx/styles.d.ts.map +1 -1
- package/dist/src/formats/cx/styles.js +117 -11
- package/dist/src/formats/cx/styles.js.map +1 -1
- package/dist/src/formats/cx2/importer.d.ts.map +1 -1
- package/dist/src/formats/cx2/importer.js +1 -0
- package/dist/src/formats/cx2/importer.js.map +1 -1
- package/dist/src/formats/cx2/styles.d.ts.map +1 -1
- package/dist/src/formats/cx2/styles.js +3 -1
- package/dist/src/formats/cx2/styles.js.map +1 -1
- package/dist/src/formats/cys/importer.d.ts.map +1 -1
- package/dist/src/formats/cys/importer.js +1 -0
- package/dist/src/formats/cys/importer.js.map +1 -1
- package/dist/src/formats/cys/styles.d.ts +2 -0
- package/dist/src/formats/cys/styles.d.ts.map +1 -1
- package/dist/src/formats/cys/styles.js +15 -7
- package/dist/src/formats/cys/styles.js.map +1 -1
- package/dist/src/formats/dot/drawing.d.ts +98 -0
- package/dist/src/formats/dot/drawing.d.ts.map +1 -0
- package/dist/src/formats/dot/drawing.js +734 -0
- package/dist/src/formats/dot/drawing.js.map +1 -0
- package/dist/src/formats/dot/exporter.d.ts.map +1 -1
- package/dist/src/formats/dot/exporter.js +34 -2
- package/dist/src/formats/dot/exporter.js.map +1 -1
- package/dist/src/formats/dot/importer.d.ts +6 -1
- package/dist/src/formats/dot/importer.d.ts.map +1 -1
- package/dist/src/formats/dot/importer.js +170 -33
- package/dist/src/formats/dot/importer.js.map +1 -1
- package/dist/src/formats/dot/index.d.ts +3 -1
- package/dist/src/formats/dot/index.d.ts.map +1 -1
- package/dist/src/formats/dot/index.js +2 -1
- package/dist/src/formats/dot/index.js.map +1 -1
- package/dist/src/formats/dot/label-places.d.ts +41 -0
- package/dist/src/formats/dot/label-places.d.ts.map +1 -0
- package/dist/src/formats/dot/label-places.js +185 -0
- package/dist/src/formats/dot/label-places.js.map +1 -0
- package/dist/src/formats/dot/names.d.ts +13 -0
- package/dist/src/formats/dot/names.d.ts.map +1 -1
- package/dist/src/formats/dot/names.js +13 -0
- package/dist/src/formats/dot/names.js.map +1 -1
- package/dist/src/formats/dot/record.d.ts +50 -0
- package/dist/src/formats/dot/record.d.ts.map +1 -0
- package/dist/src/formats/dot/record.js +275 -0
- package/dist/src/formats/dot/record.js.map +1 -0
- package/dist/src/formats/dot/styles.d.ts +72 -2
- package/dist/src/formats/dot/styles.d.ts.map +1 -1
- package/dist/src/formats/dot/styles.js +1500 -119
- package/dist/src/formats/dot/styles.js.map +1 -1
- package/dist/src/formats/gexf/dialog-metrics.d.ts +15 -0
- package/dist/src/formats/gexf/dialog-metrics.d.ts.map +1 -0
- package/dist/src/formats/gexf/dialog-metrics.js +59 -0
- package/dist/src/formats/gexf/dialog-metrics.js.map +1 -0
- package/dist/src/formats/gexf/importer.d.ts +7 -0
- package/dist/src/formats/gexf/importer.d.ts.map +1 -1
- package/dist/src/formats/gexf/importer.js +41 -5
- package/dist/src/formats/gexf/importer.js.map +1 -1
- package/dist/src/formats/gexf/preview.d.ts +77 -0
- package/dist/src/formats/gexf/preview.d.ts.map +1 -0
- package/dist/src/formats/gexf/preview.js +191 -0
- package/dist/src/formats/gexf/preview.js.map +1 -0
- package/dist/src/formats/gexf/schema.d.ts.map +1 -1
- package/dist/src/formats/gexf/schema.js +2 -1
- package/dist/src/formats/gexf/schema.js.map +1 -1
- package/dist/src/formats/gexf/styles.d.ts +58 -31
- package/dist/src/formats/gexf/styles.d.ts.map +1 -1
- package/dist/src/formats/gexf/styles.js +848 -225
- package/dist/src/formats/gexf/styles.js.map +1 -1
- package/dist/src/formats/gml/importer.d.ts +5 -2
- package/dist/src/formats/gml/importer.d.ts.map +1 -1
- package/dist/src/formats/gml/importer.js +258 -71
- package/dist/src/formats/gml/importer.js.map +1 -1
- package/dist/src/formats/gml/index.d.ts +1 -1
- package/dist/src/formats/gml/index.d.ts.map +1 -1
- package/dist/src/formats/gml/index.js +1 -1
- package/dist/src/formats/gml/index.js.map +1 -1
- package/dist/src/formats/gml/positions.d.ts +7 -0
- package/dist/src/formats/gml/positions.d.ts.map +1 -1
- package/dist/src/formats/gml/positions.js +29 -7
- package/dist/src/formats/gml/positions.js.map +1 -1
- package/dist/src/formats/gml/styles.d.ts.map +1 -1
- package/dist/src/formats/gml/styles.js +754 -102
- package/dist/src/formats/gml/styles.js.map +1 -1
- package/dist/src/formats/graphml/styles-plain.d.ts.map +1 -1
- package/dist/src/formats/graphml/styles-plain.js +6 -10
- package/dist/src/formats/graphml/styles-plain.js.map +1 -1
- package/dist/src/formats/graphml/styles-yed.d.ts +21 -15
- package/dist/src/formats/graphml/styles-yed.d.ts.map +1 -1
- package/dist/src/formats/graphml/styles-yed.js +695 -164
- package/dist/src/formats/graphml/styles-yed.js.map +1 -1
- package/dist/src/formats/graphml/styles-yfiles3.d.ts +1 -1
- package/dist/src/formats/graphml/styles-yfiles3.d.ts.map +1 -1
- package/dist/src/formats/graphml/styles-yfiles3.js +431 -64
- package/dist/src/formats/graphml/styles-yfiles3.js.map +1 -1
- package/dist/src/formats/graphml/yfiles.d.ts +3 -3
- package/dist/src/formats/graphml/yfiles.d.ts.map +1 -1
- package/dist/src/formats/graphml/yfiles.js +16 -6
- package/dist/src/formats/graphml/yfiles.js.map +1 -1
- package/dist/src/formats/json/dialect.d.ts +3 -2
- package/dist/src/formats/json/dialect.d.ts.map +1 -1
- package/dist/src/formats/json/dialect.js +39 -5
- package/dist/src/formats/json/dialect.js.map +1 -1
- package/dist/src/formats/json/importer.d.ts +13 -2
- package/dist/src/formats/json/importer.d.ts.map +1 -1
- package/dist/src/formats/json/importer.js +42 -6
- package/dist/src/formats/json/importer.js.map +1 -1
- package/dist/src/formats/json/index.d.ts +1 -1
- package/dist/src/formats/json/index.d.ts.map +1 -1
- package/dist/src/formats/json/index.js +1 -1
- package/dist/src/formats/json/index.js.map +1 -1
- package/dist/src/formats/json/positions.d.ts +5 -2
- package/dist/src/formats/json/positions.d.ts.map +1 -1
- package/dist/src/formats/json/positions.js +20 -4
- package/dist/src/formats/json/positions.js.map +1 -1
- package/dist/src/formats/json/styles.d.ts +12 -1
- package/dist/src/formats/json/styles.d.ts.map +1 -1
- package/dist/src/formats/json/styles.js +1843 -136
- package/dist/src/formats/json/styles.js.map +1 -1
- package/dist/src/formats/pajek/draw.d.ts +104 -0
- package/dist/src/formats/pajek/draw.d.ts.map +1 -0
- package/dist/src/formats/pajek/draw.js +382 -0
- package/dist/src/formats/pajek/draw.js.map +1 -0
- package/dist/src/formats/pajek/exporter.d.ts.map +1 -1
- package/dist/src/formats/pajek/exporter.js +70 -51
- package/dist/src/formats/pajek/exporter.js.map +1 -1
- package/dist/src/formats/pajek/importer.d.ts +9 -0
- package/dist/src/formats/pajek/importer.d.ts.map +1 -1
- package/dist/src/formats/pajek/importer.js +233 -102
- package/dist/src/formats/pajek/importer.js.map +1 -1
- package/dist/src/formats/pajek/index.d.ts +1 -0
- package/dist/src/formats/pajek/index.d.ts.map +1 -1
- package/dist/src/formats/pajek/index.js.map +1 -1
- package/dist/src/formats/pajek/styles.d.ts +15 -7
- package/dist/src/formats/pajek/styles.d.ts.map +1 -1
- package/dist/src/formats/pajek/styles.js +1395 -114
- package/dist/src/formats/pajek/styles.js.map +1 -1
- package/dist/src/formats/pajek/syntax.d.ts +10 -1
- package/dist/src/formats/pajek/syntax.d.ts.map +1 -1
- package/dist/src/formats/pajek/syntax.js +26 -2
- package/dist/src/formats/pajek/syntax.js.map +1 -1
- package/dist/src/formats/xgmml/emit.d.ts +1 -0
- package/dist/src/formats/xgmml/emit.d.ts.map +1 -1
- package/dist/src/formats/xgmml/emit.js +65 -5
- package/dist/src/formats/xgmml/emit.js.map +1 -1
- package/dist/src/formats/xgmml/styles.d.ts +23 -3
- package/dist/src/formats/xgmml/styles.d.ts.map +1 -1
- package/dist/src/formats/xgmml/styles.js +277 -60
- package/dist/src/formats/xgmml/styles.js.map +1 -1
- package/dist/src/index.d.ts +6 -5
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +6 -5
- package/dist/src/index.js.map +1 -1
- package/dist/src/positions/convert.d.ts.map +1 -1
- package/dist/src/positions/convert.js +11 -1
- package/dist/src/positions/convert.js.map +1 -1
- package/dist/src/positions/extract.d.ts.map +1 -1
- package/dist/src/positions/extract.js +53 -1
- package/dist/src/positions/extract.js.map +1 -1
- package/dist/src/positions/index.d.ts +1 -1
- package/dist/src/positions/index.d.ts.map +1 -1
- package/dist/src/positions/types.d.ts +59 -0
- package/dist/src/positions/types.d.ts.map +1 -1
- package/dist/src/sources/builtins.d.ts +1 -1
- package/dist/src/sources/builtins.d.ts.map +1 -1
- package/dist/src/sources/builtins.js +8 -2
- package/dist/src/sources/builtins.js.map +1 -1
- package/dist/src/sources/context.d.ts.map +1 -1
- package/dist/src/sources/context.js +1 -0
- package/dist/src/sources/context.js.map +1 -1
- package/dist/src/sources/credentials.d.ts +50 -1
- package/dist/src/sources/credentials.d.ts.map +1 -1
- package/dist/src/sources/credentials.js +69 -0
- package/dist/src/sources/credentials.js.map +1 -1
- package/dist/src/sources/cypher/descriptor.d.ts.map +1 -1
- package/dist/src/sources/cypher/descriptor.js +5 -0
- package/dist/src/sources/cypher/descriptor.js.map +1 -1
- package/dist/src/sources/cypher/index.d.ts.map +1 -1
- package/dist/src/sources/cypher/index.js +125 -18
- package/dist/src/sources/cypher/index.js.map +1 -1
- package/dist/src/sources/cypher/params.d.ts +1 -1
- package/dist/src/sources/cypher/params.d.ts.map +1 -1
- package/dist/src/sources/cypher/query-builder.d.ts +17 -0
- package/dist/src/sources/cypher/query-builder.d.ts.map +1 -1
- package/dist/src/sources/cypher/query-builder.js +31 -0
- package/dist/src/sources/cypher/query-builder.js.map +1 -1
- package/dist/src/sources/ids.d.ts +5 -0
- package/dist/src/sources/ids.d.ts.map +1 -1
- package/dist/src/sources/ids.js +5 -0
- package/dist/src/sources/ids.js.map +1 -1
- package/dist/src/sources/params.d.ts +3 -0
- package/dist/src/sources/params.d.ts.map +1 -1
- package/dist/src/sources/rest/descriptor.d.ts.map +1 -1
- package/dist/src/sources/rest/descriptor.js +9 -0
- package/dist/src/sources/rest/descriptor.js.map +1 -1
- package/dist/src/sources/rest/openalex.d.ts +4 -2
- package/dist/src/sources/rest/openalex.d.ts.map +1 -1
- package/dist/src/sources/rest/openalex.js +4 -2
- package/dist/src/sources/rest/openalex.js.map +1 -1
- package/dist/src/sources/rest/source.d.ts.map +1 -1
- package/dist/src/sources/rest/source.js +38 -0
- package/dist/src/sources/rest/source.js.map +1 -1
- package/dist/src/sources/run.d.ts +2 -0
- package/dist/src/sources/run.d.ts.map +1 -1
- package/dist/src/sources/run.js +30 -3
- package/dist/src/sources/run.js.map +1 -1
- package/dist/src/sources/sigv4.d.ts +5 -3
- package/dist/src/sources/sigv4.d.ts.map +1 -1
- package/dist/src/sources/sigv4.js +6 -4
- package/dist/src/sources/sigv4.js.map +1 -1
- package/dist/src/sources/sparql/descriptor.d.ts +10 -0
- package/dist/src/sources/sparql/descriptor.d.ts.map +1 -0
- package/dist/src/sources/sparql/descriptor.js +64 -0
- package/dist/src/sources/sparql/descriptor.js.map +1 -0
- package/dist/src/sources/sparql/index.d.ts +28 -0
- package/dist/src/sources/sparql/index.d.ts.map +1 -0
- package/dist/src/sources/sparql/index.js +327 -0
- package/dist/src/sources/sparql/index.js.map +1 -0
- package/dist/src/sources/sparql/ntriples.d.ts +69 -0
- package/dist/src/sources/sparql/ntriples.d.ts.map +1 -0
- package/dist/src/sources/sparql/ntriples.js +180 -0
- package/dist/src/sources/sparql/ntriples.js.map +1 -0
- package/dist/src/sources/sparql/params.d.ts +27 -0
- package/dist/src/sources/sparql/params.d.ts.map +1 -0
- package/dist/src/sources/sparql/params.js +5 -0
- package/dist/src/sources/sparql/params.js.map +1 -0
- package/dist/src/sources/sparql/query.d.ts +73 -0
- package/dist/src/sources/sparql/query.d.ts.map +1 -0
- package/dist/src/sources/sparql/query.js +164 -0
- package/dist/src/sources/sparql/query.js.map +1 -0
- package/dist/src/sources/types.d.ts +60 -0
- package/dist/src/sources/types.d.ts.map +1 -1
- package/dist/src/styles/annotations.d.ts +61 -5
- package/dist/src/styles/annotations.d.ts.map +1 -1
- package/dist/src/styles/annotations.js +130 -22
- package/dist/src/styles/annotations.js.map +1 -1
- package/dist/src/styles/canon/bends.d.ts +46 -0
- package/dist/src/styles/canon/bends.d.ts.map +1 -1
- package/dist/src/styles/canon/bends.js +123 -0
- package/dist/src/styles/canon/bends.js.map +1 -1
- package/dist/src/styles/canon/color-tables.d.ts +6 -1
- package/dist/src/styles/canon/color-tables.d.ts.map +1 -1
- package/dist/src/styles/canon/color-tables.js +10 -4
- package/dist/src/styles/canon/color-tables.js.map +1 -1
- package/dist/src/styles/canon/color.d.ts +3 -1
- package/dist/src/styles/canon/color.d.ts.map +1 -1
- package/dist/src/styles/canon/color.js +103 -3
- package/dist/src/styles/canon/color.js.map +1 -1
- package/dist/src/styles/canon/enums.d.ts +2 -2
- package/dist/src/styles/canon/enums.d.ts.map +1 -1
- package/dist/src/styles/canon/enums.js +89 -7
- package/dist/src/styles/canon/enums.js.map +1 -1
- package/dist/src/styles/canon/graphviz.d.ts +12 -3
- package/dist/src/styles/canon/graphviz.d.ts.map +1 -1
- package/dist/src/styles/canon/graphviz.js +57 -9
- package/dist/src/styles/canon/graphviz.js.map +1 -1
- package/dist/src/styles/canon/number.d.ts +8 -0
- package/dist/src/styles/canon/number.d.ts.map +1 -1
- package/dist/src/styles/canon/number.js +18 -0
- package/dist/src/styles/canon/number.js.map +1 -1
- package/dist/src/styles/canon/text.d.ts +29 -2
- package/dist/src/styles/canon/text.d.ts.map +1 -1
- package/dist/src/styles/canon/text.js +156 -16
- package/dist/src/styles/canon/text.js.map +1 -1
- package/dist/src/styles/codes.d.ts +2 -0
- package/dist/src/styles/codes.d.ts.map +1 -1
- package/dist/src/styles/codes.js +2 -0
- package/dist/src/styles/codes.js.map +1 -1
- package/dist/src/styles/cyjs/cascade.d.ts.map +1 -1
- package/dist/src/styles/cyjs/cascade.js +1139 -79
- package/dist/src/styles/cyjs/cascade.js.map +1 -1
- package/dist/src/styles/cyjs/defaults-table.d.ts.map +1 -1
- package/dist/src/styles/cyjs/defaults-table.js +4 -0
- package/dist/src/styles/cyjs/defaults-table.js.map +1 -1
- package/dist/src/styles/cyjs/emit.d.ts.map +1 -1
- package/dist/src/styles/cyjs/emit.js +232 -10
- package/dist/src/styles/cyjs/emit.js.map +1 -1
- package/dist/src/styles/cyjs/face.d.ts +20 -0
- package/dist/src/styles/cyjs/face.d.ts.map +1 -0
- package/dist/src/styles/cyjs/face.js +332 -0
- package/dist/src/styles/cyjs/face.js.map +1 -0
- package/dist/src/styles/cyjs/mappers.d.ts +44 -1
- package/dist/src/styles/cyjs/mappers.d.ts.map +1 -1
- package/dist/src/styles/cyjs/mappers.js +475 -26
- package/dist/src/styles/cyjs/mappers.js.map +1 -1
- package/dist/src/styles/cyjs/routes.d.ts +53 -0
- package/dist/src/styles/cyjs/routes.d.ts.map +1 -0
- package/dist/src/styles/cyjs/routes.js +360 -0
- package/dist/src/styles/cyjs/routes.js.map +1 -0
- package/dist/src/styles/cytoscape/charts.d.ts +23 -0
- package/dist/src/styles/cytoscape/charts.d.ts.map +1 -0
- package/dist/src/styles/cytoscape/charts.js +560 -0
- package/dist/src/styles/cytoscape/charts.js.map +1 -0
- package/dist/src/styles/cytoscape/emit.d.ts.map +1 -1
- package/dist/src/styles/cytoscape/emit.js +156 -48
- package/dist/src/styles/cytoscape/emit.js.map +1 -1
- package/dist/src/styles/cytoscape/lexicon.d.ts +91 -3
- package/dist/src/styles/cytoscape/lexicon.d.ts.map +1 -1
- package/dist/src/styles/cytoscape/lexicon.js +387 -77
- package/dist/src/styles/cytoscape/lexicon.js.map +1 -1
- package/dist/src/styles/cytoscape/mappings.d.ts +30 -0
- package/dist/src/styles/cytoscape/mappings.d.ts.map +1 -1
- package/dist/src/styles/cytoscape/mappings.js +92 -0
- package/dist/src/styles/cytoscape/mappings.js.map +1 -1
- package/dist/src/styles/cytoscape/resolve.d.ts +42 -2
- package/dist/src/styles/cytoscape/resolve.d.ts.map +1 -1
- package/dist/src/styles/cytoscape/resolve.js +623 -17
- package/dist/src/styles/cytoscape/resolve.js.map +1 -1
- package/dist/src/styles/defaults.d.ts +46 -26
- package/dist/src/styles/defaults.d.ts.map +1 -1
- package/dist/src/styles/defaults.js +308 -71
- package/dist/src/styles/defaults.js.map +1 -1
- package/dist/src/styles/index.d.ts +4 -3
- package/dist/src/styles/index.d.ts.map +1 -1
- package/dist/src/styles/index.js +3 -2
- package/dist/src/styles/index.js.map +1 -1
- package/dist/src/styles/internal.d.ts +1 -0
- package/dist/src/styles/internal.d.ts.map +1 -1
- package/dist/src/styles/internal.js +1 -0
- package/dist/src/styles/internal.js.map +1 -1
- package/dist/src/styles/io/generic.d.ts.map +1 -1
- package/dist/src/styles/io/generic.js +56 -16
- package/dist/src/styles/io/generic.js.map +1 -1
- package/dist/src/styles/io/round-trip.d.ts +56 -0
- package/dist/src/styles/io/round-trip.d.ts.map +1 -0
- package/dist/src/styles/io/round-trip.js +138 -0
- package/dist/src/styles/io/round-trip.js.map +1 -0
- package/dist/src/styles/io/writer.d.ts.map +1 -1
- package/dist/src/styles/io/writer.js +6 -1
- package/dist/src/styles/io/writer.js.map +1 -1
- package/dist/src/styles/notes.d.ts.map +1 -1
- package/dist/src/styles/notes.js +1 -0
- package/dist/src/styles/notes.js.map +1 -1
- package/dist/src/styles/plan/features.d.ts +1 -1
- package/dist/src/styles/plan/features.d.ts.map +1 -1
- package/dist/src/styles/plan/features.js +22 -2
- package/dist/src/styles/plan/features.js.map +1 -1
- package/dist/src/styles/plan/index.d.ts +1 -1
- package/dist/src/styles/plan/index.d.ts.map +1 -1
- package/dist/src/styles/plan/index.js +1 -1
- package/dist/src/styles/plan/index.js.map +1 -1
- package/dist/src/styles/plan/plan.d.ts.map +1 -1
- package/dist/src/styles/plan/plan.js +61 -4
- package/dist/src/styles/plan/plan.js.map +1 -1
- package/dist/src/styles/plan/resolve.d.ts +11 -0
- package/dist/src/styles/plan/resolve.d.ts.map +1 -1
- package/dist/src/styles/plan/resolve.js +40 -4
- package/dist/src/styles/plan/resolve.js.map +1 -1
- package/dist/src/styles/slots.d.ts +14 -0
- package/dist/src/styles/slots.d.ts.map +1 -0
- package/dist/src/styles/slots.js +20 -0
- package/dist/src/styles/slots.js.map +1 -0
- package/dist/src/styles/types.d.ts +687 -6
- package/dist/src/styles/types.d.ts.map +1 -1
- package/dist/src/styles/vocabulary.d.ts +3 -2
- package/dist/src/styles/vocabulary.d.ts.map +1 -1
- package/dist/src/styles/vocabulary.js +224 -0
- package/dist/src/styles/vocabulary.js.map +1 -1
- package/dist/styles.js +30 -239
- package/dist/styles.js.map +1 -1
- package/dist/xgmml.js +3 -3
- package/package.json +27 -7
- package/src/formats/cx/importer.ts +6 -1
- package/src/formats/cx/styles.ts +143 -9
- package/src/formats/cx2/importer.ts +1 -0
- package/src/formats/cx2/styles.ts +3 -1
- package/src/formats/cys/importer.ts +1 -0
- package/src/formats/cys/styles.ts +27 -5
- package/src/formats/dot/drawing.ts +799 -0
- package/src/formats/dot/exporter.ts +37 -1
- package/src/formats/dot/importer.ts +192 -36
- package/src/formats/dot/index.ts +3 -1
- package/src/formats/dot/label-places.ts +241 -0
- package/src/formats/dot/names.ts +15 -0
- package/src/formats/dot/record.ts +336 -0
- package/src/formats/dot/styles.ts +1702 -149
- package/src/formats/gexf/dialog-metrics.ts +61 -0
- package/src/formats/gexf/importer.ts +50 -5
- package/src/formats/gexf/preview.ts +217 -0
- package/src/formats/gexf/schema.ts +2 -1
- package/src/formats/gexf/styles.ts +1099 -245
- package/src/formats/gml/importer.ts +291 -76
- package/src/formats/gml/index.ts +1 -1
- package/src/formats/gml/positions.ts +29 -7
- package/src/formats/gml/styles.ts +852 -110
- package/src/formats/graphml/styles-plain.ts +6 -15
- package/src/formats/graphml/styles-yed.ts +765 -176
- package/src/formats/graphml/styles-yfiles3.ts +487 -63
- package/src/formats/graphml/yfiles.ts +19 -6
- package/src/formats/json/dialect.ts +41 -5
- package/src/formats/json/importer.ts +59 -7
- package/src/formats/json/index.ts +1 -0
- package/src/formats/json/positions.ts +22 -5
- package/src/formats/json/styles.ts +2123 -171
- package/src/formats/pajek/draw.ts +469 -0
- package/src/formats/pajek/exporter.ts +81 -49
- package/src/formats/pajek/importer.ts +278 -103
- package/src/formats/pajek/index.ts +1 -0
- package/src/formats/pajek/styles.ts +1506 -133
- package/src/formats/pajek/syntax.ts +27 -2
- package/src/formats/xgmml/emit.ts +73 -5
- package/src/formats/xgmml/styles.ts +330 -71
- package/src/index.ts +12 -1
- package/src/positions/convert.ts +12 -1
- package/src/positions/extract.ts +55 -1
- package/src/positions/index.ts +1 -0
- package/src/positions/types.ts +60 -0
- package/src/sources/builtins.ts +8 -1
- package/src/sources/context.ts +1 -0
- package/src/sources/credentials.ts +90 -1
- package/src/sources/cypher/descriptor.ts +7 -1
- package/src/sources/cypher/index.ts +149 -18
- package/src/sources/cypher/params.ts +1 -1
- package/src/sources/cypher/query-builder.ts +33 -0
- package/src/sources/ids.ts +6 -0
- package/src/sources/params.ts +3 -0
- package/src/sources/rest/descriptor.ts +9 -0
- package/src/sources/rest/openalex.ts +4 -2
- package/src/sources/rest/source.ts +41 -0
- package/src/sources/run.ts +35 -3
- package/src/sources/sigv4.ts +6 -4
- package/src/sources/sparql/descriptor.ts +67 -0
- package/src/sources/sparql/index.ts +371 -0
- package/src/sources/sparql/ntriples.ts +219 -0
- package/src/sources/sparql/params.ts +28 -0
- package/src/sources/sparql/query.ts +216 -0
- package/src/sources/types.ts +68 -0
- package/src/styles/annotations.ts +201 -27
- package/src/styles/canon/bends.ts +137 -0
- package/src/styles/canon/color-tables.ts +10 -4
- package/src/styles/canon/color.ts +105 -3
- package/src/styles/canon/enums.ts +107 -8
- package/src/styles/canon/graphviz.ts +71 -10
- package/src/styles/canon/number.ts +19 -0
- package/src/styles/canon/text.ts +187 -16
- package/src/styles/codes.ts +2 -0
- package/src/styles/cyjs/cascade.ts +1303 -84
- package/src/styles/cyjs/defaults-table.ts +4 -0
- package/src/styles/cyjs/emit.ts +268 -14
- package/src/styles/cyjs/face.ts +372 -0
- package/src/styles/cyjs/mappers.ts +506 -27
- package/src/styles/cyjs/routes.ts +432 -0
- package/src/styles/cytoscape/charts.ts +684 -0
- package/src/styles/cytoscape/emit.ts +170 -48
- package/src/styles/cytoscape/lexicon.ts +431 -78
- package/src/styles/cytoscape/mappings.ts +108 -0
- package/src/styles/cytoscape/resolve.ts +741 -17
- package/src/styles/defaults.ts +417 -108
- package/src/styles/index.ts +5 -0
- package/src/styles/internal.ts +1 -0
- package/src/styles/io/generic.ts +79 -23
- package/src/styles/io/round-trip.ts +202 -0
- package/src/styles/io/writer.ts +6 -1
- package/src/styles/notes.ts +1 -0
- package/src/styles/plan/features.ts +23 -2
- package/src/styles/plan/index.ts +1 -1
- package/src/styles/plan/plan.ts +69 -5
- package/src/styles/plan/resolve.ts +47 -4
- package/src/styles/slots.ts +25 -0
- package/src/styles/types.ts +698 -5
- package/src/styles/vocabulary.ts +232 -2
- package/dist/chunks/block-Cu22ewuS.js.map +0 -1
- package/dist/chunks/choose-Cdx6Enl2.js +0 -57
- package/dist/chunks/choose-Cdx6Enl2.js.map +0 -1
- package/dist/chunks/codes-CV_Bhcyi.js.map +0 -1
- package/dist/chunks/convert-BcQ8_jMo.js.map +0 -1
- package/dist/chunks/credentials-BiQsnMTb.js.map +0 -1
- package/dist/chunks/descriptor-BJ-W0Jd-.js.map +0 -1
- package/dist/chunks/emit-CD8xnY8s.js.map +0 -1
- package/dist/chunks/export-CZ7VRm4I.js.map +0 -1
- package/dist/chunks/exporter-bxxjOrDZ.js.map +0 -1
- package/dist/chunks/format-BMS-1Nxb.js +0 -64
- package/dist/chunks/format-BMS-1Nxb.js.map +0 -1
- package/dist/chunks/generic-CP6YD34u.js.map +0 -1
- package/dist/chunks/importer-B87_fmVx.js.map +0 -1
- package/dist/chunks/importer-CB_zV5_L.js.map +0 -1
- package/dist/chunks/importer-CVT-JyDE.js.map +0 -1
- package/dist/chunks/importer-Cyy6UseH.js.map +0 -1
- package/dist/chunks/importer-DPZDN40-.js.map +0 -1
- package/dist/chunks/importer-e3huMZbm.js.map +0 -1
- package/dist/chunks/lexicon-u2SI5xcx.js.map +0 -1
- package/dist/chunks/sigv4-LkAzsLAu.js.map +0 -1
- package/dist/chunks/styles-CaABMoO1.js.map +0 -1
- package/dist/chunks/styles-P_gmFAOi.js +0 -770
- package/dist/chunks/styles-P_gmFAOi.js.map +0 -1
- package/dist/chunks/styles-yed-Cs1nmrjn.js.map +0 -1
- package/dist/chunks/writer-DvHTl36J.js +0 -449
- package/dist/chunks/writer-DvHTl36J.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"importer-e3huMZbm.js","sources":["../../src/formats/cx2/styles.ts","../../src/formats/cx2/importer.ts"],"sourcesContent":["/**\n * The styles of CX2 files: the `visualProperties` aspect (defaults, `nodeMapping`, `edgeMapping`), the dependencies\n * in `visualEditorProperties`, and the `nodeBypasses` / `edgeBypasses` columns, resolved the way Cytoscape draws\n * them with Cytoscape desktop's default style beneath. The reading and writing CX version 1 shares are in\n * `../cx/styles.ts`.\n */\n\nimport type { GraphSnapshot } from \"@graphty/graph-format\";\n\nimport { cytoscapeStyleFromCx2 } from \"../../styles/cytoscape/mappings.js\";\nimport { StyleNotes } from \"../../styles/notes.js\";\nimport type { ImporterStyles, StyleReadContext, StyleWriteCapabilities } from \"../../styles/types.js\";\nimport { type Cx2StyleSource, cytoscapeWriteCapabilities, readDeclaredStyles } from \"../cx/styles.js\";\n\n/** What the CX2 writer holds of a graph's styles. */\nexport const CX2_STYLE_CAPABILITIES: StyleWriteCapabilities = cytoscapeWriteCapabilities(\"cx2\");\n\n/**\n * The styles of an imported CX2 network.\n * @param snapshot - the network\n * @param context - what the import kept, the budget and the cancel signal\n * @returns the styles\n */\nexport function readCx2Styles(snapshot: GraphSnapshot, context: StyleReadContext): ImporterStyles {\n const notes = new StyleNotes();\n const kept = context.kept as Cx2StyleSource | undefined;\n const style = cytoscapeStyleFromCx2(kept?.visualProperties, kept?.visualEditorProperties, notes);\n return readDeclaredStyles(snapshot, context, style, \"cx2.bypass\", notes, \"cx2\");\n}\n","/**\n * The CX2 importer (design/graph-io/cytoscape-and-obo/design.md section 1.3; the feature and error\n * inventory is research-cx2.md): the JSON exchange format of NDEx, Cytoscape 3.10+ and Cytoscape\n * Web. A CX2 document is one array: a descriptor (`CXVersion`), aspect blocks (`nodes`, `edges`,\n * `attributeDeclarations`, `networkAttributes`, `nodeBypasses`, `visualProperties`, opaque\n * aspects) and a final `status`.\n *\n * The document is read through the streaming scanner of common/json-elements.ts, so its text is\n * never held as one string; the parsed aspect elements are collected and the graph is built at the\n * end, which makes every aspect order the format allows (declarations after the nodes, edges\n * before their nodes) read the same.\n *\n * Mapping: every edge is directed (CX2 has no undirected edge); node ids follow the CX id rule\n * (design section 1.0.2); declared attributes become typed columns named by their full name, with\n * the alias in `origin.id` and the declared default in `meta.default`; `name` is the label; node\n * `x` / `y` become the position column with y flipped to y-up, `z` the `z` column; per-element\n * bypasses become one column per visual property (origin namespace \"cx2.bypass\"); style rules\n * (`visualProperties`, `visualEditorProperties`) and every opaque aspect are kept verbatim in\n * `meta.extra.cx2.opaque`. Asked for styles (`importGraph(..., { styles: true })`), the importer reads\n * the style rules and the bypasses (styles.ts), kept for it through the report; otherwise\n * W_STYLES_NOT_IMPORTED. The `graphty.styles` aspect of a file graphty wrote becomes the graph\n * attribute of that name, as in every other format.\n */\n\nimport {\n type ColumnDecl,\n type ColumnHandle,\n type Dtype,\n GraphFormatError,\n type GraphMetaPatch,\n type GraphSink,\n INVALID_INDEX,\n type NodeId,\n type ScalarDtype,\n} from \"@graphty/graph-format\";\n\nimport { declareResolved, uniqueColumnName } from \"../../common/attributes.js\";\nimport {\n ASPECT_ORDER_CODE,\n BAD_ASPECT_BLOCK_CODE,\n BAD_DEFAULT_CODE,\n BAD_VALUE_CODE,\n COLUMN_RENAMED_CODE,\n COUNT_MISMATCH_CODE,\n DANGLING_REFERENCE_CODE,\n DIRECTION_FORCED_CODE,\n DIRECTION_REFUSED_CODE,\n DUPLICATE_ATTRIBUTE_CODE,\n DUPLICATE_EDGE_ID_CODE,\n DUPLICATE_NODE_CODE,\n ELEMENT_ISSUE,\n EMPTY_INPUT_CODE,\n ENCODING_FALLBACK_CODE,\n ID_MERGED_CODE,\n ID_TEXT_TYPE_CODE,\n INPUT_ISSUE,\n INVALID_ENCODING_CODE,\n INVALID_UTF8_CODE,\n JSON_NONSTANDARD_NUMBER_CODE,\n MISSING_ENDPOINT_CODE,\n MISSING_ID_CODE,\n MULTI_ASPECT_FRAGMENT_CODE,\n OPTION_IGNORED_CODE,\n PRECISION_CODE,\n ROLE_TAKEN_CODE,\n SINGLE_OBJECT_ASPECT_CODE,\n SINK_OPTION_CODE,\n STATUS_FAILED_CODE,\n STATUS_WARNING_CODE,\n STYLES_NOT_IMPORTED_CODE,\n SYNTAX_CODE,\n TOO_LARGE_CODE,\n UNKNOWN_ATTR_TYPE_CODE,\n UNKNOWN_ELEMENT_CODE,\n UNKNOWN_ENCODING_CODE,\n} from \"../../common/codes.js\";\nimport { DirectionResolver } from \"../../common/direction.js\";\nimport { IdCoercer } from \"../../common/ids.js\";\nimport { textChunks, throwIfAborted } from \"../../common/input.js\";\nimport {\n cxId,\n CxStructure,\n declareFresh,\n ExactInteger,\n flipY,\n headText,\n inexactLiteral,\n isRecord,\n JsonScanError,\n keptPrecision,\n plainJson,\n positionDecl,\n reportSharedBlock,\n reportTooDeep,\n scanAspects,\n setOwn,\n zDecl,\n} from \"../../common/json-elements.js\";\nimport {\n type ImportFormatDefaults,\n reportSinkOptions,\n reportUnusedOptions,\n type ResolvedImportOptions,\n resolveImportOptions,\n} from \"../../common/options.js\";\nimport { agree, plural } from \"../../common/plural.js\";\nimport { ImportReportBuilder } from \"../../common/report.js\";\nimport { weightFromValue } from \"../../common/weights.js\";\nimport { STYLE_BLOCK_NAME } from \"../../styles/io/block.js\";\nimport { type CommonImportOptions, type GraphImporter, type ImportInput, type ImportReport } from \"../../types.js\";\nimport { blockOfAspect, type Cx2StyleSource } from \"../cx/styles.js\";\nimport { readCx2Styles } from \"./styles.js\";\n\n/**\n * The format name.\n * @category Plugin helpers\n */\nexport const CX2_FORMAT = \"cx2\";\n\n/**\n * The node attribute the exporter's `sanitizeIds: \"mangle\"` keeps an original id in.\n * @category Plugin helpers\n */\nexport const ORIGINAL_ID_ATTRIBUTE = \"graphty:originalId\";\n\n/**\n * The origin namespace of the per-element visual property columns.\n * @category Plugin helpers\n */\nexport const BYPASS_NAMESPACE = \"cx2.bypass\";\n\n/**\n * The format-specific options of the CX2 importer.\n * @category Built-in formats\n */\nexport interface Cx2ImportOptions extends CommonImportOptions {\n /**\n * Where Cytoscape's `z` value (a drawing order, not a depth) goes: \"column\" keeps it as a node\n * attribute named `z`; \"position\" makes it the third coordinate of the position.\n * @defaultValue \"column\"\n */\n zAs?: \"column\" | \"position\" | undefined;\n}\n\n/**\n * The issue codes the CX2 importer records, by name: the codes shared with\n * the other importers and the CX2-specific ones. A key is the code without\n * its severity and format prefixes.\n * @category Built-in formats\n */\nexport const CX2_ISSUE = Object.freeze({\n ...INPUT_ISSUE,\n ...ELEMENT_ISSUE,\n /** The input is empty. The import stops. */\n EMPTY_INPUT: EMPTY_INPUT_CODE,\n /** The text is not valid JSON. The import stops. */\n SYNTAX: SYNTAX_CODE,\n /** The input is not valid UTF-8. The import stops. */\n INVALID_UTF8: INVALID_UTF8_CODE,\n /**\n * Some bytes are not valid in the encoding that was chosen (by a byte order mark or the `encoding` option). The\n * import stops.\n */\n INVALID_ENCODING: INVALID_ENCODING_CODE,\n /** Bytes that are not UTF-8 were read as windows-1252. */\n ENCODING_FALLBACK: ENCODING_FALLBACK_CODE,\n /** An encoding the platform cannot decode was ignored. */\n UNKNOWN_ENCODING: UNKNOWN_ENCODING_CODE,\n /**\n * The document is not a JSON array, or its first element is not the CX2 descriptor with `CXVersion`. The import\n * stops.\n */\n NO_DESCRIPTOR: \"E_CX2_NO_DESCRIPTOR\",\n /** `CXVersion` names a version other than 2 (\"1.x\" means the file is CX1; read it as `cx`). The import stops. */\n VERSION: \"E_CX2_VERSION\",\n /** CXVersion is a 2.x other than \"2.0\" (or not a string); the document is read. */\n MINOR_VERSION: \"W_CX2_MINOR_VERSION\",\n /** The document has no status block, or a malformed one. */\n NO_STATUS: \"E_CX2_NO_STATUS\",\n /** The program that wrote the file marked it as failed, so it is incomplete. The import stops. */\n STATUS_FAILED: STATUS_FAILED_CODE,\n /** The producer marked the document as successful with an error text. */\n STATUS_WARNING: STATUS_WARNING_CODE,\n /** An aspect appears in several blocks although the descriptor does not declare fragments. */\n UNDECLARED_FRAGMENTS: \"W_CX2_UNDECLARED_FRAGMENTS\",\n /** An attribute declared twice with two different types; the first declaration wins. */\n DECLARATION_CONFLICT: \"E_CX2_DECLARATION_CONFLICT\",\n /** An attribute value whose name no declaration covers; its column is inferred. */\n UNDECLARED_ATTRIBUTE: \"W_CX2_UNDECLARED_ATTRIBUTE\",\n /** A node or edge attribute named `id`, which the specification reserves. */\n RESERVED_KEY: \"W_CX2_RESERVED_KEY\",\n /** An alias that is another attribute's name or another attribute's alias; the alias is ignored. */\n ALIAS_CONFLICT: \"E_CX2_ALIAS_CONFLICT\",\n /** A network attribute declaration with an alias or a default, which CX2 forbids; both ignored. */\n NETWORK_DECLARATION: \"W_CX2_NETWORK_DECLARATION\",\n /** An aspect that holds one element holds several; the first is read. */\n EXTRA_ELEMENTS: \"W_CX2_EXTRA_ELEMENTS\",\n /** Some nodes have coordinates and others none, or a node has x without y. */\n PARTIAL_LAYOUT: \"W_CX2_PARTIAL_LAYOUT\",\n /** A full attribute name used where its alias is declared; read as the same attribute. */\n ALIAS_BYPASSED: \"W_CX2_ALIAS_BYPASSED\",\n /** A CX1 cartesianLayout aspect next to node coordinates; kept, not applied. */\n LEGACY_LAYOUT: \"W_CX2_LEGACY_LAYOUT\",\n /** An aspect CX2 defines as an array of elements written as one object; read as one element. */\n SINGLE_OBJECT_ASPECT: SINGLE_OBJECT_ASPECT_CODE,\n /** A member holding several aspects; each array-valued key is read as its own block. */\n MULTI_ASPECT_FRAGMENT: MULTI_ASPECT_FRAGMENT_CODE,\n /** The bare tokens NaN / Infinity / -Infinity (Python's json writes them), read as numbers. */\n JSON_NONSTANDARD_NUMBER: JSON_NONSTANDARD_NUMBER_CODE,\n /** The file's style rules are not applied; they are kept so a CX2 export writes them back. */\n STYLES_NOT_IMPORTED: STYLES_NOT_IMPORTED_CODE,\n /**\n * A member of the file's top-level array that is not a block with one key (`{\"nodes\": [...]}`), or an element of a\n * block that is not an object. It is skipped; the rest of the file is read.\n */\n BAD_ASPECT_BLOCK: BAD_ASPECT_BLOCK_CODE,\n /** An aspect out of its place (after the post-metadata or the status, a third metaData, late declarations). */\n ASPECT_ORDER: ASPECT_ORDER_CODE,\n /** A metaData element count disagrees with what was read. */\n COUNT_MISMATCH: COUNT_MISMATCH_CODE,\n /** A value that does not match its declared type; the cell is unset. */\n BAD_VALUE: BAD_VALUE_CODE,\n /** A declared default that does not match its type. */\n BAD_DEFAULT: BAD_DEFAULT_CODE,\n /** A declared type CX2 does not define; the column is inferred from the values. */\n UNKNOWN_ATTR_TYPE: UNKNOWN_ATTR_TYPE_CODE,\n /** A bypass or a layout entry naming no node or edge. */\n DANGLING_REFERENCE: DANGLING_REFERENCE_CODE,\n /** The same attribute twice on one element (its alias and its full name). */\n DUPLICATE_ATTRIBUTE: DUPLICATE_ATTRIBUTE_CODE,\n /** A node without an id. */\n MISSING_ID: MISSING_ID_CODE,\n /** An edge without s or t. */\n MISSING_ENDPOINT: MISSING_ENDPOINT_CODE,\n /** A node id declared twice; the second merges into the first. */\n DUPLICATE_NODE: DUPLICATE_NODE_CODE,\n /** An edge id declared twice; the second edge is skipped. */\n DUPLICATE_EDGE_ID: DUPLICATE_EDGE_ID_CODE,\n /** An id that is not an integer. */\n INVALID_ID: \"E_INVALID_ID\",\n /** An edge endpoint naming no node (addMissingNodes false, the default). */\n UNKNOWN_NODE: \"E_UNKNOWN_NODE\",\n /** A weight that is not a number. */\n INVALID_WEIGHT: \"E_INVALID_WEIGHT\",\n /** An id spelled as a string or a non-integer literal; read as the integer. */\n ID_TEXT_TYPE: ID_TEXT_TYPE_CODE,\n /** An integer beyond 2^53 was stored as the nearest 64-bit float; pass `long: \"string\"` to keep every digit. */\n PRECISION: PRECISION_CODE,\n /** Two id texts merged under `ids: \"number\"`. */\n ID_MERGED: ID_MERGED_CODE,\n /** An element key CX2 does not define. */\n UNKNOWN_ELEMENT: UNKNOWN_ELEMENT_CODE,\n /**\n * An attribute was renamed `<name>#<suffix>` because another attribute already has its name, for example\n * two attributes declared with the same name.\n */\n COLUMN_RENAMED: COLUMN_RENAMED_CODE,\n /**\n * You read into a graph builder that already has an id, label or position attribute, so this file's one is kept as\n * a plain attribute.\n */\n ROLE_TAKEN: ROLE_TAKEN_CODE,\n /**\n * You read into a graph builder whose direction is already set, or which already holds edges, so the file is read\n * with the builder's direction instead of its own.\n */\n DIRECTION_REFUSED: DIRECTION_REFUSED_CODE,\n /** Edges of the other direction were read with the direction `onMixedDirection` chose. */\n DIRECTION_FORCED: DIRECTION_FORCED_CODE,\n /** You set an option this format does not use; it had no effect. The message names the option. */\n OPTION_IGNORED: OPTION_IGNORED_CODE,\n /**\n * You read into your own graph builder, which was created with a different `addMissingNodes`, `duplicateEdges`,\n * `selfLoops` or `weightDtype` than the option you passed; the builder's setting applies.\n */\n SINK_OPTION: SINK_OPTION_CODE,\n /** The input is larger than graph-io's size limit. The import stops. */\n TOO_LARGE: TOO_LARGE_CODE,\n});\n\nconst USED_OPTIONS: ReadonlySet<keyof CommonImportOptions> = new Set<keyof CommonImportOptions>([\n \"ids\",\n \"addMissingNodes\",\n \"duplicateEdges\",\n \"selfLoops\",\n \"onMixedDirection\",\n \"weightFrom\",\n \"weightDtype\",\n \"long\",\n \"restoreMangledIds\",\n \"errorLimit\",\n \"signal\",\n \"onProgress\",\n]);\n\n/** CX2 has no undirected edge: defaultDirected never applies (reported W_OPTION_IGNORED). */\nconst FORMAT_DEFAULTS: ImportFormatDefaults = {\n ids: \"keep\",\n defaultDirected: true,\n weightFrom: \"weight\",\n addMissingNodes: false,\n};\n\nconst ABORT_CHECK_INTERVAL = 64;\n\n/** The keys a node element defines. */\nconst NODE_KEYS: ReadonlySet<string> = new Set([\"id\", \"x\", \"y\", \"z\", \"v\"]);\n\n/** The keys an edge element defines. */\nconst EDGE_KEYS: ReadonlySet<string> = new Set([\"id\", \"s\", \"t\", \"v\"]);\n\n/** The aspects that hold one element. */\nconst SINGLE_ELEMENT_ASPECTS: readonly string[] = [\"networkAttributes\", \"visualProperties\", \"visualEditorProperties\"];\n\n/** The aspects whose content is a style rule (design section 2). */\nconst STYLE_ASPECTS: readonly string[] = [\n \"visualProperties\",\n \"visualEditorProperties\",\n \"cyVisualProperties\",\n \"tableVisualProperties\",\n \"cyTableVisualProperties\",\n];\n\n/** The aspects the stream structure owns; never kept as opaque. */\nconst STRUCTURE_ASPECTS: ReadonlySet<string> = new Set([\"metaData\", \"status\"]);\n\n/** The aspects CX2 defines as an array of elements, which a reader expects in that form. */\nconst ARRAY_ASPECTS: ReadonlySet<string> = new Set([\n \"nodes\",\n \"edges\",\n \"attributeDeclarations\",\n \"networkAttributes\",\n \"nodeBypasses\",\n \"edgeBypasses\",\n \"status\",\n \"metaData\",\n]);\n\n/** The canonical CX2 scalar types. */\ntype Cx2Scalar = \"string\" | \"long\" | \"integer\" | \"double\" | \"boolean\";\n\n/** A declared CX2 type. */\ninterface Cx2Type {\n /** The canonical type text (`list_of_double`). */\n readonly d: string;\n /** The scalar (or item) type. */\n readonly scalar: Cx2Scalar;\n /** Whether the type is a list. */\n readonly list: boolean;\n}\n\n/** The type spellings CX2 defines, plus the Python spellings ndex2 writes. */\nconst SCALARS: ReadonlyMap<string, Cx2Scalar> = new Map([\n [\"string\", \"string\"],\n [\"long\", \"long\"],\n [\"integer\", \"integer\"],\n [\"double\", \"double\"],\n [\"boolean\", \"boolean\"],\n [\"str\", \"string\"],\n [\"int\", \"integer\"],\n [\"bool\", \"boolean\"],\n [\"float\", \"double\"],\n]);\n\n/**\n * Resolve a declared type text.\n * @param d - the `d` value\n * @returns the type, or null when CX2 does not define it\n * @category Plugin helpers\n */\nexport function cx2Type(d: string): Cx2Type | null {\n const list = d.startsWith(\"list_of_\");\n const scalar = SCALARS.get(list ? d.slice(\"list_of_\".length) : d);\n if (scalar === undefined) {\n return null;\n }\n return { d: list ? `list_of_${scalar}` : scalar, scalar, list };\n}\n\n/**\n * The column dtype of a scalar type.\n * @param scalar - the type\n * @param long - the importer's `long` option\n * @returns the dtype\n */\nfunction scalarDtype(scalar: Cx2Scalar, long: \"f64\" | \"string\"): ScalarDtype {\n switch (scalar) {\n case \"string\":\n return \"string\";\n case \"long\":\n return long === \"string\" ? \"string\" : \"f64\";\n case \"integer\":\n return \"i32\";\n case \"double\":\n return \"f64\";\n case \"boolean\":\n return \"bool\";\n default: {\n const name: string = scalar;\n return name as ScalarDtype;\n }\n }\n}\n\n/** What convertScalar() returns for a value of the wrong type. */\nconst BAD = Symbol(\"bad\");\n\nconst I32_MIN = -2147483648;\nconst I32_MAX = 2147483647;\n\n/**\n * Convert one JSON value (or list item) by a declared scalar type.\n * @param value - the value (never null)\n * @param scalar - the type\n * @param long - the importer's `long` option\n * @param onPrecision - called for a long beyond 2^53\n * @returns the value to store, or BAD\n */\nfunction convertScalar(\n value: unknown,\n scalar: Cx2Scalar,\n long: \"f64\" | \"string\",\n onPrecision: (digits: string) => void,\n): unknown {\n switch (scalar) {\n case \"string\":\n return typeof value === \"string\" ? value : BAD;\n case \"boolean\":\n return typeof value === \"boolean\" ? value : BAD;\n case \"double\":\n if (value instanceof ExactInteger) {\n onPrecision(value.digits);\n return Number(value.digits);\n }\n return typeof value === \"number\" ? value : BAD;\n case \"integer\":\n return typeof value === \"number\" && Number.isInteger(value) && value >= I32_MIN && value <= I32_MAX\n ? value\n : BAD;\n case \"long\":\n if (value instanceof ExactInteger) {\n if (long === \"string\") {\n return value.digits;\n }\n onPrecision(value.digits);\n return Number(value.digits);\n }\n if (typeof value === \"number\" && Number.isInteger(value)) {\n return long === \"string\" ? String(value) : value;\n }\n return BAD;\n default:\n return BAD;\n }\n}\n\n/**\n * Convert one attribute value by its declared type.\n * @param value - the value (never null)\n * @param type - the declared type\n * @param long - the importer's `long` option\n * @param onPrecision - called for a long beyond 2^53\n * @returns the value to store, or BAD\n */\nfunction convertValue(\n value: unknown,\n type: Cx2Type,\n long: \"f64\" | \"string\",\n onPrecision: (digits: string) => void,\n): unknown {\n if (!type.list) {\n return convertScalar(value, type.scalar, long, onPrecision);\n }\n if (!Array.isArray(value)) {\n return BAD;\n }\n const out: unknown[] = [];\n for (const item of value) {\n const converted = item === null ? BAD : convertScalar(item, type.scalar, long, onPrecision);\n if (converted === BAD) {\n return BAD;\n }\n out.push(converted);\n }\n return out;\n}\n\n/**\n * A short JSON rendering of a value for a message.\n * @param value - the value\n * @returns the text, at most 60 characters\n */\nfunction shown(value: unknown): string {\n if (value instanceof ExactInteger) {\n return value.digits;\n }\n let text: string;\n try {\n text = JSON.stringify(value) ?? String(value);\n } catch {\n text = String(value);\n }\n return text.length > 60 ? `${text.slice(0, 57)}...` : text;\n}\n\n// ============================================================ the document as read\n\n/** A parsed aspect element with where it came from. */\ninterface Held {\n readonly value: unknown;\n readonly line: number;\n /** Bit 1: the id, bit 2: s, bit 4: t was written as a non-integer literal. */\n readonly inexact: number;\n}\n\n/** Everything the scan collects. */\ninterface Cx2Document {\n version: string;\n hasFragments: boolean;\n readonly nodes: Held[];\n readonly edges: Held[];\n readonly declarations: Held[];\n readonly networkAttributes: Held[];\n readonly nodeBypasses: Held[];\n readonly edgeBypasses: Held[];\n readonly cartesianLayout: Held[];\n /** Opaque aspects (including the style rules), verbatim, in order of first appearance. */\n readonly opaque: Map<string, unknown[]>;\n readonly structure: CxStructure;\n}\n\n/**\n * The inexact-literal bits of an element.\n * @param text - the element's JSON text\n * @param keys - the id keys to check, bit 1, 2, 4 in order\n * @param depth - the depth of the element's own keys in the text (2: a member's single object)\n * @returns the bits\n */\nfunction inexactBits(text: string, keys: readonly string[], depth = 1): number {\n if (!/\\d[.eE]/.test(text)) {\n return 0;\n }\n let bits = 0;\n keys.forEach((key, i) => {\n if (inexactLiteral(text, key, depth)) {\n bits |= 1 << i;\n }\n });\n return bits;\n}\n\n/**\n * Read the whole document through the streaming scanner, checking its structure.\n * @param input - the input\n * @param report - the report\n * @param options - the resolved options\n * @returns what was read\n */\nasync function readDocument(\n input: ImportInput,\n report: ImportReportBuilder,\n options: ResolvedImportOptions,\n): Promise<Cx2Document> {\n const structure = new CxStructure(report);\n const doc: Cx2Document = {\n version: \"\",\n hasFragments: false,\n nodes: [],\n edges: [],\n declarations: [],\n networkAttributes: [],\n nodeBypasses: [],\n edgeBypasses: [],\n cartesianLayout: [],\n opaque: new Map(),\n structure,\n };\n let descriptor = false;\n let elementsSeen = false;\n let sinceCheck = 0;\n const opaquePrecision = keptPrecision(report, \"meta.extra.cx2.opaque\");\n const collect = (aspect: string, value: unknown, text: string, line: number, exact: boolean, depth = 1): void => {\n structure.element(aspect, value, line);\n switch (aspect) {\n case \"nodes\":\n elementsSeen = true;\n doc.nodes.push({ value, line, inexact: inexactBits(text, [\"id\"], depth) });\n return;\n case \"edges\":\n elementsSeen = true;\n doc.edges.push({ value, line, inexact: inexactBits(text, [\"id\", \"s\", \"t\"], depth) });\n return;\n case \"attributeDeclarations\":\n if (elementsSeen) {\n report.warnOnce(\n \"validation-error\",\n ASPECT_ORDER_CODE,\n \"attributeDeclarations comes after the elements it types; the declarations are applied to them\",\n { line, element: aspect },\n `${ASPECT_ORDER_CODE}:declarations`,\n );\n }\n // not plainJson(): a long default beyond 2^53 keeps its digits for long: \"string\"\n doc.declarations.push({ value, line, inexact: 0 });\n return;\n case \"networkAttributes\":\n elementsSeen = true;\n doc.networkAttributes.push({ value, line, inexact: 0 });\n return;\n case \"nodeBypasses\":\n doc.nodeBypasses.push({ value, line, inexact: 0 });\n return;\n case \"edgeBypasses\":\n doc.edgeBypasses.push({ value, line, inexact: 0 });\n return;\n case \"cartesianLayout\":\n doc.cartesianLayout.push({ value, line, inexact: 0 });\n return;\n default:\n if (STRUCTURE_ASPECTS.has(aspect)) {\n return;\n }\n if (!doc.opaque.has(aspect)) {\n doc.opaque.set(aspect, []);\n }\n doc.opaque.get(aspect)?.push(exact ? plainJson(value, opaquePrecision) : value);\n }\n };\n try {\n for await (const event of scanAspects(textChunks(input, report, options), report)) {\n if (++sinceCheck >= ABORT_CHECK_INTERVAL) {\n sinceCheck = 0;\n throwIfAborted(options.signal);\n }\n switch (event.kind) {\n case \"root\":\n report.fail(\n CX2_ISSUE.NO_DESCRIPTOR,\n `a CX2 document is a JSON array; found ${event.object ? \"an object\" : shown(event.value)}`,\n { line: event.line },\n );\n break;\n case \"member\":\n if (!descriptor) {\n readDescriptor(event.value, event.line, doc, report);\n descriptor = true;\n break;\n }\n memberAspect(event.value, event.line, structure, report, (aspect, value) => {\n collect(aspect, value, event.text, event.line, event.exact, 2);\n });\n break;\n case \"block\":\n reportSharedBlock(report, event);\n if (!descriptor) {\n report.fail(\n CX2_ISSUE.NO_DESCRIPTOR,\n `the document starts with a \"${event.aspect}\" block, not a descriptor with CXVersion${event.aspect === \"numberVerification\" || event.aspect === \"metaData\" ? \"; this looks like CX version 1 (read it with the cx importer)\" : \"\"}`,\n { line: event.line },\n );\n }\n structure.block(event.aspect, event.line);\n break;\n case \"element\":\n collect(event.aspect, event.value, event.text, event.line, event.exact);\n break;\n case \"deep\":\n reportTooDeep(report, event);\n if (!descriptor) {\n readDescriptor(null, event.line, doc, report);\n }\n break;\n case \"extraKeys\":\n report.error(\n \"parse-error\",\n BAD_ASPECT_BLOCK_CODE,\n `the \"${event.aspect}\" block holds more keys (${event.keys.join(\", \")}) whose values are not arrays; an aspect block has one key, the others are skipped`,\n { line: event.line, element: event.aspect },\n );\n break;\n default:\n break;\n }\n }\n } catch (err) {\n if (err instanceof JsonScanError) {\n report.fail(err.empty ? EMPTY_INPUT_CODE : SYNTAX_CODE, err.message, { line: err.line });\n }\n throw err;\n }\n if (!descriptor) {\n report.fail(CX2_ISSUE.NO_DESCRIPTOR, \"the document is an empty array; a CX2 document starts with a descriptor\");\n }\n return doc;\n}\n\n/**\n * Fail the import: the first member of the array is not a descriptor.\n * @param value - the member\n * @param line - its line\n * @param report - the report\n * @returns never: the import fails\n */\nfunction failNoDescriptor(value: unknown, line: number, report: ImportReportBuilder): never {\n const keys = isRecord(value) ? Object.keys(value) : [];\n const keyList = keys.length > 0 ? ` (keys: ${keys.join(\", \")})` : \"\";\n return report.fail(\n CX2_ISSUE.NO_DESCRIPTOR,\n `the first member of the array is not a descriptor with CXVersion${keyList}`,\n {\n line,\n },\n );\n}\n\n/**\n * Check the descriptor, the first member of the array.\n * @param value - the member\n * @param line - its line\n * @param doc - the document, which receives the version and the fragment flag\n * @param report - the report\n */\nfunction readDescriptor(value: unknown, line: number, doc: Cx2Document, report: ImportReportBuilder): void {\n if (!isRecord(value) || !(\"CXVersion\" in value)) {\n failNoDescriptor(value, line, report);\n }\n const raw = value.CXVersion;\n const text = typeof raw === \"string\" || typeof raw === \"number\" ? String(raw) : \"\";\n // the major version: \"2.0\", \"2.1\", \"2.0.1\", \"2.1-beta\", \" 2.0\" are all CX2\n const match = /^\\s*(\\d+)(?=$|[.\\s-])/.exec(text);\n const major = match === null ? Number.NaN : Number(match[1]);\n if (major === 1) {\n report.fail(\n CX2_ISSUE.VERSION,\n `CXVersion ${shown(raw)} is CX version 1, a different document shape; read it with the cx importer`,\n { line, element: \"CXVersion\" },\n );\n }\n if (major !== 2) {\n report.fail(CX2_ISSUE.VERSION, `CXVersion ${shown(raw)} is not a CX2 version`, { line, element: \"CXVersion\" });\n }\n doc.version = text;\n if (raw !== \"2.0\") {\n report.warning(\n \"validation-error\",\n CX2_ISSUE.MINOR_VERSION,\n `CXVersion ${shown(raw)} is not \"2.0\"; the document is read as CX2 2.0`,\n { line, element: \"CXVersion\" },\n );\n }\n for (const key of Object.keys(value)) {\n if (key === \"hasFragments\") {\n if (typeof value.hasFragments === \"boolean\") {\n doc.hasFragments = value.hasFragments;\n } else {\n report.error(\n \"validation-error\",\n BAD_VALUE_CODE,\n `hasFragments is ${shown(value.hasFragments)}, not a boolean; read as false`,\n { line, element: \"hasFragments\" },\n );\n }\n } else if (key !== \"CXVersion\") {\n report.warning(\"validation-error\", UNKNOWN_ELEMENT_CODE, `the descriptor key \"${key}\" is not defined`, {\n line,\n element: key,\n });\n }\n }\n}\n\n/**\n * Read a member that is not a streamed block: a one-key object holding an object is a\n * one-element aspect (`{\"ndexStatus\": {...}}`); anything else is E_BAD_ASPECT_BLOCK.\n * @param value - the member\n * @param line - its line\n * @param structure - the structure checker\n * @param report - the report\n * @param collect - receives the aspect name and its one element\n */\nfunction memberAspect(\n value: unknown,\n line: number,\n structure: CxStructure,\n report: ImportReportBuilder,\n collect: (aspect: string, value: unknown) => void,\n): void {\n const keys = isRecord(value) ? Object.keys(value) : [];\n if (isRecord(value) && keys.length === 1 && isRecord(value[keys[0]])) {\n if (ARRAY_ASPECTS.has(keys[0])) {\n report.warning(\n \"validation-error\",\n CX2_ISSUE.SINGLE_OBJECT_ASPECT,\n `the \"${keys[0]}\" aspect is one object, not an array of elements; read as one element`,\n { line, element: keys[0] },\n );\n }\n structure.block(keys[0], line);\n collect(keys[0], value[keys[0]]);\n return;\n }\n const what = keys.length > 1 ? `an object with ${keys.length} keys (${keys.join(\", \")})` : shown(value);\n report.error(\n \"parse-error\",\n BAD_ASPECT_BLOCK_CODE,\n `a member of the document is ${what}, not a one-key aspect block; skipped`,\n { line, element: keys[0] ?? null },\n );\n}\n\n// ============================================================ declarations\n\n/** One declared attribute. */\ninterface Declaration {\n readonly name: string;\n /** The type: declared, or inferred from the values (null: nested or mixed values, a json column). */\n type: Cx2Type | null;\n alias: string | null;\n hasDefault: boolean;\n defaultValue: unknown;\n /** The default as written, while the type is still to be inferred (a type CX2 does not define). */\n readonly rawDefault: unknown;\n handle: ColumnHandle;\n /** Whether the file does not declare the attribute (W_CX2_UNDECLARED_ATTRIBUTE). */\n readonly undeclared: boolean;\n}\n\n/**\n * The scalar kind of one value for inference.\n * @param value - the value\n * @returns a CX2 scalar, or null for anything else\n */\nfunction scalarKind(value: unknown): Cx2Scalar | null {\n switch (typeof value) {\n case \"boolean\":\n return \"boolean\";\n case \"string\":\n return \"string\";\n case \"number\":\n return Number.isInteger(value) && value >= I32_MIN && value <= I32_MAX ? \"integer\" : \"double\";\n default:\n return value instanceof ExactInteger ? \"double\" : null;\n }\n}\n\n/** What inference has seen of an attribute's values so far. */\ninterface Seen {\n /** The scalar kind so far (undefined: nothing yet, null: no CX2 type fits). */\n kind: Cx2Scalar | null | undefined;\n /** Whether the values are lists (undefined: nothing yet). */\n list: boolean | undefined;\n}\n\n/**\n * Widen two scalar kinds: integer and double give double; anything else that differs has no\n * CX2 type.\n * @param a - the kind so far\n * @param b - a new kind\n * @returns the widened kind\n */\nfunction widenKind(a: Cx2Scalar | null | undefined, b: Cx2Scalar | null): Cx2Scalar | null {\n if (a === undefined || a === b) {\n return b;\n }\n if (a === null || b === null) {\n return null;\n }\n return (a === \"integer\" && b === \"double\") || (a === \"double\" && b === \"integer\") ? \"double\" : null;\n}\n\n/**\n * Observe one value of an undeclared attribute.\n * @param seen - the state\n * @param value - the value (never null)\n */\nfunction observe(seen: Seen, value: unknown): void {\n const list = Array.isArray(value);\n if (seen.list !== undefined && seen.list !== list) {\n seen.kind = null;\n return;\n }\n seen.list = list;\n if (!list) {\n seen.kind = widenKind(seen.kind, scalarKind(value));\n return;\n }\n for (const item of value as unknown[]) {\n seen.kind = widenKind(seen.kind, item === null || Array.isArray(item) ? null : scalarKind(item));\n }\n}\n\n/**\n * The CX2 type inference settles on.\n * @param seen - the state\n * @returns the type, or null for a json column\n */\nfunction inferredType(seen: Seen): Cx2Type | null {\n if (seen.kind === null) {\n return null;\n }\n const scalar = seen.kind ?? \"string\";\n return cx2Type(seen.list === true ? `list_of_${scalar}` : scalar);\n}\n\n/** The declarations of one table. */\nclass DeclarationTable {\n readonly byName = new Map<string, Declaration>();\n\n readonly byAlias = new Map<string, Declaration>();\n\n /**\n * The declaration a key of an element's `v` names.\n * @param key - the key\n * @returns the declaration and whether the key was its alias, or null\n */\n resolve(key: string): { readonly decl: Declaration; readonly viaAlias: boolean } | null {\n const viaAlias = this.byAlias.get(key);\n if (viaAlias !== undefined) {\n return { decl: viaAlias, viaAlias: true };\n }\n const decl = this.byName.get(key);\n return decl === undefined ? null : { decl, viaAlias: false };\n }\n}\n\n/** The three declaration tables of CX2 and what the declarations element holds besides. */\ninterface Declarations {\n readonly node: DeclarationTable;\n readonly edge: DeclarationTable;\n readonly network: DeclarationTable;\n /** Declarations for opaque aspects, kept verbatim. */\n readonly other: Record<string, unknown>;\n}\n\n/** The domain key of attributeDeclarations for each table. */\nconst DECLARATION_KEYS: ReadonlyMap<string, \"node\" | \"edge\" | \"network\"> = new Map([\n [\"nodes\", \"node\"],\n [\"edges\", \"edge\"],\n [\"networkAttributes\", \"network\"],\n]);\n\n/**\n * Whether an object has an own property (never one of Object.prototype, as `in` would find).\n * @param record - the object\n * @param key - the key\n * @returns true for an own property\n */\nfunction hasOwn(record: Record<string, unknown>, key: string): boolean {\n return Object.hasOwn(record, key);\n}\n\n// ============================================================ the build\n\n/** Reads a collected document into a sink. */\nclass Cx2Reader {\n private readonly sink: GraphSink;\n\n private readonly report: ImportReportBuilder;\n\n private readonly options: ResolvedImportOptions;\n\n private readonly zAs: \"column\" | \"position\";\n\n private readonly doc: Cx2Document;\n\n private readonly direction: DirectionResolver;\n\n private readonly coercer: IdCoercer;\n\n private readonly decls: Declarations = {\n node: new DeclarationTable(),\n edge: new DeclarationTable(),\n network: new DeclarationTable(),\n other: {},\n };\n\n /** CX node id -> sink node index. */\n private readonly nodeRows = new Map<NodeId, number>();\n\n /** CX node id -> the id the sink holds it under (differs when a mangled id is restored). */\n private readonly sinkIds = new Map<NodeId, NodeId>();\n\n /** The original ids restored so far: a second node with one keeps its CX id. */\n private readonly restored = new Set<NodeId>();\n\n /** CX edge id -> sink edge index. */\n private readonly edgeRows = new Map<NodeId, number>();\n\n private positionHandle: ColumnHandle = INVALID_INDEX as ColumnHandle;\n\n private zHandle: ColumnHandle = INVALID_INDEX as ColumnHandle;\n\n private edgeIdHandle: ColumnHandle = INVALID_INDEX as ColumnHandle;\n\n /** The rows that have a position (a set: a duplicate node may carry coordinates twice). */\n private readonly positioned = new Set<number>();\n\n private sinceCheck = 0;\n\n private idType: \"integer\" | \"mixed\" | \"string\" = \"integer\";\n\n private weighted = false;\n\n private readonly dangling = new Map<string, number>();\n\n private readonly point: [number, number, number] = [0, 0, 0];\n\n /**\n * Create the reader.\n * @param sink - the sink\n * @param report - the report\n * @param options - the resolved options\n * @param zAs - where z goes\n * @param doc - the collected document\n */\n constructor(\n sink: GraphSink,\n report: ImportReportBuilder,\n options: ResolvedImportOptions,\n zAs: \"column\" | \"position\",\n doc: Cx2Document,\n ) {\n this.sink = sink;\n this.report = report;\n this.options = options;\n this.zAs = zAs;\n this.doc = doc;\n this.direction = new DirectionResolver(sink, report, options.onMixedDirection);\n this.coercer = new IdCoercer(options.ids);\n }\n\n /** Build the graph. */\n build(): void {\n const { doc, report } = this;\n this.direction.setHeader(true);\n this.readDeclarations();\n this.declareColumns();\n this.sink.reserve(doc.nodes.length, doc.edges.length);\n for (const held of doc.nodes) {\n this.readNode(held);\n }\n this.readLegacyLayout();\n if (this.positioned.size > 0 && this.positioned.size < this.nodeRows.size) {\n report.warnOnce(\n \"missing-value\",\n CX2_ISSUE.PARTIAL_LAYOUT,\n `${this.nodeRows.size - this.positioned.size} of ${this.nodeRows.size} node${plural(this.nodeRows.size)} ${agree(this.nodeRows.size - this.positioned.size, \"has\", \"have\")} no coordinates; their positions are unset`,\n { element: \"nodes\" },\n );\n }\n for (const held of doc.edges) {\n this.readEdge(held);\n }\n this.readNetworkAttributes();\n this.readBypasses(\"node\", doc.nodeBypasses);\n this.readBypasses(\"edge\", doc.edgeBypasses);\n for (const [kind, count] of this.dangling) {\n report.warning(\n \"validation-error\",\n DANGLING_REFERENCE_CODE,\n `${count} ${kind}${plural(count)} ${agree(count, \"names\", \"name\")} no element; ignored`,\n { element: kind },\n );\n }\n this.checkAspects();\n this.setMeta();\n }\n\n // ------------------------------------------------------------ declarations\n\n /** Merge every attributeDeclarations element (fragments in order) into the tables. */\n private readDeclarations(): void {\n const { report } = this;\n for (const held of this.doc.declarations) {\n if (!isRecord(held.value)) {\n report.error(\n \"parse-error\",\n BAD_ASPECT_BLOCK_CODE,\n \"an attributeDeclarations element is not an object\",\n {\n line: held.line,\n element: \"attributeDeclarations\",\n },\n );\n continue;\n }\n for (const [key, table] of Object.entries(held.value)) {\n const domain = DECLARATION_KEYS.get(key);\n if (domain === undefined) {\n report.warning(\n \"unsupported\",\n UNKNOWN_ELEMENT_CODE,\n `attributeDeclarations holds the table \"${key}\", which CX2 does not define; kept in meta.extra.cx2.declarations, not applied`,\n { line: held.line, element: key },\n );\n setOwn(\n this.decls.other,\n key,\n plainJson(table, (digits) => {\n this.precision(key, digits);\n }),\n );\n continue;\n }\n if (!isRecord(table)) {\n report.error(\n \"validation-error\",\n BAD_VALUE_CODE,\n `the ${key} declarations are not an object; ignored`,\n { line: held.line, element: key },\n );\n continue;\n }\n for (const [name, decl] of Object.entries(table)) {\n this.declare(domain, name, decl, held.line);\n }\n }\n }\n for (const domain of [\"node\", \"edge\"] as const) {\n this.checkAliases(domain);\n }\n this.inferUndeclared(\"node\", this.doc.nodes);\n this.inferUndeclared(\"edge\", this.doc.edges);\n }\n\n /**\n * Type the attributes no declaration types (undeclared, or declared with a type CX2 does not\n * define) from their values, so every attribute column is declared with its CX2 type.\n * @param domain - node or edge\n * @param elements - the elements\n */\n private inferUndeclared(domain: \"node\" | \"edge\", elements: readonly Held[]): void {\n const table = this.decls[domain];\n const seen = new Map<string, Seen>();\n for (const { value } of elements) {\n if (!isRecord(value) || !isRecord(value.v)) {\n continue;\n }\n for (const [key, raw] of Object.entries(value.v)) {\n const resolved = table.resolve(key);\n if (\n key === \"\" ||\n (resolved !== null && resolved.decl.type !== null) ||\n raw === null ||\n raw === undefined\n ) {\n continue;\n }\n const name = resolved?.decl.name ?? key;\n let state = seen.get(name);\n if (state === undefined) {\n state = { kind: undefined, list: undefined };\n seen.set(name, state);\n }\n observe(state, raw);\n }\n }\n for (const [name, state] of seen) {\n const type = inferredType(state);\n const decl = table.byName.get(name);\n if (decl !== undefined) {\n decl.type = type;\n if (decl.hasDefault && type !== null) {\n // the default of a type CX2 does not define, converted now the values typed the column\n decl.defaultValue = this.convertDefault(name, decl.rawDefault, type, { element: name });\n decl.hasDefault = decl.defaultValue !== BAD;\n }\n continue;\n }\n table.byName.set(name, {\n name,\n type,\n alias: null,\n hasDefault: false,\n defaultValue: undefined,\n rawDefault: undefined,\n handle: INVALID_INDEX as ColumnHandle,\n undeclared: true,\n });\n }\n }\n\n /**\n * Add one declaration to a table.\n * @param domain - the table\n * @param name - the attribute name\n * @param raw - the declaration object\n * @param line - its line\n */\n private declare(domain: \"node\" | \"edge\" | \"network\", name: string, raw: unknown, line: number): void {\n const { report } = this;\n const table = this.decls[domain];\n const where = { line, element: name };\n if (name === \"\") {\n report.error(\n \"validation-error\",\n BAD_VALUE_CODE,\n `a ${domain} attribute declaration has an empty name; ignored`,\n where,\n );\n return;\n }\n if (!isRecord(raw)) {\n report.error(\n \"validation-error\",\n BAD_VALUE_CODE,\n `the declaration of \"${name}\" is not an object; ignored`,\n where,\n );\n return;\n }\n let type: Cx2Type | null;\n if (raw.d === undefined) {\n type = cx2Type(\"string\");\n report.warning(\n \"unsupported\",\n UNKNOWN_ATTR_TYPE_CODE,\n `the declaration of \"${name}\" has no type; read as string (the Java reader's rule)`,\n where,\n );\n } else {\n type = typeof raw.d === \"string\" ? cx2Type(raw.d) : null;\n if (type === null) {\n report.warning(\n \"unsupported\",\n UNKNOWN_ATTR_TYPE_CODE,\n `the type ${shown(raw.d)} of \"${name}\" is not a CX2 type; the column is inferred from its values`,\n where,\n );\n }\n }\n const existing = table.byName.get(name);\n if (existing !== undefined) {\n if (existing.type?.d !== type?.d) {\n report.error(\n \"validation-error\",\n CX2_ISSUE.DECLARATION_CONFLICT,\n `\"${name}\" is declared ${existing.type?.d ?? \"untyped\"} and again ${type?.d ?? \"untyped\"}; the first declaration wins`,\n where,\n );\n }\n return;\n }\n if (raw.a !== undefined && raw.a !== null && typeof raw.a !== \"string\") {\n report.error(\n \"validation-error\",\n BAD_VALUE_CODE,\n `the alias ${shown(raw.a)} of \"${name}\" is not a string; ignored`,\n where,\n );\n }\n let alias = typeof raw.a === \"string\" ? raw.a : null;\n let hasDefault = raw.v !== undefined && raw.v !== null;\n if (domain === \"network\" && (raw.a !== undefined || raw.v !== undefined)) {\n report.warning(\n \"validation-error\",\n CX2_ISSUE.NETWORK_DECLARATION,\n `the network attribute \"${name}\" declares an alias or a default, which CX2 forbids; ignored`,\n where,\n );\n alias = null;\n hasDefault = false;\n }\n let defaultValue: unknown = undefined;\n if (hasDefault && type !== null) {\n defaultValue = this.convertDefault(name, raw.v, type, where);\n hasDefault = defaultValue !== BAD;\n }\n table.byName.set(name, {\n name,\n type,\n alias,\n hasDefault,\n defaultValue,\n rawDefault: hasDefault && type === null ? plainJson(raw.v) : undefined,\n handle: INVALID_INDEX as ColumnHandle,\n undeclared: false,\n });\n }\n\n /**\n * Convert a declared default; a numeric string for a numeric type (the specification's own\n * `\"v\": \"0.0\"`) is coerced, anything else that does not match drops the default.\n * @param name - the attribute\n * @param value - the default\n * @param type - its type\n * @param where - the location\n * @param where.line - the line\n * @param where.element - the attribute\n * @returns the default, or BAD when dropped\n */\n private convertDefault(\n name: string,\n value: unknown,\n type: Cx2Type,\n where: { line?: number; element: string },\n ): unknown {\n const converted = convertValue(value, type, this.options.long, (digits) => {\n this.precision(name, digits);\n });\n if (converted !== BAD) {\n return converted;\n }\n const numeric = type.scalar === \"double\" || type.scalar === \"integer\" || type.scalar === \"long\";\n if (\n !type.list &&\n numeric &&\n typeof value === \"string\" &&\n value.trim() !== \"\" &&\n Number.isFinite(Number(value))\n ) {\n const coerced = convertValue(Number(value), type, this.options.long, () => undefined);\n if (coerced !== BAD) {\n this.report.warning(\n \"validation-error\",\n BAD_DEFAULT_CODE,\n `the default ${shown(value)} of \"${name}\" is a string, not a ${type.d}; read as ${shown(coerced)}`,\n where,\n );\n return coerced;\n }\n }\n this.report.warning(\n \"validation-error\",\n BAD_DEFAULT_CODE,\n `the default ${shown(value)} of \"${name}\" is not a ${type.d}; the column has no default`,\n where,\n );\n return BAD;\n }\n\n /**\n * Check the aliases of a table in declaration order: an alias that is another attribute's\n * name or another attribute's alias is E_CX2_ALIAS_CONFLICT and ignored.\n * @param domain - the table\n */\n private checkAliases(domain: \"node\" | \"edge\"): void {\n const table = this.decls[domain];\n for (const decl of table.byName.values()) {\n const { alias } = decl;\n if (alias === null || alias === decl.name) {\n if (alias !== null) {\n table.byAlias.set(alias, decl);\n }\n continue;\n }\n const other = table.byName.get(alias) ?? table.byAlias.get(alias);\n if (other !== undefined) {\n const clash = other.name === alias ? \"an attribute's name\" : `the alias of \"${other.name}\"`;\n this.report.error(\n \"validation-error\",\n CX2_ISSUE.ALIAS_CONFLICT,\n `the alias \"${alias}\" of the ${domain} attribute \"${decl.name}\" is also ${clash}; the alias is ignored`,\n { element: decl.name },\n );\n decl.alias = null;\n continue;\n }\n table.byAlias.set(alias, decl);\n }\n }\n\n /** Declare the declared node and edge columns. */\n private declareColumns(): void {\n const restore = this.options.restoreMangledIds;\n for (const domain of [\"node\", \"edge\"] as const) {\n for (const decl of this.decls[domain].byName.values()) {\n if (domain === \"node\" && restore && decl.name === ORIGINAL_ID_ATTRIBUTE) {\n continue;\n }\n if (domain === \"edge\" && decl.name === this.options.weightFrom) {\n continue;\n }\n const column: ColumnDecl =\n decl.type === null\n ? {\n name: decl.name,\n dtype: \"json\",\n nullable: true,\n origin: { format: CX2_FORMAT, id: decl.alias },\n }\n : {\n ...this.columnDecl(decl.type),\n name: decl.name,\n origin: { format: CX2_FORMAT, id: decl.alias, type: decl.type.d },\n };\n if (decl.hasDefault) {\n // a type nothing settled (no values) keeps its default as written, in the json column\n column.default = decl.type === null ? decl.rawDefault : decl.defaultValue;\n }\n if (domain === \"node\" && decl.name === \"name\") {\n column.role = \"label\";\n }\n decl.handle = declareResolved(this.sink, domain, column, this.report).handle;\n }\n }\n }\n\n /**\n * The edge id column, declared with the first edge.\n * @returns the handle\n */\n private edgeIdColumn(): ColumnHandle {\n if (this.edgeIdHandle === INVALID_INDEX) {\n const taken = (name: string): boolean => this.sink.edgeColumn(name) !== INVALID_INDEX;\n this.edgeIdHandle = declareResolved(\n this.sink,\n \"edge\",\n { name: uniqueColumnName(\"id\", \"cx2\", taken), dtype: \"f64\", role: \"id\", nullable: true },\n this.report,\n ).handle;\n }\n return this.edgeIdHandle;\n }\n\n /**\n * The dtype part of a declared column.\n * @param type - the CX2 type\n * @returns the dtype and item dtype\n */\n private columnDecl(type: Cx2Type): { name: string; dtype: Dtype; itemDtype?: ScalarDtype; nullable: true } {\n const scalar = scalarDtype(type.scalar, this.options.long);\n return type.list\n ? { name: \"\", dtype: \"list\", itemDtype: scalar, nullable: true }\n : { name: \"\", dtype: scalar, nullable: true };\n }\n\n // ------------------------------------------------------------ ids\n\n /**\n * The id of an element, by the CX id rule and the `ids` option.\n * @param raw - the parsed id\n * @param inexact - whether the literal was not a plain integer\n * @param element - the element name for issues\n * @param line - the element's line\n * @param edgeId - whether this is an edge's own id (stored in the f64 id column, not kept as digits)\n * @returns the id, or null when it was reported\n */\n private idOf(raw: unknown, inexact: boolean, element: string, line: number, edgeId = false): NodeId | null {\n let id: NodeId;\n try {\n const parsed = cxId(raw, inexact);\n if (parsed.note === \"text\") {\n this.report.warnOnce(\n \"coercion\",\n ID_TEXT_TYPE_CODE,\n `${element}: the id ${shown(raw)} is not written as an integer; read as ${String(parsed.id)}`,\n { line, element },\n );\n } else if (parsed.note === \"precision\" && edgeId) {\n // the edge is told apart by its digits, but the id column is f64\n this.report.warnOnce(\n \"precision\",\n PRECISION_CODE,\n `${element}: the edge id ${String(parsed.id)} is beyond 2^53; the id column holds the nearest double`,\n { line, element },\n `${PRECISION_CODE}:edge`,\n );\n } else if (parsed.note === \"precision\") {\n this.idType = \"mixed\";\n this.report.warnOnce(\n \"precision\",\n PRECISION_CODE,\n `${element}: the id ${String(parsed.id)} is beyond 2^53; kept as its digits (a string id)`,\n { line, element },\n );\n }\n id = this.options.ids === \"keep\" ? parsed.id : this.coercer.value(parsed.id);\n } catch (err) {\n this.report.recordError(err, { line, element });\n return null;\n }\n return id;\n }\n\n /**\n * Check the cancellation signal every ABORT_CHECK_INTERVAL elements.\n */\n private checkAbort(): void {\n if (++this.sinceCheck >= ABORT_CHECK_INTERVAL) {\n this.sinceCheck = 0;\n throwIfAborted(this.options.signal);\n }\n }\n\n /**\n * Report the keys of an element CX2 does not define, once per key.\n * @param record - the element\n * @param known - the keys it defines\n * @param what - nodes or edges\n * @param line - its line\n */\n private unknownKeys(record: Record<string, unknown>, known: ReadonlySet<string>, what: string, line: number): void {\n for (const key of Object.keys(record)) {\n if (!known.has(key)) {\n this.report.warnOnce(\n \"unsupported\",\n UNKNOWN_ELEMENT_CODE,\n `the ${what} key \"${key}\" is not defined by CX2; its values are not read`,\n { line, element: key },\n `${UNKNOWN_ELEMENT_CODE}:${what}:${key}`,\n );\n }\n }\n }\n\n // ------------------------------------------------------------ nodes\n\n /**\n * Read one node element.\n * @param held - the element\n */\n private readNode(held: Held): void {\n this.checkAbort();\n const { report, sink } = this;\n const { value, line } = held;\n if (!isRecord(value)) {\n report.error(\"parse-error\", BAD_ASPECT_BLOCK_CODE, `a nodes element is ${shown(value)}, not an object`, {\n line,\n element: \"nodes\",\n });\n report.counts.skippedNodes++;\n return;\n }\n this.unknownKeys(value, NODE_KEYS, \"node\", line);\n if (value.id === undefined || value.id === null) {\n report.error(\"missing-value\", MISSING_ID_CODE, \"a node has no id\", { line, element: \"nodes\" });\n report.counts.skippedNodes++;\n return;\n }\n const element = `node ${shown(value.id)}`;\n const cx = this.idOf(value.id, (held.inexact & 1) !== 0, element, line);\n if (cx === null) {\n report.counts.skippedNodes++;\n return;\n }\n const attrs = isRecord(value.v) ? value.v : null;\n if (value.v !== undefined && value.v !== null && attrs === null) {\n report.error(\"validation-error\", BAD_VALUE_CODE, `${element}: v is ${shown(value.v)}, not an object`, {\n line,\n element,\n });\n }\n let row = this.nodeRows.get(cx);\n if (row !== undefined) {\n report.warning(\n \"merged\",\n DUPLICATE_NODE_CODE,\n `${element} is declared more than once; its attributes are merged (the later values win)`,\n { line, element },\n );\n } else {\n let original = this.originalIdOf(attrs, element, line);\n if (original !== null && this.restored.has(original)) {\n report.warning(\n \"merged\",\n DUPLICATE_NODE_CODE,\n `${element}: its original id ${shown(original)} is already another node's; it keeps its CX id`,\n { line, element },\n );\n original = null;\n }\n if (original !== null) {\n this.restored.add(original);\n }\n this.idTypeOf(original ?? cx);\n try {\n row = sink.addNode(original ?? cx);\n } catch (err) {\n report.recordError(err, { line, element });\n report.counts.skippedNodes++;\n return;\n }\n this.nodeRows.set(cx, row);\n this.sinkIds.set(cx, original ?? cx);\n report.counts.nodes++;\n }\n this.readCoordinates(value, row, element, line);\n if (attrs !== null) {\n this.writeAttributes(\"node\", row, attrs, element, line);\n }\n }\n\n /**\n * The original id the exporter's `sanitizeIds: \"mangle\"` kept, when it is to be restored.\n * @param attrs - the node's v\n * @param element - the element name for issues\n * @param line - its line\n * @returns the original id, or null\n */\n private originalIdOf(attrs: Record<string, unknown> | null, element: string, line: number): NodeId | null {\n if (attrs === null || !this.options.restoreMangledIds) {\n return null;\n }\n const alias = this.decls.node.byName.get(ORIGINAL_ID_ATTRIBUTE)?.alias ?? null;\n const raw = attrs[ORIGINAL_ID_ATTRIBUTE] ?? (alias === null ? undefined : attrs[alias]);\n if (raw !== undefined && raw !== null && typeof raw !== \"string\") {\n this.report.error(\n \"validation-error\",\n BAD_VALUE_CODE,\n `${element}: ${ORIGINAL_ID_ATTRIBUTE} is ${shown(raw)}, not a string; the node keeps its CX id`,\n { line, element },\n );\n }\n return typeof raw === \"string\" ? raw : null;\n }\n\n /**\n * Track the idType of the metadata.\n * @param id - a node id\n */\n private idTypeOf(id: NodeId): void {\n if (typeof id === \"string\" && this.idType === \"integer\") {\n this.idType = \"mixed\";\n }\n }\n\n /**\n * Read a node's x / y / z.\n * @param value - the node element\n * @param row - the node\n * @param element - the element name\n * @param line - its line\n */\n private readCoordinates(value: Record<string, unknown>, row: number, element: string, line: number): void {\n const coordinate = (key: \"x\" | \"y\" | \"z\"): number | null => {\n const raw = value[key];\n if (raw === undefined || raw === null) {\n return null;\n }\n if (typeof raw === \"number\") {\n return raw;\n }\n this.report.error(\"validation-error\", BAD_VALUE_CODE, `${element}: ${key} is ${shown(raw)}, not a number`, {\n line,\n element,\n });\n return null;\n };\n const x = coordinate(\"x\");\n const y = coordinate(\"y\");\n const z = coordinate(\"z\");\n if ((x === null) !== (y === null)) {\n this.report.warnOnce(\n \"missing-value\",\n CX2_ISSUE.PARTIAL_LAYOUT,\n `${element} has ${x === null ? \"y without x\" : \"x without y\"}; its coordinates are dropped`,\n { line, element },\n `${CX2_ISSUE.PARTIAL_LAYOUT}:half`,\n );\n }\n if (z !== null && x === null && y === null) {\n // the specification requires x and y with z\n this.report.warnOnce(\n \"missing-value\",\n CX2_ISSUE.PARTIAL_LAYOUT,\n `${element} has z without x and y; ${this.zAs === \"column\" ? \"z is kept in the z column\" : \"with no position, z is dropped\"}`,\n { line, element },\n `${CX2_ISSUE.PARTIAL_LAYOUT}:z`,\n );\n }\n if (x !== null && y !== null && (!Number.isFinite(x) || !Number.isFinite(y))) {\n this.report.error(\n \"validation-error\",\n BAD_VALUE_CODE,\n `${element}: the coordinates ${String(x)}, ${String(y)} are not both finite; the position is unset`,\n { line, element },\n );\n } else if (x !== null && y !== null) {\n this.setPosition(row, x, y, z);\n }\n if (z !== null && this.zAs === \"column\") {\n if (this.zHandle === INVALID_INDEX) {\n this.zHandle = declareResolved(this.sink, \"node\", zDecl(CX2_FORMAT), this.report).handle;\n }\n this.sink.setNodeValue(this.zHandle, row, z);\n }\n }\n\n /**\n * Write a node's position, y flipped to y-up.\n * @param row - the node\n * @param x - screen x\n * @param y - screen y\n * @param z - z, used only under zAs \"position\"\n */\n private setPosition(row: number, x: number, y: number, z: number | null): void {\n if (this.positionHandle === INVALID_INDEX) {\n this.positionHandle = declareResolved(\n this.sink,\n \"node\",\n positionDecl(CX2_FORMAT, this.zAs === \"position\" ? 3 : 2),\n this.report,\n ).handle;\n }\n this.point[0] = x;\n this.point[1] = flipY(y);\n this.point[2] = this.zAs === \"position\" && z !== null ? z : 0;\n this.sink.setNodeValue(this.positionHandle, row, this.point);\n this.positioned.add(row);\n }\n\n /** Apply a CX1 cartesianLayout aspect when no node carries coordinates; keep and warn otherwise. */\n private readLegacyLayout(): void {\n const { cartesianLayout } = this.doc;\n if (cartesianLayout.length === 0) {\n return;\n }\n if (this.positioned.size > 0) {\n this.doc.opaque.set(\n \"cartesianLayout\",\n cartesianLayout.map((h) => plainJson(h.value)),\n );\n this.report.warning(\n \"unsupported\",\n CX2_ISSUE.LEGACY_LAYOUT,\n `a CX1 cartesianLayout aspect (${cartesianLayout.length} element${plural(cartesianLayout.length)}) next to node coordinates; the node coordinates are used, the aspect is kept in meta.extra.cx2`,\n { element: \"cartesianLayout\" },\n );\n return;\n }\n // the first view named is the layout; a CX1 file with several views keeps the others\n let view: unknown;\n const seen = new Set<number>();\n for (const held of cartesianLayout) {\n const entry = held.value;\n if (!isRecord(entry) || typeof entry.x !== \"number\" || typeof entry.y !== \"number\") {\n this.report.error(\n \"validation-error\",\n BAD_VALUE_CODE,\n \"a cartesianLayout element has no numeric x and y; skipped\",\n { line: held.line, element: \"cartesianLayout\" },\n );\n continue;\n }\n const row = this.rowOf(this.nodeRows, entry.node);\n if (row === undefined) {\n this.dangle(\"cartesianLayout entry\");\n continue;\n }\n view ??= entry.view ?? null;\n if ((entry.view ?? null) !== view) {\n this.doc.opaque.set(\n \"cartesianLayout\",\n cartesianLayout.map((h) => plainJson(h.value)),\n );\n this.report.warnOnce(\n \"validation-error\",\n DUPLICATE_ATTRIBUTE_CODE,\n `the cartesianLayout aspect names several views; view ${shown(view)} is read, the aspect is kept in meta.extra.cx2`,\n { line: held.line, element: \"cartesianLayout\" },\n `${DUPLICATE_ATTRIBUTE_CODE}:layout:view`,\n );\n continue;\n }\n if (seen.has(row)) {\n this.report.warnOnce(\n \"validation-error\",\n DUPLICATE_ATTRIBUTE_CODE,\n `node ${shown(entry.node)} has two cartesianLayout entries; the later wins`,\n { line: held.line, element: \"cartesianLayout\" },\n `${DUPLICATE_ATTRIBUTE_CODE}:layout`,\n );\n }\n seen.add(row);\n const z = typeof entry.z === \"number\" ? entry.z : null;\n this.setPosition(row, entry.x, entry.y, z);\n if (z !== null && this.zAs === \"column\") {\n if (this.zHandle === INVALID_INDEX) {\n this.zHandle = declareResolved(this.sink, \"node\", zDecl(CX2_FORMAT), this.report).handle;\n }\n this.sink.setNodeValue(this.zHandle, row, z);\n }\n }\n }\n\n /**\n * The sink row of a referenced id.\n * @param rows - the id map\n * @param raw - the parsed reference\n * @returns the row, or undefined\n */\n private rowOf(rows: ReadonlyMap<NodeId, number>, raw: unknown): number | undefined {\n try {\n const { id } = cxId(raw);\n return rows.get(this.options.ids === \"keep\" ? id : this.coercer.value(id));\n } catch {\n return undefined;\n }\n }\n\n /**\n * Count a reference that names nothing.\n * @param kind - what referred\n */\n private dangle(kind: string): void {\n this.dangling.set(kind, (this.dangling.get(kind) ?? 0) + 1);\n }\n\n // ------------------------------------------------------------ attributes\n\n /**\n * Write the attributes of an element's v.\n * @param domain - node or edge\n * @param row - the row\n * @param attrs - the v object\n * @param element - the element name\n * @param line - its line\n */\n private writeAttributes(\n domain: \"node\" | \"edge\",\n row: number,\n attrs: Record<string, unknown>,\n element: string,\n line: number,\n ): void {\n const { report } = this;\n const table = this.decls[domain];\n for (const key of Object.keys(attrs)) {\n const value = attrs[key];\n if (key === \"\") {\n report.error(\n \"validation-error\",\n BAD_VALUE_CODE,\n `${element}: v holds an attribute with an empty name; skipped`,\n { line, element },\n );\n continue;\n }\n const resolved = table.resolve(key);\n const name = resolved?.decl.name ?? key;\n if (domain === \"node\" && this.options.restoreMangledIds && name === ORIGINAL_ID_ATTRIBUTE) {\n continue;\n }\n if (domain === \"edge\" && name === this.options.weightFrom) {\n continue;\n }\n if (key === \"id\") {\n report.warnOnce(\n \"validation-error\",\n CX2_ISSUE.RESERVED_KEY,\n `${element}: the attribute name \"id\" is reserved in v; read as an ordinary attribute`,\n { line, element },\n `${CX2_ISSUE.RESERVED_KEY}:${domain}`,\n );\n }\n if (\n resolved !== null &&\n !resolved.viaAlias &&\n resolved.decl.alias !== null &&\n resolved.decl.alias !== key\n ) {\n if (hasOwn(attrs, resolved.decl.alias)) {\n report.warning(\n \"validation-error\",\n DUPLICATE_ATTRIBUTE_CODE,\n `${element}: \"${name}\" is given under its alias and its full name; the alias wins`,\n { line, element },\n );\n continue;\n }\n report.warnOnce(\n \"coercion\",\n CX2_ISSUE.ALIAS_BYPASSED,\n `${element}: the full name \"${name}\" is used although its alias \"${resolved.decl.alias}\" is declared; read as the same attribute`,\n { line, element },\n `${CX2_ISSUE.ALIAS_BYPASSED}:${domain}:${name}`,\n );\n }\n if (value === null || value === undefined) {\n continue;\n }\n if (resolved === null) {\n continue;\n }\n const { decl } = resolved;\n if (decl.undeclared) {\n report.warnOnce(\n \"validation-error\",\n CX2_ISSUE.UNDECLARED_ATTRIBUTE,\n `the ${domain} attribute \"${key}\" is not declared; its type is inferred from the values`,\n { line, element: key },\n `${CX2_ISSUE.UNDECLARED_ATTRIBUTE}:${domain}:${key}`,\n );\n }\n const converted =\n decl.type === null\n ? plainJson(value, (digits) => {\n this.precision(name, digits);\n })\n : convertValue(value, decl.type, this.options.long, (digits) => {\n this.precision(name, digits);\n });\n if (converted === BAD) {\n report.error(\n \"validation-error\",\n BAD_VALUE_CODE,\n `${element}: \"${name}\" is ${shown(value)}, not a ${decl.type?.d ?? \"value\"}; the cell is unset`,\n { line, element },\n );\n continue;\n }\n try {\n if (domain === \"node\") {\n this.sink.setNodeValue(decl.handle, row, converted);\n } else {\n this.sink.setEdgeValue(decl.handle, row, converted);\n }\n } catch (err) {\n report.recordError(err, { line, element });\n }\n }\n }\n\n /**\n * Record a long value beyond 2^53 (once).\n * @param name - the attribute\n * @param digits - the value\n */\n private precision(name: string, digits: string): void {\n this.report.warnOnce(\n \"precision\",\n PRECISION_CODE,\n `\"${name}\": ${digits} is beyond 2^53; stored as the nearest double`,\n { element: name },\n `${PRECISION_CODE}:value`,\n );\n }\n\n // ------------------------------------------------------------ edges\n\n /**\n * Read one edge element.\n * @param held - the element\n */\n private readEdge(held: Held): void {\n this.checkAbort();\n const { report, sink } = this;\n const { value, line } = held;\n if (!isRecord(value)) {\n report.error(\"parse-error\", BAD_ASPECT_BLOCK_CODE, `an edges element is ${shown(value)}, not an object`, {\n line,\n element: \"edges\",\n });\n report.counts.skippedEdges++;\n return;\n }\n this.unknownKeys(value, EDGE_KEYS, \"edge\", line);\n if (value.id === undefined || value.id === null) {\n report.error(\"missing-value\", MISSING_ID_CODE, \"an edge has no id\", { line, element: \"edges\" });\n report.counts.skippedEdges++;\n return;\n }\n const element = `edge ${shown(value.id)}`;\n for (const key of [\"s\", \"t\"] as const) {\n if (value[key] === undefined || value[key] === null) {\n report.error(\"missing-value\", MISSING_ENDPOINT_CODE, `${element} has no ${key}`, { line, element });\n report.counts.skippedEdges++;\n return;\n }\n }\n const id = this.idOf(value.id, (held.inexact & 1) !== 0, element, line, true);\n const s = id === null ? null : this.idOf(value.s, (held.inexact & 2) !== 0, element, line);\n const t = s === null ? null : this.idOf(value.t, (held.inexact & 4) !== 0, element, line);\n if (id === null || s === null || t === null) {\n report.counts.skippedEdges++;\n return;\n }\n if (this.edgeRows.has(id)) {\n report.error(\n \"validation-error\",\n DUPLICATE_EDGE_ID_CODE,\n `${element} is declared more than once; the later edge is skipped`,\n { line, element },\n );\n report.counts.skippedEdges++;\n return;\n }\n const source = this.endpoint(s, element, line);\n const target = source === null ? null : this.endpoint(t, element, line);\n if (source === null || target === null) {\n report.counts.skippedEdges++;\n return;\n }\n const attrs = isRecord(value.v) ? value.v : null;\n if (value.v !== undefined && value.v !== null && attrs === null) {\n report.error(\"validation-error\", BAD_VALUE_CODE, `${element}: v is ${shown(value.v)}, not an object`, {\n line,\n element,\n });\n }\n let weight: number | undefined;\n const weightKey = this.weightKey(attrs);\n try {\n weight = weightKey === null || attrs === null ? undefined : weightFromValue(plainJson(attrs[weightKey]));\n } catch (err) {\n report.recordError(err, { line, element });\n report.counts.skippedEdges++;\n return;\n }\n if (weight !== undefined) {\n this.weighted = true;\n }\n const before = sink.edgeCount;\n let edge: number;\n try {\n edge = this.direction.addEdge(source, target, \"directed\", weight, { line, element });\n } catch (err) {\n report.recordError(err, { line, element });\n report.counts.skippedEdges++;\n return;\n }\n report.counts.edges += sink.edgeCount - before;\n this.edgeRows.set(id, edge);\n sink.setEdgeValue(this.edgeIdColumn(), edge, typeof id === \"number\" ? id : Number(id));\n if (attrs !== null) {\n this.writeAttributes(\"edge\", edge, attrs, element, line);\n }\n }\n\n /**\n * The key of an edge's v that holds the weight: weightFrom, or its declared alias.\n * @param attrs - the edge's v\n * @returns the key present in attrs, or null\n */\n private weightKey(attrs: Record<string, unknown> | null): string | null {\n const { weightFrom } = this.options;\n if (weightFrom === null || attrs === null) {\n return null;\n }\n const alias = this.decls.edge.byName.get(weightFrom)?.alias ?? null;\n if (alias !== null && hasOwn(attrs, alias)) {\n return alias;\n }\n return hasOwn(attrs, weightFrom) ? weightFrom : null;\n }\n\n /**\n * The sink id of an edge endpoint: a known node, or a node created under addMissingNodes.\n * @param cx - the endpoint's CX id\n * @param element - the edge name\n * @param line - its line\n * @returns the sink id, or null when the endpoint was reported\n */\n private endpoint(cx: NodeId, element: string, line: number): NodeId | null {\n const known = this.sinkIds.get(cx);\n if (known !== undefined) {\n return known;\n }\n if (!this.options.addMissingNodes) {\n this.report.error(\n \"missing-value\",\n CX2_ISSUE.UNKNOWN_NODE,\n `${element}: the endpoint ${String(cx)} is not a node; the edge is skipped`,\n { line, element },\n );\n return null;\n }\n try {\n this.nodeRows.set(cx, this.sink.addNode(cx));\n } catch (err) {\n this.report.recordError(err, { line, element });\n return null;\n }\n this.sinkIds.set(cx, cx);\n this.report.counts.nodes++;\n return cx;\n }\n\n // ------------------------------------------------------------ network attributes, bypasses\n\n /** Write the network attributes (the first element; others are reported). */\n private readNetworkAttributes(): void {\n const { networkAttributes } = this.doc;\n if (networkAttributes.length === 0) {\n return;\n }\n if (networkAttributes.length > 1) {\n this.report.warning(\n \"validation-error\",\n CX2_ISSUE.EXTRA_ELEMENTS,\n `networkAttributes holds ${networkAttributes.length} elements; the first is read`,\n { line: networkAttributes[1].line, element: \"networkAttributes\" },\n );\n }\n const { value, line } = networkAttributes[0];\n if (!isRecord(value)) {\n this.report.error(\"parse-error\", BAD_ASPECT_BLOCK_CODE, \"the networkAttributes element is not an object\", {\n line,\n element: \"networkAttributes\",\n });\n return;\n }\n for (const [name, raw] of Object.entries(value)) {\n if (raw === null || raw === undefined) {\n continue;\n }\n const decl = this.decls.network.byName.get(name);\n const element = `networkAttributes.${name}`;\n if (decl === undefined) {\n this.report.warnOnce(\n \"validation-error\",\n CX2_ISSUE.UNDECLARED_ATTRIBUTE,\n `the network attribute \"${name}\" is not declared; its column is inferred from the value`,\n { line, element: name },\n `${CX2_ISSUE.UNDECLARED_ATTRIBUTE}:network:${name}`,\n );\n }\n if (\n (name === \"name\" || name === \"description\") &&\n typeof raw === \"string\" &&\n decl?.type?.d !== \"list_of_string\"\n ) {\n // the graph's own name and description: GraphMeta, written back from there\n continue;\n }\n try {\n const seen: Seen = { kind: undefined, list: undefined };\n observe(seen, raw);\n const type = decl?.type ?? inferredType(seen);\n if (type === null) {\n this.sink.setGraphValue(\n name,\n plainJson(raw, (digits) => {\n this.precision(name, digits);\n }),\n {\n dtype: \"json\",\n origin: { format: CX2_FORMAT, id: null },\n },\n );\n continue;\n }\n const converted = convertValue(raw, type, this.options.long, (digits) => {\n this.precision(name, digits);\n });\n if (converted === BAD) {\n this.report.error(\n \"validation-error\",\n BAD_VALUE_CODE,\n `${element} is ${shown(raw)}, not a ${type.d}; unset`,\n { line, element },\n );\n continue;\n }\n const scalar = scalarDtype(type.scalar, this.options.long);\n this.sink.setGraphValue(name, converted, {\n dtype: type.list ? \"list\" : scalar,\n ...(type.list ? { itemDtype: scalar } : {}),\n origin: { format: CX2_FORMAT, id: null, type: type.d },\n });\n } catch (err) {\n this.report.recordError(err, { line, element });\n }\n }\n }\n\n /**\n * Write the per-element visual property values: one column per property, typed by its values.\n * @param domain - node or edge\n * @param entries - the bypass elements\n */\n private readBypasses(domain: \"node\" | \"edge\", entries: readonly Held[]): void {\n const rows = domain === \"node\" ? this.nodeRows : this.edgeRows;\n const columns = new Map<string, { rows: number[]; values: unknown[]; at: Map<number, number> }>();\n for (const held of entries) {\n this.checkAbort();\n const { value, line } = held;\n if (!isRecord(value) || !isRecord(value.v)) {\n this.report.error(\n \"parse-error\",\n BAD_ASPECT_BLOCK_CODE,\n `a ${domain}Bypasses element is not an object with an id and a v object; skipped`,\n { line, element: `${domain}Bypasses` },\n );\n continue;\n }\n const row = this.rowOf(rows, value.id);\n if (row === undefined) {\n this.dangle(`${domain} bypass`);\n continue;\n }\n for (const [property, raw] of Object.entries(value.v)) {\n if (raw === null || raw === undefined) {\n continue;\n }\n if (property === \"\") {\n this.report.error(\n \"validation-error\",\n BAD_VALUE_CODE,\n `a ${domain}Bypasses element holds a visual property with an empty name; skipped`,\n { line, element: `${domain}Bypasses` },\n );\n continue;\n }\n let column = columns.get(property);\n if (column === undefined) {\n column = { rows: [], values: [], at: new Map() };\n columns.set(property, column);\n }\n const plain = plainJson(raw);\n const index = column.at.get(row);\n if (index === undefined) {\n column.at.set(row, column.rows.length);\n column.rows.push(row);\n column.values.push(plain);\n continue;\n }\n if (JSON.stringify(column.values[index]) !== JSON.stringify(plain)) {\n this.report.warnOnce(\n \"validation-error\",\n DUPLICATE_ATTRIBUTE_CODE,\n `a ${domain} has the visual property \"${property}\" in two ${domain}Bypasses elements; the later wins`,\n { line, element: property },\n `${DUPLICATE_ATTRIBUTE_CODE}:bypass:${domain}:${property}`,\n );\n }\n column.values[index] = plain;\n }\n }\n for (const [property, { rows: targets, values }] of columns) {\n const decl: ColumnDecl = {\n name: property,\n dtype: bypassDtype(values),\n nullable: true,\n // origin.id keeps the property's name: a column renamed for a clash is written back under it\n origin: { format: CX2_FORMAT, id: property, namespace: BYPASS_NAMESPACE },\n };\n const handle = declareFresh(this.sink, domain, decl, this.report);\n for (let i = 0; i < targets.length; i++) {\n if (domain === \"node\") {\n this.sink.setNodeValue(handle, targets[i], values[i]);\n } else {\n this.sink.setEdgeValue(handle, targets[i], values[i]);\n }\n }\n }\n }\n\n // ------------------------------------------------------------ aspects, status, metadata\n\n /** The style-rule loss, the single-element aspects, the status and the metadata counts. */\n private checkAspects(): void {\n const { doc, report } = this;\n const { structure } = doc;\n const styles: string[] = [];\n for (const aspect of STYLE_ASPECTS) {\n const elements = doc.opaque.get(aspect);\n if (elements !== undefined) {\n styles.push(describeStyle(aspect, elements));\n }\n }\n if (styles.length > 0) {\n report.warning(\n \"unsupported\",\n STYLES_NOT_IMPORTED_CODE,\n `the file's style rules are not applied (${styles.join(\"; \")}); they are kept in meta.extra.cx2.opaque`,\n { element: STYLE_ASPECTS.filter((a) => doc.opaque.has(a)).join(\",\") },\n );\n }\n for (const aspect of SINGLE_ELEMENT_ASPECTS.slice(1)) {\n const count = doc.opaque.get(aspect)?.length ?? 0;\n if (count > 1) {\n report.warning(\n \"validation-error\",\n CX2_ISSUE.EXTRA_ELEMENTS,\n `${aspect} holds ${count} elements where CX2 allows one; all are kept, a reader uses the first`,\n { element: aspect },\n );\n }\n }\n if (!doc.hasFragments) {\n for (const [aspect, blocks] of structure.blocks) {\n if (blocks > 1 && !STRUCTURE_ASPECTS.has(aspect)) {\n report.warnOnce(\n \"validation-error\",\n CX2_ISSUE.UNDECLARED_FRAGMENTS,\n `\"${aspect}\" comes in ${blocks} blocks although the descriptor does not declare hasFragments; the blocks are joined in order`,\n { element: aspect },\n );\n }\n }\n }\n this.checkStatus();\n structure.checkCounts();\n }\n\n /** The status block: present, and exactly one well-formed element. */\n private checkStatus(): void {\n const { report } = this;\n const { structure } = this.doc;\n if (!structure.hasStatus) {\n report.error(\"validation-error\", CX2_ISSUE.NO_STATUS, \"the document ends without a status block\", {\n element: \"status\",\n });\n } else if (!structure.statusWellFormed() || structure.counts.get(\"status\") !== 1) {\n // the specification: exactly one status aspect holding exactly one element\n const count = structure.counts.get(\"status\") ?? 0;\n const found = count === 1 ? shown(structure.status) : `${count} elements`;\n report.error(\n \"validation-error\",\n CX2_ISSUE.NO_STATUS,\n `the status is malformed (${found}): a document ends with one status block holding one object with a boolean success`,\n { element: \"status\" },\n );\n }\n }\n\n /** Record the metadata: source format and version, name, description, id type, the kept aspects. */\n private setMeta(): void {\n const { doc } = this;\n const attrs = doc.networkAttributes[0]?.value;\n const named = isRecord(attrs) ? attrs : {};\n const extra: Record<string, unknown> = {};\n if (doc.opaque.size > 0) {\n extra.opaque = Object.fromEntries(doc.opaque);\n }\n if (Object.keys(this.decls.other).length > 0) {\n extra.declarations = this.decls.other;\n }\n const { weightFrom } = this.options;\n const weightDecl = weightFrom === null ? undefined : this.decls.edge.byName.get(weightFrom);\n const patch: GraphMetaPatch = {\n sourceFormat: CX2_FORMAT,\n sourceVersion: doc.version,\n idType: this.idType,\n ...(typeof named.name === \"string\" ? { name: named.name } : {}),\n ...(typeof named.description === \"string\" ? { description: named.description } : {}),\n ...(this.weighted && weightFrom !== null\n ? {\n weightOrigin: {\n format: CX2_FORMAT,\n id: weightDecl?.alias ?? null,\n title: weightFrom,\n type: weightDecl?.type?.d ?? null,\n namespace: null,\n },\n }\n : {}),\n extra: { cx2: extra },\n };\n this.sink.setMeta(patch);\n }\n}\n\n/**\n * The dtype of a bypass column: f64 when every value is a number, bool when every one is a\n * boolean, string when every one is a string, json otherwise.\n * @param values - the values\n * @returns the dtype\n */\nfunction bypassDtype(values: readonly unknown[]): Dtype {\n if (values.every((v) => typeof v === \"number\")) {\n return \"f64\";\n }\n if (values.every((v) => typeof v === \"boolean\")) {\n return \"bool\";\n }\n if (values.every((v) => typeof v === \"string\")) {\n return \"string\";\n }\n return \"json\";\n}\n\n/**\n * What a style aspect holds, for the W_STYLES_NOT_IMPORTED message.\n * @param aspect - the aspect name\n * @param elements - its elements\n * @returns a short description\n */\nfunction describeStyle(aspect: string, elements: readonly unknown[]): string {\n const first = elements[0];\n if (aspect === \"visualProperties\" && isRecord(first)) {\n const count = (key: string): number => (isRecord(first[key]) ? Object.keys(first[key]).length : 0);\n const defaults = isRecord(first.default)\n ? Object.values(first.default).reduce<number>((n, v) => n + (isRecord(v) ? Object.keys(v).length : 0), 0)\n : 0;\n return `visualProperties: ${defaults} default${plural(defaults)}, ${count(\"nodeMapping\")} node mapping${plural(count(\"nodeMapping\"))}, ${count(\"edgeMapping\")} edge mapping${plural(count(\"edgeMapping\"))}`;\n }\n return `${aspect}: ${elements.length} element${plural(elements.length)}`;\n}\n\n/**\n * Resolve the zAs option.\n * @param value - the option\n * @returns the mode; E_UNSUPPORTED for any other value\n * @category Plugin helpers\n */\nexport function zAsOption(value: unknown): \"column\" | \"position\" {\n if (value === undefined) {\n return \"column\";\n }\n if (value === \"column\" || value === \"position\") {\n return value;\n }\n throw new GraphFormatError(\"E_UNSUPPORTED\", `option zAs: ${shown(value)} is not one of \"column\", \"position\"`, {\n option: \"zAs\",\n found: typeof value === \"string\" ? value : typeof value,\n });\n}\n\n/**\n * The CX2 importer plugin.\n * @category Built-in formats\n */\nexport const cx2Importer: GraphImporter<Cx2ImportOptions> = Object.freeze({\n format: CX2_FORMAT,\n options: Object.freeze([\"zAs\"]),\n extensions: Object.freeze([\".cx2\"]),\n mimeTypes: Object.freeze([\"application/json\"]),\n styles: readCx2Styles,\n\n /**\n * Confidence that the head is CX2: 0.97 when the first member of a top-level array is an\n * object with a CXVersion key, in any key order.\n * @param head - the first bytes\n * @returns the confidence\n */\n sniff(head: Uint8Array): number {\n const text = headText(head);\n return /^\\s*\\[\\s*\\{(?:\\s*\"[^\"]*\"\\s*:\\s*(?:true|false|\"[^\"]*\"|[0-9.]+)\\s*,)*\\s*\"CXVersion\"\\s*:/.test(text)\n ? 0.97\n : 0;\n },\n\n /**\n * Read a CX2 document into the sink.\n * @param input - the text, bytes or stream\n * @param sink - the sink\n * @param options - format-specific and common options\n * @returns the import report; ImportError on a fatal error or beyond the error limit\n */\n async import(\n input: ImportInput,\n sink: GraphSink,\n options?: Cx2ImportOptions & CommonImportOptions,\n ): Promise<ImportReport> {\n const resolved = resolveImportOptions(options, FORMAT_DEFAULTS);\n const zAs = zAsOption(options?.zAs);\n const report = new ImportReportBuilder(CX2_FORMAT, resolved.errorLimit);\n reportSinkOptions(sink, options, report, true);\n reportUnusedOptions(options, report, USED_OPTIONS);\n const doc = await readDocument(input, report, resolved);\n // the graphty.styles block of a file graphty wrote: a graph attribute, as in every other format\n const block = blockOfAspect(doc.opaque.get(STYLE_BLOCK_NAME));\n doc.opaque.delete(STYLE_BLOCK_NAME);\n new Cx2Reader(sink, report, resolved, zAs, doc).build();\n if (block !== null) {\n sink.setGraphValue(STYLE_BLOCK_NAME, block, { dtype: \"string\", origin: { format: CX2_FORMAT, id: null } });\n }\n const kept: Cx2StyleSource = {\n visualProperties: doc.opaque.get(\"visualProperties\"),\n visualEditorProperties: doc.opaque.get(\"visualEditorProperties\"),\n };\n report.keepForStyles(kept);\n throwIfAborted(resolved.signal);\n return report.finish();\n },\n});\n"],"names":[],"mappings":";;;;;;;;AAeO,MAAM,yBAAiD,2BAA2B,KAAK;AAQvF,SAAS,cAAc,UAAyB,SAA2C;AAC9F,QAAM,QAAQ,IAAI,WAAA;AAClB,QAAM,OAAO,QAAQ;AACrB,QAAM,QAAQ,sBAAsB,MAAM,kBAAkB,MAAM,wBAAwB,KAAK;AAC/F,SAAO,mBAAmB,UAAU,SAAS,OAAO,cAAc,OAAO,KAAK;AAClF;ACyFO,MAAM,aAAa;AAMnB,MAAM,wBAAwB;AAM9B,MAAM,mBAAmB;AAqBzB,MAAM,YAAY,OAAO,OAAO;AAAA,EACnC,GAAG;AAAA,EACH,GAAG;AAAA;AAAA,EAEH,aAAa;AAAA;AAAA,EAEb,QAAQ;AAAA;AAAA,EAER,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA,EAKd,kBAAkB;AAAA;AAAA,EAElB,mBAAmB;AAAA;AAAA,EAEnB,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKlB,eAAe;AAAA;AAAA,EAEf,SAAS;AAAA;AAAA,EAET,eAAe;AAAA;AAAA,EAEf,WAAW;AAAA;AAAA,EAEX,eAAe;AAAA;AAAA,EAEf,gBAAgB;AAAA;AAAA,EAEhB,sBAAsB;AAAA;AAAA,EAEtB,sBAAsB;AAAA;AAAA,EAEtB,sBAAsB;AAAA;AAAA,EAEtB,cAAc;AAAA;AAAA,EAEd,gBAAgB;AAAA;AAAA,EAEhB,qBAAqB;AAAA;AAAA,EAErB,gBAAgB;AAAA;AAAA,EAEhB,gBAAgB;AAAA;AAAA,EAEhB,gBAAgB;AAAA;AAAA,EAEhB,eAAe;AAAA;AAAA,EAEf,sBAAsB;AAAA;AAAA,EAEtB,uBAAuB;AAAA;AAAA,EAEvB,yBAAyB;AAAA;AAAA,EAEzB,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKrB,kBAAkB;AAAA;AAAA,EAElB,cAAc;AAAA;AAAA,EAEd,gBAAgB;AAAA;AAAA,EAEhB,WAAW;AAAA;AAAA,EAEX,aAAa;AAAA;AAAA,EAEb,mBAAmB;AAAA;AAAA,EAEnB,oBAAoB;AAAA;AAAA,EAEpB,qBAAqB;AAAA;AAAA,EAErB,YAAY;AAAA;AAAA,EAEZ,kBAAkB;AAAA;AAAA,EAElB,gBAAgB;AAAA;AAAA,EAEhB,mBAAmB;AAAA;AAAA,EAEnB,YAAY;AAAA;AAAA,EAEZ,cAAc;AAAA;AAAA,EAEd,gBAAgB;AAAA;AAAA,EAEhB,cAAc;AAAA;AAAA,EAEd,WAAW;AAAA;AAAA,EAEX,WAAW;AAAA;AAAA,EAEX,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKjB,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKhB,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA,EAKZ,mBAAmB;AAAA;AAAA,EAEnB,kBAAkB;AAAA;AAAA,EAElB,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKhB,aAAa;AAAA;AAAA,EAEb,WAAW;AACf,CAAC;AAED,MAAM,mCAA2D,IAA+B;AAAA,EAC5F;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,CAAC;AAGD,MAAM,kBAAwC;AAAA,EAC1C,KAAK;AAAA,EACL,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,iBAAiB;AACrB;AAEA,MAAM,uBAAuB;AAG7B,MAAM,gCAAqC,IAAI,CAAC,MAAM,KAAK,KAAK,KAAK,GAAG,CAAC;AAGzE,MAAM,gCAAqC,IAAI,CAAC,MAAM,KAAK,KAAK,GAAG,CAAC;AAGpE,MAAM,yBAA4C,CAAC,qBAAqB,oBAAoB,wBAAwB;AAGpH,MAAM,gBAAmC;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ;AAGA,MAAM,oBAAyC,oBAAI,IAAI,CAAC,YAAY,QAAQ,CAAC;AAG7E,MAAM,oCAAyC,IAAI;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,CAAC;AAgBD,MAAM,8BAA8C,IAAI;AAAA,EACpD,CAAC,UAAU,QAAQ;AAAA,EACnB,CAAC,QAAQ,MAAM;AAAA,EACf,CAAC,WAAW,SAAS;AAAA,EACrB,CAAC,UAAU,QAAQ;AAAA,EACnB,CAAC,WAAW,SAAS;AAAA,EACrB,CAAC,OAAO,QAAQ;AAAA,EAChB,CAAC,OAAO,SAAS;AAAA,EACjB,CAAC,QAAQ,SAAS;AAAA,EAClB,CAAC,SAAS,QAAQ;AACtB,CAAC;AAQM,SAAS,QAAQ,GAA2B;AAC/C,QAAM,OAAO,EAAE,WAAW,UAAU;AACpC,QAAM,SAAS,QAAQ,IAAI,OAAO,EAAE,MAAM,WAAW,MAAM,IAAI,CAAC;AAChE,MAAI,WAAW,QAAW;AACtB,WAAO;AAAA,EACX;AACA,SAAO,EAAE,GAAG,OAAO,WAAW,MAAM,KAAK,QAAQ,QAAQ,KAAA;AAC7D;AAQA,SAAS,YAAY,QAAmB,MAAqC;AACzE,UAAQ,QAAA;AAAA,IACJ,KAAK;AACD,aAAO;AAAA,IACX,KAAK;AACD,aAAO,SAAS,WAAW,WAAW;AAAA,IAC1C,KAAK;AACD,aAAO;AAAA,IACX,KAAK;AACD,aAAO;AAAA,IACX,KAAK;AACD,aAAO;AAAA,IACX,SAAS;AACL,YAAM,OAAe;AACrB,aAAO;AAAA,IACX;AAAA,EAAA;AAER;AAGA,MAAM,6BAAa,KAAK;AAExB,MAAM,UAAU;AAChB,MAAM,UAAU;AAUhB,SAAS,cACL,OACA,QACA,MACA,aACO;AACP,UAAQ,QAAA;AAAA,IACJ,KAAK;AACD,aAAO,OAAO,UAAU,WAAW,QAAQ;AAAA,IAC/C,KAAK;AACD,aAAO,OAAO,UAAU,YAAY,QAAQ;AAAA,IAChD,KAAK;AACD,UAAI,iBAAiB,cAAc;AAC/B,oBAAY,MAAM,MAAM;AACxB,eAAO,OAAO,MAAM,MAAM;AAAA,MAC9B;AACA,aAAO,OAAO,UAAU,WAAW,QAAQ;AAAA,IAC/C,KAAK;AACD,aAAO,OAAO,UAAU,YAAY,OAAO,UAAU,KAAK,KAAK,SAAS,WAAW,SAAS,UACtF,QACA;AAAA,IACV,KAAK;AACD,UAAI,iBAAiB,cAAc;AAC/B,YAAI,SAAS,UAAU;AACnB,iBAAO,MAAM;AAAA,QACjB;AACA,oBAAY,MAAM,MAAM;AACxB,eAAO,OAAO,MAAM,MAAM;AAAA,MAC9B;AACA,UAAI,OAAO,UAAU,YAAY,OAAO,UAAU,KAAK,GAAG;AACtD,eAAO,SAAS,WAAW,OAAO,KAAK,IAAI;AAAA,MAC/C;AACA,aAAO;AAAA,IACX;AACI,aAAO;AAAA,EAAA;AAEnB;AAUA,SAAS,aACL,OACA,MACA,MACA,aACO;AACP,MAAI,CAAC,KAAK,MAAM;AACZ,WAAO,cAAc,OAAO,KAAK,QAAQ,MAAM,WAAW;AAAA,EAC9D;AACA,MAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACvB,WAAO;AAAA,EACX;AACA,QAAM,MAAiB,CAAA;AACvB,aAAW,QAAQ,OAAO;AACtB,UAAM,YAAY,SAAS,OAAO,MAAM,cAAc,MAAM,KAAK,QAAQ,MAAM,WAAW;AAC1F,QAAI,cAAc,KAAK;AACnB,aAAO;AAAA,IACX;AACA,QAAI,KAAK,SAAS;AAAA,EACtB;AACA,SAAO;AACX;AAOA,SAAS,MAAM,OAAwB;AACnC,MAAI,iBAAiB,cAAc;AAC/B,WAAO,MAAM;AAAA,EACjB;AACA,MAAI;AACJ,MAAI;AACA,WAAO,KAAK,UAAU,KAAK,KAAK,OAAO,KAAK;AAAA,EAChD,QAAQ;AACJ,WAAO,OAAO,KAAK;AAAA,EACvB;AACA,SAAO,KAAK,SAAS,KAAK,GAAG,KAAK,MAAM,GAAG,EAAE,CAAC,QAAQ;AAC1D;AAmCA,SAAS,YAAY,MAAc,MAAyB,QAAQ,GAAW;AAC3E,MAAI,CAAC,UAAU,KAAK,IAAI,GAAG;AACvB,WAAO;AAAA,EACX;AACA,MAAI,OAAO;AACX,OAAK,QAAQ,CAAC,KAAK,MAAM;AACrB,QAAI,eAAe,MAAM,KAAK,KAAK,GAAG;AAClC,cAAQ,KAAK;AAAA,IACjB;AAAA,EACJ,CAAC;AACD,SAAO;AACX;AASA,eAAe,aACX,OACA,QACA,SACoB;AACpB,QAAM,YAAY,IAAI,YAAY,MAAM;AACxC,QAAM,MAAmB;AAAA,IACrB,SAAS;AAAA,IACT,cAAc;AAAA,IACd,OAAO,CAAA;AAAA,IACP,OAAO,CAAA;AAAA,IACP,cAAc,CAAA;AAAA,IACd,mBAAmB,CAAA;AAAA,IACnB,cAAc,CAAA;AAAA,IACd,cAAc,CAAA;AAAA,IACd,iBAAiB,CAAA;AAAA,IACjB,4BAAY,IAAA;AAAA,IACZ;AAAA,EAAA;AAEJ,MAAI,aAAa;AACjB,MAAI,eAAe;AACnB,MAAI,aAAa;AACjB,QAAM,kBAAkB,cAAc,QAAQ,uBAAuB;AACrE,QAAM,UAAU,CAAC,QAAgB,OAAgB,MAAc,MAAc,OAAgB,QAAQ,MAAY;AAC7G,cAAU,QAAQ,QAAQ,OAAO,IAAI;AACrC,YAAQ,QAAA;AAAA,MACJ,KAAK;AACD,uBAAe;AACf,YAAI,MAAM,KAAK,EAAE,OAAO,MAAM,SAAS,YAAY,MAAM,CAAC,IAAI,GAAG,KAAK,GAAG;AACzE;AAAA,MACJ,KAAK;AACD,uBAAe;AACf,YAAI,MAAM,KAAK,EAAE,OAAO,MAAM,SAAS,YAAY,MAAM,CAAC,MAAM,KAAK,GAAG,GAAG,KAAK,GAAG;AACnF;AAAA,MACJ,KAAK;AACD,YAAI,cAAc;AACd,iBAAO;AAAA,YACH;AAAA,YACA;AAAA,YACA;AAAA,YACA,EAAE,MAAM,SAAS,OAAA;AAAA,YACjB,GAAG,iBAAiB;AAAA,UAAA;AAAA,QAE5B;AAEA,YAAI,aAAa,KAAK,EAAE,OAAO,MAAM,SAAS,GAAG;AACjD;AAAA,MACJ,KAAK;AACD,uBAAe;AACf,YAAI,kBAAkB,KAAK,EAAE,OAAO,MAAM,SAAS,GAAG;AACtD;AAAA,MACJ,KAAK;AACD,YAAI,aAAa,KAAK,EAAE,OAAO,MAAM,SAAS,GAAG;AACjD;AAAA,MACJ,KAAK;AACD,YAAI,aAAa,KAAK,EAAE,OAAO,MAAM,SAAS,GAAG;AACjD;AAAA,MACJ,KAAK;AACD,YAAI,gBAAgB,KAAK,EAAE,OAAO,MAAM,SAAS,GAAG;AACpD;AAAA,MACJ;AACI,YAAI,kBAAkB,IAAI,MAAM,GAAG;AAC/B;AAAA,QACJ;AACA,YAAI,CAAC,IAAI,OAAO,IAAI,MAAM,GAAG;AACzB,cAAI,OAAO,IAAI,QAAQ,CAAA,CAAE;AAAA,QAC7B;AACA,YAAI,OAAO,IAAI,MAAM,GAAG,KAAK,QAAQ,UAAU,OAAO,eAAe,IAAI,KAAK;AAAA,IAAA;AAAA,EAE1F;AACA,MAAI;AACA,qBAAiB,SAAS,YAAY,WAAW,OAAO,QAAQ,OAAO,GAAG,MAAM,GAAG;AAC/E,UAAI,EAAE,cAAc,sBAAsB;AACtC,qBAAa;AACb,uBAAe,QAAQ,MAAM;AAAA,MACjC;AACA,cAAQ,MAAM,MAAA;AAAA,QACV,KAAK;AACD,iBAAO;AAAA,YACH,UAAU;AAAA,YACV,yCAAyC,MAAM,SAAS,cAAc,MAAM,MAAM,KAAK,CAAC;AAAA,YACxF,EAAE,MAAM,MAAM,KAAA;AAAA,UAAK;AAEvB;AAAA,QACJ,KAAK;AACD,cAAI,CAAC,YAAY;AACb,2BAAe,MAAM,OAAO,MAAM,MAAM,KAAK,MAAM;AACnD,yBAAa;AACb;AAAA,UACJ;AACA,uBAAa,MAAM,OAAO,MAAM,MAAM,WAAW,QAAQ,CAAC,QAAQ,UAAU;AACxE,oBAAQ,QAAQ,OAAO,MAAM,MAAM,MAAM,MAAM,MAAM,OAAO,CAAC;AAAA,UACjE,CAAC;AACD;AAAA,QACJ,KAAK;AACD,4BAAkB,QAAQ,KAAK;AAC/B,cAAI,CAAC,YAAY;AACb,mBAAO;AAAA,cACH,UAAU;AAAA,cACV,+BAA+B,MAAM,MAAM,2CAA2C,MAAM,WAAW,wBAAwB,MAAM,WAAW,aAAa,kEAAkE,EAAE;AAAA,cACjO,EAAE,MAAM,MAAM,KAAA;AAAA,YAAK;AAAA,UAE3B;AACA,oBAAU,MAAM,MAAM,QAAQ,MAAM,IAAI;AACxC;AAAA,QACJ,KAAK;AACD,kBAAQ,MAAM,QAAQ,MAAM,OAAO,MAAM,MAAM,MAAM,MAAM,MAAM,KAAK;AACtE;AAAA,QACJ,KAAK;AACD,wBAAc,QAAQ,KAAK;AAC3B,cAAI,CAAC,YAAY;AACb,2BAAe,MAAM,MAAM,MAAM,KAAK,MAAM;AAAA,UAChD;AACA;AAAA,QACJ,KAAK;AACD,iBAAO;AAAA,YACH;AAAA,YACA;AAAA,YACA,QAAQ,MAAM,MAAM,4BAA4B,MAAM,KAAK,KAAK,IAAI,CAAC;AAAA,YACrE,EAAE,MAAM,MAAM,MAAM,SAAS,MAAM,OAAA;AAAA,UAAO;AAE9C;AAAA,QACJ;AACI;AAAA,MAAA;AAAA,IAEZ;AAAA,EACJ,SAAS,KAAK;AACV,QAAI,eAAe,eAAe;AAC9B,aAAO,KAAK,IAAI,QAAQ,mBAAmB,aAAa,IAAI,SAAS,EAAE,MAAM,IAAI,KAAA,CAAM;AAAA,IAC3F;AACA,UAAM;AAAA,EACV;AACA,MAAI,CAAC,YAAY;AACb,WAAO,KAAK,UAAU,eAAe,yEAAyE;AAAA,EAClH;AACA,SAAO;AACX;AASA,SAAS,iBAAiB,OAAgB,MAAc,QAAoC;AACxF,QAAM,OAAO,SAAS,KAAK,IAAI,OAAO,KAAK,KAAK,IAAI,CAAA;AACpD,QAAM,UAAU,KAAK,SAAS,IAAI,WAAW,KAAK,KAAK,IAAI,CAAC,MAAM;AAClE,SAAO,OAAO;AAAA,IACV,UAAU;AAAA,IACV,mEAAmE,OAAO;AAAA,IAC1E;AAAA,MACI;AAAA,IAAA;AAAA,EACJ;AAER;AASA,SAAS,eAAe,OAAgB,MAAc,KAAkB,QAAmC;AACvG,MAAI,CAAC,SAAS,KAAK,KAAK,EAAE,eAAe,QAAQ;AAC7C,qBAAiB,OAAO,MAAM,MAAM;AAAA,EACxC;AACA,QAAM,MAAM,MAAM;AAClB,QAAM,OAAO,OAAO,QAAQ,YAAY,OAAO,QAAQ,WAAW,OAAO,GAAG,IAAI;AAEhF,QAAM,QAAQ,wBAAwB,KAAK,IAAI;AAC/C,QAAM,QAAQ,UAAU,OAAO,OAAO,MAAM,OAAO,MAAM,CAAC,CAAC;AAC3D,MAAI,UAAU,GAAG;AACb,WAAO;AAAA,MACH,UAAU;AAAA,MACV,aAAa,MAAM,GAAG,CAAC;AAAA,MACvB,EAAE,MAAM,SAAS,YAAA;AAAA,IAAY;AAAA,EAErC;AACA,MAAI,UAAU,GAAG;AACb,WAAO,KAAK,UAAU,SAAS,aAAa,MAAM,GAAG,CAAC,yBAAyB,EAAE,MAAM,SAAS,YAAA,CAAa;AAAA,EACjH;AACA,MAAI,UAAU;AACd,MAAI,QAAQ,OAAO;AACf,WAAO;AAAA,MACH;AAAA,MACA,UAAU;AAAA,MACV,aAAa,MAAM,GAAG,CAAC;AAAA,MACvB,EAAE,MAAM,SAAS,YAAA;AAAA,IAAY;AAAA,EAErC;AACA,aAAW,OAAO,OAAO,KAAK,KAAK,GAAG;AAClC,QAAI,QAAQ,gBAAgB;AACxB,UAAI,OAAO,MAAM,iBAAiB,WAAW;AACzC,YAAI,eAAe,MAAM;AAAA,MAC7B,OAAO;AACH,eAAO;AAAA,UACH;AAAA,UACA;AAAA,UACA,mBAAmB,MAAM,MAAM,YAAY,CAAC;AAAA,UAC5C,EAAE,MAAM,SAAS,eAAA;AAAA,QAAe;AAAA,MAExC;AAAA,IACJ,WAAW,QAAQ,aAAa;AAC5B,aAAO,QAAQ,oBAAoB,sBAAsB,uBAAuB,GAAG,oBAAoB;AAAA,QACnG;AAAA,QACA,SAAS;AAAA,MAAA,CACZ;AAAA,IACL;AAAA,EACJ;AACJ;AAWA,SAAS,aACL,OACA,MACA,WACA,QACA,SACI;AACJ,QAAM,OAAO,SAAS,KAAK,IAAI,OAAO,KAAK,KAAK,IAAI,CAAA;AACpD,MAAI,SAAS,KAAK,KAAK,KAAK,WAAW,KAAK,SAAS,MAAM,KAAK,CAAC,CAAC,CAAC,GAAG;AAClE,QAAI,cAAc,IAAI,KAAK,CAAC,CAAC,GAAG;AAC5B,aAAO;AAAA,QACH;AAAA,QACA,UAAU;AAAA,QACV,QAAQ,KAAK,CAAC,CAAC;AAAA,QACf,EAAE,MAAM,SAAS,KAAK,CAAC,EAAA;AAAA,MAAE;AAAA,IAEjC;AACA,cAAU,MAAM,KAAK,CAAC,GAAG,IAAI;AAC7B,YAAQ,KAAK,CAAC,GAAG,MAAM,KAAK,CAAC,CAAC,CAAC;AAC/B;AAAA,EACJ;AACA,QAAM,OAAO,KAAK,SAAS,IAAI,kBAAkB,KAAK,MAAM,UAAU,KAAK,KAAK,IAAI,CAAC,MAAM,MAAM,KAAK;AACtG,SAAO;AAAA,IACH;AAAA,IACA;AAAA,IACA,+BAA+B,IAAI;AAAA,IACnC,EAAE,MAAM,SAAS,KAAK,CAAC,KAAK,KAAA;AAAA,EAAK;AAEzC;AAwBA,SAAS,WAAW,OAAkC;AAClD,UAAQ,OAAO,OAAA;AAAA,IACX,KAAK;AACD,aAAO;AAAA,IACX,KAAK;AACD,aAAO;AAAA,IACX,KAAK;AACD,aAAO,OAAO,UAAU,KAAK,KAAK,SAAS,WAAW,SAAS,UAAU,YAAY;AAAA,IACzF;AACI,aAAO,iBAAiB,eAAe,WAAW;AAAA,EAAA;AAE9D;AAiBA,SAAS,UAAU,GAAiC,GAAuC;AACvF,MAAI,MAAM,UAAa,MAAM,GAAG;AAC5B,WAAO;AAAA,EACX;AACA,MAAI,MAAM,QAAQ,MAAM,MAAM;AAC1B,WAAO;AAAA,EACX;AACA,SAAQ,MAAM,aAAa,MAAM,YAAc,MAAM,YAAY,MAAM,YAAa,WAAW;AACnG;AAOA,SAAS,QAAQ,MAAY,OAAsB;AAC/C,QAAM,OAAO,MAAM,QAAQ,KAAK;AAChC,MAAI,KAAK,SAAS,UAAa,KAAK,SAAS,MAAM;AAC/C,SAAK,OAAO;AACZ;AAAA,EACJ;AACA,OAAK,OAAO;AACZ,MAAI,CAAC,MAAM;AACP,SAAK,OAAO,UAAU,KAAK,MAAM,WAAW,KAAK,CAAC;AAClD;AAAA,EACJ;AACA,aAAW,QAAQ,OAAoB;AACnC,SAAK,OAAO,UAAU,KAAK,MAAM,SAAS,QAAQ,MAAM,QAAQ,IAAI,IAAI,OAAO,WAAW,IAAI,CAAC;AAAA,EACnG;AACJ;AAOA,SAAS,aAAa,MAA4B;AAC9C,MAAI,KAAK,SAAS,MAAM;AACpB,WAAO;AAAA,EACX;AACA,QAAM,SAAS,KAAK,QAAQ;AAC5B,SAAO,QAAQ,KAAK,SAAS,OAAO,WAAW,MAAM,KAAK,MAAM;AACpE;AAGA,MAAM,iBAAiB;AAAA,EAAvB,cAAA;AACI,SAAS,6BAAa,IAAA;AAEtB,SAAS,8BAAc,IAAA;AAAA,EAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOhD,QAAQ,KAAgF;AACpF,UAAM,WAAW,KAAK,QAAQ,IAAI,GAAG;AACrC,QAAI,aAAa,QAAW;AACxB,aAAO,EAAE,MAAM,UAAU,UAAU,KAAA;AAAA,IACvC;AACA,UAAM,OAAO,KAAK,OAAO,IAAI,GAAG;AAChC,WAAO,SAAS,SAAY,OAAO,EAAE,MAAM,UAAU,MAAA;AAAA,EACzD;AACJ;AAYA,MAAM,uCAAyE,IAAI;AAAA,EAC/E,CAAC,SAAS,MAAM;AAAA,EAChB,CAAC,SAAS,MAAM;AAAA,EAChB,CAAC,qBAAqB,SAAS;AACnC,CAAC;AAQD,SAAS,OAAO,QAAiC,KAAsB;AACnE,SAAO,OAAO,OAAO,QAAQ,GAAG;AACpC;AAKA,MAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA6DZ,YACI,MACA,QACA,SACA,KACA,KACF;AApDF,SAAiB,QAAsB;AAAA,MACnC,MAAM,IAAI,iBAAA;AAAA,MACV,MAAM,IAAI,iBAAA;AAAA,MACV,SAAS,IAAI,iBAAA;AAAA,MACb,OAAO,CAAA;AAAA,IAAC;AAIZ,SAAiB,+BAAe,IAAA;AAGhC,SAAiB,8BAAc,IAAA;AAG/B,SAAiB,+BAAe,IAAA;AAGhC,SAAiB,+BAAe,IAAA;AAEhC,SAAQ,iBAA+B;AAEvC,SAAQ,UAAwB;AAEhC,SAAQ,eAA6B;AAGrC,SAAiB,iCAAiB,IAAA;AAElC,SAAQ,aAAa;AAErB,SAAQ,SAAyC;AAEjD,SAAQ,WAAW;AAEnB,SAAiB,+BAAe,IAAA;AAEhC,SAAiB,QAAkC,CAAC,GAAG,GAAG,CAAC;AAiBvD,SAAK,OAAO;AACZ,SAAK,SAAS;AACd,SAAK,UAAU;AACf,SAAK,MAAM;AACX,SAAK,MAAM;AACX,SAAK,YAAY,IAAI,kBAAkB,MAAM,QAAQ,QAAQ,gBAAgB;AAC7E,SAAK,UAAU,IAAI,UAAU,QAAQ,GAAG;AAAA,EAC5C;AAAA;AAAA,EAGA,QAAc;AACV,UAAM,EAAE,KAAK,OAAA,IAAW;AACxB,SAAK,UAAU,UAAU,IAAI;AAC7B,SAAK,iBAAA;AACL,SAAK,eAAA;AACL,SAAK,KAAK,QAAQ,IAAI,MAAM,QAAQ,IAAI,MAAM,MAAM;AACpD,eAAW,QAAQ,IAAI,OAAO;AAC1B,WAAK,SAAS,IAAI;AAAA,IACtB;AACA,SAAK,iBAAA;AACL,QAAI,KAAK,WAAW,OAAO,KAAK,KAAK,WAAW,OAAO,KAAK,SAAS,MAAM;AACvE,aAAO;AAAA,QACH;AAAA,QACA,UAAU;AAAA,QACV,GAAG,KAAK,SAAS,OAAO,KAAK,WAAW,IAAI,OAAO,KAAK,SAAS,IAAI,QAAQ,OAAO,KAAK,SAAS,IAAI,CAAC,IAAI,MAAM,KAAK,SAAS,OAAO,KAAK,WAAW,MAAM,OAAO,MAAM,CAAC;AAAA,QAC1K,EAAE,SAAS,QAAA;AAAA,MAAQ;AAAA,IAE3B;AACA,eAAW,QAAQ,IAAI,OAAO;AAC1B,WAAK,SAAS,IAAI;AAAA,IACtB;AACA,SAAK,sBAAA;AACL,SAAK,aAAa,QAAQ,IAAI,YAAY;AAC1C,SAAK,aAAa,QAAQ,IAAI,YAAY;AAC1C,eAAW,CAAC,MAAM,KAAK,KAAK,KAAK,UAAU;AACvC,aAAO;AAAA,QACH;AAAA,QACA;AAAA,QACA,GAAG,KAAK,IAAI,IAAI,GAAG,OAAO,KAAK,CAAC,IAAI,MAAM,OAAO,SAAS,MAAM,CAAC;AAAA,QACjE,EAAE,SAAS,KAAA;AAAA,MAAK;AAAA,IAExB;AACA,SAAK,aAAA;AACL,SAAK,QAAA;AAAA,EACT;AAAA;AAAA;AAAA,EAKQ,mBAAyB;AAC7B,UAAM,EAAE,WAAW;AACnB,eAAW,QAAQ,KAAK,IAAI,cAAc;AACtC,UAAI,CAAC,SAAS,KAAK,KAAK,GAAG;AACvB,eAAO;AAAA,UACH;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,YACI,MAAM,KAAK;AAAA,YACX,SAAS;AAAA,UAAA;AAAA,QACb;AAEJ;AAAA,MACJ;AACA,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,KAAK,GAAG;AACnD,cAAM,SAAS,iBAAiB,IAAI,GAAG;AACvC,YAAI,WAAW,QAAW;AACtB,iBAAO;AAAA,YACH;AAAA,YACA;AAAA,YACA,0CAA0C,GAAG;AAAA,YAC7C,EAAE,MAAM,KAAK,MAAM,SAAS,IAAA;AAAA,UAAI;AAEpC;AAAA,YACI,KAAK,MAAM;AAAA,YACX;AAAA,YACA,UAAU,OAAO,CAAC,WAAW;AACzB,mBAAK,UAAU,KAAK,MAAM;AAAA,YAC9B,CAAC;AAAA,UAAA;AAEL;AAAA,QACJ;AACA,YAAI,CAAC,SAAS,KAAK,GAAG;AAClB,iBAAO;AAAA,YACH;AAAA,YACA;AAAA,YACA,OAAO,GAAG;AAAA,YACV,EAAE,MAAM,KAAK,MAAM,SAAS,IAAA;AAAA,UAAI;AAEpC;AAAA,QACJ;AACA,mBAAW,CAAC,MAAM,IAAI,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC9C,eAAK,QAAQ,QAAQ,MAAM,MAAM,KAAK,IAAI;AAAA,QAC9C;AAAA,MACJ;AAAA,IACJ;AACA,eAAW,UAAU,CAAC,QAAQ,MAAM,GAAY;AAC5C,WAAK,aAAa,MAAM;AAAA,IAC5B;AACA,SAAK,gBAAgB,QAAQ,KAAK,IAAI,KAAK;AAC3C,SAAK,gBAAgB,QAAQ,KAAK,IAAI,KAAK;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,gBAAgB,QAAyB,UAAiC;AAC9E,UAAM,QAAQ,KAAK,MAAM,MAAM;AAC/B,UAAM,2BAAW,IAAA;AACjB,eAAW,EAAE,MAAA,KAAW,UAAU;AAC9B,UAAI,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,MAAM,CAAC,GAAG;AACxC;AAAA,MACJ;AACA,iBAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,MAAM,CAAC,GAAG;AAC9C,cAAM,WAAW,MAAM,QAAQ,GAAG;AAClC,YACI,QAAQ,MACP,aAAa,QAAQ,SAAS,KAAK,SAAS,QAC7C,QAAQ,QACR,QAAQ,QACV;AACE;AAAA,QACJ;AACA,cAAM,OAAO,UAAU,KAAK,QAAQ;AACpC,YAAI,QAAQ,KAAK,IAAI,IAAI;AACzB,YAAI,UAAU,QAAW;AACrB,kBAAQ,EAAE,MAAM,QAAW,MAAM,OAAA;AACjC,eAAK,IAAI,MAAM,KAAK;AAAA,QACxB;AACA,gBAAQ,OAAO,GAAG;AAAA,MACtB;AAAA,IACJ;AACA,eAAW,CAAC,MAAM,KAAK,KAAK,MAAM;AAC9B,YAAM,OAAO,aAAa,KAAK;AAC/B,YAAM,OAAO,MAAM,OAAO,IAAI,IAAI;AAClC,UAAI,SAAS,QAAW;AACpB,aAAK,OAAO;AACZ,YAAI,KAAK,cAAc,SAAS,MAAM;AAElC,eAAK,eAAe,KAAK,eAAe,MAAM,KAAK,YAAY,MAAM,EAAE,SAAS,KAAA,CAAM;AACtF,eAAK,aAAa,KAAK,iBAAiB;AAAA,QAC5C;AACA;AAAA,MACJ;AACA,YAAM,OAAO,IAAI,MAAM;AAAA,QACnB;AAAA,QACA;AAAA,QACA,OAAO;AAAA,QACP,YAAY;AAAA,QACZ,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,YAAY;AAAA,MAAA,CACf;AAAA,IACL;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,QAAQ,QAAqC,MAAc,KAAc,MAAoB;AACjG,UAAM,EAAE,WAAW;AACnB,UAAM,QAAQ,KAAK,MAAM,MAAM;AAC/B,UAAM,QAAQ,EAAE,MAAM,SAAS,KAAA;AAC/B,QAAI,SAAS,IAAI;AACb,aAAO;AAAA,QACH;AAAA,QACA;AAAA,QACA,KAAK,MAAM;AAAA,QACX;AAAA,MAAA;AAEJ;AAAA,IACJ;AACA,QAAI,CAAC,SAAS,GAAG,GAAG;AAChB,aAAO;AAAA,QACH;AAAA,QACA;AAAA,QACA,uBAAuB,IAAI;AAAA,QAC3B;AAAA,MAAA;AAEJ;AAAA,IACJ;AACA,QAAI;AACJ,QAAI,IAAI,MAAM,QAAW;AACrB,aAAO,QAAQ,QAAQ;AACvB,aAAO;AAAA,QACH;AAAA,QACA;AAAA,QACA,uBAAuB,IAAI;AAAA,QAC3B;AAAA,MAAA;AAAA,IAER,OAAO;AACH,aAAO,OAAO,IAAI,MAAM,WAAW,QAAQ,IAAI,CAAC,IAAI;AACpD,UAAI,SAAS,MAAM;AACf,eAAO;AAAA,UACH;AAAA,UACA;AAAA,UACA,YAAY,MAAM,IAAI,CAAC,CAAC,QAAQ,IAAI;AAAA,UACpC;AAAA,QAAA;AAAA,MAER;AAAA,IACJ;AACA,UAAM,WAAW,MAAM,OAAO,IAAI,IAAI;AACtC,QAAI,aAAa,QAAW;AACxB,UAAI,SAAS,MAAM,MAAM,MAAM,GAAG;AAC9B,eAAO;AAAA,UACH;AAAA,UACA,UAAU;AAAA,UACV,IAAI,IAAI,iBAAiB,SAAS,MAAM,KAAK,SAAS,cAAc,MAAM,KAAK,SAAS;AAAA,UACxF;AAAA,QAAA;AAAA,MAER;AACA;AAAA,IACJ;AACA,QAAI,IAAI,MAAM,UAAa,IAAI,MAAM,QAAQ,OAAO,IAAI,MAAM,UAAU;AACpE,aAAO;AAAA,QACH;AAAA,QACA;AAAA,QACA,aAAa,MAAM,IAAI,CAAC,CAAC,QAAQ,IAAI;AAAA,QACrC;AAAA,MAAA;AAAA,IAER;AACA,QAAI,QAAQ,OAAO,IAAI,MAAM,WAAW,IAAI,IAAI;AAChD,QAAI,aAAa,IAAI,MAAM,UAAa,IAAI,MAAM;AAClD,QAAI,WAAW,cAAc,IAAI,MAAM,UAAa,IAAI,MAAM,SAAY;AACtE,aAAO;AAAA,QACH;AAAA,QACA,UAAU;AAAA,QACV,0BAA0B,IAAI;AAAA,QAC9B;AAAA,MAAA;AAEJ,cAAQ;AACR,mBAAa;AAAA,IACjB;AACA,QAAI,eAAwB;AAC5B,QAAI,cAAc,SAAS,MAAM;AAC7B,qBAAe,KAAK,eAAe,MAAM,IAAI,GAAG,MAAM,KAAK;AAC3D,mBAAa,iBAAiB;AAAA,IAClC;AACA,UAAM,OAAO,IAAI,MAAM;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAY,cAAc,SAAS,OAAO,UAAU,IAAI,CAAC,IAAI;AAAA,MAC7D,QAAQ;AAAA,MACR,YAAY;AAAA,IAAA,CACf;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaQ,eACJ,MACA,OACA,MACA,OACO;AACP,UAAM,YAAY,aAAa,OAAO,MAAM,KAAK,QAAQ,MAAM,CAAC,WAAW;AACvE,WAAK,UAAU,MAAM,MAAM;AAAA,IAC/B,CAAC;AACD,QAAI,cAAc,KAAK;AACnB,aAAO;AAAA,IACX;AACA,UAAM,UAAU,KAAK,WAAW,YAAY,KAAK,WAAW,aAAa,KAAK,WAAW;AACzF,QACI,CAAC,KAAK,QACN,WACA,OAAO,UAAU,YACjB,MAAM,KAAA,MAAW,MACjB,OAAO,SAAS,OAAO,KAAK,CAAC,GAC/B;AACE,YAAM,UAAU,aAAa,OAAO,KAAK,GAAG,MAAM,KAAK,QAAQ,MAAM,MAAM,MAAS;AACpF,UAAI,YAAY,KAAK;AACjB,aAAK,OAAO;AAAA,UACR;AAAA,UACA;AAAA,UACA,eAAe,MAAM,KAAK,CAAC,QAAQ,IAAI,wBAAwB,KAAK,CAAC,aAAa,MAAM,OAAO,CAAC;AAAA,UAChG;AAAA,QAAA;AAEJ,eAAO;AAAA,MACX;AAAA,IACJ;AACA,SAAK,OAAO;AAAA,MACR;AAAA,MACA;AAAA,MACA,eAAe,MAAM,KAAK,CAAC,QAAQ,IAAI,cAAc,KAAK,CAAC;AAAA,MAC3D;AAAA,IAAA;AAEJ,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,aAAa,QAA+B;AAChD,UAAM,QAAQ,KAAK,MAAM,MAAM;AAC/B,eAAW,QAAQ,MAAM,OAAO,OAAA,GAAU;AACtC,YAAM,EAAE,UAAU;AAClB,UAAI,UAAU,QAAQ,UAAU,KAAK,MAAM;AACvC,YAAI,UAAU,MAAM;AAChB,gBAAM,QAAQ,IAAI,OAAO,IAAI;AAAA,QACjC;AACA;AAAA,MACJ;AACA,YAAM,QAAQ,MAAM,OAAO,IAAI,KAAK,KAAK,MAAM,QAAQ,IAAI,KAAK;AAChE,UAAI,UAAU,QAAW;AACrB,cAAM,QAAQ,MAAM,SAAS,QAAQ,wBAAwB,iBAAiB,MAAM,IAAI;AACxF,aAAK,OAAO;AAAA,UACR;AAAA,UACA,UAAU;AAAA,UACV,cAAc,KAAK,YAAY,MAAM,eAAe,KAAK,IAAI,aAAa,KAAK;AAAA,UAC/E,EAAE,SAAS,KAAK,KAAA;AAAA,QAAK;AAEzB,aAAK,QAAQ;AACb;AAAA,MACJ;AACA,YAAM,QAAQ,IAAI,OAAO,IAAI;AAAA,IACjC;AAAA,EACJ;AAAA;AAAA,EAGQ,iBAAuB;AAC3B,UAAM,UAAU,KAAK,QAAQ;AAC7B,eAAW,UAAU,CAAC,QAAQ,MAAM,GAAY;AAC5C,iBAAW,QAAQ,KAAK,MAAM,MAAM,EAAE,OAAO,UAAU;AACnD,YAAI,WAAW,UAAU,WAAW,KAAK,SAAS,uBAAuB;AACrE;AAAA,QACJ;AACA,YAAI,WAAW,UAAU,KAAK,SAAS,KAAK,QAAQ,YAAY;AAC5D;AAAA,QACJ;AACA,cAAM,SACF,KAAK,SAAS,OACR;AAAA,UACI,MAAM,KAAK;AAAA,UACX,OAAO;AAAA,UACP,UAAU;AAAA,UACV,QAAQ,EAAE,QAAQ,YAAY,IAAI,KAAK,MAAA;AAAA,QAAM,IAEjD;AAAA,UACI,GAAG,KAAK,WAAW,KAAK,IAAI;AAAA,UAC5B,MAAM,KAAK;AAAA,UACX,QAAQ,EAAE,QAAQ,YAAY,IAAI,KAAK,OAAO,MAAM,KAAK,KAAK,EAAA;AAAA,QAAE;AAE9E,YAAI,KAAK,YAAY;AAEjB,iBAAO,UAAU,KAAK,SAAS,OAAO,KAAK,aAAa,KAAK;AAAA,QACjE;AACA,YAAI,WAAW,UAAU,KAAK,SAAS,QAAQ;AAC3C,iBAAO,OAAO;AAAA,QAClB;AACA,aAAK,SAAS,gBAAgB,KAAK,MAAM,QAAQ,QAAQ,KAAK,MAAM,EAAE;AAAA,MAC1E;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,eAA6B;AACjC,QAAI,KAAK,iBAAiB,eAAe;AACrC,YAAM,QAAQ,CAAC,SAA0B,KAAK,KAAK,WAAW,IAAI,MAAM;AACxE,WAAK,eAAe;AAAA,QAChB,KAAK;AAAA,QACL;AAAA,QACA,EAAE,MAAM,iBAAiB,MAAM,OAAO,KAAK,GAAG,OAAO,OAAO,MAAM,MAAM,UAAU,KAAA;AAAA,QAClF,KAAK;AAAA,MAAA,EACP;AAAA,IACN;AACA,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,WAAW,MAAwF;AACvG,UAAM,SAAS,YAAY,KAAK,QAAQ,KAAK,QAAQ,IAAI;AACzD,WAAO,KAAK,OACN,EAAE,MAAM,IAAI,OAAO,QAAQ,WAAW,QAAQ,UAAU,KAAA,IACxD,EAAE,MAAM,IAAI,OAAO,QAAQ,UAAU,KAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaQ,KAAK,KAAc,SAAkB,SAAiB,MAAc,SAAS,OAAsB;AACvG,QAAI;AACJ,QAAI;AACA,YAAM,SAAS,KAAK,KAAK,OAAO;AAChC,UAAI,OAAO,SAAS,QAAQ;AACxB,aAAK,OAAO;AAAA,UACR;AAAA,UACA;AAAA,UACA,GAAG,OAAO,YAAY,MAAM,GAAG,CAAC,0CAA0C,OAAO,OAAO,EAAE,CAAC;AAAA,UAC3F,EAAE,MAAM,QAAA;AAAA,QAAQ;AAAA,MAExB,WAAW,OAAO,SAAS,eAAe,QAAQ;AAE9C,aAAK,OAAO;AAAA,UACR;AAAA,UACA;AAAA,UACA,GAAG,OAAO,iBAAiB,OAAO,OAAO,EAAE,CAAC;AAAA,UAC5C,EAAE,MAAM,QAAA;AAAA,UACR,GAAG,cAAc;AAAA,QAAA;AAAA,MAEzB,WAAW,OAAO,SAAS,aAAa;AACpC,aAAK,SAAS;AACd,aAAK,OAAO;AAAA,UACR;AAAA,UACA;AAAA,UACA,GAAG,OAAO,YAAY,OAAO,OAAO,EAAE,CAAC;AAAA,UACvC,EAAE,MAAM,QAAA;AAAA,QAAQ;AAAA,MAExB;AACA,WAAK,KAAK,QAAQ,QAAQ,SAAS,OAAO,KAAK,KAAK,QAAQ,MAAM,OAAO,EAAE;AAAA,IAC/E,SAAS,KAAK;AACV,WAAK,OAAO,YAAY,KAAK,EAAE,MAAM,SAAS;AAC9C,aAAO;AAAA,IACX;AACA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAmB;AACvB,QAAI,EAAE,KAAK,cAAc,sBAAsB;AAC3C,WAAK,aAAa;AAClB,qBAAe,KAAK,QAAQ,MAAM;AAAA,IACtC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,YAAY,QAAiC,OAA4B,MAAc,MAAoB;AAC/G,eAAW,OAAO,OAAO,KAAK,MAAM,GAAG;AACnC,UAAI,CAAC,MAAM,IAAI,GAAG,GAAG;AACjB,aAAK,OAAO;AAAA,UACR;AAAA,UACA;AAAA,UACA,OAAO,IAAI,SAAS,GAAG;AAAA,UACvB,EAAE,MAAM,SAAS,IAAA;AAAA,UACjB,GAAG,oBAAoB,IAAI,IAAI,IAAI,GAAG;AAAA,QAAA;AAAA,MAE9C;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,SAAS,MAAkB;AAC/B,SAAK,WAAA;AACL,UAAM,EAAE,QAAQ,KAAA,IAAS;AACzB,UAAM,EAAE,OAAO,KAAA,IAAS;AACxB,QAAI,CAAC,SAAS,KAAK,GAAG;AAClB,aAAO,MAAM,eAAe,uBAAuB,sBAAsB,MAAM,KAAK,CAAC,mBAAmB;AAAA,QACpG;AAAA,QACA,SAAS;AAAA,MAAA,CACZ;AACD,aAAO,OAAO;AACd;AAAA,IACJ;AACA,SAAK,YAAY,OAAO,WAAW,QAAQ,IAAI;AAC/C,QAAI,MAAM,OAAO,UAAa,MAAM,OAAO,MAAM;AAC7C,aAAO,MAAM,iBAAiB,iBAAiB,oBAAoB,EAAE,MAAM,SAAS,SAAS;AAC7F,aAAO,OAAO;AACd;AAAA,IACJ;AACA,UAAM,UAAU,QAAQ,MAAM,MAAM,EAAE,CAAC;AACvC,UAAM,KAAK,KAAK,KAAK,MAAM,KAAK,KAAK,UAAU,OAAO,GAAG,SAAS,IAAI;AACtE,QAAI,OAAO,MAAM;AACb,aAAO,OAAO;AACd;AAAA,IACJ;AACA,UAAM,QAAQ,SAAS,MAAM,CAAC,IAAI,MAAM,IAAI;AAC5C,QAAI,MAAM,MAAM,UAAa,MAAM,MAAM,QAAQ,UAAU,MAAM;AAC7D,aAAO,MAAM,oBAAoB,gBAAgB,GAAG,OAAO,UAAU,MAAM,MAAM,CAAC,CAAC,mBAAmB;AAAA,QAClG;AAAA,QACA;AAAA,MAAA,CACH;AAAA,IACL;AACA,QAAI,MAAM,KAAK,SAAS,IAAI,EAAE;AAC9B,QAAI,QAAQ,QAAW;AACnB,aAAO;AAAA,QACH;AAAA,QACA;AAAA,QACA,GAAG,OAAO;AAAA,QACV,EAAE,MAAM,QAAA;AAAA,MAAQ;AAAA,IAExB,OAAO;AACH,UAAI,WAAW,KAAK,aAAa,OAAO,SAAS,IAAI;AACrD,UAAI,aAAa,QAAQ,KAAK,SAAS,IAAI,QAAQ,GAAG;AAClD,eAAO;AAAA,UACH;AAAA,UACA;AAAA,UACA,GAAG,OAAO,qBAAqB,MAAM,QAAQ,CAAC;AAAA,UAC9C,EAAE,MAAM,QAAA;AAAA,QAAQ;AAEpB,mBAAW;AAAA,MACf;AACA,UAAI,aAAa,MAAM;AACnB,aAAK,SAAS,IAAI,QAAQ;AAAA,MAC9B;AACA,WAAK,SAAS,YAAY,EAAE;AAC5B,UAAI;AACA,cAAM,KAAK,QAAQ,YAAY,EAAE;AAAA,MACrC,SAAS,KAAK;AACV,eAAO,YAAY,KAAK,EAAE,MAAM,SAAS;AACzC,eAAO,OAAO;AACd;AAAA,MACJ;AACA,WAAK,SAAS,IAAI,IAAI,GAAG;AACzB,WAAK,QAAQ,IAAI,IAAI,YAAY,EAAE;AACnC,aAAO,OAAO;AAAA,IAClB;AACA,SAAK,gBAAgB,OAAO,KAAK,SAAS,IAAI;AAC9C,QAAI,UAAU,MAAM;AAChB,WAAK,gBAAgB,QAAQ,KAAK,OAAO,SAAS,IAAI;AAAA,IAC1D;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,aAAa,OAAuC,SAAiB,MAA6B;AACtG,QAAI,UAAU,QAAQ,CAAC,KAAK,QAAQ,mBAAmB;AACnD,aAAO;AAAA,IACX;AACA,UAAM,QAAQ,KAAK,MAAM,KAAK,OAAO,IAAI,qBAAqB,GAAG,SAAS;AAC1E,UAAM,MAAM,MAAM,qBAAqB,MAAM,UAAU,OAAO,SAAY,MAAM,KAAK;AACrF,QAAI,QAAQ,UAAa,QAAQ,QAAQ,OAAO,QAAQ,UAAU;AAC9D,WAAK,OAAO;AAAA,QACR;AAAA,QACA;AAAA,QACA,GAAG,OAAO,KAAK,qBAAqB,OAAO,MAAM,GAAG,CAAC;AAAA,QACrD,EAAE,MAAM,QAAA;AAAA,MAAQ;AAAA,IAExB;AACA,WAAO,OAAO,QAAQ,WAAW,MAAM;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,SAAS,IAAkB;AAC/B,QAAI,OAAO,OAAO,YAAY,KAAK,WAAW,WAAW;AACrD,WAAK,SAAS;AAAA,IAClB;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,gBAAgB,OAAgC,KAAa,SAAiB,MAAoB;AACtG,UAAM,aAAa,CAAC,QAAwC;AACxD,YAAM,MAAM,MAAM,GAAG;AACrB,UAAI,QAAQ,UAAa,QAAQ,MAAM;AACnC,eAAO;AAAA,MACX;AACA,UAAI,OAAO,QAAQ,UAAU;AACzB,eAAO;AAAA,MACX;AACA,WAAK,OAAO,MAAM,oBAAoB,gBAAgB,GAAG,OAAO,KAAK,GAAG,OAAO,MAAM,GAAG,CAAC,kBAAkB;AAAA,QACvG;AAAA,QACA;AAAA,MAAA,CACH;AACD,aAAO;AAAA,IACX;AACA,UAAM,IAAI,WAAW,GAAG;AACxB,UAAM,IAAI,WAAW,GAAG;AACxB,UAAM,IAAI,WAAW,GAAG;AACxB,QAAK,MAAM,UAAW,MAAM,OAAO;AAC/B,WAAK,OAAO;AAAA,QACR;AAAA,QACA,UAAU;AAAA,QACV,GAAG,OAAO,QAAQ,MAAM,OAAO,gBAAgB,aAAa;AAAA,QAC5D,EAAE,MAAM,QAAA;AAAA,QACR,GAAG,UAAU,cAAc;AAAA,MAAA;AAAA,IAEnC;AACA,QAAI,MAAM,QAAQ,MAAM,QAAQ,MAAM,MAAM;AAExC,WAAK,OAAO;AAAA,QACR;AAAA,QACA,UAAU;AAAA,QACV,GAAG,OAAO,2BAA2B,KAAK,QAAQ,WAAW,8BAA8B,gCAAgC;AAAA,QAC3H,EAAE,MAAM,QAAA;AAAA,QACR,GAAG,UAAU,cAAc;AAAA,MAAA;AAAA,IAEnC;AACA,QAAI,MAAM,QAAQ,MAAM,SAAS,CAAC,OAAO,SAAS,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC,IAAI;AAC1E,WAAK,OAAO;AAAA,QACR;AAAA,QACA;AAAA,QACA,GAAG,OAAO,qBAAqB,OAAO,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC;AAAA,QACtD,EAAE,MAAM,QAAA;AAAA,MAAQ;AAAA,IAExB,WAAW,MAAM,QAAQ,MAAM,MAAM;AACjC,WAAK,YAAY,KAAK,GAAG,GAAG,CAAC;AAAA,IACjC;AACA,QAAI,MAAM,QAAQ,KAAK,QAAQ,UAAU;AACrC,UAAI,KAAK,YAAY,eAAe;AAChC,aAAK,UAAU,gBAAgB,KAAK,MAAM,QAAQ,MAAM,UAAU,GAAG,KAAK,MAAM,EAAE;AAAA,MACtF;AACA,WAAK,KAAK,aAAa,KAAK,SAAS,KAAK,CAAC;AAAA,IAC/C;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,YAAY,KAAa,GAAW,GAAW,GAAwB;AAC3E,QAAI,KAAK,mBAAmB,eAAe;AACvC,WAAK,iBAAiB;AAAA,QAClB,KAAK;AAAA,QACL;AAAA,QACA,aAAa,YAAY,KAAK,QAAQ,aAAa,IAAI,CAAC;AAAA,QACxD,KAAK;AAAA,MAAA,EACP;AAAA,IACN;AACA,SAAK,MAAM,CAAC,IAAI;AAChB,SAAK,MAAM,CAAC,IAAI,MAAM,CAAC;AACvB,SAAK,MAAM,CAAC,IAAI,KAAK,QAAQ,cAAc,MAAM,OAAO,IAAI;AAC5D,SAAK,KAAK,aAAa,KAAK,gBAAgB,KAAK,KAAK,KAAK;AAC3D,SAAK,WAAW,IAAI,GAAG;AAAA,EAC3B;AAAA;AAAA,EAGQ,mBAAyB;AAC7B,UAAM,EAAE,oBAAoB,KAAK;AACjC,QAAI,gBAAgB,WAAW,GAAG;AAC9B;AAAA,IACJ;AACA,QAAI,KAAK,WAAW,OAAO,GAAG;AAC1B,WAAK,IAAI,OAAO;AAAA,QACZ;AAAA,QACA,gBAAgB,IAAI,CAAC,MAAM,UAAU,EAAE,KAAK,CAAC;AAAA,MAAA;AAEjD,WAAK,OAAO;AAAA,QACR;AAAA,QACA,UAAU;AAAA,QACV,iCAAiC,gBAAgB,MAAM,WAAW,OAAO,gBAAgB,MAAM,CAAC;AAAA,QAChG,EAAE,SAAS,kBAAA;AAAA,MAAkB;AAEjC;AAAA,IACJ;AAEA,QAAI;AACJ,UAAM,2BAAW,IAAA;AACjB,eAAW,QAAQ,iBAAiB;AAChC,YAAM,QAAQ,KAAK;AACnB,UAAI,CAAC,SAAS,KAAK,KAAK,OAAO,MAAM,MAAM,YAAY,OAAO,MAAM,MAAM,UAAU;AAChF,aAAK,OAAO;AAAA,UACR;AAAA,UACA;AAAA,UACA;AAAA,UACA,EAAE,MAAM,KAAK,MAAM,SAAS,kBAAA;AAAA,QAAkB;AAElD;AAAA,MACJ;AACA,YAAM,MAAM,KAAK,MAAM,KAAK,UAAU,MAAM,IAAI;AAChD,UAAI,QAAQ,QAAW;AACnB,aAAK,OAAO,uBAAuB;AACnC;AAAA,MACJ;AACA,eAAS,MAAM,QAAQ;AACvB,WAAK,MAAM,QAAQ,UAAU,MAAM;AAC/B,aAAK,IAAI,OAAO;AAAA,UACZ;AAAA,UACA,gBAAgB,IAAI,CAAC,MAAM,UAAU,EAAE,KAAK,CAAC;AAAA,QAAA;AAEjD,aAAK,OAAO;AAAA,UACR;AAAA,UACA;AAAA,UACA,wDAAwD,MAAM,IAAI,CAAC;AAAA,UACnE,EAAE,MAAM,KAAK,MAAM,SAAS,kBAAA;AAAA,UAC5B,GAAG,wBAAwB;AAAA,QAAA;AAE/B;AAAA,MACJ;AACA,UAAI,KAAK,IAAI,GAAG,GAAG;AACf,aAAK,OAAO;AAAA,UACR;AAAA,UACA;AAAA,UACA,QAAQ,MAAM,MAAM,IAAI,CAAC;AAAA,UACzB,EAAE,MAAM,KAAK,MAAM,SAAS,kBAAA;AAAA,UAC5B,GAAG,wBAAwB;AAAA,QAAA;AAAA,MAEnC;AACA,WAAK,IAAI,GAAG;AACZ,YAAM,IAAI,OAAO,MAAM,MAAM,WAAW,MAAM,IAAI;AAClD,WAAK,YAAY,KAAK,MAAM,GAAG,MAAM,GAAG,CAAC;AACzC,UAAI,MAAM,QAAQ,KAAK,QAAQ,UAAU;AACrC,YAAI,KAAK,YAAY,eAAe;AAChC,eAAK,UAAU,gBAAgB,KAAK,MAAM,QAAQ,MAAM,UAAU,GAAG,KAAK,MAAM,EAAE;AAAA,QACtF;AACA,aAAK,KAAK,aAAa,KAAK,SAAS,KAAK,CAAC;AAAA,MAC/C;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,MAAM,MAAmC,KAAkC;AAC/E,QAAI;AACA,YAAM,EAAE,GAAA,IAAO,KAAK,GAAG;AACvB,aAAO,KAAK,IAAI,KAAK,QAAQ,QAAQ,SAAS,KAAK,KAAK,QAAQ,MAAM,EAAE,CAAC;AAAA,IAC7E,QAAQ;AACJ,aAAO;AAAA,IACX;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,OAAO,MAAoB;AAC/B,SAAK,SAAS,IAAI,OAAO,KAAK,SAAS,IAAI,IAAI,KAAK,KAAK,CAAC;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYQ,gBACJ,QACA,KACA,OACA,SACA,MACI;AACJ,UAAM,EAAE,WAAW;AACnB,UAAM,QAAQ,KAAK,MAAM,MAAM;AAC/B,eAAW,OAAO,OAAO,KAAK,KAAK,GAAG;AAClC,YAAM,QAAQ,MAAM,GAAG;AACvB,UAAI,QAAQ,IAAI;AACZ,eAAO;AAAA,UACH;AAAA,UACA;AAAA,UACA,GAAG,OAAO;AAAA,UACV,EAAE,MAAM,QAAA;AAAA,QAAQ;AAEpB;AAAA,MACJ;AACA,YAAM,WAAW,MAAM,QAAQ,GAAG;AAClC,YAAM,OAAO,UAAU,KAAK,QAAQ;AACpC,UAAI,WAAW,UAAU,KAAK,QAAQ,qBAAqB,SAAS,uBAAuB;AACvF;AAAA,MACJ;AACA,UAAI,WAAW,UAAU,SAAS,KAAK,QAAQ,YAAY;AACvD;AAAA,MACJ;AACA,UAAI,QAAQ,MAAM;AACd,eAAO;AAAA,UACH;AAAA,UACA,UAAU;AAAA,UACV,GAAG,OAAO;AAAA,UACV,EAAE,MAAM,QAAA;AAAA,UACR,GAAG,UAAU,YAAY,IAAI,MAAM;AAAA,QAAA;AAAA,MAE3C;AACA,UACI,aAAa,QACb,CAAC,SAAS,YACV,SAAS,KAAK,UAAU,QACxB,SAAS,KAAK,UAAU,KAC1B;AACE,YAAI,OAAO,OAAO,SAAS,KAAK,KAAK,GAAG;AACpC,iBAAO;AAAA,YACH;AAAA,YACA;AAAA,YACA,GAAG,OAAO,MAAM,IAAI;AAAA,YACpB,EAAE,MAAM,QAAA;AAAA,UAAQ;AAEpB;AAAA,QACJ;AACA,eAAO;AAAA,UACH;AAAA,UACA,UAAU;AAAA,UACV,GAAG,OAAO,oBAAoB,IAAI,iCAAiC,SAAS,KAAK,KAAK;AAAA,UACtF,EAAE,MAAM,QAAA;AAAA,UACR,GAAG,UAAU,cAAc,IAAI,MAAM,IAAI,IAAI;AAAA,QAAA;AAAA,MAErD;AACA,UAAI,UAAU,QAAQ,UAAU,QAAW;AACvC;AAAA,MACJ;AACA,UAAI,aAAa,MAAM;AACnB;AAAA,MACJ;AACA,YAAM,EAAE,SAAS;AACjB,UAAI,KAAK,YAAY;AACjB,eAAO;AAAA,UACH;AAAA,UACA,UAAU;AAAA,UACV,OAAO,MAAM,eAAe,GAAG;AAAA,UAC/B,EAAE,MAAM,SAAS,IAAA;AAAA,UACjB,GAAG,UAAU,oBAAoB,IAAI,MAAM,IAAI,GAAG;AAAA,QAAA;AAAA,MAE1D;AACA,YAAM,YACF,KAAK,SAAS,OACR,UAAU,OAAO,CAAC,WAAW;AACzB,aAAK,UAAU,MAAM,MAAM;AAAA,MAC/B,CAAC,IACD,aAAa,OAAO,KAAK,MAAM,KAAK,QAAQ,MAAM,CAAC,WAAW;AAC1D,aAAK,UAAU,MAAM,MAAM;AAAA,MAC/B,CAAC;AACX,UAAI,cAAc,KAAK;AACnB,eAAO;AAAA,UACH;AAAA,UACA;AAAA,UACA,GAAG,OAAO,MAAM,IAAI,QAAQ,MAAM,KAAK,CAAC,WAAW,KAAK,MAAM,KAAK,OAAO;AAAA,UAC1E,EAAE,MAAM,QAAA;AAAA,QAAQ;AAEpB;AAAA,MACJ;AACA,UAAI;AACA,YAAI,WAAW,QAAQ;AACnB,eAAK,KAAK,aAAa,KAAK,QAAQ,KAAK,SAAS;AAAA,QACtD,OAAO;AACH,eAAK,KAAK,aAAa,KAAK,QAAQ,KAAK,SAAS;AAAA,QACtD;AAAA,MACJ,SAAS,KAAK;AACV,eAAO,YAAY,KAAK,EAAE,MAAM,SAAS;AAAA,MAC7C;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,UAAU,MAAc,QAAsB;AAClD,SAAK,OAAO;AAAA,MACR;AAAA,MACA;AAAA,MACA,IAAI,IAAI,MAAM,MAAM;AAAA,MACpB,EAAE,SAAS,KAAA;AAAA,MACX,GAAG,cAAc;AAAA,IAAA;AAAA,EAEzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,SAAS,MAAkB;AAC/B,SAAK,WAAA;AACL,UAAM,EAAE,QAAQ,KAAA,IAAS;AACzB,UAAM,EAAE,OAAO,KAAA,IAAS;AACxB,QAAI,CAAC,SAAS,KAAK,GAAG;AAClB,aAAO,MAAM,eAAe,uBAAuB,uBAAuB,MAAM,KAAK,CAAC,mBAAmB;AAAA,QACrG;AAAA,QACA,SAAS;AAAA,MAAA,CACZ;AACD,aAAO,OAAO;AACd;AAAA,IACJ;AACA,SAAK,YAAY,OAAO,WAAW,QAAQ,IAAI;AAC/C,QAAI,MAAM,OAAO,UAAa,MAAM,OAAO,MAAM;AAC7C,aAAO,MAAM,iBAAiB,iBAAiB,qBAAqB,EAAE,MAAM,SAAS,SAAS;AAC9F,aAAO,OAAO;AACd;AAAA,IACJ;AACA,UAAM,UAAU,QAAQ,MAAM,MAAM,EAAE,CAAC;AACvC,eAAW,OAAO,CAAC,KAAK,GAAG,GAAY;AACnC,UAAI,MAAM,GAAG,MAAM,UAAa,MAAM,GAAG,MAAM,MAAM;AACjD,eAAO,MAAM,iBAAiB,uBAAuB,GAAG,OAAO,WAAW,GAAG,IAAI,EAAE,MAAM,QAAA,CAAS;AAClG,eAAO,OAAO;AACd;AAAA,MACJ;AAAA,IACJ;AACA,UAAM,KAAK,KAAK,KAAK,MAAM,KAAK,KAAK,UAAU,OAAO,GAAG,SAAS,MAAM,IAAI;AAC5E,UAAM,IAAI,OAAO,OAAO,OAAO,KAAK,KAAK,MAAM,IAAI,KAAK,UAAU,OAAO,GAAG,SAAS,IAAI;AACzF,UAAM,IAAI,MAAM,OAAO,OAAO,KAAK,KAAK,MAAM,IAAI,KAAK,UAAU,OAAO,GAAG,SAAS,IAAI;AACxF,QAAI,OAAO,QAAQ,MAAM,QAAQ,MAAM,MAAM;AACzC,aAAO,OAAO;AACd;AAAA,IACJ;AACA,QAAI,KAAK,SAAS,IAAI,EAAE,GAAG;AACvB,aAAO;AAAA,QACH;AAAA,QACA;AAAA,QACA,GAAG,OAAO;AAAA,QACV,EAAE,MAAM,QAAA;AAAA,MAAQ;AAEpB,aAAO,OAAO;AACd;AAAA,IACJ;AACA,UAAM,SAAS,KAAK,SAAS,GAAG,SAAS,IAAI;AAC7C,UAAM,SAAS,WAAW,OAAO,OAAO,KAAK,SAAS,GAAG,SAAS,IAAI;AACtE,QAAI,WAAW,QAAQ,WAAW,MAAM;AACpC,aAAO,OAAO;AACd;AAAA,IACJ;AACA,UAAM,QAAQ,SAAS,MAAM,CAAC,IAAI,MAAM,IAAI;AAC5C,QAAI,MAAM,MAAM,UAAa,MAAM,MAAM,QAAQ,UAAU,MAAM;AAC7D,aAAO,MAAM,oBAAoB,gBAAgB,GAAG,OAAO,UAAU,MAAM,MAAM,CAAC,CAAC,mBAAmB;AAAA,QAClG;AAAA,QACA;AAAA,MAAA,CACH;AAAA,IACL;AACA,QAAI;AACJ,UAAM,YAAY,KAAK,UAAU,KAAK;AACtC,QAAI;AACA,eAAS,cAAc,QAAQ,UAAU,OAAO,SAAY,gBAAgB,UAAU,MAAM,SAAS,CAAC,CAAC;AAAA,IAC3G,SAAS,KAAK;AACV,aAAO,YAAY,KAAK,EAAE,MAAM,SAAS;AACzC,aAAO,OAAO;AACd;AAAA,IACJ;AACA,QAAI,WAAW,QAAW;AACtB,WAAK,WAAW;AAAA,IACpB;AACA,UAAM,SAAS,KAAK;AACpB,QAAI;AACJ,QAAI;AACA,aAAO,KAAK,UAAU,QAAQ,QAAQ,QAAQ,YAAY,QAAQ,EAAE,MAAM,QAAA,CAAS;AAAA,IACvF,SAAS,KAAK;AACV,aAAO,YAAY,KAAK,EAAE,MAAM,SAAS;AACzC,aAAO,OAAO;AACd;AAAA,IACJ;AACA,WAAO,OAAO,SAAS,KAAK,YAAY;AACxC,SAAK,SAAS,IAAI,IAAI,IAAI;AAC1B,SAAK,aAAa,KAAK,aAAA,GAAgB,MAAM,OAAO,OAAO,WAAW,KAAK,OAAO,EAAE,CAAC;AACrF,QAAI,UAAU,MAAM;AAChB,WAAK,gBAAgB,QAAQ,MAAM,OAAO,SAAS,IAAI;AAAA,IAC3D;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,UAAU,OAAsD;AACpE,UAAM,EAAE,eAAe,KAAK;AAC5B,QAAI,eAAe,QAAQ,UAAU,MAAM;AACvC,aAAO;AAAA,IACX;AACA,UAAM,QAAQ,KAAK,MAAM,KAAK,OAAO,IAAI,UAAU,GAAG,SAAS;AAC/D,QAAI,UAAU,QAAQ,OAAO,OAAO,KAAK,GAAG;AACxC,aAAO;AAAA,IACX;AACA,WAAO,OAAO,OAAO,UAAU,IAAI,aAAa;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,SAAS,IAAY,SAAiB,MAA6B;AACvE,UAAM,QAAQ,KAAK,QAAQ,IAAI,EAAE;AACjC,QAAI,UAAU,QAAW;AACrB,aAAO;AAAA,IACX;AACA,QAAI,CAAC,KAAK,QAAQ,iBAAiB;AAC/B,WAAK,OAAO;AAAA,QACR;AAAA,QACA,UAAU;AAAA,QACV,GAAG,OAAO,kBAAkB,OAAO,EAAE,CAAC;AAAA,QACtC,EAAE,MAAM,QAAA;AAAA,MAAQ;AAEpB,aAAO;AAAA,IACX;AACA,QAAI;AACA,WAAK,SAAS,IAAI,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;AAAA,IAC/C,SAAS,KAAK;AACV,WAAK,OAAO,YAAY,KAAK,EAAE,MAAM,SAAS;AAC9C,aAAO;AAAA,IACX;AACA,SAAK,QAAQ,IAAI,IAAI,EAAE;AACvB,SAAK,OAAO,OAAO;AACnB,WAAO;AAAA,EACX;AAAA;AAAA;AAAA,EAKQ,wBAA8B;AAClC,UAAM,EAAE,sBAAsB,KAAK;AACnC,QAAI,kBAAkB,WAAW,GAAG;AAChC;AAAA,IACJ;AACA,QAAI,kBAAkB,SAAS,GAAG;AAC9B,WAAK,OAAO;AAAA,QACR;AAAA,QACA,UAAU;AAAA,QACV,2BAA2B,kBAAkB,MAAM;AAAA,QACnD,EAAE,MAAM,kBAAkB,CAAC,EAAE,MAAM,SAAS,oBAAA;AAAA,MAAoB;AAAA,IAExE;AACA,UAAM,EAAE,OAAO,SAAS,kBAAkB,CAAC;AAC3C,QAAI,CAAC,SAAS,KAAK,GAAG;AAClB,WAAK,OAAO,MAAM,eAAe,uBAAuB,kDAAkD;AAAA,QACtG;AAAA,QACA,SAAS;AAAA,MAAA,CACZ;AACD;AAAA,IACJ;AACA,eAAW,CAAC,MAAM,GAAG,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC7C,UAAI,QAAQ,QAAQ,QAAQ,QAAW;AACnC;AAAA,MACJ;AACA,YAAM,OAAO,KAAK,MAAM,QAAQ,OAAO,IAAI,IAAI;AAC/C,YAAM,UAAU,qBAAqB,IAAI;AACzC,UAAI,SAAS,QAAW;AACpB,aAAK,OAAO;AAAA,UACR;AAAA,UACA,UAAU;AAAA,UACV,0BAA0B,IAAI;AAAA,UAC9B,EAAE,MAAM,SAAS,KAAA;AAAA,UACjB,GAAG,UAAU,oBAAoB,YAAY,IAAI;AAAA,QAAA;AAAA,MAEzD;AACA,WACK,SAAS,UAAU,SAAS,kBAC7B,OAAO,QAAQ,YACf,MAAM,MAAM,MAAM,kBACpB;AAEE;AAAA,MACJ;AACA,UAAI;AACA,cAAM,OAAa,EAAE,MAAM,QAAW,MAAM,OAAA;AAC5C,gBAAQ,MAAM,GAAG;AACjB,cAAM,OAAO,MAAM,QAAQ,aAAa,IAAI;AAC5C,YAAI,SAAS,MAAM;AACf,eAAK,KAAK;AAAA,YACN;AAAA,YACA,UAAU,KAAK,CAAC,WAAW;AACvB,mBAAK,UAAU,MAAM,MAAM;AAAA,YAC/B,CAAC;AAAA,YACD;AAAA,cACI,OAAO;AAAA,cACP,QAAQ,EAAE,QAAQ,YAAY,IAAI,KAAA;AAAA,YAAK;AAAA,UAC3C;AAEJ;AAAA,QACJ;AACA,cAAM,YAAY,aAAa,KAAK,MAAM,KAAK,QAAQ,MAAM,CAAC,WAAW;AACrE,eAAK,UAAU,MAAM,MAAM;AAAA,QAC/B,CAAC;AACD,YAAI,cAAc,KAAK;AACnB,eAAK,OAAO;AAAA,YACR;AAAA,YACA;AAAA,YACA,GAAG,OAAO,OAAO,MAAM,GAAG,CAAC,WAAW,KAAK,CAAC;AAAA,YAC5C,EAAE,MAAM,QAAA;AAAA,UAAQ;AAEpB;AAAA,QACJ;AACA,cAAM,SAAS,YAAY,KAAK,QAAQ,KAAK,QAAQ,IAAI;AACzD,aAAK,KAAK,cAAc,MAAM,WAAW;AAAA,UACrC,OAAO,KAAK,OAAO,SAAS;AAAA,UAC5B,GAAI,KAAK,OAAO,EAAE,WAAW,OAAA,IAAW,CAAA;AAAA,UACxC,QAAQ,EAAE,QAAQ,YAAY,IAAI,MAAM,MAAM,KAAK,EAAA;AAAA,QAAE,CACxD;AAAA,MACL,SAAS,KAAK;AACV,aAAK,OAAO,YAAY,KAAK,EAAE,MAAM,SAAS;AAAA,MAClD;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,aAAa,QAAyB,SAAgC;AAC1E,UAAM,OAAO,WAAW,SAAS,KAAK,WAAW,KAAK;AACtD,UAAM,8BAAc,IAAA;AACpB,eAAW,QAAQ,SAAS;AACxB,WAAK,WAAA;AACL,YAAM,EAAE,OAAO,KAAA,IAAS;AACxB,UAAI,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,MAAM,CAAC,GAAG;AACxC,aAAK,OAAO;AAAA,UACR;AAAA,UACA;AAAA,UACA,KAAK,MAAM;AAAA,UACX,EAAE,MAAM,SAAS,GAAG,MAAM,WAAA;AAAA,QAAW;AAEzC;AAAA,MACJ;AACA,YAAM,MAAM,KAAK,MAAM,MAAM,MAAM,EAAE;AACrC,UAAI,QAAQ,QAAW;AACnB,aAAK,OAAO,GAAG,MAAM,SAAS;AAC9B;AAAA,MACJ;AACA,iBAAW,CAAC,UAAU,GAAG,KAAK,OAAO,QAAQ,MAAM,CAAC,GAAG;AACnD,YAAI,QAAQ,QAAQ,QAAQ,QAAW;AACnC;AAAA,QACJ;AACA,YAAI,aAAa,IAAI;AACjB,eAAK,OAAO;AAAA,YACR;AAAA,YACA;AAAA,YACA,KAAK,MAAM;AAAA,YACX,EAAE,MAAM,SAAS,GAAG,MAAM,WAAA;AAAA,UAAW;AAEzC;AAAA,QACJ;AACA,YAAI,SAAS,QAAQ,IAAI,QAAQ;AACjC,YAAI,WAAW,QAAW;AACtB,mBAAS,EAAE,MAAM,IAAI,QAAQ,CAAA,GAAI,IAAI,oBAAI,MAAI;AAC7C,kBAAQ,IAAI,UAAU,MAAM;AAAA,QAChC;AACA,cAAM,QAAQ,UAAU,GAAG;AAC3B,cAAM,QAAQ,OAAO,GAAG,IAAI,GAAG;AAC/B,YAAI,UAAU,QAAW;AACrB,iBAAO,GAAG,IAAI,KAAK,OAAO,KAAK,MAAM;AACrC,iBAAO,KAAK,KAAK,GAAG;AACpB,iBAAO,OAAO,KAAK,KAAK;AACxB;AAAA,QACJ;AACA,YAAI,KAAK,UAAU,OAAO,OAAO,KAAK,CAAC,MAAM,KAAK,UAAU,KAAK,GAAG;AAChE,eAAK,OAAO;AAAA,YACR;AAAA,YACA;AAAA,YACA,KAAK,MAAM,6BAA6B,QAAQ,YAAY,MAAM;AAAA,YAClE,EAAE,MAAM,SAAS,SAAA;AAAA,YACjB,GAAG,wBAAwB,WAAW,MAAM,IAAI,QAAQ;AAAA,UAAA;AAAA,QAEhE;AACA,eAAO,OAAO,KAAK,IAAI;AAAA,MAC3B;AAAA,IACJ;AACA,eAAW,CAAC,UAAU,EAAE,MAAM,SAAS,OAAA,CAAQ,KAAK,SAAS;AACzD,YAAM,OAAmB;AAAA,QACrB,MAAM;AAAA,QACN,OAAO,YAAY,MAAM;AAAA,QACzB,UAAU;AAAA;AAAA,QAEV,QAAQ,EAAE,QAAQ,YAAY,IAAI,UAAU,WAAW,iBAAA;AAAA,MAAiB;AAE5E,YAAM,SAAS,aAAa,KAAK,MAAM,QAAQ,MAAM,KAAK,MAAM;AAChE,eAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACrC,YAAI,WAAW,QAAQ;AACnB,eAAK,KAAK,aAAa,QAAQ,QAAQ,CAAC,GAAG,OAAO,CAAC,CAAC;AAAA,QACxD,OAAO;AACH,eAAK,KAAK,aAAa,QAAQ,QAAQ,CAAC,GAAG,OAAO,CAAC,CAAC;AAAA,QACxD;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA,EAKQ,eAAqB;AACzB,UAAM,EAAE,KAAK,OAAA,IAAW;AACxB,UAAM,EAAE,cAAc;AACtB,UAAM,SAAmB,CAAA;AACzB,eAAW,UAAU,eAAe;AAChC,YAAM,WAAW,IAAI,OAAO,IAAI,MAAM;AACtC,UAAI,aAAa,QAAW;AACxB,eAAO,KAAK,cAAc,QAAQ,QAAQ,CAAC;AAAA,MAC/C;AAAA,IACJ;AACA,QAAI,OAAO,SAAS,GAAG;AACnB,aAAO;AAAA,QACH;AAAA,QACA;AAAA,QACA,2CAA2C,OAAO,KAAK,IAAI,CAAC;AAAA,QAC5D,EAAE,SAAS,cAAc,OAAO,CAAC,MAAM,IAAI,OAAO,IAAI,CAAC,CAAC,EAAE,KAAK,GAAG,EAAA;AAAA,MAAE;AAAA,IAE5E;AACA,eAAW,UAAU,uBAAuB,MAAM,CAAC,GAAG;AAClD,YAAM,QAAQ,IAAI,OAAO,IAAI,MAAM,GAAG,UAAU;AAChD,UAAI,QAAQ,GAAG;AACX,eAAO;AAAA,UACH;AAAA,UACA,UAAU;AAAA,UACV,GAAG,MAAM,UAAU,KAAK;AAAA,UACxB,EAAE,SAAS,OAAA;AAAA,QAAO;AAAA,MAE1B;AAAA,IACJ;AACA,QAAI,CAAC,IAAI,cAAc;AACnB,iBAAW,CAAC,QAAQ,MAAM,KAAK,UAAU,QAAQ;AAC7C,YAAI,SAAS,KAAK,CAAC,kBAAkB,IAAI,MAAM,GAAG;AAC9C,iBAAO;AAAA,YACH;AAAA,YACA,UAAU;AAAA,YACV,IAAI,MAAM,cAAc,MAAM;AAAA,YAC9B,EAAE,SAAS,OAAA;AAAA,UAAO;AAAA,QAE1B;AAAA,MACJ;AAAA,IACJ;AACA,SAAK,YAAA;AACL,cAAU,YAAA;AAAA,EACd;AAAA;AAAA,EAGQ,cAAoB;AACxB,UAAM,EAAE,WAAW;AACnB,UAAM,EAAE,cAAc,KAAK;AAC3B,QAAI,CAAC,UAAU,WAAW;AACtB,aAAO,MAAM,oBAAoB,UAAU,WAAW,4CAA4C;AAAA,QAC9F,SAAS;AAAA,MAAA,CACZ;AAAA,IACL,WAAW,CAAC,UAAU,iBAAA,KAAsB,UAAU,OAAO,IAAI,QAAQ,MAAM,GAAG;AAE9E,YAAM,QAAQ,UAAU,OAAO,IAAI,QAAQ,KAAK;AAChD,YAAM,QAAQ,UAAU,IAAI,MAAM,UAAU,MAAM,IAAI,GAAG,KAAK;AAC9D,aAAO;AAAA,QACH;AAAA,QACA,UAAU;AAAA,QACV,4BAA4B,KAAK;AAAA,QACjC,EAAE,SAAS,SAAA;AAAA,MAAS;AAAA,IAE5B;AAAA,EACJ;AAAA;AAAA,EAGQ,UAAgB;AACpB,UAAM,EAAE,QAAQ;AAChB,UAAM,QAAQ,IAAI,kBAAkB,CAAC,GAAG;AACxC,UAAM,QAAQ,SAAS,KAAK,IAAI,QAAQ,CAAA;AACxC,UAAM,QAAiC,CAAA;AACvC,QAAI,IAAI,OAAO,OAAO,GAAG;AACrB,YAAM,SAAS,OAAO,YAAY,IAAI,MAAM;AAAA,IAChD;AACA,QAAI,OAAO,KAAK,KAAK,MAAM,KAAK,EAAE,SAAS,GAAG;AAC1C,YAAM,eAAe,KAAK,MAAM;AAAA,IACpC;AACA,UAAM,EAAE,eAAe,KAAK;AAC5B,UAAM,aAAa,eAAe,OAAO,SAAY,KAAK,MAAM,KAAK,OAAO,IAAI,UAAU;AAC1F,UAAM,QAAwB;AAAA,MAC1B,cAAc;AAAA,MACd,eAAe,IAAI;AAAA,MACnB,QAAQ,KAAK;AAAA,MACb,GAAI,OAAO,MAAM,SAAS,WAAW,EAAE,MAAM,MAAM,KAAA,IAAS,CAAA;AAAA,MAC5D,GAAI,OAAO,MAAM,gBAAgB,WAAW,EAAE,aAAa,MAAM,YAAA,IAAgB,CAAA;AAAA,MACjF,GAAI,KAAK,YAAY,eAAe,OAC9B;AAAA,QACI,cAAc;AAAA,UACV,QAAQ;AAAA,UACR,IAAI,YAAY,SAAS;AAAA,UACzB,OAAO;AAAA,UACP,MAAM,YAAY,MAAM,KAAK;AAAA,UAC7B,WAAW;AAAA,QAAA;AAAA,MACf,IAEJ,CAAA;AAAA,MACN,OAAO,EAAE,KAAK,MAAA;AAAA,IAAM;AAExB,SAAK,KAAK,QAAQ,KAAK;AAAA,EAC3B;AACJ;AAQA,SAAS,YAAY,QAAmC;AACpD,MAAI,OAAO,MAAM,CAAC,MAAM,OAAO,MAAM,QAAQ,GAAG;AAC5C,WAAO;AAAA,EACX;AACA,MAAI,OAAO,MAAM,CAAC,MAAM,OAAO,MAAM,SAAS,GAAG;AAC7C,WAAO;AAAA,EACX;AACA,MAAI,OAAO,MAAM,CAAC,MAAM,OAAO,MAAM,QAAQ,GAAG;AAC5C,WAAO;AAAA,EACX;AACA,SAAO;AACX;AAQA,SAAS,cAAc,QAAgB,UAAsC;AACzE,QAAM,QAAQ,SAAS,CAAC;AACxB,MAAI,WAAW,sBAAsB,SAAS,KAAK,GAAG;AAClD,UAAM,QAAQ,CAAC,QAAyB,SAAS,MAAM,GAAG,CAAC,IAAI,OAAO,KAAK,MAAM,GAAG,CAAC,EAAE,SAAS;AAChG,UAAM,WAAW,SAAS,MAAM,OAAO,IACjC,OAAO,OAAO,MAAM,OAAO,EAAE,OAAe,CAAC,GAAG,MAAM,KAAK,SAAS,CAAC,IAAI,OAAO,KAAK,CAAC,EAAE,SAAS,IAAI,CAAC,IACtG;AACN,WAAO,qBAAqB,QAAQ,WAAW,OAAO,QAAQ,CAAC,KAAK,MAAM,aAAa,CAAC,gBAAgB,OAAO,MAAM,aAAa,CAAC,CAAC,KAAK,MAAM,aAAa,CAAC,gBAAgB,OAAO,MAAM,aAAa,CAAC,CAAC;AAAA,EAC7M;AACA,SAAO,GAAG,MAAM,KAAK,SAAS,MAAM,WAAW,OAAO,SAAS,MAAM,CAAC;AAC1E;AAQO,SAAS,UAAU,OAAuC;AAC7D,MAAI,UAAU,QAAW;AACrB,WAAO;AAAA,EACX;AACA,MAAI,UAAU,YAAY,UAAU,YAAY;AAC5C,WAAO;AAAA,EACX;AACA,QAAM,IAAI,iBAAiB,iBAAiB,eAAe,MAAM,KAAK,CAAC,uCAAuC;AAAA,IAC1G,QAAQ;AAAA,IACR,OAAO,OAAO,UAAU,WAAW,QAAQ,OAAO;AAAA,EAAA,CACrD;AACL;AAMO,MAAM,cAA+C,OAAO,OAAO;AAAA,EACtE,QAAQ;AAAA,EACR,SAAS,OAAO,OAAO,CAAC,KAAK,CAAC;AAAA,EAC9B,YAAY,OAAO,OAAO,CAAC,MAAM,CAAC;AAAA,EAClC,WAAW,OAAO,OAAO,CAAC,kBAAkB,CAAC;AAAA,EAC7C,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQR,MAAM,MAA0B;AAC5B,UAAM,OAAO,SAAS,IAAI;AAC1B,WAAO,wFAAwF,KAAK,IAAI,IAClG,OACA;AAAA,EACV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,OACF,OACA,MACA,SACqB;AACrB,UAAM,WAAW,qBAAqB,SAAS,eAAe;AAC9D,UAAM,MAAM,UAAU,SAAS,GAAG;AAClC,UAAM,SAAS,IAAI,oBAAoB,YAAY,SAAS,UAAU;AACtE,sBAAkB,MAAM,SAAS,QAAQ,IAAI;AAC7C,wBAAoB,SAAS,QAAQ,YAAY;AACjD,UAAM,MAAM,MAAM,aAAa,OAAO,QAAQ,QAAQ;AAEtD,UAAM,QAAQ,cAAc,IAAI,OAAO,IAAI,gBAAgB,CAAC;AAC5D,QAAI,OAAO,OAAO,gBAAgB;AAClC,QAAI,UAAU,MAAM,QAAQ,UAAU,KAAK,GAAG,EAAE,MAAA;AAChD,QAAI,UAAU,MAAM;AAChB,WAAK,cAAc,kBAAkB,OAAO,EAAE,OAAO,UAAU,QAAQ,EAAE,QAAQ,YAAY,IAAI,KAAA,GAAQ;AAAA,IAC7G;AACA,UAAM,OAAuB;AAAA,MACzB,kBAAkB,IAAI,OAAO,IAAI,kBAAkB;AAAA,MACnD,wBAAwB,IAAI,OAAO,IAAI,wBAAwB;AAAA,IAAA;AAEnE,WAAO,cAAc,IAAI;AACzB,mBAAe,SAAS,MAAM;AAC9B,WAAO,OAAO,OAAA;AAAA,EAClB;AACJ,CAAC;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"lexicon-u2SI5xcx.js","sources":["../../src/styles/cytoscape/lexicon.ts"],"sourcesContent":["/**\n * Cytoscape desktop's visual lexicon (CX, CX2, sessions, XGMML): which visual properties set each neutral\n * property, and how each value is read. Cytoscape states opacities two ways (`NODE_TRANSPARENCY` 0..255 in the\n * desktop and CX version 1, `NODE_BACKGROUND_OPACITY` 0..1 in CX2); both are read here.\n */\n\nimport { canonColor } from \"../canon/color.js\";\nimport { canonEnum } from \"../canon/enums.js\";\nimport { canonBoolean, canonNumber, canonOpacity, num6 } from \"../canon/number.js\";\nimport { type CanonSite, noteAt, scalarText } from \"../canon/site.js\";\nimport { canonText } from \"../canon/text.js\";\nimport { STYLE_ISSUE } from \"../codes.js\";\nimport type { StyleNotes } from \"../notes.js\";\nimport type { StyleTarget, StyleValue } from \"../types.js\";\nimport { isStyleValue } from \"../vocabulary.js\";\n\n/**\n * Reads one raw Cytoscape value as a neutral property's canonical value, noting a problem at the site.\n * @category Styles\n */\nexport type CytoscapeValueParser = (raw: unknown, site: CanonSite) => StyleValue | null;\n\n// A color; its alpha is dropped (Cytoscape keeps opacity in separate properties).\nconst color: CytoscapeValueParser = (raw, site) => canonColor(raw, \"cytoscape\", site)?.color ?? null;\n\n// Cytoscape desktop's 0..255 transparency.\nconst opacity255: CytoscapeValueParser = (raw, site) => {\n const v = canonNumber(raw, site);\n if (v === null) {\n return null;\n }\n if (v > 255) {\n noteAt(site, STYLE_ISSUE.BAD_VALUE, String(raw));\n return null;\n }\n return num6(Math.round(v) / 255);\n};\n\n// CX2's 0..1 opacity.\nconst opacity01: CytoscapeValueParser = (raw, site) => canonOpacity(raw, \"css\", site);\nconst length: CytoscapeValueParser = (raw, site) => canonNumber(raw, site);\n// Cytoscape desktop holds a font size as a whole number, so every value read for one is drawn rounded.\nconst fontSize: CytoscapeValueParser = (raw, site) => {\n const v = canonNumber(raw, site);\n return v === null ? null : Math.round(v);\n};\nconst text: CytoscapeValueParser = (raw, site) => canonText(raw, site);\nconst bool: CytoscapeValueParser = (raw, site) => canonBoolean(raw, site);\n\n// CX2's `element` / `none`, or a boolean.\nconst visibility: CytoscapeValueParser = (raw, site) => {\n if (typeof raw === \"string\") {\n const t = raw.trim().toLowerCase();\n if (t === \"element\" || t === \"visible\") {\n return true;\n }\n if (t === \"none\" || t === \"hidden\") {\n return false;\n }\n }\n return canonBoolean(raw, site);\n};\n\n/** Cytoscape spellings the common shape table does not hold. */\nconst CY_SHAPES: ReadonlyMap<string, string> = new Map([[\"rounded_rectangle\", \"round-rectangle\"]]);\n\n/**\n * Cytoscape reads its enumeration names whatever their case, so a name it does not know is kept lowercase and\n * hyphenated, the form of the names it knows: `Bogus` and the `BOGUS` a writer spells it as read the same.\n * @param v - a canonical value\n * @returns the value, an `other:` one in that form\n */\nconst caseless = (v: StyleValue | null): StyleValue | null =>\n typeof v === \"string\" && v.startsWith(\"other:\") ? `other:${v.slice(6).toLowerCase().replaceAll(\"_\", \"-\")}` : v;\n\nconst shape: CytoscapeValueParser = (raw, site) => {\n const s = scalarText(raw, site);\n if (s === null) {\n return null;\n }\n return caseless(CY_SHAPES.get(s.trim().toLowerCase()) ?? canonEnum(\"shape\", s, \"cytoscape\", site));\n};\n\n/** Cytoscape's arrow names, desktop (`DELTA`) and CX2 (`triangle`), lowercase. */\nconst CY_ARROWS: ReadonlyMap<string, string> = new Map([\n [\"none\", \"none\"],\n [\"delta\", \"triangle\"],\n [\"arrow\", \"vee\"],\n [\"diamond\", \"diamond\"],\n [\"circle\", \"circle\"],\n [\"t\", \"tee\"],\n [\"half_top\", \"half\"],\n [\"half_bottom\", \"half\"],\n [\"square\", \"square\"],\n [\"delta_short_1\", \"triangle\"],\n [\"delta_short_2\", \"triangle\"],\n [\"arrow_short\", \"vee\"],\n [\"diamond_short_1\", \"diamond\"],\n [\"diamond_short_2\", \"diamond\"],\n [\"open_delta\", \"triangle-open\"],\n [\"open_circle\", \"circle-open\"],\n [\"open_diamond\", \"diamond-open\"],\n [\"open_square\", \"other:open-square\"],\n [\"cross_delta\", \"vee\"],\n [\"cross_open_delta\", \"triangle-open\"],\n [\"open_half_circle\", \"other:open-half-circle\"],\n [\"half_circle\", \"other:half-circle\"],\n [\"triangle\", \"triangle\"],\n [\"triangle-tee\", \"tee\"],\n [\"triangle-cross\", \"vee\"],\n [\"triangle-backcurve\", \"triangle\"],\n [\"tee\", \"tee\"],\n [\"vee\", \"vee\"],\n [\"open-circle\", \"circle-open\"],\n [\"open-triangle\", \"triangle-open\"],\n [\"open-diamond\", \"diamond-open\"],\n [\"open-square\", \"other:open-square\"],\n [\"open-delta\", \"triangle-open\"],\n [\"half-top\", \"half\"],\n [\"half-bottom\", \"half\"],\n]);\n\n/** Cytoscape 2.x numbered arrow codes. */\nconst LEGACY_ARROW: readonly string[] = [\n \"none\",\n \"delta\",\n \"delta\",\n \"delta\",\n \"arrow\",\n \"arrow\",\n \"arrow\",\n \"diamond\",\n \"diamond\",\n \"diamond\",\n \"circle\",\n \"circle\",\n \"circle\",\n \"t\",\n \"t\",\n \"t\",\n \"half_top\",\n \"half_bottom\",\n];\n\nconst arrow: CytoscapeValueParser = (raw, site) => {\n const s = scalarText(raw, site);\n if (s === null) {\n return null;\n }\n let key = s.trim().toLowerCase();\n if (/^\\d{1,2}$/.test(key)) {\n key = LEGACY_ARROW.at(Number(key)) ?? key;\n }\n return caseless(CY_ARROWS.get(key) ?? canonEnum(\"arrow\", s, \"cytoscape\", site));\n};\n\n/** Cytoscape's line types, lowercase. */\nconst CY_LINES: ReadonlyMap<string, string> = new Map([\n [\"solid\", \"solid\"],\n [\"dot\", \"dotted\"],\n [\"dots\", \"dotted\"],\n [\"equal_dash\", \"dashed\"],\n [\"long_dash\", \"dashed\"],\n [\"dash_dot\", \"dash-dot\"],\n [\"sinewave\", \"sinewave\"],\n [\"zigzag\", \"zigzag\"],\n [\"parallel_lines\", \"double\"],\n [\"marquee_dash\", \"dashed\"],\n [\"marquee_equal\", \"dashed\"],\n [\"marquee_dash_dot\", \"dash-dot\"],\n [\"backward_slash\", \"other:backward-slash\"],\n [\"forward_slash\", \"other:forward-slash\"],\n [\"vertical_slash\", \"other:vertical-slash\"],\n [\"separate_arrow\", \"other:separate-arrow\"],\n [\"contiguous_arrow\", \"other:contiguous-arrow\"],\n [\"double\", \"double\"],\n]);\n\n/**\n * A line type read for an edge line or a node border.\n * @param kind - which enumeration the value belongs to\n * @returns the parser\n */\nfunction lineOf(kind: \"lineStyle\" | \"borderStyle\"): CytoscapeValueParser {\n return (raw, site) => {\n const s = scalarText(raw, site);\n if (s === null) {\n return null;\n }\n const key = s.trim().toLowerCase();\n let v: string | null;\n if (/^line_\\d{1,3}$/.test(key)) {\n v = \"solid\";\n } else if (/^dashed_\\d{1,3}$/.test(key)) {\n v = \"dashed\";\n } else {\n v = CY_LINES.get(key) ?? canonEnum(kind, s, \"cytoscape\", site);\n }\n if (v === null || isStyleValue(\"node\", kind, v) || kind === \"lineStyle\") {\n return v;\n }\n // a line type a border does not have is kept as other:\n return `other:${key}`;\n };\n}\n\n/** The parts of a Cytoscape font face. */\ninterface FontFace {\n readonly family: string;\n readonly weight: \"normal\" | \"bold\";\n readonly italic: boolean;\n}\n\n/**\n * A font face: `SansSerif,plain,12`, `Dialog.bold,bold,12`, the legacy `SansSerif-0-12` (style bits 1 bold,\n * 2 italic) or CX2's `{ FONT_FAMILY, FONT_STYLE, FONT_WEIGHT }`, whose `FONT_NAME` (the font Cytoscape desktop\n * wrote it from, which its own import restores) wins over the CSS family when present.\n * @param raw - the value\n * @param site - where it was read\n * @returns the face, or null\n */\nfunction fontFace(raw: unknown, site: CanonSite): FontFace | null {\n if (raw !== null && typeof raw === \"object\" && !Array.isArray(raw)) {\n return cx2FontFace(raw as Record<string, unknown>, site);\n }\n const s = scalarText(raw, site);\n if (s === null) {\n return null;\n }\n const parts = s.split(\",\");\n if (parts.length >= 2) {\n const st = parts[1].trim().toLowerCase();\n return {\n family: parts[0].trim().replace(/\\.(?:bold|italic|plain|bolditalic)$/i, \"\"),\n weight: st.includes(\"bold\") ? \"bold\" : \"normal\",\n italic: st.includes(\"italic\"),\n };\n }\n return legacyFontFace(s) ?? { family: s.trim(), weight: \"normal\", italic: false };\n}\n\n/**\n * CX2's font face object.\n * @param o - the object\n * @param site - where it was read\n * @returns the face, or null without a family\n */\nfunction cx2FontFace(o: Record<string, unknown>, site: CanonSite): FontFace | null {\n const name = Object.hasOwn(o, \"FONT_NAME\") ? scalarText(o.FONT_NAME, site) : null;\n let family = Object.hasOwn(o, \"FONT_FAMILY\") ? scalarText(o.FONT_FAMILY, site) : null;\n if (name !== null && name.trim() !== \"\") {\n family = name.trim().replace(/\\.(?:bold|italic|plain|bolditalic)$/i, \"\");\n }\n if (family === null) {\n return null;\n }\n const weight = Object.hasOwn(o, \"FONT_WEIGHT\") ? String(o.FONT_WEIGHT) : \"\";\n const style = Object.hasOwn(o, \"FONT_STYLE\") ? String(o.FONT_STYLE) : \"\";\n return {\n family: family.trim(),\n weight: /bold/i.test(weight.slice(0, 32)) ? \"bold\" : \"normal\",\n italic: /italic/i.test(style.slice(0, 32)),\n };\n}\n\n/**\n * The legacy `Family-style-size` face: the last two dash parts are numbers, the style's bits 1 bold and 2 italic.\n * @param s - the value\n * @returns the face, or null when it is not one\n */\nfunction legacyFontFace(s: string): FontFace | null {\n const dash = s.split(\"-\");\n const numeric = (t: string | undefined): boolean => /^\\d+(?:\\.\\d+)?$/.test(t ?? \"\");\n if (dash.length < 3 || !numeric(dash.at(-1)) || !numeric(dash.at(-2))) {\n return null;\n }\n const bits = Math.trunc(Number(dash.at(-2)));\n let family = dash.slice(0, -2).join(\"-\");\n let bold = (bits & 1) !== 0;\n if (/-bold$/i.test(family)) {\n family = family.slice(0, -\"-bold\".length);\n bold = true;\n }\n return { family: family.replace(/\\.bold$/i, \"\"), weight: bold ? \"bold\" : \"normal\", italic: (bits & 2) !== 0 };\n}\n\n/** Java's logical font names, which Cytoscape desktop writes, as the CSS generic families they stand for. */\n/** The family a Java logical font name is read as (`Dialog` is drawn as a sans-serif font). */\nexport const JAVA_FONTS: ReadonlyMap<string, string> = new Map([\n [\"sansserif\", \"sans-serif\"],\n [\"dialog\", \"sans-serif\"],\n [\"default\", \"sans-serif\"],\n [\"dialoginput\", \"monospace\"],\n [\"monospaced\", \"monospace\"],\n [\"serif\", \"serif\"],\n]);\n\nconst fontFamily: CytoscapeValueParser = (raw, site) => {\n const family = fontFace(raw, site)?.family ?? null;\n return family === null ? null : (JAVA_FONTS.get(family.toLowerCase()) ?? family);\n};\nconst fontWeight: CytoscapeValueParser = (raw, site) => fontFace(raw, site)?.weight ?? null;\nconst fontItalic: CytoscapeValueParser = (raw, site) => fontFace(raw, site)?.italic ?? null;\n\n/** The node anchor of a desktop label position `C,C,c,0.00,0.00`. */\nconst ANCHOR: ReadonlyMap<string, string> = new Map([\n [\"C\", \"center\"],\n [\"N\", \"top\"],\n [\"S\", \"bottom\"],\n [\"E\", \"right\"],\n [\"W\", \"left\"],\n [\"NE\", \"top-right\"],\n [\"NW\", \"top-left\"],\n [\"SE\", \"bottom-right\"],\n [\"SW\", \"bottom-left\"],\n [\"NONE\", \"center\"],\n]);\n\n/** CX2's `HORIZONTAL_ANCHOR,VERTICAL_ANCHOR`, lowercase. */\nconst CX2_ANCHOR: ReadonlyMap<string, string> = new Map([\n [\"center,center\", \"center\"],\n [\"center,top\", \"top\"],\n [\"center,bottom\", \"bottom\"],\n [\"right,center\", \"right\"],\n [\"left,center\", \"left\"],\n [\"right,top\", \"top-right\"],\n [\"left,top\", \"top-left\"],\n [\"right,bottom\", \"bottom-right\"],\n [\"left,bottom\", \"bottom-left\"],\n]);\n\nconst labelPosition: CytoscapeValueParser = (raw, site) => {\n let key: string;\n let found: string | undefined;\n if (raw !== null && typeof raw === \"object\" && !Array.isArray(raw)) {\n const o = raw as Record<string, unknown>;\n const h = scalarText(Object.hasOwn(o, \"HORIZONTAL_ANCHOR\") ? o.HORIZONTAL_ANCHOR : \"center\", site);\n const v = scalarText(Object.hasOwn(o, \"VERTICAL_ANCHOR\") ? o.VERTICAL_ANCHOR : \"center\", site);\n if (h === null || v === null) {\n return null;\n }\n key = `${h.trim().toLowerCase()},${v.trim().toLowerCase()}`;\n found = CX2_ANCHOR.get(key);\n } else {\n const s = scalarText(raw, site);\n if (s === null) {\n return null;\n }\n key = s;\n found = ANCHOR.get(s.split(\",\")[0].trim().toUpperCase());\n }\n if (found === undefined) {\n noteAt(site, STYLE_ISSUE.UNKNOWN_VALUE, key);\n return null;\n }\n return found;\n};\n\n/**\n * The visual properties that set each neutral property, in the order Cytoscape prefers them: the first one a style\n * or any bypass mentions is the one read. Cytoscape draws a node's fill from `NODE_FILL_COLOR`; `NODE_PAINT` is its\n * parent and only counts when the child is absent everywhere.\n * @category Styles\n */\nexport const CYTOSCAPE_LEXICON: Readonly<\n Record<StyleTarget, ReadonlyMap<string, readonly (readonly [vp: string, parse: CytoscapeValueParser])[]>>\n> = Object.freeze({\n node: new Map<string, readonly (readonly [string, CytoscapeValueParser])[]>([\n [\n \"fill\",\n [\n [\"NODE_FILL_COLOR\", color],\n [\"NODE_BACKGROUND_COLOR\", color],\n [\"NODE_PAINT\", color],\n ],\n ],\n [\n \"fillOpacity\",\n [\n [\"NODE_TRANSPARENCY\", opacity255],\n [\"NODE_BACKGROUND_OPACITY\", opacity01],\n ],\n ],\n [\n \"borderColor\",\n [\n [\"NODE_BORDER_PAINT\", color],\n [\"NODE_BORDER_COLOR\", color],\n ],\n ],\n [\"borderWidth\", [[\"NODE_BORDER_WIDTH\", length]]],\n [\n \"borderStyle\",\n [\n [\"NODE_BORDER_STROKE\", lineOf(\"borderStyle\")],\n [\"NODE_BORDER_LINE_TYPE\", lineOf(\"borderStyle\")],\n [\"NODE_BORDER_STYLE\", lineOf(\"borderStyle\")],\n ],\n ],\n [\"shape\", [[\"NODE_SHAPE\", shape]]],\n [\"width\", [[\"NODE_WIDTH\", length]]],\n [\"height\", [[\"NODE_HEIGHT\", length]]],\n [\"label\", [[\"NODE_LABEL\", text]]],\n [\"labelColor\", [[\"NODE_LABEL_COLOR\", color]]],\n [\"labelSize\", [[\"NODE_LABEL_FONT_SIZE\", fontSize]]],\n [\"labelFont\", [[\"NODE_LABEL_FONT_FACE\", fontFamily]]],\n [\"labelWeight\", [[\"NODE_LABEL_FONT_FACE\", fontWeight]]],\n [\"labelItalic\", [[\"NODE_LABEL_FONT_FACE\", fontItalic]]],\n [\"labelPosition\", [[\"NODE_LABEL_POSITION\", labelPosition]]],\n [\"tooltip\", [[\"NODE_TOOLTIP\", text]]],\n [\n \"visible\",\n [\n [\"NODE_VISIBLE\", bool],\n [\"NODE_VISIBILITY\", visibility],\n ],\n ],\n ]),\n edge: new Map<string, readonly (readonly [string, CytoscapeValueParser])[]>([\n [\n \"color\",\n [\n [\"EDGE_STROKE_UNSELECTED_PAINT\", color],\n [\"EDGE_LINE_COLOR\", color],\n [\"EDGE_UNSELECTED_PAINT\", color],\n [\"EDGE_PAINT\", color],\n ],\n ],\n [\n \"opacity\",\n [\n [\"EDGE_TRANSPARENCY\", opacity255],\n [\"EDGE_OPACITY\", opacity01],\n ],\n ],\n [\"width\", [[\"EDGE_WIDTH\", length]]],\n [\n \"lineStyle\",\n [\n [\"EDGE_LINE_TYPE\", lineOf(\"lineStyle\")],\n [\"EDGE_LINE_STYLE\", lineOf(\"lineStyle\")],\n ],\n ],\n [\"sourceArrow\", [[\"EDGE_SOURCE_ARROW_SHAPE\", arrow]]],\n [\"targetArrow\", [[\"EDGE_TARGET_ARROW_SHAPE\", arrow]]],\n [\n \"sourceArrowColor\",\n [\n [\"EDGE_SOURCE_ARROW_UNSELECTED_PAINT\", color],\n [\"EDGE_SOURCE_ARROW_COLOR\", color],\n ],\n ],\n [\n \"targetArrowColor\",\n [\n [\"EDGE_TARGET_ARROW_UNSELECTED_PAINT\", color],\n [\"EDGE_TARGET_ARROW_COLOR\", color],\n ],\n ],\n [\"curved\", [[\"EDGE_CURVED\", bool]]],\n [\"label\", [[\"EDGE_LABEL\", text]]],\n [\"labelColor\", [[\"EDGE_LABEL_COLOR\", color]]],\n [\"labelSize\", [[\"EDGE_LABEL_FONT_SIZE\", fontSize]]],\n [\"labelFont\", [[\"EDGE_LABEL_FONT_FACE\", fontFamily]]],\n [\"labelWeight\", [[\"EDGE_LABEL_FONT_FACE\", fontWeight]]],\n [\"labelItalic\", [[\"EDGE_LABEL_FONT_FACE\", fontItalic]]],\n [\"tooltip\", [[\"EDGE_TOOLTIP\", text]]],\n [\n \"visible\",\n [\n [\"EDGE_VISIBLE\", bool],\n [\"EDGE_VISIBILITY\", visibility],\n ],\n ],\n ]),\n});\n\n/** A node's size when `nodeSizeLocked` makes `NODE_SIZE` drive width and height. */\nexport const NODE_SIZE_VP = \"NODE_SIZE\";\n\n/** The parser of node sizes, for `NODE_SIZE`. */\nexport const sizeParser: CytoscapeValueParser = length;\n\n/** The parser of colors, for the network background and `arrowColorMatchesEdge`. */\nexport const colorParser: CytoscapeValueParser = color;\n\n/** Every visual property the lexicon reads. */\nconst KNOWN_VPS: ReadonlySet<string> = new Set([\n NODE_SIZE_VP,\n ...Object.values(CYTOSCAPE_LEXICON).flatMap((byProp) =>\n Array.from(byProp.values()).flatMap((list) => list.map(([vp]) => vp)),\n ),\n]);\n\n/** Geometry, selection state and paint that is not a style: dropped without a note. */\nconst IGNORED_VP =\n /^(?:NODE|EDGE|NETWORK)_[XYZ]_LOCATION$|_SELECTED|SELECTION|^NETWORK_(?!BACKGROUND)|_DEPTH$|^COMPOUND_|EDGE_BEND|EDGE_CONTROL_POINTS|NODE_NESTED_NETWORK|_Z_ORDER$|EDGE_STACKING|_LABEL_WIDTH$|_HEIGHT$|_WIDTH$/;\n\n/**\n * Whether a visual property is one no neutral property carries and that is worth a note.\n * @param vp - the visual property\n * @returns true when it is neither read nor ignored\n */\nexport function isUncarriedVp(vp: string): boolean {\n return !KNOWN_VPS.has(vp) && !IGNORED_VP.test(vp);\n}\n\n/** Cytoscape's old identifiers (2.x XGMML graphics attributes and session properties), lowercase. */\nconst IDENTIFIERS: Readonly<Record<StyleTarget, ReadonlyMap<string, string>>> = {\n node: new Map([\n [\"fill\", \"NODE_FILL_COLOR\"],\n [\"w\", \"NODE_WIDTH\"],\n [\"h\", \"NODE_HEIGHT\"],\n [\"size\", \"NODE_SIZE\"],\n [\"type\", \"NODE_SHAPE\"],\n [\"outline\", \"NODE_BORDER_PAINT\"],\n [\"width\", \"NODE_BORDER_WIDTH\"],\n [\"borderlinetype\", \"NODE_BORDER_LINE_TYPE\"],\n [\"nodelabelfont\", \"NODE_LABEL_FONT_FACE\"],\n [\"nodetransparency\", \"NODE_TRANSPARENCY_01\"],\n [\"nodelabelposition\", \"NODE_LABEL_POSITION\"],\n [\"nodefillcolor\", \"NODE_FILL_COLOR\"],\n [\"nodesize\", \"NODE_SIZE\"],\n [\"nodewidth\", \"NODE_WIDTH\"],\n [\"nodehight\", \"NODE_HEIGHT\"],\n [\"nodeheight\", \"NODE_HEIGHT\"],\n [\"nodeopacity\", \"NODE_TRANSPARENCY\"],\n [\"nodebordercolor\", \"NODE_BORDER_PAINT\"],\n [\"nodelinewidth\", \"NODE_BORDER_WIDTH\"],\n [\"nodelinestyle\", \"NODE_BORDER_LINE_TYPE\"],\n [\"nodeshape\", \"NODE_SHAPE\"],\n [\"nodefont\", \"NODE_LABEL_FONT_FACE\"],\n [\"nodefontsize\", \"NODE_LABEL_FONT_SIZE\"],\n [\"nodelabel\", \"NODE_LABEL\"],\n [\"nodelabelcolor\", \"NODE_LABEL_COLOR\"],\n [\"nodetooltip\", \"NODE_TOOLTIP\"],\n ]),\n edge: new Map([\n [\"width\", \"EDGE_WIDTH\"],\n [\"fill\", \"EDGE_STROKE_UNSELECTED_PAINT\"],\n [\"edgelinetype\", \"EDGE_LINE_TYPE\"],\n [\"edgelabelfont\", \"EDGE_LABEL_FONT_FACE\"],\n [\"sourcearrowcolor\", \"EDGE_SOURCE_ARROW_UNSELECTED_PAINT\"],\n [\"targetarrowcolor\", \"EDGE_TARGET_ARROW_UNSELECTED_PAINT\"],\n [\"edgesourcearrowcolor\", \"EDGE_SOURCE_ARROW_UNSELECTED_PAINT\"],\n [\"edgetargetarrowcolor\", \"EDGE_TARGET_ARROW_UNSELECTED_PAINT\"],\n [\"edgelinewidth\", \"EDGE_WIDTH\"],\n [\"edgecolor\", \"EDGE_STROKE_UNSELECTED_PAINT\"],\n [\"edgelinestyle\", \"EDGE_LINE_TYPE\"],\n [\"edgeopacity\", \"EDGE_TRANSPARENCY\"],\n [\"sourcearrow\", \"EDGE_SOURCE_ARROW_SHAPE\"],\n [\"targetarrow\", \"EDGE_TARGET_ARROW_SHAPE\"],\n [\"edgesourcearrowshape\", \"EDGE_SOURCE_ARROW_SHAPE\"],\n [\"edgetargetarrowshape\", \"EDGE_TARGET_ARROW_SHAPE\"],\n [\"edgelabel\", \"EDGE_LABEL\"],\n [\"edgefont\", \"EDGE_LABEL_FONT_FACE\"],\n [\"edgelabelcolor\", \"EDGE_LABEL_COLOR\"],\n [\"edgefontsize\", \"EDGE_LABEL_FONT_SIZE\"],\n [\"edgetooltip\", \"EDGE_TOOLTIP\"],\n [\"curved\", \"EDGE_CURVED_LEGACY\"],\n [\"edgecurved\", \"EDGE_CURVED\"],\n [\"edgebend\", \"EDGE_BEND\"],\n ]),\n};\n\n/** Objects nested deeper than this inside one element's graphics are not read. */\nconst MAX_VP_DEPTH = 8;\nconst VP_NAME = /^[A-Z][A-Z_0-9]+$/;\n\n/**\n * One graphics key as a visual property: its name (`?<key>` for one with none) and its value, a legacy encoding\n * converted.\n * @param target - nodes or edges\n * @param k - the key\n * @param v - its value\n * @returns the name and the value\n */\nfunction visualProperty(target: StyleTarget, k: string, v: unknown): [string, unknown] {\n const name = VP_NAME.test(k) ? k : IDENTIFIERS[target].get(k.toLowerCase().replace(/^cy:/, \"\"));\n if (name === undefined) {\n return [`?${k}`, v];\n }\n if (name === \"NODE_TRANSPARENCY_01\") {\n let f = Number.NaN;\n if (typeof v === \"number\") {\n f = v;\n } else if (typeof v === \"string\") {\n f = Number(v.trim());\n }\n return [\"NODE_TRANSPARENCY\", Number.isFinite(f) ? Math.round(f * 255) : null];\n }\n if (name === \"EDGE_CURVED_LEGACY\") {\n return [\"EDGE_CURVED\", typeof v === \"string\" && v.toUpperCase() === \"CURVED_LINES\"];\n }\n return [name, v];\n}\n\n/**\n * Normalizes the keys of one object of an element's graphics; a nested object is pushed onto the stack.\n * @param target - nodes or edges\n * @param top - the object and its depth\n * @param stack - the objects still to walk\n * @param out - visual property name to raw value, added to\n * @returns how many nested objects were too deep to walk\n */\nfunction normalizeObject(\n target: StyleTarget,\n top: [Record<string, unknown>, number],\n stack: [Record<string, unknown>, number][],\n out: Map<string, unknown>,\n): number {\n const [obj, depth] = top;\n let deep = 0;\n for (const k of Object.keys(obj)) {\n const v = obj[k];\n if (k === \"lockedVisualProperties\" || v === null || v === undefined) {\n continue;\n }\n // a 2.x edgeBend of one handle is a record: kept whole, as its handles\n if (typeof v === \"object\" && !Array.isArray(v) && !/^[A-Z_0-9]+$/.test(k) && k.toLowerCase() !== \"edgebend\") {\n if (depth + 1 > MAX_VP_DEPTH) {\n deep++;\n } else {\n stack.push([v as Record<string, unknown>, depth + 1]);\n }\n continue;\n }\n const [name, value] = visualProperty(target, k, v);\n // visual-property-named keys come first in 3.x graphics and win\n if (!out.has(name)) {\n out.set(name, value);\n }\n }\n return deep;\n}\n\n/**\n * One element's raw visual properties, normalized: Cytoscape's old identifiers renamed to visual property names and\n * the legacy encodings converted (`nodeTransparency` 0..1 to `NODE_TRANSPARENCY` 0..255, `curved` to\n * `EDGE_CURVED`). Nested objects (`cytoscapeNodeGraphicsAttributes` and the like) are walked with an explicit stack\n * and a depth limit, never by recursion on the file's nesting. A key with no visual property name is kept as\n * `?<key>`, so a caller can note it.\n * @param target - nodes or edges\n * @param raw - the element's graphics object\n * @param notes - where a too-deep nesting is noted\n * @returns visual property name to raw value\n * @category Styles\n */\nexport function normalizeVisualProperties(target: StyleTarget, raw: unknown, notes?: StyleNotes): Map<string, unknown> {\n if (raw === null || typeof raw !== \"object\") {\n return new Map();\n }\n const out = new Map<string, unknown>();\n const stack: [Record<string, unknown>, number][] = [[raw as Record<string, unknown>, 0]];\n let deep = 0;\n for (let top = stack.pop(); top !== undefined; top = stack.pop()) {\n deep += normalizeObject(target, top, stack, out);\n }\n if (deep > 0) {\n notes?.add(STYLE_ISSUE.NESTING, target, \"graphics\", { sample: `deeper than ${MAX_VP_DEPTH}`, count: deep });\n }\n return out;\n}\n\n/**\n * The step a continuous mapping's value is rounded to for the integer visual properties Cytoscape desktop rounds an\n * interpolated value of (cytoscape-api BasicVisualLexicon: the font sizes and the 0..255 transparencies; the latter\n * read as opacities, so 1/255).\n */\nconst INTEGER_VP_STEPS: ReadonlyMap<string, number> = new Map([\n [\"NODE_LABEL_FONT_SIZE\", 1],\n [\"EDGE_LABEL_FONT_SIZE\", 1],\n [\"NODE_TRANSPARENCY\", 1 / 255],\n [\"EDGE_TRANSPARENCY\", 1 / 255],\n]);\n\n/**\n * The step Cytoscape rounds an interpolated value of a visual property to.\n * @param vp - the visual property\n * @returns the step, or undefined for a property that holds fractions\n */\nexport function vpStep(vp: string): number | undefined {\n return INTEGER_VP_STEPS.get(vp);\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sigv4-LkAzsLAu.js","sources":["../../src/sources/sha256.ts","../../src/sources/sigv4.ts"],"sourcesContent":["/**\n * SHA-256 in plain JavaScript (FIPS 180-4), for the one place Web Crypto is missing: a browser page\n * that is not a secure context (plain http on a host other than localhost) has no\n * `crypto.subtle`. Only the content hash uses it; signing still needs Web Crypto.\n */\n\nconst K = new Uint32Array([\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98,\n 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786,\n 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8,\n 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,\n 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819,\n 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a,\n 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7,\n 0xc67178f2,\n]);\n\n/**\n * Rotate a 32-bit word right.\n * @param x - the word\n * @param n - the bits\n * @returns the rotated word\n */\nfunction rotr(x: number, n: number): number {\n return (x >>> n) | (x << (32 - n));\n}\n\n/**\n * Pad a message to whole 64-byte blocks, with its bit length at the end.\n * @param data - the message\n * @returns the padded message\n */\nfunction pad(data: Uint8Array): Uint8Array {\n const blocks = Math.ceil((data.length + 9) / 64);\n const out = new Uint8Array(blocks * 64);\n out.set(data);\n out[data.length] = 0x80;\n const view = new DataView(out.buffer);\n view.setUint32(out.length - 8, Math.floor(data.length / 0x20000000));\n view.setUint32(out.length - 4, (data.length * 8) >>> 0);\n return out;\n}\n\n/**\n * Run one 64-byte block through the compression function.\n * @param h - the running hash, updated in place\n * @param w - the 64-word schedule, scratch\n * @param view - the padded message\n * @param offset - where the block starts\n */\nfunction compress(h: Uint32Array, w: Uint32Array, view: DataView, offset: number): void {\n for (let i = 0; i < 16; i++) {\n w[i] = view.getUint32(offset + i * 4);\n }\n for (let i = 16; i < 64; i++) {\n const s0 = rotr(w[i - 15], 7) ^ rotr(w[i - 15], 18) ^ (w[i - 15] >>> 3);\n const s1 = rotr(w[i - 2], 17) ^ rotr(w[i - 2], 19) ^ (w[i - 2] >>> 10);\n w[i] = (w[i - 16] + s0 + w[i - 7] + s1) >>> 0;\n }\n let [a, b, c, d, e, f, g, hh] = h;\n for (let i = 0; i < 64; i++) {\n const t1 = (hh + (rotr(e, 6) ^ rotr(e, 11) ^ rotr(e, 25)) + ((e & f) ^ (~e & g)) + K[i] + w[i]) >>> 0;\n const t2 = ((rotr(a, 2) ^ rotr(a, 13) ^ rotr(a, 22)) + ((a & b) ^ (a & c) ^ (b & c))) >>> 0;\n hh = g;\n g = f;\n f = e;\n e = (d + t1) >>> 0;\n d = c;\n c = b;\n b = a;\n a = (t1 + t2) >>> 0;\n }\n const next = [a, b, c, d, e, f, g, hh];\n for (let i = 0; i < 8; i++) {\n h[i] = (h[i] + next[i]) >>> 0;\n }\n}\n\n/**\n * SHA-256 of bytes.\n * @param data - the bytes\n * @returns the 32-byte digest\n */\nexport function sha256Bytes(data: Uint8Array): ArrayBuffer {\n const h = new Uint32Array([\n 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,\n ]);\n const padded = pad(data);\n const view = new DataView(padded.buffer);\n const w = new Uint32Array(64);\n for (let offset = 0; offset < padded.length; offset += 64) {\n compress(h, w, view, offset);\n }\n const out = new DataView(new ArrayBuffer(32));\n h.forEach((word, i) => {\n out.setUint32(i * 4, word);\n });\n return out.buffer;\n}\n","/**\n * AWS Signature Version 4 over Web Crypto (design sections 6.3 and 12.4), loaded by\n * `credentials.awsSigV4` on first use. No AWS SDK: it signs the request `ctx.fetch` is about to\n * send, every header that request carries plus `host`, and is checked against AWS's published\n * signature test suite. graph-io never reads `~/.aws` or the environment.\n */\n\nimport { detectRuntime } from \"./context.js\";\nimport { type AwsSigV4Options } from \"./credentials.js\";\nimport { failAlone } from \"./fail.js\";\nimport { sha256Bytes } from \"./sha256.js\";\n\n/** Headers never signed: proxies and clients may change them in flight. */\nconst UNSIGNED = new Set([\"user-agent\", \"expect\", \"x-amzn-trace-id\", \"authorization\", \"content-length\"]);\n\n/**\n * The UTF-8 bytes of a string.\n * @param text - the text\n * @returns the bytes\n */\nfunction utf8(text: string): Uint8Array {\n return new TextEncoder().encode(text);\n}\n\n/**\n * Code-unit order of two strings.\n * @param a - one string\n * @param b - another\n * @returns negative, zero or positive\n */\nfunction compareText(a: string, b: string): number {\n if (a === b) {\n return 0;\n }\n return a < b ? -1 : 1;\n}\n\n/**\n * Web Crypto: the global one, or Node 18's, which is not global without a flag. A browser page that\n * is not a secure context (plain http on a host other than localhost) has none.\n * @returns the subtle crypto, or null where there is none\n */\nasync function subtle(): Promise<SubtleCrypto | null> {\n const global = (globalThis as { crypto?: Crypto }).crypto;\n if (global?.subtle !== undefined) {\n return global.subtle;\n }\n if (detectRuntime() !== \"node\") {\n return null;\n }\n const name = \"node:crypto\";\n return ((await import(/* @vite-ignore */ name)) as { webcrypto: Crypto }).webcrypto.subtle;\n}\n\n/**\n * Lowercase hex of bytes.\n * @param bytes - the bytes\n * @returns hex\n */\nfunction hex(bytes: ArrayBuffer): string {\n return Array.from(new Uint8Array(bytes), (b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\n/**\n * SHA-256 of bytes, as hex.\n * @param data - the bytes\n * @returns the digest\n */\nasync function sha256(data: Uint8Array | ArrayBuffer): Promise<string> {\n const s = await subtle();\n if (s === null) {\n return hex(sha256Bytes(data instanceof Uint8Array ? data : new Uint8Array(data)));\n }\n return hex(await s.digest(\"SHA-256\", data as BufferSource));\n}\n\n/**\n * SHA-256 of a text's UTF-8 bytes, as lowercase hex (the Cypher source's content hash).\n * @param text - the text\n * @returns the digest\n */\nexport function sha256Hex(text: string): Promise<string> {\n return sha256(utf8(text));\n}\n\n/**\n * HMAC-SHA-256.\n * @param key - the key\n * @param data - the message\n * @returns the MAC\n */\nasync function hmac(key: Uint8Array | ArrayBuffer, data: string): Promise<ArrayBuffer> {\n const s = await subtle();\n if (s === null) {\n failAlone(\"E_SOURCE_RUNTIME\", \"AWS signing needs Web Crypto, which a browser has only on a secure page\", {\n runtime: detectRuntime(),\n reason: \"needs-secure-context\",\n });\n }\n const k = await s.importKey(\"raw\", key as BufferSource, { name: \"HMAC\", hash: \"SHA-256\" }, false, [\"sign\"]);\n return s.sign(\"HMAC\", k, utf8(data) as BufferSource);\n}\n\n/**\n * RFC 3986 encoding, as SigV4 asks: every byte but letters, digits and `-_.~`.\n * @param text - the text\n * @returns the encoded text\n */\nfunction encode(text: string): string {\n return encodeURIComponent(text).replaceAll(\n /[!'()*]/g,\n (c) => `%${(c.codePointAt(0) ?? 0).toString(16).toUpperCase()}`,\n );\n}\n\n/**\n * The canonical query string: every pair encoded, sorted by key then value.\n * @param url - the request URL\n * @returns the canonical query\n */\nfunction canonicalQuery(url: URL): string {\n return [...url.searchParams]\n .map(([k, v]) => [encode(k), encode(v)] as const)\n .sort(([ak, av], [bk, bv]) => compareText(ak, bk) || compareText(av, bv))\n .map(([k, v]) => `${k}=${v}`)\n .join(\"&\");\n}\n\n/**\n * The `YYYYMMDDTHHMMSSZ` form of a time.\n * @param date - the time\n * @returns the AWS timestamp\n */\nfunction amzDate(date: Date): string {\n return date\n .toISOString()\n .replaceAll(/[-:]/g, \"\")\n .replace(/\\.\\d{3}/, \"\");\n}\n\n/**\n * Sign a request with AWS SigV4 (`Authorization`, `X-Amz-Date` and, for temporary credentials,\n * `X-Amz-Security-Token`). In a browser, long-term keys (no session token) are refused, since every\n * script on the page could read them: use temporary credentials from an identity pool.\n * @param request - the request\n * @param options - region, service (default \"neptune-db\") and the credentials or a provider\n * @param now - the signing time; tests fix it. An `X-Amz-Date` already on the request wins.\n * @returns the signed request\n */\nexport async function signRequest(\n request: Request,\n options: AwsSigV4Options,\n now: Date = new Date(),\n): Promise<Request> {\n const creds = typeof options.credentials === \"function\" ? await options.credentials() : options.credentials;\n const runtime = detectRuntime();\n if ((runtime === \"browser\" || runtime === \"worker\") && (creds.sessionToken ?? \"\") === \"\") {\n failAlone(\"E_SOURCE_PARAM\", \"long-term AWS keys are never used in a browser\", {\n name: \"credential\",\n reason: \"long-term-key\",\n });\n }\n const service = options.service ?? \"neptune-db\";\n const url = new URL(request.url);\n const headers = new Headers(request.headers);\n const stamp = headers.get(\"x-amz-date\") ?? amzDate(now);\n headers.set(\"x-amz-date\", stamp);\n if (creds.sessionToken !== undefined && creds.sessionToken !== \"\") {\n headers.set(\"x-amz-security-token\", creds.sessionToken);\n }\n const method = request.method.toUpperCase();\n const body = method === \"GET\" || method === \"HEAD\" ? new Uint8Array(0) : await request.clone().arrayBuffer();\n\n const signed = new Map<string, string>([[\"host\", url.host]]);\n headers.forEach((value, name) => {\n if (!UNSIGNED.has(name)) {\n signed.set(name, value.trim().replaceAll(/\\s+/g, \" \"));\n }\n });\n // SigV4 sorts header names by code unit, not by locale\n const names = [...signed.keys()].sort((a, b) => Number(a > b) - Number(a < b));\n const signedHeaders = names.join(\";\");\n const canonical = [\n method,\n // non-S3 services encode the already-encoded path once more\n url.pathname.split(\"/\").map(encode).join(\"/\"),\n canonicalQuery(url),\n ...names.map((n) => `${n}:${signed.get(n) ?? \"\"}`),\n \"\",\n signedHeaders,\n await sha256(body),\n ].join(\"\\n\");\n\n const day = stamp.slice(0, 8);\n const scope = `${day}/${options.region}/${service}/aws4_request`;\n const toSign = [\"AWS4-HMAC-SHA256\", stamp, scope, await sha256(utf8(canonical))].join(\"\\n\");\n let key: ArrayBuffer = await hmac(utf8(`AWS4${creds.secretAccessKey}`), day);\n for (const part of [options.region, service, \"aws4_request\"]) {\n key = await hmac(key, part);\n }\n const signature = hex(await hmac(key, toSign));\n headers.set(\n \"Authorization\",\n `AWS4-HMAC-SHA256 Credential=${creds.accessKeyId}/${scope}, SignedHeaders=${signedHeaders}, Signature=${signature}`,\n );\n return new Request(request, { headers });\n}\n"],"names":[],"mappings":";;AAMA,MAAM,IAAI,IAAI,YAAY;AAAA,EACtB;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAChG;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAChG;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAChG;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAChG;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAChG;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAChG;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAChG;AACJ,CAAC;AAQD,SAAS,KAAK,GAAW,GAAmB;AACxC,SAAQ,MAAM,IAAM,KAAM,KAAK;AACnC;AAOA,SAAS,IAAI,MAA8B;AACvC,QAAM,SAAS,KAAK,MAAM,KAAK,SAAS,KAAK,EAAE;AAC/C,QAAM,MAAM,IAAI,WAAW,SAAS,EAAE;AACtC,MAAI,IAAI,IAAI;AACZ,MAAI,KAAK,MAAM,IAAI;AACnB,QAAM,OAAO,IAAI,SAAS,IAAI,MAAM;AACpC,OAAK,UAAU,IAAI,SAAS,GAAG,KAAK,MAAM,KAAK,SAAS,SAAU,CAAC;AACnE,OAAK,UAAU,IAAI,SAAS,GAAI,KAAK,SAAS,MAAO,CAAC;AACtD,SAAO;AACX;AASA,SAAS,SAAS,GAAgB,GAAgB,MAAgB,QAAsB;AACpF,WAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AACzB,MAAE,CAAC,IAAI,KAAK,UAAU,SAAS,IAAI,CAAC;AAAA,EACxC;AACA,WAAS,IAAI,IAAI,IAAI,IAAI,KAAK;AAC1B,UAAM,KAAK,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,IAAK,EAAE,IAAI,EAAE,MAAM;AACrE,UAAM,KAAK,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,IAAK,EAAE,IAAI,CAAC,MAAM;AACnE,MAAE,CAAC,IAAK,EAAE,IAAI,EAAE,IAAI,KAAK,EAAE,IAAI,CAAC,IAAI,OAAQ;AAAA,EAChD;AACA,MAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,IAAI;AAChC,WAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AACzB,UAAM,KAAM,MAAM,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,EAAE,IAAI,KAAK,GAAG,EAAE,MAAO,IAAI,IAAM,CAAC,IAAI,KAAM,EAAE,CAAC,IAAI,EAAE,CAAC,MAAO;AACpG,UAAM,MAAO,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,EAAE,IAAI,KAAK,GAAG,EAAE,MAAO,IAAI,IAAM,IAAI,IAAM,IAAI,OAAS;AAC1F,SAAK;AACL,QAAI;AACJ,QAAI;AACJ,QAAK,IAAI,OAAQ;AACjB,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAK,KAAK,OAAQ;AAAA,EACtB;AACA,QAAM,OAAO,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AACrC,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AACxB,MAAE,CAAC,IAAK,EAAE,CAAC,IAAI,KAAK,CAAC,MAAO;AAAA,EAChC;AACJ;AAOO,SAAS,YAAY,MAA+B;AACvD,QAAM,IAAI,IAAI,YAAY;AAAA,IACtB;AAAA,IAAY;AAAA,IAAY;AAAA,IAAY;AAAA,IAAY;AAAA,IAAY;AAAA,IAAY;AAAA,IAAY;AAAA,EAAA,CACvF;AACD,QAAM,SAAS,IAAI,IAAI;AACvB,QAAM,OAAO,IAAI,SAAS,OAAO,MAAM;AACvC,QAAM,IAAI,IAAI,YAAY,EAAE;AAC5B,WAAS,SAAS,GAAG,SAAS,OAAO,QAAQ,UAAU,IAAI;AACvD,aAAS,GAAG,GAAG,MAAM,MAAM;AAAA,EAC/B;AACA,QAAM,MAAM,IAAI,SAAS,IAAI,YAAY,EAAE,CAAC;AAC5C,IAAE,QAAQ,CAAC,MAAM,MAAM;AACnB,QAAI,UAAU,IAAI,GAAG,IAAI;AAAA,EAC7B,CAAC;AACD,SAAO,IAAI;AACf;ACrFA,MAAM,+BAAe,IAAI,CAAC,cAAc,UAAU,mBAAmB,iBAAiB,gBAAgB,CAAC;AAOvG,SAAS,KAAK,MAA0B;AACpC,SAAO,IAAI,YAAA,EAAc,OAAO,IAAI;AACxC;AAQA,SAAS,YAAY,GAAW,GAAmB;AAC/C,MAAI,MAAM,GAAG;AACT,WAAO;AAAA,EACX;AACA,SAAO,IAAI,IAAI,KAAK;AACxB;AAOA,eAAe,SAAuC;AAClD,QAAM,SAAU,WAAmC;AACnD,MAAI,QAAQ,WAAW,QAAW;AAC9B,WAAO,OAAO;AAAA,EAClB;AACA,MAAI,cAAA,MAAoB,QAAQ;AAC5B,WAAO;AAAA,EACX;AACA,QAAM,OAAO;AACb,UAAS,MAAM;AAAA;AAAA,IAA0B;AAAA,KAAiC,UAAU;AACxF;AAOA,SAAS,IAAI,OAA4B;AACrC,SAAO,MAAM,KAAK,IAAI,WAAW,KAAK,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE;AAC5F;AAOA,eAAe,OAAO,MAAiD;AACnE,QAAM,IAAI,MAAM,OAAA;AAChB,MAAI,MAAM,MAAM;AACZ,WAAO,IAAI,YAAY,gBAAgB,aAAa,OAAO,IAAI,WAAW,IAAI,CAAC,CAAC;AAAA,EACpF;AACA,SAAO,IAAI,MAAM,EAAE,OAAO,WAAW,IAAoB,CAAC;AAC9D;AAOO,SAAS,UAAU,MAA+B;AACrD,SAAO,OAAO,KAAK,IAAI,CAAC;AAC5B;AAQA,eAAe,KAAK,KAA+B,MAAoC;AACnF,QAAM,IAAI,MAAM,OAAA;AAChB,MAAI,MAAM,MAAM;AACZ,cAAU,oBAAoB,2EAA2E;AAAA,MACrG,SAAS,cAAA;AAAA,MACT,QAAQ;AAAA,IAAA,CACX;AAAA,EACL;AACA,QAAM,IAAI,MAAM,EAAE,UAAU,OAAO,KAAqB,EAAE,MAAM,QAAQ,MAAM,UAAA,GAAa,OAAO,CAAC,MAAM,CAAC;AAC1G,SAAO,EAAE,KAAK,QAAQ,GAAG,KAAK,IAAI,CAAiB;AACvD;AAOA,SAAS,OAAO,MAAsB;AAClC,SAAO,mBAAmB,IAAI,EAAE;AAAA,IAC5B;AAAA,IACA,CAAC,MAAM,KAAK,EAAE,YAAY,CAAC,KAAK,GAAG,SAAS,EAAE,EAAE,YAAA,CAAa;AAAA,EAAA;AAErE;AAOA,SAAS,eAAe,KAAkB;AACtC,SAAO,CAAC,GAAG,IAAI,YAAY,EACtB,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,CAAU,EAC/C,KAAK,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,YAAY,IAAI,EAAE,KAAK,YAAY,IAAI,EAAE,CAAC,EACvE,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,EAC3B,KAAK,GAAG;AACjB;AAOA,SAAS,QAAQ,MAAoB;AACjC,SAAO,KACF,cACA,WAAW,SAAS,EAAE,EACtB,QAAQ,WAAW,EAAE;AAC9B;AAWA,eAAsB,YAClB,SACA,SACA,MAAY,oBAAI,QACA;AAChB,QAAM,QAAQ,OAAO,QAAQ,gBAAgB,aAAa,MAAM,QAAQ,gBAAgB,QAAQ;AAChG,QAAM,UAAU,cAAA;AAChB,OAAK,YAAY,aAAa,YAAY,cAAc,MAAM,gBAAgB,QAAQ,IAAI;AACtF,cAAU,kBAAkB,kDAAkD;AAAA,MAC1E,MAAM;AAAA,MACN,QAAQ;AAAA,IAAA,CACX;AAAA,EACL;AACA,QAAM,UAAU,QAAQ,WAAW;AACnC,QAAM,MAAM,IAAI,IAAI,QAAQ,GAAG;AAC/B,QAAM,UAAU,IAAI,QAAQ,QAAQ,OAAO;AAC3C,QAAM,QAAQ,QAAQ,IAAI,YAAY,KAAK,QAAQ,GAAG;AACtD,UAAQ,IAAI,cAAc,KAAK;AAC/B,MAAI,MAAM,iBAAiB,UAAa,MAAM,iBAAiB,IAAI;AAC/D,YAAQ,IAAI,wBAAwB,MAAM,YAAY;AAAA,EAC1D;AACA,QAAM,SAAS,QAAQ,OAAO,YAAA;AAC9B,QAAM,OAAO,WAAW,SAAS,WAAW,SAAS,IAAI,WAAW,CAAC,IAAI,MAAM,QAAQ,MAAA,EAAQ,YAAA;AAE/F,QAAM,6BAAa,IAAoB,CAAC,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC;AAC3D,UAAQ,QAAQ,CAAC,OAAO,SAAS;AAC7B,QAAI,CAAC,SAAS,IAAI,IAAI,GAAG;AACrB,aAAO,IAAI,MAAM,MAAM,KAAA,EAAO,WAAW,QAAQ,GAAG,CAAC;AAAA,IACzD;AAAA,EACJ,CAAC;AAED,QAAM,QAAQ,CAAC,GAAG,OAAO,KAAA,CAAM,EAAE,KAAK,CAAC,GAAG,MAAM,OAAO,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC,CAAC;AAC7E,QAAM,gBAAgB,MAAM,KAAK,GAAG;AACpC,QAAM,YAAY;AAAA,IACd;AAAA;AAAA,IAEA,IAAI,SAAS,MAAM,GAAG,EAAE,IAAI,MAAM,EAAE,KAAK,GAAG;AAAA,IAC5C,eAAe,GAAG;AAAA,IAClB,GAAG,MAAM,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,IAAI,CAAC,KAAK,EAAE,EAAE;AAAA,IACjD;AAAA,IACA;AAAA,IACA,MAAM,OAAO,IAAI;AAAA,EAAA,EACnB,KAAK,IAAI;AAEX,QAAM,MAAM,MAAM,MAAM,GAAG,CAAC;AAC5B,QAAM,QAAQ,GAAG,GAAG,IAAI,QAAQ,MAAM,IAAI,OAAO;AACjD,QAAM,SAAS,CAAC,oBAAoB,OAAO,OAAO,MAAM,OAAO,KAAK,SAAS,CAAC,CAAC,EAAE,KAAK,IAAI;AAC1F,MAAI,MAAmB,MAAM,KAAK,KAAK,OAAO,MAAM,eAAe,EAAE,GAAG,GAAG;AAC3E,aAAW,QAAQ,CAAC,QAAQ,QAAQ,SAAS,cAAc,GAAG;AAC1D,UAAM,MAAM,KAAK,KAAK,IAAI;AAAA,EAC9B;AACA,QAAM,YAAY,IAAI,MAAM,KAAK,KAAK,MAAM,CAAC;AAC7C,UAAQ;AAAA,IACJ;AAAA,IACA,+BAA+B,MAAM,WAAW,IAAI,KAAK,mBAAmB,aAAa,eAAe,SAAS;AAAA,EAAA;AAErH,SAAO,IAAI,QAAQ,SAAS,EAAE,SAAS;AAC3C;"}
|