pattapatta 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/LICENSE +21 -0
  3. package/README.md +98 -0
  4. package/dist/circle-BDbKfrdR.d.ts +12 -0
  5. package/dist/circlePacking/index.d.ts +78 -0
  6. package/dist/circlePacking/index.js +381 -0
  7. package/dist/circlePacking/index.js.map +1 -0
  8. package/dist/cli.js +365 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/construction/index.d.ts +26 -0
  11. package/dist/construction/index.js +102 -0
  12. package/dist/construction/index.js.map +1 -0
  13. package/dist/contour/index.d.ts +20 -0
  14. package/dist/contour/index.js +118 -0
  15. package/dist/contour/index.js.map +1 -0
  16. package/dist/conversion/index.d.ts +31 -0
  17. package/dist/conversion/index.js +99 -0
  18. package/dist/conversion/index.js.map +1 -0
  19. package/dist/group-BNjVVYSQ.d.ts +13 -0
  20. package/dist/hatch/index.d.ts +41 -0
  21. package/dist/hatch/index.js +253 -0
  22. package/dist/hatch/index.js.map +1 -0
  23. package/dist/hull/index.d.ts +16 -0
  24. package/dist/hull/index.js +97 -0
  25. package/dist/hull/index.js.map +1 -0
  26. package/dist/index.d.ts +67 -0
  27. package/dist/index.js +3933 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/meshing/index.d.ts +125 -0
  30. package/dist/meshing/index.js +1333 -0
  31. package/dist/meshing/index.js.map +1 -0
  32. package/dist/morphology/index.d.ts +58 -0
  33. package/dist/morphology/index.js +268 -0
  34. package/dist/morphology/index.js.map +1 -0
  35. package/dist/optimisation/index.d.ts +43 -0
  36. package/dist/optimisation/index.js +400 -0
  37. package/dist/optimisation/index.js.map +1 -0
  38. package/dist/path-0RjhYjJs.d.ts +21 -0
  39. package/dist/pointSet/index.d.ts +24 -0
  40. package/dist/pointSet/index.js +139 -0
  41. package/dist/pointSet/index.js.map +1 -0
  42. package/dist/polygonisation/index.d.ts +44 -0
  43. package/dist/polygonisation/index.js +310 -0
  44. package/dist/polygonisation/index.js.map +1 -0
  45. package/dist/predicates/index.d.ts +35 -0
  46. package/dist/predicates/index.js +159 -0
  47. package/dist/predicates/index.js.map +1 -0
  48. package/dist/processing/index.d.ts +54 -0
  49. package/dist/processing/index.js +457 -0
  50. package/dist/processing/index.js.map +1 -0
  51. package/dist/segment-BKuIFMKD.d.ts +10 -0
  52. package/dist/segmentSet/index.d.ts +25 -0
  53. package/dist/segmentSet/index.js +109 -0
  54. package/dist/segmentSet/index.js.map +1 -0
  55. package/dist/shapeBoolean/index.d.ts +41 -0
  56. package/dist/shapeBoolean/index.js +211 -0
  57. package/dist/shapeBoolean/index.js.map +1 -0
  58. package/dist/svg/index.d.ts +38 -0
  59. package/dist/svg/index.js +317 -0
  60. package/dist/svg/index.js.map +1 -0
  61. package/dist/tiling/index.d.ts +32 -0
  62. package/dist/tiling/index.js +344 -0
  63. package/dist/tiling/index.js.map +1 -0
  64. package/dist/transformation/index.d.ts +37 -0
  65. package/dist/transformation/index.js +184 -0
  66. package/dist/transformation/index.js.map +1 -0
  67. package/dist/triangulation/index.d.ts +48 -0
  68. package/dist/triangulation/index.js +334 -0
  69. package/dist/triangulation/index.js.map +1 -0
  70. package/dist/vec2-CWyXN1Wj.d.ts +10 -0
  71. package/dist/voronoi/index.d.ts +31 -0
  72. package/dist/voronoi/index.js +211 -0
  73. package/dist/voronoi/index.js.map +1 -0
  74. package/package.json +165 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/types/vec2.ts","../../src/types/segment.ts","../../src/types/path.ts","../../src/types/group.ts","../../src/clipper/convert.ts","../../src/predicates/index.ts","../../src/triangulation/index.ts","../../src/shapeBoolean/index.ts","../../src/morphology/index.ts","../../src/meshing/index.ts"],"names":["cross"],"mappings":";;;;AAMO,SAAS,IAAA,CAAK,GAAW,CAAA,EAAiB;AAC/C,EAAA,OAAO,EAAE,GAAG,CAAA,EAAE;AAChB;AAEO,SAAS,UAAU,CAAA,EAAe;AACvC,EAAA,OAAO,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,EAAE,CAAA,EAAE;AAC1B;AAEO,SAAS,UAAA,CAAW,CAAA,EAAS,CAAA,EAAS,GAAA,GAAM,IAAA,EAAe;AAChE,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,CAAA,GAAI,EAAE,CAAC,CAAA,IAAK,GAAA,IAAO,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,IAAK,GAAA;AAC9D;;;ACRO,SAAS,OAAA,CAAQ,GAAS,CAAA,EAAkB;AACjD,EAAA,OAAO,EAAE,GAAG,CAAA,EAAE;AAChB;;;ACMO,SAAS,IAAA,CAAK,KAAA,EAAe,MAAA,GAAS,IAAA,EAAY;AACvD,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,MAAM,GAAA,CAAI,CAAC,SAAS,IAAA,CAAK,GAAA,CAAI,SAAS,CAAC,CAAA;AAAA,IAC9C;AAAA,GACF;AACF;AAEO,SAAS,SAAS,MAAA,EAAoB;AAC3C,EAAA,OAAO,IAAA,CAAK,CAAC,MAAM,CAAA,EAAG,KAAK,CAAA;AAC7B;AAEO,SAAS,OAAA,CAAQ,QAAA,EAAgB,KAAA,GAAgB,EAAC,EAAS;AAChE,EAAA,OAAO,KAAK,CAAC,QAAA,EAAU,GAAG,KAAK,GAAG,IAAI,CAAA;AACxC;AAGO,SAAS,aAAA,CAAc,IAAA,EAAY,GAAA,GAAM,IAAA,EAAY;AAC1D,EAAA,IAAI,KAAK,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA,CAAK,IAAI,SAAS,CAAA;AAC9C,EAAA,MAAM,KAAA,GAAQ,KAAK,CAAC,CAAA;AACpB,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA;AACjC,EAAA,IAAI,SAAS,IAAA,IAAQ,UAAA,CAAW,KAAA,EAAO,IAAA,EAAM,GAAG,CAAA,EAAG;AACjD,IAAA,OAAO,KAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CAAE,IAAI,SAAS,CAAA;AAAA,EACxC;AACA,EAAA,OAAO,IAAA,CAAK,IAAI,SAAS,CAAA;AAC3B;AAEO,SAAS,UAAU,CAAA,EAAe;AACvC,EAAA,OAAO;AAAA,IACL,QAAQ,CAAA,CAAE,MAAA;AAAA,IACV,KAAA,EAAO,EAAE,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,GAAA,CAAI,SAAS,CAAC;AAAA,GAClD;AACF;;;ACrCO,SAAS,KAAA,CAAM,KAAA,GAAgB,EAAC,EAAU;AAC/C,EAAA,OAAO,EAAE,KAAA,EAAO,KAAA,CAAM,GAAA,CAAI,SAAS,CAAA,EAAE;AACvC;ACKO,IAAM,oBAAoB,QAAA,CAAS,OAAA;AAEnC,SAAS,YAAY,IAAA,EAAmB;AAC7C,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,KAAA,MAAW,CAAA,IAAK,aAAA,CAAc,IAAI,CAAA,EAAG;AACnC,IAAA,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,GAAG,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA;AAAA,EACnC;AACA,EAAA,OAAO,GAAA;AACT;AAGO,SAAS,aAAa,CAAA,EAAiB;AAC5C,EAAA,IAAI,CAAC,CAAA,CAAE,MAAA,IAAU,CAAA,CAAE,KAAA,CAAM,WAAW,CAAA,EAAG;AACrC,IAAA,MAAM,IAAI,MAAM,0DAA0D,CAAA;AAAA,EAC5E;AACA,EAAA,OAAO,EAAE,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS,WAAA,CAAY,IAAI,CAAC,CAAA;AAChD;AAEO,SAAS,cAAc,KAAA,EAAsB;AAClD,EAAA,IAAI,MAAM,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA,CAAM,EAAE,CAAA;AAEvC,EAAA,MAAM,SAA0C,EAAC;AACjD,EAAA,MAAM,QAAgB,EAAC;AAEvB,EAAA,KAAA,MAAW,MAAM,KAAA,EAAO;AACtB,IAAA,MAAM,IAAA,GAAO,YAAY,EAAE,CAAA;AAC3B,IAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACrB,IAAA,IAAI,WAAA,CAAY,EAAE,CAAA,EAAG;AACnB,MAAA,MAAA,CAAO,KAAK,EAAE,IAAA,EAAM,KAAA,EAAO,IAAI,CAAA;AAAA,IACjC,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,IACjB;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,MAAA,GAAS,KAAK,CAAC,CAAA;AACrB,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,IAAI,QAAA,GAAW,KAAA;AACf,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,IAAI,WAAA,CAAY,MAAA,EAAQ,KAAA,CAAM,IAAI,CAAA,EAAG;AACnC,QAAA,KAAA,CAAM,KAAA,CAAM,KAAK,IAAI,CAAA;AACrB,QAAA,QAAA,GAAW,IAAA;AACX,QAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAI,CAAC,QAAA,EAAU;AAEb,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,CAAC,GAAG,IAAI,CAAA,CAAE,OAAA,EAAQ,EAAG,KAAA,EAAO,EAAC,EAAG,CAAA;AAAA,IACtD;AAAA,EACF;AAEA,EAAA,OAAO,KAAA,CAAM,MAAA,CAAO,GAAA,CAAI,CAAC,MAAM,IAAA,CAAK,CAAC,CAAA,CAAE,IAAA,EAAM,GAAG,CAAA,CAAE,KAAK,CAAA,EAAG,IAAI,CAAC,CAAC,CAAA;AAClE;AAEO,SAAS,YAAY,EAAA,EAAiB;AAC3C,EAAA,OAAO,aAAA,CAAc,EAAA,CAAG,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAC,CAAC,CAAA;AACpD;AAEO,SAAS,WAAA,CAAY,OAAa,IAAA,EAAqB;AAC5D,EAAA,MAAM,MAAA,GAAS,eAAA;AAAA,IACb,EAAE,GAAG,KAAA,CAAM,CAAA,EAAG,GAAG,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,IAC/B,YAAY,IAAI;AAAA,GAClB;AACA,EAAA,OACE,MAAA,KAAW,oBAAA,CAAqB,QAAA,IAChC,MAAA,KAAW,oBAAA,CAAqB,IAAA;AAEpC;AAEO,SAAS,SAAA,CAAU,GAAW,CAAA,EAAmB;AACtD,EAAA,OAAO,MAAA,CAAO,CAAA,EAAG,CAAA,EAAG,iBAAiB,CAAA;AACvC;AAcO,SAAS,UAAU,KAAA,EAAuB;AAC/C,EAAA,IAAI,GAAA,GAAM,CAAA;AACV,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,GAAA,IAAO,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,EAC1B;AACA,EAAA,OAAO,GAAA;AACT;;;ACnGO,SAAS,SAAS,IAAA,EAAsB;AAC7C,EAAA,IAAI,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG,OAAO,CAAA;AAC5B,EAAA,IAAI,GAAA,GAAM,CAAA;AACV,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,CAAA,GAAI,KAAK,CAAC,CAAA;AAChB,IAAA,MAAM,CAAA,GAAI,IAAA,CAAA,CAAM,CAAA,GAAI,CAAA,IAAK,KAAK,MAAM,CAAA;AACpC,IAAA,GAAA,IAAO,EAAE,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,IAAI,CAAA,CAAE,CAAA;AAAA,EAC7B;AACA,EAAA,OAAO,GAAA,GAAM,CAAA;AACf;AAGO,SAAS,KAAK,CAAA,EAAiB;AACpC,EAAA,IAAI,CAAC,CAAA,CAAE,MAAA,IAAU,EAAE,KAAA,CAAM,MAAA,KAAW,GAAG,OAAO,CAAA;AAC9C,EAAA,IAAI;AACF,IAAA,OAAO,SAAA,CAAU,YAAA,CAAa,CAAC,CAAC,CAAA;AAAA,EAClC,CAAA,CAAA,MAAQ;AACN,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACvC,MAAA,MAAM,CAAA,GAAI,KAAK,GAAA,CAAI,QAAA,CAAS,EAAE,KAAA,CAAM,CAAC,CAAE,CAAC,CAAA;AACxC,MAAA,KAAA,IAAS,CAAA,KAAM,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA;AAAA,IAC1B;AACA,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,CAAA;AAAA,EAC1B;AACF;AAOO,SAAS,SAAS,CAAA,EAAe;AACtC,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA;AACtB,EAAA,IAAI,CAAC,QAAQ,IAAA,CAAK,MAAA,KAAW,GAAG,OAAO,IAAA,CAAK,GAAG,CAAC,CAAA;AAChD,EAAA,MAAM,CAAA,GAAI,SAAS,IAAI,CAAA;AACvB,EAAA,IAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,GAAI,KAAA,EAAO;AACvB,IAAA,IAAI,EAAA,GAAK,CAAA;AACT,IAAA,IAAI,EAAA,GAAK,CAAA;AACT,IAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,MAAA,EAAA,IAAM,CAAA,CAAE,CAAA;AACR,MAAA,EAAA,IAAM,CAAA,CAAE,CAAA;AAAA,IACV;AACA,IAAA,OAAO,KAAK,EAAA,GAAK,IAAA,CAAK,MAAA,EAAQ,EAAA,GAAK,KAAK,MAAM,CAAA;AAAA,EAChD;AACA,EAAA,IAAI,EAAA,GAAK,CAAA;AACT,EAAA,IAAI,EAAA,GAAK,CAAA;AACT,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,EAAA,GAAK,KAAK,CAAC,CAAA;AACjB,IAAA,MAAM,EAAA,GAAK,IAAA,CAAA,CAAM,CAAA,GAAI,CAAA,IAAK,KAAK,MAAM,CAAA;AACrC,IAAA,MAAMA,SAAQ,EAAA,CAAG,CAAA,GAAI,GAAG,CAAA,GAAI,EAAA,CAAG,IAAI,EAAA,CAAG,CAAA;AACtC,IAAA,EAAA,IAAA,CAAO,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,CAAA,IAAKA,MAAAA;AACtB,IAAA,EAAA,IAAA,CAAO,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,CAAA,IAAKA,MAAAA;AAAA,EACxB;AACA,EAAA,OAAO,KAAK,EAAA,IAAM,CAAA,GAAI,CAAA,CAAA,EAAI,EAAA,IAAM,IAAI,CAAA,CAAE,CAAA;AACxC;AAEO,SAAS,aAAA,CAAc,GAAS,KAAA,EAAsB;AAC3D,EAAA,IAAI,CAAC,EAAE,MAAA,IAAU,CAAC,EAAE,KAAA,CAAM,CAAC,GAAG,OAAO,KAAA;AACrC,EAAA,IAAI,CAAC,YAAY,KAAA,EAAO,CAAA,CAAE,MAAM,CAAC,CAAC,GAAG,OAAO,KAAA;AAC5C,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACvC,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA;AACtB,IAAA,IAAI,IAAA,IAAQ,WAAA,CAAY,KAAA,EAAO,IAAI,GAAG,OAAO,KAAA;AAAA,EAC/C;AACA,EAAA,OAAO,IAAA;AACT;ACpCO,SAAS,4BAA4B,MAAA,EAAwB;AAClE,EAAA,IAAI,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,EAAC;AAC/B,EAAA,MAAM,WAAW,QAAA,CAAS,IAAA;AAAA,IACxB,MAAA;AAAA,IACA,CAAC,MAAM,CAAA,CAAE,CAAA;AAAA,IACT,CAAC,MAAM,CAAA,CAAE;AAAA,GACX;AACA,EAAA,MAAM,OAAe,EAAC;AACtB,EAAA,MAAM,EAAE,WAAU,GAAI,QAAA;AACtB,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,SAAA,CAAU,MAAA,EAAQ,KAAK,CAAA,EAAG;AAC5C,IAAA,MAAM,CAAA,GAAI,MAAA,CAAO,SAAA,CAAU,CAAC,CAAE,CAAA;AAC9B,IAAA,MAAM,CAAA,GAAI,MAAA,CAAO,SAAA,CAAU,CAAA,GAAI,CAAC,CAAE,CAAA;AAClC,IAAA,MAAM,CAAA,GAAI,MAAA,CAAO,SAAA,CAAU,CAAA,GAAI,CAAC,CAAE,CAAA;AAClC,IAAA,IAAA,CAAK,KAAK,OAAA,CAAQ,CAAC,GAAG,CAAA,EAAG,CAAC,CAAC,CAAC,CAAA;AAAA,EAC9B;AACA,EAAA,OAAO,IAAA;AACT;;;AC1CA,SAAS,aAAa,CAAA,EAAe;AACnC,EAAA,IAAI,CAAC,EAAE,MAAA,EAAQ;AACb,IAAA,MAAM,IAAI,MAAM,oCAAoC,CAAA;AAAA,EACtD;AACA,EAAA,OAAO,CAAA;AACT;AAGO,SAAS,KAAA,CAAM,GAAS,CAAA,EAAgB;AAC7C,EAAA,MAAM,MAAA,GAAS,SAAA,CAAU,YAAA,CAAa,YAAA,CAAa,CAAC,CAAC,CAAA,EAAG,YAAA,CAAa,YAAA,CAAa,CAAC,CAAC,CAAC,CAAA;AACrF,EAAA,OAAO,cAAc,MAAM,CAAA;AAC7B;ACTO,SAAS,QAAA,CAAS,GAAS,OAAA,EAAuB;AACvD,EAAA,IAAI,WAAW,CAAA,IAAK,CAAA,CAAE,KAAA,CAAM,MAAA,KAAW,GAAG,OAAO,CAAA;AACjD,EAAA,MAAM,QAAgB,EAAC;AACvB,EAAA,KAAA,MAAW,IAAA,IAAQ,EAAE,KAAA,EAAO;AAC1B,IAAA,MAAM,aAAa,aAAA,CAAc,WAAA,CAAY,IAAI,CAAA,EAAG,OAAA,EAAS,EAAE,MAAM,CAAA;AACrE,IAAA,MAAM,GAAA,GAAM,YAAY,UAAU,CAAA;AAClC,IAAA,IAAI,GAAA,CAAI,WAAW,CAAA,CAAE,MAAA,GAAS,IAAI,CAAA,CAAA,EAAI,KAAA,CAAM,KAAK,GAAG,CAAA;AAAA,EACtD;AACA,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG,OAAO,KAAK,EAAC,EAAG,EAAE,MAAM,CAAA;AAChD,EAAA,OAAO,IAAA,CAAK,KAAA,EAAO,CAAA,CAAE,MAAM,CAAA;AAC7B;;;ACVA,SAAS,OAAA,CAAQ,GAAS,CAAA,EAAiB;AACzC,EAAA,MAAM,OAAO,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,CAAA,EAAI,EAAE,CAAC,CAAA,CAAA;AAC1B,EAAA,MAAM,OAAO,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,CAAA,EAAI,EAAE,CAAC,CAAA,CAAA;AAC1B,EAAA,OAAO,IAAA,GAAO,IAAA,GAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,GAAK,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AAC1D;AAEA,SAAS,QAAQ,CAAA,EAAiB;AAChC,EAAA,OAAO,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,CAAA,EAAI,EAAE,CAAC,CAAA,CAAA;AACtB;AAEA,SAAS,IAAA,CAAK,CAAA,EAAS,CAAA,EAAS,GAAA,GAAM,KAAA,EAAgB;AACpD,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,CAAA,GAAI,EAAE,CAAC,CAAA,GAAI,GAAA,IAAO,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,GAAI,GAAA;AAC5D;AAEA,SAAS,IAAA,CAAK,GAAS,CAAA,EAAiB;AACtC,EAAA,OAAO,IAAA,CAAK,MAAM,CAAA,CAAE,CAAA,GAAI,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA;AACxC;AAEA,SAAS,GAAA,CAAI,GAAS,CAAA,EAAe;AACnC,EAAA,OAAO,EAAE,CAAA,EAAA,CAAI,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,IAAK,CAAA,EAAG,CAAA,EAAA,CAAI,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,IAAK,CAAA,EAAE;AAClD;AAEA,SAAS,IAAA,CAAK,CAAA,EAAS,CAAA,EAAS,CAAA,EAAiB;AAC/C,EAAA,OAAO,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,GAAA,CAAK,CAAA,CAAE,IAAI,CAAA,CAAE,CAAA,IAAK,CAAA,EAAG,CAAA,EAAG,EAAE,CAAA,GAAA,CAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,KAAK,CAAA,EAAE;AAC9D;AAEA,SAAS,OAAO,MAAA,EAAwB;AACtC,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,MAAM,MAAc,EAAC;AACrB,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,MAAM,CAAA,GAAI,QAAQ,CAAC,CAAA;AACnB,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG;AACjB,IAAA,IAAA,CAAK,IAAI,CAAC,CAAA;AACV,IAAA,GAAA,CAAI,IAAA,CAAK,EAAE,GAAG,CAAA,EAAG,CAAA;AAAA,EACnB;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,KAAA,CAAM,CAAA,EAAS,CAAA,EAAS,CAAA,EAAiB;AAChD,EAAA,OAAA,CAAQ,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,KAAM,EAAE,CAAA,GAAI,CAAA,CAAE,CAAA,CAAA,GAAA,CAAM,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA,CAAE,CAAA,CAAA;AAC5D;AAEA,SAAS,OAAO,IAAA,EAAoB;AAClC,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,IAAK,EAAC;AAC3B;AAGA,SAAS,aAAa,KAAA,EAAqC;AACzD,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAqB;AACvC,EAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG,EAAA,KAAO;AACvB,IAAA,MAAM,IAAA,GAAO,OAAO,CAAC,CAAA;AACrB,IAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACrB,IAAA,MAAM,IAAI,IAAA,CAAK,MAAA;AACf,IAAA,MAAM,MAAA,GAAS,CAAA,CAAE,MAAA,KAAW,KAAA,IAAS,CAAA,IAAK,CAAA;AAC1C,IAAA,MAAM,GAAA,GAAM,MAAA,GAAS,CAAA,GAAI,CAAA,GAAI,CAAA;AAC7B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,EAAK,CAAA,EAAA,EAAK;AAC5B,MAAA,MAAM,CAAA,GAAI,KAAK,CAAC,CAAA;AAChB,MAAA,MAAM,CAAA,GAAI,IAAA,CAAA,CAAM,CAAA,GAAI,CAAA,IAAK,CAAC,CAAA;AAC1B,MAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,CAAA,EAAG,CAAC,CAAA;AACxB,MAAA,MAAM,GAAA,GAAM,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AACzB,MAAA,IAAI,GAAA,EAAK,GAAA,CAAI,OAAA,CAAQ,IAAA,CAAK,EAAE,CAAA;AAAA,iBACjB,GAAA,CAAI,GAAA,EAAK,EAAE,CAAA,EAAG,EAAE,GAAG,CAAA,EAAE,EAAG,CAAA,EAAG,EAAE,GAAG,CAAA,EAAE,EAAG,SAAS,CAAC,EAAE,GAAG,CAAA;AAAA,IACjE;AAAA,EACF,CAAC,CAAA;AACD,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,cAAc,OAAA,EAA4C;AACjE,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAY;AAC5B,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,CAAA,IAAK,OAAA,EAAS;AAC5B,IAAA,IAAI,EAAE,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,GAAA,CAAI,IAAI,CAAC,CAAA;AAAA,EACvC;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,cAAc,KAAA,EAA2B;AAChD,EAAA,MAAM,OAAA,GAAU,aAAa,KAAK,CAAA;AAClC,EAAA,MAAM,GAAA,GAAkB,KAAA,CAAM,GAAA,CAAI,MAAM,EAAE,CAAA;AAC1C,EAAA,KAAA,MAAW,CAAA,IAAK,OAAA,CAAQ,MAAA,EAAO,EAAG;AAChC,IAAA,IAAI,CAAA,CAAE,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AAC1B,MAAA,MAAM,CAAC,CAAA,EAAG,CAAC,CAAA,GAAI,CAAA,CAAE,OAAA;AACjB,MAAA,GAAA,CAAI,CAAE,CAAA,CAAG,IAAA,CAAK,CAAE,CAAA;AAChB,MAAA,GAAA,CAAI,CAAE,CAAA,CAAG,IAAA,CAAK,CAAE,CAAA;AAAA,IAClB;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AAGA,SAAS,eAAe,KAAA,EAAuB;AAC7C,EAAA,OAAO,MAAA,CAAO,MAAM,OAAA,CAAQ,CAAC,MAAM,MAAA,CAAO,CAAC,CAAC,CAAC,CAAA;AAC/C;AAMA,SAAS,kBAAA,CACP,MACA,IAAA,EACQ;AACR,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AAC/B,EAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG,MAAM,CAAC,CAAA;AACnC,EAAA,MAAM,IAAA,GAAO,CAAC,CAAA,KAAsB;AAClC,IAAA,IAAI,CAAA,GAAI,CAAA;AACR,IAAA,OAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,EAAG;AACtB,MAAA,MAAA,CAAO,CAAC,CAAA,GAAI,MAAA,CAAO,MAAA,CAAO,CAAC,CAAE,CAAA;AAC7B,MAAA,CAAA,GAAI,OAAO,CAAC,CAAA;AAAA,IACd;AACA,IAAA,OAAO,CAAA;AAAA,EACT,CAAA;AACA,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,EAAW,CAAA,KAAc;AACtC,IAAA,MAAM,EAAA,GAAK,KAAK,CAAC,CAAA;AACjB,IAAA,MAAM,EAAA,GAAK,KAAK,CAAC,CAAA;AACjB,IAAA,IAAI,EAAA,KAAO,EAAA,EAAI,MAAA,CAAO,EAAE,CAAA,GAAI,EAAA;AAAA,EAC9B,CAAA;AAEA,EAAA,MAAM,OAAA,GAAU,aAAa,IAAI,CAAA;AACjC,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,CAAC,CAAA,IAAK,OAAA,EAAS;AAC9B,IAAA,IAAI,CAAA,CAAE,QAAQ,MAAA,KAAW,CAAA,IAAK,CAAC,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG;AAC5C,MAAA,KAAA,CAAM,EAAE,OAAA,CAAQ,CAAC,GAAI,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAE,CAAA;AAAA,IACpC;AAAA,EACF;AAEA,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAsB;AAC7C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,CAAA,GAAI,KAAK,CAAC,CAAA;AAChB,IAAA,MAAM,IAAA,GAAO,UAAA,CAAW,GAAA,CAAI,CAAC,KAAK,EAAC;AACnC,IAAA,IAAA,CAAK,KAAK,CAAC,CAAA;AACX,IAAA,UAAA,CAAW,GAAA,CAAI,GAAG,IAAI,CAAA;AAAA,EACxB;AAEA,EAAA,MAAM,MAAc,EAAC;AACrB,EAAA,KAAA,MAAW,OAAA,IAAW,UAAA,CAAW,MAAA,EAAO,EAAG;AACzC,IAAA,MAAM,IAAA,GAAO,uBAAA,CAAwB,IAAA,EAAM,OAAO,CAAA;AAClD,IAAA,IAAI,IAAA,IAAQ,KAAK,MAAA,IAAU,CAAA,MAAO,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAC,CAAA;AAAA,EACtD;AACA,EAAA,OAAO,GAAA;AACT;AAGA,SAAS,uBAAA,CACP,MACA,OAAA,EACe;AACf,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAA6C;AACnE,EAAA,KAAA,MAAW,MAAM,OAAA,EAAS;AACxB,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,EAAE,CAAE,CAAA;AAC7B,IAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACrB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,MAAA,MAAM,CAAA,GAAI,KAAK,CAAC,CAAA;AAChB,MAAA,MAAM,CAAA,GAAI,IAAA,CAAA,CAAM,CAAA,GAAI,CAAA,IAAK,KAAK,MAAM,CAAA;AACpC,MAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,CAAA,EAAG,CAAC,CAAA;AACxB,MAAA,MAAM,GAAA,GAAM,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA;AAC7B,MAAA,IAAI,KAAK,GAAA,CAAI,CAAA,EAAA;AAAA,qBACE,GAAA,CAAI,GAAA,EAAK,EAAE,CAAA,EAAG,EAAE,GAAG,CAAA,EAAE,EAAG,CAAA,EAAG,EAAE,GAAG,CAAA,EAAE,EAAG,CAAA,EAAG,GAAG,CAAA;AAAA,IAC5D;AAAA,EACF;AACA,EAAA,MAAM,WAAmC,EAAC;AAC1C,EAAA,KAAA,MAAW,CAAA,IAAK,SAAA,CAAU,MAAA,EAAO,EAAG;AAClC,IAAA,IAAI,CAAA,CAAE,CAAA,KAAM,CAAA,EAAG,QAAA,CAAS,IAAA,CAAK,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA;AAAA,EACjD;AACA,EAAA,IAAI,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA;AAChC,EAAA,OAAO,mBAAmB,QAAQ,CAAA;AACpC;AAEA,SAAS,mBAAmB,KAAA,EAA8C;AACxE,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAC/B,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAoB;AACpC,EAAA,MAAM,GAAA,GAAM,CAAC,IAAA,EAAY,EAAA,KAAa;AACpC,IAAA,MAAM,CAAA,GAAI,QAAQ,IAAI,CAAA;AACtB,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,GAAA,CAAI,CAAC,KAAK,EAAC;AAC5B,IAAA,IAAA,CAAK,KAAK,EAAE,CAAA;AACZ,IAAA,GAAA,CAAI,GAAA,CAAI,GAAG,IAAI,CAAA;AAAA,EACjB,CAAA;AACA,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,GAAA,CAAI,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA;AACZ,IAAA,GAAA,CAAI,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA;AAAA,EACd;AAEA,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,CAAC,CAAA,CAAG,CAAA;AACxB,EAAA,MAAM,IAAA,GAAe,CAAC,EAAE,GAAG,OAAO,CAAA;AAClC,EAAA,IAAI,IAAA,GAAO,KAAA;AACX,EAAA,IAAI,IAAA,GAAO,KAAA,CAAM,CAAC,CAAA,CAAG,CAAA;AACrB,EAAA,MAAM,QAAA,GAAW,MAAM,MAAA,GAAS,CAAA;AAChC,EAAA,KAAA,IAAS,IAAA,GAAO,CAAA,EAAG,IAAA,GAAO,QAAA,EAAU,IAAA,EAAA,EAAQ;AAC1C,IAAA,IAAA,CAAK,IAAA,CAAK,EAAE,GAAG,IAAA,EAAM,CAAA;AACrB,IAAA,IAAI,KAAK,IAAA,EAAM,KAAK,CAAA,IAAK,IAAA,CAAK,SAAS,CAAA,EAAG;AACxC,MAAA,IAAA,CAAK,GAAA,EAAI;AACT,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,MAAM,OAAO,GAAA,CAAI,GAAA,CAAI,QAAQ,IAAI,CAAC,KAAK,EAAC;AACxC,IAAA,IAAI,IAAA,GAAoB,IAAA;AACxB,IAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,MAAA,IAAI,CAAC,IAAA,CAAK,CAAA,EAAG,IAAI,CAAA,EAAG;AAClB,QAAA,IAAA,GAAO,CAAA;AACP,QAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,IAAA,GAAO,IAAA;AACP,IAAA,IAAA,GAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA,CAAK,MAAA,IAAU,CAAA,GAAI,IAAA,GAAO,IAAA;AACnC;AAEA,SAAS,eAAA,CACP,IAAA,EACA,UAAA,EACA,iBAAA,EACQ;AACR,EAAA,MAAM,OAAA,GAAU,aAAa,IAAI,CAAA;AACjC,EAAA,MAAM,IAAA,GAAO,cAAc,OAAO,CAAA;AAClC,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,CAAC,CAAA,IAAK,OAAA,EAAS;AAC9B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AAC3B,IAAA,IAAI,UAAU,iBAAA,EAAmB;AAC/B,MAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AACZ,MAAA;AAAA,IACF;AACA,IAAA,IAAI,UAAA,CAAW,EAAE,CAAA,EAAG,CAAA,CAAE,GAAG,MAAM,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AAAA,EAChD;AACA,EAAA,OAAO,kBAAA,CAAmB,MAAM,IAAI,CAAA;AACtC;AAEA,SAAS,WAAW,KAAA,EAAgC;AAClD,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AAChC,EAAA,MAAM,KAAA,GAAQ,MAAM,CAAC,CAAA;AACrB,EAAA,IAAI,OAAA,IAAW,OAAO,OAAO,KAAA;AAC7B,EAAA,OAAO,4BAA4B,KAAe,CAAA;AACpD;AAEA,SAAS,SAAS,KAAA,EAAgC;AAChD,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AAChC,EAAA,MAAM,KAAA,GAAQ,MAAM,CAAC,CAAA;AACrB,EAAA,IAAI,OAAA,IAAW,KAAA,EAAO,OAAO,cAAA,CAAe,KAAe,CAAA;AAC3D,EAAA,OAAO,KAAA;AACT;AAOO,SAAS,kBAAkB,KAAA,EAA0B;AAC1D,EAAA,MAAM,OAAA,GAAU,aAAa,KAAK,CAAA;AAClC,EAAA,MAAM,MAAiB,EAAC;AACxB,EAAA,KAAA,MAAW,CAAA,IAAK,OAAA,CAAQ,MAAA,EAAO,EAAG;AAChC,IAAA,IAAI,CAAA,CAAE,OAAA,CAAQ,MAAA,IAAU,CAAA,EAAG,GAAA,CAAI,IAAA,CAAK,OAAA,CAAQ,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAC,CAAA;AAAA,EACvD;AACA,EAAA,OAAO,GAAA;AACT;AAGO,SAAS,qBAAqB,KAAA,EAAuB;AAC1D,EAAA,MAAM,OAAA,GAAU,aAAa,KAAK,CAAA;AAClC,EAAA,MAAM,IAAA,GAAO,cAAc,OAAO,CAAA;AAClC,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAY;AAClC,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AACzB,IAAA,SAAA,CAAU,GAAA,CAAI,OAAA,CAAQ,CAAA,CAAE,CAAC,CAAC,CAAA;AAC1B,IAAA,SAAA,CAAU,GAAA,CAAI,OAAA,CAAQ,CAAA,CAAE,CAAC,CAAC,CAAA;AAAA,EAC5B;AACA,EAAA,MAAM,MAAc,EAAC;AACrB,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,KAAA,MAAW,CAAA,IAAK,MAAA,CAAO,CAAC,CAAA,EAAG;AACzB,MAAA,MAAM,CAAA,GAAI,QAAQ,CAAC,CAAA;AACnB,MAAA,IAAI,UAAU,GAAA,CAAI,CAAC,KAAK,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG;AACrC,MAAA,IAAA,CAAK,IAAI,CAAC,CAAA;AACV,MAAA,GAAA,CAAI,IAAA,CAAK,EAAE,GAAG,CAAA,EAAG,CAAA;AAAA,IACnB;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AAGO,SAAS,kBAAA,CACd,OACA,KAAA,EACa;AACb,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,IAAI,aAAA,CAAc,CAAA,EAAG,KAAK,CAAA,EAAG,OAAO,CAAA;AAAA,EACtC;AACA,EAAA,OAAO,IAAA;AACT;AAGO,SAAS,UAAA,CAAW,OAAe,MAAA,EAAuB;AAC/D,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,IAAI,CAAA;AACjC,EAAA,MAAM,MAAc,EAAC;AACrB,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,GAAA,CAAI,IAAA;AAAA,MACF,OAAA;AAAA,QACE,WAAA,CAAY,MAAA,CAAO,CAAC,CAAA,EAAG,GAAG,CAAA;AAAA,QAC1B,CAAA,CAAE,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,WAAA,CAAY,CAAA,EAAG,GAAG,CAAC;AAAA;AACjD,KACF;AAAA,EACF;AACA,EAAA,OAAO,MAAM,GAAG,CAAA;AAClB;AAEA,SAAS,WAAA,CAAY,MAAc,MAAA,EAAwB;AACzD,EAAA,IAAI,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,GAAG,CAAA,EAAE,CAAE,CAAA;AACtD,EAAA,MAAM,MAAc,EAAC;AACrB,EAAA,MAAM,IAAI,IAAA,CAAK,MAAA;AACf,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,IAAA,MAAM,CAAA,GAAI,KAAK,CAAC,CAAA;AAChB,IAAA,MAAM,CAAA,GAAI,IAAA,CAAA,CAAM,CAAA,GAAI,CAAA,IAAK,CAAC,CAAA;AAC1B,IAAA,GAAA,CAAI,IAAA,CAAK,EAAE,GAAG,CAAA,EAAG,CAAA;AACjB,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,CAAA,EAAG,CAAC,CAAA;AACnB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,MAAM,CAAA;AACnC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,CAAA,EAAG,CAAA,EAAG,CAAA,GAAI,KAAK,CAAC,CAAA;AAAA,EAChE;AACA,EAAA,OAAO,GAAA;AACT;AAMA,SAAS,SAAA,CAAU,CAAA,EAAS,CAAA,EAAS,MAAA,EAAyB;AAC5D,EAAA,MAAM,CAAA,GAAI,GAAA,CAAI,CAAA,EAAG,CAAC,CAAA;AAClB,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,CAAA,EAAG,CAAC,CAAA,GAAI,CAAA;AACvB,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,IAAI,KAAK,CAAA,EAAG,CAAC,KAAK,IAAA,CAAK,CAAA,EAAG,CAAC,CAAA,EAAG;AAC9B,IAAA,IAAI,KAAK,CAAA,EAAG,CAAC,CAAA,GAAI,CAAA,GAAI,MAAM,OAAO,KAAA;AAAA,EACpC;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,kBAAA,CAAmB,CAAA,EAAS,CAAA,EAAS,MAAA,EAAyB;AACrE,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,CAAA,EAAG,CAAC,CAAA;AACrB,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,IAAI,KAAK,CAAA,EAAG,CAAC,KAAK,IAAA,CAAK,CAAA,EAAG,CAAC,CAAA,EAAG;AAC9B,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,CAAA,EAAG,CAAC,CAAA,EAAG,IAAA,CAAK,CAAA,EAAG,CAAC,CAAC,CAAA,GAAI,GAAA,GAAM,MAAM,OAAO,KAAA;AAAA,EAC5D;AACA,EAAA,OAAO,IAAA;AACT;AAGO,SAAS,aAAA,CACd,KAAA,EACA,iBAAA,GAAoB,KAAA,EACb;AACP,EAAA,MAAM,IAAA,GAAO,WAAW,KAAK,CAAA;AAC7B,EAAA,MAAM,OAAA,GAAU,aAAa,IAAI,CAAA;AACjC,EAAA,MAAM,IAAA,GAAO,cAAc,OAAO,CAAA;AAClC,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAChC,EAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,IAAA,MAAM,CAAA,GAAI,OAAO,CAAC,CAAA;AAClB,IAAA,IAAI,CAAA,CAAE,SAAS,CAAA,EAAG;AAClB,IAAA,IAAI,UAAA,GAAa,EAAA;AACjB,IAAA,IAAI,UAAA,GAAa,EAAA;AACjB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,MAAA,MAAM,CAAA,GAAI,EAAE,CAAC,CAAA;AACb,MAAA,MAAM,CAAA,GAAI,CAAA,CAAA,CAAG,CAAA,GAAI,CAAA,IAAK,CAAC,CAAA;AACvB,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,CAAA,EAAG,CAAC,CAAA;AACnB,MAAA,IAAI,IAAI,UAAA,EAAY;AAClB,QAAA,UAAA,GAAa,CAAA;AACb,QAAA,UAAA,GAAa,OAAA,CAAQ,GAAG,CAAC,CAAA;AAAA,MAC3B;AAAA,IACF;AACA,IAAA,IAAI,cAAc,EAAE,iBAAA,IAAqB,IAAA,CAAK,GAAA,CAAI,UAAU,CAAA,CAAA,EAAI;AAC9D,MAAA,OAAA,CAAQ,IAAI,UAAU,CAAA;AAAA,IACxB;AAAA,EACF;AACA,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,KAAA,MAAW,GAAA,IAAO,OAAA,CAAQ,IAAA,EAAK,EAAG;AAChC,IAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA,EAAG,IAAA,CAAK,IAAI,GAAG,CAAA;AAAA,EACrC;AACA,EAAA,OAAO,KAAA,CAAM,kBAAA,CAAmB,IAAA,EAAM,IAAI,CAAC,CAAA;AAC7C;AAGO,SAAS,YAAA,CACd,KAAA,EACA,iBAAA,GAAoB,KAAA,EACb;AACP,EAAA,MAAM,IAAA,GAAO,WAAW,KAAK,CAAA;AAC7B,EAAA,MAAM,GAAA,GAAM,SAAS,KAAK,CAAA;AAC1B,EAAA,OAAO,KAAA;AAAA,IACL,eAAA;AAAA,MACE,IAAA;AAAA,MACA,CAAC,CAAA,EAAG,CAAA,KAAM,SAAA,CAAU,CAAA,EAAG,GAAG,GAAG,CAAA;AAAA,MAC7B;AAAA;AACF,GACF;AACF;AAGO,SAAS,qBAAA,CACd,KAAA,EACA,iBAAA,GAAoB,KAAA,EACb;AACP,EAAA,MAAM,IAAA,GAAO,WAAW,KAAK,CAAA;AAC7B,EAAA,MAAM,GAAA,GAAM,SAAS,KAAK,CAAA;AAC1B,EAAA,OAAO,KAAA;AAAA,IACL,eAAA;AAAA,MACE,IAAA;AAAA,MACA,CAAC,CAAA,EAAG,CAAA,KAAM,kBAAA,CAAmB,CAAA,EAAG,GAAG,GAAG,CAAA;AAAA,MACtC;AAAA;AACF,GACF;AACF;AAMO,SAAS,YAAA,CACd,KAAA,EACA,CAAA,GAAI,CAAA,EACJ,oBAAoB,KAAA,EACb;AACP,EAAA,MAAM,IAAA,GAAO,WAAW,KAAK,CAAA;AAC7B,EAAA,MAAM,OAAA,GAAU,aAAa,IAAI,CAAA;AACjC,EAAA,MAAM,IAAA,GAAO,cAAc,OAAO,CAAA;AAClC,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAC,CAAA;AAC7B,EAAA,MAAM,KAAA,GAAQ,CAAC,GAAG,OAAA,CAAQ,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,CAAC,CAAA,MAAO;AAAA,IACtD,GAAA;AAAA,IACA,GAAG,CAAA,CAAE,CAAA;AAAA,IACL,GAAG,CAAA,CAAE,CAAA;AAAA,IACL,GAAA,EAAK,IAAA,CAAK,CAAA,CAAE,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,IAClB,IAAA,EAAM,IAAA,CAAK,GAAA,CAAI,GAAG;AAAA,GACpB,CAAE,CAAA;AACF,EAAA,KAAA,CAAM,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,GAAA,GAAM,EAAE,GAAG,CAAA;AAElC,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAyC;AACzD,EAAA,MAAM,IAAA,GAAO,CAAC,CAAA,EAAS,CAAA,EAAS,CAAA,KAAc;AAC5C,IAAA,MAAM,EAAA,GAAK,QAAQ,CAAC,CAAA;AACpB,IAAA,MAAM,EAAA,GAAK,QAAQ,CAAC,CAAA;AACpB,IAAA,IAAI,CAAC,IAAI,GAAA,CAAI,EAAE,GAAG,GAAA,CAAI,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAChC,IAAA,IAAI,CAAC,IAAI,GAAA,CAAI,EAAE,GAAG,GAAA,CAAI,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAChC,IAAA,GAAA,CAAI,GAAA,CAAI,EAAE,CAAA,CAAG,IAAA,CAAK,EAAE,EAAA,EAAI,EAAA,EAAI,GAAG,CAAA;AAC/B,IAAA,GAAA,CAAI,GAAA,CAAI,EAAE,CAAA,CAAG,IAAA,CAAK,EAAE,EAAA,EAAI,EAAA,EAAI,GAAG,CAAA;AAAA,EACjC,CAAA;AACA,EAAA,MAAM,QAAA,GAAW,CAAC,IAAA,EAAY,EAAA,KAAqB;AACjD,IAAA,MAAM,KAAA,GAAQ,QAAQ,IAAI,CAAA;AAC1B,IAAA,MAAM,IAAA,GAAO,QAAQ,EAAE,CAAA;AACvB,IAAA,MAAM,OAAA,uBAAc,GAAA,CAAoB,CAAC,CAAC,KAAA,EAAO,CAAC,CAAC,CAAC,CAAA;AACpD,IAAA,MAAM,KAAiC,CAAC,EAAE,GAAG,KAAA,EAAO,CAAA,EAAG,GAAG,CAAA;AAC1D,IAAA,OAAO,GAAG,MAAA,EAAQ;AAChB,MAAA,EAAA,CAAG,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,CAAA,GAAI,EAAE,CAAC,CAAA;AAC3B,MAAA,MAAM,GAAA,GAAM,GAAG,KAAA,EAAM;AACrB,MAAA,IAAI,GAAA,CAAI,CAAA,KAAM,IAAA,EAAM,OAAO,GAAA,CAAI,CAAA;AAC/B,MAAA,IAAI,IAAI,CAAA,IAAK,OAAA,CAAQ,IAAI,GAAA,CAAI,CAAC,KAAK,QAAA,CAAA,EAAW;AAC9C,MAAA,KAAA,MAAW,KAAK,GAAA,CAAI,GAAA,CAAI,IAAI,CAAC,CAAA,IAAK,EAAC,EAAG;AACpC,QAAA,MAAM,EAAA,GAAK,GAAA,CAAI,CAAA,GAAI,CAAA,CAAE,CAAA;AACrB,QAAA,IAAI,MAAM,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,EAAE,KAAK,QAAA,CAAA,EAAW;AACxC,UAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,EAAE,CAAA;AACpB,UAAA,EAAA,CAAG,KAAK,EAAE,CAAA,EAAG,EAAE,EAAA,EAAI,CAAA,EAAG,IAAI,CAAA;AAAA,QAC5B;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO,QAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,IAAI,CAAA,CAAE,QAAQ,iBAAA,EAAmB;AAC/B,MAAA,IAAA,CAAK,GAAA,CAAI,EAAE,GAAG,CAAA;AACd,MAAA,IAAA,CAAK,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,EAAE,GAAG,CAAA;AACpB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,CAAA,CAAE,CAAA,EAAG,EAAE,CAAC,CAAA;AACjC,IAAA,IAAI,OAAA,GAAU,OAAA,GAAU,CAAA,CAAE,GAAA,GAAM,IAAA,EAAM;AACpC,MAAA,IAAA,CAAK,GAAA,CAAI,EAAE,GAAG,CAAA;AACd,MAAA,IAAA,CAAK,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,EAAE,GAAG,CAAA;AAAA,IACtB,CAAA,MAAA,IAAW,EAAE,IAAA,EAAM;AAEjB,MAAA,IAAA,CAAK,GAAA,CAAI,EAAE,GAAG,CAAA;AACd,MAAA,IAAA,CAAK,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,EAAE,GAAG,CAAA;AAAA,IACtB;AAAA,EACF;AACA,EAAA,OAAO,KAAA,CAAM,kBAAA,CAAmB,IAAA,EAAM,IAAI,CAAC,CAAA;AAC7C;AAMO,SAAS,UAAU,KAAA,EAAsB;AAC9C,EAAA,IAAI,MAAM,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA,CAAM,EAAE,CAAA;AACvC,EAAA,MAAM,OAAA,GAAU,aAAa,KAAK,CAAA;AAClC,EAAA,MAAM,IAAA,GAAO,cAAc,OAAO,CAAA;AAClC,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAY;AAClC,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AACzB,IAAA,SAAA,CAAU,GAAA,CAAI,OAAA,CAAQ,CAAA,CAAE,CAAC,CAAC,CAAA;AAC1B,IAAA,SAAA,CAAU,GAAA,CAAI,OAAA,CAAQ,CAAA,CAAE,CAAC,CAAC,CAAA;AAAA,EAC5B;AAGA,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAoD;AACzE,EAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG,EAAA,KAAO;AACvB,IAAA,MAAM,CAAA,GAAI,SAAS,CAAC,CAAA;AACpB,IAAA,KAAA,MAAW,CAAA,IAAK,MAAA,CAAO,CAAC,CAAA,EAAG;AACzB,MAAA,MAAM,CAAA,GAAI,QAAQ,CAAC,CAAA;AACnB,MAAA,IAAI,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,EAAG;AACtB,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,GAAA,CAAI,CAAC,KAAK,EAAC;AACjC,MAAA,IAAA,CAAK,KAAK,EAAE,EAAA,EAAI,GAAA,EAAK,IAAA,CAAK,MAAM,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,EAAG,EAAE,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,EAAG,GAAG,CAAA;AAC1D,MAAA,QAAA,CAAS,GAAA,CAAI,GAAG,IAAI,CAAA;AAAA,IACtB;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,MAAc,EAAC;AACrB,EAAA,KAAA,MAAW,IAAA,IAAQ,QAAA,CAAS,MAAA,EAAO,EAAG;AACpC,IAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AAErB,IAAA,MAAM,MAAA,uBAAa,GAAA,EAA8B;AACjD,IAAA,KAAA,MAAW,QAAQ,IAAA,EAAM,MAAA,CAAO,GAAA,CAAI,IAAA,CAAK,IAAI,IAAI,CAAA;AACjD,IAAA,MAAM,UAAA,GAAa,CAAC,GAAG,MAAA,CAAO,QAAQ,CAAA;AACtC,IAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AAC3B,IAAA,UAAA,CAAW,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,GAAA,GAAM,EAAE,GAAG,CAAA;AACvC,IAAA,MAAM,IAAA,GAAO,UAAA,CAAW,GAAA,CAAI,CAAC,IAAA,KAAS,SAAS,KAAA,CAAM,IAAA,CAAK,EAAE,CAAE,CAAC,CAAA;AAC/D,IAAA,GAAA,CAAI,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAC,CAAA;AAAA,EACxB;AACA,EAAA,OAAO,MAAM,GAAG,CAAA;AAClB;AAMA,SAAS,SAAS,CAAA,EAAoC;AACpD,EAAA,MAAM,CAAA,GAAI,OAAO,CAAC,CAAA;AAClB,EAAA,IAAI,CAAA,CAAE,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA;AACzB,EAAA,OAAO,CAAC,EAAE,CAAC,CAAA,EAAI,EAAE,CAAC,CAAA,EAAI,CAAA,CAAE,CAAC,CAAE,CAAA;AAC7B;AAGA,SAAS,YAAY,KAAA,EAAkC;AACrD,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAkB;AACnC,EAAA,MAAM,OAAA,GAAU,aAAa,KAAK,CAAA;AAClC,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,CAAC,CAAA,IAAK,OAAA,EAAS;AAC9B,IAAA,IAAA,CAAK,IAAI,GAAA,EAAK,GAAA,CAAI,EAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAC,CAAA;AAAA,EAC7B;AACA,EAAA,OAAO,IAAA;AACT;AAMO,SAAS,uBAAA,CACd,KAAA,EACA,iBAAA,GAAoB,IAAA,EACb;AACP,EAAA,MAAM,IAAA,GAAO,WAAW,KAAK,CAAA;AAC7B,EAAA,MAAM,OAAA,GAAU,aAAa,IAAI,CAAA;AACjC,EAAA,MAAM,UAAU,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,QAAA,CAAS,CAAC,CAAC,CAAA;AAC3C,EAAA,MAAM,MAAc,EAAC;AACrB,EAAA,MAAM,IAAA,GAAO,cAAc,OAAO,CAAA;AAElC,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,CAAC,CAAA,IAAK,OAAA,EAAS;AAC9B,IAAA,MAAM,MAAM,CAAA,CAAE,OAAA;AACd,IAAA,IAAI,GAAA,CAAI,WAAW,CAAA,EAAG;AACpB,MAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAE,CAAA;AAC1B,MAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAE,CAAA;AAC1B,MAAA,GAAA,CAAI,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA,CAAE,CAAA,EAAG,IAAI,CAAA,CAAE,CAAA,EAAG,EAAE,CAAC,CAAC,CAAA;AAAA,IACtC,CAAA,MAAA,IAAW,GAAA,CAAI,MAAA,KAAW,CAAA,IAAK,iBAAA,EAAmB;AAChD,MAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAE,CAAA;AAC1B,MAAA,GAAA,CAAI,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAE,GAAG,CAAA,CAAE,CAAA,EAAG,EAAE,CAAC,CAAC,CAAA;AAAA,IAClC,CAAA,MAAA,IAAW,IAAI,MAAA,KAAW,CAAA,IAAK,CAAC,iBAAA,IAAqB,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG;AAEpE,EACF;AACA,EAAA,OAAO,MAAM,GAAG,CAAA;AAClB;AAMO,SAAS,qBAAqB,KAAA,EAA+B;AAClE,EAAA,MAAM,IAAA,GAAO,WAAW,KAAK,CAAA;AAC7B,EAAA,MAAM,IAAA,GAAO,YAAY,IAAI,CAAA;AAC7B,EAAA,MAAM,MAAc,EAAC;AACrB,EAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,IAAA,MAAM,CAAA,GAAI,SAAS,CAAC,CAAA;AACpB,IAAA,IAAI,CAAC,CAAA,EAAG;AACR,IAAA,MAAM,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,GAAI,CAAA;AAClB,IAAA,MAAM,CAAA,GAAI,SAAS,CAAC,CAAA;AACpB,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,CAAA,EAAG,CAAC,CAAC,CAAA,IAAK,GAAA,CAAI,CAAA,EAAG,CAAC,CAAA;AAC/C,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,CAAA,EAAG,CAAC,CAAC,CAAA,IAAK,GAAA,CAAI,CAAA,EAAG,CAAC,CAAA;AAC/C,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,CAAA,EAAG,CAAC,CAAC,CAAA,IAAK,GAAA,CAAI,CAAA,EAAG,CAAC,CAAA;AAC/C,IAAA,GAAA,CAAI,IAAA,CAAK,QAAQ,CAAC,CAAA,EAAG,KAAK,CAAA,EAAG,GAAG,CAAC,CAAC,CAAA;AAClC,IAAA,GAAA,CAAI,IAAA,CAAK,QAAQ,CAAC,CAAA,EAAG,KAAK,CAAA,EAAG,GAAG,CAAC,CAAC,CAAA;AAClC,IAAA,GAAA,CAAI,IAAA,CAAK,QAAQ,CAAC,CAAA,EAAG,KAAK,CAAA,EAAG,GAAG,CAAC,CAAC,CAAA;AAAA,EACpC;AACA,EAAA,OAAO,MAAM,GAAG,CAAA;AAClB;AAMO,SAAS,2BAAA,CACd,KAAA,EACA,iBAAA,GAAoB,IAAA,EACb;AACP,EAAA,MAAM,IAAA,GAAO,WAAW,KAAK,CAAA;AAC7B,EAAA,MAAM,OAAA,GAAU,aAAa,IAAI,CAAA;AACjC,EAAA,MAAM,aACJ,EAAC;AACH,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,CAAC,CAAA,IAAK,OAAA,EAAS;AAC9B,IAAA,IAAI,CAAA,CAAE,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AAC5B,IAAA,MAAM,CAAC,CAAA,EAAG,CAAC,CAAA,GAAI,CAAA,CAAE,OAAA;AACjB,IAAA,MAAM,IAAA,GAAO,YAAA,CAAa,IAAA,CAAK,CAAE,CAAA,EAAI,IAAA,CAAK,CAAE,CAAA,EAAI,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA;AACxD,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,UAAA,CAAW,IAAA,CAAK;AAAA,MACd,GAAA;AAAA,MACA,GAAG,CAAA,CAAE,CAAA;AAAA,MACL,GAAG,CAAA,CAAE,CAAA;AAAA,MACL,CAAA;AAAA,MACA,CAAA;AAAA,MACA,CAAA,EAAG,YAAY,IAAI;AAAA,KACpB,CAAA;AAAA,EACH;AACA,EAAA,UAAA,CAAW,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,CAAA,GAAI,EAAE,CAAC,CAAA;AAEnC,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,MAAM,MAAc,EAAC;AACrB,EAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAC1B,IAAA,IAAI,IAAA,CAAK,IAAI,CAAA,CAAE,CAAC,KAAK,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,CAAC,CAAA,EAAG;AACpC,IAAA,MAAM,IAAA,GAAO,YAAA,CAAa,IAAA,CAAK,CAAA,CAAE,CAAC,CAAA,EAAI,IAAA,CAAK,CAAA,CAAE,CAAC,CAAA,EAAI,CAAA,CAAE,CAAA,EAAG,EAAE,CAAC,CAAA;AAC1D,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,GAAA,CAAI,KAAK,IAAI,CAAA;AACb,IAAA,IAAA,CAAK,GAAA,CAAI,EAAE,CAAC,CAAA;AACZ,IAAA,IAAA,CAAK,GAAA,CAAI,EAAE,CAAC,CAAA;AAAA,EACd;AACA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG;AACjB,IAAA,IAAI,iBAAA,EAAmB,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,CAAC,CAAE,CAAA;AAAA,EAC1C;AACA,EAAA,OAAO,MAAM,GAAG,CAAA;AAClB;AAMO,SAAS,wBAAwB,KAAA,EAA+B;AACrE,EAAA,OAAO,2BAAA,CAA4B,OAAO,IAAI,CAAA;AAChD;AAEA,SAAS,YAAA,CACP,EAAA,EACA,EAAA,EACA,EAAA,EACA,EAAA,EACa;AACb,EAAA,MAAM,IAAA,GAAO,cAAA,CAAe,EAAA,EAAI,EAAA,EAAI,EAAE,CAAA;AACtC,EAAA,MAAM,IAAA,GAAO,cAAA,CAAe,EAAA,EAAI,EAAA,EAAI,EAAE,CAAA;AACtC,EAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,IAAA,EAAM,OAAO,IAAA;AAE3B,EAAA,OAAO,QAAQ,CAAC,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,EAAE,CAAC,CAAA;AACrC;AAEA,SAAS,cAAA,CAAe,CAAA,EAAS,EAAA,EAAU,EAAA,EAAuB;AAChE,EAAA,KAAA,MAAW,CAAA,IAAK,MAAA,CAAO,CAAC,CAAA,EAAG;AACzB,IAAA,IAAI,CAAC,IAAA,CAAK,CAAA,EAAG,EAAE,CAAA,IAAK,CAAC,IAAA,CAAK,CAAA,EAAG,EAAE,CAAA,EAAG,OAAO,CAAA;AAAA,EAC3C;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,YAAY,CAAA,EAAiB;AACpC,EAAA,MAAM,CAAA,GAAI,OAAO,CAAC,CAAA;AAClB,EAAA,IAAI,CAAA,CAAE,MAAA,GAAS,CAAA,EAAG,OAAO,CAAA;AAEzB,EAAA,MAAM,OAAiB,EAAC;AACxB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,IAAA,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,CAAA,CAAE,CAAC,CAAA,EAAI,GAAG,CAAA,GAAI,CAAA,IAAK,CAAC,CAAE,CAAC,CAAA;AAAA,EACxC;AACA,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,GAAG,IAAI,CAAA;AAC7B,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,GAAG,IAAI,CAAA;AAC7B,EAAA,IAAI,IAAA,GAAO,OAAO,OAAO,CAAA;AACzB,EAAA,OAAO,IAAA,GAAO,IAAA;AAChB;AAKO,SAAS,sBAAsB,MAAA,EAAuB;AAC3D,EAAA,IAAI,OAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA,CAAM,EAAE,CAAA;AACtC,EAAA,MAAM,GAAA,GAAM,OAAO,MAAM,CAAA;AACzB,EAAA,MAAM,EAAA,GAAK,GAAA,CAAI,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAA,CAAE,CAAA,EAAG,CAAC,CAAA,GAAI,GAAA,CAAI,MAAA;AAClD,EAAA,MAAM,EAAA,GAAK,GAAA,CAAI,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAA,CAAE,CAAA,EAAG,CAAC,CAAA,GAAI,GAAA,CAAI,MAAA;AAGlD,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IAC/B,CAAA;AAAA,IACA,GAAA,EAAK,KAAK,KAAA,CAAM,CAAA,CAAE,IAAI,EAAA,EAAI,CAAA,CAAE,IAAI,EAAE,CAAA;AAAA,IAClC,GAAA,EAAK,KAAK,KAAA,CAAM,CAAA,CAAE,IAAI,EAAA,EAAI,CAAA,CAAE,IAAI,EAAE;AAAA,GACpC,CAAE,CAAA;AACF,EAAA,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,GAAA,GAAM,CAAA,CAAE,GAAA,IAAO,CAAA,CAAE,GAAA,GAAM,CAAA,CAAE,GAAG,CAAA;AAEtD,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,MAAM,CAAC,CAAC,CAAA;AAC9D,EAAA,MAAM,KAAA,GAAkB,MAAM,IAAA,CAAK,EAAE,QAAQ,SAAA,EAAU,EAAG,MAAM,EAAE,CAAA;AAClE,EAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,IAAA,EAAM,CAAA,KAAM;AAC5B,IAAA,MAAM,KAAK,IAAA,CAAK,GAAA;AAAA,MACd,SAAA,GAAY,CAAA;AAAA,MACZ,IAAA,CAAK,KAAA,CAAO,CAAA,GAAI,QAAA,CAAS,SAAU,SAAS;AAAA,KAC9C;AACA,IAAA,KAAA,CAAM,EAAE,CAAA,CAAG,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA;AAAA,EACxB,CAAC,CAAA;AACD,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAA,CAAK,IAAA;AAAA,MACH,CAAC,CAAA,EAAG,CAAA,KACF,KAAK,KAAA,CAAM,CAAA,CAAE,IAAI,EAAA,EAAI,CAAA,CAAE,IAAI,EAAE,CAAA,GAAI,KAAK,KAAA,CAAM,CAAA,CAAE,IAAI,EAAA,EAAI,CAAA,CAAE,IAAI,EAAE;AAAA,KAClE;AAAA,EACF;AAEA,EAAA,MAAM,MAAc,EAAC;AACrB,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAA,GAAS,GAAG,CAAA,EAAA,EAAK;AACzC,IAAA,MAAM,KAAA,GAAQ,MAAM,CAAC,CAAA;AACrB,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA;AACzB,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,IAAK,KAAA,CAAM,WAAW,CAAA,EAAG;AAC9C,IAAA,MAAM,IAAI,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,MAAA,EAAQ,MAAM,MAAM,CAAA;AAC7C,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,MAAA,MAAM,CAAA,GAAI,KAAA,CAAM,CAAA,GAAI,KAAA,CAAM,MAAM,CAAA;AAChC,MAAA,MAAM,CAAA,GAAI,KAAA,CAAA,CAAO,CAAA,GAAI,CAAA,IAAK,MAAM,MAAM,CAAA;AACtC,MAAA,MAAM,CAAA,GAAI,KAAA,CAAA,CAAO,CAAA,GAAI,CAAA,IAAK,MAAM,MAAM,CAAA;AACtC,MAAA,MAAM,CAAA,GAAI,KAAA,CAAM,CAAA,GAAI,KAAA,CAAM,MAAM,CAAA;AAEhC,MAAA,MAAM,QAAQ,MAAA,CAAO,CAAC,GAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAC,CAAA;AACjC,MAAA,IAAI,MAAM,MAAA,IAAU,CAAA,EAAG,GAAA,CAAI,IAAA,CAAK,QAAQ,KAAA,CAAM,MAAA,KAAW,CAAA,GAAI,KAAA,GAAQ,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAC,CAAC,CAAA;AAAA,IACpF;AAAA,EACF;AACA,EAAA,OAAO,MAAM,GAAG,CAAA;AAClB;AAMA,SAAS,mBAAmB,KAAA,EAI1B;AACA,EAAA,MAAM,OAAA,GAAU,aAAa,KAAK,CAAA;AAClC,EAAA,MAAM,IAAA,GAAO,cAAc,OAAO,CAAA;AAClC,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAY;AAClC,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AACzB,IAAA,SAAA,CAAU,GAAA,CAAI,OAAA,CAAQ,CAAA,CAAE,CAAC,CAAC,CAAA;AAC1B,IAAA,SAAA,CAAU,GAAA,CAAI,OAAA,CAAQ,CAAA,CAAE,CAAC,CAAC,CAAA;AAAA,EAC5B;AACA,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAkB;AACxC,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAyB;AAC/C,EAAA,MAAM,IAAA,GAAO,CAAC,CAAA,EAAS,CAAA,KAAY;AACjC,IAAA,MAAM,EAAA,GAAK,QAAQ,CAAC,CAAA;AACpB,IAAA,MAAM,EAAA,GAAK,QAAQ,CAAC,CAAA;AACpB,IAAA,SAAA,CAAU,GAAA,CAAI,EAAA,EAAI,EAAE,GAAG,GAAG,CAAA;AAC1B,IAAA,SAAA,CAAU,GAAA,CAAI,EAAA,EAAI,EAAE,GAAG,GAAG,CAAA;AAC1B,IAAA,IAAI,CAAC,SAAA,CAAU,GAAA,CAAI,EAAE,CAAA,YAAa,GAAA,CAAI,EAAA,kBAAI,IAAI,GAAA,EAAK,CAAA;AACnD,IAAA,IAAI,CAAC,SAAA,CAAU,GAAA,CAAI,EAAE,CAAA,YAAa,GAAA,CAAI,EAAA,kBAAI,IAAI,GAAA,EAAK,CAAA;AACnD,IAAA,SAAA,CAAU,GAAA,CAAI,EAAE,CAAA,CAAG,GAAA,CAAI,EAAE,CAAA;AACzB,IAAA,SAAA,CAAU,GAAA,CAAI,EAAE,CAAA,CAAG,GAAA,CAAI,EAAE,CAAA;AAAA,EAC3B,CAAA;AACA,EAAA,KAAA,MAAW,CAAA,IAAK,QAAQ,MAAA,EAAO,OAAQ,CAAA,CAAE,CAAA,EAAG,EAAE,CAAC,CAAA;AAC/C,EAAA,OAAO,EAAE,SAAA,EAAW,SAAA,EAAW,SAAA,EAAU;AAC3C;AAEA,SAAS,UAAA,CACP,OACA,SAAA,EACQ;AACR,EAAA,OAAO,KAAA,CAAM,GAAA;AAAA,IAAI,CAAC,CAAA,KAChB,OAAA;AAAA,MACE,MAAA,CAAO,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM;AACnB,QAAA,MAAM,CAAA,GAAI,SAAA,CAAU,GAAA,CAAI,OAAA,CAAQ,CAAC,CAAC,CAAA;AAClC,QAAA,OAAO,IAAI,EAAE,GAAG,GAAE,GAAI,EAAE,GAAG,CAAA,EAAE;AAAA,MAC/B,CAAC,CAAA;AAAA,MACD,CAAA,CAAE,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA,CAAE,GAAA;AAAA,QAAI,CAAC,CAAA,KACpB,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM;AACX,UAAA,MAAM,CAAA,GAAI,SAAA,CAAU,GAAA,CAAI,OAAA,CAAQ,CAAC,CAAC,CAAA;AAClC,UAAA,OAAO,IAAI,EAAE,GAAG,GAAE,GAAI,EAAE,GAAG,CAAA,EAAE;AAAA,QAC/B,CAAC;AAAA;AACH;AACF,GACF;AACF;AAGO,SAAS,UAAA,CACd,KAAA,EACA,kBAAA,EACA,iBAAA,GAAoB,IAAA,EACb;AACP,EAAA,IAAI,MAAM,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA,CAAM,EAAE,CAAA;AACvC,EAAA,IAAI,EAAE,SAAA,EAAW,SAAA,EAAW,SAAA,EAAU,GAAI,mBAAmB,KAAK,CAAA;AAClE,EAAA,MAAM,UACJ,kBAAA,IAAsB,CAAA,IAAK,OAAO,SAAA,CAAU,kBAAkB,IAC1D,kBAAA,GACA,GAAA;AACN,EAAA,MAAM,MAAA,GACJ,kBAAA,GAAqB,CAAA,IAAK,kBAAA,GAAqB,IAC3C,kBAAA,GACA,CAAA;AAEN,EAAA,KAAA,IAAS,IAAA,GAAO,CAAA,EAAG,IAAA,GAAO,OAAA,EAAS,IAAA,EAAA,EAAQ;AACzC,IAAA,MAAM,IAAA,uBAAW,GAAA,EAAkB;AACnC,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,CAAA,IAAK,SAAA,EAAW;AAC9B,MAAA,IAAI,iBAAA,IAAqB,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,EAAG;AACzC,QAAA,IAAA,CAAK,GAAA,CAAI,GAAG,CAAC,CAAA;AACb,QAAA;AAAA,MACF;AACA,MAAA,MAAM,IAAA,GAAO,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA;AAC5B,MAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,IAAA,KAAS,CAAA,EAAG;AAC5B,QAAA,IAAA,CAAK,GAAA,CAAI,GAAG,CAAC,CAAA;AACb,QAAA;AAAA,MACF;AACA,MAAA,IAAI,EAAA,GAAK,CAAA;AACT,MAAA,IAAI,EAAA,GAAK,CAAA;AACT,MAAA,KAAA,MAAW,MAAM,IAAA,EAAM;AACrB,QAAA,MAAM,CAAA,GAAI,SAAA,CAAU,GAAA,CAAI,EAAE,CAAA;AAC1B,QAAA,EAAA,IAAM,CAAA,CAAE,CAAA;AACR,QAAA,EAAA,IAAM,CAAA,CAAE,CAAA;AAAA,MACV;AACA,MAAA,MAAM,EAAA,GAAK,EAAE,CAAA,EAAG,EAAA,GAAK,KAAK,IAAA,EAAM,CAAA,EAAG,EAAA,GAAK,IAAA,CAAK,IAAA,EAAK;AAClD,MAAA,OAAA,GAAU,KAAK,GAAA,CAAI,OAAA,EAAS,IAAA,CAAK,CAAA,EAAG,EAAE,CAAC,CAAA;AACvC,MAAA,IAAA,CAAK,GAAA,CAAI,GAAG,EAAE,CAAA;AAAA,IAChB;AACA,IAAA,SAAA,GAAY,IAAA;AACZ,IAAA,IAAI,MAAA,GAAS,CAAA,IAAK,OAAA,GAAU,MAAA,EAAQ;AAAA,EACtC;AACA,EAAA,OAAO,KAAA,CAAM,UAAA,CAAW,KAAA,EAAO,SAAS,CAAC,CAAA;AAC3C;AAMO,SAAS,aAAA,CACd,KAAA,EACA,cAAA,GAAiB,GAAA,EACV;AACP,EAAA,MAAM,CAAA,GAAI,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,cAAc,CAAC,CAAA;AACjD,EAAA,MAAM,MAAc,EAAC;AACrB,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,MAAM,IAAA,GAAO,OAAO,CAAC,CAAA;AACrB,IAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACrB,IAAA,MAAM,CAAA,GAAI,SAAS,CAAC,CAAA;AACpB,IAAA,MAAM,IAAI,IAAA,CAAK,MAAA;AACf,IAAA,MAAM,SAAiB,EAAC;AACxB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,MAAA,MAAM,CAAA,GAAI,KAAK,CAAC,CAAA;AAChB,MAAA,MAAM,CAAA,GAAI,IAAA,CAAA,CAAM,CAAA,GAAI,CAAA,IAAK,CAAC,CAAA;AAC1B,MAAA,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,CAAA,EAAG,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,IAC3B;AACA,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,MAAA,MAAM,CAAA,GAAI,KAAK,CAAC,CAAA;AAChB,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAA,CAAQ,CAAA,GAAI,CAAA,GAAI,KAAK,CAAC,CAAA;AACpC,MAAA,MAAM,KAAA,GAAQ,OAAO,CAAC,CAAA;AACtB,MAAA,GAAA,CAAI,IAAA,CAAK,QAAQ,CAAC,CAAA,EAAG,OAAO,CAAA,EAAG,KAAK,CAAC,CAAC,CAAA;AAAA,IACxC;AAAA,EACF;AACA,EAAA,OAAO,MAAM,GAAG,CAAA;AAClB;AAMO,SAAS,YAAA,CACd,KAAA,EACA,SAAA,EACA,iBAAA,GAAoB,IAAA,EACb;AACP,EAAA,IAAI,SAAA,IAAa,KAAK,KAAA,CAAM,MAAA,KAAW,GAAG,OAAO,KAAA,CAAM,MAAM,GAAA,CAAI,CAAC,MAAM,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,CAAE,MAAM,KAAA,CAAM,CAAC,CAAC,CAAC,CAAC,CAAA;AAC7G,EAAA,MAAM,OAAA,GAAU,aAAa,KAAK,CAAA;AAClC,EAAA,MAAM,IAAA,GAAO,cAAc,OAAO,CAAA;AAIlC,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM;AAClC,IAAA,MAAM,IAAA,GAAO,OAAO,CAAC,CAAA;AACrB,IAAA,IAAI,IAAA,CAAK,MAAA,IAAU,CAAA,EAAG,OAAO,QAAQ,IAAI,CAAA;AACzC,IAAA,IAAI,iBAAA,EAAmB;AAErB,MAAA,MAAM,CAAA,GAAI,QAAA,CAAa,CAAA,EAAG,SAAS,CAAA;AACnC,MAAA,MAAM,EAAA,GAAK,OAAO,CAAC,CAAA;AACnB,MAAA,IAAI,EAAA,CAAG,MAAA,GAAS,CAAA,EAAG,OAAO,QAAQ,IAAI,CAAA;AACtC,MAAA,OAAO,QAAQ,EAAA,EAAI,CAAA,CAAE,KAAA,CAAM,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,IACrC;AACA,IAAA,OAAO,QAAA,CAAa,GAAG,SAAS,CAAA;AAAA,EAClC,CAAC,CAAA;AAGD,EAAA,MAAM,GAAA,GAAM,OAAO,UAAA,CAAW,OAAA,CAAQ,CAAC,CAAA,KAAM,MAAA,CAAO,CAAC,CAAC,CAAC,CAAA;AACvD,EAAA,MAAM,OAAA,GAAU,YAAY,GAAA,EAAK,IAAA,CAAK,IAAI,SAAA,GAAY,GAAA,EAAK,IAAI,CAAC,CAAA;AAChE,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAkB;AAC/B,IAAA,IAAI,IAAA,GAAO,CAAA;AACX,IAAA,IAAI,KAAA,GAAQ,QAAA;AACZ,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,CAAA,EAAG,CAAC,CAAA;AACnB,MAAA,IAAI,IAAI,KAAA,EAAO;AACb,QAAA,KAAA,GAAQ,CAAA;AACR,QAAA,IAAA,GAAO,CAAA;AAAA,MACT;AAAA,IACF;AACA,IAAA,OAAO,EAAE,GAAG,IAAA,EAAK;AAAA,EACnB,CAAA;AAEA,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAY;AAClC,EAAA,IAAI,iBAAA,EAAmB;AACrB,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AACzB,MAAA,SAAA,CAAU,GAAA,CAAI,OAAA,CAAQ,CAAA,CAAE,CAAC,CAAC,CAAA;AAC1B,MAAA,SAAA,CAAU,GAAA,CAAI,OAAA,CAAQ,CAAA,CAAE,CAAC,CAAC,CAAA;AAAA,IAC5B;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AAAA,IACL,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM;AACvB,MAAA,MAAM,QAAA,GAAW,MAAA,CAAO,KAAA,CAAM,CAAC,CAAE,CAAA;AACjC,MAAA,MAAM,OAAO,MAAA,CAAO,CAAC,EAAE,GAAA,CAAI,CAAC,GAAG,EAAA,KAAO;AACpC,QAAA,IAAI,iBAAA,IAAqB,QAAA,CAAS,EAAE,CAAA,IAAK,SAAA,CAAU,GAAA,CAAI,OAAA,CAAQ,QAAA,CAAS,EAAE,CAAE,CAAC,CAAA,EAAG;AAC9E,UAAA,OAAO,EAAE,GAAG,QAAA,CAAS,EAAE,CAAA,EAAG;AAAA,QAC5B;AAEA,QAAA,KAAA,MAAW,MAAM,QAAA,EAAU;AACzB,UAAA,IAAI,SAAA,CAAU,GAAA,CAAI,OAAA,CAAQ,EAAE,CAAC,CAAA,IAAK,IAAA,CAAK,CAAA,EAAG,EAAE,CAAA,GAAI,SAAA,GAAY,CAAA,EAAG;AAC7D,YAAA,OAAO,EAAE,GAAG,EAAA,EAAG;AAAA,UACjB;AAAA,QACF;AACA,QAAA,OAAO,MAAM,CAAC,CAAA;AAAA,MAChB,CAAC,CAAA;AACD,MAAA,OAAO,QAAQ,MAAA,CAAO,IAAI,EAAE,MAAA,IAAU,CAAA,GAAI,OAAO,QAAQ,CAAA;AAAA,IAC3D,CAAC;AAAA,GACH;AACF;AAEA,SAAS,WAAA,CAAY,QAAgB,GAAA,EAAqB;AACxD,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,IAAI,KAAA,GAAQ,KAAA;AACZ,IAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,MAAA,IAAI,KAAK,CAAA,EAAG,CAAA,CAAE,CAAC,CAAE,KAAK,GAAA,EAAK;AACzB,QAAA,CAAA,CAAE,KAAK,CAAC,CAAA;AACR,QAAA,KAAA,GAAQ,IAAA;AACR,QAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAI,CAAC,KAAA,EAAO,QAAA,CAAS,IAAA,CAAK,CAAC,CAAC,CAAC,CAAA;AAAA,EAC/B;AACA,EAAA,OAAO,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IAC1B,CAAA,EAAG,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAA,CAAE,CAAA,EAAG,CAAC,CAAA,GAAI,CAAA,CAAE,MAAA;AAAA,IACtC,CAAA,EAAG,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAA,CAAE,CAAA,EAAG,CAAC,CAAA,GAAI,CAAA,CAAE;AAAA,GACxC,CAAE,CAAA;AACJ;AAGO,SAAS,eAAA,CACd,KAAA,EACA,QAAA,EACA,IAAA,GAAO,CAAA,EACA;AACP,EAAA,IAAI,MAAM,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA,CAAM,EAAE,CAAA;AACvC,EAAA,MAAM,UAAU,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAC,CAAA;AAChD,EAAA,MAAM,GAAA,GAAM,UAAA,CAAW,IAAA,KAAS,CAAC,CAAA;AACjC,EAAA,MAAM,KAAA,GAAQ,MAAM,GAAA,CAAI,MAAM,KAAK,KAAA,CAAM,GAAA,EAAI,GAAI,OAAO,CAAC,CAAA;AACzD,EAAA,MAAM,GAAA,GAAM,cAAc,KAAK,CAAA;AAC/B,EAAA,MAAM,SAAS,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,EAAG,MAAM,CAAC,CAAA;AACpC,EAAA,MAAM,IAAA,GAAO,CAAC,CAAA,KAAsB;AAClC,IAAA,IAAI,CAAA,GAAI,CAAA;AACR,IAAA,OAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,EAAG;AACtB,MAAA,MAAA,CAAO,CAAC,CAAA,GAAI,MAAA,CAAO,MAAA,CAAO,CAAC,CAAE,CAAA;AAC7B,MAAA,CAAA,GAAI,OAAO,CAAC,CAAA;AAAA,IACd;AACA,IAAA,OAAO,CAAA;AAAA,EACT,CAAA;AACA,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,EAAW,CAAA,KAAc;AACtC,IAAA,MAAM,EAAA,GAAK,KAAK,CAAC,CAAA;AACjB,IAAA,MAAM,EAAA,GAAK,KAAK,CAAC,CAAA;AACjB,IAAA,IAAI,EAAA,KAAO,EAAA,EAAI,MAAA,CAAO,EAAE,CAAA,GAAI,EAAA;AAAA,EAC9B,CAAA;AACA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,KAAA,MAAW,CAAA,IAAK,GAAA,CAAI,CAAC,CAAA,EAAI;AACvB,MAAA,IAAI,CAAA,GAAI,CAAA,IAAK,KAAA,CAAM,CAAC,CAAA,KAAM,MAAM,CAAC,CAAA,EAAG,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AAAA,IAChD;AAAA,EACF;AACA,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAsB;AACxC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,CAAA,GAAI,KAAK,CAAC,CAAA;AAChB,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,GAAA,CAAI,CAAC,KAAK,EAAC;AAC9B,IAAA,IAAA,CAAK,KAAK,CAAC,CAAA;AACX,IAAA,KAAA,CAAM,GAAA,CAAI,GAAG,IAAI,CAAA;AAAA,EACnB;AACA,EAAA,MAAM,MAAc,EAAC;AACrB,EAAA,KAAA,MAAW,OAAA,IAAW,KAAA,CAAM,MAAA,EAAO,EAAG;AACpC,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,MAAA,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAE,CAAE,CAAA;AAC5B,MAAA;AAAA,IACF;AACA,IAAA,MAAM,MAAA,GAAS,cAAc,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,KAAA,CAAM,CAAC,CAAE,CAAC,CAAA;AAC1D,IAAA,GAAA,CAAI,IAAA,CAAK,GAAG,MAAM,CAAA;AAAA,EACpB;AACA,EAAA,OAAO,MAAM,GAAG,CAAA;AAClB;AAEA,SAAS,cAAc,KAAA,EAAuB;AAC5C,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AAChC,EAAA,IAAI,MAAM,MAAA,KAAW,CAAA,SAAU,CAAC,KAAA,CAAM,CAAC,CAAE,CAAA;AACzC,EAAA,IAAI;AACF,IAAA,IAAI,GAAA,GAAM,MAAM,CAAC,CAAA;AACjB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,MAAA,MAAM,CAAA,GAAI,KAAA,CAAM,GAAA,EAAK,KAAA,CAAM,CAAC,CAAE,CAAA;AAC9B,MAAA,IAAI,CAAA,CAAE,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AAE1B,MAAA,GAAA,GAAM,EAAE,KAAA,CAAM,MAAA;AAAA,QAAO,CAAC,MAAM,CAAA,KAC1B,IAAA,CAAK,CAAC,CAAA,GAAI,IAAA,CAAK,IAAI,CAAA,GAAI,CAAA,GAAI;AAAA,OAC7B;AAAA,IACF;AACA,IAAA,OAAO,CAAC,GAAG,CAAA;AAAA,EACb,CAAA,CAAA,MAAQ;AAEN,IAAA,OAAO,CAAC,YAAA,CAAa,KAAA,CAAM,OAAA,CAAQ,CAAC,MAAM,MAAA,CAAO,CAAC,CAAC,CAAC,CAAC,CAAA;AAAA,EACvD;AACF;AAMO,SAAS,SAAA,CACd,OACA,gBAAA,EACO;AACP,EAAA,IAAI,OAAA,GAAU,CAAC,GAAG,KAAK,CAAA;AACvB,EAAA,IAAI,QAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA,CAAM,EAAE,CAAA;AAEzC,EAAA,IAAI,OAAO,gBAAA,KAAqB,QAAA,IAAY,gBAAA,CAAiB,kBAAkB,IAAA,EAAM;AACnF,IAAA,MAAM,MAAA,GAAS,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,gBAAA,CAAiB,cAAc,CAAC,CAAA;AACtE,IAAA,OAAO,OAAA,CAAQ,SAAS,MAAA,EAAQ;AAC9B,MAAA,MAAM,IAAA,GAAO,sBAAsB,OAAO,CAAA;AAC1C,MAAA,IAAI,IAAA,CAAK,MAAA,IAAU,OAAA,CAAQ,MAAA,EAAQ;AACnC,MAAA,OAAA,GAAU,IAAA;AAAA,IACZ;AACA,IAAA,OAAO,MAAM,OAAO,CAAA;AAAA,EACtB;AAEA,EAAA,MAAM,UACJ,OAAO,gBAAA,KAAqB,QAAA,GACxB,gBAAA,GACC,iBAAiB,OAAA,IAAW,CAAA;AAEnC,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,OAAO,KAAA,EAAA,GAAU,OAAA,CAAQ,MAAA,GAAS,EAAA,EAAI;AACpC,IAAA,MAAM,QAAA,GAAW,QAAQ,SAAA,CAAU,CAAC,MAAM,IAAA,CAAK,CAAC,IAAI,OAAO,CAAA;AAC3D,IAAA,IAAI,WAAW,CAAA,EAAG;AAClB,IAAA,MAAM,IAAA,GAAO,qBAAA,CAAsB,OAAA,EAAS,QAAQ,CAAA;AACpD,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,OAAA,GAAU,IAAA;AAAA,EACZ;AACA,EAAA,OAAO,MAAM,OAAO,CAAA;AACtB;AAEA,SAAS,sBAAsB,KAAA,EAAuB;AACpD,EAAA,IAAI,IAAA,GAAO,EAAA;AACX,EAAA,IAAI,KAAA,GAAQ,QAAA;AACZ,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAC,CAAE,CAAA;AACxB,IAAA,IAAI,IAAI,KAAA,EAAO;AACb,MAAA,KAAA,GAAQ,CAAA;AACR,MAAA,IAAA,GAAO,CAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,IAAI,IAAA,GAAO,GAAG,OAAO,KAAA;AACrB,EAAA,OAAO,qBAAA,CAAsB,KAAA,EAAO,IAAI,CAAA,IAAK,KAAA;AAC/C;AAEA,SAAS,qBAAA,CACP,OACA,GAAA,EACe;AACf,EAAA,MAAM,GAAA,GAAM,cAAc,KAAK,CAAA;AAC/B,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,GAAG,CAAA,IAAK,EAAC;AAC1B,EAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AAErB,IAAA,OAAO,MAAM,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,MAAM,GAAG,CAAA;AAAA,EACzC;AAEA,EAAA,IAAI,KAAA,GAAQ,KAAK,CAAC,CAAA;AAClB,EAAA,IAAI,KAAA,GAAQ,EAAA;AACZ,EAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAC,CAAE,CAAA;AACxB,IAAA,IAAI,IAAI,KAAA,EAAO;AACb,MAAA,KAAA,GAAQ,CAAA;AACR,MAAA,KAAA,GAAQ,CAAA;AAAA,IACV;AAAA,EACF;AACA,EAAA,MAAM,MAAA,GAAS,cAAc,CAAC,KAAA,CAAM,GAAG,CAAA,EAAI,KAAA,CAAM,KAAK,CAAE,CAAC,CAAA;AACzD,EAAA,MAAM,MAAc,EAAC;AACrB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,IAAI,CAAA,KAAM,GAAA,IAAO,CAAA,KAAM,KAAA,EAAO;AAC9B,IAAA,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,CAAC,CAAE,CAAA;AAAA,EACpB;AACA,EAAA,GAAA,CAAI,IAAA,CAAK,GAAG,MAAM,CAAA;AAClB,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,aAAa,MAAA,EAAsB;AAC1C,EAAA,MAAM,GAAA,GAAM,OAAO,MAAM,CAAA;AACzB,EAAA,IAAI,GAAA,CAAI,MAAA,GAAS,CAAA,EAAG,OAAO,QAAQ,GAAG,CAAA;AACtC,EAAA,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAO,EAAE,CAAA,KAAM,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,IAAI,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,EAAE,CAAE,CAAA;AACxD,EAAA,MAAM,QAAgB,EAAC;AACvB,EAAA,KAAA,MAAW,KAAK,GAAA,EAAK;AACnB,IAAA,OACE,MAAM,MAAA,IAAU,CAAA,IAChB,KAAA,CAAM,KAAA,CAAM,MAAM,MAAA,GAAS,CAAC,CAAA,EAAI,KAAA,CAAM,MAAM,MAAA,GAAS,CAAC,CAAA,EAAI,CAAC,KAAK,CAAA,EAChE;AACA,MAAA,KAAA,CAAM,GAAA,EAAI;AAAA,IACZ;AACA,IAAA,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,EACd;AACA,EAAA,MAAM,QAAgB,EAAC;AACvB,EAAA,KAAA,IAAS,IAAI,GAAA,CAAI,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACxC,IAAA,MAAM,CAAA,GAAI,IAAI,CAAC,CAAA;AACf,IAAA,OACE,MAAM,MAAA,IAAU,CAAA,IAChB,KAAA,CAAM,KAAA,CAAM,MAAM,MAAA,GAAS,CAAC,CAAA,EAAI,KAAA,CAAM,MAAM,MAAA,GAAS,CAAC,CAAA,EAAI,CAAC,KAAK,CAAA,EAChE;AACA,MAAA,KAAA,CAAM,GAAA,EAAI;AAAA,IACZ;AACA,IAAA,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,EACd;AACA,EAAA,KAAA,CAAM,GAAA,EAAI;AACV,EAAA,KAAA,CAAM,GAAA,EAAI;AACV,EAAA,OAAO,QAAQ,CAAC,GAAG,KAAA,EAAO,GAAG,KAAK,CAAC,CAAA;AACrC;AAEA,SAAS,WAAW,CAAA,EAAyB;AAC3C,EAAA,OAAO,MAAM;AACX,IAAA,CAAA,IAAK,CAAA;AACL,IAAA,CAAA,GAAK,IAAI,UAAA,GAAc,CAAA;AACvB,IAAA,IAAI,IAAI,IAAA,CAAK,IAAA,CAAK,IAAK,CAAA,KAAM,EAAA,EAAK,IAAI,CAAC,CAAA;AACvC,IAAA,CAAA,GAAK,CAAA,GAAI,KAAK,IAAA,CAAK,CAAA,GAAK,MAAM,CAAA,EAAI,EAAA,GAAK,CAAC,CAAA,GAAK,CAAA;AAC7C,IAAA,OAAA,CAAA,CAAS,CAAA,GAAK,CAAA,KAAM,EAAA,MAAS,CAAA,IAAK,UAAA;AAAA,EACpC,CAAA;AACF;AAUO,SAAS,WAAW,KAAA,EAAsB;AAC/C,EAAA,MAAM,OAAA,GAAU,aAAa,KAAK,CAAA;AAClC,EAAA,MAAM,OAAe,EAAC;AAEtB,EAAA,MAAM,OAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,CAAA,IAAK,OAAA,CAAQ,MAAA,EAAO,EAAG;AAChC,IAAA,IAAI,EAAE,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,EACzC;AACA,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG;AACjB,IAAA,MAAM,CAAA,GAAI,KAAK,CAAC,CAAA;AAChB,IAAA,KAAA,IAAS,IAAI,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACxC,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG;AACjB,MAAA,MAAM,CAAA,GAAI,KAAK,CAAC,CAAA;AAChB,MAAA,IAAI,iBAAA,CAAkB,CAAA,EAAG,CAAA,EAAG,IAAI,CAAA,EAAG;AACjC,QAAA,IAAA,CAAK,IAAA,CAAK,SAAS,CAAC,CAAA,CAAE,GAAG,CAAA,CAAE,CAAC,CAAC,CAAC,CAAA;AAC9B,QAAA,IAAA,CAAK,IAAA,CAAK,SAAS,CAAC,CAAA,CAAE,GAAG,CAAA,CAAE,CAAC,CAAC,CAAC,CAAA;AAC9B,QAAA,IAAA,CAAK,IAAI,CAAC,CAAA;AACV,QAAA,IAAA,CAAK,IAAI,CAAC,CAAA;AACV,QAAA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,MAAM,IAAI,CAAA;AACnB;AAEA,SAAS,iBAAA,CAAkB,CAAA,EAAY,CAAA,EAAY,GAAA,EAAsB;AACvE,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,GAAI,IAAA,CAAK,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA;AACzC,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,GAAI,IAAA,CAAK,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA;AACzC,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,CAAA,CAAE,CAAA,EAAG,EAAE,CAAC,CAAA;AACzB,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA,GAAI,GAAA,GAAM,CAAA,GAAI,GAAA,GAAM,IAAA,IAAQ,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA;AACvE;AAMO,SAAS,SAAA,CAAU,OAAe,WAAA,EAA4B;AACnE,EAAA,IAAI,MAAM,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA,CAAM,EAAE,CAAA;AACvC,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,WAAA,EAAa,IAAI,CAAA;AACtC,EAAA,MAAM,KAAA,GAAQ,OAAO,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,KAAM,MAAA,CAAO,CAAC,CAAC,CAAC,CAAA;AACpD,EAAA,MAAM,OAAA,GAAU,WAAA,CAAY,KAAA,EAAO,GAAG,CAAA;AACtC,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAkB;AAC/B,IAAA,IAAI,IAAA,GAAO,QAAQ,CAAC,CAAA;AACpB,IAAA,IAAI,KAAA,GAAQ,QAAA;AACZ,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,CAAA,EAAG,CAAC,CAAA;AACnB,MAAA,IAAI,IAAI,KAAA,EAAO;AACb,QAAA,KAAA,GAAQ,CAAA;AACR,QAAA,IAAA,GAAO,CAAA;AAAA,MACT;AAAA,IACF;AACA,IAAA,OAAO,EAAE,GAAG,IAAA,EAAK;AAAA,EACnB,CAAA;AACA,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM;AAC7B,IAAA,MAAM,OAAO,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,CAAE,GAAA,CAAI,KAAK,CAAC,CAAA;AACxC,IAAA,OAAO,IAAA,CAAK,MAAA,IAAU,CAAA,GAAI,OAAA,CAAQ,IAAI,CAAA,GAAI,CAAA;AAAA,EAC5C,CAAC,CAAA;AAED,EAAA,IAAI;AACF,IAAA,OAAO,KAAA,CAAM,gBAAA,CAAiB,KAAK,CAAC,CAAA;AAAA,EACtC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,MAAM,KAAK,CAAA;AAAA,EACpB;AACF;AAEA,SAAS,iBAAiB,KAAA,EAAuB;AAE/C,EAAA,IAAI,OAAA,GAAU,CAAC,GAAG,KAAK,CAAA;AACvB,EAAA,IAAI,OAAA,GAAU,IAAA;AACd,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,OAAO,OAAA,IAAW,KAAA,EAAA,GAAU,OAAA,CAAQ,MAAA,EAAQ;AAC1C,IAAA,OAAA,GAAU,KAAA;AACV,IAAA,KAAA,WAAgB,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AAC9C,MAAA,KAAA,IAAS,IAAI,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AAC3C,QAAA,MAAM,CAAA,GAAI,QAAQ,CAAC,CAAA;AACnB,QAAA,MAAM,CAAA,GAAI,QAAQ,CAAC,CAAA;AACnB,QAAA,MAAM,CAAA,GAAI,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AACpB,QAAA,MAAM,EAAA,GAAK,CAAA,CAAE,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,IAAA,CAAK,CAAC,CAAA,EAAG,CAAC,CAAA;AAClD,QAAA,IAAI,KAAK,IAAA,CAAK,CAAC,IAAI,IAAA,CAAK,CAAC,IAAI,IAAA,EAAM;AAEjC,UAAA,MAAM,IAAA,GAAO,QAAQ,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,KAAM,CAAA,IAAK,CAAA,KAAM,CAAC,CAAA;AACxD,UAAA,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,CAAE,KAAK,CAAA;AACpB,UAAA,OAAA,GAAU,IAAA;AACV,UAAA,OAAA,GAAU,IAAA;AACV,UAAA,MAAM,KAAA;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,OAAA;AACT;AAMO,SAAS,cAAA,CACd,QAAA,EACA,SAAA,EACA,UAAA,GAAa,IAAA,EACN;AACP,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,SAAA,EAAW,IAAI,CAAA;AAEpC,EAAA,MAAM,UAAkB,EAAC;AACzB,EAAA,MAAM,YAAwD,EAAC;AAE/D,EAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAA,EAAG,EAAA,KAAO;AAC1B,IAAA,MAAM,IAAA,GAAO,OAAO,CAAC,CAAA;AACrB,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACvB,IAAA,IAAI,EAAE,MAAA,EAAQ;AACZ,MAAA,KAAA,MAAW,CAAA,IAAK,IAAA,EAAM,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA;AAAA,IACtC,CAAA,MAAO;AACL,MAAA,SAAA,CAAU,IAAA,CAAK,EAAE,OAAA,EAAS,EAAA,EAAI,GAAA,EAAK,GAAG,CAAA,EAAG,IAAA,CAAK,CAAC,CAAA,EAAI,CAAA;AACnD,MAAA,SAAA,CAAU,IAAA,CAAK;AAAA,QACb,OAAA,EAAS,EAAA;AAAA,QACT,GAAA,EAAK,CAAA;AAAA,QACL,CAAA,EAAG,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,CAAC;AAAA,OACxB,CAAA;AAAA,IACH;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,WAAA,GAAc,WAAA;AAAA,IAClB,CAAC,GAAG,OAAA,EAAS,GAAG,SAAA,CAAU,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,CAAC,CAAC,CAAA;AAAA,IACzC;AAAA,GACF;AAEA,EAAA,MAAM,MAAA,GAAS,CAAC,CAAA,EAAS,YAAA,KAAgC;AAEvD,IAAA,IAAI,IAAA,GAAO,CAAA;AACX,IAAA,IAAI,KAAA,GAAQ,QAAA;AACZ,IAAA,KAAA,MAAW,KAAK,WAAA,EAAa;AAC3B,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,CAAA,EAAG,CAAC,CAAA;AACnB,MAAA,IAAI,CAAA,IAAK,GAAA,IAAO,CAAA,GAAI,KAAA,EAAO;AACzB,QAAA,KAAA,GAAQ,CAAA;AACR,QAAA,IAAA,GAAO,CAAA;AAAA,MACT;AAAA,IACF;AACA,IAAkB;AAChB,MAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,QAAA,IAAI,IAAA,CAAK,GAAG,CAAC,CAAA,IAAK,KAAK,OAAO,EAAE,GAAG,CAAA,EAAE;AAAA,MACvC;AAAA,IACF;AACA,IAAA,OAAO,EAAE,GAAG,IAAA,EAAK;AAAA,EACnB,CAAA;AAEA,EAAA,MAAM,YAAA,GAAe,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM;AACvC,IAAA,MAAM,IAAA,GAAO,OAAO,CAAC,CAAA;AACrB,IAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,CAAA;AAC9B,IAAA,IAAI,CAAA,CAAE,QAAQ,OAAO,CAAA;AACrB,IAAA,MAAM,IAAA,GAAO,KAAK,GAAA,CAAI,CAAC,OAAO,EAAE,GAAG,GAAE,CAAE,CAAA;AACvC,IAAA,IAAA,CAAK,CAAC,CAAA,GAAI,MAAA,CAAO,IAAA,CAAK,CAAC,CAAQ,CAAA;AAC/B,IAAA,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,GAAI,MAAA,CAAO,KAAK,IAAA,CAAK,MAAA,GAAS,CAAC,CAAQ,CAAA;AAC3D,IAAA,OAAO,SAAS,IAAI,CAAA;AAAA,EACtB,CAAC,CAAA;AAED,EAAA,IAAI,CAAC,UAAA,EAAY,OAAO,KAAA,CAAM,YAAY,CAAA;AAG1C,EAAA,MAAM,MAAc,EAAC;AACrB,EAAA,KAAA,MAAW,KAAK,YAAA,EAAc;AAC5B,IAAA,MAAM,IAAA,GAAO,OAAO,CAAC,CAAA;AACrB,IAAA,IAAI,EAAE,MAAA,EAAQ;AACZ,MAAA,GAAA,CAAI,KAAK,CAAC,CAAA;AACV,MAAA;AAAA,IACF;AACA,IAAA,IAAI,IAAA,CAAK,MAAA,IAAU,CAAA,IAAK,IAAA,CAAK,KAAK,CAAC,CAAA,EAAI,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,EAAI,GAAA,GAAM,CAAC,CAAA,EAAG;AACvE,MAAA,GAAA,CAAI,KAAK,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA,EAAG,EAAE,CAAC,CAAC,CAAA;AAAA,IACrC,CAAA,MAAA,IAAW,IAAA,CAAK,MAAA,IAAU,CAAA,IAAK,KAAK,IAAA,CAAK,CAAC,CAAA,EAAI,IAAA,CAAK,KAAK,MAAA,GAAS,CAAC,CAAE,CAAA,IAAK,MAAM,CAAA,EAAG;AAChF,MAAA,GAAA,CAAI,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAC,CAAA;AAAA,IACxB,CAAA,MAAO;AACL,MAAA,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA,IACZ;AAAA,EACF;AACA,EAAA,OAAO,MAAM,GAAG,CAAA;AAClB;AAGO,SAAS,YAAY,KAAA,EAAwB;AAClD,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AAChC,EAAA,MAAM,GAAA,GAAM,cAAc,KAAK,CAAA;AAC/B,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,MAAM,UAAsB,EAAC;AAC7B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG;AACjB,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAC,CAAA;AAChB,IAAA,MAAM,UAAoB,EAAC;AAC3B,IAAA,IAAA,CAAK,IAAI,CAAC,CAAA;AACV,IAAA,OAAO,MAAM,MAAA,EAAQ;AACnB,MAAA,MAAM,GAAA,GAAM,MAAM,GAAA,EAAI;AACtB,MAAA,OAAA,CAAQ,KAAK,GAAG,CAAA;AAChB,MAAA,KAAA,MAAW,CAAA,IAAK,GAAA,CAAI,GAAG,CAAA,EAAI;AACzB,QAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG;AAChB,UAAA,IAAA,CAAK,IAAI,CAAC,CAAA;AACV,UAAA,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,QACd;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAA,CAAQ,KAAK,OAAO,CAAA;AAAA,EACtB;AACA,EAAA,OAAA,CAAQ,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,MAAA,GAAS,EAAE,MAAM,CAAA;AAC1C,EAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,KAAA,CAAM,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,KAAA,CAAM,CAAC,CAAE,CAAC,CAAC,CAAA;AAC1D;AAOO,SAAS,gBAAgB,KAAA,EAAuB;AACrD,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AAChC,EAAA,MAAM,KAAK,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,QAAA,CAAS,CAAC,CAAC,CAAA;AACvC,EAAA,MAAM,EAAA,GAAK,EAAA,CAAG,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAA,CAAE,CAAA,EAAG,CAAC,CAAA,GAAI,EAAA,CAAG,MAAA;AAChD,EAAA,MAAM,EAAA,GAAK,EAAA,CAAG,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAA,CAAE,CAAA,EAAG,CAAC,CAAA,GAAI,EAAA,CAAG,MAAA;AAChD,EAAA,OAAO,MACJ,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,MAAO,EAAE,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,GAAG,CAAC,CAAA,CAAG,CAAA,GAAI,EAAA,EAAI,GAAG,CAAC,CAAA,CAAG,CAAA,GAAI,EAAE,GAAE,CAAE,CAAA,CAClE,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,CACxB,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,CAAC,CAAA;AACnB;AAGO,SAAS,kBAAkB,KAAA,EAAuB;AACvD,EAAA,OAAO,CAAC,GAAG,KAAK,EAAE,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM;AAC/B,IAAA,MAAM,EAAA,GAAK,SAAS,CAAC,CAAA;AACrB,IAAA,MAAM,EAAA,GAAK,SAAS,CAAC,CAAA;AACrB,IAAA,OAAO,EAAA,CAAG,CAAA,KAAM,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,IAAI,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,CAAA;AAAA,EACjD,CAAC,CAAA;AACH;AAEO,IAAM,OAAA,GAAU;AAAA,EACrB,iBAAA;AAAA,EACA,oBAAA;AAAA,EACA,kBAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA,qBAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA,uBAAA;AAAA,EACA,2BAAA;AAAA,EACA,oBAAA;AAAA,EACA,qBAAA;AAAA,EACA,uBAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA,eAAA;AAAA,EACA,SAAA;AAAA,EACA,eAAA;AAAA,EACA,iBAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF","file":"index.js","sourcesContent":["/** 2D point / vector. */\nexport type Vec2 = {\n x: number\n y: number\n}\n\nexport function vec2(x: number, y: number): Vec2 {\n return { x, y }\n}\n\nexport function cloneVec2(v: Vec2): Vec2 {\n return { x: v.x, y: v.y }\n}\n\nexport function equalsVec2(a: Vec2, b: Vec2, eps = 1e-9): boolean {\n return Math.abs(a.x - b.x) <= eps && Math.abs(a.y - b.y) <= eps\n}\n","import type { Vec2 } from './vec2.js'\n\n/** Line segment between two points. */\nexport type Segment = {\n a: Vec2\n b: Vec2\n}\n\nexport function segment(a: Vec2, b: Vec2): Segment {\n return { a, b }\n}\n","import type { Vec2 } from './vec2.js'\nimport { cloneVec2, equalsVec2 } from './vec2.js'\n\n/** Ordered ring of vertices (typically without repeating the closing vertex). */\nexport type Ring = Vec2[]\n\n/**\n * A path: one exterior ring plus optional holes, or an open polyline.\n * `rings[0]` is the exterior (or the open polyline when `closed` is false).\n * Additional rings are holes (only meaningful when `closed` is true).\n */\nexport type Path = {\n rings: Ring[]\n closed: boolean\n}\n\nexport function path(rings: Ring[], closed = true): Path {\n return {\n rings: rings.map((ring) => ring.map(cloneVec2)),\n closed,\n }\n}\n\nexport function polyline(points: Ring): Path {\n return path([points], false)\n}\n\nexport function polygon(exterior: Ring, holes: Ring[] = []): Path {\n return path([exterior, ...holes], true)\n}\n\n/** Drop a trailing vertex that duplicates the first (SVG often closes this way). */\nexport function normalizeRing(ring: Ring, eps = 1e-9): Ring {\n if (ring.length < 2) return ring.map(cloneVec2)\n const first = ring[0]\n const last = ring[ring.length - 1]\n if (first && last && equalsVec2(first, last, eps)) {\n return ring.slice(0, -1).map(cloneVec2)\n }\n return ring.map(cloneVec2)\n}\n\nexport function clonePath(p: Path): Path {\n return {\n closed: p.closed,\n rings: p.rings.map((ring) => ring.map(cloneVec2)),\n }\n}\n","import type { Path } from './path.js'\nimport { clonePath } from './path.js'\n\n/**\n * Ordered collection of paths. Later entries are “on top” for occlusion-style ops.\n */\nexport type Group = {\n paths: Path[]\n}\n\nexport function group(paths: Path[] = []): Group {\n return { paths: paths.map(clonePath) }\n}\n\nexport function groupFromPaths(...paths: Path[]): Group {\n return group(paths)\n}\n\nexport function cloneGroup(g: Group): Group {\n return group(g.paths)\n}\n","import {\n FillRule,\n areaD,\n differenceD,\n intersectD,\n isPositiveD,\n pointInPolygonD,\n PointInPolygonResult,\n unionD,\n xorD,\n type PathD,\n type PathsD,\n type PointD,\n} from 'clipper2-ts'\nimport type { Group, Path, Ring, Vec2 } from '../types/index.js'\nimport { group, normalizeRing, path, vec2 } from '../types/index.js'\n\nexport const DEFAULT_FILL_RULE = FillRule.NonZero\n\nexport function ringToPathD(ring: Ring): PathD {\n const pts: PointD[] = []\n for (const v of normalizeRing(ring)) {\n pts.push({ x: v.x, y: v.y, z: 0 })\n }\n return pts\n}\n\n/** Closed path → Clipper subject/clip paths (exterior + holes). */\nexport function pathToPathsD(p: Path): PathsD {\n if (!p.closed || p.rings.length === 0) {\n throw new Error('Boolean ops require a closed path with at least one ring')\n }\n return p.rings.map((ring) => ringToPathD(ring))\n}\n\nexport function pathsDToGroup(paths: PathsD): Group {\n if (paths.length === 0) return group([])\n\n const outers: { ring: Ring; holes: Ring[] }[] = []\n const holes: Ring[] = []\n\n for (const pd of paths) {\n const ring = pathDToRing(pd)\n if (ring.length < 3) continue\n if (isPositiveD(pd)) {\n outers.push({ ring, holes: [] })\n } else {\n holes.push(ring)\n }\n }\n\n for (const hole of holes) {\n const sample = hole[0]\n if (!sample) continue\n let assigned = false\n for (const outer of outers) {\n if (pointInRing(sample, outer.ring)) {\n outer.holes.push(hole)\n assigned = true\n break\n }\n }\n if (!assigned) {\n // Treat unmatched negative rings as their own outers (orientation flip).\n outers.push({ ring: [...hole].reverse(), holes: [] })\n }\n }\n\n return group(outers.map((o) => path([o.ring, ...o.holes], true)))\n}\n\nexport function pathDToRing(pd: PathD): Ring {\n return normalizeRing(pd.map((p) => vec2(p.x, p.y)))\n}\n\nexport function pointInRing(point: Vec2, ring: Ring): boolean {\n const result = pointInPolygonD(\n { x: point.x, y: point.y, z: 0 },\n ringToPathD(ring),\n )\n return (\n result === PointInPolygonResult.IsInside ||\n result === PointInPolygonResult.IsOn\n )\n}\n\nexport function clipUnion(a: PathsD, b: PathsD): PathsD {\n return unionD(a, b, DEFAULT_FILL_RULE)\n}\n\nexport function clipIntersect(a: PathsD, b: PathsD): PathsD {\n return intersectD(a, b, DEFAULT_FILL_RULE)\n}\n\nexport function clipDifference(a: PathsD, b: PathsD): PathsD {\n return differenceD(a, b, DEFAULT_FILL_RULE)\n}\n\nexport function clipXor(a: PathsD, b: PathsD): PathsD {\n return xorD(a, b, DEFAULT_FILL_RULE)\n}\n\nexport function pathsArea(paths: PathsD): number {\n let sum = 0\n for (const p of paths) {\n sum += Math.abs(areaD(p))\n }\n return sum\n}\n","import type { Group, Path, Vec2 } from '../types/index.js'\nimport { vec2 } from '../types/index.js'\nimport {\n pathToPathsD,\n pathsArea,\n pointInRing,\n} from '../clipper/convert.js'\n\n/** Signed area of a closed ring (shoelace). */\nexport function ringArea(ring: Vec2[]): number {\n if (ring.length < 3) return 0\n let sum = 0\n for (let i = 0; i < ring.length; i++) {\n const a = ring[i]!\n const b = ring[(i + 1) % ring.length]!\n sum += a.x * b.y - b.x * a.y\n }\n return sum / 2\n}\n\n/** Absolute area of a closed path (exterior minus holes). */\nexport function area(p: Path): number {\n if (!p.closed || p.rings.length === 0) return 0\n try {\n return pathsArea(pathToPathsD(p))\n } catch {\n let total = 0\n for (let i = 0; i < p.rings.length; i++) {\n const a = Math.abs(ringArea(p.rings[i]!))\n total += i === 0 ? a : -a\n }\n return Math.max(0, total)\n }\n}\n\nexport function areaGroup(g: Group): number {\n return g.paths.reduce((sum, p) => sum + area(p), 0)\n}\n\n/** Centroid of a closed exterior ring (ignores holes for Phase 2). */\nexport function centroid(p: Path): Vec2 {\n const ring = p.rings[0]\n if (!ring || ring.length === 0) return vec2(0, 0)\n const a = ringArea(ring)\n if (Math.abs(a) < 1e-12) {\n let sx = 0\n let sy = 0\n for (const v of ring) {\n sx += v.x\n sy += v.y\n }\n return vec2(sx / ring.length, sy / ring.length)\n }\n let cx = 0\n let cy = 0\n for (let i = 0; i < ring.length; i++) {\n const p0 = ring[i]!\n const p1 = ring[(i + 1) % ring.length]!\n const cross = p0.x * p1.y - p1.x * p0.y\n cx += (p0.x + p1.x) * cross\n cy += (p0.y + p1.y) * cross\n }\n return vec2(cx / (6 * a), cy / (6 * a))\n}\n\nexport function containsPoint(p: Path, point: Vec2): boolean {\n if (!p.closed || !p.rings[0]) return false\n if (!pointInRing(point, p.rings[0])) return false\n for (let i = 1; i < p.rings.length; i++) {\n const hole = p.rings[i]\n if (hole && pointInRing(point, hole)) return false\n }\n return true\n}\n\nexport function bounds(p: Path): {\n minX: number\n minY: number\n maxX: number\n maxY: number\n} {\n let minX = Infinity\n let minY = Infinity\n let maxX = -Infinity\n let maxY = -Infinity\n for (const ring of p.rings) {\n for (const v of ring) {\n minX = Math.min(minX, v.x)\n minY = Math.min(minY, v.y)\n maxX = Math.max(maxX, v.x)\n maxY = Math.max(maxY, v.y)\n }\n }\n if (!Number.isFinite(minX)) {\n return { minX: 0, minY: 0, maxX: 0, maxY: 0 }\n }\n return { minX, minY, maxX, maxY }\n}\n\nexport function width(p: Path): number {\n const b = bounds(p)\n return b.maxX - b.minX\n}\n\nexport function height(p: Path): number {\n const b = bounds(p)\n return b.maxY - b.minY\n}\n\n/** Rough polygon similarity via absolute area difference relative to max area. */\nexport function areaSimilarity(a: Path, b: Path): number {\n const aa = area(a)\n const bb = area(b)\n const denom = Math.max(aa, bb, 1e-12)\n return 1 - Math.abs(aa - bb) / denom\n}\n\nexport const predicates = {\n area,\n areaGroup,\n ringArea,\n centroid,\n containsPoint,\n bounds,\n width,\n height,\n areaSimilarity,\n}\n","import { triangulateD } from 'clipper2-ts'\nimport { Delaunay } from 'd3-delaunay'\nimport type { Path, Vec2 } from '../types/index.js'\nimport { polygon } from '../types/index.js'\nimport { pathToPathsD, pathDToRing } from '../clipper/convert.js'\nimport { bounds, containsPoint } from '../predicates/index.js'\nimport { poisson } from '../pointSet/index.js'\n\n/**\n * Triangulate a closed path into triangle polygons (Clipper2).\n * Holes are supported when present on the path. `useDelaunay` prefers\n * better-shaped triangles when Clipper can apply it.\n */\nexport function earCutTriangulation(\n p: Path,\n options: { useDelaunay?: boolean; precision?: number } = {},\n): Path[] {\n if (!p.closed || p.rings.length === 0) return []\n const { solution } = triangulateD(\n pathToPathsD(p),\n options.precision ?? 8,\n options.useDelaunay ?? false,\n )\n const tris: Path[] = []\n for (const pd of solution) {\n const ring = pathDToRing(pd)\n if (ring.length >= 3) tris.push(polygon(ring.slice(0, 3)))\n }\n return tris\n}\n\n/** Alias matching PGS naming for Clipper/Delaunay triangulation of a polygon. */\nexport function delaunayTriangulation(p: Path): Path[] {\n return earCutTriangulation(p, { useDelaunay: true })\n}\n\n/** Delaunay triangulation of a point set (d3-delaunay). */\nexport function delaunayTriangulationPoints(points: Vec2[]): Path[] {\n if (points.length < 3) return []\n const delaunay = Delaunay.from(\n points,\n (d) => d.x,\n (d) => d.y,\n )\n const tris: Path[] = []\n const { triangles } = delaunay\n for (let i = 0; i < triangles.length; i += 3) {\n const a = points[triangles[i]!]!\n const b = points[triangles[i + 1]!]!\n const c = points[triangles[i + 2]!]!\n tris.push(polygon([a, b, c]))\n }\n return tris\n}\n\n/**\n * Boundary vertices plus Poisson-disk Steiner points inside `path`.\n */\nexport function poissonTriangulationPoints(\n path: Path,\n minDistance: number,\n seed = 1,\n): Vec2[] {\n if (!path.closed || path.rings.length === 0) return []\n const b = bounds(path)\n const samples = poisson(\n minDistance,\n b.minX,\n b.minY,\n b.maxX,\n b.maxY,\n seed,\n ).filter((pt) => containsPoint(path, pt))\n return dedupePoints([...pathVertices(path), ...samples])\n}\n\n/**\n * Delaunay triangulation of a path with Poisson Steiner points inserted.\n * Triangles whose centroid falls outside the path (or in a hole) are dropped.\n */\nexport function poissonTriangulation(\n path: Path,\n minDistance: number,\n seed = 1,\n): Path[] {\n const pts = poissonTriangulationPoints(path, minDistance, seed)\n return trianglesInsidePath(delaunayTriangulationPoints(pts), path)\n}\n\nexport type RefineOptions = {\n /** Minimum allowed interior angle (radians). Default ≈ 20°. */\n minAngle?: number\n /** Safety cap on Steiner insertions. Default `200`. */\n maxIterations?: number\n}\n\n/**\n * Ruppert-inspired angle refinement for plotter meshes.\n * Clean-room approximation (not a full constrained CDT): insert circumcenters\n * of skinny triangles when they lie inside the path; otherwise split the\n * longest edge of that triangle (simple encroachment stand-in).\n */\nexport function refine(path: Path, options: RefineOptions = {}): Path[] {\n if (!path.closed || path.rings.length === 0) return []\n const minAngle = options.minAngle ?? (20 * Math.PI) / 180\n const maxIterations = Math.max(1, options.maxIterations ?? 200)\n const points = dedupePoints(pathVertices(path))\n if (points.length < 3) return []\n\n for (let iter = 0; iter < maxIterations; iter++) {\n const tris = trianglesInsidePath(\n delaunayTriangulationPoints(points),\n path,\n )\n if (tris.length === 0) break\n\n let skinny: Path | null = null\n let worst = minAngle\n for (const t of tris) {\n const a = minTriangleAngle(t)\n if (a < worst) {\n worst = a\n skinny = t\n }\n }\n if (!skinny) break\n\n const ring = skinny.rings[0]!\n const cc = circumcenter(ring[0]!, ring[1]!, ring[2]!)\n if (!cc) break\n\n const insert = containsPoint(path, cc)\n ? cc\n : longestEdgeMidpoint(ring[0]!, ring[1]!, ring[2]!)\n if (\n points.some((p) => Math.hypot(p.x - insert.x, p.y - insert.y) < 1e-9)\n ) {\n break\n }\n points.push(insert)\n }\n\n return trianglesInsidePath(delaunayTriangulationPoints(points), path)\n}\n\nfunction pathVertices(path: Path): Vec2[] {\n const out: Vec2[] = []\n for (const ring of path.rings) {\n for (const v of ring) out.push({ x: v.x, y: v.y })\n }\n return out\n}\n\nfunction dedupePoints(points: Vec2[], eps = 1e-9): Vec2[] {\n const out: Vec2[] = []\n for (const p of points) {\n if (out.some((q) => Math.hypot(q.x - p.x, q.y - p.y) < eps)) continue\n out.push(p)\n }\n return out\n}\n\nfunction triangleCentroid(t: Path): Vec2 | null {\n const r = t.rings[0]\n if (!r || r.length < 3) return null\n return {\n x: (r[0]!.x + r[1]!.x + r[2]!.x) / 3,\n y: (r[0]!.y + r[1]!.y + r[2]!.y) / 3,\n }\n}\n\nfunction trianglesInsidePath(tris: Path[], path: Path): Path[] {\n return tris.filter((t) => {\n const c = triangleCentroid(t)\n return c != null && containsPoint(path, c)\n })\n}\n\nfunction minTriangleAngle(t: Path): number {\n const r = t.rings[0]\n if (!r || r.length < 3) return 0\n const a = r[0]!\n const b = r[1]!\n const c = r[2]!\n return Math.min(angleAt(a, b, c), angleAt(b, c, a), angleAt(c, a, b))\n}\n\nfunction angleAt(vertex: Vec2, p: Vec2, q: Vec2): number {\n const ux = p.x - vertex.x\n const uy = p.y - vertex.y\n const vx = q.x - vertex.x\n const vy = q.y - vertex.y\n const lu = Math.hypot(ux, uy)\n const lv = Math.hypot(vx, vy)\n if (lu < 1e-18 || lv < 1e-18) return 0\n const cos = Math.max(-1, Math.min(1, (ux * vx + uy * vy) / (lu * lv)))\n return Math.acos(cos)\n}\n\nfunction circumcenter(a: Vec2, b: Vec2, c: Vec2): Vec2 | null {\n const d =\n 2 * (a.x * (b.y - c.y) + b.x * (c.y - a.y) + c.x * (a.y - b.y))\n if (Math.abs(d) < 1e-18) return null\n const a2 = a.x * a.x + a.y * a.y\n const b2 = b.x * b.x + b.y * b.y\n const c2 = c.x * c.x + c.y * c.y\n return {\n x: (a2 * (b.y - c.y) + b2 * (c.y - a.y) + c2 * (a.y - b.y)) / d,\n y: (a2 * (c.x - b.x) + b2 * (a.x - c.x) + c2 * (b.x - a.x)) / d,\n }\n}\n\nfunction longestEdgeMidpoint(a: Vec2, b: Vec2, c: Vec2): Vec2 {\n const edges: [Vec2, Vec2][] = [\n [a, b],\n [b, c],\n [c, a],\n ]\n let best = edges[0]!\n let bestLen = -1\n for (const e of edges) {\n const len = Math.hypot(e[0].x - e[1].x, e[0].y - e[1].y)\n if (len > bestLen) {\n bestLen = len\n best = e\n }\n }\n return { x: (best[0].x + best[1].x) / 2, y: (best[0].y + best[1].y) / 2 }\n}\n\nexport const triangulation = {\n earCutTriangulation,\n delaunayTriangulation,\n delaunayTriangulationPoints,\n poissonTriangulation,\n poissonTriangulationPoints,\n refine,\n}\n","import type { Group, Path } from '../types/index.js'\nimport { group, groupFromPaths, path, polygon, vec2 } from '../types/index.js'\nimport {\n clipDifference,\n clipIntersect,\n clipUnion,\n clipXor,\n pathToPathsD,\n pathsDToGroup,\n} from '../clipper/convert.js'\n\nfunction ensureClosed(p: Path): Path {\n if (!p.closed) {\n throw new Error('shapeBoolean requires closed paths')\n }\n return p\n}\n\n/** Union of two closed paths. */\nexport function union(a: Path, b: Path): Group {\n const result = clipUnion(pathToPathsD(ensureClosed(a)), pathToPathsD(ensureClosed(b)))\n return pathsDToGroup(result)\n}\n\n/** Union of many closed paths (folded left-to-right). */\nexport function unionAll(paths: Path[]): Group {\n if (paths.length === 0) return group([])\n let acc = pathToPathsD(ensureClosed(paths[0]!))\n for (let i = 1; i < paths.length; i++) {\n acc = clipUnion(acc, pathToPathsD(ensureClosed(paths[i]!)))\n }\n return pathsDToGroup(acc)\n}\n\n/** Intersection of two closed paths. */\nexport function intersect(a: Path, b: Path): Group {\n const result = clipIntersect(\n pathToPathsD(ensureClosed(a)),\n pathToPathsD(ensureClosed(b)),\n )\n return pathsDToGroup(result)\n}\n\n/** Subtract b from a (a \\ b). */\nexport function subtract(a: Path, b: Path): Group {\n const result = clipDifference(\n pathToPathsD(ensureClosed(a)),\n pathToPathsD(ensureClosed(b)),\n )\n return pathsDToGroup(result)\n}\n\n/** Subtract many shapes from a base. */\nexport function subtractAll(base: Path, shapes: Path[]): Group {\n let acc = pathToPathsD(ensureClosed(base))\n for (const s of shapes) {\n acc = clipDifference(acc, pathToPathsD(ensureClosed(s)))\n }\n return pathsDToGroup(acc)\n}\n\n/** Symmetric difference. */\nexport function symDifference(a: Path, b: Path): Group {\n const result = clipXor(pathToPathsD(ensureClosed(a)), pathToPathsD(ensureClosed(b)))\n return pathsDToGroup(result)\n}\n\n/** Complement of shape within axis-aligned rectangle [0,width] x [0,height]. */\nexport function complement(shape: Path, width: number, height: number): Group {\n const frame = polygon([\n vec2(0, 0),\n vec2(width, 0),\n vec2(width, height),\n vec2(0, height),\n ])\n return subtract(frame, shape)\n}\n\n/**\n * Painter-style occlusion: later paths in the group are on top.\n * Each path has higher paths subtracted from it; returns visible remainders.\n */\nexport function occlusionSubtract(g: Group): Group {\n const paths = g.paths\n const visible: Path[] = []\n for (let i = 0; i < paths.length; i++) {\n const subject = paths[i]\n if (!subject) continue\n const occluders = paths.slice(i + 1)\n const piece =\n occluders.length === 0\n ? groupFromPaths(ensureClosed(subject))\n : subtractAll(subject, occluders)\n for (const p of piece.paths) {\n visible.push(p)\n }\n }\n return group(visible)\n}\n\n/**\n * Regions covered by at least two input shapes.\n * If `merged`, collapse multi-overlaps into disjoint patches via union of pairwise intersects.\n */\nexport function overlapRegions(shapes: Path[], merged: boolean): Group {\n if (shapes.length < 2) return group([])\n const pairs: Path[] = []\n for (let i = 0; i < shapes.length; i++) {\n for (let j = i + 1; j < shapes.length; j++) {\n const a = shapes[i]\n const b = shapes[j]\n if (!a || !b) continue\n for (const p of intersect(a, b).paths) {\n pairs.push(p)\n }\n }\n }\n if (!merged) return group(pairs)\n return unionAll(pairs)\n}\n\nexport const shapeBoolean = {\n union,\n unionAll,\n intersect,\n subtract,\n subtractAll,\n symDifference,\n complement,\n occlusionSubtract,\n overlapRegions,\n}\n","import { simplifyPathD, minkowskiSumD, minkowskiDiffD } from 'clipper2-ts'\nimport type { Group, Path, Ring, Vec2 } from '../types/index.js'\nimport { path, normalizeRing } from '../types/index.js'\nimport { pathDToRing, ringToPathD, pathsDToGroup } from '../clipper/convert.js'\nimport { centroid } from '../predicates/index.js'\nimport { buffer, erosionDilation, dilationErosion } from './buffer.js'\n\nexport type { BufferOptions } from './buffer.js'\nexport { buffer, erosionDilation, dilationErosion } from './buffer.js'\n\n/**\n * Ramer–Douglas–Peucker simplify (Clipper2). `epsilon` is absolute distance.\n */\nexport function simplify(p: Path, epsilon: number): Path {\n if (epsilon <= 0 || p.rings.length === 0) return p\n const rings: Ring[] = []\n for (const ring of p.rings) {\n const simplified = simplifyPathD(ringToPathD(ring), epsilon, p.closed)\n const out = pathDToRing(simplified)\n if (out.length >= (p.closed ? 3 : 2)) rings.push(out)\n }\n if (rings.length === 0) return path([], p.closed)\n return path(rings, p.closed)\n}\n\n/** Round vertex coordinates to `decimals` places. */\nexport function reducePrecision(p: Path, decimals: number): Path {\n const f = 10 ** Math.max(0, Math.floor(decimals))\n const round = (n: number) => Math.round(n * f) / f\n return path(\n p.rings.map((ring) =>\n normalizeRing(ring.map((v) => ({ x: round(v.x), y: round(v.y) }))),\n ),\n p.closed,\n )\n}\n\n/**\n * Chaikin corner cutting. `iterations` ≥ 1; closed rings stay closed.\n * Ratio defaults to classic 1/4–3/4 cut.\n */\nexport function chaikinCut(p: Path, iterations = 1, ratio = 0.25): Path {\n const r = Math.min(0.49, Math.max(0.01, ratio))\n let rings = p.rings\n for (let i = 0; i < Math.max(1, Math.floor(iterations)); i++) {\n rings = rings.map((ring) => chaikinRing(ring, r, p.closed))\n }\n return path(rings, p.closed)\n}\n\n/** Alias: Chaikin smoothing for `iterations` passes. */\nexport function smooth(p: Path, iterations = 2): Path {\n return chaikinCut(p, iterations)\n}\n\n/** Radial displace from centroid: r' = r * (1 + amplitude * cos(freq * θ + phase)). */\nexport function radialWarp(\n p: Path,\n amplitude: number,\n frequency = 3,\n phase = 0,\n): Path {\n const c = centroid(p)\n return mapVerts(p, (v) => {\n const dx = v.x - c.x\n const dy = v.y - c.y\n const dist = Math.hypot(dx, dy)\n if (dist < 1e-12) return v\n const theta = Math.atan2(dy, dx)\n const s = 1 + amplitude * Math.cos(frequency * theta + phase)\n return { x: c.x + dx * s, y: c.y + dy * s }\n })\n}\n\n/** Sine warp along X: y' = y + amplitude * sin(2π * frequency * x + phase). */\nexport function sineWarp(\n p: Path,\n amplitude: number,\n frequency = 1,\n phase = 0,\n): Path {\n return mapVerts(p, (v) => ({\n x: v.x,\n y: v.y + amplitude * Math.sin(2 * Math.PI * frequency * v.x + phase),\n }))\n}\n\n/** Minkowski sum of two closed paths (Clipper2). */\nexport function minkSum(a: Path, b: Path): Group {\n const pattern = ringToPathD(b.rings[0] ?? [])\n const subject = ringToPathD(a.rings[0] ?? [])\n return pathsDToGroup(minkowskiSumD(pattern, subject, true))\n}\n\n/** Minkowski difference of two closed paths (Clipper2). */\nexport function minkDifference(a: Path, b: Path): Group {\n const pattern = ringToPathD(b.rings[0] ?? [])\n const subject = ringToPathD(a.rings[0] ?? [])\n return pathsDToGroup(minkowskiDiffD(pattern, subject, true))\n}\n\nfunction chaikinRing(ring: Ring, ratio: number, closed: boolean): Ring {\n if (ring.length < 2) return ring.map((v) => ({ ...v }))\n const out: Vec2[] = []\n const n = ring.length\n const edges = closed ? n : n - 1\n for (let i = 0; i < edges; i++) {\n const a = ring[i]!\n const b = ring[(i + 1) % n]!\n out.push({\n x: a.x * (1 - ratio) + b.x * ratio,\n y: a.y * (1 - ratio) + b.y * ratio,\n })\n out.push({\n x: a.x * ratio + b.x * (1 - ratio),\n y: a.y * ratio + b.y * (1 - ratio),\n })\n }\n if (!closed) {\n out.unshift({ ...ring[0]! })\n out.push({ ...ring[n - 1]! })\n }\n return closed ? normalizeRing(out) : out\n}\n\nfunction mapVerts(p: Path, fn: (v: Vec2) => Vec2): Path {\n return path(\n p.rings.map((ring) => normalizeRing(ring.map(fn))),\n p.closed,\n )\n}\n\nexport const morphology = {\n buffer,\n erosionDilation,\n dilationErosion,\n simplify,\n reducePrecision,\n chaikinCut,\n smooth,\n radialWarp,\n sineWarp,\n minkSum,\n minkDifference,\n}\n","import type { Group, Path, Segment, Vec2 } from '../types/index.js'\nimport { group, polygon, polyline, segment } from '../types/index.js'\nimport { centroid, containsPoint, area } from '../predicates/index.js'\nimport { delaunayTriangulationPoints } from '../triangulation/index.js'\nimport { union } from '../shapeBoolean/index.js'\nimport { simplify as simplifyPath } from '../morphology/index.js'\n\n// ---------------------------------------------------------------------------\n// Shared mesh primitives\n// ---------------------------------------------------------------------------\n\ntype EdgeRec = { a: Vec2; b: Vec2; faceIds: number[] }\n\nfunction edgeKey(a: Vec2, b: Vec2): string {\n const aKey = `${a.x},${a.y}`\n const bKey = `${b.x},${b.y}`\n return aKey < bKey ? `${aKey}|${bKey}` : `${bKey}|${aKey}`\n}\n\nfunction vertKey(v: Vec2): string {\n return `${v.x},${v.y}`\n}\n\nfunction same(a: Vec2, b: Vec2, eps = 1e-12): boolean {\n return Math.abs(a.x - b.x) < eps && Math.abs(a.y - b.y) < eps\n}\n\nfunction dist(a: Vec2, b: Vec2): number {\n return Math.hypot(a.x - b.x, a.y - b.y)\n}\n\nfunction mid(a: Vec2, b: Vec2): Vec2 {\n return { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 }\n}\n\nfunction lerp(a: Vec2, b: Vec2, t: number): Vec2 {\n return { x: a.x + (b.x - a.x) * t, y: a.y + (b.y - a.y) * t }\n}\n\nfunction unique(points: Vec2[]): Vec2[] {\n const seen = new Set<string>()\n const out: Vec2[] = []\n for (const p of points) {\n const k = vertKey(p)\n if (seen.has(k)) continue\n seen.add(k)\n out.push({ ...p })\n }\n return out\n}\n\nfunction cross(o: Vec2, a: Vec2, b: Vec2): number {\n return (a.x - o.x) * (b.y - o.y) - (a.y - o.y) * (b.x - o.x)\n}\n\nfunction ringOf(face: Path): Vec2[] {\n return face.rings[0] ?? []\n}\n\n/** Build undirected edge → incident face indices for exterior rings. */\nfunction buildEdgeMap(faces: Path[]): Map<string, EdgeRec> {\n const edges = new Map<string, EdgeRec>()\n faces.forEach((f, fi) => {\n const ring = ringOf(f)\n if (ring.length < 2) return\n const n = ring.length\n const closed = f.closed !== false && n >= 3\n const lim = closed ? n : n - 1\n for (let i = 0; i < lim; i++) {\n const a = ring[i]!\n const b = ring[(i + 1) % n]!\n const key = edgeKey(a, b)\n const rec = edges.get(key)\n if (rec) rec.faceIds.push(fi)\n else edges.set(key, { a: { ...a }, b: { ...b }, faceIds: [fi] })\n }\n })\n return edges\n}\n\nfunction perimeterKeys(edgeMap: Map<string, EdgeRec>): Set<string> {\n const out = new Set<string>()\n for (const [k, e] of edgeMap) {\n if (e.faceIds.length === 1) out.add(k)\n }\n return out\n}\n\nfunction faceAdjacency(faces: Path[]): number[][] {\n const edgeMap = buildEdgeMap(faces)\n const adj: number[][] = faces.map(() => [])\n for (const e of edgeMap.values()) {\n if (e.faceIds.length === 2) {\n const [i, j] = e.faceIds\n adj[i!]!.push(j!)\n adj[j!]!.push(i!)\n }\n }\n return adj\n}\n\n/** Collect unique sites from triangulation faces. */\nfunction sitesFromFaces(faces: Path[]): Vec2[] {\n return unique(faces.flatMap((f) => ringOf(f)))\n}\n\n/**\n * Merge triangles that share a removed (non-kept) edge into polygonal faces.\n * Kept edges (and perimeter) form the resulting face boundaries.\n */\nfunction facesFromKeptEdges(\n tris: Path[],\n kept: Set<string>,\n): Path[] {\n if (tris.length === 0) return []\n const parent = tris.map((_, i) => i)\n const find = (i: number): number => {\n let x = i\n while (parent[x] !== x) {\n parent[x] = parent[parent[x]!]!\n x = parent[x]!\n }\n return x\n }\n const unite = (a: number, b: number) => {\n const ra = find(a)\n const rb = find(b)\n if (ra !== rb) parent[rb] = ra\n }\n\n const edgeMap = buildEdgeMap(tris)\n for (const [key, e] of edgeMap) {\n if (e.faceIds.length === 2 && !kept.has(key)) {\n unite(e.faceIds[0]!, e.faceIds[1]!)\n }\n }\n\n const components = new Map<number, number[]>()\n for (let i = 0; i < tris.length; i++) {\n const r = find(i)\n const list = components.get(r) ?? []\n list.push(i)\n components.set(r, list)\n }\n\n const out: Path[] = []\n for (const members of components.values()) {\n const ring = boundaryRingOfComponent(tris, members)\n if (ring && ring.length >= 3) out.push(polygon(ring))\n }\n return out\n}\n\n/** Exterior ring of a set of triangles (edges appearing once in the set). */\nfunction boundaryRingOfComponent(\n tris: Path[],\n members: number[],\n): Vec2[] | null {\n const edgeCount = new Map<string, { a: Vec2; b: Vec2; n: number }>()\n for (const fi of members) {\n const ring = ringOf(tris[fi]!)\n if (ring.length < 3) continue\n for (let i = 0; i < ring.length; i++) {\n const a = ring[i]!\n const b = ring[(i + 1) % ring.length]!\n const key = edgeKey(a, b)\n const rec = edgeCount.get(key)\n if (rec) rec.n++\n else edgeCount.set(key, { a: { ...a }, b: { ...b }, n: 1 })\n }\n }\n const boundary: { a: Vec2; b: Vec2 }[] = []\n for (const e of edgeCount.values()) {\n if (e.n === 1) boundary.push({ a: e.a, b: e.b })\n }\n if (boundary.length < 3) return null\n return orderEdgesIntoRing(boundary)\n}\n\nfunction orderEdgesIntoRing(edges: { a: Vec2; b: Vec2 }[]): Vec2[] | null {\n if (edges.length === 0) return null\n const adj = new Map<string, Vec2[]>()\n const add = (from: Vec2, to: Vec2) => {\n const k = vertKey(from)\n const list = adj.get(k) ?? []\n list.push(to)\n adj.set(k, list)\n }\n for (const e of edges) {\n add(e.a, e.b)\n add(e.b, e.a)\n }\n\n const start = edges[0]!.a\n const ring: Vec2[] = [{ ...start }]\n let prev = start\n let curr = edges[0]!.b\n const maxSteps = edges.length + 2\n for (let step = 0; step < maxSteps; step++) {\n ring.push({ ...curr })\n if (same(curr, start) && ring.length > 2) {\n ring.pop()\n return ring\n }\n const nbrs = adj.get(vertKey(curr)) ?? []\n let next: Vec2 | null = null\n for (const n of nbrs) {\n if (!same(n, prev)) {\n next = n\n break\n }\n }\n if (!next) break\n prev = curr\n curr = next\n }\n return ring.length >= 3 ? ring : null\n}\n\nfunction applyEdgeFilter(\n tris: Path[],\n shouldKeep: (a: Vec2, b: Vec2, perimeter: boolean) => boolean,\n preservePerimeter: boolean,\n): Path[] {\n const edgeMap = buildEdgeMap(tris)\n const peri = perimeterKeys(edgeMap)\n const kept = new Set<string>()\n for (const [key, e] of edgeMap) {\n const isPeri = peri.has(key)\n if (isPeri && preservePerimeter) {\n kept.add(key)\n continue\n }\n if (shouldKeep(e.a, e.b, isPeri)) kept.add(key)\n }\n return facesFromKeptEdges(tris, kept)\n}\n\nfunction asTriFaces(input: Vec2[] | Path[]): Path[] {\n if (input.length === 0) return []\n const first = input[0]!\n if ('rings' in first) return input as Path[]\n return delaunayTriangulationPoints(input as Vec2[])\n}\n\nfunction pointsOf(input: Vec2[] | Path[]): Vec2[] {\n if (input.length === 0) return []\n const first = input[0]!\n if ('rings' in first) return sitesFromFaces(input as Path[])\n return input as Vec2[]\n}\n\n// ---------------------------------------------------------------------------\n// Extract / query\n// ---------------------------------------------------------------------------\n\n/** Edges shared by at least two faces (excludes perimeter and hole boundaries). */\nexport function extractInnerEdges(faces: Path[]): Segment[] {\n const edgeMap = buildEdgeMap(faces)\n const out: Segment[] = []\n for (const e of edgeMap.values()) {\n if (e.faceIds.length >= 2) out.push(segment(e.a, e.b))\n }\n return out\n}\n\n/** Vertices not on the mesh perimeter. */\nexport function extractInnerVertices(faces: Path[]): Vec2[] {\n const edgeMap = buildEdgeMap(faces)\n const peri = perimeterKeys(edgeMap)\n const periVerts = new Set<string>()\n for (const key of peri) {\n const e = edgeMap.get(key)!\n periVerts.add(vertKey(e.a))\n periVerts.add(vertKey(e.b))\n }\n const out: Vec2[] = []\n const seen = new Set<string>()\n for (const f of faces) {\n for (const v of ringOf(f)) {\n const k = vertKey(v)\n if (periVerts.has(k) || seen.has(k)) continue\n seen.add(k)\n out.push({ ...v })\n }\n }\n return out\n}\n\n/** First face that contains `point`, or null. */\nexport function findContainingFace(\n faces: Path[],\n point: Vec2,\n): Path | null {\n for (const f of faces) {\n if (containsPoint(f, point)) return f\n }\n return null\n}\n\n/** Split every face edge longer than `maxLen` by inserting subdivision points. */\nexport function splitEdges(faces: Path[], maxLen: number): Group {\n const lim = Math.max(maxLen, 1e-9)\n const out: Path[] = []\n for (const f of faces) {\n out.push(\n polygon(\n densifyRing(ringOf(f), lim),\n f.rings.slice(1).map((r) => densifyRing(r, lim)),\n ),\n )\n }\n return group(out)\n}\n\nfunction densifyRing(ring: Vec2[], maxLen: number): Vec2[] {\n if (ring.length < 2) return ring.map((v) => ({ ...v }))\n const out: Vec2[] = []\n const n = ring.length\n for (let i = 0; i < n; i++) {\n const a = ring[i]!\n const b = ring[(i + 1) % n]!\n out.push({ ...a })\n const d = dist(a, b)\n const steps = Math.floor(d / maxLen)\n for (let s = 1; s < steps; s++) out.push(lerp(a, b, s / steps))\n }\n return out\n}\n\n// ---------------------------------------------------------------------------\n// Graph faces (Urquhart / Gabriel / RNG / Spanner / Dual)\n// ---------------------------------------------------------------------------\n\nfunction isGabriel(a: Vec2, b: Vec2, points: Vec2[]): boolean {\n const m = mid(a, b)\n const r = dist(a, b) / 2\n for (const p of points) {\n if (same(p, a) || same(p, b)) continue\n if (dist(p, m) < r - 1e-9) return false\n }\n return true\n}\n\nfunction isRelativeNeighbor(a: Vec2, b: Vec2, points: Vec2[]): boolean {\n const dab = dist(a, b)\n for (const p of points) {\n if (same(p, a) || same(p, b)) continue\n if (Math.max(dist(p, a), dist(p, b)) < dab - 1e-9) return false\n }\n return true\n}\n\n/** Urquhart faces: remove longest edge of each triangle, then polygonize. */\nexport function urquhartFaces(\n input: Vec2[] | Path[],\n preservePerimeter = false,\n): Group {\n const tris = asTriFaces(input)\n const edgeMap = buildEdgeMap(tris)\n const peri = perimeterKeys(edgeMap)\n const removed = new Set<string>()\n for (const t of tris) {\n const r = ringOf(t)\n if (r.length < 3) continue\n let longestKey = ''\n let longestLen = -1\n for (let i = 0; i < 3; i++) {\n const a = r[i]!\n const b = r[(i + 1) % 3]!\n const d = dist(a, b)\n if (d > longestLen) {\n longestLen = d\n longestKey = edgeKey(a, b)\n }\n }\n if (longestKey && !(preservePerimeter && peri.has(longestKey))) {\n removed.add(longestKey)\n }\n }\n const kept = new Set<string>()\n for (const key of edgeMap.keys()) {\n if (!removed.has(key)) kept.add(key)\n }\n return group(facesFromKeptEdges(tris, kept))\n}\n\n/** Gabriel graph faces from a point set or triangulation. */\nexport function gabrielFaces(\n input: Vec2[] | Path[],\n preservePerimeter = false,\n): Group {\n const tris = asTriFaces(input)\n const pts = pointsOf(input)\n return group(\n applyEdgeFilter(\n tris,\n (a, b) => isGabriel(a, b, pts),\n preservePerimeter,\n ),\n )\n}\n\n/** Relative-neighborhood graph faces. */\nexport function relativeNeighborFaces(\n input: Vec2[] | Path[],\n preservePerimeter = false,\n): Group {\n const tris = asTriFaces(input)\n const pts = pointsOf(input)\n return group(\n applyEdgeFilter(\n tris,\n (a, b) => isRelativeNeighbor(a, b, pts),\n preservePerimeter,\n ),\n )\n}\n\n/**\n * Greedy sparse spanner faces. Higher `k` allows longer detours, so more edges\n * are collapsed → larger faces.\n */\nexport function spannerFaces(\n input: Vec2[] | Path[],\n k = 1,\n preservePerimeter = false,\n): Group {\n const tris = asTriFaces(input)\n const edgeMap = buildEdgeMap(tris)\n const peri = perimeterKeys(edgeMap)\n const stretch = Math.max(1, k)\n const edges = [...edgeMap.entries()].map(([key, e]) => ({\n key,\n a: e.a,\n b: e.b,\n len: dist(e.a, e.b),\n peri: peri.has(key),\n }))\n edges.sort((a, b) => a.len - b.len)\n\n const adj = new Map<string, { to: string; w: number }[]>()\n const link = (a: Vec2, b: Vec2, w: number) => {\n const ka = vertKey(a)\n const kb = vertKey(b)\n if (!adj.has(ka)) adj.set(ka, [])\n if (!adj.has(kb)) adj.set(kb, [])\n adj.get(ka)!.push({ to: kb, w })\n adj.get(kb)!.push({ to: ka, w })\n }\n const shortest = (from: Vec2, to: Vec2): number => {\n const start = vertKey(from)\n const goal = vertKey(to)\n const distMap = new Map<string, number>([[start, 0]])\n const pq: { k: string; d: number }[] = [{ k: start, d: 0 }]\n while (pq.length) {\n pq.sort((x, y) => x.d - y.d)\n const cur = pq.shift()!\n if (cur.k === goal) return cur.d\n if (cur.d > (distMap.get(cur.k) ?? Infinity)) continue\n for (const e of adj.get(cur.k) ?? []) {\n const nd = cur.d + e.w\n if (nd < (distMap.get(e.to) ?? Infinity)) {\n distMap.set(e.to, nd)\n pq.push({ k: e.to, d: nd })\n }\n }\n }\n return Infinity\n }\n\n const kept = new Set<string>()\n for (const e of edges) {\n if (e.peri && preservePerimeter) {\n kept.add(e.key)\n link(e.a, e.b, e.len)\n continue\n }\n const pathLen = shortest(e.a, e.b)\n if (pathLen > stretch * e.len + 1e-9) {\n kept.add(e.key)\n link(e.a, e.b, e.len)\n } else if (e.peri) {\n // Keep perimeter even when stretch would drop it, so faces stay bounded.\n kept.add(e.key)\n link(e.a, e.b, e.len)\n }\n }\n return group(facesFromKeptEdges(tris, kept))\n}\n\n/**\n * Dual faces of a triangulation: closed polygons connecting centroids of\n * triangles around each interior primal vertex.\n */\nexport function dualFaces(faces: Path[]): Group {\n if (faces.length === 0) return group([])\n const edgeMap = buildEdgeMap(faces)\n const peri = perimeterKeys(edgeMap)\n const periVerts = new Set<string>()\n for (const key of peri) {\n const e = edgeMap.get(key)!\n periVerts.add(vertKey(e.a))\n periVerts.add(vertKey(e.b))\n }\n\n // vertex → list of (faceIndex, angle of face centroid from vertex)\n const incident = new Map<string, { fi: number; ang: number; v: Vec2 }[]>()\n faces.forEach((f, fi) => {\n const c = centroid(f)\n for (const v of ringOf(f)) {\n const k = vertKey(v)\n if (periVerts.has(k)) continue\n const list = incident.get(k) ?? []\n list.push({ fi, ang: Math.atan2(c.y - v.y, c.x - v.x), v })\n incident.set(k, list)\n }\n })\n\n const out: Path[] = []\n for (const list of incident.values()) {\n if (list.length < 3) continue\n // Dedupe by face index\n const byFace = new Map<number, (typeof list)[0]>()\n for (const item of list) byFace.set(item.fi, item)\n const uniqueList = [...byFace.values()]\n if (uniqueList.length < 3) continue\n uniqueList.sort((a, b) => a.ang - b.ang)\n const ring = uniqueList.map((item) => centroid(faces[item.fi]!))\n out.push(polygon(ring))\n }\n return group(out)\n}\n\n// ---------------------------------------------------------------------------\n// Quadrangulations\n// ---------------------------------------------------------------------------\n\nfunction triVerts(t: Path): [Vec2, Vec2, Vec2] | null {\n const r = ringOf(t)\n if (r.length < 3) return null\n return [r[0]!, r[1]!, r[2]!]\n}\n\n/** Midpoint cache keyed by edge. */\nfunction midpointMap(faces: Path[]): Map<string, Vec2> {\n const mids = new Map<string, Vec2>()\n const edgeMap = buildEdgeMap(faces)\n for (const [key, e] of edgeMap) {\n mids.set(key, mid(e.a, e.b))\n }\n return mids\n}\n\n/**\n * Centroid quadrangulation: one quad per triangulation edge using the\n * centroids of the one or two incident triangles.\n */\nexport function centroidQuadrangulation(\n input: Vec2[] | Path[],\n preservePerimeter = true,\n): Group {\n const tris = asTriFaces(input)\n const edgeMap = buildEdgeMap(tris)\n const centers = tris.map((t) => centroid(t))\n const out: Path[] = []\n const peri = perimeterKeys(edgeMap)\n\n for (const [key, e] of edgeMap) {\n const ids = e.faceIds\n if (ids.length === 2) {\n const c0 = centers[ids[0]!]!\n const c1 = centers[ids[1]!]!\n out.push(polygon([e.a, c0, e.b, c1]))\n } else if (ids.length === 1 && preservePerimeter) {\n const c0 = centers[ids[0]!]!\n out.push(polygon([e.a, e.b, c0]))\n } else if (ids.length === 1 && !preservePerimeter && peri.has(key)) {\n // drop perimeter-only triangles when not preserving\n }\n }\n return group(out)\n}\n\n/**\n * Split (Catmull–Clark) quadrangulation: 3 quads per triangle via edge\n * midpoints and the face centroid.\n */\nexport function splitQuadrangulation(input: Vec2[] | Path[]): Group {\n const tris = asTriFaces(input)\n const mids = midpointMap(tris)\n const out: Path[] = []\n for (const t of tris) {\n const v = triVerts(t)\n if (!v) continue\n const [a, b, c] = v\n const g = centroid(t)\n const mab = mids.get(edgeKey(a, b)) ?? mid(a, b)\n const mbc = mids.get(edgeKey(b, c)) ?? mid(b, c)\n const mca = mids.get(edgeKey(c, a)) ?? mid(c, a)\n out.push(polygon([a, mab, g, mca]))\n out.push(polygon([b, mbc, g, mab]))\n out.push(polygon([c, mca, g, mbc]))\n }\n return group(out)\n}\n\n/**\n * Edge-collapse quadrangulation: greedy pairing of adjacent triangles into quads\n * (edge-coloring style collapse of shared edges).\n */\nexport function edgeCollapseQuadrangulation(\n input: Vec2[] | Path[],\n preservePerimeter = true,\n): Group {\n const tris = asTriFaces(input)\n const edgeMap = buildEdgeMap(tris)\n const candidates: { key: string; a: Vec2; b: Vec2; i: number; j: number; q: number }[] =\n []\n for (const [key, e] of edgeMap) {\n if (e.faceIds.length !== 2) continue\n const [i, j] = e.faceIds\n const quad = mergeTriPair(tris[i!]!, tris[j!]!, e.a, e.b)\n if (!quad) continue\n candidates.push({\n key,\n a: e.a,\n b: e.b,\n i: i!,\n j: j!,\n q: quadQuality(quad),\n })\n }\n candidates.sort((x, y) => y.q - x.q)\n\n const used = new Set<number>()\n const out: Path[] = []\n for (const c of candidates) {\n if (used.has(c.i) || used.has(c.j)) continue\n const quad = mergeTriPair(tris[c.i]!, tris[c.j]!, c.a, c.b)\n if (!quad) continue\n out.push(quad)\n used.add(c.i)\n used.add(c.j)\n }\n for (let i = 0; i < tris.length; i++) {\n if (used.has(i)) continue\n if (preservePerimeter) out.push(tris[i]!)\n }\n return group(out)\n}\n\n/**\n * Matching quadrangulation: quality-weighted greedy matching of triangles\n * (Blossom-Quad first step; leftover triangles retained).\n */\nexport function matchingQuadrangulation(input: Vec2[] | Path[]): Group {\n return edgeCollapseQuadrangulation(input, true)\n}\n\nfunction mergeTriPair(\n t0: Path,\n t1: Path,\n ea: Vec2,\n eb: Vec2,\n): Path | null {\n const opp0 = oppositeVertex(t0, ea, eb)\n const opp1 = oppositeVertex(t1, ea, eb)\n if (!opp0 || !opp1) return null\n // Order: opp0 → ea → opp1 → eb (convex quad when possible)\n return polygon([opp0, ea, opp1, eb])\n}\n\nfunction oppositeVertex(t: Path, ea: Vec2, eb: Vec2): Vec2 | null {\n for (const v of ringOf(t)) {\n if (!same(v, ea) && !same(v, eb)) return v\n }\n return null\n}\n\nfunction quadQuality(q: Path): number {\n const r = ringOf(q)\n if (r.length < 4) return 0\n // Prefer near-square: maximize min edge / max edge and prefer angles near 90°.\n const lens: number[] = []\n for (let i = 0; i < 4; i++) {\n lens.push(dist(r[i]!, r[(i + 1) % 4]!))\n }\n const minL = Math.min(...lens)\n const maxL = Math.max(...lens)\n if (maxL < 1e-12) return 0\n return minL / maxL\n}\n\n/**\n * Spiral quadrangulation from a point set (characteristic spiral pattern).\n */\nexport function spiralQuadrangulation(points: Vec2[]): Group {\n if (points.length < 4) return group([])\n const pts = unique(points)\n const cx = pts.reduce((s, p) => s + p.x, 0) / pts.length\n const cy = pts.reduce((s, p) => s + p.y, 0) / pts.length\n\n // Sort by angle, then assign to radial rings by distance rank.\n const withMeta = pts.map((p) => ({\n p,\n ang: Math.atan2(p.y - cy, p.x - cx),\n rad: Math.hypot(p.x - cx, p.y - cy),\n }))\n withMeta.sort((a, b) => a.rad - b.rad || a.ang - b.ang)\n\n const ringCount = Math.max(2, Math.ceil(Math.sqrt(pts.length)))\n const rings: Vec2[][] = Array.from({ length: ringCount }, () => [])\n withMeta.forEach((item, i) => {\n const ri = Math.min(\n ringCount - 1,\n Math.floor((i / withMeta.length) * ringCount),\n )\n rings[ri]!.push(item.p)\n })\n for (const ring of rings) {\n ring.sort(\n (a, b) =>\n Math.atan2(a.y - cy, a.x - cx) - Math.atan2(b.y - cy, b.x - cx),\n )\n }\n\n const out: Path[] = []\n for (let r = 0; r < rings.length - 1; r++) {\n const inner = rings[r]!\n const outer = rings[r + 1]!\n if (inner.length === 0 || outer.length === 0) continue\n const n = Math.max(inner.length, outer.length)\n for (let i = 0; i < n; i++) {\n const a = inner[i % inner.length]!\n const b = inner[(i + 1) % inner.length]!\n const c = outer[(i + 1) % outer.length]!\n const d = outer[i % outer.length]!\n // Skip degenerate\n const verts = unique([a, b, c, d])\n if (verts.length >= 3) out.push(polygon(verts.length === 3 ? verts : [a, b, c, d]))\n }\n }\n return group(out)\n}\n\n// ---------------------------------------------------------------------------\n// Mesh process\n// ---------------------------------------------------------------------------\n\nfunction vertexNeighborhood(faces: Path[]): {\n positions: Map<string, Vec2>\n neighbors: Map<string, Set<string>>\n perimeter: Set<string>\n} {\n const edgeMap = buildEdgeMap(faces)\n const peri = perimeterKeys(edgeMap)\n const perimeter = new Set<string>()\n for (const key of peri) {\n const e = edgeMap.get(key)!\n perimeter.add(vertKey(e.a))\n perimeter.add(vertKey(e.b))\n }\n const positions = new Map<string, Vec2>()\n const neighbors = new Map<string, Set<string>>()\n const link = (a: Vec2, b: Vec2) => {\n const ka = vertKey(a)\n const kb = vertKey(b)\n positions.set(ka, { ...a })\n positions.set(kb, { ...b })\n if (!neighbors.has(ka)) neighbors.set(ka, new Set())\n if (!neighbors.has(kb)) neighbors.set(kb, new Set())\n neighbors.get(ka)!.add(kb)\n neighbors.get(kb)!.add(ka)\n }\n for (const e of edgeMap.values()) link(e.a, e.b)\n return { positions, neighbors, perimeter }\n}\n\nfunction remapFaces(\n faces: Path[],\n positions: Map<string, Vec2>,\n): Path[] {\n return faces.map((f) =>\n polygon(\n ringOf(f).map((v) => {\n const p = positions.get(vertKey(v))\n return p ? { ...p } : { ...v }\n }),\n f.rings.slice(1).map((r) =>\n r.map((v) => {\n const p = positions.get(vertKey(v))\n return p ? { ...p } : { ...v }\n }),\n ),\n ),\n )\n}\n\n/** Weighted Laplacian mesh smoothing. */\nexport function smoothMesh(\n faces: Path[],\n iterationsOrCutoff: number,\n preservePerimeter = true,\n): Group {\n if (faces.length === 0) return group([])\n let { positions, neighbors, perimeter } = vertexNeighborhood(faces)\n const maxIter =\n iterationsOrCutoff >= 1 && Number.isInteger(iterationsOrCutoff)\n ? iterationsOrCutoff\n : 200\n const cutoff =\n iterationsOrCutoff > 0 && iterationsOrCutoff < 1\n ? iterationsOrCutoff\n : 0\n\n for (let iter = 0; iter < maxIter; iter++) {\n const next = new Map<string, Vec2>()\n let maxDisp = 0\n for (const [k, p] of positions) {\n if (preservePerimeter && perimeter.has(k)) {\n next.set(k, p)\n continue\n }\n const nbrs = neighbors.get(k)\n if (!nbrs || nbrs.size === 0) {\n next.set(k, p)\n continue\n }\n let sx = 0\n let sy = 0\n for (const nk of nbrs) {\n const n = positions.get(nk)!\n sx += n.x\n sy += n.y\n }\n const np = { x: sx / nbrs.size, y: sy / nbrs.size }\n maxDisp = Math.max(maxDisp, dist(p, np))\n next.set(k, np)\n }\n positions = next\n if (cutoff > 0 && maxDisp < cutoff) break\n }\n return group(remapFaces(faces, positions))\n}\n\n/**\n * Catmull–Clark-style subdivision: split each edge at `edgeSplitRatio` and\n * connect to the face centroid (N subfaces per N-gon).\n */\nexport function subdivideMesh(\n faces: Path[],\n edgeSplitRatio = 0.5,\n): Group {\n const t = Math.min(1, Math.max(0, edgeSplitRatio))\n const out: Path[] = []\n for (const f of faces) {\n const ring = ringOf(f)\n if (ring.length < 3) continue\n const c = centroid(f)\n const n = ring.length\n const splits: Vec2[] = []\n for (let i = 0; i < n; i++) {\n const a = ring[i]!\n const b = ring[(i + 1) % n]!\n splits.push(lerp(a, b, t))\n }\n for (let i = 0; i < n; i++) {\n const v = ring[i]!\n const sPrev = splits[(i - 1 + n) % n]!\n const sNext = splits[i]!\n out.push(polygon([v, sNext, c, sPrev]))\n }\n }\n return group(out)\n}\n\n/**\n * Simplify face boundaries while preserving mesh topology (shared edges\n * simplified once, then faces rebuilt).\n */\nexport function simplifyMesh(\n faces: Path[],\n tolerance: number,\n preservePerimeter = true,\n): Group {\n if (tolerance <= 0 || faces.length === 0) return group(faces.map((f) => polygon(ringOf(f), f.rings.slice(1))))\n const edgeMap = buildEdgeMap(faces)\n const peri = perimeterKeys(edgeMap)\n\n // Simplify each unique edge as a 2-point segment is a no-op; for faces with\n // more than 3 verts, simplify the full ring then re-snap shared vertices.\n const simplified = faces.map((f) => {\n const ring = ringOf(f)\n if (ring.length <= 3) return polygon(ring)\n if (preservePerimeter) {\n // Only simplify interior-only vertices: use path simplify then restore peri verts.\n const s = simplifyPath(f, tolerance)\n const sr = ringOf(s)\n if (sr.length < 3) return polygon(ring)\n return polygon(sr, s.rings.slice(1))\n }\n return simplifyPath(f, tolerance)\n })\n\n // Snap nearly-coincident vertices across faces for topology\n const all = unique(simplified.flatMap((f) => ringOf(f)))\n const snapped = clusterSnap(all, Math.max(tolerance * 0.5, 1e-9))\n const remap = (v: Vec2): Vec2 => {\n let best = v\n let bestD = Infinity\n for (const s of snapped) {\n const d = dist(v, s)\n if (d < bestD) {\n bestD = d\n best = s\n }\n }\n return { ...best }\n }\n // Preserve perimeter vertices exactly when requested\n const periVerts = new Set<string>()\n if (preservePerimeter) {\n for (const key of peri) {\n const e = edgeMap.get(key)!\n periVerts.add(vertKey(e.a))\n periVerts.add(vertKey(e.b))\n }\n }\n\n return group(\n simplified.map((f, i) => {\n const original = ringOf(faces[i]!)\n const ring = ringOf(f).map((v, vi) => {\n if (preservePerimeter && original[vi] && periVerts.has(vertKey(original[vi]!))) {\n return { ...original[vi]! }\n }\n // also check if v matches a peri vert\n for (const ov of original) {\n if (periVerts.has(vertKey(ov)) && dist(v, ov) < tolerance * 2) {\n return { ...ov }\n }\n }\n return remap(v)\n })\n return polygon(unique(ring).length >= 3 ? ring : original)\n }),\n )\n}\n\nfunction clusterSnap(points: Vec2[], tol: number): Vec2[] {\n const clusters: Vec2[][] = []\n for (const p of points) {\n let found = false\n for (const c of clusters) {\n if (dist(p, c[0]!) <= tol) {\n c.push(p)\n found = true\n break\n }\n }\n if (!found) clusters.push([p])\n }\n return clusters.map((c) => ({\n x: c.reduce((s, p) => s + p.x, 0) / c.length,\n y: c.reduce((s, p) => s + p.y, 0) / c.length,\n }))\n}\n\n/** Randomly dissolve adjacent faces that share a class id. */\nexport function stochasticMerge(\n faces: Path[],\n nClasses: number,\n seed = 1,\n): Group {\n if (faces.length === 0) return group([])\n const classes = Math.max(1, Math.floor(nClasses))\n const rng = mulberry32(seed >>> 0)\n const label = faces.map(() => Math.floor(rng() * classes))\n const adj = faceAdjacency(faces)\n const parent = faces.map((_, i) => i)\n const find = (i: number): number => {\n let x = i\n while (parent[x] !== x) {\n parent[x] = parent[parent[x]!]!\n x = parent[x]!\n }\n return x\n }\n const unite = (a: number, b: number) => {\n const ra = find(a)\n const rb = find(b)\n if (ra !== rb) parent[rb] = ra\n }\n for (let i = 0; i < faces.length; i++) {\n for (const j of adj[i]!) {\n if (j > i && label[i] === label[j]) unite(i, j)\n }\n }\n const comps = new Map<number, number[]>()\n for (let i = 0; i < faces.length; i++) {\n const r = find(i)\n const list = comps.get(r) ?? []\n list.push(i)\n comps.set(r, list)\n }\n const out: Path[] = []\n for (const members of comps.values()) {\n if (members.length === 1) {\n out.push(faces[members[0]!]!)\n continue\n }\n const merged = dissolveFaces(members.map((i) => faces[i]!))\n out.push(...merged)\n }\n return group(out)\n}\n\nfunction dissolveFaces(faces: Path[]): Path[] {\n if (faces.length === 0) return []\n if (faces.length === 1) return [faces[0]!]\n try {\n let acc = faces[0]!\n for (let i = 1; i < faces.length; i++) {\n const u = union(acc, faces[i]!)\n if (u.paths.length === 0) continue\n // Prefer largest piece if union fragments\n acc = u.paths.reduce((best, p) =>\n area(p) > area(best) ? p : best,\n )\n }\n return [acc]\n } catch {\n // Fallback: convex hull of vertices\n return [convexHullOf(faces.flatMap((f) => ringOf(f)))]\n }\n}\n\n/**\n * Merge faces below `minArea` into adjacent neighbors, or merge until at most\n * `remainingFaces` remain when options use `{ remainingFaces }`.\n */\nexport function areaMerge(\n faces: Path[],\n minAreaOrOptions: number | { minArea?: number; remainingFaces?: number },\n): Group {\n let working = [...faces]\n if (working.length === 0) return group([])\n\n if (typeof minAreaOrOptions === 'object' && minAreaOrOptions.remainingFaces != null) {\n const target = Math.max(1, Math.floor(minAreaOrOptions.remainingFaces))\n while (working.length > target) {\n const next = mergeSmallestAdjacent(working)\n if (next.length >= working.length) break\n working = next\n }\n return group(working)\n }\n\n const minArea =\n typeof minAreaOrOptions === 'number'\n ? minAreaOrOptions\n : (minAreaOrOptions.minArea ?? 0)\n\n let guard = 0\n while (guard++ < working.length + 10) {\n const smallIdx = working.findIndex((f) => area(f) < minArea)\n if (smallIdx < 0) break\n const next = mergeFaceIntoNeighbor(working, smallIdx)\n if (!next) break\n working = next\n }\n return group(working)\n}\n\nfunction mergeSmallestAdjacent(faces: Path[]): Path[] {\n let best = -1\n let bestA = Infinity\n for (let i = 0; i < faces.length; i++) {\n const a = area(faces[i]!)\n if (a < bestA) {\n bestA = a\n best = i\n }\n }\n if (best < 0) return faces\n return mergeFaceIntoNeighbor(faces, best) ?? faces\n}\n\nfunction mergeFaceIntoNeighbor(\n faces: Path[],\n idx: number,\n): Path[] | null {\n const adj = faceAdjacency(faces)\n const nbrs = adj[idx] ?? []\n if (nbrs.length === 0) {\n // No adjacency — drop tiny island or keep\n return faces.filter((_, i) => i !== idx)\n }\n // Prefer largest neighbor\n let bestN = nbrs[0]!\n let bestA = -1\n for (const n of nbrs) {\n const a = area(faces[n]!)\n if (a > bestA) {\n bestA = a\n bestN = n\n }\n }\n const merged = dissolveFaces([faces[idx]!, faces[bestN]!])\n const out: Path[] = []\n for (let i = 0; i < faces.length; i++) {\n if (i === idx || i === bestN) continue\n out.push(faces[i]!)\n }\n out.push(...merged)\n return out\n}\n\nfunction convexHullOf(points: Vec2[]): Path {\n const pts = unique(points)\n if (pts.length < 3) return polygon(pts)\n pts.sort((a, b) => (a.x === b.x ? a.y - b.y : a.x - b.x))\n const lower: Vec2[] = []\n for (const p of pts) {\n while (\n lower.length >= 2 &&\n cross(lower[lower.length - 2]!, lower[lower.length - 1]!, p) <= 0\n ) {\n lower.pop()\n }\n lower.push(p)\n }\n const upper: Vec2[] = []\n for (let i = pts.length - 1; i >= 0; i--) {\n const p = pts[i]!\n while (\n upper.length >= 2 &&\n cross(upper[upper.length - 2]!, upper[upper.length - 1]!, p) <= 0\n ) {\n upper.pop()\n }\n upper.push(p)\n }\n lower.pop()\n upper.pop()\n return polygon([...lower, ...upper])\n}\n\nfunction mulberry32(a: number): () => number {\n return () => {\n a |= 0\n a = (a + 0x6d2b79f5) | 0\n let t = Math.imul(a ^ (a >>> 15), 1 | a)\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296\n }\n}\n\n// ---------------------------------------------------------------------------\n// Repair\n// ---------------------------------------------------------------------------\n\n/**\n * Locate near-miss gaps between faces that should form a valid mesh\n * (boundary segments without a matching twin within a tiny tolerance).\n */\nexport function findBreaks(faces: Path[]): Group {\n const edgeMap = buildEdgeMap(faces)\n const segs: Path[] = []\n // Soft-match: perimeter edges that have a near-parallel nearby perimeter edge\n const peri: EdgeRec[] = []\n for (const e of edgeMap.values()) {\n if (e.faceIds.length === 1) peri.push(e)\n }\n const used = new Set<number>()\n for (let i = 0; i < peri.length; i++) {\n if (used.has(i)) continue\n const a = peri[i]!\n for (let j = i + 1; j < peri.length; j++) {\n if (used.has(j)) continue\n const b = peri[j]!\n if (nearDuplicateEdge(a, b, 1e-3)) {\n segs.push(polyline([a.a, a.b]))\n segs.push(polyline([b.a, b.b]))\n used.add(i)\n used.add(j)\n break\n }\n }\n }\n return group(segs)\n}\n\nfunction nearDuplicateEdge(a: EdgeRec, b: EdgeRec, tol: number): boolean {\n const d1 = dist(a.a, b.a) + dist(a.b, b.b)\n const d2 = dist(a.a, b.b) + dist(a.b, b.a)\n const len = dist(a.a, a.b)\n return Math.min(d1, d2) < tol * 2 + len * 0.05 && Math.min(d1, d2) > 1e-9\n}\n\n/**\n * Clean inter-face gaps/overlaps/slivers toward a valid coverage by snapping\n * vertices within `maxGapWidth` and dissolving overlaps.\n */\nexport function fixBreaks(faces: Path[], maxGapWidth: number): Group {\n if (faces.length === 0) return group([])\n const tol = Math.max(maxGapWidth, 1e-9)\n const verts = unique(faces.flatMap((f) => ringOf(f)))\n const snapped = clusterSnap(verts, tol)\n const remap = (v: Vec2): Vec2 => {\n let best = snapped[0]!\n let bestD = Infinity\n for (const s of snapped) {\n const d = dist(v, s)\n if (d < bestD) {\n bestD = d\n best = s\n }\n }\n return { ...best }\n }\n const fixed = faces.map((f) => {\n const ring = unique(ringOf(f).map(remap))\n return ring.length >= 3 ? polygon(ring) : f\n })\n // Dissolve overlaps via pairwise union of intersecting faces\n try {\n return group(dissolveOverlaps(fixed))\n } catch {\n return group(fixed)\n }\n}\n\nfunction dissolveOverlaps(faces: Path[]): Path[] {\n // Simple O(n²): if two faces overlap significantly, union them\n let working = [...faces]\n let changed = true\n let guard = 0\n while (changed && guard++ < working.length) {\n changed = false\n outer: for (let i = 0; i < working.length; i++) {\n for (let j = i + 1; j < working.length; j++) {\n const a = working[i]!\n const b = working[j]!\n const u = union(a, b)\n const ua = u.paths.reduce((s, p) => s + area(p), 0)\n if (ua < area(a) + area(b) - 1e-6) {\n // overlap — replace with union pieces\n const next = working.filter((_, k) => k !== i && k !== j)\n next.push(...u.paths)\n working = next\n changed = true\n break outer\n }\n }\n }\n }\n return working\n}\n\n/**\n * Endpoint-only snap within `tolerance`, then optionally polygonize linework\n * into faces.\n */\nexport function fixBrokenFaces(\n coverage: Path[],\n tolerance: number,\n polygonise = true,\n): Group {\n const tol = Math.max(tolerance, 1e-9)\n // Collect endpoints of open paths + all polygon verts as anchors\n const anchors: Vec2[] = []\n const endpoints: { pathIdx: number; end: 0 | 1; v: Vec2 }[] = []\n\n coverage.forEach((p, pi) => {\n const ring = ringOf(p)\n if (ring.length === 0) return\n if (p.closed) {\n for (const v of ring) anchors.push(v)\n } else {\n endpoints.push({ pathIdx: pi, end: 0, v: ring[0]! })\n endpoints.push({\n pathIdx: pi,\n end: 1,\n v: ring[ring.length - 1]!,\n })\n }\n })\n\n const snapTargets = clusterSnap(\n [...anchors, ...endpoints.map((e) => e.v)],\n tol,\n )\n\n const snapTo = (v: Vec2, preferAnchor: boolean): Vec2 => {\n // Prefer anchors if in cluster\n let best = v\n let bestD = Infinity\n for (const s of snapTargets) {\n const d = dist(v, s)\n if (d <= tol && d < bestD) {\n bestD = d\n best = s\n }\n }\n if (preferAnchor) {\n for (const a of anchors) {\n if (dist(v, a) <= tol) return { ...a }\n }\n }\n return { ...best }\n }\n\n const snappedPaths = coverage.map((p) => {\n const ring = ringOf(p)\n if (ring.length === 0) return p\n if (p.closed) return p\n const next = ring.map((v) => ({ ...v }))\n next[0] = snapTo(ring[0]!, true)\n next[next.length - 1] = snapTo(ring[ring.length - 1]!, true)\n return polyline(next)\n })\n\n if (!polygonise) return group(snappedPaths)\n\n // Closed rings stay; try to close open paths whose ends meet\n const out: Path[] = []\n for (const p of snappedPaths) {\n const ring = ringOf(p)\n if (p.closed) {\n out.push(p)\n continue\n }\n if (ring.length >= 3 && same(ring[0]!, ring[ring.length - 1]!, tol * 2)) {\n out.push(polygon(ring.slice(0, -1)))\n } else if (ring.length >= 3 && dist(ring[0]!, ring[ring.length - 1]!) <= tol * 2) {\n out.push(polygon(ring))\n } else {\n out.push(p)\n }\n }\n return group(out)\n}\n\n/** Disconnected face islands sorted by face count descending. */\nexport function findIslands(faces: Path[]): Group[] {\n if (faces.length === 0) return []\n const adj = faceAdjacency(faces)\n const seen = new Set<number>()\n const islands: number[][] = []\n for (let i = 0; i < faces.length; i++) {\n if (seen.has(i)) continue\n const stack = [i]\n const members: number[] = []\n seen.add(i)\n while (stack.length) {\n const cur = stack.pop()!\n members.push(cur)\n for (const n of adj[cur]!) {\n if (!seen.has(n)) {\n seen.add(n)\n stack.push(n)\n }\n }\n }\n islands.push(members)\n }\n islands.sort((a, b) => b.length - a.length)\n return islands.map((m) => group(m.map((i) => faces[i]!)))\n}\n\n// ---------------------------------------------------------------------------\n// Sort helpers\n// ---------------------------------------------------------------------------\n\n/** Sort faces by centroid angle around their collective centroid. */\nexport function radialSortFaces(faces: Path[]): Path[] {\n if (faces.length === 0) return []\n const cs = faces.map((f) => centroid(f))\n const cx = cs.reduce((s, p) => s + p.x, 0) / cs.length\n const cy = cs.reduce((s, p) => s + p.y, 0) / cs.length\n return faces\n .map((f, i) => ({ f, a: Math.atan2(cs[i]!.y - cy, cs[i]!.x - cx) }))\n .sort((a, b) => a.a - b.a)\n .map((x) => x.f)\n}\n\n/** Sort faces by centroid x then y. */\nexport function centroidSortFaces(faces: Path[]): Path[] {\n return [...faces].sort((a, b) => {\n const ca = centroid(a)\n const cb = centroid(b)\n return ca.x === cb.x ? ca.y - cb.y : ca.x - cb.x\n })\n}\n\nexport const meshing = {\n extractInnerEdges,\n extractInnerVertices,\n findContainingFace,\n splitEdges,\n urquhartFaces,\n gabrielFaces,\n relativeNeighborFaces,\n spannerFaces,\n dualFaces,\n centroidQuadrangulation,\n edgeCollapseQuadrangulation,\n splitQuadrangulation,\n spiralQuadrangulation,\n matchingQuadrangulation,\n smoothMesh,\n subdivideMesh,\n simplifyMesh,\n stochasticMerge,\n areaMerge,\n radialSortFaces,\n centroidSortFaces,\n findBreaks,\n fixBreaks,\n fixBrokenFaces,\n findIslands,\n}\n"]}
@@ -0,0 +1,58 @@
1
+ import { P as Path } from '../path-0RjhYjJs.js';
2
+ import { G as Group } from '../group-BNjVVYSQ.js';
3
+ import '../vec2-CWyXN1Wj.js';
4
+
5
+ type BufferOptions = {
6
+ /** Join style for offset. Default round. */
7
+ join?: 'round' | 'miter' | 'square';
8
+ };
9
+ /**
10
+ * Offset / buffer a closed path by `delta` (positive = expand, negative = erode).
11
+ * Returns a group of resulting closed paths (may split or vanish when eroding).
12
+ */
13
+ declare function buffer(path: Path, delta: number, options?: BufferOptions): Group;
14
+ /**
15
+ * Erode by `|amount|` then dilate by `|amount|` (opening). Useful for cleaning.
16
+ */
17
+ declare function erosionDilation(p: Path, amount: number): Group;
18
+ /**
19
+ * Dilate by `|amount|` then erode by `|amount|` (closing). Fills small gaps.
20
+ */
21
+ declare function dilationErosion(p: Path, amount: number): Group;
22
+
23
+ /**
24
+ * Ramer–Douglas–Peucker simplify (Clipper2). `epsilon` is absolute distance.
25
+ */
26
+ declare function simplify(p: Path, epsilon: number): Path;
27
+ /** Round vertex coordinates to `decimals` places. */
28
+ declare function reducePrecision(p: Path, decimals: number): Path;
29
+ /**
30
+ * Chaikin corner cutting. `iterations` ≥ 1; closed rings stay closed.
31
+ * Ratio defaults to classic 1/4–3/4 cut.
32
+ */
33
+ declare function chaikinCut(p: Path, iterations?: number, ratio?: number): Path;
34
+ /** Alias: Chaikin smoothing for `iterations` passes. */
35
+ declare function smooth(p: Path, iterations?: number): Path;
36
+ /** Radial displace from centroid: r' = r * (1 + amplitude * cos(freq * θ + phase)). */
37
+ declare function radialWarp(p: Path, amplitude: number, frequency?: number, phase?: number): Path;
38
+ /** Sine warp along X: y' = y + amplitude * sin(2π * frequency * x + phase). */
39
+ declare function sineWarp(p: Path, amplitude: number, frequency?: number, phase?: number): Path;
40
+ /** Minkowski sum of two closed paths (Clipper2). */
41
+ declare function minkSum(a: Path, b: Path): Group;
42
+ /** Minkowski difference of two closed paths (Clipper2). */
43
+ declare function minkDifference(a: Path, b: Path): Group;
44
+ declare const morphology: {
45
+ buffer: typeof buffer;
46
+ erosionDilation: typeof erosionDilation;
47
+ dilationErosion: typeof dilationErosion;
48
+ simplify: typeof simplify;
49
+ reducePrecision: typeof reducePrecision;
50
+ chaikinCut: typeof chaikinCut;
51
+ smooth: typeof smooth;
52
+ radialWarp: typeof radialWarp;
53
+ sineWarp: typeof sineWarp;
54
+ minkSum: typeof minkSum;
55
+ minkDifference: typeof minkDifference;
56
+ };
57
+
58
+ export { type BufferOptions, buffer, chaikinCut, dilationErosion, erosionDilation, minkDifference, minkSum, morphology, radialWarp, reducePrecision, simplify, sineWarp, smooth };
@@ -0,0 +1,268 @@
1
+ import { FillRule, JoinType, inflatePathsD, EndType, simplifyPathD, minkowskiSumD, minkowskiDiffD, isPositiveD, pointInPolygonD, PointInPolygonResult } from 'clipper2-ts';
2
+
3
+ // src/morphology/index.ts
4
+
5
+ // src/types/vec2.ts
6
+ function vec2(x, y) {
7
+ return { x, y };
8
+ }
9
+ function cloneVec2(v) {
10
+ return { x: v.x, y: v.y };
11
+ }
12
+ function equalsVec2(a, b, eps = 1e-9) {
13
+ return Math.abs(a.x - b.x) <= eps && Math.abs(a.y - b.y) <= eps;
14
+ }
15
+
16
+ // src/types/path.ts
17
+ function path(rings, closed = true) {
18
+ return {
19
+ rings: rings.map((ring) => ring.map(cloneVec2)),
20
+ closed
21
+ };
22
+ }
23
+ function normalizeRing(ring, eps = 1e-9) {
24
+ if (ring.length < 2) return ring.map(cloneVec2);
25
+ const first = ring[0];
26
+ const last = ring[ring.length - 1];
27
+ if (first && last && equalsVec2(first, last, eps)) {
28
+ return ring.slice(0, -1).map(cloneVec2);
29
+ }
30
+ return ring.map(cloneVec2);
31
+ }
32
+ function clonePath(p) {
33
+ return {
34
+ closed: p.closed,
35
+ rings: p.rings.map((ring) => ring.map(cloneVec2))
36
+ };
37
+ }
38
+
39
+ // src/types/group.ts
40
+ function group(paths = []) {
41
+ return { paths: paths.map(clonePath) };
42
+ }
43
+ FillRule.NonZero;
44
+ function ringToPathD(ring) {
45
+ const pts = [];
46
+ for (const v of normalizeRing(ring)) {
47
+ pts.push({ x: v.x, y: v.y, z: 0 });
48
+ }
49
+ return pts;
50
+ }
51
+ function pathToPathsD(p) {
52
+ if (!p.closed || p.rings.length === 0) {
53
+ throw new Error("Boolean ops require a closed path with at least one ring");
54
+ }
55
+ return p.rings.map((ring) => ringToPathD(ring));
56
+ }
57
+ function pathsDToGroup(paths) {
58
+ if (paths.length === 0) return group([]);
59
+ const outers = [];
60
+ const holes = [];
61
+ for (const pd of paths) {
62
+ const ring = pathDToRing(pd);
63
+ if (ring.length < 3) continue;
64
+ if (isPositiveD(pd)) {
65
+ outers.push({ ring, holes: [] });
66
+ } else {
67
+ holes.push(ring);
68
+ }
69
+ }
70
+ for (const hole of holes) {
71
+ const sample = hole[0];
72
+ if (!sample) continue;
73
+ let assigned = false;
74
+ for (const outer of outers) {
75
+ if (pointInRing(sample, outer.ring)) {
76
+ outer.holes.push(hole);
77
+ assigned = true;
78
+ break;
79
+ }
80
+ }
81
+ if (!assigned) {
82
+ outers.push({ ring: [...hole].reverse(), holes: [] });
83
+ }
84
+ }
85
+ return group(outers.map((o) => path([o.ring, ...o.holes], true)));
86
+ }
87
+ function pathDToRing(pd) {
88
+ return normalizeRing(pd.map((p) => vec2(p.x, p.y)));
89
+ }
90
+ function pointInRing(point, ring) {
91
+ const result = pointInPolygonD(
92
+ { x: point.x, y: point.y, z: 0 },
93
+ ringToPathD(ring)
94
+ );
95
+ return result === PointInPolygonResult.IsInside || result === PointInPolygonResult.IsOn;
96
+ }
97
+
98
+ // src/predicates/index.ts
99
+ function ringArea(ring) {
100
+ if (ring.length < 3) return 0;
101
+ let sum = 0;
102
+ for (let i = 0; i < ring.length; i++) {
103
+ const a = ring[i];
104
+ const b = ring[(i + 1) % ring.length];
105
+ sum += a.x * b.y - b.x * a.y;
106
+ }
107
+ return sum / 2;
108
+ }
109
+ function centroid(p) {
110
+ const ring = p.rings[0];
111
+ if (!ring || ring.length === 0) return vec2(0, 0);
112
+ const a = ringArea(ring);
113
+ if (Math.abs(a) < 1e-12) {
114
+ let sx = 0;
115
+ let sy = 0;
116
+ for (const v of ring) {
117
+ sx += v.x;
118
+ sy += v.y;
119
+ }
120
+ return vec2(sx / ring.length, sy / ring.length);
121
+ }
122
+ let cx = 0;
123
+ let cy = 0;
124
+ for (let i = 0; i < ring.length; i++) {
125
+ const p0 = ring[i];
126
+ const p1 = ring[(i + 1) % ring.length];
127
+ const cross = p0.x * p1.y - p1.x * p0.y;
128
+ cx += (p0.x + p1.x) * cross;
129
+ cy += (p0.y + p1.y) * cross;
130
+ }
131
+ return vec2(cx / (6 * a), cy / (6 * a));
132
+ }
133
+ function buffer(path2, delta, options = {}) {
134
+ const subject = pathToPathsD(path2);
135
+ const join = options.join === "miter" ? JoinType.Miter : options.join === "square" ? JoinType.Square : JoinType.Round;
136
+ const inflated = inflatePathsD(subject, delta, join, EndType.Polygon);
137
+ return pathsDToGroup(inflated);
138
+ }
139
+ function erosionDilation(p, amount) {
140
+ const a = Math.abs(amount);
141
+ if (a < 1e-12) return group([p]);
142
+ const eroded = buffer(p, -a);
143
+ if (eroded.paths.length === 0) return eroded;
144
+ const dilated = [];
145
+ for (const q of eroded.paths) {
146
+ dilated.push(...buffer(q, a).paths);
147
+ }
148
+ return group(dilated);
149
+ }
150
+ function dilationErosion(p, amount) {
151
+ const a = Math.abs(amount);
152
+ if (a < 1e-12) return group([p]);
153
+ const dilated = buffer(p, a);
154
+ if (dilated.paths.length === 0) return dilated;
155
+ const eroded = [];
156
+ for (const q of dilated.paths) {
157
+ eroded.push(...buffer(q, -a).paths);
158
+ }
159
+ return group(eroded);
160
+ }
161
+
162
+ // src/morphology/index.ts
163
+ function simplify(p, epsilon) {
164
+ if (epsilon <= 0 || p.rings.length === 0) return p;
165
+ const rings = [];
166
+ for (const ring of p.rings) {
167
+ const simplified = simplifyPathD(ringToPathD(ring), epsilon, p.closed);
168
+ const out = pathDToRing(simplified);
169
+ if (out.length >= (p.closed ? 3 : 2)) rings.push(out);
170
+ }
171
+ if (rings.length === 0) return path([], p.closed);
172
+ return path(rings, p.closed);
173
+ }
174
+ function reducePrecision(p, decimals) {
175
+ const f = 10 ** Math.max(0, Math.floor(decimals));
176
+ const round = (n) => Math.round(n * f) / f;
177
+ return path(
178
+ p.rings.map(
179
+ (ring) => normalizeRing(ring.map((v) => ({ x: round(v.x), y: round(v.y) })))
180
+ ),
181
+ p.closed
182
+ );
183
+ }
184
+ function chaikinCut(p, iterations = 1, ratio = 0.25) {
185
+ const r = Math.min(0.49, Math.max(0.01, ratio));
186
+ let rings = p.rings;
187
+ for (let i = 0; i < Math.max(1, Math.floor(iterations)); i++) {
188
+ rings = rings.map((ring) => chaikinRing(ring, r, p.closed));
189
+ }
190
+ return path(rings, p.closed);
191
+ }
192
+ function smooth(p, iterations = 2) {
193
+ return chaikinCut(p, iterations);
194
+ }
195
+ function radialWarp(p, amplitude, frequency = 3, phase = 0) {
196
+ const c = centroid(p);
197
+ return mapVerts(p, (v) => {
198
+ const dx = v.x - c.x;
199
+ const dy = v.y - c.y;
200
+ const dist = Math.hypot(dx, dy);
201
+ if (dist < 1e-12) return v;
202
+ const theta = Math.atan2(dy, dx);
203
+ const s = 1 + amplitude * Math.cos(frequency * theta + phase);
204
+ return { x: c.x + dx * s, y: c.y + dy * s };
205
+ });
206
+ }
207
+ function sineWarp(p, amplitude, frequency = 1, phase = 0) {
208
+ return mapVerts(p, (v) => ({
209
+ x: v.x,
210
+ y: v.y + amplitude * Math.sin(2 * Math.PI * frequency * v.x + phase)
211
+ }));
212
+ }
213
+ function minkSum(a, b) {
214
+ const pattern = ringToPathD(b.rings[0] ?? []);
215
+ const subject = ringToPathD(a.rings[0] ?? []);
216
+ return pathsDToGroup(minkowskiSumD(pattern, subject, true));
217
+ }
218
+ function minkDifference(a, b) {
219
+ const pattern = ringToPathD(b.rings[0] ?? []);
220
+ const subject = ringToPathD(a.rings[0] ?? []);
221
+ return pathsDToGroup(minkowskiDiffD(pattern, subject, true));
222
+ }
223
+ function chaikinRing(ring, ratio, closed) {
224
+ if (ring.length < 2) return ring.map((v) => ({ ...v }));
225
+ const out = [];
226
+ const n = ring.length;
227
+ const edges = closed ? n : n - 1;
228
+ for (let i = 0; i < edges; i++) {
229
+ const a = ring[i];
230
+ const b = ring[(i + 1) % n];
231
+ out.push({
232
+ x: a.x * (1 - ratio) + b.x * ratio,
233
+ y: a.y * (1 - ratio) + b.y * ratio
234
+ });
235
+ out.push({
236
+ x: a.x * ratio + b.x * (1 - ratio),
237
+ y: a.y * ratio + b.y * (1 - ratio)
238
+ });
239
+ }
240
+ if (!closed) {
241
+ out.unshift({ ...ring[0] });
242
+ out.push({ ...ring[n - 1] });
243
+ }
244
+ return closed ? normalizeRing(out) : out;
245
+ }
246
+ function mapVerts(p, fn) {
247
+ return path(
248
+ p.rings.map((ring) => normalizeRing(ring.map(fn))),
249
+ p.closed
250
+ );
251
+ }
252
+ var morphology = {
253
+ buffer,
254
+ erosionDilation,
255
+ dilationErosion,
256
+ simplify,
257
+ reducePrecision,
258
+ chaikinCut,
259
+ smooth,
260
+ radialWarp,
261
+ sineWarp,
262
+ minkSum,
263
+ minkDifference
264
+ };
265
+
266
+ export { buffer, chaikinCut, dilationErosion, erosionDilation, minkDifference, minkSum, morphology, radialWarp, reducePrecision, simplify, sineWarp, smooth };
267
+ //# sourceMappingURL=index.js.map
268
+ //# sourceMappingURL=index.js.map