modern-path2d 1.2.11 → 1.2.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1857,26 +1857,20 @@ class RoundCurve extends Curve {
1857
1857
  isClockwise() {
1858
1858
  return this.clockwise;
1859
1859
  }
1860
- getPoint(t, output = new Vector2()) {
1861
- const twoPi = Math.PI * 2;
1860
+ _getDeltaAngle() {
1861
+ const PI_2 = Math.PI * 2;
1862
1862
  let deltaAngle = this.endAngle - this.startAngle;
1863
1863
  const samePoints = Math.abs(deltaAngle) < Number.EPSILON;
1864
- while (deltaAngle < 0) deltaAngle += twoPi;
1865
- while (deltaAngle > twoPi) deltaAngle -= twoPi;
1866
- if (deltaAngle < Number.EPSILON) {
1867
- if (samePoints) {
1868
- deltaAngle = 0;
1869
- } else {
1870
- deltaAngle = twoPi;
1871
- }
1872
- }
1873
- if (this.clockwise && !samePoints) {
1874
- if (deltaAngle === twoPi) {
1875
- deltaAngle = -twoPi;
1876
- } else {
1877
- deltaAngle = deltaAngle - twoPi;
1878
- }
1864
+ deltaAngle = (deltaAngle % PI_2 + PI_2) % PI_2;
1865
+ if (samePoints) {
1866
+ deltaAngle = 0;
1867
+ } else if (!this.clockwise) {
1868
+ deltaAngle = deltaAngle === 0 ? -PI_2 : deltaAngle - PI_2;
1879
1869
  }
1870
+ return deltaAngle;
1871
+ }
1872
+ getPoint(t, output = new Vector2()) {
1873
+ const deltaAngle = this._getDeltaAngle();
1880
1874
  const angle = this.startAngle + t * deltaAngle;
1881
1875
  let _x = this.cx + this.rx * Math.cos(angle);
1882
1876
  let _y = this.cy + this.ry * Math.sin(angle);
@@ -1946,75 +1940,21 @@ class RoundCurve extends Curve {
1946
1940
  return [this._center];
1947
1941
  }
1948
1942
  getAdaptivePointArray(output = []) {
1949
- const { cx, cy, rx, ry, dx, dy } = this;
1943
+ const { cx, cy, rx, ry, dx, dy, startAngle } = this;
1950
1944
  if (!(rx >= 0 && ry >= 0 && dx >= 0 && dy >= 0)) {
1951
1945
  return output;
1952
1946
  }
1953
- const n = Math.ceil(2.3 * Math.sqrt(rx + ry));
1954
- const m = n * 8 + (dx ? 4 : 0) + (dy ? 4 : 0);
1955
- if (m === 0) {
1956
- return output;
1957
- }
1947
+ const PI_2 = Math.PI * 2;
1948
+ const deltaAngle = this._getDeltaAngle();
1949
+ const arcLengthFactor = Math.abs(deltaAngle) / PI_2;
1950
+ const n = Math.ceil(2.3 * Math.sqrt(rx + ry) * arcLengthFactor);
1958
1951
  const array = [];
1959
- if (n === 0) {
1960
- array[0] = array[6] = cx + dx;
1961
- array[1] = array[3] = cy + dy;
1962
- array[2] = array[4] = cx - dx;
1963
- array[5] = array[7] = cy - dy;
1964
- } else {
1965
- let j1 = 0;
1966
- let j2 = n * 4 + (dx ? 2 : 0) + 2;
1967
- let j3 = j2;
1968
- let j4 = m;
1969
- let x0 = dx + rx;
1970
- let y0 = dy;
1971
- let x1 = cx + x0;
1972
- let x2 = cx - x0;
1973
- let y1 = cy + y0;
1974
- array[j1++] = x1;
1975
- array[j1++] = y1;
1976
- array[--j2] = y1;
1977
- array[--j2] = x2;
1978
- if (dy) {
1979
- const y22 = cy - y0;
1980
- array[j3++] = x2;
1981
- array[j3++] = y22;
1982
- array[--j4] = y22;
1983
- array[--j4] = x1;
1984
- }
1985
- for (let i = 1; i < n; i++) {
1986
- const a = Math.PI / 2 * (i / n);
1987
- const x02 = dx + Math.cos(a) * rx;
1988
- const y02 = dy + Math.sin(a) * ry;
1989
- const x12 = cx + x02;
1990
- const x22 = cx - x02;
1991
- const y12 = cy + y02;
1992
- const y22 = cy - y02;
1993
- array[j1++] = x12;
1994
- array[j1++] = y12;
1995
- array[--j2] = y12;
1996
- array[--j2] = x22;
1997
- array[j3++] = x22;
1998
- array[j3++] = y22;
1999
- array[--j4] = y22;
2000
- array[--j4] = x12;
2001
- }
2002
- x0 = dx;
2003
- y0 = dy + ry;
2004
- x1 = cx + x0;
2005
- x2 = cx - x0;
2006
- y1 = cy + y0;
2007
- const y2 = cy - y0;
2008
- array[j1++] = x1;
2009
- array[j1++] = y1;
2010
- array[--j4] = y2;
2011
- array[--j4] = x1;
2012
- if (dx) {
2013
- array[j1++] = x2;
2014
- array[j1++] = y1;
2015
- array[--j4] = y2;
2016
- array[--j4] = x2;
2017
- }
1952
+ for (let i = 0; i <= n; i++) {
1953
+ const t = i / n;
1954
+ const angle = startAngle + t * deltaAngle;
1955
+ const x = cx + dx + Math.cos(angle) * rx;
1956
+ const y = cy + dy + Math.sin(angle) * ry;
1957
+ array.push(x, y);
2018
1958
  }
2019
1959
  Array.prototype.push.apply(output, array);
2020
1960
  return output;
@@ -2327,14 +2267,29 @@ class CompositeCurve extends Curve {
2327
2267
  getControlPointRefs() {
2328
2268
  return this.curves.flatMap((curve) => curve.getControlPointRefs());
2329
2269
  }
2270
+ _removeNextPointIfEqualPrevPoint(output, offset) {
2271
+ if (output[offset - 1] === output[offset + 1] && output[offset] === output[offset + 2]) {
2272
+ output.splice(offset + 1, 2);
2273
+ }
2274
+ return output;
2275
+ }
2276
+ getSpacedPointArray(count = 5, output = []) {
2277
+ let offset;
2278
+ this.curves.forEach((curve) => {
2279
+ curve.getSpacedPointArray(count, output);
2280
+ if (offset) {
2281
+ this._removeNextPointIfEqualPrevPoint(output, offset);
2282
+ }
2283
+ offset = output.length - 1;
2284
+ });
2285
+ return output;
2286
+ }
2330
2287
  getAdaptivePointArray(output = []) {
2331
2288
  let offset;
2332
2289
  this.curves.forEach((curve) => {
2333
2290
  curve.getAdaptivePointArray(output);
2334
2291
  if (offset) {
2335
- if (output[offset - 1] === output[offset + 1] && output[offset] === output[offset + 2]) {
2336
- output.splice(offset + 1, 2);
2337
- }
2292
+ this._removeNextPointIfEqualPrevPoint(output, offset);
2338
2293
  }
2339
2294
  offset = output.length - 1;
2340
2295
  });
@@ -2870,19 +2825,56 @@ class CurvePath extends CompositeCurve {
2870
2825
  this.addCommands(svgPathDataToCommands(data));
2871
2826
  return this;
2872
2827
  }
2873
- getUnevenPointArray(count = 40, output = []) {
2874
- super.getUnevenPointArray(count, output);
2828
+ _closePointArray(output) {
2875
2829
  if (this.autoClose && output.length >= 4 && (output[0] !== output[output.length - 2] && output[1] !== output[output.length - 1])) {
2876
2830
  output.push(output[0], output[1]);
2877
2831
  }
2878
2832
  return output;
2879
2833
  }
2834
+ getUnevenPointArray(count = 40, output = []) {
2835
+ return this._closePointArray(
2836
+ super.getUnevenPointArray(count, output)
2837
+ );
2838
+ }
2880
2839
  getSpacedPointArray(count = 40, output = []) {
2881
- super.getSpacedPointArray(count, output);
2882
- if (this.autoClose && output.length >= 4 && (output[0] !== output[output.length - 2] && output[1] !== output[output.length - 1])) {
2883
- output.push(output[0], output[1]);
2884
- }
2885
- return output;
2840
+ return this._closePointArray(
2841
+ super.getSpacedPointArray(count, output)
2842
+ );
2843
+ }
2844
+ getAdaptivePointArray(output = []) {
2845
+ return this._closePointArray(
2846
+ super.getAdaptivePointArray(output)
2847
+ );
2848
+ }
2849
+ fillTriangulate(options) {
2850
+ const indices = options?.indices ?? [];
2851
+ const vertices = options?.vertices ?? [];
2852
+ const result = { vertices, indices };
2853
+ this.curves.forEach((curve) => {
2854
+ const { vertices: vertices2, indices: indices2 } = curve.fillTriangulate({
2855
+ ...options,
2856
+ indices: [],
2857
+ vertices: []
2858
+ });
2859
+ result.vertices = result.vertices.concat(vertices2);
2860
+ result.indices = result.indices.concat(indices2);
2861
+ });
2862
+ return result;
2863
+ }
2864
+ strokeTriangulate(options) {
2865
+ const indices = options?.indices ?? [];
2866
+ const vertices = options?.vertices ?? [];
2867
+ const result = { vertices, indices };
2868
+ this.curves.forEach((curve) => {
2869
+ const { vertices: vertices2, indices: indices2 } = curve.strokeTriangulate({
2870
+ ...options,
2871
+ indices: [],
2872
+ vertices: []
2873
+ });
2874
+ result.vertices = result.vertices.concat(vertices2);
2875
+ result.indices = result.indices.concat(indices2);
2876
+ });
2877
+ return result;
2886
2878
  }
2887
2879
  _setCurrentPoint(point) {
2888
2880
  this.currentPoint = new Vector2(point.x, point.y);
@@ -2905,7 +2897,7 @@ class CurvePath extends CompositeCurve {
2905
2897
  if (start) {
2906
2898
  const end = this.currentPoint;
2907
2899
  if (end && !start.equals(end)) {
2908
- this.curves.push(new LineCurve(end, start));
2900
+ this.curves.push(new LineCurve(end.clone(), start.clone()));
2909
2901
  end.copy(start);
2910
2902
  }
2911
2903
  this.startPoint = undefined;
package/dist/index.d.cts CHANGED
@@ -190,6 +190,7 @@ declare class RoundCurve extends Curve {
190
190
  set dy(val: number);
191
191
  constructor(_center?: Vector2, _radius?: Vector2, _diff?: Vector2, rotate?: number, startAngle?: number, endAngle?: number, clockwise?: boolean);
192
192
  isClockwise(): boolean;
193
+ protected _getDeltaAngle(): number;
193
194
  getPoint(t: number, output?: Vector2): Vector2;
194
195
  toCommands(): Path2DCommand[];
195
196
  drawTo(ctx: CanvasRenderingContext2D): this;
@@ -218,6 +219,8 @@ declare class CompositeCurve<T extends Curve = Curve> extends Curve {
218
219
  getPoint(t: number, output?: Vector2): Vector2;
219
220
  updateLengths(): void;
220
221
  getControlPointRefs(): Vector2[];
222
+ protected _removeNextPointIfEqualPrevPoint(output: number[], offset: number): number[];
223
+ getSpacedPointArray(count?: number, output?: number[]): number[];
221
224
  getAdaptivePointArray(output?: number[]): number[];
222
225
  applyTransform(transform: Matrix3): this;
223
226
  getMinMax(min?: Vector2, max?: Vector2): {
@@ -400,8 +403,12 @@ declare class CurvePath extends CompositeCurve {
400
403
  addPoints(points: Vector2[]): this;
401
404
  addCommands(commands: Path2DCommand[]): this;
402
405
  addData(data: string): this;
406
+ protected _closePointArray(output: number[]): number[];
403
407
  getUnevenPointArray(count?: number, output?: number[]): number[];
404
408
  getSpacedPointArray(count?: number, output?: number[]): number[];
409
+ getAdaptivePointArray(output?: number[]): number[];
410
+ fillTriangulate(options?: FillTriangulateOptions): FillTriangulateResult;
411
+ strokeTriangulate(options?: StrokeTriangulateOptions): StrokeTriangulateResult;
405
412
  protected _setCurrentPoint(point: VectorLike): this;
406
413
  protected _connetLineTo(curve: Curve): this;
407
414
  closePath(): this;
package/dist/index.d.mts CHANGED
@@ -190,6 +190,7 @@ declare class RoundCurve extends Curve {
190
190
  set dy(val: number);
191
191
  constructor(_center?: Vector2, _radius?: Vector2, _diff?: Vector2, rotate?: number, startAngle?: number, endAngle?: number, clockwise?: boolean);
192
192
  isClockwise(): boolean;
193
+ protected _getDeltaAngle(): number;
193
194
  getPoint(t: number, output?: Vector2): Vector2;
194
195
  toCommands(): Path2DCommand[];
195
196
  drawTo(ctx: CanvasRenderingContext2D): this;
@@ -218,6 +219,8 @@ declare class CompositeCurve<T extends Curve = Curve> extends Curve {
218
219
  getPoint(t: number, output?: Vector2): Vector2;
219
220
  updateLengths(): void;
220
221
  getControlPointRefs(): Vector2[];
222
+ protected _removeNextPointIfEqualPrevPoint(output: number[], offset: number): number[];
223
+ getSpacedPointArray(count?: number, output?: number[]): number[];
221
224
  getAdaptivePointArray(output?: number[]): number[];
222
225
  applyTransform(transform: Matrix3): this;
223
226
  getMinMax(min?: Vector2, max?: Vector2): {
@@ -400,8 +403,12 @@ declare class CurvePath extends CompositeCurve {
400
403
  addPoints(points: Vector2[]): this;
401
404
  addCommands(commands: Path2DCommand[]): this;
402
405
  addData(data: string): this;
406
+ protected _closePointArray(output: number[]): number[];
403
407
  getUnevenPointArray(count?: number, output?: number[]): number[];
404
408
  getSpacedPointArray(count?: number, output?: number[]): number[];
409
+ getAdaptivePointArray(output?: number[]): number[];
410
+ fillTriangulate(options?: FillTriangulateOptions): FillTriangulateResult;
411
+ strokeTriangulate(options?: StrokeTriangulateOptions): StrokeTriangulateResult;
405
412
  protected _setCurrentPoint(point: VectorLike): this;
406
413
  protected _connetLineTo(curve: Curve): this;
407
414
  closePath(): this;
package/dist/index.d.ts CHANGED
@@ -190,6 +190,7 @@ declare class RoundCurve extends Curve {
190
190
  set dy(val: number);
191
191
  constructor(_center?: Vector2, _radius?: Vector2, _diff?: Vector2, rotate?: number, startAngle?: number, endAngle?: number, clockwise?: boolean);
192
192
  isClockwise(): boolean;
193
+ protected _getDeltaAngle(): number;
193
194
  getPoint(t: number, output?: Vector2): Vector2;
194
195
  toCommands(): Path2DCommand[];
195
196
  drawTo(ctx: CanvasRenderingContext2D): this;
@@ -218,6 +219,8 @@ declare class CompositeCurve<T extends Curve = Curve> extends Curve {
218
219
  getPoint(t: number, output?: Vector2): Vector2;
219
220
  updateLengths(): void;
220
221
  getControlPointRefs(): Vector2[];
222
+ protected _removeNextPointIfEqualPrevPoint(output: number[], offset: number): number[];
223
+ getSpacedPointArray(count?: number, output?: number[]): number[];
221
224
  getAdaptivePointArray(output?: number[]): number[];
222
225
  applyTransform(transform: Matrix3): this;
223
226
  getMinMax(min?: Vector2, max?: Vector2): {
@@ -400,8 +403,12 @@ declare class CurvePath extends CompositeCurve {
400
403
  addPoints(points: Vector2[]): this;
401
404
  addCommands(commands: Path2DCommand[]): this;
402
405
  addData(data: string): this;
406
+ protected _closePointArray(output: number[]): number[];
403
407
  getUnevenPointArray(count?: number, output?: number[]): number[];
404
408
  getSpacedPointArray(count?: number, output?: number[]): number[];
409
+ getAdaptivePointArray(output?: number[]): number[];
410
+ fillTriangulate(options?: FillTriangulateOptions): FillTriangulateResult;
411
+ strokeTriangulate(options?: StrokeTriangulateOptions): StrokeTriangulateResult;
405
412
  protected _setCurrentPoint(point: VectorLike): this;
406
413
  protected _connetLineTo(curve: Curve): this;
407
414
  closePath(): this;
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- (function(v,R){typeof exports=="object"&&typeof module<"u"?R(exports):typeof define=="function"&&define.amd?define(["exports"],R):(v=typeof globalThis<"u"?globalThis:v||self,R(v.modernPath2d={}))})(this,function(v){"use strict";var En=Object.defineProperty;var Ln=(v,R,nt)=>R in v?En(v,R,{enumerable:!0,configurable:!0,writable:!0,value:nt}):v[R]=nt;var V=(v,R,nt)=>Ln(v,typeof R!="symbol"?R+"":R,nt);function R(i,e,t,n={}){const{radius:r=1}=n;i.moveTo(e,t),i.arc(e,t,r,0,Math.PI*2)}const nt={arcs:"bevel",bevel:"bevel",miter:"miter","miter-clip":"miter",round:"round"};function At(i,e){const{fill:t="#000",stroke:n="none",strokeWidth:r=n==="none"?0:1,strokeLinecap:o="round",strokeLinejoin:s="miter",strokeMiterlimit:h=0,strokeDasharray:c=[],strokeDashoffset:a=0,shadowOffsetX:l=0,shadowOffsetY:f=0,shadowBlur:y=0,shadowColor:x="rgba(0, 0, 0, 0)"}=e;i.fillStyle=t,i.strokeStyle=n,i.lineWidth=r,i.lineCap=o,i.lineJoin=nt[s],i.miterLimit=h,i.setLineDash(c),i.lineDashOffset=a,i.shadowOffsetX=l,i.shadowOffsetY=f,i.shadowBlur=y,i.shadowColor=x}class p{constructor(e=0,t=0){this.x=e,this.y=t}static get MAX(){return new p(1/0,1/0)}static get MIN(){return new p(-1/0,-1/0)}get array(){return[this.x,this.y]}set(e,t){return this.x=e,this.y=t,this}add(e){return this.x+=e.x,this.y+=e.y,this}sub(e){return this.x-=e.x,this.y-=e.y,this}multiply(e){return this.x*=e.x,this.y*=e.y,this}divide(e){return this.x/=e.x,this.y/=e.y,this}dot(e){return this.x*e.x+this.y*e.y}cross(e){return this.x*e.y-this.y*e.x}rotate(e,t={x:0,y:0}){const n=-e/180*Math.PI,r=this.x-t.x,o=-(this.y-t.y),s=Math.sin(n),h=Math.cos(n);return this.set(t.x+(r*h-o*s),t.y-(r*s+o*h)),this}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){const t=this.x-e.x,n=this.y-e.y;return t*t+n*n}lengthSquared(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.lengthSquared())}scale(e,t=e,n={x:0,y:0}){const r=e<0?n.x-this.x+n.x:this.x,o=t<0?n.y-this.y+n.y:this.y;return this.x=r*Math.abs(e),this.y=o*Math.abs(t),this}skew(e,t=0,n={x:0,y:0}){const r=this.x-n.x,o=this.y-n.y;return this.x=n.x+(r+Math.tan(e)*o),this.y=n.y+(o+Math.tan(t)*r),this}min(...e){return this.x=Math.min(this.x,...e.map(t=>t.x)),this.y=Math.min(this.y,...e.map(t=>t.y)),this}max(...e){return this.x=Math.max(this.x,...e.map(t=>t.x)),this.y=Math.max(this.y,...e.map(t=>t.y)),this}normalize(){return this.scale(1/(this.length()||1))}addVectors(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this}multiplyVectors(e,t){return this.x=e.x*t.x,this.y=e.y*t.y,this}divideVectors(e,t){return this.x=e.x/t.x,this.y=e.y/t.y,this}lerpVectors(e,t,n){return this.x=e.x+(t.x-e.x)*n,this.y=e.y+(t.y-e.y)*n,this}equals(e){return this.x===e.x&&this.y===e.y}applyMatrix3(e){const t=this.x,n=this.y,r=e.elements;return this.x=r[0]*t+r[3]*n+r[6],this.y=r[1]*t+r[4]*n+r[7],this}copy(e){return this.x=e.x,this.y=e.y,this}clone(){return new p(this.x,this.y)}}class G{constructor(e=0,t=0,n=0,r=0){this.left=e,this.top=t,this.width=n,this.height=r}get x(){return this.left}set x(e){this.left=e}get y(){return this.top}set y(e){this.top=e}get right(){return this.left+this.width}get bottom(){return this.top+this.height}get center(){return new p((this.left+this.right)/2,(this.top+this.bottom)/2)}get array(){return[this.left,this.top,this.width,this.height]}static from(...e){if(e.length===0)return new G;if(e.length===1)return e[0].clone();const t=e[0],n=e.slice(1).reduce((r,o)=>(r.left=Math.min(r.left,o.left),r.top=Math.min(r.top,o.top),r.right=Math.max(r.right,o.right),r.bottom=Math.max(r.bottom,o.bottom),r),{left:(t==null?void 0:t.left)??0,top:(t==null?void 0:t.top)??0,right:(t==null?void 0:t.right)??0,bottom:(t==null?void 0:t.bottom)??0});return new G(n.left,n.top,n.right-n.left,n.bottom-n.top)}translate(e,t){return this.left+=e,this.top+=t,this}copy(e){return this.left=e.left,this.top=e.top,this.width=e.width,this.height=e.height,this}clone(){return new G(this.left,this.top,this.width,this.height)}}class z{constructor(e=1,t=0,n=0,r=0,o=1,s=0,h=0,c=0,a=1){V(this,"elements",[]);this.set(e,t,n,r,o,s,h,c,a)}set(e,t,n,r,o,s,h,c,a){const l=this.elements;return l[0]=e,l[1]=r,l[2]=h,l[3]=t,l[4]=o,l[5]=c,l[6]=n,l[7]=s,l[8]=a,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(e){const t=this.elements,n=e.elements;return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t[6]=n[6],t[7]=n[7],t[8]=n[8],this}multiply(e){return this.multiplyMatrices(this,e)}premultiply(e){return this.multiplyMatrices(e,this)}multiplyMatrices(e,t){const n=e.elements,r=t.elements,o=this.elements,s=n[0],h=n[3],c=n[6],a=n[1],l=n[4],f=n[7],y=n[2],x=n[5],u=n[8],m=r[0],M=r[3],b=r[6],S=r[1],w=r[4],P=r[7],k=r[2],E=r[5],g=r[8];return o[0]=s*m+h*S+c*k,o[3]=s*M+h*w+c*E,o[6]=s*b+h*P+c*g,o[1]=a*m+l*S+f*k,o[4]=a*M+l*w+f*E,o[7]=a*b+l*P+f*g,o[2]=y*m+x*S+u*k,o[5]=y*M+x*w+u*E,o[8]=y*b+x*P+u*g,this}invert(){const e=this.elements,t=e[0],n=e[1],r=e[2],o=e[3],s=e[4],h=e[5],c=e[6],a=e[7],l=e[8],f=l*s-h*a,y=h*c-l*o,x=a*o-s*c,u=t*f+n*y+r*x;if(u===0)return this.set(0,0,0,0,0,0,0,0,0);const m=1/u;return e[0]=f*m,e[1]=(r*a-l*n)*m,e[2]=(h*n-r*s)*m,e[3]=y*m,e[4]=(l*t-r*c)*m,e[5]=(r*o-h*t)*m,e[6]=x*m,e[7]=(n*c-a*t)*m,e[8]=(s*t-n*o)*m,this}transpose(){let e;const t=this.elements;return e=t[1],t[1]=t[3],t[3]=e,e=t[2],t[2]=t[6],t[6]=e,e=t[5],t[5]=t[7],t[7]=e,this}scale(e,t){return this.premultiply(bt.makeScale(e,t)),this}rotate(e){return this.premultiply(bt.makeRotation(-e)),this}translate(e,t){return this.premultiply(bt.makeTranslation(e,t)),this}makeTranslation(e,t){return this.set(1,0,e,0,1,t,0,0,1),this}makeRotation(e){const t=Math.cos(e),n=Math.sin(e);return this.set(t,-n,0,n,t,0,0,0,1),this}makeScale(e,t){return this.set(e,0,0,0,t,0,0,0,1),this}fromArray(e,t=0){for(let n=0;n<9;n++)this.elements[n]=e[n+t];return this}clone(){return new this.constructor().fromArray(this.elements)}}const bt=new z;function zt(i,e,t,n){const r=i*t+e*n,o=Math.sqrt(i*i+e*e)*Math.sqrt(t*t+n*n);let s=Math.acos(Math.max(-1,Math.min(1,r/o)));return i*n-e*t<0&&(s=-s),s}function Zt(i,e,t,n,r,o,s,h){if(e===0||t===0){i.lineTo(h.x,h.y);return}n=n*Math.PI/180,e=Math.abs(e),t=Math.abs(t);const c=(s.x-h.x)/2,a=(s.y-h.y)/2,l=Math.cos(n)*c+Math.sin(n)*a,f=-Math.sin(n)*c+Math.cos(n)*a;let y=e*e,x=t*t;const u=l*l,m=f*f,M=u/y+m/x;if(M>1){const q=Math.sqrt(M);e=q*e,t=q*t,y=e*e,x=t*t}const b=y*m+x*u,S=(y*x-b)/b;let w=Math.sqrt(Math.max(0,S));r===o&&(w=-w);const P=w*e*f/t,k=-w*t*l/e,E=Math.cos(n)*P-Math.sin(n)*k+(s.x+h.x)/2,g=Math.sin(n)*P+Math.cos(n)*k+(s.y+h.y)/2,d=zt(1,0,(l-P)/e,(f-k)/t),F=zt((l-P)/e,(f-k)/t,(-l-P)/e,(-f-k)/t)%(Math.PI*2);i.ellipse(E,g,e,t,n,d,d+F,o===0)}const D={SEPARATOR:/[ \t\r\n,.\-+]/,WHITESPACE:/[ \t\r\n]/,DIGIT:/\d/,SIGN:/[-+]/,POINT:/\./,COMMA:/,/,EXP:/e/i,FLAGS:/[01]/};function Z(i,e,t=0){let h=0,c=!0,a="",l="";const f=[];function y(M,b,S){const w=new SyntaxError(`Unexpected character "${M}" at index ${b}.`);throw w.partial=S,w}function x(){a!==""&&(l===""?f.push(Number(a)):f.push(Number(a)*10**Number(l))),a="",l=""}let u;const m=i.length;for(let M=0;M<m;M++){if(u=i[M],Array.isArray(e)&&e.includes(f.length%t)&&D.FLAGS.test(u)){h=1,a=u,x();continue}if(h===0){if(D.WHITESPACE.test(u))continue;if(D.DIGIT.test(u)||D.SIGN.test(u)){h=1,a=u;continue}if(D.POINT.test(u)){h=2,a=u;continue}D.COMMA.test(u)&&(c&&y(u,M,f),c=!0)}if(h===1){if(D.DIGIT.test(u)){a+=u;continue}if(D.POINT.test(u)){a+=u,h=2;continue}if(D.EXP.test(u)){h=3;continue}D.SIGN.test(u)&&a.length===1&&D.SIGN.test(a[0])&&y(u,M,f)}if(h===2){if(D.DIGIT.test(u)){a+=u;continue}if(D.EXP.test(u)){h=3;continue}D.POINT.test(u)&&a[a.length-1]==="."&&y(u,M,f)}if(h===3){if(D.DIGIT.test(u)){l+=u;continue}if(D.SIGN.test(u)){if(l===""){l+=u;continue}l.length===1&&D.SIGN.test(l)&&y(u,M,f)}}D.WHITESPACE.test(u)?(x(),h=0,c=!1):D.COMMA.test(u)?(x(),h=0,c=!0):D.SIGN.test(u)?(x(),h=1,a=u):D.POINT.test(u)?(x(),h=2,a=u):y(u,M,f)}return x(),f}function st(i,e){return i-(e-i)}function kt(i,e){const t=new p,n=new p;for(let r=0,o=i.length;r<o;r++){const s=i[r];if(s.type==="m"||s.type==="M")s.type==="m"?t.add(s):t.copy(s),e.moveTo(t.x,t.y),n.copy(t);else if(s.type==="h"||s.type==="H")s.type==="h"?t.x+=s.x:t.x=s.x,e.lineTo(t.x,t.y),n.copy(t);else if(s.type==="v"||s.type==="V")s.type==="v"?t.y+=s.y:t.y=s.y,e.lineTo(t.x,t.y),n.copy(t);else if(s.type==="l"||s.type==="L")s.type==="l"?t.add(s):t.copy(s),e.lineTo(t.x,t.y),n.copy(t);else if(s.type==="c"||s.type==="C")s.type==="c"?(e.bezierCurveTo(t.x+s.x1,t.y+s.y1,t.x+s.x2,t.y+s.y2,t.x+s.x,t.y+s.y),n.x=t.x+s.x2,n.y=t.y+s.y2,t.add(s)):(e.bezierCurveTo(s.x1,s.y1,s.x2,s.y2,s.x,s.y),n.x=s.x2,n.y=s.y2,t.copy(s));else if(s.type==="s"||s.type==="S")s.type==="s"?(e.bezierCurveTo(st(t.x,n.x),st(t.y,n.y),t.x+s.x2,t.y+s.y2,t.x+s.x,t.y+s.y),n.x=t.x+s.x2,n.y=t.y+s.y2,t.add(s)):(e.bezierCurveTo(st(t.x,n.x),st(t.y,n.y),s.x2,s.y2,s.x,s.y),n.x=s.x2,n.y=s.y2,t.copy(s));else if(s.type==="q"||s.type==="Q")s.type==="q"?(e.quadraticCurveTo(t.x+s.x1,t.y+s.y1,t.x+s.x,t.y+s.y),n.x=t.x+s.x1,n.y=t.y+s.y1,t.add(s)):(e.quadraticCurveTo(s.x1,s.y1,s.x,s.y),n.x=s.x1,n.y=s.y1,t.copy(s));else if(s.type==="t"||s.type==="T"){const h=st(t.x,n.x),c=st(t.y,n.y);n.x=h,n.y=c,s.type==="t"?(e.quadraticCurveTo(h,c,t.x+s.x,t.y+s.y),t.add(s)):(e.quadraticCurveTo(h,c,s.x,s.y),t.copy(s))}else if(s.type==="a"||s.type==="A"){const h=t.clone();if(s.type==="a"){if(s.x===0&&s.y===0)continue;t.add(s)}else{if(t.equals(s))continue;t.copy(s)}n.copy(t),Zt(e,s.rx,s.ry,s.angle,s.largeArcFlag,s.sweepFlag,h,t)}else s.type==="z"||s.type==="Z"?(e.startPoint&&t.copy(e.startPoint),e.closePath()):console.warn("Unsupported commands",s)}}function jt(i){let e,t;const n=[];for(let r=0,o=i.length;r<o;r++){const s=i[r];switch(s.type){case"m":case"M":if(s.x.toFixed(4)===(t==null?void 0:t.x.toFixed(4))&&s.y.toFixed(4)===(t==null?void 0:t.y.toFixed(4)))continue;n.push(`${s.type} ${s.x} ${s.y}`),t={x:s.x,y:s.y},e={x:s.x,y:s.y};break;case"h":case"H":n.push(`${s.type} ${s.x}`),t={x:s.x,y:(t==null?void 0:t.y)??0};break;case"v":case"V":n.push(`${s.type} ${s.y}`),t={x:(t==null?void 0:t.x)??0,y:s.y};break;case"l":case"L":n.push(`${s.type} ${s.x} ${s.y}`),t={x:s.x,y:s.y};break;case"c":case"C":n.push(`${s.type} ${s.x1} ${s.y1} ${s.x2} ${s.y2} ${s.x} ${s.y}`),t={x:s.x,y:s.y};break;case"s":case"S":n.push(`${s.type} ${s.x2} ${s.y2} ${s.x} ${s.y}`),t={x:s.x,y:s.y};break;case"q":case"Q":n.push(`${s.type} ${s.x1} ${s.y1} ${s.x} ${s.y}`),t={x:s.x,y:s.y};break;case"t":case"T":n.push(`${s.type} ${s.x} ${s.y}`),t={x:s.x,y:s.y};break;case"a":case"A":n.push(`${s.type} ${s.rx} ${s.ry} ${s.angle} ${s.largeArcFlag} ${s.sweepFlag} ${s.x} ${s.y}`),t={x:s.x,y:s.y};break;case"z":case"Z":n.push(s.type),e&&(t={x:e.x,y:e.y});break}}return n.join(" ")}const Ce=/[a-df-z][^a-df-z]*/gi;function It(i){const e=[],t=i.match(Ce);if(!t)return e;for(let n=0,r=t.length;n<r;n++){const o=t[n],s=o.charAt(0),h=o.slice(1).trim();let c;switch(s){case"m":case"M":c=Z(h);for(let a=0,l=c.length;a<l;a+=2)a===0?e.push({type:s,x:c[a],y:c[a+1]}):e.push({type:s==="m"?"l":"L",x:c[a],y:c[a+1]});break;case"h":case"H":c=Z(h);for(let a=0,l=c.length;a<l;a++)e.push({type:s,x:c[a]});break;case"v":case"V":c=Z(h);for(let a=0,l=c.length;a<l;a++)e.push({type:s,y:c[a]});break;case"l":case"L":c=Z(h);for(let a=0,l=c.length;a<l;a+=2)e.push({type:s,x:c[a],y:c[a+1]});break;case"c":case"C":c=Z(h);for(let a=0,l=c.length;a<l;a+=6)e.push({type:s,x1:c[a],y1:c[a+1],x2:c[a+2],y2:c[a+3],x:c[a+4],y:c[a+5]});break;case"s":case"S":c=Z(h);for(let a=0,l=c.length;a<l;a+=4)e.push({type:s,x2:c[a],y2:c[a+1],x:c[a+2],y:c[a+3]});break;case"q":case"Q":c=Z(h);for(let a=0,l=c.length;a<l;a+=4)e.push({type:s,x1:c[a],y1:c[a+1],x:c[a+2],y:c[a+3]});break;case"t":case"T":c=Z(h);for(let a=0,l=c.length;a<l;a+=2)e.push({type:s,x:c[a],y:c[a+1]});break;case"a":case"A":c=Z(h,[3,4],7);for(let a=0,l=c.length;a<l;a+=7)e.push({type:s,rx:c[a],ry:c[a+1],angle:c[a+2],largeArcFlag:c[a+3],sweepFlag:c[a+4],x:c[a+5],y:c[a+6]});break;case"z":case"Z":e.push({type:s});break;default:console.warn(o)}}return e}function St(i,e,t,n,r){const o=(n-e)*.5,s=(r-t)*.5,h=i*i,c=i*h;return(2*t-2*n+o+s)*c+(-3*t+3*n-2*o-s)*h+o*i+t}function Ae(i,e){const t=1-i;return t*t*t*e}function be(i,e){const t=1-i;return 3*t*t*i*e}function ke(i,e){return 3*(1-i)*i*i*e}function Ie(i,e){return i*i*i*e}function Et(i,e,t,n,r){return Ae(i,e)+be(i,t)+ke(i,n)+Ie(i,r)}function Se(i,e,t=2){const n=e&&e.length,r=n?e[0]*t:i.length;let o=Ut(i,0,r,t,!0);const s=[];if(!o||o.next===o.prev)return s;let h,c,a;if(n&&(o=De(i,e,o,t)),i.length>80*t){h=1/0,c=1/0;let l=-1/0,f=-1/0;for(let y=t;y<r;y+=t){const x=i[y],u=i[y+1];x<h&&(h=x),u<c&&(c=u),x>l&&(l=x),u>f&&(f=u)}a=Math.max(l-h,f-c),a=a!==0?32767/a:0}return ot(o,s,t,h,c,a,0),s}function Ut(i,e,t,n,r){let o;if(r===Be(i,e,t,n)>0)for(let s=e;s<t;s+=n)o=Vt(s/n|0,i[s],i[s+1],o);else for(let s=t-n;s>=e;s-=n)o=Vt(s/n|0,i[s],i[s+1],o);return o&&it(o,o.next)&&(at(o),o=o.next),o}function H(i,e){if(!i)return i;e||(e=i);let t=i,n;do if(n=!1,!t.steiner&&(it(t,t.next)||$(t.prev,t,t.next)===0)){if(at(t),t=e=t.prev,t===t.next)break;n=!0}else t=t.next;while(n||t!==e);return e}function ot(i,e,t,n,r,o,s){if(!i)return;!s&&o&&Re(i,n,r,o);let h=i;for(;i.prev!==i.next;){const c=i.prev,a=i.next;if(o?Le(i,n,r,o):Ee(i)){e.push(c.i,i.i,a.i),at(i),i=a.next,h=a.next;continue}if(i=a,i===h){s?s===1?(i=Ne(H(i),e),ot(i,e,t,n,r,o,2)):s===2&&$e(i,e,t,n,r,o):ot(H(i),e,t,n,r,o,1);break}}}function Ee(i){const e=i.prev,t=i,n=i.next;if($(e,t,n)>=0)return!1;const r=e.x,o=t.x,s=n.x,h=e.y,c=t.y,a=n.y,l=Math.min(r,o,s),f=Math.min(h,c,a),y=Math.max(r,o,s),x=Math.max(h,c,a);let u=n.next;for(;u!==e;){if(u.x>=l&&u.x<=y&&u.y>=f&&u.y<=x&&ct(r,h,o,c,s,a,u.x,u.y)&&$(u.prev,u,u.next)>=0)return!1;u=u.next}return!0}function Le(i,e,t,n){const r=i.prev,o=i,s=i.next;if($(r,o,s)>=0)return!1;const h=r.x,c=o.x,a=s.x,l=r.y,f=o.y,y=s.y,x=Math.min(h,c,a),u=Math.min(l,f,y),m=Math.max(h,c,a),M=Math.max(l,f,y),b=Lt(x,u,e,t,n),S=Lt(m,M,e,t,n);let w=i.prevZ,P=i.nextZ;for(;w&&w.z>=b&&P&&P.z<=S;){if(w.x>=x&&w.x<=m&&w.y>=u&&w.y<=M&&w!==r&&w!==s&&ct(h,l,c,f,a,y,w.x,w.y)&&$(w.prev,w,w.next)>=0||(w=w.prevZ,P.x>=x&&P.x<=m&&P.y>=u&&P.y<=M&&P!==r&&P!==s&&ct(h,l,c,f,a,y,P.x,P.y)&&$(P.prev,P,P.next)>=0))return!1;P=P.nextZ}for(;w&&w.z>=b;){if(w.x>=x&&w.x<=m&&w.y>=u&&w.y<=M&&w!==r&&w!==s&&ct(h,l,c,f,a,y,w.x,w.y)&&$(w.prev,w,w.next)>=0)return!1;w=w.prevZ}for(;P&&P.z<=S;){if(P.x>=x&&P.x<=m&&P.y>=u&&P.y<=M&&P!==r&&P!==s&&ct(h,l,c,f,a,y,P.x,P.y)&&$(P.prev,P,P.next)>=0)return!1;P=P.nextZ}return!0}function Ne(i,e){let t=i;do{const n=t.prev,r=t.next.next;!it(n,r)&&Bt(n,t,t.next,r)&&ht(n,r)&&ht(r,n)&&(e.push(n.i,t.i,r.i),at(t),at(t.next),t=i=r),t=t.next}while(t!==i);return H(t)}function $e(i,e,t,n,r,o){let s=i;do{let h=s.next.next;for(;h!==s.prev;){if(s.i!==h.i&&je(s,h)){let c=Gt(s,h);s=H(s,s.next),c=H(c,c.next),ot(s,e,t,n,r,o,0),ot(c,e,t,n,r,o,0);return}h=h.next}s=s.next}while(s!==i)}function De(i,e,t,n){const r=[];for(let o=0,s=e.length;o<s;o++){const h=e[o]*n,c=o<s-1?e[o+1]*n:i.length,a=Ut(i,h,c,n,!1);a===a.next&&(a.steiner=!0),r.push(Ze(a))}r.sort(Fe);for(let o=0;o<r.length;o++)t=qe(r[o],t);return t}function Fe(i,e){let t=i.x-e.x;if(t===0&&(t=i.y-e.y,t===0)){const n=(i.next.y-i.y)/(i.next.x-i.x),r=(e.next.y-e.y)/(e.next.x-e.x);t=n-r}return t}function qe(i,e){const t=Oe(i,e);if(!t)return e;const n=Gt(t,i);return H(n,n.next),H(t,t.next)}function Oe(i,e){let t=e;const n=i.x,r=i.y;let o=-1/0,s;if(it(i,t))return t;do{if(it(i,t.next))return t.next;if(r<=t.y&&r>=t.next.y&&t.next.y!==t.y){const f=t.x+(r-t.y)*(t.next.x-t.x)/(t.next.y-t.y);if(f<=n&&f>o&&(o=f,s=t.x<t.next.x?t:t.next,f===n))return s}t=t.next}while(t!==e);if(!s)return null;const h=s,c=s.x,a=s.y;let l=1/0;t=s;do{if(n>=t.x&&t.x>=c&&n!==t.x&&Xt(r<a?n:o,r,c,a,r<a?o:n,r,t.x,t.y)){const f=Math.abs(r-t.y)/(n-t.x);ht(t,i)&&(f<l||f===l&&(t.x>s.x||t.x===s.x&&_e(s,t)))&&(s=t,l=f)}t=t.next}while(t!==h);return s}function _e(i,e){return $(i.prev,i,e.prev)<0&&$(e.next,i,i.next)<0}function Re(i,e,t,n){let r=i;do r.z===0&&(r.z=Lt(r.x,r.y,e,t,n)),r.prevZ=r.prev,r.nextZ=r.next,r=r.next;while(r!==i);r.prevZ.nextZ=null,r.prevZ=null,ze(r)}function ze(i){let e,t=1;do{let n=i,r;i=null;let o=null;for(e=0;n;){e++;let s=n,h=0;for(let a=0;a<t&&(h++,s=s.nextZ,!!s);a++);let c=t;for(;h>0||c>0&&s;)h!==0&&(c===0||!s||n.z<=s.z)?(r=n,n=n.nextZ,h--):(r=s,s=s.nextZ,c--),o?o.nextZ=r:i=r,r.prevZ=o,o=r;n=s}o.nextZ=null,t*=2}while(e>1);return i}function Lt(i,e,t,n,r){return i=(i-t)*r|0,e=(e-n)*r|0,i=(i|i<<8)&16711935,i=(i|i<<4)&252645135,i=(i|i<<2)&858993459,i=(i|i<<1)&1431655765,e=(e|e<<8)&16711935,e=(e|e<<4)&252645135,e=(e|e<<2)&858993459,e=(e|e<<1)&1431655765,i|e<<1}function Ze(i){let e=i,t=i;do(e.x<t.x||e.x===t.x&&e.y<t.y)&&(t=e),e=e.next;while(e!==i);return t}function Xt(i,e,t,n,r,o,s,h){return(r-s)*(e-h)>=(i-s)*(o-h)&&(i-s)*(n-h)>=(t-s)*(e-h)&&(t-s)*(o-h)>=(r-s)*(n-h)}function ct(i,e,t,n,r,o,s,h){return!(i===s&&e===h)&&Xt(i,e,t,n,r,o,s,h)}function je(i,e){return i.next.i!==e.i&&i.prev.i!==e.i&&!Ue(i,e)&&(ht(i,e)&&ht(e,i)&&Xe(i,e)&&($(i.prev,i,e.prev)||$(i,e.prev,e))||it(i,e)&&$(i.prev,i,i.next)>0&&$(e.prev,e,e.next)>0)}function $(i,e,t){return(e.y-i.y)*(t.x-e.x)-(e.x-i.x)*(t.y-e.y)}function it(i,e){return i.x===e.x&&i.y===e.y}function Bt(i,e,t,n){const r=gt($(i,e,t)),o=gt($(i,e,n)),s=gt($(t,n,i)),h=gt($(t,n,e));return!!(r!==o&&s!==h||r===0&&pt(i,t,e)||o===0&&pt(i,n,e)||s===0&&pt(t,i,n)||h===0&&pt(t,e,n))}function pt(i,e,t){return e.x<=Math.max(i.x,t.x)&&e.x>=Math.min(i.x,t.x)&&e.y<=Math.max(i.y,t.y)&&e.y>=Math.min(i.y,t.y)}function gt(i){return i>0?1:i<0?-1:0}function Ue(i,e){let t=i;do{if(t.i!==i.i&&t.next.i!==i.i&&t.i!==e.i&&t.next.i!==e.i&&Bt(t,t.next,i,e))return!0;t=t.next}while(t!==i);return!1}function ht(i,e){return $(i.prev,i,i.next)<0?$(i,e,i.next)>=0&&$(i,i.prev,e)>=0:$(i,e,i.prev)<0||$(i,i.next,e)<0}function Xe(i,e){let t=i,n=!1;const r=(i.x+e.x)/2,o=(i.y+e.y)/2;do t.y>o!=t.next.y>o&&t.next.y!==t.y&&r<(t.next.x-t.x)*(o-t.y)/(t.next.y-t.y)+t.x&&(n=!n),t=t.next;while(t!==i);return n}function Gt(i,e){const t=Nt(i.i,i.x,i.y),n=Nt(e.i,e.x,e.y),r=i.next,o=e.prev;return i.next=e,e.prev=i,t.next=r,r.prev=t,n.next=t,t.prev=n,o.next=n,n.prev=o,n}function Vt(i,e,t,n){const r=Nt(i,e,t);return n?(r.next=n.next,r.prev=n,n.next.prev=r,n.next=r):(r.prev=r,r.next=r),r}function at(i){i.next.prev=i.prev,i.prev.next=i.next,i.prevZ&&(i.prevZ.nextZ=i.nextZ),i.nextZ&&(i.nextZ.prevZ=i.prevZ)}function Nt(i,e,t){return{i,x:e,y:t,prev:null,next:null,z:0,prevZ:null,nextZ:null,steiner:!1}}function Be(i,e,t,n){let r=0;for(let o=e,s=t-n;o<t;o+=n)r+=(i[s]-i[o])*(i[o+1]+i[s+1]),s=o;return r}function Wt(i,e={}){let{vertices:t=[],indices:n=[],holes:r=[],verticesStride:o=2,verticesOffset:s=0,indicesOffset:h=0}=e;const c=Se(i,r,2);if(c){for(let l=0;l<c.length;l+=3)n[h++]=c[l]+s,n[h++]=c[l+1]+s,n[h++]=c[l+2]+s;let a=s*o;for(let l=0;l<i.length;l+=2)t[a]=i[l],t[a+1]=i[l+1],a+=o}return{vertices:t,indices:n}}const Ge=8,dt=11920929e-14,Ve=1;function Ht(i,e,t,n,r,o,s,h,c=.5,a){const f=Math.min(.99,Math.max(0,c));let y=(Ve-f)/1;return y*=y,$t(i,e,t,n,r,o,s,h,a,y,0),a.push(s,h),a}function $t(i,e,t,n,r,o,s,h,c,a,l){if(l>Ge)return;const f=(i+t)/2,y=(e+n)/2,x=(t+r)/2,u=(n+o)/2,m=(r+s)/2,M=(o+h)/2,b=(f+x)/2,S=(y+u)/2,w=(x+m)/2,P=(u+M)/2,k=(b+w)/2,E=(S+P)/2;if(l>0){let g=s-i,d=h-e;const F=Math.abs((t-s)*d-(n-h)*g),q=Math.abs((r-s)*d-(o-h)*g);if(F>dt&&q>dt){if((F+q)*(F+q)<=a*(g*g+d*d)){c.push(k,E);return}}else if(F>dt){if(F*F<=a*(g*g+d*d)){c.push(k,E);return}}else if(q>dt){if(q*q<=a*(g*g+d*d)){c.push(k,E);return}}else if(g=k-(i+s)/2,d=E-(e+h)/2,g*g+d*d<=a){c.push(k,E);return}}$t(i,e,f,y,b,S,k,E,c,a,l+1),$t(k,E,w,P,m,M,s,h,c,a,l+1)}const We=8,He=11920929e-14,Qe=1;function Qt(i,e,t,n,r,o,s=.5,h){const a=Math.min(.99,Math.max(0,s));let l=(Qe-a)/1;return l*=l,Dt(h,i,e,t,n,r,o,l,0),h.push(r,o),h}function Dt(i,e,t,n,r,o,s,h,c){if(c>We)return;const a=(e+n)/2,l=(t+r)/2,f=(n+o)/2,y=(r+s)/2,x=(a+f)/2,u=(l+y)/2;let m=o-e,M=s-t;const b=Math.abs((n-o)*M-(r-s)*m);if(b>He){if(b*b<=h*(m*m+M*M)){i.push(x,u);return}}else if(m=x-(e+o)/2,M=u-(t+s)/2,m*m+M*M<=h){i.push(x,u);return}Dt(i,e,t,a,l,x,u,h,c+1),Dt(i,x,u,f,y,o,s,h,c+1)}function Ye(i,e){const t=1-i;return t*t*e}function Je(i,e){return 2*(1-i)*i*e}function Ke(i,e){return i*i*e}function Ft(i,e,t,n){return Ye(i,e)+Je(i,t)+Ke(i,n)}const tn=1e-4,Yt=1e-4;function Jt(i,e={}){const{vertices:t=[],indices:n=[],lineStyle:r={alignment:.5,cap:"butt",join:"miter",width:1,miterLimit:10},flipAlignment:o=!1,closed:s=!0}=e,h=tn;if(i.length===0)return{vertices:t,indices:n};const c=r;let a=c.alignment;if(r.alignment!==.5){let N=en(i);o&&(N*=-1),a=(a-.5)*N+.5}const l={x:i[0],y:i[1]},f={x:i[i.length-2],y:i[i.length-1]},y=s,x=Math.abs(l.x-f.x)<h&&Math.abs(l.y-f.y)<h;if(y){i=i.slice(),x&&(i.pop(),i.pop(),f.x=i[i.length-2],f.y=i[i.length-1]);const N=(l.x+f.x)*.5,W=(f.y+l.y)*.5;i.unshift(N,W),i.push(N,W)}const u=t,m=i.length/2;let M=i.length;const b=u.length/2,S=c.width/2,w=S*S,P=c.miterLimit*c.miterLimit;let k=i[0],E=i[1],g=i[2],d=i[3],F=0,q=0,C=-(E-d),A=k-g,O=0,_=0,U=Math.sqrt(C*C+A*A);C/=U,A/=U,C*=S,A*=S;const Me=a,T=(1-Me)*2,I=Me*2;y||(c.cap==="round"?M+=Q(k-C*(T-I)*.5,E-A*(T-I)*.5,k-C*T,E-A*T,k+C*I,E+A*I,u,!0)+2:c.cap==="square"&&(M+=Kt(k,E,C,A,T,I,!0,u))),u.push(k-C*T,E-A*T),u.push(k+C*I,E+A*I);for(let N=1;N<m-1;++N){k=i[(N-1)*2],E=i[(N-1)*2+1],g=i[N*2],d=i[N*2+1],F=i[(N+1)*2],q=i[(N+1)*2+1],C=-(E-d),A=k-g,U=Math.sqrt(C*C+A*A),C/=U,A/=U,C*=S,A*=S,O=-(d-q),_=g-F,U=Math.sqrt(O*O+_*_),O/=U,_/=U,O*=S,_*=S;const W=g-k,ut=E-d,ft=g-F,yt=q-d,we=W*ft+ut*yt,vt=ut*ft-yt*W,xt=vt<0;if(Math.abs(vt)<.001*Math.abs(we)){u.push(g-C*T,d-A*T),u.push(g+C*I,d+A*I),we>=0&&(c.join==="round"?M+=Q(g,d,g-C*T,d-A*T,g-O*T,d-_*T,u,!1)+4:M+=2,u.push(g-O*I,d-_*I),u.push(g+O*T,d+_*T));continue}const Pe=(-C+k)*(-A+d)-(-C+g)*(-A+E),ve=(-O+F)*(-_+d)-(-O+g)*(-_+q),Tt=(W*ve-ft*Pe)/vt,Ct=(yt*Pe-ut*ve)/vt,Rt=(Tt-g)*(Tt-g)+(Ct-d)*(Ct-d),J=g+(Tt-g)*T,K=d+(Ct-d)*T,tt=g-(Tt-g)*I,et=d-(Ct-d)*I,In=Math.min(W*W+ut*ut,ft*ft+yt*yt),Te=xt?T:I,Sn=In+Te*Te*w;Rt<=Sn?c.join==="bevel"||Rt/w>P?(xt?(u.push(J,K),u.push(g+C*I,d+A*I),u.push(J,K),u.push(g+O*I,d+_*I)):(u.push(g-C*T,d-A*T),u.push(tt,et),u.push(g-O*T,d-_*T),u.push(tt,et)),M+=2):c.join==="round"?xt?(u.push(J,K),u.push(g+C*I,d+A*I),M+=Q(g,d,g+C*I,d+A*I,g+O*I,d+_*I,u,!0)+4,u.push(J,K),u.push(g+O*I,d+_*I)):(u.push(g-C*T,d-A*T),u.push(tt,et),M+=Q(g,d,g-C*T,d-A*T,g-O*T,d-_*T,u,!1)+4,u.push(g-O*T,d-_*T),u.push(tt,et)):(u.push(J,K),u.push(tt,et)):(u.push(g-C*T,d-A*T),u.push(g+C*I,d+A*I),c.join==="round"?xt?M+=Q(g,d,g+C*I,d+A*I,g+O*I,d+_*I,u,!0)+2:M+=Q(g,d,g-C*T,d-A*T,g-O*T,d-_*T,u,!1)+2:c.join==="miter"&&Rt/w<=P&&(xt?(u.push(tt,et),u.push(tt,et)):(u.push(J,K),u.push(J,K)),M+=2),u.push(g-O*T,d-_*T),u.push(g+O*I,d+_*I),M+=2)}k=i[(m-2)*2],E=i[(m-2)*2+1],g=i[(m-1)*2],d=i[(m-1)*2+1],C=-(E-d),A=k-g,U=Math.sqrt(C*C+A*A),C/=U,A/=U,C*=S,A*=S,u.push(g-C*T,d-A*T),u.push(g+C*I,d+A*I),y||(c.cap==="round"?M+=Q(g-C*(T-I)*.5,d-A*(T-I)*.5,g-C*T,d-A*T,g+C*I,d+A*I,u,!1)+2:c.cap==="square"&&(M+=Kt(g,d,C,A,T,I,!1,u)));const kn=Yt*Yt;for(let N=b;N<M+b-2;++N)k=u[N*2],E=u[N*2+1],g=u[(N+1)*2],d=u[(N+1)*2+1],F=u[(N+2)*2],q=u[(N+2)*2+1],!(Math.abs(k*(d-q)+g*(q-E)+F*(E-d))<kn)&&n.push(N,N+1,N+2);return{vertices:t,indices:n}}function en(i){const e=i.length;if(e<6)return 1;let t=0;for(let n=0,r=i[e-2],o=i[e-1];n<e;n+=2){const s=i[n],h=i[n+1];t+=(s-r)*(h+o),r=s,o=h}return t<0?-1:1}function Kt(i,e,t,n,r,o,s,h){const c=i-t*r,a=e-n*r,l=i+t*o,f=e+n*o;let y,x;s?(y=n,x=-t):(y=-n,x=t);const u=c+y,m=a+x,M=l+y,b=f+x;return h.push(u,m),h.push(M,b),2}function Q(i,e,t,n,r,o,s,h){const c=t-i,a=n-e;let l=Math.atan2(c,a),f=Math.atan2(r-i,o-e);h&&l<f?l+=Math.PI*2:!h&&l>f&&(f+=Math.PI*2);let y=l;const x=f-l,u=Math.abs(x),m=Math.sqrt(c*c+a*a),M=(15*u*Math.sqrt(m)/Math.PI>>0)+1,b=x/M;if(y+=b,h){s.push(i,e),s.push(t,n);for(let S=1,w=y;S<M;S++,w+=b)s.push(i,e),s.push(i+Math.sin(w)*m,e+Math.cos(w)*m);s.push(i,e),s.push(r,o)}else{s.push(t,n),s.push(i,e);for(let S=1,w=y;S<M;S++,w+=b)s.push(i+Math.sin(w)*m,e+Math.cos(w)*m),s.push(i,e);s.push(r,o),s.push(i,e)}return M*2}class Y{constructor(){V(this,"arcLengthDivision",200);V(this,"_arcLengths")}getPointAt(e,t=new p){return this.getPoint(this.getUToTMapping(e),t)}isClockwise(){const e=this.getPoint(1),t=this.getPoint(.5),n=this.getPoint(1);return(t.x-e.x)*(n.y-t.y)-(t.y-e.y)*(n.x-t.x)<0}getControlPointRefs(){return[]}applyTransform(e){return this.getControlPointRefs().forEach(t=>{t.applyMatrix3(e)}),this}getUnevenPointArray(e=5,t=[]){const n=new p;for(let r=0,o=Math.max(1,e)-1;r<=o;r++)this.getPoint(r/o,n),t.push(n.x,n.y);return t}getSpacedPointArray(e=5,t=[]){const n=new p;for(let r=0,o=Math.max(1,e)-1;r<=o;r++)this.getPointAt(r/o,n),t.push(n.x,n.y);return t}getAdaptivePointArray(e=[]){return this.getUnevenPointArray(5,e)}_pointArrayToPoint(e,t=[]){for(let n=0,r=e.length;n<r;n+=2){const o=e[n],s=e[n+1];t.push(new p(o,s))}return t}getSpacedPoints(e,t=[]){const n=this.getSpacedPointArray(e);return this._pointArrayToPoint(n,t),t}getUnevenPoints(e,t=[]){const n=this.getUnevenPointArray(e);return this._pointArrayToPoint(n,t),t}getAdaptivePoints(e=[]){const t=this.getAdaptivePointArray();return this._pointArrayToPoint(t,e),e}getPoints(e,t=[]){let n;return e?n=this.getUnevenPointArray(e):n=this.getAdaptivePointArray(),this._pointArrayToPoint(n,t),t}getLength(){const e=this.getLengths();return e[e.length-1]}getLengths(){return(!this._arcLengths||this._arcLengths.length!==this.arcLengthDivision+1)&&this.updateLengths(),this._arcLengths}updateLengths(){const e=this.arcLengthDivision,t=[0];for(let n=0,r=this.getPoint(0),o=1;o<=e;o++){const s=this.getPoint(o/e);n+=s.distanceTo(r),t.push(n),r=s}this._arcLengths=t}getUToTMapping(e,t){const n=this.getLengths(),r=n.length,o=t??e*n[r-1];if(r<2)return o/n[0];let s=0,h=0,c=r-1,a;for(;h<=c;)if(s=Math.floor(h+(c-h)/2),a=n[s]-o,a<0)h=s+1;else if(a>0)c=s-1;else{c=s;break}if(s=c,n[s]===o)return s/(r-1);const l=n[s],y=n[s+1]-l,x=(o-l)/y;return(s+x)/(r-1)}getTangent(e,t=new p){const r=Math.max(0,e-1e-4),o=Math.min(1,e+1e-4);return t.copy(this.getPoint(o).sub(this.getPoint(r)).normalize())}getTangentAt(e,t){return this.getTangent(this.getUToTMapping(e),t)}getNormal(e,t=new p){return this.getTangent(e,t),t.set(-t.y,t.x).normalize()}getNormalAt(e,t){return this.getNormal(this.getUToTMapping(e),t)}getTForPoint(e,t=.001){let n=0,r=1,o=(n+r)/2;for(;r-n>t;){o=(n+r)/2;const s=this.getPoint(o);if(s.distanceTo(e)<t)return o;s.x<e.x?n=o:r=o}return o}getMinMax(e=p.MAX,t=p.MIN){const n=this.getPoints();for(let r=0,o=n.length;r<o;r++){const s=n[r];e.min(s),t.max(s)}return{min:e,max:t}}getBoundingBox(){const{min:e,max:t}=this.getMinMax();return new G(e.x,e.y,t.x-e.x,t.y-e.y)}fillTriangulate(e){return Wt(this.getAdaptivePointArray(),e)}strokeTriangulate(e){return Jt(this.getAdaptivePointArray(),e)}toCommands(){const e=[],t=this.getPoints();for(let n=0,r=t.length;n<r;n++){const o=t[n];n===0?e.push({type:"M",x:o.x,y:o.y}):e.push({type:"L",x:o.x,y:o.y})}return e}toData(){return jt(this.toCommands())}drawTo(e){return this.toCommands().forEach(t=>{switch(t.type){case"M":e.moveTo(t.x,t.y);break;case"L":e.lineTo(t.x,t.y);break}}),this}copy(e){return this.arcLengthDivision=e.arcLengthDivision,this}clone(){return new this.constructor().copy(this)}}const nn=new z,te=new z,ee=new z,mt=new p;class qt extends Y{constructor(e=new p,t=new p,n=new p,r=0,o=0,s=Math.PI*2,h=!1){super(),this._center=e,this._radius=t,this._diff=n,this.rotate=r,this.startAngle=o,this.endAngle=s,this.clockwise=h}get cx(){return this._center.x}set cx(e){this._center.x=e}get cy(){return this._center.y}set cy(e){this._center.y=e}get rx(){return this._radius.x}set rx(e){this._radius.x=e}get ry(){return this._radius.y}set ry(e){this._radius.y=e}get dx(){return this._diff.x}set dx(e){this._diff.x=e}get dy(){return this._diff.y}set dy(e){this._diff.y=e}isClockwise(){return this.clockwise}getPoint(e,t=new p){const n=Math.PI*2;let r=this.endAngle-this.startAngle;const o=Math.abs(r)<Number.EPSILON;for(;r<0;)r+=n;for(;r>n;)r-=n;r<Number.EPSILON&&(o?r=0:r=n),this.clockwise&&!o&&(r===n?r=-n:r=r-n);const s=this.startAngle+e*r;let h=this.cx+this.rx*Math.cos(s),c=this.cy+this.ry*Math.sin(s);if(this.rotate!==0){const a=Math.cos(this.rotate),l=Math.sin(this.rotate),f=h-this.cx,y=c-this.cy;h=f*a-y*l+this.cx,c=f*l+y*a+this.cy}return t.set(h,c)}toCommands(){const{cx:e,cy:t,rx:n,ry:r,startAngle:o,endAngle:s,clockwise:h,rotate:c}=this,a=e+n*Math.cos(o)*Math.cos(c)-r*Math.sin(o)*Math.sin(c),l=t+n*Math.cos(o)*Math.sin(c)+r*Math.sin(o)*Math.cos(c),f=Math.abs(o-s),y=f>Math.PI?1:0,x=h?1:0,u=c*180/Math.PI;if(f>=2*Math.PI){const m=o+Math.PI,M=e+n*Math.cos(m)*Math.cos(c)-r*Math.sin(m)*Math.sin(c),b=t+n*Math.cos(m)*Math.sin(c)+r*Math.sin(m)*Math.cos(c);return[{type:"M",x:a,y:l},{type:"A",rx:n,ry:r,angle:u,largeArcFlag:0,sweepFlag:x,x:M,y:b},{type:"A",rx:n,ry:r,angle:u,largeArcFlag:0,sweepFlag:x,x:a,y:l}]}else{const m=e+n*Math.cos(s)*Math.cos(c)-r*Math.sin(s)*Math.sin(c),M=t+n*Math.cos(s)*Math.sin(c)+r*Math.sin(s)*Math.cos(c);return[{type:"M",x:a,y:l},{type:"A",rx:n,ry:r,angle:u,largeArcFlag:y,sweepFlag:x,x:m,y:M}]}}drawTo(e){const{cx:t,cy:n,rx:r,ry:o,rotate:s,startAngle:h,endAngle:c,clockwise:a}=this;return e.ellipse(t,n,r,o,s,h,c,!a),this}applyTransform(e){return mt.set(this.cx,this.cy),mt.applyMatrix3(e),this.cx=mt.x,this.cy=mt.y,on(e)?sn(this,e):rn(this,e),this}getControlPointRefs(){return[this._center]}getAdaptivePointArray(e=[]){const{cx:t,cy:n,rx:r,ry:o,dx:s,dy:h}=this;if(!(r>=0&&o>=0&&s>=0&&h>=0))return e;const c=Math.ceil(2.3*Math.sqrt(r+o)),a=c*8+(s?4:0)+(h?4:0);if(a===0)return e;const l=[];if(c===0)l[0]=l[6]=t+s,l[1]=l[3]=n+h,l[2]=l[4]=t-s,l[5]=l[7]=n-h;else{let f=0,y=c*4+(s?2:0)+2,x=y,u=a,m=s+r,M=h,b=t+m,S=t-m,w=n+M;if(l[f++]=b,l[f++]=w,l[--y]=w,l[--y]=S,h){const k=n-M;l[x++]=S,l[x++]=k,l[--u]=k,l[--u]=b}for(let k=1;k<c;k++){const E=Math.PI/2*(k/c),g=s+Math.cos(E)*r,d=h+Math.sin(E)*o,F=t+g,q=t-g,C=n+d,A=n-d;l[f++]=F,l[f++]=C,l[--y]=C,l[--y]=q,l[x++]=q,l[x++]=A,l[--u]=A,l[--u]=F}m=s,M=h+o,b=t+m,S=t-m,w=n+M;const P=n-M;l[f++]=b,l[f++]=w,l[--u]=P,l[--u]=b,s&&(l[f++]=S,l[f++]=w,l[--u]=P,l[--u]=S)}return Array.prototype.push.apply(e,l),e}fillTriangulate(e={}){let{vertices:t=[],indices:n=[],verticesStride:r=2,verticesOffset:o=0,indicesOffset:s=0}=e;const h=this.getAdaptivePointArray();if(h.length===0)return{vertices:t,indices:n};let c=0,a=0;for(let y=0;y<h.length;y+=2)c+=h[y],a+=h[y+1];c/=h.length/2,a/=h.length/2;let l=o;t[l*r]=c,t[l*r+1]=a;const f=l++;for(let y=0;y<h.length;y+=2)t[l*r]=h[y],t[l*r+1]=h[y+1],y>0&&(n[s++]=l,n[s++]=f,n[s++]=l-1),l++;return n[s++]=f+1,n[s++]=f,n[s++]=l-1,{vertices:t,indices:n}}getMinMax(e=p.MAX,t=p.MIN){const{cx:n,cy:r,rx:o,ry:s,rotate:h}=this,c=Math.cos(h),a=Math.sin(h),l=Math.sqrt(o*o*c*c+s*s*a*a),f=Math.sqrt(o*o*a*a+s*s*c*c);return e.x=Math.min(e.x,n-l),e.y=Math.min(e.y,r-f),t.x=Math.max(t.x,n+l),t.y=Math.max(t.y,r+f),{min:e,max:t}}copy(e){return super.copy(e),this.cx=e.cx,this.cy=e.cy,this.rx=e.rx,this.ry=e.ry,this.dx=e.dx,this.dy=e.dy,this.startAngle=e.startAngle,this.endAngle=e.endAngle,this.clockwise=e.clockwise,this.rotate=e.rotate,this}}function sn(i,e){const t=i.rx,n=i.ry,r=Math.cos(i.rotate),o=Math.sin(i.rotate),s=new p(t*r,t*o),h=new p(-n*o,n*r),c=s.applyMatrix3(e),a=h.applyMatrix3(e),l=nn.set(c.x,a.x,0,c.y,a.y,0,0,0,1),f=te.copy(l).invert(),u=ee.copy(f).transpose().multiply(f).elements,m=cn(u[0],u[1],u[4]),M=Math.sqrt(m.rt1),b=Math.sqrt(m.rt2);if(i.rx=1/M,i.ry=1/b,i.rotate=Math.atan2(m.sn,m.cs),!((i.endAngle-i.startAngle)%(2*Math.PI)<Number.EPSILON)){const w=te.set(M,0,0,0,b,0,0,0,1),P=ee.set(m.cs,m.sn,0,-m.sn,m.cs,0,0,0,1),k=w.multiply(P).multiply(l),E=g=>{const{x:d,y:F}=new p(Math.cos(g),Math.sin(g)).applyMatrix3(k);return Math.atan2(F,d)};i.startAngle=E(i.startAngle),i.endAngle=E(i.endAngle),ne(e)&&(i.clockwise=!i.clockwise)}}function rn(i,e){const t=se(e),n=ie(e);i.rx*=t,i.ry*=n;const r=t>Number.EPSILON?Math.atan2(e.elements[1],e.elements[0]):Math.atan2(-e.elements[3],e.elements[4]);i.rotate+=r,ne(e)&&(i.startAngle*=-1,i.endAngle*=-1,i.clockwise=!i.clockwise)}function ne(i){const e=i.elements;return e[0]*e[4]-e[1]*e[3]<0}function on(i){const e=i.elements,t=e[0]*e[3]+e[1]*e[4];if(t===0)return!1;const n=se(i),r=ie(i);return Math.abs(t/(n*r))>Number.EPSILON}function se(i){const e=i.elements;return Math.sqrt(e[0]*e[0]+e[1]*e[1])}function ie(i){const e=i.elements;return Math.sqrt(e[3]*e[3]+e[4]*e[4])}function cn(i,e,t){let n,r,o,s,h;const c=i+t,a=i-t,l=Math.sqrt(a*a+4*e*e);return c>0?(n=.5*(c+l),h=1/n,r=i*h*t-e*h*e):c<0?r=.5*(c-l):(n=.5*l,r=-.5*l),a>0?o=a+l:o=a-l,Math.abs(o)>2*Math.abs(e)?(h=-2*e/o,s=1/Math.sqrt(1+h*h),o=h*s):Math.abs(e)===0?(o=1,s=0):(h=-.5*o/e,o=1/Math.sqrt(1+h*h),s=h*o),a>0&&(h=o,o=-s,s=h),{rt1:n,rt2:r,cs:o,sn:s}}class re extends qt{constructor(e=0,t=0,n=1,r=0,o=Math.PI*2,s=!1){super(new p(e,t),new p(n,n),new p(0,0),0,r,o,s)}drawTo(e){const{cx:t,cy:n,rx:r,startAngle:o,endAngle:s,clockwise:h}=this;return e.arc(t,n,r,o,s,!h),this}getAdaptivePointArray(e=[]){const{cx:t,cy:n,rx:r,startAngle:o,endAngle:s,clockwise:h}=this;let c=Math.abs(o-s);(!h&&o>s||h&&s>o)&&(c=2*Math.PI-c);let a=Math.max(6,Math.floor(6*r**(1/3)*(c/Math.PI)));a=Math.max(a,3);let l=c/a,f=o;l*=h?1:-1;for(let y=0;y<a+1;y++){const x=Math.cos(f),u=Math.sin(f),m=t+x*r,M=n+u*r;e.push(m,M),f+=l}return e}}class rt extends Y{constructor(e=[]){super(),this.curves=e}getFlatCurves(){return this.curves.flatMap(e=>e instanceof rt?e.getFlatCurves():e)}addCurve(e){return this.curves.push(e),this}getPoint(e,t=new p){const n=e*this.getLength(),r=this.getLengths();let o=0;for(;o<r.length;){if(r[o]>=n){const s=r[o]-n,h=this.curves[o],c=h.getLength();return h.getPointAt(c===0?0:1-s/c,t)}o++}return t}updateLengths(){const e=[];for(let t=0,n=0,r=this.curves.length;t<r;t++)n+=this.curves[t].getLength(),e.push(n);this._arcLengths=e}getControlPointRefs(){return this.curves.flatMap(e=>e.getControlPointRefs())}getAdaptivePointArray(e=[]){let t;return this.curves.forEach(n=>{n.getAdaptivePointArray(e),t&&e[t-1]===e[t+1]&&e[t]===e[t+2]&&e.splice(t+1,2),t=e.length-1}),e}applyTransform(e){return this.curves.forEach(t=>t.applyTransform(e)),this}getMinMax(e=p.MAX,t=p.MIN){return this.curves.forEach(n=>n.getMinMax(e,t)),{min:e,max:t}}getBoundingBox(){const{min:e,max:t}=this.getMinMax();return new G(e.x,e.y,t.x-e.x,t.y-e.y)}toCommands(){return this.curves.flatMap(e=>e.toCommands())}drawTo(e){var n;const t=(n=this.curves[0])==null?void 0:n.getPoint(0);return t&&e.moveTo(t.x,t.y),this.curves.forEach(r=>r.drawTo(e)),this}copy(e){return super.copy(e),this.curves=e.curves.map(t=>t.clone()),this}}class Mt extends Y{constructor(e=new p,t=new p,n=new p,r=new p){super(),this.p1=e,this.cp1=t,this.cp2=n,this.p2=r}static from(e,t,n,r,o,s,h,c){return new Mt(new p(e,t),new p(n,r),new p(o,s),new p(h,c))}getPoint(e,t=new p){const{p1:n,cp1:r,cp2:o,p2:s}=this;return t.set(Et(e,n.x,r.x,o.x,s.x),Et(e,n.y,r.y,o.y,s.y))}getAdaptivePointArray(e=[]){return Ht(this.p1.x,this.p1.y,this.cp1.x,this.cp1.y,this.cp2.x,this.cp2.y,this.p2.x,this.p2.y,.5,e)}getControlPointRefs(){return[this.p1,this.cp1,this.cp2,this.p2]}_solveQuadratic(e,t,n){const r=t*t-4*e*n;if(r<0)return[];const o=Math.sqrt(r),s=(-t+o)/(2*e),h=(-t-o)/(2*e);return[s,h].filter(c=>c>=0&&c<=1)}getMinMax(e=p.MAX,t=p.MIN){const{p1:n,cp1:r,cp2:o,p2:s}=this,h=this._solveQuadratic(3*(r.x-n.x),6*(o.x-r.x),3*(s.x-o.x)),c=this._solveQuadratic(3*(r.y-n.y),6*(o.y-r.y),3*(s.y-o.y)),a=[0,1,...h,...c];return((f,y)=>{for(const x of f)for(let u=0;u<=y;u++){const m=u/y-.5,M=Math.min(1,Math.max(0,x+m)),b=this.getPoint(M);e.x=Math.min(e.x,b.x),e.y=Math.min(e.y,b.y),t.x=Math.max(t.x,b.x),t.y=Math.max(t.y,b.y)}})(a,10),{min:e,max:t}}toCommands(){const{p1:e,cp1:t,cp2:n,p2:r}=this;return[{type:"M",x:e.x,y:e.y},{type:"C",x1:t.x,y1:t.y,x2:n.x,y2:n.y,x:r.x,y:r.y}]}drawTo(e){const{p1:t,cp1:n,cp2:r,p2:o}=this;return e.lineTo(t.x,t.y),e.bezierCurveTo(n.x,n.y,r.x,r.y,o.x,o.y),this}copy(e){return super.copy(e),this.p1.copy(e.p1),this.cp1.copy(e.cp1),this.cp2.copy(e.cp2),this.p2.copy(e.p2),this}}class oe extends qt{constructor(e=0,t=0,n=1,r=1,o=0,s=0,h=Math.PI*2,c=!1){super(new p(e,t),new p(n,r),new p,o,s,h,c)}drawTo(e){return e.ellipse(this.cx,this.cy,this.rx,this.ry,this.rotate,this.startAngle,this.endAngle,!this.clockwise),this}}class X extends Y{constructor(e=new p,t=new p){super(),this.p1=e,this.p2=t}static from(e,t,n,r){return new X(new p(e,t),new p(n,r))}getPoint(e,t=new p){return e===1?t.copy(this.p2):t.copy(this.p2).sub(this.p1).scale(e).add(this.p1),t}getPointAt(e,t=new p){return this.getPoint(e,t)}getTangent(e,t=new p){return t.subVectors(this.p2,this.p1).normalize()}getTangentAt(e,t=new p){return this.getTangent(e,t)}getControlPointRefs(){return[this.p1,this.p2]}getAdaptivePointArray(e=[]){return e.push(this.p1.x,this.p1.y,this.p2.x,this.p2.y),e}getMinMax(e=p.MAX,t=p.MIN){const{p1:n,p2:r}=this;return e.x=Math.min(e.x,n.x,r.x),e.y=Math.min(e.y,n.y,r.y),t.x=Math.max(t.x,n.x,r.x),t.y=Math.max(t.y,n.y,r.y),{min:e,max:t}}toCommands(){const{p1:e,p2:t}=this;return[{type:"M",x:e.x,y:e.y},{type:"L",x:t.x,y:t.y}]}drawTo(e){const{p1:t,p2:n}=this;return e.lineTo(t.x,t.y),e.lineTo(n.x,n.y),this}copy(e){return super.copy(e),this.p1.copy(e.p1),this.p2.copy(e.p2),this}}class Ot extends rt{}class hn extends Ot{constructor(e=0,t=0,n=1,r=3){super(),this.cx=e,this.cy=t,this.radius=n,this.sideCount=r,this.update()}update(){const{cx:e,cy:t,radius:n,sideCount:r}=this,o=[];for(let h=0;h<r;h++){const c=h*2*Math.PI/r-.5*Math.PI;o.push(new p(n*Math.cos(c),n*Math.sin(c)).add({x:e,y:t}))}const s=[];for(let h=0;h<r;h++)s.push(new X(o[h],o[(h+1)%r]));return this.curves=s,this}copy(e){return super.copy(e),this.cx=e.cx,this.cy=e.cy,this.radius=e.radius,this.sideCount=e.sideCount,this.update(),this}}class wt extends Y{constructor(e=new p,t=new p,n=new p){super(),this.p1=e,this.cp=t,this.p2=n}static from(e,t,n,r,o,s){return new wt(new p(e,t),new p(n,r),new p(o,s))}getPoint(e,t=new p){const{p1:n,cp:r,p2:o}=this;return t.set(Ft(e,n.x,r.x,o.x),Ft(e,n.y,r.y,o.y)),t}getControlPointRefs(){return[this.p1,this.cp,this.p2]}getAdaptivePointArray(e=[]){return Qt(this.p1.x,this.p1.y,this.cp.x,this.cp.y,this.p2.x,this.p2.y,.5,e)}getMinMax(e=p.MAX,t=p.MIN){const{p1:n,cp:r,p2:o}=this,s=.5*(n.x+r.x),h=.5*(n.y+r.y),c=.5*(n.x+o.x),a=.5*(n.y+o.y);return e.x=Math.min(e.x,n.x,o.x,s,c),e.y=Math.min(e.y,n.y,o.y,h,a),t.x=Math.max(t.x,n.x,o.x,s,c),t.y=Math.max(t.y,n.y,o.y,h,a),{min:e,max:t}}toCommands(){const{p1:e,cp:t,p2:n}=this;return[{type:"M",x:e.x,y:e.y},{type:"Q",x1:t.x,y1:t.y,x:n.x,y:n.y}]}drawTo(e){const{p1:t,cp:n,p2:r}=this;return e.lineTo(t.x,t.y),e.quadraticCurveTo(n.x,n.y,r.x,r.y),this}copy(e){return super.copy(e),this.p1.copy(e.p1),this.cp.copy(e.cp),this.p2.copy(e.p2),this}}class ce extends Ot{constructor(e=0,t=0,n=0,r=0){super(),this.x=e,this.y=t,this.width=n,this.height=r,this.update()}update(){const{x:e,y:t,width:n,height:r}=this,o=[new p(e,t),new p(e+n,t),new p(e+n,t+r),new p(e,t+r)];return this.curves=[new X(o[0],o[1]),new X(o[1],o[2]),new X(o[2],o[3]),new X(o[3],o[0])],this}drawTo(e){return e.rect(this.x,this.y,this.width,this.height),this}fillTriangulate(e={}){let{vertices:t=[],indices:n=[],verticesStride:r=2,verticesOffset:o=0,indicesOffset:s=0}=e;const{x:h,y:c,width:a,height:l}=this,f=[h,c,h+a,c,h+a,c+l,h,c+l];let y=0;o*=r,t[o+y]=f[0],t[o+y+1]=f[1],y+=r,t[o+y]=f[2],t[o+y+1]=f[3],y+=r,t[o+y]=f[6],t[o+y+1]=f[7],y+=r,t[o+y]=f[4],t[o+y+1]=f[5],y+=r;const x=o/r;return n[s++]=x,n[s++]=x+1,n[s++]=x+2,n[s++]=x+1,n[s++]=x+3,n[s++]=x+2,{vertices:t,indices:n}}copy(e){return super.copy(e),this.x=e.x,this.y=e.y,this.width=e.width,this.height=e.height,this.update(),this}}class he extends qt{constructor(e=0,t=0,n=1,r=1,o=1){super(),this.x=e,this.y=t,this.width=n,this.height=r,this.radius=o,this.update()}update(){const{x:e,y:t,width:n,height:r,radius:o}=this,s=n/2,h=r/2,c=e+s,a=t+h,l=Math.max(0,Math.min(o,Math.min(s,h))),f=l,y=s-l,x=h-f;return this._center=new p(c,a),this._radius=new p(l,f),this._diff=new p(y,x),this}drawTo(e){const{x:t,y:n,width:r,height:o,radius:s}=this;return e.roundRect(t,n,r,o,s),this}copy(e){return super.copy(e),this.x=e.x,this.y=e.y,this.width=e.width,this.height=e.height,this.radius=e.radius,this.update(),this}}class ae extends Y{constructor(e=[]){super(),this.points=e}getPoint(e,t=new p){const{points:n}=this,r=(n.length-1)*e,o=Math.floor(r),s=r-o,h=n[o===0?o:o-1],c=n[o],a=n[o>n.length-2?n.length-1:o+1],l=n[o>n.length-3?n.length-1:o+2];return t.set(St(s,h.x,c.x,a.x,l.x),St(s,h.y,c.y,a.y,l.y)),t}getControlPointRefs(){return this.points}copy(e){super.copy(e),this.points=[];for(let t=0,n=e.points.length;t<n;t++)this.points.push(e.points[t].clone());return this}}class lt extends rt{constructor(t){super();V(this,"startPoint");V(this,"currentPoint");V(this,"autoClose",!1);t&&this.addPoints(t)}addPoints(t){this.moveTo(t[0].x,t[0].y);for(let n=1,r=t.length;n<r;n++){const{x:o,y:s}=t[n];this.lineTo(o,s)}return this}addCommands(t){return kt(t,this),this}addData(t){return this.addCommands(It(t)),this}getUnevenPointArray(t=40,n=[]){return super.getUnevenPointArray(t,n),this.autoClose&&n.length>=4&&n[0]!==n[n.length-2]&&n[1]!==n[n.length-1]&&n.push(n[0],n[1]),n}getSpacedPointArray(t=40,n=[]){return super.getSpacedPointArray(t,n),this.autoClose&&n.length>=4&&n[0]!==n[n.length-2]&&n[1]!==n[n.length-1]&&n.push(n[0],n[1]),n}_setCurrentPoint(t){return this.currentPoint=new p(t.x,t.y),this.startPoint||(this.startPoint=this.currentPoint.clone()),this}_connetLineTo(t){if(this.curves.length>0){const n=t.getPoint(0);(!this.currentPoint||!n.equals(this.currentPoint))&&this.lineTo(n.x,n.y)}return this}closePath(){const t=this.startPoint;if(t){const n=this.currentPoint;n&&!t.equals(n)&&(this.curves.push(new X(n,t)),n.copy(t)),this.startPoint=void 0}return this}moveTo(t,n){return this.currentPoint=new p(t,n),this.startPoint=this.currentPoint.clone(),this}lineTo(t,n){const r=this.currentPoint;return r!=null&&r.equals({x:t,y:n})||this.curves.push(X.from((r==null?void 0:r.x)??0,(r==null?void 0:r.y)??0,t,n)),this._setCurrentPoint({x:t,y:n}),this}bezierCurveTo(t,n,r,o,s,h){const c=this.currentPoint;return c!=null&&c.equals({x:s,y:h})||this.curves.push(Mt.from((c==null?void 0:c.x)??0,(c==null?void 0:c.y)??0,t,n,r,o,s,h)),this._setCurrentPoint({x:s,y:h}),this}quadraticCurveTo(t,n,r,o){const s=this.currentPoint;return s!=null&&s.equals({x:r,y:o})||this.curves.push(wt.from((s==null?void 0:s.x)??0,(s==null?void 0:s.y)??0,t,n,r,o)),this._setCurrentPoint({x:r,y:o}),this}arc(t,n,r,o,s,h){const c=new re(t,n,r,o,s,!h);return this._connetLineTo(c),this.curves.push(c),this._setCurrentPoint(c.getPoint(1)),this}relativeArc(t,n,r,o,s,h){var c,a;return t+=((c=this.currentPoint)==null?void 0:c.x)??0,n+=((a=this.currentPoint)==null?void 0:a.y)??0,this.arc(t,n,r,o,s,h),this}arcTo(t,n,r,o,s){return console.warn("Method arcTo not supported yet"),this}ellipse(t,n,r,o,s,h,c,a=!0){const l=new oe(t,n,r,o,s,h,c,!a);return this._connetLineTo(l),this.curves.push(l),this._setCurrentPoint(l.getPoint(1)),this}relativeEllipse(t,n,r,o,s,h,c,a){var l,f;return t+=((l=this.currentPoint)==null?void 0:l.x)??0,n+=((f=this.currentPoint)==null?void 0:f.y)??0,this.ellipse(t,n,r,o,s,h,c,a),this}rect(t,n,r,o){const s=new ce(t,n,r,o);return this._connetLineTo(s),this.curves.push(s),this._setCurrentPoint({x:t,y:n}),this}roundRect(t,n,r,o,s){const h=new he(t,n,r,o,s);return this._connetLineTo(h),this.curves.push(h),this._setCurrentPoint({x:t,y:n}),this}splineThru(t){const n=this.currentPoint??new p;return this.curves.push(new ae([n].concat(t))),this._setCurrentPoint(t[t.length-1]),this}drawTo(t){var r;const n=(r=this.curves[0])==null?void 0:r.getPoint(0);return n&&t.moveTo(n.x,n.y),this.curves.forEach(o=>o.drawTo(t)),this.autoClose&&t.closePath(),this}copy(t){var n;return super.copy(t),this.autoClose=t.autoClose,this.currentPoint=(n=t.currentPoint)==null?void 0:n.clone(),this}}function an(i){return i.replace(/[^a-z0-9]/gi,"-").replace(/\B([A-Z])/g,"-$1").toLowerCase()}function ln(i,e,t,n){const r=e.clone().sub(i),o=n.clone().sub(t),s=t.clone().sub(i),h=r.cross(o);if(h===0)return new p((i.x+t.x)/2,(i.y+t.y)/2);const c=s.cross(o)/h;return Math.abs(c)>1?new p((i.x+t.x)/2,(i.y+t.y)/2):new p(i.x+c*r.x,i.y+c*r.y)}class j extends rt{constructor(t,n={}){super();V(this,"currentCurve",new lt);V(this,"style");this.curves.push(this.currentCurve),this.style=n,t&&(t instanceof j?this.addPath(t):Array.isArray(t)?this.addCommands(t):this.addData(t))}get startPoint(){return this.currentCurve.startPoint}get currentPoint(){return this.currentCurve.currentPoint}get strokeWidth(){return this.style.strokeWidth??((this.style.stroke??"none")==="none"?0:1)}addPath(t){const n=this.curves.findIndex(r=>r===this.currentCurve);return n>-1&&this.curves.splice(n,1),t instanceof j?this.curves.push(...t.curves.filter(r=>r.curves.length).map(r=>r.clone())):t.curves.length&&this.curves.push(t),this.curves.push(this.currentCurve),this}closePath(){const t=this.startPoint;return t&&(this.currentCurve.closePath(),this.currentCurve.curves.length&&(this.currentCurve=new lt().moveTo(t.x,t.y),this.curves.push(this.currentCurve))),this}moveTo(t,n){var r;return(r=this.currentCurve.currentPoint)!=null&&r.equals({x:t,y:n})||(this.currentCurve.curves.length&&(this.currentCurve=new lt,this.curves.push(this.currentCurve)),this.currentCurve.moveTo(t,n)),this}lineTo(t,n){return this.currentCurve.lineTo(t,n),this}bezierCurveTo(t,n,r,o,s,h){return this.currentCurve.bezierCurveTo(t,n,r,o,s,h),this}quadraticCurveTo(t,n,r,o){return this.currentCurve.quadraticCurveTo(t,n,r,o),this}arc(t,n,r,o,s,h){return this.currentCurve.arc(t,n,r,o,s,h),this}arcTo(t,n,r,o,s){return this.currentCurve.arcTo(t,n,r,o,s),this}ellipse(t,n,r,o,s,h,c,a){return this.currentCurve.ellipse(t,n,r,o,s,h,c,a),this}rect(t,n,r,o){return this.currentCurve.rect(t,n,r,o),this}roundRect(t,n,r,o,s){return this.currentCurve.roundRect(t,n,r,o,s),this}reset(){return this.currentCurve=new lt,this.curves=[this.currentCurve],this.style={},this}addCommands(t){return kt(t,this),this}addData(t){return this.addCommands(It(t)),this}splineThru(t){return this.currentCurve.splineThru(t),this}scale(t,n=t,r={x:0,y:0}){return this.getControlPointRefs().forEach(o=>{o.scale(t,n,r)}),this}skew(t,n=0,r={x:0,y:0}){return this.getControlPointRefs().forEach(o=>{o.skew(t,n,r)}),this}rotate(t,n={x:0,y:0}){return this.getControlPointRefs().forEach(r=>{r.rotate(t,n)}),this}bold(t){if(t===0)return this;const n=this.getFlatCurves(),r=[],o=[],s=[];n.forEach((c,a)=>{const l=c.getControlPointRefs(),f=c.isClockwise();s[a]=l,o[a]=f;const y=l[0],x=l[l.length-1]??y;r.push({start:f?x:y,end:f?y:x,index:a})});const h=[];return r.forEach((c,a)=>{h[a]=[],r.forEach((l,f)=>{var y;l.start&&c.end&&f!==a&&((y=l.start)!=null&&y.equals(c.end))&&h[a].push(l.index)})}),n.forEach((c,a)=>{const l=o[a];s[a].forEach(f=>{f.add(c.getNormal(c.getTForPoint(f)).scale(l?t:-t))})}),h.forEach((c,a)=>{const l=s[a];c.forEach(f=>{const y=s[f],x=ln(l[l.length-1],l[l.length-2]??l[l.length-1],y[0],y[1]??y[0]);x&&(l[l.length-1].copy(x),y[0].copy(x))})}),this}getMinMax(t=p.MAX,n=p.MIN,r=!0){const o=this.strokeWidth;return this.curves.forEach(s=>{if(s.getMinMax(t,n),r&&o>1){const h=o/2,c=s.isClockwise(),a=[];for(let l=0;l<=1;l+=1/s.arcLengthDivision){const f=s.getPoint(l),y=s.getNormal(l),x=y.clone().scale(c?h:-h),u=y.clone().scale(c?-h:h);a.push(f.clone().add(x),f.clone().add(u),f.clone().add({x:h,y:0}),f.clone().add({x:-h,y:0}),f.clone().add({x:0,y:h}),f.clone().add({x:0,y:-h}),f.clone().add({x:h,y:h}),f.clone().add({x:-h,y:-h}))}t.min(...a),n.max(...a)}}),{min:t,max:n}}getBoundingBox(t=!0){const{min:n,max:r}=this.getMinMax(void 0,void 0,t);return new G(n.x,n.y,r.x-n.x,r.y-n.y)}drawTo(t,n={}){n={...this.style,...n};const{fill:r="#000",stroke:o="none"}=n;return t.beginPath(),t.save(),At(t,n),this.curves.forEach(s=>{s.drawTo(t)}),r!=="none"&&t.fill(),o!=="none"&&t.stroke(),t.restore(),this}drawControlPointsTo(t,n={}){n={...this.style,...n};const{fill:r="#000",stroke:o="none"}=n;return t.beginPath(),t.save(),At(t,n),this.getControlPointRefs().forEach(s=>{R(t,s.x,s.y,{radius:4})}),r!=="none"&&t.fill(),o!=="none"&&t.stroke(),t.restore(),this}toCommands(){return this.curves.flatMap(t=>t.toCommands())}toData(){return this.curves.filter(t=>t.curves.length).map(t=>t.toData()).join(" ")}toSVGPathString(){const t={...this.style,fill:this.style.fill??"#000",stroke:this.style.stroke??"none"},n={};for(const o in t)t[o]!==void 0&&(n[an(o)]=t[o]);Object.assign(n,{"stroke-width":`${this.strokeWidth}px`});let r="";for(const o in n)n[o]!==void 0&&(r+=`${o}:${n[o]};`);return`<path d="${this.toData()}" style="${r}"></path>`}copy(t){return super.copy(t),this.currentCurve=t.currentCurve.clone(),this.style={...t.style},this}}class le{constructor(e=[],t){this.paths=e,this.viewBox=t}getBoundingBox(e=!0){if(!this.paths.length)return;const t=p.MAX,n=p.MIN;return this.paths.forEach(r=>r.getMinMax(t,n,e)),new G(t.x,t.y,n.x-t.x,n.y-t.y)}toSVGString(){const{x:e,y:t,width:n,height:r}=this.getBoundingBox(),o=this.paths.map(s=>s.toSVGPathString()).join("");return`<svg viewBox="${e} ${t} ${n} ${r}" width="${n}px" height="${r}px" xmlns="http://www.w3.org/2000/svg">${o}</svg>`}toSVGUrl(){return`data:image/svg+xml;base64,${btoa(this.toSVGString())}`}toSVG(){return new DOMParser().parseFromString(this.toSVGString(),"image/svg+xml").documentElement}toCanvas(e={}){const{pixelRatio:t=2,...n}=e,{left:r,top:o,width:s,height:h}=this.getBoundingBox(),c=document.createElement("canvas");c.width=s*t,c.height=h*t,c.style.width=`${s}px`,c.style.height=`${h}px`;const a=c.getContext("2d");return a&&(a.scale(t,t),a.translate(-r,-o),this.paths.forEach(l=>{l.drawTo(a,n)})),c}}const ue="data:image/svg+xml;",fe=`${ue}base64,`,ye=`${ue}charset=utf8,`;function xe(i){if(typeof i=="string"){let e;i.startsWith(fe)?(i=i.substring(fe.length,i.length),e=atob(i)):i.startsWith(ye)?(i=i.substring(ye.length,i.length),e=decodeURIComponent(i)):e=i;const t=new DOMParser().parseFromString(e,"text/xml"),n=t.querySelector("parsererror");if(n)throw new Error(`${n.textContent??"parser error"}
2
- ${e}`);return t.documentElement}else return i}const un="px",fn=90,pe=["mm","cm","in","pt","pc","px"],ge={mm:{mm:1,cm:.1,in:1/25.4,pt:72/25.4,pc:6/25.4,px:-1},cm:{mm:10,cm:1,in:1/2.54,pt:72/2.54,pc:6/2.54,px:-1},in:{mm:25.4,cm:2.54,in:1,pt:72,pc:6,px:-1},pt:{mm:25.4/72,cm:2.54/72,in:1/72,pt:1,pc:6/72,px:-1},pc:{mm:25.4/6,cm:2.54/6,in:1/6,pt:72/6,pc:1,px:-1},px:{px:1}};function L(i){let e="px";if(typeof i=="string"||i instanceof String)for(let n=0,r=pe.length;n<r;n++){const o=pe[n];if(i.endsWith(o)){e=o,i=i.substring(0,i.length-o.length);break}}let t;return t=ge[e][un],t<0&&(t=ge[e].in*fn),t*Number.parseFloat(i)}const yn=new z,Pt=new z,de=new z,me=new z;function xn(i,e,t){if(!(i.hasAttribute("transform")||i.nodeName==="use"&&(i.hasAttribute("x")||i.hasAttribute("y"))))return null;const n=pn(i);return t.length>0&&n.premultiply(t[t.length-1]),e.copy(n),t.push(n),n}function pn(i){const e=new z,t=yn;if(i.nodeName==="use"&&(i.hasAttribute("x")||i.hasAttribute("y"))&&e.translate(L(i.getAttribute("x")),L(i.getAttribute("y"))),i.hasAttribute("transform")){const n=i.getAttribute("transform").split(")");for(let r=n.length-1;r>=0;r--){const o=n[r].trim();if(o==="")continue;const s=o.indexOf("("),h=o.length;if(s>0&&s<h){const c=o.slice(0,s),a=Z(o.slice(s+1));switch(t.identity(),c){case"translate":if(a.length>=1){const l=a[0];let f=0;a.length>=2&&(f=a[1]),t.translate(l,f)}break;case"rotate":if(a.length>=1){let l=0,f=0,y=0;l=a[0]*Math.PI/180,a.length>=3&&(f=a[1],y=a[2]),Pt.makeTranslation(-f,-y),de.makeRotation(l),me.multiplyMatrices(de,Pt),Pt.makeTranslation(f,y),t.multiplyMatrices(Pt,me)}break;case"scale":a.length>=1&&t.scale(a[0],a[1]??a[0]);break;case"skewX":a.length===1&&t.set(1,Math.tan(a[0]*Math.PI/180),0,0,1,0,0,0,1);break;case"skewY":a.length===1&&t.set(1,0,0,Math.tan(a[0]*Math.PI/180),1,0,0,0,1);break;case"matrix":a.length===6&&t.set(a[0],a[2],a[4],a[1],a[3],a[5],0,0,1);break}}e.premultiply(t)}}return e}function gn(i){return new j().arc(L(i.getAttribute("cx")||0),L(i.getAttribute("cy")||0),L(i.getAttribute("r")||0),0,Math.PI*2)}function dn(i,e){if(!(!i.sheet||!i.sheet.cssRules||!i.sheet.cssRules.length))for(let t=0;t<i.sheet.cssRules.length;t++){const n=i.sheet.cssRules[t];if(n.type!==1)continue;const r=n.selectorText.split(/,/g).filter(Boolean).map(s=>s.trim()),o={};for(let s=n.style.length,h=0;h<s;h++){const c=n.style.item(h);o[c]=n.style.getPropertyValue(c)}for(let s=0;s<r.length;s++)e[r[s]]=Object.assign(e[r[s]]||{},{...o})}}function mn(i){return new j().ellipse(L(i.getAttribute("cx")||0),L(i.getAttribute("cy")||0),L(i.getAttribute("rx")||0),L(i.getAttribute("ry")||0),0,0,Math.PI*2)}function Mn(i){return new j().moveTo(L(i.getAttribute("x1")||0),L(i.getAttribute("y1")||0)).lineTo(L(i.getAttribute("x2")||0),L(i.getAttribute("y2")||0))}function wn(i){const e=new j,t=i.getAttribute("d");return!t||t==="none"?null:(e.addData(t),e)}const Pn=/([+-]?(?:\d+(?:\.\d+)?|\.\d+)(?:e[+-]?\d+)?)(?:,|\s)([+-]?\d*\.?\d+(?:e[+-]?\d+)?)/g;function vn(i){var n;const e=new j;let t=0;return(n=i.getAttribute("points"))==null||n.replace(Pn,(r,o,s)=>{const h=L(o),c=L(s);return t===0?e.moveTo(h,c):e.lineTo(h,c),t++,r}),e.currentCurve.autoClose=!0,e}const Tn=/([+-]?(?:\d+(?:\.\d+)?|\.\d+)(?:e[+-]?\d+)?)(?:,|\s)([+-]?\d*\.?\d+(?:e[+-]?\d+)?)/g;function Cn(i){var n;const e=new j;let t=0;return(n=i.getAttribute("points"))==null||n.replace(Tn,(r,o,s)=>{const h=L(o),c=L(s);return t===0?e.moveTo(h,c):e.lineTo(h,c),t++,r}),e.currentCurve.autoClose=!1,e}function An(i){const e=L(i.getAttribute("x")||0),t=L(i.getAttribute("y")||0),n=L(i.getAttribute("rx")||i.getAttribute("ry")||0),r=L(i.getAttribute("ry")||i.getAttribute("rx")||0),o=L(i.getAttribute("width")),s=L(i.getAttribute("height")),h=1-.551915024494,c=new j;return c.moveTo(e+n,t),c.lineTo(e+o-n,t),(n!==0||r!==0)&&c.bezierCurveTo(e+o-n*h,t,e+o,t+r*h,e+o,t+r),c.lineTo(e+o,t+s-r),(n!==0||r!==0)&&c.bezierCurveTo(e+o,t+s-r*h,e+o-n*h,t+s,e+o-n,t+s),c.lineTo(e+n,t+s),(n!==0||r!==0)&&c.bezierCurveTo(e+n*h,t+s,e,t+s-r*h,e,t+s-r),c.lineTo(e,t+r),(n!==0||r!==0)&&c.bezierCurveTo(e,t+r*h,e+n*h,t,e+n,t),c}function B(i,e,t){e=Object.assign({},e);let n={};if(i.hasAttribute("class")){const a=i.getAttribute("class").split(/\s/).filter(Boolean).map(l=>l.trim());for(let l=0;l<a.length;l++)n=Object.assign(n,t[`.${a[l]}`])}i.hasAttribute("id")&&(n=Object.assign(n,t[`#${i.getAttribute("id")}`]));for(let a=i.style.length,l=0;l<a;l++){const f=i.style.item(l),y=i.style.getPropertyValue(f);e[f]=y,n[f]=y}function r(a,l,f=o){i.hasAttribute(a)&&(e[l]=f(i.getAttribute(a))),n[a]&&(e[l]=f(n[a]))}function o(a){return a.startsWith("url")&&console.warn("url access in attributes is not implemented."),a}function s(a){return Math.max(0,Math.min(1,L(a)))}function h(a){return Math.max(0,L(a))}function c(a){return a.split(" ").filter(l=>l!=="").map(l=>L(l))}return r("fill","fill"),r("fill-opacity","fillOpacity",s),r("fill-rule","fillRule"),r("opacity","opacity",s),r("stroke","stroke"),r("stroke-opacity","strokeOpacity",s),r("stroke-width","strokeWidth",h),r("stroke-linecap","strokeLinecap"),r("stroke-linejoin","strokeLinejoin"),r("stroke-miterlimit","strokeMiterlimit",h),r("stroke-dasharray","strokeDasharray",c),r("stroke-dashoffset","strokeDashoffset",L),r("visibility","visibility"),e}function _t(i,e,t=[],n={}){var f;if(i.nodeType!==1)return t;let r=!1,o=null,s={...e};switch(i.nodeName){case"svg":s=B(i,s,n);break;case"style":dn(i,n);break;case"g":s=B(i,s,n);break;case"path":s=B(i,s,n),i.hasAttribute("d")&&(o=wn(i));break;case"rect":s=B(i,s,n),o=An(i);break;case"polygon":s=B(i,s,n),o=vn(i);break;case"polyline":s=B(i,s,n),o=Cn(i);break;case"circle":s=B(i,s,n),o=gn(i);break;case"ellipse":s=B(i,s,n),o=mn(i);break;case"line":s=B(i,s,n),o=Mn(i);break;case"defs":r=!0;break;case"use":{s=B(i,s,n);const x=(i.getAttributeNS("http://www.w3.org/1999/xlink","href")||i.getAttribute("href")||"").substring(1),u=(f=i.viewportElement)==null?void 0:f.getElementById(x);u?_t(u,s,t,n):console.warn(`'use node' references non-existent node id: ${x}`);break}default:console.warn(i);break}if(s.display==="none")return t;const h=new z,c=[],a=xn(i,h,c);o&&(o.applyTransform(h),t.push(o),o.style={...s});const l=i.childNodes;for(let y=0,x=l.length;y<x;y++){const u=l[y];r&&u.nodeName!=="style"&&u.nodeName!=="defs"||_t(u,s,t,n)}return a&&(c.pop(),c.length>0?h.copy(c[c.length-1]):h.identity()),t}function bn(i){var t;const e=xe(i);return new le(_t(e,{}),(t=e.getAttribute("viewBox"))==null?void 0:t.trim().split(" ").map(n=>Number(n)))}v.ArcCurve=re,v.BoundingBox=G,v.CompositeCurve=rt,v.CubicBezierCurve=Mt,v.Curve=Y,v.CurvePath=lt,v.EllipseCurve=oe,v.EquilateralPloygonCurve=hn,v.LineCurve=X,v.Matrix3=z,v.Path2D=j,v.Path2DSet=le,v.PloygonCurve=Ot,v.QuadraticBezierCurve=wt,v.RectangleCurve=ce,v.RoundRectangleCurve=he,v.SplineCurve=ae,v.Vector2=p,v.catmullRom=St,v.cubicBezier=Et,v.drawPoint=R,v.fillTriangulate=Wt,v.getAdaptiveCubicBezierCurvePoints=Ht,v.getAdaptiveQuadraticBezierCurvePoints=Qt,v.parseArcCommand=Zt,v.parsePathDataArgs=Z,v.quadraticBezier=Ft,v.setCanvasContext=At,v.strokeTriangulate=Jt,v.svgPathCommandsAddToPath2D=kt,v.svgPathCommandsToData=jt,v.svgPathDataToCommands=It,v.svgToDOM=xe,v.svgToPath2DSet=bn,Object.defineProperty(v,Symbol.toStringTag,{value:"Module"})});
1
+ (function(v,R){typeof exports=="object"&&typeof module<"u"?R(exports):typeof define=="function"&&define.amd?define(["exports"],R):(v=typeof globalThis<"u"?globalThis:v||self,R(v.modernPath2d={}))})(this,function(v){"use strict";var En=Object.defineProperty;var Ln=(v,R,nt)=>R in v?En(v,R,{enumerable:!0,configurable:!0,writable:!0,value:nt}):v[R]=nt;var W=(v,R,nt)=>Ln(v,typeof R!="symbol"?R+"":R,nt);function R(i,e,t,n={}){const{radius:r=1}=n;i.moveTo(e,t),i.arc(e,t,r,0,Math.PI*2)}const nt={arcs:"bevel",bevel:"bevel",miter:"miter","miter-clip":"miter",round:"round"};function Ct(i,e){const{fill:t="#000",stroke:n="none",strokeWidth:r=n==="none"?0:1,strokeLinecap:o="round",strokeLinejoin:s="miter",strokeMiterlimit:h=0,strokeDasharray:c=[],strokeDashoffset:a=0,shadowOffsetX:l=0,shadowOffsetY:y=0,shadowBlur:f=0,shadowColor:x="rgba(0, 0, 0, 0)"}=e;i.fillStyle=t,i.strokeStyle=n,i.lineWidth=r,i.lineCap=o,i.lineJoin=nt[s],i.miterLimit=h,i.setLineDash(c),i.lineDashOffset=a,i.shadowOffsetX=l,i.shadowOffsetY=y,i.shadowBlur=f,i.shadowColor=x}class p{constructor(e=0,t=0){this.x=e,this.y=t}static get MAX(){return new p(1/0,1/0)}static get MIN(){return new p(-1/0,-1/0)}get array(){return[this.x,this.y]}set(e,t){return this.x=e,this.y=t,this}add(e){return this.x+=e.x,this.y+=e.y,this}sub(e){return this.x-=e.x,this.y-=e.y,this}multiply(e){return this.x*=e.x,this.y*=e.y,this}divide(e){return this.x/=e.x,this.y/=e.y,this}dot(e){return this.x*e.x+this.y*e.y}cross(e){return this.x*e.y-this.y*e.x}rotate(e,t={x:0,y:0}){const n=-e/180*Math.PI,r=this.x-t.x,o=-(this.y-t.y),s=Math.sin(n),h=Math.cos(n);return this.set(t.x+(r*h-o*s),t.y-(r*s+o*h)),this}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){const t=this.x-e.x,n=this.y-e.y;return t*t+n*n}lengthSquared(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.lengthSquared())}scale(e,t=e,n={x:0,y:0}){const r=e<0?n.x-this.x+n.x:this.x,o=t<0?n.y-this.y+n.y:this.y;return this.x=r*Math.abs(e),this.y=o*Math.abs(t),this}skew(e,t=0,n={x:0,y:0}){const r=this.x-n.x,o=this.y-n.y;return this.x=n.x+(r+Math.tan(e)*o),this.y=n.y+(o+Math.tan(t)*r),this}min(...e){return this.x=Math.min(this.x,...e.map(t=>t.x)),this.y=Math.min(this.y,...e.map(t=>t.y)),this}max(...e){return this.x=Math.max(this.x,...e.map(t=>t.x)),this.y=Math.max(this.y,...e.map(t=>t.y)),this}normalize(){return this.scale(1/(this.length()||1))}addVectors(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this}multiplyVectors(e,t){return this.x=e.x*t.x,this.y=e.y*t.y,this}divideVectors(e,t){return this.x=e.x/t.x,this.y=e.y/t.y,this}lerpVectors(e,t,n){return this.x=e.x+(t.x-e.x)*n,this.y=e.y+(t.y-e.y)*n,this}equals(e){return this.x===e.x&&this.y===e.y}applyMatrix3(e){const t=this.x,n=this.y,r=e.elements;return this.x=r[0]*t+r[3]*n+r[6],this.y=r[1]*t+r[4]*n+r[7],this}copy(e){return this.x=e.x,this.y=e.y,this}clone(){return new p(this.x,this.y)}}class V{constructor(e=0,t=0,n=0,r=0){this.left=e,this.top=t,this.width=n,this.height=r}get x(){return this.left}set x(e){this.left=e}get y(){return this.top}set y(e){this.top=e}get right(){return this.left+this.width}get bottom(){return this.top+this.height}get center(){return new p((this.left+this.right)/2,(this.top+this.bottom)/2)}get array(){return[this.left,this.top,this.width,this.height]}static from(...e){if(e.length===0)return new V;if(e.length===1)return e[0].clone();const t=e[0],n=e.slice(1).reduce((r,o)=>(r.left=Math.min(r.left,o.left),r.top=Math.min(r.top,o.top),r.right=Math.max(r.right,o.right),r.bottom=Math.max(r.bottom,o.bottom),r),{left:(t==null?void 0:t.left)??0,top:(t==null?void 0:t.top)??0,right:(t==null?void 0:t.right)??0,bottom:(t==null?void 0:t.bottom)??0});return new V(n.left,n.top,n.right-n.left,n.bottom-n.top)}translate(e,t){return this.left+=e,this.top+=t,this}copy(e){return this.left=e.left,this.top=e.top,this.width=e.width,this.height=e.height,this}clone(){return new V(this.left,this.top,this.width,this.height)}}class z{constructor(e=1,t=0,n=0,r=0,o=1,s=0,h=0,c=0,a=1){W(this,"elements",[]);this.set(e,t,n,r,o,s,h,c,a)}set(e,t,n,r,o,s,h,c,a){const l=this.elements;return l[0]=e,l[1]=r,l[2]=h,l[3]=t,l[4]=o,l[5]=c,l[6]=n,l[7]=s,l[8]=a,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(e){const t=this.elements,n=e.elements;return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t[6]=n[6],t[7]=n[7],t[8]=n[8],this}multiply(e){return this.multiplyMatrices(this,e)}premultiply(e){return this.multiplyMatrices(e,this)}multiplyMatrices(e,t){const n=e.elements,r=t.elements,o=this.elements,s=n[0],h=n[3],c=n[6],a=n[1],l=n[4],y=n[7],f=n[2],x=n[5],u=n[8],m=r[0],M=r[3],k=r[6],S=r[1],P=r[4],w=r[7],I=r[2],E=r[5],g=r[8];return o[0]=s*m+h*S+c*I,o[3]=s*M+h*P+c*E,o[6]=s*k+h*w+c*g,o[1]=a*m+l*S+y*I,o[4]=a*M+l*P+y*E,o[7]=a*k+l*w+y*g,o[2]=f*m+x*S+u*I,o[5]=f*M+x*P+u*E,o[8]=f*k+x*w+u*g,this}invert(){const e=this.elements,t=e[0],n=e[1],r=e[2],o=e[3],s=e[4],h=e[5],c=e[6],a=e[7],l=e[8],y=l*s-h*a,f=h*c-l*o,x=a*o-s*c,u=t*y+n*f+r*x;if(u===0)return this.set(0,0,0,0,0,0,0,0,0);const m=1/u;return e[0]=y*m,e[1]=(r*a-l*n)*m,e[2]=(h*n-r*s)*m,e[3]=f*m,e[4]=(l*t-r*c)*m,e[5]=(r*o-h*t)*m,e[6]=x*m,e[7]=(n*c-a*t)*m,e[8]=(s*t-n*o)*m,this}transpose(){let e;const t=this.elements;return e=t[1],t[1]=t[3],t[3]=e,e=t[2],t[2]=t[6],t[6]=e,e=t[5],t[5]=t[7],t[7]=e,this}scale(e,t){return this.premultiply(bt.makeScale(e,t)),this}rotate(e){return this.premultiply(bt.makeRotation(-e)),this}translate(e,t){return this.premultiply(bt.makeTranslation(e,t)),this}makeTranslation(e,t){return this.set(1,0,e,0,1,t,0,0,1),this}makeRotation(e){const t=Math.cos(e),n=Math.sin(e);return this.set(t,-n,0,n,t,0,0,0,1),this}makeScale(e,t){return this.set(e,0,0,0,t,0,0,0,1),this}fromArray(e,t=0){for(let n=0;n<9;n++)this.elements[n]=e[n+t];return this}clone(){return new this.constructor().fromArray(this.elements)}}const bt=new z;function zt(i,e,t,n){const r=i*t+e*n,o=Math.sqrt(i*i+e*e)*Math.sqrt(t*t+n*n);let s=Math.acos(Math.max(-1,Math.min(1,r/o)));return i*n-e*t<0&&(s=-s),s}function Zt(i,e,t,n,r,o,s,h){if(e===0||t===0){i.lineTo(h.x,h.y);return}n=n*Math.PI/180,e=Math.abs(e),t=Math.abs(t);const c=(s.x-h.x)/2,a=(s.y-h.y)/2,l=Math.cos(n)*c+Math.sin(n)*a,y=-Math.sin(n)*c+Math.cos(n)*a;let f=e*e,x=t*t;const u=l*l,m=y*y,M=u/f+m/x;if(M>1){const O=Math.sqrt(M);e=O*e,t=O*t,f=e*e,x=t*t}const k=f*m+x*u,S=(f*x-k)/k;let P=Math.sqrt(Math.max(0,S));r===o&&(P=-P);const w=P*e*y/t,I=-P*t*l/e,E=Math.cos(n)*w-Math.sin(n)*I+(s.x+h.x)/2,g=Math.sin(n)*w+Math.cos(n)*I+(s.y+h.y)/2,d=zt(1,0,(l-w)/e,(y-I)/t),F=zt((l-w)/e,(y-I)/t,(-l-w)/e,(-y-I)/t)%(Math.PI*2);i.ellipse(E,g,e,t,n,d,d+F,o===0)}const _={SEPARATOR:/[ \t\r\n,.\-+]/,WHITESPACE:/[ \t\r\n]/,DIGIT:/\d/,SIGN:/[-+]/,POINT:/\./,COMMA:/,/,EXP:/e/i,FLAGS:/[01]/};function Z(i,e,t=0){let h=0,c=!0,a="",l="";const y=[];function f(M,k,S){const P=new SyntaxError(`Unexpected character "${M}" at index ${k}.`);throw P.partial=S,P}function x(){a!==""&&(l===""?y.push(Number(a)):y.push(Number(a)*10**Number(l))),a="",l=""}let u;const m=i.length;for(let M=0;M<m;M++){if(u=i[M],Array.isArray(e)&&e.includes(y.length%t)&&_.FLAGS.test(u)){h=1,a=u,x();continue}if(h===0){if(_.WHITESPACE.test(u))continue;if(_.DIGIT.test(u)||_.SIGN.test(u)){h=1,a=u;continue}if(_.POINT.test(u)){h=2,a=u;continue}_.COMMA.test(u)&&(c&&f(u,M,y),c=!0)}if(h===1){if(_.DIGIT.test(u)){a+=u;continue}if(_.POINT.test(u)){a+=u,h=2;continue}if(_.EXP.test(u)){h=3;continue}_.SIGN.test(u)&&a.length===1&&_.SIGN.test(a[0])&&f(u,M,y)}if(h===2){if(_.DIGIT.test(u)){a+=u;continue}if(_.EXP.test(u)){h=3;continue}_.POINT.test(u)&&a[a.length-1]==="."&&f(u,M,y)}if(h===3){if(_.DIGIT.test(u)){l+=u;continue}if(_.SIGN.test(u)){if(l===""){l+=u;continue}l.length===1&&_.SIGN.test(l)&&f(u,M,y)}}_.WHITESPACE.test(u)?(x(),h=0,c=!1):_.COMMA.test(u)?(x(),h=0,c=!0):_.SIGN.test(u)?(x(),h=1,a=u):_.POINT.test(u)?(x(),h=2,a=u):f(u,M,y)}return x(),y}function st(i,e){return i-(e-i)}function kt(i,e){const t=new p,n=new p;for(let r=0,o=i.length;r<o;r++){const s=i[r];if(s.type==="m"||s.type==="M")s.type==="m"?t.add(s):t.copy(s),e.moveTo(t.x,t.y),n.copy(t);else if(s.type==="h"||s.type==="H")s.type==="h"?t.x+=s.x:t.x=s.x,e.lineTo(t.x,t.y),n.copy(t);else if(s.type==="v"||s.type==="V")s.type==="v"?t.y+=s.y:t.y=s.y,e.lineTo(t.x,t.y),n.copy(t);else if(s.type==="l"||s.type==="L")s.type==="l"?t.add(s):t.copy(s),e.lineTo(t.x,t.y),n.copy(t);else if(s.type==="c"||s.type==="C")s.type==="c"?(e.bezierCurveTo(t.x+s.x1,t.y+s.y1,t.x+s.x2,t.y+s.y2,t.x+s.x,t.y+s.y),n.x=t.x+s.x2,n.y=t.y+s.y2,t.add(s)):(e.bezierCurveTo(s.x1,s.y1,s.x2,s.y2,s.x,s.y),n.x=s.x2,n.y=s.y2,t.copy(s));else if(s.type==="s"||s.type==="S")s.type==="s"?(e.bezierCurveTo(st(t.x,n.x),st(t.y,n.y),t.x+s.x2,t.y+s.y2,t.x+s.x,t.y+s.y),n.x=t.x+s.x2,n.y=t.y+s.y2,t.add(s)):(e.bezierCurveTo(st(t.x,n.x),st(t.y,n.y),s.x2,s.y2,s.x,s.y),n.x=s.x2,n.y=s.y2,t.copy(s));else if(s.type==="q"||s.type==="Q")s.type==="q"?(e.quadraticCurveTo(t.x+s.x1,t.y+s.y1,t.x+s.x,t.y+s.y),n.x=t.x+s.x1,n.y=t.y+s.y1,t.add(s)):(e.quadraticCurveTo(s.x1,s.y1,s.x,s.y),n.x=s.x1,n.y=s.y1,t.copy(s));else if(s.type==="t"||s.type==="T"){const h=st(t.x,n.x),c=st(t.y,n.y);n.x=h,n.y=c,s.type==="t"?(e.quadraticCurveTo(h,c,t.x+s.x,t.y+s.y),t.add(s)):(e.quadraticCurveTo(h,c,s.x,s.y),t.copy(s))}else if(s.type==="a"||s.type==="A"){const h=t.clone();if(s.type==="a"){if(s.x===0&&s.y===0)continue;t.add(s)}else{if(t.equals(s))continue;t.copy(s)}n.copy(t),Zt(e,s.rx,s.ry,s.angle,s.largeArcFlag,s.sweepFlag,h,t)}else s.type==="z"||s.type==="Z"?(e.startPoint&&t.copy(e.startPoint),e.closePath()):console.warn("Unsupported commands",s)}}function Ut(i){let e,t;const n=[];for(let r=0,o=i.length;r<o;r++){const s=i[r];switch(s.type){case"m":case"M":if(s.x.toFixed(4)===(t==null?void 0:t.x.toFixed(4))&&s.y.toFixed(4)===(t==null?void 0:t.y.toFixed(4)))continue;n.push(`${s.type} ${s.x} ${s.y}`),t={x:s.x,y:s.y},e={x:s.x,y:s.y};break;case"h":case"H":n.push(`${s.type} ${s.x}`),t={x:s.x,y:(t==null?void 0:t.y)??0};break;case"v":case"V":n.push(`${s.type} ${s.y}`),t={x:(t==null?void 0:t.x)??0,y:s.y};break;case"l":case"L":n.push(`${s.type} ${s.x} ${s.y}`),t={x:s.x,y:s.y};break;case"c":case"C":n.push(`${s.type} ${s.x1} ${s.y1} ${s.x2} ${s.y2} ${s.x} ${s.y}`),t={x:s.x,y:s.y};break;case"s":case"S":n.push(`${s.type} ${s.x2} ${s.y2} ${s.x} ${s.y}`),t={x:s.x,y:s.y};break;case"q":case"Q":n.push(`${s.type} ${s.x1} ${s.y1} ${s.x} ${s.y}`),t={x:s.x,y:s.y};break;case"t":case"T":n.push(`${s.type} ${s.x} ${s.y}`),t={x:s.x,y:s.y};break;case"a":case"A":n.push(`${s.type} ${s.rx} ${s.ry} ${s.angle} ${s.largeArcFlag} ${s.sweepFlag} ${s.x} ${s.y}`),t={x:s.x,y:s.y};break;case"z":case"Z":n.push(s.type),e&&(t={x:e.x,y:e.y});break}}return n.join(" ")}const Ae=/[a-df-z][^a-df-z]*/gi;function It(i){const e=[],t=i.match(Ae);if(!t)return e;for(let n=0,r=t.length;n<r;n++){const o=t[n],s=o.charAt(0),h=o.slice(1).trim();let c;switch(s){case"m":case"M":c=Z(h);for(let a=0,l=c.length;a<l;a+=2)a===0?e.push({type:s,x:c[a],y:c[a+1]}):e.push({type:s==="m"?"l":"L",x:c[a],y:c[a+1]});break;case"h":case"H":c=Z(h);for(let a=0,l=c.length;a<l;a++)e.push({type:s,x:c[a]});break;case"v":case"V":c=Z(h);for(let a=0,l=c.length;a<l;a++)e.push({type:s,y:c[a]});break;case"l":case"L":c=Z(h);for(let a=0,l=c.length;a<l;a+=2)e.push({type:s,x:c[a],y:c[a+1]});break;case"c":case"C":c=Z(h);for(let a=0,l=c.length;a<l;a+=6)e.push({type:s,x1:c[a],y1:c[a+1],x2:c[a+2],y2:c[a+3],x:c[a+4],y:c[a+5]});break;case"s":case"S":c=Z(h);for(let a=0,l=c.length;a<l;a+=4)e.push({type:s,x2:c[a],y2:c[a+1],x:c[a+2],y:c[a+3]});break;case"q":case"Q":c=Z(h);for(let a=0,l=c.length;a<l;a+=4)e.push({type:s,x1:c[a],y1:c[a+1],x:c[a+2],y:c[a+3]});break;case"t":case"T":c=Z(h);for(let a=0,l=c.length;a<l;a+=2)e.push({type:s,x:c[a],y:c[a+1]});break;case"a":case"A":c=Z(h,[3,4],7);for(let a=0,l=c.length;a<l;a+=7)e.push({type:s,rx:c[a],ry:c[a+1],angle:c[a+2],largeArcFlag:c[a+3],sweepFlag:c[a+4],x:c[a+5],y:c[a+6]});break;case"z":case"Z":e.push({type:s});break;default:console.warn(o)}}return e}function St(i,e,t,n,r){const o=(n-e)*.5,s=(r-t)*.5,h=i*i,c=i*h;return(2*t-2*n+o+s)*c+(-3*t+3*n-2*o-s)*h+o*i+t}function Ce(i,e){const t=1-i;return t*t*t*e}function be(i,e){const t=1-i;return 3*t*t*i*e}function ke(i,e){return 3*(1-i)*i*i*e}function Ie(i,e){return i*i*i*e}function Et(i,e,t,n,r){return Ce(i,e)+be(i,t)+ke(i,n)+Ie(i,r)}function Se(i,e,t=2){const n=e&&e.length,r=n?e[0]*t:i.length;let o=Xt(i,0,r,t,!0);const s=[];if(!o||o.next===o.prev)return s;let h,c,a;if(n&&(o=_e(i,e,o,t)),i.length>80*t){h=1/0,c=1/0;let l=-1/0,y=-1/0;for(let f=t;f<r;f+=t){const x=i[f],u=i[f+1];x<h&&(h=x),u<c&&(c=u),x>l&&(l=x),u>y&&(y=u)}a=Math.max(l-h,y-c),a=a!==0?32767/a:0}return ot(o,s,t,h,c,a,0),s}function Xt(i,e,t,n,r){let o;if(r===Ge(i,e,t,n)>0)for(let s=e;s<t;s+=n)o=Wt(s/n|0,i[s],i[s+1],o);else for(let s=t-n;s>=e;s-=n)o=Wt(s/n|0,i[s],i[s+1],o);return o&&it(o,o.next)&&(at(o),o=o.next),o}function H(i,e){if(!i)return i;e||(e=i);let t=i,n;do if(n=!1,!t.steiner&&(it(t,t.next)||$(t.prev,t,t.next)===0)){if(at(t),t=e=t.prev,t===t.next)break;n=!0}else t=t.next;while(n||t!==e);return e}function ot(i,e,t,n,r,o,s){if(!i)return;!s&&o&&Re(i,n,r,o);let h=i;for(;i.prev!==i.next;){const c=i.prev,a=i.next;if(o?Le(i,n,r,o):Ee(i)){e.push(c.i,i.i,a.i),at(i),i=a.next,h=a.next;continue}if(i=a,i===h){s?s===1?(i=Ne(H(i),e),ot(i,e,t,n,r,o,2)):s===2&&$e(i,e,t,n,r,o):ot(H(i),e,t,n,r,o,1);break}}}function Ee(i){const e=i.prev,t=i,n=i.next;if($(e,t,n)>=0)return!1;const r=e.x,o=t.x,s=n.x,h=e.y,c=t.y,a=n.y,l=Math.min(r,o,s),y=Math.min(h,c,a),f=Math.max(r,o,s),x=Math.max(h,c,a);let u=n.next;for(;u!==e;){if(u.x>=l&&u.x<=f&&u.y>=y&&u.y<=x&&ct(r,h,o,c,s,a,u.x,u.y)&&$(u.prev,u,u.next)>=0)return!1;u=u.next}return!0}function Le(i,e,t,n){const r=i.prev,o=i,s=i.next;if($(r,o,s)>=0)return!1;const h=r.x,c=o.x,a=s.x,l=r.y,y=o.y,f=s.y,x=Math.min(h,c,a),u=Math.min(l,y,f),m=Math.max(h,c,a),M=Math.max(l,y,f),k=Lt(x,u,e,t,n),S=Lt(m,M,e,t,n);let P=i.prevZ,w=i.nextZ;for(;P&&P.z>=k&&w&&w.z<=S;){if(P.x>=x&&P.x<=m&&P.y>=u&&P.y<=M&&P!==r&&P!==s&&ct(h,l,c,y,a,f,P.x,P.y)&&$(P.prev,P,P.next)>=0||(P=P.prevZ,w.x>=x&&w.x<=m&&w.y>=u&&w.y<=M&&w!==r&&w!==s&&ct(h,l,c,y,a,f,w.x,w.y)&&$(w.prev,w,w.next)>=0))return!1;w=w.nextZ}for(;P&&P.z>=k;){if(P.x>=x&&P.x<=m&&P.y>=u&&P.y<=M&&P!==r&&P!==s&&ct(h,l,c,y,a,f,P.x,P.y)&&$(P.prev,P,P.next)>=0)return!1;P=P.prevZ}for(;w&&w.z<=S;){if(w.x>=x&&w.x<=m&&w.y>=u&&w.y<=M&&w!==r&&w!==s&&ct(h,l,c,y,a,f,w.x,w.y)&&$(w.prev,w,w.next)>=0)return!1;w=w.nextZ}return!0}function Ne(i,e){let t=i;do{const n=t.prev,r=t.next.next;!it(n,r)&&Gt(n,t,t.next,r)&&ht(n,r)&&ht(r,n)&&(e.push(n.i,t.i,r.i),at(t),at(t.next),t=i=r),t=t.next}while(t!==i);return H(t)}function $e(i,e,t,n,r,o){let s=i;do{let h=s.next.next;for(;h!==s.prev;){if(s.i!==h.i&&Ue(s,h)){let c=Vt(s,h);s=H(s,s.next),c=H(c,c.next),ot(s,e,t,n,r,o,0),ot(c,e,t,n,r,o,0);return}h=h.next}s=s.next}while(s!==i)}function _e(i,e,t,n){const r=[];for(let o=0,s=e.length;o<s;o++){const h=e[o]*n,c=o<s-1?e[o+1]*n:i.length,a=Xt(i,h,c,n,!1);a===a.next&&(a.steiner=!0),r.push(Ze(a))}r.sort(De);for(let o=0;o<r.length;o++)t=qe(r[o],t);return t}function De(i,e){let t=i.x-e.x;if(t===0&&(t=i.y-e.y,t===0)){const n=(i.next.y-i.y)/(i.next.x-i.x),r=(e.next.y-e.y)/(e.next.x-e.x);t=n-r}return t}function qe(i,e){const t=Fe(i,e);if(!t)return e;const n=Vt(t,i);return H(n,n.next),H(t,t.next)}function Fe(i,e){let t=e;const n=i.x,r=i.y;let o=-1/0,s;if(it(i,t))return t;do{if(it(i,t.next))return t.next;if(r<=t.y&&r>=t.next.y&&t.next.y!==t.y){const y=t.x+(r-t.y)*(t.next.x-t.x)/(t.next.y-t.y);if(y<=n&&y>o&&(o=y,s=t.x<t.next.x?t:t.next,y===n))return s}t=t.next}while(t!==e);if(!s)return null;const h=s,c=s.x,a=s.y;let l=1/0;t=s;do{if(n>=t.x&&t.x>=c&&n!==t.x&&Bt(r<a?n:o,r,c,a,r<a?o:n,r,t.x,t.y)){const y=Math.abs(r-t.y)/(n-t.x);ht(t,i)&&(y<l||y===l&&(t.x>s.x||t.x===s.x&&Oe(s,t)))&&(s=t,l=y)}t=t.next}while(t!==h);return s}function Oe(i,e){return $(i.prev,i,e.prev)<0&&$(e.next,i,i.next)<0}function Re(i,e,t,n){let r=i;do r.z===0&&(r.z=Lt(r.x,r.y,e,t,n)),r.prevZ=r.prev,r.nextZ=r.next,r=r.next;while(r!==i);r.prevZ.nextZ=null,r.prevZ=null,ze(r)}function ze(i){let e,t=1;do{let n=i,r;i=null;let o=null;for(e=0;n;){e++;let s=n,h=0;for(let a=0;a<t&&(h++,s=s.nextZ,!!s);a++);let c=t;for(;h>0||c>0&&s;)h!==0&&(c===0||!s||n.z<=s.z)?(r=n,n=n.nextZ,h--):(r=s,s=s.nextZ,c--),o?o.nextZ=r:i=r,r.prevZ=o,o=r;n=s}o.nextZ=null,t*=2}while(e>1);return i}function Lt(i,e,t,n,r){return i=(i-t)*r|0,e=(e-n)*r|0,i=(i|i<<8)&16711935,i=(i|i<<4)&252645135,i=(i|i<<2)&858993459,i=(i|i<<1)&1431655765,e=(e|e<<8)&16711935,e=(e|e<<4)&252645135,e=(e|e<<2)&858993459,e=(e|e<<1)&1431655765,i|e<<1}function Ze(i){let e=i,t=i;do(e.x<t.x||e.x===t.x&&e.y<t.y)&&(t=e),e=e.next;while(e!==i);return t}function Bt(i,e,t,n,r,o,s,h){return(r-s)*(e-h)>=(i-s)*(o-h)&&(i-s)*(n-h)>=(t-s)*(e-h)&&(t-s)*(o-h)>=(r-s)*(n-h)}function ct(i,e,t,n,r,o,s,h){return!(i===s&&e===h)&&Bt(i,e,t,n,r,o,s,h)}function Ue(i,e){return i.next.i!==e.i&&i.prev.i!==e.i&&!Xe(i,e)&&(ht(i,e)&&ht(e,i)&&Be(i,e)&&($(i.prev,i,e.prev)||$(i,e.prev,e))||it(i,e)&&$(i.prev,i,i.next)>0&&$(e.prev,e,e.next)>0)}function $(i,e,t){return(e.y-i.y)*(t.x-e.x)-(e.x-i.x)*(t.y-e.y)}function it(i,e){return i.x===e.x&&i.y===e.y}function Gt(i,e,t,n){const r=gt($(i,e,t)),o=gt($(i,e,n)),s=gt($(t,n,i)),h=gt($(t,n,e));return!!(r!==o&&s!==h||r===0&&pt(i,t,e)||o===0&&pt(i,n,e)||s===0&&pt(t,i,n)||h===0&&pt(t,e,n))}function pt(i,e,t){return e.x<=Math.max(i.x,t.x)&&e.x>=Math.min(i.x,t.x)&&e.y<=Math.max(i.y,t.y)&&e.y>=Math.min(i.y,t.y)}function gt(i){return i>0?1:i<0?-1:0}function Xe(i,e){let t=i;do{if(t.i!==i.i&&t.next.i!==i.i&&t.i!==e.i&&t.next.i!==e.i&&Gt(t,t.next,i,e))return!0;t=t.next}while(t!==i);return!1}function ht(i,e){return $(i.prev,i,i.next)<0?$(i,e,i.next)>=0&&$(i,i.prev,e)>=0:$(i,e,i.prev)<0||$(i,i.next,e)<0}function Be(i,e){let t=i,n=!1;const r=(i.x+e.x)/2,o=(i.y+e.y)/2;do t.y>o!=t.next.y>o&&t.next.y!==t.y&&r<(t.next.x-t.x)*(o-t.y)/(t.next.y-t.y)+t.x&&(n=!n),t=t.next;while(t!==i);return n}function Vt(i,e){const t=Nt(i.i,i.x,i.y),n=Nt(e.i,e.x,e.y),r=i.next,o=e.prev;return i.next=e,e.prev=i,t.next=r,r.prev=t,n.next=t,t.prev=n,o.next=n,n.prev=o,n}function Wt(i,e,t,n){const r=Nt(i,e,t);return n?(r.next=n.next,r.prev=n,n.next.prev=r,n.next=r):(r.prev=r,r.next=r),r}function at(i){i.next.prev=i.prev,i.prev.next=i.next,i.prevZ&&(i.prevZ.nextZ=i.nextZ),i.nextZ&&(i.nextZ.prevZ=i.prevZ)}function Nt(i,e,t){return{i,x:e,y:t,prev:null,next:null,z:0,prevZ:null,nextZ:null,steiner:!1}}function Ge(i,e,t,n){let r=0;for(let o=e,s=t-n;o<t;o+=n)r+=(i[s]-i[o])*(i[o+1]+i[s+1]),s=o;return r}function jt(i,e={}){let{vertices:t=[],indices:n=[],holes:r=[],verticesStride:o=2,verticesOffset:s=0,indicesOffset:h=0}=e;const c=Se(i,r,2);if(c){for(let l=0;l<c.length;l+=3)n[h++]=c[l]+s,n[h++]=c[l+1]+s,n[h++]=c[l+2]+s;let a=s*o;for(let l=0;l<i.length;l+=2)t[a]=i[l],t[a+1]=i[l+1],a+=o}return{vertices:t,indices:n}}const Ve=8,dt=11920929e-14,We=1;function Ht(i,e,t,n,r,o,s,h,c=.5,a){const y=Math.min(.99,Math.max(0,c));let f=(We-y)/1;return f*=f,$t(i,e,t,n,r,o,s,h,a,f,0),a.push(s,h),a}function $t(i,e,t,n,r,o,s,h,c,a,l){if(l>Ve)return;const y=(i+t)/2,f=(e+n)/2,x=(t+r)/2,u=(n+o)/2,m=(r+s)/2,M=(o+h)/2,k=(y+x)/2,S=(f+u)/2,P=(x+m)/2,w=(u+M)/2,I=(k+P)/2,E=(S+w)/2;if(l>0){let g=s-i,d=h-e;const F=Math.abs((t-s)*d-(n-h)*g),O=Math.abs((r-s)*d-(o-h)*g);if(F>dt&&O>dt){if((F+O)*(F+O)<=a*(g*g+d*d)){c.push(I,E);return}}else if(F>dt){if(F*F<=a*(g*g+d*d)){c.push(I,E);return}}else if(O>dt){if(O*O<=a*(g*g+d*d)){c.push(I,E);return}}else if(g=I-(i+s)/2,d=E-(e+h)/2,g*g+d*d<=a){c.push(I,E);return}}$t(i,e,y,f,k,S,I,E,c,a,l+1),$t(I,E,P,w,m,M,s,h,c,a,l+1)}const je=8,He=11920929e-14,Qe=1;function Qt(i,e,t,n,r,o,s=.5,h){const a=Math.min(.99,Math.max(0,s));let l=(Qe-a)/1;return l*=l,_t(h,i,e,t,n,r,o,l,0),h.push(r,o),h}function _t(i,e,t,n,r,o,s,h,c){if(c>je)return;const a=(e+n)/2,l=(t+r)/2,y=(n+o)/2,f=(r+s)/2,x=(a+y)/2,u=(l+f)/2;let m=o-e,M=s-t;const k=Math.abs((n-o)*M-(r-s)*m);if(k>He){if(k*k<=h*(m*m+M*M)){i.push(x,u);return}}else if(m=x-(e+o)/2,M=u-(t+s)/2,m*m+M*M<=h){i.push(x,u);return}_t(i,e,t,a,l,x,u,h,c+1),_t(i,x,u,y,f,o,s,h,c+1)}function Ye(i,e){const t=1-i;return t*t*e}function Je(i,e){return 2*(1-i)*i*e}function Ke(i,e){return i*i*e}function Dt(i,e,t,n){return Ye(i,e)+Je(i,t)+Ke(i,n)}const tn=1e-4,Yt=1e-4;function Jt(i,e={}){const{vertices:t=[],indices:n=[],lineStyle:r={alignment:.5,cap:"butt",join:"miter",width:1,miterLimit:10},flipAlignment:o=!1,closed:s=!0}=e,h=tn;if(i.length===0)return{vertices:t,indices:n};const c=r;let a=c.alignment;if(r.alignment!==.5){let N=en(i);o&&(N*=-1),a=(a-.5)*N+.5}const l={x:i[0],y:i[1]},y={x:i[i.length-2],y:i[i.length-1]},f=s,x=Math.abs(l.x-y.x)<h&&Math.abs(l.y-y.y)<h;if(f){i=i.slice(),x&&(i.pop(),i.pop(),y.x=i[i.length-2],y.y=i[i.length-1]);const N=(l.x+y.x)*.5,j=(y.y+l.y)*.5;i.unshift(N,j),i.push(N,j)}const u=t,m=i.length/2;let M=i.length;const k=u.length/2,S=c.width/2,P=S*S,w=c.miterLimit*c.miterLimit;let I=i[0],E=i[1],g=i[2],d=i[3],F=0,O=0,A=-(E-d),C=I-g,D=0,q=0,X=Math.sqrt(A*A+C*C);A/=X,C/=X,A*=S,C*=S;const Me=a,T=(1-Me)*2,b=Me*2;f||(c.cap==="round"?M+=Q(I-A*(T-b)*.5,E-C*(T-b)*.5,I-A*T,E-C*T,I+A*b,E+C*b,u,!0)+2:c.cap==="square"&&(M+=Kt(I,E,A,C,T,b,!0,u))),u.push(I-A*T,E-C*T),u.push(I+A*b,E+C*b);for(let N=1;N<m-1;++N){I=i[(N-1)*2],E=i[(N-1)*2+1],g=i[N*2],d=i[N*2+1],F=i[(N+1)*2],O=i[(N+1)*2+1],A=-(E-d),C=I-g,X=Math.sqrt(A*A+C*C),A/=X,C/=X,A*=S,C*=S,D=-(d-O),q=g-F,X=Math.sqrt(D*D+q*q),D/=X,q/=X,D*=S,q*=S;const j=g-I,ut=E-d,yt=g-F,ft=O-d,Pe=j*yt+ut*ft,vt=ut*yt-ft*j,xt=vt<0;if(Math.abs(vt)<.001*Math.abs(Pe)){u.push(g-A*T,d-C*T),u.push(g+A*b,d+C*b),Pe>=0&&(c.join==="round"?M+=Q(g,d,g-A*T,d-C*T,g-D*T,d-q*T,u,!1)+4:M+=2,u.push(g-D*b,d-q*b),u.push(g+D*T,d+q*T));continue}const we=(-A+I)*(-C+d)-(-A+g)*(-C+E),ve=(-D+F)*(-q+d)-(-D+g)*(-q+O),Tt=(j*ve-yt*we)/vt,At=(ft*we-ut*ve)/vt,Rt=(Tt-g)*(Tt-g)+(At-d)*(At-d),J=g+(Tt-g)*T,K=d+(At-d)*T,tt=g-(Tt-g)*b,et=d-(At-d)*b,In=Math.min(j*j+ut*ut,yt*yt+ft*ft),Te=xt?T:b,Sn=In+Te*Te*P;Rt<=Sn?c.join==="bevel"||Rt/P>w?(xt?(u.push(J,K),u.push(g+A*b,d+C*b),u.push(J,K),u.push(g+D*b,d+q*b)):(u.push(g-A*T,d-C*T),u.push(tt,et),u.push(g-D*T,d-q*T),u.push(tt,et)),M+=2):c.join==="round"?xt?(u.push(J,K),u.push(g+A*b,d+C*b),M+=Q(g,d,g+A*b,d+C*b,g+D*b,d+q*b,u,!0)+4,u.push(J,K),u.push(g+D*b,d+q*b)):(u.push(g-A*T,d-C*T),u.push(tt,et),M+=Q(g,d,g-A*T,d-C*T,g-D*T,d-q*T,u,!1)+4,u.push(g-D*T,d-q*T),u.push(tt,et)):(u.push(J,K),u.push(tt,et)):(u.push(g-A*T,d-C*T),u.push(g+A*b,d+C*b),c.join==="round"?xt?M+=Q(g,d,g+A*b,d+C*b,g+D*b,d+q*b,u,!0)+2:M+=Q(g,d,g-A*T,d-C*T,g-D*T,d-q*T,u,!1)+2:c.join==="miter"&&Rt/P<=w&&(xt?(u.push(tt,et),u.push(tt,et)):(u.push(J,K),u.push(J,K)),M+=2),u.push(g-D*T,d-q*T),u.push(g+D*b,d+q*b),M+=2)}I=i[(m-2)*2],E=i[(m-2)*2+1],g=i[(m-1)*2],d=i[(m-1)*2+1],A=-(E-d),C=I-g,X=Math.sqrt(A*A+C*C),A/=X,C/=X,A*=S,C*=S,u.push(g-A*T,d-C*T),u.push(g+A*b,d+C*b),f||(c.cap==="round"?M+=Q(g-A*(T-b)*.5,d-C*(T-b)*.5,g-A*T,d-C*T,g+A*b,d+C*b,u,!1)+2:c.cap==="square"&&(M+=Kt(g,d,A,C,T,b,!1,u)));const kn=Yt*Yt;for(let N=k;N<M+k-2;++N)I=u[N*2],E=u[N*2+1],g=u[(N+1)*2],d=u[(N+1)*2+1],F=u[(N+2)*2],O=u[(N+2)*2+1],!(Math.abs(I*(d-O)+g*(O-E)+F*(E-d))<kn)&&n.push(N,N+1,N+2);return{vertices:t,indices:n}}function en(i){const e=i.length;if(e<6)return 1;let t=0;for(let n=0,r=i[e-2],o=i[e-1];n<e;n+=2){const s=i[n],h=i[n+1];t+=(s-r)*(h+o),r=s,o=h}return t<0?-1:1}function Kt(i,e,t,n,r,o,s,h){const c=i-t*r,a=e-n*r,l=i+t*o,y=e+n*o;let f,x;s?(f=n,x=-t):(f=-n,x=t);const u=c+f,m=a+x,M=l+f,k=y+x;return h.push(u,m),h.push(M,k),2}function Q(i,e,t,n,r,o,s,h){const c=t-i,a=n-e;let l=Math.atan2(c,a),y=Math.atan2(r-i,o-e);h&&l<y?l+=Math.PI*2:!h&&l>y&&(y+=Math.PI*2);let f=l;const x=y-l,u=Math.abs(x),m=Math.sqrt(c*c+a*a),M=(15*u*Math.sqrt(m)/Math.PI>>0)+1,k=x/M;if(f+=k,h){s.push(i,e),s.push(t,n);for(let S=1,P=f;S<M;S++,P+=k)s.push(i,e),s.push(i+Math.sin(P)*m,e+Math.cos(P)*m);s.push(i,e),s.push(r,o)}else{s.push(t,n),s.push(i,e);for(let S=1,P=f;S<M;S++,P+=k)s.push(i+Math.sin(P)*m,e+Math.cos(P)*m),s.push(i,e);s.push(r,o),s.push(i,e)}return M*2}class Y{constructor(){W(this,"arcLengthDivision",200);W(this,"_arcLengths")}getPointAt(e,t=new p){return this.getPoint(this.getUToTMapping(e),t)}isClockwise(){const e=this.getPoint(1),t=this.getPoint(.5),n=this.getPoint(1);return(t.x-e.x)*(n.y-t.y)-(t.y-e.y)*(n.x-t.x)<0}getControlPointRefs(){return[]}applyTransform(e){return this.getControlPointRefs().forEach(t=>{t.applyMatrix3(e)}),this}getUnevenPointArray(e=5,t=[]){const n=new p;for(let r=0,o=Math.max(1,e)-1;r<=o;r++)this.getPoint(r/o,n),t.push(n.x,n.y);return t}getSpacedPointArray(e=5,t=[]){const n=new p;for(let r=0,o=Math.max(1,e)-1;r<=o;r++)this.getPointAt(r/o,n),t.push(n.x,n.y);return t}getAdaptivePointArray(e=[]){return this.getUnevenPointArray(5,e)}_pointArrayToPoint(e,t=[]){for(let n=0,r=e.length;n<r;n+=2){const o=e[n],s=e[n+1];t.push(new p(o,s))}return t}getSpacedPoints(e,t=[]){const n=this.getSpacedPointArray(e);return this._pointArrayToPoint(n,t),t}getUnevenPoints(e,t=[]){const n=this.getUnevenPointArray(e);return this._pointArrayToPoint(n,t),t}getAdaptivePoints(e=[]){const t=this.getAdaptivePointArray();return this._pointArrayToPoint(t,e),e}getPoints(e,t=[]){let n;return e?n=this.getUnevenPointArray(e):n=this.getAdaptivePointArray(),this._pointArrayToPoint(n,t),t}getLength(){const e=this.getLengths();return e[e.length-1]}getLengths(){return(!this._arcLengths||this._arcLengths.length!==this.arcLengthDivision+1)&&this.updateLengths(),this._arcLengths}updateLengths(){const e=this.arcLengthDivision,t=[0];for(let n=0,r=this.getPoint(0),o=1;o<=e;o++){const s=this.getPoint(o/e);n+=s.distanceTo(r),t.push(n),r=s}this._arcLengths=t}getUToTMapping(e,t){const n=this.getLengths(),r=n.length,o=t??e*n[r-1];if(r<2)return o/n[0];let s=0,h=0,c=r-1,a;for(;h<=c;)if(s=Math.floor(h+(c-h)/2),a=n[s]-o,a<0)h=s+1;else if(a>0)c=s-1;else{c=s;break}if(s=c,n[s]===o)return s/(r-1);const l=n[s],f=n[s+1]-l,x=(o-l)/f;return(s+x)/(r-1)}getTangent(e,t=new p){const r=Math.max(0,e-1e-4),o=Math.min(1,e+1e-4);return t.copy(this.getPoint(o).sub(this.getPoint(r)).normalize())}getTangentAt(e,t){return this.getTangent(this.getUToTMapping(e),t)}getNormal(e,t=new p){return this.getTangent(e,t),t.set(-t.y,t.x).normalize()}getNormalAt(e,t){return this.getNormal(this.getUToTMapping(e),t)}getTForPoint(e,t=.001){let n=0,r=1,o=(n+r)/2;for(;r-n>t;){o=(n+r)/2;const s=this.getPoint(o);if(s.distanceTo(e)<t)return o;s.x<e.x?n=o:r=o}return o}getMinMax(e=p.MAX,t=p.MIN){const n=this.getPoints();for(let r=0,o=n.length;r<o;r++){const s=n[r];e.min(s),t.max(s)}return{min:e,max:t}}getBoundingBox(){const{min:e,max:t}=this.getMinMax();return new V(e.x,e.y,t.x-e.x,t.y-e.y)}fillTriangulate(e){return jt(this.getAdaptivePointArray(),e)}strokeTriangulate(e){return Jt(this.getAdaptivePointArray(),e)}toCommands(){const e=[],t=this.getPoints();for(let n=0,r=t.length;n<r;n++){const o=t[n];n===0?e.push({type:"M",x:o.x,y:o.y}):e.push({type:"L",x:o.x,y:o.y})}return e}toData(){return Ut(this.toCommands())}drawTo(e){return this.toCommands().forEach(t=>{switch(t.type){case"M":e.moveTo(t.x,t.y);break;case"L":e.lineTo(t.x,t.y);break}}),this}copy(e){return this.arcLengthDivision=e.arcLengthDivision,this}clone(){return new this.constructor().copy(this)}}const nn=new z,te=new z,ee=new z,mt=new p;class qt extends Y{constructor(e=new p,t=new p,n=new p,r=0,o=0,s=Math.PI*2,h=!1){super(),this._center=e,this._radius=t,this._diff=n,this.rotate=r,this.startAngle=o,this.endAngle=s,this.clockwise=h}get cx(){return this._center.x}set cx(e){this._center.x=e}get cy(){return this._center.y}set cy(e){this._center.y=e}get rx(){return this._radius.x}set rx(e){this._radius.x=e}get ry(){return this._radius.y}set ry(e){this._radius.y=e}get dx(){return this._diff.x}set dx(e){this._diff.x=e}get dy(){return this._diff.y}set dy(e){this._diff.y=e}isClockwise(){return this.clockwise}_getDeltaAngle(){const e=Math.PI*2;let t=this.endAngle-this.startAngle;const n=Math.abs(t)<Number.EPSILON;return t=(t%e+e)%e,n?t=0:this.clockwise||(t=t===0?-e:t-e),t}getPoint(e,t=new p){const n=this._getDeltaAngle(),r=this.startAngle+e*n;let o=this.cx+this.rx*Math.cos(r),s=this.cy+this.ry*Math.sin(r);if(this.rotate!==0){const h=Math.cos(this.rotate),c=Math.sin(this.rotate),a=o-this.cx,l=s-this.cy;o=a*h-l*c+this.cx,s=a*c+l*h+this.cy}return t.set(o,s)}toCommands(){const{cx:e,cy:t,rx:n,ry:r,startAngle:o,endAngle:s,clockwise:h,rotate:c}=this,a=e+n*Math.cos(o)*Math.cos(c)-r*Math.sin(o)*Math.sin(c),l=t+n*Math.cos(o)*Math.sin(c)+r*Math.sin(o)*Math.cos(c),y=Math.abs(o-s),f=y>Math.PI?1:0,x=h?1:0,u=c*180/Math.PI;if(y>=2*Math.PI){const m=o+Math.PI,M=e+n*Math.cos(m)*Math.cos(c)-r*Math.sin(m)*Math.sin(c),k=t+n*Math.cos(m)*Math.sin(c)+r*Math.sin(m)*Math.cos(c);return[{type:"M",x:a,y:l},{type:"A",rx:n,ry:r,angle:u,largeArcFlag:0,sweepFlag:x,x:M,y:k},{type:"A",rx:n,ry:r,angle:u,largeArcFlag:0,sweepFlag:x,x:a,y:l}]}else{const m=e+n*Math.cos(s)*Math.cos(c)-r*Math.sin(s)*Math.sin(c),M=t+n*Math.cos(s)*Math.sin(c)+r*Math.sin(s)*Math.cos(c);return[{type:"M",x:a,y:l},{type:"A",rx:n,ry:r,angle:u,largeArcFlag:f,sweepFlag:x,x:m,y:M}]}}drawTo(e){const{cx:t,cy:n,rx:r,ry:o,rotate:s,startAngle:h,endAngle:c,clockwise:a}=this;return e.ellipse(t,n,r,o,s,h,c,!a),this}applyTransform(e){return mt.set(this.cx,this.cy),mt.applyMatrix3(e),this.cx=mt.x,this.cy=mt.y,on(e)?sn(this,e):rn(this,e),this}getControlPointRefs(){return[this._center]}getAdaptivePointArray(e=[]){const{cx:t,cy:n,rx:r,ry:o,dx:s,dy:h,startAngle:c}=this;if(!(r>=0&&o>=0&&s>=0&&h>=0))return e;const a=Math.PI*2,l=this._getDeltaAngle(),y=Math.abs(l)/a,f=Math.ceil(2.3*Math.sqrt(r+o)*y),x=[];for(let u=0;u<=f;u++){const m=u/f,M=c+m*l,k=t+s+Math.cos(M)*r,S=n+h+Math.sin(M)*o;x.push(k,S)}return Array.prototype.push.apply(e,x),e}fillTriangulate(e={}){let{vertices:t=[],indices:n=[],verticesStride:r=2,verticesOffset:o=0,indicesOffset:s=0}=e;const h=this.getAdaptivePointArray();if(h.length===0)return{vertices:t,indices:n};let c=0,a=0;for(let f=0;f<h.length;f+=2)c+=h[f],a+=h[f+1];c/=h.length/2,a/=h.length/2;let l=o;t[l*r]=c,t[l*r+1]=a;const y=l++;for(let f=0;f<h.length;f+=2)t[l*r]=h[f],t[l*r+1]=h[f+1],f>0&&(n[s++]=l,n[s++]=y,n[s++]=l-1),l++;return n[s++]=y+1,n[s++]=y,n[s++]=l-1,{vertices:t,indices:n}}getMinMax(e=p.MAX,t=p.MIN){const{cx:n,cy:r,rx:o,ry:s,rotate:h}=this,c=Math.cos(h),a=Math.sin(h),l=Math.sqrt(o*o*c*c+s*s*a*a),y=Math.sqrt(o*o*a*a+s*s*c*c);return e.x=Math.min(e.x,n-l),e.y=Math.min(e.y,r-y),t.x=Math.max(t.x,n+l),t.y=Math.max(t.y,r+y),{min:e,max:t}}copy(e){return super.copy(e),this.cx=e.cx,this.cy=e.cy,this.rx=e.rx,this.ry=e.ry,this.dx=e.dx,this.dy=e.dy,this.startAngle=e.startAngle,this.endAngle=e.endAngle,this.clockwise=e.clockwise,this.rotate=e.rotate,this}}function sn(i,e){const t=i.rx,n=i.ry,r=Math.cos(i.rotate),o=Math.sin(i.rotate),s=new p(t*r,t*o),h=new p(-n*o,n*r),c=s.applyMatrix3(e),a=h.applyMatrix3(e),l=nn.set(c.x,a.x,0,c.y,a.y,0,0,0,1),y=te.copy(l).invert(),u=ee.copy(y).transpose().multiply(y).elements,m=cn(u[0],u[1],u[4]),M=Math.sqrt(m.rt1),k=Math.sqrt(m.rt2);if(i.rx=1/M,i.ry=1/k,i.rotate=Math.atan2(m.sn,m.cs),!((i.endAngle-i.startAngle)%(2*Math.PI)<Number.EPSILON)){const P=te.set(M,0,0,0,k,0,0,0,1),w=ee.set(m.cs,m.sn,0,-m.sn,m.cs,0,0,0,1),I=P.multiply(w).multiply(l),E=g=>{const{x:d,y:F}=new p(Math.cos(g),Math.sin(g)).applyMatrix3(I);return Math.atan2(F,d)};i.startAngle=E(i.startAngle),i.endAngle=E(i.endAngle),ne(e)&&(i.clockwise=!i.clockwise)}}function rn(i,e){const t=se(e),n=ie(e);i.rx*=t,i.ry*=n;const r=t>Number.EPSILON?Math.atan2(e.elements[1],e.elements[0]):Math.atan2(-e.elements[3],e.elements[4]);i.rotate+=r,ne(e)&&(i.startAngle*=-1,i.endAngle*=-1,i.clockwise=!i.clockwise)}function ne(i){const e=i.elements;return e[0]*e[4]-e[1]*e[3]<0}function on(i){const e=i.elements,t=e[0]*e[3]+e[1]*e[4];if(t===0)return!1;const n=se(i),r=ie(i);return Math.abs(t/(n*r))>Number.EPSILON}function se(i){const e=i.elements;return Math.sqrt(e[0]*e[0]+e[1]*e[1])}function ie(i){const e=i.elements;return Math.sqrt(e[3]*e[3]+e[4]*e[4])}function cn(i,e,t){let n,r,o,s,h;const c=i+t,a=i-t,l=Math.sqrt(a*a+4*e*e);return c>0?(n=.5*(c+l),h=1/n,r=i*h*t-e*h*e):c<0?r=.5*(c-l):(n=.5*l,r=-.5*l),a>0?o=a+l:o=a-l,Math.abs(o)>2*Math.abs(e)?(h=-2*e/o,s=1/Math.sqrt(1+h*h),o=h*s):Math.abs(e)===0?(o=1,s=0):(h=-.5*o/e,o=1/Math.sqrt(1+h*h),s=h*o),a>0&&(h=o,o=-s,s=h),{rt1:n,rt2:r,cs:o,sn:s}}class re extends qt{constructor(e=0,t=0,n=1,r=0,o=Math.PI*2,s=!1){super(new p(e,t),new p(n,n),new p(0,0),0,r,o,s)}drawTo(e){const{cx:t,cy:n,rx:r,startAngle:o,endAngle:s,clockwise:h}=this;return e.arc(t,n,r,o,s,!h),this}getAdaptivePointArray(e=[]){const{cx:t,cy:n,rx:r,startAngle:o,endAngle:s,clockwise:h}=this;let c=Math.abs(o-s);(!h&&o>s||h&&s>o)&&(c=2*Math.PI-c);let a=Math.max(6,Math.floor(6*r**(1/3)*(c/Math.PI)));a=Math.max(a,3);let l=c/a,y=o;l*=h?1:-1;for(let f=0;f<a+1;f++){const x=Math.cos(y),u=Math.sin(y),m=t+x*r,M=n+u*r;e.push(m,M),y+=l}return e}}class rt extends Y{constructor(e=[]){super(),this.curves=e}getFlatCurves(){return this.curves.flatMap(e=>e instanceof rt?e.getFlatCurves():e)}addCurve(e){return this.curves.push(e),this}getPoint(e,t=new p){const n=e*this.getLength(),r=this.getLengths();let o=0;for(;o<r.length;){if(r[o]>=n){const s=r[o]-n,h=this.curves[o],c=h.getLength();return h.getPointAt(c===0?0:1-s/c,t)}o++}return t}updateLengths(){const e=[];for(let t=0,n=0,r=this.curves.length;t<r;t++)n+=this.curves[t].getLength(),e.push(n);this._arcLengths=e}getControlPointRefs(){return this.curves.flatMap(e=>e.getControlPointRefs())}_removeNextPointIfEqualPrevPoint(e,t){return e[t-1]===e[t+1]&&e[t]===e[t+2]&&e.splice(t+1,2),e}getSpacedPointArray(e=5,t=[]){let n;return this.curves.forEach(r=>{r.getSpacedPointArray(e,t),n&&this._removeNextPointIfEqualPrevPoint(t,n),n=t.length-1}),t}getAdaptivePointArray(e=[]){let t;return this.curves.forEach(n=>{n.getAdaptivePointArray(e),t&&this._removeNextPointIfEqualPrevPoint(e,t),t=e.length-1}),e}applyTransform(e){return this.curves.forEach(t=>t.applyTransform(e)),this}getMinMax(e=p.MAX,t=p.MIN){return this.curves.forEach(n=>n.getMinMax(e,t)),{min:e,max:t}}getBoundingBox(){const{min:e,max:t}=this.getMinMax();return new V(e.x,e.y,t.x-e.x,t.y-e.y)}toCommands(){return this.curves.flatMap(e=>e.toCommands())}drawTo(e){var n;const t=(n=this.curves[0])==null?void 0:n.getPoint(0);return t&&e.moveTo(t.x,t.y),this.curves.forEach(r=>r.drawTo(e)),this}copy(e){return super.copy(e),this.curves=e.curves.map(t=>t.clone()),this}}class Mt extends Y{constructor(e=new p,t=new p,n=new p,r=new p){super(),this.p1=e,this.cp1=t,this.cp2=n,this.p2=r}static from(e,t,n,r,o,s,h,c){return new Mt(new p(e,t),new p(n,r),new p(o,s),new p(h,c))}getPoint(e,t=new p){const{p1:n,cp1:r,cp2:o,p2:s}=this;return t.set(Et(e,n.x,r.x,o.x,s.x),Et(e,n.y,r.y,o.y,s.y))}getAdaptivePointArray(e=[]){return Ht(this.p1.x,this.p1.y,this.cp1.x,this.cp1.y,this.cp2.x,this.cp2.y,this.p2.x,this.p2.y,.5,e)}getControlPointRefs(){return[this.p1,this.cp1,this.cp2,this.p2]}_solveQuadratic(e,t,n){const r=t*t-4*e*n;if(r<0)return[];const o=Math.sqrt(r),s=(-t+o)/(2*e),h=(-t-o)/(2*e);return[s,h].filter(c=>c>=0&&c<=1)}getMinMax(e=p.MAX,t=p.MIN){const{p1:n,cp1:r,cp2:o,p2:s}=this,h=this._solveQuadratic(3*(r.x-n.x),6*(o.x-r.x),3*(s.x-o.x)),c=this._solveQuadratic(3*(r.y-n.y),6*(o.y-r.y),3*(s.y-o.y)),a=[0,1,...h,...c];return((y,f)=>{for(const x of y)for(let u=0;u<=f;u++){const m=u/f-.5,M=Math.min(1,Math.max(0,x+m)),k=this.getPoint(M);e.x=Math.min(e.x,k.x),e.y=Math.min(e.y,k.y),t.x=Math.max(t.x,k.x),t.y=Math.max(t.y,k.y)}})(a,10),{min:e,max:t}}toCommands(){const{p1:e,cp1:t,cp2:n,p2:r}=this;return[{type:"M",x:e.x,y:e.y},{type:"C",x1:t.x,y1:t.y,x2:n.x,y2:n.y,x:r.x,y:r.y}]}drawTo(e){const{p1:t,cp1:n,cp2:r,p2:o}=this;return e.lineTo(t.x,t.y),e.bezierCurveTo(n.x,n.y,r.x,r.y,o.x,o.y),this}copy(e){return super.copy(e),this.p1.copy(e.p1),this.cp1.copy(e.cp1),this.cp2.copy(e.cp2),this.p2.copy(e.p2),this}}class oe extends qt{constructor(e=0,t=0,n=1,r=1,o=0,s=0,h=Math.PI*2,c=!1){super(new p(e,t),new p(n,r),new p,o,s,h,c)}drawTo(e){return e.ellipse(this.cx,this.cy,this.rx,this.ry,this.rotate,this.startAngle,this.endAngle,!this.clockwise),this}}class B extends Y{constructor(e=new p,t=new p){super(),this.p1=e,this.p2=t}static from(e,t,n,r){return new B(new p(e,t),new p(n,r))}getPoint(e,t=new p){return e===1?t.copy(this.p2):t.copy(this.p2).sub(this.p1).scale(e).add(this.p1),t}getPointAt(e,t=new p){return this.getPoint(e,t)}getTangent(e,t=new p){return t.subVectors(this.p2,this.p1).normalize()}getTangentAt(e,t=new p){return this.getTangent(e,t)}getControlPointRefs(){return[this.p1,this.p2]}getAdaptivePointArray(e=[]){return e.push(this.p1.x,this.p1.y,this.p2.x,this.p2.y),e}getMinMax(e=p.MAX,t=p.MIN){const{p1:n,p2:r}=this;return e.x=Math.min(e.x,n.x,r.x),e.y=Math.min(e.y,n.y,r.y),t.x=Math.max(t.x,n.x,r.x),t.y=Math.max(t.y,n.y,r.y),{min:e,max:t}}toCommands(){const{p1:e,p2:t}=this;return[{type:"M",x:e.x,y:e.y},{type:"L",x:t.x,y:t.y}]}drawTo(e){const{p1:t,p2:n}=this;return e.lineTo(t.x,t.y),e.lineTo(n.x,n.y),this}copy(e){return super.copy(e),this.p1.copy(e.p1),this.p2.copy(e.p2),this}}class Ft extends rt{}class hn extends Ft{constructor(e=0,t=0,n=1,r=3){super(),this.cx=e,this.cy=t,this.radius=n,this.sideCount=r,this.update()}update(){const{cx:e,cy:t,radius:n,sideCount:r}=this,o=[];for(let h=0;h<r;h++){const c=h*2*Math.PI/r-.5*Math.PI;o.push(new p(n*Math.cos(c),n*Math.sin(c)).add({x:e,y:t}))}const s=[];for(let h=0;h<r;h++)s.push(new B(o[h],o[(h+1)%r]));return this.curves=s,this}copy(e){return super.copy(e),this.cx=e.cx,this.cy=e.cy,this.radius=e.radius,this.sideCount=e.sideCount,this.update(),this}}class Pt extends Y{constructor(e=new p,t=new p,n=new p){super(),this.p1=e,this.cp=t,this.p2=n}static from(e,t,n,r,o,s){return new Pt(new p(e,t),new p(n,r),new p(o,s))}getPoint(e,t=new p){const{p1:n,cp:r,p2:o}=this;return t.set(Dt(e,n.x,r.x,o.x),Dt(e,n.y,r.y,o.y)),t}getControlPointRefs(){return[this.p1,this.cp,this.p2]}getAdaptivePointArray(e=[]){return Qt(this.p1.x,this.p1.y,this.cp.x,this.cp.y,this.p2.x,this.p2.y,.5,e)}getMinMax(e=p.MAX,t=p.MIN){const{p1:n,cp:r,p2:o}=this,s=.5*(n.x+r.x),h=.5*(n.y+r.y),c=.5*(n.x+o.x),a=.5*(n.y+o.y);return e.x=Math.min(e.x,n.x,o.x,s,c),e.y=Math.min(e.y,n.y,o.y,h,a),t.x=Math.max(t.x,n.x,o.x,s,c),t.y=Math.max(t.y,n.y,o.y,h,a),{min:e,max:t}}toCommands(){const{p1:e,cp:t,p2:n}=this;return[{type:"M",x:e.x,y:e.y},{type:"Q",x1:t.x,y1:t.y,x:n.x,y:n.y}]}drawTo(e){const{p1:t,cp:n,p2:r}=this;return e.lineTo(t.x,t.y),e.quadraticCurveTo(n.x,n.y,r.x,r.y),this}copy(e){return super.copy(e),this.p1.copy(e.p1),this.cp.copy(e.cp),this.p2.copy(e.p2),this}}class ce extends Ft{constructor(e=0,t=0,n=0,r=0){super(),this.x=e,this.y=t,this.width=n,this.height=r,this.update()}update(){const{x:e,y:t,width:n,height:r}=this,o=[new p(e,t),new p(e+n,t),new p(e+n,t+r),new p(e,t+r)];return this.curves=[new B(o[0],o[1]),new B(o[1],o[2]),new B(o[2],o[3]),new B(o[3],o[0])],this}drawTo(e){return e.rect(this.x,this.y,this.width,this.height),this}fillTriangulate(e={}){let{vertices:t=[],indices:n=[],verticesStride:r=2,verticesOffset:o=0,indicesOffset:s=0}=e;const{x:h,y:c,width:a,height:l}=this,y=[h,c,h+a,c,h+a,c+l,h,c+l];let f=0;o*=r,t[o+f]=y[0],t[o+f+1]=y[1],f+=r,t[o+f]=y[2],t[o+f+1]=y[3],f+=r,t[o+f]=y[6],t[o+f+1]=y[7],f+=r,t[o+f]=y[4],t[o+f+1]=y[5],f+=r;const x=o/r;return n[s++]=x,n[s++]=x+1,n[s++]=x+2,n[s++]=x+1,n[s++]=x+3,n[s++]=x+2,{vertices:t,indices:n}}copy(e){return super.copy(e),this.x=e.x,this.y=e.y,this.width=e.width,this.height=e.height,this.update(),this}}class he extends qt{constructor(e=0,t=0,n=1,r=1,o=1){super(),this.x=e,this.y=t,this.width=n,this.height=r,this.radius=o,this.update()}update(){const{x:e,y:t,width:n,height:r,radius:o}=this,s=n/2,h=r/2,c=e+s,a=t+h,l=Math.max(0,Math.min(o,Math.min(s,h))),y=l,f=s-l,x=h-y;return this._center=new p(c,a),this._radius=new p(l,y),this._diff=new p(f,x),this}drawTo(e){const{x:t,y:n,width:r,height:o,radius:s}=this;return e.roundRect(t,n,r,o,s),this}copy(e){return super.copy(e),this.x=e.x,this.y=e.y,this.width=e.width,this.height=e.height,this.radius=e.radius,this.update(),this}}class ae extends Y{constructor(e=[]){super(),this.points=e}getPoint(e,t=new p){const{points:n}=this,r=(n.length-1)*e,o=Math.floor(r),s=r-o,h=n[o===0?o:o-1],c=n[o],a=n[o>n.length-2?n.length-1:o+1],l=n[o>n.length-3?n.length-1:o+2];return t.set(St(s,h.x,c.x,a.x,l.x),St(s,h.y,c.y,a.y,l.y)),t}getControlPointRefs(){return this.points}copy(e){super.copy(e),this.points=[];for(let t=0,n=e.points.length;t<n;t++)this.points.push(e.points[t].clone());return this}}class lt extends rt{constructor(t){super();W(this,"startPoint");W(this,"currentPoint");W(this,"autoClose",!1);t&&this.addPoints(t)}addPoints(t){this.moveTo(t[0].x,t[0].y);for(let n=1,r=t.length;n<r;n++){const{x:o,y:s}=t[n];this.lineTo(o,s)}return this}addCommands(t){return kt(t,this),this}addData(t){return this.addCommands(It(t)),this}_closePointArray(t){return this.autoClose&&t.length>=4&&t[0]!==t[t.length-2]&&t[1]!==t[t.length-1]&&t.push(t[0],t[1]),t}getUnevenPointArray(t=40,n=[]){return this._closePointArray(super.getUnevenPointArray(t,n))}getSpacedPointArray(t=40,n=[]){return this._closePointArray(super.getSpacedPointArray(t,n))}getAdaptivePointArray(t=[]){return this._closePointArray(super.getAdaptivePointArray(t))}fillTriangulate(t){const n=(t==null?void 0:t.indices)??[],o={vertices:(t==null?void 0:t.vertices)??[],indices:n};return this.curves.forEach(s=>{const{vertices:h,indices:c}=s.fillTriangulate({...t,indices:[],vertices:[]});o.vertices=o.vertices.concat(h),o.indices=o.indices.concat(c)}),o}strokeTriangulate(t){const n=(t==null?void 0:t.indices)??[],o={vertices:(t==null?void 0:t.vertices)??[],indices:n};return this.curves.forEach(s=>{const{vertices:h,indices:c}=s.strokeTriangulate({...t,indices:[],vertices:[]});o.vertices=o.vertices.concat(h),o.indices=o.indices.concat(c)}),o}_setCurrentPoint(t){return this.currentPoint=new p(t.x,t.y),this.startPoint||(this.startPoint=this.currentPoint.clone()),this}_connetLineTo(t){if(this.curves.length>0){const n=t.getPoint(0);(!this.currentPoint||!n.equals(this.currentPoint))&&this.lineTo(n.x,n.y)}return this}closePath(){const t=this.startPoint;if(t){const n=this.currentPoint;n&&!t.equals(n)&&(this.curves.push(new B(n.clone(),t.clone())),n.copy(t)),this.startPoint=void 0}return this}moveTo(t,n){return this.currentPoint=new p(t,n),this.startPoint=this.currentPoint.clone(),this}lineTo(t,n){const r=this.currentPoint;return r!=null&&r.equals({x:t,y:n})||this.curves.push(B.from((r==null?void 0:r.x)??0,(r==null?void 0:r.y)??0,t,n)),this._setCurrentPoint({x:t,y:n}),this}bezierCurveTo(t,n,r,o,s,h){const c=this.currentPoint;return c!=null&&c.equals({x:s,y:h})||this.curves.push(Mt.from((c==null?void 0:c.x)??0,(c==null?void 0:c.y)??0,t,n,r,o,s,h)),this._setCurrentPoint({x:s,y:h}),this}quadraticCurveTo(t,n,r,o){const s=this.currentPoint;return s!=null&&s.equals({x:r,y:o})||this.curves.push(Pt.from((s==null?void 0:s.x)??0,(s==null?void 0:s.y)??0,t,n,r,o)),this._setCurrentPoint({x:r,y:o}),this}arc(t,n,r,o,s,h){const c=new re(t,n,r,o,s,!h);return this._connetLineTo(c),this.curves.push(c),this._setCurrentPoint(c.getPoint(1)),this}relativeArc(t,n,r,o,s,h){var c,a;return t+=((c=this.currentPoint)==null?void 0:c.x)??0,n+=((a=this.currentPoint)==null?void 0:a.y)??0,this.arc(t,n,r,o,s,h),this}arcTo(t,n,r,o,s){return console.warn("Method arcTo not supported yet"),this}ellipse(t,n,r,o,s,h,c,a=!0){const l=new oe(t,n,r,o,s,h,c,!a);return this._connetLineTo(l),this.curves.push(l),this._setCurrentPoint(l.getPoint(1)),this}relativeEllipse(t,n,r,o,s,h,c,a){var l,y;return t+=((l=this.currentPoint)==null?void 0:l.x)??0,n+=((y=this.currentPoint)==null?void 0:y.y)??0,this.ellipse(t,n,r,o,s,h,c,a),this}rect(t,n,r,o){const s=new ce(t,n,r,o);return this._connetLineTo(s),this.curves.push(s),this._setCurrentPoint({x:t,y:n}),this}roundRect(t,n,r,o,s){const h=new he(t,n,r,o,s);return this._connetLineTo(h),this.curves.push(h),this._setCurrentPoint({x:t,y:n}),this}splineThru(t){const n=this.currentPoint??new p;return this.curves.push(new ae([n].concat(t))),this._setCurrentPoint(t[t.length-1]),this}drawTo(t){var r;const n=(r=this.curves[0])==null?void 0:r.getPoint(0);return n&&t.moveTo(n.x,n.y),this.curves.forEach(o=>o.drawTo(t)),this.autoClose&&t.closePath(),this}copy(t){var n;return super.copy(t),this.autoClose=t.autoClose,this.currentPoint=(n=t.currentPoint)==null?void 0:n.clone(),this}}function an(i){return i.replace(/[^a-z0-9]/gi,"-").replace(/\B([A-Z])/g,"-$1").toLowerCase()}function ln(i,e,t,n){const r=e.clone().sub(i),o=n.clone().sub(t),s=t.clone().sub(i),h=r.cross(o);if(h===0)return new p((i.x+t.x)/2,(i.y+t.y)/2);const c=s.cross(o)/h;return Math.abs(c)>1?new p((i.x+t.x)/2,(i.y+t.y)/2):new p(i.x+c*r.x,i.y+c*r.y)}class U extends rt{constructor(t,n={}){super();W(this,"currentCurve",new lt);W(this,"style");this.curves.push(this.currentCurve),this.style=n,t&&(t instanceof U?this.addPath(t):Array.isArray(t)?this.addCommands(t):this.addData(t))}get startPoint(){return this.currentCurve.startPoint}get currentPoint(){return this.currentCurve.currentPoint}get strokeWidth(){return this.style.strokeWidth??((this.style.stroke??"none")==="none"?0:1)}addPath(t){const n=this.curves.findIndex(r=>r===this.currentCurve);return n>-1&&this.curves.splice(n,1),t instanceof U?this.curves.push(...t.curves.filter(r=>r.curves.length).map(r=>r.clone())):t.curves.length&&this.curves.push(t),this.curves.push(this.currentCurve),this}closePath(){const t=this.startPoint;return t&&(this.currentCurve.closePath(),this.currentCurve.curves.length&&(this.currentCurve=new lt().moveTo(t.x,t.y),this.curves.push(this.currentCurve))),this}moveTo(t,n){var r;return(r=this.currentCurve.currentPoint)!=null&&r.equals({x:t,y:n})||(this.currentCurve.curves.length&&(this.currentCurve=new lt,this.curves.push(this.currentCurve)),this.currentCurve.moveTo(t,n)),this}lineTo(t,n){return this.currentCurve.lineTo(t,n),this}bezierCurveTo(t,n,r,o,s,h){return this.currentCurve.bezierCurveTo(t,n,r,o,s,h),this}quadraticCurveTo(t,n,r,o){return this.currentCurve.quadraticCurveTo(t,n,r,o),this}arc(t,n,r,o,s,h){return this.currentCurve.arc(t,n,r,o,s,h),this}arcTo(t,n,r,o,s){return this.currentCurve.arcTo(t,n,r,o,s),this}ellipse(t,n,r,o,s,h,c,a){return this.currentCurve.ellipse(t,n,r,o,s,h,c,a),this}rect(t,n,r,o){return this.currentCurve.rect(t,n,r,o),this}roundRect(t,n,r,o,s){return this.currentCurve.roundRect(t,n,r,o,s),this}reset(){return this.currentCurve=new lt,this.curves=[this.currentCurve],this.style={},this}addCommands(t){return kt(t,this),this}addData(t){return this.addCommands(It(t)),this}splineThru(t){return this.currentCurve.splineThru(t),this}scale(t,n=t,r={x:0,y:0}){return this.getControlPointRefs().forEach(o=>{o.scale(t,n,r)}),this}skew(t,n=0,r={x:0,y:0}){return this.getControlPointRefs().forEach(o=>{o.skew(t,n,r)}),this}rotate(t,n={x:0,y:0}){return this.getControlPointRefs().forEach(r=>{r.rotate(t,n)}),this}bold(t){if(t===0)return this;const n=this.getFlatCurves(),r=[],o=[],s=[];n.forEach((c,a)=>{const l=c.getControlPointRefs(),y=c.isClockwise();s[a]=l,o[a]=y;const f=l[0],x=l[l.length-1]??f;r.push({start:y?x:f,end:y?f:x,index:a})});const h=[];return r.forEach((c,a)=>{h[a]=[],r.forEach((l,y)=>{var f;l.start&&c.end&&y!==a&&((f=l.start)!=null&&f.equals(c.end))&&h[a].push(l.index)})}),n.forEach((c,a)=>{const l=o[a];s[a].forEach(y=>{y.add(c.getNormal(c.getTForPoint(y)).scale(l?t:-t))})}),h.forEach((c,a)=>{const l=s[a];c.forEach(y=>{const f=s[y],x=ln(l[l.length-1],l[l.length-2]??l[l.length-1],f[0],f[1]??f[0]);x&&(l[l.length-1].copy(x),f[0].copy(x))})}),this}getMinMax(t=p.MAX,n=p.MIN,r=!0){const o=this.strokeWidth;return this.curves.forEach(s=>{if(s.getMinMax(t,n),r&&o>1){const h=o/2,c=s.isClockwise(),a=[];for(let l=0;l<=1;l+=1/s.arcLengthDivision){const y=s.getPoint(l),f=s.getNormal(l),x=f.clone().scale(c?h:-h),u=f.clone().scale(c?-h:h);a.push(y.clone().add(x),y.clone().add(u),y.clone().add({x:h,y:0}),y.clone().add({x:-h,y:0}),y.clone().add({x:0,y:h}),y.clone().add({x:0,y:-h}),y.clone().add({x:h,y:h}),y.clone().add({x:-h,y:-h}))}t.min(...a),n.max(...a)}}),{min:t,max:n}}getBoundingBox(t=!0){const{min:n,max:r}=this.getMinMax(void 0,void 0,t);return new V(n.x,n.y,r.x-n.x,r.y-n.y)}drawTo(t,n={}){n={...this.style,...n};const{fill:r="#000",stroke:o="none"}=n;return t.beginPath(),t.save(),Ct(t,n),this.curves.forEach(s=>{s.drawTo(t)}),r!=="none"&&t.fill(),o!=="none"&&t.stroke(),t.restore(),this}drawControlPointsTo(t,n={}){n={...this.style,...n};const{fill:r="#000",stroke:o="none"}=n;return t.beginPath(),t.save(),Ct(t,n),this.getControlPointRefs().forEach(s=>{R(t,s.x,s.y,{radius:4})}),r!=="none"&&t.fill(),o!=="none"&&t.stroke(),t.restore(),this}toCommands(){return this.curves.flatMap(t=>t.toCommands())}toData(){return this.curves.filter(t=>t.curves.length).map(t=>t.toData()).join(" ")}toSVGPathString(){const t={...this.style,fill:this.style.fill??"#000",stroke:this.style.stroke??"none"},n={};for(const o in t)t[o]!==void 0&&(n[an(o)]=t[o]);Object.assign(n,{"stroke-width":`${this.strokeWidth}px`});let r="";for(const o in n)n[o]!==void 0&&(r+=`${o}:${n[o]};`);return`<path d="${this.toData()}" style="${r}"></path>`}copy(t){return super.copy(t),this.currentCurve=t.currentCurve.clone(),this.style={...t.style},this}}class le{constructor(e=[],t){this.paths=e,this.viewBox=t}getBoundingBox(e=!0){if(!this.paths.length)return;const t=p.MAX,n=p.MIN;return this.paths.forEach(r=>r.getMinMax(t,n,e)),new V(t.x,t.y,n.x-t.x,n.y-t.y)}toSVGString(){const{x:e,y:t,width:n,height:r}=this.getBoundingBox(),o=this.paths.map(s=>s.toSVGPathString()).join("");return`<svg viewBox="${e} ${t} ${n} ${r}" width="${n}px" height="${r}px" xmlns="http://www.w3.org/2000/svg">${o}</svg>`}toSVGUrl(){return`data:image/svg+xml;base64,${btoa(this.toSVGString())}`}toSVG(){return new DOMParser().parseFromString(this.toSVGString(),"image/svg+xml").documentElement}toCanvas(e={}){const{pixelRatio:t=2,...n}=e,{left:r,top:o,width:s,height:h}=this.getBoundingBox(),c=document.createElement("canvas");c.width=s*t,c.height=h*t,c.style.width=`${s}px`,c.style.height=`${h}px`;const a=c.getContext("2d");return a&&(a.scale(t,t),a.translate(-r,-o),this.paths.forEach(l=>{l.drawTo(a,n)})),c}}const ue="data:image/svg+xml;",ye=`${ue}base64,`,fe=`${ue}charset=utf8,`;function xe(i){if(typeof i=="string"){let e;i.startsWith(ye)?(i=i.substring(ye.length,i.length),e=atob(i)):i.startsWith(fe)?(i=i.substring(fe.length,i.length),e=decodeURIComponent(i)):e=i;const t=new DOMParser().parseFromString(e,"text/xml"),n=t.querySelector("parsererror");if(n)throw new Error(`${n.textContent??"parser error"}
2
+ ${e}`);return t.documentElement}else return i}const un="px",yn=90,pe=["mm","cm","in","pt","pc","px"],ge={mm:{mm:1,cm:.1,in:1/25.4,pt:72/25.4,pc:6/25.4,px:-1},cm:{mm:10,cm:1,in:1/2.54,pt:72/2.54,pc:6/2.54,px:-1},in:{mm:25.4,cm:2.54,in:1,pt:72,pc:6,px:-1},pt:{mm:25.4/72,cm:2.54/72,in:1/72,pt:1,pc:6/72,px:-1},pc:{mm:25.4/6,cm:2.54/6,in:1/6,pt:72/6,pc:1,px:-1},px:{px:1}};function L(i){let e="px";if(typeof i=="string"||i instanceof String)for(let n=0,r=pe.length;n<r;n++){const o=pe[n];if(i.endsWith(o)){e=o,i=i.substring(0,i.length-o.length);break}}let t;return t=ge[e][un],t<0&&(t=ge[e].in*yn),t*Number.parseFloat(i)}const fn=new z,wt=new z,de=new z,me=new z;function xn(i,e,t){if(!(i.hasAttribute("transform")||i.nodeName==="use"&&(i.hasAttribute("x")||i.hasAttribute("y"))))return null;const n=pn(i);return t.length>0&&n.premultiply(t[t.length-1]),e.copy(n),t.push(n),n}function pn(i){const e=new z,t=fn;if(i.nodeName==="use"&&(i.hasAttribute("x")||i.hasAttribute("y"))&&e.translate(L(i.getAttribute("x")),L(i.getAttribute("y"))),i.hasAttribute("transform")){const n=i.getAttribute("transform").split(")");for(let r=n.length-1;r>=0;r--){const o=n[r].trim();if(o==="")continue;const s=o.indexOf("("),h=o.length;if(s>0&&s<h){const c=o.slice(0,s),a=Z(o.slice(s+1));switch(t.identity(),c){case"translate":if(a.length>=1){const l=a[0];let y=0;a.length>=2&&(y=a[1]),t.translate(l,y)}break;case"rotate":if(a.length>=1){let l=0,y=0,f=0;l=a[0]*Math.PI/180,a.length>=3&&(y=a[1],f=a[2]),wt.makeTranslation(-y,-f),de.makeRotation(l),me.multiplyMatrices(de,wt),wt.makeTranslation(y,f),t.multiplyMatrices(wt,me)}break;case"scale":a.length>=1&&t.scale(a[0],a[1]??a[0]);break;case"skewX":a.length===1&&t.set(1,Math.tan(a[0]*Math.PI/180),0,0,1,0,0,0,1);break;case"skewY":a.length===1&&t.set(1,0,0,Math.tan(a[0]*Math.PI/180),1,0,0,0,1);break;case"matrix":a.length===6&&t.set(a[0],a[2],a[4],a[1],a[3],a[5],0,0,1);break}}e.premultiply(t)}}return e}function gn(i){return new U().arc(L(i.getAttribute("cx")||0),L(i.getAttribute("cy")||0),L(i.getAttribute("r")||0),0,Math.PI*2)}function dn(i,e){if(!(!i.sheet||!i.sheet.cssRules||!i.sheet.cssRules.length))for(let t=0;t<i.sheet.cssRules.length;t++){const n=i.sheet.cssRules[t];if(n.type!==1)continue;const r=n.selectorText.split(/,/g).filter(Boolean).map(s=>s.trim()),o={};for(let s=n.style.length,h=0;h<s;h++){const c=n.style.item(h);o[c]=n.style.getPropertyValue(c)}for(let s=0;s<r.length;s++)e[r[s]]=Object.assign(e[r[s]]||{},{...o})}}function mn(i){return new U().ellipse(L(i.getAttribute("cx")||0),L(i.getAttribute("cy")||0),L(i.getAttribute("rx")||0),L(i.getAttribute("ry")||0),0,0,Math.PI*2)}function Mn(i){return new U().moveTo(L(i.getAttribute("x1")||0),L(i.getAttribute("y1")||0)).lineTo(L(i.getAttribute("x2")||0),L(i.getAttribute("y2")||0))}function Pn(i){const e=new U,t=i.getAttribute("d");return!t||t==="none"?null:(e.addData(t),e)}const wn=/([+-]?(?:\d+(?:\.\d+)?|\.\d+)(?:e[+-]?\d+)?)(?:,|\s)([+-]?\d*\.?\d+(?:e[+-]?\d+)?)/g;function vn(i){var n;const e=new U;let t=0;return(n=i.getAttribute("points"))==null||n.replace(wn,(r,o,s)=>{const h=L(o),c=L(s);return t===0?e.moveTo(h,c):e.lineTo(h,c),t++,r}),e.currentCurve.autoClose=!0,e}const Tn=/([+-]?(?:\d+(?:\.\d+)?|\.\d+)(?:e[+-]?\d+)?)(?:,|\s)([+-]?\d*\.?\d+(?:e[+-]?\d+)?)/g;function An(i){var n;const e=new U;let t=0;return(n=i.getAttribute("points"))==null||n.replace(Tn,(r,o,s)=>{const h=L(o),c=L(s);return t===0?e.moveTo(h,c):e.lineTo(h,c),t++,r}),e.currentCurve.autoClose=!1,e}function Cn(i){const e=L(i.getAttribute("x")||0),t=L(i.getAttribute("y")||0),n=L(i.getAttribute("rx")||i.getAttribute("ry")||0),r=L(i.getAttribute("ry")||i.getAttribute("rx")||0),o=L(i.getAttribute("width")),s=L(i.getAttribute("height")),h=1-.551915024494,c=new U;return c.moveTo(e+n,t),c.lineTo(e+o-n,t),(n!==0||r!==0)&&c.bezierCurveTo(e+o-n*h,t,e+o,t+r*h,e+o,t+r),c.lineTo(e+o,t+s-r),(n!==0||r!==0)&&c.bezierCurveTo(e+o,t+s-r*h,e+o-n*h,t+s,e+o-n,t+s),c.lineTo(e+n,t+s),(n!==0||r!==0)&&c.bezierCurveTo(e+n*h,t+s,e,t+s-r*h,e,t+s-r),c.lineTo(e,t+r),(n!==0||r!==0)&&c.bezierCurveTo(e,t+r*h,e+n*h,t,e+n,t),c}function G(i,e,t){e=Object.assign({},e);let n={};if(i.hasAttribute("class")){const a=i.getAttribute("class").split(/\s/).filter(Boolean).map(l=>l.trim());for(let l=0;l<a.length;l++)n=Object.assign(n,t[`.${a[l]}`])}i.hasAttribute("id")&&(n=Object.assign(n,t[`#${i.getAttribute("id")}`]));for(let a=i.style.length,l=0;l<a;l++){const y=i.style.item(l),f=i.style.getPropertyValue(y);e[y]=f,n[y]=f}function r(a,l,y=o){i.hasAttribute(a)&&(e[l]=y(i.getAttribute(a))),n[a]&&(e[l]=y(n[a]))}function o(a){return a.startsWith("url")&&console.warn("url access in attributes is not implemented."),a}function s(a){return Math.max(0,Math.min(1,L(a)))}function h(a){return Math.max(0,L(a))}function c(a){return a.split(" ").filter(l=>l!=="").map(l=>L(l))}return r("fill","fill"),r("fill-opacity","fillOpacity",s),r("fill-rule","fillRule"),r("opacity","opacity",s),r("stroke","stroke"),r("stroke-opacity","strokeOpacity",s),r("stroke-width","strokeWidth",h),r("stroke-linecap","strokeLinecap"),r("stroke-linejoin","strokeLinejoin"),r("stroke-miterlimit","strokeMiterlimit",h),r("stroke-dasharray","strokeDasharray",c),r("stroke-dashoffset","strokeDashoffset",L),r("visibility","visibility"),e}function Ot(i,e,t=[],n={}){var y;if(i.nodeType!==1)return t;let r=!1,o=null,s={...e};switch(i.nodeName){case"svg":s=G(i,s,n);break;case"style":dn(i,n);break;case"g":s=G(i,s,n);break;case"path":s=G(i,s,n),i.hasAttribute("d")&&(o=Pn(i));break;case"rect":s=G(i,s,n),o=Cn(i);break;case"polygon":s=G(i,s,n),o=vn(i);break;case"polyline":s=G(i,s,n),o=An(i);break;case"circle":s=G(i,s,n),o=gn(i);break;case"ellipse":s=G(i,s,n),o=mn(i);break;case"line":s=G(i,s,n),o=Mn(i);break;case"defs":r=!0;break;case"use":{s=G(i,s,n);const x=(i.getAttributeNS("http://www.w3.org/1999/xlink","href")||i.getAttribute("href")||"").substring(1),u=(y=i.viewportElement)==null?void 0:y.getElementById(x);u?Ot(u,s,t,n):console.warn(`'use node' references non-existent node id: ${x}`);break}default:console.warn(i);break}if(s.display==="none")return t;const h=new z,c=[],a=xn(i,h,c);o&&(o.applyTransform(h),t.push(o),o.style={...s});const l=i.childNodes;for(let f=0,x=l.length;f<x;f++){const u=l[f];r&&u.nodeName!=="style"&&u.nodeName!=="defs"||Ot(u,s,t,n)}return a&&(c.pop(),c.length>0?h.copy(c[c.length-1]):h.identity()),t}function bn(i){var t;const e=xe(i);return new le(Ot(e,{}),(t=e.getAttribute("viewBox"))==null?void 0:t.trim().split(" ").map(n=>Number(n)))}v.ArcCurve=re,v.BoundingBox=V,v.CompositeCurve=rt,v.CubicBezierCurve=Mt,v.Curve=Y,v.CurvePath=lt,v.EllipseCurve=oe,v.EquilateralPloygonCurve=hn,v.LineCurve=B,v.Matrix3=z,v.Path2D=U,v.Path2DSet=le,v.PloygonCurve=Ft,v.QuadraticBezierCurve=Pt,v.RectangleCurve=ce,v.RoundRectangleCurve=he,v.SplineCurve=ae,v.Vector2=p,v.catmullRom=St,v.cubicBezier=Et,v.drawPoint=R,v.fillTriangulate=jt,v.getAdaptiveCubicBezierCurvePoints=Ht,v.getAdaptiveQuadraticBezierCurvePoints=Qt,v.parseArcCommand=Zt,v.parsePathDataArgs=Z,v.quadraticBezier=Dt,v.setCanvasContext=Ct,v.strokeTriangulate=Jt,v.svgPathCommandsAddToPath2D=kt,v.svgPathCommandsToData=Ut,v.svgPathDataToCommands=It,v.svgToDOM=xe,v.svgToPath2DSet=bn,Object.defineProperty(v,Symbol.toStringTag,{value:"Module"})});
package/dist/index.mjs CHANGED
@@ -1851,26 +1851,20 @@ class RoundCurve extends Curve {
1851
1851
  isClockwise() {
1852
1852
  return this.clockwise;
1853
1853
  }
1854
- getPoint(t, output = new Vector2()) {
1855
- const twoPi = Math.PI * 2;
1854
+ _getDeltaAngle() {
1855
+ const PI_2 = Math.PI * 2;
1856
1856
  let deltaAngle = this.endAngle - this.startAngle;
1857
1857
  const samePoints = Math.abs(deltaAngle) < Number.EPSILON;
1858
- while (deltaAngle < 0) deltaAngle += twoPi;
1859
- while (deltaAngle > twoPi) deltaAngle -= twoPi;
1860
- if (deltaAngle < Number.EPSILON) {
1861
- if (samePoints) {
1862
- deltaAngle = 0;
1863
- } else {
1864
- deltaAngle = twoPi;
1865
- }
1866
- }
1867
- if (this.clockwise && !samePoints) {
1868
- if (deltaAngle === twoPi) {
1869
- deltaAngle = -twoPi;
1870
- } else {
1871
- deltaAngle = deltaAngle - twoPi;
1872
- }
1858
+ deltaAngle = (deltaAngle % PI_2 + PI_2) % PI_2;
1859
+ if (samePoints) {
1860
+ deltaAngle = 0;
1861
+ } else if (!this.clockwise) {
1862
+ deltaAngle = deltaAngle === 0 ? -PI_2 : deltaAngle - PI_2;
1873
1863
  }
1864
+ return deltaAngle;
1865
+ }
1866
+ getPoint(t, output = new Vector2()) {
1867
+ const deltaAngle = this._getDeltaAngle();
1874
1868
  const angle = this.startAngle + t * deltaAngle;
1875
1869
  let _x = this.cx + this.rx * Math.cos(angle);
1876
1870
  let _y = this.cy + this.ry * Math.sin(angle);
@@ -1940,75 +1934,21 @@ class RoundCurve extends Curve {
1940
1934
  return [this._center];
1941
1935
  }
1942
1936
  getAdaptivePointArray(output = []) {
1943
- const { cx, cy, rx, ry, dx, dy } = this;
1937
+ const { cx, cy, rx, ry, dx, dy, startAngle } = this;
1944
1938
  if (!(rx >= 0 && ry >= 0 && dx >= 0 && dy >= 0)) {
1945
1939
  return output;
1946
1940
  }
1947
- const n = Math.ceil(2.3 * Math.sqrt(rx + ry));
1948
- const m = n * 8 + (dx ? 4 : 0) + (dy ? 4 : 0);
1949
- if (m === 0) {
1950
- return output;
1951
- }
1941
+ const PI_2 = Math.PI * 2;
1942
+ const deltaAngle = this._getDeltaAngle();
1943
+ const arcLengthFactor = Math.abs(deltaAngle) / PI_2;
1944
+ const n = Math.ceil(2.3 * Math.sqrt(rx + ry) * arcLengthFactor);
1952
1945
  const array = [];
1953
- if (n === 0) {
1954
- array[0] = array[6] = cx + dx;
1955
- array[1] = array[3] = cy + dy;
1956
- array[2] = array[4] = cx - dx;
1957
- array[5] = array[7] = cy - dy;
1958
- } else {
1959
- let j1 = 0;
1960
- let j2 = n * 4 + (dx ? 2 : 0) + 2;
1961
- let j3 = j2;
1962
- let j4 = m;
1963
- let x0 = dx + rx;
1964
- let y0 = dy;
1965
- let x1 = cx + x0;
1966
- let x2 = cx - x0;
1967
- let y1 = cy + y0;
1968
- array[j1++] = x1;
1969
- array[j1++] = y1;
1970
- array[--j2] = y1;
1971
- array[--j2] = x2;
1972
- if (dy) {
1973
- const y22 = cy - y0;
1974
- array[j3++] = x2;
1975
- array[j3++] = y22;
1976
- array[--j4] = y22;
1977
- array[--j4] = x1;
1978
- }
1979
- for (let i = 1; i < n; i++) {
1980
- const a = Math.PI / 2 * (i / n);
1981
- const x02 = dx + Math.cos(a) * rx;
1982
- const y02 = dy + Math.sin(a) * ry;
1983
- const x12 = cx + x02;
1984
- const x22 = cx - x02;
1985
- const y12 = cy + y02;
1986
- const y22 = cy - y02;
1987
- array[j1++] = x12;
1988
- array[j1++] = y12;
1989
- array[--j2] = y12;
1990
- array[--j2] = x22;
1991
- array[j3++] = x22;
1992
- array[j3++] = y22;
1993
- array[--j4] = y22;
1994
- array[--j4] = x12;
1995
- }
1996
- x0 = dx;
1997
- y0 = dy + ry;
1998
- x1 = cx + x0;
1999
- x2 = cx - x0;
2000
- y1 = cy + y0;
2001
- const y2 = cy - y0;
2002
- array[j1++] = x1;
2003
- array[j1++] = y1;
2004
- array[--j4] = y2;
2005
- array[--j4] = x1;
2006
- if (dx) {
2007
- array[j1++] = x2;
2008
- array[j1++] = y1;
2009
- array[--j4] = y2;
2010
- array[--j4] = x2;
2011
- }
1946
+ for (let i = 0; i <= n; i++) {
1947
+ const t = i / n;
1948
+ const angle = startAngle + t * deltaAngle;
1949
+ const x = cx + dx + Math.cos(angle) * rx;
1950
+ const y = cy + dy + Math.sin(angle) * ry;
1951
+ array.push(x, y);
2012
1952
  }
2013
1953
  Array.prototype.push.apply(output, array);
2014
1954
  return output;
@@ -2321,14 +2261,29 @@ class CompositeCurve extends Curve {
2321
2261
  getControlPointRefs() {
2322
2262
  return this.curves.flatMap((curve) => curve.getControlPointRefs());
2323
2263
  }
2264
+ _removeNextPointIfEqualPrevPoint(output, offset) {
2265
+ if (output[offset - 1] === output[offset + 1] && output[offset] === output[offset + 2]) {
2266
+ output.splice(offset + 1, 2);
2267
+ }
2268
+ return output;
2269
+ }
2270
+ getSpacedPointArray(count = 5, output = []) {
2271
+ let offset;
2272
+ this.curves.forEach((curve) => {
2273
+ curve.getSpacedPointArray(count, output);
2274
+ if (offset) {
2275
+ this._removeNextPointIfEqualPrevPoint(output, offset);
2276
+ }
2277
+ offset = output.length - 1;
2278
+ });
2279
+ return output;
2280
+ }
2324
2281
  getAdaptivePointArray(output = []) {
2325
2282
  let offset;
2326
2283
  this.curves.forEach((curve) => {
2327
2284
  curve.getAdaptivePointArray(output);
2328
2285
  if (offset) {
2329
- if (output[offset - 1] === output[offset + 1] && output[offset] === output[offset + 2]) {
2330
- output.splice(offset + 1, 2);
2331
- }
2286
+ this._removeNextPointIfEqualPrevPoint(output, offset);
2332
2287
  }
2333
2288
  offset = output.length - 1;
2334
2289
  });
@@ -2864,19 +2819,56 @@ class CurvePath extends CompositeCurve {
2864
2819
  this.addCommands(svgPathDataToCommands(data));
2865
2820
  return this;
2866
2821
  }
2867
- getUnevenPointArray(count = 40, output = []) {
2868
- super.getUnevenPointArray(count, output);
2822
+ _closePointArray(output) {
2869
2823
  if (this.autoClose && output.length >= 4 && (output[0] !== output[output.length - 2] && output[1] !== output[output.length - 1])) {
2870
2824
  output.push(output[0], output[1]);
2871
2825
  }
2872
2826
  return output;
2873
2827
  }
2828
+ getUnevenPointArray(count = 40, output = []) {
2829
+ return this._closePointArray(
2830
+ super.getUnevenPointArray(count, output)
2831
+ );
2832
+ }
2874
2833
  getSpacedPointArray(count = 40, output = []) {
2875
- super.getSpacedPointArray(count, output);
2876
- if (this.autoClose && output.length >= 4 && (output[0] !== output[output.length - 2] && output[1] !== output[output.length - 1])) {
2877
- output.push(output[0], output[1]);
2878
- }
2879
- return output;
2834
+ return this._closePointArray(
2835
+ super.getSpacedPointArray(count, output)
2836
+ );
2837
+ }
2838
+ getAdaptivePointArray(output = []) {
2839
+ return this._closePointArray(
2840
+ super.getAdaptivePointArray(output)
2841
+ );
2842
+ }
2843
+ fillTriangulate(options) {
2844
+ const indices = options?.indices ?? [];
2845
+ const vertices = options?.vertices ?? [];
2846
+ const result = { vertices, indices };
2847
+ this.curves.forEach((curve) => {
2848
+ const { vertices: vertices2, indices: indices2 } = curve.fillTriangulate({
2849
+ ...options,
2850
+ indices: [],
2851
+ vertices: []
2852
+ });
2853
+ result.vertices = result.vertices.concat(vertices2);
2854
+ result.indices = result.indices.concat(indices2);
2855
+ });
2856
+ return result;
2857
+ }
2858
+ strokeTriangulate(options) {
2859
+ const indices = options?.indices ?? [];
2860
+ const vertices = options?.vertices ?? [];
2861
+ const result = { vertices, indices };
2862
+ this.curves.forEach((curve) => {
2863
+ const { vertices: vertices2, indices: indices2 } = curve.strokeTriangulate({
2864
+ ...options,
2865
+ indices: [],
2866
+ vertices: []
2867
+ });
2868
+ result.vertices = result.vertices.concat(vertices2);
2869
+ result.indices = result.indices.concat(indices2);
2870
+ });
2871
+ return result;
2880
2872
  }
2881
2873
  _setCurrentPoint(point) {
2882
2874
  this.currentPoint = new Vector2(point.x, point.y);
@@ -2899,7 +2891,7 @@ class CurvePath extends CompositeCurve {
2899
2891
  if (start) {
2900
2892
  const end = this.currentPoint;
2901
2893
  if (end && !start.equals(end)) {
2902
- this.curves.push(new LineCurve(end, start));
2894
+ this.curves.push(new LineCurve(end.clone(), start.clone()));
2903
2895
  end.copy(start);
2904
2896
  }
2905
2897
  this.startPoint = undefined;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "modern-path2d",
3
3
  "type": "module",
4
- "version": "1.2.11",
4
+ "version": "1.2.13",
5
5
  "packageManager": "pnpm@9.15.1",
6
6
  "description": "A modern Path2D library, fully compatible with Web Path2D, with additional support for path animation, path deformation, path playback, etc.",
7
7
  "author": "wxm",