@weasel-js/geom 1.13.0-rc.0 → 1.14.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.
- package/README.md +6 -2
- package/dist/3d/index.d.ts +8 -1
- package/dist/3d/index.js +25 -1
- package/dist/3d/index.js.map +1 -1
- package/dist/booleans/index.d.ts +6 -5
- package/dist/booleans/index.js +583 -73
- package/dist/booleans/index.js.map +1 -1
- package/dist/{chunk-CE7IY7TB.js → chunk-2N6OWA7E.js} +3 -3
- package/dist/{chunk-CE7IY7TB.js.map → chunk-2N6OWA7E.js.map} +1 -1
- package/dist/{chunk-Q66NA2FU.js → chunk-3HQJGI63.js} +8 -5
- package/dist/chunk-3HQJGI63.js.map +1 -0
- package/dist/{chunk-YPWFGFQX.js → chunk-3YH5XU3H.js} +125 -8
- package/dist/chunk-3YH5XU3H.js.map +1 -0
- package/dist/{chunk-UI3FUWXM.js → chunk-42TZDN5C.js} +4 -4
- package/dist/{chunk-UI3FUWXM.js.map → chunk-42TZDN5C.js.map} +1 -1
- package/dist/{chunk-B53BERKG.js → chunk-B3D6KWW3.js} +110 -8
- package/dist/chunk-B3D6KWW3.js.map +1 -0
- package/dist/{chunk-2PKPKU4P.js → chunk-EURWZUNY.js} +25 -22
- package/dist/chunk-EURWZUNY.js.map +1 -0
- package/dist/{chunk-VHXOCDZ2.js → chunk-FROQPADA.js} +6 -6
- package/dist/{chunk-VHXOCDZ2.js.map → chunk-FROQPADA.js.map} +1 -1
- package/dist/{chunk-UGE57OTX.js → chunk-GWSJQSQE.js} +11 -8
- package/dist/chunk-GWSJQSQE.js.map +1 -0
- package/dist/chunk-XXNK4N7Z.js +683 -0
- package/dist/chunk-XXNK4N7Z.js.map +1 -0
- package/dist/chunk-ZOMUTU7J.js +249 -0
- package/dist/chunk-ZOMUTU7J.js.map +1 -0
- package/dist/{curvature-PkoLduGc.d.ts → curvature-CDOI32hv.d.ts} +46 -3
- package/dist/curves/index.d.ts +2 -2
- package/dist/curves/index.js +4 -4
- package/dist/index.d.ts +172 -45
- package/dist/index.js +244 -178
- package/dist/index.js.map +1 -1
- package/dist/nd/index.d.ts +28 -1
- package/dist/nd/index.js +27 -675
- package/dist/nd/index.js.map +1 -1
- package/dist/{path-BW8d_2RY.d.ts → path-t80OoJnM.d.ts} +11 -0
- package/dist/tessellate/index.d.ts +11 -4
- package/dist/tessellate/index.js +4 -4
- package/dist/warp/index.d.ts +1 -1
- package/dist/warp/index.js +238 -64
- package/dist/warp/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-2PKPKU4P.js.map +0 -1
- package/dist/chunk-B53BERKG.js.map +0 -1
- package/dist/chunk-Q66NA2FU.js.map +0 -1
- package/dist/chunk-STGSBIOL.js +0 -152
- package/dist/chunk-STGSBIOL.js.map +0 -1
- package/dist/chunk-UGE57OTX.js.map +0 -1
- package/dist/chunk-YPWFGFQX.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/paths/curvature.ts","../src/paths/eulerSpiral.ts","../src/paths/spiro.ts","../src/paths/spiroPath.ts"],"names":[],"mappings":"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","file":"chunk-UI3FUWXM.js","sourcesContent":["import type { AnchorSet } from './anchorEdits';\nimport { isStraightSegment, segmentEnds } from './anchors';\nimport { cubicPointAt, type Point } from './cubicMath';\n\n/** First derivative of the cubic Bezier (p0, p1, p2, p3) at t. */\nexport function cubicDerivativeAt(p0: Point, p1: Point, p2: Point, p3: Point, t: number): Point {\n const u = 1 - t;\n return {\n x: 3 * u * u * (p1.x - p0.x) + 6 * u * t * (p2.x - p1.x) + 3 * t * t * (p3.x - p2.x),\n y: 3 * u * u * (p1.y - p0.y) + 6 * u * t * (p2.y - p1.y) + 3 * t * t * (p3.y - p2.y),\n };\n}\n\nfunction cubicSecondDerivativeAt(p0: Point, p1: Point, p2: Point, p3: Point, t: number): Point {\n const u = 1 - t;\n return {\n x: 6 * u * (p2.x - 2 * p1.x + p0.x) + 6 * t * (p3.x - 2 * p2.x + p1.x),\n y: 6 * u * (p2.y - 2 * p1.y + p0.y) + 6 * t * (p3.y - 2 * p2.y + p1.y),\n };\n}\n\n/**\n * Signed curvature of the cubic Bezier (p0, p1, p2, p3) at t: one over the\n * radius of the circle that fits the curve there. Positive where the curve\n * turns toward its left normal `(-dy, dx)`, negative where it turns away, so\n * the sign flips at an inflection. 0 where the curve has no direction at t, as\n * at an end whose handle sits on its anchor.\n */\nexport function cubicCurvatureAt(p0: Point, p1: Point, p2: Point, p3: Point, t: number): number {\n const d1 = cubicDerivativeAt(p0, p1, p2, p3, t);\n const d2 = cubicSecondDerivativeAt(p0, p1, p2, p3, t);\n const den = Math.pow(d1.x * d1.x + d1.y * d1.y, 1.5);\n if (den < 1e-12) return 0;\n return (d1.x * d2.y - d1.y * d2.x) / den;\n}\n\n/** One tooth of a curvature comb: a point on the curve and the tip of the\n * tooth standing on it. */\nexport interface CombTooth {\n /** The point on the curve. */\n x: number;\n y: number;\n /** The tooth's tip: off the curve along its normal, on the outside of the\n * bend, by the curvature times the comb's scale. */\n tipX: number;\n tipY: number;\n /** Signed curvature at the point, as {@link cubicCurvatureAt} gives it. */\n curvature: number;\n}\n\n/** The comb of one curved segment, which runs from anchor `segIdx` of\n * subpath `sub` to the next. */\nexport interface SegmentComb {\n sub: number;\n segIdx: number;\n /** Evenly spaced in t, ends included. */\n teeth: CombTooth[];\n}\n\n/** Options for {@link curvatureComb} and {@link combTeeth}. */\nexport interface CurvatureCombOptions {\n /** Tooth length per unit of curvature. A tooth over a stretch of radius r is\n * `scale / r` long, in the curve's own units. */\n scale: number;\n /** Teeth per segment for {@link curvatureComb}, or along the whole source\n * for {@link combTeeth}; ends included. Default 24; at least 2. */\n samplesPerSegment?: number;\n}\n\n/**\n * A curve parameterized over t in [0, 1], as a curvature comb reads it. Any\n * curve can stand a comb this way, whether or not it is a path.\n */\nexport interface CurvatureSource {\n /** The point on the curve at t. */\n pointAt(t: number): Point;\n /** A vector along the direction of travel at t. Only its direction is read;\n * a zero vector means the curve has no direction there. */\n tangentAt(t: number): Point;\n /** Signed curvature at t, positive where the curve turns toward its left\n * normal `(-dy, dx)`, as {@link cubicCurvatureAt} gives it. */\n curvatureAt(t: number): number;\n}\n\n/** How far in from an end a tooth moves when the curve has no direction at\n * the end itself, so it reports the curvature the end is approached with. */\nconst END_NUDGE = 1e-3;\n\nfunction sampleCount(opts: CurvatureCombOptions): number {\n return Math.max(2, Math.round(opts.samplesPerSegment ?? 24));\n}\n\n/**\n * The teeth of a curvature comb along `source`, evenly spaced in t with both\n * ends included. Each stands out of the curve along its normal, on the outside\n * of the bend, `scale` times the curvature long.\n */\nexport function combTeeth(source: CurvatureSource, opts: CurvatureCombOptions): CombTooth[] {\n const samples = sampleCount(opts);\n const teeth: CombTooth[] = [];\n for (let i = 0; i < samples; i++) teeth.push(toothAt(source, i / (samples - 1), opts.scale));\n return teeth;\n}\n\n/** The cubic Bezier (p0, p1, p2, p3) as a {@link CurvatureSource}. */\nexport function cubicCurvatureSource(p0: Point, p1: Point, p2: Point, p3: Point): CurvatureSource {\n return {\n pointAt: (t) => cubicPointAt(p0, p1, p2, p3, t),\n tangentAt: (t) => cubicDerivativeAt(p0, p1, p2, p3, t),\n curvatureAt: (t) => cubicCurvatureAt(p0, p1, p2, p3, t),\n };\n}\n\n/**\n * Curvature combs for every curved segment of `set`: teeth that stand out of\n * the curve, each as long as the curvature where it stands. Joining their tips\n * draws how the bend changes along the path. A tooth that jumps in length at\n * an anchor shows a curvature break there; teeth that change side show an\n * inflection. Straight segments have no curvature, and no comb.\n */\nexport function curvatureComb(set: AnchorSet, opts: CurvatureCombOptions): SegmentComb[] {\n const out: SegmentComb[] = [];\n for (let sub = 0; sub < set.anchors.length; sub++) {\n const count = set.anchors[sub].length - (set.closed[sub] ? 0 : 1);\n for (let segIdx = 0; segIdx < count; segIdx++) {\n const ends = segmentEnds(set.anchors, set.closed, sub, segIdx);\n if (!ends || isStraightSegment(ends.a, ends.b)) continue;\n const { a, b } = ends;\n const source = cubicCurvatureSource(a, a.outHandle ?? a, b.inHandle ?? b, b);\n out.push({ sub, segIdx, teeth: combTeeth(source, opts) });\n }\n }\n return out;\n}\n\nfunction toothAt(source: CurvatureSource, t: number, scale: number): CombTooth {\n const at = source.pointAt(t);\n let d = source.tangentAt(t);\n let k = source.curvatureAt(t);\n if (Math.hypot(d.x, d.y) < 1e-9) {\n const inner = t < 0.5 ? t + END_NUDGE : t - END_NUDGE;\n d = source.tangentAt(inner);\n k = source.curvatureAt(inner);\n }\n const len = Math.hypot(d.x, d.y);\n if (len < 1e-12) return { x: at.x, y: at.y, tipX: at.x, tipY: at.y, curvature: 0 };\n // The bend's center lies along the left normal times 1/k, so the tooth goes\n // the other way: outside the bend on either side of an inflection.\n const nx = -d.y / len;\n const ny = d.x / len;\n return { x: at.x, y: at.y, tipX: at.x - nx * k * scale, tipY: at.y - ny * k * scale, curvature: k };\n}\n","/**\n * One spiral segment, fitted between two points so it leaves the first and\n * reaches the second at given angles to the chord. `solveSpiro` joins these\n * into a curvature-continuous spline.\n *\n * In its normalized frame the segment has unit arc length and, with\n * `u = s − ½`, tangent angle `φ = k0·u + (k1/2)·u² + (k2/6)·u³ + (k3/24)·u⁴`,\n * so its curvature is `k0 + k1·u + (k2/2)·u² + (k3/6)·u³`. An Euler spiral has\n * `k2 = k3 = 0`: its curvature changes linearly along it. A cubic-curvature\n * segment uses all four, which is what lets a G4 point keep the curvature's\n * first two derivatives continuous as well.\n */\nimport type { Point } from './cubicMath';\n\n/** The shape of a fitted segment, in its normalized frame. */\nexport interface EulerFit {\n k0: number;\n k1: number;\n /** Zero on an Euler spiral; set on a cubic-curvature segment. */\n k2: number;\n k3: number;\n /** Chord over arc length: the normalized segment's chord length. */\n ratio: number;\n /** The normalized chord's angle, which the world chord is rotated onto. */\n chordAngle: number;\n}\n\n/** Steps of the Simpson rule that integrates a segment's tangent. Even. */\nconst STEPS = 48;\n/** A chord-relative angle past this has no sensible spiral. */\nconst MAX_ANGLE = Math.PI * 0.95;\n\nconst clampAngle = (a: number): number => Math.max(-MAX_ANGLE, Math.min(MAX_ANGLE, a));\n\n/** `∫₀^upTo e^{iφ(s)} ds` for the normalized segment `(k0, k1, k2, k3)`. */\nexport function integrateEuler(k0: number, k1: number, upTo = 1, k2 = 0, k3 = 0): Point {\n const n = Math.max(2, Math.ceil((STEPS * upTo) / 2) * 2);\n const h = upTo / n;\n let x = 0;\n let y = 0;\n for (let i = 0; i <= n; i++) {\n const u = i * h - 0.5;\n const phi = k0 * u + u * u * (k1 / 2 + u * (k2 / 6 + (u * k3) / 24));\n const w = i === 0 || i === n ? 1 : i % 2 === 1 ? 4 : 2;\n x += w * Math.cos(phi);\n y += w * Math.sin(phi);\n }\n return { x: (x * h) / 3, y: (y * h) / 3 };\n}\n\n/** How far the start angle of `(k0, k1, k2, k3)` is from `th0`. */\nfunction startError(k0: number, k1: number, k2: number, k3: number, th0: number): number {\n const c = integrateEuler(k0, k1, 1, k2, k3);\n return -k0 / 2 + k1 / 8 - k2 / 48 + k3 / 384 - Math.atan2(c.y, c.x) - th0;\n}\n\n/**\n * The spiral leaving its chord at angle `th0` and reaching the far end at\n * angle `th1`, both measured from the chord, counterclockwise positive. With\n * `k2` and `k3` left at zero it is an Euler spiral; given, they are the\n * cubic-curvature segment's higher terms, and `k0` and `k1` are fitted around them.\n */\nexport function fitEulerSegment(th0: number, th1: number, k2 = 0, k3 = 0): EulerFit {\n const t0 = clampAngle(th0);\n const t1 = clampAngle(th1);\n // The odd terms set the total turn; the even ones bow the segment.\n const k0 = t1 - t0 - k2 / 24;\n // The small-angle solution, then Newton on the one remaining unknown.\n let k1 = 6 * (t0 + t1) - k3 / 40;\n for (let iter = 0; iter < 12; iter++) {\n const e = startError(k0, k1, k2, k3, t0);\n if (Math.abs(e) < 1e-12) break;\n const d = (startError(k0, k1 + 1e-6, k2, k3, t0) - e) / 1e-6;\n if (!Number.isFinite(d) || Math.abs(d) < 1e-12) break;\n k1 -= e / d;\n }\n const c = integrateEuler(k0, k1, 1, k2, k3);\n return { k0, k1, k2, k3, ratio: Math.hypot(c.x, c.y), chordAngle: Math.atan2(c.y, c.x) };\n}\n\n/** A fitted segment placed between two world points. */\nexport interface EulerSegment extends EulerFit {\n p0: Point;\n p1: Point;\n /** World arc length. */\n length: number;\n /** The world angle the normalized frame is turned by. */\n rotation: number;\n}\n\n/** `fit` placed so it runs from `p0` to `p1`. */\nexport function placeEulerSegment(fit: EulerFit, p0: Point, p1: Point): EulerSegment {\n const chord = Math.hypot(p1.x - p0.x, p1.y - p0.y);\n const length = fit.ratio > 1e-9 ? chord / fit.ratio : chord;\n const rotation = Math.atan2(p1.y - p0.y, p1.x - p0.x) - fit.chordAngle;\n return { ...fit, p0, p1, length, rotation };\n}\n\n/** The point at fraction `s` of the arc length along `seg`. */\nexport function eulerPointAt(seg: EulerSegment, s: number): Point {\n const c = integrateEuler(seg.k0, seg.k1, s, seg.k2, seg.k3);\n const cos = Math.cos(seg.rotation);\n const sin = Math.sin(seg.rotation);\n return {\n x: seg.p0.x + seg.length * (c.x * cos - c.y * sin),\n y: seg.p0.y + seg.length * (c.x * sin + c.y * cos),\n };\n}\n\n/** World tangent angle at fraction `s` of `seg`'s arc length. */\nexport function eulerAngleAt(seg: EulerSegment, s: number): number {\n const u = s - 0.5;\n return seg.rotation + seg.k0 * u + u * u * (seg.k1 / 2 + u * (seg.k2 / 6 + (u * seg.k3) / 24));\n}\n\n/** Normalized curvature at `u = s − ½`. */\nconst bendAt = (f: EulerFit, u: number): number => f.k0 + u * (f.k1 + u * (f.k2 / 2 + (u * f.k3) / 6));\n\n/** Signed world curvature at fraction `s` of `seg`'s arc length;\n * positive turns counterclockwise. */\nexport function eulerCurvatureAt(seg: EulerSegment, s: number): number {\n if (seg.length < 1e-12) return 0;\n return bendAt(seg, s - 0.5) / seg.length;\n}\n\n/** The first and second derivatives of `seg`'s world curvature with respect\n * to world arc length, at fraction `s` of it. */\nexport function eulerCurvatureDerivativesAt(seg: EulerSegment, s: number): [number, number] {\n if (seg.length < 1e-12) return [0, 0];\n const u = s - 0.5;\n return [\n (seg.k1 + u * (seg.k2 + (u * seg.k3) / 2)) / seg.length ** 2,\n (seg.k2 + u * seg.k3) / seg.length ** 3,\n ];\n}\n\nconst SAMPLES = 16;\n\n/** Handle lengths `[a, b]` along `u0`, `u1` that best fit `samples` at the\n * cubic parameters `ts`, by least squares. Null when the fit degenerates. */\nfunction fitHandleLengths(\n p0: Point, p1: Point, u0: Point, u1: Point, samples: readonly Point[], ts: readonly number[],\n): [number, number] | null {\n // B(t) = base(t) + a·3(1−t)²t·u0 − b·3(1−t)t²·u1, linear in a and b.\n let m00 = 0, m01 = 0, m11 = 0, r0 = 0, r1 = 0;\n samples.forEach((q, i) => {\n const t = ts[i];\n const mt = 1 - t;\n const b0 = mt * mt * mt + 3 * mt * mt * t;\n const b3 = 3 * mt * t * t + t * t * t;\n const ex = q.x - (b0 * p0.x + b3 * p1.x);\n const ey = q.y - (b0 * p0.y + b3 * p1.y);\n const f1 = 3 * mt * mt * t;\n const f2 = 3 * mt * t * t;\n const ax = f1 * u0.x, ay = f1 * u0.y;\n const bx = -f2 * u1.x, by = -f2 * u1.y;\n m00 += ax * ax + ay * ay;\n m01 += ax * bx + ay * by;\n m11 += bx * bx + by * by;\n r0 += ax * ex + ay * ey;\n r1 += bx * ex + by * ey;\n });\n const det = m00 * m11 - m01 * m01;\n if (Math.abs(det) < 1e-12) return null;\n const a = (r0 * m11 - r1 * m01) / det;\n const b = (m00 * r1 - m01 * r0) / det;\n return a > 0 && b > 0 && Number.isFinite(a) && Number.isFinite(b) ? [a, b] : null;\n}\n\n/** One Newton step moving `t` toward the point of the cubic nearest `q`. */\nfunction nearerT(p: readonly Point[], q: Point, t: number): number {\n const mt = 1 - t;\n const at = (c0: number, c1: number, c2: number, c3: number) =>\n mt * mt * mt * c0 + 3 * mt * mt * t * c1 + 3 * mt * t * t * c2 + t * t * t * c3;\n const d1 = (c0: number, c1: number, c2: number, c3: number) =>\n 3 * (mt * mt * (c1 - c0) + 2 * mt * t * (c2 - c1) + t * t * (c3 - c2));\n const d2 = (c0: number, c1: number, c2: number, c3: number) =>\n 6 * (mt * (c2 - 2 * c1 + c0) + t * (c3 - 2 * c2 + c1));\n const ex = at(p[0].x, p[1].x, p[2].x, p[3].x) - q.x;\n const ey = at(p[0].y, p[1].y, p[2].y, p[3].y) - q.y;\n const dx = d1(p[0].x, p[1].x, p[2].x, p[3].x);\n const dy = d1(p[0].y, p[1].y, p[2].y, p[3].y);\n const ddx = d2(p[0].x, p[1].x, p[2].x, p[3].x);\n const ddy = d2(p[0].y, p[1].y, p[2].y, p[3].y);\n const den = dx * dx + dy * dy + ex * ddx + ey * ddy;\n if (Math.abs(den) < 1e-12) return t;\n return Math.min(1, Math.max(0, t - (ex * dx + ey * dy) / den));\n}\n\n/**\n * The two control points of a cubic that follows `seg`: each handle lies on\n * the spiral's tangent at its end, with lengths fitted to points sampled along\n * the spiral by least squares, re-pairing each sample with its nearest cubic\n * parameter between rounds.\n */\nexport function eulerSegmentCubic(seg: EulerSegment): { c1: Point; c2: Point } {\n const { p0, p1 } = seg;\n const a0 = eulerAngleAt(seg, 0);\n const a1 = eulerAngleAt(seg, 1);\n const u0 = { x: Math.cos(a0), y: Math.sin(a0) };\n const u1 = { x: Math.cos(a1), y: Math.sin(a1) };\n const samples: Point[] = [];\n const ts: number[] = [];\n for (let i = 1; i < SAMPLES; i++) {\n samples.push(eulerPointAt(seg, i / SAMPLES));\n ts.push(i / SAMPLES);\n }\n const chord = Math.hypot(p1.x - p0.x, p1.y - p0.y);\n let lengths: [number, number] = [chord / 3, chord / 3];\n const handles = ([a, b]: [number, number]) => ({\n c1: { x: p0.x + a * u0.x, y: p0.y + a * u0.y },\n c2: { x: p1.x - b * u1.x, y: p1.y - b * u1.y },\n });\n for (let round = 0; round < 4; round++) {\n const fit = fitHandleLengths(p0, p1, u0, u1, samples, ts);\n if (!fit) break;\n lengths = fit;\n const { c1, c2 } = handles(lengths);\n const ctrl = [p0, c1, c2, p1];\n samples.forEach((q, i) => { ts[i] = nearerT(ctrl, q, ts[i]); });\n }\n return handles(lengths);\n}\n\n/** The stretch of `seg` from fraction `s0` to `s1` of its arc length, as a\n * segment of its own: a piece of an Euler spiral is one. */\nexport function subEulerSegment(seg: EulerSegment, s0: number, s1: number): EulerSegment {\n const d = s1 - s0;\n const m = (s0 + s1) / 2 - 0.5;\n // The curvature polynomial re-centered on the piece and scaled to its length.\n const k0 = bendAt(seg, m) * d;\n const k1 = (seg.k1 + m * (seg.k2 + (m * seg.k3) / 2)) * d ** 2;\n const k2 = (seg.k2 + m * seg.k3) * d ** 3;\n const k3 = seg.k3 * d ** 4;\n const c = integrateEuler(k0, k1, 1, k2, k3);\n const fit: EulerFit = { k0, k1, k2, k3, ratio: Math.hypot(c.x, c.y), chordAngle: Math.atan2(c.y, c.x) };\n return placeEulerSegment(fit, eulerPointAt(seg, s0), eulerPointAt(seg, s1));\n}\n\n/** How far the cubic `(seg.p0, c1, c2, seg.p1)` strays from `seg`, measured\n * at a few points along the spiral. */\nexport function eulerCubicError(seg: EulerSegment, c1: Point, c2: Point): number {\n const ctrl = [seg.p0, c1, c2, seg.p1];\n let worst = 0;\n for (const s of [0.2, 0.4, 0.5, 0.6, 0.8]) {\n const q = eulerPointAt(seg, s);\n let t = s;\n for (let i = 0; i < 4; i++) t = nearerT(ctrl, q, t);\n const mt = 1 - t;\n const x = mt * mt * mt * seg.p0.x + 3 * mt * mt * t * c1.x + 3 * mt * t * t * c2.x + t * t * t * seg.p1.x;\n const y = mt * mt * mt * seg.p0.y + 3 * mt * mt * t * c1.y + 3 * mt * t * t * c2.y + t * t * t * seg.p1.y;\n worst = Math.max(worst, Math.hypot(x - q.x, y - q.y));\n }\n return worst;\n}\n","/**\n * Spiro curves: a spline defined by on-curve points alone. Between each pair\n * of neighboring points runs an Euler-spiral segment (`eulerSpiral`), and the\n * segments are solved together so that, at every smooth point, both the\n * tangent and the curvature carry straight through. The curve has no handles\n * to tune; moving a point re-solves the whole curve.\n *\n * Each point's kind says what holds at it:\n *\n * | kind | at the point |\n * |---|---|\n * | `smooth` | tangent and curvature continue (G2); next to a straight segment, the curve leaves along the line |\n * | `g4` | tangent, curvature, and the curvature's first two derivatives continue (G4); otherwise as `smooth` |\n * | `corner` | the two sides are independent; each meets the point with zero curvature |\n * | `left` | the segment arriving is straight, and the curve leaving continues the line |\n * | `right` | the segment leaving is straight, and the curve arriving runs into the line |\n *\n * The ends of an open curve meet their points with zero curvature, as a\n * corner's sides do.\n *\n * A segment with a `g4` point at either end is a cubic-curvature segment,\n * with two more unknowns than an Euler spiral's two end tangents. A `g4`\n * point between two curved segments pays for its side's two with its two\n * extra equations; anywhere else, such a segment's curvature stops bending\n * at that end (its second derivative is zero there).\n */\nimport type { Point } from './cubicMath';\nimport {\n eulerAngleAt, eulerCurvatureAt, eulerCurvatureDerivativesAt, fitEulerSegment, placeEulerSegment,\n type EulerSegment,\n} from './eulerSpiral';\n\n/** What holds at a spiro point; see the table at the top of `spiro.ts`. */\nexport type SpiroKind = 'smooth' | 'g4' | 'corner' | 'left' | 'right';\n\n/** Every {@link SpiroKind}, in the order a picker lists them. */\nexport const SPIRO_KINDS: readonly SpiroKind[] = ['smooth', 'g4', 'corner', 'left', 'right'];\n\n/** One on-curve point of a spiro curve. */\nexport interface SpiroPoint {\n x: number;\n y: number;\n kind: SpiroKind;\n}\n\n/** One solved segment of a spiro curve: a straight line, or a placed Euler\n * spiral (`spiral`) between the two points. */\nexport interface SpiroSegment {\n from: Point;\n to: Point;\n spiral: EulerSegment | null;\n}\n\ntype Side = { kind: 'none' } | { kind: 'line'; angle: number } | { kind: 'curve'; seg: number };\n\nconst TAU = Math.PI * 2;\nconst wrap = (a: number): number => a - TAU * Math.round(a / TAU);\nconst angleOf = (p: Point, q: Point): number => Math.atan2(q.y - p.y, q.x - p.x);\nconst distance = (p: Point, q: Point): number => Math.hypot(q.x - p.x, q.y - p.y);\n\n/** Whether `kind` is one of the {@link SpiroKind}s. */\nexport function isSpiroKind(kind: unknown): kind is SpiroKind {\n return SPIRO_KINDS.includes(kind as SpiroKind);\n}\n\ninterface System {\n points: readonly SpiroPoint[];\n /** Segment `i` runs from point `i` to point `ends[i]`. */\n ends: number[];\n straight: boolean[];\n /** The first unknown slot of each curved segment (start tangent, end\n * tangent, then a cubic-curvature segment's two higher terms), or -1. */\n slot: number[];\n /** Whether each segment is a cubic-curvature one. */\n cubic: boolean[];\n unknowns: number;\n}\n\nfunction buildSystem(points: readonly SpiroPoint[], closed: boolean): System {\n const n = points.length;\n const count = closed ? n : n - 1;\n const ends: number[] = [];\n const straight: boolean[] = [];\n const slot: number[] = [];\n const cubic: boolean[] = [];\n let unknowns = 0;\n for (let i = 0; i < count; i++) {\n const j = (i + 1) % n;\n ends.push(j);\n const line = points[i].kind === 'right' || points[j].kind === 'left'\n || distance(points[i], points[j]) < 1e-9;\n straight.push(line);\n slot.push(line ? -1 : unknowns);\n const higher = !line && (points[i].kind === 'g4' || points[j].kind === 'g4');\n cubic.push(higher);\n if (!line) unknowns += higher ? 4 : 2;\n }\n return { points, ends, straight, slot, cubic, unknowns };\n}\n\nfunction sides(sys: System, closed: boolean, i: number): [Side, Side] {\n const n = sys.points.length;\n const count = sys.ends.length;\n const side = (seg: number): Side => {\n if (seg < 0 || seg >= count) return { kind: 'none' };\n if (sys.straight[seg]) return { kind: 'line', angle: angleOf(sys.points[seg], sys.points[sys.ends[seg]]) };\n return { kind: 'curve', seg };\n };\n const into = i > 0 ? i - 1 : closed ? n - 1 : -1;\n const outOf = closed || i < n - 1 ? i : -1;\n return [side(into), side(outOf)];\n}\n\ninterface Fitted { seg: EulerSegment; chord: number; startAngle: number; endAngle: number; cubic: boolean }\n\nfunction fitSegment(sys: System, s: number, x: readonly number[]): Fitted {\n const p0 = sys.points[s];\n const p1 = sys.points[sys.ends[s]];\n const chord = angleOf(p0, p1);\n const k = sys.slot[s];\n const fit = sys.cubic[s]\n ? fitEulerSegment(wrap(x[k] - chord), wrap(x[k + 1] - chord), x[k + 2], x[k + 3])\n : fitEulerSegment(wrap(x[k] - chord), wrap(x[k + 1] - chord));\n const seg = placeEulerSegment(fit, p0, p1);\n const startAngle = eulerAngleAt(seg, 0);\n return { seg, chord: distance(p0, p1), startAngle, endAngle: eulerAngleAt(seg, 1), cubic: sys.cubic[s] };\n}\n\n/** Curvature at one end of `f`, times its chord so every equation is on one scale. */\nconst bend = (f: Fitted, at: 0 | 1): number => eulerCurvatureAt(f.seg, at) * f.chord;\n\n/** The second derivative of curvature at one end of `f`, on the same scale. */\nconst twist = (f: Fitted, at: 0 | 1): number => eulerCurvatureDerivativesAt(f.seg, at)[1] * f.chord ** 3;\n\n/** Angle, curvature, and the curvature's first two derivatives matched where\n * `fa` ends and `fb` begins. */\nfunction g4Join(fa: Fitted, fb: Fitted): number[] {\n const scale = (fa.chord + fb.chord) / 2;\n const [a1, a2] = eulerCurvatureDerivativesAt(fa.seg, 1);\n const [b1, b2] = eulerCurvatureDerivativesAt(fb.seg, 0);\n return [\n wrap(fa.endAngle - fb.startAngle),\n (eulerCurvatureAt(fa.seg, 1) - eulerCurvatureAt(fb.seg, 0)) * scale,\n (a1 - b1) * scale ** 2,\n (a2 - b2) * scale ** 3,\n ];\n}\n\nfunction residuals(sys: System, closed: boolean, fits: readonly Fitted[]): number[] {\n const out: number[] = [];\n const fitOf = (side: Side): Fitted => fits[(side as { seg: number }).seg];\n for (let i = 0; i < sys.points.length; i++) {\n const [a, b] = sides(sys, closed, i);\n const kind = sys.points[i].kind;\n const ac = a.kind === 'curve';\n const bc = b.kind === 'curve';\n if (!ac && !bc) continue;\n if (kind === 'g4' && ac && bc) {\n out.push(...g4Join(fitOf(a), fitOf(b)));\n continue;\n }\n if (kind === 'smooth' && ac && bc) {\n const fa = fitOf(a), fb = fitOf(b);\n out.push(...g4Join(fa, fb).slice(0, 2));\n if (fa.cubic) out.push(twist(fa, 1));\n if (fb.cubic) out.push(twist(fb, 0));\n continue;\n }\n // One curved side from here on, or a corner's two independent ones.\n for (const [side, other, at] of [[a, b, 1], [b, a, 0]] as const) {\n if (side.kind !== 'curve') continue;\n const f = fitOf(side);\n const angle = at === 1 ? f.endAngle : f.startAngle;\n const followsLine = other.kind === 'line' && kind !== 'corner';\n out.push(followsLine ? wrap(angle - other.angle) : bend(f, at));\n if (f.cubic) out.push(twist(f, at));\n }\n }\n return out;\n}\n\n/** A starting tangent at each point: along the bisector of its two chords. */\nfunction initialGuess(sys: System, closed: boolean): number[] {\n const x = new Array<number>(sys.unknowns).fill(0);\n const n = sys.points.length;\n const tangentAt = (i: number, seg: number): number => {\n const chord = angleOf(sys.points[seg], sys.points[sys.ends[seg]]);\n const [a, b] = sides(sys, closed, i);\n if (sys.points[i].kind === 'corner' || a.kind === 'none' || b.kind === 'none') return chord;\n if (a.kind === 'line') return a.angle;\n if (b.kind === 'line') return b.angle;\n const prev = sys.points[(i - 1 + n) % n];\n const next = sys.points[(i + 1) % n];\n const pin = angleOf(prev, sys.points[i]);\n const pout = angleOf(sys.points[i], next);\n return pin + wrap(pout - pin) / 2;\n };\n for (let s = 0; s < sys.ends.length; s++) {\n const k = sys.slot[s];\n if (k < 0) continue;\n x[k] = tangentAt(s, s);\n x[k + 1] = tangentAt(sys.ends[s], s);\n }\n return x;\n}\n\n/** Solve `m · d = r` in place by Gaussian elimination with partial pivoting. */\nfunction solveLinear(m: number[][], r: number[]): number[] | null {\n const n = r.length;\n for (let c = 0; c < n; c++) {\n let p = c;\n for (let i = c + 1; i < n; i++) if (Math.abs(m[i][c]) > Math.abs(m[p][c])) p = i;\n if (Math.abs(m[p][c]) < 1e-14) return null;\n [m[c], m[p]] = [m[p], m[c]];\n [r[c], r[p]] = [r[p], r[c]];\n for (let i = c + 1; i < n; i++) {\n const f = m[i][c] / m[c][c];\n if (f === 0) continue;\n for (let j = c; j < n; j++) m[i][j] -= f * m[c][j];\n r[i] -= f * r[c];\n }\n }\n const out = new Array<number>(n).fill(0);\n for (let i = n - 1; i >= 0; i--) {\n let v = r[i];\n for (let j = i + 1; j < n; j++) v -= m[i][j] * out[j];\n out[i] = v / m[i][i];\n }\n return out;\n}\n\nconst norm = (v: readonly number[]): number => Math.sqrt(v.reduce((s, e) => s + e * e, 0));\n\n/**\n * Solve the spiro curve through `points`. A closed curve has a segment from\n * the last point back to the first. Fewer than two points make no segments.\n */\nexport function solveSpiro(points: readonly SpiroPoint[], closed: boolean): SpiroSegment[] {\n if (points.length < 2) return [];\n const sys = buildSystem(points, closed && points.length > 2);\n const isClosed = closed && points.length > 2;\n let x = initialGuess(sys, isClosed);\n const fitAll = (v: readonly number[]): Fitted[] =>\n sys.ends.map((_, s) => (sys.slot[s] < 0 ? (null as unknown as Fitted) : fitSegment(sys, s, v)));\n let fits = fitAll(x);\n let r = residuals(sys, isClosed, fits);\n for (let iter = 0; iter < 40 && sys.unknowns > 0; iter++) {\n const err = norm(r);\n if (err < 1e-10) break;\n // Each unknown moves only its own segment, so a column refits one segment.\n const jac = r.map(() => new Array<number>(sys.unknowns).fill(0));\n for (let s = 0; s < sys.ends.length; s++) {\n const k = sys.slot[s];\n if (k < 0) continue;\n for (let u = k; u < k + (sys.cubic[s] ? 4 : 2); u++) {\n const h = 1e-6;\n const xs = x.slice();\n xs[u] += h;\n const moved = fits.slice();\n moved[s] = fitSegment(sys, s, xs);\n const rs = residuals(sys, isClosed, moved);\n for (let e = 0; e < r.length; e++) jac[e][u] = (rs[e] - r[e]) / h;\n }\n }\n const step = solveLinear(jac, r.map((v) => -v));\n if (!step) break;\n // Halve the step until it lowers the error.\n let t = 1;\n let accepted = false;\n for (let tries = 0; tries < 12; tries++, t /= 2) {\n const xt = x.map((v, i) => v + t * step[i]);\n const ft = fitAll(xt);\n const rt = residuals(sys, isClosed, ft);\n if (norm(rt) < err) {\n x = xt; fits = ft; r = rt; accepted = true;\n break;\n }\n }\n if (!accepted) break;\n }\n return sys.ends.map((end, s) => ({\n from: { x: points[s].x, y: points[s].y },\n to: { x: points[end].x, y: points[end].y },\n spiral: sys.slot[s] < 0 ? null : fits[s].seg,\n }));\n}\n","/**\n * Spiro curves as cubic paths, and back. A solved curve is written as cubics,\n * each spiral segment split into as many as it takes to stay within tolerance,\n * so most anchors of the path are not spiro points. `at` records which are:\n * `at[i]` is the flat anchor index of point `i`, counted across subpaths. The\n * points are then read back out of the path itself, so whatever moves the path\n * — a move, a resize, a rotation — moves them with it.\n */\nimport type { PolygonPath } from '../path';\nimport { anchorsToPath, pathToAnchors, type PenAnchor } from './anchors';\nimport { eulerCubicError, eulerSegmentCubic, subEulerSegment, type EulerSegment } from './eulerSpiral';\nimport { solveSpiro, type SpiroKind, type SpiroPoint } from './spiro';\n\n/** One subpath of a spiro curve: its points, and whether it closes. */\nexport interface SpiroContour {\n points: SpiroPoint[];\n closed: boolean;\n}\n\n/** A spiro curve written as a cubic path, with the anchor each point became. */\nexport interface SpiroPath {\n path: PolygonPath;\n /** The flat anchor index of each point, in contour order. */\n at: number[];\n}\n\n/** Options for {@link spiroToPath}. */\nexport interface SpiroToPathOptions {\n /** The furthest a cubic may stray from its spiral, as a fraction of that\n * segment's arc length. Default `1e-4`. */\n tolerance?: number;\n /** The path being reshaped, whose fill rules the result keeps. */\n like?: PolygonPath;\n}\n\nconst MAX_PIECES = 16;\n\ninterface Piece { end: EulerSegment; c1: { x: number; y: number }; c2: { x: number; y: number } }\n\n/** `spiral` as the fewest equal pieces whose cubics all stay within `tol`. */\nfunction cubicPieces(spiral: EulerSegment, tol: number): Piece[] {\n let best: Piece[] = [];\n for (let m = 1; m <= MAX_PIECES; m++) {\n best = [];\n let fits = true;\n for (let j = 0; j < m; j++) {\n const piece = m === 1 ? spiral : subEulerSegment(spiral, j / m, (j + 1) / m);\n const { c1, c2 } = eulerSegmentCubic(piece);\n best.push({ end: piece, c1, c2 });\n if (eulerCubicError(piece, c1, c2) > tol * spiral.length) fits = false;\n }\n if (fits) break;\n }\n return best;\n}\n\nfunction contourAnchors(c: SpiroContour, tol: number): { anchors: PenAnchor[]; at: number[] } {\n const anchors: PenAnchor[] = [];\n const at: number[] = [];\n const segments = solveSpiro(c.points, c.closed);\n // The handle the last piece of a segment arrives with, for the point after it.\n let arriving: { x: number; y: number } | null = null;\n c.points.forEach((p, i) => {\n at.push(anchors.length);\n anchors.push({ x: p.x, y: p.y, ...(arriving ? { inHandle: arriving } : {}) });\n arriving = null;\n const spiral = segments[i]?.spiral;\n if (!spiral) return;\n const pieces = cubicPieces(spiral, tol);\n pieces.forEach((piece, j) => {\n anchors[anchors.length - 1].outHandle = { x: piece.c1.x, y: piece.c1.y };\n const c2 = { x: piece.c2.x, y: piece.c2.y };\n if (j < pieces.length - 1) anchors.push({ x: piece.end.p1.x, y: piece.end.p1.y, inHandle: c2 });\n else arriving = c2;\n });\n });\n if (arriving) anchors[0].inHandle = arriving;\n return { anchors, at };\n}\n\n/**\n * Solve each contour and write it as a cubic path. Straight segments carry no\n * handles.\n */\nexport function spiroToPath(contours: readonly SpiroContour[], options: SpiroToPathOptions = {}): SpiroPath {\n const tol = options.tolerance ?? 1e-4;\n const subs: PenAnchor[][] = [];\n const closed: boolean[] = [];\n const at: number[] = [];\n let base = 0;\n for (const c of contours) {\n if (c.points.length === 0) continue;\n const written = contourAnchors(c, tol);\n subs.push(written.anchors);\n closed.push(c.closed && c.points.length > 2);\n at.push(...written.at.map((i) => i + base));\n base += written.anchors.length;\n }\n return { path: anchorsToPath(subs, closed, options.like), at };\n}\n\n/**\n * The spiro points `path` holds, given the kind of each and the anchor each\n * became. Null when `kinds` and `at` do not describe `path`: the counts\n * differ, an index is out of order or out of range, or a subpath does not\n * start on a point.\n */\nexport function spiroContoursOf(\n path: PolygonPath,\n kinds: readonly SpiroKind[],\n at: readonly number[],\n): SpiroContour[] | null {\n if (kinds.length !== at.length || at.length === 0) return null;\n const { anchors, closed } = pathToAnchors(path);\n const contours: SpiroContour[] = [];\n let flat = 0;\n let k = 0;\n for (let s = 0; s < anchors.length; s++) {\n const sub = anchors[s];\n if (at[k] !== flat) return null;\n const points: SpiroPoint[] = [];\n while (k < at.length && at[k] < flat + sub.length) {\n if (k > 0 && at[k] <= at[k - 1]) return null;\n const a = sub[at[k] - flat];\n points.push({ x: a.x, y: a.y, kind: kinds[k] });\n k++;\n }\n contours.push({ points, closed: closed[s] });\n flat += sub.length;\n }\n return k === at.length ? contours : null;\n}\n\n/** The straight-sided path through each contour's points: what an editor\n * shows and moves in place of the curve. */\nexport function spiroControlPath(contours: readonly SpiroContour[]): PolygonPath {\n return anchorsToPath(\n contours.map((c) => c.points.map((p) => ({ x: p.x, y: p.y }))),\n contours.map((c) => c.closed),\n );\n}\n\nconst key = (x: number, y: number): string => `${Math.round(x * 1e3)},${Math.round(y * 1e3)}`;\n\n/**\n * Read an edited control path back as contours: every anchor is a point.\n * Kinds follow from `before`, the contours the edit started from: point for\n * point when the count is unchanged, else by position, with an anchor that\n * lands nowhere a point was taking `fallback`. Handles are ignored.\n */\nexport function spiroContoursFromControl(\n control: PolygonPath,\n before: readonly SpiroContour[],\n fallback: SpiroKind = 'smooth',\n): SpiroContour[] {\n const { anchors, closed } = pathToAnchors(control);\n const old = before.flatMap((c) => c.points);\n const count = anchors.reduce((n, sub) => n + sub.length, 0);\n const byPlace = new Map<string, SpiroKind>();\n for (const p of old) if (!byPlace.has(key(p.x, p.y))) byPlace.set(key(p.x, p.y), p.kind);\n let i = 0;\n return anchors.map((sub, s) => ({\n closed: closed[s],\n points: sub.map((a) => {\n const kind = count === old.length ? old[i].kind : byPlace.get(key(a.x, a.y)) ?? fallback;\n i++;\n return { x: a.x, y: a.y, kind };\n }),\n }));\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/paths/curvature.ts","../src/paths/eulerSpiral.ts","../src/paths/spiro.ts","../src/paths/spiroPath.ts"],"names":[],"mappings":";;;;AAKO,SAAS,iBAAA,CAAkB,EAAA,EAAW,EAAA,EAAW,EAAA,EAAW,IAAW,CAAA,EAAkB;AAC9F,EAAA,MAAM,IAAI,CAAA,GAAI,CAAA;AACd,EAAA,OAAO;AAAA,IACL,CAAA,EAAG,IAAI,CAAA,GAAI,CAAA,IAAK,GAAG,CAAA,GAAI,EAAA,CAAG,KAAK,CAAA,GAAI,CAAA,GAAI,KAAK,EAAA,CAAG,CAAA,GAAI,GAAG,CAAA,CAAA,GAAK,CAAA,GAAI,IAAI,CAAA,IAAK,EAAA,CAAG,IAAI,EAAA,CAAG,CAAA,CAAA;AAAA,IAClF,CAAA,EAAG,IAAI,CAAA,GAAI,CAAA,IAAK,GAAG,CAAA,GAAI,EAAA,CAAG,KAAK,CAAA,GAAI,CAAA,GAAI,KAAK,EAAA,CAAG,CAAA,GAAI,GAAG,CAAA,CAAA,GAAK,CAAA,GAAI,IAAI,CAAA,IAAK,EAAA,CAAG,IAAI,EAAA,CAAG,CAAA;AAAA,GACpF;AACF;AAEA,SAAS,uBAAA,CAAwB,EAAA,EAAW,EAAA,EAAW,EAAA,EAAW,IAAW,CAAA,EAAkB;AAC7F,EAAA,MAAM,IAAI,CAAA,GAAI,CAAA;AACd,EAAA,OAAO;AAAA,IACL,GAAG,CAAA,GAAI,CAAA,IAAK,EAAA,CAAG,CAAA,GAAI,IAAI,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,CAAA,CAAA,GAAK,IAAI,CAAA,IAAK,EAAA,CAAG,IAAI,CAAA,GAAI,EAAA,CAAG,IAAI,EAAA,CAAG,CAAA,CAAA;AAAA,IACpE,GAAG,CAAA,GAAI,CAAA,IAAK,EAAA,CAAG,CAAA,GAAI,IAAI,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,CAAA,CAAA,GAAK,IAAI,CAAA,IAAK,EAAA,CAAG,IAAI,CAAA,GAAI,EAAA,CAAG,IAAI,EAAA,CAAG,CAAA;AAAA,GACtE;AACF;AASO,SAAS,gBAAA,CAAiB,EAAA,EAAW,EAAA,EAAW,EAAA,EAAW,IAAW,CAAA,EAAmB;AAC9F,EAAA,MAAM,KAAK,iBAAA,CAAkB,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,IAAI,CAAC,CAAA;AAC9C,EAAA,MAAM,KAAK,uBAAA,CAAwB,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,IAAI,CAAC,CAAA;AACpD,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,CAAA,EAAG,GAAG,CAAA;AACnD,EAAA,IAAI,GAAA,GAAM,OAAO,OAAO,CAAA;AACxB,EAAA,OAAA,CAAQ,GAAG,CAAA,GAAI,EAAA,CAAG,IAAI,EAAA,CAAG,CAAA,GAAI,GAAG,CAAA,IAAK,GAAA;AACvC;AAoDA,IAAM,SAAA,GAAY,IAAA;AAElB,SAAS,YAAY,IAAA,EAAoC;AACvD,EAAA,OAAO,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,MAAM,IAAA,CAAK,iBAAA,IAAqB,EAAE,CAAC,CAAA;AAC7D;AAOO,SAAS,SAAA,CAAU,QAAyB,IAAA,EAAyC;AAC1F,EAAA,MAAM,OAAA,GAAU,YAAY,IAAI,CAAA;AAChC,EAAA,MAAM,QAAqB,EAAC;AAC5B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,EAAS,KAAK,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,CAAA,IAAK,OAAA,GAAU,CAAA,CAAA,EAAI,IAAA,CAAK,KAAK,CAAC,CAAA;AAC3F,EAAA,OAAO,KAAA;AACT;AAGO,SAAS,oBAAA,CAAqB,EAAA,EAAW,EAAA,EAAW,EAAA,EAAW,EAAA,EAA4B;AAChG,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,CAAC,CAAA,KAAM,YAAA,CAAa,IAAI,EAAA,EAAI,EAAA,EAAI,IAAI,CAAC,CAAA;AAAA,IAC9C,SAAA,EAAW,CAAC,CAAA,KAAM,iBAAA,CAAkB,IAAI,EAAA,EAAI,EAAA,EAAI,IAAI,CAAC,CAAA;AAAA,IACrD,WAAA,EAAa,CAAC,CAAA,KAAM,gBAAA,CAAiB,IAAI,EAAA,EAAI,EAAA,EAAI,IAAI,CAAC;AAAA,GACxD;AACF;AASO,SAAS,aAAA,CAAc,KAAgB,IAAA,EAA2C;AACvF,EAAA,MAAM,MAAqB,EAAC;AAC5B,EAAA,KAAA,IAAS,MAAM,CAAA,EAAG,GAAA,GAAM,GAAA,CAAI,OAAA,CAAQ,QAAQ,GAAA,EAAA,EAAO;AACjD,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAA,CAAE,UAAU,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,GAAI,CAAA,GAAI,CAAA,CAAA;AAC/D,IAAA,KAAA,IAAS,MAAA,GAAS,CAAA,EAAG,MAAA,GAAS,KAAA,EAAO,MAAA,EAAA,EAAU;AAC7C,MAAA,MAAM,OAAO,WAAA,CAAY,GAAA,CAAI,SAAS,GAAA,CAAI,MAAA,EAAQ,KAAK,MAAM,CAAA;AAC7D,MAAA,IAAI,CAAC,IAAA,IAAQ,iBAAA,CAAkB,KAAK,CAAA,EAAG,IAAA,CAAK,CAAC,CAAA,EAAG;AAChD,MAAA,MAAM,EAAE,CAAA,EAAG,CAAA,EAAE,GAAI,IAAA;AACjB,MAAA,MAAM,MAAA,GAAS,qBAAqB,CAAA,EAAG,CAAA,CAAE,aAAa,CAAA,EAAG,CAAA,CAAE,QAAA,IAAY,CAAA,EAAG,CAAC,CAAA;AAC3E,MAAA,GAAA,CAAI,IAAA,CAAK,EAAE,GAAA,EAAK,MAAA,EAAQ,OAAO,SAAA,CAAU,MAAA,EAAQ,IAAI,CAAA,EAAG,CAAA;AAAA,IAC1D;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,OAAA,CAAQ,MAAA,EAAyB,CAAA,EAAW,KAAA,EAA0B;AAC7E,EAAA,MAAM,EAAA,GAAK,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAA;AAC3B,EAAA,IAAI,CAAA,GAAI,MAAA,CAAO,SAAA,CAAU,CAAC,CAAA;AAC1B,EAAA,IAAI,CAAA,GAAI,MAAA,CAAO,WAAA,CAAY,CAAC,CAAA;AAC5B,EAAA,IAAI,KAAK,KAAA,CAAM,CAAA,CAAE,GAAG,CAAA,CAAE,CAAC,IAAI,IAAA,EAAM;AAC/B,IAAA,MAAM,KAAA,GAAQ,CAAA,GAAI,GAAA,GAAM,CAAA,GAAI,YAAY,CAAA,GAAI,SAAA;AAC5C,IAAA,CAAA,GAAI,MAAA,CAAO,UAAU,KAAK,CAAA;AAC1B,IAAA,CAAA,GAAI,MAAA,CAAO,YAAY,KAAK,CAAA;AAAA,EAC9B;AACA,EAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,CAAA,EAAG,EAAE,CAAC,CAAA;AAC/B,EAAA,IAAI,MAAM,KAAA,EAAO,OAAO,EAAE,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,EAAA,CAAG,CAAA,EAAG,MAAM,EAAA,CAAG,CAAA,EAAG,MAAM,EAAA,CAAG,CAAA,EAAG,WAAW,CAAA,EAAE;AAGjF,EAAA,MAAM,EAAA,GAAK,CAAC,CAAA,CAAE,CAAA,GAAI,GAAA;AAClB,EAAA,MAAM,EAAA,GAAK,EAAE,CAAA,GAAI,GAAA;AACjB,EAAA,OAAO,EAAE,GAAG,EAAA,CAAG,CAAA,EAAG,GAAG,EAAA,CAAG,CAAA,EAAG,MAAM,EAAA,CAAG,CAAA,GAAI,KAAK,CAAA,GAAI,KAAA,EAAO,MAAM,EAAA,CAAG,CAAA,GAAI,KAAK,CAAA,GAAI,KAAA,EAAO,WAAW,CAAA,EAAE;AACpG;;;AC3HA,IAAM,KAAA,GAAQ,EAAA;AAEd,IAAM,SAAA,GAAY,KAAK,EAAA,GAAK,IAAA;AAE5B,IAAM,UAAA,GAAa,CAAC,CAAA,KAAsB,IAAA,CAAK,GAAA,CAAI,CAAC,SAAA,EAAW,IAAA,CAAK,GAAA,CAAI,SAAA,EAAW,CAAC,CAAC,CAAA;AAG9E,SAAS,cAAA,CAAe,IAAY,EAAA,EAAY,IAAA,GAAO,GAAG,EAAA,GAAK,CAAA,EAAG,KAAK,CAAA,EAAU;AACtF,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,KAAM,KAAA,GAAQ,IAAA,GAAQ,CAAC,CAAA,GAAI,CAAC,CAAA;AACvD,EAAA,MAAM,IAAI,IAAA,GAAO,CAAA;AACjB,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,CAAA,EAAG,CAAA,EAAA,EAAK;AAC3B,IAAA,MAAM,CAAA,GAAI,IAAI,CAAA,GAAI,GAAA;AAClB,IAAA,MAAM,GAAA,GAAM,EAAA,GAAK,CAAA,GAAI,CAAA,GAAI,CAAA,IAAK,EAAA,GAAK,CAAA,GAAI,CAAA,IAAK,EAAA,GAAK,CAAA,GAAK,CAAA,GAAI,EAAA,GAAM,EAAA,CAAA,CAAA;AAChE,IAAA,MAAM,CAAA,GAAI,MAAM,CAAA,IAAK,CAAA,KAAM,IAAI,CAAA,GAAI,CAAA,GAAI,CAAA,KAAM,CAAA,GAAI,CAAA,GAAI,CAAA;AACrD,IAAA,CAAA,IAAK,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AACrB,IAAA,CAAA,IAAK,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AAAA,EACvB;AACA,EAAA,OAAO,EAAE,GAAI,CAAA,GAAI,CAAA,GAAK,GAAG,CAAA,EAAI,CAAA,GAAI,IAAK,CAAA,EAAE;AAC1C;AAGA,SAAS,UAAA,CAAW,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,IAAY,GAAA,EAAqB;AACvF,EAAA,MAAM,IAAI,cAAA,CAAe,EAAA,EAAI,EAAA,EAAI,CAAA,EAAG,IAAI,EAAE,CAAA;AAC1C,EAAA,OAAO,CAAC,EAAA,GAAK,CAAA,GAAI,EAAA,GAAK,IAAI,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAA,GAAM,KAAK,KAAA,CAAM,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,GAAI,GAAA;AACxE;AAQO,SAAS,gBAAgB,GAAA,EAAa,GAAA,EAAa,EAAA,GAAK,CAAA,EAAG,KAAK,CAAA,EAAa;AAClF,EAAA,MAAM,EAAA,GAAK,WAAW,GAAG,CAAA;AACzB,EAAA,MAAM,EAAA,GAAK,WAAW,GAAG,CAAA;AAEzB,EAAA,MAAM,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAE1B,EAAA,IAAI,EAAA,GAAK,CAAA,IAAK,EAAA,GAAK,EAAA,CAAA,GAAM,EAAA,GAAK,EAAA;AAC9B,EAAA,KAAA,IAAS,IAAA,GAAO,CAAA,EAAG,IAAA,GAAO,EAAA,EAAI,IAAA,EAAA,EAAQ;AACpC,IAAA,MAAM,IAAI,UAAA,CAAW,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,IAAI,EAAE,CAAA;AACvC,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,GAAI,KAAA,EAAO;AACzB,IAAA,MAAM,CAAA,GAAA,CAAK,WAAW,EAAA,EAAI,EAAA,GAAK,MAAM,EAAA,EAAI,EAAA,EAAI,EAAE,CAAA,GAAI,CAAA,IAAK,IAAA;AACxD,IAAA,IAAI,CAAC,OAAO,QAAA,CAAS,CAAC,KAAK,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,GAAI,KAAA,EAAO;AAChD,IAAA,EAAA,IAAM,CAAA,GAAI,CAAA;AAAA,EACZ;AACA,EAAA,MAAM,IAAI,cAAA,CAAe,EAAA,EAAI,EAAA,EAAI,CAAA,EAAG,IAAI,EAAE,CAAA;AAC1C,EAAA,OAAO,EAAE,IAAI,EAAA,EAAI,EAAA,EAAI,IAAI,KAAA,EAAO,IAAA,CAAK,MAAM,CAAA,CAAE,CAAA,EAAG,EAAE,CAAC,CAAA,EAAG,YAAY,IAAA,CAAK,KAAA,CAAM,EAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,EAAE;AACzF;AAaO,SAAS,iBAAA,CAAkB,GAAA,EAAe,EAAA,EAAW,EAAA,EAAyB;AACnF,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,CAAA,GAAI,GAAG,CAAA,EAAG,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,CAAC,CAAA;AACjD,EAAA,MAAM,SAAS,GAAA,CAAI,KAAA,GAAQ,IAAA,GAAO,KAAA,GAAQ,IAAI,KAAA,GAAQ,KAAA;AACtD,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,CAAA,EAAG,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,CAAC,CAAA,GAAI,GAAA,CAAI,UAAA;AAC5D,EAAA,OAAO,EAAE,GAAG,GAAA,EAAK,EAAA,EAAI,EAAA,EAAI,QAAQ,QAAA,EAAS;AAC5C;AAGO,SAAS,YAAA,CAAa,KAAmB,CAAA,EAAkB;AAChE,EAAA,MAAM,CAAA,GAAI,cAAA,CAAe,GAAA,CAAI,EAAA,EAAI,GAAA,CAAI,IAAI,CAAA,EAAG,GAAA,CAAI,EAAA,EAAI,GAAA,CAAI,EAAE,CAAA;AAC1D,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,QAAQ,CAAA;AACjC,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,QAAQ,CAAA;AACjC,EAAA,OAAO;AAAA,IACL,CAAA,EAAG,GAAA,CAAI,EAAA,CAAG,CAAA,GAAI,GAAA,CAAI,UAAU,CAAA,CAAE,CAAA,GAAI,GAAA,GAAM,CAAA,CAAE,CAAA,GAAI,GAAA,CAAA;AAAA,IAC9C,CAAA,EAAG,GAAA,CAAI,EAAA,CAAG,CAAA,GAAI,GAAA,CAAI,UAAU,CAAA,CAAE,CAAA,GAAI,GAAA,GAAM,CAAA,CAAE,CAAA,GAAI,GAAA;AAAA,GAChD;AACF;AAGO,SAAS,YAAA,CAAa,KAAmB,CAAA,EAAmB;AACjE,EAAA,MAAM,IAAI,CAAA,GAAI,GAAA;AACd,EAAA,OAAO,IAAI,QAAA,GAAW,GAAA,CAAI,EAAA,GAAK,CAAA,GAAI,IAAI,CAAA,IAAK,GAAA,CAAI,EAAA,GAAK,CAAA,GAAI,KAAK,GAAA,CAAI,EAAA,GAAK,CAAA,GAAK,CAAA,GAAI,IAAI,EAAA,GAAM,EAAA,CAAA,CAAA;AAC5F;AAGA,IAAM,MAAA,GAAS,CAAC,CAAA,EAAa,CAAA,KAAsB,EAAE,EAAA,GAAK,CAAA,IAAK,CAAA,CAAE,EAAA,GAAK,KAAK,CAAA,CAAE,EAAA,GAAK,CAAA,GAAK,CAAA,GAAI,EAAE,EAAA,GAAM,CAAA,CAAA,CAAA;AAI5F,SAAS,gBAAA,CAAiB,KAAmB,CAAA,EAAmB;AACrE,EAAA,IAAI,GAAA,CAAI,MAAA,GAAS,KAAA,EAAO,OAAO,CAAA;AAC/B,EAAA,OAAO,MAAA,CAAO,GAAA,EAAK,CAAA,GAAI,GAAG,IAAI,GAAA,CAAI,MAAA;AACpC;AAIO,SAAS,2BAAA,CAA4B,KAAmB,CAAA,EAA6B;AAC1F,EAAA,IAAI,IAAI,MAAA,GAAS,KAAA,EAAO,OAAO,CAAC,GAAG,CAAC,CAAA;AACpC,EAAA,MAAM,IAAI,CAAA,GAAI,GAAA;AACd,EAAA,OAAO;AAAA,IAAA,CACJ,GAAA,CAAI,EAAA,GAAK,CAAA,IAAK,GAAA,CAAI,EAAA,GAAM,IAAI,GAAA,CAAI,EAAA,GAAM,CAAA,CAAA,IAAM,GAAA,CAAI,MAAA,IAAU,CAAA;AAAA,IAAA,CAC1D,IAAI,EAAA,GAAK,CAAA,GAAI,GAAA,CAAI,EAAA,IAAM,IAAI,MAAA,IAAU;AAAA,GACxC;AACF;AAEA,IAAM,OAAA,GAAU,EAAA;AAIhB,SAAS,iBACP,EAAA,EAAW,EAAA,EAAW,EAAA,EAAW,EAAA,EAAW,SAA2B,EAAA,EAC9C;AAEzB,EAAA,IAAI,GAAA,GAAM,GAAG,GAAA,GAAM,CAAA,EAAG,MAAM,CAAA,EAAG,EAAA,GAAK,GAAG,EAAA,GAAK,CAAA;AAC5C,EAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM;AACxB,IAAA,MAAM,CAAA,GAAI,GAAG,CAAC,CAAA;AACd,IAAA,MAAM,KAAK,CAAA,GAAI,CAAA;AACf,IAAA,MAAM,KAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,CAAA,GAAI,KAAK,EAAA,GAAK,CAAA;AACxC,IAAA,MAAM,KAAK,CAAA,GAAI,EAAA,GAAK,CAAA,GAAI,CAAA,GAAI,IAAI,CAAA,GAAI,CAAA;AACpC,IAAA,MAAM,KAAK,CAAA,CAAE,CAAA,IAAK,KAAK,EAAA,CAAG,CAAA,GAAI,KAAK,EAAA,CAAG,CAAA,CAAA;AACtC,IAAA,MAAM,KAAK,CAAA,CAAE,CAAA,IAAK,KAAK,EAAA,CAAG,CAAA,GAAI,KAAK,EAAA,CAAG,CAAA,CAAA;AACtC,IAAA,MAAM,EAAA,GAAK,CAAA,GAAI,EAAA,GAAK,EAAA,GAAK,CAAA;AACzB,IAAA,MAAM,EAAA,GAAK,CAAA,GAAI,EAAA,GAAK,CAAA,GAAI,CAAA;AACxB,IAAA,MAAM,KAAK,EAAA,GAAK,EAAA,CAAG,CAAA,EAAG,EAAA,GAAK,KAAK,EAAA,CAAG,CAAA;AACnC,IAAA,MAAM,EAAA,GAAK,CAAC,EAAA,GAAK,EAAA,CAAG,GAAG,EAAA,GAAK,CAAC,KAAK,EAAA,CAAG,CAAA;AACrC,IAAA,GAAA,IAAO,EAAA,GAAK,KAAK,EAAA,GAAK,EAAA;AACtB,IAAA,GAAA,IAAO,EAAA,GAAK,KAAK,EAAA,GAAK,EAAA;AACtB,IAAA,GAAA,IAAO,EAAA,GAAK,KAAK,EAAA,GAAK,EAAA;AACtB,IAAA,EAAA,IAAM,EAAA,GAAK,KAAK,EAAA,GAAK,EAAA;AACrB,IAAA,EAAA,IAAM,EAAA,GAAK,KAAK,EAAA,GAAK,EAAA;AAAA,EACvB,CAAC,CAAA;AACD,EAAA,MAAM,GAAA,GAAM,GAAA,GAAM,GAAA,GAAM,GAAA,GAAM,GAAA;AAC9B,EAAA,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,GAAI,OAAO,OAAO,IAAA;AAClC,EAAA,MAAM,CAAA,GAAA,CAAK,EAAA,GAAK,GAAA,GAAM,EAAA,GAAK,GAAA,IAAO,GAAA;AAClC,EAAA,MAAM,CAAA,GAAA,CAAK,GAAA,GAAM,EAAA,GAAK,GAAA,GAAM,EAAA,IAAM,GAAA;AAClC,EAAA,OAAO,CAAA,GAAI,CAAA,IAAK,CAAA,GAAI,CAAA,IAAK,OAAO,QAAA,CAAS,CAAC,CAAA,IAAK,MAAA,CAAO,SAAS,CAAC,CAAA,GAAI,CAAC,CAAA,EAAG,CAAC,CAAA,GAAI,IAAA;AAC/E;AAGA,SAAS,OAAA,CAAQ,CAAA,EAAqB,CAAA,EAAU,CAAA,EAAmB;AACjE,EAAA,MAAM,KAAK,CAAA,GAAI,CAAA;AACf,EAAA,MAAM,EAAA,GAAK,CAAC,EAAA,EAAY,EAAA,EAAY,IAAY,EAAA,KAC9C,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,CAAA,GAAI,KAAK,EAAA,GAAK,CAAA,GAAI,KAAK,CAAA,GAAI,EAAA,GAAK,IAAI,CAAA,GAAI,EAAA,GAAK,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,EAAA;AAC/E,EAAA,MAAM,KAAK,CAAC,EAAA,EAAY,IAAY,EAAA,EAAY,EAAA,KAC9C,KAAK,EAAA,GAAK,EAAA,IAAM,EAAA,GAAK,EAAA,CAAA,GAAM,IAAI,EAAA,GAAK,CAAA,IAAK,KAAK,EAAA,CAAA,GAAM,CAAA,GAAI,KAAK,EAAA,GAAK,EAAA,CAAA,CAAA;AACpE,EAAA,MAAM,EAAA,GAAK,CAAC,EAAA,EAAY,EAAA,EAAY,IAAY,EAAA,KAC9C,CAAA,IAAK,EAAA,IAAM,EAAA,GAAK,IAAI,EAAA,GAAK,EAAA,CAAA,GAAM,CAAA,IAAK,EAAA,GAAK,IAAI,EAAA,GAAK,EAAA,CAAA,CAAA;AACpD,EAAA,MAAM,KAAK,EAAA,CAAG,CAAA,CAAE,CAAC,CAAA,CAAE,CAAA,EAAG,EAAE,CAAC,CAAA,CAAE,GAAG,CAAA,CAAE,CAAC,EAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,CAAE,CAAC,IAAI,CAAA,CAAE,CAAA;AAClD,EAAA,MAAM,KAAK,EAAA,CAAG,CAAA,CAAE,CAAC,CAAA,CAAE,CAAA,EAAG,EAAE,CAAC,CAAA,CAAE,GAAG,CAAA,CAAE,CAAC,EAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,CAAE,CAAC,IAAI,CAAA,CAAE,CAAA;AAClD,EAAA,MAAM,KAAK,EAAA,CAAG,CAAA,CAAE,CAAC,CAAA,CAAE,GAAG,CAAA,CAAE,CAAC,CAAA,CAAE,CAAA,EAAG,EAAE,CAAC,CAAA,CAAE,GAAG,CAAA,CAAE,CAAC,EAAE,CAAC,CAAA;AAC5C,EAAA,MAAM,KAAK,EAAA,CAAG,CAAA,CAAE,CAAC,CAAA,CAAE,GAAG,CAAA,CAAE,CAAC,CAAA,CAAE,CAAA,EAAG,EAAE,CAAC,CAAA,CAAE,GAAG,CAAA,CAAE,CAAC,EAAE,CAAC,CAAA;AAC5C,EAAA,MAAM,MAAM,EAAA,CAAG,CAAA,CAAE,CAAC,CAAA,CAAE,GAAG,CAAA,CAAE,CAAC,CAAA,CAAE,CAAA,EAAG,EAAE,CAAC,CAAA,CAAE,GAAG,CAAA,CAAE,CAAC,EAAE,CAAC,CAAA;AAC7C,EAAA,MAAM,MAAM,EAAA,CAAG,CAAA,CAAE,CAAC,CAAA,CAAE,GAAG,CAAA,CAAE,CAAC,CAAA,CAAE,CAAA,EAAG,EAAE,CAAC,CAAA,CAAE,GAAG,CAAA,CAAE,CAAC,EAAE,CAAC,CAAA;AAC7C,EAAA,MAAM,MAAM,EAAA,GAAK,EAAA,GAAK,KAAK,EAAA,GAAK,EAAA,GAAK,MAAM,EAAA,GAAK,GAAA;AAChD,EAAA,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,GAAI,OAAO,OAAO,CAAA;AAClC,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAA,CAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,IAAM,GAAG,CAAC,CAAA;AAC/D;AAQO,SAAS,kBAAkB,GAAA,EAA6C;AAC7E,EAAA,MAAM,EAAE,EAAA,EAAI,EAAA,EAAG,GAAI,GAAA;AACnB,EAAA,MAAM,EAAA,GAAK,YAAA,CAAa,GAAA,EAAK,CAAC,CAAA;AAC9B,EAAA,MAAM,EAAA,GAAK,YAAA,CAAa,GAAA,EAAK,CAAC,CAAA;AAC9B,EAAA,MAAM,EAAA,GAAK,EAAE,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,EAAE;AAC9C,EAAA,MAAM,EAAA,GAAK,EAAE,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,EAAE;AAC9C,EAAA,MAAM,UAAmB,EAAC;AAC1B,EAAA,MAAM,KAAe,EAAC;AACtB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,EAAS,CAAA,EAAA,EAAK;AAChC,IAAA,OAAA,CAAQ,IAAA,CAAK,YAAA,CAAa,GAAA,EAAK,CAAA,GAAI,OAAO,CAAC,CAAA;AAC3C,IAAA,EAAA,CAAG,IAAA,CAAK,IAAI,OAAO,CAAA;AAAA,EACrB;AACA,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,CAAA,GAAI,GAAG,CAAA,EAAG,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,CAAC,CAAA;AACjD,EAAA,IAAI,OAAA,GAA4B,CAAC,KAAA,GAAQ,CAAA,EAAG,QAAQ,CAAC,CAAA;AACrD,EAAA,MAAM,OAAA,GAAU,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,MAAyB;AAAA,IAC7C,EAAA,EAAI,EAAE,CAAA,EAAG,EAAA,CAAG,CAAA,GAAI,CAAA,GAAI,EAAA,CAAG,CAAA,EAAG,CAAA,EAAG,EAAA,CAAG,CAAA,GAAI,CAAA,GAAI,GAAG,CAAA,EAAE;AAAA,IAC7C,EAAA,EAAI,EAAE,CAAA,EAAG,EAAA,CAAG,CAAA,GAAI,CAAA,GAAI,EAAA,CAAG,CAAA,EAAG,CAAA,EAAG,EAAA,CAAG,CAAA,GAAI,CAAA,GAAI,GAAG,CAAA;AAAE,GAC/C,CAAA;AACA,EAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ,CAAA,EAAG,KAAA,EAAA,EAAS;AACtC,IAAA,MAAM,MAAM,gBAAA,CAAiB,EAAA,EAAI,IAAI,EAAA,EAAI,EAAA,EAAI,SAAS,EAAE,CAAA;AACxD,IAAA,IAAI,CAAC,GAAA,EAAK;AACV,IAAA,OAAA,GAAU,GAAA;AACV,IAAA,MAAM,EAAE,EAAA,EAAI,EAAA,EAAG,GAAI,QAAQ,OAAO,CAAA;AAClC,IAAA,MAAM,IAAA,GAAO,CAAC,EAAA,EAAI,EAAA,EAAI,IAAI,EAAE,CAAA;AAC5B,IAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM;AAAE,MAAA,EAAA,CAAG,CAAC,CAAA,GAAI,OAAA,CAAQ,MAAM,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AAAA,IAAG,CAAC,CAAA;AAAA,EAChE;AACA,EAAA,OAAO,QAAQ,OAAO,CAAA;AACxB;AAIO,SAAS,eAAA,CAAgB,GAAA,EAAmB,EAAA,EAAY,EAAA,EAA0B;AACvF,EAAA,MAAM,IAAI,EAAA,GAAK,EAAA;AACf,EAAA,MAAM,CAAA,GAAA,CAAK,EAAA,GAAK,EAAA,IAAM,CAAA,GAAI,GAAA;AAE1B,EAAA,MAAM,EAAA,GAAK,MAAA,CAAO,GAAA,EAAK,CAAC,CAAA,GAAI,CAAA;AAC5B,EAAA,MAAM,EAAA,GAAA,CAAM,GAAA,CAAI,EAAA,GAAK,CAAA,IAAK,GAAA,CAAI,KAAM,CAAA,GAAI,GAAA,CAAI,EAAA,GAAM,CAAA,CAAA,IAAM,CAAA,IAAK,CAAA;AAC7D,EAAA,MAAM,MAAM,GAAA,CAAI,EAAA,GAAK,CAAA,GAAI,GAAA,CAAI,MAAM,CAAA,IAAK,CAAA;AACxC,EAAA,MAAM,EAAA,GAAK,GAAA,CAAI,EAAA,GAAK,CAAA,IAAK,CAAA;AACzB,EAAA,MAAM,IAAI,cAAA,CAAe,EAAA,EAAI,EAAA,EAAI,CAAA,EAAG,IAAI,EAAE,CAAA;AAC1C,EAAA,MAAM,GAAA,GAAgB,EAAE,EAAA,EAAI,EAAA,EAAI,IAAI,EAAA,EAAI,KAAA,EAAO,KAAK,KAAA,CAAM,CAAA,CAAE,GAAG,CAAA,CAAE,CAAC,GAAG,UAAA,EAAY,IAAA,CAAK,MAAM,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,EAAE;AACtG,EAAA,OAAO,iBAAA,CAAkB,KAAK,YAAA,CAAa,GAAA,EAAK,EAAE,CAAA,EAAG,YAAA,CAAa,GAAA,EAAK,EAAE,CAAC,CAAA;AAC5E;AAIO,SAAS,eAAA,CAAgB,GAAA,EAAmB,EAAA,EAAW,EAAA,EAAmB;AAC/E,EAAA,MAAM,OAAO,CAAC,GAAA,CAAI,IAAI,EAAA,EAAI,EAAA,EAAI,IAAI,EAAE,CAAA;AACpC,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,KAAA,MAAW,KAAK,CAAC,GAAA,EAAK,KAAK,GAAA,EAAK,GAAA,EAAK,GAAG,CAAA,EAAG;AACzC,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,GAAA,EAAK,CAAC,CAAA;AAC7B,IAAA,IAAI,CAAA,GAAI,CAAA;AACR,IAAA,KAAA,IAAS,CAAA,GAAI,GAAG,CAAA,GAAI,CAAA,EAAG,KAAK,CAAA,GAAI,OAAA,CAAQ,IAAA,EAAM,CAAA,EAAG,CAAC,CAAA;AAClD,IAAA,MAAM,KAAK,CAAA,GAAI,CAAA;AACf,IAAA,MAAM,CAAA,GAAI,KAAK,EAAA,GAAK,EAAA,GAAK,IAAI,EAAA,CAAG,CAAA,GAAI,CAAA,GAAI,EAAA,GAAK,EAAA,GAAK,CAAA,GAAI,GAAG,CAAA,GAAI,CAAA,GAAI,EAAA,GAAK,CAAA,GAAI,CAAA,GAAI,EAAA,CAAG,IAAI,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,GAAA,CAAI,EAAA,CAAG,CAAA;AACxG,IAAA,MAAM,CAAA,GAAI,KAAK,EAAA,GAAK,EAAA,GAAK,IAAI,EAAA,CAAG,CAAA,GAAI,CAAA,GAAI,EAAA,GAAK,EAAA,GAAK,CAAA,GAAI,GAAG,CAAA,GAAI,CAAA,GAAI,EAAA,GAAK,CAAA,GAAI,CAAA,GAAI,EAAA,CAAG,IAAI,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,GAAA,CAAI,EAAA,CAAG,CAAA;AACxG,IAAA,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,CAAA,CAAE,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,CAAC,CAAC,CAAA;AAAA,EACtD;AACA,EAAA,OAAO,KAAA;AACT;;;AC1NO,IAAM,cAAoC,CAAC,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,QAAQ,OAAO;AAmB3F,IAAM,GAAA,GAAM,KAAK,EAAA,GAAK,CAAA;AACtB,IAAM,IAAA,GAAO,CAAC,CAAA,KAAsB,CAAA,GAAI,MAAM,IAAA,CAAK,KAAA,CAAM,IAAI,GAAG,CAAA;AAChE,IAAM,OAAA,GAAU,CAAC,CAAA,EAAU,CAAA,KAAqB,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,EAAE,CAAC,CAAA;AAC/E,IAAM,QAAA,GAAW,CAAC,CAAA,EAAU,CAAA,KAAqB,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,EAAE,CAAC,CAAA;AAGzE,SAAS,YAAY,IAAA,EAAkC;AAC5D,EAAA,OAAO,WAAA,CAAY,SAAS,IAAiB,CAAA;AAC/C;AAeA,SAAS,WAAA,CAAY,QAA+B,MAAA,EAAyB;AAC3E,EAAA,MAAM,IAAI,MAAA,CAAO,MAAA;AACjB,EAAA,MAAM,KAAA,GAAQ,MAAA,GAAS,CAAA,GAAI,CAAA,GAAI,CAAA;AAC/B,EAAA,MAAM,OAAiB,EAAC;AACxB,EAAA,MAAM,WAAsB,EAAC;AAC7B,EAAA,MAAM,OAAiB,EAAC;AACxB,EAAA,MAAM,QAAmB,EAAC;AAC1B,EAAA,IAAI,QAAA,GAAW,CAAA;AACf,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK;AAC9B,IAAA,MAAM,CAAA,GAAA,CAAK,IAAI,CAAA,IAAK,CAAA;AACpB,IAAA,IAAA,CAAK,KAAK,CAAC,CAAA;AACX,IAAA,MAAM,OAAO,MAAA,CAAO,CAAC,EAAE,IAAA,KAAS,OAAA,IAAW,OAAO,CAAC,CAAA,CAAE,IAAA,KAAS,MAAA,IACzD,SAAS,MAAA,CAAO,CAAC,GAAG,MAAA,CAAO,CAAC,CAAC,CAAA,GAAI,IAAA;AACtC,IAAA,QAAA,CAAS,KAAK,IAAI,CAAA;AAClB,IAAA,IAAA,CAAK,IAAA,CAAK,IAAA,GAAO,EAAA,GAAK,QAAQ,CAAA;AAC9B,IAAA,MAAM,MAAA,GAAS,CAAC,IAAA,KAAS,MAAA,CAAO,CAAC,CAAA,CAAE,IAAA,KAAS,IAAA,IAAQ,MAAA,CAAO,CAAC,CAAA,CAAE,IAAA,KAAS,IAAA,CAAA;AACvE,IAAA,KAAA,CAAM,KAAK,MAAM,CAAA;AACjB,IAAA,IAAI,CAAC,IAAA,EAAM,QAAA,IAAY,MAAA,GAAS,CAAA,GAAI,CAAA;AAAA,EACtC;AACA,EAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,OAAO,QAAA,EAAS;AACzD;AAEA,SAAS,KAAA,CAAM,GAAA,EAAa,MAAA,EAAiB,CAAA,EAAyB;AACpE,EAAA,MAAM,CAAA,GAAI,IAAI,MAAA,CAAO,MAAA;AACrB,EAAA,MAAM,KAAA,GAAQ,IAAI,IAAA,CAAK,MAAA;AACvB,EAAA,MAAM,IAAA,GAAO,CAAC,GAAA,KAAsB;AAClC,IAAA,IAAI,MAAM,CAAA,IAAK,GAAA,IAAO,OAAO,OAAO,EAAE,MAAM,MAAA,EAAO;AACnD,IAAA,IAAI,GAAA,CAAI,SAAS,GAAG,CAAA,SAAU,EAAE,IAAA,EAAM,QAAQ,KAAA,EAAO,OAAA,CAAQ,IAAI,MAAA,CAAO,GAAG,GAAG,GAAA,CAAI,MAAA,CAAO,IAAI,IAAA,CAAK,GAAG,CAAC,CAAC,CAAA,EAAE;AACzG,IAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,GAAA,EAAI;AAAA,EAC9B,CAAA;AACA,EAAA,MAAM,OAAO,CAAA,GAAI,CAAA,GAAI,IAAI,CAAA,GAAI,MAAA,GAAS,IAAI,CAAA,GAAI,EAAA;AAC9C,EAAA,MAAM,KAAA,GAAQ,MAAA,IAAU,CAAA,GAAI,CAAA,GAAI,IAAI,CAAA,GAAI,EAAA;AACxC,EAAA,OAAO,CAAC,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AACjC;AAIA,SAAS,UAAA,CAAW,GAAA,EAAa,CAAA,EAAW,CAAA,EAA8B;AACxE,EAAA,MAAM,EAAA,GAAK,GAAA,CAAI,MAAA,CAAO,CAAC,CAAA;AACvB,EAAA,MAAM,KAAK,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,IAAA,CAAK,CAAC,CAAC,CAAA;AACjC,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,EAAA,EAAI,EAAE,CAAA;AAC5B,EAAA,MAAM,CAAA,GAAI,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA;AACpB,EAAA,MAAM,MAAM,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA,GACnB,eAAA,CAAgB,KAAK,CAAA,CAAE,CAAC,CAAA,GAAI,KAAK,GAAG,IAAA,CAAK,CAAA,CAAE,IAAI,CAAC,CAAA,GAAI,KAAK,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,CAAC,GAAG,CAAA,CAAE,CAAA,GAAI,CAAC,CAAC,CAAA,GAC9E,gBAAgB,IAAA,CAAK,CAAA,CAAE,CAAC,CAAA,GAAI,KAAK,GAAG,IAAA,CAAK,CAAA,CAAE,IAAI,CAAC,CAAA,GAAI,KAAK,CAAC,CAAA;AAC9D,EAAA,MAAM,GAAA,GAAM,iBAAA,CAAkB,GAAA,EAAK,EAAA,EAAI,EAAE,CAAA;AACzC,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,GAAA,EAAK,CAAC,CAAA;AACtC,EAAA,OAAO,EAAE,GAAA,EAAK,KAAA,EAAO,QAAA,CAAS,EAAA,EAAI,EAAE,CAAA,EAAG,UAAA,EAAY,QAAA,EAAU,YAAA,CAAa,KAAK,CAAC,CAAA,EAAG,OAAO,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA,EAAE;AACzG;AAGA,IAAM,IAAA,GAAO,CAAC,CAAA,EAAW,EAAA,KAAsB,iBAAiB,CAAA,CAAE,GAAA,EAAK,EAAE,CAAA,GAAI,CAAA,CAAE,KAAA;AAG/E,IAAM,KAAA,GAAQ,CAAC,CAAA,EAAW,EAAA,KAAsB,2BAAA,CAA4B,CAAA,CAAE,GAAA,EAAK,EAAE,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,KAAA,IAAS,CAAA;AAIvG,SAAS,MAAA,CAAO,IAAY,EAAA,EAAsB;AAChD,EAAA,MAAM,KAAA,GAAA,CAAS,EAAA,CAAG,KAAA,GAAQ,EAAA,CAAG,KAAA,IAAS,CAAA;AACtC,EAAA,MAAM,CAAC,EAAA,EAAI,EAAE,IAAI,2BAAA,CAA4B,EAAA,CAAG,KAAK,CAAC,CAAA;AACtD,EAAA,MAAM,CAAC,EAAA,EAAI,EAAE,IAAI,2BAAA,CAA4B,EAAA,CAAG,KAAK,CAAC,CAAA;AACtD,EAAA,OAAO;AAAA,IACL,IAAA,CAAK,EAAA,CAAG,QAAA,GAAW,EAAA,CAAG,UAAU,CAAA;AAAA,IAAA,CAC/B,gBAAA,CAAiB,GAAG,GAAA,EAAK,CAAC,IAAI,gBAAA,CAAiB,EAAA,CAAG,GAAA,EAAK,CAAC,CAAA,IAAK,KAAA;AAAA,IAAA,CAC7D,EAAA,GAAK,MAAM,KAAA,IAAS,CAAA;AAAA,IAAA,CACpB,EAAA,GAAK,MAAM,KAAA,IAAS;AAAA,GACvB;AACF;AAEA,SAAS,SAAA,CAAU,GAAA,EAAa,MAAA,EAAiB,IAAA,EAAmC;AAClF,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,MAAM,KAAA,GAAQ,CAAC,IAAA,KAAuB,IAAA,CAAM,KAAyB,GAAG,CAAA;AACxE,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AAC1C,IAAA,MAAM,CAAC,CAAA,EAAG,CAAC,IAAI,KAAA,CAAM,GAAA,EAAK,QAAQ,CAAC,CAAA;AACnC,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,MAAA,CAAO,CAAC,CAAA,CAAE,IAAA;AAC3B,IAAA,MAAM,EAAA,GAAK,EAAE,IAAA,KAAS,OAAA;AACtB,IAAA,MAAM,EAAA,GAAK,EAAE,IAAA,KAAS,OAAA;AACtB,IAAA,IAAI,CAAC,EAAA,IAAM,CAAC,EAAA,EAAI;AAChB,IAAA,IAAI,IAAA,KAAS,IAAA,IAAQ,EAAA,IAAM,EAAA,EAAI;AAC7B,MAAA,GAAA,CAAI,IAAA,CAAK,GAAG,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA,EAAG,KAAA,CAAM,CAAC,CAAC,CAAC,CAAA;AACtC,MAAA;AAAA,IACF;AACA,IAAA,IAAI,IAAA,KAAS,QAAA,IAAY,EAAA,IAAM,EAAA,EAAI;AACjC,MAAA,MAAM,KAAK,KAAA,CAAM,CAAC,CAAA,EAAG,EAAA,GAAK,MAAM,CAAC,CAAA;AACjC,MAAA,GAAA,CAAI,IAAA,CAAK,GAAG,MAAA,CAAO,EAAA,EAAI,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA;AACtC,MAAA,IAAI,GAAG,KAAA,EAAO,GAAA,CAAI,KAAK,KAAA,CAAM,EAAA,EAAI,CAAC,CAAC,CAAA;AACnC,MAAA,IAAI,GAAG,KAAA,EAAO,GAAA,CAAI,KAAK,KAAA,CAAM,EAAA,EAAI,CAAC,CAAC,CAAA;AACnC,MAAA;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAA,EAAO,EAAE,CAAA,IAAK,CAAC,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,GAAG,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAC,CAAA,EAAY;AAC/D,MAAA,IAAI,IAAA,CAAK,SAAS,OAAA,EAAS;AAC3B,MAAA,MAAM,CAAA,GAAI,MAAM,IAAI,CAAA;AACpB,MAAA,MAAM,KAAA,GAAQ,EAAA,KAAO,CAAA,GAAI,CAAA,CAAE,WAAW,CAAA,CAAE,UAAA;AACxC,MAAA,MAAM,WAAA,GAAc,KAAA,CAAM,IAAA,KAAS,MAAA,IAAU,IAAA,KAAS,QAAA;AACtD,MAAA,GAAA,CAAI,IAAA,CAAK,WAAA,GAAc,IAAA,CAAK,KAAA,GAAQ,KAAA,CAAM,KAAK,CAAA,GAAI,IAAA,CAAK,CAAA,EAAG,EAAE,CAAC,CAAA;AAC9D,MAAA,IAAI,EAAE,KAAA,EAAO,GAAA,CAAI,KAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,IACpC;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AAGA,SAAS,YAAA,CAAa,KAAa,MAAA,EAA2B;AAC5D,EAAA,MAAM,IAAI,IAAI,KAAA,CAAc,IAAI,QAAQ,CAAA,CAAE,KAAK,CAAC,CAAA;AAChD,EAAA,MAAM,CAAA,GAAI,IAAI,MAAA,CAAO,MAAA;AACrB,EAAA,MAAM,SAAA,GAAY,CAAC,CAAA,EAAW,GAAA,KAAwB;AACpD,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,EAAG,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,IAAA,CAAK,GAAG,CAAC,CAAC,CAAA;AAChE,IAAA,MAAM,CAAC,CAAA,EAAG,CAAC,IAAI,KAAA,CAAM,GAAA,EAAK,QAAQ,CAAC,CAAA;AACnC,IAAA,IAAI,GAAA,CAAI,MAAA,CAAO,CAAC,CAAA,CAAE,IAAA,KAAS,QAAA,IAAY,CAAA,CAAE,IAAA,KAAS,MAAA,IAAU,CAAA,CAAE,IAAA,KAAS,MAAA,EAAQ,OAAO,KAAA;AACtF,IAAA,IAAI,CAAA,CAAE,IAAA,KAAS,MAAA,EAAQ,OAAO,CAAA,CAAE,KAAA;AAChC,IAAA,IAAI,CAAA,CAAE,IAAA,KAAS,MAAA,EAAQ,OAAO,CAAA,CAAE,KAAA;AAChC,IAAA,MAAM,OAAO,GAAA,CAAI,MAAA,CAAA,CAAQ,CAAA,GAAI,CAAA,GAAI,KAAK,CAAC,CAAA;AACvC,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,MAAA,CAAA,CAAQ,CAAA,GAAI,KAAK,CAAC,CAAA;AACnC,IAAA,MAAM,MAAM,OAAA,CAAQ,IAAA,EAAM,GAAA,CAAI,MAAA,CAAO,CAAC,CAAC,CAAA;AACvC,IAAA,MAAM,OAAO,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,CAAC,GAAG,IAAI,CAAA;AACxC,IAAA,OAAO,GAAA,GAAM,IAAA,CAAK,IAAA,GAAO,GAAG,CAAA,GAAI,CAAA;AAAA,EAClC,CAAA;AACA,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACxC,IAAA,MAAM,CAAA,GAAI,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA;AACpB,IAAA,IAAI,IAAI,CAAA,EAAG;AACX,IAAA,CAAA,CAAE,CAAC,CAAA,GAAI,SAAA,CAAU,CAAA,EAAG,CAAC,CAAA;AACrB,IAAA,CAAA,CAAE,CAAA,GAAI,CAAC,CAAA,GAAI,SAAA,CAAU,IAAI,IAAA,CAAK,CAAC,GAAG,CAAC,CAAA;AAAA,EACrC;AACA,EAAA,OAAO,CAAA;AACT;AAGA,SAAS,WAAA,CAAY,GAAe,CAAA,EAA8B;AAChE,EAAA,MAAM,IAAI,CAAA,CAAE,MAAA;AACZ,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,IAAA,IAAI,CAAA,GAAI,CAAA;AACR,IAAA,KAAA,IAAS,CAAA,GAAI,IAAI,CAAA,EAAG,CAAA,GAAI,GAAG,CAAA,EAAA,EAAK,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,CAAC,EAAE,CAAC,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,CAAC,CAAA,CAAE,CAAC,CAAC,CAAA,EAAG,CAAA,GAAI,CAAA;AAC/E,IAAA,IAAI,IAAA,CAAK,IAAI,CAAA,CAAE,CAAC,EAAE,CAAC,CAAC,CAAA,GAAI,KAAA,EAAO,OAAO,IAAA;AACtC,IAAA,CAAC,CAAA,CAAE,CAAC,CAAA,EAAG,CAAA,CAAE,CAAC,CAAC,CAAA,GAAI,CAAC,CAAA,CAAE,CAAC,CAAA,EAAG,CAAA,CAAE,CAAC,CAAC,CAAA;AAC1B,IAAA,CAAC,CAAA,CAAE,CAAC,CAAA,EAAG,CAAA,CAAE,CAAC,CAAC,CAAA,GAAI,CAAC,CAAA,CAAE,CAAC,CAAA,EAAG,CAAA,CAAE,CAAC,CAAC,CAAA;AAC1B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAG,CAAA,EAAA,EAAK;AAC9B,MAAA,MAAM,CAAA,GAAI,EAAE,CAAC,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,CAAE,CAAC,CAAA;AAC1B,MAAA,IAAI,MAAM,CAAA,EAAG;AACb,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,KAAK,CAAA,CAAE,CAAC,CAAA,CAAE,CAAC,CAAA,IAAK,CAAA,GAAI,CAAA,CAAE,CAAC,EAAE,CAAC,CAAA;AACjD,MAAA,CAAA,CAAE,CAAC,CAAA,IAAK,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA;AAAA,IACjB;AAAA,EACF;AACA,EAAA,MAAM,MAAM,IAAI,KAAA,CAAc,CAAC,CAAA,CAAE,KAAK,CAAC,CAAA;AACvC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC/B,IAAA,IAAI,CAAA,GAAI,EAAE,CAAC,CAAA;AACX,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK,CAAA,IAAK,CAAA,CAAE,CAAC,CAAA,CAAE,CAAC,CAAA,GAAI,IAAI,CAAC,CAAA;AACpD,IAAA,GAAA,CAAI,CAAC,CAAA,GAAI,CAAA,GAAI,CAAA,CAAE,CAAC,EAAE,CAAC,CAAA;AAAA,EACrB;AACA,EAAA,OAAO,GAAA;AACT;AAEA,IAAM,IAAA,GAAO,CAAC,CAAA,KAAiC,IAAA,CAAK,KAAK,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAA,GAAI,CAAA,EAAG,CAAC,CAAC,CAAA;AAMlF,SAAS,UAAA,CAAW,QAA+B,MAAA,EAAiC;AACzF,EAAA,IAAI,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,EAAC;AAC/B,EAAA,MAAM,MAAM,WAAA,CAAY,MAAA,EAAQ,MAAA,IAAU,MAAA,CAAO,SAAS,CAAC,CAAA;AAC3D,EAAA,MAAM,QAAA,GAAW,MAAA,IAAU,MAAA,CAAO,MAAA,GAAS,CAAA;AAC3C,EAAA,IAAI,CAAA,GAAI,YAAA,CAAa,GAAA,EAAK,QAAQ,CAAA;AAClC,EAAA,MAAM,SAAS,CAAC,CAAA,KACd,IAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAO,IAAI,IAAA,CAAK,CAAC,IAAI,CAAA,GAAK,IAAA,GAA6B,WAAW,GAAA,EAAK,CAAA,EAAG,CAAC,CAAE,CAAA;AAChG,EAAA,IAAI,IAAA,GAAO,OAAO,CAAC,CAAA;AACnB,EAAA,IAAI,CAAA,GAAI,SAAA,CAAU,GAAA,EAAK,QAAA,EAAU,IAAI,CAAA;AACrC,EAAA,KAAA,IAAS,OAAO,CAAA,EAAG,IAAA,GAAO,MAAM,GAAA,CAAI,QAAA,GAAW,GAAG,IAAA,EAAA,EAAQ;AACxD,IAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,IAAA,IAAI,MAAM,KAAA,EAAO;AAEjB,IAAA,MAAM,GAAA,GAAM,CAAA,CAAE,GAAA,CAAI,MAAM,IAAI,KAAA,CAAc,GAAA,CAAI,QAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,CAAC,CAAA;AAC/D,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACxC,MAAA,MAAM,CAAA,GAAI,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA;AACpB,MAAA,IAAI,IAAI,CAAA,EAAG;AACX,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,IAAK,GAAA,CAAI,MAAM,CAAC,CAAA,GAAI,CAAA,GAAI,CAAA,CAAA,EAAI,CAAA,EAAA,EAAK;AACnD,QAAA,MAAM,CAAA,GAAI,IAAA;AACV,QAAA,MAAM,EAAA,GAAK,EAAE,KAAA,EAAM;AACnB,QAAA,EAAA,CAAG,CAAC,CAAA,IAAK,CAAA;AACT,QAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,EAAM;AACzB,QAAA,KAAA,CAAM,CAAC,CAAA,GAAI,UAAA,CAAW,GAAA,EAAK,GAAG,EAAE,CAAA;AAChC,QAAA,MAAM,EAAA,GAAK,SAAA,CAAU,GAAA,EAAK,QAAA,EAAU,KAAK,CAAA;AACzC,QAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAA,EAAQ,KAAK,GAAA,CAAI,CAAC,CAAA,CAAE,CAAC,KAAK,EAAA,CAAG,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,IAAK,CAAA;AAAA,MAClE;AAAA,IACF;AACA,IAAA,MAAM,IAAA,GAAO,YAAY,GAAA,EAAK,CAAA,CAAE,IAAI,CAAC,CAAA,KAAM,CAAC,CAAC,CAAC,CAAA;AAC9C,IAAA,IAAI,CAAC,IAAA,EAAM;AAEX,IAAA,IAAI,CAAA,GAAI,CAAA;AACR,IAAA,IAAI,QAAA,GAAW,KAAA;AACf,IAAA,KAAA,IAAS,QAAQ,CAAA,EAAG,KAAA,GAAQ,EAAA,EAAI,KAAA,EAAA,EAAS,KAAK,CAAA,EAAG;AAC/C,MAAA,MAAM,EAAA,GAAK,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,EAAG,MAAM,CAAA,GAAI,CAAA,GAAI,IAAA,CAAK,CAAC,CAAC,CAAA;AAC1C,MAAA,MAAM,EAAA,GAAK,OAAO,EAAE,CAAA;AACpB,MAAA,MAAM,EAAA,GAAK,SAAA,CAAU,GAAA,EAAK,QAAA,EAAU,EAAE,CAAA;AACtC,MAAA,IAAI,IAAA,CAAK,EAAE,CAAA,GAAI,GAAA,EAAK;AAClB,QAAA,CAAA,GAAI,EAAA;AAAI,QAAA,IAAA,GAAO,EAAA;AAAI,QAAA,CAAA,GAAI,EAAA;AAAI,QAAA,QAAA,GAAW,IAAA;AACtC,QAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAI,CAAC,QAAA,EAAU;AAAA,EACjB;AACA,EAAA,OAAO,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,CAAC,KAAK,CAAA,MAAO;AAAA,IAC/B,IAAA,EAAM,EAAE,CAAA,EAAG,MAAA,CAAO,CAAC,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,MAAA,CAAO,CAAC,CAAA,CAAE,CAAA,EAAE;AAAA,IACvC,EAAA,EAAI,EAAE,CAAA,EAAG,MAAA,CAAO,GAAG,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,MAAA,CAAO,GAAG,CAAA,CAAE,CAAA,EAAE;AAAA,IACzC,MAAA,EAAQ,IAAI,IAAA,CAAK,CAAC,IAAI,CAAA,GAAI,IAAA,GAAO,IAAA,CAAK,CAAC,CAAA,CAAE;AAAA,GAC3C,CAAE,CAAA;AACJ;;;AC1PA,IAAM,UAAA,GAAa,EAAA;AAKnB,SAAS,WAAA,CAAY,QAAsB,GAAA,EAAsB;AAC/D,EAAA,IAAI,OAAgB,EAAC;AACrB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,UAAA,EAAY,CAAA,EAAA,EAAK;AACpC,IAAA,IAAA,GAAO,EAAC;AACR,IAAA,IAAI,IAAA,GAAO,IAAA;AACX,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,MAAA,MAAM,KAAA,GAAQ,CAAA,KAAM,CAAA,GAAI,MAAA,GAAS,eAAA,CAAgB,QAAQ,CAAA,GAAI,CAAA,EAAA,CAAI,CAAA,GAAI,CAAA,IAAK,CAAC,CAAA;AAC3E,MAAA,MAAM,EAAE,EAAA,EAAI,EAAA,EAAG,GAAI,kBAAkB,KAAK,CAAA;AAC1C,MAAA,IAAA,CAAK,KAAK,EAAE,GAAA,EAAK,KAAA,EAAO,EAAA,EAAI,IAAI,CAAA;AAChC,MAAA,IAAI,eAAA,CAAgB,OAAO,EAAA,EAAI,EAAE,IAAI,GAAA,GAAM,MAAA,CAAO,QAAQ,IAAA,GAAO,KAAA;AAAA,IACnE;AACA,IAAA,IAAI,IAAA,EAAM;AAAA,EACZ;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,cAAA,CAAe,GAAiB,GAAA,EAAqD;AAC5F,EAAA,MAAM,UAAuB,EAAC;AAC9B,EAAA,MAAM,KAAe,EAAC;AACtB,EAAA,MAAM,QAAA,GAAW,UAAA,CAAW,CAAA,CAAE,MAAA,EAAQ,EAAE,MAAM,CAAA;AAE9C,EAAA,IAAI,QAAA,GAA4C,IAAA;AAChD,EAAA,CAAA,CAAE,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM;AACzB,IAAA,EAAA,CAAG,IAAA,CAAK,QAAQ,MAAM,CAAA;AACtB,IAAA,OAAA,CAAQ,KAAK,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,GAAG,CAAA,CAAE,CAAA,EAAG,GAAI,QAAA,GAAW,EAAE,QAAA,EAAU,QAAA,EAAS,GAAI,IAAK,CAAA;AAC5E,IAAA,QAAA,GAAW,IAAA;AACX,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,CAAC,CAAA,EAAG,MAAA;AAC5B,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,MAAM,MAAA,GAAS,WAAA,CAAY,MAAA,EAAQ,GAAG,CAAA;AACtC,IAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,EAAO,CAAA,KAAM;AAC3B,MAAA,OAAA,CAAQ,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA,CAAE,SAAA,GAAY,EAAE,CAAA,EAAG,KAAA,CAAM,EAAA,CAAG,CAAA,EAAG,CAAA,EAAG,KAAA,CAAM,GAAG,CAAA,EAAE;AACvE,MAAA,MAAM,EAAA,GAAK,EAAE,CAAA,EAAG,KAAA,CAAM,GAAG,CAAA,EAAG,CAAA,EAAG,KAAA,CAAM,EAAA,CAAG,CAAA,EAAE;AAC1C,MAAA,IAAI,IAAI,MAAA,CAAO,MAAA,GAAS,GAAG,OAAA,CAAQ,IAAA,CAAK,EAAE,CAAA,EAAG,KAAA,CAAM,IAAI,EAAA,CAAG,CAAA,EAAG,GAAG,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA,EAAG,QAAA,EAAU,IAAI,CAAA;AAAA,WACzF,QAAA,GAAW,EAAA;AAAA,IAClB,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACD,EAAA,IAAI,QAAA,EAAU,OAAA,CAAQ,CAAC,CAAA,CAAE,QAAA,GAAW,QAAA;AACpC,EAAA,OAAO,EAAE,SAAS,EAAA,EAAG;AACvB;AAMO,SAAS,WAAA,CAAY,QAAA,EAAmC,OAAA,GAA8B,EAAC,EAAc;AAC1G,EAAA,MAAM,GAAA,GAAM,QAAQ,SAAA,IAAa,IAAA;AACjC,EAAA,MAAM,OAAsB,EAAC;AAC7B,EAAA,MAAM,SAAoB,EAAC;AAC3B,EAAA,MAAM,KAAe,EAAC;AACtB,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,IAAA,IAAI,CAAA,CAAE,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG;AAC3B,IAAA,MAAM,OAAA,GAAU,cAAA,CAAe,CAAA,EAAG,GAAG,CAAA;AACrC,IAAA,IAAA,CAAK,IAAA,CAAK,QAAQ,OAAO,CAAA;AACzB,IAAA,MAAA,CAAO,KAAK,CAAA,CAAE,MAAA,IAAU,CAAA,CAAE,MAAA,CAAO,SAAS,CAAC,CAAA;AAC3C,IAAA,EAAA,CAAG,IAAA,CAAK,GAAG,OAAA,CAAQ,EAAA,CAAG,IAAI,CAAC,CAAA,KAAM,CAAA,GAAI,IAAI,CAAC,CAAA;AAC1C,IAAA,IAAA,IAAQ,QAAQ,OAAA,CAAQ,MAAA;AAAA,EAC1B;AACA,EAAA,OAAO,EAAE,MAAM,aAAA,CAAc,IAAA,EAAM,QAAQ,OAAA,CAAQ,IAAI,GAAG,EAAA,EAAG;AAC/D;AAQO,SAAS,eAAA,CACd,IAAA,EACA,KAAA,EACA,EAAA,EACuB;AACvB,EAAA,IAAI,MAAM,MAAA,KAAW,EAAA,CAAG,UAAU,EAAA,CAAG,MAAA,KAAW,GAAG,OAAO,IAAA;AAC1D,EAAA,MAAM,EAAE,OAAA,EAAS,MAAA,EAAO,GAAI,cAAc,IAAI,CAAA;AAC9C,EAAA,MAAM,WAA2B,EAAC;AAClC,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACvC,IAAA,MAAM,GAAA,GAAM,QAAQ,CAAC,CAAA;AACrB,IAAA,IAAI,EAAA,CAAG,CAAC,CAAA,KAAM,IAAA,EAAM,OAAO,IAAA;AAC3B,IAAA,MAAM,SAAuB,EAAC;AAC9B,IAAA,OAAO,CAAA,GAAI,GAAG,MAAA,IAAU,EAAA,CAAG,CAAC,CAAA,GAAI,IAAA,GAAO,IAAI,MAAA,EAAQ;AACjD,MAAA,IAAI,CAAA,GAAI,KAAK,EAAA,CAAG,CAAC,KAAK,EAAA,CAAG,CAAA,GAAI,CAAC,CAAA,EAAG,OAAO,IAAA;AACxC,MAAA,MAAM,CAAA,GAAI,GAAA,CAAI,EAAA,CAAG,CAAC,IAAI,IAAI,CAAA;AAC1B,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,IAAA,EAAM,KAAA,CAAM,CAAC,CAAA,EAAG,CAAA;AAC9C,MAAA,CAAA,EAAA;AAAA,IACF;AACA,IAAA,QAAA,CAAS,KAAK,EAAE,MAAA,EAAQ,QAAQ,MAAA,CAAO,CAAC,GAAG,CAAA;AAC3C,IAAA,IAAA,IAAQ,GAAA,CAAI,MAAA;AAAA,EACd;AACA,EAAA,OAAO,CAAA,KAAM,EAAA,CAAG,MAAA,GAAS,QAAA,GAAW,IAAA;AACtC;AAIO,SAAS,iBAAiB,QAAA,EAAgD;AAC/E,EAAA,OAAO,aAAA;AAAA,IACL,SAAS,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,GAAG,CAAA,CAAE,CAAA,EAAG,GAAG,CAAA,CAAE,CAAA,GAAI,CAAC,CAAA;AAAA,IAC7D,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,MAAM;AAAA,GAC9B;AACF;AAEA,IAAM,GAAA,GAAM,CAAC,CAAA,EAAW,CAAA,KAAsB,GAAG,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAG,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAG,CAAC,CAAA,CAAA;AAQpF,SAAS,wBAAA,CACd,OAAA,EACA,MAAA,EACA,QAAA,GAAsB,QAAA,EACN;AAChB,EAAA,MAAM,EAAE,OAAA,EAAS,MAAA,EAAO,GAAI,cAAc,OAAO,CAAA;AACjD,EAAA,MAAM,MAAM,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,KAAM,EAAE,MAAM,CAAA;AAC1C,EAAA,MAAM,KAAA,GAAQ,QAAQ,MAAA,CAAO,CAAC,GAAG,GAAA,KAAQ,CAAA,GAAI,GAAA,CAAI,MAAA,EAAQ,CAAC,CAAA;AAC1D,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAuB;AAC3C,EAAA,KAAA,MAAW,CAAA,IAAK,KAAK,IAAI,CAAC,QAAQ,GAAA,CAAI,GAAA,CAAI,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAC,CAAA,EAAG,OAAA,CAAQ,IAAI,GAAA,CAAI,CAAA,CAAE,GAAG,CAAA,CAAE,CAAC,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA;AACvF,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,EAAK,CAAA,MAAO;AAAA,IAC9B,MAAA,EAAQ,OAAO,CAAC,CAAA;AAAA,IAChB,MAAA,EAAQ,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA,KAAM;AACrB,MAAA,MAAM,OAAO,KAAA,KAAU,GAAA,CAAI,MAAA,GAAS,GAAA,CAAI,CAAC,CAAA,CAAE,IAAA,GAAO,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAC,CAAA,IAAK,QAAA;AAChF,MAAA,CAAA,EAAA;AACA,MAAA,OAAO,EAAE,CAAA,EAAG,CAAA,CAAE,GAAG,CAAA,EAAG,CAAA,CAAE,GAAG,IAAA,EAAK;AAAA,IAChC,CAAC;AAAA,GACH,CAAE,CAAA;AACJ","file":"chunk-42TZDN5C.js","sourcesContent":["import type { AnchorSet } from './anchorEdits';\nimport { isStraightSegment, segmentEnds } from './anchors';\nimport { cubicPointAt, type Point } from './cubicMath';\n\n/** First derivative of the cubic Bezier (p0, p1, p2, p3) at t. */\nexport function cubicDerivativeAt(p0: Point, p1: Point, p2: Point, p3: Point, t: number): Point {\n const u = 1 - t;\n return {\n x: 3 * u * u * (p1.x - p0.x) + 6 * u * t * (p2.x - p1.x) + 3 * t * t * (p3.x - p2.x),\n y: 3 * u * u * (p1.y - p0.y) + 6 * u * t * (p2.y - p1.y) + 3 * t * t * (p3.y - p2.y),\n };\n}\n\nfunction cubicSecondDerivativeAt(p0: Point, p1: Point, p2: Point, p3: Point, t: number): Point {\n const u = 1 - t;\n return {\n x: 6 * u * (p2.x - 2 * p1.x + p0.x) + 6 * t * (p3.x - 2 * p2.x + p1.x),\n y: 6 * u * (p2.y - 2 * p1.y + p0.y) + 6 * t * (p3.y - 2 * p2.y + p1.y),\n };\n}\n\n/**\n * Signed curvature of the cubic Bezier (p0, p1, p2, p3) at t: one over the\n * radius of the circle that fits the curve there. Positive where the curve\n * turns toward its left normal `(-dy, dx)`, negative where it turns away, so\n * the sign flips at an inflection. 0 where the curve has no direction at t, as\n * at an end whose handle sits on its anchor.\n */\nexport function cubicCurvatureAt(p0: Point, p1: Point, p2: Point, p3: Point, t: number): number {\n const d1 = cubicDerivativeAt(p0, p1, p2, p3, t);\n const d2 = cubicSecondDerivativeAt(p0, p1, p2, p3, t);\n const den = Math.pow(d1.x * d1.x + d1.y * d1.y, 1.5);\n if (den < 1e-12) return 0;\n return (d1.x * d2.y - d1.y * d2.x) / den;\n}\n\n/** One tooth of a curvature comb: a point on the curve and the tip of the\n * tooth standing on it. */\nexport interface CombTooth {\n /** The point on the curve. */\n x: number;\n y: number;\n /** The tooth's tip: off the curve along its normal, on the outside of the\n * bend, by the curvature times the comb's scale. */\n tipX: number;\n tipY: number;\n /** Signed curvature at the point, as {@link cubicCurvatureAt} gives it. */\n curvature: number;\n}\n\n/** The comb of one curved segment, which runs from anchor `segIdx` of\n * subpath `sub` to the next. */\nexport interface SegmentComb {\n sub: number;\n segIdx: number;\n /** Evenly spaced in t, ends included. */\n teeth: CombTooth[];\n}\n\n/** Options for {@link curvatureComb} and {@link combTeeth}. */\nexport interface CurvatureCombOptions {\n /** Tooth length per unit of curvature. A tooth over a stretch of radius r is\n * `scale / r` long, in the curve's own units. */\n scale: number;\n /** Teeth per segment for {@link curvatureComb}, or along the whole source\n * for {@link combTeeth}; ends included. Default 24; at least 2. */\n samplesPerSegment?: number;\n}\n\n/**\n * A curve parameterized over t in [0, 1], as a curvature comb reads it. Any\n * curve can stand a comb this way, whether or not it is a path.\n */\nexport interface CurvatureSource {\n /** The point on the curve at t. */\n pointAt(t: number): Point;\n /** A vector along the direction of travel at t. Only its direction is read;\n * a zero vector means the curve has no direction there. */\n tangentAt(t: number): Point;\n /** Signed curvature at t, positive where the curve turns toward its left\n * normal `(-dy, dx)`, as {@link cubicCurvatureAt} gives it. */\n curvatureAt(t: number): number;\n}\n\n/** How far in from an end a tooth moves when the curve has no direction at\n * the end itself, so it reports the curvature the end is approached with. */\nconst END_NUDGE = 1e-3;\n\nfunction sampleCount(opts: CurvatureCombOptions): number {\n return Math.max(2, Math.round(opts.samplesPerSegment ?? 24));\n}\n\n/**\n * The teeth of a curvature comb along `source`, evenly spaced in t with both\n * ends included. Each stands out of the curve along its normal, on the outside\n * of the bend, `scale` times the curvature long.\n */\nexport function combTeeth(source: CurvatureSource, opts: CurvatureCombOptions): CombTooth[] {\n const samples = sampleCount(opts);\n const teeth: CombTooth[] = [];\n for (let i = 0; i < samples; i++) teeth.push(toothAt(source, i / (samples - 1), opts.scale));\n return teeth;\n}\n\n/** The cubic Bezier (p0, p1, p2, p3) as a {@link CurvatureSource}. */\nexport function cubicCurvatureSource(p0: Point, p1: Point, p2: Point, p3: Point): CurvatureSource {\n return {\n pointAt: (t) => cubicPointAt(p0, p1, p2, p3, t),\n tangentAt: (t) => cubicDerivativeAt(p0, p1, p2, p3, t),\n curvatureAt: (t) => cubicCurvatureAt(p0, p1, p2, p3, t),\n };\n}\n\n/**\n * Curvature combs for every curved segment of `set`: teeth that stand out of\n * the curve, each as long as the curvature where it stands. Joining their tips\n * draws how the bend changes along the path. A tooth that jumps in length at\n * an anchor shows a curvature break there; teeth that change side show an\n * inflection. Straight segments have no curvature, and no comb.\n */\nexport function curvatureComb(set: AnchorSet, opts: CurvatureCombOptions): SegmentComb[] {\n const out: SegmentComb[] = [];\n for (let sub = 0; sub < set.anchors.length; sub++) {\n const count = set.anchors[sub].length - (set.closed[sub] ? 0 : 1);\n for (let segIdx = 0; segIdx < count; segIdx++) {\n const ends = segmentEnds(set.anchors, set.closed, sub, segIdx);\n if (!ends || isStraightSegment(ends.a, ends.b)) continue;\n const { a, b } = ends;\n const source = cubicCurvatureSource(a, a.outHandle ?? a, b.inHandle ?? b, b);\n out.push({ sub, segIdx, teeth: combTeeth(source, opts) });\n }\n }\n return out;\n}\n\nfunction toothAt(source: CurvatureSource, t: number, scale: number): CombTooth {\n const at = source.pointAt(t);\n let d = source.tangentAt(t);\n let k = source.curvatureAt(t);\n if (Math.hypot(d.x, d.y) < 1e-9) {\n const inner = t < 0.5 ? t + END_NUDGE : t - END_NUDGE;\n d = source.tangentAt(inner);\n k = source.curvatureAt(inner);\n }\n const len = Math.hypot(d.x, d.y);\n if (len < 1e-12) return { x: at.x, y: at.y, tipX: at.x, tipY: at.y, curvature: 0 };\n // The bend's center lies along the left normal times 1/k, so the tooth goes\n // the other way: outside the bend on either side of an inflection.\n const nx = -d.y / len;\n const ny = d.x / len;\n return { x: at.x, y: at.y, tipX: at.x - nx * k * scale, tipY: at.y - ny * k * scale, curvature: k };\n}\n","/**\n * One spiral segment, fitted between two points so it leaves the first and\n * reaches the second at given angles to the chord. `solveSpiro` joins these\n * into a curvature-continuous spline.\n *\n * In its normalized frame the segment has unit arc length and, with\n * `u = s − ½`, tangent angle `φ = k0·u + (k1/2)·u² + (k2/6)·u³ + (k3/24)·u⁴`,\n * so its curvature is `k0 + k1·u + (k2/2)·u² + (k3/6)·u³`. An Euler spiral has\n * `k2 = k3 = 0`: its curvature changes linearly along it. A cubic-curvature\n * segment uses all four, which is what lets a G4 point keep the curvature's\n * first two derivatives continuous as well.\n */\nimport type { Point } from './cubicMath';\n\n/** The shape of a fitted segment, in its normalized frame. */\nexport interface EulerFit {\n k0: number;\n k1: number;\n /** Zero on an Euler spiral; set on a cubic-curvature segment. */\n k2: number;\n k3: number;\n /** Chord over arc length: the normalized segment's chord length. */\n ratio: number;\n /** The normalized chord's angle, which the world chord is rotated onto. */\n chordAngle: number;\n}\n\n/** Steps of the Simpson rule that integrates a segment's tangent. Even. */\nconst STEPS = 48;\n/** A chord-relative angle past this has no sensible spiral. */\nconst MAX_ANGLE = Math.PI * 0.95;\n\nconst clampAngle = (a: number): number => Math.max(-MAX_ANGLE, Math.min(MAX_ANGLE, a));\n\n/** `∫₀^upTo e^{iφ(s)} ds` for the normalized segment `(k0, k1, k2, k3)`. */\nexport function integrateEuler(k0: number, k1: number, upTo = 1, k2 = 0, k3 = 0): Point {\n const n = Math.max(2, Math.ceil((STEPS * upTo) / 2) * 2);\n const h = upTo / n;\n let x = 0;\n let y = 0;\n for (let i = 0; i <= n; i++) {\n const u = i * h - 0.5;\n const phi = k0 * u + u * u * (k1 / 2 + u * (k2 / 6 + (u * k3) / 24));\n const w = i === 0 || i === n ? 1 : i % 2 === 1 ? 4 : 2;\n x += w * Math.cos(phi);\n y += w * Math.sin(phi);\n }\n return { x: (x * h) / 3, y: (y * h) / 3 };\n}\n\n/** How far the start angle of `(k0, k1, k2, k3)` is from `th0`. */\nfunction startError(k0: number, k1: number, k2: number, k3: number, th0: number): number {\n const c = integrateEuler(k0, k1, 1, k2, k3);\n return -k0 / 2 + k1 / 8 - k2 / 48 + k3 / 384 - Math.atan2(c.y, c.x) - th0;\n}\n\n/**\n * The spiral leaving its chord at angle `th0` and reaching the far end at\n * angle `th1`, both measured from the chord, counterclockwise positive. With\n * `k2` and `k3` left at zero it is an Euler spiral; given, they are the\n * cubic-curvature segment's higher terms, and `k0` and `k1` are fitted around them.\n */\nexport function fitEulerSegment(th0: number, th1: number, k2 = 0, k3 = 0): EulerFit {\n const t0 = clampAngle(th0);\n const t1 = clampAngle(th1);\n // The odd terms set the total turn; the even ones bow the segment.\n const k0 = t1 - t0 - k2 / 24;\n // The small-angle solution, then Newton on the one remaining unknown.\n let k1 = 6 * (t0 + t1) - k3 / 40;\n for (let iter = 0; iter < 12; iter++) {\n const e = startError(k0, k1, k2, k3, t0);\n if (Math.abs(e) < 1e-12) break;\n const d = (startError(k0, k1 + 1e-6, k2, k3, t0) - e) / 1e-6;\n if (!Number.isFinite(d) || Math.abs(d) < 1e-12) break;\n k1 -= e / d;\n }\n const c = integrateEuler(k0, k1, 1, k2, k3);\n return { k0, k1, k2, k3, ratio: Math.hypot(c.x, c.y), chordAngle: Math.atan2(c.y, c.x) };\n}\n\n/** A fitted segment placed between two world points. */\nexport interface EulerSegment extends EulerFit {\n p0: Point;\n p1: Point;\n /** World arc length. */\n length: number;\n /** The world angle the normalized frame is turned by. */\n rotation: number;\n}\n\n/** `fit` placed so it runs from `p0` to `p1`. */\nexport function placeEulerSegment(fit: EulerFit, p0: Point, p1: Point): EulerSegment {\n const chord = Math.hypot(p1.x - p0.x, p1.y - p0.y);\n const length = fit.ratio > 1e-9 ? chord / fit.ratio : chord;\n const rotation = Math.atan2(p1.y - p0.y, p1.x - p0.x) - fit.chordAngle;\n return { ...fit, p0, p1, length, rotation };\n}\n\n/** The point at fraction `s` of the arc length along `seg`. */\nexport function eulerPointAt(seg: EulerSegment, s: number): Point {\n const c = integrateEuler(seg.k0, seg.k1, s, seg.k2, seg.k3);\n const cos = Math.cos(seg.rotation);\n const sin = Math.sin(seg.rotation);\n return {\n x: seg.p0.x + seg.length * (c.x * cos - c.y * sin),\n y: seg.p0.y + seg.length * (c.x * sin + c.y * cos),\n };\n}\n\n/** World tangent angle at fraction `s` of `seg`'s arc length. */\nexport function eulerAngleAt(seg: EulerSegment, s: number): number {\n const u = s - 0.5;\n return seg.rotation + seg.k0 * u + u * u * (seg.k1 / 2 + u * (seg.k2 / 6 + (u * seg.k3) / 24));\n}\n\n/** Normalized curvature at `u = s − ½`. */\nconst bendAt = (f: EulerFit, u: number): number => f.k0 + u * (f.k1 + u * (f.k2 / 2 + (u * f.k3) / 6));\n\n/** Signed world curvature at fraction `s` of `seg`'s arc length;\n * positive turns counterclockwise. */\nexport function eulerCurvatureAt(seg: EulerSegment, s: number): number {\n if (seg.length < 1e-12) return 0;\n return bendAt(seg, s - 0.5) / seg.length;\n}\n\n/** The first and second derivatives of `seg`'s world curvature with respect\n * to world arc length, at fraction `s` of it. */\nexport function eulerCurvatureDerivativesAt(seg: EulerSegment, s: number): [number, number] {\n if (seg.length < 1e-12) return [0, 0];\n const u = s - 0.5;\n return [\n (seg.k1 + u * (seg.k2 + (u * seg.k3) / 2)) / seg.length ** 2,\n (seg.k2 + u * seg.k3) / seg.length ** 3,\n ];\n}\n\nconst SAMPLES = 16;\n\n/** Handle lengths `[a, b]` along `u0`, `u1` that best fit `samples` at the\n * cubic parameters `ts`, by least squares. Null when the fit degenerates. */\nfunction fitHandleLengths(\n p0: Point, p1: Point, u0: Point, u1: Point, samples: readonly Point[], ts: readonly number[],\n): [number, number] | null {\n // B(t) = base(t) + a·3(1−t)²t·u0 − b·3(1−t)t²·u1, linear in a and b.\n let m00 = 0, m01 = 0, m11 = 0, r0 = 0, r1 = 0;\n samples.forEach((q, i) => {\n const t = ts[i];\n const mt = 1 - t;\n const b0 = mt * mt * mt + 3 * mt * mt * t;\n const b3 = 3 * mt * t * t + t * t * t;\n const ex = q.x - (b0 * p0.x + b3 * p1.x);\n const ey = q.y - (b0 * p0.y + b3 * p1.y);\n const f1 = 3 * mt * mt * t;\n const f2 = 3 * mt * t * t;\n const ax = f1 * u0.x, ay = f1 * u0.y;\n const bx = -f2 * u1.x, by = -f2 * u1.y;\n m00 += ax * ax + ay * ay;\n m01 += ax * bx + ay * by;\n m11 += bx * bx + by * by;\n r0 += ax * ex + ay * ey;\n r1 += bx * ex + by * ey;\n });\n const det = m00 * m11 - m01 * m01;\n if (Math.abs(det) < 1e-12) return null;\n const a = (r0 * m11 - r1 * m01) / det;\n const b = (m00 * r1 - m01 * r0) / det;\n return a > 0 && b > 0 && Number.isFinite(a) && Number.isFinite(b) ? [a, b] : null;\n}\n\n/** One Newton step moving `t` toward the point of the cubic nearest `q`. */\nfunction nearerT(p: readonly Point[], q: Point, t: number): number {\n const mt = 1 - t;\n const at = (c0: number, c1: number, c2: number, c3: number) =>\n mt * mt * mt * c0 + 3 * mt * mt * t * c1 + 3 * mt * t * t * c2 + t * t * t * c3;\n const d1 = (c0: number, c1: number, c2: number, c3: number) =>\n 3 * (mt * mt * (c1 - c0) + 2 * mt * t * (c2 - c1) + t * t * (c3 - c2));\n const d2 = (c0: number, c1: number, c2: number, c3: number) =>\n 6 * (mt * (c2 - 2 * c1 + c0) + t * (c3 - 2 * c2 + c1));\n const ex = at(p[0].x, p[1].x, p[2].x, p[3].x) - q.x;\n const ey = at(p[0].y, p[1].y, p[2].y, p[3].y) - q.y;\n const dx = d1(p[0].x, p[1].x, p[2].x, p[3].x);\n const dy = d1(p[0].y, p[1].y, p[2].y, p[3].y);\n const ddx = d2(p[0].x, p[1].x, p[2].x, p[3].x);\n const ddy = d2(p[0].y, p[1].y, p[2].y, p[3].y);\n const den = dx * dx + dy * dy + ex * ddx + ey * ddy;\n if (Math.abs(den) < 1e-12) return t;\n return Math.min(1, Math.max(0, t - (ex * dx + ey * dy) / den));\n}\n\n/**\n * The two control points of a cubic that follows `seg`: each handle lies on\n * the spiral's tangent at its end, with lengths fitted to points sampled along\n * the spiral by least squares, re-pairing each sample with its nearest cubic\n * parameter between rounds.\n */\nexport function eulerSegmentCubic(seg: EulerSegment): { c1: Point; c2: Point } {\n const { p0, p1 } = seg;\n const a0 = eulerAngleAt(seg, 0);\n const a1 = eulerAngleAt(seg, 1);\n const u0 = { x: Math.cos(a0), y: Math.sin(a0) };\n const u1 = { x: Math.cos(a1), y: Math.sin(a1) };\n const samples: Point[] = [];\n const ts: number[] = [];\n for (let i = 1; i < SAMPLES; i++) {\n samples.push(eulerPointAt(seg, i / SAMPLES));\n ts.push(i / SAMPLES);\n }\n const chord = Math.hypot(p1.x - p0.x, p1.y - p0.y);\n let lengths: [number, number] = [chord / 3, chord / 3];\n const handles = ([a, b]: [number, number]) => ({\n c1: { x: p0.x + a * u0.x, y: p0.y + a * u0.y },\n c2: { x: p1.x - b * u1.x, y: p1.y - b * u1.y },\n });\n for (let round = 0; round < 4; round++) {\n const fit = fitHandleLengths(p0, p1, u0, u1, samples, ts);\n if (!fit) break;\n lengths = fit;\n const { c1, c2 } = handles(lengths);\n const ctrl = [p0, c1, c2, p1];\n samples.forEach((q, i) => { ts[i] = nearerT(ctrl, q, ts[i]); });\n }\n return handles(lengths);\n}\n\n/** The stretch of `seg` from fraction `s0` to `s1` of its arc length, as a\n * segment of its own: a piece of an Euler spiral is one. */\nexport function subEulerSegment(seg: EulerSegment, s0: number, s1: number): EulerSegment {\n const d = s1 - s0;\n const m = (s0 + s1) / 2 - 0.5;\n // The curvature polynomial re-centered on the piece and scaled to its length.\n const k0 = bendAt(seg, m) * d;\n const k1 = (seg.k1 + m * (seg.k2 + (m * seg.k3) / 2)) * d ** 2;\n const k2 = (seg.k2 + m * seg.k3) * d ** 3;\n const k3 = seg.k3 * d ** 4;\n const c = integrateEuler(k0, k1, 1, k2, k3);\n const fit: EulerFit = { k0, k1, k2, k3, ratio: Math.hypot(c.x, c.y), chordAngle: Math.atan2(c.y, c.x) };\n return placeEulerSegment(fit, eulerPointAt(seg, s0), eulerPointAt(seg, s1));\n}\n\n/** How far the cubic `(seg.p0, c1, c2, seg.p1)` strays from `seg`, measured\n * at a few points along the spiral. */\nexport function eulerCubicError(seg: EulerSegment, c1: Point, c2: Point): number {\n const ctrl = [seg.p0, c1, c2, seg.p1];\n let worst = 0;\n for (const s of [0.2, 0.4, 0.5, 0.6, 0.8]) {\n const q = eulerPointAt(seg, s);\n let t = s;\n for (let i = 0; i < 4; i++) t = nearerT(ctrl, q, t);\n const mt = 1 - t;\n const x = mt * mt * mt * seg.p0.x + 3 * mt * mt * t * c1.x + 3 * mt * t * t * c2.x + t * t * t * seg.p1.x;\n const y = mt * mt * mt * seg.p0.y + 3 * mt * mt * t * c1.y + 3 * mt * t * t * c2.y + t * t * t * seg.p1.y;\n worst = Math.max(worst, Math.hypot(x - q.x, y - q.y));\n }\n return worst;\n}\n","/**\n * Spiro curves: a spline defined by on-curve points alone. Between each pair\n * of neighboring points runs an Euler-spiral segment (`eulerSpiral`), and the\n * segments are solved together so that, at every smooth point, both the\n * tangent and the curvature carry straight through. The curve has no handles\n * to tune; moving a point re-solves the whole curve.\n *\n * Each point's kind says what holds at it:\n *\n * | kind | at the point |\n * |---|---|\n * | `smooth` | tangent and curvature continue (G2); next to a straight segment, the curve leaves along the line |\n * | `g4` | tangent, curvature, and the curvature's first two derivatives continue (G4); otherwise as `smooth` |\n * | `corner` | the two sides are independent; each meets the point with zero curvature |\n * | `left` | the segment arriving is straight, and the curve leaving continues the line |\n * | `right` | the segment leaving is straight, and the curve arriving runs into the line |\n *\n * The ends of an open curve meet their points with zero curvature, as a\n * corner's sides do.\n *\n * A segment with a `g4` point at either end is a cubic-curvature segment,\n * with two more unknowns than an Euler spiral's two end tangents. A `g4`\n * point between two curved segments pays for its side's two with its two\n * extra equations; anywhere else, such a segment's curvature stops bending\n * at that end (its second derivative is zero there).\n */\nimport type { Point } from './cubicMath';\nimport {\n eulerAngleAt, eulerCurvatureAt, eulerCurvatureDerivativesAt, fitEulerSegment, placeEulerSegment,\n type EulerSegment,\n} from './eulerSpiral';\n\n/** What holds at a spiro point; see the table at the top of `spiro.ts`. */\nexport type SpiroKind = 'smooth' | 'g4' | 'corner' | 'left' | 'right';\n\n/** Every {@link SpiroKind}, in the order a picker lists them. */\nexport const SPIRO_KINDS: readonly SpiroKind[] = ['smooth', 'g4', 'corner', 'left', 'right'];\n\n/** One on-curve point of a spiro curve. */\nexport interface SpiroPoint {\n x: number;\n y: number;\n kind: SpiroKind;\n}\n\n/** One solved segment of a spiro curve: a straight line, or a placed Euler\n * spiral (`spiral`) between the two points. */\nexport interface SpiroSegment {\n from: Point;\n to: Point;\n spiral: EulerSegment | null;\n}\n\ntype Side = { kind: 'none' } | { kind: 'line'; angle: number } | { kind: 'curve'; seg: number };\n\nconst TAU = Math.PI * 2;\nconst wrap = (a: number): number => a - TAU * Math.round(a / TAU);\nconst angleOf = (p: Point, q: Point): number => Math.atan2(q.y - p.y, q.x - p.x);\nconst distance = (p: Point, q: Point): number => Math.hypot(q.x - p.x, q.y - p.y);\n\n/** Whether `kind` is one of the {@link SpiroKind}s. */\nexport function isSpiroKind(kind: unknown): kind is SpiroKind {\n return SPIRO_KINDS.includes(kind as SpiroKind);\n}\n\ninterface System {\n points: readonly SpiroPoint[];\n /** Segment `i` runs from point `i` to point `ends[i]`. */\n ends: number[];\n straight: boolean[];\n /** The first unknown slot of each curved segment (start tangent, end\n * tangent, then a cubic-curvature segment's two higher terms), or -1. */\n slot: number[];\n /** Whether each segment is a cubic-curvature one. */\n cubic: boolean[];\n unknowns: number;\n}\n\nfunction buildSystem(points: readonly SpiroPoint[], closed: boolean): System {\n const n = points.length;\n const count = closed ? n : n - 1;\n const ends: number[] = [];\n const straight: boolean[] = [];\n const slot: number[] = [];\n const cubic: boolean[] = [];\n let unknowns = 0;\n for (let i = 0; i < count; i++) {\n const j = (i + 1) % n;\n ends.push(j);\n const line = points[i].kind === 'right' || points[j].kind === 'left'\n || distance(points[i], points[j]) < 1e-9;\n straight.push(line);\n slot.push(line ? -1 : unknowns);\n const higher = !line && (points[i].kind === 'g4' || points[j].kind === 'g4');\n cubic.push(higher);\n if (!line) unknowns += higher ? 4 : 2;\n }\n return { points, ends, straight, slot, cubic, unknowns };\n}\n\nfunction sides(sys: System, closed: boolean, i: number): [Side, Side] {\n const n = sys.points.length;\n const count = sys.ends.length;\n const side = (seg: number): Side => {\n if (seg < 0 || seg >= count) return { kind: 'none' };\n if (sys.straight[seg]) return { kind: 'line', angle: angleOf(sys.points[seg], sys.points[sys.ends[seg]]) };\n return { kind: 'curve', seg };\n };\n const into = i > 0 ? i - 1 : closed ? n - 1 : -1;\n const outOf = closed || i < n - 1 ? i : -1;\n return [side(into), side(outOf)];\n}\n\ninterface Fitted { seg: EulerSegment; chord: number; startAngle: number; endAngle: number; cubic: boolean }\n\nfunction fitSegment(sys: System, s: number, x: readonly number[]): Fitted {\n const p0 = sys.points[s];\n const p1 = sys.points[sys.ends[s]];\n const chord = angleOf(p0, p1);\n const k = sys.slot[s];\n const fit = sys.cubic[s]\n ? fitEulerSegment(wrap(x[k] - chord), wrap(x[k + 1] - chord), x[k + 2], x[k + 3])\n : fitEulerSegment(wrap(x[k] - chord), wrap(x[k + 1] - chord));\n const seg = placeEulerSegment(fit, p0, p1);\n const startAngle = eulerAngleAt(seg, 0);\n return { seg, chord: distance(p0, p1), startAngle, endAngle: eulerAngleAt(seg, 1), cubic: sys.cubic[s] };\n}\n\n/** Curvature at one end of `f`, times its chord so every equation is on one scale. */\nconst bend = (f: Fitted, at: 0 | 1): number => eulerCurvatureAt(f.seg, at) * f.chord;\n\n/** The second derivative of curvature at one end of `f`, on the same scale. */\nconst twist = (f: Fitted, at: 0 | 1): number => eulerCurvatureDerivativesAt(f.seg, at)[1] * f.chord ** 3;\n\n/** Angle, curvature, and the curvature's first two derivatives matched where\n * `fa` ends and `fb` begins. */\nfunction g4Join(fa: Fitted, fb: Fitted): number[] {\n const scale = (fa.chord + fb.chord) / 2;\n const [a1, a2] = eulerCurvatureDerivativesAt(fa.seg, 1);\n const [b1, b2] = eulerCurvatureDerivativesAt(fb.seg, 0);\n return [\n wrap(fa.endAngle - fb.startAngle),\n (eulerCurvatureAt(fa.seg, 1) - eulerCurvatureAt(fb.seg, 0)) * scale,\n (a1 - b1) * scale ** 2,\n (a2 - b2) * scale ** 3,\n ];\n}\n\nfunction residuals(sys: System, closed: boolean, fits: readonly Fitted[]): number[] {\n const out: number[] = [];\n const fitOf = (side: Side): Fitted => fits[(side as { seg: number }).seg];\n for (let i = 0; i < sys.points.length; i++) {\n const [a, b] = sides(sys, closed, i);\n const kind = sys.points[i].kind;\n const ac = a.kind === 'curve';\n const bc = b.kind === 'curve';\n if (!ac && !bc) continue;\n if (kind === 'g4' && ac && bc) {\n out.push(...g4Join(fitOf(a), fitOf(b)));\n continue;\n }\n if (kind === 'smooth' && ac && bc) {\n const fa = fitOf(a), fb = fitOf(b);\n out.push(...g4Join(fa, fb).slice(0, 2));\n if (fa.cubic) out.push(twist(fa, 1));\n if (fb.cubic) out.push(twist(fb, 0));\n continue;\n }\n // One curved side from here on, or a corner's two independent ones.\n for (const [side, other, at] of [[a, b, 1], [b, a, 0]] as const) {\n if (side.kind !== 'curve') continue;\n const f = fitOf(side);\n const angle = at === 1 ? f.endAngle : f.startAngle;\n const followsLine = other.kind === 'line' && kind !== 'corner';\n out.push(followsLine ? wrap(angle - other.angle) : bend(f, at));\n if (f.cubic) out.push(twist(f, at));\n }\n }\n return out;\n}\n\n/** A starting tangent at each point: along the bisector of its two chords. */\nfunction initialGuess(sys: System, closed: boolean): number[] {\n const x = new Array<number>(sys.unknowns).fill(0);\n const n = sys.points.length;\n const tangentAt = (i: number, seg: number): number => {\n const chord = angleOf(sys.points[seg], sys.points[sys.ends[seg]]);\n const [a, b] = sides(sys, closed, i);\n if (sys.points[i].kind === 'corner' || a.kind === 'none' || b.kind === 'none') return chord;\n if (a.kind === 'line') return a.angle;\n if (b.kind === 'line') return b.angle;\n const prev = sys.points[(i - 1 + n) % n];\n const next = sys.points[(i + 1) % n];\n const pin = angleOf(prev, sys.points[i]);\n const pout = angleOf(sys.points[i], next);\n return pin + wrap(pout - pin) / 2;\n };\n for (let s = 0; s < sys.ends.length; s++) {\n const k = sys.slot[s];\n if (k < 0) continue;\n x[k] = tangentAt(s, s);\n x[k + 1] = tangentAt(sys.ends[s], s);\n }\n return x;\n}\n\n/** Solve `m · d = r` in place by Gaussian elimination with partial pivoting. */\nfunction solveLinear(m: number[][], r: number[]): number[] | null {\n const n = r.length;\n for (let c = 0; c < n; c++) {\n let p = c;\n for (let i = c + 1; i < n; i++) if (Math.abs(m[i][c]) > Math.abs(m[p][c])) p = i;\n if (Math.abs(m[p][c]) < 1e-14) return null;\n [m[c], m[p]] = [m[p], m[c]];\n [r[c], r[p]] = [r[p], r[c]];\n for (let i = c + 1; i < n; i++) {\n const f = m[i][c] / m[c][c];\n if (f === 0) continue;\n for (let j = c; j < n; j++) m[i][j] -= f * m[c][j];\n r[i] -= f * r[c];\n }\n }\n const out = new Array<number>(n).fill(0);\n for (let i = n - 1; i >= 0; i--) {\n let v = r[i];\n for (let j = i + 1; j < n; j++) v -= m[i][j] * out[j];\n out[i] = v / m[i][i];\n }\n return out;\n}\n\nconst norm = (v: readonly number[]): number => Math.sqrt(v.reduce((s, e) => s + e * e, 0));\n\n/**\n * Solve the spiro curve through `points`. A closed curve has a segment from\n * the last point back to the first. Fewer than two points make no segments.\n */\nexport function solveSpiro(points: readonly SpiroPoint[], closed: boolean): SpiroSegment[] {\n if (points.length < 2) return [];\n const sys = buildSystem(points, closed && points.length > 2);\n const isClosed = closed && points.length > 2;\n let x = initialGuess(sys, isClosed);\n const fitAll = (v: readonly number[]): Fitted[] =>\n sys.ends.map((_, s) => (sys.slot[s] < 0 ? (null as unknown as Fitted) : fitSegment(sys, s, v)));\n let fits = fitAll(x);\n let r = residuals(sys, isClosed, fits);\n for (let iter = 0; iter < 40 && sys.unknowns > 0; iter++) {\n const err = norm(r);\n if (err < 1e-10) break;\n // Each unknown moves only its own segment, so a column refits one segment.\n const jac = r.map(() => new Array<number>(sys.unknowns).fill(0));\n for (let s = 0; s < sys.ends.length; s++) {\n const k = sys.slot[s];\n if (k < 0) continue;\n for (let u = k; u < k + (sys.cubic[s] ? 4 : 2); u++) {\n const h = 1e-6;\n const xs = x.slice();\n xs[u] += h;\n const moved = fits.slice();\n moved[s] = fitSegment(sys, s, xs);\n const rs = residuals(sys, isClosed, moved);\n for (let e = 0; e < r.length; e++) jac[e][u] = (rs[e] - r[e]) / h;\n }\n }\n const step = solveLinear(jac, r.map((v) => -v));\n if (!step) break;\n // Halve the step until it lowers the error.\n let t = 1;\n let accepted = false;\n for (let tries = 0; tries < 12; tries++, t /= 2) {\n const xt = x.map((v, i) => v + t * step[i]);\n const ft = fitAll(xt);\n const rt = residuals(sys, isClosed, ft);\n if (norm(rt) < err) {\n x = xt; fits = ft; r = rt; accepted = true;\n break;\n }\n }\n if (!accepted) break;\n }\n return sys.ends.map((end, s) => ({\n from: { x: points[s].x, y: points[s].y },\n to: { x: points[end].x, y: points[end].y },\n spiral: sys.slot[s] < 0 ? null : fits[s].seg,\n }));\n}\n","/**\n * Spiro curves as cubic paths, and back. A solved curve is written as cubics,\n * each spiral segment split into as many as it takes to stay within tolerance,\n * so most anchors of the path are not spiro points. `at` records which are:\n * `at[i]` is the flat anchor index of point `i`, counted across subpaths. The\n * points are then read back out of the path itself, so whatever moves the path\n * — a move, a resize, a rotation — moves them with it.\n */\nimport type { PolygonPath } from '../path';\nimport { anchorsToPath, pathToAnchors, type PenAnchor } from './anchors';\nimport { eulerCubicError, eulerSegmentCubic, subEulerSegment, type EulerSegment } from './eulerSpiral';\nimport { solveSpiro, type SpiroKind, type SpiroPoint } from './spiro';\n\n/** One subpath of a spiro curve: its points, and whether it closes. */\nexport interface SpiroContour {\n points: SpiroPoint[];\n closed: boolean;\n}\n\n/** A spiro curve written as a cubic path, with the anchor each point became. */\nexport interface SpiroPath {\n path: PolygonPath;\n /** The flat anchor index of each point, in contour order. */\n at: number[];\n}\n\n/** Options for {@link spiroToPath}. */\nexport interface SpiroToPathOptions {\n /** The furthest a cubic may stray from its spiral, as a fraction of that\n * segment's arc length. Default `1e-4`. */\n tolerance?: number;\n /** The path being reshaped, whose fill rules the result keeps. */\n like?: PolygonPath;\n}\n\nconst MAX_PIECES = 16;\n\ninterface Piece { end: EulerSegment; c1: { x: number; y: number }; c2: { x: number; y: number } }\n\n/** `spiral` as the fewest equal pieces whose cubics all stay within `tol`. */\nfunction cubicPieces(spiral: EulerSegment, tol: number): Piece[] {\n let best: Piece[] = [];\n for (let m = 1; m <= MAX_PIECES; m++) {\n best = [];\n let fits = true;\n for (let j = 0; j < m; j++) {\n const piece = m === 1 ? spiral : subEulerSegment(spiral, j / m, (j + 1) / m);\n const { c1, c2 } = eulerSegmentCubic(piece);\n best.push({ end: piece, c1, c2 });\n if (eulerCubicError(piece, c1, c2) > tol * spiral.length) fits = false;\n }\n if (fits) break;\n }\n return best;\n}\n\nfunction contourAnchors(c: SpiroContour, tol: number): { anchors: PenAnchor[]; at: number[] } {\n const anchors: PenAnchor[] = [];\n const at: number[] = [];\n const segments = solveSpiro(c.points, c.closed);\n // The handle the last piece of a segment arrives with, for the point after it.\n let arriving: { x: number; y: number } | null = null;\n c.points.forEach((p, i) => {\n at.push(anchors.length);\n anchors.push({ x: p.x, y: p.y, ...(arriving ? { inHandle: arriving } : {}) });\n arriving = null;\n const spiral = segments[i]?.spiral;\n if (!spiral) return;\n const pieces = cubicPieces(spiral, tol);\n pieces.forEach((piece, j) => {\n anchors[anchors.length - 1].outHandle = { x: piece.c1.x, y: piece.c1.y };\n const c2 = { x: piece.c2.x, y: piece.c2.y };\n if (j < pieces.length - 1) anchors.push({ x: piece.end.p1.x, y: piece.end.p1.y, inHandle: c2 });\n else arriving = c2;\n });\n });\n if (arriving) anchors[0].inHandle = arriving;\n return { anchors, at };\n}\n\n/**\n * Solve each contour and write it as a cubic path. Straight segments carry no\n * handles.\n */\nexport function spiroToPath(contours: readonly SpiroContour[], options: SpiroToPathOptions = {}): SpiroPath {\n const tol = options.tolerance ?? 1e-4;\n const subs: PenAnchor[][] = [];\n const closed: boolean[] = [];\n const at: number[] = [];\n let base = 0;\n for (const c of contours) {\n if (c.points.length === 0) continue;\n const written = contourAnchors(c, tol);\n subs.push(written.anchors);\n closed.push(c.closed && c.points.length > 2);\n at.push(...written.at.map((i) => i + base));\n base += written.anchors.length;\n }\n return { path: anchorsToPath(subs, closed, options.like), at };\n}\n\n/**\n * The spiro points `path` holds, given the kind of each and the anchor each\n * became. Null when `kinds` and `at` do not describe `path`: the counts\n * differ, an index is out of order or out of range, or a subpath does not\n * start on a point.\n */\nexport function spiroContoursOf(\n path: PolygonPath,\n kinds: readonly SpiroKind[],\n at: readonly number[],\n): SpiroContour[] | null {\n if (kinds.length !== at.length || at.length === 0) return null;\n const { anchors, closed } = pathToAnchors(path);\n const contours: SpiroContour[] = [];\n let flat = 0;\n let k = 0;\n for (let s = 0; s < anchors.length; s++) {\n const sub = anchors[s];\n if (at[k] !== flat) return null;\n const points: SpiroPoint[] = [];\n while (k < at.length && at[k] < flat + sub.length) {\n if (k > 0 && at[k] <= at[k - 1]) return null;\n const a = sub[at[k] - flat];\n points.push({ x: a.x, y: a.y, kind: kinds[k] });\n k++;\n }\n contours.push({ points, closed: closed[s] });\n flat += sub.length;\n }\n return k === at.length ? contours : null;\n}\n\n/** The straight-sided path through each contour's points: what an editor\n * shows and moves in place of the curve. */\nexport function spiroControlPath(contours: readonly SpiroContour[]): PolygonPath {\n return anchorsToPath(\n contours.map((c) => c.points.map((p) => ({ x: p.x, y: p.y }))),\n contours.map((c) => c.closed),\n );\n}\n\nconst key = (x: number, y: number): string => `${Math.round(x * 1e3)},${Math.round(y * 1e3)}`;\n\n/**\n * Read an edited control path back as contours: every anchor is a point.\n * Kinds follow from `before`, the contours the edit started from: point for\n * point when the count is unchanged, else by position, with an anchor that\n * lands nowhere a point was taking `fallback`. Handles are ignored.\n */\nexport function spiroContoursFromControl(\n control: PolygonPath,\n before: readonly SpiroContour[],\n fallback: SpiroKind = 'smooth',\n): SpiroContour[] {\n const { anchors, closed } = pathToAnchors(control);\n const old = before.flatMap((c) => c.points);\n const count = anchors.reduce((n, sub) => n + sub.length, 0);\n const byPlace = new Map<string, SpiroKind>();\n for (const p of old) if (!byPlace.has(key(p.x, p.y))) byPlace.set(key(p.x, p.y), p.kind);\n let i = 0;\n return anchors.map((sub, s) => ({\n closed: closed[s],\n points: sub.map((a) => {\n const kind = count === old.length ? old[i].kind : byPlace.get(key(a.x, a.y)) ?? fallback;\n i++;\n return { x: a.x, y: a.y, kind };\n }),\n }));\n}\n"]}
|
|
@@ -165,11 +165,76 @@ function splitLineAt(x0, y0, x1, y1, t) {
|
|
|
165
165
|
return [[x0, y0, mx, my], [mx, my, x1, y1]];
|
|
166
166
|
}
|
|
167
167
|
|
|
168
|
+
// src/paths/pathOrigin.ts
|
|
169
|
+
var ZERO = Object.freeze({ x: 0, y: 0 });
|
|
170
|
+
function originOf(path) {
|
|
171
|
+
return path.origin ?? ZERO;
|
|
172
|
+
}
|
|
173
|
+
function pathPoint(path, i) {
|
|
174
|
+
const o = originOf(path);
|
|
175
|
+
return { x: o.x + path.coords[2 * i], y: o.y + path.coords[2 * i + 1] };
|
|
176
|
+
}
|
|
177
|
+
function worldCoords(path) {
|
|
178
|
+
return path.origin ? addOrigin(path, Float64Array.from(path.coords)) : path.coords;
|
|
179
|
+
}
|
|
180
|
+
function addOrigin(path, xy) {
|
|
181
|
+
const o = path.origin;
|
|
182
|
+
if (o === void 0) return xy;
|
|
183
|
+
for (let i = 0; i + 1 < xy.length; i += 2) {
|
|
184
|
+
xy[i] += o.x;
|
|
185
|
+
xy[i + 1] += o.y;
|
|
186
|
+
}
|
|
187
|
+
return xy;
|
|
188
|
+
}
|
|
189
|
+
function coordsFrom(origin, world) {
|
|
190
|
+
const ox = origin?.x ?? 0, oy = origin?.y ?? 0;
|
|
191
|
+
const out = new Float32Array(world.length);
|
|
192
|
+
for (let i = 0; i + 1 < world.length; i += 2) {
|
|
193
|
+
out[i] = world[i] - ox;
|
|
194
|
+
out[i + 1] = world[i + 1] - oy;
|
|
195
|
+
}
|
|
196
|
+
return out;
|
|
197
|
+
}
|
|
198
|
+
var ORIGIN_THRESHOLD = 16384;
|
|
199
|
+
function originFor(xy) {
|
|
200
|
+
let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;
|
|
201
|
+
for (let i = 0; i + 1 < xy.length; i += 2) {
|
|
202
|
+
const x = xy[i], y = xy[i + 1];
|
|
203
|
+
if (x < minX) minX = x;
|
|
204
|
+
if (x > maxX) maxX = x;
|
|
205
|
+
if (y < minY) minY = y;
|
|
206
|
+
if (y > maxY) maxY = y;
|
|
207
|
+
}
|
|
208
|
+
const reach = Math.max(Math.abs(minX), Math.abs(maxX), Math.abs(minY), Math.abs(maxY));
|
|
209
|
+
if (!(reach >= ORIGIN_THRESHOLD) || !Number.isFinite(reach)) return void 0;
|
|
210
|
+
return { x: Math.round((minX + maxX) / 2), y: Math.round((minY + maxY) / 2) };
|
|
211
|
+
}
|
|
212
|
+
function joinPaths(parts) {
|
|
213
|
+
let nc = 0, nk = 0;
|
|
214
|
+
for (const p of parts) {
|
|
215
|
+
nc += p.commands.length;
|
|
216
|
+
nk += p.coords.length;
|
|
217
|
+
}
|
|
218
|
+
const origin = parts[0]?.origin;
|
|
219
|
+
const commands = new Uint8Array(nc);
|
|
220
|
+
const coords = new Float32Array(nk);
|
|
221
|
+
let ci = 0, ki = 0;
|
|
222
|
+
for (const p of parts) {
|
|
223
|
+
commands.set(p.commands, ci);
|
|
224
|
+
ci += p.commands.length;
|
|
225
|
+
coords.set(p.origin === origin ? p.coords : coordsFrom(origin, worldCoords(p)), ki);
|
|
226
|
+
ki += p.coords.length;
|
|
227
|
+
}
|
|
228
|
+
return { kind: "polygon", commands, coords, fillRule: "nonzero", ...origin ? { origin } : {} };
|
|
229
|
+
}
|
|
230
|
+
|
|
168
231
|
// src/paths/builder.ts
|
|
169
232
|
var PathBuilder = class _PathBuilder {
|
|
170
233
|
cmds = [];
|
|
171
234
|
xs = [];
|
|
172
235
|
fillRule = "nonzero";
|
|
236
|
+
origin;
|
|
237
|
+
auto = false;
|
|
173
238
|
/** Seed a builder with an existing `PolygonPath`. Useful for extending
|
|
174
239
|
* an in-flight path with another segment (e.g. appending a cubic to
|
|
175
240
|
* the end of a curve in response to a user action) without hand-
|
|
@@ -184,32 +249,64 @@ var PathBuilder = class _PathBuilder {
|
|
|
184
249
|
b.cmds = Array.from(path.commands);
|
|
185
250
|
b.xs = Array.from(path.coords);
|
|
186
251
|
b.fillRule = path.fillRule;
|
|
252
|
+
if (path.origin) b.origin = { x: path.origin.x, y: path.origin.y };
|
|
187
253
|
return b;
|
|
188
254
|
}
|
|
255
|
+
/**
|
|
256
|
+
* Measure the coords from `(x, y)`, which the built path carries as its
|
|
257
|
+
* `origin`: every point given before or after this call is still in the
|
|
258
|
+
* path's own space, and is stored as its offset from the origin, taken in
|
|
259
|
+
* doubles. Far from 0, an origin beside the shape is what keeps its
|
|
260
|
+
* coordinates' fractions.
|
|
261
|
+
*/
|
|
262
|
+
setOrigin(x, y) {
|
|
263
|
+
const ox = this.origin?.x ?? 0;
|
|
264
|
+
const oy = this.origin?.y ?? 0;
|
|
265
|
+
for (let i = 0; i < this.xs.length; i += 2) {
|
|
266
|
+
this.xs[i] += ox - x;
|
|
267
|
+
this.xs[i + 1] += oy - y;
|
|
268
|
+
}
|
|
269
|
+
this.origin = x === 0 && y === 0 ? void 0 : { x, y };
|
|
270
|
+
return this;
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* At `build`, if no origin was set, measure the coords from the one
|
|
274
|
+
* `originFor` picks for them: none while they stay within
|
|
275
|
+
* `ORIGIN_THRESHOLD` of 0. For a producer whose points may land far out.
|
|
276
|
+
*/
|
|
277
|
+
autoOrigin() {
|
|
278
|
+
this.auto = true;
|
|
279
|
+
return this;
|
|
280
|
+
}
|
|
281
|
+
push(...pts) {
|
|
282
|
+
const ox = this.origin?.x ?? 0;
|
|
283
|
+
const oy = this.origin?.y ?? 0;
|
|
284
|
+
for (let i = 0; i < pts.length; i += 2) this.xs.push(pts[i] - ox, pts[i + 1] - oy);
|
|
285
|
+
}
|
|
189
286
|
setFillRule(rule) {
|
|
190
287
|
this.fillRule = rule;
|
|
191
288
|
return this;
|
|
192
289
|
}
|
|
193
290
|
moveTo(x, y) {
|
|
194
291
|
this.cmds.push(PATH_M);
|
|
195
|
-
this.
|
|
292
|
+
this.push(x, y);
|
|
196
293
|
return this;
|
|
197
294
|
}
|
|
198
295
|
lineTo(x, y) {
|
|
199
296
|
this.cmds.push(PATH_L);
|
|
200
|
-
this.
|
|
297
|
+
this.push(x, y);
|
|
201
298
|
return this;
|
|
202
299
|
}
|
|
203
300
|
/** Cubic bezier to (x, y) with control points (x1, y1) and (x2, y2). */
|
|
204
301
|
curveTo(x1, y1, x2, y2, x, y) {
|
|
205
302
|
this.cmds.push(PATH_C);
|
|
206
|
-
this.
|
|
303
|
+
this.push(x1, y1, x2, y2, x, y);
|
|
207
304
|
return this;
|
|
208
305
|
}
|
|
209
306
|
/** Quadratic bezier to (x, y) with control point (x1, y1). */
|
|
210
307
|
quadTo(x1, y1, x, y) {
|
|
211
308
|
this.cmds.push(PATH_Q);
|
|
212
|
-
this.
|
|
309
|
+
this.push(x1, y1, x, y);
|
|
213
310
|
return this;
|
|
214
311
|
}
|
|
215
312
|
close() {
|
|
@@ -217,11 +314,16 @@ var PathBuilder = class _PathBuilder {
|
|
|
217
314
|
return this;
|
|
218
315
|
}
|
|
219
316
|
build() {
|
|
317
|
+
if (this.auto && !this.origin) {
|
|
318
|
+
const o = originFor(this.xs);
|
|
319
|
+
if (o) this.setOrigin(o.x, o.y);
|
|
320
|
+
}
|
|
220
321
|
return {
|
|
221
322
|
kind: "polygon",
|
|
222
323
|
commands: new Uint8Array(this.cmds),
|
|
223
324
|
coords: new Float32Array(this.xs),
|
|
224
|
-
fillRule: this.fillRule
|
|
325
|
+
fillRule: this.fillRule,
|
|
326
|
+
...this.origin ? { origin: { ...this.origin } } : {}
|
|
225
327
|
};
|
|
226
328
|
}
|
|
227
329
|
};
|
|
@@ -381,6 +483,6 @@ function splitCubicAtT(p0, p1, p2, p3, t) {
|
|
|
381
483
|
return { left: quad(l), right: quad(r) };
|
|
382
484
|
}
|
|
383
485
|
|
|
384
|
-
export { PATH_C, PATH_CMD_LENGTHS, PATH_COMMANDS, PATH_L, PATH_M, PATH_Q, PATH_Z, PathBuilder, asPolygonPath, boundsOfCoords, boxContainsBox, boxContainsPoint, compactCorners, cornerAt, cornerSpecAt, cubicAxisExtremaTs, cubicBounds, cubicEvalAt, cubicPointAt, elevateQuadraticToCubic, ellipsePath, forEachSegment, hasCorners, lerpCorners, linePath, pathCommandCoordCount, polygonFromPoints, polylineFromPoints, quadraticEvalAt, rectPath, rectToContour, regularPolygonPath, scaleCorners, splitCubicAt, splitCubicAtT, splitLineAt, splitQuadraticAt, starPath, unionBox, withCorner, withoutCorners };
|
|
385
|
-
//# sourceMappingURL=chunk-
|
|
386
|
-
//# sourceMappingURL=chunk-
|
|
486
|
+
export { ORIGIN_THRESHOLD, PATH_C, PATH_CMD_LENGTHS, PATH_COMMANDS, PATH_L, PATH_M, PATH_Q, PATH_Z, PathBuilder, addOrigin, asPolygonPath, boundsOfCoords, boxContainsBox, boxContainsPoint, compactCorners, coordsFrom, cornerAt, cornerSpecAt, cubicAxisExtremaTs, cubicBounds, cubicEvalAt, cubicPointAt, elevateQuadraticToCubic, ellipsePath, forEachSegment, hasCorners, joinPaths, lerpCorners, linePath, originFor, originOf, pathCommandCoordCount, pathPoint, polygonFromPoints, polylineFromPoints, quadraticEvalAt, rectPath, rectToContour, regularPolygonPath, scaleCorners, splitCubicAt, splitCubicAtT, splitLineAt, splitQuadraticAt, starPath, unionBox, withCorner, withoutCorners, worldCoords };
|
|
487
|
+
//# sourceMappingURL=chunk-B3D6KWW3.js.map
|
|
488
|
+
//# sourceMappingURL=chunk-B3D6KWW3.js.map
|