pantograph2d 0.6.0 → 0.8.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 (132) hide show
  1. package/dist/Diagram-2450b2e6.js +1750 -0
  2. package/dist/Diagram-2450b2e6.js.map +1 -0
  3. package/dist/Diagram-57e17509.cjs +4 -0
  4. package/dist/Diagram-57e17509.cjs.map +1 -0
  5. package/dist/QuadraticBezier-e116a2d6.js +3647 -0
  6. package/dist/QuadraticBezier-e116a2d6.js.map +1 -0
  7. package/dist/QuadraticBezier-e3d7218b.cjs +9 -0
  8. package/dist/QuadraticBezier-e3d7218b.cjs.map +1 -0
  9. package/dist/algorithms/intersections/arcsCubicBezierIntersection.d.ts +5 -0
  10. package/dist/algorithms/intersections/arcsQuadraticBezierIntersection.d.ts +5 -0
  11. package/dist/algorithms/intersections/bezierClip.d.ts +28 -0
  12. package/dist/algorithms/intersections/cubicBezierCubicBezierIntersection.d.ts +4 -0
  13. package/dist/algorithms/intersections/lineBezierIntersection.d.ts +5 -0
  14. package/dist/algorithms/intersections/quadraticBezierQuadraticBezierIntersection.d.ts +4 -0
  15. package/dist/algorithms/optimisation/Brent.d.ts +6 -0
  16. package/dist/api/svg.d.ts +1 -0
  17. package/dist/draw-27ac6dae.cjs +2 -0
  18. package/dist/draw-27ac6dae.cjs.map +1 -0
  19. package/dist/draw-c7b2705c.js +344 -0
  20. package/dist/draw-c7b2705c.js.map +1 -0
  21. package/dist/{types/draw.d.ts → draw.d.ts} +15 -0
  22. package/dist/export/json/exportJSON.d.ts +393 -0
  23. package/dist/export/json/jsonDiagram.d.ts +135 -0
  24. package/dist/export/json/jsonFigure.d.ts +132 -0
  25. package/dist/export/json/jsonLoop.d.ts +65 -0
  26. package/dist/export/json/jsonSegment.d.ts +62 -0
  27. package/dist/export/svg/api.d.ts +6 -0
  28. package/dist/{types/export → export}/svg/exportSVG.d.ts +5 -5
  29. package/dist/{types/export → export}/svg/wrapSVG.d.ts +1 -1
  30. package/dist/{types/import → import}/json/importJSON.d.ts +3 -1
  31. package/dist/{types/main.d.ts → main.d.ts} +1 -1
  32. package/dist/{types/models → models}/BoundingBox.d.ts +3 -0
  33. package/dist/{types/models → models}/exports.d.ts +4 -0
  34. package/dist/models/segments/CubicBezier.d.ts +31 -0
  35. package/dist/models/segments/QuadraticBezier.d.ts +30 -0
  36. package/dist/models/segments/utils/deCasteljau.d.ts +3 -0
  37. package/dist/models/segments/utils/isSegment.d.ts +8 -0
  38. package/dist/pantograph/drawShape.cjs +1 -1
  39. package/dist/pantograph/drawShape.cjs.map +1 -1
  40. package/dist/pantograph/drawShape.js +12 -11
  41. package/dist/pantograph/drawShape.js.map +1 -1
  42. package/dist/pantograph/models.cjs +1 -1
  43. package/dist/pantograph/models.js +15 -10
  44. package/dist/pantograph/models.js.map +1 -1
  45. package/dist/pantograph/svg.cjs +2 -0
  46. package/dist/pantograph/svg.cjs.map +1 -0
  47. package/dist/pantograph/svg.js +11 -0
  48. package/dist/pantograph/svg.js.map +1 -0
  49. package/dist/pantograph.cjs +2 -8
  50. package/dist/pantograph.cjs.map +1 -1
  51. package/dist/pantograph.js +368 -375
  52. package/dist/pantograph.js.map +1 -1
  53. package/dist/utils/removeDuplicateValues.d.ts +1 -0
  54. package/dist/wrapSVG-02b823ac.cjs +8 -0
  55. package/dist/wrapSVG-02b823ac.cjs.map +1 -0
  56. package/dist/wrapSVG-0ec8a111.js +62 -0
  57. package/dist/wrapSVG-0ec8a111.js.map +1 -0
  58. package/package.json +33 -22
  59. package/dist/Diagram-ab93c8b7.cjs +0 -11
  60. package/dist/Diagram-ab93c8b7.cjs.map +0 -1
  61. package/dist/Diagram-d848c815.js +0 -4252
  62. package/dist/Diagram-d848c815.js.map +0 -1
  63. package/dist/draw-0f591ea4.cjs +0 -2
  64. package/dist/draw-0f591ea4.cjs.map +0 -1
  65. package/dist/draw-a830827a.js +0 -288
  66. package/dist/draw-a830827a.js.map +0 -1
  67. package/dist/types/export/json/exportJSON.d.ts +0 -196
  68. package/dist/types/export/json/jsonDiagram.d.ts +0 -69
  69. package/dist/types/export/json/jsonFigure.d.ts +0 -66
  70. package/dist/types/export/json/jsonLoop.d.ts +0 -32
  71. package/dist/types/export/json/jsonSegment.d.ts +0 -29
  72. /package/dist/{types/algorithms → algorithms}/boolean/figureBooleans.d.ts +0 -0
  73. /package/dist/{types/algorithms → algorithms}/boolean/loopBooleans.d.ts +0 -0
  74. /package/dist/{types/algorithms → algorithms}/boolean/strandBoolean.d.ts +0 -0
  75. /package/dist/{types/algorithms → algorithms}/boolean/strandsBetweenIntersections.d.ts +0 -0
  76. /package/dist/{types/algorithms → algorithms}/distances/arcArcDistance.d.ts +0 -0
  77. /package/dist/{types/algorithms → algorithms}/distances/genericDistance.d.ts +0 -0
  78. /package/dist/{types/algorithms → algorithms}/distances/index.d.ts +0 -0
  79. /package/dist/{types/algorithms → algorithms}/distances/lineArcDistance.d.ts +0 -0
  80. /package/dist/{types/algorithms → algorithms}/distances/lineLineDistance.d.ts +0 -0
  81. /package/dist/{types/algorithms → algorithms}/filletSegments.d.ts +0 -0
  82. /package/dist/{types/algorithms → algorithms}/intersections/arcArcIntersection.d.ts +0 -0
  83. /package/dist/{types/algorithms → algorithms}/intersections/arcEllipseArcIntersection.d.ts +0 -0
  84. /package/dist/{types/algorithms → algorithms}/intersections/ellipseArcEllipseArcIntersection.d.ts +0 -0
  85. /package/dist/{types/algorithms → algorithms}/intersections/ellipseEllipseIntersection.d.ts +0 -0
  86. /package/dist/{types/algorithms → algorithms}/intersections/index.d.ts +0 -0
  87. /package/dist/{types/algorithms → algorithms}/intersections/lineArcIntersection.d.ts +0 -0
  88. /package/dist/{types/algorithms → algorithms}/intersections/lineEllipseArcIntersection.d.ts +0 -0
  89. /package/dist/{types/algorithms → algorithms}/intersections/lineLineIntersection.d.ts +0 -0
  90. /package/dist/{types/algorithms → algorithms}/intersections/rayIntersections.d.ts +0 -0
  91. /package/dist/{types/algorithms → algorithms}/offsets/offsetFigure.d.ts +0 -0
  92. /package/dist/{types/algorithms → algorithms}/offsets/offsetSegment.d.ts +0 -0
  93. /package/dist/{types/algorithms → algorithms}/offsets/offsetStroke.d.ts +0 -0
  94. /package/dist/{types/algorithms → algorithms}/optimisation/DiRect.d.ts +0 -0
  95. /package/dist/{types/algorithms → algorithms}/organiseLoops.d.ts +0 -0
  96. /package/dist/{types/algorithms → algorithms}/simplify.d.ts +0 -0
  97. /package/dist/{types/algorithms → algorithms}/solvers/solvePolynomials.d.ts +0 -0
  98. /package/dist/{types/algorithms → algorithms}/stitchSegments.d.ts +0 -0
  99. /package/dist/{types/api → api}/drawShape.d.ts +0 -0
  100. /package/dist/{types/api → api}/models.d.ts +0 -0
  101. /package/dist/{types/booleanOperations.d.ts → booleanOperations.d.ts} +0 -0
  102. /package/dist/{types/definitions.d.ts → definitions.d.ts} +0 -0
  103. /package/dist/{types/drawShape → drawShape}/drawCircle.d.ts +0 -0
  104. /package/dist/{types/drawShape → drawShape}/drawRect.d.ts +0 -0
  105. /package/dist/{types/export → export}/svg/svgDiagram.d.ts +0 -0
  106. /package/dist/{types/export → export}/svg/svgFigure.d.ts +0 -0
  107. /package/dist/{types/export → export}/svg/svgLoop.d.ts +0 -0
  108. /package/dist/{types/export → export}/svg/svgSegment.d.ts +0 -0
  109. /package/dist/{types/export → export}/svg/svgStrand.d.ts +0 -0
  110. /package/dist/{types/models → models}/Diagram.d.ts +0 -0
  111. /package/dist/{types/models → models}/Figure.d.ts +0 -0
  112. /package/dist/{types/models → models}/Loop.d.ts +0 -0
  113. /package/dist/{types/models → models}/Strand.d.ts +0 -0
  114. /package/dist/{types/models → models}/Stroke.d.ts +0 -0
  115. /package/dist/{types/models → models}/TransformationMatrix.d.ts +0 -0
  116. /package/dist/{types/models → models}/segments/Arc.d.ts +0 -0
  117. /package/dist/{types/models → models}/segments/EllipseArc.d.ts +0 -0
  118. /package/dist/{types/models → models}/segments/Line.d.ts +0 -0
  119. /package/dist/{types/models → models}/segments/Segment.d.ts +0 -0
  120. /package/dist/{types/models → models}/utils/Transformable.d.ts +0 -0
  121. /package/dist/{types/offsetOperations.d.ts → offsetOperations.d.ts} +0 -0
  122. /package/dist/{types/operations.d.ts → operations.d.ts} +0 -0
  123. /package/dist/{types/utils → utils}/allCombinations.d.ts +0 -0
  124. /package/dist/{types/utils → utils}/allPairs.d.ts +0 -0
  125. /package/dist/{types/utils → utils}/angularDistance.d.ts +0 -0
  126. /package/dist/{types/utils → utils}/listOfFigures.d.ts +0 -0
  127. /package/dist/{types/utils → utils}/projectPointOnLine.d.ts +0 -0
  128. /package/dist/{types/utils → utils}/range.d.ts +0 -0
  129. /package/dist/{types/utils → utils}/removeDuplicatePoints.d.ts +0 -0
  130. /package/dist/{types/utils → utils}/unitAngle.d.ts +0 -0
  131. /package/dist/{types/utils → utils}/zip.d.ts +0 -0
  132. /package/dist/{types/vectorOperations.d.ts → vectorOperations.d.ts} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"file":"Diagram-ab93c8b7.cjs","sources":["../src/models/BoundingBox.ts","../src/utils/removeDuplicatePoints.ts","../src/vectorOperations.ts","../src/models/TransformationMatrix.ts","../src/models/utils/Transformable.ts","../src/models/segments/Segment.ts","../src/models/segments/Line.ts","../src/utils/range.ts","../src/utils/zip.ts","../src/utils/unitAngle.ts","../src/utils/angularDistance.ts","../src/algorithms/intersections/lineLineIntersection.ts","../src/models/segments/Arc.ts","../src/utils/projectPointOnLine.ts","../src/algorithms/intersections/lineArcIntersection.ts","../src/algorithms/intersections/arcArcIntersection.ts","../src/models/segments/EllipseArc.ts","../src/algorithms/intersections/lineEllipseArcIntersection.ts","../../../node_modules/.pnpm/is-any-array@2.0.1/node_modules/is-any-array/lib-esm/index.js","../../../node_modules/.pnpm/ml-array-max@1.2.4/node_modules/ml-array-max/lib-es6/index.js","../../../node_modules/.pnpm/ml-array-min@1.2.3/node_modules/ml-array-min/lib-es6/index.js","../../../node_modules/.pnpm/ml-array-rescale@1.3.7/node_modules/ml-array-rescale/lib-es6/index.js","../../../node_modules/.pnpm/ml-matrix@6.10.4/node_modules/ml-matrix/src/inspect.js","../../../node_modules/.pnpm/ml-matrix@6.10.4/node_modules/ml-matrix/src/mathOperations.js","../../../node_modules/.pnpm/ml-matrix@6.10.4/node_modules/ml-matrix/src/util.js","../../../node_modules/.pnpm/ml-matrix@6.10.4/node_modules/ml-matrix/src/stat.js","../../../node_modules/.pnpm/ml-matrix@6.10.4/node_modules/ml-matrix/src/matrix.js","../../../node_modules/.pnpm/ml-matrix@6.10.4/node_modules/ml-matrix/src/wrap/WrapperMatrix2D.js","../../../node_modules/.pnpm/ml-matrix@6.10.4/node_modules/ml-matrix/src/dc/util.js","../../../node_modules/.pnpm/ml-matrix@6.10.4/node_modules/ml-matrix/src/dc/evd.js","../src/algorithms/solvers/solvePolynomials.ts","../src/algorithms/intersections/ellipseEllipseIntersection.ts","../src/algorithms/intersections/arcEllipseArcIntersection.ts","../src/algorithms/intersections/ellipseArcEllipseArcIntersection.ts","../src/algorithms/intersections/index.ts","../src/utils/allCombinations.ts","../src/models/Stroke.ts","../src/algorithms/simplify.ts","../src/models/Strand.ts","../src/algorithms/intersections/rayIntersections.ts","../src/models/Loop.ts","../src/export/json/jsonSegment.ts","../src/export/json/jsonLoop.ts","../src/export/json/jsonFigure.ts","../src/export/json/jsonDiagram.ts","../src/export/json/exportJSON.ts","../../../node_modules/.pnpm/flatqueue@2.0.3/node_modules/flatqueue/index.js","../../../node_modules/.pnpm/flatbush@4.1.0/node_modules/flatbush/index.js","../src/algorithms/stitchSegments.ts","../src/models/Figure.ts","../src/algorithms/organiseLoops.ts","../src/utils/allPairs.ts","../src/algorithms/boolean/strandsBetweenIntersections.ts","../src/algorithms/boolean/loopBooleans.ts","../src/algorithms/boolean/figureBooleans.ts","../src/models/Diagram.ts"],"sourcesContent":["import { Vector } from \"../definitions.js\";\n\nfunction overlap1D(\n min1: number,\n max1: number,\n min2: number,\n max2: number\n): boolean {\n return min1 <= max2 && max1 >= min2;\n}\n\nexport class BoundingBox {\n readonly xMin: number;\n readonly yMin: number;\n\n readonly xMax: number;\n readonly yMax: number;\n\n constructor(\n xMin = Infinity,\n yMin = Infinity,\n xMax = -Infinity,\n yMax = -Infinity\n ) {\n this.xMin = xMin;\n this.yMin = yMin;\n this.xMax = xMax;\n this.yMax = yMax;\n }\n\n get width(): number {\n return this.xMax - this.xMin;\n }\n\n get height(): number {\n return this.yMax - this.yMin;\n }\n\n contains(point: Vector): boolean {\n const [x, y] = point;\n return (\n overlap1D(this.xMin, this.xMax, x, x) &&\n overlap1D(this.yMin, this.yMax, y, y)\n );\n }\n\n overlaps(other: BoundingBox): boolean {\n return (\n overlap1D(this.xMin, this.xMax, other.xMin, other.xMax) &&\n overlap1D(this.yMin, this.yMax, other.yMin, other.yMax)\n );\n }\n\n addPoint(point: Vector): BoundingBox {\n const [x, y] = point;\n return new BoundingBox(\n Math.min(this.xMin, x),\n Math.min(this.yMin, y),\n\n Math.max(this.xMax, x),\n Math.max(this.yMax, y)\n );\n }\n\n merge(other: BoundingBox): BoundingBox {\n return new BoundingBox(\n Math.min(this.xMin, other.xMin),\n Math.min(this.yMin, other.yMin),\n Math.max(this.xMax, other.xMax),\n Math.max(this.yMax, other.yMax)\n );\n }\n}\n\nexport function pointsBoundingBox(points: Vector[]): BoundingBox {\n return points.reduce((box, point) => box.addPoint(point), new BoundingBox());\n}\n","import type { Vector } from \"../definitions.js\";\n\nconst asFixed = (p: number, precision = 1e-9): string => {\n let num = p;\n if (Math.abs(p) < precision) num = 0;\n return num.toFixed(-Math.log10(precision));\n};\nexport default function removeDuplicatePoints(\n points: Vector[],\n precision = 1e-9\n): Vector[] {\n return Array.from(\n new Map(\n points.map(([p0, p1]) => [\n `[${asFixed(p0, precision)},${asFixed(p1, precision)}]`,\n [p0, p1] as Vector,\n ])\n ).values()\n );\n}\n","import type { Vector } from \"./definitions.js\";\n\nexport const DEG2RAD = Math.PI / 180;\nexport const RAD2DEG = 180 / Math.PI;\n\nexport const reprVector = (vector: Vector): string => {\n return `[${vector[0]}, ${vector[1]}]`;\n};\n\nexport const sameVector = (\n [x0, y0]: Vector,\n [x1, y1]: Vector,\n precision = 1e-9\n): boolean => {\n return Math.abs(x0 - x1) <= precision && Math.abs(y0 - y1) <= precision;\n};\n\nexport const add = ([x0, y0]: Vector, [x1, y1]: Vector): Vector => {\n return [x0 + x1, y0 + y1];\n};\n\nexport const subtract = ([x0, y0]: Vector, [x1, y1]: Vector): Vector => {\n return [x0 - x1, y0 - y1];\n};\n\nexport const squareLength = ([x, y]: Vector): number => {\n return x * x + y * y;\n};\n\nexport const length = ([x, y]: Vector): number => {\n return Math.sqrt(squareLength([x, y]));\n};\n\nexport const scalarMultiply = ([x0, y0]: Vector, scalar: number): Vector => {\n return [x0 * scalar, y0 * scalar];\n};\n\nexport const squareDistance = (\n [x0, y0]: Vector,\n [x1, y1]: Vector = [0, 0]\n): number => {\n return (x0 - x1) ** 2 + (y0 - y1) ** 2;\n};\n\nexport const distance = (p0: Vector, p1: Vector = [0, 0]): number => {\n return Math.sqrt(squareDistance(p0, p1));\n};\n\nexport function crossProduct([x0, y0]: Vector, [x1, y1]: Vector): number {\n return x0 * y1 - y0 * x1;\n}\n\nexport function dotProduct([x0, y0]: Vector, [x1, y1]: Vector): number {\n return x0 * x1 + y0 * y1;\n}\n\nexport const angle = ([x0, y0]: Vector, [x1, y1]: Vector = [0, 0]): number => {\n return Math.atan2(y1 * x0 - y0 * x1, x0 * x1 + y0 * y1);\n};\n\nexport function normalize([x0, y0]: Vector): Vector {\n const l = distance([x0, y0]);\n return [x0 / l, y0 / l];\n}\n\nexport function polarToCartesian(r: number, theta: number): Vector {\n const x = Math.cos(theta) * r;\n const y = Math.sin(theta) * r;\n return [x, y];\n}\n\nexport function polarAngle([x, y]: Vector): number {\n return Math.atan2(y, x);\n}\n\nexport function cartesianToPolar(v: Vector): [number, number] {\n const r = distance(v);\n const theta = polarAngle(v);\n\n return [r, theta];\n}\n\nexport function parallel(v1: Vector, v2: Vector, precision = 1e-9): boolean {\n const V1xV2 = crossProduct(v1, v2);\n\n const xLength = squareLength(v1);\n const yLength = squareLength(v2);\n\n return V1xV2 * V1xV2 < xLength * yLength * precision * precision;\n}\n\nexport function perpendicular(v: Vector): Vector {\n return [-v[1], v[0]];\n}\n\nexport function perpendicularClockwise(v: Vector): Vector {\n return [v[1], -v[0]];\n}\n\nexport function isOnAxis(point: Vector, direction: Vector, center: Vector): boolean {\n return sameVector(center, point) || parallel(subtract(center, point), direction);\n}\n","import { Vector } from \"../definitions.js\";\n\ntype Matrix = [\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number\n];\n\nconst matMult = (m1: Matrix, m2: Matrix): Matrix => {\n const [a, b, c, d, e, f, g, h, i] = m1;\n const [j, k, l, m, n, o, p, q, r] = m2;\n return [\n a * j + b * m + c * p,\n a * k + b * n + c * q,\n a * l + b * o + c * r,\n d * j + e * m + f * p,\n d * k + e * n + f * q,\n d * l + e * o + f * r,\n g * j + h * m + i * p,\n g * k + h * n + i * q,\n g * l + h * o + i * r,\n ];\n};\n\nconst inverse = (m: Matrix): Matrix => {\n const [a, b, c, d, e, f, g, h, i] = m;\n const det = a * (e * i - f * h) - b * (d * i - f * g) + c * (d * h - e * g);\n return [\n (e * i - f * h) / det,\n (c * h - b * i) / det,\n (b * f - c * e) / det,\n (f * g - d * i) / det,\n (a * i - c * g) / det,\n (c * d - a * f) / det,\n (d * h - e * g) / det,\n (b * g - a * h) / det,\n (a * e - b * d) / det,\n ];\n};\n\nconst transpose = (m: Matrix): Matrix => {\n const [a, b, c, d, e, f, g, h, i] = m;\n return [a, d, g, b, e, h, c, f, i];\n};\n\nexport class TransformationMatrix {\n private _matrix: Matrix = [1, 0, 0, 0, 1, 0, 0, 0, 1];\n\n constructor(matrix?: Matrix) {\n if (matrix) this._matrix = [...matrix];\n }\n\n clone(): TransformationMatrix {\n return new TransformationMatrix(this._matrix);\n }\n\n transpose(): TransformationMatrix {\n this._matrix = transpose(this._matrix);\n return this;\n }\n\n inverse(): TransformationMatrix {\n this._matrix = inverse(this._matrix);\n return this;\n }\n\n translate(x: number, y: number): TransformationMatrix {\n this._matrix = matMult(this._matrix, [1, 0, x, 0, 1, y, 0, 0, 1]);\n return this;\n }\n\n rotate(angle: number, center?: Vector): TransformationMatrix {\n const cos = Math.cos(angle);\n const sin = Math.sin(angle);\n\n const rotationMatrix: Matrix = [cos, -sin, 0, sin, cos, 0, 0, 0, 1];\n\n if (center) this.translate(center[0], center[1]);\n this._matrix = matMult(this._matrix, rotationMatrix);\n if (center) this.translate(-center[0], -center[1]);\n\n return this;\n }\n\n mirrorX(): TransformationMatrix {\n this._matrix = matMult(this._matrix, [1, 0, 0, 0, -1, 0, 0, 0, 1]);\n return this;\n }\n\n mirrorY(): TransformationMatrix {\n this._matrix = matMult(this._matrix, [-1, 0, 0, 0, 1, 0, 0, 0, 1]);\n return this;\n }\n\n mirrorLine(normal: Vector, point?: Vector): TransformationMatrix {\n const [a, b] = normal;\n\n const angle = Math.atan2(b, a);\n\n if (point) this.translate(point[0], point[1]);\n this.rotate(angle);\n this.mirrorX();\n this.rotate(-angle);\n if (point) this.translate(-point[0], -point[1]);\n return this;\n }\n\n mirrorCenter(center?: Vector): TransformationMatrix {\n if (center) this.translate(center[0], center[1]);\n this._matrix = matMult(this._matrix, [-1, 0, 0, 0, -1, 0, 0, 0, 1]);\n if (center) this.translate(-center[0], -center[1]);\n return this;\n }\n\n scale(scalar: number, center?: Vector): TransformationMatrix {\n if (center) this.translate(center[0], center[1]);\n this._matrix = matMult(this._matrix, [scalar, 0, 0, 0, scalar, 0, 0, 0, 1]);\n if (center) this.translate(-center[0], -center[1]);\n\n return this;\n }\n\n transform(point: Vector): Vector {\n const [x, y] = point;\n const [a, b, c, d, e, f] = this._matrix;\n return [a * x + b * y + c, d * x + e * y + f];\n }\n\n transformAngle(angle: number): number {\n const [a, b] = this.transform([Math.cos(angle), Math.sin(angle)]);\n const [originA, originB] = this.transform([0, 0]);\n return Math.atan2(b - originB, a - originA);\n }\n\n keepsOrientation(): boolean {\n const [a, , , , e] = this._matrix;\n return a * e > 0;\n }\n\n scaleFactor(): number {\n const [a, , , d] = this._matrix;\n return Math.sqrt(a * a + d * d);\n }\n}\n","import { Vector } from \"../../definitions.js\";\nimport { DEG2RAD } from \"../../vectorOperations.js\";\nimport { TransformationMatrix } from \"../TransformationMatrix.js\";\n\nexport abstract class Transformable<T> {\n abstract transform(matrix: TransformationMatrix): T;\n translateX(x: number): T {\n const transform = new TransformationMatrix().translate(x, 0);\n return this.transform(transform);\n }\n\n translateY(y: number): T {\n const transform = new TransformationMatrix().translate(0, y);\n return this.transform(transform);\n }\n\n translate(x: number, y: number): T {\n const transform = new TransformationMatrix().translate(x, y);\n return this.transform(transform);\n }\n\n translateTo([x, y]: Vector): T {\n const transform = new TransformationMatrix().translate(x, y);\n return this.transform(transform);\n }\n\n rotate(angle: number, center?: Vector): T {\n const transform = new TransformationMatrix().rotate(\n angle * DEG2RAD,\n center\n );\n return this.transform(transform);\n }\n\n scale(factor: number, center?: Vector): T {\n const transform = new TransformationMatrix().scale(factor, center);\n return this.transform(transform);\n }\n\n mirrorCenter(center?: Vector): T {\n const transform = new TransformationMatrix().mirrorCenter(center);\n return this.transform(transform);\n }\n\n mirror(axis?: \"x\" | \"y\"): T;\n mirror(direction: Vector, center?: Vector): T;\n mirror(axisOrDirection: \"x\" | \"y\" | Vector = \"x\", center?: Vector): T {\n const transform = new TransformationMatrix();\n if (axisOrDirection === \"x\") {\n transform.mirrorX();\n } else if (axisOrDirection === \"y\") {\n transform.mirrorY();\n } else {\n transform.mirrorLine(axisOrDirection, center);\n }\n return this.transform(transform);\n }\n}\n","import type { Vector } from \"../../definitions.js\";\nimport { BoundingBox } from \"../BoundingBox.js\";\nimport type { TransformationMatrix } from \"../TransformationMatrix.js\";\nimport { reprVector } from \"../../vectorOperations.js\";\nimport { Transformable } from \"../utils/Transformable.js\";\n\nexport type Segment = AbstractSegment<any>;\n\nexport abstract class AbstractSegment<\n T extends AbstractSegment<T>\n> extends Transformable<T> {\n constructor(public firstPoint: Vector, public lastPoint: Vector) {\n super();\n this.firstPoint = firstPoint;\n this.lastPoint = lastPoint;\n }\n\n readonly precision: number = 1e-9;\n\n abstract segmentType: string;\n\n get repr() {\n return `${this.segmentType} ${reprVector(this.firstPoint)} - ${reprVector(\n this.lastPoint\n )}`;\n }\n get info() {\n return this.repr;\n }\n\n abstract get midPoint(): Vector;\n\n abstract get boundingBox(): BoundingBox;\n\n abstract clone(): T;\n\n abstract reverse(): T;\n\n abstract isSame(other: AbstractSegment<any>): boolean;\n\n abstract distanceFrom(element: Vector): number;\n\n abstract isOnSegment(point: Vector): boolean;\n\n abstract gradientAt(param: number): Vector;\n\n abstract tangentAt(point: Vector): Vector;\n\n abstract get tangentAtFirstPoint(): Vector;\n abstract get tangentAtLastPoint(): Vector;\n\n abstract splitAt(points: Vector[] | number[]): T[];\n\n abstract transform(matrix: TransformationMatrix): T;\n\n [Symbol.for(\"nodejs.util.inspect.custom\")]() {\n return this.repr;\n }\n\n abstract paramPoint(t: number): Vector;\n}\n","import { BoundingBox } from \"../BoundingBox.js\";\nimport { Vector } from \"../../definitions.js\";\nimport { TransformationMatrix } from \"../TransformationMatrix.js\";\nimport removeDuplicatePoints from \"../../utils/removeDuplicatePoints.js\";\nimport {\n add,\n distance,\n dotProduct,\n normalize,\n parallel,\n perpendicular,\n reprVector,\n sameVector,\n scalarMultiply,\n squareDistance,\n subtract,\n} from \"../../vectorOperations\";\nimport { Segment, AbstractSegment } from \"./Segment.js\";\n\nexport class Line extends AbstractSegment<Line> {\n segmentType = \"LINE\";\n isValidParameter(t: number): boolean {\n const linearPrecision = this.length * this.precision;\n return t >= -linearPrecision && 1 - t >= -linearPrecision;\n }\n\n paramPoint(t: number): Vector {\n return add(this.firstPoint, scalarMultiply(this.V, t));\n }\n\n get length(): number {\n return distance(this.firstPoint, this.lastPoint);\n }\n\n get squareLength(): number {\n return squareDistance(this.firstPoint, this.lastPoint);\n }\n\n private _V: Vector | null = null;\n get V(): Vector {\n if (this._V === null) {\n this._V = subtract(this.lastPoint, this.firstPoint);\n }\n return this._V;\n }\n\n private _slope: number | null = null;\n get slope(): number {\n if (this._slope === null) {\n const [x, y] = this.V;\n this._slope = y / x;\n }\n return this._slope;\n }\n\n private _yIntercept: number | null = null;\n get yIntercept(): number {\n if (this._yIntercept === null) {\n this._yIntercept = this.firstPoint[1] - this.slope * this.firstPoint[0];\n }\n return this._yIntercept;\n }\n\n get midPoint(): Vector {\n return add(this.firstPoint, scalarMultiply(this.V, 0.5));\n }\n\n isSame(other: Segment): boolean {\n if (!(other instanceof Line)) return false;\n return (\n (sameVector(this.firstPoint, other.firstPoint) &&\n sameVector(this.lastPoint, other.lastPoint)) ||\n (sameVector(this.lastPoint, other.firstPoint) &&\n sameVector(this.firstPoint, other.lastPoint))\n );\n }\n\n clone(): Line {\n return new Line(this.firstPoint, this.lastPoint);\n }\n\n reverse(): Line {\n return new Line(this.lastPoint, this.firstPoint);\n }\n\n private _boundingBox: BoundingBox | null = null;\n get boundingBox(): BoundingBox {\n if (this._boundingBox === null) {\n this._boundingBox = new BoundingBox(\n Math.min(this.firstPoint[0], this.lastPoint[0]) - this.precision,\n Math.min(this.firstPoint[1], this.lastPoint[1]) - this.precision,\n Math.max(this.firstPoint[0], this.lastPoint[0]) + this.precision,\n Math.max(this.firstPoint[1], this.lastPoint[1]) + this.precision\n );\n }\n return this._boundingBox;\n }\n\n distanceFrom(point: Vector): number {\n const delta = subtract(point, this.firstPoint);\n const u = dotProduct(delta, this.V) / this.squareLength;\n\n if (u < 0) {\n return distance(point, this.firstPoint);\n }\n\n if (u > 1) {\n return distance(point, this.lastPoint);\n }\n\n const intersection = this.paramPoint(u);\n return distance(point, intersection);\n }\n isOnSegment(point: Vector): boolean {\n if (sameVector(point, this.firstPoint, this.precision)) return true;\n const pointVec = subtract(point, this.firstPoint);\n\n if (!parallel(this.V, pointVec)) return false;\n\n const u = dotProduct(pointVec, this.V) / this.squareLength;\n return this.isValidParameter(u);\n }\n\n gradientAt(param: number): Vector {\n return this.V;\n }\n\n tangentAt(point: Vector): Vector {\n if (!this.isOnSegment(point)) throw new Error(\"Point is not on segment\");\n return normalize(this.V);\n }\n\n get normalVector() {\n return perpendicular(normalize(this.V));\n }\n\n get tangentAtFirstPoint(): Vector {\n return normalize(this.V);\n }\n\n get tangentAtLastPoint(): Vector {\n return normalize(this.V);\n }\n\n splitAt(points: Vector | Vector[]): Line[] {\n let splitPoints: Vector[];\n if (Array.isArray(points) && points.length === 0) {\n return [this];\n }\n if (!Array.isArray(points[0])) {\n splitPoints = [points as Vector];\n } else {\n splitPoints = points as Vector[];\n }\n\n // Check that all points are on the segment\n splitPoints.forEach((point) => {\n if (!this.isOnSegment(point))\n throw new Error(\n `Point ${reprVector(point)} is not on segment ${this.repr}`\n );\n });\n\n const allPoints = [this.firstPoint, ...splitPoints, this.lastPoint];\n const uniquePoints = removeDuplicatePoints(allPoints);\n\n // Sort the points to make sure they go from the first point to the last\n const xChange = this.lastPoint[0] - this.firstPoint[0];\n let defaultDir = Math.sign(xChange);\n let comparisonAxis = 0;\n\n if (Math.abs(xChange) < this.precision) {\n defaultDir = Math.sign(this.lastPoint[1] - this.firstPoint[1]);\n comparisonAxis = 1;\n }\n\n uniquePoints.sort(\n (a, b) => defaultDir * (a[comparisonAxis] - b[comparisonAxis])\n );\n\n return uniquePoints.flatMap((point, index) => {\n if (index === uniquePoints.length - 1) return [];\n return new Line(point, uniquePoints[index + 1]);\n });\n }\n\n transform(matrix: TransformationMatrix): Line {\n return new Line(\n matrix.transform(this.firstPoint),\n matrix.transform(this.lastPoint)\n );\n }\n}\n","export default function range(len: number): number[] {\n return Array.from(Array(len).keys());\n}\n","import range from \"./range.js\";\n\nexport default function zip<T extends unknown[][]>(\n arrays: T\n): { [K in keyof T]: T[K] extends (infer V)[] ? V : never }[] {\n const minLength = Math.min(...arrays.map((arr) => arr.length));\n // @ts-expect-error This is too much for ts\n return range(minLength).map((i) => arrays.map((arr) => arr[i]));\n}\n","// makes sure the angle is in one unit circle\nexport function unitAngle(angle: number, precision = 1e-9) {\n if (angle < 0) {\n return angle + 2 * Math.PI;\n }\n if (angle >= 2 * Math.PI) {\n return angle % (2 * Math.PI);\n }\n\n if (angle > 2 * Math.PI - precision) {\n return 0;\n }\n\n return angle;\n}\n","export function angularDistance(\n angle1: number,\n angle2: number,\n clockwise: boolean,\n precision = 1e-9\n) {\n let relDistance = angle2 - angle1;\n\n if (clockwise) {\n relDistance = -relDistance;\n }\n\n if (relDistance < 0) {\n relDistance += 2 * Math.PI;\n }\n\n if (relDistance > 2 * Math.PI - precision) {\n return 0;\n }\n\n return relDistance;\n}\n","import { crossProduct, squareLength, subtract } from \"../../vectorOperations.js\";\nimport { Line } from \"../../models/segments/Line.js\";\nimport { Vector } from \"../../definitions.js\";\nimport removeDuplicatePoints from \"../../utils/removeDuplicatePoints.js\";\n\nexport const lineLineParams = (\n line1: { V: Vector; firstPoint: Vector; precision: number },\n line2: { V: Vector; firstPoint: Vector; precision: number },\n precision?: number\n):\n | \"parallel\"\n | {\n intersectionParam1: number;\n intersectionParam2: number;\n } => {\n const V1xV2 = crossProduct(line1.V, line2.V);\n\n const xLength = squareLength(line1.V);\n const yLength = squareLength(line2.V);\n\n const squarePrecision = precision\n ? precision * precision\n : line1.precision * line2.precision;\n\n if (V1xV2 * V1xV2 < xLength * yLength * squarePrecision) {\n return \"parallel\";\n }\n\n const diffPoint = subtract(line2.firstPoint, line1.firstPoint);\n\n const intersectionParam1 = crossProduct(diffPoint, line2.V) / V1xV2;\n const intersectionParam2 = crossProduct(diffPoint, line1.V) / V1xV2;\n\n return {\n intersectionParam1,\n intersectionParam2,\n };\n};\n/**\n * Returns the intersection point between two segment of lines\n *\n * Note that collinear segments are not considered to intersect at all.\n * Additionally, if the segments intersect at a start or end point of one of the\n * segments, the intersection point is considered to be an intersection.\n *\n * @param line1\n * @param line2\n * @returns {Vector} the intersection point or null if the segments do not\n * intersect\n *\n **/\n\nexport function lineLineIntersection(\n line1: Line,\n line2: Line,\n includeOverlaps = false,\n precision?: number\n): null | Vector | Line {\n const intersectionParams = lineLineParams(line1, line2, precision);\n if (intersectionParams === \"parallel\") {\n if (!includeOverlaps) return null;\n if (line1.isSame(line2)) return line1;\n\n const points = removeDuplicatePoints(\n [\n line2.isOnSegment(line1.firstPoint) ? line1.firstPoint : null,\n line2.isOnSegment(line1.lastPoint) ? line1.lastPoint : null,\n line1.isOnSegment(line2.firstPoint) ? line2.firstPoint : null,\n line1.isOnSegment(line2.lastPoint) ? line2.lastPoint : null,\n ].filter((p) => p !== null) as Vector[]\n ).sort((a, b) => a[0] - b[0]);\n\n if (points.length === 0) return null;\n // We consider the case when the lines are collinear and touch only on\n // the last point. We consider that they do not overlap there\n // We might want to revisit this choice\n else if (points.length === 1) return null;\n else if (points.length === 2) return new Line(points[0], points[1]);\n else {\n console.error(points);\n throw new Error(\n \"Unexpected number of points while intersecting parallel lines\"\n );\n }\n }\n\n const { intersectionParam1, intersectionParam2 } = intersectionParams;\n if (!line1.isValidParameter(intersectionParam1)) return null;\n if (!line2.isValidParameter(intersectionParam2)) return null;\n\n return line1.paramPoint(intersectionParam1);\n}\n","import { BoundingBox } from \"../BoundingBox.js\";\nimport { Vector } from \"../../definitions.js\";\nimport { TransformationMatrix } from \"../TransformationMatrix.js\";\nimport {\n add,\n cartesianToPolar,\n crossProduct,\n distance,\n normalize,\n perpendicular,\n perpendicularClockwise,\n polarToCartesian,\n reprVector,\n sameVector,\n scalarMultiply,\n squareDistance,\n subtract,\n} from \"../../vectorOperations\";\nimport { Segment, AbstractSegment } from \"./Segment.js\";\nimport zip from \"../../utils/zip.js\";\nimport { unitAngle } from \"../../utils/unitAngle.js\";\nimport { angularDistance } from \"../../utils/angularDistance.js\";\nimport { Line } from \"./Line.js\";\nimport { lineLineParams } from \"../../algorithms/intersections/lineLineIntersection.js\";\n\nconst polarCoordsFromCenter = (point: Vector, center: Vector) => {\n const vector = subtract(point, center);\n return cartesianToPolar(vector);\n};\n\nexport class Arc extends AbstractSegment<Arc> {\n segmentType = \"ARC\";\n\n readonly center: Vector;\n readonly clockwise: boolean;\n\n constructor(\n firstPoint: Vector,\n lastPoint: Vector,\n center: Vector,\n clockwise = false,\n { ignoreChecks = false } = {}\n ) {\n super(firstPoint, lastPoint);\n this.center = center;\n this.clockwise = clockwise;\n\n if (!ignoreChecks) {\n if (sameVector(firstPoint, lastPoint)) {\n throw new Error(\"Invalid arc, cannot be a full circle\");\n }\n if (\n Math.abs(this.radius - distance(this.lastPoint, this.center)) >\n this.precision\n )\n throw new Error(\n `Invalid arc, radius does not match between ${reprVector(\n firstPoint\n )} and ${reprVector(lastPoint)}} (center ${reprVector(center)})`\n );\n }\n }\n\n get info() {\n return `ARC(${reprVector(this.firstPoint)}, ${reprVector(\n this.lastPoint\n )}, ${reprVector(this.center)}, ${this.clockwise ? \"CW\" : \"CCW\"})`;\n }\n\n private _coefficients: {\n x2: number;\n xy: number;\n y2: number;\n x: number;\n y: number;\n c: number;\n } | null = null;\n get coefficients(): {\n x2: number;\n xy: number;\n y2: number;\n x: number;\n y: number;\n c: number;\n } {\n if (this._coefficients === null) {\n const [x0, y0] = this.center;\n const r2 = this.radius * this.radius;\n\n this._coefficients = {\n x2: 1 / r2,\n xy: 0,\n y2: 1 / r2,\n x: -(2 * x0) / r2,\n y: -(2 * y0) / r2,\n c: (x0 * x0 + y0 * y0 - r2) / r2,\n };\n }\n return this._coefficients;\n }\n\n isValidParameter(t: number): boolean {\n return 1 - t >= -this.precision && t >= -this.precision;\n }\n\n angleToParam(angle: number): number {\n return (\n angularDistance(this.firstAngle, unitAngle(angle), this.clockwise) /\n this.angularLength\n );\n }\n\n private _angularLength: number | null = null;\n get angularLength() {\n if (!this._angularLength) {\n this._angularLength = angularDistance(\n this.firstAngle,\n this.lastAngle,\n this.clockwise\n );\n }\n return this._angularLength;\n }\n\n paramPoint(t: number): Vector {\n return add(\n this.center,\n polarToCartesian(\n this.radius,\n this.firstAngle + t * this.angularLength * (this.clockwise ? -1 : 1)\n )\n );\n }\n\n pointToParam(point: Vector): number {\n const [r, theta] = polarCoordsFromCenter(point, this.center);\n if (Math.abs(r - this.radius) > this.precision)\n throw new Error(\n `Point ${reprVector(point)} is not on segment ${this.repr}`\n );\n\n const param = this.angleToParam(theta);\n if (!this.isValidParameter(param))\n throw new Error(\n `Point ${reprVector(point)} is not on segment ${this.repr}`\n );\n\n return param;\n }\n\n private _radius: number | null = null;\n get radius(): number {\n if (this._radius === null) {\n this._radius = distance(this.firstPoint, this.center);\n }\n return this._radius;\n }\n\n private _firstAngle: number | null = null;\n get firstAngle(): number {\n if (this._firstAngle === null) {\n const [x, y] = subtract(this.firstPoint, this.center);\n this._firstAngle = unitAngle(Math.atan2(y, x));\n }\n return this._firstAngle;\n }\n\n private _lastAngle: number | null = null;\n get lastAngle(): number {\n if (this._lastAngle === null) {\n const [x, y] = subtract(this.lastPoint, this.center);\n this._lastAngle = unitAngle(Math.atan2(y, x));\n }\n return this._lastAngle;\n }\n\n get length(): number {\n return this.radius * this.angularLength;\n }\n\n get squareLength(): number {\n return this.length * this.length;\n }\n\n get midPoint(): Vector {\n return this.paramPoint(0.5);\n }\n\n isSame(other: Segment): boolean {\n if (!(other instanceof Arc)) return false;\n if (!sameVector(this.center, other.center)) return false;\n\n return (\n (sameVector(this.firstPoint, other.firstPoint) &&\n sameVector(this.lastPoint, other.lastPoint) &&\n this.clockwise === other.clockwise) ||\n (sameVector(this.lastPoint, other.firstPoint) &&\n sameVector(this.firstPoint, other.lastPoint) &&\n this.clockwise === !other.clockwise)\n );\n }\n\n clone(): Arc {\n return new Arc(\n this.firstPoint,\n this.lastPoint,\n this.center,\n this.clockwise\n );\n }\n\n reverse(): Arc {\n return new Arc(\n this.lastPoint,\n this.firstPoint,\n this.center,\n !this.clockwise\n );\n }\n\n private _boundingBox: BoundingBox | null = null;\n get boundingBox(): BoundingBox {\n if (this._boundingBox === null) {\n const extendedR = this.radius + this.precision;\n const validAngle = (angle: number) =>\n this.isValidParameter(this.angleToParam(angle));\n this._boundingBox = new BoundingBox(\n validAngle(Math.PI)\n ? this.center[0] - extendedR\n : Math.min(this.firstPoint[0], this.lastPoint[0]) - this.precision,\n validAngle(Math.PI * 1.5)\n ? this.center[1] - extendedR\n : Math.min(this.firstPoint[1], this.lastPoint[1]) - this.precision,\n validAngle(0)\n ? this.center[0] + extendedR\n : Math.max(this.firstPoint[0], this.lastPoint[0]) + this.precision,\n validAngle(Math.PI / 2)\n ? this.center[1] + extendedR\n : Math.max(this.firstPoint[1], this.lastPoint[1]) + this.precision\n );\n }\n return this._boundingBox;\n }\n\n distanceFrom(point: Vector): number {\n const [r, theta] = polarCoordsFromCenter(point, this.center);\n if (this.isValidParameter(this.angleToParam(theta))) {\n return Math.abs(r - this.radius);\n }\n return Math.sqrt(\n Math.min(\n squareDistance(point, this.firstPoint),\n squareDistance(point, this.lastPoint)\n )\n );\n }\n\n isOnSegment(point: Vector): boolean {\n if (sameVector(point, this.firstPoint) || sameVector(point, this.lastPoint))\n return true;\n const [r, theta] = polarCoordsFromCenter(point, this.center);\n if (Math.abs(r - this.radius) > this.precision) return false;\n\n const param = this.angleToParam(theta);\n return this.isValidParameter(param);\n }\n\n gradientAt(param: number): Vector {\n const theta =\n this.firstAngle + param * this.angularLength * (this.clockwise ? -1 : 1);\n const r = this.radius * this.angularLength;\n\n const x = -r * Math.sin(theta);\n const y = r * Math.cos(theta);\n\n return this.clockwise ? [-x, -y] : [x, y];\n }\n\n tangentAt(point: Vector): Vector {\n const [r, theta] = polarCoordsFromCenter(point, this.center);\n if (Math.abs(r - this.radius) > this.precision)\n throw new Error(\"Point is not on the arc\");\n\n const param = this.angleToParam(theta);\n if (!this.isValidParameter(param))\n throw new Error(\"Point is not on the arc\");\n\n const tangent = polarToCartesian(1, theta);\n const fcn = this.clockwise ? perpendicularClockwise : perpendicular;\n return fcn(normalize(tangent));\n }\n\n get tangentAtFirstPoint(): Vector {\n const tangent = polarToCartesian(1, this.firstAngle);\n const fcn = this.clockwise ? perpendicularClockwise : perpendicular;\n return fcn(normalize(tangent));\n }\n\n get tangentAtLastPoint(): Vector {\n const tangent = polarToCartesian(1, this.lastAngle);\n const fcn = this.clockwise ? perpendicularClockwise : perpendicular;\n return fcn(normalize(tangent));\n }\n\n splitAt(points: Vector | Vector[]): Arc[] {\n let splitPoints: Vector[];\n if (Array.isArray(points) && points.length === 0) {\n return [this];\n }\n if (!Array.isArray(points[0])) {\n splitPoints = [points as Vector];\n } else {\n splitPoints = points as Vector[];\n }\n\n // Point to param also checks that all points are on the segment\n const splitParams = splitPoints.map((point) => this.pointToParam(point));\n\n const allParams = [0, 1, ...splitParams];\n\n // We use a map here, because we want to keep the entered split points\n // exactly (no change from the transformation from and to params).\n const paramsMap = new Map<number, Vector>(\n zip([allParams, [this.firstPoint, this.lastPoint, ...splitPoints]]) as [\n number,\n Vector\n ][]\n );\n allParams.sort((a, b) => a - b);\n\n let skipped: null | number = null;\n return allParams.flatMap((param, index) => {\n if (index === allParams.length - 1) return [];\n const nextParam = allParams[index + 1];\n\n if (nextParam - param < this.precision) {\n if (skipped === null) skipped = param;\n return [];\n }\n\n const startParam = skipped === null ? param : skipped;\n const arc = new Arc(\n paramsMap.get(startParam) || this.paramPoint(startParam),\n paramsMap.get(nextParam) || this.paramPoint(nextParam),\n this.center,\n this.clockwise\n );\n skipped = null;\n return arc;\n });\n }\n\n transform(matrix: TransformationMatrix): Arc {\n return new Arc(\n matrix.transform(this.firstPoint),\n matrix.transform(this.lastPoint),\n matrix.transform(this.center),\n matrix.keepsOrientation() ? this.clockwise : !this.clockwise\n );\n }\n}\n\nexport function threePointsArc(\n firstPoint: Vector,\n midPoint: Vector,\n lastPoint: Vector\n) {\n const chord1 = new Line(midPoint, firstPoint);\n const chord2 = new Line(midPoint, lastPoint);\n\n const dir1 = perpendicular(chord1.tangentAtFirstPoint);\n const dir2 = perpendicular(chord2.tangentAtLastPoint);\n\n const result = lineLineParams(\n { firstPoint: chord1.midPoint, V: dir1, precision: 1e-9 },\n { firstPoint: chord2.midPoint, V: dir2, precision: 1e-9 }\n );\n\n if (result === \"parallel\")\n throw new Error(\"Cannot create an arc from three colinear points\");\n\n const clockwise =\n crossProduct(\n subtract(firstPoint, midPoint),\n subtract(lastPoint, midPoint)\n ) > 0;\n\n return new Arc(\n firstPoint,\n lastPoint,\n add(chord1.midPoint, scalarMultiply(dir1, result.intersectionParam1)),\n clockwise,\n { ignoreChecks: true }\n );\n}\n\nexport function tangentArc(\n firstPoint: Vector,\n lastPoint: Vector,\n tangentAtFirstPoint: Vector\n) {\n const chord = new Line(lastPoint, firstPoint);\n const dir = perpendicular(chord.tangentAtFirstPoint);\n\n const result = lineLineParams(\n { firstPoint: chord.midPoint, V: dir, precision: 1e-9 },\n {\n firstPoint: firstPoint,\n V: perpendicular(tangentAtFirstPoint),\n precision: 1e-9,\n }\n );\n\n if (result === \"parallel\")\n throw new Error(\"Cannot create an arc from three colinear points\");\n\n const center = add(\n chord.midPoint,\n scalarMultiply(dir, result.intersectionParam1)\n );\n\n const clockwise =\n crossProduct(\n subtract(center, firstPoint),\n subtract(center, add(firstPoint, tangentAtFirstPoint))\n ) < 0;\n\n return new Arc(firstPoint, lastPoint, center, clockwise, {\n ignoreChecks: true,\n });\n}\n","import type { Vector } from \"../definitions.js\";\nimport type { Line } from \"../models/segments/Line.js\";\n\nimport { dotProduct, subtract } from \"../vectorOperations.js\";\n\nexport function projectPointOnLine(line: Line, point: Vector): Vector {\n const delta = subtract(point, line.firstPoint);\n const u = dotProduct(delta, line.V) / line.squareLength;\n return line.paramPoint(u);\n}\n","import { add, scalarMultiply, distance } from \"../../vectorOperations.js\";\nimport { Line } from \"../../models/segments/Line.js\";\nimport { Vector } from \"../../definitions.js\";\nimport { Arc } from \"../../models/segments/Arc.js\";\nimport { projectPointOnLine } from \"../../utils/projectPointOnLine.js\";\n\nexport function lineArcIntersection(\n line: Line,\n arc: Arc,\n precision?: number\n): Vector[] {\n const epsilon = precision ? precision : line.precision;\n\n const centerOnLine = projectPointOnLine(line, arc.center);\n const centerDistance = distance(centerOnLine, arc.center);\n\n // the line does not touch the circle\n if (centerDistance > arc.radius + epsilon) return [];\n\n // The line is tangent to the arc\n if (Math.abs(centerDistance - arc.radius) < epsilon) {\n const intersectionPoint = centerOnLine;\n if (\n line.isOnSegment(intersectionPoint) &&\n arc.isOnSegment(intersectionPoint)\n ) {\n return [intersectionPoint];\n }\n return [];\n }\n\n // The line crosses the arc\n const intersections = [];\n\n // delta corresponds to the length between the project center on the line and\n // the crossing points\n const delta = Math.sqrt(\n arc.radius * arc.radius - centerDistance * centerDistance\n );\n\n // We might be able to optimise the check on segment, but it is not clear\n // that it is worth it\n const lineDir = line.tangentAtFirstPoint;\n const p1 = add(centerOnLine, scalarMultiply(lineDir, delta));\n if (line.isOnSegment(p1) && arc.isOnSegment(p1)) {\n intersections.push(p1);\n }\n\n const p2 = add(centerOnLine, scalarMultiply(lineDir, -delta));\n if (line.isOnSegment(p2) && arc.isOnSegment(p2)) {\n intersections.push(p2);\n }\n\n return intersections;\n}\n","import { Vector } from \"../../definitions.js\";\nimport { Arc } from \"../../models/segments/Arc.js\";\nimport removeDuplicatePoints from \"../../utils/removeDuplicatePoints.js\";\nimport {\n add,\n distance,\n normalize,\n perpendicular,\n sameVector,\n scalarMultiply,\n subtract,\n} from \"../../vectorOperations\";\n\nconst complementArc = (arc: Arc): Arc => {\n const { firstPoint, lastPoint, center, clockwise } = arc;\n return new Arc(lastPoint, firstPoint, center, clockwise, {\n ignoreChecks: true,\n });\n};\n\nconst handleOverlaps = (arc1: Arc, arc2: Arc): Arc[] => {\n // handle the case with common points at start or end first\n if (arc1.isSame(arc2)) {\n return [arc1];\n }\n // two arcs with common points at start and end (but not the same arc)\n\n const points = removeDuplicatePoints(\n [\n arc2.isOnSegment(arc1.firstPoint) ? arc1.firstPoint : null,\n arc2.isOnSegment(arc1.lastPoint) ? arc1.lastPoint : null,\n arc1.isOnSegment(arc2.firstPoint) ? arc2.firstPoint : null,\n arc1.isOnSegment(arc2.lastPoint) ? arc2.lastPoint : null,\n ].filter((p) => p !== null) as Vector[]\n // We sort by the param value of the first arc. This means that the points\n // will be sorted with the same orientation than arc1\n ).sort((a, b) => arc1.pointToParam(a) - arc1.pointToParam(b));\n\n if (points.length === 0) return [];\n // We consider the case when the arcs touch only on\n // the last point. We consider that they do not overlap there\n //\n // We might want to revisit this choice\n else if (points.length === 1) return [];\n else if (points.length === 2) {\n // Similar to the case with length 1, we ignore the double overlapping point\n if (arc1.isSame(complementArc(arc2))) return [];\n return [new Arc(points[0], points[1], arc1.center, arc1.clockwise)];\n } else if (points.length === 3) {\n // Similar to the case with length 1, we ignore the single overlapping point\n const startIndex =\n sameVector(points[0], arc2.lastPoint) ||\n sameVector(points[0], arc2.firstPoint)\n ? 1\n : 0;\n return [\n new Arc(\n points[0 + startIndex],\n points[1 + startIndex],\n arc1.center,\n arc1.clockwise\n ),\n ];\n } else if (points.length === 4) {\n return [\n new Arc(points[0], points[1], arc1.center, arc1.clockwise),\n new Arc(points[2], points[3], arc1.center, arc1.clockwise),\n ];\n }\n throw new Error(\"Bug in the arc arc overlap algorithm\");\n};\n\nexport function arcArcIntersection(\n arc1: Arc,\n arc2: Arc,\n includeOverlaps = false,\n precision?: number\n): Vector[] | Arc[] {\n const epsilon = precision ? precision : arc1.precision;\n const centersDistance = distance(arc1.center, arc2.center);\n\n const radiusSum = arc1.radius + arc2.radius;\n\n // The circles do not touch\n if (centersDistance > radiusSum + epsilon) {\n return [];\n }\n\n const radiusDifference = Math.abs(arc1.radius - arc2.radius);\n\n // The arcs are concentric\n if (centersDistance < radiusDifference - epsilon) {\n return [];\n }\n\n // With a common center we can have overlaps\n if (centersDistance < epsilon) {\n if (radiusDifference > epsilon) {\n return [];\n } else {\n if (!includeOverlaps) {\n return [];\n }\n return handleOverlaps(arc1, arc2);\n }\n }\n\n const centersVector = normalize(subtract(arc2.center, arc1.center));\n // The circles are tangent to each other\n const isOutsideTangent = centersDistance > radiusSum - epsilon;\n if (\n // circles are outside each other\n isOutsideTangent ||\n // circles are inside each other\n Math.abs(centersDistance - radiusDifference) < epsilon\n ) {\n const orientation = isOutsideTangent || arc1.radius > arc2.radius ? 1 : -1;\n const intersectionPoint = add(\n arc1.center,\n scalarMultiply(centersVector, orientation * arc1.radius)\n );\n\n if (\n arc1.isOnSegment(intersectionPoint) &&\n arc2.isOnSegment(intersectionPoint)\n ) {\n return [intersectionPoint];\n } else {\n return [];\n }\n }\n\n // The circles cross each other\n const radiusToChord =\n (arc1.radius * arc1.radius) / (2 * centersDistance) -\n (arc2.radius * arc2.radius) / (2 * centersDistance) +\n centersDistance / 2;\n\n const midPoint = add(\n arc1.center,\n scalarMultiply(centersVector, radiusToChord)\n );\n\n const halfChord = Math.sqrt(\n arc1.radius * arc1.radius - radiusToChord * radiusToChord\n );\n\n const chordVector = perpendicular(centersVector);\n\n const p1 = add(midPoint, scalarMultiply(chordVector, halfChord));\n const p2 = add(midPoint, scalarMultiply(chordVector, -halfChord));\n\n const intersections = [];\n if (arc1.isOnSegment(p1) && arc2.isOnSegment(p1)) {\n intersections.push(p1);\n }\n if (arc1.isOnSegment(p2) && arc2.isOnSegment(p2)) {\n intersections.push(p2);\n }\n\n return intersections;\n}\n","import { BoundingBox, pointsBoundingBox } from \"../BoundingBox.js\";\nimport { Vector } from \"../../definitions.js\";\nimport { TransformationMatrix } from \"../TransformationMatrix.js\";\nimport {\n add,\n DEG2RAD,\n distance,\n isOnAxis,\n normalize,\n perpendicular,\n perpendicularClockwise,\n polarToCartesian,\n RAD2DEG,\n reprVector,\n sameVector,\n scalarMultiply,\n} from \"../../vectorOperations\";\nimport { AbstractSegment } from \"./Segment.js\";\nimport { unitAngle } from \"../../utils/unitAngle.js\";\nimport { angularDistance } from \"../../utils/angularDistance.js\";\nimport zip from \"../../utils/zip.js\";\nimport { Arc } from \"./Arc.js\";\n\nexport class EllipseArc extends AbstractSegment<EllipseArc> {\n segmentType = \"ELLIPSE_ARC\";\n\n // I would need to do some more work to improve the precision that I can have\n // on an ellipse with intersection algorithms\n precision = 1e-6;\n\n readonly majorRadius: number;\n readonly minorRadius: number;\n readonly center: Vector;\n readonly tiltAngle: number;\n readonly clockwise: boolean;\n\n constructor(\n firstPoint: Vector,\n lastPoint: Vector,\n center: Vector,\n r0: number,\n r1: number,\n tiltAngle: number,\n clockwise = false,\n {\n ignoreChecks = false,\n angleUnits = \"deg\",\n }: { ignoreChecks?: boolean; angleUnits?: \"deg\" | \"rad\" } = {}\n ) {\n super(firstPoint, lastPoint);\n\n // Ellipse configuration\n this.center = center;\n\n const majorOrdered = r0 >= r1;\n\n this.majorRadius = majorOrdered ? r0 : r1;\n this.minorRadius = majorOrdered ? r1 : r0;\n\n const radTiltAngle = angleUnits === \"deg\" ? tiltAngle * DEG2RAD : tiltAngle;\n this.tiltAngle = unitAngle(\n majorOrdered ? radTiltAngle : radTiltAngle + Math.PI / 2\n );\n this.clockwise = clockwise;\n\n if (!ignoreChecks) {\n if (sameVector(firstPoint, lastPoint)) {\n throw new Error(\"Invalid arc, cannot be a full circle\");\n }\n\n if (!this.isPointOnEllipse(firstPoint)) {\n throw new Error(\n `First point ${reprVector(\n firstPoint\n )} not on the ellipse defined by ${this.info}`\n );\n }\n if (!this.isPointOnEllipse(lastPoint)) {\n throw new Error(\n `Last point ${reprVector(lastPoint)} not on the ellipse defined by ${\n this.info\n }`\n );\n }\n\n if (Math.abs(this.majorRadius - this.minorRadius) < this.precision) {\n throw new Error(\n `Both radii should be different, create an arc instead`\n );\n }\n }\n }\n\n private _coefficients: {\n x2: number;\n xy: number;\n y2: number;\n x: number;\n y: number;\n c: number;\n } | null = null;\n get coefficients(): {\n x2: number;\n xy: number;\n y2: number;\n x: number;\n y: number;\n c: number;\n } {\n if (this._coefficients === null) {\n const [x0, y0] = this.center;\n const a2 = this.majorRadius * this.majorRadius;\n const b2 = this.minorRadius * this.minorRadius;\n\n const cosT = Math.cos(this.tiltAngle);\n const sinT = Math.sin(this.tiltAngle);\n\n const A = a2 * sinT * sinT + b2 * cosT * cosT;\n const B = 2 * (b2 - a2) * sinT * cosT;\n const C = a2 * cosT * cosT + b2 * sinT * sinT;\n\n this._coefficients = {\n x2: A,\n xy: B,\n y2: C,\n x: -2 * A * x0 - B * y0,\n y: -2 * C * y0 - B * x0,\n c: A * x0 * x0 + B * x0 * y0 + C * y0 * y0 - a2 * b2,\n };\n }\n return this._coefficients;\n }\n\n get info() {\n return `ELLIPSE_ARC(${reprVector(this.firstPoint)}, ${reprVector(\n this.lastPoint\n )}, ${reprVector(this.center)}, ${this.majorRadius}, ${this.minorRadius}, ${\n this.tiltAngle * RAD2DEG\n }, ${this.clockwise ? \"CW\" : \"CCW\"})`;\n }\n\n reverse(): EllipseArc {\n return new EllipseArc(\n this.lastPoint,\n this.firstPoint,\n this.center,\n this.majorRadius,\n this.minorRadius,\n this.tiltAngle,\n !this.clockwise,\n { ignoreChecks: true, angleUnits: \"rad\" }\n );\n }\n\n clone(): EllipseArc {\n return new EllipseArc(\n this.firstPoint,\n this.lastPoint,\n this.center,\n this.majorRadius,\n this.minorRadius,\n this.tiltAngle,\n this.clockwise,\n { ignoreChecks: true, angleUnits: \"rad\" }\n );\n }\n\n private computeEllipseExtrema(): Vector[] {\n const tanTiltAngle = Math.tan(this.tiltAngle);\n const radiRatio = this.minorRadius / this.majorRadius;\n const v1 = -Math.atan(radiRatio * tanTiltAngle);\n const v2 = Math.atan(radiRatio / tanTiltAngle);\n const extremaAngles = [v1, Math.PI + v1, v2, Math.PI + v2];\n\n return extremaAngles\n .map((angle) => this.thetaToParam(angle))\n .filter((param) => this.isValidParameter(param))\n .map((param) => this.paramPoint(param));\n }\n\n private _boundingBox: BoundingBox | undefined;\n get boundingBox(): BoundingBox {\n if (this._boundingBox === undefined) {\n const ellipseExtrema = this.computeEllipseExtrema();\n const extremaPoints = [\n this.firstPoint,\n this.lastPoint,\n ...ellipseExtrema,\n ];\n this._boundingBox = pointsBoundingBox(extremaPoints);\n }\n\n return this._boundingBox;\n }\n\n private _linearExentricity?: number | undefined;\n get linearExentricity(): number {\n if (this._linearExentricity === undefined) {\n this._linearExentricity = Math.sqrt(\n this.majorRadius * this.majorRadius -\n this.minorRadius * this.minorRadius\n );\n }\n return this._linearExentricity;\n }\n\n private _exentricity?: number | undefined;\n get exentricity(): number {\n if (this._exentricity === undefined) {\n this._exentricity = this.linearExentricity / this.majorRadius;\n }\n return this._exentricity;\n }\n\n private _focals?: [Vector, Vector] | undefined;\n get focals(): [Vector, Vector] {\n if (this._focals === undefined) {\n const axis = this.majorAxis;\n this._focals = [\n add(this.center, scalarMultiply(axis, this.linearExentricity)),\n add(this.center, scalarMultiply(axis, -this.linearExentricity)),\n ];\n }\n\n return this._focals;\n }\n\n get majorAxis(): Vector {\n return polarToCartesian(1, this.tiltAngle);\n }\n\n paramPoint(t: number): Vector {\n const angle =\n this.firstAngle + t * this.deltaAngle * (this.clockwise ? -1 : 1);\n return this.reverseEllipseReferenceFrameTransform.transform([\n this.majorRadius * Math.cos(angle),\n this.minorRadius * Math.sin(angle),\n ]);\n }\n\n pointToParam(point: Vector): number {\n if (!this.isPointOnEllipse(point)) {\n throw new Error(\n `Point ${reprVector(point)} not on the ellipse defined by ${this.repr}`\n );\n }\n\n const param = this.thetaToParam(this.pointTheta(point));\n if (!this.isValidParameter(param))\n throw new Error(\n `Point ${reprVector(point)} is not on segment ${this.repr}`\n );\n\n return param;\n }\n\n get midPoint(): Vector {\n return this.paramPoint(0.5);\n }\n\n isValidParameter(t: number): boolean {\n return 1 - t >= -this.precision && t >= -this.precision;\n }\n\n isSame(other: EllipseArc): boolean {\n const sameEllipse =\n sameVector(this.center, other.center) &&\n Math.abs(this.majorRadius - other.majorRadius) < this.precision &&\n Math.abs(this.minorRadius - other.minorRadius) < this.precision &&\n (Math.abs(this.tiltAngle - other.tiltAngle) < this.precision ||\n Math.abs(Math.abs(this.tiltAngle - other.tiltAngle) - Math.PI) <\n this.precision);\n\n return (\n sameEllipse &&\n ((sameVector(this.firstPoint, other.firstPoint) &&\n this.clockwise === other.clockwise) ||\n (sameVector(this.firstPoint, other.lastPoint) &&\n this.clockwise !== other.clockwise))\n );\n }\n\n pointTheta(point: Vector): number {\n const pPrime = this.ellipseReferenceFrameTransform.transform(point);\n const theta = Math.atan2(\n pPrime[1] / this.minorRadius,\n pPrime[0] / this.majorRadius\n );\n return unitAngle(theta);\n }\n thetaToParam(angle: number): number {\n return (\n angularDistance(this.firstAngle, unitAngle(angle), this.clockwise) /\n this.deltaAngle\n );\n }\n\n private isPointOnEllipse(point: Vector): boolean {\n const [f1, f2] = this.focals;\n\n const d1 = distance(point, f1);\n const d2 = distance(point, f2);\n\n return Math.abs(2 * this.majorRadius - d1 - d2) < this.precision;\n }\n\n isOnSegment(point: Vector): boolean {\n if (!this.isPointOnEllipse(point)) {\n return false;\n }\n return this.isValidParameter(this.thetaToParam(this.pointTheta(point)));\n }\n\n distanceFrom(point: Vector): number {\n let closestPoint;\n if (sameVector(point, this.center)) {\n closestPoint = add(\n this.center,\n scalarMultiply(perpendicular(this.majorAxis), this.minorRadius)\n );\n } else {\n closestPoint = this.reverseEllipseReferenceFrameTransform.transform(\n closestPointOnEllipse(\n this.majorRadius,\n this.minorRadius,\n this.ellipseReferenceFrameTransform.transform(point)\n )\n );\n }\n\n // We already know that the point is on the ellipse, so we can just\n // check that it is within the range of the arc\n if (this.isValidParameter(this.thetaToParam(this.pointTheta(point)))) {\n return distance(point, closestPoint);\n } else if (isOnAxis(point, this.majorAxis, this.center)) {\n const complementaryTheta = unitAngle(\n 2 * Math.PI - this.pointTheta(point)\n );\n const param = this.thetaToParam(complementaryTheta);\n if (this.isValidParameter(param)) {\n return distance(point, this.paramPoint(param));\n }\n }\n return Math.min(\n distance(point, this.firstPoint),\n distance(point, this.lastPoint)\n );\n }\n\n private _ellipseReferenceFrameTransform: TransformationMatrix | undefined;\n get ellipseReferenceFrameTransform(): TransformationMatrix {\n if (this._ellipseReferenceFrameTransform === undefined) {\n this._ellipseReferenceFrameTransform = new TransformationMatrix()\n .rotate(-this.tiltAngle)\n .translate(-this.center[0], -this.center[1]);\n }\n return this._ellipseReferenceFrameTransform;\n }\n\n private _reverseEllipseReferenceFrameTransform:\n | TransformationMatrix\n | undefined;\n get reverseEllipseReferenceFrameTransform(): TransformationMatrix {\n if (this._reverseEllipseReferenceFrameTransform === undefined) {\n this._reverseEllipseReferenceFrameTransform = new TransformationMatrix()\n .translate(this.center[0], this.center[1])\n .rotate(this.tiltAngle);\n }\n return this._reverseEllipseReferenceFrameTransform;\n }\n\n private _rotateFromEllipseReferenceFrame: TransformationMatrix | undefined;\n get rotateFromEllipseReferenceFrame(): TransformationMatrix {\n if (this._rotateFromEllipseReferenceFrame === undefined) {\n this._rotateFromEllipseReferenceFrame = new TransformationMatrix().rotate(\n this.tiltAngle\n );\n }\n return this._rotateFromEllipseReferenceFrame;\n }\n\n private _firstAngle: number | undefined;\n get firstAngle(): number {\n if (this._firstAngle === undefined) {\n this._firstAngle = this.pointTheta(this.firstPoint);\n }\n return this._firstAngle;\n }\n\n private _lastAngle: number | undefined;\n get lastAngle(): number {\n if (this._lastAngle === undefined) {\n this._lastAngle = this.pointTheta(this.lastPoint);\n }\n return this._lastAngle;\n }\n\n private _deltaAngle: number | undefined;\n get deltaAngle(): number {\n if (this._deltaAngle === undefined) {\n this._deltaAngle = angularDistance(\n this.firstAngle,\n this.lastAngle,\n this.clockwise\n );\n }\n return this._deltaAngle;\n }\n\n normalAt(point: Vector): Vector {\n const tgt = this.tangentAt(point);\n return this.clockwise ? perpendicular(tgt) : perpendicularClockwise(tgt);\n }\n\n gradientAt(param: number): Vector {\n const angle =\n this.firstAngle + param * this.deltaAngle * (this.clockwise ? -1 : 1);\n\n const x = -this.majorRadius * this.deltaAngle * Math.sin(angle);\n const y = this.minorRadius * this.deltaAngle * Math.cos(angle);\n\n const tgt: Vector = this.clockwise ? [-x, -y] : [x, y];\n return this.rotateFromEllipseReferenceFrame.transform(tgt);\n }\n\n tangentAt(point: Vector): Vector {\n const angle = this.pointTheta(point);\n\n const x = -this.majorRadius * Math.sin(angle);\n const y = this.minorRadius * Math.cos(angle);\n\n const tgt: Vector = this.clockwise ? [-x, -y] : [x, y];\n return normalize(this.rotateFromEllipseReferenceFrame.transform(tgt));\n }\n\n get tangentAtFirstPoint(): Vector {\n const x = -this.majorRadius * Math.sin(this.firstAngle);\n const y = this.minorRadius * Math.cos(this.firstAngle);\n\n const tgt: Vector = this.clockwise ? [-x, -y] : [x, y];\n return normalize(this.rotateFromEllipseReferenceFrame.transform(tgt));\n }\n\n get tangentAtLastPoint(): Vector {\n const x = -this.majorRadius * Math.sin(this.lastAngle);\n const y = this.minorRadius * Math.cos(this.lastAngle);\n\n const tgt: Vector = this.clockwise ? [-x, -y] : [x, y];\n return normalize(this.rotateFromEllipseReferenceFrame.transform(tgt));\n }\n\n transform(matrix: TransformationMatrix): EllipseArc {\n const modifiedAngle = matrix.transformAngle(this.tiltAngle);\n const scaleFactor = matrix.scaleFactor();\n return new EllipseArc(\n matrix.transform(this.firstPoint),\n matrix.transform(this.lastPoint),\n matrix.transform(this.center),\n this.majorRadius * scaleFactor,\n this.minorRadius * scaleFactor,\n modifiedAngle,\n matrix.keepsOrientation() ? this.clockwise : !this.clockwise,\n { angleUnits: \"rad\" }\n );\n }\n\n splitAt(points: Vector | Vector[]): EllipseArc[] {\n let splitPoints: Vector[];\n if (Array.isArray(points) && points.length === 0) {\n return [this];\n }\n if (!Array.isArray(points[0])) {\n splitPoints = [points as Vector];\n } else {\n splitPoints = points as Vector[];\n }\n\n // Point to param also checks that all points are on the segment\n const splitParams = splitPoints.map((point) => this.pointToParam(point));\n\n const allParams = [0, 1, ...splitParams];\n\n // We use a map here, because we want to keep the entered split points\n // exactly (no change from the transformation from and to params).\n const paramsMap = new Map<number, Vector>(\n zip([allParams, [this.firstPoint, this.lastPoint, ...splitPoints]]) as [\n number,\n Vector\n ][]\n );\n allParams.sort((a, b) => a - b);\n\n let skipped: null | number = null;\n return allParams.flatMap((param, index) => {\n if (index === allParams.length - 1) return [];\n const nextParam = allParams[index + 1];\n\n if (nextParam - param < this.precision) {\n if (skipped === null) skipped = param;\n return [];\n }\n\n const startParam = skipped === null ? param : skipped;\n const arc = new EllipseArc(\n paramsMap.get(startParam) || this.paramPoint(startParam),\n paramsMap.get(nextParam) || this.paramPoint(nextParam),\n this.center,\n this.majorRadius,\n this.minorRadius,\n this.tiltAngle,\n this.clockwise,\n { angleUnits: \"rad\" }\n );\n skipped = null;\n return arc;\n });\n }\n}\n\nexport function svgEllipse(\n firstPoint: Vector,\n lastPoint: Vector,\n r0: number,\n r1: number,\n phi: number,\n fA: boolean,\n fS: boolean\n): EllipseArc | Arc {\n const { center, rx, ry } = findSVGCenter(\n firstPoint,\n lastPoint,\n r0,\n r1,\n phi * DEG2RAD,\n !fA,\n fS\n );\n\n if (Math.abs(rx - ry) < 1e-9) {\n return new Arc(firstPoint, lastPoint, center, fS);\n }\n\n return new EllipseArc(firstPoint, lastPoint, center, rx, ry, phi, fS);\n}\n\n/*\n * adapted from https://stackoverflow.com/a/12329083\n */\nfunction findSVGCenter(\n [x1, y1]: Vector,\n [x2, y2]: Vector,\n rx: number,\n ry: number,\n phi: number,\n fA: boolean,\n fS: boolean\n): { center: Vector; rx: number; ry: number } {\n if (rx < 0) {\n rx = -rx;\n }\n if (ry < 0) {\n ry = -ry;\n }\n if (rx == 0.0 || ry == 0.0) {\n // invalid arguments\n throw Error(\"rx and ry can not be 0\");\n }\n\n const s_phi = Math.sin(phi);\n const c_phi = Math.cos(phi);\n const hd_x = (x1 - x2) / 2.0; // half diff of x\n const hd_y = (y1 - y2) / 2.0; // half diff of y\n const hs_x = (x1 + x2) / 2.0; // half sum of x\n const hs_y = (y1 + y2) / 2.0; // half sum of y\n\n // F6.5.1\n const x1_ = c_phi * hd_x + s_phi * hd_y;\n const y1_ = c_phi * hd_y - s_phi * hd_x;\n\n // F.6.6 Correction of out-of-range radii\n // Step 3: Ensure radii are large enough\n const lambda = (x1_ * x1_) / (rx * rx) + (y1_ * y1_) / (ry * ry);\n if (lambda > 1) {\n rx = rx * Math.sqrt(lambda);\n ry = ry * Math.sqrt(lambda);\n }\n\n const rxry = rx * ry;\n const rxy1_ = rx * y1_;\n const ryx1_ = ry * x1_;\n const sum_of_sq = rxy1_ * rxy1_ + ryx1_ * ryx1_; // sum of square\n if (!sum_of_sq) {\n throw Error(\"start point can not be same as end point\");\n }\n let coe = Math.sqrt(Math.abs((rxry * rxry - sum_of_sq) / sum_of_sq));\n if (fA == fS) {\n coe = -coe;\n }\n\n // F6.5.2\n const cx_ = (coe * rxy1_) / ry;\n const cy_ = (-coe * ryx1_) / rx;\n\n // F6.5.3\n const cx = c_phi * cx_ - s_phi * cy_ + hs_x;\n const cy = s_phi * cx_ + c_phi * cy_ + hs_y;\n\n return {\n center: [cx, cy],\n rx,\n ry,\n };\n}\n\n// This function was adapted from https://github.com/0xfaded/ellipse_demo/blob/master/ellipse_trig_free.py\n// Read more about it here: https://blog.chatfield.io/simple-method-for-distance-to-ellipse/\nfunction closestPointOnEllipse(\n majorRadius: number,\n minorRadius: number,\n point: Vector\n): Vector {\n const px = Math.abs(point[0]);\n const py = Math.abs(point[1]);\n\n let tx = 0.707;\n let ty = 0.707;\n\n const a = majorRadius;\n const b = minorRadius;\n\n for (let i = 0; i < 3; i++) {\n const x = a * tx;\n const y = b * ty;\n\n const ex = ((a * a - b * b) * tx ** 3) / a;\n const ey = ((b * b - a * a) * ty ** 3) / b;\n\n const rx = x - ex;\n const ry = y - ey;\n\n const qx = px - ex;\n const qy = py - ey;\n\n const r = Math.hypot(rx, ry);\n const q = Math.hypot(qx, qy);\n\n tx = Math.min(1, Math.max(0, ((qx * r) / q + ex) / a));\n ty = Math.min(1, Math.max(0, ((qy * r) / q + ey) / b));\n const t = Math.hypot(tx, ty);\n tx /= t;\n ty /= t;\n }\n\n return [a * tx * Math.sign(point[0]), b * ty * Math.sign(point[1])];\n}\n","import { Line } from \"../../models/segments/Line.js\";\nimport { EllipseArc } from \"../../models/segments/EllipseArc.js\";\nimport { Vector } from \"../../definitions.js\";\n\n// Using the derivation from http://www.nabla.hr/CS-EllipseAndLine1.htm\nexport function lineEllipseArcIntersection(\n line: Line,\n arc: EllipseArc,\n precision = 1e-9\n) {\n const lineP = line.transform(arc.ellipseReferenceFrameTransform);\n\n const m = lineP.slope;\n const c = lineP.yIntercept;\n\n const a2 = arc.majorRadius * arc.majorRadius;\n const b2 = arc.minorRadius * arc.minorRadius;\n const ab = arc.majorRadius * arc.minorRadius;\n\n const m2 = lineP.slope * lineP.slope;\n const c2 = lineP.yIntercept * lineP.yIntercept;\n\n // Helper function to convert back the intersection from the ellipse\n // reference frame to the original frame\n // It also checks that the intersection is within the bounds of the segments\n const filterIntersectionInRef = (intersections: Vector[]) =>\n intersections\n .map((point) =>\n arc.reverseEllipseReferenceFrameTransform.transform(point)\n )\n .filter((point) => line.isOnSegment(point) && arc.isOnSegment(point));\n\n // We handle the case of the line being vertical\n if (!Number.isFinite(m)) {\n // Vertical line\n const x = lineP.firstPoint[0];\n\n // Outside\n if (Math.abs(x) - arc.majorRadius > precision) return [];\n\n // Tangent\n if (Math.abs(Math.abs(x) - arc.majorRadius) < precision) {\n return filterIntersectionInRef([[x, 0]]);\n }\n\n const y = arc.minorRadius * Math.sqrt(1 - (x * x) / a2);\n\n const p1: Vector = [x, y];\n const p2: Vector = [x, -y];\n\n return filterIntersectionInRef([p1, p2]);\n }\n\n const discriminant = a2 * m2 + b2 - c2;\n\n if (discriminant < -precision) {\n return [];\n }\n\n const denominator = a2 * m2 + b2;\n\n // We have a tangent line\n if (Math.abs(discriminant) < precision) {\n const x = -(a2 * m * c) / denominator;\n const y = (b2 * c) / denominator;\n return filterIntersectionInRef([[x, y]]);\n }\n\n const sqrtDiscriminant = Math.sqrt(discriminant);\n\n const p1: Vector = [\n -(a2 * m * c + ab * sqrtDiscriminant) / denominator,\n (b2 * c - ab * m * sqrtDiscriminant) / denominator,\n ];\n const p2: Vector = [\n -(a2 * m * c - ab * sqrtDiscriminant) / denominator,\n (b2 * c + ab * m * sqrtDiscriminant) / denominator,\n ];\n\n return filterIntersectionInRef([p1, p2]);\n}\n","// eslint-disable-next-line @typescript-eslint/unbound-method\nconst toString = Object.prototype.toString;\n/**\n * Checks if an object is an instance of an Array (array or typed array, except those that contain bigint values).\n *\n * @param value - Object to check.\n * @returns True if the object is an array or a typed array.\n */\nexport function isAnyArray(value) {\n const tag = toString.call(value);\n return tag.endsWith('Array]') && !tag.includes('Big');\n}\n//# sourceMappingURL=index.js.map","import { isAnyArray } from 'is-any-array';\n\nfunction max(input) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n if (!isAnyArray(input)) {\n throw new TypeError('input must be an array');\n }\n\n if (input.length === 0) {\n throw new TypeError('input must not be empty');\n }\n\n var _options$fromIndex = options.fromIndex,\n fromIndex = _options$fromIndex === void 0 ? 0 : _options$fromIndex,\n _options$toIndex = options.toIndex,\n toIndex = _options$toIndex === void 0 ? input.length : _options$toIndex;\n\n if (fromIndex < 0 || fromIndex >= input.length || !Number.isInteger(fromIndex)) {\n throw new Error('fromIndex must be a positive integer smaller than length');\n }\n\n if (toIndex <= fromIndex || toIndex > input.length || !Number.isInteger(toIndex)) {\n throw new Error('toIndex must be an integer greater than fromIndex and at most equal to length');\n }\n\n var maxValue = input[fromIndex];\n\n for (var i = fromIndex + 1; i < toIndex; i++) {\n if (input[i] > maxValue) maxValue = input[i];\n }\n\n return maxValue;\n}\n\nexport { max as default };\n","import { isAnyArray } from 'is-any-array';\n\nfunction min(input) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n if (!isAnyArray(input)) {\n throw new TypeError('input must be an array');\n }\n\n if (input.length === 0) {\n throw new TypeError('input must not be empty');\n }\n\n var _options$fromIndex = options.fromIndex,\n fromIndex = _options$fromIndex === void 0 ? 0 : _options$fromIndex,\n _options$toIndex = options.toIndex,\n toIndex = _options$toIndex === void 0 ? input.length : _options$toIndex;\n\n if (fromIndex < 0 || fromIndex >= input.length || !Number.isInteger(fromIndex)) {\n throw new Error('fromIndex must be a positive integer smaller than length');\n }\n\n if (toIndex <= fromIndex || toIndex > input.length || !Number.isInteger(toIndex)) {\n throw new Error('toIndex must be an integer greater than fromIndex and at most equal to length');\n }\n\n var minValue = input[fromIndex];\n\n for (var i = fromIndex + 1; i < toIndex; i++) {\n if (input[i] < minValue) minValue = input[i];\n }\n\n return minValue;\n}\n\nexport { min as default };\n","import { isAnyArray } from 'is-any-array';\nimport max from 'ml-array-max';\nimport min from 'ml-array-min';\n\nfunction rescale(input) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n if (!isAnyArray(input)) {\n throw new TypeError('input must be an array');\n } else if (input.length === 0) {\n throw new TypeError('input must not be empty');\n }\n\n var output;\n\n if (options.output !== undefined) {\n if (!isAnyArray(options.output)) {\n throw new TypeError('output option must be an array if specified');\n }\n\n output = options.output;\n } else {\n output = new Array(input.length);\n }\n\n var currentMin = min(input);\n var currentMax = max(input);\n\n if (currentMin === currentMax) {\n throw new RangeError('minimum and maximum input values are equal. Cannot rescale a constant array');\n }\n\n var _options$min = options.min,\n minValue = _options$min === void 0 ? options.autoMinMax ? currentMin : 0 : _options$min,\n _options$max = options.max,\n maxValue = _options$max === void 0 ? options.autoMinMax ? currentMax : 1 : _options$max;\n\n if (minValue >= maxValue) {\n throw new RangeError('min option must be smaller than max option');\n }\n\n var factor = (maxValue - minValue) / (currentMax - currentMin);\n\n for (var i = 0; i < input.length; i++) {\n output[i] = (input[i] - currentMin) * factor + minValue;\n }\n\n return output;\n}\n\nexport { rescale as default };\n","const indent = ' '.repeat(2);\nconst indentData = ' '.repeat(4);\n\nexport function inspectMatrix() {\n return inspectMatrixWithOptions(this);\n}\n\nexport function inspectMatrixWithOptions(matrix, options = {}) {\n const {\n maxRows = 15,\n maxColumns = 10,\n maxNumSize = 8,\n padMinus = 'auto',\n } = options;\n return `${matrix.constructor.name} {\n${indent}[\n${indentData}${inspectData(matrix, maxRows, maxColumns, maxNumSize, padMinus)}\n${indent}]\n${indent}rows: ${matrix.rows}\n${indent}columns: ${matrix.columns}\n}`;\n}\n\nfunction inspectData(matrix, maxRows, maxColumns, maxNumSize, padMinus) {\n const { rows, columns } = matrix;\n const maxI = Math.min(rows, maxRows);\n const maxJ = Math.min(columns, maxColumns);\n const result = [];\n\n if (padMinus === 'auto') {\n padMinus = false;\n loop: for (let i = 0; i < maxI; i++) {\n for (let j = 0; j < maxJ; j++) {\n if (matrix.get(i, j) < 0) {\n padMinus = true;\n break loop;\n }\n }\n }\n }\n\n for (let i = 0; i < maxI; i++) {\n let line = [];\n for (let j = 0; j < maxJ; j++) {\n line.push(formatNumber(matrix.get(i, j), maxNumSize, padMinus));\n }\n result.push(`${line.join(' ')}`);\n }\n if (maxJ !== columns) {\n result[result.length - 1] += ` ... ${columns - maxColumns} more columns`;\n }\n if (maxI !== rows) {\n result.push(`... ${rows - maxRows} more rows`);\n }\n return result.join(`\\n${indentData}`);\n}\n\nfunction formatNumber(num, maxNumSize, padMinus) {\n return (\n num >= 0 && padMinus\n ? ` ${formatNumber2(num, maxNumSize - 1)}`\n : formatNumber2(num, maxNumSize)\n ).padEnd(maxNumSize);\n}\n\nfunction formatNumber2(num, len) {\n // small.length numbers should be as is\n let str = num.toString();\n if (str.length <= len) return str;\n\n // (7)'0.00123' is better then (7)'1.23e-2'\n // (8)'0.000123' is worse then (7)'1.23e-3',\n let fix = num.toFixed(len);\n if (fix.length > len) {\n fix = num.toFixed(Math.max(0, len - (fix.length - len)));\n }\n if (\n fix.length <= len &&\n !fix.startsWith('0.000') &&\n !fix.startsWith('-0.000')\n ) {\n return fix;\n }\n\n // well, if it's still too long the user should've used longer numbers\n let exp = num.toExponential(len);\n if (exp.length > len) {\n exp = num.toExponential(Math.max(0, len - (exp.length - len)));\n }\n return exp.slice(0);\n}\n","export function installMathOperations(AbstractMatrix, Matrix) {\n AbstractMatrix.prototype.add = function add(value) {\n if (typeof value === 'number') return this.addS(value);\n return this.addM(value);\n };\n\n AbstractMatrix.prototype.addS = function addS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) + value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.addM = function addM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) + matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.add = function add(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.add(value);\n };\n\n AbstractMatrix.prototype.sub = function sub(value) {\n if (typeof value === 'number') return this.subS(value);\n return this.subM(value);\n };\n\n AbstractMatrix.prototype.subS = function subS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) - value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.subM = function subM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) - matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.sub = function sub(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.sub(value);\n };\n AbstractMatrix.prototype.subtract = AbstractMatrix.prototype.sub;\n AbstractMatrix.prototype.subtractS = AbstractMatrix.prototype.subS;\n AbstractMatrix.prototype.subtractM = AbstractMatrix.prototype.subM;\n AbstractMatrix.subtract = AbstractMatrix.sub;\n\n AbstractMatrix.prototype.mul = function mul(value) {\n if (typeof value === 'number') return this.mulS(value);\n return this.mulM(value);\n };\n\n AbstractMatrix.prototype.mulS = function mulS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) * value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.mulM = function mulM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) * matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.mul = function mul(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.mul(value);\n };\n AbstractMatrix.prototype.multiply = AbstractMatrix.prototype.mul;\n AbstractMatrix.prototype.multiplyS = AbstractMatrix.prototype.mulS;\n AbstractMatrix.prototype.multiplyM = AbstractMatrix.prototype.mulM;\n AbstractMatrix.multiply = AbstractMatrix.mul;\n\n AbstractMatrix.prototype.div = function div(value) {\n if (typeof value === 'number') return this.divS(value);\n return this.divM(value);\n };\n\n AbstractMatrix.prototype.divS = function divS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) / value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.divM = function divM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) / matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.div = function div(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.div(value);\n };\n AbstractMatrix.prototype.divide = AbstractMatrix.prototype.div;\n AbstractMatrix.prototype.divideS = AbstractMatrix.prototype.divS;\n AbstractMatrix.prototype.divideM = AbstractMatrix.prototype.divM;\n AbstractMatrix.divide = AbstractMatrix.div;\n\n AbstractMatrix.prototype.mod = function mod(value) {\n if (typeof value === 'number') return this.modS(value);\n return this.modM(value);\n };\n\n AbstractMatrix.prototype.modS = function modS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) % value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.modM = function modM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) % matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.mod = function mod(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.mod(value);\n };\n AbstractMatrix.prototype.modulus = AbstractMatrix.prototype.mod;\n AbstractMatrix.prototype.modulusS = AbstractMatrix.prototype.modS;\n AbstractMatrix.prototype.modulusM = AbstractMatrix.prototype.modM;\n AbstractMatrix.modulus = AbstractMatrix.mod;\n\n AbstractMatrix.prototype.and = function and(value) {\n if (typeof value === 'number') return this.andS(value);\n return this.andM(value);\n };\n\n AbstractMatrix.prototype.andS = function andS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) & value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.andM = function andM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) & matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.and = function and(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.and(value);\n };\n\n AbstractMatrix.prototype.or = function or(value) {\n if (typeof value === 'number') return this.orS(value);\n return this.orM(value);\n };\n\n AbstractMatrix.prototype.orS = function orS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) | value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.orM = function orM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) | matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.or = function or(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.or(value);\n };\n\n AbstractMatrix.prototype.xor = function xor(value) {\n if (typeof value === 'number') return this.xorS(value);\n return this.xorM(value);\n };\n\n AbstractMatrix.prototype.xorS = function xorS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) ^ value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.xorM = function xorM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) ^ matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.xor = function xor(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.xor(value);\n };\n\n AbstractMatrix.prototype.leftShift = function leftShift(value) {\n if (typeof value === 'number') return this.leftShiftS(value);\n return this.leftShiftM(value);\n };\n\n AbstractMatrix.prototype.leftShiftS = function leftShiftS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) << value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.leftShiftM = function leftShiftM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) << matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.leftShift = function leftShift(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.leftShift(value);\n };\n\n AbstractMatrix.prototype.signPropagatingRightShift = function signPropagatingRightShift(value) {\n if (typeof value === 'number') return this.signPropagatingRightShiftS(value);\n return this.signPropagatingRightShiftM(value);\n };\n\n AbstractMatrix.prototype.signPropagatingRightShiftS = function signPropagatingRightShiftS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) >> value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.signPropagatingRightShiftM = function signPropagatingRightShiftM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) >> matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.signPropagatingRightShift = function signPropagatingRightShift(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.signPropagatingRightShift(value);\n };\n\n AbstractMatrix.prototype.rightShift = function rightShift(value) {\n if (typeof value === 'number') return this.rightShiftS(value);\n return this.rightShiftM(value);\n };\n\n AbstractMatrix.prototype.rightShiftS = function rightShiftS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) >>> value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.rightShiftM = function rightShiftM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) >>> matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.rightShift = function rightShift(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.rightShift(value);\n };\n AbstractMatrix.prototype.zeroFillRightShift = AbstractMatrix.prototype.rightShift;\n AbstractMatrix.prototype.zeroFillRightShiftS = AbstractMatrix.prototype.rightShiftS;\n AbstractMatrix.prototype.zeroFillRightShiftM = AbstractMatrix.prototype.rightShiftM;\n AbstractMatrix.zeroFillRightShift = AbstractMatrix.rightShift;\n\n AbstractMatrix.prototype.not = function not() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, ~(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.not = function not(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.not();\n };\n\n AbstractMatrix.prototype.abs = function abs() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.abs(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.abs = function abs(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.abs();\n };\n\n AbstractMatrix.prototype.acos = function acos() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.acos(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.acos = function acos(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.acos();\n };\n\n AbstractMatrix.prototype.acosh = function acosh() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.acosh(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.acosh = function acosh(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.acosh();\n };\n\n AbstractMatrix.prototype.asin = function asin() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.asin(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.asin = function asin(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.asin();\n };\n\n AbstractMatrix.prototype.asinh = function asinh() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.asinh(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.asinh = function asinh(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.asinh();\n };\n\n AbstractMatrix.prototype.atan = function atan() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.atan(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.atan = function atan(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.atan();\n };\n\n AbstractMatrix.prototype.atanh = function atanh() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.atanh(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.atanh = function atanh(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.atanh();\n };\n\n AbstractMatrix.prototype.cbrt = function cbrt() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.cbrt(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.cbrt = function cbrt(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.cbrt();\n };\n\n AbstractMatrix.prototype.ceil = function ceil() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.ceil(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.ceil = function ceil(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.ceil();\n };\n\n AbstractMatrix.prototype.clz32 = function clz32() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.clz32(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.clz32 = function clz32(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.clz32();\n };\n\n AbstractMatrix.prototype.cos = function cos() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.cos(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.cos = function cos(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.cos();\n };\n\n AbstractMatrix.prototype.cosh = function cosh() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.cosh(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.cosh = function cosh(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.cosh();\n };\n\n AbstractMatrix.prototype.exp = function exp() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.exp(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.exp = function exp(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.exp();\n };\n\n AbstractMatrix.prototype.expm1 = function expm1() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.expm1(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.expm1 = function expm1(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.expm1();\n };\n\n AbstractMatrix.prototype.floor = function floor() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.floor(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.floor = function floor(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.floor();\n };\n\n AbstractMatrix.prototype.fround = function fround() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.fround(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.fround = function fround(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.fround();\n };\n\n AbstractMatrix.prototype.log = function log() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.log(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.log = function log(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.log();\n };\n\n AbstractMatrix.prototype.log1p = function log1p() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.log1p(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.log1p = function log1p(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.log1p();\n };\n\n AbstractMatrix.prototype.log10 = function log10() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.log10(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.log10 = function log10(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.log10();\n };\n\n AbstractMatrix.prototype.log2 = function log2() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.log2(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.log2 = function log2(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.log2();\n };\n\n AbstractMatrix.prototype.round = function round() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.round(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.round = function round(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.round();\n };\n\n AbstractMatrix.prototype.sign = function sign() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.sign(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.sign = function sign(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.sign();\n };\n\n AbstractMatrix.prototype.sin = function sin() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.sin(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.sin = function sin(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.sin();\n };\n\n AbstractMatrix.prototype.sinh = function sinh() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.sinh(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.sinh = function sinh(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.sinh();\n };\n\n AbstractMatrix.prototype.sqrt = function sqrt() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.sqrt(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.sqrt = function sqrt(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.sqrt();\n };\n\n AbstractMatrix.prototype.tan = function tan() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.tan(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.tan = function tan(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.tan();\n };\n\n AbstractMatrix.prototype.tanh = function tanh() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.tanh(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.tanh = function tanh(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.tanh();\n };\n\n AbstractMatrix.prototype.trunc = function trunc() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.trunc(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.trunc = function trunc(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.trunc();\n };\n\n AbstractMatrix.pow = function pow(matrix, arg0) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.pow(arg0);\n };\n\n AbstractMatrix.prototype.pow = function pow(value) {\n if (typeof value === 'number') return this.powS(value);\n return this.powM(value);\n };\n\n AbstractMatrix.prototype.powS = function powS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.pow(this.get(i, j), value));\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.powM = function powM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.pow(this.get(i, j), matrix.get(i, j)));\n }\n }\n return this;\n };\n}\n","import { isAnyArray } from 'is-any-array';\n\n/**\n * @private\n * Check that a row index is not out of bounds\n * @param {Matrix} matrix\n * @param {number} index\n * @param {boolean} [outer]\n */\nexport function checkRowIndex(matrix, index, outer) {\n let max = outer ? matrix.rows : matrix.rows - 1;\n if (index < 0 || index > max) {\n throw new RangeError('Row index out of range');\n }\n}\n\n/**\n * @private\n * Check that a column index is not out of bounds\n * @param {Matrix} matrix\n * @param {number} index\n * @param {boolean} [outer]\n */\nexport function checkColumnIndex(matrix, index, outer) {\n let max = outer ? matrix.columns : matrix.columns - 1;\n if (index < 0 || index > max) {\n throw new RangeError('Column index out of range');\n }\n}\n\n/**\n * @private\n * Check that the provided vector is an array with the right length\n * @param {Matrix} matrix\n * @param {Array|Matrix} vector\n * @return {Array}\n * @throws {RangeError}\n */\nexport function checkRowVector(matrix, vector) {\n if (vector.to1DArray) {\n vector = vector.to1DArray();\n }\n if (vector.length !== matrix.columns) {\n throw new RangeError(\n 'vector size must be the same as the number of columns',\n );\n }\n return vector;\n}\n\n/**\n * @private\n * Check that the provided vector is an array with the right length\n * @param {Matrix} matrix\n * @param {Array|Matrix} vector\n * @return {Array}\n * @throws {RangeError}\n */\nexport function checkColumnVector(matrix, vector) {\n if (vector.to1DArray) {\n vector = vector.to1DArray();\n }\n if (vector.length !== matrix.rows) {\n throw new RangeError('vector size must be the same as the number of rows');\n }\n return vector;\n}\n\nexport function checkRowIndices(matrix, rowIndices) {\n if (!isAnyArray(rowIndices)) {\n throw new TypeError('row indices must be an array');\n }\n\n for (let i = 0; i < rowIndices.length; i++) {\n if (rowIndices[i] < 0 || rowIndices[i] >= matrix.rows) {\n throw new RangeError('row indices are out of range');\n }\n }\n}\n\nexport function checkColumnIndices(matrix, columnIndices) {\n if (!isAnyArray(columnIndices)) {\n throw new TypeError('column indices must be an array');\n }\n\n for (let i = 0; i < columnIndices.length; i++) {\n if (columnIndices[i] < 0 || columnIndices[i] >= matrix.columns) {\n throw new RangeError('column indices are out of range');\n }\n }\n}\n\nexport function checkRange(matrix, startRow, endRow, startColumn, endColumn) {\n if (arguments.length !== 5) {\n throw new RangeError('expected 4 arguments');\n }\n checkNumber('startRow', startRow);\n checkNumber('endRow', endRow);\n checkNumber('startColumn', startColumn);\n checkNumber('endColumn', endColumn);\n if (\n startRow > endRow ||\n startColumn > endColumn ||\n startRow < 0 ||\n startRow >= matrix.rows ||\n endRow < 0 ||\n endRow >= matrix.rows ||\n startColumn < 0 ||\n startColumn >= matrix.columns ||\n endColumn < 0 ||\n endColumn >= matrix.columns\n ) {\n throw new RangeError('Submatrix indices are out of range');\n }\n}\n\nexport function newArray(length, value = 0) {\n let array = [];\n for (let i = 0; i < length; i++) {\n array.push(value);\n }\n return array;\n}\n\nfunction checkNumber(name, value) {\n if (typeof value !== 'number') {\n throw new TypeError(`${name} must be a number`);\n }\n}\n\nexport function checkNonEmpty(matrix) {\n if (matrix.isEmpty()) {\n throw new Error('Empty matrix has no elements to index');\n }\n}\n","import { newArray } from './util';\n\nexport function sumByRow(matrix) {\n let sum = newArray(matrix.rows);\n for (let i = 0; i < matrix.rows; ++i) {\n for (let j = 0; j < matrix.columns; ++j) {\n sum[i] += matrix.get(i, j);\n }\n }\n return sum;\n}\n\nexport function sumByColumn(matrix) {\n let sum = newArray(matrix.columns);\n for (let i = 0; i < matrix.rows; ++i) {\n for (let j = 0; j < matrix.columns; ++j) {\n sum[j] += matrix.get(i, j);\n }\n }\n return sum;\n}\n\nexport function sumAll(matrix) {\n let v = 0;\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n v += matrix.get(i, j);\n }\n }\n return v;\n}\n\nexport function productByRow(matrix) {\n let sum = newArray(matrix.rows, 1);\n for (let i = 0; i < matrix.rows; ++i) {\n for (let j = 0; j < matrix.columns; ++j) {\n sum[i] *= matrix.get(i, j);\n }\n }\n return sum;\n}\n\nexport function productByColumn(matrix) {\n let sum = newArray(matrix.columns, 1);\n for (let i = 0; i < matrix.rows; ++i) {\n for (let j = 0; j < matrix.columns; ++j) {\n sum[j] *= matrix.get(i, j);\n }\n }\n return sum;\n}\n\nexport function productAll(matrix) {\n let v = 1;\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n v *= matrix.get(i, j);\n }\n }\n return v;\n}\n\nexport function varianceByRow(matrix, unbiased, mean) {\n const rows = matrix.rows;\n const cols = matrix.columns;\n const variance = [];\n\n for (let i = 0; i < rows; i++) {\n let sum1 = 0;\n let sum2 = 0;\n let x = 0;\n for (let j = 0; j < cols; j++) {\n x = matrix.get(i, j) - mean[i];\n sum1 += x;\n sum2 += x * x;\n }\n if (unbiased) {\n variance.push((sum2 - (sum1 * sum1) / cols) / (cols - 1));\n } else {\n variance.push((sum2 - (sum1 * sum1) / cols) / cols);\n }\n }\n return variance;\n}\n\nexport function varianceByColumn(matrix, unbiased, mean) {\n const rows = matrix.rows;\n const cols = matrix.columns;\n const variance = [];\n\n for (let j = 0; j < cols; j++) {\n let sum1 = 0;\n let sum2 = 0;\n let x = 0;\n for (let i = 0; i < rows; i++) {\n x = matrix.get(i, j) - mean[j];\n sum1 += x;\n sum2 += x * x;\n }\n if (unbiased) {\n variance.push((sum2 - (sum1 * sum1) / rows) / (rows - 1));\n } else {\n variance.push((sum2 - (sum1 * sum1) / rows) / rows);\n }\n }\n return variance;\n}\n\nexport function varianceAll(matrix, unbiased, mean) {\n const rows = matrix.rows;\n const cols = matrix.columns;\n const size = rows * cols;\n\n let sum1 = 0;\n let sum2 = 0;\n let x = 0;\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < cols; j++) {\n x = matrix.get(i, j) - mean;\n sum1 += x;\n sum2 += x * x;\n }\n }\n if (unbiased) {\n return (sum2 - (sum1 * sum1) / size) / (size - 1);\n } else {\n return (sum2 - (sum1 * sum1) / size) / size;\n }\n}\n\nexport function centerByRow(matrix, mean) {\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n matrix.set(i, j, matrix.get(i, j) - mean[i]);\n }\n }\n}\n\nexport function centerByColumn(matrix, mean) {\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n matrix.set(i, j, matrix.get(i, j) - mean[j]);\n }\n }\n}\n\nexport function centerAll(matrix, mean) {\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n matrix.set(i, j, matrix.get(i, j) - mean);\n }\n }\n}\n\nexport function getScaleByRow(matrix) {\n const scale = [];\n for (let i = 0; i < matrix.rows; i++) {\n let sum = 0;\n for (let j = 0; j < matrix.columns; j++) {\n sum += Math.pow(matrix.get(i, j), 2) / (matrix.columns - 1);\n }\n scale.push(Math.sqrt(sum));\n }\n return scale;\n}\n\nexport function scaleByRow(matrix, scale) {\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n matrix.set(i, j, matrix.get(i, j) / scale[i]);\n }\n }\n}\n\nexport function getScaleByColumn(matrix) {\n const scale = [];\n for (let j = 0; j < matrix.columns; j++) {\n let sum = 0;\n for (let i = 0; i < matrix.rows; i++) {\n sum += Math.pow(matrix.get(i, j), 2) / (matrix.rows - 1);\n }\n scale.push(Math.sqrt(sum));\n }\n return scale;\n}\n\nexport function scaleByColumn(matrix, scale) {\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n matrix.set(i, j, matrix.get(i, j) / scale[j]);\n }\n }\n}\n\nexport function getScaleAll(matrix) {\n const divider = matrix.size - 1;\n let sum = 0;\n for (let j = 0; j < matrix.columns; j++) {\n for (let i = 0; i < matrix.rows; i++) {\n sum += Math.pow(matrix.get(i, j), 2) / divider;\n }\n }\n return Math.sqrt(sum);\n}\n\nexport function scaleAll(matrix, scale) {\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n matrix.set(i, j, matrix.get(i, j) / scale);\n }\n }\n}\n","import { isAnyArray } from 'is-any-array';\nimport rescale from 'ml-array-rescale';\n\nimport { inspectMatrix, inspectMatrixWithOptions } from './inspect';\nimport { installMathOperations } from './mathOperations';\nimport {\n sumByRow,\n sumByColumn,\n sumAll,\n productByRow,\n productByColumn,\n productAll,\n varianceByRow,\n varianceByColumn,\n varianceAll,\n centerByRow,\n centerByColumn,\n centerAll,\n scaleByRow,\n scaleByColumn,\n scaleAll,\n getScaleByRow,\n getScaleByColumn,\n getScaleAll,\n} from './stat';\nimport {\n checkRowVector,\n checkRowIndex,\n checkColumnIndex,\n checkColumnVector,\n checkRange,\n checkNonEmpty,\n checkRowIndices,\n checkColumnIndices,\n} from './util';\n\nexport class AbstractMatrix {\n static from1DArray(newRows, newColumns, newData) {\n let length = newRows * newColumns;\n if (length !== newData.length) {\n throw new RangeError('data length does not match given dimensions');\n }\n let newMatrix = new Matrix(newRows, newColumns);\n for (let row = 0; row < newRows; row++) {\n for (let column = 0; column < newColumns; column++) {\n newMatrix.set(row, column, newData[row * newColumns + column]);\n }\n }\n return newMatrix;\n }\n\n static rowVector(newData) {\n let vector = new Matrix(1, newData.length);\n for (let i = 0; i < newData.length; i++) {\n vector.set(0, i, newData[i]);\n }\n return vector;\n }\n\n static columnVector(newData) {\n let vector = new Matrix(newData.length, 1);\n for (let i = 0; i < newData.length; i++) {\n vector.set(i, 0, newData[i]);\n }\n return vector;\n }\n\n static zeros(rows, columns) {\n return new Matrix(rows, columns);\n }\n\n static ones(rows, columns) {\n return new Matrix(rows, columns).fill(1);\n }\n\n static rand(rows, columns, options = {}) {\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n const { random = Math.random } = options;\n let matrix = new Matrix(rows, columns);\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < columns; j++) {\n matrix.set(i, j, random());\n }\n }\n return matrix;\n }\n\n static randInt(rows, columns, options = {}) {\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n const { min = 0, max = 1000, random = Math.random } = options;\n if (!Number.isInteger(min)) throw new TypeError('min must be an integer');\n if (!Number.isInteger(max)) throw new TypeError('max must be an integer');\n if (min >= max) throw new RangeError('min must be smaller than max');\n let interval = max - min;\n let matrix = new Matrix(rows, columns);\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < columns; j++) {\n let value = min + Math.round(random() * interval);\n matrix.set(i, j, value);\n }\n }\n return matrix;\n }\n\n static eye(rows, columns, value) {\n if (columns === undefined) columns = rows;\n if (value === undefined) value = 1;\n let min = Math.min(rows, columns);\n let matrix = this.zeros(rows, columns);\n for (let i = 0; i < min; i++) {\n matrix.set(i, i, value);\n }\n return matrix;\n }\n\n static diag(data, rows, columns) {\n let l = data.length;\n if (rows === undefined) rows = l;\n if (columns === undefined) columns = rows;\n let min = Math.min(l, rows, columns);\n let matrix = this.zeros(rows, columns);\n for (let i = 0; i < min; i++) {\n matrix.set(i, i, data[i]);\n }\n return matrix;\n }\n\n static min(matrix1, matrix2) {\n matrix1 = this.checkMatrix(matrix1);\n matrix2 = this.checkMatrix(matrix2);\n let rows = matrix1.rows;\n let columns = matrix1.columns;\n let result = new Matrix(rows, columns);\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < columns; j++) {\n result.set(i, j, Math.min(matrix1.get(i, j), matrix2.get(i, j)));\n }\n }\n return result;\n }\n\n static max(matrix1, matrix2) {\n matrix1 = this.checkMatrix(matrix1);\n matrix2 = this.checkMatrix(matrix2);\n let rows = matrix1.rows;\n let columns = matrix1.columns;\n let result = new this(rows, columns);\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < columns; j++) {\n result.set(i, j, Math.max(matrix1.get(i, j), matrix2.get(i, j)));\n }\n }\n return result;\n }\n\n static checkMatrix(value) {\n return AbstractMatrix.isMatrix(value) ? value : new Matrix(value);\n }\n\n static isMatrix(value) {\n return value != null && value.klass === 'Matrix';\n }\n\n get size() {\n return this.rows * this.columns;\n }\n\n apply(callback) {\n if (typeof callback !== 'function') {\n throw new TypeError('callback must be a function');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n callback.call(this, i, j);\n }\n }\n return this;\n }\n\n to1DArray() {\n let array = [];\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n array.push(this.get(i, j));\n }\n }\n return array;\n }\n\n to2DArray() {\n let copy = [];\n for (let i = 0; i < this.rows; i++) {\n copy.push([]);\n for (let j = 0; j < this.columns; j++) {\n copy[i].push(this.get(i, j));\n }\n }\n return copy;\n }\n\n toJSON() {\n return this.to2DArray();\n }\n\n isRowVector() {\n return this.rows === 1;\n }\n\n isColumnVector() {\n return this.columns === 1;\n }\n\n isVector() {\n return this.rows === 1 || this.columns === 1;\n }\n\n isSquare() {\n return this.rows === this.columns;\n }\n\n isEmpty() {\n return this.rows === 0 || this.columns === 0;\n }\n\n isSymmetric() {\n if (this.isSquare()) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j <= i; j++) {\n if (this.get(i, j) !== this.get(j, i)) {\n return false;\n }\n }\n }\n return true;\n }\n return false;\n }\n\n isEchelonForm() {\n let i = 0;\n let j = 0;\n let previousColumn = -1;\n let isEchelonForm = true;\n let checked = false;\n while (i < this.rows && isEchelonForm) {\n j = 0;\n checked = false;\n while (j < this.columns && checked === false) {\n if (this.get(i, j) === 0) {\n j++;\n } else if (this.get(i, j) === 1 && j > previousColumn) {\n checked = true;\n previousColumn = j;\n } else {\n isEchelonForm = false;\n checked = true;\n }\n }\n i++;\n }\n return isEchelonForm;\n }\n\n isReducedEchelonForm() {\n let i = 0;\n let j = 0;\n let previousColumn = -1;\n let isReducedEchelonForm = true;\n let checked = false;\n while (i < this.rows && isReducedEchelonForm) {\n j = 0;\n checked = false;\n while (j < this.columns && checked === false) {\n if (this.get(i, j) === 0) {\n j++;\n } else if (this.get(i, j) === 1 && j > previousColumn) {\n checked = true;\n previousColumn = j;\n } else {\n isReducedEchelonForm = false;\n checked = true;\n }\n }\n for (let k = j + 1; k < this.rows; k++) {\n if (this.get(i, k) !== 0) {\n isReducedEchelonForm = false;\n }\n }\n i++;\n }\n return isReducedEchelonForm;\n }\n\n echelonForm() {\n let result = this.clone();\n let h = 0;\n let k = 0;\n while (h < result.rows && k < result.columns) {\n let iMax = h;\n for (let i = h; i < result.rows; i++) {\n if (result.get(i, k) > result.get(iMax, k)) {\n iMax = i;\n }\n }\n if (result.get(iMax, k) === 0) {\n k++;\n } else {\n result.swapRows(h, iMax);\n let tmp = result.get(h, k);\n for (let j = k; j < result.columns; j++) {\n result.set(h, j, result.get(h, j) / tmp);\n }\n for (let i = h + 1; i < result.rows; i++) {\n let factor = result.get(i, k) / result.get(h, k);\n result.set(i, k, 0);\n for (let j = k + 1; j < result.columns; j++) {\n result.set(i, j, result.get(i, j) - result.get(h, j) * factor);\n }\n }\n h++;\n k++;\n }\n }\n return result;\n }\n\n reducedEchelonForm() {\n let result = this.echelonForm();\n let m = result.columns;\n let n = result.rows;\n let h = n - 1;\n while (h >= 0) {\n if (result.maxRow(h) === 0) {\n h--;\n } else {\n let p = 0;\n let pivot = false;\n while (p < n && pivot === false) {\n if (result.get(h, p) === 1) {\n pivot = true;\n } else {\n p++;\n }\n }\n for (let i = 0; i < h; i++) {\n let factor = result.get(i, p);\n for (let j = p; j < m; j++) {\n let tmp = result.get(i, j) - factor * result.get(h, j);\n result.set(i, j, tmp);\n }\n }\n h--;\n }\n }\n return result;\n }\n\n set() {\n throw new Error('set method is unimplemented');\n }\n\n get() {\n throw new Error('get method is unimplemented');\n }\n\n repeat(options = {}) {\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n const { rows = 1, columns = 1 } = options;\n if (!Number.isInteger(rows) || rows <= 0) {\n throw new TypeError('rows must be a positive integer');\n }\n if (!Number.isInteger(columns) || columns <= 0) {\n throw new TypeError('columns must be a positive integer');\n }\n let matrix = new Matrix(this.rows * rows, this.columns * columns);\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < columns; j++) {\n matrix.setSubMatrix(this, this.rows * i, this.columns * j);\n }\n }\n return matrix;\n }\n\n fill(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, value);\n }\n }\n return this;\n }\n\n neg() {\n return this.mulS(-1);\n }\n\n getRow(index) {\n checkRowIndex(this, index);\n let row = [];\n for (let i = 0; i < this.columns; i++) {\n row.push(this.get(index, i));\n }\n return row;\n }\n\n getRowVector(index) {\n return Matrix.rowVector(this.getRow(index));\n }\n\n setRow(index, array) {\n checkRowIndex(this, index);\n array = checkRowVector(this, array);\n for (let i = 0; i < this.columns; i++) {\n this.set(index, i, array[i]);\n }\n return this;\n }\n\n swapRows(row1, row2) {\n checkRowIndex(this, row1);\n checkRowIndex(this, row2);\n for (let i = 0; i < this.columns; i++) {\n let temp = this.get(row1, i);\n this.set(row1, i, this.get(row2, i));\n this.set(row2, i, temp);\n }\n return this;\n }\n\n getColumn(index) {\n checkColumnIndex(this, index);\n let column = [];\n for (let i = 0; i < this.rows; i++) {\n column.push(this.get(i, index));\n }\n return column;\n }\n\n getColumnVector(index) {\n return Matrix.columnVector(this.getColumn(index));\n }\n\n setColumn(index, array) {\n checkColumnIndex(this, index);\n array = checkColumnVector(this, array);\n for (let i = 0; i < this.rows; i++) {\n this.set(i, index, array[i]);\n }\n return this;\n }\n\n swapColumns(column1, column2) {\n checkColumnIndex(this, column1);\n checkColumnIndex(this, column2);\n for (let i = 0; i < this.rows; i++) {\n let temp = this.get(i, column1);\n this.set(i, column1, this.get(i, column2));\n this.set(i, column2, temp);\n }\n return this;\n }\n\n addRowVector(vector) {\n vector = checkRowVector(this, vector);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) + vector[j]);\n }\n }\n return this;\n }\n\n subRowVector(vector) {\n vector = checkRowVector(this, vector);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) - vector[j]);\n }\n }\n return this;\n }\n\n mulRowVector(vector) {\n vector = checkRowVector(this, vector);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) * vector[j]);\n }\n }\n return this;\n }\n\n divRowVector(vector) {\n vector = checkRowVector(this, vector);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) / vector[j]);\n }\n }\n return this;\n }\n\n addColumnVector(vector) {\n vector = checkColumnVector(this, vector);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) + vector[i]);\n }\n }\n return this;\n }\n\n subColumnVector(vector) {\n vector = checkColumnVector(this, vector);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) - vector[i]);\n }\n }\n return this;\n }\n\n mulColumnVector(vector) {\n vector = checkColumnVector(this, vector);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) * vector[i]);\n }\n }\n return this;\n }\n\n divColumnVector(vector) {\n vector = checkColumnVector(this, vector);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) / vector[i]);\n }\n }\n return this;\n }\n\n mulRow(index, value) {\n checkRowIndex(this, index);\n for (let i = 0; i < this.columns; i++) {\n this.set(index, i, this.get(index, i) * value);\n }\n return this;\n }\n\n mulColumn(index, value) {\n checkColumnIndex(this, index);\n for (let i = 0; i < this.rows; i++) {\n this.set(i, index, this.get(i, index) * value);\n }\n return this;\n }\n\n max(by) {\n if (this.isEmpty()) {\n return NaN;\n }\n switch (by) {\n case 'row': {\n const max = new Array(this.rows).fill(Number.NEGATIVE_INFINITY);\n for (let row = 0; row < this.rows; row++) {\n for (let column = 0; column < this.columns; column++) {\n if (this.get(row, column) > max[row]) {\n max[row] = this.get(row, column);\n }\n }\n }\n return max;\n }\n case 'column': {\n const max = new Array(this.columns).fill(Number.NEGATIVE_INFINITY);\n for (let row = 0; row < this.rows; row++) {\n for (let column = 0; column < this.columns; column++) {\n if (this.get(row, column) > max[column]) {\n max[column] = this.get(row, column);\n }\n }\n }\n return max;\n }\n case undefined: {\n let max = this.get(0, 0);\n for (let row = 0; row < this.rows; row++) {\n for (let column = 0; column < this.columns; column++) {\n if (this.get(row, column) > max) {\n max = this.get(row, column);\n }\n }\n }\n return max;\n }\n default:\n throw new Error(`invalid option: ${by}`);\n }\n }\n\n maxIndex() {\n checkNonEmpty(this);\n let v = this.get(0, 0);\n let idx = [0, 0];\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n if (this.get(i, j) > v) {\n v = this.get(i, j);\n idx[0] = i;\n idx[1] = j;\n }\n }\n }\n return idx;\n }\n\n min(by) {\n if (this.isEmpty()) {\n return NaN;\n }\n\n switch (by) {\n case 'row': {\n const min = new Array(this.rows).fill(Number.POSITIVE_INFINITY);\n for (let row = 0; row < this.rows; row++) {\n for (let column = 0; column < this.columns; column++) {\n if (this.get(row, column) < min[row]) {\n min[row] = this.get(row, column);\n }\n }\n }\n return min;\n }\n case 'column': {\n const min = new Array(this.columns).fill(Number.POSITIVE_INFINITY);\n for (let row = 0; row < this.rows; row++) {\n for (let column = 0; column < this.columns; column++) {\n if (this.get(row, column) < min[column]) {\n min[column] = this.get(row, column);\n }\n }\n }\n return min;\n }\n case undefined: {\n let min = this.get(0, 0);\n for (let row = 0; row < this.rows; row++) {\n for (let column = 0; column < this.columns; column++) {\n if (this.get(row, column) < min) {\n min = this.get(row, column);\n }\n }\n }\n return min;\n }\n default:\n throw new Error(`invalid option: ${by}`);\n }\n }\n\n minIndex() {\n checkNonEmpty(this);\n let v = this.get(0, 0);\n let idx = [0, 0];\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n if (this.get(i, j) < v) {\n v = this.get(i, j);\n idx[0] = i;\n idx[1] = j;\n }\n }\n }\n return idx;\n }\n\n maxRow(row) {\n checkRowIndex(this, row);\n if (this.isEmpty()) {\n return NaN;\n }\n let v = this.get(row, 0);\n for (let i = 1; i < this.columns; i++) {\n if (this.get(row, i) > v) {\n v = this.get(row, i);\n }\n }\n return v;\n }\n\n maxRowIndex(row) {\n checkRowIndex(this, row);\n checkNonEmpty(this);\n let v = this.get(row, 0);\n let idx = [row, 0];\n for (let i = 1; i < this.columns; i++) {\n if (this.get(row, i) > v) {\n v = this.get(row, i);\n idx[1] = i;\n }\n }\n return idx;\n }\n\n minRow(row) {\n checkRowIndex(this, row);\n if (this.isEmpty()) {\n return NaN;\n }\n let v = this.get(row, 0);\n for (let i = 1; i < this.columns; i++) {\n if (this.get(row, i) < v) {\n v = this.get(row, i);\n }\n }\n return v;\n }\n\n minRowIndex(row) {\n checkRowIndex(this, row);\n checkNonEmpty(this);\n let v = this.get(row, 0);\n let idx = [row, 0];\n for (let i = 1; i < this.columns; i++) {\n if (this.get(row, i) < v) {\n v = this.get(row, i);\n idx[1] = i;\n }\n }\n return idx;\n }\n\n maxColumn(column) {\n checkColumnIndex(this, column);\n if (this.isEmpty()) {\n return NaN;\n }\n let v = this.get(0, column);\n for (let i = 1; i < this.rows; i++) {\n if (this.get(i, column) > v) {\n v = this.get(i, column);\n }\n }\n return v;\n }\n\n maxColumnIndex(column) {\n checkColumnIndex(this, column);\n checkNonEmpty(this);\n let v = this.get(0, column);\n let idx = [0, column];\n for (let i = 1; i < this.rows; i++) {\n if (this.get(i, column) > v) {\n v = this.get(i, column);\n idx[0] = i;\n }\n }\n return idx;\n }\n\n minColumn(column) {\n checkColumnIndex(this, column);\n if (this.isEmpty()) {\n return NaN;\n }\n let v = this.get(0, column);\n for (let i = 1; i < this.rows; i++) {\n if (this.get(i, column) < v) {\n v = this.get(i, column);\n }\n }\n return v;\n }\n\n minColumnIndex(column) {\n checkColumnIndex(this, column);\n checkNonEmpty(this);\n let v = this.get(0, column);\n let idx = [0, column];\n for (let i = 1; i < this.rows; i++) {\n if (this.get(i, column) < v) {\n v = this.get(i, column);\n idx[0] = i;\n }\n }\n return idx;\n }\n\n diag() {\n let min = Math.min(this.rows, this.columns);\n let diag = [];\n for (let i = 0; i < min; i++) {\n diag.push(this.get(i, i));\n }\n return diag;\n }\n\n norm(type = 'frobenius') {\n let result = 0;\n if (type === 'max') {\n return this.max();\n } else if (type === 'frobenius') {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n result = result + this.get(i, j) * this.get(i, j);\n }\n }\n return Math.sqrt(result);\n } else {\n throw new RangeError(`unknown norm type: ${type}`);\n }\n }\n\n cumulativeSum() {\n let sum = 0;\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n sum += this.get(i, j);\n this.set(i, j, sum);\n }\n }\n return this;\n }\n\n dot(vector2) {\n if (AbstractMatrix.isMatrix(vector2)) vector2 = vector2.to1DArray();\n let vector1 = this.to1DArray();\n if (vector1.length !== vector2.length) {\n throw new RangeError('vectors do not have the same size');\n }\n let dot = 0;\n for (let i = 0; i < vector1.length; i++) {\n dot += vector1[i] * vector2[i];\n }\n return dot;\n }\n\n mmul(other) {\n other = Matrix.checkMatrix(other);\n\n let m = this.rows;\n let n = this.columns;\n let p = other.columns;\n\n let result = new Matrix(m, p);\n\n let Bcolj = new Float64Array(n);\n for (let j = 0; j < p; j++) {\n for (let k = 0; k < n; k++) {\n Bcolj[k] = other.get(k, j);\n }\n\n for (let i = 0; i < m; i++) {\n let s = 0;\n for (let k = 0; k < n; k++) {\n s += this.get(i, k) * Bcolj[k];\n }\n\n result.set(i, j, s);\n }\n }\n return result;\n }\n\n strassen2x2(other) {\n other = Matrix.checkMatrix(other);\n let result = new Matrix(2, 2);\n const a11 = this.get(0, 0);\n const b11 = other.get(0, 0);\n const a12 = this.get(0, 1);\n const b12 = other.get(0, 1);\n const a21 = this.get(1, 0);\n const b21 = other.get(1, 0);\n const a22 = this.get(1, 1);\n const b22 = other.get(1, 1);\n\n // Compute intermediate values.\n const m1 = (a11 + a22) * (b11 + b22);\n const m2 = (a21 + a22) * b11;\n const m3 = a11 * (b12 - b22);\n const m4 = a22 * (b21 - b11);\n const m5 = (a11 + a12) * b22;\n const m6 = (a21 - a11) * (b11 + b12);\n const m7 = (a12 - a22) * (b21 + b22);\n\n // Combine intermediate values into the output.\n const c00 = m1 + m4 - m5 + m7;\n const c01 = m3 + m5;\n const c10 = m2 + m4;\n const c11 = m1 - m2 + m3 + m6;\n\n result.set(0, 0, c00);\n result.set(0, 1, c01);\n result.set(1, 0, c10);\n result.set(1, 1, c11);\n return result;\n }\n\n strassen3x3(other) {\n other = Matrix.checkMatrix(other);\n let result = new Matrix(3, 3);\n\n const a00 = this.get(0, 0);\n const a01 = this.get(0, 1);\n const a02 = this.get(0, 2);\n const a10 = this.get(1, 0);\n const a11 = this.get(1, 1);\n const a12 = this.get(1, 2);\n const a20 = this.get(2, 0);\n const a21 = this.get(2, 1);\n const a22 = this.get(2, 2);\n\n const b00 = other.get(0, 0);\n const b01 = other.get(0, 1);\n const b02 = other.get(0, 2);\n const b10 = other.get(1, 0);\n const b11 = other.get(1, 1);\n const b12 = other.get(1, 2);\n const b20 = other.get(2, 0);\n const b21 = other.get(2, 1);\n const b22 = other.get(2, 2);\n\n const m1 = (a00 + a01 + a02 - a10 - a11 - a21 - a22) * b11;\n const m2 = (a00 - a10) * (-b01 + b11);\n const m3 = a11 * (-b00 + b01 + b10 - b11 - b12 - b20 + b22);\n const m4 = (-a00 + a10 + a11) * (b00 - b01 + b11);\n const m5 = (a10 + a11) * (-b00 + b01);\n const m6 = a00 * b00;\n const m7 = (-a00 + a20 + a21) * (b00 - b02 + b12);\n const m8 = (-a00 + a20) * (b02 - b12);\n const m9 = (a20 + a21) * (-b00 + b02);\n const m10 = (a00 + a01 + a02 - a11 - a12 - a20 - a21) * b12;\n const m11 = a21 * (-b00 + b02 + b10 - b11 - b12 - b20 + b21);\n const m12 = (-a02 + a21 + a22) * (b11 + b20 - b21);\n const m13 = (a02 - a22) * (b11 - b21);\n const m14 = a02 * b20;\n const m15 = (a21 + a22) * (-b20 + b21);\n const m16 = (-a02 + a11 + a12) * (b12 + b20 - b22);\n const m17 = (a02 - a12) * (b12 - b22);\n const m18 = (a11 + a12) * (-b20 + b22);\n const m19 = a01 * b10;\n const m20 = a12 * b21;\n const m21 = a10 * b02;\n const m22 = a20 * b01;\n const m23 = a22 * b22;\n\n const c00 = m6 + m14 + m19;\n const c01 = m1 + m4 + m5 + m6 + m12 + m14 + m15;\n const c02 = m6 + m7 + m9 + m10 + m14 + m16 + m18;\n const c10 = m2 + m3 + m4 + m6 + m14 + m16 + m17;\n const c11 = m2 + m4 + m5 + m6 + m20;\n const c12 = m14 + m16 + m17 + m18 + m21;\n const c20 = m6 + m7 + m8 + m11 + m12 + m13 + m14;\n const c21 = m12 + m13 + m14 + m15 + m22;\n const c22 = m6 + m7 + m8 + m9 + m23;\n\n result.set(0, 0, c00);\n result.set(0, 1, c01);\n result.set(0, 2, c02);\n result.set(1, 0, c10);\n result.set(1, 1, c11);\n result.set(1, 2, c12);\n result.set(2, 0, c20);\n result.set(2, 1, c21);\n result.set(2, 2, c22);\n return result;\n }\n\n mmulStrassen(y) {\n y = Matrix.checkMatrix(y);\n let x = this.clone();\n let r1 = x.rows;\n let c1 = x.columns;\n let r2 = y.rows;\n let c2 = y.columns;\n if (c1 !== r2) {\n // eslint-disable-next-line no-console\n console.warn(\n `Multiplying ${r1} x ${c1} and ${r2} x ${c2} matrix: dimensions do not match.`,\n );\n }\n\n // Put a matrix into the top left of a matrix of zeros.\n // `rows` and `cols` are the dimensions of the output matrix.\n function embed(mat, rows, cols) {\n let r = mat.rows;\n let c = mat.columns;\n if (r === rows && c === cols) {\n return mat;\n } else {\n let resultat = AbstractMatrix.zeros(rows, cols);\n resultat = resultat.setSubMatrix(mat, 0, 0);\n return resultat;\n }\n }\n\n // Make sure both matrices are the same size.\n // This is exclusively for simplicity:\n // this algorithm can be implemented with matrices of different sizes.\n\n let r = Math.max(r1, r2);\n let c = Math.max(c1, c2);\n x = embed(x, r, c);\n y = embed(y, r, c);\n\n // Our recursive multiplication function.\n function blockMult(a, b, rows, cols) {\n // For small matrices, resort to naive multiplication.\n if (rows <= 512 || cols <= 512) {\n return a.mmul(b); // a is equivalent to this\n }\n\n // Apply dynamic padding.\n if (rows % 2 === 1 && cols % 2 === 1) {\n a = embed(a, rows + 1, cols + 1);\n b = embed(b, rows + 1, cols + 1);\n } else if (rows % 2 === 1) {\n a = embed(a, rows + 1, cols);\n b = embed(b, rows + 1, cols);\n } else if (cols % 2 === 1) {\n a = embed(a, rows, cols + 1);\n b = embed(b, rows, cols + 1);\n }\n\n let halfRows = parseInt(a.rows / 2, 10);\n let halfCols = parseInt(a.columns / 2, 10);\n // Subdivide input matrices.\n let a11 = a.subMatrix(0, halfRows - 1, 0, halfCols - 1);\n let b11 = b.subMatrix(0, halfRows - 1, 0, halfCols - 1);\n\n let a12 = a.subMatrix(0, halfRows - 1, halfCols, a.columns - 1);\n let b12 = b.subMatrix(0, halfRows - 1, halfCols, b.columns - 1);\n\n let a21 = a.subMatrix(halfRows, a.rows - 1, 0, halfCols - 1);\n let b21 = b.subMatrix(halfRows, b.rows - 1, 0, halfCols - 1);\n\n let a22 = a.subMatrix(halfRows, a.rows - 1, halfCols, a.columns - 1);\n let b22 = b.subMatrix(halfRows, b.rows - 1, halfCols, b.columns - 1);\n\n // Compute intermediate values.\n let m1 = blockMult(\n AbstractMatrix.add(a11, a22),\n AbstractMatrix.add(b11, b22),\n halfRows,\n halfCols,\n );\n let m2 = blockMult(AbstractMatrix.add(a21, a22), b11, halfRows, halfCols);\n let m3 = blockMult(a11, AbstractMatrix.sub(b12, b22), halfRows, halfCols);\n let m4 = blockMult(a22, AbstractMatrix.sub(b21, b11), halfRows, halfCols);\n let m5 = blockMult(AbstractMatrix.add(a11, a12), b22, halfRows, halfCols);\n let m6 = blockMult(\n AbstractMatrix.sub(a21, a11),\n AbstractMatrix.add(b11, b12),\n halfRows,\n halfCols,\n );\n let m7 = blockMult(\n AbstractMatrix.sub(a12, a22),\n AbstractMatrix.add(b21, b22),\n halfRows,\n halfCols,\n );\n\n // Combine intermediate values into the output.\n let c11 = AbstractMatrix.add(m1, m4);\n c11.sub(m5);\n c11.add(m7);\n let c12 = AbstractMatrix.add(m3, m5);\n let c21 = AbstractMatrix.add(m2, m4);\n let c22 = AbstractMatrix.sub(m1, m2);\n c22.add(m3);\n c22.add(m6);\n\n // Crop output to the desired size (undo dynamic padding).\n let resultat = AbstractMatrix.zeros(2 * c11.rows, 2 * c11.columns);\n resultat = resultat.setSubMatrix(c11, 0, 0);\n resultat = resultat.setSubMatrix(c12, c11.rows, 0);\n resultat = resultat.setSubMatrix(c21, 0, c11.columns);\n resultat = resultat.setSubMatrix(c22, c11.rows, c11.columns);\n return resultat.subMatrix(0, rows - 1, 0, cols - 1);\n }\n\n return blockMult(x, y, r, c);\n }\n\n scaleRows(options = {}) {\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n const { min = 0, max = 1 } = options;\n if (!Number.isFinite(min)) throw new TypeError('min must be a number');\n if (!Number.isFinite(max)) throw new TypeError('max must be a number');\n if (min >= max) throw new RangeError('min must be smaller than max');\n let newMatrix = new Matrix(this.rows, this.columns);\n for (let i = 0; i < this.rows; i++) {\n const row = this.getRow(i);\n if (row.length > 0) {\n rescale(row, { min, max, output: row });\n }\n newMatrix.setRow(i, row);\n }\n return newMatrix;\n }\n\n scaleColumns(options = {}) {\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n const { min = 0, max = 1 } = options;\n if (!Number.isFinite(min)) throw new TypeError('min must be a number');\n if (!Number.isFinite(max)) throw new TypeError('max must be a number');\n if (min >= max) throw new RangeError('min must be smaller than max');\n let newMatrix = new Matrix(this.rows, this.columns);\n for (let i = 0; i < this.columns; i++) {\n const column = this.getColumn(i);\n if (column.length) {\n rescale(column, {\n min: min,\n max: max,\n output: column,\n });\n }\n newMatrix.setColumn(i, column);\n }\n return newMatrix;\n }\n\n flipRows() {\n const middle = Math.ceil(this.columns / 2);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < middle; j++) {\n let first = this.get(i, j);\n let last = this.get(i, this.columns - 1 - j);\n this.set(i, j, last);\n this.set(i, this.columns - 1 - j, first);\n }\n }\n return this;\n }\n\n flipColumns() {\n const middle = Math.ceil(this.rows / 2);\n for (let j = 0; j < this.columns; j++) {\n for (let i = 0; i < middle; i++) {\n let first = this.get(i, j);\n let last = this.get(this.rows - 1 - i, j);\n this.set(i, j, last);\n this.set(this.rows - 1 - i, j, first);\n }\n }\n return this;\n }\n\n kroneckerProduct(other) {\n other = Matrix.checkMatrix(other);\n\n let m = this.rows;\n let n = this.columns;\n let p = other.rows;\n let q = other.columns;\n\n let result = new Matrix(m * p, n * q);\n for (let i = 0; i < m; i++) {\n for (let j = 0; j < n; j++) {\n for (let k = 0; k < p; k++) {\n for (let l = 0; l < q; l++) {\n result.set(p * i + k, q * j + l, this.get(i, j) * other.get(k, l));\n }\n }\n }\n }\n return result;\n }\n\n kroneckerSum(other) {\n other = Matrix.checkMatrix(other);\n if (!this.isSquare() || !other.isSquare()) {\n throw new Error('Kronecker Sum needs two Square Matrices');\n }\n let m = this.rows;\n let n = other.rows;\n let AxI = this.kroneckerProduct(Matrix.eye(n, n));\n let IxB = Matrix.eye(m, m).kroneckerProduct(other);\n return AxI.add(IxB);\n }\n\n transpose() {\n let result = new Matrix(this.columns, this.rows);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n result.set(j, i, this.get(i, j));\n }\n }\n return result;\n }\n\n sortRows(compareFunction = compareNumbers) {\n for (let i = 0; i < this.rows; i++) {\n this.setRow(i, this.getRow(i).sort(compareFunction));\n }\n return this;\n }\n\n sortColumns(compareFunction = compareNumbers) {\n for (let i = 0; i < this.columns; i++) {\n this.setColumn(i, this.getColumn(i).sort(compareFunction));\n }\n return this;\n }\n\n subMatrix(startRow, endRow, startColumn, endColumn) {\n checkRange(this, startRow, endRow, startColumn, endColumn);\n let newMatrix = new Matrix(\n endRow - startRow + 1,\n endColumn - startColumn + 1,\n );\n for (let i = startRow; i <= endRow; i++) {\n for (let j = startColumn; j <= endColumn; j++) {\n newMatrix.set(i - startRow, j - startColumn, this.get(i, j));\n }\n }\n return newMatrix;\n }\n\n subMatrixRow(indices, startColumn, endColumn) {\n if (startColumn === undefined) startColumn = 0;\n if (endColumn === undefined) endColumn = this.columns - 1;\n if (\n startColumn > endColumn ||\n startColumn < 0 ||\n startColumn >= this.columns ||\n endColumn < 0 ||\n endColumn >= this.columns\n ) {\n throw new RangeError('Argument out of range');\n }\n\n let newMatrix = new Matrix(indices.length, endColumn - startColumn + 1);\n for (let i = 0; i < indices.length; i++) {\n for (let j = startColumn; j <= endColumn; j++) {\n if (indices[i] < 0 || indices[i] >= this.rows) {\n throw new RangeError(`Row index out of range: ${indices[i]}`);\n }\n newMatrix.set(i, j - startColumn, this.get(indices[i], j));\n }\n }\n return newMatrix;\n }\n\n subMatrixColumn(indices, startRow, endRow) {\n if (startRow === undefined) startRow = 0;\n if (endRow === undefined) endRow = this.rows - 1;\n if (\n startRow > endRow ||\n startRow < 0 ||\n startRow >= this.rows ||\n endRow < 0 ||\n endRow >= this.rows\n ) {\n throw new RangeError('Argument out of range');\n }\n\n let newMatrix = new Matrix(endRow - startRow + 1, indices.length);\n for (let i = 0; i < indices.length; i++) {\n for (let j = startRow; j <= endRow; j++) {\n if (indices[i] < 0 || indices[i] >= this.columns) {\n throw new RangeError(`Column index out of range: ${indices[i]}`);\n }\n newMatrix.set(j - startRow, i, this.get(j, indices[i]));\n }\n }\n return newMatrix;\n }\n\n setSubMatrix(matrix, startRow, startColumn) {\n matrix = Matrix.checkMatrix(matrix);\n if (matrix.isEmpty()) {\n return this;\n }\n let endRow = startRow + matrix.rows - 1;\n let endColumn = startColumn + matrix.columns - 1;\n checkRange(this, startRow, endRow, startColumn, endColumn);\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n this.set(startRow + i, startColumn + j, matrix.get(i, j));\n }\n }\n return this;\n }\n\n selection(rowIndices, columnIndices) {\n checkRowIndices(this, rowIndices);\n checkColumnIndices(this, columnIndices);\n let newMatrix = new Matrix(rowIndices.length, columnIndices.length);\n for (let i = 0; i < rowIndices.length; i++) {\n let rowIndex = rowIndices[i];\n for (let j = 0; j < columnIndices.length; j++) {\n let columnIndex = columnIndices[j];\n newMatrix.set(i, j, this.get(rowIndex, columnIndex));\n }\n }\n return newMatrix;\n }\n\n trace() {\n let min = Math.min(this.rows, this.columns);\n let trace = 0;\n for (let i = 0; i < min; i++) {\n trace += this.get(i, i);\n }\n return trace;\n }\n\n clone() {\n let newMatrix = new Matrix(this.rows, this.columns);\n for (let row = 0; row < this.rows; row++) {\n for (let column = 0; column < this.columns; column++) {\n newMatrix.set(row, column, this.get(row, column));\n }\n }\n return newMatrix;\n }\n\n sum(by) {\n switch (by) {\n case 'row':\n return sumByRow(this);\n case 'column':\n return sumByColumn(this);\n case undefined:\n return sumAll(this);\n default:\n throw new Error(`invalid option: ${by}`);\n }\n }\n\n product(by) {\n switch (by) {\n case 'row':\n return productByRow(this);\n case 'column':\n return productByColumn(this);\n case undefined:\n return productAll(this);\n default:\n throw new Error(`invalid option: ${by}`);\n }\n }\n\n mean(by) {\n const sum = this.sum(by);\n switch (by) {\n case 'row': {\n for (let i = 0; i < this.rows; i++) {\n sum[i] /= this.columns;\n }\n return sum;\n }\n case 'column': {\n for (let i = 0; i < this.columns; i++) {\n sum[i] /= this.rows;\n }\n return sum;\n }\n case undefined:\n return sum / this.size;\n default:\n throw new Error(`invalid option: ${by}`);\n }\n }\n\n variance(by, options = {}) {\n if (typeof by === 'object') {\n options = by;\n by = undefined;\n }\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n const { unbiased = true, mean = this.mean(by) } = options;\n if (typeof unbiased !== 'boolean') {\n throw new TypeError('unbiased must be a boolean');\n }\n switch (by) {\n case 'row': {\n if (!isAnyArray(mean)) {\n throw new TypeError('mean must be an array');\n }\n return varianceByRow(this, unbiased, mean);\n }\n case 'column': {\n if (!isAnyArray(mean)) {\n throw new TypeError('mean must be an array');\n }\n return varianceByColumn(this, unbiased, mean);\n }\n case undefined: {\n if (typeof mean !== 'number') {\n throw new TypeError('mean must be a number');\n }\n return varianceAll(this, unbiased, mean);\n }\n default:\n throw new Error(`invalid option: ${by}`);\n }\n }\n\n standardDeviation(by, options) {\n if (typeof by === 'object') {\n options = by;\n by = undefined;\n }\n const variance = this.variance(by, options);\n if (by === undefined) {\n return Math.sqrt(variance);\n } else {\n for (let i = 0; i < variance.length; i++) {\n variance[i] = Math.sqrt(variance[i]);\n }\n return variance;\n }\n }\n\n center(by, options = {}) {\n if (typeof by === 'object') {\n options = by;\n by = undefined;\n }\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n const { center = this.mean(by) } = options;\n switch (by) {\n case 'row': {\n if (!isAnyArray(center)) {\n throw new TypeError('center must be an array');\n }\n centerByRow(this, center);\n return this;\n }\n case 'column': {\n if (!isAnyArray(center)) {\n throw new TypeError('center must be an array');\n }\n centerByColumn(this, center);\n return this;\n }\n case undefined: {\n if (typeof center !== 'number') {\n throw new TypeError('center must be a number');\n }\n centerAll(this, center);\n return this;\n }\n default:\n throw new Error(`invalid option: ${by}`);\n }\n }\n\n scale(by, options = {}) {\n if (typeof by === 'object') {\n options = by;\n by = undefined;\n }\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n let scale = options.scale;\n switch (by) {\n case 'row': {\n if (scale === undefined) {\n scale = getScaleByRow(this);\n } else if (!isAnyArray(scale)) {\n throw new TypeError('scale must be an array');\n }\n scaleByRow(this, scale);\n return this;\n }\n case 'column': {\n if (scale === undefined) {\n scale = getScaleByColumn(this);\n } else if (!isAnyArray(scale)) {\n throw new TypeError('scale must be an array');\n }\n scaleByColumn(this, scale);\n return this;\n }\n case undefined: {\n if (scale === undefined) {\n scale = getScaleAll(this);\n } else if (typeof scale !== 'number') {\n throw new TypeError('scale must be a number');\n }\n scaleAll(this, scale);\n return this;\n }\n default:\n throw new Error(`invalid option: ${by}`);\n }\n }\n\n toString(options) {\n return inspectMatrixWithOptions(this, options);\n }\n}\n\nAbstractMatrix.prototype.klass = 'Matrix';\nif (typeof Symbol !== 'undefined') {\n AbstractMatrix.prototype[Symbol.for('nodejs.util.inspect.custom')] =\n inspectMatrix;\n}\n\nfunction compareNumbers(a, b) {\n return a - b;\n}\n\nfunction isArrayOfNumbers(array) {\n return array.every((element) => {\n return typeof element === 'number';\n });\n}\n\n// Synonyms\nAbstractMatrix.random = AbstractMatrix.rand;\nAbstractMatrix.randomInt = AbstractMatrix.randInt;\nAbstractMatrix.diagonal = AbstractMatrix.diag;\nAbstractMatrix.prototype.diagonal = AbstractMatrix.prototype.diag;\nAbstractMatrix.identity = AbstractMatrix.eye;\nAbstractMatrix.prototype.negate = AbstractMatrix.prototype.neg;\nAbstractMatrix.prototype.tensorProduct =\n AbstractMatrix.prototype.kroneckerProduct;\n\nexport default class Matrix extends AbstractMatrix {\n constructor(nRows, nColumns) {\n super();\n if (Matrix.isMatrix(nRows)) {\n // eslint-disable-next-line no-constructor-return\n return nRows.clone();\n } else if (Number.isInteger(nRows) && nRows >= 0) {\n // Create an empty matrix\n this.data = [];\n if (Number.isInteger(nColumns) && nColumns >= 0) {\n for (let i = 0; i < nRows; i++) {\n this.data.push(new Float64Array(nColumns));\n }\n } else {\n throw new TypeError('nColumns must be a positive integer');\n }\n } else if (isAnyArray(nRows)) {\n // Copy the values from the 2D array\n const arrayData = nRows;\n nRows = arrayData.length;\n nColumns = nRows ? arrayData[0].length : 0;\n if (typeof nColumns !== 'number') {\n throw new TypeError(\n 'Data must be a 2D array with at least one element',\n );\n }\n this.data = [];\n for (let i = 0; i < nRows; i++) {\n if (arrayData[i].length !== nColumns) {\n throw new RangeError('Inconsistent array dimensions');\n }\n if (!isArrayOfNumbers(arrayData[i])) {\n throw new TypeError('Input data contains non-numeric values');\n }\n this.data.push(Float64Array.from(arrayData[i]));\n }\n } else {\n throw new TypeError(\n 'First argument must be a positive number or an array',\n );\n }\n this.rows = nRows;\n this.columns = nColumns;\n }\n\n set(rowIndex, columnIndex, value) {\n this.data[rowIndex][columnIndex] = value;\n return this;\n }\n\n get(rowIndex, columnIndex) {\n return this.data[rowIndex][columnIndex];\n }\n\n removeRow(index) {\n checkRowIndex(this, index);\n this.data.splice(index, 1);\n this.rows -= 1;\n return this;\n }\n\n addRow(index, array) {\n if (array === undefined) {\n array = index;\n index = this.rows;\n }\n checkRowIndex(this, index, true);\n array = Float64Array.from(checkRowVector(this, array));\n this.data.splice(index, 0, array);\n this.rows += 1;\n return this;\n }\n\n removeColumn(index) {\n checkColumnIndex(this, index);\n for (let i = 0; i < this.rows; i++) {\n const newRow = new Float64Array(this.columns - 1);\n for (let j = 0; j < index; j++) {\n newRow[j] = this.data[i][j];\n }\n for (let j = index + 1; j < this.columns; j++) {\n newRow[j - 1] = this.data[i][j];\n }\n this.data[i] = newRow;\n }\n this.columns -= 1;\n return this;\n }\n\n addColumn(index, array) {\n if (typeof array === 'undefined') {\n array = index;\n index = this.columns;\n }\n checkColumnIndex(this, index, true);\n array = checkColumnVector(this, array);\n for (let i = 0; i < this.rows; i++) {\n const newRow = new Float64Array(this.columns + 1);\n let j = 0;\n for (; j < index; j++) {\n newRow[j] = this.data[i][j];\n }\n newRow[j++] = array[i];\n for (; j < this.columns + 1; j++) {\n newRow[j] = this.data[i][j - 1];\n }\n this.data[i] = newRow;\n }\n this.columns += 1;\n return this;\n }\n}\n\ninstallMathOperations(AbstractMatrix, Matrix);\n","import { AbstractMatrix } from '../matrix';\n\nexport default class WrapperMatrix2D extends AbstractMatrix {\n constructor(data) {\n super();\n this.data = data;\n this.rows = data.length;\n this.columns = data[0].length;\n }\n\n set(rowIndex, columnIndex, value) {\n this.data[rowIndex][columnIndex] = value;\n return this;\n }\n\n get(rowIndex, columnIndex) {\n return this.data[rowIndex][columnIndex];\n }\n}\n","export function hypotenuse(a, b) {\n let r = 0;\n if (Math.abs(a) > Math.abs(b)) {\n r = b / a;\n return Math.abs(a) * Math.sqrt(1 + r * r);\n }\n if (b !== 0) {\n r = a / b;\n return Math.abs(b) * Math.sqrt(1 + r * r);\n }\n return 0;\n}\n","import Matrix from '../matrix';\nimport WrapperMatrix2D from '../wrap/WrapperMatrix2D';\n\nimport { hypotenuse } from './util';\n\nexport default class EigenvalueDecomposition {\n constructor(matrix, options = {}) {\n const { assumeSymmetric = false } = options;\n\n matrix = WrapperMatrix2D.checkMatrix(matrix);\n if (!matrix.isSquare()) {\n throw new Error('Matrix is not a square matrix');\n }\n\n if (matrix.isEmpty()) {\n throw new Error('Matrix must be non-empty');\n }\n\n let n = matrix.columns;\n let V = new Matrix(n, n);\n let d = new Float64Array(n);\n let e = new Float64Array(n);\n let value = matrix;\n let i, j;\n\n let isSymmetric = false;\n if (assumeSymmetric) {\n isSymmetric = true;\n } else {\n isSymmetric = matrix.isSymmetric();\n }\n\n if (isSymmetric) {\n for (i = 0; i < n; i++) {\n for (j = 0; j < n; j++) {\n V.set(i, j, value.get(i, j));\n }\n }\n tred2(n, e, d, V);\n tql2(n, e, d, V);\n } else {\n let H = new Matrix(n, n);\n let ort = new Float64Array(n);\n for (j = 0; j < n; j++) {\n for (i = 0; i < n; i++) {\n H.set(i, j, value.get(i, j));\n }\n }\n orthes(n, H, ort, V);\n hqr2(n, e, d, V, H);\n }\n\n this.n = n;\n this.e = e;\n this.d = d;\n this.V = V;\n }\n\n get realEigenvalues() {\n return Array.from(this.d);\n }\n\n get imaginaryEigenvalues() {\n return Array.from(this.e);\n }\n\n get eigenvectorMatrix() {\n return this.V;\n }\n\n get diagonalMatrix() {\n let n = this.n;\n let e = this.e;\n let d = this.d;\n let X = new Matrix(n, n);\n let i, j;\n for (i = 0; i < n; i++) {\n for (j = 0; j < n; j++) {\n X.set(i, j, 0);\n }\n X.set(i, i, d[i]);\n if (e[i] > 0) {\n X.set(i, i + 1, e[i]);\n } else if (e[i] < 0) {\n X.set(i, i - 1, e[i]);\n }\n }\n return X;\n }\n}\n\nfunction tred2(n, e, d, V) {\n let f, g, h, i, j, k, hh, scale;\n\n for (j = 0; j < n; j++) {\n d[j] = V.get(n - 1, j);\n }\n\n for (i = n - 1; i > 0; i--) {\n scale = 0;\n h = 0;\n for (k = 0; k < i; k++) {\n scale = scale + Math.abs(d[k]);\n }\n\n if (scale === 0) {\n e[i] = d[i - 1];\n for (j = 0; j < i; j++) {\n d[j] = V.get(i - 1, j);\n V.set(i, j, 0);\n V.set(j, i, 0);\n }\n } else {\n for (k = 0; k < i; k++) {\n d[k] /= scale;\n h += d[k] * d[k];\n }\n\n f = d[i - 1];\n g = Math.sqrt(h);\n if (f > 0) {\n g = -g;\n }\n\n e[i] = scale * g;\n h = h - f * g;\n d[i - 1] = f - g;\n for (j = 0; j < i; j++) {\n e[j] = 0;\n }\n\n for (j = 0; j < i; j++) {\n f = d[j];\n V.set(j, i, f);\n g = e[j] + V.get(j, j) * f;\n for (k = j + 1; k <= i - 1; k++) {\n g += V.get(k, j) * d[k];\n e[k] += V.get(k, j) * f;\n }\n e[j] = g;\n }\n\n f = 0;\n for (j = 0; j < i; j++) {\n e[j] /= h;\n f += e[j] * d[j];\n }\n\n hh = f / (h + h);\n for (j = 0; j < i; j++) {\n e[j] -= hh * d[j];\n }\n\n for (j = 0; j < i; j++) {\n f = d[j];\n g = e[j];\n for (k = j; k <= i - 1; k++) {\n V.set(k, j, V.get(k, j) - (f * e[k] + g * d[k]));\n }\n d[j] = V.get(i - 1, j);\n V.set(i, j, 0);\n }\n }\n d[i] = h;\n }\n\n for (i = 0; i < n - 1; i++) {\n V.set(n - 1, i, V.get(i, i));\n V.set(i, i, 1);\n h = d[i + 1];\n if (h !== 0) {\n for (k = 0; k <= i; k++) {\n d[k] = V.get(k, i + 1) / h;\n }\n\n for (j = 0; j <= i; j++) {\n g = 0;\n for (k = 0; k <= i; k++) {\n g += V.get(k, i + 1) * V.get(k, j);\n }\n for (k = 0; k <= i; k++) {\n V.set(k, j, V.get(k, j) - g * d[k]);\n }\n }\n }\n\n for (k = 0; k <= i; k++) {\n V.set(k, i + 1, 0);\n }\n }\n\n for (j = 0; j < n; j++) {\n d[j] = V.get(n - 1, j);\n V.set(n - 1, j, 0);\n }\n\n V.set(n - 1, n - 1, 1);\n e[0] = 0;\n}\n\nfunction tql2(n, e, d, V) {\n let g, h, i, j, k, l, m, p, r, dl1, c, c2, c3, el1, s, s2, iter;\n\n for (i = 1; i < n; i++) {\n e[i - 1] = e[i];\n }\n\n e[n - 1] = 0;\n\n let f = 0;\n let tst1 = 0;\n let eps = Number.EPSILON;\n\n for (l = 0; l < n; l++) {\n tst1 = Math.max(tst1, Math.abs(d[l]) + Math.abs(e[l]));\n m = l;\n while (m < n) {\n if (Math.abs(e[m]) <= eps * tst1) {\n break;\n }\n m++;\n }\n\n if (m > l) {\n iter = 0;\n do {\n iter = iter + 1;\n\n g = d[l];\n p = (d[l + 1] - g) / (2 * e[l]);\n r = hypotenuse(p, 1);\n if (p < 0) {\n r = -r;\n }\n\n d[l] = e[l] / (p + r);\n d[l + 1] = e[l] * (p + r);\n dl1 = d[l + 1];\n h = g - d[l];\n for (i = l + 2; i < n; i++) {\n d[i] -= h;\n }\n\n f = f + h;\n\n p = d[m];\n c = 1;\n c2 = c;\n c3 = c;\n el1 = e[l + 1];\n s = 0;\n s2 = 0;\n for (i = m - 1; i >= l; i--) {\n c3 = c2;\n c2 = c;\n s2 = s;\n g = c * e[i];\n h = c * p;\n r = hypotenuse(p, e[i]);\n e[i + 1] = s * r;\n s = e[i] / r;\n c = p / r;\n p = c * d[i] - s * g;\n d[i + 1] = h + s * (c * g + s * d[i]);\n\n for (k = 0; k < n; k++) {\n h = V.get(k, i + 1);\n V.set(k, i + 1, s * V.get(k, i) + c * h);\n V.set(k, i, c * V.get(k, i) - s * h);\n }\n }\n\n p = (-s * s2 * c3 * el1 * e[l]) / dl1;\n e[l] = s * p;\n d[l] = c * p;\n } while (Math.abs(e[l]) > eps * tst1);\n }\n d[l] = d[l] + f;\n e[l] = 0;\n }\n\n for (i = 0; i < n - 1; i++) {\n k = i;\n p = d[i];\n for (j = i + 1; j < n; j++) {\n if (d[j] < p) {\n k = j;\n p = d[j];\n }\n }\n\n if (k !== i) {\n d[k] = d[i];\n d[i] = p;\n for (j = 0; j < n; j++) {\n p = V.get(j, i);\n V.set(j, i, V.get(j, k));\n V.set(j, k, p);\n }\n }\n }\n}\n\nfunction orthes(n, H, ort, V) {\n let low = 0;\n let high = n - 1;\n let f, g, h, i, j, m;\n let scale;\n\n for (m = low + 1; m <= high - 1; m++) {\n scale = 0;\n for (i = m; i <= high; i++) {\n scale = scale + Math.abs(H.get(i, m - 1));\n }\n\n if (scale !== 0) {\n h = 0;\n for (i = high; i >= m; i--) {\n ort[i] = H.get(i, m - 1) / scale;\n h += ort[i] * ort[i];\n }\n\n g = Math.sqrt(h);\n if (ort[m] > 0) {\n g = -g;\n }\n\n h = h - ort[m] * g;\n ort[m] = ort[m] - g;\n\n for (j = m; j < n; j++) {\n f = 0;\n for (i = high; i >= m; i--) {\n f += ort[i] * H.get(i, j);\n }\n\n f = f / h;\n for (i = m; i <= high; i++) {\n H.set(i, j, H.get(i, j) - f * ort[i]);\n }\n }\n\n for (i = 0; i <= high; i++) {\n f = 0;\n for (j = high; j >= m; j--) {\n f += ort[j] * H.get(i, j);\n }\n\n f = f / h;\n for (j = m; j <= high; j++) {\n H.set(i, j, H.get(i, j) - f * ort[j]);\n }\n }\n\n ort[m] = scale * ort[m];\n H.set(m, m - 1, scale * g);\n }\n }\n\n for (i = 0; i < n; i++) {\n for (j = 0; j < n; j++) {\n V.set(i, j, i === j ? 1 : 0);\n }\n }\n\n for (m = high - 1; m >= low + 1; m--) {\n if (H.get(m, m - 1) !== 0) {\n for (i = m + 1; i <= high; i++) {\n ort[i] = H.get(i, m - 1);\n }\n\n for (j = m; j <= high; j++) {\n g = 0;\n for (i = m; i <= high; i++) {\n g += ort[i] * V.get(i, j);\n }\n\n g = g / ort[m] / H.get(m, m - 1);\n for (i = m; i <= high; i++) {\n V.set(i, j, V.get(i, j) + g * ort[i]);\n }\n }\n }\n }\n}\n\nfunction hqr2(nn, e, d, V, H) {\n let n = nn - 1;\n let low = 0;\n let high = nn - 1;\n let eps = Number.EPSILON;\n let exshift = 0;\n let norm = 0;\n let p = 0;\n let q = 0;\n let r = 0;\n let s = 0;\n let z = 0;\n let iter = 0;\n let i, j, k, l, m, t, w, x, y;\n let ra, sa, vr, vi;\n let notlast, cdivres;\n\n for (i = 0; i < nn; i++) {\n if (i < low || i > high) {\n d[i] = H.get(i, i);\n e[i] = 0;\n }\n\n for (j = Math.max(i - 1, 0); j < nn; j++) {\n norm = norm + Math.abs(H.get(i, j));\n }\n }\n\n while (n >= low) {\n l = n;\n while (l > low) {\n s = Math.abs(H.get(l - 1, l - 1)) + Math.abs(H.get(l, l));\n if (s === 0) {\n s = norm;\n }\n if (Math.abs(H.get(l, l - 1)) < eps * s) {\n break;\n }\n l--;\n }\n\n if (l === n) {\n H.set(n, n, H.get(n, n) + exshift);\n d[n] = H.get(n, n);\n e[n] = 0;\n n--;\n iter = 0;\n } else if (l === n - 1) {\n w = H.get(n, n - 1) * H.get(n - 1, n);\n p = (H.get(n - 1, n - 1) - H.get(n, n)) / 2;\n q = p * p + w;\n z = Math.sqrt(Math.abs(q));\n H.set(n, n, H.get(n, n) + exshift);\n H.set(n - 1, n - 1, H.get(n - 1, n - 1) + exshift);\n x = H.get(n, n);\n\n if (q >= 0) {\n z = p >= 0 ? p + z : p - z;\n d[n - 1] = x + z;\n d[n] = d[n - 1];\n if (z !== 0) {\n d[n] = x - w / z;\n }\n e[n - 1] = 0;\n e[n] = 0;\n x = H.get(n, n - 1);\n s = Math.abs(x) + Math.abs(z);\n p = x / s;\n q = z / s;\n r = Math.sqrt(p * p + q * q);\n p = p / r;\n q = q / r;\n\n for (j = n - 1; j < nn; j++) {\n z = H.get(n - 1, j);\n H.set(n - 1, j, q * z + p * H.get(n, j));\n H.set(n, j, q * H.get(n, j) - p * z);\n }\n\n for (i = 0; i <= n; i++) {\n z = H.get(i, n - 1);\n H.set(i, n - 1, q * z + p * H.get(i, n));\n H.set(i, n, q * H.get(i, n) - p * z);\n }\n\n for (i = low; i <= high; i++) {\n z = V.get(i, n - 1);\n V.set(i, n - 1, q * z + p * V.get(i, n));\n V.set(i, n, q * V.get(i, n) - p * z);\n }\n } else {\n d[n - 1] = x + p;\n d[n] = x + p;\n e[n - 1] = z;\n e[n] = -z;\n }\n\n n = n - 2;\n iter = 0;\n } else {\n x = H.get(n, n);\n y = 0;\n w = 0;\n if (l < n) {\n y = H.get(n - 1, n - 1);\n w = H.get(n, n - 1) * H.get(n - 1, n);\n }\n\n if (iter === 10) {\n exshift += x;\n for (i = low; i <= n; i++) {\n H.set(i, i, H.get(i, i) - x);\n }\n s = Math.abs(H.get(n, n - 1)) + Math.abs(H.get(n - 1, n - 2));\n x = y = 0.75 * s;\n w = -0.4375 * s * s;\n }\n\n if (iter === 30) {\n s = (y - x) / 2;\n s = s * s + w;\n if (s > 0) {\n s = Math.sqrt(s);\n if (y < x) {\n s = -s;\n }\n s = x - w / ((y - x) / 2 + s);\n for (i = low; i <= n; i++) {\n H.set(i, i, H.get(i, i) - s);\n }\n exshift += s;\n x = y = w = 0.964;\n }\n }\n\n iter = iter + 1;\n\n m = n - 2;\n while (m >= l) {\n z = H.get(m, m);\n r = x - z;\n s = y - z;\n p = (r * s - w) / H.get(m + 1, m) + H.get(m, m + 1);\n q = H.get(m + 1, m + 1) - z - r - s;\n r = H.get(m + 2, m + 1);\n s = Math.abs(p) + Math.abs(q) + Math.abs(r);\n p = p / s;\n q = q / s;\n r = r / s;\n if (m === l) {\n break;\n }\n if (\n Math.abs(H.get(m, m - 1)) * (Math.abs(q) + Math.abs(r)) <\n eps *\n (Math.abs(p) *\n (Math.abs(H.get(m - 1, m - 1)) +\n Math.abs(z) +\n Math.abs(H.get(m + 1, m + 1))))\n ) {\n break;\n }\n m--;\n }\n\n for (i = m + 2; i <= n; i++) {\n H.set(i, i - 2, 0);\n if (i > m + 2) {\n H.set(i, i - 3, 0);\n }\n }\n\n for (k = m; k <= n - 1; k++) {\n notlast = k !== n - 1;\n if (k !== m) {\n p = H.get(k, k - 1);\n q = H.get(k + 1, k - 1);\n r = notlast ? H.get(k + 2, k - 1) : 0;\n x = Math.abs(p) + Math.abs(q) + Math.abs(r);\n if (x !== 0) {\n p = p / x;\n q = q / x;\n r = r / x;\n }\n }\n\n if (x === 0) {\n break;\n }\n\n s = Math.sqrt(p * p + q * q + r * r);\n if (p < 0) {\n s = -s;\n }\n\n if (s !== 0) {\n if (k !== m) {\n H.set(k, k - 1, -s * x);\n } else if (l !== m) {\n H.set(k, k - 1, -H.get(k, k - 1));\n }\n\n p = p + s;\n x = p / s;\n y = q / s;\n z = r / s;\n q = q / p;\n r = r / p;\n\n for (j = k; j < nn; j++) {\n p = H.get(k, j) + q * H.get(k + 1, j);\n if (notlast) {\n p = p + r * H.get(k + 2, j);\n H.set(k + 2, j, H.get(k + 2, j) - p * z);\n }\n\n H.set(k, j, H.get(k, j) - p * x);\n H.set(k + 1, j, H.get(k + 1, j) - p * y);\n }\n\n for (i = 0; i <= Math.min(n, k + 3); i++) {\n p = x * H.get(i, k) + y * H.get(i, k + 1);\n if (notlast) {\n p = p + z * H.get(i, k + 2);\n H.set(i, k + 2, H.get(i, k + 2) - p * r);\n }\n\n H.set(i, k, H.get(i, k) - p);\n H.set(i, k + 1, H.get(i, k + 1) - p * q);\n }\n\n for (i = low; i <= high; i++) {\n p = x * V.get(i, k) + y * V.get(i, k + 1);\n if (notlast) {\n p = p + z * V.get(i, k + 2);\n V.set(i, k + 2, V.get(i, k + 2) - p * r);\n }\n\n V.set(i, k, V.get(i, k) - p);\n V.set(i, k + 1, V.get(i, k + 1) - p * q);\n }\n }\n }\n }\n }\n\n if (norm === 0) {\n return;\n }\n\n for (n = nn - 1; n >= 0; n--) {\n p = d[n];\n q = e[n];\n\n if (q === 0) {\n l = n;\n H.set(n, n, 1);\n for (i = n - 1; i >= 0; i--) {\n w = H.get(i, i) - p;\n r = 0;\n for (j = l; j <= n; j++) {\n r = r + H.get(i, j) * H.get(j, n);\n }\n\n if (e[i] < 0) {\n z = w;\n s = r;\n } else {\n l = i;\n if (e[i] === 0) {\n H.set(i, n, w !== 0 ? -r / w : -r / (eps * norm));\n } else {\n x = H.get(i, i + 1);\n y = H.get(i + 1, i);\n q = (d[i] - p) * (d[i] - p) + e[i] * e[i];\n t = (x * s - z * r) / q;\n H.set(i, n, t);\n H.set(\n i + 1,\n n,\n Math.abs(x) > Math.abs(z) ? (-r - w * t) / x : (-s - y * t) / z,\n );\n }\n\n t = Math.abs(H.get(i, n));\n if (eps * t * t > 1) {\n for (j = i; j <= n; j++) {\n H.set(j, n, H.get(j, n) / t);\n }\n }\n }\n }\n } else if (q < 0) {\n l = n - 1;\n\n if (Math.abs(H.get(n, n - 1)) > Math.abs(H.get(n - 1, n))) {\n H.set(n - 1, n - 1, q / H.get(n, n - 1));\n H.set(n - 1, n, -(H.get(n, n) - p) / H.get(n, n - 1));\n } else {\n cdivres = cdiv(0, -H.get(n - 1, n), H.get(n - 1, n - 1) - p, q);\n H.set(n - 1, n - 1, cdivres[0]);\n H.set(n - 1, n, cdivres[1]);\n }\n\n H.set(n, n - 1, 0);\n H.set(n, n, 1);\n for (i = n - 2; i >= 0; i--) {\n ra = 0;\n sa = 0;\n for (j = l; j <= n; j++) {\n ra = ra + H.get(i, j) * H.get(j, n - 1);\n sa = sa + H.get(i, j) * H.get(j, n);\n }\n\n w = H.get(i, i) - p;\n\n if (e[i] < 0) {\n z = w;\n r = ra;\n s = sa;\n } else {\n l = i;\n if (e[i] === 0) {\n cdivres = cdiv(-ra, -sa, w, q);\n H.set(i, n - 1, cdivres[0]);\n H.set(i, n, cdivres[1]);\n } else {\n x = H.get(i, i + 1);\n y = H.get(i + 1, i);\n vr = (d[i] - p) * (d[i] - p) + e[i] * e[i] - q * q;\n vi = (d[i] - p) * 2 * q;\n if (vr === 0 && vi === 0) {\n vr =\n eps *\n norm *\n (Math.abs(w) +\n Math.abs(q) +\n Math.abs(x) +\n Math.abs(y) +\n Math.abs(z));\n }\n cdivres = cdiv(\n x * r - z * ra + q * sa,\n x * s - z * sa - q * ra,\n vr,\n vi,\n );\n H.set(i, n - 1, cdivres[0]);\n H.set(i, n, cdivres[1]);\n if (Math.abs(x) > Math.abs(z) + Math.abs(q)) {\n H.set(\n i + 1,\n n - 1,\n (-ra - w * H.get(i, n - 1) + q * H.get(i, n)) / x,\n );\n H.set(\n i + 1,\n n,\n (-sa - w * H.get(i, n) - q * H.get(i, n - 1)) / x,\n );\n } else {\n cdivres = cdiv(\n -r - y * H.get(i, n - 1),\n -s - y * H.get(i, n),\n z,\n q,\n );\n H.set(i + 1, n - 1, cdivres[0]);\n H.set(i + 1, n, cdivres[1]);\n }\n }\n\n t = Math.max(Math.abs(H.get(i, n - 1)), Math.abs(H.get(i, n)));\n if (eps * t * t > 1) {\n for (j = i; j <= n; j++) {\n H.set(j, n - 1, H.get(j, n - 1) / t);\n H.set(j, n, H.get(j, n) / t);\n }\n }\n }\n }\n }\n }\n\n for (i = 0; i < nn; i++) {\n if (i < low || i > high) {\n for (j = i; j < nn; j++) {\n V.set(i, j, H.get(i, j));\n }\n }\n }\n\n for (j = nn - 1; j >= low; j--) {\n for (i = low; i <= high; i++) {\n z = 0;\n for (k = low; k <= Math.min(j, high); k++) {\n z = z + V.get(i, k) * H.get(k, j);\n }\n V.set(i, j, z);\n }\n }\n}\n\nfunction cdiv(xr, xi, yr, yi) {\n let r, d;\n if (Math.abs(yr) > Math.abs(yi)) {\n r = yi / yr;\n d = yr + r * yi;\n return [(xr + r * xi) / d, (xi - r * xr) / d];\n } else {\n r = yr / yi;\n d = yi + r * yr;\n return [(r * xr + xi) / d, (r * xi - xr) / d];\n }\n}\n","import { Matrix, EigenvalueDecomposition } from \"ml-matrix\";\n\n// Adapted from https://raw.githubusercontent.com/raphlinus/raphlinus.github.io/master/_posts/2022-09-02-parallel-beziers.md\n\nexport function solveQuadratic(c0: number, c1: number, c2: number) {\n const sc0 = c0 / c2;\n const sc1 = c1 / c2;\n if (!(isFinite(sc0) && isFinite(sc1))) {\n const root = -c0 / c1;\n if (isFinite(root)) {\n return [root];\n } else if (c0 == 0 && c1 == 0) {\n return [0];\n } else {\n return [];\n }\n }\n const arg = sc1 * sc1 - 4 * sc0;\n let root1 = 0;\n if (isFinite(arg)) {\n if (arg < 0) {\n return [];\n } else if (arg == 0) {\n return [-0.5 * sc1];\n }\n root1 = -0.5 * (sc1 + copysign(Math.sqrt(arg), sc1));\n } else {\n root1 = -sc1;\n }\n const root2 = sc0 / root1;\n if (isFinite(root2)) {\n if (root2 > root1) {\n return [root1, root2];\n } else {\n return [root2, root1];\n }\n }\n return [root1];\n}\n\n// See kurbo common.rs\nexport function solveCubic(\n in_c0: number,\n in_c1: number,\n in_c2: number,\n in_c3: number\n) {\n const c2 = in_c2 / (3 * in_c3);\n const c1 = in_c1 / (3 * in_c3);\n const c0 = in_c0 / in_c3;\n if (!(isFinite(c0) && isFinite(c1) && isFinite(c2))) {\n return solveQuadratic(in_c0, in_c1, in_c2);\n }\n const d0 = -c2 * c2 + c1;\n const d1 = -c1 * c2 + c0;\n const d2 = c2 * c0 - c1 * c1;\n const d = 4 * d0 * d2 - d1 * d1;\n const de = -2 * c2 * d0 + d1;\n if (d < 0) {\n const sq = Math.sqrt(-0.25 * d);\n const r = -0.5 * de;\n const t1 = Math.cbrt(r + sq) + Math.cbrt(r - sq);\n return [t1 - c2];\n } else if (d == 0) {\n const t1 = copysign(Math.sqrt(-d0), de);\n return [t1 - c2, -2 * t1 - c2];\n } else {\n const th = Math.atan2(Math.sqrt(d), -de) / 3;\n const r0 = Math.cos(th);\n const ss3 = Math.sin(th) * Math.sqrt(3);\n const r1 = 0.5 * (-r0 + ss3);\n const r2 = 0.5 * (-r0 - ss3);\n const t = 2 * Math.sqrt(-d0);\n return [t * r0 - c2, t * r1 - c2, t * r2 - c2];\n }\n}\n\n// Factor a quartic polynomial into two quadratics. Based on Orellana and De Michele\n// and very similar to the version in kurbo.\nexport function solveQuartic(\n c0: number,\n c1: number,\n c2: number,\n c3: number,\n c4: number\n) {\n // This doesn't special-case c0 = 0.\n if (c4 == 0) {\n return solveCubic(c0, c1, c2, c3);\n }\n const a = c3 / c4;\n const b = c2 / c4;\n const c = c1 / c4;\n const d = c0 / c4;\n let result = solve_quartic_inner(a, b, c, d, false);\n if (result !== null) {\n return result;\n }\n const K_Q = 7.16e76;\n for (let i = 0; i < 2; i++) {\n result = solve_quartic_inner(\n a / K_Q,\n b / (K_Q * K_Q),\n c / (K_Q * K_Q * K_Q),\n d / (K_Q * K_Q * K_Q * K_Q),\n i != 0\n );\n if (result !== null) {\n for (let j = 0; j < result.length; j++) {\n result[j] *= K_Q;\n }\n return result;\n }\n }\n // Really bad overflow happened.\n return [];\n}\n\nfunction eps_rel(raw: number, a: number) {\n return a == 0 ? Math.abs(raw) : Math.abs((raw - a) / a);\n}\n\nfunction solve_quartic_inner(\n a: number,\n b: number,\n c: number,\n d: number,\n rescale: boolean\n) {\n const result = factor_quartic_inner(a, b, c, d, rescale);\n if (result !== null && result.length == 4) {\n let roots: number[] = [];\n for (let i = 0; i < 2; i++) {\n const a = result[i * 2];\n const b = result[i * 2 + 1];\n roots = roots.concat(solveQuadratic(b, a, 1));\n }\n return roots;\n }\n return null;\n}\n\nfunction factor_quartic_inner(\n a: number,\n b: number,\n c: number,\n d: number,\n rescale: boolean\n) {\n function calc_eps_q(a1: number, b1: number, a2: number, b2: number) {\n const eps_a = eps_rel(a1 + a2, a);\n const eps_b = eps_rel(b1 + a1 * a2 + b2, b);\n const eps_c = eps_rel(b1 * a2 + a1 * b2, c);\n return eps_a + eps_b + eps_c;\n }\n function calc_eps_t(a1: number, b1: number, a2: number, b2: number) {\n return calc_eps_q(a1, b1, a2, b2) + eps_rel(b1 * b2, d);\n }\n const disc = 9 * a * a - 24 * b;\n const s =\n disc >= 0 ? (-2 * b) / (3 * a + copysign(Math.sqrt(disc), a)) : -0.25 * a;\n const a_prime = a + 4 * s;\n const b_prime = b + 3 * s * (a + 2 * s);\n const c_prime = c + s * (2 * b + s * (3 * a + 4 * s));\n const d_prime = d + s * (c + s * (b + s * (a + s)));\n let g_prime = 0;\n let h_prime = 0;\n const K_C = 3.49e102;\n if (rescale) {\n const a_prime_s = a_prime / K_C;\n const b_prime_s = b_prime / K_C;\n const c_prime_s = c_prime / K_C;\n const d_prime_s = d_prime / K_C;\n g_prime =\n a_prime_s * c_prime_s -\n (4 / K_C) * d_prime_s -\n (1 / 3) * b_prime_s * b_prime_s;\n h_prime =\n (a_prime_s * c_prime_s -\n (8 / K_C) * d_prime_s -\n (2 / 9) * b_prime_s * b_prime_s) *\n (1 / 3) *\n b_prime_s -\n c_prime_s * (c_prime_s / K_C) -\n a_prime_s * a_prime_s * d_prime_s;\n } else {\n g_prime = a_prime * c_prime - 4 * d_prime - (1 / 3) * b_prime * b_prime;\n h_prime =\n (a_prime * c_prime + 8 * d_prime - (2 / 9) * b_prime * b_prime) *\n (1 / 3) *\n b_prime -\n c_prime * c_prime -\n a_prime * a_prime * d_prime;\n }\n if (!isFinite(g_prime) && isFinite(h_prime)) {\n return null;\n }\n let phi = depressed_cubic_dominant(g_prime, h_prime);\n if (rescale) {\n phi *= K_C;\n }\n const l_1 = a * 0.5;\n const l_3 = (1 / 6) * b + 0.5 * phi;\n const delt_2 = c - a * l_3;\n const d_2_cand_1 = (2 / 3) * b - phi - l_1 * l_1;\n const l_2_cand_1 = (0.5 * delt_2) / d_2_cand_1;\n const l_2_cand_2 = (2 * (d - l_3 * l_3)) / delt_2;\n const d_2_cand_2 = (0.5 * delt_2) / l_2_cand_2;\n let d_2_best = 0;\n let l_2_best = 0;\n let eps_l_best = 0;\n for (let i = 0; i < 3; i++) {\n const d_2 = i == 1 ? d_2_cand_2 : d_2_cand_1;\n const l_2 = i == 0 ? l_2_cand_1 : l_2_cand_2;\n const eps_0 = eps_rel(d_2 + l_1 * l_1 + 2 * l_3, b);\n const eps_1 = eps_rel(2 * (d_2 * l_2 + l_1 * l_3), c);\n const eps_2 = eps_rel(d_2 * l_2 * l_2 + l_3 * l_3, d);\n const eps_l = eps_0 + eps_1 + eps_2;\n if (i == 0 || eps_l < eps_l_best) {\n d_2_best = d_2;\n l_2_best = l_2;\n eps_l_best = eps_l;\n }\n }\n const d_2 = d_2_best;\n const l_2 = l_2_best;\n let alpha_1 = 0;\n let beta_1 = 0;\n let alpha_2 = 0;\n let beta_2 = 0;\n if (d_2 < 0.0) {\n const sq = Math.sqrt(-d_2);\n alpha_1 = l_1 + sq;\n beta_1 = l_3 + sq * l_2;\n alpha_2 = l_1 - sq;\n beta_2 = l_3 - sq * l_2;\n if (Math.abs(beta_2) < Math.abs(beta_1)) {\n beta_2 = d / beta_1;\n } else if (Math.abs(beta_2) > Math.abs(beta_1)) {\n beta_1 = d / beta_2;\n }\n if (Math.abs(alpha_1) != Math.abs(alpha_2)) {\n let a1_cands = null;\n let a2_cands = null;\n if (Math.abs(alpha_1) < Math.abs(alpha_2)) {\n const a1_cand_1 = (c - beta_1 * alpha_2) / beta_2;\n const a1_cand_2 = (b - beta_2 - beta_1) / alpha_2;\n const a1_cand_3 = a - alpha_2;\n a1_cands = [a1_cand_3, a1_cand_1, a1_cand_2];\n a2_cands = [alpha_2, alpha_2, alpha_2];\n } else {\n const a2_cand_1 = (c - alpha_1 * beta_2) / beta_1;\n const a2_cand_2 = (b - beta_2 - beta_1) / alpha_1;\n const a2_cand_3 = a - alpha_1;\n a1_cands = [alpha_1, alpha_1, alpha_1];\n a2_cands = [a2_cand_3, a2_cand_1, a2_cand_2];\n }\n let eps_q_best = 0;\n for (let i = 0; i < 3; i++) {\n const a1 = a1_cands[i];\n const a2 = a2_cands[i];\n if (isFinite(a1) && isFinite(a2)) {\n const eps_q = calc_eps_q(a1, beta_1, a2, beta_2);\n if (i == 0 || eps_q < eps_q_best) {\n alpha_1 = a1;\n alpha_2 = a2;\n eps_q_best = eps_q;\n }\n }\n }\n }\n } else if (d_2 == 0) {\n const d_3 = d - l_3 * l_3;\n alpha_1 = l_1;\n beta_1 = l_3 + Math.sqrt(-d_3);\n alpha_2 = l_1;\n beta_2 = l_3 - Math.sqrt(-d_3);\n if (Math.abs(beta_1) > Math.abs(beta_2)) {\n beta_2 = d / beta_1;\n } else if (Math.abs(beta_2) > Math.abs(beta_1)) {\n beta_1 = d / beta_2;\n }\n } else {\n // No real solutions\n return [];\n }\n let eps_t = calc_eps_t(alpha_1, beta_1, alpha_2, beta_2);\n for (let i = 0; i < 8; i++) {\n if (eps_t == 0) {\n break;\n }\n const f_0 = beta_1 * beta_2 - d;\n const f_1 = beta_1 * alpha_2 + alpha_1 * beta_2 - c;\n const f_2 = beta_1 + alpha_1 * alpha_2 + beta_2 - b;\n const f_3 = alpha_1 + alpha_2 - a;\n const c_1 = alpha_1 - alpha_2;\n const det_j =\n beta_1 * beta_1 -\n beta_1 * (alpha_2 * c_1 + 2 * beta_2) +\n beta_2 * (alpha_1 * c_1 + beta_2);\n if (det_j == 0) {\n break;\n }\n const inv = 1 / det_j;\n const c_2 = beta_2 - beta_1;\n const c_3 = beta_1 * alpha_2 - alpha_1 * beta_2;\n const dz_0 =\n c_1 * f_0 + c_2 * f_1 + c_3 * f_2 - (beta_1 * c_2 + alpha_1 * c_3) * f_3;\n const dz_1 =\n (alpha_1 * c_1 + c_2) * f_0 -\n beta_1 * (c_1 * f_1 + c_2 * f_2 + c_3 * f_3);\n const dz_2 =\n -c_1 * f_0 - c_2 * f_1 - c_3 * f_2 + (alpha_2 * c_3 + beta_2 * c_2) * f_3;\n const dz_3 =\n -(alpha_2 * c_1 + c_2) * f_0 +\n beta_2 * (c_1 * f_1 + c_2 * f_2 + c_3 * f_3);\n const a1 = alpha_1 - inv * dz_0;\n const b1 = beta_1 - inv * dz_1;\n const a2 = alpha_2 - inv * dz_2;\n const b2 = beta_2 - inv * dz_3;\n const new_eps_t = calc_eps_t(a1, b1, a2, b2);\n if (new_eps_t < eps_t) {\n alpha_1 = a1;\n beta_1 = b1;\n alpha_2 = a2;\n beta_2 = b2;\n eps_t = new_eps_t;\n } else {\n break;\n }\n }\n return [alpha_1, beta_1, alpha_2, beta_2];\n}\n\nfunction depressed_cubic_dominant(g: number, h: number) {\n const q = (-1 / 3) * g;\n const r = 0.5 * h;\n let phi_0;\n let k = null;\n if (Math.abs(q) >= 1e102 || Math.abs(r) >= 1e164) {\n if (Math.abs(q) < Math.abs(r)) {\n k = 1 - q * (q / r) * (q / r);\n } else {\n k = Math.sign(q) * (((r / q) * (r / q)) / q - 1);\n }\n }\n if (k !== null && r == 0) {\n if (g > 0) {\n phi_0 = 0;\n } else {\n phi_0 = Math.sqrt(-g);\n }\n } else if (k !== null ? k < 0 : r * r < q * q * q) {\n const t = k !== null ? r / q / Math.sqrt(q) : r / Math.sqrt(q * q * q);\n phi_0 =\n -2 *\n Math.sqrt(q) *\n copysign(Math.cos(Math.acos(Math.abs(t)) * (1 / 3)), t);\n } else {\n let a;\n if (k !== null) {\n if (Math.abs(q) < Math.abs(r)) {\n a = -r * (1 + Math.sqrt(k));\n } else {\n a = -r - copysign(Math.sqrt(Math.abs(q)) * q * Math.sqrt(k), r);\n }\n } else {\n a = Math.cbrt(-r - copysign(Math.sqrt(r * r - q * q * q), r));\n }\n const b = a == 0 ? 0 : q / a;\n phi_0 = a + b;\n }\n let x = phi_0;\n let f = (x * x + g) * x + h;\n const EPS_M = 2.22045e-16;\n if (Math.abs(f) < EPS_M * Math.max(x * x * x, g * x, h)) {\n return x;\n }\n for (let i = 0; i < 8; i++) {\n const delt_f = 3 * x * x + g;\n if (delt_f == 0) {\n break;\n }\n const new_x = x - f / delt_f;\n const new_f = (new_x * new_x + g) * new_x + h;\n if (new_f == 0) {\n return new_x;\n }\n if (Math.abs(new_f) >= Math.abs(f)) {\n break;\n }\n x = new_x;\n f = new_f;\n }\n return x;\n}\n\nfunction copysign(x: number, y: number) {\n const a = Math.abs(x);\n return y < 0 ? -a : a;\n}\n\nexport function solveGenericPolynomial(\n coefficients: number[],\n epsilon = 1e-9\n): number[] {\n if (coefficients[coefficients.length - 1] == 0) {\n return solveGenericPolynomial(coefficients.slice(0, -1), epsilon);\n }\n\n const polynomialMatrix = new Matrix([\n coefficients\n .slice(0, -1)\n .reverse()\n .map((c) => -c / coefficients[coefficients.length - 1]),\n ...Array.from({ length: coefficients.length - 2 }, (_, i) => {\n const row = new Array(coefficients.length - 1).fill(0);\n row[i] = 1;\n return row;\n }),\n ]);\n\n const eigenValues = new EigenvalueDecomposition(polynomialMatrix);\n\n return eigenValues.realEigenvalues.filter(\n (_, i) => Math.abs(eigenValues.imaginaryEigenvalues[i]) < epsilon\n );\n}\n","import { Matrix, EigenvalueDecomposition } from \"ml-matrix\";\n\nimport { EllipseArc } from \"../../models/segments/EllipseArc.js\";\nimport { Arc } from \"../../models/segments/Arc.js\";\nimport { Vector } from \"../../definitions.js\";\nimport removeDuplicatePoints from \"../../utils/removeDuplicatePoints.js\";\nimport { solveGenericPolynomial } from \"../solvers/solvePolynomials.js\";\n\n// inspired by https://gist.github.com/drawable/92792f59b6ff8869d8b1\n\nexport function ellipseEllipseIntersection(\n arc1: EllipseArc | Arc,\n arc2: EllipseArc\n): Vector[] {\n const epsilon = Math.max(arc1.precision, arc2.precision);\n\n const el1 = arc1.coefficients;\n const a1 = el1.x2;\n const b1 = el1.xy;\n const c1 = el1.y2;\n const d1 = el1.x;\n const e1 = el1.y;\n const f1 = el1.c;\n\n const el2 = arc2.coefficients;\n\n const a2 = el2.x2;\n const b2 = el2.xy;\n const c2 = el2.y2;\n const d2 = el2.x;\n const e2 = el2.y;\n const f2 = el2.c;\n\n const polynomial = {\n z0:\n f1 * a1 * d2 * d2 +\n a1 * a1 * f2 * f2 -\n d1 * a1 * d2 * f2 +\n a2 * a2 * f1 * f1 -\n 2 * a1 * f2 * a2 * f1 -\n d1 * d2 * a2 * f1 +\n a2 * d1 * d1 * f2,\n\n z1:\n e2 * d1 * d1 * a2 -\n f2 * d2 * a1 * b1 -\n 2 * a1 * f2 * a2 * e1 -\n f1 * a2 * b2 * d1 +\n 2 * d2 * b2 * a1 * f1 +\n 2 * e2 * f2 * a1 * a1 +\n d2 * d2 * a1 * e1 -\n e2 * d2 * a1 * d1 -\n 2 * a1 * e2 * a2 * f1 -\n f1 * a2 * d2 * b1 +\n 2 * f1 * e1 * a2 * a2 -\n f2 * b2 * a1 * d1 -\n e1 * a2 * d2 * d1 +\n 2 * f2 * b1 * a2 * d1,\n\n z2:\n e2 * e2 * a1 * a1 +\n 2 * c2 * f2 * a1 * a1 -\n e1 * a2 * d2 * b1 +\n f2 * a2 * b1 * b1 -\n e1 * a2 * b2 * d1 -\n f2 * b2 * a1 * b1 -\n 2 * a1 * e2 * a2 * e1 +\n 2 * d2 * b2 * a1 * e1 -\n c2 * d2 * a1 * d1 -\n 2 * a1 * c2 * a2 * f1 +\n b2 * b2 * a1 * f1 +\n 2 * e2 * b1 * a2 * d1 +\n e1 * e1 * a2 * a2 -\n c1 * a2 * d2 * d1 -\n e2 * b2 * a1 * d1 +\n 2 * f1 * c1 * a2 * a2 -\n f1 * a2 * b2 * b1 +\n c2 * d1 * d1 * a2 +\n d2 * d2 * a1 * c1 -\n e2 * d2 * a1 * b1 -\n 2 * a1 * f2 * a2 * c1,\n\n z3:\n -2 * a1 * a2 * c1 * e2 +\n e2 * a2 * b1 * b1 +\n 2 * c2 * b1 * a2 * d1 -\n c1 * a2 * b2 * d1 +\n b2 * b2 * a1 * e1 -\n e2 * b2 * a1 * b1 -\n 2 * a1 * c2 * a2 * e1 -\n e1 * a2 * b2 * b1 -\n c2 * b2 * a1 * d1 +\n 2 * e2 * c2 * a1 * a1 +\n 2 * e1 * c1 * a2 * a2 -\n c1 * a2 * d2 * b1 +\n 2 * d2 * b2 * a1 * c1 -\n c2 * d2 * a1 * b1,\n\n z4:\n a1 * a1 * c2 * c2 -\n 2 * a1 * c2 * a2 * c1 +\n a2 * a2 * c1 * c1 -\n b1 * a1 * b2 * c2 -\n b1 * b2 * a2 * c1 +\n b1 * b1 * a2 * c2 +\n c1 * a1 * b2 * b2,\n };\n\n const yValues = solveGenericPolynomial(\n [polynomial.z0, polynomial.z1, polynomial.z2, polynomial.z3, polynomial.z4],\n epsilon\n );\n\n const points = yValues.flatMap((y) => {\n const denom = a1 * b2 * y + a1 * d2 - a2 * b1 * y - a2 * d1;\n\n if (denom) {\n const x =\n -(\n a1 * f2 +\n a1 * c2 * y * y -\n a2 * c1 * y * y +\n a1 * e2 * y -\n a2 * e1 * y -\n a2 * f1\n ) / denom;\n return [[x, y] as Vector];\n }\n\n const bb = b1 * y + d1;\n const v = -bb / (2 * a1);\n\n const cc = c1 * y * y + e1 * y + f1;\n const discriminant = (bb * bb) / (4 * a1 * a1) - cc / a1;\n\n if (Math.abs(discriminant) < epsilon) {\n return [[v, y] as Vector];\n }\n if (discriminant > 0) {\n const sqrt = Math.sqrt(discriminant);\n return [[v + sqrt, y] as Vector, [v - sqrt, y] as Vector];\n }\n\n return [];\n });\n\n return removeDuplicatePoints(points, epsilon);\n}\n","import type { EllipseArc } from \"../../models/segments/EllipseArc.js\";\nimport type { Arc } from \"../../models/segments/Arc.js\";\nimport { ellipseEllipseIntersection } from \"./ellipseEllipseIntersection.js\";\n\nexport function arcEllipseArcIntersection(arc: Arc, ellipseArc: EllipseArc) {\n const points = ellipseEllipseIntersection(arc, ellipseArc);\n return points.filter((p) => arc.isOnSegment(p) && ellipseArc.isOnSegment(p));\n}\n","import { Vector } from \"../../definitions.js\";\nimport { EllipseArc } from \"../../models/segments/EllipseArc.js\";\nimport removeDuplicatePoints from \"../../utils/removeDuplicatePoints.js\";\nimport { sameVector } from \"../../vectorOperations.js\";\nimport { ellipseEllipseIntersection } from \"./ellipseEllipseIntersection.js\";\n\nconst complementArc = (arc: EllipseArc): EllipseArc => {\n const {\n firstPoint,\n lastPoint,\n center,\n majorRadius,\n minorRadius,\n tiltAngle,\n clockwise,\n } = arc;\n return new EllipseArc(\n lastPoint,\n firstPoint,\n center,\n majorRadius,\n minorRadius,\n tiltAngle,\n clockwise,\n {\n ignoreChecks: true,\n angleUnits: \"rad\",\n }\n );\n};\n\nconst handleOverlaps = (arc1: EllipseArc, arc2: EllipseArc): EllipseArc[] => {\n // handle the case with common points at start or end first\n if (arc1.isSame(arc2)) {\n return [arc1];\n }\n // two arcs with common points at start and end (but not the same arc)\n\n const partialArc = (firstPoint: Vector, lastPoint: Vector) =>\n new EllipseArc(\n firstPoint,\n lastPoint,\n arc1.center,\n arc1.majorRadius,\n arc1.minorRadius,\n arc1.tiltAngle,\n arc1.clockwise,\n { ignoreChecks: true, angleUnits: \"rad\" }\n );\n\n const points = removeDuplicatePoints(\n [\n arc2.isOnSegment(arc1.firstPoint) ? arc1.firstPoint : null,\n arc2.isOnSegment(arc1.lastPoint) ? arc1.lastPoint : null,\n arc1.isOnSegment(arc2.firstPoint) ? arc2.firstPoint : null,\n arc1.isOnSegment(arc2.lastPoint) ? arc2.lastPoint : null,\n ].filter((p) => p !== null) as Vector[]\n // We sort by the param value of the first arc. This means that the points\n // will be sorted with the same orientation than arc1\n ).sort((a, b) => arc1.pointToParam(a) - arc1.pointToParam(b));\n\n if (points.length === 0) return [];\n // We consider the case when the arcs touch only on\n // the last point. We consider that they do not overlap there\n //\n // We might want to revisit this choice\n else if (points.length === 1) return [];\n else if (points.length === 2) {\n // Similar to the case with length 1, we ignore the double overlapping point\n if (arc1.isSame(complementArc(arc2))) return [];\n return [partialArc(points[0], points[1])];\n } else if (points.length === 3) {\n // Similar to the case with length 1, we ignore the single overlapping point\n const startIndex =\n sameVector(points[0], arc2.lastPoint) ||\n sameVector(points[0], arc2.firstPoint)\n ? 1\n : 0;\n return [partialArc(points[0 + startIndex], points[1 + startIndex])];\n } else if (points.length === 4) {\n return [partialArc(points[0], points[1]), partialArc(points[2], points[3])];\n }\n throw new Error(\"Bug in the ellipse arc ellipse arc overlap algorithm\");\n};\n\nexport function ellipseArcEllipseArcIntersection(\n arc1: EllipseArc,\n arc2: EllipseArc,\n includeOverlaps = false\n): Vector[] | EllipseArc[] {\n const epsilon = Math.max(arc1.precision, arc2.precision);\n const sameEllipse =\n sameVector(arc1.center, arc2.center) &&\n Math.abs(arc1.majorRadius - arc2.majorRadius) < epsilon &&\n Math.abs(arc1.minorRadius - arc2.minorRadius) < epsilon &&\n (Math.abs(arc1.tiltAngle - arc2.tiltAngle) < epsilon ||\n Math.abs(Math.abs(arc1.tiltAngle - arc2.tiltAngle) - Math.PI) < epsilon);\n if (sameEllipse) {\n if (includeOverlaps) return handleOverlaps(arc1, arc2);\n else return [];\n }\n const points = ellipseEllipseIntersection(arc1, arc2);\n return points.filter((p) => arc1.isOnSegment(p) && arc2.isOnSegment(p));\n}\n","import { Line } from \"../../models/segments/Line.js\";\n\nimport type { Vector } from \"../../definitions.js\";\nimport { Segment } from \"../../models/segments/Segment.js\";\nimport { Arc } from \"../../models/segments/Arc.js\";\nimport { lineArcIntersection } from \"./lineArcIntersection.js\";\nimport { lineLineIntersection } from \"./lineLineIntersection.js\";\nimport { arcArcIntersection } from \"./arcArcIntersection.js\";\nimport { EllipseArc } from \"../../models/segments/EllipseArc.js\";\nimport { lineEllipseArcIntersection } from \"./lineEllipseArcIntersection.js\";\nimport { arcEllipseArcIntersection } from \"./arcEllipseArcIntersection.js\";\nimport { ellipseArcEllipseArcIntersection } from \"./ellipseArcEllipseArcIntersection.js\";\n\nexport function findIntersections(\n segment1: Segment,\n segment2: Segment,\n precision?: number\n): Vector[] {\n if (segment1 instanceof Line && segment2 instanceof Line) {\n const intersection = lineLineIntersection(\n segment1,\n segment2,\n false,\n precision\n );\n if (intersection === null) return [];\n return [intersection as Vector];\n }\n if (segment1 instanceof Line && segment2 instanceof Arc) {\n return lineArcIntersection(segment1, segment2, precision);\n }\n if (segment1 instanceof Arc && segment2 instanceof Line) {\n return lineArcIntersection(segment2, segment1, precision);\n }\n if (segment1 instanceof Arc && segment2 instanceof Arc) {\n return arcArcIntersection(segment1, segment2, false, precision) as Vector[];\n }\n\n throw new Error(\"Not implemented\");\n}\n\nexport function findIntersectionsAndOverlaps(\n segment1: Segment,\n segment2: Segment,\n precision?: number\n): { intersections: Vector[]; overlaps: Segment[]; count: number } {\n // If we have two lines, checks are fast enough to not use bounding boxes\n if (segment1 instanceof Line && segment2 instanceof Line) {\n const intersection = lineLineIntersection(\n segment1,\n segment2,\n true,\n precision\n );\n if (intersection === null)\n return { intersections: [], overlaps: [], count: 0 };\n if (intersection instanceof Line)\n return { intersections: [], overlaps: [intersection], count: 1 };\n return { intersections: [intersection], overlaps: [], count: 1 };\n }\n\n if (!segment1.boundingBox.overlaps(segment2.boundingBox)) {\n return { intersections: [], overlaps: [], count: 0 };\n }\n\n if (segment1 instanceof Line && segment2 instanceof Arc) {\n const intersections = lineArcIntersection(segment1, segment2, precision);\n return { intersections, overlaps: [], count: intersections.length };\n }\n\n if (segment1 instanceof Arc && segment2 instanceof Line) {\n const intersections = lineArcIntersection(segment2, segment1, precision);\n return { intersections, overlaps: [], count: intersections.length };\n }\n\n if (segment1 instanceof Arc && segment2 instanceof Arc) {\n const intersections = arcArcIntersection(\n segment1,\n segment2,\n true,\n precision\n );\n if (!intersections.length)\n return { intersections: [], overlaps: [], count: 0 };\n if (intersections[0] instanceof Arc)\n return {\n intersections: [],\n overlaps: intersections as Arc[],\n count: intersections.length,\n };\n return {\n intersections: intersections as Vector[],\n overlaps: [],\n count: intersections.length,\n };\n }\n\n if (segment1 instanceof Line && segment2 instanceof EllipseArc) {\n const intersections = lineEllipseArcIntersection(\n segment1,\n segment2,\n precision\n );\n return { intersections, overlaps: [], count: intersections.length };\n }\n\n if (segment2 instanceof Line && segment1 instanceof EllipseArc) {\n const intersections = lineEllipseArcIntersection(\n segment2,\n segment1,\n precision\n );\n return { intersections, overlaps: [], count: intersections.length };\n }\n\n if (segment1 instanceof Arc && segment2 instanceof EllipseArc) {\n const intersections = arcEllipseArcIntersection(segment1, segment2);\n return { intersections, overlaps: [], count: intersections.length };\n }\n\n if (segment2 instanceof Arc && segment1 instanceof EllipseArc) {\n const intersections = arcEllipseArcIntersection(segment2, segment1);\n return { intersections, overlaps: [], count: intersections.length };\n }\n\n if (segment1 instanceof EllipseArc && segment2 instanceof EllipseArc) {\n const intersections = ellipseArcEllipseArcIntersection(\n segment1,\n segment2,\n true\n );\n if (!intersections.length)\n return { intersections: [], overlaps: [], count: 0 };\n if (intersections[0] instanceof EllipseArc)\n return {\n intersections: [],\n overlaps: intersections as EllipseArc[],\n count: intersections.length,\n };\n return {\n intersections: intersections as Vector[],\n overlaps: [],\n count: intersections.length,\n };\n }\n\n throw new Error(\"Not implemented\");\n}\n","export function allCombinations(count: number): [number, number][] {\n const result: [number, number][] = [];\n\n for (let i = 0; i < count; i++) {\n for (let j = 0; j <= i; j++) {\n result.push([i, j]);\n }\n }\n\n return result;\n}\n\nexport function* combineDifferentValues<T>(array: T[]): Generator<[T, T]> {\n for (const [i, j] of allCombinations(array.length)) {\n if (i === j) continue;\n yield [array[i], array[j]];\n }\n}\n","import { BoundingBox } from \"./BoundingBox.js\";\nimport { Vector } from \"../definitions.js\";\nimport { findIntersectionsAndOverlaps } from \"../algorithms/intersections\";\nimport { Segment } from \"./segments/Segment.js\";\nimport { TransformationMatrix } from \"./TransformationMatrix.js\";\nimport { allCombinations } from \"../utils/allCombinations.js\";\nimport zip from \"../utils/zip.js\";\nimport { sameVector } from \"../vectorOperations.js\";\nimport { Transformable } from \"./utils/Transformable.js\";\n\nexport type Stroke = AbstractStroke<any>;\n\nexport abstract class AbstractStroke<\n T extends AbstractStroke<T>\n> extends Transformable<T> {\n readonly segments: Segment[];\n\n abstract strokeType: string;\n\n get repr(): string {\n return this.segments.map((segment) => segment.repr).join(\"\\n\") + \"\\n\";\n }\n get info(): string {\n return this.repr;\n }\n constructor(segments: Segment[], { ignoreChecks = false } = {}) {\n super();\n if (!ignoreChecks) checkValidStroke(segments);\n this.segments = segments;\n }\n\n get firstPoint(): Vector {\n return this.segments[0].firstPoint;\n }\n\n get lastPoint(): Vector {\n return this.segments[this.segments.length - 1].lastPoint;\n }\n\n get segmentsCount(): number {\n return this.segments.length;\n }\n\n onStroke(point: Vector): boolean {\n return this.segments.some((segment) => segment.isOnSegment(point));\n }\n\n intersects(other: Stroke): boolean {\n if (!this.boundingBox.overlaps(other.boundingBox)) return false;\n return this.segments.some((segment) =>\n other.segments.some(\n (otherSegment) =>\n findIntersectionsAndOverlaps(segment, otherSegment).count > 0\n )\n );\n }\n\n overlappingSegments(other: Stroke): Segment[] {\n return this.segments.flatMap((segment) => {\n return other.segments.flatMap((otherSegment) => {\n if (!segment.boundingBox.overlaps(otherSegment.boundingBox)) return [];\n return findIntersectionsAndOverlaps(segment, otherSegment).overlaps;\n });\n });\n }\n\n private _boundingBox: BoundingBox | null = null;\n get boundingBox(): BoundingBox {\n if (this._boundingBox === null) {\n let bbox = this.segments[0].boundingBox;\n\n this.segments.slice(1).forEach((segment) => {\n bbox = bbox.merge(segment.boundingBox);\n });\n this._boundingBox = bbox;\n }\n return this._boundingBox;\n }\n\n abstract reverse(): T;\n\n abstract clone(): T;\n\n abstract transform(matrix: TransformationMatrix): T;\n\n abstract simplify(): T;\n\n [Symbol.for(\"nodejs.util.inspect.custom\")]() {\n return this.repr;\n }\n}\n\nexport function checkSelfIntersections(\n segments: Segment[],\n type = \"Stroke\"\n): void {\n allCombinations(segments.length).forEach(\n ([segmentIndex, otherSegmentIndex]) => {\n if (segmentIndex === otherSegmentIndex) return;\n const segment = segments[segmentIndex];\n const otherSegment = segments[otherSegmentIndex];\n\n const intersections = findIntersectionsAndOverlaps(segment, otherSegment);\n const epsilon = Math.max(segment.precision, otherSegment.precision);\n\n if (intersections.count === 0) return;\n if (intersections.count === 1 && !intersections.overlaps.length) {\n const distance = segmentIndex - otherSegmentIndex;\n\n const intersection = intersections.intersections[0];\n\n if (distance === 1) {\n if (sameVector(segment.firstPoint, intersection, epsilon)) return;\n }\n if (distance === -1) {\n if (sameVector(segment.lastPoint, intersection, epsilon)) return;\n }\n if (distance === segments.length - 1) {\n if (\n sameVector(segment.lastPoint, intersection, epsilon) &&\n sameVector(otherSegment.firstPoint, intersection, epsilon)\n )\n return;\n }\n if (-distance === segments.length - 1) {\n if (\n sameVector(segment.firstPoint, intersection, epsilon) &&\n sameVector(otherSegment.lastPoint, intersection, epsilon)\n )\n return;\n }\n }\n if (intersections.count === 2 && segments.length === 2) {\n if (\n (sameVector(\n segment.firstPoint,\n intersections.intersections[0],\n epsilon\n ) &&\n sameVector(\n segment.lastPoint,\n intersections.intersections[1],\n epsilon\n )) ||\n (sameVector(\n segment.firstPoint,\n intersections.intersections[1],\n epsilon\n ) &&\n sameVector(\n segment.lastPoint,\n intersections.intersections[0],\n epsilon\n ))\n )\n return;\n }\n\n throw new Error(\n `${type} segments must not intersect, but segments ${\n segment.info\n } and ${otherSegment.info} do at ${JSON.stringify(\n intersections.intersections\n )}`\n );\n }\n );\n}\n\nexport function checkValidStroke(segments: Segment[], type = \"Stroke\"): void {\n if (segments.length === 0)\n throw new Error(`${type} must have at least one segment`);\n\n zip([segments.slice(0, -1), segments.slice(1)]).forEach(\n ([segment, nextSegment]) => {\n if (!sameVector(segment.lastPoint, nextSegment.firstPoint))\n throw new Error(\n `${type} segments must be connected, but ${segment.info} and ${nextSegment.info} are not`\n );\n }\n );\n\n checkSelfIntersections(segments, type);\n}\n","import type { Stroke } from \"../models/Stroke.js\";\nimport { Line } from \"../models/segments/Line.js\";\nimport { Segment } from \"../models/segments/Segment.js\";\nimport { parallel, sameVector } from \"../vectorOperations.js\";\nimport { Arc } from \"../models/segments/Arc.js\";\n\nfunction canExtendSegment(segment1: Segment, segment2: Segment): boolean {\n if (segment1 instanceof Line && segment2 instanceof Line) {\n if (parallel(segment1.V, segment2.V)) {\n return true;\n }\n }\n\n if (segment1 instanceof Arc && segment2 instanceof Arc) {\n if (\n sameVector(segment1.center, segment2.center) &&\n segment1.radius - segment2.radius < segment1.precision\n ) {\n return true;\n }\n }\n return false;\n}\n\nfunction extendSegment(segment1: Segment, segment2: Segment): Segment {\n if (segment1 instanceof Line && segment2 instanceof Line) {\n return new Line(segment1.firstPoint, segment2.lastPoint);\n }\n if (segment1 instanceof Arc && segment2 instanceof Arc) {\n // clockwise is the same for both segments, we would otherwise have some\n // self-intersections in the stroke\n return new Arc(\n segment1.firstPoint,\n segment2.lastPoint,\n segment1.center,\n segment1.clockwise\n );\n }\n\n throw new Error(\"Not implemented\");\n}\n\nexport function simplifySegments(stroke: Stroke): Segment[] | null {\n let foundSimplification = false;\n const simplifiedSegments: Segment[] = [];\n\n for (const segment of stroke.segments) {\n if (simplifiedSegments.length === 0) {\n simplifiedSegments.push(segment);\n continue;\n }\n\n const lastSegment = simplifiedSegments[simplifiedSegments.length - 1];\n if (canExtendSegment(lastSegment, segment)) {\n foundSimplification = true;\n simplifiedSegments.pop();\n simplifiedSegments.push(extendSegment(lastSegment, segment));\n } else {\n simplifiedSegments.push(segment);\n }\n }\n\n if (sameVector(stroke.firstPoint, stroke.lastPoint)) {\n if (\n canExtendSegment(\n simplifiedSegments[0],\n simplifiedSegments[simplifiedSegments.length - 1]\n )\n ) {\n foundSimplification = true;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const lastSegment = simplifiedSegments.pop()!;\n simplifiedSegments[0] = extendSegment(lastSegment, simplifiedSegments[0]);\n }\n }\n\n if (!foundSimplification) return null;\n return simplifiedSegments;\n}\n","import { AbstractStroke } from \"./Stroke.js\";\n\nimport { TransformationMatrix } from \"./TransformationMatrix.js\";\nimport { sameVector } from \"../vectorOperations.js\";\nimport { simplifySegments } from \"../algorithms/simplify.js\";\n\nexport class Strand extends AbstractStroke<Strand> {\n strokeType = \"STRAND\";\n reverse(): Strand {\n const reversedSegments = this.segments.map((segment) => segment.reverse());\n reversedSegments.reverse();\n return new Strand(reversedSegments, { ignoreChecks: true });\n }\n\n clone(): Strand {\n return new Strand(\n this.segments.map((segment) => segment.clone()),\n { ignoreChecks: true }\n );\n }\n\n extend(strand: Strand): Strand {\n if (!sameVector(this.lastPoint, strand.firstPoint)) {\n console.error(this.repr, strand.repr);\n throw new Error(\"Cannot extend strand: connection point is not the same\");\n }\n return new Strand([...this.segments, ...strand.segments]);\n }\n\n simplify(): Strand {\n const newSegments = simplifySegments(this);\n if (!newSegments) return this;\n return new Strand(newSegments, { ignoreChecks: true });\n }\n\n transform(matrix: TransformationMatrix): Strand {\n return new Strand(\n this.segments.map((segment) => segment.transform(matrix)),\n { ignoreChecks: true }\n );\n }\n}\n","import { Line } from \"../../models/segments/Line.js\";\nimport { lineLineParams } from \"./lineLineIntersection.js\";\nimport { lineEllipseArcIntersection } from \"./lineEllipseArcIntersection.js\";\nimport type { Vector } from \"../../definitions.js\";\nimport { Segment } from \"../../models/segments/Segment.js\";\nimport { sameVector, squareDistance } from \"../../vectorOperations.js\";\nimport { Arc } from \"../../models/segments/Arc.js\";\nimport { EllipseArc } from \"../../models/segments/EllipseArc.js\";\n\nconst rayLineIntersectionsCount = (point: Vector, line: Line) => {\n const intersectionParams = lineLineParams(line, {\n V: [1, 0],\n firstPoint: point,\n precision: line.precision,\n });\n if (intersectionParams === \"parallel\") {\n // When the ray is parallel with the line, we can ignore its extremities.\n // They will be handled by the segments getting into and out of this one.\n return 0;\n }\n\n const { intersectionParam1, intersectionParam2 } = intersectionParams;\n\n if (!line.isValidParameter(intersectionParam1)) return 0;\n // With the ray we only check one side of the parameter\n if (intersectionParam2 <= -line.precision) return 0;\n\n // We need to check if the ray intersects the line segment at the extremities\n // In that case we considers that it crosses the segment if its midpoint is\n // above the line.\n\n if (\n Math.abs(intersectionParam1) < line.precision ||\n Math.abs(intersectionParam1 - 1) < line.precision\n ) {\n const [, y] = line.midPoint;\n return point[1] - y < 0 ? 1 : 0;\n }\n\n return 1;\n};\n\nclass IntersectionCounter {\n private _count = 0;\n private readonly segment: Segment;\n\n constructor(segment: Segment) {\n this.segment = segment;\n }\n\n update(intersectionPoint: Vector, isOnSegment = false) {\n if (!isOnSegment && !this.segment.isOnSegment(intersectionPoint)) return;\n\n // We extend the convention of the line ray interaction. We look at the\n // tangent at the point of intersection. If it is pointing to the top we\n // consider that the ray is crossing the arc.\n if (sameVector(intersectionPoint, this.segment.firstPoint)) {\n this._count += this.segment.tangentAtFirstPoint[1] > 0 ? 1 : 0;\n } else if (sameVector(intersectionPoint, this.segment.lastPoint)) {\n this._count += this.segment.tangentAtLastPoint[1] > 0 ? 0 : 1;\n } else {\n this._count += 1;\n }\n }\n\n get count() {\n return this._count;\n }\n}\n\nconst rayArcIntersectionsCount = (point: Vector, arc: Arc) => {\n const epsilon = arc.precision;\n\n const verticalDistance = Math.abs(point[1] - arc.center[1]);\n\n // the line is above or below the circle\n if (verticalDistance > arc.radius + epsilon) return 0;\n\n const squareDist = squareDistance(point, arc.center);\n const squareR = arc.radius * arc.radius;\n const squareEpsilon = epsilon * epsilon;\n\n // On the border\n if (Math.abs(squareDist - squareR) < squareEpsilon && arc.isOnSegment(point))\n return 0;\n\n const pointOutsideCircle = squareDist - squareR > squareEpsilon;\n\n // the point is at the right of the circle\n if (pointOutsideCircle && arc.center[0] < point[0]) return 0;\n\n // delta corresponds to the length between the project center on the line and\n // the crossing points\n const delta = Math.sqrt(\n arc.radius * arc.radius - verticalDistance * verticalDistance\n );\n\n const counter = new IntersectionCounter(arc);\n\n // We might be able to optimise the check on segment, but it is not clear\n // that it is worth it\n counter.update([arc.center[0] + delta, point[1]]);\n\n if (pointOutsideCircle) {\n counter.update([arc.center[0] - delta, point[1]]);\n }\n\n return counter.count;\n};\n\nconst rayEllipseArcIntersectionsCount = (point: Vector, arc: EllipseArc) => {\n const end = arc.boundingBox.xMax + arc.boundingBox.width / 2;\n const ray = new Line(point, [end, point[1]]);\n\n const counter = new IntersectionCounter(arc);\n lineEllipseArcIntersection(ray, arc).forEach((intersection) => {\n // We already know that the intersection is on the ellipse, se we se\n // isOnSegment as true\n counter.update(intersection, true);\n });\n\n return counter.count;\n};\n\nexport function rayIntersectionsCount(point: Vector, segment: Segment): number {\n if (segment instanceof Line) {\n return rayLineIntersectionsCount(point, segment);\n }\n\n if (segment instanceof Arc) {\n return rayArcIntersectionsCount(point, segment);\n }\n\n if (segment instanceof EllipseArc) {\n return rayEllipseArcIntersectionsCount(point, segment);\n }\n\n throw new Error(\"Not implemented\");\n}\n","import type { Vector } from \"../definitions.js\";\nimport { rayIntersectionsCount } from \"../algorithms/intersections/rayIntersections.js\";\nimport { AbstractStroke, checkValidStroke } from \"./Stroke.js\";\nimport type { TransformationMatrix } from \"./TransformationMatrix.js\";\nimport { simplifySegments } from \"../algorithms/simplify.js\";\nimport { Segment } from \"./segments/Segment.js\";\nimport { sameVector } from \"../vectorOperations.js\";\nimport { Line } from \"./segments/Line.js\";\n\nexport class Loop extends AbstractStroke<Loop> {\n strokeType = \"LOOP\";\n\n constructor(segments: Segment[], { ignoreChecks = false } = {}) {\n super(segments, { ignoreChecks: true });\n if (!ignoreChecks) checkValidLoop(segments);\n }\n\n private _clockwise: boolean | null = null;\n get clockwise(): boolean {\n if (this._clockwise === null) {\n const vertices = this.segments.flatMap((c) => {\n if (!(c instanceof Line)) {\n // We just go with a simple approximation here, we should use some extrema\n // points instead, but this is quick (and good enough for now)\n return [c.firstPoint, c.paramPoint(0.5)];\n }\n return [c.firstPoint];\n });\n\n const approximateArea = vertices\n .map((v1, i) => {\n const v2 = vertices[(i + 1) % vertices.length];\n return (v2[0] - v1[0]) * (v2[1] + v1[1]);\n })\n .reduce((a, b) => a + b, 0);\n\n this._clockwise = approximateArea > 0;\n }\n return this._clockwise;\n }\n\n clone(): Loop {\n return new Loop(\n this.segments.map((segment) => segment.clone()),\n { ignoreChecks: true }\n );\n }\n\n reverse(): Loop {\n const reversedSegments = this.segments.map((segment) => segment.reverse());\n reversedSegments.reverse();\n return new Loop(reversedSegments, { ignoreChecks: true });\n }\n\n transform(matrix: TransformationMatrix): Loop {\n return new Loop(\n this.segments.map((segment) => segment.transform(matrix)),\n { ignoreChecks: true }\n );\n }\n\n contains(point: Vector): boolean {\n if (this.onStroke(point)) return false;\n if (!this.boundingBox.contains(point)) return false;\n\n const intersections = this.segments.reduce((acc, segment) => {\n return acc + rayIntersectionsCount(point, segment);\n }, 0);\n\n return intersections % 2 === 1;\n }\n\n simplify(): Loop {\n const newSegments = simplifySegments(this);\n if (!newSegments) return this;\n return new Loop(newSegments, { ignoreChecks: true });\n }\n}\n\nexport function checkValidLoop(segments: Segment[]): void {\n checkValidStroke(segments, \"Loop\");\n if (\n !sameVector(segments[0].firstPoint, segments[segments.length - 1].lastPoint)\n )\n throw new Error(\"Loop segment must be closed\");\n}\n","import { Arc } from \"../../models/segments/Arc.js\";\nimport { EllipseArc } from \"../../models/segments/EllipseArc.js\";\nimport { Line } from \"../../models/segments/Line.js\";\nimport { Segment } from \"../../models/segments/Segment.js\";\n\nexport function jsonSegment(segment: Segment) {\n if (segment instanceof Line) {\n return {\n type: segment.segmentType,\n firstPoint: segment.firstPoint,\n lastPoint: segment.lastPoint,\n };\n }\n if (segment instanceof Arc) {\n return {\n type: segment.segmentType,\n firstPoint: segment.firstPoint,\n lastPoint: segment.lastPoint,\n center: segment.center,\n clockwise: segment.clockwise,\n };\n }\n\n if (segment instanceof EllipseArc) {\n return {\n type: segment.segmentType,\n firstPoint: segment.firstPoint,\n lastPoint: segment.lastPoint,\n center: segment.center,\n clockwise: segment.clockwise,\n majorRadius: segment.majorRadius,\n minorRadius: segment.minorRadius,\n tiltAngle: segment.tiltAngle,\n };\n }\n\n throw new Error(\"Unknown segment type\");\n}\n","import type { Loop } from \"../../models/Loop.js\";\nimport { jsonSegment } from \"./jsonSegment.js\";\n\nexport function jsonLoop(loop: Loop) {\n return {\n type: \"LOOP\",\n segments: loop.segments.map(jsonSegment),\n };\n}\n","import type { Figure } from \"../../models/Figure.js\";\nimport { jsonLoop } from \"./jsonLoop.js\";\n\nexport function jsonFigure(figure: Figure) {\n return {\n type: \"FIGURE\",\n contour: jsonLoop(figure.contour),\n holes: figure.holes.map(jsonLoop),\n };\n}\n","import { Diagram } from \"../../models/Diagram.js\";\nimport { jsonFigure } from \"./jsonFigure.js\";\n\nexport function jsonDiagram(diagram: Diagram) {\n return {\n type: \"DIAGRAM\",\n figures: diagram.figures.map(jsonFigure),\n };\n}\n","import { Diagram } from \"../../models/Diagram.js\";\nimport { Figure } from \"../../models/Figure.js\";\nimport { Loop } from \"../../models/Loop.js\";\nimport { Arc } from \"../../models/segments/Arc.js\";\nimport { Line } from \"../../models/segments/Line.js\";\nimport { jsonDiagram } from \"./jsonDiagram.js\";\nimport { jsonFigure } from \"./jsonFigure.js\";\nimport { jsonLoop } from \"./jsonLoop.js\";\nimport { jsonSegment } from \"./jsonSegment.js\";\n\ntype Shape = Loop | Figure | Diagram | Arc | Line;\n\nexport function exportJSON(shape: Shape) {\n if (shape instanceof Diagram) {\n return jsonDiagram(shape);\n } else if (shape instanceof Figure) {\n return jsonFigure(shape);\n } else if (shape instanceof Loop) {\n return jsonLoop(shape);\n } else if (shape instanceof Arc || shape instanceof Line) {\n return jsonSegment(shape);\n } else {\n throw new Error(\"Unknown shape type\");\n }\n}\n","\nexport default class FlatQueue {\n\n constructor() {\n this.ids = [];\n this.values = [];\n this.length = 0;\n }\n\n clear() {\n this.length = 0;\n }\n\n push(id, value) {\n let pos = this.length++;\n\n while (pos > 0) {\n const parent = (pos - 1) >> 1;\n const parentValue = this.values[parent];\n if (value >= parentValue) break;\n this.ids[pos] = this.ids[parent];\n this.values[pos] = parentValue;\n pos = parent;\n }\n\n this.ids[pos] = id;\n this.values[pos] = value;\n }\n\n pop() {\n if (this.length === 0) return undefined;\n\n const top = this.ids[0];\n this.length--;\n\n if (this.length > 0) {\n const id = this.ids[0] = this.ids[this.length];\n const value = this.values[0] = this.values[this.length];\n const halfLength = this.length >> 1;\n let pos = 0;\n\n while (pos < halfLength) {\n let left = (pos << 1) + 1;\n const right = left + 1;\n let bestIndex = this.ids[left];\n let bestValue = this.values[left];\n const rightValue = this.values[right];\n\n if (right < this.length && rightValue < bestValue) {\n left = right;\n bestIndex = this.ids[right];\n bestValue = rightValue;\n }\n if (bestValue >= value) break;\n\n this.ids[pos] = bestIndex;\n this.values[pos] = bestValue;\n pos = left;\n }\n\n this.ids[pos] = id;\n this.values[pos] = value;\n }\n\n return top;\n }\n\n peek() {\n if (this.length === 0) return undefined;\n return this.ids[0];\n }\n\n peekValue() {\n if (this.length === 0) return undefined;\n return this.values[0];\n }\n\n shrink() {\n this.ids.length = this.values.length = this.length;\n }\n}\n","import FlatQueue from 'flatqueue';\n\nconst ARRAY_TYPES = [\n Int8Array, Uint8Array, Uint8ClampedArray, Int16Array, Uint16Array,\n Int32Array, Uint32Array, Float32Array, Float64Array\n];\n\nconst VERSION = 3; // serialized format version\n\nexport default class Flatbush {\n\n static from(data) {\n if (!data || data.byteLength === undefined || data.buffer) {\n throw new Error('Data must be an instance of ArrayBuffer or SharedArrayBuffer.');\n }\n const [magic, versionAndType] = new Uint8Array(data, 0, 2);\n if (magic !== 0xfb) {\n throw new Error('Data does not appear to be in a Flatbush format.');\n }\n if (versionAndType >> 4 !== VERSION) {\n throw new Error(`Got v${versionAndType >> 4} data when expected v${VERSION}.`);\n }\n const [nodeSize] = new Uint16Array(data, 2, 1);\n const [numItems] = new Uint32Array(data, 4, 1);\n\n return new Flatbush(numItems, nodeSize, ARRAY_TYPES[versionAndType & 0x0f], undefined, data);\n }\n\n constructor(numItems, nodeSize = 16, ArrayType = Float64Array, ArrayBufferType = ArrayBuffer, data) {\n if (numItems === undefined) throw new Error('Missing required argument: numItems.');\n if (isNaN(numItems) || numItems <= 0) throw new Error(`Unexpected numItems value: ${numItems}.`);\n\n this.numItems = +numItems;\n this.nodeSize = Math.min(Math.max(+nodeSize, 2), 65535);\n\n // calculate the total number of nodes in the R-tree to allocate space for\n // and the index of each tree level (used in search later)\n let n = numItems;\n let numNodes = n;\n this._levelBounds = [n * 4];\n do {\n n = Math.ceil(n / this.nodeSize);\n numNodes += n;\n this._levelBounds.push(numNodes * 4);\n } while (n !== 1);\n\n this.ArrayType = ArrayType || Float64Array;\n this.IndexArrayType = numNodes < 16384 ? Uint16Array : Uint32Array;\n\n const arrayTypeIndex = ARRAY_TYPES.indexOf(this.ArrayType);\n const nodesByteSize = numNodes * 4 * this.ArrayType.BYTES_PER_ELEMENT;\n\n if (arrayTypeIndex < 0) {\n throw new Error(`Unexpected typed array class: ${ArrayType}.`);\n }\n\n if (data && data.byteLength !== undefined && !data.buffer) {\n this.data = data;\n this._boxes = new this.ArrayType(this.data, 8, numNodes * 4);\n this._indices = new this.IndexArrayType(this.data, 8 + nodesByteSize, numNodes);\n\n this._pos = numNodes * 4;\n this.minX = this._boxes[this._pos - 4];\n this.minY = this._boxes[this._pos - 3];\n this.maxX = this._boxes[this._pos - 2];\n this.maxY = this._boxes[this._pos - 1];\n\n } else {\n this.data = new ArrayBufferType(8 + nodesByteSize + numNodes * this.IndexArrayType.BYTES_PER_ELEMENT);\n this._boxes = new this.ArrayType(this.data, 8, numNodes * 4);\n this._indices = new this.IndexArrayType(this.data, 8 + nodesByteSize, numNodes);\n this._pos = 0;\n this.minX = Infinity;\n this.minY = Infinity;\n this.maxX = -Infinity;\n this.maxY = -Infinity;\n\n new Uint8Array(this.data, 0, 2).set([0xfb, (VERSION << 4) + arrayTypeIndex]);\n new Uint16Array(this.data, 2, 1)[0] = nodeSize;\n new Uint32Array(this.data, 4, 1)[0] = numItems;\n }\n\n // a priority queue for k-nearest-neighbors queries\n this._queue = new FlatQueue();\n }\n\n add(minX, minY, maxX, maxY) {\n const index = this._pos >> 2;\n const boxes = this._boxes;\n this._indices[index] = index;\n boxes[this._pos++] = minX;\n boxes[this._pos++] = minY;\n boxes[this._pos++] = maxX;\n boxes[this._pos++] = maxY;\n\n if (minX < this.minX) this.minX = minX;\n if (minY < this.minY) this.minY = minY;\n if (maxX > this.maxX) this.maxX = maxX;\n if (maxY > this.maxY) this.maxY = maxY;\n\n return index;\n }\n\n finish() {\n if (this._pos >> 2 !== this.numItems) {\n throw new Error(`Added ${this._pos >> 2} items when expected ${this.numItems}.`);\n }\n const boxes = this._boxes;\n\n if (this.numItems <= this.nodeSize) {\n // only one node, skip sorting and just fill the root box\n boxes[this._pos++] = this.minX;\n boxes[this._pos++] = this.minY;\n boxes[this._pos++] = this.maxX;\n boxes[this._pos++] = this.maxY;\n return;\n }\n\n const width = (this.maxX - this.minX) || 1;\n const height = (this.maxY - this.minY) || 1;\n const hilbertValues = new Uint32Array(this.numItems);\n const hilbertMax = (1 << 16) - 1;\n\n // map item centers into Hilbert coordinate space and calculate Hilbert values\n for (let i = 0, pos = 0; i < this.numItems; i++) {\n const minX = boxes[pos++];\n const minY = boxes[pos++];\n const maxX = boxes[pos++];\n const maxY = boxes[pos++];\n const x = Math.floor(hilbertMax * ((minX + maxX) / 2 - this.minX) / width);\n const y = Math.floor(hilbertMax * ((minY + maxY) / 2 - this.minY) / height);\n hilbertValues[i] = hilbert(x, y);\n }\n\n // sort items by their Hilbert value (for packing later)\n sort(hilbertValues, boxes, this._indices, 0, this.numItems - 1, this.nodeSize);\n\n // generate nodes at each tree level, bottom-up\n for (let i = 0, pos = 0; i < this._levelBounds.length - 1; i++) {\n const end = this._levelBounds[i];\n\n // generate a parent node for each block of consecutive <nodeSize> nodes\n while (pos < end) {\n const nodeIndex = pos;\n\n // calculate bbox for the new node\n let nodeMinX = boxes[pos++];\n let nodeMinY = boxes[pos++];\n let nodeMaxX = boxes[pos++];\n let nodeMaxY = boxes[pos++];\n for (let j = 1; j < this.nodeSize && pos < end; j++) {\n nodeMinX = Math.min(nodeMinX, boxes[pos++]);\n nodeMinY = Math.min(nodeMinY, boxes[pos++]);\n nodeMaxX = Math.max(nodeMaxX, boxes[pos++]);\n nodeMaxY = Math.max(nodeMaxY, boxes[pos++]);\n }\n\n // add the new node to the tree data\n this._indices[this._pos >> 2] = nodeIndex;\n boxes[this._pos++] = nodeMinX;\n boxes[this._pos++] = nodeMinY;\n boxes[this._pos++] = nodeMaxX;\n boxes[this._pos++] = nodeMaxY;\n }\n }\n }\n\n search(minX, minY, maxX, maxY, filterFn) {\n if (this._pos !== this._boxes.length) {\n throw new Error('Data not yet indexed - call index.finish().');\n }\n\n let nodeIndex = this._boxes.length - 4;\n const queue = [];\n const results = [];\n\n while (nodeIndex !== undefined) {\n // find the end index of the node\n const end = Math.min(nodeIndex + this.nodeSize * 4, upperBound(nodeIndex, this._levelBounds));\n\n // search through child nodes\n for (let pos = nodeIndex; pos < end; pos += 4) {\n // check if node bbox intersects with query bbox\n if (maxX < this._boxes[pos]) continue; // maxX < nodeMinX\n if (maxY < this._boxes[pos + 1]) continue; // maxY < nodeMinY\n if (minX > this._boxes[pos + 2]) continue; // minX > nodeMaxX\n if (minY > this._boxes[pos + 3]) continue; // minY > nodeMaxY\n\n const index = this._indices[pos >> 2] | 0;\n\n if (nodeIndex >= this.numItems * 4) {\n queue.push(index); // node; add it to the search queue\n\n } else if (filterFn === undefined || filterFn(index)) {\n results.push(index); // leaf item\n }\n }\n\n nodeIndex = queue.pop();\n }\n\n return results;\n }\n\n neighbors(x, y, maxResults = Infinity, maxDistance = Infinity, filterFn) {\n if (this._pos !== this._boxes.length) {\n throw new Error('Data not yet indexed - call index.finish().');\n }\n\n let nodeIndex = this._boxes.length - 4;\n const q = this._queue;\n const results = [];\n const maxDistSquared = maxDistance * maxDistance;\n\n while (nodeIndex !== undefined) {\n // find the end index of the node\n const end = Math.min(nodeIndex + this.nodeSize * 4, upperBound(nodeIndex, this._levelBounds));\n\n // add child nodes to the queue\n for (let pos = nodeIndex; pos < end; pos += 4) {\n const index = this._indices[pos >> 2] | 0;\n\n const dx = axisDist(x, this._boxes[pos], this._boxes[pos + 2]);\n const dy = axisDist(y, this._boxes[pos + 1], this._boxes[pos + 3]);\n const dist = dx * dx + dy * dy;\n\n if (nodeIndex >= this.numItems * 4) {\n q.push(index << 1, dist); // node (use even id)\n\n } else if (filterFn === undefined || filterFn(index)) {\n q.push((index << 1) + 1, dist); // leaf item (use odd id)\n }\n }\n\n // pop items from the queue\n while (q.length && (q.peek() & 1)) {\n const dist = q.peekValue();\n if (dist > maxDistSquared) {\n q.clear();\n return results;\n }\n results.push(q.pop() >> 1);\n\n if (results.length === maxResults) {\n q.clear();\n return results;\n }\n }\n\n nodeIndex = q.pop() >> 1;\n }\n\n q.clear();\n return results;\n }\n}\n\nfunction axisDist(k, min, max) {\n return k < min ? min - k : k <= max ? 0 : k - max;\n}\n\n// binary search for the first value in the array bigger than the given\nfunction upperBound(value, arr) {\n let i = 0;\n let j = arr.length - 1;\n while (i < j) {\n const m = (i + j) >> 1;\n if (arr[m] > value) {\n j = m;\n } else {\n i = m + 1;\n }\n }\n return arr[i];\n}\n\n// custom quicksort that partially sorts bbox data alongside the hilbert values\nfunction sort(values, boxes, indices, left, right, nodeSize) {\n if (Math.floor(left / nodeSize) >= Math.floor(right / nodeSize)) return;\n\n const pivot = values[(left + right) >> 1];\n let i = left - 1;\n let j = right + 1;\n\n while (true) {\n do i++; while (values[i] < pivot);\n do j--; while (values[j] > pivot);\n if (i >= j) break;\n swap(values, boxes, indices, i, j);\n }\n\n sort(values, boxes, indices, left, j, nodeSize);\n sort(values, boxes, indices, j + 1, right, nodeSize);\n}\n\n// swap two values and two corresponding boxes\nfunction swap(values, boxes, indices, i, j) {\n const temp = values[i];\n values[i] = values[j];\n values[j] = temp;\n\n const k = 4 * i;\n const m = 4 * j;\n\n const a = boxes[k];\n const b = boxes[k + 1];\n const c = boxes[k + 2];\n const d = boxes[k + 3];\n boxes[k] = boxes[m];\n boxes[k + 1] = boxes[m + 1];\n boxes[k + 2] = boxes[m + 2];\n boxes[k + 3] = boxes[m + 3];\n boxes[m] = a;\n boxes[m + 1] = b;\n boxes[m + 2] = c;\n boxes[m + 3] = d;\n\n const e = indices[i];\n indices[i] = indices[j];\n indices[j] = e;\n}\n\n// Fast Hilbert curve algorithm by http://threadlocalmutex.com/\n// Ported from C++ https://github.com/rawrunprotected/hilbert_curves (public domain)\nfunction hilbert(x, y) {\n let a = x ^ y;\n let b = 0xFFFF ^ a;\n let c = 0xFFFF ^ (x | y);\n let d = x & (y ^ 0xFFFF);\n\n let A = a | (b >> 1);\n let B = (a >> 1) ^ a;\n let C = ((c >> 1) ^ (b & (d >> 1))) ^ c;\n let D = ((a & (c >> 1)) ^ (d >> 1)) ^ d;\n\n a = A; b = B; c = C; d = D;\n A = ((a & (a >> 2)) ^ (b & (b >> 2)));\n B = ((a & (b >> 2)) ^ (b & ((a ^ b) >> 2)));\n C ^= ((a & (c >> 2)) ^ (b & (d >> 2)));\n D ^= ((b & (c >> 2)) ^ ((a ^ b) & (d >> 2)));\n\n a = A; b = B; c = C; d = D;\n A = ((a & (a >> 4)) ^ (b & (b >> 4)));\n B = ((a & (b >> 4)) ^ (b & ((a ^ b) >> 4)));\n C ^= ((a & (c >> 4)) ^ (b & (d >> 4)));\n D ^= ((b & (c >> 4)) ^ ((a ^ b) & (d >> 4)));\n\n a = A; b = B; c = C; d = D;\n C ^= ((a & (c >> 8)) ^ (b & (d >> 8)));\n D ^= ((b & (c >> 8)) ^ ((a ^ b) & (d >> 8)));\n\n a = C ^ (C >> 1);\n b = D ^ (D >> 1);\n\n let i0 = x ^ y;\n let i1 = b | (0xFFFF ^ (i0 | a));\n\n i0 = (i0 | (i0 << 8)) & 0x00FF00FF;\n i0 = (i0 | (i0 << 4)) & 0x0F0F0F0F;\n i0 = (i0 | (i0 << 2)) & 0x33333333;\n i0 = (i0 | (i0 << 1)) & 0x55555555;\n\n i1 = (i1 | (i1 << 8)) & 0x00FF00FF;\n i1 = (i1 | (i1 << 4)) & 0x0F0F0F0F;\n i1 = (i1 | (i1 << 2)) & 0x33333333;\n i1 = (i1 | (i1 << 1)) & 0x55555555;\n\n return ((i1 << 1) | i0) >>> 0;\n}\n","import Flatbush from \"flatbush\";\nimport { Segment } from \"../models/segments/Segment.js\";\n\nexport function stitchSegments(\n segments: Segment[],\n precision = 1e-7\n): Segment[][] {\n if (segments.length === 0) return [];\n if (segments.length === 1) return [segments];\n\n // We create a spacial index of the startpoints\n const startPoints = new Flatbush(segments.length);\n segments.forEach((c) => {\n const [x, y] = c.firstPoint;\n startPoints.add(x - precision, y - precision, x + precision, y + precision);\n });\n startPoints.finish();\n\n const stitchedSegments: Segment[][] = [];\n const visited = new Set<number>();\n\n segments.forEach((segment, index) => {\n if (visited.has(index)) return;\n\n const connectedSegments: Segment[] = [segment];\n let currentIndex = index;\n\n visited.add(index);\n\n // Once we have started a connected segment segment, we look for the next\n\n let maxLoops = segments.length;\n // eslint-disable-next-line no-constant-condition\n while (true) {\n if (maxLoops-- < 0) {\n throw new Error(\"Infinite loop detected\");\n }\n\n const lastPoint =\n connectedSegments[connectedSegments.length - 1].lastPoint;\n\n const [x, y] = lastPoint;\n const neighbors = startPoints.search(\n x - precision,\n y - precision,\n x + precision,\n y + precision\n );\n\n const indexDistance = (otherIndex: number) =>\n Math.abs((currentIndex - otherIndex) % segments.length);\n const potentialNextSegments = neighbors\n .filter((neighborIndex) => !visited.has(neighborIndex))\n .map((neighborIndex): [Segment, number, number] => [\n segments[neighborIndex],\n neighborIndex,\n indexDistance(neighborIndex),\n ])\n .sort(([, , a], [, , b]) => indexDistance(a) - indexDistance(b));\n\n if (potentialNextSegments.length === 0) {\n // No more segments to connect we should have wrapped\n stitchedSegments.push(connectedSegments);\n break;\n }\n\n const [nextSegment, nextSegmentIndex] = potentialNextSegments[0];\n\n connectedSegments.push(nextSegment);\n visited.add(nextSegmentIndex);\n currentIndex = nextSegmentIndex;\n }\n });\n\n return stitchedSegments;\n}\n","import { Vector } from \"../definitions.js\";\nimport { TransformationMatrix } from \"./TransformationMatrix.js\";\nimport type { BoundingBox } from \"./BoundingBox.js\";\nimport { Loop } from \"./Loop.js\";\nimport { Strand } from \"./Strand.js\";\nimport type { Stroke } from \"./Stroke.js\";\nimport { combineDifferentValues } from \"../utils/allCombinations.js\";\nimport { Transformable } from \"./utils/Transformable.js\";\nimport { exportJSON } from \"../export/json/exportJSON.js\";\nimport { stitchSegments } from \"../algorithms/stitchSegments.js\";\n\nexport class Figure extends Transformable<Figure> {\n readonly contour: Loop;\n readonly holes: Loop[];\n\n constructor(\n contour: Loop,\n holes: Loop[] = [],\n { ignoreChecks = false } = {}\n ) {\n super();\n if (!ignoreChecks) checkIsValidFigure(contour, holes);\n this.contour = contour;\n this.holes = holes;\n }\n\n get boundingBox(): BoundingBox {\n return this.contour.boundingBox;\n }\n\n get isFull(): boolean {\n return this.holes.length === 0;\n }\n\n get allLoops(): Loop[] {\n return [this.contour, ...this.holes];\n }\n\n clone(): Figure {\n return new Figure(\n this.contour.clone(),\n this.holes.map((hole) => hole.clone())\n );\n }\n\n transform(matrix: TransformationMatrix): Figure {\n return new Figure(\n this.contour.transform(matrix),\n this.holes.map((hole) => hole.transform(matrix))\n );\n }\n\n contains(point: Vector): boolean {\n return (\n this.contour.contains(point) &&\n !this.holes.some((hole) => hole.contains(point))\n );\n }\n\n intersects(other: Figure): boolean {\n return this.allLoops.some((loop) =>\n other.allLoops.some((otherLoop) => loop.intersects(otherLoop))\n );\n }\n\n overlappingStrands(other: Figure | Stroke): Strand[] {\n const otherStrokes = other instanceof Figure ? other.allLoops : [other];\n const overlappingSegments = this.allLoops.flatMap((loop) => {\n return otherStrokes.flatMap((otherLoop) => {\n return loop.overlappingSegments(otherLoop);\n });\n });\n\n return stitchSegments(overlappingSegments).map((segments) => {\n return new Strand(segments);\n });\n }\n}\n\nexport function checkIsValidFigure(contour?: Loop, holes: Loop[] = []): void {\n if (!contour) throw new Error(\"Figure must have a contour\");\n for (const [loop1, loop2] of combineDifferentValues([contour, ...holes])) {\n if (loop1.intersects(loop2)) {\n throw new Error(\"Loops in a figure must not intersect\");\n }\n }\n\n if (\n holes.some(\n (hole) =>\n !contour.contains(hole.firstPoint) && !contour.onStroke(hole.firstPoint)\n )\n ) {\n throw new Error(\"Holes must be inside the contour\");\n }\n\n for (const [hole1, hole2] of combineDifferentValues(holes)) {\n if (hole1.contains(hole2.firstPoint)) {\n console.error(exportJSON(hole1), exportJSON(hole2));\n throw new Error(\"Holes must not be inside other holes\");\n }\n }\n}\n","import { Figure } from \"../models/Figure\";\nimport { Loop } from \"../models/Loop\";\n\nconst groupByBoundingBoxOverlap = (loops: Loop[]): Loop[][] => {\n const overlaps = loops.map((loop, i) => {\n return loops\n .slice(i + 1)\n .map((v, j): [number, Loop] => [j + i + 1, v])\n .filter(([, other]) => loop.boundingBox.overlaps(other.boundingBox))\n .map(([index]) => index);\n });\n const groups: Loop[][] = [];\n const groupsInOverlaps = Array(overlaps.length);\n\n overlaps.forEach((indices, i) => {\n let myGroup = groupsInOverlaps[i];\n if (!myGroup) {\n myGroup = [];\n groups.push(myGroup);\n }\n\n myGroup.push(loops[i]);\n\n if (indices.length) {\n indices.forEach((index) => {\n groupsInOverlaps[index] = myGroup;\n });\n }\n });\n\n return groups;\n};\n\ninterface ContainedLoop {\n loop: Loop;\n isIn: Loop[];\n}\n\nconst addContainmentInfo = (groupedLoops: Loop[]): ContainedLoop[] => {\n return groupedLoops.map((loop, index) => {\n const firstCurve = loop.segments[0];\n const point = firstCurve.midPoint;\n\n const isIn = groupedLoops.filter((potentialOuterLoop, j) => {\n if (index === j) return false;\n return potentialOuterLoop.contains(point);\n });\n\n return {\n loop,\n isIn,\n };\n });\n};\n\nconst splitMultipleOuterLoops = (\n outerLoops: ContainedLoop[],\n allLoops: ContainedLoop[]\n): ContainedLoop[][] => {\n return outerLoops.flatMap(({ loop: outerLoop }) => {\n return cleanEdgeCases(\n allLoops.filter(\n ({ loop, isIn }) => loop === outerLoop || isIn.indexOf(outerLoop) !== -1\n )\n );\n });\n};\n\nconst handleNestedLoops = (\n nestedLoops: ContainedLoop[],\n allLoops: ContainedLoop[]\n): ContainedLoop[][] => {\n const firstLevelOuterLoops = allLoops.filter(({ isIn }) => isIn.length <= 1);\n\n const innerLevelsLoops = cleanEdgeCases(\n addContainmentInfo(nestedLoops.map(({ loop }) => loop))\n );\n return [firstLevelOuterLoops, ...innerLevelsLoops];\n};\n\nconst cleanEdgeCases = (groupedLoops: ContainedLoop[]): ContainedLoop[][] => {\n if (!groupedLoops.length) return [];\n\n const outerLoops = groupedLoops.filter(({ isIn }) => !isIn.length);\n const nestedLoops = groupedLoops.filter(({ isIn }) => isIn.length > 1);\n\n if (outerLoops.length === 1 && nestedLoops.length === 0) {\n return [groupedLoops];\n } else if (outerLoops.length > 1) {\n return splitMultipleOuterLoops(outerLoops, groupedLoops);\n } else {\n return handleNestedLoops(nestedLoops, groupedLoops);\n }\n};\n\n/**\n * Groups an array of loops such that loops that correspond to holes\n * in other loops are set in a Figure\n *\n * This algorithm assumes non intersecting loops.\n */\nexport function organiseLoops(loops: Loop[]): Figure[] {\n const basicGrouping =\n groupByBoundingBoxOverlap(loops).map(addContainmentInfo);\n return basicGrouping.flatMap(cleanEdgeCases).map((compounds) => {\n if (compounds.length === 1) return new Figure(compounds[0].loop);\n\n compounds.sort((a, b) => a.isIn.length - b.isIn.length);\n const [contour, ...holes] = compounds.map(({ loop }) => loop);\n return new Figure(contour, holes);\n });\n}\n","export function allPairs<S, T>(list1: T[], list2: S[]): [T, S][] {\n const result: [T, S][] = [];\n\n for (const l1 of list1) {\n for (const l2 of list2) {\n result.push([l1, l2]);\n }\n }\n\n return result;\n}\n","import { Vector } from \"../../definitions\";\nimport { Segment } from \"../../models/segments/Segment\";\nimport { Strand } from \"../../models/Strand\";\nimport { sameVector } from \"../../vectorOperations\";\n\nexport function* strandsBetweenIntersections(\n segments: Segment[],\n allIntersections: Vector[],\n allCommonSegments: Segment[]\n): Generator<Strand> {\n const endsAtIntersection = (segment: Segment) => {\n return allIntersections.some((intersection) => {\n return sameVector(intersection, segment.lastPoint);\n });\n };\n\n const isCommonSegment = (commonSegment: Segment) => {\n return allCommonSegments.some((segment) => {\n return commonSegment.isSame(segment);\n });\n };\n\n let currentCurves: Segment[] = [];\n for (const segment of segments) {\n // We ignore the checks at strand creation as these strands are part of\n // a loop and can be trusted to be valid\n if (endsAtIntersection(segment)) {\n currentCurves.push(segment);\n yield new Strand(currentCurves, { ignoreChecks: true });\n currentCurves = [];\n } else if (isCommonSegment(segment)) {\n if (currentCurves.length) {\n yield new Strand(currentCurves, { ignoreChecks: true });\n currentCurves = [];\n }\n yield new Strand([segment], { ignoreChecks: true });\n } else {\n currentCurves.push(segment);\n }\n }\n if (currentCurves.length) {\n yield new Strand(currentCurves, { ignoreChecks: true });\n }\n}\n","import { Vector } from \"../../definitions\";\nimport zip from \"../../utils/zip\";\n\nimport { Segment } from \"../../models/segments/Segment\";\nimport { Strand } from \"../../models/Strand\";\nimport { reprVector, sameVector } from \"../../vectorOperations\";\nimport { Loop } from \"../../models/Loop\";\nimport { findIntersectionsAndOverlaps } from \"../intersections\";\nimport removeDuplicatePoints from \"../../utils/removeDuplicatePoints\";\nimport { stitchSegments } from \"../stitchSegments\";\nimport { strandsBetweenIntersections } from \"./strandsBetweenIntersections\";\n\nconst rotateToStartAt = (segments: Segment[], point: Vector) => {\n const startIndex = segments.findIndex((segment: Segment) => {\n return sameVector(point, segment.firstPoint);\n });\n\n const start = segments.slice(0, startIndex);\n const end = segments.slice(startIndex);\n\n return end.concat(start);\n};\n\nconst rotateToStartAtSegment = (segments: Segment[], segment: Segment) => {\n let usedSegments = segments;\n\n const onSegment = (seg: Segment) => {\n return (\n sameVector(seg.firstPoint, segment.firstPoint) &&\n sameVector(seg.lastPoint, segment.lastPoint)\n );\n };\n\n let startIndex = segments.findIndex(onSegment);\n\n // it is also possible that the segment is oriented the other way. We still\n // need to align a start point\n if (startIndex === -1) {\n const reversedSegments = segments.map((s) => s.reverse());\n reversedSegments.reverse();\n startIndex = reversedSegments.findIndex(onSegment);\n if (startIndex === -1) {\n console.error(\n reversedSegments.map((c) => c.repr),\n segment.repr\n );\n throw new Error(\"Failed to rotate to segment start\");\n }\n usedSegments = reversedSegments;\n }\n\n const start = usedSegments.slice(0, startIndex);\n const end = usedSegments.slice(startIndex);\n\n return end.concat(start);\n};\n\ntype IntersectionStrand = [Strand, Strand | \"same\"];\n\nfunction removeNonCrossingPoint(\n allIntersections: Vector[],\n segmentedCurve: Segment[],\n loopToCheck: Loop\n) {\n return allIntersections.filter((intersection: Vector) => {\n const segmentsOfIntersection = segmentedCurve.filter((s) => {\n return (\n sameVector(s.firstPoint, intersection) ||\n sameVector(s.lastPoint, intersection)\n );\n });\n if (segmentsOfIntersection.length % 2) {\n throw new Error(\"Bug in the intersection algo on non crossing point\");\n }\n\n const isInside = segmentsOfIntersection.map((segment: Segment): boolean => {\n return loopToCheck.contains(segment.midPoint);\n });\n\n // Either they are all inside or outside\n const segmentsOnTheSameSide =\n isInside.every((i) => i) || !isInside.some((i) => i);\n\n return !segmentsOnTheSameSide;\n });\n}\n\n/* When two shape intersect we cut them into segments between the intersection\n * points.\n *\n * This function returns the list of segments that have the same start and end\n * at the same intersection points or null if there is no intersection.\n */\nfunction loopIntersectionStrands(\n first: Loop,\n second: Loop,\n precision?: number\n): IntersectionStrand[] | null {\n // For each segment of each blueprint we figure out where the intersection\n // points are.\n let allIntersections: Vector[] = [];\n const allCommonSegments: Segment[] = [];\n\n const firstCurvePoints: Vector[][] = new Array(first.segments.length)\n .fill(0)\n .map(() => []);\n const secondCurvePoints: Vector[][] = new Array(second.segments.length)\n .fill(0)\n .map(() => []);\n\n first.segments.forEach((thisSegments, firstIndex) => {\n second.segments.forEach((otherSegments, secondIndex) => {\n const { intersections, overlaps } = findIntersectionsAndOverlaps(\n thisSegments,\n otherSegments,\n precision\n );\n\n allIntersections.push(...intersections);\n firstCurvePoints[firstIndex].push(...intersections);\n secondCurvePoints[secondIndex].push(...intersections);\n\n allCommonSegments.push(...overlaps);\n const commonSegmentsPoints = overlaps.flatMap((s) => [\n s.firstPoint,\n s.lastPoint,\n ]);\n allIntersections.push(...commonSegmentsPoints);\n firstCurvePoints[firstIndex].push(...commonSegmentsPoints);\n secondCurvePoints[secondIndex].push(...commonSegmentsPoints);\n });\n });\n\n allIntersections = removeDuplicatePoints(allIntersections, precision);\n\n // If there is only one intersection point we consider that the loops\n // are not intersecting\n if (!allIntersections.length || allIntersections.length === 1) return null;\n\n // We further split the segments at the intersections\n const cutCurve = ([segment, intersections]: [\n Segment,\n Vector[]\n ]): Segment[] => {\n if (!intersections.length) return [segment];\n return segment.splitAt(intersections);\n };\n let firstCurveSegments = zip([first.segments, firstCurvePoints] as [\n Segment[],\n Vector[][]\n ]).flatMap(cutCurve);\n\n let secondCurveSegments = zip([second.segments, secondCurvePoints] as [\n Segment[],\n Vector[][]\n ]).flatMap(cutCurve);\n\n // We need to remove intersection points that are not crossing into each\n // other (i.e. the two blueprints are only touching in one point and not\n // intersecting there.)\n allIntersections = removeNonCrossingPoint(\n allIntersections,\n firstCurveSegments,\n second\n );\n\n if (!allIntersections.length && !allCommonSegments.length) return null;\n\n // We align the beginning of the segments\n if (!allCommonSegments.length) {\n const startAt = allIntersections[0];\n firstCurveSegments = rotateToStartAt(firstCurveSegments, startAt);\n secondCurveSegments = rotateToStartAt(secondCurveSegments, startAt);\n } else {\n // When there are common segments we always start on one\n const startSegment = allCommonSegments[0];\n firstCurveSegments = rotateToStartAtSegment(\n firstCurveSegments,\n startSegment\n );\n secondCurveSegments = rotateToStartAtSegment(\n secondCurveSegments,\n startSegment\n );\n }\n\n // We group segments between intersections in strands\n let strandsFromFirst = Array.from(\n strandsBetweenIntersections(\n firstCurveSegments,\n allIntersections,\n allCommonSegments\n )\n );\n\n let strandsFromSecond = Array.from(\n strandsBetweenIntersections(\n secondCurveSegments,\n allIntersections,\n allCommonSegments\n )\n );\n\n if (\n !sameVector(\n strandsFromSecond[0].lastPoint,\n strandsFromFirst[0].lastPoint\n ) ||\n (allCommonSegments.length > 0 && strandsFromSecond[0].segmentsCount !== 1)\n ) {\n strandsFromSecond = strandsFromSecond.map((s) => s.reverse()).reverse();\n if (\n !sameVector(strandsFromSecond[0].lastPoint, strandsFromFirst[0].lastPoint)\n ) {\n strandsFromFirst = strandsFromFirst.map((s) => s.reverse()).reverse();\n }\n }\n\n return zip([strandsFromFirst, strandsFromSecond]).map(([first, second]) => {\n if (\n first.segmentsCount === 1 &&\n allCommonSegments.some((commonSegment) => {\n return first.segments[0].isSame(commonSegment);\n })\n ) {\n return [first, \"same\"];\n }\n return [first, second];\n });\n}\n\nfunction mergeStrandsAsLoop(strands: Strand[]) {\n let outStrand = strands[0];\n\n for (const strand of strands.slice(1)) {\n outStrand = outStrand.extend(strand);\n }\n\n if (!sameVector(outStrand.firstPoint, outStrand.lastPoint)) {\n console.error(\n reprVector(outStrand.firstPoint),\n reprVector(outStrand.lastPoint)\n );\n throw new Error(\"Bug in the intersection algo on non closing strand\");\n }\n\n return new Loop(outStrand.segments);\n}\n\nfunction mergeDiscontinuities(\n inputStrands: Strand[],\n discontinuities: number[]\n) {\n const strands = zip([\n discontinuities.slice(0, -1),\n discontinuities.slice(1),\n ]).map(([start, end]) => {\n return mergeStrandsAsLoop(inputStrands.slice(start, end));\n });\n\n let lastStrand = inputStrands.slice(\n discontinuities[discontinuities.length - 1]\n );\n if (discontinuities[0] !== 0) {\n lastStrand = lastStrand.concat(inputStrands.slice(0, discontinuities[0]));\n }\n strands.push(mergeStrandsAsLoop(lastStrand));\n\n return strands;\n}\n\nfunction groupLoops(inputStrands: Strand[]): Loop[] {\n if (!inputStrands.length) return [];\n\n const startPoints = inputStrands.map((c) => c.firstPoint);\n let endPoints = inputStrands.map((c) => c.lastPoint);\n endPoints = endPoints.slice(-1).concat(endPoints.slice(0, -1));\n\n const discontinuities = zip([startPoints, endPoints]).flatMap(\n ([startPoint, endPoint], index) => {\n if (!sameVector(startPoint, endPoint)) {\n return index;\n }\n return [];\n }\n );\n\n try {\n return mergeDiscontinuities(inputStrands, discontinuities);\n } catch (e) {\n // Sometimes the shapes are weird enough that our assumptions about the\n // strands do not work\n return stitchSegments(inputStrands.flatMap((s) => s.segments))\n .filter((c) => c.length > 1)\n .filter((c) => sameVector(c[0].firstPoint, c.at(-1)!.lastPoint))\n .map((c) => new Loop(c));\n }\n}\n\nconst extendStrandList = (strandList: Strand[], strand: Strand) => {\n if (strandList.length === 0) return [strand];\n const lastStrand = strandList.at(-1)!;\n if (sameVector(lastStrand.lastPoint, strand.firstPoint)) {\n return strandList.slice(0, -1).concat([lastStrand.extend(strand)]);\n } else if (sameVector(lastStrand.lastPoint, strand.lastPoint)) {\n return strandList\n .slice(0, -1)\n .concat([lastStrand.extend(strand.reverse())]);\n } else {\n return strandList.concat([strand]);\n }\n};\n\nconst prependStrandList = (strandList: Strand[], strand: Strand) => {\n if (strandList.length === 0) return [strand];\n if (sameVector(strandList[0].firstPoint, strand.lastPoint)) {\n return [strand.extend(strandList[0])].concat(strandList.slice(1));\n } else {\n return [strand].concat(strandList);\n }\n};\n\nexport function loopBooleanOperation(\n first: Loop,\n second: Loop,\n {\n firstInside,\n secondInside,\n }: {\n firstInside: \"keep\" | \"remove\";\n secondInside: \"keep\" | \"remove\";\n }\n):\n | Loop[]\n | { identical: true }\n | {\n firstCurveInSecond: boolean;\n secondCurveInFirst: boolean;\n identical: false;\n } {\n const strands = loopIntersectionStrands(first, second);\n\n // The case where we have no intersections\n if (!strands) {\n const firstStrandPoint = first.segments[0].midPoint;\n const firstCurveInSecond = second.contains(firstStrandPoint);\n\n const secondStrandPoint = second.segments[0].midPoint;\n const secondCurveInFirst = first.contains(secondStrandPoint);\n\n return {\n identical: false,\n firstCurveInSecond,\n secondCurveInFirst,\n };\n }\n\n if (strands.every(([, secondStrand]) => secondStrand === \"same\")) {\n return { identical: true };\n }\n\n let lastWasSame: null | Strand = null;\n let strandsIn: number | null = null;\n\n const s = strands.flatMap(([firstStrand, secondStrand]) => {\n let mergedStrands: Strand[] = [];\n let strandsOut = 0;\n\n // When two strands are on top of each other we base our decision on the\n // fact that every point should have one strand entering, and one going\n // out.\n if (secondStrand === \"same\") {\n if (strandsIn === 1) {\n strandsIn = 1;\n return firstStrand;\n }\n\n if (strandsIn === 2 || strandsIn === 0) {\n strandsIn = null;\n return [];\n }\n\n if (strandsIn === null) {\n if (!lastWasSame) lastWasSame = firstStrand;\n else lastWasSame = lastWasSame.extend(firstStrand);\n return [];\n }\n\n console.error(\"weird situation\");\n return [];\n }\n\n // Every strand is kept or removed according to the fact that it is within\n // or not of the other closed loop\n\n const firstSegmentPoint = firstStrand.segments[0].midPoint;\n const firstSegmentInSecondShape = second.contains(firstSegmentPoint);\n\n if (\n (firstInside === \"keep\" && firstSegmentInSecondShape) ||\n (firstInside === \"remove\" && !firstSegmentInSecondShape)\n ) {\n strandsOut += 1;\n mergedStrands = extendStrandList(mergedStrands, firstStrand);\n }\n\n const secondSegmentPoint = secondStrand.segments[0].midPoint;\n const secondSegmentInFirstShape = first.contains(secondSegmentPoint);\n\n if (\n (secondInside === \"keep\" && secondSegmentInFirstShape) ||\n (secondInside === \"remove\" && !secondSegmentInFirstShape)\n ) {\n const strandToAdd = secondStrand;\n\n strandsOut += 1;\n\n if (strandsOut === 2 && mergedStrands.length) {\n mergedStrands = extendStrandList(mergedStrands, strandToAdd);\n lastWasSame = null;\n } else {\n mergedStrands = [strandToAdd];\n }\n }\n\n // This is the case where the information about the strands entering the\n // previous node where not known and no strand was selected\n if (strandsIn === null && strandsOut === 1 && lastWasSame) {\n mergedStrands = prependStrandList(mergedStrands, lastWasSame);\n }\n\n if (strandsOut === 1) {\n strandsIn = strandsOut;\n lastWasSame = null;\n }\n if (!mergedStrands.length) {\n lastWasSame = null;\n return [];\n }\n return mergedStrands;\n });\n\n // We now have a bunch of strands, we need to group them into loops\n return groupLoops(s);\n}\n\nexport const fuseLoops = (first: Loop, second: Loop): Loop[] => {\n const result = loopBooleanOperation(first, second, {\n firstInside: \"remove\",\n secondInside: \"remove\",\n });\n\n if (Array.isArray(result)) return result;\n\n if (result.identical) {\n return [first];\n }\n\n if (result.firstCurveInSecond) {\n return [second];\n }\n\n if (result.secondCurveInFirst) {\n return [first];\n }\n\n return [first, second];\n};\n\nexport const cutLoops = (first: Loop, second: Loop): Loop[] => {\n const result = loopBooleanOperation(first, second, {\n firstInside: \"remove\",\n secondInside: \"keep\",\n });\n\n if (Array.isArray(result)) return result;\n\n if (result.identical) {\n return [];\n }\n\n if (result.firstCurveInSecond) {\n return [];\n }\n\n if (result.secondCurveInFirst) {\n return [first, second];\n }\n\n return [first];\n};\n\nexport const intersectLoops = (first: Loop, second: Loop): Loop[] => {\n const result = loopBooleanOperation(first, second, {\n firstInside: \"keep\",\n secondInside: \"keep\",\n });\n\n if (Array.isArray(result)) return result;\n\n if (result.identical) {\n return [first];\n }\n\n if (result.firstCurveInSecond) {\n return [first];\n }\n\n if (result.secondCurveInFirst) {\n return [second];\n }\n\n return [];\n};\n","import { Figure } from \"../../models/Figure\";\nimport { organiseLoops } from \"../organiseLoops\";\nimport { allPairs } from \"../../utils/allPairs\";\nimport { cutLoops, fuseLoops, intersectLoops } from \"./loopBooleans\";\n\nexport function fuseIntersectingFigures(figures: Figure[]) {\n const fused = new Map();\n\n const output: { current: Figure[] }[] = [];\n\n figures.forEach((inputFigure, i) => {\n let savedFigures: {\n current: Figure[];\n fusedWith: Set<number>;\n };\n\n if (fused.has(i)) {\n savedFigures = fused.get(i);\n } else {\n savedFigures = { current: [inputFigure], fusedWith: new Set([i]) };\n output.push(savedFigures);\n }\n\n figures.slice(i + 1).forEach((inputOtherFigure, j) => {\n const figure = savedFigures.current;\n\n const currentIndex = i + j + 1;\n\n if (savedFigures.fusedWith.has(currentIndex)) return;\n\n let otherFigure = [inputOtherFigure];\n let otherIsFused = false;\n\n if (fused.has(currentIndex)) {\n otherFigure = fused.get(currentIndex).current;\n otherIsFused = true;\n }\n\n const doListIntersect = figure.some((f) =>\n otherFigure.some((s) => f.intersects(s))\n );\n if (!doListIntersect) return;\n\n let newFused: Figure[];\n if (figure.length > 1 || otherFigure.length > 1) {\n newFused = fuseFiguresLists(figure, otherFigure);\n } else {\n newFused = fuseFigures(figure[0], otherFigure[0]);\n }\n\n savedFigures.fusedWith.add(currentIndex);\n savedFigures.current = newFused;\n if (!otherIsFused) fused.set(currentIndex, savedFigures);\n });\n });\n\n return output.flatMap(({ current }) => current);\n}\n\nexport function fuseFigures(first: Figure, second: Figure) {\n const outerFused = fuseLoops(first.contour, second.contour);\n\n const inner1Fused = second.holes.flatMap((c) => cutLoops(c, first.contour));\n const inner2Fused = first.holes.flatMap((c) => cutLoops(c, second.contour));\n\n const innerIntersections = allPairs(first.holes, second.holes).flatMap(\n ([first, second]) => intersectLoops(first, second)\n );\n\n return organiseLoops([\n ...outerFused,\n ...inner1Fused,\n ...inner2Fused,\n ...innerIntersections,\n ]);\n}\n\nexport function cutFigures(first: Figure, second: Figure): Figure[] {\n if (first.isFull && second.isFull) {\n return organiseLoops(cutLoops(first.contour, second.contour));\n }\n\n if (first.isFull) {\n const cutContour = cutLoops(first.contour, second.contour);\n const cutHoles = second.holes.flatMap((c) =>\n intersectLoops(c, first.contour)\n );\n // We might be able to assume that the contour and the holes are already\n // distinct figures.\n return organiseLoops([...cutContour, ...cutHoles]);\n } else if (second.isFull) {\n if (!first.contour.intersects(second.contour)) {\n if (!first.contour.contains(second.contour.firstPoint)) {\n // nothing to do here, the second figure is outside the first\n return [first];\n } else {\n const fusedCuts = fuseFiguresLists(\n first.holes.map((h) => new Figure(h)),\n [second]\n );\n\n return organiseLoops([\n first.contour,\n ...fusedCuts.flatMap((f) => f.allLoops),\n ]);\n }\n }\n }\n\n // We turn the last case in one where the second is full\n let newFigures = cutFigures(new Figure(first.contour), second);\n first.holes.forEach((cut) => {\n newFigures = newFigures.flatMap((c) => cutFigures(c, new Figure(cut)));\n });\n\n return newFigures;\n}\n\nexport function intersectFigures(first: Figure, second: Figure): Figure[] {\n const outerIntersection = intersectLoops(first.contour, second.contour);\n if (!outerIntersection.length) return [];\n\n let out = organiseLoops(outerIntersection);\n out = cutFiguresLists(\n out,\n first.holes.map((h) => new Figure(h))\n );\n\n // Here we need to do the cut in two steps, because the holes might intersect\n return cutFiguresLists(\n out,\n second.holes.map((h) => new Figure(h))\n );\n}\n\nexport function fuseFiguresLists(first: Figure[], second: Figure[]): Figure[] {\n if (!first.length) return second;\n if (!second.length) return first;\n\n if (\n (first.length === 1 && second.length > 1) ||\n (second.length === 1 && first.length > 1)\n ) {\n return fuseIntersectingFigures([...first, ...second]);\n }\n\n if (first.length > 1 && second.length > 1) {\n let out = fuseFiguresLists([first[0]], second);\n\n first.slice(1).forEach((fig) => {\n out = fuseFiguresLists([fig], out);\n });\n return out;\n }\n\n if (first.length === 1 && second.length === 1) {\n return fuseFigures(first[0], second[0]);\n }\n\n return [];\n}\n\nexport function cutFiguresLists(first: Figure[], second: Figure[]): Figure[] {\n if (!first.length) return [];\n if (!second.length) return first;\n\n // The easy case\n if (first.length === 1 && second.length === 1) {\n return cutFigures(first[0], second[0]);\n }\n\n if (first.length > 1) {\n // All the figures here are independant, so we can cut them independently\n return first.flatMap((fig) => cutFiguresLists([fig], second));\n }\n\n // We are now in the case where there is only one figure in the first list\n // and multiple figures in the second list\n //\n // We turn it in the case with (potentially) multiple figures in the first list\n // and one figure in the second list\n\n let out = cutFigures(first[0], second[0]);\n second.slice(1).forEach((fig) => {\n out = cutFiguresLists(out, [fig]);\n });\n return out;\n}\n\nexport function intersectFiguresLists(\n first: Figure[],\n second: Figure[]\n): Figure[] {\n if (!first.length || !second.length) {\n return [];\n }\n\n if (first.length === 1 && second.length === 1) {\n return intersectFigures(first[0], second[0]);\n }\n\n if (first.length > 1) {\n return first.flatMap((fig) => intersectFiguresLists([fig], second));\n }\n\n return second.flatMap((fig) => intersectFiguresLists(first, [fig]));\n}\n","import type { Vector } from \"../definitions.js\";\nimport { BoundingBox } from \"./BoundingBox.js\";\nimport type { Figure } from \"./Figure.js\";\nimport type { TransformationMatrix } from \"./TransformationMatrix.js\";\n\nimport {\n cutFiguresLists,\n fuseFiguresLists,\n intersectFiguresLists,\n} from \"../algorithms/boolean/figureBooleans\";\nimport { combineDifferentValues } from \"../utils/allCombinations.js\";\nimport { Transformable } from \"./utils/Transformable.js\";\nimport { Strand } from \"./Strand.js\";\nimport type { Stroke } from \"./Stroke.js\";\n\nexport class Diagram extends Transformable<Diagram> {\n figures: Figure[];\n\n constructor(figures: Figure[] = [], { ignoreChecks = false } = {}) {\n super();\n if (!ignoreChecks) checkIsValidDiagram(figures);\n this.figures = figures;\n }\n\n private _boundingBox: BoundingBox | null = null;\n\n get isEmpty(): boolean {\n return this.figures.length === 0;\n }\n\n get boundingBox(): BoundingBox {\n if (this.isEmpty) return new BoundingBox();\n if (this._boundingBox === null) {\n let boundingBox = this.figures[0].boundingBox;\n for (const figure of this.figures.slice(1)) {\n boundingBox = boundingBox.merge(figure.boundingBox);\n }\n this._boundingBox = boundingBox;\n }\n return this._boundingBox;\n }\n\n clone(): Diagram {\n return new Diagram(this.figures.map((figure) => figure.clone()));\n }\n\n transform(matrix: TransformationMatrix): Diagram {\n return new Diagram(this.figures.map((figure) => figure.transform(matrix)));\n }\n\n contains(point: Vector): boolean {\n return this.figures.some((figure) => figure.contains(point));\n }\n\n intersects(other: Diagram): boolean {\n return this.figures.some((figure) =>\n other.figures.some((otherFigure) => figure.intersects(otherFigure))\n );\n }\n\n overlappingStrands(other: Diagram | Figure | Stroke): Strand[] {\n return this.figures.flatMap((figure) => {\n if (!(other instanceof Diagram)) {\n return figure.overlappingStrands(other);\n }\n\n return other.figures.flatMap((otherFigure) =>\n figure.overlappingStrands(otherFigure)\n );\n });\n }\n\n fuse(other: Diagram): Diagram {\n return new Diagram(fuseFiguresLists(this.figures, other.figures));\n }\n\n cut(other: Diagram): Diagram {\n return new Diagram(cutFiguresLists(this.figures, other.figures));\n }\n\n intersect(other: Diagram): Diagram {\n return new Diagram(intersectFiguresLists(this.figures, other.figures));\n }\n}\n\nexport function checkIsValidDiagram(figures: Figure[]): void {\n for (const [figure, otherFigure] of combineDifferentValues(figures)) {\n if (figure.intersects(otherFigure)) {\n throw new Error(\"Diagram figures must not intersect\");\n }\n }\n}\n"],"names":["overlap1D","min1","max1","min2","max2","BoundingBox","xMin","yMin","xMax","yMax","point","x","y","other","pointsBoundingBox","points","box","asFixed","p","precision","num","removeDuplicatePoints","p0","p1","DEG2RAD","RAD2DEG","reprVector","vector","sameVector","x0","y0","x1","y1","add","subtract","squareLength","scalarMultiply","scalar","squareDistance","distance","crossProduct","dotProduct","normalize","l","polarToCartesian","r","theta","polarAngle","cartesianToPolar","v","parallel","v1","v2","V1xV2","xLength","yLength","perpendicular","perpendicularClockwise","isOnAxis","direction","center","matMult","m1","m2","a","b","c","d","e","f","g","h","i","j","k","n","o","q","inverse","m","det","transpose","TransformationMatrix","matrix","angle","cos","sin","rotationMatrix","normal","originA","originB","Transformable","transform","factor","axisOrDirection","AbstractSegment","firstPoint","lastPoint","Line","linearPrecision","delta","u","intersection","pointVec","param","splitPoints","allPoints","uniquePoints","xChange","defaultDir","comparisonAxis","index","range","len","zip","arrays","minLength","arr","unitAngle","angularDistance","angle1","angle2","clockwise","relDistance","lineLineParams","line1","line2","squarePrecision","diffPoint","intersectionParam1","intersectionParam2","lineLineIntersection","includeOverlaps","intersectionParams","polarCoordsFromCenter","Arc","ignoreChecks","r2","extendedR","validAngle","tangent","allParams","paramsMap","skipped","nextParam","startParam","arc","threePointsArc","midPoint","chord1","chord2","dir1","dir2","result","tangentArc","tangentAtFirstPoint","chord","dir","projectPointOnLine","line","lineArcIntersection","epsilon","centerOnLine","centerDistance","intersectionPoint","intersections","lineDir","p2","complementArc","handleOverlaps","arc1","arc2","startIndex","arcArcIntersection","centersDistance","radiusSum","radiusDifference","centersVector","isOutsideTangent","orientation","radiusToChord","halfChord","chordVector","EllipseArc","r0","r1","tiltAngle","angleUnits","majorOrdered","radTiltAngle","a2","b2","cosT","sinT","A","B","C","tanTiltAngle","radiRatio","ellipseExtrema","extremaPoints","axis","pPrime","f1","f2","d1","d2","closestPoint","closestPointOnEllipse","complementaryTheta","tgt","modifiedAngle","scaleFactor","svgEllipse","phi","fA","fS","rx","ry","findSVGCenter","x2","y2","s_phi","c_phi","hd_x","hd_y","hs_x","hs_y","x1_","y1_","lambda","rxry","rxy1_","ryx1_","sum_of_sq","coe","cx_","cy_","cx","cy","majorRadius","minorRadius","px","py","tx","ty","ex","ey","qx","qy","t","lineEllipseArcIntersection","lineP","ab","c2","filterIntersectionInRef","discriminant","denominator","sqrtDiscriminant","toString","isAnyArray","value","tag","max","input","options","_options$fromIndex","fromIndex","_options$toIndex","toIndex","maxValue","min","minValue","rescale","output","currentMin","currentMax","_options$min","_options$max","indent","indentData","inspectMatrix","inspectMatrixWithOptions","maxRows","maxColumns","maxNumSize","padMinus","inspectData","rows","columns","maxI","maxJ","loop","formatNumber","formatNumber2","str","fix","exp","installMathOperations","AbstractMatrix","Matrix","arg0","checkRowIndex","outer","checkColumnIndex","checkRowVector","checkColumnVector","checkRowIndices","rowIndices","checkColumnIndices","columnIndices","checkRange","startRow","endRow","startColumn","endColumn","checkNumber","newArray","length","array","name","checkNonEmpty","sumByRow","sum","sumByColumn","sumAll","productByRow","productByColumn","productAll","varianceByRow","unbiased","mean","cols","variance","sum1","sum2","varianceByColumn","varianceAll","size","centerByRow","centerByColumn","centerAll","getScaleByRow","scale","scaleByRow","getScaleByColumn","scaleByColumn","getScaleAll","divider","scaleAll","newRows","newColumns","newData","newMatrix","row","column","random","interval","data","matrix1","matrix2","callback","copy","previousColumn","isEchelonForm","checked","isReducedEchelonForm","iMax","tmp","pivot","row1","row2","temp","column1","column2","by","idx","diag","type","vector2","vector1","dot","Bcolj","s","a11","b11","a12","b12","a21","b21","a22","b22","m3","m4","m5","m6","m7","c00","c01","c10","c11","a00","a01","a02","a10","a20","b00","b01","b02","b10","b20","m8","m9","m10","m11","m12","m13","m14","m15","m16","m17","m18","m19","m20","m21","m22","m23","c02","c12","c20","c21","c22","c1","embed","mat","resultat","blockMult","halfRows","halfCols","middle","first","last","AxI","IxB","compareFunction","compareNumbers","indices","rowIndex","columnIndex","trace","isArrayOfNumbers","element","nRows","nColumns","arrayData","newRow","WrapperMatrix2D","hypotenuse","EigenvalueDecomposition","assumeSymmetric","V","isSymmetric","tred2","tql2","H","ort","orthes","hqr2","X","hh","dl1","c3","el1","s2","tst1","eps","low","high","nn","exshift","norm","z","iter","w","ra","sa","vr","vi","notlast","cdivres","cdiv","xr","xi","yr","yi","solveGenericPolynomial","coefficients","polynomialMatrix","_","eigenValues","ellipseEllipseIntersection","a1","b1","e1","el2","e2","polynomial","denom","bb","cc","sqrt","arcEllipseArcIntersection","ellipseArc","partialArc","ellipseArcEllipseArcIntersection","findIntersections","segment1","segment2","findIntersectionsAndOverlaps","allCombinations","count","combineDifferentValues","AbstractStroke","segments","checkValidStroke","segment","otherSegment","bbox","checkSelfIntersections","segmentIndex","otherSegmentIndex","nextSegment","canExtendSegment","extendSegment","simplifySegments","stroke","foundSimplification","simplifiedSegments","lastSegment","Strand","reversedSegments","strand","newSegments","rayLineIntersectionsCount","IntersectionCounter","isOnSegment","rayArcIntersectionsCount","verticalDistance","squareDist","squareR","squareEpsilon","pointOutsideCircle","counter","rayEllipseArcIntersectionsCount","end","ray","rayIntersectionsCount","Loop","checkValidLoop","vertices","approximateArea","acc","jsonSegment","jsonLoop","jsonFigure","figure","jsonDiagram","diagram","exportJSON","shape","Diagram","Figure","FlatQueue","id","pos","parent","parentValue","top","halfLength","left","right","bestIndex","bestValue","rightValue","ARRAY_TYPES","VERSION","Flatbush","magic","versionAndType","nodeSize","numItems","ArrayType","ArrayBufferType","numNodes","arrayTypeIndex","nodesByteSize","minX","minY","maxX","maxY","boxes","width","height","hilbertValues","hilbertMax","hilbert","sort","nodeIndex","nodeMinX","nodeMinY","nodeMaxX","nodeMaxY","filterFn","queue","results","upperBound","maxResults","maxDistance","maxDistSquared","dx","axisDist","dy","dist","values","swap","D","i0","i1","stitchSegments","startPoints","stitchedSegments","visited","connectedSegments","currentIndex","maxLoops","neighbors","indexDistance","otherIndex","potentialNextSegments","neighborIndex","nextSegmentIndex","contour","holes","checkIsValidFigure","hole","otherLoop","otherStrokes","overlappingSegments","loop1","loop2","hole1","hole2","groupByBoundingBoxOverlap","loops","overlaps","groups","groupsInOverlaps","myGroup","addContainmentInfo","groupedLoops","isIn","potentialOuterLoop","splitMultipleOuterLoops","outerLoops","allLoops","outerLoop","cleanEdgeCases","handleNestedLoops","nestedLoops","firstLevelOuterLoops","innerLevelsLoops","organiseLoops","compounds","allPairs","list1","list2","l1","l2","strandsBetweenIntersections","allIntersections","allCommonSegments","endsAtIntersection","isCommonSegment","commonSegment","currentCurves","rotateToStartAt","start","rotateToStartAtSegment","usedSegments","onSegment","seg","removeNonCrossingPoint","segmentedCurve","loopToCheck","segmentsOfIntersection","isInside","loopIntersectionStrands","second","firstCurvePoints","secondCurvePoints","thisSegments","firstIndex","otherSegments","secondIndex","commonSegmentsPoints","cutCurve","firstCurveSegments","secondCurveSegments","startSegment","startAt","strandsFromFirst","strandsFromSecond","mergeStrandsAsLoop","strands","outStrand","mergeDiscontinuities","inputStrands","discontinuities","lastStrand","groupLoops","endPoints","startPoint","endPoint","extendStrandList","strandList","prependStrandList","loopBooleanOperation","firstInside","secondInside","firstStrandPoint","firstCurveInSecond","secondStrandPoint","secondCurveInFirst","secondStrand","lastWasSame","strandsIn","firstStrand","mergedStrands","strandsOut","firstSegmentPoint","firstSegmentInSecondShape","secondSegmentPoint","secondSegmentInFirstShape","strandToAdd","fuseLoops","cutLoops","intersectLoops","fuseIntersectingFigures","figures","fused","inputFigure","savedFigures","inputOtherFigure","otherFigure","otherIsFused","newFused","fuseFiguresLists","fuseFigures","current","outerFused","inner1Fused","inner2Fused","innerIntersections","cutFigures","cutContour","cutHoles","fusedCuts","newFigures","cut","intersectFigures","outerIntersection","out","cutFiguresLists","fig","intersectFiguresLists","checkIsValidDiagram","boundingBox"],"mappings":"aAEA,SAASA,GACPC,EACAC,EACAC,EACAC,EACS,CACF,OAAAH,GAAQG,GAAQF,GAAQC,CACjC,CAEO,MAAME,EAAY,CAOvB,YACEC,EAAO,IACPC,EAAO,IACPC,EAAO,KACPC,EAAO,KACP,CACA,KAAK,KAAOH,EACZ,KAAK,KAAOC,EACZ,KAAK,KAAOC,EACZ,KAAK,KAAOC,CACd,CAEA,IAAI,OAAgB,CACX,OAAA,KAAK,KAAO,KAAK,IAC1B,CAEA,IAAI,QAAiB,CACZ,OAAA,KAAK,KAAO,KAAK,IAC1B,CAEA,SAASC,EAAwB,CACzB,KAAA,CAACC,EAAGC,CAAC,EAAIF,EACf,OACEV,GAAU,KAAK,KAAM,KAAK,KAAMW,EAAGA,CAAC,GACpCX,GAAU,KAAK,KAAM,KAAK,KAAMY,EAAGA,CAAC,CAExC,CAEA,SAASC,EAA6B,CACpC,OACEb,GAAU,KAAK,KAAM,KAAK,KAAMa,EAAM,KAAMA,EAAM,IAAI,GACtDb,GAAU,KAAK,KAAM,KAAK,KAAMa,EAAM,KAAMA,EAAM,IAAI,CAE1D,CAEA,SAASH,EAA4B,CAC7B,KAAA,CAACC,EAAGC,CAAC,EAAIF,EACf,OAAO,IAAIL,GACT,KAAK,IAAI,KAAK,KAAMM,CAAC,EACrB,KAAK,IAAI,KAAK,KAAMC,CAAC,EAErB,KAAK,IAAI,KAAK,KAAMD,CAAC,EACrB,KAAK,IAAI,KAAK,KAAMC,CAAC,CAAA,CAEzB,CAEA,MAAMC,EAAiC,CACrC,OAAO,IAAIR,GACT,KAAK,IAAI,KAAK,KAAMQ,EAAM,IAAI,EAC9B,KAAK,IAAI,KAAK,KAAMA,EAAM,IAAI,EAC9B,KAAK,IAAI,KAAK,KAAMA,EAAM,IAAI,EAC9B,KAAK,IAAI,KAAK,KAAMA,EAAM,IAAI,CAAA,CAElC,CACF,CAEO,SAASC,GAAkBC,EAA+B,CACxD,OAAAA,EAAO,OAAO,CAACC,EAAKN,IAAUM,EAAI,SAASN,CAAK,EAAG,IAAIL,EAAa,CAC7E,CC1EA,MAAMY,GAAU,CAACC,EAAWC,EAAY,OAAiB,CACvD,IAAIC,EAAMF,EACN,OAAA,KAAK,IAAIA,CAAC,EAAIC,IAAiBC,EAAA,GAC5BA,EAAI,QAAQ,CAAC,KAAK,MAAMD,CAAS,CAAC,CAC3C,EACwB,SAAAE,GACtBN,EACAI,EAAY,KACF,CACV,OAAO,MAAM,KACX,IAAI,IACFJ,EAAO,IAAI,CAAC,CAACO,EAAIC,CAAE,IAAM,CACvB,IAAIN,GAAQK,EAAIH,CAAS,KAAKF,GAAQM,EAAIJ,CAAS,KACnD,CAACG,EAAIC,CAAE,CAAA,CACR,GACD,OAAO,CAAA,CAEb,CCjBa,MAAAC,GAAU,KAAK,GAAK,IACpBC,GAAU,IAAM,KAAK,GAErBC,EAAcC,GAClB,IAAIA,EAAO,CAAC,MAAMA,EAAO,CAAC,KAGtBC,EAAa,CACxB,CAACC,EAAIC,CAAE,EACP,CAACC,EAAIC,CAAE,EACPb,EAAY,OAEL,KAAK,IAAIU,EAAKE,CAAE,GAAKZ,GAAa,KAAK,IAAIW,EAAKE,CAAE,GAAKb,EAGnDc,EAAM,CAAC,CAACJ,EAAIC,CAAE,EAAW,CAACC,EAAIC,CAAE,IACpC,CAACH,EAAKE,EAAID,EAAKE,CAAE,EAGbE,EAAW,CAAC,CAACL,EAAIC,CAAE,EAAW,CAACC,EAAIC,CAAE,IACzC,CAACH,EAAKE,EAAID,EAAKE,CAAE,EAGbG,GAAe,CAAC,CAACxB,EAAGC,CAAC,IACzBD,EAAIA,EAAIC,EAAIA,EAORwB,EAAiB,CAAC,CAACP,EAAIC,CAAE,EAAWO,IACxC,CAACR,EAAKQ,EAAQP,EAAKO,CAAM,EAGrBC,GAAiB,CAC5B,CAACT,EAAIC,CAAE,EACP,CAACC,EAAIC,CAAE,EAAY,CAAC,EAAG,CAAC,KAEhBH,EAAKE,IAAO,GAAKD,EAAKE,IAAO,EAG1BO,EAAW,CAACjB,EAAYC,EAAa,CAAC,EAAG,CAAC,IAC9C,KAAK,KAAKe,GAAehB,EAAIC,CAAE,CAAC,EAGzB,SAAAiB,GAAa,CAACX,EAAIC,CAAE,EAAW,CAACC,EAAIC,CAAE,EAAmB,CAChE,OAAAH,EAAKG,EAAKF,EAAKC,CACxB,CAEgB,SAAAU,GAAW,CAACZ,EAAIC,CAAE,EAAW,CAACC,EAAIC,CAAE,EAAmB,CAC9D,OAAAH,EAAKE,EAAKD,EAAKE,CACxB,CAMO,SAASU,EAAU,CAACb,EAAIC,CAAE,EAAmB,CAClD,MAAMa,EAAIJ,EAAS,CAACV,EAAIC,CAAE,CAAC,EAC3B,MAAO,CAACD,EAAKc,EAAGb,EAAKa,CAAC,CACxB,CAEgB,SAAAC,GAAiBC,EAAWC,EAAuB,CACjE,MAAMnC,EAAI,KAAK,IAAImC,CAAK,EAAID,EACtBjC,EAAI,KAAK,IAAIkC,CAAK,EAAID,EACrB,MAAA,CAAClC,EAAGC,CAAC,CACd,CAEO,SAASmC,GAAW,CAACpC,EAAGC,CAAC,EAAmB,CAC1C,OAAA,KAAK,MAAMA,EAAGD,CAAC,CACxB,CAEO,SAASqC,GAAiBC,EAA6B,CACtD,MAAAJ,EAAIN,EAASU,CAAC,EACdH,EAAQC,GAAWE,CAAC,EAEnB,MAAA,CAACJ,EAAGC,CAAK,CAClB,CAEO,SAASI,GAASC,EAAYC,EAAYjC,EAAY,KAAe,CACpE,MAAAkC,EAAQb,GAAaW,EAAIC,CAAE,EAE3BE,EAAUnB,GAAagB,CAAE,EACzBI,EAAUpB,GAAaiB,CAAE,EAE/B,OAAOC,EAAQA,EAAQC,EAAUC,EAAUpC,EAAYA,CACzD,CAEO,SAASqC,EAAcP,EAAmB,CAC/C,MAAO,CAAC,CAACA,EAAE,CAAC,EAAGA,EAAE,CAAC,CAAC,CACrB,CAEO,SAASQ,GAAuBR,EAAmB,CACxD,MAAO,CAACA,EAAE,CAAC,EAAG,CAACA,EAAE,CAAC,CAAC,CACrB,CAEgB,SAAAS,GAAShD,EAAeiD,EAAmBC,EAAyB,CAC3E,OAAAhC,EAAWgC,EAAQlD,CAAK,GAAKwC,GAAShB,EAAS0B,EAAQlD,CAAK,EAAGiD,CAAS,CACjF,CCvFA,MAAME,GAAU,CAACC,EAAYC,IAAuB,CAC5C,KAAA,CAACC,EAAGC,EAAGC,EAAGC,EAAGC,EAAGC,EAAGC,EAAGC,EAAGC,CAAC,EAAIV,EAC9B,CAACW,EAAGC,EAAG/B,EAAG,EAAGgC,EAAGC,EAAG1D,EAAG2D,EAAGhC,CAAC,EAAIkB,EAC7B,MAAA,CACLC,EAAIS,EAAIR,EAAI,EAAIC,EAAIhD,EACpB8C,EAAIU,EAAIT,EAAIU,EAAIT,EAAIW,EACpBb,EAAIrB,EAAIsB,EAAIW,EAAIV,EAAIrB,EACpBsB,EAAIM,EAAIL,EAAI,EAAIC,EAAInD,EACpBiD,EAAIO,EAAIN,EAAIO,EAAIN,EAAIQ,EACpBV,EAAIxB,EAAIyB,EAAIQ,EAAIP,EAAIxB,EACpByB,EAAIG,EAAIF,EAAI,EAAIC,EAAItD,EACpBoD,EAAII,EAAIH,EAAII,EAAIH,EAAIK,EACpBP,EAAI3B,EAAI4B,EAAIK,EAAIJ,EAAI3B,CAAA,CAExB,EAEMiC,GAAWC,GAAsB,CAC/B,KAAA,CAACf,EAAGC,EAAGC,EAAGC,EAAGC,EAAGC,EAAGC,EAAGC,EAAGC,CAAC,EAAIO,EAC9BC,EAAMhB,GAAKI,EAAII,EAAIH,EAAIE,GAAKN,GAAKE,EAAIK,EAAIH,EAAIC,GAAKJ,GAAKC,EAAII,EAAIH,EAAIE,GAClE,MAAA,EACJF,EAAII,EAAIH,EAAIE,GAAKS,GACjBd,EAAIK,EAAIN,EAAIO,GAAKQ,GACjBf,EAAII,EAAIH,EAAIE,GAAKY,GACjBX,EAAIC,EAAIH,EAAIK,GAAKQ,GACjBhB,EAAIQ,EAAIN,EAAII,GAAKU,GACjBd,EAAIC,EAAIH,EAAIK,GAAKW,GACjBb,EAAII,EAAIH,EAAIE,GAAKU,GACjBf,EAAIK,EAAIN,EAAIO,GAAKS,GACjBhB,EAAII,EAAIH,EAAIE,GAAKa,CAAA,CAEtB,EAEMC,GAAaF,GAAsB,CACjC,KAAA,CAACf,EAAGC,EAAGC,EAAGC,EAAGC,EAAGC,EAAGC,EAAGC,EAAGC,CAAC,EAAIO,EAC7B,MAAA,CAACf,EAAGG,EAAGG,EAAGL,EAAGG,EAAGG,EAAGL,EAAGG,EAAGG,CAAC,CACnC,EAEO,MAAMU,CAAqB,CAGhC,YAAYC,EAAiB,CAFrB,KAAA,QAAkB,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAC,EAG9CA,IAAa,KAAA,QAAU,CAAC,GAAGA,CAAM,EACvC,CAEA,OAA8B,CACrB,OAAA,IAAID,EAAqB,KAAK,OAAO,CAC9C,CAEA,WAAkC,CAC3B,YAAA,QAAUD,GAAU,KAAK,OAAO,EAC9B,IACT,CAEA,SAAgC,CACzB,YAAA,QAAUH,GAAQ,KAAK,OAAO,EAC5B,IACT,CAEA,UAAUnE,EAAWC,EAAiC,CACpD,YAAK,QAAUiD,GAAQ,KAAK,QAAS,CAAC,EAAG,EAAGlD,EAAG,EAAG,EAAGC,EAAG,EAAG,EAAG,CAAC,CAAC,EACzD,IACT,CAEA,OAAOwE,EAAexB,EAAuC,CACrD,MAAAyB,EAAM,KAAK,IAAID,CAAK,EACpBE,EAAM,KAAK,IAAIF,CAAK,EAEpBG,EAAyB,CAACF,EAAK,CAACC,EAAK,EAAGA,EAAKD,EAAK,EAAG,EAAG,EAAG,CAAC,EAE9D,OAAAzB,GAAQ,KAAK,UAAUA,EAAO,CAAC,EAAGA,EAAO,CAAC,CAAC,EAC/C,KAAK,QAAUC,GAAQ,KAAK,QAAS0B,CAAc,EAC/C3B,GAAa,KAAA,UAAU,CAACA,EAAO,CAAC,EAAG,CAACA,EAAO,CAAC,CAAC,EAE1C,IACT,CAEA,SAAgC,CAC9B,YAAK,QAAUC,GAAQ,KAAK,QAAS,CAAC,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,CAAC,CAAC,EAC1D,IACT,CAEA,SAAgC,CAC9B,YAAK,QAAUA,GAAQ,KAAK,QAAS,CAAC,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAC,CAAC,EAC1D,IACT,CAEA,WAAW2B,EAAgB9E,EAAsC,CACzD,KAAA,CAACsD,EAAGC,CAAC,EAAIuB,EAETJ,EAAQ,KAAK,MAAMnB,EAAGD,CAAC,EAEzB,OAAAtD,GAAO,KAAK,UAAUA,EAAM,CAAC,EAAGA,EAAM,CAAC,CAAC,EAC5C,KAAK,OAAO0E,CAAK,EACjB,KAAK,QAAQ,EACR,KAAA,OAAO,CAACA,CAAK,EACd1E,GAAY,KAAA,UAAU,CAACA,EAAM,CAAC,EAAG,CAACA,EAAM,CAAC,CAAC,EACvC,IACT,CAEA,aAAakD,EAAuC,CAC9C,OAAAA,GAAQ,KAAK,UAAUA,EAAO,CAAC,EAAGA,EAAO,CAAC,CAAC,EAC/C,KAAK,QAAUC,GAAQ,KAAK,QAAS,CAAC,GAAI,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,CAAC,CAAC,EAC9DD,GAAa,KAAA,UAAU,CAACA,EAAO,CAAC,EAAG,CAACA,EAAO,CAAC,CAAC,EAC1C,IACT,CAEA,MAAMvB,EAAgBuB,EAAuC,CACvD,OAAAA,GAAQ,KAAK,UAAUA,EAAO,CAAC,EAAGA,EAAO,CAAC,CAAC,EAC/C,KAAK,QAAUC,GAAQ,KAAK,QAAS,CAACxB,EAAQ,EAAG,EAAG,EAAGA,EAAQ,EAAG,EAAG,EAAG,CAAC,CAAC,EACtEuB,GAAa,KAAA,UAAU,CAACA,EAAO,CAAC,EAAG,CAACA,EAAO,CAAC,CAAC,EAE1C,IACT,CAEA,UAAUlD,EAAuB,CACzB,KAAA,CAACC,EAAGC,CAAC,EAAIF,EACT,CAACsD,EAAGC,EAAGC,EAAGC,EAAGC,EAAGC,CAAC,EAAI,KAAK,QACzB,MAAA,CAACL,EAAIrD,EAAIsD,EAAIrD,EAAIsD,EAAGC,EAAIxD,EAAIyD,EAAIxD,EAAIyD,CAAC,CAC9C,CAEA,eAAee,EAAuB,CACpC,KAAM,CAACpB,EAAGC,CAAC,EAAI,KAAK,UAAU,CAAC,KAAK,IAAImB,CAAK,EAAG,KAAK,IAAIA,CAAK,CAAC,CAAC,EAC1D,CAACK,EAASC,CAAO,EAAI,KAAK,UAAU,CAAC,EAAG,CAAC,CAAC,EAChD,OAAO,KAAK,MAAMzB,EAAIyB,EAAS1B,EAAIyB,CAAO,CAC5C,CAEA,kBAA4B,CAC1B,KAAM,CAACzB,EAAS,CAAA,CAAA,CAAAI,CAAC,EAAI,KAAK,QAC1B,OAAOJ,EAAII,EAAI,CACjB,CAEA,aAAsB,CACpB,KAAM,CAACJ,EAAO,CAAA,CAAAG,CAAC,EAAI,KAAK,QACxB,OAAO,KAAK,KAAKH,EAAIA,EAAIG,EAAIA,CAAC,CAChC,CACF,CCjJO,MAAewB,EAAiB,CAErC,WAAWhF,EAAc,CACvB,MAAMiF,EAAY,IAAIV,EAAA,EAAuB,UAAUvE,EAAG,CAAC,EACpD,OAAA,KAAK,UAAUiF,CAAS,CACjC,CAEA,WAAWhF,EAAc,CACvB,MAAMgF,EAAY,IAAIV,EAAA,EAAuB,UAAU,EAAGtE,CAAC,EACpD,OAAA,KAAK,UAAUgF,CAAS,CACjC,CAEA,UAAUjF,EAAWC,EAAc,CACjC,MAAMgF,EAAY,IAAIV,EAAA,EAAuB,UAAUvE,EAAGC,CAAC,EACpD,OAAA,KAAK,UAAUgF,CAAS,CACjC,CAEA,YAAY,CAACjF,EAAGC,CAAC,EAAc,CAC7B,MAAMgF,EAAY,IAAIV,EAAA,EAAuB,UAAUvE,EAAGC,CAAC,EACpD,OAAA,KAAK,UAAUgF,CAAS,CACjC,CAEA,OAAOR,EAAexB,EAAoB,CAClC,MAAAgC,EAAY,IAAIV,EAAA,EAAuB,OAC3CE,EAAQ5D,GACRoC,CAAA,EAEK,OAAA,KAAK,UAAUgC,CAAS,CACjC,CAEA,MAAMC,EAAgBjC,EAAoB,CACxC,MAAMgC,EAAY,IAAIV,EAAA,EAAuB,MAAMW,EAAQjC,CAAM,EAC1D,OAAA,KAAK,UAAUgC,CAAS,CACjC,CAEA,aAAahC,EAAoB,CAC/B,MAAMgC,EAAY,IAAIV,EAAqB,EAAE,aAAatB,CAAM,EACzD,OAAA,KAAK,UAAUgC,CAAS,CACjC,CAIA,OAAOE,EAAsC,IAAKlC,EAAoB,CAC9D,MAAAgC,EAAY,IAAIV,EACtB,OAAIY,IAAoB,IACtBF,EAAU,QAAQ,EACTE,IAAoB,IAC7BF,EAAU,QAAQ,EAERA,EAAA,WAAWE,EAAiBlC,CAAM,EAEvC,KAAK,UAAUgC,CAAS,CACjC,CACF,CCjDO,MAAeG,WAEZJ,EAAiB,CACzB,YAAmBK,EAA2BC,EAAmB,CACzD,QADW,KAAA,WAAAD,EAA2B,KAAA,UAAAC,EAM9C,KAAS,UAAoB,KAJ3B,KAAK,WAAaD,EAClB,KAAK,UAAYC,CACnB,CAMA,IAAI,MAAO,CACT,MAAO,GAAG,KAAK,eAAevE,EAAW,KAAK,UAAU,OAAOA,EAC7D,KAAK,SACP,GACF,CACA,IAAI,MAAO,CACT,OAAO,KAAK,IACd,CA2BA,CAAC,OAAO,IAAI,4BAA4B,CAAC,GAAI,CAC3C,OAAO,KAAK,IACd,CAGF,CCzCO,MAAMwE,UAAaH,EAAsB,CAAzC,aAAA,CAAA,MAAA,GAAA,SAAA,EACS,KAAA,YAAA,OAkBd,KAAQ,GAAoB,KAQ5B,KAAQ,OAAwB,KAShC,KAAQ,YAA6B,KA8BrC,KAAQ,aAAmC,IAAA,CAhE3C,iBAAiB,EAAoB,CAC7B,MAAAI,EAAkB,KAAK,OAAS,KAAK,UAC3C,OAAO,GAAK,CAACA,GAAmB,EAAI,GAAK,CAACA,CAC5C,CAEA,WAAW,EAAmB,CAC5B,OAAOlE,EAAI,KAAK,WAAYG,EAAe,KAAK,EAAG,CAAC,CAAC,CACvD,CAEA,IAAI,QAAiB,CACnB,OAAOG,EAAS,KAAK,WAAY,KAAK,SAAS,CACjD,CAEA,IAAI,cAAuB,CACzB,OAAOD,GAAe,KAAK,WAAY,KAAK,SAAS,CACvD,CAGA,IAAI,GAAY,CACV,OAAA,KAAK,KAAO,OACd,KAAK,GAAKJ,EAAS,KAAK,UAAW,KAAK,UAAU,GAE7C,KAAK,EACd,CAGA,IAAI,OAAgB,CACd,GAAA,KAAK,SAAW,KAAM,CACxB,KAAM,CAACvB,EAAGC,CAAC,EAAI,KAAK,EACpB,KAAK,OAASA,EAAID,CACpB,CACA,OAAO,KAAK,MACd,CAGA,IAAI,YAAqB,CACnB,OAAA,KAAK,cAAgB,OAClB,KAAA,YAAc,KAAK,WAAW,CAAC,EAAI,KAAK,MAAQ,KAAK,WAAW,CAAC,GAEjE,KAAK,WACd,CAEA,IAAI,UAAmB,CACrB,OAAOsB,EAAI,KAAK,WAAYG,EAAe,KAAK,EAAG,EAAG,CAAC,CACzD,CAEA,OAAOvB,EAAyB,CAC9B,OAAMA,aAAiBqF,EAEpBtE,EAAW,KAAK,WAAYf,EAAM,UAAU,GAC3Ce,EAAW,KAAK,UAAWf,EAAM,SAAS,GAC3Ce,EAAW,KAAK,UAAWf,EAAM,UAAU,GAC1Ce,EAAW,KAAK,WAAYf,EAAM,SAAS,EALV,EAOvC,CAEA,OAAc,CACZ,OAAO,IAAIqF,EAAK,KAAK,WAAY,KAAK,SAAS,CACjD,CAEA,SAAgB,CACd,OAAO,IAAIA,EAAK,KAAK,UAAW,KAAK,UAAU,CACjD,CAGA,IAAI,aAA2B,CACzB,OAAA,KAAK,eAAiB,OACxB,KAAK,aAAe,IAAI7F,GACtB,KAAK,IAAI,KAAK,WAAW,CAAC,EAAG,KAAK,UAAU,CAAC,CAAC,EAAI,KAAK,UACvD,KAAK,IAAI,KAAK,WAAW,CAAC,EAAG,KAAK,UAAU,CAAC,CAAC,EAAI,KAAK,UACvD,KAAK,IAAI,KAAK,WAAW,CAAC,EAAG,KAAK,UAAU,CAAC,CAAC,EAAI,KAAK,UACvD,KAAK,IAAI,KAAK,WAAW,CAAC,EAAG,KAAK,UAAU,CAAC,CAAC,EAAI,KAAK,SAAA,GAGpD,KAAK,YACd,CAEA,aAAaK,EAAuB,CAClC,MAAM0F,EAAQlE,EAASxB,EAAO,KAAK,UAAU,EACvC2F,EAAI5D,GAAW2D,EAAO,KAAK,CAAC,EAAI,KAAK,aAE3C,GAAIC,EAAI,EACC,OAAA9D,EAAS7B,EAAO,KAAK,UAAU,EAGxC,GAAI2F,EAAI,EACC,OAAA9D,EAAS7B,EAAO,KAAK,SAAS,EAGjC,MAAA4F,EAAe,KAAK,WAAWD,CAAC,EAC/B,OAAA9D,EAAS7B,EAAO4F,CAAY,CACrC,CACA,YAAY5F,EAAwB,CAClC,GAAIkB,EAAWlB,EAAO,KAAK,WAAY,KAAK,SAAS,EAAU,MAAA,GAC/D,MAAM6F,EAAWrE,EAASxB,EAAO,KAAK,UAAU,EAEhD,GAAI,CAACwC,GAAS,KAAK,EAAGqD,CAAQ,EAAU,MAAA,GAExC,MAAMF,EAAI5D,GAAW8D,EAAU,KAAK,CAAC,EAAI,KAAK,aACvC,OAAA,KAAK,iBAAiBF,CAAC,CAChC,CAEA,WAAWG,EAAuB,CAChC,OAAO,KAAK,CACd,CAEA,UAAU9F,EAAuB,CAC3B,GAAA,CAAC,KAAK,YAAYA,CAAK,EAAS,MAAA,IAAI,MAAM,yBAAyB,EAChE,OAAAgC,EAAU,KAAK,CAAC,CACzB,CAEA,IAAI,cAAe,CACjB,OAAOc,EAAcd,EAAU,KAAK,CAAC,CAAC,CACxC,CAEA,IAAI,qBAA8B,CACzB,OAAAA,EAAU,KAAK,CAAC,CACzB,CAEA,IAAI,oBAA6B,CACxB,OAAAA,EAAU,KAAK,CAAC,CACzB,CAEA,QAAQ3B,EAAmC,CACrC,IAAA0F,EACJ,GAAI,MAAM,QAAQ1F,CAAM,GAAKA,EAAO,SAAW,EAC7C,MAAO,CAAC,IAAI,EAET,MAAM,QAAQA,EAAO,CAAC,CAAC,EAGZ0F,EAAA1F,EAFd0F,EAAc,CAAC1F,CAAgB,EAMrB0F,EAAA,QAAS/F,GAAU,CACzB,GAAA,CAAC,KAAK,YAAYA,CAAK,EACzB,MAAM,IAAI,MACR,SAASgB,EAAWhB,CAAK,uBAAuB,KAAK,MAAA,CACvD,CACH,EAED,MAAMgG,EAAY,CAAC,KAAK,WAAY,GAAGD,EAAa,KAAK,SAAS,EAC5DE,EAAetF,GAAsBqF,CAAS,EAG9CE,EAAU,KAAK,UAAU,CAAC,EAAI,KAAK,WAAW,CAAC,EACjD,IAAAC,EAAa,KAAK,KAAKD,CAAO,EAC9BE,EAAiB,EAErB,OAAI,KAAK,IAAIF,CAAO,EAAI,KAAK,YACdC,EAAA,KAAK,KAAK,KAAK,UAAU,CAAC,EAAI,KAAK,WAAW,CAAC,CAAC,EAC5CC,EAAA,GAGNH,EAAA,KACX,CAAC3C,EAAGC,IAAM4C,GAAc7C,EAAE8C,CAAc,EAAI7C,EAAE6C,CAAc,EAAA,EAGvDH,EAAa,QAAQ,CAACjG,EAAOqG,IAC9BA,IAAUJ,EAAa,OAAS,EAAU,GACvC,IAAIT,EAAKxF,EAAOiG,EAAaI,EAAQ,CAAC,CAAC,CAC/C,CACH,CAEA,UAAU5B,EAAoC,CAC5C,OAAO,IAAIe,EACTf,EAAO,UAAU,KAAK,UAAU,EAChCA,EAAO,UAAU,KAAK,SAAS,CAAA,CAEnC,CACF,CChMA,SAAwB6B,GAAMC,EAAuB,CACnD,OAAO,MAAM,KAAK,MAAMA,CAAG,EAAE,MAAM,CACrC,CCAA,SAAwBC,GACtBC,EAC4D,CACtD,MAAAC,EAAY,KAAK,IAAI,GAAGD,EAAO,IAAKE,GAAQA,EAAI,MAAM,CAAC,EAE7D,OAAOL,GAAMI,CAAS,EAAE,IAAK5C,GAAM2C,EAAO,IAAKE,GAAQA,EAAI7C,CAAC,CAAC,CAAC,CAChE,CCPgB,SAAA8C,GAAUlC,EAAejE,EAAY,KAAM,CACzD,OAAIiE,EAAQ,EACHA,EAAQ,EAAI,KAAK,GAEtBA,GAAS,EAAI,KAAK,GACbA,GAAS,EAAI,KAAK,IAGvBA,EAAQ,EAAI,KAAK,GAAKjE,EACjB,EAGFiE,CACT,CCdO,SAASmC,GACdC,EACAC,EACAC,EACAvG,EAAY,KACZ,CACA,IAAIwG,EAAcF,EAASD,EAU3B,OARIE,IACFC,EAAc,CAACA,GAGbA,EAAc,IAChBA,GAAe,EAAI,KAAK,IAGtBA,EAAc,EAAI,KAAK,GAAKxG,EACvB,EAGFwG,CACT,CChBO,MAAMC,GAAiB,CAC5BC,EACAC,EACA3G,IAMO,CACP,MAAMkC,EAAQb,GAAaqF,EAAM,EAAGC,EAAM,CAAC,EAErCxE,EAAUnB,GAAa0F,EAAM,CAAC,EAC9BtE,EAAUpB,GAAa2F,EAAM,CAAC,EAE9BC,EAAkB5G,EACpBA,EAAYA,EACZ0G,EAAM,UAAYC,EAAM,UAE5B,GAAIzE,EAAQA,EAAQC,EAAUC,EAAUwE,EAC/B,MAAA,WAGT,MAAMC,EAAY9F,EAAS4F,EAAM,WAAYD,EAAM,UAAU,EAEvDI,EAAqBzF,GAAawF,EAAWF,EAAM,CAAC,EAAIzE,EACxD6E,EAAqB1F,GAAawF,EAAWH,EAAM,CAAC,EAAIxE,EAEvD,MAAA,CACL,mBAAA4E,EACA,mBAAAC,CAAA,CAEJ,EAeO,SAASC,GACdN,EACAC,EACAM,EAAkB,GAClBjH,EACsB,CACtB,MAAMkH,EAAqBT,GAAeC,EAAOC,EAAO3G,CAAS,EACjE,GAAIkH,IAAuB,WAAY,CACrC,GAAI,CAACD,EAAwB,OAAA,KACzB,GAAAP,EAAM,OAAOC,CAAK,EAAU,OAAAD,EAEhC,MAAM9G,EAASM,GACb,CACEyG,EAAM,YAAYD,EAAM,UAAU,EAAIA,EAAM,WAAa,KACzDC,EAAM,YAAYD,EAAM,SAAS,EAAIA,EAAM,UAAY,KACvDA,EAAM,YAAYC,EAAM,UAAU,EAAIA,EAAM,WAAa,KACzDD,EAAM,YAAYC,EAAM,SAAS,EAAIA,EAAM,UAAY,IACvD,EAAA,OAAQ5G,GAAMA,IAAM,IAAI,CAAA,EAC1B,KAAK,CAAC8C,EAAGC,IAAMD,EAAE,CAAC,EAAIC,EAAE,CAAC,CAAC,EAE5B,GAAIlD,EAAO,SAAW,EAAU,OAAA,KAAA,GAIvBA,EAAO,SAAW,EAAU,OAAA,KAAA,GAC5BA,EAAO,SAAW,EAAG,OAAO,IAAImF,EAAKnF,EAAO,CAAC,EAAGA,EAAO,CAAC,CAAC,EAEhE,cAAQ,MAAMA,CAAM,EACd,IAAI,MACR,+DAAA,CAGN,CAEM,KAAA,CAAE,mBAAAkH,EAAoB,mBAAAC,CAAuB,EAAAG,EAE/C,MADA,CAACR,EAAM,iBAAiBI,CAAkB,GAC1C,CAACH,EAAM,iBAAiBI,CAAkB,EAAU,KAEjDL,EAAM,WAAWI,CAAkB,CAC5C,CClEA,MAAMK,GAAwB,CAAC5H,EAAekD,IAAmB,CACzD,MAAAjC,EAASO,EAASxB,EAAOkD,CAAM,EACrC,OAAOZ,GAAiBrB,CAAM,CAChC,EAEO,MAAM4G,UAAYxC,EAAqB,CAM5C,YACEC,EACAC,EACArC,EACA8D,EAAY,GACZ,CAAE,aAAAc,EAAe,EAAU,EAAA,GAC3B,CAKA,GAJA,MAAMxC,EAAYC,CAAS,EAZf,KAAA,YAAA,MAsCd,KAAQ,cAOG,KAoCX,KAAQ,eAAgC,KAsCxC,KAAQ,QAAyB,KAQjC,KAAQ,YAA6B,KASrC,KAAQ,WAA4B,KAqDpC,KAAQ,aAAmC,KAhLzC,KAAK,OAASrC,EACd,KAAK,UAAY8D,EAEb,CAACc,EAAc,CACb,GAAA5G,EAAWoE,EAAYC,CAAS,EAC5B,MAAA,IAAI,MAAM,sCAAsC,EAGtD,GAAA,KAAK,IAAI,KAAK,OAAS1D,EAAS,KAAK,UAAW,KAAK,MAAM,CAAC,EAC5D,KAAK,UAEL,MAAM,IAAI,MACR,8CAA8Cb,EAC5CsE,CAAA,SACOtE,EAAWuE,CAAS,cAAcvE,EAAWkC,CAAM,IAAA,CAElE,CACF,CAEA,IAAI,MAAO,CACT,MAAO,OAAOlC,EAAW,KAAK,UAAU,MAAMA,EAC5C,KAAK,eACDA,EAAW,KAAK,MAAM,MAAM,KAAK,UAAY,KAAO,QAC5D,CAUA,IAAI,cAOF,CACI,GAAA,KAAK,gBAAkB,KAAM,CAC/B,KAAM,CAACG,EAAIC,CAAE,EAAI,KAAK,OAChB2G,EAAK,KAAK,OAAS,KAAK,OAE9B,KAAK,cAAgB,CACnB,GAAI,EAAIA,EACR,GAAI,EACJ,GAAI,EAAIA,EACR,EAAG,EAAE,EAAI5G,GAAM4G,EACf,EAAG,EAAE,EAAI3G,GAAM2G,EACf,GAAI5G,EAAKA,EAAKC,EAAKA,EAAK2G,GAAMA,CAAA,CAElC,CACA,OAAO,KAAK,aACd,CAEA,iBAAiB,EAAoB,CACnC,MAAO,GAAI,GAAK,CAAC,KAAK,WAAa,GAAK,CAAC,KAAK,SAChD,CAEA,aAAarD,EAAuB,CAEhC,OAAAmC,GAAgB,KAAK,WAAYD,GAAUlC,CAAK,EAAG,KAAK,SAAS,EACjE,KAAK,aAET,CAGA,IAAI,eAAgB,CACd,OAAC,KAAK,iBACR,KAAK,eAAiBmC,GACpB,KAAK,WACL,KAAK,UACL,KAAK,SAAA,GAGF,KAAK,cACd,CAEA,WAAW,EAAmB,CACrB,OAAAtF,EACL,KAAK,OACLW,GACE,KAAK,OACL,KAAK,WAAa,EAAI,KAAK,eAAiB,KAAK,UAAY,GAAK,EACpE,CAAA,CAEJ,CAEA,aAAalC,EAAuB,CAClC,KAAM,CAACmC,EAAGC,CAAK,EAAIwF,GAAsB5H,EAAO,KAAK,MAAM,EAC3D,GAAI,KAAK,IAAImC,EAAI,KAAK,MAAM,EAAI,KAAK,UACnC,MAAM,IAAI,MACR,SAASnB,EAAWhB,CAAK,uBAAuB,KAAK,MAAA,EAGnD,MAAA8F,EAAQ,KAAK,aAAa1D,CAAK,EACjC,GAAA,CAAC,KAAK,iBAAiB0D,CAAK,EAC9B,MAAM,IAAI,MACR,SAAS9E,EAAWhB,CAAK,uBAAuB,KAAK,MAAA,EAGlD,OAAA8F,CACT,CAGA,IAAI,QAAiB,CACf,OAAA,KAAK,UAAY,OACnB,KAAK,QAAUjE,EAAS,KAAK,WAAY,KAAK,MAAM,GAE/C,KAAK,OACd,CAGA,IAAI,YAAqB,CACnB,GAAA,KAAK,cAAgB,KAAM,CACvB,KAAA,CAAC5B,EAAGC,CAAC,EAAIsB,EAAS,KAAK,WAAY,KAAK,MAAM,EACpD,KAAK,YAAcoF,GAAU,KAAK,MAAM1G,EAAGD,CAAC,CAAC,CAC/C,CACA,OAAO,KAAK,WACd,CAGA,IAAI,WAAoB,CAClB,GAAA,KAAK,aAAe,KAAM,CACtB,KAAA,CAACA,EAAGC,CAAC,EAAIsB,EAAS,KAAK,UAAW,KAAK,MAAM,EACnD,KAAK,WAAaoF,GAAU,KAAK,MAAM1G,EAAGD,CAAC,CAAC,CAC9C,CACA,OAAO,KAAK,UACd,CAEA,IAAI,QAAiB,CACZ,OAAA,KAAK,OAAS,KAAK,aAC5B,CAEA,IAAI,cAAuB,CAClB,OAAA,KAAK,OAAS,KAAK,MAC5B,CAEA,IAAI,UAAmB,CACd,OAAA,KAAK,WAAW,EAAG,CAC5B,CAEA,OAAOE,EAAyB,CAE9B,MADI,EAAEA,aAAiB0H,IACnB,CAAC3G,EAAW,KAAK,OAAQf,EAAM,MAAM,EAAU,GAGhDe,EAAW,KAAK,WAAYf,EAAM,UAAU,GAC3Ce,EAAW,KAAK,UAAWf,EAAM,SAAS,GAC1C,KAAK,YAAcA,EAAM,WAC1Be,EAAW,KAAK,UAAWf,EAAM,UAAU,GAC1Ce,EAAW,KAAK,WAAYf,EAAM,SAAS,GAC3C,KAAK,YAAc,CAACA,EAAM,SAEhC,CAEA,OAAa,CACX,OAAO,IAAI0H,EACT,KAAK,WACL,KAAK,UACL,KAAK,OACL,KAAK,SAAA,CAET,CAEA,SAAe,CACb,OAAO,IAAIA,EACT,KAAK,UACL,KAAK,WACL,KAAK,OACL,CAAC,KAAK,SAAA,CAEV,CAGA,IAAI,aAA2B,CACzB,GAAA,KAAK,eAAiB,KAAM,CACxB,MAAAG,EAAY,KAAK,OAAS,KAAK,UAC/BC,EAAcvD,GAClB,KAAK,iBAAiB,KAAK,aAAaA,CAAK,CAAC,EAChD,KAAK,aAAe,IAAI/E,GACtBsI,EAAW,KAAK,EAAE,EACd,KAAK,OAAO,CAAC,EAAID,EACjB,KAAK,IAAI,KAAK,WAAW,CAAC,EAAG,KAAK,UAAU,CAAC,CAAC,EAAI,KAAK,UAC3DC,EAAW,KAAK,GAAK,GAAG,EACpB,KAAK,OAAO,CAAC,EAAID,EACjB,KAAK,IAAI,KAAK,WAAW,CAAC,EAAG,KAAK,UAAU,CAAC,CAAC,EAAI,KAAK,UAC3DC,EAAW,CAAC,EACR,KAAK,OAAO,CAAC,EAAID,EACjB,KAAK,IAAI,KAAK,WAAW,CAAC,EAAG,KAAK,UAAU,CAAC,CAAC,EAAI,KAAK,UAC3DC,EAAW,KAAK,GAAK,CAAC,EAClB,KAAK,OAAO,CAAC,EAAID,EACjB,KAAK,IAAI,KAAK,WAAW,CAAC,EAAG,KAAK,UAAU,CAAC,CAAC,EAAI,KAAK,SAAA,CAE/D,CACA,OAAO,KAAK,YACd,CAEA,aAAahI,EAAuB,CAClC,KAAM,CAACmC,EAAGC,CAAK,EAAIwF,GAAsB5H,EAAO,KAAK,MAAM,EAC3D,OAAI,KAAK,iBAAiB,KAAK,aAAaoC,CAAK,CAAC,EACzC,KAAK,IAAID,EAAI,KAAK,MAAM,EAE1B,KAAK,KACV,KAAK,IACHP,GAAe5B,EAAO,KAAK,UAAU,EACrC4B,GAAe5B,EAAO,KAAK,SAAS,CACtC,CAAA,CAEJ,CAEA,YAAYA,EAAwB,CAC9B,GAAAkB,EAAWlB,EAAO,KAAK,UAAU,GAAKkB,EAAWlB,EAAO,KAAK,SAAS,EACjE,MAAA,GACT,KAAM,CAACmC,EAAGC,CAAK,EAAIwF,GAAsB5H,EAAO,KAAK,MAAM,EAC3D,GAAI,KAAK,IAAImC,EAAI,KAAK,MAAM,EAAI,KAAK,UAAkB,MAAA,GAEjD,MAAA2D,EAAQ,KAAK,aAAa1D,CAAK,EAC9B,OAAA,KAAK,iBAAiB0D,CAAK,CACpC,CAEA,WAAWA,EAAuB,CAC1B,MAAA1D,EACJ,KAAK,WAAa0D,EAAQ,KAAK,eAAiB,KAAK,UAAY,GAAK,GAClE3D,EAAI,KAAK,OAAS,KAAK,cAEvBlC,EAAI,CAACkC,EAAI,KAAK,IAAIC,CAAK,EACvBlC,EAAIiC,EAAI,KAAK,IAAIC,CAAK,EAErB,OAAA,KAAK,UAAY,CAAC,CAACnC,EAAG,CAACC,CAAC,EAAI,CAACD,EAAGC,CAAC,CAC1C,CAEA,UAAUF,EAAuB,CAC/B,KAAM,CAACmC,EAAGC,CAAK,EAAIwF,GAAsB5H,EAAO,KAAK,MAAM,EAC3D,GAAI,KAAK,IAAImC,EAAI,KAAK,MAAM,EAAI,KAAK,UAC7B,MAAA,IAAI,MAAM,yBAAyB,EAErC,MAAA2D,EAAQ,KAAK,aAAa1D,CAAK,EACjC,GAAA,CAAC,KAAK,iBAAiB0D,CAAK,EACxB,MAAA,IAAI,MAAM,yBAAyB,EAErC,MAAAoC,EAAUhG,GAAiB,EAAGE,CAAK,EAElC,OADK,KAAK,UAAYW,GAAyBD,GAC3Cd,EAAUkG,CAAO,CAAC,CAC/B,CAEA,IAAI,qBAA8B,CAChC,MAAMA,EAAUhG,GAAiB,EAAG,KAAK,UAAU,EAE5C,OADK,KAAK,UAAYa,GAAyBD,GAC3Cd,EAAUkG,CAAO,CAAC,CAC/B,CAEA,IAAI,oBAA6B,CAC/B,MAAMA,EAAUhG,GAAiB,EAAG,KAAK,SAAS,EAE3C,OADK,KAAK,UAAYa,GAAyBD,GAC3Cd,EAAUkG,CAAO,CAAC,CAC/B,CAEA,QAAQ7H,EAAkC,CACpC,IAAA0F,EACJ,GAAI,MAAM,QAAQ1F,CAAM,GAAKA,EAAO,SAAW,EAC7C,MAAO,CAAC,IAAI,EAET,MAAM,QAAQA,EAAO,CAAC,CAAC,EAGZ0F,EAAA1F,EAFd0F,EAAc,CAAC1F,CAAgB,EAQjC,MAAM8H,EAAY,CAAC,EAAG,EAAG,GAFLpC,EAAY,IAAK/F,GAAU,KAAK,aAAaA,CAAK,CAAC,CAEhC,EAIjCoI,EAAY,IAAI,IACpB5B,GAAI,CAAC2B,EAAW,CAAC,KAAK,WAAY,KAAK,UAAW,GAAGpC,CAAW,CAAC,CAAC,CAAA,EAKpEoC,EAAU,KAAK,CAAC7E,EAAGC,IAAMD,EAAIC,CAAC,EAE9B,IAAI8E,EAAyB,KAC7B,OAAOF,EAAU,QAAQ,CAACrC,EAAOO,IAAU,CACrC,GAAAA,IAAU8B,EAAU,OAAS,EAAG,MAAO,GACrC,MAAAG,EAAYH,EAAU9B,EAAQ,CAAC,EAEjC,GAAAiC,EAAYxC,EAAQ,KAAK,UAC3B,OAAIuC,IAAY,OAAgBA,EAAAvC,GACzB,GAGH,MAAAyC,EAAaF,IAAY,KAAOvC,EAAQuC,EACxCG,EAAM,IAAIX,EACdO,EAAU,IAAIG,CAAU,GAAK,KAAK,WAAWA,CAAU,EACvDH,EAAU,IAAIE,CAAS,GAAK,KAAK,WAAWA,CAAS,EACrD,KAAK,OACL,KAAK,SAAA,EAEG,OAAAD,EAAA,KACHG,CAAA,CACR,CACH,CAEA,UAAU/D,EAAmC,CAC3C,OAAO,IAAIoD,EACTpD,EAAO,UAAU,KAAK,UAAU,EAChCA,EAAO,UAAU,KAAK,SAAS,EAC/BA,EAAO,UAAU,KAAK,MAAM,EAC5BA,EAAO,iBAAiB,EAAI,KAAK,UAAY,CAAC,KAAK,SAAA,CAEvD,CACF,CAEgB,SAAAgE,GACdnD,EACAoD,EACAnD,EACA,CACA,MAAMoD,EAAS,IAAInD,EAAKkD,EAAUpD,CAAU,EACtCsD,EAAS,IAAIpD,EAAKkD,EAAUnD,CAAS,EAErCsD,EAAO/F,EAAc6F,EAAO,mBAAmB,EAC/CG,EAAOhG,EAAc8F,EAAO,kBAAkB,EAE9CG,EAAS7B,GACb,CAAE,WAAYyB,EAAO,SAAU,EAAGE,EAAM,UAAW,IAAK,EACxD,CAAE,WAAYD,EAAO,SAAU,EAAGE,EAAM,UAAW,IAAK,CAAA,EAG1D,GAAIC,IAAW,WACP,MAAA,IAAI,MAAM,iDAAiD,EAEnE,MAAM/B,EACJlF,GACEN,EAAS8D,EAAYoD,CAAQ,EAC7BlH,EAAS+D,EAAWmD,CAAQ,CAC1B,EAAA,EAEN,OAAO,IAAIb,EACTvC,EACAC,EACAhE,EAAIoH,EAAO,SAAUjH,EAAemH,EAAME,EAAO,kBAAkB,CAAC,EACpE/B,EACA,CAAE,aAAc,EAAK,CAAA,CAEzB,CAEgB,SAAAgC,GACd1D,EACAC,EACA0D,EACA,CACA,MAAMC,EAAQ,IAAI1D,EAAKD,EAAWD,CAAU,EACtC6D,EAAMrG,EAAcoG,EAAM,mBAAmB,EAE7CH,EAAS7B,GACb,CAAE,WAAYgC,EAAM,SAAU,EAAGC,EAAK,UAAW,IAAK,EACtD,CACE,WAAA7D,EACA,EAAGxC,EAAcmG,CAAmB,EACpC,UAAW,IACb,CAAA,EAGF,GAAIF,IAAW,WACP,MAAA,IAAI,MAAM,iDAAiD,EAEnE,MAAM7F,EAAS3B,EACb2H,EAAM,SACNxH,EAAeyH,EAAKJ,EAAO,kBAAkB,CAAA,EAGzC/B,EACJlF,GACEN,EAAS0B,EAAQoC,CAAU,EAC3B9D,EAAS0B,EAAQ3B,EAAI+D,EAAY2D,CAAmB,CAAC,CACnD,EAAA,EAEN,OAAO,IAAIpB,EAAIvC,EAAYC,EAAWrC,EAAQ8D,EAAW,CACvD,aAAc,EAAA,CACf,CACH,CCzagB,SAAAoC,GAAmBC,EAAYrJ,EAAuB,CACpE,MAAM0F,EAAQlE,EAASxB,EAAOqJ,EAAK,UAAU,EACvC1D,EAAI5D,GAAW2D,EAAO2D,EAAK,CAAC,EAAIA,EAAK,aACpC,OAAAA,EAAK,WAAW1D,CAAC,CAC1B,CCHgB,SAAA2D,GACdD,EACAb,EACA/H,EACU,CACJ,MAAA8I,EAAU9I,GAAwB4I,EAAK,UAEvCG,EAAeJ,GAAmBC,EAAMb,EAAI,MAAM,EAClDiB,EAAiB5H,EAAS2H,EAAchB,EAAI,MAAM,EAGpD,GAAAiB,EAAiBjB,EAAI,OAASe,EAAS,MAAO,GAGlD,GAAI,KAAK,IAAIE,EAAiBjB,EAAI,MAAM,EAAIe,EAAS,CACnD,MAAMG,EAAoBF,EAC1B,OACEH,EAAK,YAAYK,CAAiB,GAClClB,EAAI,YAAYkB,CAAiB,EAE1B,CAACA,CAAiB,EAEpB,EACT,CAGA,MAAMC,EAAgB,CAAA,EAIhBjE,EAAQ,KAAK,KACjB8C,EAAI,OAASA,EAAI,OAASiB,EAAiBA,CAAA,EAKvCG,EAAUP,EAAK,oBACfxI,EAAKU,EAAIiI,EAAc9H,EAAekI,EAASlE,CAAK,CAAC,EACvD2D,EAAK,YAAYxI,CAAE,GAAK2H,EAAI,YAAY3H,CAAE,GAC5C8I,EAAc,KAAK9I,CAAE,EAGvB,MAAMgJ,EAAKtI,EAAIiI,EAAc9H,EAAekI,EAAS,CAAClE,CAAK,CAAC,EAC5D,OAAI2D,EAAK,YAAYQ,CAAE,GAAKrB,EAAI,YAAYqB,CAAE,GAC5CF,EAAc,KAAKE,CAAE,EAGhBF,CACT,CCzCA,MAAMG,GAAiBtB,GAAkB,CACvC,KAAM,CAAE,WAAAlD,EAAY,UAAAC,EAAW,OAAArC,EAAQ,UAAA8D,GAAcwB,EACrD,OAAO,IAAIX,EAAItC,EAAWD,EAAYpC,EAAQ8D,EAAW,CACvD,aAAc,EAAA,CACf,CACH,EAEM+C,GAAiB,CAACC,EAAWC,IAAqB,CAElD,GAAAD,EAAK,OAAOC,CAAI,EAClB,MAAO,CAACD,CAAI,EAId,MAAM3J,EAASM,GACb,CACEsJ,EAAK,YAAYD,EAAK,UAAU,EAAIA,EAAK,WAAa,KACtDC,EAAK,YAAYD,EAAK,SAAS,EAAIA,EAAK,UAAY,KACpDA,EAAK,YAAYC,EAAK,UAAU,EAAIA,EAAK,WAAa,KACtDD,EAAK,YAAYC,EAAK,SAAS,EAAIA,EAAK,UAAY,IACpD,EAAA,OAAQzJ,GAAMA,IAAM,IAAI,CAG1B,EAAA,KAAK,CAAC8C,EAAGC,IAAMyG,EAAK,aAAa1G,CAAC,EAAI0G,EAAK,aAAazG,CAAC,CAAC,EAE5D,GAAIlD,EAAO,SAAW,EAAG,MAAO,GAAC,GAKxBA,EAAO,SAAW,EAAG,MAAO,GAC5B,GAAAA,EAAO,SAAW,EAEzB,OAAI2J,EAAK,OAAOF,GAAcG,CAAI,CAAC,EAAU,GACtC,CAAC,IAAIpC,EAAIxH,EAAO,CAAC,EAAGA,EAAO,CAAC,EAAG2J,EAAK,OAAQA,EAAK,SAAS,CAAC,EACpE,GAAW3J,EAAO,SAAW,EAAG,CAE9B,MAAM6J,EACJhJ,EAAWb,EAAO,CAAC,EAAG4J,EAAK,SAAS,GACpC/I,EAAWb,EAAO,CAAC,EAAG4J,EAAK,UAAU,EACjC,EACA,EACC,MAAA,CACL,IAAIpC,EACFxH,EAAO,EAAI6J,CAAU,EACrB7J,EAAO,EAAI6J,CAAU,EACrBF,EAAK,OACLA,EAAK,SACP,CAAA,CACF,SACS3J,EAAO,SAAW,EACpB,MAAA,CACL,IAAIwH,EAAIxH,EAAO,CAAC,EAAGA,EAAO,CAAC,EAAG2J,EAAK,OAAQA,EAAK,SAAS,EACzD,IAAInC,EAAIxH,EAAO,CAAC,EAAGA,EAAO,CAAC,EAAG2J,EAAK,OAAQA,EAAK,SAAS,CAAA,EAGvD,MAAA,IAAI,MAAM,sCAAsC,CACxD,EAEO,SAASG,GACdH,EACAC,EACAvC,EAAkB,GAClBjH,EACkB,CACZ,MAAA8I,EAAU9I,GAAwBuJ,EAAK,UACvCI,EAAkBvI,EAASmI,EAAK,OAAQC,EAAK,MAAM,EAEnDI,EAAYL,EAAK,OAASC,EAAK,OAGjC,GAAAG,EAAkBC,EAAYd,EAChC,MAAO,GAGT,MAAMe,EAAmB,KAAK,IAAIN,EAAK,OAASC,EAAK,MAAM,EAGvD,GAAAG,EAAkBE,EAAmBf,EACvC,MAAO,GAIT,GAAIa,EAAkBb,EACpB,OAAIe,EAAmBf,EACd,GAEF7B,EAGEqC,GAAeC,EAAMC,CAAI,EAFvB,GAMb,MAAMM,EAAgBvI,EAAUR,EAASyI,EAAK,OAAQD,EAAK,MAAM,CAAC,EAE5DQ,EAAmBJ,EAAkBC,EAAYd,EACvD,GAEEiB,GAEA,KAAK,IAAIJ,EAAkBE,CAAgB,EAAIf,EAC/C,CACA,MAAMkB,EAAcD,GAAoBR,EAAK,OAASC,EAAK,OAAS,EAAI,GAClEP,EAAoBnI,EACxByI,EAAK,OACLtI,EAAe6I,EAAeE,EAAcT,EAAK,MAAM,CAAA,EAGzD,OACEA,EAAK,YAAYN,CAAiB,GAClCO,EAAK,YAAYP,CAAiB,EAE3B,CAACA,CAAiB,EAElB,EAEX,CAGA,MAAMgB,EACHV,EAAK,OAASA,EAAK,QAAW,EAAII,GAClCH,EAAK,OAASA,EAAK,QAAW,EAAIG,GACnCA,EAAkB,EAEd1B,EAAWnH,EACfyI,EAAK,OACLtI,EAAe6I,EAAeG,CAAa,CAAA,EAGvCC,EAAY,KAAK,KACrBX,EAAK,OAASA,EAAK,OAASU,EAAgBA,CAAA,EAGxCE,EAAc9H,EAAcyH,CAAa,EAEzC1J,EAAKU,EAAImH,EAAUhH,EAAekJ,EAAaD,CAAS,CAAC,EACzDd,EAAKtI,EAAImH,EAAUhH,EAAekJ,EAAa,CAACD,CAAS,CAAC,EAE1DhB,EAAgB,CAAA,EACtB,OAAIK,EAAK,YAAYnJ,CAAE,GAAKoJ,EAAK,YAAYpJ,CAAE,GAC7C8I,EAAc,KAAK9I,CAAE,EAEnBmJ,EAAK,YAAYH,CAAE,GAAKI,EAAK,YAAYJ,CAAE,GAC7CF,EAAc,KAAKE,CAAE,EAGhBF,CACT,CC1IO,MAAMkB,UAAmBxF,EAA4B,CAa1D,YACEC,EACAC,EACArC,EACA4H,EACAC,EACAC,EACAhE,EAAY,GACZ,CACE,aAAAc,EAAe,GACf,WAAAmD,EAAa,KACf,EAA4D,GAC5D,CACA,MAAM3F,EAAYC,CAAS,EAzBf,KAAA,YAAA,cAIF,KAAA,UAAA,KAiEZ,KAAQ,cAOG,KAhDT,KAAK,OAASrC,EAEd,MAAMgI,EAAeJ,GAAMC,EAEtB,KAAA,YAAcG,EAAeJ,EAAKC,EAClC,KAAA,YAAcG,EAAeH,EAAKD,EAEvC,MAAMK,EAAeF,IAAe,MAAQD,EAAYlK,GAAUkK,EAMlE,GALA,KAAK,UAAYpE,GACfsE,EAAeC,EAAeA,EAAe,KAAK,GAAK,CAAA,EAEzD,KAAK,UAAYnE,EAEb,CAACc,EAAc,CACb,GAAA5G,EAAWoE,EAAYC,CAAS,EAC5B,MAAA,IAAI,MAAM,sCAAsC,EAGxD,GAAI,CAAC,KAAK,iBAAiBD,CAAU,EACnC,MAAM,IAAI,MACR,eAAetE,EACbsE,CAAA,mCACiC,KAAK,MAAA,EAG5C,GAAI,CAAC,KAAK,iBAAiBC,CAAS,EAClC,MAAM,IAAI,MACR,cAAcvE,EAAWuE,CAAS,mCAChC,KAAK,MAAA,EAKP,GAAA,KAAK,IAAI,KAAK,YAAc,KAAK,WAAW,EAAI,KAAK,UACvD,MAAM,IAAI,MACR,uDAAA,CAGN,CACF,CAUA,IAAI,cAOF,CACI,GAAA,KAAK,gBAAkB,KAAM,CAC/B,KAAM,CAACpE,EAAIC,CAAE,EAAI,KAAK,OAChBgK,EAAK,KAAK,YAAc,KAAK,YAC7BC,EAAK,KAAK,YAAc,KAAK,YAE7BC,EAAO,KAAK,IAAI,KAAK,SAAS,EAC9BC,EAAO,KAAK,IAAI,KAAK,SAAS,EAE9BC,EAAIJ,EAAKG,EAAOA,EAAOF,EAAKC,EAAOA,EACnCG,EAAI,GAAKJ,EAAKD,GAAMG,EAAOD,EAC3BI,EAAIN,EAAKE,EAAOA,EAAOD,EAAKE,EAAOA,EAEzC,KAAK,cAAgB,CACnB,GAAIC,EACJ,GAAIC,EACJ,GAAIC,EACJ,EAAG,GAAKF,EAAIrK,EAAKsK,EAAIrK,EACrB,EAAG,GAAKsK,EAAItK,EAAKqK,EAAItK,EACrB,EAAGqK,EAAIrK,EAAKA,EAAKsK,EAAItK,EAAKC,EAAKsK,EAAItK,EAAKA,EAAKgK,EAAKC,CAAA,CAEtD,CACA,OAAO,KAAK,aACd,CAEA,IAAI,MAAO,CACT,MAAO,eAAerK,EAAW,KAAK,UAAU,MAAMA,EACpD,KAAK,SAAA,MACDA,EAAW,KAAK,MAAM,MAAM,KAAK,gBAAgB,KAAK,gBAC1D,KAAK,UAAYD,OACd,KAAK,UAAY,KAAO,QAC/B,CAEA,SAAsB,CACpB,OAAO,IAAI8J,EACT,KAAK,UACL,KAAK,WACL,KAAK,OACL,KAAK,YACL,KAAK,YACL,KAAK,UACL,CAAC,KAAK,UACN,CAAE,aAAc,GAAM,WAAY,KAAM,CAAA,CAE5C,CAEA,OAAoB,CAClB,OAAO,IAAIA,EACT,KAAK,WACL,KAAK,UACL,KAAK,OACL,KAAK,YACL,KAAK,YACL,KAAK,UACL,KAAK,UACL,CAAE,aAAc,GAAM,WAAY,KAAM,CAAA,CAE5C,CAEQ,uBAAkC,CACxC,MAAMc,EAAe,KAAK,IAAI,KAAK,SAAS,EACtCC,EAAY,KAAK,YAAc,KAAK,YACpCnJ,EAAK,CAAC,KAAK,KAAKmJ,EAAYD,CAAY,EACxCjJ,EAAK,KAAK,KAAKkJ,EAAYD,CAAY,EAGtC,MAFe,CAAClJ,EAAI,KAAK,GAAKA,EAAIC,EAAI,KAAK,GAAKA,CAAE,EAGtD,IAAKgC,GAAU,KAAK,aAAaA,CAAK,CAAC,EACvC,OAAQoB,GAAU,KAAK,iBAAiBA,CAAK,CAAC,EAC9C,IAAKA,GAAU,KAAK,WAAWA,CAAK,CAAC,CAC1C,CAGA,IAAI,aAA2B,CACzB,GAAA,KAAK,eAAiB,OAAW,CAC7B,MAAA+F,EAAiB,KAAK,wBACtBC,EAAgB,CACpB,KAAK,WACL,KAAK,UACL,GAAGD,CAAA,EAEA,KAAA,aAAezL,GAAkB0L,CAAa,CACrD,CAEA,OAAO,KAAK,YACd,CAGA,IAAI,mBAA4B,CAC1B,OAAA,KAAK,qBAAuB,SAC9B,KAAK,mBAAqB,KAAK,KAC7B,KAAK,YAAc,KAAK,YACtB,KAAK,YAAc,KAAK,WAAA,GAGvB,KAAK,kBACd,CAGA,IAAI,aAAsB,CACpB,OAAA,KAAK,eAAiB,SACnB,KAAA,aAAe,KAAK,kBAAoB,KAAK,aAE7C,KAAK,YACd,CAGA,IAAI,QAA2B,CACzB,GAAA,KAAK,UAAY,OAAW,CAC9B,MAAMC,EAAO,KAAK,UAClB,KAAK,QAAU,CACbxK,EAAI,KAAK,OAAQG,EAAeqK,EAAM,KAAK,iBAAiB,CAAC,EAC7DxK,EAAI,KAAK,OAAQG,EAAeqK,EAAM,CAAC,KAAK,iBAAiB,CAAC,CAAA,CAElE,CAEA,OAAO,KAAK,OACd,CAEA,IAAI,WAAoB,CACf,OAAA7J,GAAiB,EAAG,KAAK,SAAS,CAC3C,CAEA,WAAW,EAAmB,CACtB,MAAAwC,EACJ,KAAK,WAAa,EAAI,KAAK,YAAc,KAAK,UAAY,GAAK,GAC1D,OAAA,KAAK,sCAAsC,UAAU,CAC1D,KAAK,YAAc,KAAK,IAAIA,CAAK,EACjC,KAAK,YAAc,KAAK,IAAIA,CAAK,CAAA,CAClC,CACH,CAEA,aAAa1E,EAAuB,CAClC,GAAI,CAAC,KAAK,iBAAiBA,CAAK,EAC9B,MAAM,IAAI,MACR,SAASgB,EAAWhB,CAAK,mCAAmC,KAAK,MAAA,EAIrE,MAAM8F,EAAQ,KAAK,aAAa,KAAK,WAAW9F,CAAK,CAAC,EAClD,GAAA,CAAC,KAAK,iBAAiB8F,CAAK,EAC9B,MAAM,IAAI,MACR,SAAS9E,EAAWhB,CAAK,uBAAuB,KAAK,MAAA,EAGlD,OAAA8F,CACT,CAEA,IAAI,UAAmB,CACd,OAAA,KAAK,WAAW,EAAG,CAC5B,CAEA,iBAAiB,EAAoB,CACnC,MAAO,GAAI,GAAK,CAAC,KAAK,WAAa,GAAK,CAAC,KAAK,SAChD,CAEA,OAAO3F,EAA4B,CASjC,OAPEe,EAAW,KAAK,OAAQf,EAAM,MAAM,GACpC,KAAK,IAAI,KAAK,YAAcA,EAAM,WAAW,EAAI,KAAK,WACtD,KAAK,IAAI,KAAK,YAAcA,EAAM,WAAW,EAAI,KAAK,YACrD,KAAK,IAAI,KAAK,UAAYA,EAAM,SAAS,EAAI,KAAK,WACjD,KAAK,IAAI,KAAK,IAAI,KAAK,UAAYA,EAAM,SAAS,EAAI,KAAK,EAAE,EAC3D,KAAK,aAIPe,EAAW,KAAK,WAAYf,EAAM,UAAU,GAC5C,KAAK,YAAcA,EAAM,WACxBe,EAAW,KAAK,WAAYf,EAAM,SAAS,GAC1C,KAAK,YAAcA,EAAM,UAEjC,CAEA,WAAWH,EAAuB,CAChC,MAAMgM,EAAS,KAAK,+BAA+B,UAAUhM,CAAK,EAC5DoC,EAAQ,KAAK,MACjB4J,EAAO,CAAC,EAAI,KAAK,YACjBA,EAAO,CAAC,EAAI,KAAK,WAAA,EAEnB,OAAOpF,GAAUxE,CAAK,CACxB,CACA,aAAasC,EAAuB,CAEhC,OAAAmC,GAAgB,KAAK,WAAYD,GAAUlC,CAAK,EAAG,KAAK,SAAS,EACjE,KAAK,UAET,CAEQ,iBAAiB1E,EAAwB,CAC/C,KAAM,CAACiM,EAAIC,CAAE,EAAI,KAAK,OAEhBC,EAAKtK,EAAS7B,EAAOiM,CAAE,EACvBG,EAAKvK,EAAS7B,EAAOkM,CAAE,EAEtB,OAAA,KAAK,IAAI,EAAI,KAAK,YAAcC,EAAKC,CAAE,EAAI,KAAK,SACzD,CAEA,YAAYpM,EAAwB,CAClC,OAAK,KAAK,iBAAiBA,CAAK,EAGzB,KAAK,iBAAiB,KAAK,aAAa,KAAK,WAAWA,CAAK,CAAC,CAAC,EAF7D,EAGX,CAEA,aAAaA,EAAuB,CAC9B,IAAAqM,EAkBA,GAjBAnL,EAAWlB,EAAO,KAAK,MAAM,EAChBqM,EAAA9K,EACb,KAAK,OACLG,EAAeoB,EAAc,KAAK,SAAS,EAAG,KAAK,WAAW,CAAA,EAGhEuJ,EAAe,KAAK,sCAAsC,UACxDC,GACE,KAAK,YACL,KAAK,YACL,KAAK,+BAA+B,UAAUtM,CAAK,CACrD,CAAA,EAMA,KAAK,iBAAiB,KAAK,aAAa,KAAK,WAAWA,CAAK,CAAC,CAAC,EAC1D,OAAA6B,EAAS7B,EAAOqM,CAAY,KAC1BrJ,GAAShD,EAAO,KAAK,UAAW,KAAK,MAAM,EAAG,CACvD,MAAMuM,EAAqB3F,GACzB,EAAI,KAAK,GAAK,KAAK,WAAW5G,CAAK,CAAA,EAE/B8F,EAAQ,KAAK,aAAayG,CAAkB,EAC9C,GAAA,KAAK,iBAAiBzG,CAAK,EAC7B,OAAOjE,EAAS7B,EAAO,KAAK,WAAW8F,CAAK,CAAC,CAEjD,CACA,OAAO,KAAK,IACVjE,EAAS7B,EAAO,KAAK,UAAU,EAC/B6B,EAAS7B,EAAO,KAAK,SAAS,CAAA,CAElC,CAGA,IAAI,gCAAuD,CACrD,OAAA,KAAK,kCAAoC,SAC3C,KAAK,gCAAkC,IAAIwE,EAAA,EACxC,OAAO,CAAC,KAAK,SAAS,EACtB,UAAU,CAAC,KAAK,OAAO,CAAC,EAAG,CAAC,KAAK,OAAO,CAAC,CAAC,GAExC,KAAK,+BACd,CAKA,IAAI,uCAA8D,CAC5D,OAAA,KAAK,yCAA2C,SAClD,KAAK,uCAAyC,IAAIA,EAC/C,EAAA,UAAU,KAAK,OAAO,CAAC,EAAG,KAAK,OAAO,CAAC,CAAC,EACxC,OAAO,KAAK,SAAS,GAEnB,KAAK,sCACd,CAGA,IAAI,iCAAwD,CACtD,OAAA,KAAK,mCAAqC,SACvC,KAAA,iCAAmC,IAAIA,EAAA,EAAuB,OACjE,KAAK,SAAA,GAGF,KAAK,gCACd,CAGA,IAAI,YAAqB,CACnB,OAAA,KAAK,cAAgB,SACvB,KAAK,YAAc,KAAK,WAAW,KAAK,UAAU,GAE7C,KAAK,WACd,CAGA,IAAI,WAAoB,CAClB,OAAA,KAAK,aAAe,SACtB,KAAK,WAAa,KAAK,WAAW,KAAK,SAAS,GAE3C,KAAK,UACd,CAGA,IAAI,YAAqB,CACnB,OAAA,KAAK,cAAgB,SACvB,KAAK,YAAcqC,GACjB,KAAK,WACL,KAAK,UACL,KAAK,SAAA,GAGF,KAAK,WACd,CAEA,SAAS7G,EAAuB,CACxB,MAAAwM,EAAM,KAAK,UAAUxM,CAAK,EAChC,OAAO,KAAK,UAAY8C,EAAc0J,CAAG,EAAIzJ,GAAuByJ,CAAG,CACzE,CAEA,WAAW1G,EAAuB,CAC1B,MAAApB,EACJ,KAAK,WAAaoB,EAAQ,KAAK,YAAc,KAAK,UAAY,GAAK,GAE/D7F,EAAI,CAAC,KAAK,YAAc,KAAK,WAAa,KAAK,IAAIyE,CAAK,EACxDxE,EAAI,KAAK,YAAc,KAAK,WAAa,KAAK,IAAIwE,CAAK,EAEvD8H,EAAc,KAAK,UAAY,CAAC,CAACvM,EAAG,CAACC,CAAC,EAAI,CAACD,EAAGC,CAAC,EAC9C,OAAA,KAAK,gCAAgC,UAAUsM,CAAG,CAC3D,CAEA,UAAUxM,EAAuB,CACzB,MAAA0E,EAAQ,KAAK,WAAW1E,CAAK,EAE7BC,EAAI,CAAC,KAAK,YAAc,KAAK,IAAIyE,CAAK,EACtCxE,EAAI,KAAK,YAAc,KAAK,IAAIwE,CAAK,EAErC8H,EAAc,KAAK,UAAY,CAAC,CAACvM,EAAG,CAACC,CAAC,EAAI,CAACD,EAAGC,CAAC,EACrD,OAAO8B,EAAU,KAAK,gCAAgC,UAAUwK,CAAG,CAAC,CACtE,CAEA,IAAI,qBAA8B,CAChC,MAAMvM,EAAI,CAAC,KAAK,YAAc,KAAK,IAAI,KAAK,UAAU,EAChDC,EAAI,KAAK,YAAc,KAAK,IAAI,KAAK,UAAU,EAE/CsM,EAAc,KAAK,UAAY,CAAC,CAACvM,EAAG,CAACC,CAAC,EAAI,CAACD,EAAGC,CAAC,EACrD,OAAO8B,EAAU,KAAK,gCAAgC,UAAUwK,CAAG,CAAC,CACtE,CAEA,IAAI,oBAA6B,CAC/B,MAAMvM,EAAI,CAAC,KAAK,YAAc,KAAK,IAAI,KAAK,SAAS,EAC/CC,EAAI,KAAK,YAAc,KAAK,IAAI,KAAK,SAAS,EAE9CsM,EAAc,KAAK,UAAY,CAAC,CAACvM,EAAG,CAACC,CAAC,EAAI,CAACD,EAAGC,CAAC,EACrD,OAAO8B,EAAU,KAAK,gCAAgC,UAAUwK,CAAG,CAAC,CACtE,CAEA,UAAU/H,EAA0C,CAClD,MAAMgI,EAAgBhI,EAAO,eAAe,KAAK,SAAS,EACpDiI,EAAcjI,EAAO,cAC3B,OAAO,IAAIoG,EACTpG,EAAO,UAAU,KAAK,UAAU,EAChCA,EAAO,UAAU,KAAK,SAAS,EAC/BA,EAAO,UAAU,KAAK,MAAM,EAC5B,KAAK,YAAciI,EACnB,KAAK,YAAcA,EACnBD,EACAhI,EAAO,iBAAiB,EAAI,KAAK,UAAY,CAAC,KAAK,UACnD,CAAE,WAAY,KAAM,CAAA,CAExB,CAEA,QAAQpE,EAAyC,CAC3C,IAAA0F,EACJ,GAAI,MAAM,QAAQ1F,CAAM,GAAKA,EAAO,SAAW,EAC7C,MAAO,CAAC,IAAI,EAET,MAAM,QAAQA,EAAO,CAAC,CAAC,EAGZ0F,EAAA1F,EAFd0F,EAAc,CAAC1F,CAAgB,EAQjC,MAAM8H,EAAY,CAAC,EAAG,EAAG,GAFLpC,EAAY,IAAK/F,GAAU,KAAK,aAAaA,CAAK,CAAC,CAEhC,EAIjCoI,EAAY,IAAI,IACpB5B,GAAI,CAAC2B,EAAW,CAAC,KAAK,WAAY,KAAK,UAAW,GAAGpC,CAAW,CAAC,CAAC,CAAA,EAKpEoC,EAAU,KAAK,CAAC7E,EAAGC,IAAMD,EAAIC,CAAC,EAE9B,IAAI8E,EAAyB,KAC7B,OAAOF,EAAU,QAAQ,CAACrC,EAAOO,IAAU,CACrC,GAAAA,IAAU8B,EAAU,OAAS,EAAG,MAAO,GACrC,MAAAG,EAAYH,EAAU9B,EAAQ,CAAC,EAEjC,GAAAiC,EAAYxC,EAAQ,KAAK,UAC3B,OAAIuC,IAAY,OAAgBA,EAAAvC,GACzB,GAGH,MAAAyC,EAAaF,IAAY,KAAOvC,EAAQuC,EACxCG,EAAM,IAAIqC,EACdzC,EAAU,IAAIG,CAAU,GAAK,KAAK,WAAWA,CAAU,EACvDH,EAAU,IAAIE,CAAS,GAAK,KAAK,WAAWA,CAAS,EACrD,KAAK,OACL,KAAK,YACL,KAAK,YACL,KAAK,UACL,KAAK,UACL,CAAE,WAAY,KAAM,CAAA,EAEZ,OAAAD,EAAA,KACHG,CAAA,CACR,CACH,CACF,CAEO,SAASmE,GACdrH,EACAC,EACAuF,EACAC,EACA6B,EACAC,EACAC,EACkB,CAClB,KAAM,CAAE,OAAA5J,EAAQ,GAAA6J,EAAI,GAAAC,CAAO,EAAAC,GACzB3H,EACAC,EACAuF,EACAC,EACA6B,EAAM9L,GACN,CAAC+L,EACDC,CAAA,EAGF,OAAI,KAAK,IAAIC,EAAKC,CAAE,EAAI,KACf,IAAInF,EAAIvC,EAAYC,EAAWrC,EAAQ4J,CAAE,EAG3C,IAAIjC,EAAWvF,EAAYC,EAAWrC,EAAQ6J,EAAIC,EAAIJ,EAAKE,CAAE,CACtE,CAKA,SAASG,GACP,CAAC5L,EAAIC,CAAE,EACP,CAAC4L,EAAIC,CAAE,EACPJ,EACAC,EACAJ,EACAC,EACAC,EAC4C,CAOxC,GANAC,EAAK,IACPA,EAAK,CAACA,GAEJC,EAAK,IACPA,EAAK,CAACA,GAEJD,GAAM,GAAOC,GAAM,EAErB,MAAM,MAAM,wBAAwB,EAGhC,MAAAI,EAAQ,KAAK,IAAIR,CAAG,EACpBS,EAAQ,KAAK,IAAIT,CAAG,EACpBU,GAAQjM,EAAK6L,GAAM,EACnBK,GAAQjM,EAAK6L,GAAM,EACnBK,GAAQnM,EAAK6L,GAAM,EACnBO,GAAQnM,EAAK6L,GAAM,EAGnBO,EAAML,EAAQC,EAAOF,EAAQG,EAC7BI,EAAMN,EAAQE,EAAOH,EAAQE,EAI7BM,EAAUF,EAAMA,GAAQX,EAAKA,GAAOY,EAAMA,GAAQX,EAAKA,GACzDY,EAAS,IACNb,EAAAA,EAAK,KAAK,KAAKa,CAAM,EACrBZ,EAAAA,EAAK,KAAK,KAAKY,CAAM,GAG5B,MAAMC,EAAOd,EAAKC,EACZc,EAAQf,EAAKY,EACbI,EAAQf,EAAKU,EACbM,EAAYF,EAAQA,EAAQC,EAAQA,EAC1C,GAAI,CAACC,EACH,MAAM,MAAM,0CAA0C,EAEpD,IAAAC,EAAM,KAAK,KAAK,KAAK,KAAKJ,EAAOA,EAAOG,GAAaA,CAAS,CAAC,EAC/DnB,GAAMC,IACRmB,EAAM,CAACA,GAIH,MAAAC,EAAOD,EAAMH,EAASd,EACtBmB,EAAO,CAACF,EAAMF,EAAShB,EAGvBqB,EAAKf,EAAQa,EAAMd,EAAQe,EAAMX,EACjCa,EAAKjB,EAAQc,EAAMb,EAAQc,EAAMV,EAEhC,MAAA,CACL,OAAQ,CAACW,EAAIC,CAAE,EACf,GAAAtB,EACA,GAAAC,CAAA,CAEJ,CAIA,SAASV,GACPgC,EACAC,EACAvO,EACQ,CACR,MAAMwO,EAAK,KAAK,IAAIxO,EAAM,CAAC,CAAC,EACtByO,EAAK,KAAK,IAAIzO,EAAM,CAAC,CAAC,EAE5B,IAAI0O,EAAK,KACLC,EAAK,KAET,MAAMrL,EAAIgL,EACJ/K,EAAIgL,EAEV,QAASzK,EAAI,EAAGA,EAAI,EAAGA,IAAK,CAC1B,MAAM7D,EAAIqD,EAAIoL,EACRxO,EAAIqD,EAAIoL,EAERC,GAAOtL,EAAIA,EAAIC,EAAIA,GAAKmL,GAAM,EAAKpL,EACnCuL,GAAOtL,EAAIA,EAAID,EAAIA,GAAKqL,GAAM,EAAKpL,EAEnCwJ,EAAK9M,EAAI2O,EACT5B,EAAK9M,EAAI2O,EAETC,EAAKN,EAAKI,EACVG,EAAKN,EAAKI,EAEV1M,EAAI,KAAK,MAAM4K,EAAIC,CAAE,EACrB7I,EAAI,KAAK,MAAM2K,EAAIC,CAAE,EAEtBL,EAAA,KAAK,IAAI,EAAG,KAAK,IAAI,GAAKI,EAAK3M,EAAKgC,EAAIyK,GAAMtL,CAAC,CAAC,EAChDqL,EAAA,KAAK,IAAI,EAAG,KAAK,IAAI,GAAKI,EAAK5M,EAAKgC,EAAI0K,GAAMtL,CAAC,CAAC,EACrD,MAAMyL,EAAI,KAAK,MAAMN,EAAIC,CAAE,EACrBD,GAAAM,EACAL,GAAAK,CACR,CAEA,MAAO,CAAC1L,EAAIoL,EAAK,KAAK,KAAK1O,EAAM,CAAC,CAAC,EAAGuD,EAAIoL,EAAK,KAAK,KAAK3O,EAAM,CAAC,CAAC,CAAC,CACpE,CCzoBO,SAASiP,GACd5F,EACAb,EACA/H,EAAY,KACZ,CACA,MAAMyO,EAAQ7F,EAAK,UAAUb,EAAI,8BAA8B,EAEzDnE,EAAI6K,EAAM,MACV1L,EAAI0L,EAAM,WAEV9D,EAAK5C,EAAI,YAAcA,EAAI,YAC3B6C,EAAK7C,EAAI,YAAcA,EAAI,YAC3B2G,EAAK3G,EAAI,YAAcA,EAAI,YAE3BnF,EAAK6L,EAAM,MAAQA,EAAM,MACzBE,EAAKF,EAAM,WAAaA,EAAM,WAK9BG,EAA2B1F,GAC/BA,EACG,IAAK3J,GACJwI,EAAI,sCAAsC,UAAUxI,CAAK,CAC3D,EACC,OAAQA,GAAUqJ,EAAK,YAAYrJ,CAAK,GAAKwI,EAAI,YAAYxI,CAAK,CAAC,EAGxE,GAAI,CAAC,OAAO,SAASqE,CAAC,EAAG,CAEjB,MAAApE,EAAIiP,EAAM,WAAW,CAAC,EAG5B,GAAI,KAAK,IAAIjP,CAAC,EAAIuI,EAAI,YAAc/H,EAAW,MAAO,GAGlD,GAAA,KAAK,IAAI,KAAK,IAAIR,CAAC,EAAIuI,EAAI,WAAW,EAAI/H,EAC5C,OAAO4O,EAAwB,CAAC,CAACpP,EAAG,CAAC,CAAC,CAAC,EAGnC,MAAAC,EAAIsI,EAAI,YAAc,KAAK,KAAK,EAAKvI,EAAIA,EAAKmL,CAAE,EAEhDvK,EAAa,CAACZ,EAAGC,CAAC,EAClB2J,EAAa,CAAC5J,EAAG,CAACC,CAAC,EAEzB,OAAOmP,EAAwB,CAACxO,EAAIgJ,CAAE,CAAC,CACzC,CAEM,MAAAyF,EAAelE,EAAK/H,EAAKgI,EAAK+D,EAEhC,GAAAE,EAAe,CAAC7O,EAClB,MAAO,GAGH,MAAA8O,EAAcnE,EAAK/H,EAAKgI,EAG9B,GAAI,KAAK,IAAIiE,CAAY,EAAI7O,EAAW,CACtC,MAAMR,EAAI,EAAEmL,EAAK/G,EAAIb,GAAK+L,EACpBrP,EAAKmL,EAAK7H,EAAK+L,EACrB,OAAOF,EAAwB,CAAC,CAACpP,EAAGC,CAAC,CAAC,CAAC,CACzC,CAEM,MAAAsP,EAAmB,KAAK,KAAKF,CAAY,EAEzCzO,EAAa,CACjB,EAAEuK,EAAK/G,EAAIb,EAAI2L,EAAKK,GAAoBD,GACvClE,EAAK7H,EAAI2L,EAAK9K,EAAImL,GAAoBD,CAAA,EAEnC1F,EAAa,CACjB,EAAEuB,EAAK/G,EAAIb,EAAI2L,EAAKK,GAAoBD,GACvClE,EAAK7H,EAAI2L,EAAK9K,EAAImL,GAAoBD,CAAA,EAGzC,OAAOF,EAAwB,CAACxO,EAAIgJ,CAAE,CAAC,CACzC,CC/EA,MAAM4F,GAAW,OAAO,UAAU,SAO3B,SAASC,EAAWC,EAAO,CAC9B,MAAMC,EAAMH,GAAS,KAAKE,CAAK,EAC/B,OAAOC,EAAI,SAAS,QAAQ,GAAK,CAACA,EAAI,SAAS,KAAK,CACxD,CCTA,SAASC,GAAIC,EAAO,CAClB,IAAIC,EAAU,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,CAAA,EAElF,GAAI,CAACL,EAAWI,CAAK,EACnB,MAAM,IAAI,UAAU,wBAAwB,EAG9C,GAAIA,EAAM,SAAW,EACnB,MAAM,IAAI,UAAU,yBAAyB,EAG/C,IAAIE,EAAqBD,EAAQ,UAC7BE,EAAYD,IAAuB,OAAS,EAAIA,EAChDE,EAAmBH,EAAQ,QAC3BI,EAAUD,IAAqB,OAASJ,EAAM,OAASI,EAE3D,GAAID,EAAY,GAAKA,GAAaH,EAAM,QAAU,CAAC,OAAO,UAAUG,CAAS,EAC3E,MAAM,IAAI,MAAM,0DAA0D,EAG5E,GAAIE,GAAWF,GAAaE,EAAUL,EAAM,QAAU,CAAC,OAAO,UAAUK,CAAO,EAC7E,MAAM,IAAI,MAAM,+EAA+E,EAKjG,QAFIC,EAAWN,EAAMG,CAAS,EAErBnM,EAAImM,EAAY,EAAGnM,EAAIqM,EAASrM,IACnCgM,EAAMhM,CAAC,EAAIsM,IAAUA,EAAWN,EAAMhM,CAAC,GAG7C,OAAOsM,CACT,CC/BA,SAASC,GAAIP,EAAO,CAClB,IAAIC,EAAU,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,CAAA,EAElF,GAAI,CAACL,EAAWI,CAAK,EACnB,MAAM,IAAI,UAAU,wBAAwB,EAG9C,GAAIA,EAAM,SAAW,EACnB,MAAM,IAAI,UAAU,yBAAyB,EAG/C,IAAIE,EAAqBD,EAAQ,UAC7BE,EAAYD,IAAuB,OAAS,EAAIA,EAChDE,EAAmBH,EAAQ,QAC3BI,EAAUD,IAAqB,OAASJ,EAAM,OAASI,EAE3D,GAAID,EAAY,GAAKA,GAAaH,EAAM,QAAU,CAAC,OAAO,UAAUG,CAAS,EAC3E,MAAM,IAAI,MAAM,0DAA0D,EAG5E,GAAIE,GAAWF,GAAaE,EAAUL,EAAM,QAAU,CAAC,OAAO,UAAUK,CAAO,EAC7E,MAAM,IAAI,MAAM,+EAA+E,EAKjG,QAFIG,EAAWR,EAAMG,CAAS,EAErBnM,EAAImM,EAAY,EAAGnM,EAAIqM,EAASrM,IACnCgM,EAAMhM,CAAC,EAAIwM,IAAUA,EAAWR,EAAMhM,CAAC,GAG7C,OAAOwM,CACT,CC7BA,SAASC,GAAQT,EAAO,CACtB,IAAIC,EAAU,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,CAAA,EAElF,GAAKL,EAAWI,CAAK,GAEd,GAAIA,EAAM,SAAW,EAC1B,MAAM,IAAI,UAAU,yBAAyB,MAF7C,OAAM,IAAI,UAAU,wBAAwB,EAK9C,IAAIU,EAEJ,GAAIT,EAAQ,SAAW,OAAW,CAChC,GAAI,CAACL,EAAWK,EAAQ,MAAM,EAC5B,MAAM,IAAI,UAAU,6CAA6C,EAGnES,EAAST,EAAQ,MACrB,MACIS,EAAS,IAAI,MAAMV,EAAM,MAAM,EAGjC,IAAIW,EAAaJ,GAAIP,CAAK,EACtBY,EAAab,GAAIC,CAAK,EAE1B,GAAIW,IAAeC,EACjB,MAAM,IAAI,WAAW,6EAA6E,EAGpG,IAAIC,EAAeZ,EAAQ,IACvBO,EAAWK,IAAiB,OAASZ,EAAQ,WAAaU,EAAa,EAAIE,EAC3EC,EAAeb,EAAQ,IACvBK,EAAWQ,IAAiB,OAASb,EAAQ,WAAaW,EAAa,EAAIE,EAE/E,GAAIN,GAAYF,EACd,MAAM,IAAI,WAAW,4CAA4C,EAKnE,QAFIjL,GAAUiL,EAAWE,IAAaI,EAAaD,GAE1C3M,EAAI,EAAGA,EAAIgM,EAAM,OAAQhM,IAChC0M,EAAO1M,CAAC,GAAKgM,EAAMhM,CAAC,EAAI2M,GAActL,EAASmL,EAGjD,OAAOE,CACT,CChDA,MAAMK,GAAS,IAAI,OAAO,CAAC,EACrBC,GAAa,IAAI,OAAO,CAAC,EAExB,SAASC,IAAgB,CAC9B,OAAOC,GAAyB,IAAI,CACtC,CAEO,SAASA,GAAyBvM,EAAQsL,EAAU,GAAI,CAC7D,KAAM,CACJ,QAAAkB,EAAU,GACV,WAAAC,EAAa,GACb,WAAAC,EAAa,EACb,SAAAC,EAAW,MACZ,EAAGrB,EACJ,MAAO,GAAGtL,EAAO,YAAY;AAAA,EAC7BoM;AAAA,EACAC,KAAaO,GAAY5M,EAAQwM,EAASC,EAAYC,EAAYC,CAAQ;AAAA,EAC1EP;AAAA,EACAA,WAAepM,EAAO;AAAA,EACtBoM,cAAkBpM,EAAO;AAAA,EAE3B,CAEA,SAAS4M,GAAY5M,EAAQwM,EAASC,EAAYC,EAAYC,EAAU,CACtE,KAAM,CAAE,KAAAE,EAAM,QAAAC,CAAS,EAAG9M,EACpB+M,EAAO,KAAK,IAAIF,EAAML,CAAO,EAC7BQ,EAAO,KAAK,IAAIF,EAASL,CAAU,EACnCnI,EAAS,CAAA,EAEf,GAAIqI,IAAa,OAAQ,CACvBA,EAAW,GACXM,EAAM,QAAS5N,EAAI,EAAGA,EAAI0N,EAAM1N,IAC9B,QAASC,EAAI,EAAGA,EAAI0N,EAAM1N,IACxB,GAAIU,EAAO,IAAIX,EAAGC,CAAC,EAAI,EAAG,CACxBqN,EAAW,GACX,MAAMM,CACP,CAGN,CAED,QAAS5N,EAAI,EAAGA,EAAI0N,EAAM1N,IAAK,CAC7B,IAAIuF,EAAO,CAAA,EACX,QAAStF,EAAI,EAAGA,EAAI0N,EAAM1N,IACxBsF,EAAK,KAAKsI,GAAalN,EAAO,IAAIX,EAAGC,CAAC,EAAGoN,EAAYC,CAAQ,CAAC,EAEhErI,EAAO,KAAK,GAAGM,EAAK,KAAK,GAAG,GAAG,CAChC,CACD,OAAIoI,IAASF,IACXxI,EAAOA,EAAO,OAAS,CAAC,GAAK,QAAQwI,EAAUL,kBAE7CM,IAASF,GACXvI,EAAO,KAAK,OAAOuI,EAAOL,aAAmB,EAExClI,EAAO,KAAK;AAAA,EAAK+H,IAAY,CACtC,CAEA,SAASa,GAAajR,EAAKyQ,EAAYC,EAAU,CAC/C,OACE1Q,GAAO,GAAK0Q,EACR,IAAIQ,GAAclR,EAAKyQ,EAAa,CAAC,IACrCS,GAAclR,EAAKyQ,CAAU,GACjC,OAAOA,CAAU,CACrB,CAEA,SAASS,GAAclR,EAAK6F,EAAK,CAE/B,IAAIsL,EAAMnR,EAAI,WACd,GAAImR,EAAI,QAAUtL,EAAK,OAAOsL,EAI9B,IAAIC,EAAMpR,EAAI,QAAQ6F,CAAG,EAIzB,GAHIuL,EAAI,OAASvL,IACfuL,EAAMpR,EAAI,QAAQ,KAAK,IAAI,EAAG6F,GAAOuL,EAAI,OAASvL,EAAI,CAAC,GAGvDuL,EAAI,QAAUvL,GACd,CAACuL,EAAI,WAAW,OAAO,GACvB,CAACA,EAAI,WAAW,QAAQ,EAExB,OAAOA,EAIT,IAAIC,EAAMrR,EAAI,cAAc6F,CAAG,EAC/B,OAAIwL,EAAI,OAASxL,IACfwL,EAAMrR,EAAI,cAAc,KAAK,IAAI,EAAG6F,GAAOwL,EAAI,OAASxL,EAAI,CAAC,GAExDwL,EAAI,MAAM,CAAC,CACpB,CC1FO,SAASC,GAAsBC,EAAgBC,EAAQ,CAC5DD,EAAe,UAAU,IAAM,SAAatC,EAAO,CACjD,OAAI,OAAOA,GAAU,SAAiB,KAAK,KAAKA,CAAK,EAC9C,KAAK,KAAKA,CAAK,CAC1B,EAEEsC,EAAe,UAAU,KAAO,SAActC,EAAO,CACnD,QAAS7L,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAID,EAAGC,EAAG,KAAK,IAAID,EAAGC,CAAC,EAAI4L,CAAK,EAGzC,OAAO,IACX,EAEEsC,EAAe,UAAU,KAAO,SAAcxN,EAAQ,CAEpD,GADAA,EAASyN,EAAO,YAAYzN,CAAM,EAC9B,KAAK,OAASA,EAAO,MACvB,KAAK,UAAYA,EAAO,QACxB,MAAM,IAAI,WAAW,mCAAmC,EAE1D,QAASX,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAID,EAAGC,EAAG,KAAK,IAAID,EAAGC,CAAC,EAAIU,EAAO,IAAIX,EAAGC,CAAC,CAAC,EAGpD,OAAO,IACX,EAEEkO,EAAe,IAAM,SAAaxN,EAAQkL,EAAO,CAE/C,OADkB,IAAIuC,EAAOzN,CAAM,EAClB,IAAIkL,CAAK,CAC9B,EAEEsC,EAAe,UAAU,IAAM,SAAatC,EAAO,CACjD,OAAI,OAAOA,GAAU,SAAiB,KAAK,KAAKA,CAAK,EAC9C,KAAK,KAAKA,CAAK,CAC1B,EAEEsC,EAAe,UAAU,KAAO,SAActC,EAAO,CACnD,QAAS7L,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAID,EAAGC,EAAG,KAAK,IAAID,EAAGC,CAAC,EAAI4L,CAAK,EAGzC,OAAO,IACX,EAEEsC,EAAe,UAAU,KAAO,SAAcxN,EAAQ,CAEpD,GADAA,EAASyN,EAAO,YAAYzN,CAAM,EAC9B,KAAK,OAASA,EAAO,MACvB,KAAK,UAAYA,EAAO,QACxB,MAAM,IAAI,WAAW,mCAAmC,EAE1D,QAASX,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAID,EAAGC,EAAG,KAAK,IAAID,EAAGC,CAAC,EAAIU,EAAO,IAAIX,EAAGC,CAAC,CAAC,EAGpD,OAAO,IACX,EAEEkO,EAAe,IAAM,SAAaxN,EAAQkL,EAAO,CAE/C,OADkB,IAAIuC,EAAOzN,CAAM,EAClB,IAAIkL,CAAK,CAC9B,EACEsC,EAAe,UAAU,SAAWA,EAAe,UAAU,IAC7DA,EAAe,UAAU,UAAYA,EAAe,UAAU,KAC9DA,EAAe,UAAU,UAAYA,EAAe,UAAU,KAC9DA,EAAe,SAAWA,EAAe,IAEzCA,EAAe,UAAU,IAAM,SAAatC,EAAO,CACjD,OAAI,OAAOA,GAAU,SAAiB,KAAK,KAAKA,CAAK,EAC9C,KAAK,KAAKA,CAAK,CAC1B,EAEEsC,EAAe,UAAU,KAAO,SAActC,EAAO,CACnD,QAAS7L,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAID,EAAGC,EAAG,KAAK,IAAID,EAAGC,CAAC,EAAI4L,CAAK,EAGzC,OAAO,IACX,EAEEsC,EAAe,UAAU,KAAO,SAAcxN,EAAQ,CAEpD,GADAA,EAASyN,EAAO,YAAYzN,CAAM,EAC9B,KAAK,OAASA,EAAO,MACvB,KAAK,UAAYA,EAAO,QACxB,MAAM,IAAI,WAAW,mCAAmC,EAE1D,QAASX,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAID,EAAGC,EAAG,KAAK,IAAID,EAAGC,CAAC,EAAIU,EAAO,IAAIX,EAAGC,CAAC,CAAC,EAGpD,OAAO,IACX,EAEEkO,EAAe,IAAM,SAAaxN,EAAQkL,EAAO,CAE/C,OADkB,IAAIuC,EAAOzN,CAAM,EAClB,IAAIkL,CAAK,CAC9B,EACEsC,EAAe,UAAU,SAAWA,EAAe,UAAU,IAC7DA,EAAe,UAAU,UAAYA,EAAe,UAAU,KAC9DA,EAAe,UAAU,UAAYA,EAAe,UAAU,KAC9DA,EAAe,SAAWA,EAAe,IAEzCA,EAAe,UAAU,IAAM,SAAatC,EAAO,CACjD,OAAI,OAAOA,GAAU,SAAiB,KAAK,KAAKA,CAAK,EAC9C,KAAK,KAAKA,CAAK,CAC1B,EAEEsC,EAAe,UAAU,KAAO,SAActC,EAAO,CACnD,QAAS7L,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAID,EAAGC,EAAG,KAAK,IAAID,EAAGC,CAAC,EAAI4L,CAAK,EAGzC,OAAO,IACX,EAEEsC,EAAe,UAAU,KAAO,SAAcxN,EAAQ,CAEpD,GADAA,EAASyN,EAAO,YAAYzN,CAAM,EAC9B,KAAK,OAASA,EAAO,MACvB,KAAK,UAAYA,EAAO,QACxB,MAAM,IAAI,WAAW,mCAAmC,EAE1D,QAASX,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAID,EAAGC,EAAG,KAAK,IAAID,EAAGC,CAAC,EAAIU,EAAO,IAAIX,EAAGC,CAAC,CAAC,EAGpD,OAAO,IACX,EAEEkO,EAAe,IAAM,SAAaxN,EAAQkL,EAAO,CAE/C,OADkB,IAAIuC,EAAOzN,CAAM,EAClB,IAAIkL,CAAK,CAC9B,EACEsC,EAAe,UAAU,OAASA,EAAe,UAAU,IAC3DA,EAAe,UAAU,QAAUA,EAAe,UAAU,KAC5DA,EAAe,UAAU,QAAUA,EAAe,UAAU,KAC5DA,EAAe,OAASA,EAAe,IAEvCA,EAAe,UAAU,IAAM,SAAatC,EAAO,CACjD,OAAI,OAAOA,GAAU,SAAiB,KAAK,KAAKA,CAAK,EAC9C,KAAK,KAAKA,CAAK,CAC1B,EAEEsC,EAAe,UAAU,KAAO,SAActC,EAAO,CACnD,QAAS7L,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAID,EAAGC,EAAG,KAAK,IAAID,EAAGC,CAAC,EAAI4L,CAAK,EAGzC,OAAO,IACX,EAEEsC,EAAe,UAAU,KAAO,SAAcxN,EAAQ,CAEpD,GADAA,EAASyN,EAAO,YAAYzN,CAAM,EAC9B,KAAK,OAASA,EAAO,MACvB,KAAK,UAAYA,EAAO,QACxB,MAAM,IAAI,WAAW,mCAAmC,EAE1D,QAASX,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAID,EAAGC,EAAG,KAAK,IAAID,EAAGC,CAAC,EAAIU,EAAO,IAAIX,EAAGC,CAAC,CAAC,EAGpD,OAAO,IACX,EAEEkO,EAAe,IAAM,SAAaxN,EAAQkL,EAAO,CAE/C,OADkB,IAAIuC,EAAOzN,CAAM,EAClB,IAAIkL,CAAK,CAC9B,EACEsC,EAAe,UAAU,QAAUA,EAAe,UAAU,IAC5DA,EAAe,UAAU,SAAWA,EAAe,UAAU,KAC7DA,EAAe,UAAU,SAAWA,EAAe,UAAU,KAC7DA,EAAe,QAAUA,EAAe,IAExCA,EAAe,UAAU,IAAM,SAAatC,EAAO,CACjD,OAAI,OAAOA,GAAU,SAAiB,KAAK,KAAKA,CAAK,EAC9C,KAAK,KAAKA,CAAK,CAC1B,EAEEsC,EAAe,UAAU,KAAO,SAActC,EAAO,CACnD,QAAS7L,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAID,EAAGC,EAAG,KAAK,IAAID,EAAGC,CAAC,EAAI4L,CAAK,EAGzC,OAAO,IACX,EAEEsC,EAAe,UAAU,KAAO,SAAcxN,EAAQ,CAEpD,GADAA,EAASyN,EAAO,YAAYzN,CAAM,EAC9B,KAAK,OAASA,EAAO,MACvB,KAAK,UAAYA,EAAO,QACxB,MAAM,IAAI,WAAW,mCAAmC,EAE1D,QAASX,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAID,EAAGC,EAAG,KAAK,IAAID,EAAGC,CAAC,EAAIU,EAAO,IAAIX,EAAGC,CAAC,CAAC,EAGpD,OAAO,IACX,EAEEkO,EAAe,IAAM,SAAaxN,EAAQkL,EAAO,CAE/C,OADkB,IAAIuC,EAAOzN,CAAM,EAClB,IAAIkL,CAAK,CAC9B,EAEEsC,EAAe,UAAU,GAAK,SAAYtC,EAAO,CAC/C,OAAI,OAAOA,GAAU,SAAiB,KAAK,IAAIA,CAAK,EAC7C,KAAK,IAAIA,CAAK,CACzB,EAEEsC,EAAe,UAAU,IAAM,SAAatC,EAAO,CACjD,QAAS7L,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAID,EAAGC,EAAG,KAAK,IAAID,EAAGC,CAAC,EAAI4L,CAAK,EAGzC,OAAO,IACX,EAEEsC,EAAe,UAAU,IAAM,SAAaxN,EAAQ,CAElD,GADAA,EAASyN,EAAO,YAAYzN,CAAM,EAC9B,KAAK,OAASA,EAAO,MACvB,KAAK,UAAYA,EAAO,QACxB,MAAM,IAAI,WAAW,mCAAmC,EAE1D,QAASX,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAID,EAAGC,EAAG,KAAK,IAAID,EAAGC,CAAC,EAAIU,EAAO,IAAIX,EAAGC,CAAC,CAAC,EAGpD,OAAO,IACX,EAEEkO,EAAe,GAAK,SAAYxN,EAAQkL,EAAO,CAE7C,OADkB,IAAIuC,EAAOzN,CAAM,EAClB,GAAGkL,CAAK,CAC7B,EAEEsC,EAAe,UAAU,IAAM,SAAatC,EAAO,CACjD,OAAI,OAAOA,GAAU,SAAiB,KAAK,KAAKA,CAAK,EAC9C,KAAK,KAAKA,CAAK,CAC1B,EAEEsC,EAAe,UAAU,KAAO,SAActC,EAAO,CACnD,QAAS7L,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAID,EAAGC,EAAG,KAAK,IAAID,EAAGC,CAAC,EAAI4L,CAAK,EAGzC,OAAO,IACX,EAEEsC,EAAe,UAAU,KAAO,SAAcxN,EAAQ,CAEpD,GADAA,EAASyN,EAAO,YAAYzN,CAAM,EAC9B,KAAK,OAASA,EAAO,MACvB,KAAK,UAAYA,EAAO,QACxB,MAAM,IAAI,WAAW,mCAAmC,EAE1D,QAASX,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAID,EAAGC,EAAG,KAAK,IAAID,EAAGC,CAAC,EAAIU,EAAO,IAAIX,EAAGC,CAAC,CAAC,EAGpD,OAAO,IACX,EAEEkO,EAAe,IAAM,SAAaxN,EAAQkL,EAAO,CAE/C,OADkB,IAAIuC,EAAOzN,CAAM,EAClB,IAAIkL,CAAK,CAC9B,EAEEsC,EAAe,UAAU,UAAY,SAAmBtC,EAAO,CAC7D,OAAI,OAAOA,GAAU,SAAiB,KAAK,WAAWA,CAAK,EACpD,KAAK,WAAWA,CAAK,CAChC,EAEEsC,EAAe,UAAU,WAAa,SAAoBtC,EAAO,CAC/D,QAAS7L,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAID,EAAGC,EAAG,KAAK,IAAID,EAAGC,CAAC,GAAK4L,CAAK,EAG1C,OAAO,IACX,EAEEsC,EAAe,UAAU,WAAa,SAAoBxN,EAAQ,CAEhE,GADAA,EAASyN,EAAO,YAAYzN,CAAM,EAC9B,KAAK,OAASA,EAAO,MACvB,KAAK,UAAYA,EAAO,QACxB,MAAM,IAAI,WAAW,mCAAmC,EAE1D,QAASX,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAID,EAAGC,EAAG,KAAK,IAAID,EAAGC,CAAC,GAAKU,EAAO,IAAIX,EAAGC,CAAC,CAAC,EAGrD,OAAO,IACX,EAEEkO,EAAe,UAAY,SAAmBxN,EAAQkL,EAAO,CAE3D,OADkB,IAAIuC,EAAOzN,CAAM,EAClB,UAAUkL,CAAK,CACpC,EAEEsC,EAAe,UAAU,0BAA4B,SAAmCtC,EAAO,CAC7F,OAAI,OAAOA,GAAU,SAAiB,KAAK,2BAA2BA,CAAK,EACpE,KAAK,2BAA2BA,CAAK,CAChD,EAEEsC,EAAe,UAAU,2BAA6B,SAAoCtC,EAAO,CAC/F,QAAS7L,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAID,EAAGC,EAAG,KAAK,IAAID,EAAGC,CAAC,GAAK4L,CAAK,EAG1C,OAAO,IACX,EAEEsC,EAAe,UAAU,2BAA6B,SAAoCxN,EAAQ,CAEhG,GADAA,EAASyN,EAAO,YAAYzN,CAAM,EAC9B,KAAK,OAASA,EAAO,MACvB,KAAK,UAAYA,EAAO,QACxB,MAAM,IAAI,WAAW,mCAAmC,EAE1D,QAASX,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAID,EAAGC,EAAG,KAAK,IAAID,EAAGC,CAAC,GAAKU,EAAO,IAAIX,EAAGC,CAAC,CAAC,EAGrD,OAAO,IACX,EAEEkO,EAAe,0BAA4B,SAAmCxN,EAAQkL,EAAO,CAE3F,OADkB,IAAIuC,EAAOzN,CAAM,EAClB,0BAA0BkL,CAAK,CACpD,EAEEsC,EAAe,UAAU,WAAa,SAAoBtC,EAAO,CAC/D,OAAI,OAAOA,GAAU,SAAiB,KAAK,YAAYA,CAAK,EACrD,KAAK,YAAYA,CAAK,CACjC,EAEEsC,EAAe,UAAU,YAAc,SAAqBtC,EAAO,CACjE,QAAS7L,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAID,EAAGC,EAAG,KAAK,IAAID,EAAGC,CAAC,IAAM4L,CAAK,EAG3C,OAAO,IACX,EAEEsC,EAAe,UAAU,YAAc,SAAqBxN,EAAQ,CAElE,GADAA,EAASyN,EAAO,YAAYzN,CAAM,EAC9B,KAAK,OAASA,EAAO,MACvB,KAAK,UAAYA,EAAO,QACxB,MAAM,IAAI,WAAW,mCAAmC,EAE1D,QAASX,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAID,EAAGC,EAAG,KAAK,IAAID,EAAGC,CAAC,IAAMU,EAAO,IAAIX,EAAGC,CAAC,CAAC,EAGtD,OAAO,IACX,EAEEkO,EAAe,WAAa,SAAoBxN,EAAQkL,EAAO,CAE7D,OADkB,IAAIuC,EAAOzN,CAAM,EAClB,WAAWkL,CAAK,CACrC,EACEsC,EAAe,UAAU,mBAAqBA,EAAe,UAAU,WACvEA,EAAe,UAAU,oBAAsBA,EAAe,UAAU,YACxEA,EAAe,UAAU,oBAAsBA,EAAe,UAAU,YACxEA,EAAe,mBAAqBA,EAAe,WAEnDA,EAAe,UAAU,IAAM,UAAe,CAC5C,QAASnO,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAID,EAAGC,EAAG,CAAE,KAAK,IAAID,EAAGC,CAAC,CAAE,EAGpC,OAAO,IACX,EAEEkO,EAAe,IAAM,SAAaxN,EAAQ,CAExC,OADkB,IAAIyN,EAAOzN,CAAM,EAClB,KACrB,EAEEwN,EAAe,UAAU,IAAM,UAAe,CAC5C,QAASnO,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAID,EAAGC,EAAG,KAAK,IAAI,KAAK,IAAID,EAAGC,CAAC,CAAC,CAAC,EAG3C,OAAO,IACX,EAEEkO,EAAe,IAAM,SAAaxN,EAAQ,CAExC,OADkB,IAAIyN,EAAOzN,CAAM,EAClB,KACrB,EAEEwN,EAAe,UAAU,KAAO,UAAgB,CAC9C,QAASnO,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAID,EAAGC,EAAG,KAAK,KAAK,KAAK,IAAID,EAAGC,CAAC,CAAC,CAAC,EAG5C,OAAO,IACX,EAEEkO,EAAe,KAAO,SAAcxN,EAAQ,CAE1C,OADkB,IAAIyN,EAAOzN,CAAM,EAClB,MACrB,EAEEwN,EAAe,UAAU,MAAQ,UAAiB,CAChD,QAASnO,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAID,EAAGC,EAAG,KAAK,MAAM,KAAK,IAAID,EAAGC,CAAC,CAAC,CAAC,EAG7C,OAAO,IACX,EAEEkO,EAAe,MAAQ,SAAexN,EAAQ,CAE5C,OADkB,IAAIyN,EAAOzN,CAAM,EAClB,OACrB,EAEEwN,EAAe,UAAU,KAAO,UAAgB,CAC9C,QAASnO,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAID,EAAGC,EAAG,KAAK,KAAK,KAAK,IAAID,EAAGC,CAAC,CAAC,CAAC,EAG5C,OAAO,IACX,EAEEkO,EAAe,KAAO,SAAcxN,EAAQ,CAE1C,OADkB,IAAIyN,EAAOzN,CAAM,EAClB,MACrB,EAEEwN,EAAe,UAAU,MAAQ,UAAiB,CAChD,QAASnO,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAID,EAAGC,EAAG,KAAK,MAAM,KAAK,IAAID,EAAGC,CAAC,CAAC,CAAC,EAG7C,OAAO,IACX,EAEEkO,EAAe,MAAQ,SAAexN,EAAQ,CAE5C,OADkB,IAAIyN,EAAOzN,CAAM,EAClB,OACrB,EAEEwN,EAAe,UAAU,KAAO,UAAgB,CAC9C,QAASnO,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAID,EAAGC,EAAG,KAAK,KAAK,KAAK,IAAID,EAAGC,CAAC,CAAC,CAAC,EAG5C,OAAO,IACX,EAEEkO,EAAe,KAAO,SAAcxN,EAAQ,CAE1C,OADkB,IAAIyN,EAAOzN,CAAM,EAClB,MACrB,EAEEwN,EAAe,UAAU,MAAQ,UAAiB,CAChD,QAASnO,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAID,EAAGC,EAAG,KAAK,MAAM,KAAK,IAAID,EAAGC,CAAC,CAAC,CAAC,EAG7C,OAAO,IACX,EAEEkO,EAAe,MAAQ,SAAexN,EAAQ,CAE5C,OADkB,IAAIyN,EAAOzN,CAAM,EAClB,OACrB,EAEEwN,EAAe,UAAU,KAAO,UAAgB,CAC9C,QAASnO,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAID,EAAGC,EAAG,KAAK,KAAK,KAAK,IAAID,EAAGC,CAAC,CAAC,CAAC,EAG5C,OAAO,IACX,EAEEkO,EAAe,KAAO,SAAcxN,EAAQ,CAE1C,OADkB,IAAIyN,EAAOzN,CAAM,EAClB,MACrB,EAEEwN,EAAe,UAAU,KAAO,UAAgB,CAC9C,QAASnO,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAID,EAAGC,EAAG,KAAK,KAAK,KAAK,IAAID,EAAGC,CAAC,CAAC,CAAC,EAG5C,OAAO,IACX,EAEEkO,EAAe,KAAO,SAAcxN,EAAQ,CAE1C,OADkB,IAAIyN,EAAOzN,CAAM,EAClB,MACrB,EAEEwN,EAAe,UAAU,MAAQ,UAAiB,CAChD,QAASnO,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAID,EAAGC,EAAG,KAAK,MAAM,KAAK,IAAID,EAAGC,CAAC,CAAC,CAAC,EAG7C,OAAO,IACX,EAEEkO,EAAe,MAAQ,SAAexN,EAAQ,CAE5C,OADkB,IAAIyN,EAAOzN,CAAM,EAClB,OACrB,EAEEwN,EAAe,UAAU,IAAM,UAAe,CAC5C,QAASnO,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAID,EAAGC,EAAG,KAAK,IAAI,KAAK,IAAID,EAAGC,CAAC,CAAC,CAAC,EAG3C,OAAO,IACX,EAEEkO,EAAe,IAAM,SAAaxN,EAAQ,CAExC,OADkB,IAAIyN,EAAOzN,CAAM,EAClB,KACrB,EAEEwN,EAAe,UAAU,KAAO,UAAgB,CAC9C,QAASnO,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAID,EAAGC,EAAG,KAAK,KAAK,KAAK,IAAID,EAAGC,CAAC,CAAC,CAAC,EAG5C,OAAO,IACX,EAEEkO,EAAe,KAAO,SAAcxN,EAAQ,CAE1C,OADkB,IAAIyN,EAAOzN,CAAM,EAClB,MACrB,EAEEwN,EAAe,UAAU,IAAM,UAAe,CAC5C,QAASnO,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAID,EAAGC,EAAG,KAAK,IAAI,KAAK,IAAID,EAAGC,CAAC,CAAC,CAAC,EAG3C,OAAO,IACX,EAEEkO,EAAe,IAAM,SAAaxN,EAAQ,CAExC,OADkB,IAAIyN,EAAOzN,CAAM,EAClB,KACrB,EAEEwN,EAAe,UAAU,MAAQ,UAAiB,CAChD,QAASnO,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAID,EAAGC,EAAG,KAAK,MAAM,KAAK,IAAID,EAAGC,CAAC,CAAC,CAAC,EAG7C,OAAO,IACX,EAEEkO,EAAe,MAAQ,SAAexN,EAAQ,CAE5C,OADkB,IAAIyN,EAAOzN,CAAM,EAClB,OACrB,EAEEwN,EAAe,UAAU,MAAQ,UAAiB,CAChD,QAASnO,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAID,EAAGC,EAAG,KAAK,MAAM,KAAK,IAAID,EAAGC,CAAC,CAAC,CAAC,EAG7C,OAAO,IACX,EAEEkO,EAAe,MAAQ,SAAexN,EAAQ,CAE5C,OADkB,IAAIyN,EAAOzN,CAAM,EAClB,OACrB,EAEEwN,EAAe,UAAU,OAAS,UAAkB,CAClD,QAASnO,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAID,EAAGC,EAAG,KAAK,OAAO,KAAK,IAAID,EAAGC,CAAC,CAAC,CAAC,EAG9C,OAAO,IACX,EAEEkO,EAAe,OAAS,SAAgBxN,EAAQ,CAE9C,OADkB,IAAIyN,EAAOzN,CAAM,EAClB,QACrB,EAEEwN,EAAe,UAAU,IAAM,UAAe,CAC5C,QAASnO,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAID,EAAGC,EAAG,KAAK,IAAI,KAAK,IAAID,EAAGC,CAAC,CAAC,CAAC,EAG3C,OAAO,IACX,EAEEkO,EAAe,IAAM,SAAaxN,EAAQ,CAExC,OADkB,IAAIyN,EAAOzN,CAAM,EAClB,KACrB,EAEEwN,EAAe,UAAU,MAAQ,UAAiB,CAChD,QAASnO,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAID,EAAGC,EAAG,KAAK,MAAM,KAAK,IAAID,EAAGC,CAAC,CAAC,CAAC,EAG7C,OAAO,IACX,EAEEkO,EAAe,MAAQ,SAAexN,EAAQ,CAE5C,OADkB,IAAIyN,EAAOzN,CAAM,EAClB,OACrB,EAEEwN,EAAe,UAAU,MAAQ,UAAiB,CAChD,QAASnO,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAID,EAAGC,EAAG,KAAK,MAAM,KAAK,IAAID,EAAGC,CAAC,CAAC,CAAC,EAG7C,OAAO,IACX,EAEEkO,EAAe,MAAQ,SAAexN,EAAQ,CAE5C,OADkB,IAAIyN,EAAOzN,CAAM,EAClB,OACrB,EAEEwN,EAAe,UAAU,KAAO,UAAgB,CAC9C,QAASnO,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAID,EAAGC,EAAG,KAAK,KAAK,KAAK,IAAID,EAAGC,CAAC,CAAC,CAAC,EAG5C,OAAO,IACX,EAEEkO,EAAe,KAAO,SAAcxN,EAAQ,CAE1C,OADkB,IAAIyN,EAAOzN,CAAM,EAClB,MACrB,EAEEwN,EAAe,UAAU,MAAQ,UAAiB,CAChD,QAASnO,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAID,EAAGC,EAAG,KAAK,MAAM,KAAK,IAAID,EAAGC,CAAC,CAAC,CAAC,EAG7C,OAAO,IACX,EAEEkO,EAAe,MAAQ,SAAexN,EAAQ,CAE5C,OADkB,IAAIyN,EAAOzN,CAAM,EAClB,OACrB,EAEEwN,EAAe,UAAU,KAAO,UAAgB,CAC9C,QAASnO,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAID,EAAGC,EAAG,KAAK,KAAK,KAAK,IAAID,EAAGC,CAAC,CAAC,CAAC,EAG5C,OAAO,IACX,EAEEkO,EAAe,KAAO,SAAcxN,EAAQ,CAE1C,OADkB,IAAIyN,EAAOzN,CAAM,EAClB,MACrB,EAEEwN,EAAe,UAAU,IAAM,UAAe,CAC5C,QAASnO,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAID,EAAGC,EAAG,KAAK,IAAI,KAAK,IAAID,EAAGC,CAAC,CAAC,CAAC,EAG3C,OAAO,IACX,EAEEkO,EAAe,IAAM,SAAaxN,EAAQ,CAExC,OADkB,IAAIyN,EAAOzN,CAAM,EAClB,KACrB,EAEEwN,EAAe,UAAU,KAAO,UAAgB,CAC9C,QAASnO,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAID,EAAGC,EAAG,KAAK,KAAK,KAAK,IAAID,EAAGC,CAAC,CAAC,CAAC,EAG5C,OAAO,IACX,EAEEkO,EAAe,KAAO,SAAcxN,EAAQ,CAE1C,OADkB,IAAIyN,EAAOzN,CAAM,EAClB,MACrB,EAEEwN,EAAe,UAAU,KAAO,UAAgB,CAC9C,QAASnO,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAID,EAAGC,EAAG,KAAK,KAAK,KAAK,IAAID,EAAGC,CAAC,CAAC,CAAC,EAG5C,OAAO,IACX,EAEEkO,EAAe,KAAO,SAAcxN,EAAQ,CAE1C,OADkB,IAAIyN,EAAOzN,CAAM,EAClB,MACrB,EAEEwN,EAAe,UAAU,IAAM,UAAe,CAC5C,QAASnO,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAID,EAAGC,EAAG,KAAK,IAAI,KAAK,IAAID,EAAGC,CAAC,CAAC,CAAC,EAG3C,OAAO,IACX,EAEEkO,EAAe,IAAM,SAAaxN,EAAQ,CAExC,OADkB,IAAIyN,EAAOzN,CAAM,EAClB,KACrB,EAEEwN,EAAe,UAAU,KAAO,UAAgB,CAC9C,QAASnO,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAID,EAAGC,EAAG,KAAK,KAAK,KAAK,IAAID,EAAGC,CAAC,CAAC,CAAC,EAG5C,OAAO,IACX,EAEEkO,EAAe,KAAO,SAAcxN,EAAQ,CAE1C,OADkB,IAAIyN,EAAOzN,CAAM,EAClB,MACrB,EAEEwN,EAAe,UAAU,MAAQ,UAAiB,CAChD,QAASnO,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAID,EAAGC,EAAG,KAAK,MAAM,KAAK,IAAID,EAAGC,CAAC,CAAC,CAAC,EAG7C,OAAO,IACX,EAEEkO,EAAe,MAAQ,SAAexN,EAAQ,CAE5C,OADkB,IAAIyN,EAAOzN,CAAM,EAClB,OACrB,EAEEwN,EAAe,IAAM,SAAaxN,EAAQ0N,EAAM,CAE9C,OADkB,IAAID,EAAOzN,CAAM,EAClB,IAAI0N,CAAI,CAC7B,EAEEF,EAAe,UAAU,IAAM,SAAatC,EAAO,CACjD,OAAI,OAAOA,GAAU,SAAiB,KAAK,KAAKA,CAAK,EAC9C,KAAK,KAAKA,CAAK,CAC1B,EAEEsC,EAAe,UAAU,KAAO,SAActC,EAAO,CACnD,QAAS7L,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAID,EAAGC,EAAG,KAAK,IAAI,KAAK,IAAID,EAAGC,CAAC,EAAG4L,CAAK,CAAC,EAGlD,OAAO,IACX,EAEEsC,EAAe,UAAU,KAAO,SAAcxN,EAAQ,CAEpD,GADAA,EAASyN,EAAO,YAAYzN,CAAM,EAC9B,KAAK,OAASA,EAAO,MACvB,KAAK,UAAYA,EAAO,QACxB,MAAM,IAAI,WAAW,mCAAmC,EAE1D,QAASX,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAID,EAAGC,EAAG,KAAK,IAAI,KAAK,IAAID,EAAGC,CAAC,EAAGU,EAAO,IAAIX,EAAGC,CAAC,CAAC,CAAC,EAG7D,OAAO,IACX,CACA,CC7yBO,SAASqO,EAAc3N,EAAQ4B,EAAOgM,EAAO,CAClD,IAAIxC,EAAMwC,EAAQ5N,EAAO,KAAOA,EAAO,KAAO,EAC9C,GAAI4B,EAAQ,GAAKA,EAAQwJ,EACvB,MAAM,IAAI,WAAW,wBAAwB,CAEjD,CASO,SAASyC,EAAiB7N,EAAQ4B,EAAOgM,EAAO,CACrD,IAAIxC,EAAMwC,EAAQ5N,EAAO,QAAUA,EAAO,QAAU,EACpD,GAAI4B,EAAQ,GAAKA,EAAQwJ,EACvB,MAAM,IAAI,WAAW,2BAA2B,CAEpD,CAUO,SAAS0C,GAAe9N,EAAQxD,EAAQ,CAI7C,GAHIA,EAAO,YACTA,EAASA,EAAO,aAEdA,EAAO,SAAWwD,EAAO,QAC3B,MAAM,IAAI,WACR,uDACN,EAEE,OAAOxD,CACT,CAUO,SAASuR,GAAkB/N,EAAQxD,EAAQ,CAIhD,GAHIA,EAAO,YACTA,EAASA,EAAO,aAEdA,EAAO,SAAWwD,EAAO,KAC3B,MAAM,IAAI,WAAW,oDAAoD,EAE3E,OAAOxD,CACT,CAEO,SAASwR,GAAgBhO,EAAQiO,EAAY,CAClD,GAAI,CAAChD,EAAWgD,CAAU,EACxB,MAAM,IAAI,UAAU,8BAA8B,EAGpD,QAAS5O,EAAI,EAAGA,EAAI4O,EAAW,OAAQ5O,IACrC,GAAI4O,EAAW5O,CAAC,EAAI,GAAK4O,EAAW5O,CAAC,GAAKW,EAAO,KAC/C,MAAM,IAAI,WAAW,8BAA8B,CAGzD,CAEO,SAASkO,GAAmBlO,EAAQmO,EAAe,CACxD,GAAI,CAAClD,EAAWkD,CAAa,EAC3B,MAAM,IAAI,UAAU,iCAAiC,EAGvD,QAAS9O,EAAI,EAAGA,EAAI8O,EAAc,OAAQ9O,IACxC,GAAI8O,EAAc9O,CAAC,EAAI,GAAK8O,EAAc9O,CAAC,GAAKW,EAAO,QACrD,MAAM,IAAI,WAAW,iCAAiC,CAG5D,CAEO,SAASoO,GAAWpO,EAAQqO,EAAUC,EAAQC,EAAaC,EAAW,CAC3E,GAAI,UAAU,SAAW,EACvB,MAAM,IAAI,WAAW,sBAAsB,EAM7C,GAJAC,GAAY,WAAYJ,CAAQ,EAChCI,GAAY,SAAUH,CAAM,EAC5BG,GAAY,cAAeF,CAAW,EACtCE,GAAY,YAAaD,CAAS,EAEhCH,EAAWC,GACXC,EAAcC,GACdH,EAAW,GACXA,GAAYrO,EAAO,MACnBsO,EAAS,GACTA,GAAUtO,EAAO,MACjBuO,EAAc,GACdA,GAAevO,EAAO,SACtBwO,EAAY,GACZA,GAAaxO,EAAO,QAEpB,MAAM,IAAI,WAAW,oCAAoC,CAE7D,CAEO,SAAS0O,GAASC,EAAQzD,EAAQ,EAAG,CAC1C,IAAI0D,EAAQ,CAAA,EACZ,QAASvP,EAAI,EAAGA,EAAIsP,EAAQtP,IAC1BuP,EAAM,KAAK1D,CAAK,EAElB,OAAO0D,CACT,CAEA,SAASH,GAAYI,EAAM3D,EAAO,CAChC,GAAI,OAAOA,GAAU,SACnB,MAAM,IAAI,UAAU,GAAG2D,oBAAuB,CAElD,CAEO,SAASC,GAAc9O,EAAQ,CACpC,GAAIA,EAAO,UACT,MAAM,IAAI,MAAM,uCAAuC,CAE3D,CCpIO,SAAS+O,GAAS/O,EAAQ,CAC/B,IAAIgP,EAAMN,GAAS1O,EAAO,IAAI,EAC9B,QAASX,EAAI,EAAGA,EAAIW,EAAO,KAAM,EAAEX,EACjC,QAASC,EAAI,EAAGA,EAAIU,EAAO,QAAS,EAAEV,EACpC0P,EAAI3P,CAAC,GAAKW,EAAO,IAAIX,EAAGC,CAAC,EAG7B,OAAO0P,CACT,CAEO,SAASC,GAAYjP,EAAQ,CAClC,IAAIgP,EAAMN,GAAS1O,EAAO,OAAO,EACjC,QAASX,EAAI,EAAGA,EAAIW,EAAO,KAAM,EAAEX,EACjC,QAASC,EAAI,EAAGA,EAAIU,EAAO,QAAS,EAAEV,EACpC0P,EAAI1P,CAAC,GAAKU,EAAO,IAAIX,EAAGC,CAAC,EAG7B,OAAO0P,CACT,CAEO,SAASE,GAAOlP,EAAQ,CAC7B,IAAIlC,EAAI,EACR,QAASuB,EAAI,EAAGA,EAAIW,EAAO,KAAMX,IAC/B,QAASC,EAAI,EAAGA,EAAIU,EAAO,QAASV,IAClCxB,GAAKkC,EAAO,IAAIX,EAAGC,CAAC,EAGxB,OAAOxB,CACT,CAEO,SAASqR,GAAanP,EAAQ,CACnC,IAAIgP,EAAMN,GAAS1O,EAAO,KAAM,CAAC,EACjC,QAASX,EAAI,EAAGA,EAAIW,EAAO,KAAM,EAAEX,EACjC,QAASC,EAAI,EAAGA,EAAIU,EAAO,QAAS,EAAEV,EACpC0P,EAAI3P,CAAC,GAAKW,EAAO,IAAIX,EAAGC,CAAC,EAG7B,OAAO0P,CACT,CAEO,SAASI,GAAgBpP,EAAQ,CACtC,IAAIgP,EAAMN,GAAS1O,EAAO,QAAS,CAAC,EACpC,QAASX,EAAI,EAAGA,EAAIW,EAAO,KAAM,EAAEX,EACjC,QAASC,EAAI,EAAGA,EAAIU,EAAO,QAAS,EAAEV,EACpC0P,EAAI1P,CAAC,GAAKU,EAAO,IAAIX,EAAGC,CAAC,EAG7B,OAAO0P,CACT,CAEO,SAASK,GAAWrP,EAAQ,CACjC,IAAIlC,EAAI,EACR,QAASuB,EAAI,EAAGA,EAAIW,EAAO,KAAMX,IAC/B,QAASC,EAAI,EAAGA,EAAIU,EAAO,QAASV,IAClCxB,GAAKkC,EAAO,IAAIX,EAAGC,CAAC,EAGxB,OAAOxB,CACT,CAEO,SAASwR,GAActP,EAAQuP,EAAUC,EAAM,CACpD,MAAM3C,EAAO7M,EAAO,KACdyP,EAAOzP,EAAO,QACd0P,EAAW,CAAA,EAEjB,QAASrQ,EAAI,EAAGA,EAAIwN,EAAMxN,IAAK,CAC7B,IAAIsQ,EAAO,EACPC,EAAO,EACPpU,EAAI,EACR,QAAS8D,EAAI,EAAGA,EAAImQ,EAAMnQ,IACxB9D,EAAIwE,EAAO,IAAIX,EAAGC,CAAC,EAAIkQ,EAAKnQ,CAAC,EAC7BsQ,GAAQnU,EACRoU,GAAQpU,EAAIA,EAEV+T,EACFG,EAAS,MAAME,EAAQD,EAAOA,EAAQF,IAASA,EAAO,EAAE,EAExDC,EAAS,MAAME,EAAQD,EAAOA,EAAQF,GAAQA,CAAI,CAErD,CACD,OAAOC,CACT,CAEO,SAASG,GAAiB7P,EAAQuP,EAAUC,EAAM,CACvD,MAAM3C,EAAO7M,EAAO,KACdyP,EAAOzP,EAAO,QACd0P,EAAW,CAAA,EAEjB,QAASpQ,EAAI,EAAGA,EAAImQ,EAAMnQ,IAAK,CAC7B,IAAIqQ,EAAO,EACPC,EAAO,EACPpU,EAAI,EACR,QAAS6D,EAAI,EAAGA,EAAIwN,EAAMxN,IACxB7D,EAAIwE,EAAO,IAAIX,EAAGC,CAAC,EAAIkQ,EAAKlQ,CAAC,EAC7BqQ,GAAQnU,EACRoU,GAAQpU,EAAIA,EAEV+T,EACFG,EAAS,MAAME,EAAQD,EAAOA,EAAQ9C,IAASA,EAAO,EAAE,EAExD6C,EAAS,MAAME,EAAQD,EAAOA,EAAQ9C,GAAQA,CAAI,CAErD,CACD,OAAO6C,CACT,CAEO,SAASI,GAAY9P,EAAQuP,EAAUC,EAAM,CAClD,MAAM3C,EAAO7M,EAAO,KACdyP,EAAOzP,EAAO,QACd+P,EAAOlD,EAAO4C,EAEpB,IAAIE,EAAO,EACPC,EAAO,EACPpU,EAAI,EACR,QAAS6D,EAAI,EAAGA,EAAIwN,EAAMxN,IACxB,QAASC,EAAI,EAAGA,EAAImQ,EAAMnQ,IACxB9D,EAAIwE,EAAO,IAAIX,EAAGC,CAAC,EAAIkQ,EACvBG,GAAQnU,EACRoU,GAAQpU,EAAIA,EAGhB,OAAI+T,GACMK,EAAQD,EAAOA,EAAQI,IAASA,EAAO,IAEvCH,EAAQD,EAAOA,EAAQI,GAAQA,CAE3C,CAEO,SAASC,GAAYhQ,EAAQwP,EAAM,CACxC,QAASnQ,EAAI,EAAGA,EAAIW,EAAO,KAAMX,IAC/B,QAASC,EAAI,EAAGA,EAAIU,EAAO,QAASV,IAClCU,EAAO,IAAIX,EAAGC,EAAGU,EAAO,IAAIX,EAAGC,CAAC,EAAIkQ,EAAKnQ,CAAC,CAAC,CAGjD,CAEO,SAAS4Q,GAAejQ,EAAQwP,EAAM,CAC3C,QAASnQ,EAAI,EAAGA,EAAIW,EAAO,KAAMX,IAC/B,QAASC,EAAI,EAAGA,EAAIU,EAAO,QAASV,IAClCU,EAAO,IAAIX,EAAGC,EAAGU,EAAO,IAAIX,EAAGC,CAAC,EAAIkQ,EAAKlQ,CAAC,CAAC,CAGjD,CAEO,SAAS4Q,GAAUlQ,EAAQwP,EAAM,CACtC,QAASnQ,EAAI,EAAGA,EAAIW,EAAO,KAAMX,IAC/B,QAASC,EAAI,EAAGA,EAAIU,EAAO,QAASV,IAClCU,EAAO,IAAIX,EAAGC,EAAGU,EAAO,IAAIX,EAAGC,CAAC,EAAIkQ,CAAI,CAG9C,CAEO,SAASW,GAAcnQ,EAAQ,CACpC,MAAMoQ,EAAQ,CAAA,EACd,QAAS/Q,EAAI,EAAGA,EAAIW,EAAO,KAAMX,IAAK,CACpC,IAAI2P,EAAM,EACV,QAAS1P,EAAI,EAAGA,EAAIU,EAAO,QAASV,IAClC0P,GAAO,KAAK,IAAIhP,EAAO,IAAIX,EAAGC,CAAC,EAAG,CAAC,GAAKU,EAAO,QAAU,GAE3DoQ,EAAM,KAAK,KAAK,KAAKpB,CAAG,CAAC,CAC1B,CACD,OAAOoB,CACT,CAEO,SAASC,GAAWrQ,EAAQoQ,EAAO,CACxC,QAAS/Q,EAAI,EAAGA,EAAIW,EAAO,KAAMX,IAC/B,QAASC,EAAI,EAAGA,EAAIU,EAAO,QAASV,IAClCU,EAAO,IAAIX,EAAGC,EAAGU,EAAO,IAAIX,EAAGC,CAAC,EAAI8Q,EAAM/Q,CAAC,CAAC,CAGlD,CAEO,SAASiR,GAAiBtQ,EAAQ,CACvC,MAAMoQ,EAAQ,CAAA,EACd,QAAS9Q,EAAI,EAAGA,EAAIU,EAAO,QAASV,IAAK,CACvC,IAAI0P,EAAM,EACV,QAAS3P,EAAI,EAAGA,EAAIW,EAAO,KAAMX,IAC/B2P,GAAO,KAAK,IAAIhP,EAAO,IAAIX,EAAGC,CAAC,EAAG,CAAC,GAAKU,EAAO,KAAO,GAExDoQ,EAAM,KAAK,KAAK,KAAKpB,CAAG,CAAC,CAC1B,CACD,OAAOoB,CACT,CAEO,SAASG,GAAcvQ,EAAQoQ,EAAO,CAC3C,QAAS/Q,EAAI,EAAGA,EAAIW,EAAO,KAAMX,IAC/B,QAASC,EAAI,EAAGA,EAAIU,EAAO,QAASV,IAClCU,EAAO,IAAIX,EAAGC,EAAGU,EAAO,IAAIX,EAAGC,CAAC,EAAI8Q,EAAM9Q,CAAC,CAAC,CAGlD,CAEO,SAASkR,GAAYxQ,EAAQ,CAClC,MAAMyQ,EAAUzQ,EAAO,KAAO,EAC9B,IAAIgP,EAAM,EACV,QAAS1P,EAAI,EAAGA,EAAIU,EAAO,QAASV,IAClC,QAASD,EAAI,EAAGA,EAAIW,EAAO,KAAMX,IAC/B2P,GAAO,KAAK,IAAIhP,EAAO,IAAIX,EAAGC,CAAC,EAAG,CAAC,EAAImR,EAG3C,OAAO,KAAK,KAAKzB,CAAG,CACtB,CAEO,SAAS0B,GAAS1Q,EAAQoQ,EAAO,CACtC,QAAS/Q,EAAI,EAAGA,EAAIW,EAAO,KAAMX,IAC/B,QAASC,EAAI,EAAGA,EAAIU,EAAO,QAASV,IAClCU,EAAO,IAAIX,EAAGC,EAAGU,EAAO,IAAIX,EAAGC,CAAC,EAAI8Q,CAAK,CAG/C,CC/KO,MAAM5C,CAAe,CAC1B,OAAO,YAAYmD,EAASC,EAAYC,EAAS,CAE/C,GADaF,EAAUC,IACRC,EAAQ,OACrB,MAAM,IAAI,WAAW,6CAA6C,EAEpE,IAAIC,EAAY,IAAIrD,EAAOkD,EAASC,CAAU,EAC9C,QAASG,EAAM,EAAGA,EAAMJ,EAASI,IAC/B,QAASC,EAAS,EAAGA,EAASJ,EAAYI,IACxCF,EAAU,IAAIC,EAAKC,EAAQH,EAAQE,EAAMH,EAAaI,CAAM,CAAC,EAGjE,OAAOF,CACR,CAED,OAAO,UAAUD,EAAS,CACxB,IAAIrU,EAAS,IAAIiR,EAAO,EAAGoD,EAAQ,MAAM,EACzC,QAASxR,EAAI,EAAGA,EAAIwR,EAAQ,OAAQxR,IAClC7C,EAAO,IAAI,EAAG6C,EAAGwR,EAAQxR,CAAC,CAAC,EAE7B,OAAO7C,CACR,CAED,OAAO,aAAaqU,EAAS,CAC3B,IAAIrU,EAAS,IAAIiR,EAAOoD,EAAQ,OAAQ,CAAC,EACzC,QAASxR,EAAI,EAAGA,EAAIwR,EAAQ,OAAQxR,IAClC7C,EAAO,IAAI6C,EAAG,EAAGwR,EAAQxR,CAAC,CAAC,EAE7B,OAAO7C,CACR,CAED,OAAO,MAAMqQ,EAAMC,EAAS,CAC1B,OAAO,IAAIW,EAAOZ,EAAMC,CAAO,CAChC,CAED,OAAO,KAAKD,EAAMC,EAAS,CACzB,OAAO,IAAIW,EAAOZ,EAAMC,CAAO,EAAE,KAAK,CAAC,CACxC,CAED,OAAO,KAAKD,EAAMC,EAASxB,EAAU,CAAA,EAAI,CACvC,GAAI,OAAOA,GAAY,SACrB,MAAM,IAAI,UAAU,2BAA2B,EAEjD,KAAM,CAAE,OAAA2F,EAAS,KAAK,MAAM,EAAK3F,EACjC,IAAItL,EAAS,IAAIyN,EAAOZ,EAAMC,CAAO,EACrC,QAASzN,EAAI,EAAGA,EAAIwN,EAAMxN,IACxB,QAASC,EAAI,EAAGA,EAAIwN,EAASxN,IAC3BU,EAAO,IAAIX,EAAGC,EAAG2R,EAAQ,CAAA,EAG7B,OAAOjR,CACR,CAED,OAAO,QAAQ6M,EAAMC,EAASxB,EAAU,CAAA,EAAI,CAC1C,GAAI,OAAOA,GAAY,SACrB,MAAM,IAAI,UAAU,2BAA2B,EAEjD,KAAM,CAAE,IAAAM,EAAM,EAAG,IAAAR,EAAM,IAAM,OAAA6F,EAAS,KAAK,MAAQ,EAAG3F,EACtD,GAAI,CAAC,OAAO,UAAUM,CAAG,EAAG,MAAM,IAAI,UAAU,wBAAwB,EACxE,GAAI,CAAC,OAAO,UAAUR,CAAG,EAAG,MAAM,IAAI,UAAU,wBAAwB,EACxE,GAAIQ,GAAOR,EAAK,MAAM,IAAI,WAAW,8BAA8B,EACnE,IAAI8F,EAAW9F,EAAMQ,EACjB5L,EAAS,IAAIyN,EAAOZ,EAAMC,CAAO,EACrC,QAASzN,EAAI,EAAGA,EAAIwN,EAAMxN,IACxB,QAASC,EAAI,EAAGA,EAAIwN,EAASxN,IAAK,CAChC,IAAI4L,EAAQU,EAAM,KAAK,MAAMqF,EAAM,EAAKC,CAAQ,EAChDlR,EAAO,IAAIX,EAAGC,EAAG4L,CAAK,CACvB,CAEH,OAAOlL,CACR,CAED,OAAO,IAAI6M,EAAMC,EAAS5B,EAAO,CAC3B4B,IAAY,SAAWA,EAAUD,GACjC3B,IAAU,SAAWA,EAAQ,GACjC,IAAIU,EAAM,KAAK,IAAIiB,EAAMC,CAAO,EAC5B9M,EAAS,KAAK,MAAM6M,EAAMC,CAAO,EACrC,QAASzN,EAAI,EAAGA,EAAIuM,EAAKvM,IACvBW,EAAO,IAAIX,EAAGA,EAAG6L,CAAK,EAExB,OAAOlL,CACR,CAED,OAAO,KAAKmR,EAAMtE,EAAMC,EAAS,CAC/B,IAAItP,EAAI2T,EAAK,OACTtE,IAAS,SAAWA,EAAOrP,GAC3BsP,IAAY,SAAWA,EAAUD,GACrC,IAAIjB,EAAM,KAAK,IAAIpO,EAAGqP,EAAMC,CAAO,EAC/B9M,EAAS,KAAK,MAAM6M,EAAMC,CAAO,EACrC,QAASzN,EAAI,EAAGA,EAAIuM,EAAKvM,IACvBW,EAAO,IAAIX,EAAGA,EAAG8R,EAAK9R,CAAC,CAAC,EAE1B,OAAOW,CACR,CAED,OAAO,IAAIoR,EAASC,EAAS,CAC3BD,EAAU,KAAK,YAAYA,CAAO,EAClCC,EAAU,KAAK,YAAYA,CAAO,EAClC,IAAIxE,EAAOuE,EAAQ,KACftE,EAAUsE,EAAQ,QAClB9M,EAAS,IAAImJ,EAAOZ,EAAMC,CAAO,EACrC,QAASzN,EAAI,EAAGA,EAAIwN,EAAMxN,IACxB,QAASC,EAAI,EAAGA,EAAIwN,EAASxN,IAC3BgF,EAAO,IAAIjF,EAAGC,EAAG,KAAK,IAAI8R,EAAQ,IAAI/R,EAAGC,CAAC,EAAG+R,EAAQ,IAAIhS,EAAGC,CAAC,CAAC,CAAC,EAGnE,OAAOgF,CACR,CAED,OAAO,IAAI8M,EAASC,EAAS,CAC3BD,EAAU,KAAK,YAAYA,CAAO,EAClCC,EAAU,KAAK,YAAYA,CAAO,EAClC,IAAIxE,EAAOuE,EAAQ,KACftE,EAAUsE,EAAQ,QAClB9M,EAAS,IAAI,KAAKuI,EAAMC,CAAO,EACnC,QAASzN,EAAI,EAAGA,EAAIwN,EAAMxN,IACxB,QAASC,EAAI,EAAGA,EAAIwN,EAASxN,IAC3BgF,EAAO,IAAIjF,EAAGC,EAAG,KAAK,IAAI8R,EAAQ,IAAI/R,EAAGC,CAAC,EAAG+R,EAAQ,IAAIhS,EAAGC,CAAC,CAAC,CAAC,EAGnE,OAAOgF,CACR,CAED,OAAO,YAAY4G,EAAO,CACxB,OAAOsC,EAAe,SAAStC,CAAK,EAAIA,EAAQ,IAAIuC,EAAOvC,CAAK,CACjE,CAED,OAAO,SAASA,EAAO,CACrB,OAAOA,GAAS,MAAQA,EAAM,QAAU,QACzC,CAED,IAAI,MAAO,CACT,OAAO,KAAK,KAAO,KAAK,OACzB,CAED,MAAMoG,EAAU,CACd,GAAI,OAAOA,GAAa,WACtB,MAAM,IAAI,UAAU,6BAA6B,EAEnD,QAASjS,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChCgS,EAAS,KAAK,KAAMjS,EAAGC,CAAC,EAG5B,OAAO,IACR,CAED,WAAY,CACV,IAAIsP,EAAQ,CAAA,EACZ,QAASvP,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChCsP,EAAM,KAAK,KAAK,IAAIvP,EAAGC,CAAC,CAAC,EAG7B,OAAOsP,CACR,CAED,WAAY,CACV,IAAI2C,EAAO,CAAA,EACX,QAASlS,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAAK,CAClCkS,EAAK,KAAK,CAAA,CAAE,EACZ,QAASjS,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChCiS,EAAKlS,CAAC,EAAE,KAAK,KAAK,IAAIA,EAAGC,CAAC,CAAC,CAE9B,CACD,OAAOiS,CACR,CAED,QAAS,CACP,OAAO,KAAK,WACb,CAED,aAAc,CACZ,OAAO,KAAK,OAAS,CACtB,CAED,gBAAiB,CACf,OAAO,KAAK,UAAY,CACzB,CAED,UAAW,CACT,OAAO,KAAK,OAAS,GAAK,KAAK,UAAY,CAC5C,CAED,UAAW,CACT,OAAO,KAAK,OAAS,KAAK,OAC3B,CAED,SAAU,CACR,OAAO,KAAK,OAAS,GAAK,KAAK,UAAY,CAC5C,CAED,aAAc,CACZ,GAAI,KAAK,WAAY,CACnB,QAASlS,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,GAAKD,EAAGC,IACtB,GAAI,KAAK,IAAID,EAAGC,CAAC,IAAM,KAAK,IAAIA,EAAGD,CAAC,EAClC,MAAO,GAIb,MAAO,EACR,CACD,MAAO,EACR,CAED,eAAgB,CACd,IAAIA,EAAI,EACJC,EAAI,EACJkS,EAAiB,GACjBC,EAAgB,GAChBC,EAAU,GACd,KAAOrS,EAAI,KAAK,MAAQoS,GAAe,CAGrC,IAFAnS,EAAI,EACJoS,EAAU,GACHpS,EAAI,KAAK,SAAWoS,IAAY,IACjC,KAAK,IAAIrS,EAAGC,CAAC,IAAM,EACrBA,IACS,KAAK,IAAID,EAAGC,CAAC,IAAM,GAAKA,EAAIkS,GACrCE,EAAU,GACVF,EAAiBlS,IAEjBmS,EAAgB,GAChBC,EAAU,IAGdrS,GACD,CACD,OAAOoS,CACR,CAED,sBAAuB,CACrB,IAAIpS,EAAI,EACJC,EAAI,EACJkS,EAAiB,GACjBG,EAAuB,GACvBD,EAAU,GACd,KAAOrS,EAAI,KAAK,MAAQsS,GAAsB,CAG5C,IAFArS,EAAI,EACJoS,EAAU,GACHpS,EAAI,KAAK,SAAWoS,IAAY,IACjC,KAAK,IAAIrS,EAAGC,CAAC,IAAM,EACrBA,IACS,KAAK,IAAID,EAAGC,CAAC,IAAM,GAAKA,EAAIkS,GACrCE,EAAU,GACVF,EAAiBlS,IAEjBqS,EAAuB,GACvBD,EAAU,IAGd,QAASnS,EAAID,EAAI,EAAGC,EAAI,KAAK,KAAMA,IAC7B,KAAK,IAAIF,EAAGE,CAAC,IAAM,IACrBoS,EAAuB,IAG3BtS,GACD,CACD,OAAOsS,CACR,CAED,aAAc,CACZ,IAAIrN,EAAS,KAAK,QACdlF,EAAI,EACJG,EAAI,EACR,KAAOH,EAAIkF,EAAO,MAAQ/E,EAAI+E,EAAO,SAAS,CAC5C,IAAIsN,EAAOxS,EACX,QAASC,EAAID,EAAGC,EAAIiF,EAAO,KAAMjF,IAC3BiF,EAAO,IAAIjF,EAAGE,CAAC,EAAI+E,EAAO,IAAIsN,EAAMrS,CAAC,IACvCqS,EAAOvS,GAGX,GAAIiF,EAAO,IAAIsN,EAAMrS,CAAC,IAAM,EAC1BA,QACK,CACL+E,EAAO,SAASlF,EAAGwS,CAAI,EACvB,IAAIC,EAAMvN,EAAO,IAAIlF,EAAGG,CAAC,EACzB,QAASD,EAAIC,EAAGD,EAAIgF,EAAO,QAAShF,IAClCgF,EAAO,IAAIlF,EAAGE,EAAGgF,EAAO,IAAIlF,EAAGE,CAAC,EAAIuS,CAAG,EAEzC,QAASxS,EAAID,EAAI,EAAGC,EAAIiF,EAAO,KAAMjF,IAAK,CACxC,IAAIqB,EAAS4D,EAAO,IAAIjF,EAAGE,CAAC,EAAI+E,EAAO,IAAIlF,EAAGG,CAAC,EAC/C+E,EAAO,IAAIjF,EAAGE,EAAG,CAAC,EAClB,QAASD,EAAIC,EAAI,EAAGD,EAAIgF,EAAO,QAAShF,IACtCgF,EAAO,IAAIjF,EAAGC,EAAGgF,EAAO,IAAIjF,EAAGC,CAAC,EAAIgF,EAAO,IAAIlF,EAAGE,CAAC,EAAIoB,CAAM,CAEhE,CACDtB,IACAG,GACD,CACF,CACD,OAAO+E,CACR,CAED,oBAAqB,CACnB,IAAIA,EAAS,KAAK,cACd1E,EAAI0E,EAAO,QACX9E,EAAI8E,EAAO,KACXlF,EAAII,EAAI,EACZ,KAAOJ,GAAK,GACV,GAAIkF,EAAO,OAAOlF,CAAC,IAAM,EACvBA,QACK,CACL,IAAIrD,EAAI,EACJ+V,EAAQ,GACZ,KAAO/V,EAAIyD,GAAKsS,IAAU,IACpBxN,EAAO,IAAIlF,EAAGrD,CAAC,IAAM,EACvB+V,EAAQ,GAER/V,IAGJ,QAASsD,EAAI,EAAGA,EAAID,EAAGC,IAAK,CAC1B,IAAIqB,EAAS4D,EAAO,IAAIjF,EAAGtD,CAAC,EAC5B,QAASuD,EAAIvD,EAAGuD,EAAIM,EAAGN,IAAK,CAC1B,IAAIuS,EAAMvN,EAAO,IAAIjF,EAAGC,CAAC,EAAIoB,EAAS4D,EAAO,IAAIlF,EAAGE,CAAC,EACrDgF,EAAO,IAAIjF,EAAGC,EAAGuS,CAAG,CACrB,CACF,CACDzS,GACD,CAEH,OAAOkF,CACR,CAED,KAAM,CACJ,MAAM,IAAI,MAAM,6BAA6B,CAC9C,CAED,KAAM,CACJ,MAAM,IAAI,MAAM,6BAA6B,CAC9C,CAED,OAAOgH,EAAU,GAAI,CACnB,GAAI,OAAOA,GAAY,SACrB,MAAM,IAAI,UAAU,2BAA2B,EAEjD,KAAM,CAAE,KAAAuB,EAAO,EAAG,QAAAC,EAAU,CAAC,EAAKxB,EAClC,GAAI,CAAC,OAAO,UAAUuB,CAAI,GAAKA,GAAQ,EACrC,MAAM,IAAI,UAAU,iCAAiC,EAEvD,GAAI,CAAC,OAAO,UAAUC,CAAO,GAAKA,GAAW,EAC3C,MAAM,IAAI,UAAU,oCAAoC,EAE1D,IAAI9M,EAAS,IAAIyN,EAAO,KAAK,KAAOZ,EAAM,KAAK,QAAUC,CAAO,EAChE,QAASzN,EAAI,EAAGA,EAAIwN,EAAMxN,IACxB,QAASC,EAAI,EAAGA,EAAIwN,EAASxN,IAC3BU,EAAO,aAAa,KAAM,KAAK,KAAOX,EAAG,KAAK,QAAUC,CAAC,EAG7D,OAAOU,CACR,CAED,KAAKkL,EAAO,CACV,QAAS7L,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAID,EAAGC,EAAG4L,CAAK,EAGxB,OAAO,IACR,CAED,KAAM,CACJ,OAAO,KAAK,KAAK,EAAE,CACpB,CAED,OAAOtJ,EAAO,CACZ+L,EAAc,KAAM/L,CAAK,EACzB,IAAImP,EAAM,CAAA,EACV,QAAS1R,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC0R,EAAI,KAAK,KAAK,IAAInP,EAAOvC,CAAC,CAAC,EAE7B,OAAO0R,CACR,CAED,aAAanP,EAAO,CAClB,OAAO6L,EAAO,UAAU,KAAK,OAAO7L,CAAK,CAAC,CAC3C,CAED,OAAOA,EAAOgN,EAAO,CACnBjB,EAAc,KAAM/L,CAAK,EACzBgN,EAAQd,GAAe,KAAMc,CAAK,EAClC,QAASvP,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAIuC,EAAOvC,EAAGuP,EAAMvP,CAAC,CAAC,EAE7B,OAAO,IACR,CAED,SAAS0S,EAAMC,EAAM,CACnBrE,EAAc,KAAMoE,CAAI,EACxBpE,EAAc,KAAMqE,CAAI,EACxB,QAAS3S,EAAI,EAAGA,EAAI,KAAK,QAASA,IAAK,CACrC,IAAI4S,EAAO,KAAK,IAAIF,EAAM1S,CAAC,EAC3B,KAAK,IAAI0S,EAAM1S,EAAG,KAAK,IAAI2S,EAAM3S,CAAC,CAAC,EACnC,KAAK,IAAI2S,EAAM3S,EAAG4S,CAAI,CACvB,CACD,OAAO,IACR,CAED,UAAUrQ,EAAO,CACfiM,EAAiB,KAAMjM,CAAK,EAC5B,IAAIoP,EAAS,CAAA,EACb,QAAS3R,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B2R,EAAO,KAAK,KAAK,IAAI3R,EAAGuC,CAAK,CAAC,EAEhC,OAAOoP,CACR,CAED,gBAAgBpP,EAAO,CACrB,OAAO6L,EAAO,aAAa,KAAK,UAAU7L,CAAK,CAAC,CACjD,CAED,UAAUA,EAAOgN,EAAO,CACtBf,EAAiB,KAAMjM,CAAK,EAC5BgN,EAAQb,GAAkB,KAAMa,CAAK,EACrC,QAASvP,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,KAAK,IAAIA,EAAGuC,EAAOgN,EAAMvP,CAAC,CAAC,EAE7B,OAAO,IACR,CAED,YAAY6S,EAASC,EAAS,CAC5BtE,EAAiB,KAAMqE,CAAO,EAC9BrE,EAAiB,KAAMsE,CAAO,EAC9B,QAAS9S,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAAK,CAClC,IAAI4S,EAAO,KAAK,IAAI5S,EAAG6S,CAAO,EAC9B,KAAK,IAAI7S,EAAG6S,EAAS,KAAK,IAAI7S,EAAG8S,CAAO,CAAC,EACzC,KAAK,IAAI9S,EAAG8S,EAASF,CAAI,CAC1B,CACD,OAAO,IACR,CAED,aAAazV,EAAQ,CACnBA,EAASsR,GAAe,KAAMtR,CAAM,EACpC,QAAS6C,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAID,EAAGC,EAAG,KAAK,IAAID,EAAGC,CAAC,EAAI9C,EAAO8C,CAAC,CAAC,EAG7C,OAAO,IACR,CAED,aAAa9C,EAAQ,CACnBA,EAASsR,GAAe,KAAMtR,CAAM,EACpC,QAAS6C,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAID,EAAGC,EAAG,KAAK,IAAID,EAAGC,CAAC,EAAI9C,EAAO8C,CAAC,CAAC,EAG7C,OAAO,IACR,CAED,aAAa9C,EAAQ,CACnBA,EAASsR,GAAe,KAAMtR,CAAM,EACpC,QAAS6C,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAID,EAAGC,EAAG,KAAK,IAAID,EAAGC,CAAC,EAAI9C,EAAO8C,CAAC,CAAC,EAG7C,OAAO,IACR,CAED,aAAa9C,EAAQ,CACnBA,EAASsR,GAAe,KAAMtR,CAAM,EACpC,QAAS6C,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAID,EAAGC,EAAG,KAAK,IAAID,EAAGC,CAAC,EAAI9C,EAAO8C,CAAC,CAAC,EAG7C,OAAO,IACR,CAED,gBAAgB9C,EAAQ,CACtBA,EAASuR,GAAkB,KAAMvR,CAAM,EACvC,QAAS6C,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAID,EAAGC,EAAG,KAAK,IAAID,EAAGC,CAAC,EAAI9C,EAAO6C,CAAC,CAAC,EAG7C,OAAO,IACR,CAED,gBAAgB7C,EAAQ,CACtBA,EAASuR,GAAkB,KAAMvR,CAAM,EACvC,QAAS6C,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAID,EAAGC,EAAG,KAAK,IAAID,EAAGC,CAAC,EAAI9C,EAAO6C,CAAC,CAAC,EAG7C,OAAO,IACR,CAED,gBAAgB7C,EAAQ,CACtBA,EAASuR,GAAkB,KAAMvR,CAAM,EACvC,QAAS6C,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAID,EAAGC,EAAG,KAAK,IAAID,EAAGC,CAAC,EAAI9C,EAAO6C,CAAC,CAAC,EAG7C,OAAO,IACR,CAED,gBAAgB7C,EAAQ,CACtBA,EAASuR,GAAkB,KAAMvR,CAAM,EACvC,QAAS6C,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAID,EAAGC,EAAG,KAAK,IAAID,EAAGC,CAAC,EAAI9C,EAAO6C,CAAC,CAAC,EAG7C,OAAO,IACR,CAED,OAAOuC,EAAOsJ,EAAO,CACnByC,EAAc,KAAM/L,CAAK,EACzB,QAASvC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,IAAIuC,EAAOvC,EAAG,KAAK,IAAIuC,EAAOvC,CAAC,EAAI6L,CAAK,EAE/C,OAAO,IACR,CAED,UAAUtJ,EAAOsJ,EAAO,CACtB2C,EAAiB,KAAMjM,CAAK,EAC5B,QAASvC,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,KAAK,IAAIA,EAAGuC,EAAO,KAAK,IAAIvC,EAAGuC,CAAK,EAAIsJ,CAAK,EAE/C,OAAO,IACR,CAED,IAAIkH,EAAI,CACN,GAAI,KAAK,UACP,MAAO,KAET,OAAQA,EAAE,CACR,IAAK,MAAO,CACV,MAAMhH,EAAM,IAAI,MAAM,KAAK,IAAI,EAAE,KAAK,OAAO,iBAAiB,EAC9D,QAAS2F,EAAM,EAAGA,EAAM,KAAK,KAAMA,IACjC,QAASC,EAAS,EAAGA,EAAS,KAAK,QAASA,IACtC,KAAK,IAAID,EAAKC,CAAM,EAAI5F,EAAI2F,CAAG,IACjC3F,EAAI2F,CAAG,EAAI,KAAK,IAAIA,EAAKC,CAAM,GAIrC,OAAO5F,CACR,CACD,IAAK,SAAU,CACb,MAAMA,EAAM,IAAI,MAAM,KAAK,OAAO,EAAE,KAAK,OAAO,iBAAiB,EACjE,QAAS2F,EAAM,EAAGA,EAAM,KAAK,KAAMA,IACjC,QAASC,EAAS,EAAGA,EAAS,KAAK,QAASA,IACtC,KAAK,IAAID,EAAKC,CAAM,EAAI5F,EAAI4F,CAAM,IACpC5F,EAAI4F,CAAM,EAAI,KAAK,IAAID,EAAKC,CAAM,GAIxC,OAAO5F,CACR,CACD,KAAK,OAAW,CACd,IAAIA,EAAM,KAAK,IAAI,EAAG,CAAC,EACvB,QAAS2F,EAAM,EAAGA,EAAM,KAAK,KAAMA,IACjC,QAASC,EAAS,EAAGA,EAAS,KAAK,QAASA,IACtC,KAAK,IAAID,EAAKC,CAAM,EAAI5F,IAC1BA,EAAM,KAAK,IAAI2F,EAAKC,CAAM,GAIhC,OAAO5F,CACR,CACD,QACE,MAAM,IAAI,MAAM,mBAAmBgH,GAAI,CAC1C,CACF,CAED,UAAW,CACTtD,GAAc,IAAI,EAClB,IAAIhR,EAAI,KAAK,IAAI,EAAG,CAAC,EACjBuU,EAAM,CAAC,EAAG,CAAC,EACf,QAAShT,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAC5B,KAAK,IAAID,EAAGC,CAAC,EAAIxB,IACnBA,EAAI,KAAK,IAAIuB,EAAGC,CAAC,EACjB+S,EAAI,CAAC,EAAIhT,EACTgT,EAAI,CAAC,EAAI/S,GAIf,OAAO+S,CACR,CAED,IAAID,EAAI,CACN,GAAI,KAAK,UACP,MAAO,KAGT,OAAQA,EAAE,CACR,IAAK,MAAO,CACV,MAAMxG,EAAM,IAAI,MAAM,KAAK,IAAI,EAAE,KAAK,OAAO,iBAAiB,EAC9D,QAASmF,EAAM,EAAGA,EAAM,KAAK,KAAMA,IACjC,QAASC,EAAS,EAAGA,EAAS,KAAK,QAASA,IACtC,KAAK,IAAID,EAAKC,CAAM,EAAIpF,EAAImF,CAAG,IACjCnF,EAAImF,CAAG,EAAI,KAAK,IAAIA,EAAKC,CAAM,GAIrC,OAAOpF,CACR,CACD,IAAK,SAAU,CACb,MAAMA,EAAM,IAAI,MAAM,KAAK,OAAO,EAAE,KAAK,OAAO,iBAAiB,EACjE,QAASmF,EAAM,EAAGA,EAAM,KAAK,KAAMA,IACjC,QAASC,EAAS,EAAGA,EAAS,KAAK,QAASA,IACtC,KAAK,IAAID,EAAKC,CAAM,EAAIpF,EAAIoF,CAAM,IACpCpF,EAAIoF,CAAM,EAAI,KAAK,IAAID,EAAKC,CAAM,GAIxC,OAAOpF,CACR,CACD,KAAK,OAAW,CACd,IAAIA,EAAM,KAAK,IAAI,EAAG,CAAC,EACvB,QAASmF,EAAM,EAAGA,EAAM,KAAK,KAAMA,IACjC,QAASC,EAAS,EAAGA,EAAS,KAAK,QAASA,IACtC,KAAK,IAAID,EAAKC,CAAM,EAAIpF,IAC1BA,EAAM,KAAK,IAAImF,EAAKC,CAAM,GAIhC,OAAOpF,CACR,CACD,QACE,MAAM,IAAI,MAAM,mBAAmBwG,GAAI,CAC1C,CACF,CAED,UAAW,CACTtD,GAAc,IAAI,EAClB,IAAIhR,EAAI,KAAK,IAAI,EAAG,CAAC,EACjBuU,EAAM,CAAC,EAAG,CAAC,EACf,QAAShT,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAC5B,KAAK,IAAID,EAAGC,CAAC,EAAIxB,IACnBA,EAAI,KAAK,IAAIuB,EAAGC,CAAC,EACjB+S,EAAI,CAAC,EAAIhT,EACTgT,EAAI,CAAC,EAAI/S,GAIf,OAAO+S,CACR,CAED,OAAOtB,EAAK,CAEV,GADApD,EAAc,KAAMoD,CAAG,EACnB,KAAK,UACP,MAAO,KAET,IAAIjT,EAAI,KAAK,IAAIiT,EAAK,CAAC,EACvB,QAAS1R,EAAI,EAAGA,EAAI,KAAK,QAASA,IAC5B,KAAK,IAAI0R,EAAK1R,CAAC,EAAIvB,IACrBA,EAAI,KAAK,IAAIiT,EAAK1R,CAAC,GAGvB,OAAOvB,CACR,CAED,YAAYiT,EAAK,CACfpD,EAAc,KAAMoD,CAAG,EACvBjC,GAAc,IAAI,EAClB,IAAIhR,EAAI,KAAK,IAAIiT,EAAK,CAAC,EACnBsB,EAAM,CAACtB,EAAK,CAAC,EACjB,QAAS1R,EAAI,EAAGA,EAAI,KAAK,QAASA,IAC5B,KAAK,IAAI0R,EAAK1R,CAAC,EAAIvB,IACrBA,EAAI,KAAK,IAAIiT,EAAK1R,CAAC,EACnBgT,EAAI,CAAC,EAAIhT,GAGb,OAAOgT,CACR,CAED,OAAOtB,EAAK,CAEV,GADApD,EAAc,KAAMoD,CAAG,EACnB,KAAK,UACP,MAAO,KAET,IAAIjT,EAAI,KAAK,IAAIiT,EAAK,CAAC,EACvB,QAAS1R,EAAI,EAAGA,EAAI,KAAK,QAASA,IAC5B,KAAK,IAAI0R,EAAK1R,CAAC,EAAIvB,IACrBA,EAAI,KAAK,IAAIiT,EAAK1R,CAAC,GAGvB,OAAOvB,CACR,CAED,YAAYiT,EAAK,CACfpD,EAAc,KAAMoD,CAAG,EACvBjC,GAAc,IAAI,EAClB,IAAIhR,EAAI,KAAK,IAAIiT,EAAK,CAAC,EACnBsB,EAAM,CAACtB,EAAK,CAAC,EACjB,QAAS1R,EAAI,EAAGA,EAAI,KAAK,QAASA,IAC5B,KAAK,IAAI0R,EAAK1R,CAAC,EAAIvB,IACrBA,EAAI,KAAK,IAAIiT,EAAK1R,CAAC,EACnBgT,EAAI,CAAC,EAAIhT,GAGb,OAAOgT,CACR,CAED,UAAUrB,EAAQ,CAEhB,GADAnD,EAAiB,KAAMmD,CAAM,EACzB,KAAK,UACP,MAAO,KAET,IAAIlT,EAAI,KAAK,IAAI,EAAGkT,CAAM,EAC1B,QAAS3R,EAAI,EAAGA,EAAI,KAAK,KAAMA,IACzB,KAAK,IAAIA,EAAG2R,CAAM,EAAIlT,IACxBA,EAAI,KAAK,IAAIuB,EAAG2R,CAAM,GAG1B,OAAOlT,CACR,CAED,eAAekT,EAAQ,CACrBnD,EAAiB,KAAMmD,CAAM,EAC7BlC,GAAc,IAAI,EAClB,IAAIhR,EAAI,KAAK,IAAI,EAAGkT,CAAM,EACtBqB,EAAM,CAAC,EAAGrB,CAAM,EACpB,QAAS3R,EAAI,EAAGA,EAAI,KAAK,KAAMA,IACzB,KAAK,IAAIA,EAAG2R,CAAM,EAAIlT,IACxBA,EAAI,KAAK,IAAIuB,EAAG2R,CAAM,EACtBqB,EAAI,CAAC,EAAIhT,GAGb,OAAOgT,CACR,CAED,UAAUrB,EAAQ,CAEhB,GADAnD,EAAiB,KAAMmD,CAAM,EACzB,KAAK,UACP,MAAO,KAET,IAAIlT,EAAI,KAAK,IAAI,EAAGkT,CAAM,EAC1B,QAAS3R,EAAI,EAAGA,EAAI,KAAK,KAAMA,IACzB,KAAK,IAAIA,EAAG2R,CAAM,EAAIlT,IACxBA,EAAI,KAAK,IAAIuB,EAAG2R,CAAM,GAG1B,OAAOlT,CACR,CAED,eAAekT,EAAQ,CACrBnD,EAAiB,KAAMmD,CAAM,EAC7BlC,GAAc,IAAI,EAClB,IAAIhR,EAAI,KAAK,IAAI,EAAGkT,CAAM,EACtBqB,EAAM,CAAC,EAAGrB,CAAM,EACpB,QAAS3R,EAAI,EAAGA,EAAI,KAAK,KAAMA,IACzB,KAAK,IAAIA,EAAG2R,CAAM,EAAIlT,IACxBA,EAAI,KAAK,IAAIuB,EAAG2R,CAAM,EACtBqB,EAAI,CAAC,EAAIhT,GAGb,OAAOgT,CACR,CAED,MAAO,CACL,IAAIzG,EAAM,KAAK,IAAI,KAAK,KAAM,KAAK,OAAO,EACtC0G,EAAO,CAAA,EACX,QAASjT,EAAI,EAAGA,EAAIuM,EAAKvM,IACvBiT,EAAK,KAAK,KAAK,IAAIjT,EAAGA,CAAC,CAAC,EAE1B,OAAOiT,CACR,CAED,KAAKC,EAAO,YAAa,CACvB,IAAIjO,EAAS,EACb,GAAIiO,IAAS,MACX,OAAO,KAAK,MACP,GAAIA,IAAS,YAAa,CAC/B,QAASlT,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChCgF,EAASA,EAAS,KAAK,IAAIjF,EAAGC,CAAC,EAAI,KAAK,IAAID,EAAGC,CAAC,EAGpD,OAAO,KAAK,KAAKgF,CAAM,CAC7B,KACM,OAAM,IAAI,WAAW,sBAAsBiO,GAAM,CAEpD,CAED,eAAgB,CACd,IAAIvD,EAAM,EACV,QAAS3P,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC0P,GAAO,KAAK,IAAI3P,EAAGC,CAAC,EACpB,KAAK,IAAID,EAAGC,EAAG0P,CAAG,EAGtB,OAAO,IACR,CAED,IAAIwD,EAAS,CACPhF,EAAe,SAASgF,CAAO,IAAGA,EAAUA,EAAQ,aACxD,IAAIC,EAAU,KAAK,YACnB,GAAIA,EAAQ,SAAWD,EAAQ,OAC7B,MAAM,IAAI,WAAW,mCAAmC,EAE1D,IAAIE,EAAM,EACV,QAASrT,EAAI,EAAGA,EAAIoT,EAAQ,OAAQpT,IAClCqT,GAAOD,EAAQpT,CAAC,EAAImT,EAAQnT,CAAC,EAE/B,OAAOqT,CACR,CAED,KAAKhX,EAAO,CACVA,EAAQ+R,EAAO,YAAY/R,CAAK,EAEhC,IAAIkE,EAAI,KAAK,KACTJ,EAAI,KAAK,QACTzD,EAAIL,EAAM,QAEV4I,EAAS,IAAImJ,EAAO7N,EAAG7D,CAAC,EAExB4W,EAAQ,IAAI,aAAanT,CAAC,EAC9B,QAASF,EAAI,EAAGA,EAAIvD,EAAGuD,IAAK,CAC1B,QAASC,EAAI,EAAGA,EAAIC,EAAGD,IACrBoT,EAAMpT,CAAC,EAAI7D,EAAM,IAAI6D,EAAGD,CAAC,EAG3B,QAASD,EAAI,EAAGA,EAAIO,EAAGP,IAAK,CAC1B,IAAIuT,EAAI,EACR,QAASrT,EAAI,EAAGA,EAAIC,EAAGD,IACrBqT,GAAK,KAAK,IAAIvT,EAAGE,CAAC,EAAIoT,EAAMpT,CAAC,EAG/B+E,EAAO,IAAIjF,EAAGC,EAAGsT,CAAC,CACnB,CACF,CACD,OAAOtO,CACR,CAED,YAAY5I,EAAO,CACjBA,EAAQ+R,EAAO,YAAY/R,CAAK,EAChC,IAAI4I,EAAS,IAAImJ,EAAO,EAAG,CAAC,EAC5B,MAAMoF,EAAM,KAAK,IAAI,EAAG,CAAC,EACnBC,EAAMpX,EAAM,IAAI,EAAG,CAAC,EACpBqX,EAAM,KAAK,IAAI,EAAG,CAAC,EACnBC,EAAMtX,EAAM,IAAI,EAAG,CAAC,EACpBuX,EAAM,KAAK,IAAI,EAAG,CAAC,EACnBC,EAAMxX,EAAM,IAAI,EAAG,CAAC,EACpByX,EAAM,KAAK,IAAI,EAAG,CAAC,EACnBC,EAAM1X,EAAM,IAAI,EAAG,CAAC,EAGpBiD,GAAMkU,EAAMM,IAAQL,EAAMM,GAC1BxU,GAAMqU,EAAME,GAAOL,EACnBO,EAAKR,GAAOG,EAAMI,GAClBE,EAAKH,GAAOD,EAAMJ,GAClBS,GAAMV,EAAME,GAAOK,EACnBI,GAAMP,EAAMJ,IAAQC,EAAME,GAC1BS,GAAMV,EAAMI,IAAQD,EAAME,GAG1BM,EAAM/U,EAAK2U,EAAKC,EAAKE,EACrBE,EAAMN,EAAKE,EACXK,EAAMhV,EAAK0U,EACXO,EAAMlV,EAAKC,EAAKyU,EAAKG,EAE3B,OAAAlP,EAAO,IAAI,EAAG,EAAGoP,CAAG,EACpBpP,EAAO,IAAI,EAAG,EAAGqP,CAAG,EACpBrP,EAAO,IAAI,EAAG,EAAGsP,CAAG,EACpBtP,EAAO,IAAI,EAAG,EAAGuP,CAAG,EACbvP,CACR,CAED,YAAY5I,EAAO,CACjBA,EAAQ+R,EAAO,YAAY/R,CAAK,EAChC,IAAI4I,EAAS,IAAImJ,EAAO,EAAG,CAAC,EAE5B,MAAMqG,EAAM,KAAK,IAAI,EAAG,CAAC,EACnBC,EAAM,KAAK,IAAI,EAAG,CAAC,EACnBC,EAAM,KAAK,IAAI,EAAG,CAAC,EACnBC,EAAM,KAAK,IAAI,EAAG,CAAC,EACnBpB,EAAM,KAAK,IAAI,EAAG,CAAC,EACnBE,EAAM,KAAK,IAAI,EAAG,CAAC,EACnBmB,EAAM,KAAK,IAAI,EAAG,CAAC,EACnBjB,EAAM,KAAK,IAAI,EAAG,CAAC,EACnBE,EAAM,KAAK,IAAI,EAAG,CAAC,EAEnBgB,EAAMzY,EAAM,IAAI,EAAG,CAAC,EACpB0Y,EAAM1Y,EAAM,IAAI,EAAG,CAAC,EACpB2Y,EAAM3Y,EAAM,IAAI,EAAG,CAAC,EACpB4Y,EAAM5Y,EAAM,IAAI,EAAG,CAAC,EACpBoX,EAAMpX,EAAM,IAAI,EAAG,CAAC,EACpBsX,EAAMtX,EAAM,IAAI,EAAG,CAAC,EACpB6Y,EAAM7Y,EAAM,IAAI,EAAG,CAAC,EACpBwX,EAAMxX,EAAM,IAAI,EAAG,CAAC,EACpB0X,EAAM1X,EAAM,IAAI,EAAG,CAAC,EAEpBiD,GAAMmV,EAAMC,EAAMC,EAAMC,EAAMpB,EAAMI,EAAME,GAAOL,EACjDlU,GAAMkV,EAAMG,IAAQ,CAACG,EAAMtB,GAC3BO,EAAKR,GAAO,CAACsB,EAAMC,EAAME,EAAMxB,EAAME,EAAMuB,EAAMnB,GACjDE,GAAM,CAACQ,EAAMG,EAAMpB,IAAQsB,EAAMC,EAAMtB,GACvCS,GAAMU,EAAMpB,IAAQ,CAACsB,EAAMC,GAC3BZ,EAAKM,EAAMK,EACXV,GAAM,CAACK,EAAMI,EAAMjB,IAAQkB,EAAME,EAAMrB,GACvCwB,GAAM,CAACV,EAAMI,IAAQG,EAAMrB,GAC3ByB,GAAMP,EAAMjB,IAAQ,CAACkB,EAAME,GAC3BK,GAAOZ,EAAMC,EAAMC,EAAMnB,EAAME,EAAMmB,EAAMjB,GAAOD,EAClD2B,EAAM1B,GAAO,CAACkB,EAAME,EAAMC,EAAMxB,EAAME,EAAMuB,EAAMrB,GAClD0B,GAAO,CAACZ,EAAMf,EAAME,IAAQL,EAAMyB,EAAMrB,GACxC2B,IAAOb,EAAMb,IAAQL,EAAMI,GAC3B4B,EAAMd,EAAMO,EACZQ,IAAO9B,EAAME,IAAQ,CAACoB,EAAMrB,GAC5B8B,GAAO,CAAChB,EAAMnB,EAAME,IAAQC,EAAMuB,EAAMnB,GACxC6B,IAAOjB,EAAMjB,IAAQC,EAAMI,GAC3B8B,IAAOrC,EAAME,IAAQ,CAACwB,EAAMnB,GAC5B+B,GAAMpB,EAAMO,EACZc,GAAMrC,EAAMG,EACZmC,GAAMpB,EAAMI,EACZiB,GAAMpB,EAAME,EACZmB,GAAMpC,EAAMC,EAEZM,GAAMF,EAAKsB,EAAMK,GACjBxB,GAAMhV,EAAK2U,EAAKC,EAAKC,EAAKoB,EAAME,EAAMC,GACtCS,GAAMhC,EAAKC,EAAKgB,EAAKC,EAAMI,EAAME,EAAME,GACvCtB,GAAMhV,EAAKyU,EAAKC,EAAKE,EAAKsB,EAAME,EAAMC,GACtCpB,GAAMjV,EAAK0U,EAAKC,EAAKC,EAAK4B,GAC1BK,GAAMX,EAAME,EAAMC,GAAMC,GAAMG,GAC9BK,GAAMlC,EAAKC,EAAKe,EAAKG,EAAMC,EAAMC,GAAMC,EACvCa,GAAMf,EAAMC,GAAMC,EAAMC,GAAMO,GAC9BM,GAAMpC,EAAKC,EAAKe,EAAKC,EAAKc,GAEhC,OAAAjR,EAAO,IAAI,EAAG,EAAGoP,EAAG,EACpBpP,EAAO,IAAI,EAAG,EAAGqP,EAAG,EACpBrP,EAAO,IAAI,EAAG,EAAGkR,EAAG,EACpBlR,EAAO,IAAI,EAAG,EAAGsP,EAAG,EACpBtP,EAAO,IAAI,EAAG,EAAGuP,EAAG,EACpBvP,EAAO,IAAI,EAAG,EAAGmR,EAAG,EACpBnR,EAAO,IAAI,EAAG,EAAGoR,EAAG,EACpBpR,EAAO,IAAI,EAAG,EAAGqR,EAAG,EACpBrR,EAAO,IAAI,EAAG,EAAGsR,EAAG,EACbtR,CACR,CAED,aAAa7I,EAAG,CACdA,EAAIgS,EAAO,YAAYhS,CAAC,EACxB,IAAID,EAAI,KAAK,QACT8K,EAAK9K,EAAE,KACPqa,EAAKra,EAAE,QACP8H,EAAK7H,EAAE,KACPkP,EAAKlP,EAAE,QACPoa,IAAOvS,GAET,QAAQ,KACN,eAAegD,OAAQuP,SAAUvS,OAAQqH,oCACjD,EAKI,SAASmL,EAAMC,EAAKlJ,EAAM4C,EAAM,CAC9B,IAAI/R,EAAIqY,EAAI,KACRhX,EAAIgX,EAAI,QACZ,GAAIrY,IAAMmP,GAAQ9N,IAAM0Q,EACtB,OAAOsG,EACF,CACL,IAAIC,EAAWxI,EAAe,MAAMX,EAAM4C,CAAI,EAC9C,OAAAuG,EAAWA,EAAS,aAAaD,EAAK,EAAG,CAAC,EACnCC,CACR,CACF,CAMD,IAAItY,EAAI,KAAK,IAAI4I,EAAIhD,CAAE,EACnBvE,EAAI,KAAK,IAAI8W,EAAIlL,CAAE,EACvBnP,EAAIsa,EAAMta,EAAGkC,EAAGqB,CAAC,EACjBtD,EAAIqa,EAAMra,EAAGiC,EAAGqB,CAAC,EAGjB,SAASkX,EAAU,EAAGnX,EAAG+N,EAAM4C,EAAM,CAEnC,GAAI5C,GAAQ,KAAO4C,GAAQ,IACzB,OAAO,EAAE,KAAK3Q,CAAC,EAIb+N,EAAO,IAAM,GAAK4C,EAAO,IAAM,GACjC,EAAIqG,EAAM,EAAGjJ,EAAO,EAAG4C,EAAO,CAAC,EAC/B3Q,EAAIgX,EAAMhX,EAAG+N,EAAO,EAAG4C,EAAO,CAAC,GACtB5C,EAAO,IAAM,GACtB,EAAIiJ,EAAM,EAAGjJ,EAAO,EAAG4C,CAAI,EAC3B3Q,EAAIgX,EAAMhX,EAAG+N,EAAO,EAAG4C,CAAI,GAClBA,EAAO,IAAM,IACtB,EAAIqG,EAAM,EAAGjJ,EAAM4C,EAAO,CAAC,EAC3B3Q,EAAIgX,EAAMhX,EAAG+N,EAAM4C,EAAO,CAAC,GAG7B,IAAIyG,EAAW,SAAS,EAAE,KAAO,EAAG,EAAE,EAClCC,EAAW,SAAS,EAAE,QAAU,EAAG,EAAE,EAErCtD,EAAM,EAAE,UAAU,EAAGqD,EAAW,EAAG,EAAGC,EAAW,CAAC,EAClDrD,EAAMhU,EAAE,UAAU,EAAGoX,EAAW,EAAG,EAAGC,EAAW,CAAC,EAElDpD,EAAM,EAAE,UAAU,EAAGmD,EAAW,EAAGC,EAAU,EAAE,QAAU,CAAC,EAC1DnD,EAAMlU,EAAE,UAAU,EAAGoX,EAAW,EAAGC,EAAUrX,EAAE,QAAU,CAAC,EAE1DmU,EAAM,EAAE,UAAUiD,EAAU,EAAE,KAAO,EAAG,EAAGC,EAAW,CAAC,EACvDjD,EAAMpU,EAAE,UAAUoX,EAAUpX,EAAE,KAAO,EAAG,EAAGqX,EAAW,CAAC,EAEvDhD,EAAM,EAAE,UAAU+C,EAAU,EAAE,KAAO,EAAGC,EAAU,EAAE,QAAU,CAAC,EAC/D/C,EAAMtU,EAAE,UAAUoX,EAAUpX,EAAE,KAAO,EAAGqX,EAAUrX,EAAE,QAAU,CAAC,EAG/DH,EAAKsX,EACPzI,EAAe,IAAIqF,EAAKM,CAAG,EAC3B3F,EAAe,IAAIsF,EAAKM,CAAG,EAC3B8C,EACAC,CACR,EACUvX,EAAKqX,EAAUzI,EAAe,IAAIyF,EAAKE,CAAG,EAAGL,EAAKoD,EAAUC,CAAQ,EACpE9C,EAAK4C,EAAUpD,EAAKrF,EAAe,IAAIwF,EAAKI,CAAG,EAAG8C,EAAUC,CAAQ,EACpE7C,EAAK2C,EAAU9C,EAAK3F,EAAe,IAAI0F,EAAKJ,CAAG,EAAGoD,EAAUC,CAAQ,EACpE5C,EAAK0C,EAAUzI,EAAe,IAAIqF,EAAKE,CAAG,EAAGK,EAAK8C,EAAUC,CAAQ,EACpE3C,EAAKyC,EACPzI,EAAe,IAAIyF,EAAKJ,CAAG,EAC3BrF,EAAe,IAAIsF,EAAKE,CAAG,EAC3BkD,EACAC,CACR,EACU1C,EAAKwC,EACPzI,EAAe,IAAIuF,EAAKI,CAAG,EAC3B3F,EAAe,IAAI0F,EAAKE,CAAG,EAC3B8C,EACAC,CACR,EAGUtC,EAAMrG,EAAe,IAAI7O,EAAI2U,CAAE,EACnCO,EAAI,IAAIN,CAAE,EACVM,EAAI,IAAIJ,CAAE,EACV,IAAIgC,GAAMjI,EAAe,IAAI6F,EAAIE,CAAE,EAC/BoC,EAAMnI,EAAe,IAAI5O,EAAI0U,CAAE,EAC/BsC,GAAMpI,EAAe,IAAI7O,EAAIC,CAAE,EACnCgX,GAAI,IAAIvC,CAAE,EACVuC,GAAI,IAAIpC,CAAE,EAGV,IAAIwC,EAAWxI,EAAe,MAAM,EAAIqG,EAAI,KAAM,EAAIA,EAAI,OAAO,EACjE,OAAAmC,EAAWA,EAAS,aAAanC,EAAK,EAAG,CAAC,EAC1CmC,EAAWA,EAAS,aAAaP,GAAK5B,EAAI,KAAM,CAAC,EACjDmC,EAAWA,EAAS,aAAaL,EAAK,EAAG9B,EAAI,OAAO,EACpDmC,EAAWA,EAAS,aAAaJ,GAAK/B,EAAI,KAAMA,EAAI,OAAO,EACpDmC,EAAS,UAAU,EAAGnJ,EAAO,EAAG,EAAG4C,EAAO,CAAC,CACnD,CAED,OAAOwG,EAAUza,EAAGC,EAAGiC,EAAGqB,CAAC,CAC5B,CAED,UAAUuM,EAAU,GAAI,CACtB,GAAI,OAAOA,GAAY,SACrB,MAAM,IAAI,UAAU,2BAA2B,EAEjD,KAAM,CAAE,IAAAM,EAAM,EAAG,IAAAR,EAAM,CAAC,EAAKE,EAC7B,GAAI,CAAC,OAAO,SAASM,CAAG,EAAG,MAAM,IAAI,UAAU,sBAAsB,EACrE,GAAI,CAAC,OAAO,SAASR,CAAG,EAAG,MAAM,IAAI,UAAU,sBAAsB,EACrE,GAAIQ,GAAOR,EAAK,MAAM,IAAI,WAAW,8BAA8B,EACnE,IAAI0F,EAAY,IAAIrD,EAAO,KAAK,KAAM,KAAK,OAAO,EAClD,QAASpO,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAAK,CAClC,MAAM0R,EAAM,KAAK,OAAO1R,CAAC,EACrB0R,EAAI,OAAS,GACfjF,GAAQiF,EAAK,CAAE,IAAAnF,EAAK,IAAAR,EAAK,OAAQ2F,CAAG,CAAE,EAExCD,EAAU,OAAOzR,EAAG0R,CAAG,CACxB,CACD,OAAOD,CACR,CAED,aAAaxF,EAAU,GAAI,CACzB,GAAI,OAAOA,GAAY,SACrB,MAAM,IAAI,UAAU,2BAA2B,EAEjD,KAAM,CAAE,IAAAM,EAAM,EAAG,IAAAR,EAAM,CAAC,EAAKE,EAC7B,GAAI,CAAC,OAAO,SAASM,CAAG,EAAG,MAAM,IAAI,UAAU,sBAAsB,EACrE,GAAI,CAAC,OAAO,SAASR,CAAG,EAAG,MAAM,IAAI,UAAU,sBAAsB,EACrE,GAAIQ,GAAOR,EAAK,MAAM,IAAI,WAAW,8BAA8B,EACnE,IAAI0F,EAAY,IAAIrD,EAAO,KAAK,KAAM,KAAK,OAAO,EAClD,QAASpO,EAAI,EAAGA,EAAI,KAAK,QAASA,IAAK,CACrC,MAAM2R,EAAS,KAAK,UAAU3R,CAAC,EAC3B2R,EAAO,QACTlF,GAAQkF,EAAQ,CACd,IAAKpF,EACL,IAAKR,EACL,OAAQ4F,CAClB,CAAS,EAEHF,EAAU,UAAUzR,EAAG2R,CAAM,CAC9B,CACD,OAAOF,CACR,CAED,UAAW,CACT,MAAMsF,EAAS,KAAK,KAAK,KAAK,QAAU,CAAC,EACzC,QAAS/W,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI8W,EAAQ9W,IAAK,CAC/B,IAAI+W,EAAQ,KAAK,IAAIhX,EAAGC,CAAC,EACrBgX,EAAO,KAAK,IAAIjX,EAAG,KAAK,QAAU,EAAIC,CAAC,EAC3C,KAAK,IAAID,EAAGC,EAAGgX,CAAI,EACnB,KAAK,IAAIjX,EAAG,KAAK,QAAU,EAAIC,EAAG+W,CAAK,CACxC,CAEH,OAAO,IACR,CAED,aAAc,CACZ,MAAMD,EAAS,KAAK,KAAK,KAAK,KAAO,CAAC,EACtC,QAAS9W,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,QAASD,EAAI,EAAGA,EAAI+W,EAAQ/W,IAAK,CAC/B,IAAIgX,EAAQ,KAAK,IAAIhX,EAAGC,CAAC,EACrBgX,EAAO,KAAK,IAAI,KAAK,KAAO,EAAIjX,EAAGC,CAAC,EACxC,KAAK,IAAID,EAAGC,EAAGgX,CAAI,EACnB,KAAK,IAAI,KAAK,KAAO,EAAIjX,EAAGC,EAAG+W,CAAK,CACrC,CAEH,OAAO,IACR,CAED,iBAAiB3a,EAAO,CACtBA,EAAQ+R,EAAO,YAAY/R,CAAK,EAEhC,IAAIkE,EAAI,KAAK,KACTJ,EAAI,KAAK,QACTzD,EAAIL,EAAM,KACVgE,EAAIhE,EAAM,QAEV4I,EAAS,IAAImJ,EAAO7N,EAAI7D,EAAGyD,EAAIE,CAAC,EACpC,QAASL,EAAI,EAAGA,EAAIO,EAAGP,IACrB,QAASC,EAAI,EAAGA,EAAIE,EAAGF,IACrB,QAASC,EAAI,EAAGA,EAAIxD,EAAGwD,IACrB,QAAS/B,EAAI,EAAGA,EAAIkC,EAAGlC,IACrB8G,EAAO,IAAIvI,EAAIsD,EAAIE,EAAGG,EAAIJ,EAAI9B,EAAG,KAAK,IAAI6B,EAAGC,CAAC,EAAI5D,EAAM,IAAI6D,EAAG/B,CAAC,CAAC,EAKzE,OAAO8G,CACR,CAED,aAAa5I,EAAO,CAElB,GADAA,EAAQ+R,EAAO,YAAY/R,CAAK,EAC5B,CAAC,KAAK,SAAQ,GAAM,CAACA,EAAM,SAAQ,EACrC,MAAM,IAAI,MAAM,yCAAyC,EAE3D,IAAIkE,EAAI,KAAK,KACTJ,EAAI9D,EAAM,KACV6a,EAAM,KAAK,iBAAiB9I,EAAO,IAAIjO,EAAGA,CAAC,CAAC,EAC5CgX,EAAM/I,EAAO,IAAI7N,EAAGA,CAAC,EAAE,iBAAiBlE,CAAK,EACjD,OAAO6a,EAAI,IAAIC,CAAG,CACnB,CAED,WAAY,CACV,IAAIlS,EAAS,IAAImJ,EAAO,KAAK,QAAS,KAAK,IAAI,EAC/C,QAASpO,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,QAASC,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChCgF,EAAO,IAAIhF,EAAGD,EAAG,KAAK,IAAIA,EAAGC,CAAC,CAAC,EAGnC,OAAOgF,CACR,CAED,SAASmS,EAAkBC,GAAgB,CACzC,QAASrX,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,KAAK,OAAOA,EAAG,KAAK,OAAOA,CAAC,EAAE,KAAKoX,CAAe,CAAC,EAErD,OAAO,IACR,CAED,YAAYA,EAAkBC,GAAgB,CAC5C,QAASrX,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC,KAAK,UAAUA,EAAG,KAAK,UAAUA,CAAC,EAAE,KAAKoX,CAAe,CAAC,EAE3D,OAAO,IACR,CAED,UAAUpI,EAAUC,EAAQC,EAAaC,EAAW,CAClDJ,GAAW,KAAMC,EAAUC,EAAQC,EAAaC,CAAS,EACzD,IAAIsC,EAAY,IAAIrD,EAClBa,EAASD,EAAW,EACpBG,EAAYD,EAAc,CAChC,EACI,QAASlP,EAAIgP,EAAUhP,GAAKiP,EAAQjP,IAClC,QAASC,EAAIiP,EAAajP,GAAKkP,EAAWlP,IACxCwR,EAAU,IAAIzR,EAAIgP,EAAU/O,EAAIiP,EAAa,KAAK,IAAIlP,EAAGC,CAAC,CAAC,EAG/D,OAAOwR,CACR,CAED,aAAa6F,EAASpI,EAAaC,EAAW,CAG5C,GAFID,IAAgB,SAAWA,EAAc,GACzCC,IAAc,SAAWA,EAAY,KAAK,QAAU,GAEtDD,EAAcC,GACdD,EAAc,GACdA,GAAe,KAAK,SACpBC,EAAY,GACZA,GAAa,KAAK,QAElB,MAAM,IAAI,WAAW,uBAAuB,EAG9C,IAAIsC,EAAY,IAAIrD,EAAOkJ,EAAQ,OAAQnI,EAAYD,EAAc,CAAC,EACtE,QAASlP,EAAI,EAAGA,EAAIsX,EAAQ,OAAQtX,IAClC,QAASC,EAAIiP,EAAajP,GAAKkP,EAAWlP,IAAK,CAC7C,GAAIqX,EAAQtX,CAAC,EAAI,GAAKsX,EAAQtX,CAAC,GAAK,KAAK,KACvC,MAAM,IAAI,WAAW,2BAA2BsX,EAAQtX,CAAC,GAAG,EAE9DyR,EAAU,IAAIzR,EAAGC,EAAIiP,EAAa,KAAK,IAAIoI,EAAQtX,CAAC,EAAGC,CAAC,CAAC,CAC1D,CAEH,OAAOwR,CACR,CAED,gBAAgB6F,EAAStI,EAAUC,EAAQ,CAGzC,GAFID,IAAa,SAAWA,EAAW,GACnCC,IAAW,SAAWA,EAAS,KAAK,KAAO,GAE7CD,EAAWC,GACXD,EAAW,GACXA,GAAY,KAAK,MACjBC,EAAS,GACTA,GAAU,KAAK,KAEf,MAAM,IAAI,WAAW,uBAAuB,EAG9C,IAAIwC,EAAY,IAAIrD,EAAOa,EAASD,EAAW,EAAGsI,EAAQ,MAAM,EAChE,QAAStX,EAAI,EAAGA,EAAIsX,EAAQ,OAAQtX,IAClC,QAASC,EAAI+O,EAAU/O,GAAKgP,EAAQhP,IAAK,CACvC,GAAIqX,EAAQtX,CAAC,EAAI,GAAKsX,EAAQtX,CAAC,GAAK,KAAK,QACvC,MAAM,IAAI,WAAW,8BAA8BsX,EAAQtX,CAAC,GAAG,EAEjEyR,EAAU,IAAIxR,EAAI+O,EAAUhP,EAAG,KAAK,IAAIC,EAAGqX,EAAQtX,CAAC,CAAC,CAAC,CACvD,CAEH,OAAOyR,CACR,CAED,aAAa9Q,EAAQqO,EAAUE,EAAa,CAE1C,GADAvO,EAASyN,EAAO,YAAYzN,CAAM,EAC9BA,EAAO,UACT,OAAO,KAET,IAAIsO,EAASD,EAAWrO,EAAO,KAAO,EAClCwO,EAAYD,EAAcvO,EAAO,QAAU,EAC/CoO,GAAW,KAAMC,EAAUC,EAAQC,EAAaC,CAAS,EACzD,QAASnP,EAAI,EAAGA,EAAIW,EAAO,KAAMX,IAC/B,QAASC,EAAI,EAAGA,EAAIU,EAAO,QAASV,IAClC,KAAK,IAAI+O,EAAWhP,EAAGkP,EAAcjP,EAAGU,EAAO,IAAIX,EAAGC,CAAC,CAAC,EAG5D,OAAO,IACR,CAED,UAAU2O,EAAYE,EAAe,CACnCH,GAAgB,KAAMC,CAAU,EAChCC,GAAmB,KAAMC,CAAa,EACtC,IAAI2C,EAAY,IAAIrD,EAAOQ,EAAW,OAAQE,EAAc,MAAM,EAClE,QAAS9O,EAAI,EAAGA,EAAI4O,EAAW,OAAQ5O,IAAK,CAC1C,IAAIuX,EAAW3I,EAAW5O,CAAC,EAC3B,QAASC,EAAI,EAAGA,EAAI6O,EAAc,OAAQ7O,IAAK,CAC7C,IAAIuX,EAAc1I,EAAc7O,CAAC,EACjCwR,EAAU,IAAIzR,EAAGC,EAAG,KAAK,IAAIsX,EAAUC,CAAW,CAAC,CACpD,CACF,CACD,OAAO/F,CACR,CAED,OAAQ,CACN,IAAIlF,EAAM,KAAK,IAAI,KAAK,KAAM,KAAK,OAAO,EACtCkL,EAAQ,EACZ,QAASzX,EAAI,EAAGA,EAAIuM,EAAKvM,IACvByX,GAAS,KAAK,IAAIzX,EAAGA,CAAC,EAExB,OAAOyX,CACR,CAED,OAAQ,CACN,IAAIhG,EAAY,IAAIrD,EAAO,KAAK,KAAM,KAAK,OAAO,EAClD,QAASsD,EAAM,EAAGA,EAAM,KAAK,KAAMA,IACjC,QAASC,EAAS,EAAGA,EAAS,KAAK,QAASA,IAC1CF,EAAU,IAAIC,EAAKC,EAAQ,KAAK,IAAID,EAAKC,CAAM,CAAC,EAGpD,OAAOF,CACR,CAED,IAAIsB,EAAI,CACN,OAAQA,EAAE,CACR,IAAK,MACH,OAAOrD,GAAS,IAAI,EACtB,IAAK,SACH,OAAOE,GAAY,IAAI,EACzB,KAAK,OACH,OAAOC,GAAO,IAAI,EACpB,QACE,MAAM,IAAI,MAAM,mBAAmBkD,GAAI,CAC1C,CACF,CAED,QAAQA,EAAI,CACV,OAAQA,EAAE,CACR,IAAK,MACH,OAAOjD,GAAa,IAAI,EAC1B,IAAK,SACH,OAAOC,GAAgB,IAAI,EAC7B,KAAK,OACH,OAAOC,GAAW,IAAI,EACxB,QACE,MAAM,IAAI,MAAM,mBAAmB+C,GAAI,CAC1C,CACF,CAED,KAAKA,EAAI,CACP,MAAMpD,EAAM,KAAK,IAAIoD,CAAE,EACvB,OAAQA,EAAE,CACR,IAAK,MAAO,CACV,QAAS/S,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B2P,EAAI3P,CAAC,GAAK,KAAK,QAEjB,OAAO2P,CACR,CACD,IAAK,SAAU,CACb,QAAS3P,EAAI,EAAGA,EAAI,KAAK,QAASA,IAChC2P,EAAI3P,CAAC,GAAK,KAAK,KAEjB,OAAO2P,CACR,CACD,KAAK,OACH,OAAOA,EAAM,KAAK,KACpB,QACE,MAAM,IAAI,MAAM,mBAAmBoD,GAAI,CAC1C,CACF,CAED,SAASA,EAAI9G,EAAU,GAAI,CAKzB,GAJI,OAAO8G,GAAO,WAChB9G,EAAU8G,EACVA,EAAK,QAEH,OAAO9G,GAAY,SACrB,MAAM,IAAI,UAAU,2BAA2B,EAEjD,KAAM,CAAE,SAAAiE,EAAW,GAAM,KAAAC,EAAO,KAAK,KAAK4C,CAAE,CAAG,EAAG9G,EAClD,GAAI,OAAOiE,GAAa,UACtB,MAAM,IAAI,UAAU,4BAA4B,EAElD,OAAQ6C,EAAE,CACR,IAAK,MAAO,CACV,GAAI,CAACnH,EAAWuE,CAAI,EAClB,MAAM,IAAI,UAAU,uBAAuB,EAE7C,OAAOF,GAAc,KAAMC,EAAUC,CAAI,CAC1C,CACD,IAAK,SAAU,CACb,GAAI,CAACvE,EAAWuE,CAAI,EAClB,MAAM,IAAI,UAAU,uBAAuB,EAE7C,OAAOK,GAAiB,KAAMN,EAAUC,CAAI,CAC7C,CACD,KAAK,OAAW,CACd,GAAI,OAAOA,GAAS,SAClB,MAAM,IAAI,UAAU,uBAAuB,EAE7C,OAAOM,GAAY,KAAMP,EAAUC,CAAI,CACxC,CACD,QACE,MAAM,IAAI,MAAM,mBAAmB4C,GAAI,CAC1C,CACF,CAED,kBAAkBA,EAAI9G,EAAS,CACzB,OAAO8G,GAAO,WAChB9G,EAAU8G,EACVA,EAAK,QAEP,MAAM1C,EAAW,KAAK,SAAS0C,EAAI9G,CAAO,EAC1C,GAAI8G,IAAO,OACT,OAAO,KAAK,KAAK1C,CAAQ,EAEzB,QAASrQ,EAAI,EAAGA,EAAIqQ,EAAS,OAAQrQ,IACnCqQ,EAASrQ,CAAC,EAAI,KAAK,KAAKqQ,EAASrQ,CAAC,CAAC,EAErC,OAAOqQ,CAEV,CAED,OAAO0C,EAAI9G,EAAU,GAAI,CAKvB,GAJI,OAAO8G,GAAO,WAChB9G,EAAU8G,EACVA,EAAK,QAEH,OAAO9G,GAAY,SACrB,MAAM,IAAI,UAAU,2BAA2B,EAEjD,KAAM,CAAE,OAAA7M,EAAS,KAAK,KAAK2T,CAAE,CAAG,EAAG9G,EACnC,OAAQ8G,EAAE,CACR,IAAK,MAAO,CACV,GAAI,CAACnH,EAAWxM,CAAM,EACpB,MAAM,IAAI,UAAU,yBAAyB,EAE/C,OAAAuR,GAAY,KAAMvR,CAAM,EACjB,IACR,CACD,IAAK,SAAU,CACb,GAAI,CAACwM,EAAWxM,CAAM,EACpB,MAAM,IAAI,UAAU,yBAAyB,EAE/C,OAAAwR,GAAe,KAAMxR,CAAM,EACpB,IACR,CACD,KAAK,OAAW,CACd,GAAI,OAAOA,GAAW,SACpB,MAAM,IAAI,UAAU,yBAAyB,EAE/C,OAAAyR,GAAU,KAAMzR,CAAM,EACf,IACR,CACD,QACE,MAAM,IAAI,MAAM,mBAAmB2T,GAAI,CAC1C,CACF,CAED,MAAMA,EAAI9G,EAAU,GAAI,CAKtB,GAJI,OAAO8G,GAAO,WAChB9G,EAAU8G,EACVA,EAAK,QAEH,OAAO9G,GAAY,SACrB,MAAM,IAAI,UAAU,2BAA2B,EAEjD,IAAI8E,EAAQ9E,EAAQ,MACpB,OAAQ8G,EAAE,CACR,IAAK,MAAO,CACV,GAAIhC,IAAU,OACZA,EAAQD,GAAc,IAAI,UACjB,CAAClF,EAAWmF,CAAK,EAC1B,MAAM,IAAI,UAAU,wBAAwB,EAE9C,OAAAC,GAAW,KAAMD,CAAK,EACf,IACR,CACD,IAAK,SAAU,CACb,GAAIA,IAAU,OACZA,EAAQE,GAAiB,IAAI,UACpB,CAACrF,EAAWmF,CAAK,EAC1B,MAAM,IAAI,UAAU,wBAAwB,EAE9C,OAAAG,GAAc,KAAMH,CAAK,EAClB,IACR,CACD,KAAK,OAAW,CACd,GAAIA,IAAU,OACZA,EAAQI,GAAY,IAAI,UACf,OAAOJ,GAAU,SAC1B,MAAM,IAAI,UAAU,wBAAwB,EAE9C,OAAAM,GAAS,KAAMN,CAAK,EACb,IACR,CACD,QACE,MAAM,IAAI,MAAM,mBAAmBgC,GAAI,CAC1C,CACF,CAED,SAAS9G,EAAS,CAChB,OAAOiB,GAAyB,KAAMjB,CAAO,CAC9C,CACH,CAEAkC,EAAe,UAAU,MAAQ,SAC7B,OAAO,OAAW,MACpBA,EAAe,UAAU,OAAO,IAAI,4BAA4B,CAAC,EAC/DlB,IAGJ,SAASoK,GAAe7X,EAAGC,EAAG,CAC5B,OAAOD,EAAIC,CACb,CAEA,SAASiY,GAAiBnI,EAAO,CAC/B,OAAOA,EAAM,MAAOoI,GACX,OAAOA,GAAY,QAC3B,CACH,CAGAxJ,EAAe,OAASA,EAAe,KACvCA,EAAe,UAAYA,EAAe,QAC1CA,EAAe,SAAWA,EAAe,KACzCA,EAAe,UAAU,SAAWA,EAAe,UAAU,KAC7DA,EAAe,SAAWA,EAAe,IACzCA,EAAe,UAAU,OAASA,EAAe,UAAU,IAC3DA,EAAe,UAAU,cACvBA,EAAe,UAAU,iBAEZ,MAAMC,UAAeD,CAAe,CACjD,YAAYyJ,EAAOC,EAAU,CAE3B,GADA,QACIzJ,EAAO,SAASwJ,CAAK,EAEvB,OAAOA,EAAM,QACR,GAAI,OAAO,UAAUA,CAAK,GAAKA,GAAS,EAG7C,GADA,KAAK,KAAO,GACR,OAAO,UAAUC,CAAQ,GAAKA,GAAY,EAC5C,QAAS7X,EAAI,EAAGA,EAAI4X,EAAO5X,IACzB,KAAK,KAAK,KAAK,IAAI,aAAa6X,CAAQ,CAAC,MAG3C,OAAM,IAAI,UAAU,qCAAqC,UAElDjM,EAAWgM,CAAK,EAAG,CAE5B,MAAME,EAAYF,EAGlB,GAFAA,EAAQE,EAAU,OAClBD,EAAWD,EAAQE,EAAU,CAAC,EAAE,OAAS,EACrC,OAAOD,GAAa,SACtB,MAAM,IAAI,UACR,mDACV,EAEM,KAAK,KAAO,GACZ,QAAS7X,EAAI,EAAGA,EAAI4X,EAAO5X,IAAK,CAC9B,GAAI8X,EAAU9X,CAAC,EAAE,SAAW6X,EAC1B,MAAM,IAAI,WAAW,+BAA+B,EAEtD,GAAI,CAACH,GAAiBI,EAAU9X,CAAC,CAAC,EAChC,MAAM,IAAI,UAAU,wCAAwC,EAE9D,KAAK,KAAK,KAAK,aAAa,KAAK8X,EAAU9X,CAAC,CAAC,CAAC,CAC/C,CACP,KACM,OAAM,IAAI,UACR,sDACR,EAEI,KAAK,KAAO4X,EACZ,KAAK,QAAUC,CAChB,CAED,IAAIN,EAAUC,EAAa3L,EAAO,CAChC,YAAK,KAAK0L,CAAQ,EAAEC,CAAW,EAAI3L,EAC5B,IACR,CAED,IAAI0L,EAAUC,EAAa,CACzB,OAAO,KAAK,KAAKD,CAAQ,EAAEC,CAAW,CACvC,CAED,UAAUjV,EAAO,CACf,OAAA+L,EAAc,KAAM/L,CAAK,EACzB,KAAK,KAAK,OAAOA,EAAO,CAAC,EACzB,KAAK,MAAQ,EACN,IACR,CAED,OAAOA,EAAOgN,EAAO,CACnB,OAAIA,IAAU,SACZA,EAAQhN,EACRA,EAAQ,KAAK,MAEf+L,EAAc,KAAM/L,EAAO,EAAI,EAC/BgN,EAAQ,aAAa,KAAKd,GAAe,KAAMc,CAAK,CAAC,EACrD,KAAK,KAAK,OAAOhN,EAAO,EAAGgN,CAAK,EAChC,KAAK,MAAQ,EACN,IACR,CAED,aAAahN,EAAO,CAClBiM,EAAiB,KAAMjM,CAAK,EAC5B,QAASvC,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAAK,CAClC,MAAM+X,EAAS,IAAI,aAAa,KAAK,QAAU,CAAC,EAChD,QAAS9X,EAAI,EAAGA,EAAIsC,EAAOtC,IACzB8X,EAAO9X,CAAC,EAAI,KAAK,KAAKD,CAAC,EAAEC,CAAC,EAE5B,QAASA,EAAIsC,EAAQ,EAAGtC,EAAI,KAAK,QAASA,IACxC8X,EAAO9X,EAAI,CAAC,EAAI,KAAK,KAAKD,CAAC,EAAEC,CAAC,EAEhC,KAAK,KAAKD,CAAC,EAAI+X,CAChB,CACD,YAAK,SAAW,EACT,IACR,CAED,UAAUxV,EAAOgN,EAAO,CAClB,OAAOA,EAAU,MACnBA,EAAQhN,EACRA,EAAQ,KAAK,SAEfiM,EAAiB,KAAMjM,EAAO,EAAI,EAClCgN,EAAQb,GAAkB,KAAMa,CAAK,EACrC,QAASvP,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAAK,CAClC,MAAM+X,EAAS,IAAI,aAAa,KAAK,QAAU,CAAC,EAChD,IAAI9X,EAAI,EACR,KAAOA,EAAIsC,EAAOtC,IAChB8X,EAAO9X,CAAC,EAAI,KAAK,KAAKD,CAAC,EAAEC,CAAC,EAG5B,IADA8X,EAAO9X,GAAG,EAAIsP,EAAMvP,CAAC,EACdC,EAAI,KAAK,QAAU,EAAGA,IAC3B8X,EAAO9X,CAAC,EAAI,KAAK,KAAKD,CAAC,EAAEC,EAAI,CAAC,EAEhC,KAAK,KAAKD,CAAC,EAAI+X,CAChB,CACD,YAAK,SAAW,EACT,IACR,CACH,CAEA7J,GAAsBC,EAAgBC,CAAM,EClnD7B,MAAM4J,WAAwB7J,CAAe,CAC1D,YAAY2D,EAAM,CAChB,QACA,KAAK,KAAOA,EACZ,KAAK,KAAOA,EAAK,OACjB,KAAK,QAAUA,EAAK,CAAC,EAAE,MACxB,CAED,IAAIyF,EAAUC,EAAa3L,EAAO,CAChC,YAAK,KAAK0L,CAAQ,EAAEC,CAAW,EAAI3L,EAC5B,IACR,CAED,IAAI0L,EAAUC,EAAa,CACzB,OAAO,KAAK,KAAKD,CAAQ,EAAEC,CAAW,CACvC,CACH,CClBO,SAASS,GAAWzY,EAAGC,EAAG,CAC/B,IAAIpB,EAAI,EACR,OAAI,KAAK,IAAImB,CAAC,EAAI,KAAK,IAAIC,CAAC,GAC1BpB,EAAIoB,EAAID,EACD,KAAK,IAAIA,CAAC,EAAI,KAAK,KAAK,EAAInB,EAAIA,CAAC,GAEtCoB,IAAM,GACRpB,EAAImB,EAAIC,EACD,KAAK,IAAIA,CAAC,EAAI,KAAK,KAAK,EAAIpB,EAAIA,CAAC,GAEnC,CACT,CCNe,MAAM6Z,EAAwB,CAC3C,YAAYvX,EAAQsL,EAAU,GAAI,CAChC,KAAM,CAAE,gBAAAkM,EAAkB,EAAO,EAAGlM,EAGpC,GADAtL,EAASqX,GAAgB,YAAYrX,CAAM,EACvC,CAACA,EAAO,WACV,MAAM,IAAI,MAAM,+BAA+B,EAGjD,GAAIA,EAAO,UACT,MAAM,IAAI,MAAM,0BAA0B,EAG5C,IAAIR,EAAIQ,EAAO,QACXyX,EAAI,IAAIhK,EAAOjO,EAAGA,CAAC,EACnBR,EAAI,IAAI,aAAaQ,CAAC,EACtBP,EAAI,IAAI,aAAaO,CAAC,EACtB0L,EAAQlL,EACRX,EAAGC,EAEHoY,EAAc,GAOlB,GANIF,EACFE,EAAc,GAEdA,EAAc1X,EAAO,cAGnB0X,EAAa,CACf,IAAKrY,EAAI,EAAGA,EAAIG,EAAGH,IACjB,IAAKC,EAAI,EAAGA,EAAIE,EAAGF,IACjBmY,EAAE,IAAIpY,EAAGC,EAAG4L,EAAM,IAAI7L,EAAGC,CAAC,CAAC,EAG/BqY,GAAMnY,EAAGP,EAAGD,EAAGyY,CAAC,EAChBG,GAAKpY,EAAGP,EAAGD,EAAGyY,CAAC,CACrB,KAAW,CACL,IAAII,EAAI,IAAIpK,EAAOjO,EAAGA,CAAC,EACnBsY,EAAM,IAAI,aAAatY,CAAC,EAC5B,IAAKF,EAAI,EAAGA,EAAIE,EAAGF,IACjB,IAAKD,EAAI,EAAGA,EAAIG,EAAGH,IACjBwY,EAAE,IAAIxY,EAAGC,EAAG4L,EAAM,IAAI7L,EAAGC,CAAC,CAAC,EAG/ByY,GAAOvY,EAAGqY,EAAGC,EAAKL,CAAC,EACnBO,GAAKxY,EAAGP,EAAGD,EAAGyY,EAAGI,CAAC,CACnB,CAED,KAAK,EAAIrY,EACT,KAAK,EAAIP,EACT,KAAK,EAAID,EACT,KAAK,EAAIyY,CACV,CAED,IAAI,iBAAkB,CACpB,OAAO,MAAM,KAAK,KAAK,CAAC,CACzB,CAED,IAAI,sBAAuB,CACzB,OAAO,MAAM,KAAK,KAAK,CAAC,CACzB,CAED,IAAI,mBAAoB,CACtB,OAAO,KAAK,CACb,CAED,IAAI,gBAAiB,CACnB,IAAIjY,EAAI,KAAK,EACTP,EAAI,KAAK,EACTD,EAAI,KAAK,EACTiZ,EAAI,IAAIxK,EAAOjO,EAAGA,CAAC,EACnBH,EAAGC,EACP,IAAKD,EAAI,EAAGA,EAAIG,EAAGH,IAAK,CACtB,IAAKC,EAAI,EAAGA,EAAIE,EAAGF,IACjB2Y,EAAE,IAAI5Y,EAAGC,EAAG,CAAC,EAEf2Y,EAAE,IAAI5Y,EAAGA,EAAGL,EAAEK,CAAC,CAAC,EACZJ,EAAEI,CAAC,EAAI,EACT4Y,EAAE,IAAI5Y,EAAGA,EAAI,EAAGJ,EAAEI,CAAC,CAAC,EACXJ,EAAEI,CAAC,EAAI,GAChB4Y,EAAE,IAAI5Y,EAAGA,EAAI,EAAGJ,EAAEI,CAAC,CAAC,CAEvB,CACD,OAAO4Y,CACR,CACH,CAEA,SAASN,GAAMnY,EAAGP,EAAGD,EAAGyY,EAAG,CACzB,IAAIvY,EAAGC,EAAGC,EAAGC,EAAGC,EAAGC,EAAG2Y,EAAI9H,EAE1B,IAAK9Q,EAAI,EAAGA,EAAIE,EAAGF,IACjBN,EAAEM,CAAC,EAAImY,EAAE,IAAIjY,EAAI,EAAGF,CAAC,EAGvB,IAAKD,EAAIG,EAAI,EAAGH,EAAI,EAAGA,IAAK,CAG1B,IAFA+Q,EAAQ,EACRhR,EAAI,EACCG,EAAI,EAAGA,EAAIF,EAAGE,IACjB6Q,EAAQA,EAAQ,KAAK,IAAIpR,EAAEO,CAAC,CAAC,EAG/B,GAAI6Q,IAAU,EAEZ,IADAnR,EAAEI,CAAC,EAAIL,EAAEK,EAAI,CAAC,EACTC,EAAI,EAAGA,EAAID,EAAGC,IACjBN,EAAEM,CAAC,EAAImY,EAAE,IAAIpY,EAAI,EAAGC,CAAC,EACrBmY,EAAE,IAAIpY,EAAGC,EAAG,CAAC,EACbmY,EAAE,IAAInY,EAAGD,EAAG,CAAC,MAEV,CACL,IAAKE,EAAI,EAAGA,EAAIF,EAAGE,IACjBP,EAAEO,CAAC,GAAK6Q,EACRhR,GAAKJ,EAAEO,CAAC,EAAIP,EAAEO,CAAC,EAYjB,IATAL,EAAIF,EAAEK,EAAI,CAAC,EACXF,EAAI,KAAK,KAAKC,CAAC,EACXF,EAAI,IACNC,EAAI,CAACA,GAGPF,EAAEI,CAAC,EAAI+Q,EAAQjR,EACfC,EAAIA,EAAIF,EAAIC,EACZH,EAAEK,EAAI,CAAC,EAAIH,EAAIC,EACVG,EAAI,EAAGA,EAAID,EAAGC,IACjBL,EAAEK,CAAC,EAAI,EAGT,IAAKA,EAAI,EAAGA,EAAID,EAAGC,IAAK,CAItB,IAHAJ,EAAIF,EAAEM,CAAC,EACPmY,EAAE,IAAInY,EAAGD,EAAGH,CAAC,EACbC,EAAIF,EAAEK,CAAC,EAAImY,EAAE,IAAInY,EAAGA,CAAC,EAAIJ,EACpBK,EAAID,EAAI,EAAGC,GAAKF,EAAI,EAAGE,IAC1BJ,GAAKsY,EAAE,IAAIlY,EAAGD,CAAC,EAAIN,EAAEO,CAAC,EACtBN,EAAEM,CAAC,GAAKkY,EAAE,IAAIlY,EAAGD,CAAC,EAAIJ,EAExBD,EAAEK,CAAC,EAAIH,CACR,CAGD,IADAD,EAAI,EACCI,EAAI,EAAGA,EAAID,EAAGC,IACjBL,EAAEK,CAAC,GAAKF,EACRF,GAAKD,EAAEK,CAAC,EAAIN,EAAEM,CAAC,EAIjB,IADA4Y,EAAKhZ,GAAKE,EAAIA,GACTE,EAAI,EAAGA,EAAID,EAAGC,IACjBL,EAAEK,CAAC,GAAK4Y,EAAKlZ,EAAEM,CAAC,EAGlB,IAAKA,EAAI,EAAGA,EAAID,EAAGC,IAAK,CAGtB,IAFAJ,EAAIF,EAAEM,CAAC,EACPH,EAAIF,EAAEK,CAAC,EACFC,EAAID,EAAGC,GAAKF,EAAI,EAAGE,IACtBkY,EAAE,IAAIlY,EAAGD,EAAGmY,EAAE,IAAIlY,EAAGD,CAAC,GAAKJ,EAAID,EAAEM,CAAC,EAAIJ,EAAIH,EAAEO,CAAC,EAAE,EAEjDP,EAAEM,CAAC,EAAImY,EAAE,IAAIpY,EAAI,EAAGC,CAAC,EACrBmY,EAAE,IAAIpY,EAAGC,EAAG,CAAC,CACd,CACF,CACDN,EAAEK,CAAC,EAAID,CACR,CAED,IAAKC,EAAI,EAAGA,EAAIG,EAAI,EAAGH,IAAK,CAI1B,GAHAoY,EAAE,IAAIjY,EAAI,EAAGH,EAAGoY,EAAE,IAAIpY,EAAGA,CAAC,CAAC,EAC3BoY,EAAE,IAAIpY,EAAGA,EAAG,CAAC,EACbD,EAAIJ,EAAEK,EAAI,CAAC,EACPD,IAAM,EAAG,CACX,IAAKG,EAAI,EAAGA,GAAKF,EAAGE,IAClBP,EAAEO,CAAC,EAAIkY,EAAE,IAAIlY,EAAGF,EAAI,CAAC,EAAID,EAG3B,IAAKE,EAAI,EAAGA,GAAKD,EAAGC,IAAK,CAEvB,IADAH,EAAI,EACCI,EAAI,EAAGA,GAAKF,EAAGE,IAClBJ,GAAKsY,EAAE,IAAIlY,EAAGF,EAAI,CAAC,EAAIoY,EAAE,IAAIlY,EAAGD,CAAC,EAEnC,IAAKC,EAAI,EAAGA,GAAKF,EAAGE,IAClBkY,EAAE,IAAIlY,EAAGD,EAAGmY,EAAE,IAAIlY,EAAGD,CAAC,EAAIH,EAAIH,EAAEO,CAAC,CAAC,CAErC,CACF,CAED,IAAKA,EAAI,EAAGA,GAAKF,EAAGE,IAClBkY,EAAE,IAAIlY,EAAGF,EAAI,EAAG,CAAC,CAEpB,CAED,IAAKC,EAAI,EAAGA,EAAIE,EAAGF,IACjBN,EAAEM,CAAC,EAAImY,EAAE,IAAIjY,EAAI,EAAGF,CAAC,EACrBmY,EAAE,IAAIjY,EAAI,EAAGF,EAAG,CAAC,EAGnBmY,EAAE,IAAIjY,EAAI,EAAGA,EAAI,EAAG,CAAC,EACrBP,EAAE,CAAC,EAAI,CACT,CAEA,SAAS2Y,GAAKpY,EAAGP,EAAGD,EAAGyY,EAAG,CACrB,IAACtY,EAAGC,EAAGC,EAAGC,EAAGC,EAAG,EAAGK,EAAG7D,EAAG2B,EAAGya,EAAKpZ,EAAG4L,EAAIyN,EAAIC,EAAKzF,EAAG0F,EAEvD,IAAKjZ,EAAI,EAAGA,EAAIG,EAAGH,IACjBJ,EAAEI,EAAI,CAAC,EAAIJ,EAAEI,CAAC,EAGhBJ,EAAEO,EAAI,CAAC,EAAI,EAEX,IAAIN,EAAI,EACJqZ,EAAO,EACPC,EAAM,OAAO,QAEjB,IAAK,EAAI,EAAG,EAAIhZ,EAAG,IAAK,CAGtB,IAFA+Y,EAAO,KAAK,IAAIA,EAAM,KAAK,IAAIvZ,EAAE,CAAC,CAAC,EAAI,KAAK,IAAIC,EAAE,CAAC,CAAC,CAAC,EACrDW,EAAI,EACGA,EAAIJ,GACL,OAAK,IAAIP,EAAEW,CAAC,CAAC,GAAK4Y,EAAMD,IAG5B3Y,IAGF,GAAIA,EAAI,EAEN,EAAG,CAcD,IAXAT,EAAIH,EAAE,CAAC,EACPjD,GAAKiD,EAAE,EAAI,CAAC,EAAIG,IAAM,EAAIF,EAAE,CAAC,GAC7BvB,EAAI4Z,GAAWvb,EAAG,CAAC,EACfA,EAAI,IACN2B,EAAI,CAACA,GAGPsB,EAAE,CAAC,EAAIC,EAAE,CAAC,GAAKlD,EAAI2B,GACnBsB,EAAE,EAAI,CAAC,EAAIC,EAAE,CAAC,GAAKlD,EAAI2B,GACvBya,EAAMnZ,EAAE,EAAI,CAAC,EACbI,EAAID,EAAIH,EAAE,CAAC,EACNK,EAAI,EAAI,EAAGA,EAAIG,EAAGH,IACrBL,EAAEK,CAAC,GAAKD,EAYV,IATAF,EAAIA,EAAIE,EAERrD,EAAIiD,EAAEY,CAAC,EACPb,EAAI,EACJ4L,EAAK5L,EACLqZ,EAAKrZ,EACLsZ,EAAMpZ,EAAE,EAAI,CAAC,EACb2T,EAAI,EACJ0F,EAAK,EACAjZ,EAAIO,EAAI,EAAGP,GAAK,EAAGA,IAatB,IAZA+Y,EAAKzN,EACLA,EAAK5L,EACLuZ,EAAK1F,EACLzT,EAAIJ,EAAIE,EAAEI,CAAC,EACXD,EAAIL,EAAIhD,EACR2B,EAAI4Z,GAAWvb,EAAGkD,EAAEI,CAAC,CAAC,EACtBJ,EAAEI,EAAI,CAAC,EAAIuT,EAAIlV,EACfkV,EAAI3T,EAAEI,CAAC,EAAI3B,EACXqB,EAAIhD,EAAI2B,EACR3B,EAAIgD,EAAIC,EAAEK,CAAC,EAAIuT,EAAIzT,EACnBH,EAAEK,EAAI,CAAC,EAAID,EAAIwT,GAAK7T,EAAII,EAAIyT,EAAI5T,EAAEK,CAAC,GAE9BE,EAAI,EAAGA,EAAIC,EAAGD,IACjBH,EAAIqY,EAAE,IAAIlY,EAAGF,EAAI,CAAC,EAClBoY,EAAE,IAAIlY,EAAGF,EAAI,EAAGuT,EAAI6E,EAAE,IAAIlY,EAAGF,CAAC,EAAIN,EAAIK,CAAC,EACvCqY,EAAE,IAAIlY,EAAGF,EAAGN,EAAI0Y,EAAE,IAAIlY,EAAGF,CAAC,EAAIuT,EAAIxT,CAAC,EAIvCrD,EAAK,CAAC6W,EAAI0F,EAAKF,EAAKC,EAAMpZ,EAAE,CAAC,EAAKkZ,EAClClZ,EAAE,CAAC,EAAI2T,EAAI7W,EACXiD,EAAE,CAAC,EAAID,EAAIhD,CACnB,OAAe,KAAK,IAAIkD,EAAE,CAAC,CAAC,EAAIuZ,EAAMD,GAElCvZ,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAIE,EACdD,EAAE,CAAC,EAAI,CACR,CAED,IAAKI,EAAI,EAAGA,EAAIG,EAAI,EAAGH,IAAK,CAG1B,IAFAE,EAAIF,EACJtD,EAAIiD,EAAEK,CAAC,EACFC,EAAID,EAAI,EAAGC,EAAIE,EAAGF,IACjBN,EAAEM,CAAC,EAAIvD,IACTwD,EAAID,EACJvD,EAAIiD,EAAEM,CAAC,GAIX,GAAIC,IAAMF,EAGR,IAFAL,EAAEO,CAAC,EAAIP,EAAEK,CAAC,EACVL,EAAEK,CAAC,EAAItD,EACFuD,EAAI,EAAGA,EAAIE,EAAGF,IACjBvD,EAAI0b,EAAE,IAAInY,EAAGD,CAAC,EACdoY,EAAE,IAAInY,EAAGD,EAAGoY,EAAE,IAAInY,EAAGC,CAAC,CAAC,EACvBkY,EAAE,IAAInY,EAAGC,EAAGxD,CAAC,CAGlB,CACH,CAEA,SAASgc,GAAOvY,EAAGqY,EAAGC,EAAKL,EAAG,CAC5B,IAAIgB,EAAM,EACNC,EAAOlZ,EAAI,EACXN,EAAGC,EAAGC,EAAGC,EAAGC,EAAGM,EACfwQ,EAEJ,IAAKxQ,EAAI6Y,EAAM,EAAG7Y,GAAK8Y,EAAO,EAAG9Y,IAAK,CAEpC,IADAwQ,EAAQ,EACH/Q,EAAIO,EAAGP,GAAKqZ,EAAMrZ,IACrB+Q,EAAQA,EAAQ,KAAK,IAAIyH,EAAE,IAAIxY,EAAGO,EAAI,CAAC,CAAC,EAG1C,GAAIwQ,IAAU,EAAG,CAEf,IADAhR,EAAI,EACCC,EAAIqZ,EAAMrZ,GAAKO,EAAGP,IACrByY,EAAIzY,CAAC,EAAIwY,EAAE,IAAIxY,EAAGO,EAAI,CAAC,EAAIwQ,EAC3BhR,GAAK0Y,EAAIzY,CAAC,EAAIyY,EAAIzY,CAAC,EAWrB,IARAF,EAAI,KAAK,KAAKC,CAAC,EACX0Y,EAAIlY,CAAC,EAAI,IACXT,EAAI,CAACA,GAGPC,EAAIA,EAAI0Y,EAAIlY,CAAC,EAAIT,EACjB2Y,EAAIlY,CAAC,EAAIkY,EAAIlY,CAAC,EAAIT,EAEbG,EAAIM,EAAGN,EAAIE,EAAGF,IAAK,CAEtB,IADAJ,EAAI,EACCG,EAAIqZ,EAAMrZ,GAAKO,EAAGP,IACrBH,GAAK4Y,EAAIzY,CAAC,EAAIwY,EAAE,IAAIxY,EAAGC,CAAC,EAI1B,IADAJ,EAAIA,EAAIE,EACHC,EAAIO,EAAGP,GAAKqZ,EAAMrZ,IACrBwY,EAAE,IAAIxY,EAAGC,EAAGuY,EAAE,IAAIxY,EAAGC,CAAC,EAAIJ,EAAI4Y,EAAIzY,CAAC,CAAC,CAEvC,CAED,IAAKA,EAAI,EAAGA,GAAKqZ,EAAMrZ,IAAK,CAE1B,IADAH,EAAI,EACCI,EAAIoZ,EAAMpZ,GAAKM,EAAGN,IACrBJ,GAAK4Y,EAAIxY,CAAC,EAAIuY,EAAE,IAAIxY,EAAGC,CAAC,EAI1B,IADAJ,EAAIA,EAAIE,EACHE,EAAIM,EAAGN,GAAKoZ,EAAMpZ,IACrBuY,EAAE,IAAIxY,EAAGC,EAAGuY,EAAE,IAAIxY,EAAGC,CAAC,EAAIJ,EAAI4Y,EAAIxY,CAAC,CAAC,CAEvC,CAEDwY,EAAIlY,CAAC,EAAIwQ,EAAQ0H,EAAIlY,CAAC,EACtBiY,EAAE,IAAIjY,EAAGA,EAAI,EAAGwQ,EAAQjR,CAAC,CAC1B,CACF,CAED,IAAKE,EAAI,EAAGA,EAAIG,EAAGH,IACjB,IAAKC,EAAI,EAAGA,EAAIE,EAAGF,IACjBmY,EAAE,IAAIpY,EAAGC,EAAGD,IAAMC,EAAI,EAAI,CAAC,EAI/B,IAAKM,EAAI8Y,EAAO,EAAG9Y,GAAK6Y,EAAM,EAAG7Y,IAC/B,GAAIiY,EAAE,IAAIjY,EAAGA,EAAI,CAAC,IAAM,EAAG,CACzB,IAAKP,EAAIO,EAAI,EAAGP,GAAKqZ,EAAMrZ,IACzByY,EAAIzY,CAAC,EAAIwY,EAAE,IAAIxY,EAAGO,EAAI,CAAC,EAGzB,IAAKN,EAAIM,EAAGN,GAAKoZ,EAAMpZ,IAAK,CAE1B,IADAH,EAAI,EACCE,EAAIO,EAAGP,GAAKqZ,EAAMrZ,IACrBF,GAAK2Y,EAAIzY,CAAC,EAAIoY,EAAE,IAAIpY,EAAGC,CAAC,EAI1B,IADAH,EAAIA,EAAI2Y,EAAIlY,CAAC,EAAIiY,EAAE,IAAIjY,EAAGA,EAAI,CAAC,EAC1BP,EAAIO,EAAGP,GAAKqZ,EAAMrZ,IACrBoY,EAAE,IAAIpY,EAAGC,EAAGmY,EAAE,IAAIpY,EAAGC,CAAC,EAAIH,EAAI2Y,EAAIzY,CAAC,CAAC,CAEvC,CACF,CAEL,CAEA,SAAS2Y,GAAKW,EAAI1Z,EAAGD,EAAGyY,EAAGI,EAAG,CAC5B,IAAIrY,EAAImZ,EAAK,EACTF,EAAM,EACNC,EAAOC,EAAK,EACZH,EAAM,OAAO,QACbI,EAAU,EACVC,EAAO,EACP9c,EAAI,EACJ2D,EAAI,EACJhC,EAAI,EACJkV,EAAI,EACJkG,EAAI,EACJC,EAAO,EACP1Z,EAAGC,EAAGC,EAAG/B,EAAGoC,EAAG2K,EAAGyO,EAAGxd,EAAGC,EACxBwd,EAAIC,EAAIC,EAAIC,EACZC,EAASC,EAEb,IAAKja,EAAI,EAAGA,EAAIsZ,EAAItZ,IAMlB,KALIA,EAAIoZ,GAAOpZ,EAAIqZ,KACjB1Z,EAAEK,CAAC,EAAIwY,EAAE,IAAIxY,EAAGA,CAAC,EACjBJ,EAAEI,CAAC,EAAI,GAGJC,EAAI,KAAK,IAAID,EAAI,EAAG,CAAC,EAAGC,EAAIqZ,EAAIrZ,IACnCuZ,EAAOA,EAAO,KAAK,IAAIhB,EAAE,IAAIxY,EAAGC,CAAC,CAAC,EAItC,KAAOE,GAAKiZ,GAAK,CAEf,IADAjb,EAAIgC,EACGhC,EAAIib,IACT7F,EAAI,KAAK,IAAIiF,EAAE,IAAIra,EAAI,EAAGA,EAAI,CAAC,CAAC,EAAI,KAAK,IAAIqa,EAAE,IAAIra,EAAGA,CAAC,CAAC,EACpDoV,IAAM,IACRA,EAAIiG,GAEF,OAAK,IAAIhB,EAAE,IAAIra,EAAGA,EAAI,CAAC,CAAC,EAAIgb,EAAM5F,KAGtCpV,IAGF,GAAIA,IAAMgC,EACRqY,EAAE,IAAIrY,EAAGA,EAAGqY,EAAE,IAAIrY,EAAGA,CAAC,EAAIoZ,CAAO,EACjC5Z,EAAEQ,CAAC,EAAIqY,EAAE,IAAIrY,EAAGA,CAAC,EACjBP,EAAEO,CAAC,EAAI,EACPA,IACAuZ,EAAO,UACEvb,IAAMgC,EAAI,EAAG,CAStB,GARAwZ,EAAInB,EAAE,IAAIrY,EAAGA,EAAI,CAAC,EAAIqY,EAAE,IAAIrY,EAAI,EAAGA,CAAC,EACpCzD,GAAK8b,EAAE,IAAIrY,EAAI,EAAGA,EAAI,CAAC,EAAIqY,EAAE,IAAIrY,EAAGA,CAAC,GAAK,EAC1CE,EAAI3D,EAAIA,EAAIid,EACZF,EAAI,KAAK,KAAK,KAAK,IAAIpZ,CAAC,CAAC,EACzBmY,EAAE,IAAIrY,EAAGA,EAAGqY,EAAE,IAAIrY,EAAGA,CAAC,EAAIoZ,CAAO,EACjCf,EAAE,IAAIrY,EAAI,EAAGA,EAAI,EAAGqY,EAAE,IAAIrY,EAAI,EAAGA,EAAI,CAAC,EAAIoZ,CAAO,EACjDpd,EAAIqc,EAAE,IAAIrY,EAAGA,CAAC,EAEVE,GAAK,EAAG,CAiBV,IAhBAoZ,EAAI/c,GAAK,EAAIA,EAAI+c,EAAI/c,EAAI+c,EACzB9Z,EAAEQ,EAAI,CAAC,EAAIhE,EAAIsd,EACf9Z,EAAEQ,CAAC,EAAIR,EAAEQ,EAAI,CAAC,EACVsZ,IAAM,IACR9Z,EAAEQ,CAAC,EAAIhE,EAAIwd,EAAIF,GAEjB7Z,EAAEO,EAAI,CAAC,EAAI,EACXP,EAAEO,CAAC,EAAI,EACPhE,EAAIqc,EAAE,IAAIrY,EAAGA,EAAI,CAAC,EAClBoT,EAAI,KAAK,IAAIpX,CAAC,EAAI,KAAK,IAAIsd,CAAC,EAC5B/c,EAAIP,EAAIoX,EACRlT,EAAIoZ,EAAIlG,EACRlV,EAAI,KAAK,KAAK3B,EAAIA,EAAI2D,EAAIA,CAAC,EAC3B3D,EAAIA,EAAI2B,EACRgC,EAAIA,EAAIhC,EAEH4B,EAAIE,EAAI,EAAGF,EAAIqZ,EAAIrZ,IACtBwZ,EAAIjB,EAAE,IAAIrY,EAAI,EAAGF,CAAC,EAClBuY,EAAE,IAAIrY,EAAI,EAAGF,EAAGI,EAAIoZ,EAAI/c,EAAI8b,EAAE,IAAIrY,EAAGF,CAAC,CAAC,EACvCuY,EAAE,IAAIrY,EAAGF,EAAGI,EAAImY,EAAE,IAAIrY,EAAGF,CAAC,EAAIvD,EAAI+c,CAAC,EAGrC,IAAKzZ,EAAI,EAAGA,GAAKG,EAAGH,IAClByZ,EAAIjB,EAAE,IAAIxY,EAAGG,EAAI,CAAC,EAClBqY,EAAE,IAAIxY,EAAGG,EAAI,EAAGE,EAAIoZ,EAAI/c,EAAI8b,EAAE,IAAIxY,EAAGG,CAAC,CAAC,EACvCqY,EAAE,IAAIxY,EAAGG,EAAGE,EAAImY,EAAE,IAAIxY,EAAGG,CAAC,EAAIzD,EAAI+c,CAAC,EAGrC,IAAKzZ,EAAIoZ,EAAKpZ,GAAKqZ,EAAMrZ,IACvByZ,EAAIrB,EAAE,IAAIpY,EAAGG,EAAI,CAAC,EAClBiY,EAAE,IAAIpY,EAAGG,EAAI,EAAGE,EAAIoZ,EAAI/c,EAAI0b,EAAE,IAAIpY,EAAGG,CAAC,CAAC,EACvCiY,EAAE,IAAIpY,EAAGG,EAAGE,EAAI+X,EAAE,IAAIpY,EAAGG,CAAC,EAAIzD,EAAI+c,CAAC,CAE7C,MACQ9Z,EAAEQ,EAAI,CAAC,EAAIhE,EAAIO,EACfiD,EAAEQ,CAAC,EAAIhE,EAAIO,EACXkD,EAAEO,EAAI,CAAC,EAAIsZ,EACX7Z,EAAEO,CAAC,EAAI,CAACsZ,EAGVtZ,EAAIA,EAAI,EACRuZ,EAAO,CACb,KAAW,CASL,GARAvd,EAAIqc,EAAE,IAAIrY,EAAGA,CAAC,EACd/D,EAAI,EACJud,EAAI,EACAxb,EAAIgC,IACN/D,EAAIoc,EAAE,IAAIrY,EAAI,EAAGA,EAAI,CAAC,EACtBwZ,EAAInB,EAAE,IAAIrY,EAAGA,EAAI,CAAC,EAAIqY,EAAE,IAAIrY,EAAI,EAAGA,CAAC,GAGlCuZ,IAAS,GAAI,CAEf,IADAH,GAAWpd,EACN6D,EAAIoZ,EAAKpZ,GAAKG,EAAGH,IACpBwY,EAAE,IAAIxY,EAAGA,EAAGwY,EAAE,IAAIxY,EAAGA,CAAC,EAAI7D,CAAC,EAE7BoX,EAAI,KAAK,IAAIiF,EAAE,IAAIrY,EAAGA,EAAI,CAAC,CAAC,EAAI,KAAK,IAAIqY,EAAE,IAAIrY,EAAI,EAAGA,EAAI,CAAC,CAAC,EAC5DhE,EAAIC,EAAI,IAAOmX,EACfoG,EAAI,OAAUpG,EAAIA,CACnB,CAED,GAAImG,IAAS,KACXnG,GAAKnX,EAAID,GAAK,EACdoX,EAAIA,EAAIA,EAAIoG,EACRpG,EAAI,GAAG,CAMT,IALAA,EAAI,KAAK,KAAKA,CAAC,EACXnX,EAAID,IACNoX,EAAI,CAACA,GAEPA,EAAIpX,EAAIwd,IAAMvd,EAAID,GAAK,EAAIoX,GACtBvT,EAAIoZ,EAAKpZ,GAAKG,EAAGH,IACpBwY,EAAE,IAAIxY,EAAGA,EAAGwY,EAAE,IAAIxY,EAAGA,CAAC,EAAIuT,CAAC,EAE7BgG,GAAWhG,EACXpX,EAAIC,EAAIud,EAAI,IACb,CAMH,IAHAD,EAAOA,EAAO,EAEdnZ,EAAIJ,EAAI,EACDI,GAAKpC,IACVsb,EAAIjB,EAAE,IAAIjY,EAAGA,CAAC,EACdlC,EAAIlC,EAAIsd,EACRlG,EAAInX,EAAIqd,EACR/c,GAAK2B,EAAIkV,EAAIoG,GAAKnB,EAAE,IAAIjY,EAAI,EAAGA,CAAC,EAAIiY,EAAE,IAAIjY,EAAGA,EAAI,CAAC,EAClDF,EAAImY,EAAE,IAAIjY,EAAI,EAAGA,EAAI,CAAC,EAAIkZ,EAAIpb,EAAIkV,EAClClV,EAAIma,EAAE,IAAIjY,EAAI,EAAGA,EAAI,CAAC,EACtBgT,EAAI,KAAK,IAAI7W,CAAC,EAAI,KAAK,IAAI2D,CAAC,EAAI,KAAK,IAAIhC,CAAC,EAC1C3B,EAAIA,EAAI6W,EACRlT,EAAIA,EAAIkT,EACRlV,EAAIA,EAAIkV,EACJ,EAAAhT,IAAMpC,GAIR,KAAK,IAAIqa,EAAE,IAAIjY,EAAGA,EAAI,CAAC,CAAC,GAAK,KAAK,IAAIF,CAAC,EAAI,KAAK,IAAIhC,CAAC,GACrD8a,GACG,KAAK,IAAIzc,CAAC,GACR,KAAK,IAAI8b,EAAE,IAAIjY,EAAI,EAAGA,EAAI,CAAC,CAAC,EAC3B,KAAK,IAAIkZ,CAAC,EACV,KAAK,IAAIjB,EAAE,IAAIjY,EAAI,EAAGA,EAAI,CAAC,CAAC,OAIpCA,IAGF,IAAKP,EAAIO,EAAI,EAAGP,GAAKG,EAAGH,IACtBwY,EAAE,IAAIxY,EAAGA,EAAI,EAAG,CAAC,EACbA,EAAIO,EAAI,GACViY,EAAE,IAAIxY,EAAGA,EAAI,EAAG,CAAC,EAIrB,IAAKE,EAAIK,EAAGL,GAAKC,EAAI,IACnB6Z,EAAU9Z,IAAMC,EAAI,EAChBD,IAAMK,IACR7D,EAAI8b,EAAE,IAAItY,EAAGA,EAAI,CAAC,EAClBG,EAAImY,EAAE,IAAItY,EAAI,EAAGA,EAAI,CAAC,EACtB7B,EAAI2b,EAAUxB,EAAE,IAAItY,EAAI,EAAGA,EAAI,CAAC,EAAI,EACpC/D,EAAI,KAAK,IAAIO,CAAC,EAAI,KAAK,IAAI2D,CAAC,EAAI,KAAK,IAAIhC,CAAC,EACtClC,IAAM,IACRO,EAAIA,EAAIP,EACRkE,EAAIA,EAAIlE,EACRkC,EAAIA,EAAIlC,IAIRA,IAAM,GAdY+D,IAuBtB,GALAqT,EAAI,KAAK,KAAK7W,EAAIA,EAAI2D,EAAIA,EAAIhC,EAAIA,CAAC,EAC/B3B,EAAI,IACN6W,EAAI,CAACA,GAGHA,IAAM,EAAG,CAcX,IAbIrT,IAAMK,EACRiY,EAAE,IAAItY,EAAGA,EAAI,EAAG,CAACqT,EAAIpX,CAAC,EACbgC,IAAMoC,GACfiY,EAAE,IAAItY,EAAGA,EAAI,EAAG,CAACsY,EAAE,IAAItY,EAAGA,EAAI,CAAC,CAAC,EAGlCxD,EAAIA,EAAI6W,EACRpX,EAAIO,EAAI6W,EACRnX,EAAIiE,EAAIkT,EACRkG,EAAIpb,EAAIkV,EACRlT,EAAIA,EAAI3D,EACR2B,EAAIA,EAAI3B,EAEHuD,EAAIC,EAAGD,EAAIqZ,EAAIrZ,IAClBvD,EAAI8b,EAAE,IAAItY,EAAGD,CAAC,EAAII,EAAImY,EAAE,IAAItY,EAAI,EAAGD,CAAC,EAChC+Z,IACFtd,EAAIA,EAAI2B,EAAIma,EAAE,IAAItY,EAAI,EAAGD,CAAC,EAC1BuY,EAAE,IAAItY,EAAI,EAAGD,EAAGuY,EAAE,IAAItY,EAAI,EAAGD,CAAC,EAAIvD,EAAI+c,CAAC,GAGzCjB,EAAE,IAAItY,EAAGD,EAAGuY,EAAE,IAAItY,EAAGD,CAAC,EAAIvD,EAAIP,CAAC,EAC/Bqc,EAAE,IAAItY,EAAI,EAAGD,EAAGuY,EAAE,IAAItY,EAAI,EAAGD,CAAC,EAAIvD,EAAIN,CAAC,EAGzC,IAAK4D,EAAI,EAAGA,GAAK,KAAK,IAAIG,EAAGD,EAAI,CAAC,EAAGF,IACnCtD,EAAIP,EAAIqc,EAAE,IAAIxY,EAAGE,CAAC,EAAI9D,EAAIoc,EAAE,IAAIxY,EAAGE,EAAI,CAAC,EACpC8Z,IACFtd,EAAIA,EAAI+c,EAAIjB,EAAE,IAAIxY,EAAGE,EAAI,CAAC,EAC1BsY,EAAE,IAAIxY,EAAGE,EAAI,EAAGsY,EAAE,IAAIxY,EAAGE,EAAI,CAAC,EAAIxD,EAAI2B,CAAC,GAGzCma,EAAE,IAAIxY,EAAGE,EAAGsY,EAAE,IAAIxY,EAAGE,CAAC,EAAIxD,CAAC,EAC3B8b,EAAE,IAAIxY,EAAGE,EAAI,EAAGsY,EAAE,IAAIxY,EAAGE,EAAI,CAAC,EAAIxD,EAAI2D,CAAC,EAGzC,IAAKL,EAAIoZ,EAAKpZ,GAAKqZ,EAAMrZ,IACvBtD,EAAIP,EAAIic,EAAE,IAAIpY,EAAGE,CAAC,EAAI9D,EAAIgc,EAAE,IAAIpY,EAAGE,EAAI,CAAC,EACpC8Z,IACFtd,EAAIA,EAAI+c,EAAIrB,EAAE,IAAIpY,EAAGE,EAAI,CAAC,EAC1BkY,EAAE,IAAIpY,EAAGE,EAAI,EAAGkY,EAAE,IAAIpY,EAAGE,EAAI,CAAC,EAAIxD,EAAI2B,CAAC,GAGzC+Z,EAAE,IAAIpY,EAAGE,EAAGkY,EAAE,IAAIpY,EAAGE,CAAC,EAAIxD,CAAC,EAC3B0b,EAAE,IAAIpY,EAAGE,EAAI,EAAGkY,EAAE,IAAIpY,EAAGE,EAAI,CAAC,EAAIxD,EAAI2D,CAAC,CAE1C,CAEJ,CACF,CAED,GAAImZ,IAAS,EAIb,KAAKrZ,EAAImZ,EAAK,EAAGnZ,GAAK,EAAGA,IAIvB,GAHAzD,EAAIiD,EAAEQ,CAAC,EACPE,EAAIT,EAAEO,CAAC,EAEHE,IAAM,EAGR,IAFAlC,EAAIgC,EACJqY,EAAE,IAAIrY,EAAGA,EAAG,CAAC,EACRH,EAAIG,EAAI,EAAGH,GAAK,EAAGA,IAAK,CAG3B,IAFA2Z,EAAInB,EAAE,IAAIxY,EAAGA,CAAC,EAAItD,EAClB2B,EAAI,EACC4B,EAAI9B,EAAG8B,GAAKE,EAAGF,IAClB5B,EAAIA,EAAIma,EAAE,IAAIxY,EAAGC,CAAC,EAAIuY,EAAE,IAAIvY,EAAGE,CAAC,EAGlC,GAAIP,EAAEI,CAAC,EAAI,EACTyZ,EAAIE,EACJpG,EAAIlV,UAEJF,EAAI6B,EACAJ,EAAEI,CAAC,IAAM,EACXwY,EAAE,IAAIxY,EAAGG,EAAGwZ,IAAM,EAAI,CAACtb,EAAIsb,EAAI,CAACtb,GAAK8a,EAAMK,EAAK,GAEhDrd,EAAIqc,EAAE,IAAIxY,EAAGA,EAAI,CAAC,EAClB5D,EAAIoc,EAAE,IAAIxY,EAAI,EAAGA,CAAC,EAClBK,GAAKV,EAAEK,CAAC,EAAItD,IAAMiD,EAAEK,CAAC,EAAItD,GAAKkD,EAAEI,CAAC,EAAIJ,EAAEI,CAAC,EACxCkL,GAAK/O,EAAIoX,EAAIkG,EAAIpb,GAAKgC,EACtBmY,EAAE,IAAIxY,EAAGG,EAAG+K,CAAC,EACbsN,EAAE,IACAxY,EAAI,EACJG,EACA,KAAK,IAAIhE,CAAC,EAAI,KAAK,IAAIsd,CAAC,GAAK,CAACpb,EAAIsb,EAAIzO,GAAK/O,GAAK,CAACoX,EAAInX,EAAI8O,GAAKuO,CAC5E,GAGUvO,EAAI,KAAK,IAAIsN,EAAE,IAAIxY,EAAGG,CAAC,CAAC,EACpBgZ,EAAMjO,EAAIA,EAAI,EAChB,IAAKjL,EAAID,EAAGC,GAAKE,EAAGF,IAClBuY,EAAE,IAAIvY,EAAGE,EAAGqY,EAAE,IAAIvY,EAAGE,CAAC,EAAI+K,CAAC,CAIlC,SACQ7K,EAAI,EAcb,IAbAlC,EAAIgC,EAAI,EAEJ,KAAK,IAAIqY,EAAE,IAAIrY,EAAGA,EAAI,CAAC,CAAC,EAAI,KAAK,IAAIqY,EAAE,IAAIrY,EAAI,EAAGA,CAAC,CAAC,GACtDqY,EAAE,IAAIrY,EAAI,EAAGA,EAAI,EAAGE,EAAImY,EAAE,IAAIrY,EAAGA,EAAI,CAAC,CAAC,EACvCqY,EAAE,IAAIrY,EAAI,EAAGA,EAAG,EAAEqY,EAAE,IAAIrY,EAAGA,CAAC,EAAIzD,GAAK8b,EAAE,IAAIrY,EAAGA,EAAI,CAAC,CAAC,IAEpD8Z,EAAUC,GAAK,EAAG,CAAC1B,EAAE,IAAIrY,EAAI,EAAGA,CAAC,EAAGqY,EAAE,IAAIrY,EAAI,EAAGA,EAAI,CAAC,EAAIzD,EAAG2D,CAAC,EAC9DmY,EAAE,IAAIrY,EAAI,EAAGA,EAAI,EAAG8Z,EAAQ,CAAC,CAAC,EAC9BzB,EAAE,IAAIrY,EAAI,EAAGA,EAAG8Z,EAAQ,CAAC,CAAC,GAG5BzB,EAAE,IAAIrY,EAAGA,EAAI,EAAG,CAAC,EACjBqY,EAAE,IAAIrY,EAAGA,EAAG,CAAC,EACRH,EAAIG,EAAI,EAAGH,GAAK,EAAGA,IAAK,CAG3B,IAFA4Z,EAAK,EACLC,EAAK,EACA5Z,EAAI9B,EAAG8B,GAAKE,EAAGF,IAClB2Z,EAAKA,EAAKpB,EAAE,IAAIxY,EAAGC,CAAC,EAAIuY,EAAE,IAAIvY,EAAGE,EAAI,CAAC,EACtC0Z,EAAKA,EAAKrB,EAAE,IAAIxY,EAAGC,CAAC,EAAIuY,EAAE,IAAIvY,EAAGE,CAAC,EAKpC,GAFAwZ,EAAInB,EAAE,IAAIxY,EAAGA,CAAC,EAAItD,EAEdkD,EAAEI,CAAC,EAAI,EACTyZ,EAAIE,EACJtb,EAAIub,EACJrG,EAAIsG,UAEJ1b,EAAI6B,EACAJ,EAAEI,CAAC,IAAM,GACXia,EAAUC,GAAK,CAACN,EAAI,CAACC,EAAIF,EAAGtZ,CAAC,EAC7BmY,EAAE,IAAIxY,EAAGG,EAAI,EAAG8Z,EAAQ,CAAC,CAAC,EAC1BzB,EAAE,IAAIxY,EAAGG,EAAG8Z,EAAQ,CAAC,CAAC,IAEtB9d,EAAIqc,EAAE,IAAIxY,EAAGA,EAAI,CAAC,EAClB5D,EAAIoc,EAAE,IAAIxY,EAAI,EAAGA,CAAC,EAClB8Z,GAAMna,EAAEK,CAAC,EAAItD,IAAMiD,EAAEK,CAAC,EAAItD,GAAKkD,EAAEI,CAAC,EAAIJ,EAAEI,CAAC,EAAIK,EAAIA,EACjD0Z,GAAMpa,EAAEK,CAAC,EAAItD,GAAK,EAAI2D,EAClByZ,IAAO,GAAKC,IAAO,IACrBD,EACEX,EACAK,GACC,KAAK,IAAIG,CAAC,EACT,KAAK,IAAItZ,CAAC,EACV,KAAK,IAAIlE,CAAC,EACV,KAAK,IAAIC,CAAC,EACV,KAAK,IAAIqd,CAAC,IAEhBQ,EAAUC,GACR/d,EAAIkC,EAAIob,EAAIG,EAAKvZ,EAAIwZ,EACrB1d,EAAIoX,EAAIkG,EAAII,EAAKxZ,EAAIuZ,EACrBE,EACAC,CACd,EACYvB,EAAE,IAAIxY,EAAGG,EAAI,EAAG8Z,EAAQ,CAAC,CAAC,EAC1BzB,EAAE,IAAIxY,EAAGG,EAAG8Z,EAAQ,CAAC,CAAC,EAClB,KAAK,IAAI9d,CAAC,EAAI,KAAK,IAAIsd,CAAC,EAAI,KAAK,IAAIpZ,CAAC,GACxCmY,EAAE,IACAxY,EAAI,EACJG,EAAI,GACH,CAACyZ,EAAKD,EAAInB,EAAE,IAAIxY,EAAGG,EAAI,CAAC,EAAIE,EAAImY,EAAE,IAAIxY,EAAGG,CAAC,GAAKhE,CAChE,EACcqc,EAAE,IACAxY,EAAI,EACJG,GACC,CAAC0Z,EAAKF,EAAInB,EAAE,IAAIxY,EAAGG,CAAC,EAAIE,EAAImY,EAAE,IAAIxY,EAAGG,EAAI,CAAC,GAAKhE,CAChE,IAEc8d,EAAUC,GACR,CAAC7b,EAAIjC,EAAIoc,EAAE,IAAIxY,EAAGG,EAAI,CAAC,EACvB,CAACoT,EAAInX,EAAIoc,EAAE,IAAIxY,EAAGG,CAAC,EACnBsZ,EACApZ,CAChB,EACcmY,EAAE,IAAIxY,EAAI,EAAGG,EAAI,EAAG8Z,EAAQ,CAAC,CAAC,EAC9BzB,EAAE,IAAIxY,EAAI,EAAGG,EAAG8Z,EAAQ,CAAC,CAAC,IAI9B/O,EAAI,KAAK,IAAI,KAAK,IAAIsN,EAAE,IAAIxY,EAAGG,EAAI,CAAC,CAAC,EAAG,KAAK,IAAIqY,EAAE,IAAIxY,EAAGG,CAAC,CAAC,CAAC,EACzDgZ,EAAMjO,EAAIA,EAAI,EAChB,IAAKjL,EAAID,EAAGC,GAAKE,EAAGF,IAClBuY,EAAE,IAAIvY,EAAGE,EAAI,EAAGqY,EAAE,IAAIvY,EAAGE,EAAI,CAAC,EAAI+K,CAAC,EACnCsN,EAAE,IAAIvY,EAAGE,EAAGqY,EAAE,IAAIvY,EAAGE,CAAC,EAAI+K,CAAC,CAIlC,CAIL,IAAKlL,EAAI,EAAGA,EAAIsZ,EAAItZ,IAClB,GAAIA,EAAIoZ,GAAOpZ,EAAIqZ,EACjB,IAAKpZ,EAAID,EAAGC,EAAIqZ,EAAIrZ,IAClBmY,EAAE,IAAIpY,EAAGC,EAAGuY,EAAE,IAAIxY,EAAGC,CAAC,CAAC,EAK7B,IAAKA,EAAIqZ,EAAK,EAAGrZ,GAAKmZ,EAAKnZ,IACzB,IAAKD,EAAIoZ,EAAKpZ,GAAKqZ,EAAMrZ,IAAK,CAE5B,IADAyZ,EAAI,EACCvZ,EAAIkZ,EAAKlZ,GAAK,KAAK,IAAID,EAAGoZ,CAAI,EAAGnZ,IACpCuZ,EAAIA,EAAIrB,EAAE,IAAIpY,EAAGE,CAAC,EAAIsY,EAAE,IAAItY,EAAGD,CAAC,EAElCmY,EAAE,IAAIpY,EAAGC,EAAGwZ,CAAC,CACd,EAEL,CAEA,SAASS,GAAKC,EAAIC,EAAIC,EAAIC,EAAI,CAC5B,IAAIjc,EAAGsB,EACP,OAAI,KAAK,IAAI0a,CAAE,EAAI,KAAK,IAAIC,CAAE,GAC5Bjc,EAAIic,EAAKD,EACT1a,EAAI0a,EAAKhc,EAAIic,EACN,EAAEH,EAAK9b,EAAI+b,GAAMza,GAAIya,EAAK/b,EAAI8b,GAAMxa,CAAC,IAE5CtB,EAAIgc,EAAKC,EACT3a,EAAI2a,EAAKjc,EAAIgc,EACN,EAAEhc,EAAI8b,EAAKC,GAAMza,GAAItB,EAAI+b,EAAKD,GAAMxa,CAAC,EAEhD,CC9YgB,SAAA4a,GACdC,EACA/U,EAAU,KACA,CACV,GAAI+U,EAAaA,EAAa,OAAS,CAAC,GAAK,EAC3C,OAAOD,GAAuBC,EAAa,MAAM,EAAG,EAAE,EAAG/U,CAAO,EAG5D,MAAAgV,EAAmB,IAAIrM,EAAO,CAClCoM,EACG,MAAM,EAAG,EAAE,EACX,UACA,IAAK9a,GAAM,CAACA,EAAI8a,EAAaA,EAAa,OAAS,CAAC,CAAC,EACxD,GAAG,MAAM,KAAK,CAAE,OAAQA,EAAa,OAAS,CAAE,EAAG,CAACE,EAAG1a,IAAM,CACrD,MAAA0R,EAAM,IAAI,MAAM8I,EAAa,OAAS,CAAC,EAAE,KAAK,CAAC,EACrD,OAAA9I,EAAI1R,CAAC,EAAI,EACF0R,CAAA,CACR,CAAA,CACF,EAEKiJ,EAAc,IAAIzC,GAAwBuC,CAAgB,EAEhE,OAAOE,EAAY,gBAAgB,OACjC,CAACD,EAAG1a,IAAM,KAAK,IAAI2a,EAAY,qBAAqB3a,CAAC,CAAC,EAAIyF,CAAA,CAE9D,CCjagB,SAAAmV,GACd1U,EACAC,EACU,CACV,MAAMV,EAAU,KAAK,IAAIS,EAAK,UAAWC,EAAK,SAAS,EAEjD6S,EAAM9S,EAAK,aACX2U,EAAK7B,EAAI,GACT8B,EAAK9B,EAAI,GACTxC,EAAKwC,EAAI,GACT3Q,EAAK2Q,EAAI,EACT+B,EAAK/B,EAAI,EACT7Q,EAAK6Q,EAAI,EAETgC,EAAM7U,EAAK,aAEXmB,EAAK0T,EAAI,GACTzT,EAAKyT,EAAI,GACT1P,EAAK0P,EAAI,GACT1S,EAAK0S,EAAI,EACTC,EAAKD,EAAI,EACT5S,EAAK4S,EAAI,EAETE,EAAa,CACjB,GACE/S,EAAK0S,EAAKvS,EAAKA,EACfuS,EAAKA,EAAKzS,EAAKA,EACfC,EAAKwS,EAAKvS,EAAKF,EACfd,EAAKA,EAAKa,EAAKA,EACf,EAAI0S,EAAKzS,EAAKd,EAAKa,EACnBE,EAAKC,EAAKhB,EAAKa,EACfb,EAAKe,EAAKA,EAAKD,EAEjB,GACE6S,EAAK5S,EAAKA,EAAKf,EACfc,EAAKE,EAAKuS,EAAKC,EACf,EAAID,EAAKzS,EAAKd,EAAKyT,EACnB5S,EAAKb,EAAKC,EAAKc,EACf,EAAIC,EAAKf,EAAKsT,EAAK1S,EACnB,EAAI8S,EAAK7S,EAAKyS,EAAKA,EACnBvS,EAAKA,EAAKuS,EAAKE,EACfE,EAAK3S,EAAKuS,EAAKxS,EACf,EAAIwS,EAAKI,EAAK3T,EAAKa,EACnBA,EAAKb,EAAKgB,EAAKwS,EACf,EAAI3S,EAAK4S,EAAKzT,EAAKA,EACnBc,EAAKb,EAAKsT,EAAKxS,EACf0S,EAAKzT,EAAKgB,EAAKD,EACf,EAAID,EAAK0S,EAAKxT,EAAKe,EAErB,GACE4S,EAAKA,EAAKJ,EAAKA,EACf,EAAIvP,EAAKlD,EAAKyS,EAAKA,EACnBE,EAAKzT,EAAKgB,EAAKwS,EACf1S,EAAKd,EAAKwT,EAAKA,EACfC,EAAKzT,EAAKC,EAAKc,EACfD,EAAKb,EAAKsT,EAAKC,EACf,EAAID,EAAKI,EAAK3T,EAAKyT,EACnB,EAAIzS,EAAKf,EAAKsT,EAAKE,EACnBzP,EAAKhD,EAAKuS,EAAKxS,EACf,EAAIwS,EAAKvP,EAAKhE,EAAKa,EACnBZ,EAAKA,EAAKsT,EAAK1S,EACf,EAAI8S,EAAKH,EAAKxT,EAAKe,EACnB0S,EAAKA,EAAKzT,EAAKA,EACfkP,EAAKlP,EAAKgB,EAAKD,EACf4S,EAAK1T,EAAKsT,EAAKxS,EACf,EAAIF,EAAKqO,EAAKlP,EAAKA,EACnBa,EAAKb,EAAKC,EAAKuT,EACfxP,EAAKjD,EAAKA,EAAKf,EACfgB,EAAKA,EAAKuS,EAAKrE,EACfyE,EAAK3S,EAAKuS,EAAKC,EACf,EAAID,EAAKzS,EAAKd,EAAKkP,EAErB,GACE,GAAKqE,EAAKvT,EAAKkP,EAAKyE,EACpBA,EAAK3T,EAAKwT,EAAKA,EACf,EAAIxP,EAAKwP,EAAKxT,EAAKe,EACnBmO,EAAKlP,EAAKC,EAAKc,EACfd,EAAKA,EAAKsT,EAAKE,EACfE,EAAK1T,EAAKsT,EAAKC,EACf,EAAID,EAAKvP,EAAKhE,EAAKyT,EACnBA,EAAKzT,EAAKC,EAAKuT,EACfxP,EAAK/D,EAAKsT,EAAKxS,EACf,EAAI4S,EAAK3P,EAAKuP,EAAKA,EACnB,EAAIE,EAAKvE,EAAKlP,EAAKA,EACnBkP,EAAKlP,EAAKgB,EAAKwS,EACf,EAAIxS,EAAKf,EAAKsT,EAAKrE,EACnBlL,EAAKhD,EAAKuS,EAAKC,EAEjB,GACED,EAAKA,EAAKvP,EAAKA,EACf,EAAIuP,EAAKvP,EAAKhE,EAAKkP,EACnBlP,EAAKA,EAAKkP,EAAKA,EACfsE,EAAKD,EAAKtT,EAAK+D,EACfwP,EAAKvT,EAAKD,EAAKkP,EACfsE,EAAKA,EAAKxT,EAAKgE,EACfkL,EAAKqE,EAAKtT,EAAKA,CAAA,EAQbhL,EALUge,GACd,CAACW,EAAW,GAAIA,EAAW,GAAIA,EAAW,GAAIA,EAAW,GAAIA,EAAW,EAAE,EAC1EzV,CAAA,EAGqB,QAASrJ,GAAM,CAC9B,MAAA+e,EAAQN,EAAKtT,EAAKnL,EAAIye,EAAKvS,EAAKhB,EAAKwT,EAAK1e,EAAIkL,EAAKe,EAEzD,GAAI8S,EAUF,MAAO,CAAC,CARN,EACEN,EAAKzS,EACLyS,EAAKvP,EAAKlP,EAAIA,EACdkL,EAAKkP,EAAKpa,EAAIA,EACdye,EAAKI,EAAK7e,EACVkL,EAAKyT,EAAK3e,EACVkL,EAAKa,GACHgT,EACM/e,CAAC,CAAW,EAGpB,MAAAgf,EAAKN,EAAK1e,EAAIiM,EACd5J,EAAI,CAAC2c,GAAM,EAAIP,GAEfQ,EAAK7E,EAAKpa,EAAIA,EAAI2e,EAAK3e,EAAI+L,EAC3BqD,EAAgB4P,EAAKA,GAAO,EAAIP,EAAKA,GAAMQ,EAAKR,EAEtD,GAAI,KAAK,IAAIrP,CAAY,EAAI/F,EAC3B,MAAO,CAAC,CAAChH,EAAGrC,CAAC,CAAW,EAE1B,GAAIoP,EAAe,EAAG,CACd,MAAA8P,EAAO,KAAK,KAAK9P,CAAY,EAC5B,MAAA,CAAC,CAAC/M,EAAI6c,EAAMlf,CAAC,EAAa,CAACqC,EAAI6c,EAAMlf,CAAC,CAAW,CAC1D,CAEA,MAAO,EAAC,CACT,EAEM,OAAAS,GAAsBN,EAAQkJ,CAAO,CAC9C,CC/IgB,SAAA8V,GAA0B7W,EAAU8W,EAAwB,CAEnE,OADQZ,GAA2BlW,EAAK8W,CAAU,EAC3C,OAAQ9e,GAAMgI,EAAI,YAAYhI,CAAC,GAAK8e,EAAW,YAAY9e,CAAC,CAAC,CAC7E,CCDA,MAAMsJ,GAAiBtB,GAAgC,CAC/C,KAAA,CACJ,WAAAlD,EACA,UAAAC,EACA,OAAArC,EACA,YAAAoL,EACA,YAAAC,EACA,UAAAvD,EACA,UAAAhE,CACE,EAAAwB,EACJ,OAAO,IAAIqC,EACTtF,EACAD,EACApC,EACAoL,EACAC,EACAvD,EACAhE,EACA,CACE,aAAc,GACd,WAAY,KACd,CAAA,CAEJ,EAEM+C,GAAiB,CAACC,EAAkBC,IAAmC,CAEvE,GAAAD,EAAK,OAAOC,CAAI,EAClB,MAAO,CAACD,CAAI,EAId,MAAMuV,EAAa,CAACja,EAAoBC,IACtC,IAAIsF,EACFvF,EACAC,EACAyE,EAAK,OACLA,EAAK,YACLA,EAAK,YACLA,EAAK,UACLA,EAAK,UACL,CAAE,aAAc,GAAM,WAAY,KAAM,CAAA,EAGtC3J,EAASM,GACb,CACEsJ,EAAK,YAAYD,EAAK,UAAU,EAAIA,EAAK,WAAa,KACtDC,EAAK,YAAYD,EAAK,SAAS,EAAIA,EAAK,UAAY,KACpDA,EAAK,YAAYC,EAAK,UAAU,EAAIA,EAAK,WAAa,KACtDD,EAAK,YAAYC,EAAK,SAAS,EAAIA,EAAK,UAAY,IACpD,EAAA,OAAQzJ,GAAMA,IAAM,IAAI,CAG1B,EAAA,KAAK,CAAC8C,EAAGC,IAAMyG,EAAK,aAAa1G,CAAC,EAAI0G,EAAK,aAAazG,CAAC,CAAC,EAE5D,GAAIlD,EAAO,SAAW,EAAG,MAAO,GAAC,GAKxBA,EAAO,SAAW,EAAG,MAAO,GAC5B,GAAAA,EAAO,SAAW,EAEzB,OAAI2J,EAAK,OAAOF,GAAcG,CAAI,CAAC,EAAU,GACtC,CAACsV,EAAWlf,EAAO,CAAC,EAAGA,EAAO,CAAC,CAAC,CAAC,EAC1C,GAAWA,EAAO,SAAW,EAAG,CAE9B,MAAM6J,EACJhJ,EAAWb,EAAO,CAAC,EAAG4J,EAAK,SAAS,GACpC/I,EAAWb,EAAO,CAAC,EAAG4J,EAAK,UAAU,EACjC,EACA,EACC,MAAA,CAACsV,EAAWlf,EAAO,EAAI6J,CAAU,EAAG7J,EAAO,EAAI6J,CAAU,CAAC,CAAC,CAAA,SACzD7J,EAAO,SAAW,EAC3B,MAAO,CAACkf,EAAWlf,EAAO,CAAC,EAAGA,EAAO,CAAC,CAAC,EAAGkf,EAAWlf,EAAO,CAAC,EAAGA,EAAO,CAAC,CAAC,CAAC,EAEtE,MAAA,IAAI,MAAM,sDAAsD,CACxE,EAEO,SAASmf,GACdxV,EACAC,EACAvC,EAAkB,GACO,CACzB,MAAM6B,EAAU,KAAK,IAAIS,EAAK,UAAWC,EAAK,SAAS,EAOvD,OALE/I,EAAW8I,EAAK,OAAQC,EAAK,MAAM,GACnC,KAAK,IAAID,EAAK,YAAcC,EAAK,WAAW,EAAIV,GAChD,KAAK,IAAIS,EAAK,YAAcC,EAAK,WAAW,EAAIV,IAC/C,KAAK,IAAIS,EAAK,UAAYC,EAAK,SAAS,EAAIV,GAC3C,KAAK,IAAI,KAAK,IAAIS,EAAK,UAAYC,EAAK,SAAS,EAAI,KAAK,EAAE,EAAIV,GAE9D7B,EAAwBqC,GAAeC,EAAMC,CAAI,EACzC,GAECyU,GAA2B1U,EAAMC,CAAI,EACtC,OAAQzJ,GAAMwJ,EAAK,YAAYxJ,CAAC,GAAKyJ,EAAK,YAAYzJ,CAAC,CAAC,CACxE,CC1FgB,SAAAif,GACdC,EACAC,EACAlf,EACU,CACN,GAAAif,aAAoBla,GAAQma,aAAoBna,EAAM,CACxD,MAAMI,EAAe6B,GACnBiY,EACAC,EACA,GACAlf,CAAA,EAEF,OAAImF,IAAiB,KAAa,GAC3B,CAACA,CAAsB,CAChC,CACI,GAAA8Z,aAAoBla,GAAQma,aAAoB9X,EAC3C,OAAAyB,GAAoBoW,EAAUC,EAAUlf,CAAS,EAEtD,GAAAif,aAAoB7X,GAAO8X,aAAoBna,EAC1C,OAAA8D,GAAoBqW,EAAUD,EAAUjf,CAAS,EAEtD,GAAAif,aAAoB7X,GAAO8X,aAAoB9X,EACjD,OAAOsC,GAAmBuV,EAAUC,EAAU,GAAOlf,CAAS,EAG1D,MAAA,IAAI,MAAM,iBAAiB,CACnC,CAEgB,SAAAmf,GACdF,EACAC,EACAlf,EACiE,CAE7D,GAAAif,aAAoBla,GAAQma,aAAoBna,EAAM,CACxD,MAAMI,EAAe6B,GACnBiY,EACAC,EACA,GACAlf,CAAA,EAEF,OAAImF,IAAiB,KACZ,CAAE,cAAe,GAAI,SAAU,CAAA,EAAI,MAAO,GAC/CA,aAAwBJ,EACnB,CAAE,cAAe,CAAA,EAAI,SAAU,CAACI,CAAY,EAAG,MAAO,GACxD,CAAE,cAAe,CAACA,CAAY,EAAG,SAAU,GAAI,MAAO,EAC/D,CAEA,GAAI,CAAC8Z,EAAS,YAAY,SAASC,EAAS,WAAW,EAC9C,MAAA,CAAE,cAAe,GAAI,SAAU,CAAA,EAAI,MAAO,GAG/C,GAAAD,aAAoBla,GAAQma,aAAoB9X,EAAK,CACvD,MAAM8B,EAAgBL,GAAoBoW,EAAUC,EAAUlf,CAAS,EACvE,MAAO,CAAE,cAAAkJ,EAAe,SAAU,CAAA,EAAI,MAAOA,EAAc,OAC7D,CAEI,GAAA+V,aAAoB7X,GAAO8X,aAAoBna,EAAM,CACvD,MAAMmE,EAAgBL,GAAoBqW,EAAUD,EAAUjf,CAAS,EACvE,MAAO,CAAE,cAAAkJ,EAAe,SAAU,CAAA,EAAI,MAAOA,EAAc,OAC7D,CAEI,GAAA+V,aAAoB7X,GAAO8X,aAAoB9X,EAAK,CACtD,MAAM8B,EAAgBQ,GACpBuV,EACAC,EACA,GACAlf,CAAA,EAEF,OAAKkJ,EAAc,OAEfA,EAAc,CAAC,YAAa9B,EACvB,CACL,cAAe,CAAC,EAChB,SAAU8B,EACV,MAAOA,EAAc,MAAA,EAElB,CACL,cAAAA,EACA,SAAU,CAAC,EACX,MAAOA,EAAc,MAAA,EAVd,CAAE,cAAe,GAAI,SAAU,CAAA,EAAI,MAAO,EAYrD,CAEI,GAAA+V,aAAoBla,GAAQma,aAAoB9U,EAAY,CAC9D,MAAMlB,EAAgBsF,GACpByQ,EACAC,EACAlf,CAAA,EAEF,MAAO,CAAE,cAAAkJ,EAAe,SAAU,CAAA,EAAI,MAAOA,EAAc,OAC7D,CAEI,GAAAgW,aAAoBna,GAAQka,aAAoB7U,EAAY,CAC9D,MAAMlB,EAAgBsF,GACpB0Q,EACAD,EACAjf,CAAA,EAEF,MAAO,CAAE,cAAAkJ,EAAe,SAAU,CAAA,EAAI,MAAOA,EAAc,OAC7D,CAEI,GAAA+V,aAAoB7X,GAAO8X,aAAoB9U,EAAY,CACvD,MAAAlB,EAAgB0V,GAA0BK,EAAUC,CAAQ,EAClE,MAAO,CAAE,cAAAhW,EAAe,SAAU,CAAA,EAAI,MAAOA,EAAc,OAC7D,CAEI,GAAAgW,aAAoB9X,GAAO6X,aAAoB7U,EAAY,CACvD,MAAAlB,EAAgB0V,GAA0BM,EAAUD,CAAQ,EAClE,MAAO,CAAE,cAAA/V,EAAe,SAAU,CAAA,EAAI,MAAOA,EAAc,OAC7D,CAEI,GAAA+V,aAAoB7U,GAAc8U,aAAoB9U,EAAY,CACpE,MAAMlB,EAAgB6V,GACpBE,EACAC,EACA,EAAA,EAEF,OAAKhW,EAAc,OAEfA,EAAc,CAAC,YAAakB,EACvB,CACL,cAAe,CAAC,EAChB,SAAUlB,EACV,MAAOA,EAAc,MAAA,EAElB,CACL,cAAAA,EACA,SAAU,CAAC,EACX,MAAOA,EAAc,MAAA,EAVd,CAAE,cAAe,GAAI,SAAU,CAAA,EAAI,MAAO,EAYrD,CAEM,MAAA,IAAI,MAAM,iBAAiB,CACnC,CCnJO,SAASkW,GAAgBC,EAAmC,CACjE,MAAM/W,EAA6B,CAAA,EAEnC,QAASjF,EAAI,EAAGA,EAAIgc,EAAOhc,IACzB,QAASC,EAAI,EAAGA,GAAKD,EAAGC,IACtBgF,EAAO,KAAK,CAACjF,EAAGC,CAAC,CAAC,EAIf,OAAAgF,CACT,CAEO,SAAUgX,GAA0B1M,EAA+B,CACxE,SAAW,CAACvP,EAAGC,CAAC,IAAK8b,GAAgBxM,EAAM,MAAM,EAC3CvP,IAAMC,IACV,KAAM,CAACsP,EAAMvP,CAAC,EAAGuP,EAAMtP,CAAC,CAAC,EAE7B,CCLO,MAAeic,WAEZ/a,EAAiB,CAWzB,YAAYgb,EAAqB,CAAE,aAAAnY,EAAe,EAAM,EAAI,CAAA,EAAI,CACxD,QAwCR,KAAQ,aAAmC,KAvCpCA,GAAcoY,GAAiBD,CAAQ,EAC5C,KAAK,SAAWA,CAClB,CAVA,IAAI,MAAe,CACV,OAAA,KAAK,SAAS,IAAKE,GAAYA,EAAQ,IAAI,EAAE,KAAK;AAAA,CAAI,EAAI;AAAA,CACnE,CACA,IAAI,MAAe,CACjB,OAAO,KAAK,IACd,CAOA,IAAI,YAAqB,CAChB,OAAA,KAAK,SAAS,CAAC,EAAE,UAC1B,CAEA,IAAI,WAAoB,CACtB,OAAO,KAAK,SAAS,KAAK,SAAS,OAAS,CAAC,EAAE,SACjD,CAEA,IAAI,eAAwB,CAC1B,OAAO,KAAK,SAAS,MACvB,CAEA,SAASngB,EAAwB,CACxB,OAAA,KAAK,SAAS,KAAMmgB,GAAYA,EAAQ,YAAYngB,CAAK,CAAC,CACnE,CAEA,WAAWG,EAAwB,CACjC,OAAK,KAAK,YAAY,SAASA,EAAM,WAAW,EACzC,KAAK,SAAS,KAAMggB,GACzBhgB,EAAM,SAAS,KACZigB,GACCR,GAA6BO,EAASC,CAAY,EAAE,MAAQ,CAChE,CAAA,EALwD,EAO5D,CAEA,oBAAoBjgB,EAA0B,CAC5C,OAAO,KAAK,SAAS,QAASggB,GACrBhgB,EAAM,SAAS,QAASigB,GACxBD,EAAQ,YAAY,SAASC,EAAa,WAAW,EACnDR,GAA6BO,EAASC,CAAY,EAAE,SADS,EAErE,CACF,CACH,CAGA,IAAI,aAA2B,CACzB,GAAA,KAAK,eAAiB,KAAM,CAC9B,IAAIC,EAAO,KAAK,SAAS,CAAC,EAAE,YAE5B,KAAK,SAAS,MAAM,CAAC,EAAE,QAASF,GAAY,CACnCE,EAAAA,EAAK,MAAMF,EAAQ,WAAW,CAAA,CACtC,EACD,KAAK,aAAeE,CACtB,CACA,OAAO,KAAK,YACd,CAUA,CAAC,OAAO,IAAI,4BAA4B,CAAC,GAAI,CAC3C,OAAO,KAAK,IACd,CACF,CAEgB,SAAAC,GACdL,EACAjJ,EAAO,SACD,CACU6I,GAAAI,EAAS,MAAM,EAAE,QAC/B,CAAC,CAACM,EAAcC,CAAiB,IAAM,CACrC,GAAID,IAAiBC,EAAmB,OAClC,MAAAL,EAAUF,EAASM,CAAY,EAC/BH,EAAeH,EAASO,CAAiB,EAEzC7W,EAAgBiW,GAA6BO,EAASC,CAAY,EAClE7W,EAAU,KAAK,IAAI4W,EAAQ,UAAWC,EAAa,SAAS,EAElE,GAAIzW,EAAc,QAAU,EAC5B,IAAIA,EAAc,QAAU,GAAK,CAACA,EAAc,SAAS,OAAQ,CAC/D,MAAM9H,EAAW0e,EAAeC,EAE1B5a,EAAe+D,EAAc,cAAc,CAAC,EAelD,GAbI9H,IAAa,GACXX,EAAWif,EAAQ,WAAYva,EAAc2D,CAAO,GAEtD1H,IAAa,IACXX,EAAWif,EAAQ,UAAWva,EAAc2D,CAAO,GAErD1H,IAAaoe,EAAS,OAAS,GAE/B/e,EAAWif,EAAQ,UAAWva,EAAc2D,CAAO,GACnDrI,EAAWkf,EAAa,WAAYxa,EAAc2D,CAAO,GAIzD,CAAC1H,IAAaoe,EAAS,OAAS,GAEhC/e,EAAWif,EAAQ,WAAYva,EAAc2D,CAAO,GACpDrI,EAAWkf,EAAa,UAAWxa,EAAc2D,CAAO,EAExD,MAEN,CACA,GAAI,EAAAI,EAAc,QAAU,GAAKsW,EAAS,SAAW,IAEhD/e,EACCif,EAAQ,WACRxW,EAAc,cAAc,CAAC,EAC7BJ,CAAA,GAEArI,EACEif,EAAQ,UACRxW,EAAc,cAAc,CAAC,EAC7BJ,CAAA,GAEHrI,EACCif,EAAQ,WACRxW,EAAc,cAAc,CAAC,EAC7BJ,CAAA,GAEArI,EACEif,EAAQ,UACRxW,EAAc,cAAc,CAAC,EAC7BJ,CACF,IAKN,MAAM,IAAI,MACR,GAAGyN,+CACDmJ,EAAQ,YACFC,EAAa,cAAc,KAAK,UACtCzW,EAAc,aAAA,GAChB,EAEJ,CAAA,CAEJ,CAEgB,SAAAuW,GAAiBD,EAAqBjJ,EAAO,SAAgB,CAC3E,GAAIiJ,EAAS,SAAW,EAChB,MAAA,IAAI,MAAM,GAAGjJ,kCAAqC,EAEtDxQ,GAAA,CAACyZ,EAAS,MAAM,EAAG,EAAE,EAAGA,EAAS,MAAM,CAAC,CAAC,CAAC,EAAE,QAC9C,CAAC,CAACE,EAASM,CAAW,IAAM,CAC1B,GAAI,CAACvf,EAAWif,EAAQ,UAAWM,EAAY,UAAU,EACvD,MAAM,IAAI,MACR,GAAGzJ,qCAAwCmJ,EAAQ,YAAYM,EAAY,cAAA,CAEjF,CAAA,EAGFH,GAAuBL,EAAUjJ,CAAI,CACvC,CCjLA,SAAS0J,GAAiBhB,EAAmBC,EAA4B,CAOnE,MANA,GAAAD,aAAoBla,GAAQma,aAAoBna,GAC9ChD,GAASkd,EAAS,EAAGC,EAAS,CAAC,GAKjCD,aAAoB7X,GAAO8X,aAAoB9X,GAE/C3G,EAAWwe,EAAS,OAAQC,EAAS,MAAM,GAC3CD,EAAS,OAASC,EAAS,OAASD,EAAS,UAMnD,CAEA,SAASiB,GAAcjB,EAAmBC,EAA4B,CAChE,GAAAD,aAAoBla,GAAQma,aAAoBna,EAClD,OAAO,IAAIA,EAAKka,EAAS,WAAYC,EAAS,SAAS,EAErD,GAAAD,aAAoB7X,GAAO8X,aAAoB9X,EAGjD,OAAO,IAAIA,EACT6X,EAAS,WACTC,EAAS,UACTD,EAAS,OACTA,EAAS,SAAA,EAIP,MAAA,IAAI,MAAM,iBAAiB,CACnC,CAEO,SAASkB,GAAiBC,EAAkC,CACjE,IAAIC,EAAsB,GAC1B,MAAMC,EAAgC,CAAA,EAE3B,UAAAZ,KAAWU,EAAO,SAAU,CACjC,GAAAE,EAAmB,SAAW,EAAG,CACnCA,EAAmB,KAAKZ,CAAO,EAC/B,QACF,CAEA,MAAMa,EAAcD,EAAmBA,EAAmB,OAAS,CAAC,EAChEL,GAAiBM,EAAab,CAAO,GACjBW,EAAA,GACtBC,EAAmB,IAAI,EACvBA,EAAmB,KAAKJ,GAAcK,EAAab,CAAO,CAAC,GAE3DY,EAAmB,KAAKZ,CAAO,CAEnC,CAEA,GAAIjf,EAAW2f,EAAO,WAAYA,EAAO,SAAS,GAE9CH,GACEK,EAAmB,CAAC,EACpBA,EAAmBA,EAAmB,OAAS,CAAC,CAAA,EAElD,CACsBD,EAAA,GAEhB,MAAAE,EAAcD,EAAmB,MACvCA,EAAmB,CAAC,EAAIJ,GAAcK,EAAaD,EAAmB,CAAC,CAAC,CAC1E,CAGF,OAAKD,EACEC,EAD0B,IAEnC,CCxEO,MAAME,UAAejB,EAAuB,CAA5C,aAAA,CAAA,MAAA,GAAA,SAAA,EACQ,KAAA,WAAA,QAAA,CACb,SAAkB,CACV,MAAAkB,EAAmB,KAAK,SAAS,IAAKf,GAAYA,EAAQ,SAAS,EACzE,OAAAe,EAAiB,QAAQ,EAClB,IAAID,EAAOC,EAAkB,CAAE,aAAc,EAAM,CAAA,CAC5D,CAEA,OAAgB,CACd,OAAO,IAAID,EACT,KAAK,SAAS,IAAKd,GAAYA,EAAQ,OAAO,EAC9C,CAAE,aAAc,EAAK,CAAA,CAEzB,CAEA,OAAOgB,EAAwB,CAC7B,GAAI,CAACjgB,EAAW,KAAK,UAAWigB,EAAO,UAAU,EAC/C,cAAQ,MAAM,KAAK,KAAMA,EAAO,IAAI,EAC9B,IAAI,MAAM,wDAAwD,EAEnE,OAAA,IAAIF,EAAO,CAAC,GAAG,KAAK,SAAU,GAAGE,EAAO,QAAQ,CAAC,CAC1D,CAEA,UAAmB,CACX,MAAAC,EAAcR,GAAiB,IAAI,EACzC,OAAKQ,EACE,IAAIH,EAAOG,EAAa,CAAE,aAAc,EAAM,CAAA,EAD5B,IAE3B,CAEA,UAAU3c,EAAsC,CAC9C,OAAO,IAAIwc,EACT,KAAK,SAAS,IAAKd,GAAYA,EAAQ,UAAU1b,CAAM,CAAC,EACxD,CAAE,aAAc,EAAK,CAAA,CAEzB,CACF,CChCA,MAAM4c,GAA4B,CAACrhB,EAAeqJ,IAAe,CACzD,MAAA1B,EAAqBT,GAAemC,EAAM,CAC9C,EAAG,CAAC,EAAG,CAAC,EACR,WAAYrJ,EACZ,UAAWqJ,EAAK,SAAA,CACjB,EACD,GAAI1B,IAAuB,WAGlB,MAAA,GAGH,KAAA,CAAE,mBAAAJ,EAAoB,mBAAAC,CAAuB,EAAAG,EAI/C,GAFA,CAAC0B,EAAK,iBAAiB9B,CAAkB,GAEzCC,GAAsB,CAAC6B,EAAK,UAAkB,MAAA,GAMlD,GACE,KAAK,IAAI9B,CAAkB,EAAI8B,EAAK,WACpC,KAAK,IAAI9B,EAAqB,CAAC,EAAI8B,EAAK,UACxC,CACA,KAAM,EAAGnJ,CAAC,EAAImJ,EAAK,SACnB,OAAOrJ,EAAM,CAAC,EAAIE,EAAI,EAAI,EAAI,CAChC,CAEO,MAAA,EACT,EAEA,MAAMohB,EAAoB,CAIxB,YAAYnB,EAAkB,CAH9B,KAAQ,OAAS,EAIf,KAAK,QAAUA,CACjB,CAEA,OAAOzW,EAA2B6X,EAAc,GAAO,CACjD,CAACA,GAAe,CAAC,KAAK,QAAQ,YAAY7X,CAAiB,IAK3DxI,EAAWwI,EAAmB,KAAK,QAAQ,UAAU,EACvD,KAAK,QAAU,KAAK,QAAQ,oBAAoB,CAAC,EAAI,EAAI,EAAI,EACpDxI,EAAWwI,EAAmB,KAAK,QAAQ,SAAS,EAC7D,KAAK,QAAU,KAAK,QAAQ,mBAAmB,CAAC,EAAI,EAAI,EAAI,EAE5D,KAAK,QAAU,EAEnB,CAEA,IAAI,OAAQ,CACV,OAAO,KAAK,MACd,CACF,CAEA,MAAM8X,GAA2B,CAACxhB,EAAewI,IAAa,CAC5D,MAAMe,EAAUf,EAAI,UAEdiZ,EAAmB,KAAK,IAAIzhB,EAAM,CAAC,EAAIwI,EAAI,OAAO,CAAC,CAAC,EAGtD,GAAAiZ,EAAmBjZ,EAAI,OAASe,EAAgB,MAAA,GAEpD,MAAMmY,EAAa9f,GAAe5B,EAAOwI,EAAI,MAAM,EAC7CmZ,EAAUnZ,EAAI,OAASA,EAAI,OAC3BoZ,EAAgBrY,EAAUA,EAG5B,GAAA,KAAK,IAAImY,EAAaC,CAAO,EAAIC,GAAiBpZ,EAAI,YAAYxI,CAAK,EAClE,MAAA,GAEH,MAAA6hB,EAAqBH,EAAaC,EAAUC,EAGlD,GAAIC,GAAsBrZ,EAAI,OAAO,CAAC,EAAIxI,EAAM,CAAC,EAAU,MAAA,GAI3D,MAAM0F,EAAQ,KAAK,KACjB8C,EAAI,OAASA,EAAI,OAASiZ,EAAmBA,CAAA,EAGzCK,EAAU,IAAIR,GAAoB9Y,CAAG,EAInC,OAAAsZ,EAAA,OAAO,CAACtZ,EAAI,OAAO,CAAC,EAAI9C,EAAO1F,EAAM,CAAC,CAAC,CAAC,EAE5C6hB,GACMC,EAAA,OAAO,CAACtZ,EAAI,OAAO,CAAC,EAAI9C,EAAO1F,EAAM,CAAC,CAAC,CAAC,EAG3C8hB,EAAQ,KACjB,EAEMC,GAAkC,CAAC/hB,EAAewI,IAAoB,CAC1E,MAAMwZ,EAAMxZ,EAAI,YAAY,KAAOA,EAAI,YAAY,MAAQ,EACrDyZ,EAAM,IAAIzc,EAAKxF,EAAO,CAACgiB,EAAKhiB,EAAM,CAAC,CAAC,CAAC,EAErC8hB,EAAU,IAAIR,GAAoB9Y,CAAG,EAC3C,OAAAyG,GAA2BgT,EAAKzZ,CAAG,EAAE,QAAS5C,GAAiB,CAGrDkc,EAAA,OAAOlc,EAAc,EAAI,CAAA,CAClC,EAEMkc,EAAQ,KACjB,EAEgB,SAAAI,GAAsBliB,EAAemgB,EAA0B,CAC7E,GAAIA,aAAmB3a,EACd,OAAA6b,GAA0BrhB,EAAOmgB,CAAO,EAGjD,GAAIA,aAAmBtY,EACd,OAAA2Z,GAAyBxhB,EAAOmgB,CAAO,EAGhD,GAAIA,aAAmBtV,EACd,OAAAkX,GAAgC/hB,EAAOmgB,CAAO,EAGjD,MAAA,IAAI,MAAM,iBAAiB,CACnC,CCjIO,MAAMgC,WAAanC,EAAqB,CAG7C,YAAYC,EAAqB,CAAE,aAAAnY,EAAe,EAAM,EAAI,CAAA,EAAI,CAC9D,MAAMmY,EAAU,CAAE,aAAc,EAAM,CAAA,EAH3B,KAAA,WAAA,OAOb,KAAQ,WAA6B,KAH9BnY,GAAcsa,GAAenC,CAAQ,CAC5C,CAGA,IAAI,WAAqB,CACnB,GAAA,KAAK,aAAe,KAAM,CAC5B,MAAMoC,EAAW,KAAK,SAAS,QAAS7e,GAChCA,aAAagC,EAKZ,CAAChC,EAAE,UAAU,EAFX,CAACA,EAAE,WAAYA,EAAE,WAAW,EAAG,CAAC,CAG1C,EAEK8e,EAAkBD,EACrB,IAAI,CAAC5f,EAAIqB,IAAM,CACd,MAAMpB,EAAK2f,GAAUve,EAAI,GAAKue,EAAS,MAAM,EACrC,OAAA3f,EAAG,CAAC,EAAID,EAAG,CAAC,IAAMC,EAAG,CAAC,EAAID,EAAG,CAAC,EAAA,CACvC,EACA,OAAO,CAACa,EAAGC,IAAMD,EAAIC,EAAG,CAAC,EAE5B,KAAK,WAAa+e,EAAkB,CACtC,CACA,OAAO,KAAK,UACd,CAEA,OAAc,CACZ,OAAO,IAAIH,GACT,KAAK,SAAS,IAAKhC,GAAYA,EAAQ,OAAO,EAC9C,CAAE,aAAc,EAAK,CAAA,CAEzB,CAEA,SAAgB,CACR,MAAAe,EAAmB,KAAK,SAAS,IAAKf,GAAYA,EAAQ,SAAS,EACzE,OAAAe,EAAiB,QAAQ,EAClB,IAAIiB,GAAKjB,EAAkB,CAAE,aAAc,EAAM,CAAA,CAC1D,CAEA,UAAUzc,EAAoC,CAC5C,OAAO,IAAI0d,GACT,KAAK,SAAS,IAAKhC,GAAYA,EAAQ,UAAU1b,CAAM,CAAC,EACxD,CAAE,aAAc,EAAK,CAAA,CAEzB,CAEA,SAASzE,EAAwB,CAE/B,OADI,KAAK,SAASA,CAAK,GACnB,CAAC,KAAK,YAAY,SAASA,CAAK,EAAU,GAExB,KAAK,SAAS,OAAO,CAACuiB,EAAKpC,IACxCoC,EAAML,GAAsBliB,EAAOmgB,CAAO,EAChD,CAAC,EAEmB,IAAM,CAC/B,CAEA,UAAiB,CACT,MAAAiB,EAAcR,GAAiB,IAAI,EACzC,OAAKQ,EACE,IAAIe,GAAKf,EAAa,CAAE,aAAc,EAAM,CAAA,EAD1B,IAE3B,CACF,CAEO,SAASgB,GAAenC,EAA2B,CAGtD,GAFFC,GAAiBD,EAAU,MAAM,EAE/B,CAAC/e,EAAW+e,EAAS,CAAC,EAAE,WAAYA,EAASA,EAAS,OAAS,CAAC,EAAE,SAAS,EAErE,MAAA,IAAI,MAAM,6BAA6B,CACjD,CChFO,SAASuC,GAAYrC,EAAkB,CAC5C,GAAIA,aAAmB3a,EACd,MAAA,CACL,KAAM2a,EAAQ,YACd,WAAYA,EAAQ,WACpB,UAAWA,EAAQ,SAAA,EAGvB,GAAIA,aAAmBtY,EACd,MAAA,CACL,KAAMsY,EAAQ,YACd,WAAYA,EAAQ,WACpB,UAAWA,EAAQ,UACnB,OAAQA,EAAQ,OAChB,UAAWA,EAAQ,SAAA,EAIvB,GAAIA,aAAmBtV,EACd,MAAA,CACL,KAAMsV,EAAQ,YACd,WAAYA,EAAQ,WACpB,UAAWA,EAAQ,UACnB,OAAQA,EAAQ,OAChB,UAAWA,EAAQ,UACnB,YAAaA,EAAQ,YACrB,YAAaA,EAAQ,YACrB,UAAWA,EAAQ,SAAA,EAIjB,MAAA,IAAI,MAAM,sBAAsB,CACxC,CClCO,SAASsC,GAAS/Q,EAAY,CAC5B,MAAA,CACL,KAAM,OACN,SAAUA,EAAK,SAAS,IAAI8Q,EAAW,CAAA,CAE3C,CCLO,SAASE,GAAWC,EAAgB,CAClC,MAAA,CACL,KAAM,SACN,QAASF,GAASE,EAAO,OAAO,EAChC,MAAOA,EAAO,MAAM,IAAIF,EAAQ,CAAA,CAEpC,CCNO,SAASG,GAAYC,EAAkB,CACrC,MAAA,CACL,KAAM,UACN,QAASA,EAAQ,QAAQ,IAAIH,EAAU,CAAA,CAE3C,CCIO,SAASI,GAAWC,EAAc,CACvC,GAAIA,aAAiBC,GACnB,OAAOJ,GAAYG,CAAK,EAC1B,GAAWA,aAAiBE,EAC1B,OAAOP,GAAWK,CAAK,EACzB,GAAWA,aAAiBZ,GAC1B,OAAOM,GAASM,CAAK,EACZ,GAAAA,aAAiBlb,GAAOkb,aAAiBvd,EAClD,OAAOgd,GAAYO,CAAK,EAElB,MAAA,IAAI,MAAM,oBAAoB,CAExC,CCvBe,MAAMG,EAAU,CAE3B,aAAc,CACV,KAAK,IAAM,GACX,KAAK,OAAS,GACd,KAAK,OAAS,CACjB,CAED,OAAQ,CACJ,KAAK,OAAS,CACjB,CAED,KAAKC,EAAIxT,EAAO,CACZ,IAAIyT,EAAM,KAAK,SAEf,KAAOA,EAAM,GAAG,CACZ,MAAMC,EAAUD,EAAM,GAAM,EACtBE,EAAc,KAAK,OAAOD,CAAM,EACtC,GAAI1T,GAAS2T,EAAa,MAC1B,KAAK,IAAIF,CAAG,EAAI,KAAK,IAAIC,CAAM,EAC/B,KAAK,OAAOD,CAAG,EAAIE,EACnBF,EAAMC,CACT,CAED,KAAK,IAAID,CAAG,EAAID,EAChB,KAAK,OAAOC,CAAG,EAAIzT,CACtB,CAED,KAAM,CACF,GAAI,KAAK,SAAW,EAAG,OAEvB,MAAM4T,EAAM,KAAK,IAAI,CAAC,EAGtB,GAFA,KAAK,SAED,KAAK,OAAS,EAAG,CACjB,MAAMJ,EAAK,KAAK,IAAI,CAAC,EAAI,KAAK,IAAI,KAAK,MAAM,EACvCxT,EAAQ,KAAK,OAAO,CAAC,EAAI,KAAK,OAAO,KAAK,MAAM,EAChD6T,EAAa,KAAK,QAAU,EAClC,IAAIJ,EAAM,EAEV,KAAOA,EAAMI,GAAY,CACrB,IAAIC,GAAQL,GAAO,GAAK,EACxB,MAAMM,EAAQD,EAAO,EACrB,IAAIE,EAAY,KAAK,IAAIF,CAAI,EACzBG,EAAY,KAAK,OAAOH,CAAI,EAChC,MAAMI,EAAa,KAAK,OAAOH,CAAK,EAOpC,GALIA,EAAQ,KAAK,QAAUG,EAAaD,IACpCH,EAAOC,EACPC,EAAY,KAAK,IAAID,CAAK,EAC1BE,EAAYC,GAEZD,GAAajU,EAAO,MAExB,KAAK,IAAIyT,CAAG,EAAIO,EAChB,KAAK,OAAOP,CAAG,EAAIQ,EACnBR,EAAMK,CACT,CAED,KAAK,IAAIL,CAAG,EAAID,EAChB,KAAK,OAAOC,CAAG,EAAIzT,CACtB,CAED,OAAO4T,CACV,CAED,MAAO,CACH,GAAI,KAAK,SAAW,EACpB,OAAO,KAAK,IAAI,CAAC,CACpB,CAED,WAAY,CACR,GAAI,KAAK,SAAW,EACpB,OAAO,KAAK,OAAO,CAAC,CACvB,CAED,QAAS,CACL,KAAK,IAAI,OAAS,KAAK,OAAO,OAAS,KAAK,MAC/C,CACL,CC9EA,MAAMO,GAAc,CAChB,UAAW,WAAY,kBAAmB,WAAY,YACtD,WAAY,YAAa,aAAc,YAC3C,EAEMC,GAAU,EAED,MAAMC,EAAS,CAE1B,OAAO,KAAKpO,EAAM,CACd,GAAI,CAACA,GAAQA,EAAK,aAAe,QAAaA,EAAK,OAC/C,MAAM,IAAI,MAAM,+DAA+D,EAEnF,KAAM,CAACqO,EAAOC,CAAc,EAAI,IAAI,WAAWtO,EAAM,EAAG,CAAC,EACzD,GAAIqO,IAAU,IACV,MAAM,IAAI,MAAM,kDAAkD,EAEtE,GAAIC,GAAkB,IAAMH,GACxB,MAAM,IAAI,MAAM,QAAQG,GAAkB,yBAAyBH,KAAU,EAEjF,KAAM,CAACI,CAAQ,EAAI,IAAI,YAAYvO,EAAM,EAAG,CAAC,EACvC,CAACwO,CAAQ,EAAI,IAAI,YAAYxO,EAAM,EAAG,CAAC,EAE7C,OAAO,IAAIoO,GAASI,EAAUD,EAAUL,GAAYI,EAAiB,EAAI,EAAG,OAAWtO,CAAI,CAC9F,CAED,YAAYwO,EAAUD,EAAW,GAAIE,EAAY,aAAcC,EAAkB,YAAa1O,EAAM,CAChG,GAAIwO,IAAa,OAAW,MAAM,IAAI,MAAM,sCAAsC,EAClF,GAAI,MAAMA,CAAQ,GAAKA,GAAY,EAAG,MAAM,IAAI,MAAM,8BAA8BA,IAAW,EAE/F,KAAK,SAAW,CAACA,EACjB,KAAK,SAAW,KAAK,IAAI,KAAK,IAAI,CAACD,EAAU,CAAC,EAAG,KAAK,EAItD,IAAIlgB,EAAImgB,EACJG,EAAWtgB,EACf,KAAK,aAAe,CAACA,EAAI,CAAC,EAC1B,GACIA,EAAI,KAAK,KAAKA,EAAI,KAAK,QAAQ,EAC/BsgB,GAAYtgB,EACZ,KAAK,aAAa,KAAKsgB,EAAW,CAAC,QAC9BtgB,IAAM,GAEf,KAAK,UAAYogB,GAAa,aAC9B,KAAK,eAAiBE,EAAW,MAAQ,YAAc,YAEvD,MAAMC,EAAiBV,GAAY,QAAQ,KAAK,SAAS,EACnDW,EAAgBF,EAAW,EAAI,KAAK,UAAU,kBAEpD,GAAIC,EAAiB,EACjB,MAAM,IAAI,MAAM,iCAAiCH,IAAY,EAG7DzO,GAAQA,EAAK,aAAe,QAAa,CAACA,EAAK,QAC/C,KAAK,KAAOA,EACZ,KAAK,OAAS,IAAI,KAAK,UAAU,KAAK,KAAM,EAAG2O,EAAW,CAAC,EAC3D,KAAK,SAAW,IAAI,KAAK,eAAe,KAAK,KAAM,EAAIE,EAAeF,CAAQ,EAE9E,KAAK,KAAOA,EAAW,EACvB,KAAK,KAAO,KAAK,OAAO,KAAK,KAAO,CAAC,EACrC,KAAK,KAAO,KAAK,OAAO,KAAK,KAAO,CAAC,EACrC,KAAK,KAAO,KAAK,OAAO,KAAK,KAAO,CAAC,EACrC,KAAK,KAAO,KAAK,OAAO,KAAK,KAAO,CAAC,IAGrC,KAAK,KAAO,IAAID,EAAgB,EAAIG,EAAgBF,EAAW,KAAK,eAAe,iBAAiB,EACpG,KAAK,OAAS,IAAI,KAAK,UAAU,KAAK,KAAM,EAAGA,EAAW,CAAC,EAC3D,KAAK,SAAW,IAAI,KAAK,eAAe,KAAK,KAAM,EAAIE,EAAeF,CAAQ,EAC9E,KAAK,KAAO,EACZ,KAAK,KAAO,IACZ,KAAK,KAAO,IACZ,KAAK,KAAO,KACZ,KAAK,KAAO,KAEZ,IAAI,WAAW,KAAK,KAAM,EAAG,CAAC,EAAE,IAAI,CAAC,KAAOR,IAAW,GAAKS,CAAc,CAAC,EAC3E,IAAI,YAAY,KAAK,KAAM,EAAG,CAAC,EAAE,CAAC,EAAIL,EACtC,IAAI,YAAY,KAAK,KAAM,EAAG,CAAC,EAAE,CAAC,EAAIC,GAI1C,KAAK,OAAS,IAAIlB,EACrB,CAED,IAAIwB,EAAMC,EAAMC,EAAMC,EAAM,CACxB,MAAMxe,EAAQ,KAAK,MAAQ,EACrBye,EAAQ,KAAK,OACnB,YAAK,SAASze,CAAK,EAAIA,EACvBye,EAAM,KAAK,MAAM,EAAIJ,EACrBI,EAAM,KAAK,MAAM,EAAIH,EACrBG,EAAM,KAAK,MAAM,EAAIF,EACrBE,EAAM,KAAK,MAAM,EAAID,EAEjBH,EAAO,KAAK,OAAM,KAAK,KAAOA,GAC9BC,EAAO,KAAK,OAAM,KAAK,KAAOA,GAC9BC,EAAO,KAAK,OAAM,KAAK,KAAOA,GAC9BC,EAAO,KAAK,OAAM,KAAK,KAAOA,GAE3Bxe,CACV,CAED,QAAS,CACL,GAAI,KAAK,MAAQ,IAAM,KAAK,SACxB,MAAM,IAAI,MAAM,SAAS,KAAK,MAAQ,yBAAyB,KAAK,WAAW,EAEnF,MAAMye,EAAQ,KAAK,OAEnB,GAAI,KAAK,UAAY,KAAK,SAAU,CAEhCA,EAAM,KAAK,MAAM,EAAI,KAAK,KAC1BA,EAAM,KAAK,MAAM,EAAI,KAAK,KAC1BA,EAAM,KAAK,MAAM,EAAI,KAAK,KAC1BA,EAAM,KAAK,MAAM,EAAI,KAAK,KAC1B,MACH,CAED,MAAMC,EAAS,KAAK,KAAO,KAAK,MAAS,EACnCC,EAAU,KAAK,KAAO,KAAK,MAAS,EACpCC,EAAgB,IAAI,YAAY,KAAK,QAAQ,EAC7CC,GAAc,GAAK,IAAM,EAG/B,QAASphB,EAAI,EAAGsf,EAAM,EAAGtf,EAAI,KAAK,SAAUA,IAAK,CAC7C,MAAM4gB,EAAOI,EAAM1B,GAAK,EAClBuB,EAAOG,EAAM1B,GAAK,EAClBwB,EAAOE,EAAM1B,GAAK,EAClByB,EAAOC,EAAM1B,GAAK,EAClBnjB,EAAI,KAAK,MAAMilB,IAAeR,EAAOE,GAAQ,EAAI,KAAK,MAAQG,CAAK,EACnE7kB,EAAI,KAAK,MAAMglB,IAAeP,EAAOE,GAAQ,EAAI,KAAK,MAAQG,CAAM,EAC1EC,EAAcnhB,CAAC,EAAIqhB,GAAQllB,EAAGC,CAAC,CAClC,CAGDklB,GAAKH,EAAeH,EAAO,KAAK,SAAU,EAAG,KAAK,SAAW,EAAG,KAAK,QAAQ,EAG7E,QAAShhB,EAAI,EAAGsf,EAAM,EAAGtf,EAAI,KAAK,aAAa,OAAS,EAAGA,IAAK,CAC5D,MAAMke,EAAM,KAAK,aAAale,CAAC,EAG/B,KAAOsf,EAAMpB,GAAK,CACd,MAAMqD,EAAYjC,EAGlB,IAAIkC,EAAWR,EAAM1B,GAAK,EACtBmC,EAAWT,EAAM1B,GAAK,EACtBoC,EAAWV,EAAM1B,GAAK,EACtBqC,EAAWX,EAAM1B,GAAK,EAC1B,QAASrf,EAAI,EAAGA,EAAI,KAAK,UAAYqf,EAAMpB,EAAKje,IAC5CuhB,EAAW,KAAK,IAAIA,EAAUR,EAAM1B,GAAK,CAAC,EAC1CmC,EAAW,KAAK,IAAIA,EAAUT,EAAM1B,GAAK,CAAC,EAC1CoC,EAAW,KAAK,IAAIA,EAAUV,EAAM1B,GAAK,CAAC,EAC1CqC,EAAW,KAAK,IAAIA,EAAUX,EAAM1B,GAAK,CAAC,EAI9C,KAAK,SAAS,KAAK,MAAQ,CAAC,EAAIiC,EAChCP,EAAM,KAAK,MAAM,EAAIQ,EACrBR,EAAM,KAAK,MAAM,EAAIS,EACrBT,EAAM,KAAK,MAAM,EAAIU,EACrBV,EAAM,KAAK,MAAM,EAAIW,CACxB,CACJ,CACJ,CAED,OAAOf,EAAMC,EAAMC,EAAMC,EAAMa,EAAU,CACrC,GAAI,KAAK,OAAS,KAAK,OAAO,OAC1B,MAAM,IAAI,MAAM,6CAA6C,EAGjE,IAAIL,EAAY,KAAK,OAAO,OAAS,EACrC,MAAMM,EAAQ,CAAA,EACRC,EAAU,CAAA,EAEhB,KAAOP,IAAc,QAAW,CAE5B,MAAMrD,EAAM,KAAK,IAAIqD,EAAY,KAAK,SAAW,EAAGQ,GAAWR,EAAW,KAAK,YAAY,CAAC,EAG5F,QAASjC,EAAMiC,EAAWjC,EAAMpB,EAAKoB,GAAO,EAAG,CAK3C,GAHIwB,EAAO,KAAK,OAAOxB,CAAG,GACtByB,EAAO,KAAK,OAAOzB,EAAM,CAAC,GAC1BsB,EAAO,KAAK,OAAOtB,EAAM,CAAC,GAC1BuB,EAAO,KAAK,OAAOvB,EAAM,CAAC,EAAG,SAEjC,MAAM/c,EAAQ,KAAK,SAAS+c,GAAO,CAAC,EAAI,EAEpCiC,GAAa,KAAK,SAAW,EAC7BM,EAAM,KAAKtf,CAAK,GAETqf,IAAa,QAAaA,EAASrf,CAAK,IAC/Cuf,EAAQ,KAAKvf,CAAK,CAEzB,CAEDgf,EAAYM,EAAM,KACrB,CAED,OAAOC,CACV,CAED,UAAU3lB,EAAGC,EAAG4lB,EAAa,IAAUC,EAAc,IAAUL,EAAU,CACrE,GAAI,KAAK,OAAS,KAAK,OAAO,OAC1B,MAAM,IAAI,MAAM,6CAA6C,EAGjE,IAAIL,EAAY,KAAK,OAAO,OAAS,EACrC,MAAMlhB,EAAI,KAAK,OACTyhB,EAAU,CAAA,EACVI,EAAiBD,EAAcA,EAErC,KAAOV,IAAc,QAAW,CAE5B,MAAMrD,EAAM,KAAK,IAAIqD,EAAY,KAAK,SAAW,EAAGQ,GAAWR,EAAW,KAAK,YAAY,CAAC,EAG5F,QAASjC,EAAMiC,EAAWjC,EAAMpB,EAAKoB,GAAO,EAAG,CAC3C,MAAM/c,EAAQ,KAAK,SAAS+c,GAAO,CAAC,EAAI,EAElC6C,EAAKC,GAASjmB,EAAG,KAAK,OAAOmjB,CAAG,EAAG,KAAK,OAAOA,EAAM,CAAC,CAAC,EACvD+C,EAAKD,GAAShmB,EAAG,KAAK,OAAOkjB,EAAM,CAAC,EAAG,KAAK,OAAOA,EAAM,CAAC,CAAC,EAC3DgD,EAAOH,EAAKA,EAAKE,EAAKA,EAExBd,GAAa,KAAK,SAAW,EAC7BlhB,EAAE,KAAKkC,GAAS,EAAG+f,CAAI,GAEhBV,IAAa,QAAaA,EAASrf,CAAK,IAC/ClC,EAAE,MAAMkC,GAAS,GAAK,EAAG+f,CAAI,CAEpC,CAGD,KAAOjiB,EAAE,QAAWA,EAAE,KAAM,EAAG,GAQ3B,GAPaA,EAAE,YACJ6hB,IAIXJ,EAAQ,KAAKzhB,EAAE,IAAK,GAAI,CAAC,EAErByhB,EAAQ,SAAWE,GACnB,OAAA3hB,EAAE,MAAK,EACAyhB,EAIfP,EAAYlhB,EAAE,IAAK,GAAI,CAC1B,CAED,OAAAA,EAAE,MAAK,EACAyhB,CACV,CACL,CAEA,SAASM,GAASliB,EAAGqM,EAAKR,EAAK,CAC3B,OAAO7L,EAAIqM,EAAMA,EAAMrM,EAAIA,GAAK6L,EAAM,EAAI7L,EAAI6L,CAClD,CAGA,SAASgW,GAAWlW,EAAOhJ,EAAK,CAC5B,IAAI7C,EAAI,EACJC,EAAI4C,EAAI,OAAS,EACrB,KAAO7C,EAAIC,GAAG,CACV,MAAMM,EAAKP,EAAIC,GAAM,EACjB4C,EAAItC,CAAC,EAAIsL,EACT5L,EAAIM,EAEJP,EAAIO,EAAI,CAEf,CACD,OAAOsC,EAAI7C,CAAC,CAChB,CAGA,SAASshB,GAAKiB,EAAQvB,EAAO1J,EAASqI,EAAMC,EAAOS,EAAU,CACzD,GAAI,KAAK,MAAMV,EAAOU,CAAQ,GAAK,KAAK,MAAMT,EAAQS,CAAQ,EAAG,OAEjE,MAAM5N,EAAQ8P,EAAQ5C,EAAOC,GAAU,CAAC,EACxC,IAAI5f,EAAI2f,EAAO,EACX1f,EAAI2f,EAAQ,EAEhB,OAAa,CACT,GAAG5f,UAAYuiB,EAAOviB,CAAC,EAAIyS,GAC3B,GAAGxS,UAAYsiB,EAAOtiB,CAAC,EAAIwS,GAC3B,GAAIzS,GAAKC,EAAG,MACZuiB,GAAKD,EAAQvB,EAAO1J,EAAStX,EAAGC,CAAC,CACpC,CAEDqhB,GAAKiB,EAAQvB,EAAO1J,EAASqI,EAAM1f,EAAGogB,CAAQ,EAC9CiB,GAAKiB,EAAQvB,EAAO1J,EAASrX,EAAI,EAAG2f,EAAOS,CAAQ,CACvD,CAGA,SAASmC,GAAKD,EAAQvB,EAAO1J,EAAStX,EAAGC,EAAG,CACxC,MAAM2S,EAAO2P,EAAOviB,CAAC,EACrBuiB,EAAOviB,CAAC,EAAIuiB,EAAOtiB,CAAC,EACpBsiB,EAAOtiB,CAAC,EAAI2S,EAEZ,MAAM1S,EAAI,EAAIF,EACRO,EAAI,EAAIN,EAERT,EAAIwhB,EAAM9gB,CAAC,EACXT,EAAIuhB,EAAM9gB,EAAI,CAAC,EACf,EAAI8gB,EAAM9gB,EAAI,CAAC,EACfP,EAAIqhB,EAAM9gB,EAAI,CAAC,EACrB8gB,EAAM9gB,CAAC,EAAI8gB,EAAMzgB,CAAC,EAClBygB,EAAM9gB,EAAI,CAAC,EAAI8gB,EAAMzgB,EAAI,CAAC,EAC1BygB,EAAM9gB,EAAI,CAAC,EAAI8gB,EAAMzgB,EAAI,CAAC,EAC1BygB,EAAM9gB,EAAI,CAAC,EAAI8gB,EAAMzgB,EAAI,CAAC,EAC1BygB,EAAMzgB,CAAC,EAAIf,EACXwhB,EAAMzgB,EAAI,CAAC,EAAId,EACfuhB,EAAMzgB,EAAI,CAAC,EAAI,EACfygB,EAAMzgB,EAAI,CAAC,EAAIZ,EAEf,MAAMC,EAAI0X,EAAQtX,CAAC,EACnBsX,EAAQtX,CAAC,EAAIsX,EAAQrX,CAAC,EACtBqX,EAAQrX,CAAC,EAAIL,CACjB,CAIA,SAASyhB,GAAQllB,EAAGC,EAAG,CACnB,IAAIoD,EAAIrD,EAAIC,EACRqD,EAAI,MAASD,EACbE,EAAI,OAAUvD,EAAIC,GAClBuD,EAAIxD,GAAKC,EAAI,OAEbsL,EAAIlI,EAAKC,GAAK,EACdkI,EAAKnI,GAAK,EAAKA,EACfoI,EAAMlI,GAAK,EAAMD,EAAKE,GAAK,EAAOD,EAClC+iB,EAAMjjB,EAAKE,GAAK,EAAOC,GAAK,EAAMA,EAEtCH,EAAIkI,EAAGjI,EAAIkI,EAAGjI,EAAIkI,EAAGjI,EAAI8iB,EACzB/a,EAAMlI,EAAKA,GAAK,EAAOC,EAAKA,GAAK,EACjCkI,EAAMnI,EAAKC,GAAK,EAAOA,GAAMD,EAAIC,IAAM,EACvCmI,GAAOpI,EAAKE,GAAK,EAAOD,EAAKE,GAAK,EAClC8iB,GAAOhjB,EAAKC,GAAK,GAAQF,EAAIC,GAAME,GAAK,EAExCH,EAAIkI,EAAGjI,EAAIkI,EAAGjI,EAAIkI,EAAGjI,EAAI8iB,EACzB/a,EAAMlI,EAAKA,GAAK,EAAOC,EAAKA,GAAK,EACjCkI,EAAMnI,EAAKC,GAAK,EAAOA,GAAMD,EAAIC,IAAM,EACvCmI,GAAOpI,EAAKE,GAAK,EAAOD,EAAKE,GAAK,EAClC8iB,GAAOhjB,EAAKC,GAAK,GAAQF,EAAIC,GAAME,GAAK,EAExCH,EAAIkI,EAAGjI,EAAIkI,EAAGjI,EAAIkI,EAAGjI,EAAI8iB,EACzB7a,GAAOpI,EAAKE,GAAK,EAAOD,EAAKE,GAAK,EAClC8iB,GAAOhjB,EAAKC,GAAK,GAAQF,EAAIC,GAAME,GAAK,EAExCH,EAAIoI,EAAKA,GAAK,EACdnI,EAAIgjB,EAAKA,GAAK,EAEd,IAAIC,EAAKvmB,EAAIC,EACTumB,EAAKljB,EAAK,OAAUijB,EAAKljB,GAE7B,OAAAkjB,GAAMA,EAAMA,GAAM,GAAM,SACxBA,GAAMA,EAAMA,GAAM,GAAM,UACxBA,GAAMA,EAAMA,GAAM,GAAM,UACxBA,GAAMA,EAAMA,GAAM,GAAM,WAExBC,GAAMA,EAAMA,GAAM,GAAM,SACxBA,GAAMA,EAAMA,GAAM,GAAM,UACxBA,GAAMA,EAAMA,GAAM,GAAM,UACxBA,GAAMA,EAAMA,GAAM,GAAM,YAEfA,GAAM,EAAKD,KAAQ,CAChC,CC7WgB,SAAAE,GACdzG,EACAxf,EAAY,KACC,CACb,GAAIwf,EAAS,SAAW,EAAG,MAAO,GAClC,GAAIA,EAAS,SAAW,EAAG,MAAO,CAACA,CAAQ,EAG3C,MAAM0G,EAAc,IAAI3C,GAAS/D,EAAS,MAAM,EACvCA,EAAA,QAASzc,GAAM,CACtB,KAAM,CAACvD,EAAGC,CAAC,EAAIsD,EAAE,WACLmjB,EAAA,IAAI1mB,EAAIQ,EAAWP,EAAIO,EAAWR,EAAIQ,EAAWP,EAAIO,CAAS,CAAA,CAC3E,EACDkmB,EAAY,OAAO,EAEnB,MAAMC,EAAgC,CAAA,EAChCC,MAAc,IAEX,OAAA5G,EAAA,QAAQ,CAACE,EAAS9Z,IAAU,CAC/B,GAAAwgB,EAAQ,IAAIxgB,CAAK,EAAG,OAElB,MAAAygB,EAA+B,CAAC3G,CAAO,EAC7C,IAAI4G,EAAe1gB,EAEnBwgB,EAAQ,IAAIxgB,CAAK,EAIjB,IAAI2gB,EAAW/G,EAAS,OAExB,OAAa,CACX,GAAI+G,IAAa,EACT,MAAA,IAAI,MAAM,wBAAwB,EAG1C,MAAMzhB,EACJuhB,EAAkBA,EAAkB,OAAS,CAAC,EAAE,UAE5C,CAAC7mB,EAAGC,CAAC,EAAIqF,EACT0hB,EAAYN,EAAY,OAC5B1mB,EAAIQ,EACJP,EAAIO,EACJR,EAAIQ,EACJP,EAAIO,CAAA,EAGAymB,EAAiBC,GACrB,KAAK,KAAKJ,EAAeI,GAAclH,EAAS,MAAM,EAClDmH,EAAwBH,EAC3B,OAAQI,GAAkB,CAACR,EAAQ,IAAIQ,CAAa,CAAC,EACrD,IAAKA,GAA6C,CACjDpH,EAASoH,CAAa,EACtBA,EACAH,EAAcG,CAAa,CAC5B,CAAA,EACA,KAAK,CAAC,CAAK,CAAA,CAAA/jB,CAAC,EAAG,CAAK,CAAA,CAAAC,CAAC,IAAM2jB,EAAc5jB,CAAC,EAAI4jB,EAAc3jB,CAAC,CAAC,EAE7D,GAAA6jB,EAAsB,SAAW,EAAG,CAEtCR,EAAiB,KAAKE,CAAiB,EACvC,KACF,CAEA,KAAM,CAACrG,EAAa6G,CAAgB,EAAIF,EAAsB,CAAC,EAE/DN,EAAkB,KAAKrG,CAAW,EAClCoG,EAAQ,IAAIS,CAAgB,EACbP,EAAAO,CACjB,CAAA,CACD,EAEMV,CACT,CChEO,MAAM3D,UAAehe,EAAsB,CAIhD,YACEsiB,EACAC,EAAgB,CAAA,EAChB,CAAE,aAAA1f,EAAe,EAAU,EAAA,GAC3B,CACM,QACDA,GAAc2f,GAAmBF,EAASC,CAAK,EACpD,KAAK,QAAUD,EACf,KAAK,MAAQC,CACf,CAEA,IAAI,aAA2B,CAC7B,OAAO,KAAK,QAAQ,WACtB,CAEA,IAAI,QAAkB,CACb,OAAA,KAAK,MAAM,SAAW,CAC/B,CAEA,IAAI,UAAmB,CACrB,MAAO,CAAC,KAAK,QAAS,GAAG,KAAK,KAAK,CACrC,CAEA,OAAgB,CACd,OAAO,IAAIvE,EACT,KAAK,QAAQ,MAAM,EACnB,KAAK,MAAM,IAAKyE,GAASA,EAAK,OAAO,CAAA,CAEzC,CAEA,UAAUjjB,EAAsC,CAC9C,OAAO,IAAIwe,EACT,KAAK,QAAQ,UAAUxe,CAAM,EAC7B,KAAK,MAAM,IAAKijB,GAASA,EAAK,UAAUjjB,CAAM,CAAC,CAAA,CAEnD,CAEA,SAASzE,EAAwB,CAC/B,OACE,KAAK,QAAQ,SAASA,CAAK,GAC3B,CAAC,KAAK,MAAM,KAAM0nB,GAASA,EAAK,SAAS1nB,CAAK,CAAC,CAEnD,CAEA,WAAWG,EAAwB,CACjC,OAAO,KAAK,SAAS,KAAMuR,GACzBvR,EAAM,SAAS,KAAMwnB,GAAcjW,EAAK,WAAWiW,CAAS,CAAC,CAAA,CAEjE,CAEA,mBAAmBxnB,EAAkC,CACnD,MAAMynB,EAAeznB,aAAiB8iB,EAAS9iB,EAAM,SAAW,CAACA,CAAK,EAChE0nB,EAAsB,KAAK,SAAS,QAASnW,GAC1CkW,EAAa,QAASD,GACpBjW,EAAK,oBAAoBiW,CAAS,CAC1C,CACF,EAED,OAAOjB,GAAemB,CAAmB,EAAE,IAAK5H,GACvC,IAAIgB,EAAOhB,CAAQ,CAC3B,CACH,CACF,CAEO,SAASwH,GAAmBF,EAAgBC,EAAgB,GAAU,CAC3E,GAAI,CAACD,EAAe,MAAA,IAAI,MAAM,4BAA4B,EAC/C,SAAA,CAACO,EAAOC,CAAK,IAAKhI,GAAuB,CAACwH,EAAS,GAAGC,CAAK,CAAC,EACjE,GAAAM,EAAM,WAAWC,CAAK,EAClB,MAAA,IAAI,MAAM,sCAAsC,EAI1D,GACEP,EAAM,KACHE,GACC,CAACH,EAAQ,SAASG,EAAK,UAAU,GAAK,CAACH,EAAQ,SAASG,EAAK,UAAU,CAAA,EAGrE,MAAA,IAAI,MAAM,kCAAkC,EAGpD,SAAW,CAACM,EAAOC,CAAK,IAAKlI,GAAuByH,CAAK,EACvD,GAAIQ,EAAM,SAASC,EAAM,UAAU,EACjC,cAAQ,MAAMnF,GAAWkF,CAAK,EAAGlF,GAAWmF,CAAK,CAAC,EAC5C,IAAI,MAAM,sCAAsC,CAG5D,CCnGA,MAAMC,GAA6BC,GAA4B,CAC7D,MAAMC,EAAWD,EAAM,IAAI,CAACzW,EAAM5N,IACzBqkB,EACJ,MAAMrkB,EAAI,CAAC,EACX,IAAI,CAACvB,EAAGwB,IAAsB,CAACA,EAAID,EAAI,EAAGvB,CAAC,CAAC,EAC5C,OAAO,CAAC,CAAG,CAAApC,CAAK,IAAMuR,EAAK,YAAY,SAASvR,EAAM,WAAW,CAAC,EAClE,IAAI,CAAC,CAACkG,CAAK,IAAMA,CAAK,CAC1B,EACKgiB,EAAmB,CAAA,EACnBC,EAAmB,MAAMF,EAAS,MAAM,EAErC,OAAAA,EAAA,QAAQ,CAAChN,EAAStX,IAAM,CAC3B,IAAAykB,EAAUD,EAAiBxkB,CAAC,EAC3BykB,IACHA,EAAU,CAAA,EACVF,EAAO,KAAKE,CAAO,GAGbA,EAAA,KAAKJ,EAAMrkB,CAAC,CAAC,EAEjBsX,EAAQ,QACFA,EAAA,QAAS/U,GAAU,CACzBiiB,EAAiBjiB,CAAK,EAAIkiB,CAAA,CAC3B,CACH,CACD,EAEMF,CACT,EAOMG,GAAsBC,GACnBA,EAAa,IAAI,CAAC/W,EAAMrL,IAAU,CAEvC,MAAMrG,EADa0R,EAAK,SAAS,CAAC,EACT,SAEnBgX,EAAOD,EAAa,OAAO,CAACE,EAAoB5kB,IAChDsC,IAAUtC,EAAU,GACjB4kB,EAAmB,SAAS3oB,CAAK,CACzC,EAEM,MAAA,CACL,KAAA0R,EACA,KAAAgX,CAAA,CACF,CACD,EAGGE,GAA0B,CAC9BC,EACAC,IAEOD,EAAW,QAAQ,CAAC,CAAE,KAAME,KAC1BC,GACLF,EAAS,OACP,CAAC,CAAE,KAAApX,EAAM,KAAAgX,CAAK,IAAMhX,IAASqX,GAAaL,EAAK,QAAQK,CAAS,IAAM,EACxE,CAAA,CAEH,EAGGE,GAAoB,CACxBC,EACAJ,IACsB,CAChB,MAAAK,EAAuBL,EAAS,OAAO,CAAC,CAAE,KAAAJ,CAAK,IAAMA,EAAK,QAAU,CAAC,EAErEU,EAAmBJ,GACvBR,GAAmBU,EAAY,IAAI,CAAC,CAAE,KAAAxX,CAAK,IAAMA,CAAI,CAAC,CAAA,EAEjD,MAAA,CAACyX,EAAsB,GAAGC,CAAgB,CACnD,EAEMJ,GAAkBP,GAAqD,CAC3E,GAAI,CAACA,EAAa,OAAQ,MAAO,GAE3B,MAAAI,EAAaJ,EAAa,OAAO,CAAC,CAAE,KAAAC,KAAW,CAACA,EAAK,MAAM,EAC3DQ,EAAcT,EAAa,OAAO,CAAC,CAAE,KAAAC,CAAK,IAAMA,EAAK,OAAS,CAAC,EAErE,OAAIG,EAAW,SAAW,GAAKK,EAAY,SAAW,EAC7C,CAACT,CAAY,EACXI,EAAW,OAAS,EACtBD,GAAwBC,EAAYJ,CAAY,EAEhDQ,GAAkBC,EAAaT,CAAY,CAEtD,EAQO,SAASY,GAAclB,EAAyB,CAGrD,OADED,GAA0BC,CAAK,EAAE,IAAIK,EAAkB,EACpC,QAAQQ,EAAc,EAAE,IAAKM,GAAc,CAC9D,GAAIA,EAAU,SAAW,EAAG,OAAO,IAAIrG,EAAOqG,EAAU,CAAC,EAAE,IAAI,EAErDA,EAAA,KAAK,CAAChmB,EAAGC,IAAMD,EAAE,KAAK,OAASC,EAAE,KAAK,MAAM,EAChD,KAAA,CAACgkB,EAAS,GAAGC,CAAK,EAAI8B,EAAU,IAAI,CAAC,CAAE,KAAA5X,KAAWA,CAAI,EACrD,OAAA,IAAIuR,EAAOsE,EAASC,CAAK,CAAA,CACjC,CACH,CC/GgB,SAAA+B,GAAeC,EAAYC,EAAsB,CAC/D,MAAM1gB,EAAmB,CAAA,EAEzB,UAAW2gB,KAAMF,EACf,UAAWG,KAAMF,EACf1gB,EAAO,KAAK,CAAC2gB,EAAIC,CAAE,CAAC,EAIjB,OAAA5gB,CACT,CCLiB,SAAA6gB,GACf3J,EACA4J,EACAC,EACmB,CACb,MAAAC,EAAsB5J,GACnB0J,EAAiB,KAAMjkB,GACrB1E,EAAW0E,EAAcua,EAAQ,SAAS,CAClD,EAGG6J,EAAmBC,GAChBH,EAAkB,KAAM3J,GACtB8J,EAAc,OAAO9J,CAAO,CACpC,EAGH,IAAI+J,EAA2B,CAAA,EAC/B,UAAW/J,KAAWF,EAGhB8J,EAAmB5J,CAAO,GAC5B+J,EAAc,KAAK/J,CAAO,EAC1B,MAAM,IAAIc,EAAOiJ,EAAe,CAAE,aAAc,EAAM,CAAA,EACtDA,EAAgB,CAAA,GACPF,EAAgB7J,CAAO,GAC5B+J,EAAc,SAChB,MAAM,IAAIjJ,EAAOiJ,EAAe,CAAE,aAAc,EAAM,CAAA,EACtDA,EAAgB,CAAA,GAEZ,MAAA,IAAIjJ,EAAO,CAACd,CAAO,EAAG,CAAE,aAAc,GAAM,GAElD+J,EAAc,KAAK/J,CAAO,EAG1B+J,EAAc,SAChB,MAAM,IAAIjJ,EAAOiJ,EAAe,CAAE,aAAc,EAAM,CAAA,EAE1D,CC/BA,MAAMC,GAAkB,CAAClK,EAAqBjgB,IAAkB,CAC9D,MAAMkK,EAAa+V,EAAS,UAAWE,GAC9Bjf,EAAWlB,EAAOmgB,EAAQ,UAAU,CAC5C,EAEKiK,EAAQnK,EAAS,MAAM,EAAG/V,CAAU,EAGnC,OAFK+V,EAAS,MAAM/V,CAAU,EAE1B,OAAOkgB,CAAK,CACzB,EAEMC,GAAyB,CAACpK,EAAqBE,IAAqB,CACxE,IAAImK,EAAerK,EAEb,MAAAsK,EAAaC,GAEftpB,EAAWspB,EAAI,WAAYrK,EAAQ,UAAU,GAC7Cjf,EAAWspB,EAAI,UAAWrK,EAAQ,SAAS,EAI3C,IAAAjW,EAAa+V,EAAS,UAAUsK,CAAS,EAI7C,GAAIrgB,IAAe,GAAI,CACrB,MAAMgX,EAAmBjB,EAAS,IAAK5I,GAAMA,EAAE,SAAS,EAGxD,GAFA6J,EAAiB,QAAQ,EACZhX,EAAAgX,EAAiB,UAAUqJ,CAAS,EAC7CrgB,IAAe,GACT,cAAA,MACNgX,EAAiB,IAAK1d,GAAMA,EAAE,IAAI,EAClC2c,EAAQ,IAAA,EAEJ,IAAI,MAAM,mCAAmC,EAEtCmK,EAAApJ,CACjB,CAEA,MAAMkJ,EAAQE,EAAa,MAAM,EAAGpgB,CAAU,EAGvC,OAFKogB,EAAa,MAAMpgB,CAAU,EAE9B,OAAOkgB,CAAK,CACzB,EAIA,SAASK,GACPZ,EACAa,EACAC,EACA,CACO,OAAAd,EAAiB,OAAQjkB,GAAyB,CACvD,MAAMglB,EAAyBF,EAAe,OAAQrT,GAElDnW,EAAWmW,EAAE,WAAYzR,CAAY,GACrC1E,EAAWmW,EAAE,UAAWzR,CAAY,CAEvC,EACG,GAAAglB,EAAuB,OAAS,EAC5B,MAAA,IAAI,MAAM,oDAAoD,EAGtE,MAAMC,EAAWD,EAAuB,IAAKzK,GACpCwK,EAAY,SAASxK,EAAQ,QAAQ,CAC7C,EAMD,MAAO,EAFL0K,EAAS,MAAO/mB,GAAMA,CAAC,GAAK,CAAC+mB,EAAS,KAAM/mB,GAAMA,CAAC,EAE7C,CACT,CACH,CAQA,SAASgnB,GACPhQ,EACAiQ,EACAtqB,EAC6B,CAG7B,IAAIopB,EAA6B,CAAA,EACjC,MAAMC,EAA+B,CAAA,EAE/BkB,EAA+B,IAAI,MAAMlQ,EAAM,SAAS,MAAM,EACjE,KAAK,CAAC,EACN,IAAI,IAAM,CAAE,CAAA,EACTmQ,EAAgC,IAAI,MAAMF,EAAO,SAAS,MAAM,EACnE,KAAK,CAAC,EACN,IAAI,IAAM,CAAE,CAAA,EA6Bf,GA3BAjQ,EAAM,SAAS,QAAQ,CAACoQ,EAAcC,IAAe,CACnDJ,EAAO,SAAS,QAAQ,CAACK,EAAeC,IAAgB,CAChD,KAAA,CAAE,cAAA1hB,EAAe,SAAAye,CAAA,EAAaxI,GAClCsL,EACAE,EACA3qB,CAAA,EAGeopB,EAAA,KAAK,GAAGlgB,CAAa,EACtCqhB,EAAiBG,CAAU,EAAE,KAAK,GAAGxhB,CAAa,EAClDshB,EAAkBI,CAAW,EAAE,KAAK,GAAG1hB,CAAa,EAElCmgB,EAAA,KAAK,GAAG1B,CAAQ,EAClC,MAAMkD,EAAuBlD,EAAS,QAAS/Q,GAAM,CACnDA,EAAE,WACFA,EAAE,SAAA,CACH,EACgBwS,EAAA,KAAK,GAAGyB,CAAoB,EAC7CN,EAAiBG,CAAU,EAAE,KAAK,GAAGG,CAAoB,EACzDL,EAAkBI,CAAW,EAAE,KAAK,GAAGC,CAAoB,CAAA,CAC5D,CAAA,CACF,EAEkBzB,EAAAlpB,GAAsBkpB,EAAkBppB,CAAS,EAIhE,CAACopB,EAAiB,QAAUA,EAAiB,SAAW,EAAU,OAAA,KAGtE,MAAM0B,EAAW,CAAC,CAACpL,EAASxW,CAAa,IAIlCA,EAAc,OACZwW,EAAQ,QAAQxW,CAAa,EADF,CAACwW,CAAO,EAGxC,IAAAqL,EAAqBhlB,GAAI,CAACsU,EAAM,SAAUkQ,CAAgB,CAG7D,EAAE,QAAQO,CAAQ,EAEfE,EAAsBjlB,GAAI,CAACukB,EAAO,SAAUE,CAAiB,CAGhE,EAAE,QAAQM,CAAQ,EAWnB,GANmB1B,EAAAY,GACjBZ,EACA2B,EACAT,CAAA,EAGE,CAAClB,EAAiB,QAAU,CAACC,EAAkB,OAAe,OAAA,KAG9D,GAACA,EAAkB,OAIhB,CAEC,MAAA4B,EAAe5B,EAAkB,CAAC,EACnB0B,EAAAnB,GACnBmB,EACAE,CAAA,EAEoBD,EAAApB,GACpBoB,EACAC,CAAA,CAEJ,KAf+B,CACvB,MAAAC,EAAU9B,EAAiB,CAAC,EACb2B,EAAArB,GAAgBqB,EAAoBG,CAAO,EAC1CF,EAAAtB,GAAgBsB,EAAqBE,CAAO,CAAA,CAepE,IAAIC,EAAmB,MAAM,KAC3BhC,GACE4B,EACA3B,EACAC,CACF,CAAA,EAGE+B,EAAoB,MAAM,KAC5BjC,GACE6B,EACA5B,EACAC,CACF,CAAA,EAGF,OACE,CAAC5oB,EACC2qB,EAAkB,CAAC,EAAE,UACrBD,EAAiB,CAAC,EAAE,SAAA,GAErB9B,EAAkB,OAAS,GAAK+B,EAAkB,CAAC,EAAE,gBAAkB,KAEpDA,EAAAA,EAAkB,IAAKxU,GAAMA,EAAE,QAAQ,CAAC,EAAE,UAE3DnW,EAAW2qB,EAAkB,CAAC,EAAE,UAAWD,EAAiB,CAAC,EAAE,SAAS,IAEtDA,EAAAA,EAAiB,IAAKvU,GAAMA,EAAE,QAAQ,CAAC,EAAE,YAIzD7Q,GAAI,CAAColB,EAAkBC,CAAiB,CAAC,EAAE,IAAI,CAAC,CAAC/Q,EAAOiQ,CAAM,IAEjEjQ,EAAM,gBAAkB,GACxBgP,EAAkB,KAAMG,GACfnP,EAAM,SAAS,CAAC,EAAE,OAAOmP,CAAa,CAC9C,EAEM,CAACnP,EAAO,MAAM,EAEhB,CAACA,EAAOiQ,CAAM,CACtB,CACH,CAEA,SAASe,GAAmBC,EAAmB,CACzC,IAAAC,EAAYD,EAAQ,CAAC,EAEzB,UAAW5K,KAAU4K,EAAQ,MAAM,CAAC,EACtBC,EAAAA,EAAU,OAAO7K,CAAM,EAGrC,GAAI,CAACjgB,EAAW8qB,EAAU,WAAYA,EAAU,SAAS,EAC/C,cAAA,MACNhrB,EAAWgrB,EAAU,UAAU,EAC/BhrB,EAAWgrB,EAAU,SAAS,CAAA,EAE1B,IAAI,MAAM,oDAAoD,EAG/D,OAAA,IAAI7J,GAAK6J,EAAU,QAAQ,CACpC,CAEA,SAASC,GACPC,EACAC,EACA,CACA,MAAMJ,EAAUvlB,GAAI,CAClB2lB,EAAgB,MAAM,EAAG,EAAE,EAC3BA,EAAgB,MAAM,CAAC,CACxB,CAAA,EAAE,IAAI,CAAC,CAAC/B,EAAOpI,CAAG,IACV8J,GAAmBI,EAAa,MAAM9B,EAAOpI,CAAG,CAAC,CACzD,EAED,IAAIoK,EAAaF,EAAa,MAC5BC,EAAgBA,EAAgB,OAAS,CAAC,CAAA,EAExC,OAAAA,EAAgB,CAAC,IAAM,IACZC,EAAAA,EAAW,OAAOF,EAAa,MAAM,EAAGC,EAAgB,CAAC,CAAC,CAAC,GAElEJ,EAAA,KAAKD,GAAmBM,CAAU,CAAC,EAEpCL,CACT,CAEA,SAASM,GAAWH,EAAgC,CAClD,GAAI,CAACA,EAAa,OAAQ,MAAO,GAEjC,MAAMvF,EAAcuF,EAAa,IAAK1oB,GAAMA,EAAE,UAAU,EACxD,IAAI8oB,EAAYJ,EAAa,IAAK1oB,GAAMA,EAAE,SAAS,EACvC8oB,EAAAA,EAAU,MAAM,EAAE,EAAE,OAAOA,EAAU,MAAM,EAAG,EAAE,CAAC,EAE7D,MAAMH,EAAkB3lB,GAAI,CAACmgB,EAAa2F,CAAS,CAAC,EAAE,QACpD,CAAC,CAACC,EAAYC,CAAQ,EAAGnmB,IAClBnF,EAAWqrB,EAAYC,CAAQ,EAG7B,GAFEnmB,CAGX,EAGE,GAAA,CACK,OAAA4lB,GAAqBC,EAAcC,CAAe,QAIzD,OAAOzF,GAAewF,EAAa,QAAS7U,GAAMA,EAAE,QAAQ,CAAC,EAC1D,OAAQ7T,GAAMA,EAAE,OAAS,CAAC,EAC1B,OAAQA,GAAMtC,EAAWsC,EAAE,CAAC,EAAE,WAAYA,EAAE,GAAG,EAAE,EAAG,SAAS,CAAC,EAC9D,IAAKA,GAAM,IAAI2e,GAAK3e,CAAC,CAAC,CAC3B,CACF,CAEA,MAAMipB,GAAmB,CAACC,EAAsBvL,IAAmB,CACjE,GAAIuL,EAAW,SAAW,EAAG,MAAO,CAACvL,CAAM,EACrC,MAAAiL,EAAaM,EAAW,GAAG,EAAE,EACnC,OAAIxrB,EAAWkrB,EAAW,UAAWjL,EAAO,UAAU,EAC7CuL,EAAW,MAAM,EAAG,EAAE,EAAE,OAAO,CAACN,EAAW,OAAOjL,CAAM,CAAC,CAAC,EACxDjgB,EAAWkrB,EAAW,UAAWjL,EAAO,SAAS,EACnDuL,EACJ,MAAM,EAAG,EAAE,EACX,OAAO,CAACN,EAAW,OAAOjL,EAAO,QAAS,CAAA,CAAC,CAAC,EAExCuL,EAAW,OAAO,CAACvL,CAAM,CAAC,CAErC,EAEMwL,GAAoB,CAACD,EAAsBvL,IAC3CuL,EAAW,SAAW,EAAU,CAACvL,CAAM,EACvCjgB,EAAWwrB,EAAW,CAAC,EAAE,WAAYvL,EAAO,SAAS,EAChD,CAACA,EAAO,OAAOuL,EAAW,CAAC,CAAC,CAAC,EAAE,OAAOA,EAAW,MAAM,CAAC,CAAC,EAEzD,CAACvL,CAAM,EAAE,OAAOuL,CAAU,EAIrB,SAAAE,GACd9R,EACAiQ,EACA,CACE,YAAA8B,EACA,aAAAC,CACF,EAWI,CACE,MAAAf,EAAUjB,GAAwBhQ,EAAOiQ,CAAM,EAGrD,GAAI,CAACgB,EAAS,CACZ,MAAMgB,EAAmBjS,EAAM,SAAS,CAAC,EAAE,SACrCkS,EAAqBjC,EAAO,SAASgC,CAAgB,EAErDE,EAAoBlC,EAAO,SAAS,CAAC,EAAE,SACvCmC,EAAqBpS,EAAM,SAASmS,CAAiB,EAEpD,MAAA,CACL,UAAW,GACX,mBAAAD,EACA,mBAAAE,CAAA,CAEJ,CAEI,GAAAnB,EAAQ,MAAM,CAAC,CAAA,CAAGoB,CAAY,IAAMA,IAAiB,MAAM,EACtD,MAAA,CAAE,UAAW,IAGtB,IAAIC,EAA6B,KAC7BC,EAA2B,KAE/B,MAAMhW,EAAI0U,EAAQ,QAAQ,CAAC,CAACuB,EAAaH,CAAY,IAAM,CACzD,IAAII,EAA0B,CAAA,EAC1BC,EAAa,EAKjB,GAAIL,IAAiB,OACnB,OAAIE,IAAc,GACJA,EAAA,EACLC,GAGLD,IAAc,GAAKA,IAAc,GACvBA,EAAA,KACL,IAGLA,IAAc,MACXD,EACcA,EAAAA,EAAY,OAAOE,CAAW,EADjBF,EAAAE,EAEzB,KAGT,QAAQ,MAAM,iBAAiB,EACxB,IAMT,MAAMG,EAAoBH,EAAY,SAAS,CAAC,EAAE,SAC5CI,EAA4B3C,EAAO,SAAS0C,CAAiB,GAGhEZ,IAAgB,QAAUa,GAC1Bb,IAAgB,UAAY,CAACa,KAEhBF,GAAA,EACED,EAAAd,GAAiBc,EAAeD,CAAW,GAG7D,MAAMK,EAAqBR,EAAa,SAAS,CAAC,EAAE,SAC9CS,EAA4B9S,EAAM,SAAS6S,CAAkB,EAEnE,GACGb,IAAiB,QAAUc,GAC3Bd,IAAiB,UAAY,CAACc,EAC/B,CACA,MAAMC,EAAcV,EAENK,GAAA,EAEVA,IAAe,GAAKD,EAAc,QACpBA,EAAAd,GAAiBc,EAAeM,CAAW,EAC7CT,EAAA,MAEdG,EAAgB,CAACM,CAAW,CAEhC,CAYI,OARAR,IAAc,MAAQG,IAAe,GAAKJ,IAC5BG,EAAAZ,GAAkBY,EAAeH,CAAW,GAG1DI,IAAe,IACLH,EAAAG,EACEJ,EAAA,MAEXG,EAAc,OAIZA,GAHSH,EAAA,KACP,GAEF,CACR,EAGD,OAAOf,GAAWhV,CAAC,CACrB,CAEa,MAAAyW,GAAY,CAAChT,EAAaiQ,IAAyB,CACxD,MAAAhiB,EAAS6jB,GAAqB9R,EAAOiQ,EAAQ,CACjD,YAAa,SACb,aAAc,QAAA,CACf,EAEG,OAAA,MAAM,QAAQhiB,CAAM,EAAUA,EAE9BA,EAAO,UACF,CAAC+R,CAAK,EAGX/R,EAAO,mBACF,CAACgiB,CAAM,EAGZhiB,EAAO,mBACF,CAAC+R,CAAK,EAGR,CAACA,EAAOiQ,CAAM,CACvB,EAEagD,GAAW,CAACjT,EAAaiQ,IAAyB,CACvD,MAAAhiB,EAAS6jB,GAAqB9R,EAAOiQ,EAAQ,CACjD,YAAa,SACb,aAAc,MAAA,CACf,EAEG,OAAA,MAAM,QAAQhiB,CAAM,EAAUA,EAE9BA,EAAO,UACF,GAGLA,EAAO,mBACF,GAGLA,EAAO,mBACF,CAAC+R,EAAOiQ,CAAM,EAGhB,CAACjQ,CAAK,CACf,EAEakT,GAAiB,CAAClT,EAAaiQ,IAAyB,CAC7D,MAAAhiB,EAAS6jB,GAAqB9R,EAAOiQ,EAAQ,CACjD,YAAa,OACb,aAAc,MAAA,CACf,EAEG,OAAA,MAAM,QAAQhiB,CAAM,EAAUA,EAE9BA,EAAO,UACF,CAAC+R,CAAK,EAGX/R,EAAO,mBACF,CAAC+R,CAAK,EAGX/R,EAAO,mBACF,CAACgiB,CAAM,EAGT,EACT,EC5fO,SAASkD,GAAwBC,EAAmB,CACnD,MAAAC,MAAY,IAEZ3d,EAAkC,CAAA,EAEhC,OAAA0d,EAAA,QAAQ,CAACE,EAAatqB,IAAM,CAC9B,IAAAuqB,EAKAF,EAAM,IAAIrqB,CAAC,EACEuqB,EAAAF,EAAM,IAAIrqB,CAAC,GAEXuqB,EAAA,CAAE,QAAS,CAACD,CAAW,EAAG,UAAW,IAAI,IAAI,CAACtqB,CAAC,CAAC,GAC/D0M,EAAO,KAAK6d,CAAY,GAG1BH,EAAQ,MAAMpqB,EAAI,CAAC,EAAE,QAAQ,CAACwqB,EAAkBvqB,IAAM,CACpD,MAAM4e,EAAS0L,EAAa,QAEtBtH,EAAejjB,EAAIC,EAAI,EAEzB,GAAAsqB,EAAa,UAAU,IAAItH,CAAY,EAAG,OAE1C,IAAAwH,EAAc,CAACD,CAAgB,EAC/BE,EAAe,GAUnB,GARIL,EAAM,IAAIpH,CAAY,IACVwH,EAAAJ,EAAM,IAAIpH,CAAY,EAAE,QACvByH,EAAA,IAMb,CAHoB7L,EAAO,KAAMhf,GACnC4qB,EAAY,KAAMlX,GAAM1T,EAAE,WAAW0T,CAAC,CAAC,CAAA,EAEnB,OAElB,IAAAoX,EACA9L,EAAO,OAAS,GAAK4L,EAAY,OAAS,EACjCE,EAAAC,GAAiB/L,EAAQ4L,CAAW,EAE/CE,EAAWE,GAAYhM,EAAO,CAAC,EAAG4L,EAAY,CAAC,CAAC,EAGrCF,EAAA,UAAU,IAAItH,CAAY,EACvCsH,EAAa,QAAUI,EAClBD,GAAoBL,EAAA,IAAIpH,EAAcsH,CAAY,CAAA,CACxD,CAAA,CACF,EAEM7d,EAAO,QAAQ,CAAC,CAAE,QAAAoe,KAAcA,CAAO,CAChD,CAEgB,SAAAD,GAAY7T,EAAeiQ,EAAgB,CACzD,MAAM8D,EAAaf,GAAUhT,EAAM,QAASiQ,EAAO,OAAO,EAEpD+D,EAAc/D,EAAO,MAAM,QAASvnB,GAAMuqB,GAASvqB,EAAGsX,EAAM,OAAO,CAAC,EACpEiU,EAAcjU,EAAM,MAAM,QAAStX,GAAMuqB,GAASvqB,EAAGunB,EAAO,OAAO,CAAC,EAEpEiE,EAAqBzF,GAASzO,EAAM,MAAOiQ,EAAO,KAAK,EAAE,QAC7D,CAAC,CAACjQ,EAAOiQ,CAAM,IAAMiD,GAAelT,EAAOiQ,CAAM,CAAA,EAGnD,OAAO1B,GAAc,CACnB,GAAGwF,EACH,GAAGC,EACH,GAAGC,EACH,GAAGC,CAAA,CACJ,CACH,CAEgB,SAAAC,GAAWnU,EAAeiQ,EAA0B,CAC9D,GAAAjQ,EAAM,QAAUiQ,EAAO,OACzB,OAAO1B,GAAc0E,GAASjT,EAAM,QAASiQ,EAAO,OAAO,CAAC,EAG9D,GAAIjQ,EAAM,OAAQ,CAChB,MAAMoU,EAAanB,GAASjT,EAAM,QAASiQ,EAAO,OAAO,EACnDoE,EAAWpE,EAAO,MAAM,QAASvnB,GACrCwqB,GAAexqB,EAAGsX,EAAM,OAAO,CAAA,EAIjC,OAAOuO,GAAc,CAAC,GAAG6F,EAAY,GAAGC,CAAQ,CAAC,CAAA,SACxCpE,EAAO,QACZ,CAACjQ,EAAM,QAAQ,WAAWiQ,EAAO,OAAO,EAC1C,GAAKjQ,EAAM,QAAQ,SAASiQ,EAAO,QAAQ,UAAU,EAG9C,CACL,MAAMqE,EAAYV,GAChB5T,EAAM,MAAM,IAAKjX,GAAM,IAAIof,EAAOpf,CAAC,CAAC,EACpC,CAACknB,CAAM,CAAA,EAGT,OAAO1B,GAAc,CACnBvO,EAAM,QACN,GAAGsU,EAAU,QAASzrB,GAAMA,EAAE,QAAQ,CAAA,CACvC,CACH,KAXE,OAAO,CAACmX,CAAK,EAgBnB,IAAIuU,EAAaJ,GAAW,IAAIhM,EAAOnI,EAAM,OAAO,EAAGiQ,CAAM,EACvD,OAAAjQ,EAAA,MAAM,QAASwU,GAAQ,CACdD,EAAAA,EAAW,QAAS7rB,GAAMyrB,GAAWzrB,EAAG,IAAIyf,EAAOqM,CAAG,CAAC,CAAC,CAAA,CACtE,EAEMD,CACT,CAEgB,SAAAE,GAAiBzU,EAAeiQ,EAA0B,CACxE,MAAMyE,EAAoBxB,GAAelT,EAAM,QAASiQ,EAAO,OAAO,EACtE,GAAI,CAACyE,EAAkB,OAAQ,MAAO,GAElC,IAAAC,EAAMpG,GAAcmG,CAAiB,EACnC,OAAAC,EAAAC,GACJD,EACA3U,EAAM,MAAM,IAAKjX,GAAM,IAAIof,EAAOpf,CAAC,CAAC,CAAA,EAI/B6rB,GACLD,EACA1E,EAAO,MAAM,IAAKlnB,GAAM,IAAIof,EAAOpf,CAAC,CAAC,CAAA,CAEzC,CAEgB,SAAA6qB,GAAiB5T,EAAiBiQ,EAA4B,CAC5E,GAAI,CAACjQ,EAAM,OAAe,OAAAiQ,EAC1B,GAAI,CAACA,EAAO,OAAe,OAAAjQ,EAGxB,GAAAA,EAAM,SAAW,GAAKiQ,EAAO,OAAS,GACtCA,EAAO,SAAW,GAAKjQ,EAAM,OAAS,EAEvC,OAAOmT,GAAwB,CAAC,GAAGnT,EAAO,GAAGiQ,CAAM,CAAC,EAGtD,GAAIjQ,EAAM,OAAS,GAAKiQ,EAAO,OAAS,EAAG,CACzC,IAAI0E,EAAMf,GAAiB,CAAC5T,EAAM,CAAC,CAAC,EAAGiQ,CAAM,EAE7C,OAAAjQ,EAAM,MAAM,CAAC,EAAE,QAAS6U,GAAQ,CAC9BF,EAAMf,GAAiB,CAACiB,CAAG,EAAGF,CAAG,CAAA,CAClC,EACMA,CACT,CAEA,OAAI3U,EAAM,SAAW,GAAKiQ,EAAO,SAAW,EACnC4D,GAAY7T,EAAM,CAAC,EAAGiQ,EAAO,CAAC,CAAC,EAGjC,EACT,CAEgB,SAAA2E,GAAgB5U,EAAiBiQ,EAA4B,CAC3E,GAAI,CAACjQ,EAAM,OAAQ,MAAO,GAC1B,GAAI,CAACiQ,EAAO,OAAe,OAAAjQ,EAG3B,GAAIA,EAAM,SAAW,GAAKiQ,EAAO,SAAW,EAC1C,OAAOkE,GAAWnU,EAAM,CAAC,EAAGiQ,EAAO,CAAC,CAAC,EAGnC,GAAAjQ,EAAM,OAAS,EAEV,OAAAA,EAAM,QAAS6U,GAAQD,GAAgB,CAACC,CAAG,EAAG5E,CAAM,CAAC,EAS9D,IAAI0E,EAAMR,GAAWnU,EAAM,CAAC,EAAGiQ,EAAO,CAAC,CAAC,EACxC,OAAAA,EAAO,MAAM,CAAC,EAAE,QAAS4E,GAAQ,CAC/BF,EAAMC,GAAgBD,EAAK,CAACE,CAAG,CAAC,CAAA,CACjC,EACMF,CACT,CAEgB,SAAAG,GACd9U,EACAiQ,EACU,CACV,MAAI,CAACjQ,EAAM,QAAU,CAACiQ,EAAO,OACpB,GAGLjQ,EAAM,SAAW,GAAKiQ,EAAO,SAAW,EACnCwE,GAAiBzU,EAAM,CAAC,EAAGiQ,EAAO,CAAC,CAAC,EAGzCjQ,EAAM,OAAS,EACVA,EAAM,QAAS6U,GAAQC,GAAsB,CAACD,CAAG,EAAG5E,CAAM,CAAC,EAG7DA,EAAO,QAAS4E,GAAQC,GAAsB9U,EAAO,CAAC6U,CAAG,CAAC,CAAC,CACpE,CC/LO,MAAM3M,WAAgB/d,EAAuB,CAGlD,YAAYipB,EAAoB,CAAC,EAAG,CAAE,aAAApmB,EAAe,EAAU,EAAA,GAAI,CAC3D,QAKR,KAAQ,aAAmC,KAJpCA,GAAc+nB,GAAoB3B,CAAO,EAC9C,KAAK,QAAUA,CACjB,CAIA,IAAI,SAAmB,CACd,OAAA,KAAK,QAAQ,SAAW,CACjC,CAEA,IAAI,aAA2B,CAC7B,GAAI,KAAK,QAAS,OAAO,IAAIvuB,GACzB,GAAA,KAAK,eAAiB,KAAM,CAC9B,IAAImwB,EAAc,KAAK,QAAQ,CAAC,EAAE,YAClC,UAAWnN,KAAU,KAAK,QAAQ,MAAM,CAAC,EACzBmN,EAAAA,EAAY,MAAMnN,EAAO,WAAW,EAEpD,KAAK,aAAemN,CACtB,CACA,OAAO,KAAK,YACd,CAEA,OAAiB,CACR,OAAA,IAAI9M,GAAQ,KAAK,QAAQ,IAAKL,GAAWA,EAAO,MAAO,CAAA,CAAC,CACjE,CAEA,UAAUle,EAAuC,CACxC,OAAA,IAAIue,GAAQ,KAAK,QAAQ,IAAKL,GAAWA,EAAO,UAAUle,CAAM,CAAC,CAAC,CAC3E,CAEA,SAASzE,EAAwB,CACxB,OAAA,KAAK,QAAQ,KAAM2iB,GAAWA,EAAO,SAAS3iB,CAAK,CAAC,CAC7D,CAEA,WAAWG,EAAyB,CAClC,OAAO,KAAK,QAAQ,KAAMwiB,GACxBxiB,EAAM,QAAQ,KAAMouB,GAAgB5L,EAAO,WAAW4L,CAAW,CAAC,CAAA,CAEtE,CAEA,mBAAmBpuB,EAA4C,CAC7D,OAAO,KAAK,QAAQ,QAASwiB,GACrBxiB,aAAiB6iB,GAIhB7iB,EAAM,QAAQ,QAASouB,GAC5B5L,EAAO,mBAAmB4L,CAAW,CAAA,EAJ9B5L,EAAO,mBAAmBxiB,CAAK,CAMzC,CACH,CAEA,KAAKA,EAAyB,CAC5B,OAAO,IAAI6iB,GAAQ0L,GAAiB,KAAK,QAASvuB,EAAM,OAAO,CAAC,CAClE,CAEA,IAAIA,EAAyB,CAC3B,OAAO,IAAI6iB,GAAQ0M,GAAgB,KAAK,QAASvvB,EAAM,OAAO,CAAC,CACjE,CAEA,UAAUA,EAAyB,CACjC,OAAO,IAAI6iB,GAAQ4M,GAAsB,KAAK,QAASzvB,EAAM,OAAO,CAAC,CACvE,CACF,CAEO,SAAS0vB,GAAoB3B,EAAyB,CAC3D,SAAW,CAACvL,EAAQ4L,CAAW,IAAKxO,GAAuBmO,CAAO,EAC5D,GAAAvL,EAAO,WAAW4L,CAAW,EACzB,MAAA,IAAI,MAAM,oCAAoC,CAG1D","x_google_ignoreList":[18,19,20,21,22,23,24,25,26,27,28,29,46,47]}