{"version":3,"file":"clipper2-js.mjs","sources":["../../../projects/clipper2-js/src/lib/minkowski.ts","../../../projects/clipper2-js/src/lib/offset.ts","../../../projects/clipper2-js/src/lib/rectclip.ts","../../../projects/clipper2-js/src/lib/clipper.ts","../../../projects/clipper2-js/src/lib/engine.ts","../../../projects/clipper2-js/src/lib/core.ts","../../../projects/clipper2-js/src/public-api.ts","../../../projects/clipper2-js/src/clipper2-js.ts"],"sourcesContent":["/*******************************************************************************\r\n* Author    :  Angus Johnson                                                   *\r\n* Date      :  15 October 2022                                                 *\r\n* Website   :  http://www.angusj.com                                           *\r\n* Copyright :  Angus Johnson 2010-2022                                         *\r\n* Purpose   :  Minkowski Sum and Difference                                    *\r\n* License   :  http://www.boost.org/LICENSE_1_0.txt                            *\r\n*******************************************************************************/\r\n\r\n//\r\n// Converted from C# implemention https://github.com/AngusJohnson/Clipper2/blob/main/CSharp/Clipper2Lib/Clipper.Core.cs\r\n// Removed support for USINGZ\r\n//\r\n// Converted by ChatGPT 4 August 3 version https://help.openai.com/en/articles/6825453-chatgpt-release-notes\r\n//\r\n\r\nimport { Clipper } from \"./clipper\";\r\nimport { FillRule, IPoint64, Path64, Paths64 } from \"./core\";\r\n\r\n\r\nexport class Minkowski {\r\n  private static minkowskiInternal(pattern: Path64, path: Path64, isSum: boolean, isClosed: boolean): Paths64 {\r\n    const delta = isClosed ? 0 : 1;\r\n    const patLen = pattern.length;\r\n    const pathLen = path.length;\r\n    const tmp: Array<Array<IPoint64>> = []\r\n\r\n    for (const pathPt of path) {\r\n      const path2: Array<IPoint64> = []\r\n      if (isSum) {\r\n        for (const basePt of pattern)\r\n          path2.push({ x: pathPt.x + basePt.x, y: pathPt.y + basePt.y });\r\n      } else {\r\n        for (const basePt of pattern)\r\n          path2.push({ x: pathPt.x - basePt.x, y: pathPt.y - basePt.y });\r\n      }\r\n      tmp.push(path2);\r\n    }\r\n\r\n    const result: Array<Array<IPoint64>> = []\r\n    let g = isClosed ? pathLen - 1 : 0;\r\n\r\n    let h = patLen - 1;\r\n    for (let i = delta; i < pathLen; i++) {\r\n      for (let j = 0; j < patLen; j++) {\r\n        const quad: Path64 = [tmp[g][h], tmp[i][h], tmp[i][j], tmp[g][j]];\r\n        if (!Clipper.isPositive(quad))\r\n          result.push(Clipper.reversePath(quad));\r\n        else\r\n          result.push(quad);\r\n        h = j;\r\n      }\r\n      g = i;\r\n    }\r\n    return result;\r\n  }\r\n\r\n  public static sum(pattern: Path64, path: Path64, isClosed: boolean): Paths64 {\r\n    return Clipper.Union(this.minkowskiInternal(pattern, path, true, isClosed), undefined, FillRule.NonZero);\r\n  }\r\n\r\n  public static diff(pattern: Path64, path: Path64, isClosed: boolean): Paths64 {\r\n    return Clipper.Union(this.minkowskiInternal(pattern, path, false, isClosed), undefined, FillRule.NonZero);\r\n  }\r\n\r\n}\r\n","/*******************************************************************************\r\n* Author    :  Angus Johnson                                                   *\r\n* Date      :  24 September 2023                                               *\r\n* Website   :  http://www.angusj.com                                           *\r\n* Copyright :  Angus Johnson 2010-2023                                         *\r\n* Purpose   :  Path Offset (Inflate/Shrink)                                    *\r\n* License   :  http://www.boost.org/LICENSE_1_0.txt                            *\r\n*******************************************************************************/\r\n\r\n//\r\n// Converted from C# implemention https://github.com/AngusJohnson/Clipper2/blob/main/CSharp/Clipper2Lib/Clipper.Core.cs\r\n// Removed support for USINGZ\r\n//\r\n// Converted by ChatGPT 4 August 3 version https://help.openai.com/en/articles/6825453-chatgpt-release-notes\r\n//\r\n\r\nimport { Clipper } from \"./clipper\";\r\nimport { ClipType, FillRule, IPoint64, InternalClipper, Path64, Paths64, Point64, Rect64 } from \"./core\";\r\nimport { Clipper64, PolyTree64 } from \"./engine\";\r\n\r\nexport enum JoinType {\r\n  Miter,\r\n  Square,\r\n  Bevel,\r\n  Round\r\n}\r\n\r\nexport enum EndType {\r\n  Polygon,\r\n  Joined,\r\n  Butt,\r\n  Square,\r\n  Round\r\n}\r\n\r\nclass Group {\r\n  inPaths: Paths64;\r\n  outPath: Path64;\r\n  outPaths: Paths64;\r\n  joinType: JoinType;\r\n  endType: EndType;\r\n  pathsReversed: boolean;\r\n\r\n  constructor(paths: Paths64, joinType: JoinType, endType: EndType = EndType.Polygon) {\r\n    this.inPaths = [...paths]; // creates a shallow copy of paths\r\n    this.joinType = joinType;\r\n    this.endType = endType;\r\n    this.outPath = [];\r\n    this.outPaths = [];\r\n    this.pathsReversed = false;\r\n  }\r\n}\r\n\r\nexport class PointD implements IPoint64 {\r\n  public x: number;\r\n  public y: number;\r\n\r\n  constructor(xOrPt: number | PointD | Point64, yOrScale?: number) {\r\n    if (typeof xOrPt === 'number' && typeof yOrScale === 'number') {\r\n      this.x = xOrPt;\r\n      this.y = yOrScale;\r\n    } else if (xOrPt instanceof PointD) {\r\n      if (yOrScale !== undefined) {\r\n        this.x = xOrPt.x * yOrScale;\r\n        this.y = xOrPt.y * yOrScale;\r\n      } else {\r\n        this.x = xOrPt.x;\r\n        this.y = xOrPt.y;\r\n      }\r\n    } else {\r\n      this.x = (<Point64>xOrPt).x * (yOrScale || 1);\r\n      this.y = (<Point64>xOrPt).y * (yOrScale || 1);\r\n    }\r\n  }\r\n\r\n  public toString(precision: number = 2): string {\r\n    return `${this.x.toFixed(precision)},${this.y.toFixed(precision)}`;\r\n  }\r\n\r\n  public static equals(lhs: PointD, rhs: PointD): boolean {\r\n    return InternalClipper.isAlmostZero(lhs.x - rhs.x) &&\r\n      InternalClipper.isAlmostZero(lhs.y - rhs.y);\r\n  }\r\n\r\n  public static notEquals(lhs: PointD, rhs: PointD): boolean {\r\n    return !InternalClipper.isAlmostZero(lhs.x - rhs.x) ||\r\n      !InternalClipper.isAlmostZero(lhs.y - rhs.y);\r\n  }\r\n\r\n  public equals(obj: PointD): boolean {\r\n    if (obj instanceof PointD) {\r\n      return PointD.equals(this, obj);\r\n    }\r\n    return false;\r\n  }\r\n\r\n  public negate(): void {\r\n    this.x = -this.x;\r\n    this.y = -this.y;\r\n  }\r\n\r\n  //  public getHashCode(): number {\r\n  //    return this.x ^ this.y;  // XOR-based hash combination. Adjust if needed.\r\n  //  }\r\n}\r\n\r\nexport class ClipperOffset {\r\n\r\n  private static Tolerance: number = 1.0E-12;\r\n  private _groupList: Array<Group> = [];\r\n  private _normals: Array<PointD> = [];\r\n  private _solution: Paths64 = [];\r\n  private _groupDelta!: number; //*0.5 for open paths; *-1.0 for negative areas\r\n  private _delta!: number;\r\n  private _mitLimSqr!: number;\r\n  private _stepsPerRad!: number;\r\n  private _stepSin!: number;\r\n  private _stepCos!: number;\r\n  private _joinType!: JoinType;\r\n  private _endType!: EndType;\r\n  public ArcTolerance: number;\r\n  public MergeGroups: boolean;\r\n  public MiterLimit: number;\r\n  public PreserveCollinear: boolean;\r\n  public ReverseSolution: boolean;\r\n\r\n  public DeltaCallback?: (path: IPoint64[], path_norms: PointD[], currPt: number, prevPt: number) => number;\r\n\r\n  constructor(miterLimit: number = 2.0, arcTolerance: number = 0.0,\r\n    preserveCollinear: boolean = false, reverseSolution: boolean = false) {\r\n    this.MiterLimit = miterLimit;\r\n    this.ArcTolerance = arcTolerance;\r\n    this.MergeGroups = true;\r\n    this.PreserveCollinear = preserveCollinear;\r\n    this.ReverseSolution = reverseSolution;\r\n  }\r\n\r\n  public clear(): void {\r\n    this._groupList = [];\r\n  }\r\n\r\n  public addPath(path: Point64[], joinType: JoinType, endType: EndType): void {\r\n    if (path.length === 0) return;\r\n    const pp: Point64[][] = [path];\r\n    this.addPaths(pp, joinType, endType);\r\n  }\r\n\r\n  public addPaths(paths: Paths64, joinType: JoinType, endType: EndType): void {\r\n    if (paths.length === 0) return;\r\n    this._groupList.push(new Group(paths, joinType, endType));\r\n  }\r\n\r\n  private executeInternal(delta: number): void {\r\n    this._solution = [];\r\n    if (this._groupList.length === 0) return;\r\n\r\n    if (Math.abs(delta) < 0.5) {\r\n      for (const group of this._groupList) {\r\n        for (const path of group.inPaths) {\r\n          this._solution.push(path);\r\n        }\r\n      }\r\n    } else {\r\n      this._delta = delta;\r\n      this._mitLimSqr = (this.MiterLimit <= 1 ? 2.0 : 2.0 / this.sqr(this.MiterLimit));\r\n      for (const group of this._groupList) {\r\n        this.doGroupOffset(group);\r\n      }\r\n    }\r\n  }\r\n\r\n  private sqr(value: number): number {\r\n    return value * value;\r\n  }\r\n\r\n\r\n  public execute(delta: number, solution: Paths64): void {\r\n    solution.length = 0;\r\n    this.executeInternal(delta);\r\n    if (this._groupList.length === 0) return;\r\n\r\n    // clean up self-intersections ...\r\n    const c = new Clipper64()\r\n    c.preserveCollinear = this.PreserveCollinear\r\n    // the solution should retain the orientation of the input\r\n    c.reverseSolution = this.ReverseSolution !== this._groupList[0].pathsReversed\r\n\r\n    c.addSubjectPaths(this._solution);\r\n    if (this._groupList[0].pathsReversed)\r\n      c.execute(ClipType.Union, FillRule.Negative, solution);\r\n    else\r\n      c.execute(ClipType.Union, FillRule.Positive, solution);\r\n  }\r\n\r\n  public executePolytree(delta: number, polytree: PolyTree64): void {\r\n    polytree.clear();\r\n    this.executeInternal(delta);\r\n    if (this._groupList.length === 0) return;\r\n\r\n    // clean up self-intersections ...\r\n    const c = new Clipper64()\r\n    c.preserveCollinear = this.PreserveCollinear\r\n    // the solution should retain the orientation of the input\r\n    c.reverseSolution = this.ReverseSolution !== this._groupList[0].pathsReversed\r\n\r\n    c.addSubjectPaths(this._solution);\r\n    if (this._groupList[0].pathsReversed)\r\n      c.executePolyTree(ClipType.Union, FillRule.Negative, polytree);\r\n    else\r\n      c.executePolyTree(ClipType.Union, FillRule.Positive, polytree);\r\n  }\r\n\r\n  protected static getUnitNormal(pt1: IPoint64, pt2: IPoint64): PointD {\r\n    let dx = pt2.x - pt1.x;\r\n    let dy = pt2.y - pt1.y;\r\n    if (dx === 0 && dy === 0) return new PointD(0, 0);\r\n\r\n    const f = 1.0 / Math.sqrt(dx * dx + dy * dy);\r\n    dx *= f;\r\n    dy *= f;\r\n\r\n    return new PointD(dy, -dx);\r\n  }\r\n\r\n  public executeCallback(deltaCallback: (path: IPoint64[], path_norms: PointD[], currPt: number, prevPt: number) => number, solution: Point64[][]): void {\r\n    this.DeltaCallback = deltaCallback;\r\n    this.execute(1.0, solution);\r\n  }\r\n\r\n  private static getBoundsAndLowestPolyIdx(paths: Paths64): { index: number, rec: Rect64 } {\r\n    const rec = new Rect64(false); // ie invalid rect\r\n    let lpX: number = Number.MIN_SAFE_INTEGER;\r\n    let index = -1;\r\n    for (let i = 0; i < paths.length; i++) {\r\n      for (const pt of paths[i]) {\r\n        if (pt.y >= rec.bottom) {\r\n          if (pt.y > rec.bottom || pt.x < lpX) {\r\n            index = i;\r\n            lpX = pt.x;\r\n            rec.bottom = pt.y;\r\n          }\r\n        } else if (pt.y < rec.top) rec.top = pt.y;\r\n        if (pt.x > rec.right) rec.right = pt.x;\r\n        else if (pt.x < rec.left) rec.left = pt.x;\r\n      }\r\n    }\r\n    return { index, rec }\r\n  }\r\n\r\n  private static translatePoint(pt: PointD, dx: number, dy: number): PointD {\r\n    return new PointD(pt.x + dx, pt.y + dy);\r\n  }\r\n\r\n  private static reflectPoint(pt: PointD, pivot: PointD): PointD {\r\n    return new PointD(pivot.x + (pivot.x - pt.x), pivot.y + (pivot.y - pt.y));\r\n  }\r\n\r\n  private static almostZero(value: number, epsilon: number = 0.001): boolean {\r\n    return Math.abs(value) < epsilon;\r\n  }\r\n\r\n  private static hypotenuse(x: number, y: number): number {\r\n    return Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));\r\n  }\r\n\r\n  private static normalizeVector(vec: PointD): PointD {\r\n    const h = this.hypotenuse(vec.x, vec.y);\r\n    if (this.almostZero(h)) return new PointD(0, 0);\r\n    const inverseHypot = 1 / h;\r\n    return new PointD(vec.x * inverseHypot, vec.y * inverseHypot);\r\n  }\r\n\r\n  private static getAvgUnitVector(vec1: PointD, vec2: PointD): PointD {\r\n    return this.normalizeVector(new PointD(vec1.x + vec2.x, vec1.y + vec2.y));\r\n  }\r\n\r\n  private static intersectPoint(pt1a: PointD, pt1b: PointD, pt2a: PointD, pt2b: PointD): PointD {\r\n    if (InternalClipper.isAlmostZero(pt1a.x - pt1b.x)) { //vertical\r\n      if (InternalClipper.isAlmostZero(pt2a.x - pt2b.x)) return new PointD(0, 0);\r\n      const m2 = (pt2b.y - pt2a.y) / (pt2b.x - pt2a.x);\r\n      const b2 = pt2a.y - m2 * pt2a.x;\r\n      return new PointD(pt1a.x, m2 * pt1a.x + b2);\r\n    }\r\n\r\n    if (InternalClipper.isAlmostZero(pt2a.x - pt2b.x)) { //vertical\r\n      const m1 = (pt1b.y - pt1a.y) / (pt1b.x - pt1a.x);\r\n      const b1 = pt1a.y - m1 * pt1a.x;\r\n      return new PointD(pt2a.x, m1 * pt2a.x + b1);\r\n    } else {\r\n      const m1 = (pt1b.y - pt1a.y) / (pt1b.x - pt1a.x);\r\n      const b1 = pt1a.y - m1 * pt1a.x;\r\n      const m2 = (pt2b.y - pt2a.y) / (pt2b.x - pt2a.x);\r\n      const b2 = pt2a.y - m2 * pt2a.x;\r\n      if (InternalClipper.isAlmostZero(m1 - m2)) return new PointD(0, 0);\r\n      const x = (b2 - b1) / (m1 - m2);\r\n      return new PointD(x, m1 * x + b1);\r\n    }\r\n  }\r\n\r\n  private getPerpendic(pt: IPoint64, norm: PointD): Point64 {\r\n    return new Point64(pt.x + norm.x * this._groupDelta, pt.y + norm.y * this._groupDelta);\r\n  }\r\n\r\n  private getPerpendicD(pt: IPoint64, norm: PointD): PointD {\r\n    return new PointD(pt.x + norm.x * this._groupDelta, pt.y + norm.y * this._groupDelta);\r\n  }\r\n\r\n  private doBevel(group: Group, path: Path64, j: number, k: number) {\r\n    let pt1: IPoint64, pt2: IPoint64\r\n    if (j == k) {\r\n      const absDelta = Math.abs(this._groupDelta);\r\n      pt1 = new Point64(path[j].x - absDelta * this._normals[j].x, path[j].y - absDelta * this._normals[j].y);\r\n      pt2 = new Point64(path[j].x + absDelta * this._normals[j].x, path[j].y + absDelta * this._normals[j].y);\r\n    }\r\n    else {\r\n      pt1 = new Point64(path[j].x + this._groupDelta * this._normals[k].x, path[j].y + this._groupDelta * this._normals[k].y);\r\n      pt2 = new Point64(path[j].x + this._groupDelta * this._normals[j].x, path[j].y + this._groupDelta * this._normals[j].y);\r\n    }\r\n    group.outPath.push(pt1);\r\n    group.outPath.push(pt2);\r\n  }\r\n\r\n  private doSquare(group: Group, path: Path64, j: number, k: number): void {\r\n    let vec: PointD;\r\n    if (j === k) {\r\n      vec = new PointD(this._normals[j].y, -this._normals[j].x);\r\n    } else {\r\n      vec = ClipperOffset.getAvgUnitVector(\r\n        new PointD(-this._normals[k].y, this._normals[k].x),\r\n        new PointD(this._normals[j].y, -this._normals[j].x)\r\n      );\r\n    }\r\n\r\n    const absDelta = Math.abs(this._groupDelta);\r\n    // now offset the original vertex delta units along unit vector\r\n    let ptQ = new PointD(path[j].x, path[j].y);\r\n    ptQ = ClipperOffset.translatePoint(ptQ, absDelta * vec.x, absDelta * vec.y);\r\n\r\n    // get perpendicular vertices\r\n    const pt1 = ClipperOffset.translatePoint(ptQ, this._groupDelta * vec.y, this._groupDelta * -vec.x);\r\n    const pt2 = ClipperOffset.translatePoint(ptQ, this._groupDelta * -vec.y, this._groupDelta * vec.x);\r\n    // get 2 vertices along one edge offset\r\n    const pt3 = this.getPerpendicD(path[k], this._normals[k]);\r\n\r\n    if (j === k) {\r\n      const pt4 = new PointD(pt3.x + vec.x * this._groupDelta, pt3.y + vec.y * this._groupDelta);\r\n      const pt = ClipperOffset.intersectPoint(pt1, pt2, pt3, pt4);\r\n      //get the second intersect point through reflection\r\n      group.outPath.push(new Point64(ClipperOffset.reflectPoint(pt, ptQ).x, ClipperOffset.reflectPoint(pt, ptQ).y));\r\n      group.outPath.push(new Point64(pt.x, pt.y));\r\n    } else {\r\n      const pt4 = this.getPerpendicD(path[j], this._normals[k]);\r\n      const pt = ClipperOffset.intersectPoint(pt1, pt2, pt3, pt4);\r\n      group.outPath.push(new Point64(pt.x, pt.y));\r\n      //get the second intersect point through reflection\r\n      group.outPath.push(new Point64(ClipperOffset.reflectPoint(pt, ptQ).x, ClipperOffset.reflectPoint(pt, ptQ).y));\r\n    }\r\n  }\r\n\r\n  private doMiter(group: Group, path: Path64, j: number, k: number, cosA: number): void {\r\n    const q = this._groupDelta / (cosA + 1);\r\n    group.outPath.push(new Point64(\r\n      path[j].x + (this._normals[k].x + this._normals[j].x) * q,\r\n      path[j].y + (this._normals[k].y + this._normals[j].y) * q\r\n    ));\r\n  }\r\n\r\n  private doRound(group: Group, path: Path64, j: number, k: number, angle: number): void {\r\n    if (typeof this.DeltaCallback !== \"undefined\") {\r\n      const absDelta = Math.abs(this._groupDelta);\r\n      const arcTol = this.ArcTolerance > 0.01\r\n        ? this.ArcTolerance\r\n        : Math.log10(2 + absDelta) * InternalClipper.defaultArcTolerance;\r\n      const stepsPer360 = Math.PI / Math.acos(1 - arcTol / absDelta);\r\n      this._stepSin = Math.sin((2 * Math.PI) / stepsPer360);\r\n      this._stepCos = Math.cos((2 * Math.PI) / stepsPer360);\r\n      if (this._groupDelta < 0.0) this._stepSin = -this._stepSin;\r\n      this._stepsPerRad = stepsPer360 / (2 * Math.PI);\r\n    }\r\n\r\n    const pt = path[j];\r\n    let offsetVec = new PointD(this._normals[k].x * this._groupDelta, this._normals[k].y * this._groupDelta);\r\n    if (j === k) offsetVec.negate();\r\n    group.outPath.push(new Point64(pt.x + offsetVec.x, pt.y + offsetVec.y));\r\n\r\n    const steps = Math.ceil(this._stepsPerRad * Math.abs(angle));\r\n    for (let i = 1; i < steps; i++) {\r\n      offsetVec = new PointD(\r\n        offsetVec.x * this._stepCos - this._stepSin * offsetVec.y,\r\n        offsetVec.x * this._stepSin + offsetVec.y * this._stepCos\r\n      );\r\n      group.outPath.push(new Point64(pt.x + offsetVec.x, pt.y + offsetVec.y));\r\n    }\r\n    group.outPath.push(this.getPerpendic(pt, this._normals[j]));\r\n  }\r\n\r\n  private buildNormals(path: Path64): void {\r\n    const cnt = path.length;\r\n    this._normals = [];\r\n    this._normals.length = cnt;\r\n\r\n    for (let i = 0; i < cnt - 1; i++) {\r\n      this._normals[i] = ClipperOffset.getUnitNormal(path[i], path[i + 1]);\r\n    }\r\n    this._normals[cnt - 1] = ClipperOffset.getUnitNormal(path[cnt - 1], path[0]);\r\n  }\r\n\r\n  crossProduct(vec1: PointD, vec2: PointD): number {\r\n    return (vec1.y * vec2.x - vec2.y * vec1.x);\r\n  }\r\n\r\n  dotProduct(vec1: PointD, vec2: PointD): number {\r\n    return (vec1.x * vec2.x + vec1.y * vec2.y);\r\n  }\r\n\r\n  private offsetPoint(group: Group, path: Path64, j: number, k: number): void {\r\n    const sinA = this.crossProduct(this._normals[j], this._normals[k]);\r\n    let cosA = this.dotProduct(this._normals[j], this._normals[k]);\r\n    if (sinA > 1.0) cosA = 1.0;\r\n    else if (sinA < -1.0) cosA = -1.0;\r\n\r\n    if (typeof this.DeltaCallback !== \"undefined\") {\r\n      this._groupDelta = this.DeltaCallback(path, this._normals, j, k);\r\n      if (group.pathsReversed) this._groupDelta = -this._groupDelta;\r\n    }\r\n\r\n    if (Math.abs(this._groupDelta) < ClipperOffset.Tolerance) {\r\n      group.outPath.push(path[j]);\r\n      return;\r\n    }\r\n\r\n    if (cosA > -0.99 && (sinA * this._groupDelta < 0)) { // test for concavity first (#593)\r\n      // is concave\r\n      group.outPath.push(this.getPerpendic(path[j], this._normals[k]));\r\n      // this extra point is the only (simple) way to ensure that\r\n      // path reversals are fully cleaned with the trailing clipper\r\n      group.outPath.push(path[j]);\r\n      group.outPath.push(this.getPerpendic(path[j], this._normals[j]));\r\n    } else if (cosA > 0.999) {\r\n      this.doMiter(group, path, j, k, cosA);\r\n    } else if (this._joinType === JoinType.Miter) {\r\n      // miter unless the angle is so acute the miter would exceeds ML\r\n      if (cosA > this._mitLimSqr - 1) {\r\n        this.doMiter(group, path, j, k, cosA);\r\n      } else {\r\n        this.doSquare(group, path, j, k);\r\n      }\r\n    } else if (cosA > 0.99 || this._joinType == JoinType.Bevel)\r\n      //angle less than 8 degrees or a squared join\r\n      this.doBevel(group, path, j, k);\r\n    else if (this._joinType == JoinType.Round)\r\n      this.doRound(group, path, j, k, Math.atan2(sinA, cosA));\r\n    else\r\n      this.doSquare(group, path, j, k);\r\n\r\n    k = j;\r\n  }\r\n\r\n  private offsetPolygon(group: Group, path: Path64): void {\r\n    const area = Clipper.area(path);\r\n    if ((area < 0) !== (this._groupDelta < 0)) {\r\n      const rect = Clipper.getBounds(path);\r\n      const offsetMinDim = Math.abs(this._groupDelta) * 2;\r\n      if (offsetMinDim > rect.width || offsetMinDim > rect.height) return;\r\n    }\r\n\r\n    group.outPath = [];\r\n    const cnt = path.length;\r\n    const prev = cnt - 1;\r\n    for (let i = 0; i < cnt; i++) {\r\n      this.offsetPoint(group, path, i, prev);\r\n    }\r\n    group.outPaths.push(group.outPath);\r\n  }\r\n\r\n  private offsetOpenJoined(group: Group, path: Path64): void {\r\n    this.offsetPolygon(group, path);\r\n    path = Clipper.reversePath(path);\r\n    this.buildNormals(path);\r\n    this.offsetPolygon(group, path);\r\n  }\r\n\r\n  private offsetOpenPath(group: Group, path: Path64): void {\r\n    group.outPath = [];\r\n    const highI = path.length - 1;\r\n\r\n    if (typeof this.DeltaCallback !== \"undefined\") {\r\n      this._groupDelta = this.DeltaCallback(path, this._normals, 0, 0);\r\n    }\r\n\r\n    if (Math.abs(this._groupDelta) < ClipperOffset.Tolerance) {\r\n      group.outPath.push(path[0]);\r\n    } else {\r\n      switch (this._endType) {\r\n        case EndType.Butt:\r\n          this.doBevel(group, path, 0, 0);\r\n          break;\r\n        case EndType.Round:\r\n          this.doRound(group, path, 0, 0, Math.PI);\r\n          break;\r\n        default:\r\n          this.doSquare(group, path, 0, 0);\r\n          break;\r\n      }\r\n    }\r\n\r\n    for (let i = 1, k = 0; i < highI; i++) {\r\n      this.offsetPoint(group, path, i, k);\r\n    }\r\n\r\n    for (let i = highI; i > 0; i--) {\r\n      this._normals[i] = new PointD(-this._normals[i - 1].x, -this._normals[i - 1].y);\r\n    }\r\n    this._normals[0] = this._normals[highI];\r\n\r\n    if (typeof this.DeltaCallback !== \"undefined\") {\r\n      this._groupDelta = this.DeltaCallback(path, this._normals, highI, highI);\r\n    }\r\n\r\n    if (Math.abs(this._groupDelta) < ClipperOffset.Tolerance) {\r\n      group.outPath.push(path[highI]);\r\n    } else {\r\n      switch (this._endType) {\r\n        case EndType.Butt:\r\n          this.doBevel(group, path, highI, highI);\r\n          break;\r\n        case EndType.Round:\r\n          this.doRound(group, path, highI, highI, Math.PI);\r\n          break;\r\n        default:\r\n          this.doSquare(group, path, highI, highI);\r\n          break;\r\n      }\r\n    }\r\n\r\n    for (let i = highI, k = 0; i > 0; i--) {\r\n      this.offsetPoint(group, path, i, k);\r\n    }\r\n\r\n    group.outPaths.push(group.outPath);\r\n  }\r\n\r\n  private doGroupOffset(group: Group): void {\r\n    if (group.endType == EndType.Polygon) {\r\n\r\n      const { index } = ClipperOffset.getBoundsAndLowestPolyIdx(group.inPaths);\r\n\r\n      if (index < 0) return;\r\n\r\n      const area = Clipper.area(group.inPaths[index]);\r\n      group.pathsReversed = area < 0;\r\n\r\n      if (group.pathsReversed) {\r\n        this._groupDelta = -this._delta;\r\n      } else {\r\n        this._groupDelta = this._delta;\r\n      }\r\n    } else {\r\n      group.pathsReversed = false;\r\n      this._groupDelta = Math.abs(this._delta) * 0.5;\r\n    }\r\n\r\n    const absDelta = Math.abs(this._groupDelta);\r\n    this._joinType = group.joinType;\r\n    this._endType = group.endType;\r\n\r\n    if (!this.DeltaCallback &&\r\n      (group.joinType == JoinType.Round || group.endType == EndType.Round)) {\r\n      const arcTol = this.ArcTolerance > 0.01\r\n        ? this.ArcTolerance\r\n        : Math.log10(2 + absDelta) * InternalClipper.defaultArcTolerance;\r\n\r\n      const stepsPer360 = Math.PI / Math.acos(1 - arcTol / absDelta);\r\n      this._stepSin = Math.sin((2 * Math.PI) / stepsPer360);\r\n      this._stepCos = Math.cos((2 * Math.PI) / stepsPer360);\r\n\r\n      if (this._groupDelta < 0.0) {\r\n        this._stepSin = -this._stepSin;\r\n      }\r\n\r\n      this._stepsPerRad = stepsPer360 / (2 * Math.PI);\r\n    }\r\n\r\n    const isJoined = group.endType == EndType.Joined || group.endType == EndType.Polygon;\r\n\r\n    for (const p of group.inPaths) {\r\n      const path = Clipper.stripDuplicates(p, isJoined);\r\n      const cnt = path.length;\r\n\r\n      if (cnt === 0 || (cnt < 3 && this._endType == EndType.Polygon)) {\r\n        continue;\r\n      }\r\n\r\n      if (cnt == 1) {\r\n        group.outPath = [];\r\n\r\n        if (group.endType == EndType.Round) {\r\n          const r = absDelta;\r\n          const steps = Math.ceil(this._stepsPerRad * 2 * Math.PI);\r\n          group.outPath = Clipper.ellipse(path[0], r, r, steps);\r\n        } else {\r\n          const d = Math.ceil(this._groupDelta);\r\n          const r = new Rect64(path[0].x - d, path[0].y - d, path[0].x - d, path[0].y - d);\r\n          group.outPath = r.asPath();\r\n        }\r\n\r\n        group.outPaths.push(group.outPath);\r\n      } else {\r\n        if (cnt == 2 && group.endType == EndType.Joined) {\r\n          if (group.joinType == JoinType.Round) {\r\n            this._endType = EndType.Round;\r\n          } else {\r\n            this._endType = EndType.Square;\r\n          }\r\n        }\r\n\r\n        this.buildNormals(path);\r\n\r\n        if (this._endType == EndType.Polygon) {\r\n          this.offsetPolygon(group, path);\r\n        } else if (this._endType == EndType.Joined) {\r\n          this.offsetOpenJoined(group, path);\r\n        } else {\r\n          this.offsetOpenPath(group, path);\r\n        }\r\n      }\r\n    }\r\n\r\n    this._solution.push(...group.outPaths);\r\n    group.outPaths = [];\r\n  }\r\n}\r\n","/*******************************************************************************\r\n* Author    :  Angus Johnson                                                   *\r\n* Date      :  8 September 2023                                                  *\r\n* Website   :  http://www.angusj.com                                           *\r\n* Copyright :  Angus Johnson 2010-2023                                         *\r\n* Purpose   :  FAST rectangular clipping                                       *\r\n* License   :  http://www.boost.org/LICENSE_1_0.txt                            *\r\n*******************************************************************************/\r\n\r\n//\r\n// Converted from C# implemention https://github.com/AngusJohnson/Clipper2/blob/main/CSharp/Clipper2Lib/Clipper.Core.cs\r\n// Removed support for USINGZ\r\n//\r\n// Converted by ChatGPT 4 August 3 version https://help.openai.com/en/articles/6825453-chatgpt-release-notes\r\n//\r\n\r\nimport { Clipper } from \"./clipper\";\r\nimport { IPoint64, InternalClipper, Path64, Paths64, Point64, Rect64 } from \"./core\";\r\nimport { PointInPolygonResult } from \"./engine\";\r\n\r\nexport class OutPt2 {\r\n  next?: OutPt2;\r\n  prev?: OutPt2;\r\n\r\n  pt: IPoint64;\r\n  ownerIdx: number;\r\n  edge?: Array<OutPt2 | undefined>;\r\n\r\n  constructor(pt: IPoint64) {\r\n    this.pt = pt;\r\n    this.ownerIdx = 0\r\n  }\r\n}\r\n\r\nenum Location {\r\n  left, top, right, bottom, inside\r\n}\r\n\r\nexport class RectClip64 {\r\n  protected rect: Rect64;\r\n  protected mp: Point64;\r\n  protected rectPath: Path64;\r\n  protected pathBounds!: Rect64;\r\n  protected results: Array<OutPt2 | undefined>\r\n  protected edges: Array<OutPt2 | undefined>[];\r\n  protected currIdx = -1;\r\n\r\n  constructor(rect: Rect64) {\r\n    this.rect = rect;\r\n    this.mp = rect.midPoint();\r\n    this.rectPath = rect.asPath();\r\n    this.results = [];\r\n    this.edges = Array(8).fill(undefined).map(() => []);\r\n  }\r\n\r\n  protected add(pt: IPoint64, startingNewPath: boolean = false): OutPt2 {\r\n    let currIdx = this.results.length;\r\n    let result: OutPt2;\r\n    if (currIdx === 0 || startingNewPath) {\r\n      result = new OutPt2(pt);\r\n      this.results.push(result);\r\n      result.ownerIdx = currIdx;\r\n      result.prev = result;\r\n      result.next = result;\r\n    } else {\r\n      currIdx--;\r\n      const prevOp = this.results[currIdx];\r\n      if (prevOp!.pt === pt) return prevOp!;\r\n      result = new OutPt2(pt);\r\n      result.ownerIdx = currIdx;\r\n      result.next = prevOp!.next;\r\n      prevOp!.next!.prev = result;\r\n      prevOp!.next = result;\r\n      result.prev = prevOp!;\r\n      this.results[currIdx] = result;\r\n    }\r\n    return result;\r\n  }\r\n\r\n  private static path1ContainsPath2(path1: Path64, path2: Path64): boolean {\r\n    let ioCount = 0;\r\n    for (const pt of path2) {\r\n      const pip = InternalClipper.pointInPolygon(pt, path1);\r\n      switch (pip) {\r\n        case PointInPolygonResult.IsInside:\r\n          ioCount--; break;\r\n        case PointInPolygonResult.IsOutside:\r\n          ioCount++; break;\r\n      }\r\n      if (Math.abs(ioCount) > 1) break;\r\n    }\r\n    return ioCount <= 0;\r\n  }\r\n\r\n  private static isClockwise(prev: Location, curr: Location, prevPt: IPoint64, currPt: IPoint64, rectMidPoint: Point64): boolean {\r\n    if (this.areOpposites(prev, curr))\r\n      return InternalClipper.crossProduct(prevPt, rectMidPoint, currPt) < 0;\r\n    else\r\n      return this.headingClockwise(prev, curr);\r\n  }\r\n\r\n  private static areOpposites(prev: Location, curr: Location): boolean {\r\n    return Math.abs(prev - curr) === 2;\r\n  }\r\n\r\n  private static headingClockwise(prev: Location, curr: Location): boolean {\r\n    return (prev + 1) % 4 === curr;\r\n  }\r\n\r\n  private static getAdjacentLocation(loc: Location, isClockwise: boolean): Location {\r\n    const delta = isClockwise ? 1 : 3;\r\n    return (loc + delta) % 4;\r\n  }\r\n\r\n  private static unlinkOp(op: OutPt2 | undefined): OutPt2 | undefined {\r\n    if (op!.next === op) return undefined;\r\n    op!.prev!.next = op!.next;\r\n    op!.next!.prev = op!.prev;\r\n    return op!.next;\r\n  }\r\n\r\n  private static unlinkOpBack(op: OutPt2 | undefined): OutPt2 | undefined {\r\n    if (op!.next === op) return undefined;\r\n    op!.prev!.next = op!.next;\r\n    op!.next!.prev = op!.prev;\r\n    return op!.prev;\r\n  }\r\n\r\n  private static getEdgesForPt(pt: IPoint64, rec: Rect64): number {\r\n    let result = 0;\r\n    if (pt.x === rec.left) result = 1;\r\n    else if (pt.x === rec.right) result = 4;\r\n    if (pt.y === rec.top) result += 2;\r\n    else if (pt.y === rec.bottom) result += 8;\r\n    return result;\r\n  }\r\n\r\n  private static isHeadingClockwise(pt1: IPoint64, pt2: IPoint64, edgeIdx: number): boolean {\r\n    switch (edgeIdx) {\r\n      case 0: return pt2.y < pt1.y;\r\n      case 1: return pt2.x > pt1.x;\r\n      case 2: return pt2.y > pt1.y;\r\n      default: return pt2.x < pt1.x;\r\n    }\r\n  }\r\n\r\n  private static hasHorzOverlap(left1: IPoint64, right1: IPoint64, left2: IPoint64, right2: IPoint64): boolean {\r\n    return (left1.x < right2.x) && (right1.x > left2.x);\r\n  }\r\n\r\n  private static hasVertOverlap(top1: IPoint64, bottom1: IPoint64, top2: IPoint64, bottom2: IPoint64): boolean {\r\n    return (top1.y < bottom2.y) && (bottom1.y > top2.y);\r\n  }\r\n\r\n  private static addToEdge(edge: (OutPt2 | undefined)[], op: OutPt2): void {\r\n    if (op.edge) return;\r\n    op.edge = edge;\r\n    edge.push(op);\r\n  }\r\n\r\n  private static uncoupleEdge(op: OutPt2): void {\r\n    if (!op.edge) return;\r\n    for (let i = 0; i < op.edge.length; i++) {\r\n      const op2 = op.edge[i];\r\n      if (op2 === op) {\r\n        op.edge[i] = undefined;\r\n        break;\r\n      }\r\n    }\r\n    op.edge = undefined;\r\n  }\r\n\r\n  private static setNewOwner(op: OutPt2, newIdx: number): void {\r\n    op.ownerIdx = newIdx;\r\n    let op2 = op.next!;\r\n    while (op2 !== op) {\r\n      op2.ownerIdx = newIdx;\r\n      op2 = op2.next!;\r\n    }\r\n  }\r\n\r\n  private addCorner(prev: Location, curr: Location): void {\r\n    if (RectClip64.headingClockwise(prev, curr))\r\n      this.add(this.rectPath[prev]);\r\n    else\r\n      this.add(this.rectPath[curr]);\r\n  }\r\n\r\n  private addCornerByRef(loc: Location, isClockwise: boolean): void {\r\n    if (isClockwise) {\r\n      this.add(this.rectPath[loc]);\r\n      loc = RectClip64.getAdjacentLocation(loc, true);\r\n    } else {\r\n      loc = RectClip64.getAdjacentLocation(loc, false);\r\n      this.add(this.rectPath[loc]);\r\n    }\r\n  }\r\n\r\n  protected static getLocation(rec: Rect64, pt: IPoint64): { success: boolean, loc: Location } {\r\n    let loc: Location;\r\n\r\n    if (pt.x === rec.left && pt.y >= rec.top && pt.y <= rec.bottom) {\r\n      loc = Location.left; // pt on rec\r\n      return { success: false, loc }\r\n    }\r\n    if (pt.x === rec.right && pt.y >= rec.top && pt.y <= rec.bottom) {\r\n      loc = Location.right; // pt on rec\r\n      return { success: false, loc };\r\n    }\r\n    if (pt.y === rec.top && pt.x >= rec.left && pt.x <= rec.right) {\r\n      loc = Location.top; // pt on rec\r\n      return { success: false, loc };\r\n    }\r\n    if (pt.y === rec.bottom && pt.x >= rec.left && pt.x <= rec.right) {\r\n      loc = Location.bottom; // pt on rec\r\n      return { success: false, loc };\r\n    }\r\n    if (pt.x < rec.left) loc = Location.left;\r\n    else if (pt.x > rec.right) loc = Location.right;\r\n    else if (pt.y < rec.top) loc = Location.top;\r\n    else if (pt.y > rec.bottom) loc = Location.bottom;\r\n    else loc = Location.inside;\r\n\r\n    return { success: true, loc };\r\n  }\r\n\r\n  private static isHorizontal(pt1: IPoint64, pt2: IPoint64): boolean {\r\n    return pt1.y == pt2.y;\r\n  }\r\n\r\n  private static getSegmentIntersection(p1: IPoint64, p2: IPoint64, p3: IPoint64, p4: IPoint64): { success: boolean, ip: IPoint64 } {\r\n    let res1 = InternalClipper.crossProduct(p1, p3, p4);\r\n    let res2 = InternalClipper.crossProduct(p2, p3, p4);\r\n    let ip: IPoint64 = new Point64(0, 0);\r\n\r\n    const equals = (lhs: IPoint64, rhs: IPoint64): boolean => {\r\n      return lhs.x === rhs.x && lhs.y === rhs.y;\r\n    }\r\n\r\n    if (res1 === 0) {\r\n      ip = p1;\r\n      if (res2 === 0) return { ip, success: false };\r\n      else if (equals(p1, p3) || equals(p1, p4)) return { ip, success: true };\r\n      else if (RectClip64.isHorizontal(p3, p4)) return { ip, success: ((p1.x > p3.x) === (p1.x < p4.x)) };\r\n      else return { ip, success: ((p1.y > p3.y) === (p1.y < p4.y)) };\r\n    }\r\n    else if (res2 === 0) {\r\n      ip = p2;\r\n      if (equals(p2, p3) || equals(p2, p4)) return { ip, success: true };\r\n      else if (RectClip64.isHorizontal(p3, p4)) return { ip, success: ((p2.x > p3.x) === (p2.x < p4.x)) };\r\n      else return { ip, success: ((p2.y > p3.y) === (p2.y < p4.y)) };\r\n    }\r\n\r\n    if ((res1 > 0) === (res2 > 0)) return { ip: new Point64(0, 0), success: false };\r\n\r\n    let res3 = InternalClipper.crossProduct(p3, p1, p2);\r\n    let res4 = InternalClipper.crossProduct(p4, p1, p2);\r\n\r\n    if (res3 === 0) {\r\n      ip = p3;\r\n      if (equals(p3, p1) || equals(p3, p2)) return { ip, success: true };\r\n      else if (RectClip64.isHorizontal(p1, p2)) return { ip, success: ((p3.x > p1.x) === (p3.x < p2.x)) };\r\n      else return { ip, success: ((p3.y > p1.y) === (p3.y < p2.y)) };\r\n    }\r\n    else if (res4 === 0) {\r\n      ip = p4;\r\n      if (equals(p4, p1) || equals(p4, p2)) return { ip, success: true };\r\n      else if (RectClip64.isHorizontal(p1, p2)) return { ip, success: ((p4.x > p1.x) === (p4.x < p2.x)) };\r\n      else return { ip, success: ((p4.y > p1.y) === (p4.y < p2.y)) };\r\n    }\r\n\r\n    if ((res3 > 0) === (res4 > 0)) return { ip: new Point64(0, 0), success: false };\r\n\r\n    return InternalClipper.getIntersectPoint(p1, p2, p3, p4);\r\n  }\r\n\r\n  protected static getIntersection(rectPath: Path64, p: IPoint64, p2: IPoint64, loc: Location): { success: boolean, loc: Location, ip: IPoint64 } {\r\n    // gets the pt of intersection between rectPath and segment(p, p2) that's closest to 'p'\r\n    // when result == false, loc will remain unchanged\r\n    let ip: IPoint64 = new Point64();\r\n    let result: { success: boolean, ip: IPoint64 }\r\n\r\n    switch (loc) {\r\n      case Location.left:\r\n        if ((result = RectClip64.getSegmentIntersection(p, p2, rectPath[0], rectPath[3])).success)\r\n          return { success: true, loc, ip: result.ip }\r\n        else if (p.y < rectPath[0].y && (result = RectClip64.getSegmentIntersection(p, p2, rectPath[0], rectPath[1])).success) {\r\n          loc = Location.top;\r\n          return { success: true, loc, ip: result.ip }\r\n        }\r\n        else if ((result = RectClip64.getSegmentIntersection(p, p2, rectPath[2], rectPath[3])).success) {\r\n          loc = Location.bottom;\r\n          return { success: true, loc, ip: result.ip }\r\n        }\r\n        else return { success: false, loc, ip }\r\n\r\n      case Location.right:\r\n        if ((result = RectClip64.getSegmentIntersection(p, p2, rectPath[1], rectPath[2])).success)\r\n          return { success: true, loc, ip: result.ip }\r\n        else if (p.y < rectPath[0].y && (result = RectClip64.getSegmentIntersection(p, p2, rectPath[0], rectPath[1])).success) {\r\n          loc = Location.top;\r\n          return { success: true, loc, ip: result.ip }\r\n        }\r\n        else if ((result = RectClip64.getSegmentIntersection(p, p2, rectPath[2], rectPath[3])).success) {\r\n          loc = Location.bottom;\r\n          return { success: true, loc, ip: result.ip }\r\n        }\r\n        else return { success: false, loc, ip }\r\n\r\n      case Location.top:\r\n        if ((result = RectClip64.getSegmentIntersection(p, p2, rectPath[0], rectPath[1])).success)\r\n          return { success: true, loc, ip: result.ip }\r\n        else if (p.x < rectPath[0].x && (result = RectClip64.getSegmentIntersection(p, p2, rectPath[0], rectPath[3])).success) {\r\n          loc = Location.left;\r\n          return { success: true, loc, ip: result.ip }\r\n        }\r\n        else if (p.x > rectPath[1].x && (result = RectClip64.getSegmentIntersection(p, p2, rectPath[1], rectPath[2])).success) {\r\n          loc = Location.right;\r\n          return { success: true, loc, ip: result.ip }\r\n        }\r\n        else return { success: false, loc, ip }\r\n\r\n      case Location.bottom:\r\n        if ((result = RectClip64.getSegmentIntersection(p, p2, rectPath[2], rectPath[3])).success)\r\n          return { success: true, loc, ip: result.ip }\r\n        else if (p.x < rectPath[3].x && (result = RectClip64.getSegmentIntersection(p, p2, rectPath[0], rectPath[3])).success) {\r\n          loc = Location.left;\r\n          return { success: true, loc, ip: result.ip }\r\n        }\r\n        else if (p.x > rectPath[2].x && (result = RectClip64.getSegmentIntersection(p, p2, rectPath[1], rectPath[2])).success) {\r\n          loc = Location.right;\r\n          return { success: true, loc, ip: result.ip }\r\n        }\r\n        else return { success: false, loc, ip }\r\n\r\n      default:\r\n        if ((result = RectClip64.getSegmentIntersection(p, p2, rectPath[0], rectPath[3])).success) {\r\n          loc = Location.left;\r\n          return { success: true, loc, ip: result.ip }\r\n        }\r\n        else if ((result = RectClip64.getSegmentIntersection(p, p2, rectPath[0], rectPath[1])).success) {\r\n          loc = Location.top;\r\n          return { success: true, loc, ip: result.ip }\r\n        }\r\n        else if ((result = RectClip64.getSegmentIntersection(p, p2, rectPath[1], rectPath[2])).success) {\r\n          loc = Location.right;\r\n          return { success: true, loc, ip: result.ip }\r\n        }\r\n        else if ((result = RectClip64.getSegmentIntersection(p, p2, rectPath[2], rectPath[3])).success) {\r\n          loc = Location.bottom;\r\n          return { success: true, loc, ip: result.ip }\r\n        }\r\n        else return { success: false, loc, ip }\r\n    }\r\n  }\r\n\r\n  protected getNextLocation(path: Path64, context: { loc: Location, i: number, highI: number }): void {\r\n\r\n    switch (context.loc) {\r\n      case Location.left:\r\n        while (context.i <= context.highI && path[context.i].x <= this.rect.left) context.i++;\r\n        if (context.i > context.highI) break;\r\n        if (path[context.i].x >= this.rect.right) context.loc = Location.right;\r\n        else if (path[context.i].y <= this.rect.top) context.loc = Location.top;\r\n        else if (path[context.i].y >= this.rect.bottom) context.loc = Location.bottom;\r\n        else context.loc = Location.inside;\r\n        break;\r\n\r\n      case Location.top:\r\n        while (context.i <= context.highI && path[context.i].y <= this.rect.top) context.i++;\r\n        if (context.i > context.highI) break;\r\n        if (path[context.i].y >= this.rect.bottom) context.loc = Location.bottom;\r\n        else if (path[context.i].x <= this.rect.left) context.loc = Location.left;\r\n        else if (path[context.i].x >= this.rect.right) context.loc = Location.right;\r\n        else context.loc = Location.inside;\r\n        break;\r\n\r\n      case Location.right:\r\n        while (context.i <= context.highI && path[context.i].x >= this.rect.right) context.i++;\r\n        if (context.i > context.highI) break;\r\n        if (path[context.i].x <= this.rect.left) context.loc = Location.left;\r\n        else if (path[context.i].y <= this.rect.top) context.loc = Location.top;\r\n        else if (path[context.i].y >= this.rect.bottom) context.loc = Location.bottom;\r\n        else context.loc = Location.inside;\r\n        break;\r\n\r\n      case Location.bottom:\r\n        while (context.i <= context.highI && path[context.i].y >= this.rect.bottom) context.i++;\r\n        if (context.i > context.highI) break;\r\n        if (path[context.i].y <= this.rect.top) context.loc = Location.top;\r\n        else if (path[context.i].x <= this.rect.left) context.loc = Location.left;\r\n        else if (path[context.i].x >= this.rect.right) context.loc = Location.right;\r\n        else context.loc = Location.inside;\r\n        break;\r\n\r\n      case Location.inside:\r\n        while (context.i <= context.highI) {\r\n          if (path[context.i].x < this.rect.left) context.loc = Location.left;\r\n          else if (path[context.i].x > this.rect.right) context.loc = Location.right;\r\n          else if (path[context.i].y > this.rect.bottom) context.loc = Location.bottom;\r\n          else if (path[context.i].y < this.rect.top) context.loc = Location.top;\r\n          else {\r\n            this.add(path[context.i]);\r\n            context.i++;\r\n            continue;\r\n          }\r\n          break;\r\n        }\r\n        break;\r\n    }\r\n  }\r\n\r\n  protected executeInternal(path: Path64): void {\r\n    if (path.length < 3 || this.rect.isEmpty()) return;\r\n    const startLocs: Location[] = [];\r\n\r\n    let firstCross: Location = Location.inside;\r\n    let crossingLoc: Location = firstCross, prev: Location = firstCross;\r\n\r\n    let i: number\r\n    const highI = path.length - 1;\r\n    let result = RectClip64.getLocation(this.rect, path[highI])\r\n    let loc: Location = result.loc\r\n    if (!result.success) {\r\n      i = highI - 1;\r\n      while (i >= 0 && !result.success) {\r\n        i--\r\n        result = RectClip64.getLocation(this.rect, path[i])\r\n        prev = result.loc\r\n      }\r\n      if (i < 0) {\r\n        for (const pt of path) {\r\n          this.add(pt);\r\n        }\r\n        return;\r\n      }\r\n      if (prev == Location.inside) loc = Location.inside;\r\n    }\r\n    const startingLoc = loc;\r\n\r\n    ///////////////////////////////////////////////////\r\n    i = 0;\r\n    while (i <= highI) {\r\n      prev = loc;\r\n      const prevCrossLoc: Location = crossingLoc;\r\n      this.getNextLocation(path, { loc, i, highI });\r\n      if (i > highI) break;\r\n\r\n      const prevPt = (i == 0) ? path[highI] : path[i - 1];\r\n      crossingLoc = loc;\r\n\r\n      let result = RectClip64.getIntersection(this.rectPath, path[i], prevPt, crossingLoc)\r\n      const ip: IPoint64 = result.ip\r\n\r\n      if (!result.success) {\r\n        if (prevCrossLoc == Location.inside) {\r\n          const isClockw = RectClip64.isClockwise(prev, loc, prevPt, path[i], this.mp);\r\n          do {\r\n            startLocs.push(prev);\r\n            prev = RectClip64.getAdjacentLocation(prev, isClockw);\r\n          } while (prev != loc);\r\n          crossingLoc = prevCrossLoc;\r\n        } else if (prev != Location.inside && prev != loc) {\r\n          const isClockw = RectClip64.isClockwise(prev, loc, prevPt, path[i], this.mp);\r\n          do {\r\n            this.addCornerByRef(prev, isClockw);\r\n          } while (prev != loc);\r\n        }\r\n        ++i;\r\n        continue;\r\n      }\r\n\r\n      ////////////////////////////////////////////////////\r\n      // we must be crossing the rect boundary to get here\r\n      ////////////////////////////////////////////////////\r\n      if (loc == Location.inside) {\r\n        if (firstCross == Location.inside) {\r\n          firstCross = crossingLoc;\r\n          startLocs.push(prev);\r\n        } else if (prev != crossingLoc) {\r\n          const isClockw = RectClip64.isClockwise(prev, crossingLoc, prevPt, path[i], this.mp);\r\n          do {\r\n            this.addCornerByRef(prev, isClockw);\r\n          } while (prev != crossingLoc);\r\n        }\r\n      } else if (prev != Location.inside) {\r\n        // passing right through rect. 'ip' here will be the second\r\n        // intersect pt but we'll also need the first intersect pt (ip2)\r\n\r\n        loc = prev;\r\n        result = RectClip64.getIntersection(this.rectPath, prevPt, path[i], loc);\r\n        const ip2: IPoint64 = result.ip\r\n\r\n        if (prevCrossLoc != Location.inside && prevCrossLoc != loc)\r\n          this.addCorner(prevCrossLoc, loc);\r\n\r\n        if (firstCross == Location.inside) {\r\n          firstCross = loc;\r\n          startLocs.push(prev);\r\n        }\r\n\r\n        loc = crossingLoc;\r\n        this.add(ip2);\r\n        if (ip == ip2) {\r\n          loc = RectClip64.getLocation(this.rect, path[i]).loc;\r\n          this.addCorner(crossingLoc, loc);\r\n          crossingLoc = loc;\r\n          continue;\r\n        }\r\n      } else {\r\n        loc = crossingLoc;\r\n        if (firstCross == Location.inside)\r\n          firstCross = crossingLoc;\r\n      }\r\n\r\n      this.add(ip);\r\n    }//while i <= highI\r\n    ///////////////////////////////////////////////////\r\n\r\n    if (firstCross == Location.inside) {\r\n      if (startingLoc != Location.inside) {\r\n        if (this.pathBounds.containsRect(this.rect) && RectClip64.path1ContainsPath2(path, this.rectPath)) {\r\n          for (let j = 0; j < 4; j++) {\r\n            this.add(this.rectPath[j]);\r\n            RectClip64.addToEdge(this.edges[j * 2], this.results[0]!);\r\n          }\r\n        }\r\n      }\r\n    } else if (loc != Location.inside && (loc != firstCross || startLocs.length > 2)) {\r\n      if (startLocs.length > 0) {\r\n        prev = loc;\r\n        for (const loc2 of startLocs) {\r\n          if (prev == loc2) continue;\r\n          this.addCornerByRef(prev, RectClip64.headingClockwise(prev, loc2));\r\n          prev = loc2;\r\n        }\r\n        loc = prev;\r\n      }\r\n      if (loc != firstCross)\r\n        this.addCornerByRef(loc, RectClip64.headingClockwise(loc, firstCross));\r\n    }\r\n  }\r\n\r\n  public execute(paths: Paths64): Paths64 {\r\n    const result: Paths64 = [];\r\n    if (this.rect.isEmpty()) return result;\r\n\r\n    for (const path of paths) {\r\n      if (path.length < 3) continue;\r\n      this.pathBounds = Clipper.getBounds(path);\r\n\r\n      if (!this.rect.intersects(this.pathBounds)) continue;\r\n      else if (this.rect.containsRect(this.pathBounds)) {\r\n        result.push(path);\r\n        continue;\r\n      }\r\n      this.executeInternal(path);\r\n      this.checkEdges();\r\n      for (let i = 0; i < 4; ++i)\r\n        this.tidyEdgePair(i, this.edges[i * 2], this.edges[i * 2 + 1]);\r\n\r\n      for (const op of this.results) {\r\n        const tmp = this.getPath(op);\r\n        if (tmp.length > 0) result.push(tmp);\r\n      }\r\n\r\n      this.results.length = 0\r\n      for (let i = 0; i < 8; i++)\r\n        this.edges[i].length = 0\r\n    }\r\n    return result;\r\n  }\r\n\r\n  private checkEdges(): void {\r\n    for (let i = 0; i < this.results.length; i++) {\r\n      let op = this.results[i];\r\n      let op2 = op;\r\n\r\n      if (op === undefined) continue;\r\n\r\n      do {\r\n        if (InternalClipper.crossProduct(op2!.prev!.pt, op2!.pt, op2!.next!.pt) === 0) {\r\n          if (op2 === op) {\r\n            op2 = RectClip64.unlinkOpBack(op2);\r\n            if (op2 === undefined) break;\r\n            op = op2.prev;\r\n          } else {\r\n            op2 = RectClip64.unlinkOpBack(op2);\r\n            if (op2 === undefined) break;\r\n          }\r\n        } else {\r\n          op2 = op2!.next;\r\n        }\r\n      } while (op2 !== op);\r\n\r\n      if (op2 === undefined) {\r\n        this.results[i] = undefined;\r\n        continue;\r\n      }\r\n      this.results[i] = op2;\r\n\r\n      let edgeSet1 = RectClip64.getEdgesForPt(op!.prev!.pt, this.rect);\r\n      op2 = op;\r\n      do {\r\n        const edgeSet2 = RectClip64.getEdgesForPt(op2!.pt, this.rect);\r\n        if (edgeSet2 !== 0 && op2!.edge === undefined) {\r\n          const combinedSet = (edgeSet1 & edgeSet2);\r\n          for (let j = 0; j < 4; ++j) {\r\n            if ((combinedSet & (1 << j)) !== 0) {\r\n              if (RectClip64.isHeadingClockwise(op2!.prev!.pt, op2!.pt, j))\r\n                RectClip64.addToEdge(this.edges[j * 2], op2!);\r\n              else\r\n                RectClip64.addToEdge(this.edges[j * 2 + 1], op2!);\r\n            }\r\n          }\r\n        }\r\n        edgeSet1 = edgeSet2;\r\n        op2 = op2!.next;\r\n      } while (op2 !== op);\r\n    }\r\n  }\r\n\r\n  private tidyEdgePair(idx: number, cw: Array<OutPt2 | undefined>, ccw: Array<OutPt2 | undefined>): void {\r\n    if (ccw.length === 0) return;\r\n    const isHorz = (idx === 1 || idx === 3);\r\n    const cwIsTowardLarger = (idx === 1 || idx === 2);\r\n    let i = 0, j = 0;\r\n    let p1: OutPt2 | undefined, p2: OutPt2 | undefined, p1a: OutPt2 | undefined, p2a: OutPt2 | undefined, op: OutPt2 | undefined, op2: OutPt2 | undefined;\r\n\r\n    while (i < cw.length) {\r\n      p1 = cw[i];\r\n      if (!p1 || p1.next === p1.prev) {\r\n        cw[i++] = undefined;\r\n        j = 0;\r\n        continue;\r\n      }\r\n\r\n      const jLim = ccw.length;\r\n      while (j < jLim && (!ccw[j] || ccw[j]!.next === ccw[j]!.prev)) ++j;\r\n\r\n      if (j === jLim) {\r\n        ++i;\r\n        j = 0;\r\n        continue;\r\n      }\r\n\r\n      if (cwIsTowardLarger) {\r\n        p1 = cw[i]!.prev!;\r\n        p1a = cw[i];\r\n        p2 = ccw[j];\r\n        p2a = ccw[j]!.prev!;\r\n      } else {\r\n        p1 = cw[i];\r\n        p1a = cw[i]!.prev!;\r\n        p2 = ccw[j]!.prev!;\r\n        p2a = ccw[j];\r\n      }\r\n\r\n      if ((isHorz && !RectClip64.hasHorzOverlap(p1!.pt, p1a!.pt, p2!.pt, p2a!.pt)) ||\r\n        (!isHorz && !RectClip64.hasVertOverlap(p1!.pt, p1a!.pt, p2!.pt, p2a!.pt))) {\r\n        ++j;\r\n        continue;\r\n      }\r\n\r\n      const isRejoining = cw[i]!.ownerIdx !== ccw[j]!.ownerIdx;\r\n\r\n      if (isRejoining) {\r\n        this.results[p2!.ownerIdx] = undefined;\r\n        RectClip64.setNewOwner(p2!, p1!.ownerIdx);\r\n      }\r\n\r\n      if (cwIsTowardLarger) {\r\n        // p1 >> | >> p1a;\r\n        // p2 << | << p2a;\r\n        p1!.next = p2;\r\n        p2!.prev = p1;\r\n        p1a!.prev = p2a;\r\n        p2a!.next = p1a;\r\n      } else {\r\n        // p1 << | << p1a;\r\n        // p2 >> | >> p2a;\r\n        p1!.prev = p2;\r\n        p2!.next = p1;\r\n        p1a!.next = p2a;\r\n        p2a!.prev = p1a;\r\n      }\r\n\r\n      if (!isRejoining) {\r\n        const new_idx = this.results.length;\r\n        this.results.push(p1a);\r\n        RectClip64.setNewOwner(p1a!, new_idx);\r\n      }\r\n\r\n      if (cwIsTowardLarger) {\r\n        op = p2;\r\n        op2 = p1a;\r\n      } else {\r\n        op = p1;\r\n        op2 = p2a;\r\n      }\r\n      this.results[op!.ownerIdx] = op;\r\n      this.results[op2!.ownerIdx] = op2;\r\n\r\n      // and now lots of work to get ready for the next loop\r\n\r\n      let opIsLarger: boolean, op2IsLarger: boolean;\r\n      if (isHorz) { // X\r\n        opIsLarger = op!.pt.x > op!.prev!.pt.x;\r\n        op2IsLarger = op2!.pt.x > op2!.prev!.pt.x;\r\n      } else {      // Y\r\n        opIsLarger = op!.pt.y > op!.prev!.pt.y;\r\n        op2IsLarger = op2!.pt.y > op2!.prev!.pt.y;\r\n      }\r\n\r\n      if ((op!.next === op!.prev) || (op!.pt === op!.prev!.pt)) {\r\n        if (op2IsLarger === cwIsTowardLarger) {\r\n          cw[i] = op2;\r\n          ccw[j++] = undefined;\r\n        } else {\r\n          ccw[j] = op2;\r\n          cw[i++] = undefined;\r\n        }\r\n      } else if ((op2!.next === op2!.prev) || (op2!.pt === op2!.prev!.pt)) {\r\n        if (opIsLarger === cwIsTowardLarger) {\r\n          cw[i] = op;\r\n          ccw[j++] = undefined;\r\n        } else {\r\n          ccw[j] = op;\r\n          cw[i++] = undefined;\r\n        }\r\n      } else if (opIsLarger === op2IsLarger) {\r\n        if (opIsLarger === cwIsTowardLarger) {\r\n          cw[i] = op;\r\n          RectClip64.uncoupleEdge(op2!);\r\n          RectClip64.addToEdge(cw, op2!);\r\n          ccw[j++] = undefined;\r\n        } else {\r\n          cw[i++] = undefined;\r\n          ccw[j] = op2;\r\n          RectClip64.uncoupleEdge(op!);\r\n          RectClip64.addToEdge(ccw, op!);\r\n          j = 0;\r\n        }\r\n      } else {\r\n        if (opIsLarger === cwIsTowardLarger)\r\n          cw[i] = op;\r\n        else\r\n          ccw[j] = op;\r\n\r\n        if (op2IsLarger === cwIsTowardLarger)\r\n          cw[i] = op2;\r\n        else\r\n          ccw[j] = op2;\r\n      }\r\n    }\r\n  }\r\n\r\n  protected getPath(op: OutPt2 | undefined): Path64 {\r\n    const result = new Path64();\r\n    if (!op || op.prev === op.next) return result;\r\n\r\n    let op2: OutPt2 | undefined = op.next;\r\n    while (op2 && op2 !== op) {\r\n      if (InternalClipper.crossProduct(op2.prev!.pt, op2.pt, op2.next!.pt) === 0) {\r\n        op = op2.prev!;\r\n        op2 = RectClip64.unlinkOp(op2);\r\n      } else {\r\n        op2 = op2.next!;\r\n      }\r\n    }\r\n\r\n    if (!op2) return new Path64();\r\n\r\n    result.push(op.pt);\r\n    op2 = op.next!;\r\n    while (op2 !== op) {\r\n      result.push(op2.pt);\r\n      op2 = op2.next!;\r\n    }\r\n\r\n    return result;\r\n  }\r\n}\r\n\r\nexport class RectClipLines64 extends RectClip64 {\r\n\r\n  constructor(rect: Rect64) {\r\n    super(rect);\r\n  }\r\n\r\n  public override execute(paths: Paths64): Paths64 {\r\n    const result = new Paths64();\r\n    if (this.rect.isEmpty()) return result;\r\n    for (const path of paths) {\r\n      if (path.length < 2) continue;\r\n      this.pathBounds = Clipper.getBounds(path);\r\n      if (!this.rect.intersects(this.pathBounds)) continue;\r\n\r\n      this.executeInternal(path);\r\n\r\n      for (const op of this.results) {\r\n        const tmp = this.getPath(op);\r\n        if (tmp.length > 0) result.push(tmp);\r\n      }\r\n\r\n      // Clean up after every loop\r\n      this.results.length = 0; // Clear the array\r\n      for (let i = 0; i < 8; i++) {\r\n        this.edges[i].length = 0; // Clear each array\r\n      }\r\n    }\r\n    return result;\r\n  }\r\n\r\n  protected override getPath(op: OutPt2 | undefined): Path64 {\r\n    const result = new Path64();\r\n    if (!op || op === op.next) return result;\r\n    op = op.next; // starting at path beginning \r\n    result.push(op!.pt);\r\n    let op2 = op!.next!;\r\n    while (op2 !== op) {\r\n      result.push(op2.pt);\r\n      op2 = op2.next!;\r\n    }\r\n    return result;\r\n  }\r\n\r\n  protected override  executeInternal(path: Path64): void {\r\n    this.results = [];\r\n    if (path.length < 2 || this.rect.isEmpty()) return;\r\n\r\n    let prev: Location = Location.inside;\r\n    let i = 1;\r\n    const highI = path.length - 1;\r\n\r\n    let result = RectClipLines64.getLocation(this.rect, path[0])\r\n    let loc: Location = result.loc\r\n    if (!result.success) {\r\n      while (i <= highI && !result.success) {\r\n        i++\r\n        result = RectClipLines64.getLocation(this.rect, path[i])\r\n        prev = result.loc\r\n      }\r\n      if (i > highI) {\r\n        for (const pt of path) this.add(pt);\r\n      }\r\n      if (prev == Location.inside) loc = Location.inside;\r\n      i = 1;\r\n    }\r\n    if (loc == Location.inside) this.add(path[0]);\r\n\r\n    while (i <= highI) {\r\n      prev = loc;\r\n      this.getNextLocation(path, { loc, i, highI });\r\n\r\n      if (i > highI) break;\r\n\r\n      const prevPt: IPoint64 = path[i - 1];\r\n      let crossingLoc: Location = loc;\r\n\r\n      let result = RectClipLines64.getIntersection(this.rectPath, path[i], prevPt, crossingLoc)\r\n      const ip: IPoint64 = result.ip\r\n      crossingLoc = result.loc\r\n\r\n      if (!result.success) {\r\n        i++;\r\n        continue;\r\n      }\r\n\r\n      if (loc == Location.inside) {\r\n        this.add(ip, true);\r\n      } else if (prev !== Location.inside) {\r\n        crossingLoc = prev;\r\n\r\n        result = RectClipLines64.getIntersection(this.rectPath, prevPt, path[i], crossingLoc);\r\n        const ip2: IPoint64 = result.ip\r\n        crossingLoc = result.loc\r\n\r\n        this.add(ip2);\r\n        this.add(ip);\r\n      } else {\r\n        this.add(ip);\r\n      }\r\n    }\r\n  }\r\n}\r\n","/*******************************************************************************\r\n* Author    :  Angus Johnson                                                   *\r\n* Date      :  16 July 2023                                                    *\r\n* Website   :  http://www.angusj.com                                           *\r\n* Copyright :  Angus Johnson 2010-2023                                         *\r\n* Purpose   :  This module contains simple functions that will likely cover    *\r\n*              most polygon boolean and offsetting needs, while also avoiding  *\r\n*              the inherent complexities of the other modules.                 *\r\n* Thanks    :  Special thanks to Thong Nguyen, Guus Kuiper, Phil Stopford,     *\r\n*           :  and Daniel Gosnell for their invaluable assistance with C#.     *\r\n* License   :  http://www.boost.org/LICENSE_1_0.txt                            *\r\n*******************************************************************************/\r\n\r\n//\r\n// Converted from C# implemention https://github.com/AngusJohnson/Clipper2/blob/main/CSharp/Clipper2Lib/Clipper.cs\r\n// Removed support for USINGZ\r\n//\r\n// Converted by ChatGPT 4 August 3 version https://help.openai.com/en/articles/6825453-chatgpt-release-notes\r\n//\r\n\r\nimport { ClipType, FillRule, IPoint64, InternalClipper, MidpointRounding, Path64, PathType, Paths64, Point64, Rect64, midPointRound } from \"./core\";\r\nimport { Clipper64, PointInPolygonResult, PolyPath64, PolyPathBase, PolyTree64 } from \"./engine\";\r\nimport { Minkowski } from \"./minkowski\";\r\nimport { ClipperOffset, EndType, JoinType } from \"./offset\";\r\nimport { RectClip64, RectClipLines64 } from \"./rectclip\";\r\n\r\nexport class Clipper {\r\n\r\n  private static invalidRect64: Rect64\r\n  public static get InvalidRect64(): Rect64 {\r\n    if (!Clipper.invalidRect64) Clipper.invalidRect64 = new Rect64(false);\r\n    return this.invalidRect64;\r\n  }\r\n\r\n  public static Intersect(subject: Paths64, clip: Paths64, fillRule: FillRule): Paths64 {\r\n    return this.BooleanOp(ClipType.Intersection, subject, clip, fillRule);\r\n  }\r\n\r\n  public static Union(subject: Paths64, clip?: Paths64, fillRule = FillRule.EvenOdd): Paths64 {\r\n    return this.BooleanOp(ClipType.Union, subject, clip, fillRule);\r\n  }\r\n\r\n  public static Difference(subject: Paths64, clip: Paths64, fillRule: FillRule): Paths64 {\r\n    return this.BooleanOp(ClipType.Difference, subject, clip, fillRule);\r\n  }\r\n\r\n  public static Xor(subject: Paths64, clip: Paths64, fillRule: FillRule): Paths64 {\r\n    return this.BooleanOp(ClipType.Xor, subject, clip, fillRule);\r\n  }\r\n\r\n  public static BooleanOp(clipType: ClipType, subject?: Paths64, clip?: Paths64, fillRule = FillRule.EvenOdd): Paths64 {\r\n    const solution: Paths64 = new Paths64();\r\n    if (!subject) return solution;\r\n    const c: Clipper64 = new Clipper64();\r\n    c.addPaths(subject, PathType.Subject);\r\n    if (clip)\r\n      c.addPaths(clip, PathType.Clip);\r\n    c.execute(clipType, fillRule, solution);\r\n    return solution;\r\n  }\r\n\r\n  //public static BooleanOp(clipType: ClipType, subject: Paths64, clip: Paths64, polytree: PolyTree64, fillRule: FillRule): void {\r\n  //  if (!subject) return;\r\n  //  const c: Clipper64 = new Clipper64();\r\n  //  c.addPaths(subject, PathType.Subject);\r\n  //  if (clip)\r\n  //    c.addPaths(clip, PathType.Clip);\r\n  //  c.execute(clipType, fillRule, polytree);\r\n  //}\r\n\r\n  public static InflatePaths(paths: Paths64, delta: number, joinType: JoinType, endType: EndType, miterLimit: number = 2.0): Paths64 {\r\n    const co: ClipperOffset = new ClipperOffset(miterLimit);\r\n    co.addPaths(paths, joinType, endType);\r\n    const solution: Paths64 = new Paths64();\r\n    co.execute(delta, solution);\r\n    return solution;\r\n  }\r\n\r\n  public static RectClipPaths(rect: Rect64, paths: Paths64): Paths64 {\r\n    if (rect.isEmpty() || paths.length === 0) return new Paths64();\r\n    const rc = new RectClip64(rect);\r\n    return rc.execute(paths);\r\n  }\r\n\r\n  public static RectClip(rect: Rect64, path: Path64): Paths64 {\r\n    if (rect.isEmpty() || path.length === 0) return new Paths64();\r\n    const tmp: Paths64 = new Paths64();\r\n    tmp.push(path);\r\n    return this.RectClipPaths(rect, tmp);\r\n  }\r\n\r\n  public static RectClipLinesPaths(rect: Rect64, paths: Paths64): Paths64 {\r\n    if (rect.isEmpty() || paths.length === 0) return new Paths64();\r\n    const rc = new RectClipLines64(rect);\r\n    return rc.execute(paths);\r\n  }\r\n\r\n  public static RectClipLines(rect: Rect64, path: Path64): Paths64 {\r\n    if (rect.isEmpty() || path.length === 0) return new Paths64();\r\n    const tmp: Paths64 = new Paths64();\r\n    tmp.push(path);\r\n    return this.RectClipLinesPaths(rect, tmp);\r\n  }\r\n\r\n  public static MinkowskiSum(pattern: Path64, path: Path64, isClosed: boolean): Paths64 {\r\n    return Minkowski.sum(pattern, path, isClosed);\r\n  }\r\n\r\n  public static MinkowskiDiff(pattern: Path64, path: Path64, isClosed: boolean): Paths64 {\r\n    return Minkowski.diff(pattern, path, isClosed);\r\n  }\r\n\r\n  public static area(path: Path64): number {\r\n    // https://en.wikipedia.org/wiki/Shoelace_formula\r\n    let a = 0.0;\r\n    const cnt = path.length;\r\n    if (cnt < 3) return 0.0;\r\n    let prevPt = path[cnt - 1];\r\n    for (const pt of path) {\r\n      a += (prevPt.y + pt.y) * (prevPt.x - pt.x);\r\n      prevPt = pt;\r\n    }\r\n    return a * 0.5;\r\n  }\r\n\r\n  public static areaPaths(paths: Paths64): number {\r\n    let a = 0.0;\r\n    for (const path of paths)\r\n      a += this.area(path);\r\n    return a;\r\n  }\r\n\r\n  public static isPositive(poly: Path64): boolean {\r\n    return this.area(poly) >= 0;\r\n  }\r\n\r\n  public static path64ToString(path: Path64): string {\r\n    let result = \"\";\r\n    for (const pt of path)\r\n      result += pt.toString();\r\n    return result + '\\n';\r\n  }\r\n\r\n  public static paths64ToString(paths: Paths64): string {\r\n    let result = \"\";\r\n    for (const path of paths)\r\n      result += this.path64ToString(path);\r\n    return result;\r\n  }\r\n\r\n  public static offsetPath(path: Path64, dx: number, dy: number): Path64 {\r\n    const result = new Path64();\r\n    for (const pt of path)\r\n      result.push(new Point64(pt.x + dx, pt.y + dy));\r\n    return result;\r\n  }\r\n\r\n  public static scalePoint64(pt: Point64, scale: number): Point64 {\r\n    const result = new Point64(\r\n      midPointRound(pt.x * scale, MidpointRounding.AwayFromZero),\r\n      midPointRound(pt.y * scale, MidpointRounding.AwayFromZero)\r\n    )\r\n    return result;\r\n  }\r\n\r\n  public static scalePath(path: Path64, scale: number): Path64 {\r\n    if (InternalClipper.isAlmostZero(scale - 1)) return path;\r\n    const result: Path64 = [];\r\n    for (const pt of path)\r\n      result.push({ x: pt.x * scale, y: pt.y * scale });\r\n    return result;\r\n  }\r\n\r\n  public static scalePaths(paths: Paths64, scale: number): Paths64 {\r\n    if (InternalClipper.isAlmostZero(scale - 1)) return paths;\r\n    const result: Paths64 = [];\r\n    for (const path of paths)\r\n      result.push(this.scalePath(path, scale));\r\n    return result;\r\n  }\r\n\r\n  public static translatePath(path: Path64, dx: number, dy: number): Path64 {\r\n    const result: Path64 = [];\r\n    for (const pt of path) {\r\n      result.push({ x: pt.x + dx, y: pt.y + dy });\r\n    }\r\n    return result;\r\n  }\r\n\r\n  public static translatePaths(paths: Paths64, dx: number, dy: number): Paths64 {\r\n    const result: Paths64 = [];\r\n    for (const path of paths) {\r\n      result.push(this.translatePath(path, dx, dy));\r\n    }\r\n    return result;\r\n  }\r\n\r\n  public static reversePath(path: Path64): Path64 {\r\n    return [...path].reverse();\r\n  }\r\n\r\n  public static reversePaths(paths: Paths64): Paths64 {\r\n    const result: Paths64 = [];\r\n    for (const t of paths) {\r\n      result.push(this.reversePath(t));\r\n    }\r\n    return result;\r\n  }\r\n\r\n  public static getBounds(path: Path64): Rect64 {\r\n    const result: Rect64 = Clipper.InvalidRect64;\r\n    for (const pt of path) {\r\n      if (pt.x < result.left) result.left = pt.x;\r\n      if (pt.x > result.right) result.right = pt.x;\r\n      if (pt.y < result.top) result.top = pt.y;\r\n      if (pt.y > result.bottom) result.bottom = pt.y;\r\n    }\r\n    return result.left === Number.MAX_SAFE_INTEGER ? new Rect64(0, 0, 0, 0) : result;\r\n  }\r\n\r\n  public static getBoundsPaths(paths: Paths64): Rect64 {\r\n    const result: Rect64 = Clipper.InvalidRect64;\r\n    for (const path of paths) {\r\n      for (const pt of path) {\r\n        if (pt.x < result.left) result.left = pt.x;\r\n        if (pt.x > result.right) result.right = pt.x;\r\n        if (pt.y < result.top) result.top = pt.y;\r\n        if (pt.y > result.bottom) result.bottom = pt.y;\r\n      }\r\n    }\r\n    return result.left === Number.MAX_SAFE_INTEGER ? new Rect64(0, 0, 0, 0) : result;\r\n  }\r\n\r\n  static makePath(arr: number[]): Path64 {\r\n    const len = arr.length / 2;\r\n    const p = new Path64();\r\n    for (let i = 0; i < len; i++)\r\n      p.push(new Point64(arr[i * 2], arr[i * 2 + 1]));\r\n    return p;\r\n  }\r\n\r\n  static stripDuplicates(path: Path64, isClosedPath: boolean): Path64 {\r\n    const cnt = path.length;\r\n    const result = new Path64();\r\n    if (cnt === 0) return result;\r\n    let lastPt = path[0];\r\n    result.push(lastPt);\r\n    for (let i = 1; i < cnt; i++)\r\n      if (lastPt !== path[i]) {\r\n        lastPt = path[i];\r\n        result.push(lastPt);\r\n      }\r\n    if (isClosedPath && lastPt === result[0])\r\n      result.pop();\r\n    return result;\r\n  }\r\n\r\n  private static addPolyNodeToPaths(polyPath: PolyPathBase, paths: Paths64): void {\r\n    if (polyPath.polygon && polyPath.polygon.length > 0)\r\n      paths.push(polyPath.polygon);\r\n    for (let i = 0; i < polyPath.count; i++)\r\n      this.addPolyNodeToPaths(polyPath.children[i], paths);\r\n  }\r\n\r\n  public static polyTreeToPaths64(polyTree: PolyTree64): Paths64 {\r\n    const result: Paths64 = new Paths64();\r\n    for (let i = 0; i < polyTree.count; i++) {\r\n      Clipper.addPolyNodeToPaths(polyTree.children[i] as PolyPath64, result);\r\n    }\r\n    return result;\r\n  }\r\n\r\n  public static perpendicDistFromLineSqrd(pt: IPoint64, line1: IPoint64, line2: IPoint64): number {\r\n    const a = pt.x - line1.x;\r\n    const b = pt.y - line1.y;\r\n    const c = line2.x - line1.x;\r\n    const d = line2.y - line1.y;\r\n    if (c === 0 && d === 0) return 0;\r\n    return Clipper.sqr(a * d - c * b) / (c * c + d * d);\r\n  }\r\n\r\n  static rdp(path: Path64, begin: number, end: number, epsSqrd: number, flags: boolean[]): void {\r\n    let idx = 0;\r\n    let max_d = 0;\r\n\r\n    while (end > begin && path[begin] === path[end]) {\r\n      flags[end--] = false;\r\n    }\r\n    for (let i = begin + 1; i < end; i++) {\r\n      const d = Clipper.perpendicDistFromLineSqrd(path[i], path[begin], path[end]);\r\n      if (d <= max_d) continue;\r\n      max_d = d;\r\n      idx = i;\r\n    }\r\n\r\n    if (max_d <= epsSqrd) return;\r\n\r\n    flags[idx] = true;\r\n    if (idx > begin + 1) Clipper.rdp(path, begin, idx, epsSqrd, flags);\r\n    if (idx < end - 1) Clipper.rdp(path, idx, end, epsSqrd, flags);\r\n  }\r\n\r\n  public static ramerDouglasPeucker(path: Path64, epsilon: number): Path64 {\r\n    const len = path.length;\r\n    if (len < 5) return path;\r\n\r\n    const flags = new Array<boolean>(len).fill(false);\r\n    flags[0] = true;\r\n    flags[len - 1] = true;\r\n    Clipper.rdp(path, 0, len - 1, Clipper.sqr(epsilon), flags);\r\n\r\n    const result: Path64 = [];\r\n    for (let i = 0; i < len; i++) {\r\n      if (flags[i]) result.push(path[i]);\r\n    }\r\n    return result;\r\n  }\r\n\r\n  public static ramerDouglasPeuckerPaths(paths: Paths64, epsilon: number): Paths64 {\r\n    const result: Paths64 = [];\r\n    for (const path of paths) {\r\n      result.push(Clipper.ramerDouglasPeucker(path, epsilon));\r\n    }\r\n    return result;\r\n  }\r\n\r\n  private static getNext(current: number, high: number, flags: boolean[]): number {\r\n    current++;\r\n    while (current <= high && flags[current]) current++;\r\n    if (current <= high) return current;\r\n    current = 0;\r\n    while (flags[current]) current++;\r\n    return current;\r\n  }\r\n\r\n  private static getPrior(current: number, high: number, flags: boolean[]): number {\r\n    if (current === 0) current = high;\r\n    else current--;\r\n    while (current > 0 && flags[current]) current--;\r\n    if (!flags[current]) return current;\r\n    current = high;\r\n    while (flags[current]) current--;\r\n    return current;\r\n  }\r\n\r\n  private static sqr(value: number): number {\r\n    return value * value;\r\n  }\r\n\r\n  public static simplifyPath(path: Path64, epsilon: number, isClosedPath: boolean = false): Path64 {\r\n    const len = path.length;\r\n    const high = len - 1;\r\n    const epsSqr = this.sqr(epsilon);\r\n    if (len < 4) return path;\r\n\r\n    const flags: boolean[] = new Array<boolean>(len).fill(false);\r\n    const dsq: number[] = new Array<number>(len).fill(0);\r\n    let prev = high;\r\n    let curr = 0;\r\n    let start: number, next: number, prior2: number, next2: number;\r\n\r\n    if (isClosedPath) {\r\n      dsq[0] = this.perpendicDistFromLineSqrd(path[0], path[high], path[1]);\r\n      dsq[high] = this.perpendicDistFromLineSqrd(path[high], path[0], path[high - 1]);\r\n    } else {\r\n      dsq[0] = Number.MAX_VALUE;\r\n      dsq[high] = Number.MAX_VALUE;\r\n    }\r\n\r\n    for (let i = 1; i < high; i++) {\r\n      dsq[i] = this.perpendicDistFromLineSqrd(path[i], path[i - 1], path[i + 1]);\r\n    }\r\n\r\n    for (; ;) {\r\n      if (dsq[curr] > epsSqr) {\r\n        start = curr;\r\n        do {\r\n          curr = this.getNext(curr, high, flags);\r\n        } while (curr !== start && dsq[curr] > epsSqr);\r\n        if (curr === start) break;\r\n      }\r\n\r\n      prev = this.getPrior(curr, high, flags);\r\n      next = this.getNext(curr, high, flags);\r\n      if (next === prev) break;\r\n\r\n      if (dsq[next] < dsq[curr]) {\r\n        flags[next] = true;\r\n        next = this.getNext(next, high, flags);\r\n        next2 = this.getNext(next, high, flags);\r\n        dsq[curr] = this.perpendicDistFromLineSqrd(path[curr], path[prev], path[next]);\r\n        if (next !== high || isClosedPath) {\r\n          dsq[next] = this.perpendicDistFromLineSqrd(path[next], path[curr], path[next2]);\r\n        }\r\n        curr = next;\r\n      } else {\r\n        flags[curr] = true;\r\n        curr = next;\r\n        next = this.getNext(next, high, flags);\r\n        prior2 = this.getPrior(prev, high, flags);\r\n        dsq[curr] = this.perpendicDistFromLineSqrd(path[curr], path[prev], path[next]);\r\n        if (prev !== 0 || isClosedPath) {\r\n          dsq[prev] = this.perpendicDistFromLineSqrd(path[prev], path[prior2], path[curr]);\r\n        }\r\n      }\r\n    }\r\n\r\n    const result: Path64 = [];\r\n    for (let i = 0; i < len; i++) {\r\n      if (!flags[i]) result.push(path[i]);\r\n    }\r\n    return result;\r\n  }\r\n\r\n  public static simplifyPaths(paths: Paths64, epsilon: number, isClosedPaths: boolean = false): Paths64 {\r\n    const result: Paths64 = [];\r\n    for (const path of paths) {\r\n      result.push(this.simplifyPath(path, epsilon, isClosedPaths));\r\n    }\r\n    return result;\r\n  }\r\n\r\n  //private static getNext(current: number, high: number, flags: boolean[]): number {\r\n  //  current++;\r\n  //  while (current <= high && flags[current]) current++;\r\n  //  return current;\r\n  //}\r\n\r\n  //private static getPrior(current: number, high: number, flags: boolean[]): number {\r\n  //  if (current === 0) return high;\r\n  //  current--;\r\n  //  while (current > 0 && flags[current]) current--;\r\n  //  return current;\r\n  //}\r\n\r\n\r\n  public static trimCollinear(path: Path64, isOpen: boolean = false): Path64 {\r\n    let len = path.length;\r\n    let i = 0;\r\n\r\n    if (!isOpen) {\r\n      while (i < len - 1 && InternalClipper.crossProduct(path[len - 1], path[i], path[i + 1]) === 0) i++;\r\n      while (i < len - 1 && InternalClipper.crossProduct(path[len - 2], path[len - 1], path[i]) === 0) len--;\r\n    }\r\n\r\n    if (len - i < 3) {\r\n      if (!isOpen || len < 2 || path[0] === path[1]) {\r\n        return [];\r\n      }\r\n      return path;\r\n    }\r\n\r\n    const result: Path64 = [];\r\n    let last = path[i];\r\n    result.push(last);\r\n\r\n    for (i++; i < len - 1; i++) {\r\n      if (InternalClipper.crossProduct(last, path[i], path[i + 1]) === 0) continue;\r\n      last = path[i];\r\n      result.push(last);\r\n    }\r\n\r\n    if (isOpen) {\r\n      result.push(path[len - 1]);\r\n    } else if (InternalClipper.crossProduct(last, path[len - 1], result[0]) !== 0) {\r\n      result.push(path[len - 1]);\r\n    } else {\r\n      while (result.length > 2 && InternalClipper.crossProduct(result[result.length - 1], result[result.length - 2], result[0]) === 0) {\r\n        result.pop();\r\n      }\r\n      if (result.length < 3) result.splice(0, result.length);\r\n    }\r\n\r\n    return result;\r\n  }\r\n\r\n  public static pointInPolygon(pt: Point64, polygon: Path64): PointInPolygonResult {\r\n    return InternalClipper.pointInPolygon(pt, polygon);\r\n  }\r\n\r\n  public static ellipse(center: IPoint64, radiusX: number, radiusY: number = 0, steps: number = 0): Path64 {\r\n    if (radiusX <= 0) return [];\r\n    if (radiusY <= 0) radiusY = radiusX;\r\n    if (steps <= 2) steps = Math.ceil(Math.PI * Math.sqrt((radiusX + radiusY) / 2));\r\n\r\n    const si = Math.sin(2 * Math.PI / steps);\r\n    const co = Math.cos(2 * Math.PI / steps);\r\n    let dx = co, dy = si;\r\n    const result: Path64 = [{ x: center.x + radiusX, y: center.y }];\r\n    for (let i = 1; i < steps; ++i) {\r\n      result.push({ x: center.x + radiusX * dx, y: center.y + radiusY * dy });\r\n      const x = dx * co - dy * si;\r\n      dy = dy * co + dx * si;\r\n      dx = x;\r\n    }\r\n    return result;\r\n  }\r\n\r\n  private static showPolyPathStructure(pp: PolyPathBase, level: number): void {\r\n    const spaces = ' '.repeat(level * 2);\r\n    const caption = pp.isHole ? \"Hole \" : \"Outer \";\r\n    if (pp.count === 0) {\r\n      console.log(spaces + caption);\r\n    } else {\r\n      console.log(spaces + caption + `(${pp.count})`);\r\n      pp.forEach(child => this.showPolyPathStructure(child, level + 1));\r\n    }\r\n  }\r\n\r\n  public static showPolyTreeStructure(polytree: PolyTree64): void {\r\n    console.log(\"Polytree Root\");\r\n    polytree.forEach(child => this.showPolyPathStructure(child, 1));\r\n  }\r\n\r\n}\r\n","/*******************************************************************************\r\n* Author    :  Angus Johnson                                                   *\r\n* Date      :  3 September 2023                                                  *\r\n* Website   :  http://www.angusj.com                                           *\r\n* Copyright :  Angus Johnson 2010-2023                                         *\r\n* Purpose   :  This is the main polygon clipping module                        *\r\n* Thanks    :  Special thanks to Thong Nguyen, Guus Kuiper, Phil Stopford,     *\r\n*           :  and Daniel Gosnell for their invaluable assistance with C#.     *\r\n* License   :  http://www.boost.org/LICENSE_1_0.txt                            *\r\n*******************************************************************************/\r\n\r\nimport { Clipper } from \"./clipper\";\r\nimport { ClipType, FillRule, IPoint64, InternalClipper, MidpointRounding, Path64, PathType, Paths64, Point64, Rect64, midPointRound } from \"./core\";\r\n\r\n//\r\n// Converted from C# implemention https://github.com/AngusJohnson/Clipper2/blob/main/CSharp/Clipper2Lib/Clipper.Engine.cs\r\n// Removed support for USINGZ\r\n//\r\n// Converted by ChatGPT 4 August 3 version https://help.openai.com/en/articles/6825453-chatgpt-release-notes\r\n//\r\n\r\nexport enum PointInPolygonResult {\r\n  IsOn = 0,\r\n  IsInside = 1,\r\n  IsOutside = 2\r\n}\r\n\r\nexport enum VertexFlags {\r\n  None = 0,\r\n  OpenStart = 1,\r\n  OpenEnd = 2,\r\n  LocalMax = 4,\r\n  LocalMin = 8\r\n}\r\n\r\nclass Vertex {\r\n  readonly pt: IPoint64;\r\n  next: Vertex | undefined;\r\n  prev: Vertex | undefined;\r\n  flags: VertexFlags;\r\n\r\n  constructor(pt: IPoint64, flags: VertexFlags, prev: Vertex | undefined) {\r\n    this.pt = pt;\r\n    this.flags = flags;\r\n    this.next = undefined;\r\n    this.prev = prev;\r\n  }\r\n}\r\n\r\n\r\nclass LocalMinima {\r\n  readonly vertex: Vertex;\r\n  readonly polytype: PathType;\r\n  readonly isOpen: boolean;\r\n\r\n  constructor(vertex: Vertex, polytype: PathType, isOpen: boolean = false) {\r\n    this.vertex = vertex;\r\n    this.polytype = polytype;\r\n    this.isOpen = isOpen;\r\n  }\r\n\r\n  static equals(lm1: LocalMinima, lm2: LocalMinima): boolean {\r\n    return lm1.vertex === lm2.vertex;\r\n  }\r\n\r\n  static notEquals(lm1: LocalMinima, lm2: LocalMinima): boolean {\r\n    return lm1.vertex !== lm2.vertex;\r\n  }\r\n\r\n  //hashCode(): number {\r\n  //  return this.vertex.hashCode();\r\n  //}\r\n}\r\n\r\nclass IntersectNode {\r\n  readonly pt: IPoint64;\r\n  readonly edge1: Active;\r\n  readonly edge2: Active;\r\n\r\n  constructor(pt: IPoint64, edge1: Active, edge2: Active) {\r\n    this.pt = pt;\r\n    this.edge1 = edge1;\r\n    this.edge2 = edge2;\r\n  }\r\n}\r\n\r\nclass OutPt {\r\n  pt: IPoint64;\r\n  next: OutPt | undefined;\r\n  prev: OutPt;\r\n  outrec: OutRec;\r\n  horz: HorzSegment | undefined;\r\n\r\n  constructor(pt: IPoint64, outrec: OutRec) {\r\n    this.pt = pt;\r\n    this.outrec = outrec;\r\n    this.next = this;\r\n    this.prev = this;\r\n    this.horz = undefined;\r\n  }\r\n}\r\n\r\nexport enum JoinWith {\r\n  None,\r\n  Left,\r\n  Right\r\n}\r\n\r\nexport enum HorzPosition {\r\n  Bottom,\r\n  Middle,\r\n  Top\r\n}\r\n\r\n\r\nexport class OutRec {\r\n  idx: number;\r\n  owner: OutRec | undefined;\r\n  frontEdge: Active | undefined;\r\n  backEdge: Active | undefined;\r\n  pts: OutPt | undefined;\r\n  polypath: PolyPathBase | undefined;\r\n  bounds!: Rect64;\r\n  path!: Path64;\r\n  isOpen: boolean;\r\n  splits: number[] | undefined;\r\n  recursiveSplit: OutRec | undefined;\r\n  constructor(idx: number) {\r\n    this.idx = idx\r\n    this.isOpen = false\r\n  }\r\n}\r\n\r\nclass HorzSegment {\r\n  leftOp: OutPt //| undefined;\r\n  rightOp: OutPt | undefined;\r\n  leftToRight: boolean;\r\n\r\n  constructor(op: OutPt) {\r\n    this.leftOp = op;\r\n    this.rightOp = undefined;\r\n    this.leftToRight = true;\r\n  }\r\n}\r\n\r\nclass HorzJoin {\r\n  op1: OutPt | undefined;\r\n  op2: OutPt | undefined;\r\n\r\n  constructor(ltor: OutPt, rtol: OutPt) {\r\n    this.op1 = ltor;\r\n    this.op2 = rtol;\r\n  }\r\n}\r\n\r\n///////////////////////////////////////////////////////////////////\r\n// Important: UP and DOWN here are premised on Y-axis positive down\r\n// displays, which is the orientation used in Clipper's development.\r\n///////////////////////////////////////////////////////////////////\r\n\r\nexport class Active {\r\n  bot!: IPoint64\r\n  top!: IPoint64\r\n  curX!: number;// current (updated at every new scanline)\r\n  dx: number;\r\n  windDx!: number;// 1 or -1 depending on winding direction\r\n  windCount: number;\r\n  windCount2: number;// winding count of the opposite polytype\r\n  outrec: OutRec | undefined;\r\n\r\n  // AEL: 'active edge list' (Vatti's AET - active edge table)\r\n  //     a linked list of all edges (from left to right) that are present\r\n  //     (or 'active') within the current scanbeam (a horizontal 'beam' that\r\n  //     sweeps from bottom to top over the paths in the clipping operation).\r\n  prevInAEL: Active | undefined;\r\n  nextInAEL: Active | undefined;\r\n\r\n  // SEL: 'sorted edge list' (Vatti's ST - sorted table)\r\n  //     linked list used when sorting edges into their new positions at the\r\n  //     top of scanbeams, but also (re)used to process horizontals.\r\n  prevInSEL: Active | undefined;\r\n  nextInSEL: Active | undefined;\r\n  jump: Active | undefined;\r\n  vertexTop: Vertex | undefined\r\n  localMin!: LocalMinima // the bottom of an edge 'bound' (also Vatti)\r\n  isLeftBound: boolean\r\n  joinWith: JoinWith\r\n\r\n  constructor() {\r\n    this.dx = this.windCount = this.windCount2 = 0\r\n    this.isLeftBound = false\r\n    this.joinWith = JoinWith.None\r\n  }\r\n}\r\n\r\nexport class ClipperEngine {\r\n  static addLocMin(vert: Vertex, polytype: PathType, isOpen: boolean, minimaList: LocalMinima[]): void {\r\n    // make sure the vertex is added only once ...\r\n    if ((vert.flags & VertexFlags.LocalMin) !== VertexFlags.None) return;\r\n    vert.flags |= VertexFlags.LocalMin;\r\n\r\n    const lm = new LocalMinima(vert, polytype, isOpen);\r\n    minimaList.push(lm);\r\n  }\r\n\r\n  static addPathsToVertexList(paths: Path64[], polytype: PathType, isOpen: boolean, minimaList: LocalMinima[], vertexList: Vertex[]): void {\r\n    let totalVertCnt = 0;\r\n    for (const path of paths)\r\n      totalVertCnt += path.length;\r\n\r\n    for (const path of paths) {\r\n      let v0: Vertex | undefined = undefined;\r\n      let prev_v: Vertex | undefined = undefined;\r\n      let curr_v: Vertex | undefined = undefined;\r\n      for (const pt of path) {\r\n        if (!v0) {\r\n          v0 = new Vertex(pt, VertexFlags.None, undefined);\r\n          vertexList.push(v0);\r\n          prev_v = v0;\r\n        } else if (prev_v!.pt !== pt) {  // i.e., skips duplicates\r\n          curr_v = new Vertex(pt, VertexFlags.None, prev_v);\r\n          vertexList.push(curr_v);\r\n          prev_v!.next = curr_v;\r\n          prev_v = curr_v;\r\n        }\r\n      }\r\n      if (!prev_v || !prev_v.prev) continue;\r\n      if (!isOpen && prev_v.pt === v0!.pt) prev_v = prev_v.prev;\r\n      prev_v.next = v0;\r\n      v0!.prev = prev_v;\r\n      if (!isOpen && prev_v.next === prev_v) continue;\r\n\r\n      // OK, we have a valid path\r\n      let going_up = false\r\n\r\n      if (isOpen) {\r\n        curr_v = v0!.next;\r\n        let count = 0\r\n        while (curr_v !== v0 && curr_v!.pt.y === v0!.pt.y) {\r\n          curr_v = curr_v!.next;\r\n          if (count++ > totalVertCnt) {\r\n            console.warn('infinite loop detected')\r\n            break;\r\n          }\r\n        }\r\n        going_up = curr_v!.pt.y <= v0!.pt.y;\r\n        if (going_up) {\r\n          v0!.flags = VertexFlags.OpenStart;\r\n          this.addLocMin(v0!, polytype, true, minimaList);\r\n        } else {\r\n          v0!.flags = VertexFlags.OpenStart | VertexFlags.LocalMax;\r\n        }\r\n      } else { // closed path\r\n        prev_v = v0!.prev;\r\n        let count = 0\r\n        while (prev_v !== v0 && prev_v!.pt.y === v0!.pt.y) {\r\n          prev_v = prev_v!.prev;\r\n\r\n          if (count++ > totalVertCnt) {\r\n            console.warn('infinite loop detected')\r\n            break;\r\n          }\r\n        }\r\n        if (prev_v === v0) {\r\n          continue; // only open paths can be completely flat\r\n        }\r\n        going_up = prev_v!.pt.y > v0!.pt.y;\r\n      }\r\n\r\n      const going_up0 = going_up;\r\n      prev_v = v0;\r\n      curr_v = v0!.next;\r\n\r\n      let count = 0\r\n      while (curr_v !== v0) {\r\n        if (curr_v!.pt.y > prev_v!.pt.y && going_up) {\r\n          prev_v!.flags |= VertexFlags.LocalMax;\r\n          going_up = false;\r\n        } else if (curr_v!.pt.y < prev_v!.pt.y && !going_up) {\r\n          going_up = true;\r\n          this.addLocMin(prev_v!, polytype, isOpen, minimaList);\r\n        }\r\n        prev_v = curr_v;\r\n        curr_v = curr_v!.next;\r\n\r\n        if (count++ > totalVertCnt) {\r\n          console.warn('infinite loop detected')\r\n          break;\r\n        }\r\n\r\n      }\r\n\r\n      if (isOpen) {\r\n        prev_v!.flags |= VertexFlags.OpenEnd;\r\n        if (going_up) {\r\n          prev_v!.flags |= VertexFlags.LocalMax;\r\n        } else {\r\n          this.addLocMin(prev_v!, polytype, isOpen, minimaList);\r\n        }\r\n      } else if (going_up !== going_up0) {\r\n        if (going_up0) {\r\n          this.addLocMin(prev_v!, polytype, false, minimaList);\r\n        } else {\r\n          prev_v!.flags |= VertexFlags.LocalMax;\r\n        }\r\n      }\r\n    }\r\n  }\r\n}\r\n\r\nexport class ReuseableDataContainer64 {\r\n  readonly _minimaList: LocalMinima[];\r\n  private readonly _vertexList: Vertex[];\r\n\r\n  constructor() {\r\n    this._minimaList = [];\r\n    this._vertexList = [];\r\n  }\r\n\r\n  public clear(): void {\r\n    this._minimaList.length = 0;\r\n    this._vertexList.length = 0;\r\n  }\r\n\r\n  public addPaths(paths: Paths64, pt: PathType, isOpen: boolean): void {\r\n    ClipperEngine.addPathsToVertexList(paths, pt, isOpen, this._minimaList, this._vertexList);\r\n  }\r\n}\r\n\r\nclass SimpleNavigableSet {\r\n  items: Array<number> = []\r\n\r\n  constructor() {\r\n    this.items = [];\r\n  }\r\n\r\n  clear(): void { this.items.length = 0 }\r\n  isEmpty(): boolean { return this.items.length == 0 }\r\n\r\n  pollLast(): number | undefined {\r\n    return this.items.pop();\r\n  }\r\n\r\n  add(item: number) {\r\n    if (!this.items.includes(item)) {\r\n      this.items.push(item);\r\n      this.items.sort((a, b) => a - b);\r\n    }\r\n  }\r\n}\r\n\r\nexport class ClipperBase {\r\n  private _cliptype: ClipType = ClipType.None\r\n  private _fillrule: FillRule = FillRule.EvenOdd\r\n  private _actives?: Active;\r\n  private _sel?: Active;\r\n  private readonly _minimaList: LocalMinima[];\r\n  private readonly _intersectList: IntersectNode[];\r\n  private readonly _vertexList: Vertex[];\r\n  private readonly _outrecList: OutRec[];\r\n  private readonly _scanlineList: SimpleNavigableSet;\r\n  private readonly _horzSegList: HorzSegment[];\r\n  private readonly _horzJoinList: HorzJoin[];\r\n  private _currentLocMin: number = 0\r\n  private _currentBotY: number = 0\r\n  private _isSortedMinimaList: boolean = false\r\n  private _hasOpenPaths: boolean = false\r\n  protected _using_polytree: boolean = false\r\n  protected _succeeded: boolean = false\r\n  public preserveCollinear: boolean;\r\n  public reverseSolution: boolean = false\r\n\r\n  constructor() {\r\n    this._minimaList = [];\r\n    this._intersectList = [];\r\n    this._vertexList = [];\r\n    this._outrecList = [];\r\n    this._scanlineList = new SimpleNavigableSet()\r\n    this._horzSegList = [];\r\n    this._horzJoinList = [];\r\n    this.preserveCollinear = true;\r\n  }\r\n\r\n  private static isOdd(val: number): boolean {\r\n    return ((val & 1) !== 0);\r\n  }\r\n\r\n  private static isHotEdgeActive(ae: Active): boolean {\r\n    return ae.outrec !== undefined;\r\n  }\r\n\r\n  private static isOpen(ae: Active): boolean {\r\n    return ae.localMin.isOpen;\r\n  }\r\n\r\n  private static isOpenEndActive(ae: Active): boolean {\r\n    return ae.localMin.isOpen && ClipperBase.isOpenEnd(ae.vertexTop!);\r\n  }\r\n\r\n  private static isOpenEnd(v: Vertex): boolean {\r\n    return (v.flags & (VertexFlags.OpenStart | VertexFlags.OpenEnd)) !== VertexFlags.None;\r\n  }\r\n\r\n  private static getPrevHotEdge(ae: Active): Active | undefined {\r\n    let prev: Active | undefined = ae.prevInAEL;\r\n    while (prev && (ClipperBase.isOpen(prev) || !ClipperBase.isHotEdgeActive(prev)))\r\n      prev = prev.prevInAEL;\r\n    return prev;\r\n  }\r\n\r\n  private static isFront(ae: Active): boolean {\r\n    return ae === ae.outrec!.frontEdge;\r\n  }\r\n\r\n  /*******************************************************************************\r\n  *  Dx:                             0(90deg)                                    *\r\n  *                                  |                                           *\r\n  *               +inf (180deg) <--- o --. -inf (0deg)                          *\r\n  *******************************************************************************/\r\n\r\n  private static getDx(pt1: IPoint64, pt2: IPoint64): number {\r\n    const dy: number = pt2.y - pt1.y;\r\n    if (dy !== 0)\r\n      return (pt2.x - pt1.x) / dy;\r\n    if (pt2.x > pt1.x)\r\n      return Number.NEGATIVE_INFINITY;\r\n    return Number.POSITIVE_INFINITY;\r\n  }\r\n\r\n  private static topX(ae: Active, currentY: number): number {\r\n    if ((currentY === ae.top.y) || (ae.top.x === ae.bot.x)) return ae.top.x;\r\n    if (currentY === ae.bot.y) return ae.bot.x;\r\n    return ae.bot.x + midPointRound(ae.dx * (currentY - ae.bot.y), MidpointRounding.ToEven);\r\n  }\r\n\r\n  private static isHorizontal(ae: Active): boolean {\r\n    return (ae.top.y === ae.bot.y);\r\n  }\r\n\r\n  private static isHeadingRightHorz(ae: Active): boolean {\r\n    return (Number.NEGATIVE_INFINITY === ae.dx);\r\n  }\r\n\r\n  private static isHeadingLeftHorz(ae: Active): boolean {\r\n    return (Number.POSITIVE_INFINITY === ae.dx);\r\n  }\r\n\r\n  private static swapActives(ae1: Active, ae2: Active): void {\r\n    [ae2, ae1] = [ae1, ae2];\r\n  }\r\n\r\n  private static getPolyType(ae: Active): PathType {\r\n    return ae.localMin.polytype;\r\n  }\r\n\r\n  private static isSamePolyType(ae1: Active, ae2: Active): boolean {\r\n    return ae1.localMin.polytype === ae2.localMin.polytype;\r\n  }\r\n\r\n  private static setDx(ae: Active): void {\r\n    ae.dx = ClipperBase.getDx(ae.bot, ae.top);\r\n  }\r\n\r\n  private static nextVertex(ae: Active): Vertex {\r\n    if (ae.windDx > 0)\r\n      return ae.vertexTop!.next!;\r\n    return ae.vertexTop!.prev!;\r\n  }\r\n\r\n  private static prevPrevVertex(ae: Active): Vertex {\r\n    if (ae.windDx > 0)\r\n      return ae.vertexTop!.prev!.prev!;\r\n    return ae.vertexTop!.next!.next!;\r\n  }\r\n\r\n  private static isMaxima(vertex: Vertex): boolean {\r\n    return (vertex.flags & VertexFlags.LocalMax) !== VertexFlags.None;\r\n  }\r\n\r\n  private static isMaximaActive(ae: Active): boolean {\r\n    return ClipperBase.isMaxima(ae.vertexTop!);\r\n  }\r\n\r\n  private static getMaximaPair(ae: Active): Active | undefined {\r\n    let ae2: Active | undefined = ae.nextInAEL;\r\n    while (ae2) {\r\n      if (ae2.vertexTop === ae.vertexTop) return ae2; // Found!\r\n      ae2 = ae2.nextInAEL;\r\n    }\r\n    return undefined;\r\n  }\r\n\r\n  private static getCurrYMaximaVertex_Open(ae: Active): Vertex | undefined {\r\n    let result: Vertex | undefined = ae.vertexTop;\r\n    if (ae.windDx > 0) {\r\n      while (result!.next!.pt.y === result!.pt.y &&\r\n        ((result!.flags & (VertexFlags.OpenEnd |\r\n          VertexFlags.LocalMax)) === VertexFlags.None))\r\n        result = result!.next;\r\n    } else {\r\n      while (result!.prev!.pt.y === result!.pt.y &&\r\n        ((result!.flags & (VertexFlags.OpenEnd |\r\n          VertexFlags.LocalMax)) === VertexFlags.None))\r\n        result = result!.prev;\r\n    }\r\n    if (!ClipperBase.isMaxima(result!)) result = undefined; // not a maxima\r\n    return result;\r\n  }\r\n\r\n  private static getCurrYMaximaVertex(ae: Active): Vertex | undefined {\r\n    let result: Vertex | undefined = ae.vertexTop;\r\n    if (ae.windDx > 0) {\r\n      while (result!.next!.pt.y === result!.pt.y) result = result!.next;\r\n    } else {\r\n      while (result!.prev!.pt.y === result!.pt.y) result = result!.prev;\r\n    }\r\n    if (!ClipperBase.isMaxima(result!)) result = undefined; // not a maxima\r\n    return result;\r\n  }\r\n\r\n  private static setSides(outrec: OutRec, startEdge: Active, endEdge: Active): void {\r\n    outrec.frontEdge = startEdge;\r\n    outrec.backEdge = endEdge;\r\n  }\r\n\r\n  private static swapOutrecs(ae1: Active, ae2: Active): void {\r\n    const or1: OutRec | undefined = ae1.outrec;\r\n    const or2: OutRec | undefined = ae2.outrec;\r\n    if (or1 === or2) {\r\n      const ae: Active | undefined = or1!.frontEdge;\r\n      or1!.frontEdge = or1!.backEdge;\r\n      or1!.backEdge = ae;\r\n      return;\r\n    }\r\n\r\n    if (or1) {\r\n      if (ae1 === or1.frontEdge)\r\n        or1.frontEdge = ae2;\r\n      else\r\n        or1.backEdge = ae2;\r\n    }\r\n\r\n    if (or2) {\r\n      if (ae2 === or2.frontEdge)\r\n        or2.frontEdge = ae1;\r\n      else\r\n        or2.backEdge = ae1;\r\n    }\r\n\r\n    ae1.outrec = or2;\r\n    ae2.outrec = or1;\r\n  }\r\n\r\n  private static setOwner(outrec: OutRec, newOwner: OutRec): void {\r\n    while (newOwner.owner && !newOwner.owner.pts) {\r\n      newOwner.owner = newOwner.owner.owner;\r\n    }\r\n\r\n    //make sure that outrec isn't an owner of newOwner\r\n    let tmp: OutRec | undefined = newOwner;\r\n    while (tmp && tmp !== outrec)\r\n      tmp = tmp.owner;\r\n    if (tmp)\r\n      newOwner.owner = outrec.owner;\r\n    outrec.owner = newOwner;\r\n  }\r\n\r\n  private static area(op: OutPt): number {\r\n    // https://en.wikipedia.org/wiki/Shoelace_formula\r\n    let area = 0.0;\r\n    let op2 = op;\r\n    do {\r\n      area += (op2.prev.pt.y + op2.pt.y) *\r\n        (op2.prev.pt.x - op2.pt.x);\r\n      op2 = op2.next!;\r\n    } while (op2 !== op);\r\n    return area * 0.5;\r\n  }\r\n\r\n  private static areaTriangle(pt1: IPoint64, pt2: IPoint64, pt3: IPoint64): number {\r\n    return (pt3.y + pt1.y) * (pt3.x - pt1.x) +\r\n      (pt1.y + pt2.y) * (pt1.x - pt2.x) +\r\n      (pt2.y + pt3.y) * (pt2.x - pt3.x);\r\n  }\r\n\r\n  private static getRealOutRec(outRec: OutRec | undefined): OutRec | undefined {\r\n    while (outRec !== undefined && outRec.pts === undefined) {\r\n      outRec = outRec.owner;\r\n    }\r\n    return outRec;\r\n  }\r\n\r\n  private static isValidOwner(outRec: OutRec | undefined, testOwner: OutRec | undefined): boolean {\r\n    while (testOwner !== undefined && testOwner !== outRec)\r\n      testOwner = testOwner.owner;\r\n    return testOwner === undefined;\r\n  }\r\n\r\n  private static uncoupleOutRec(ae: Active): void {\r\n    const outrec = ae.outrec;\r\n    if (outrec === undefined) return;\r\n    outrec.frontEdge!.outrec = undefined;\r\n    outrec.backEdge!.outrec = undefined;\r\n    outrec.frontEdge = undefined;\r\n    outrec.backEdge = undefined;\r\n  }\r\n\r\n  private static outrecIsAscending(hotEdge: Active): boolean {\r\n    return (hotEdge === hotEdge.outrec!.frontEdge);\r\n  }\r\n\r\n  private static swapFrontBackSides(outrec: OutRec): void {\r\n    // while this proc. is needed for open paths\r\n    // it's almost never needed for closed paths\r\n    const ae2 = outrec.frontEdge!;\r\n    outrec.frontEdge = outrec.backEdge;\r\n    outrec.backEdge = ae2;\r\n    outrec.pts = outrec.pts!.next;\r\n  }\r\n\r\n  private static edgesAdjacentInAEL(inode: IntersectNode): boolean {\r\n    return (inode.edge1.nextInAEL === inode.edge2) || (inode.edge1.prevInAEL === inode.edge2);\r\n  }\r\n\r\n  protected clearSolutionOnly(): void {\r\n    while (this._actives) this.deleteFromAEL(this._actives);\r\n    this._scanlineList.clear()\r\n    this.disposeIntersectNodes();\r\n    this._outrecList.length = 0\r\n    this._horzSegList.length = 0\r\n    this._horzJoinList.length = 0\r\n  }\r\n\r\n  public clear(): void {\r\n    this.clearSolutionOnly();\r\n    this._minimaList.length = 0\r\n    this._vertexList.length = 0\r\n    this._currentLocMin = 0;\r\n    this._isSortedMinimaList = false;\r\n    this._hasOpenPaths = false;\r\n  }\r\n\r\n  protected reset(): void {\r\n    if (!this._isSortedMinimaList) {\r\n      this._minimaList.sort((locMin1, locMin2) => locMin2.vertex.pt.y - locMin1.vertex.pt.y);\r\n      this._isSortedMinimaList = true;\r\n    }\r\n\r\n    for (let i = this._minimaList.length - 1; i >= 0; i--) {\r\n      this._scanlineList.add(this._minimaList[i].vertex.pt.y);\r\n    }\r\n\r\n    this._currentBotY = 0;\r\n    this._currentLocMin = 0;\r\n    this._actives = undefined;\r\n    this._sel = undefined;\r\n    this._succeeded = true;\r\n  }\r\n\r\n  private insertScanline(y: number): void {\r\n    this._scanlineList.add(y)\r\n  }\r\n\r\n  private popScanline(): number | undefined {\r\n    return this._scanlineList.pollLast();\r\n  }\r\n\r\n  private hasLocMinAtY(y: number): boolean {\r\n    return (this._currentLocMin < this._minimaList.length && this._minimaList[this._currentLocMin].vertex.pt.y == y);\r\n  }\r\n\r\n  private popLocalMinima(): LocalMinima {\r\n    return this._minimaList[this._currentLocMin++];\r\n  }\r\n\r\n  private addLocMin(vert: Vertex, polytype: PathType, isOpen: boolean): void {\r\n    // make sure the vertex is added only once ...\r\n    if ((vert.flags & VertexFlags.LocalMin) != VertexFlags.None) return\r\n\r\n    vert.flags |= VertexFlags.LocalMin;\r\n\r\n    const lm = new LocalMinima(vert, polytype, isOpen);\r\n    this._minimaList.push(lm);\r\n  }\r\n\r\n  public addSubject(path: Path64): void {\r\n    this.addPath(path, PathType.Subject);\r\n  }\r\n\r\n  public addOpenSubject(path: Path64): void {\r\n    this.addPath(path, PathType.Subject, true);\r\n  }\r\n\r\n  public addClip(path: Path64): void {\r\n    this.addPath(path, PathType.Clip);\r\n  }\r\n\r\n  protected addPath(path: Path64, polytype: PathType, isOpen = false): void {\r\n    const tmp: Paths64 = [path];\r\n    this.addPaths(tmp, polytype, isOpen);\r\n  }\r\n\r\n  protected addPaths(paths: Paths64, polytype: PathType, isOpen = false): void {\r\n    if (isOpen) this._hasOpenPaths = true;\r\n    this._isSortedMinimaList = false;\r\n    ClipperEngine.addPathsToVertexList(paths, polytype, isOpen, this._minimaList, this._vertexList);\r\n  }\r\n\r\n  protected addReuseableData(reuseableData: ReuseableDataContainer64): void {\r\n    if (reuseableData._minimaList.length === 0) return;\r\n\r\n    this._isSortedMinimaList = false;\r\n    for (const lm of reuseableData._minimaList) {\r\n      this._minimaList.push(new LocalMinima(lm.vertex, lm.polytype, lm.isOpen));\r\n      if (lm.isOpen) this._hasOpenPaths = true;\r\n    }\r\n  }\r\n\r\n  private isContributingClosed(ae: Active): boolean {\r\n    switch (this._fillrule) {\r\n      case FillRule.Positive:\r\n        if (ae.windCount !== 1) return false;\r\n        break;\r\n      case FillRule.Negative:\r\n        if (ae.windCount !== -1) return false;\r\n        break;\r\n      case FillRule.NonZero:\r\n        if (Math.abs(ae.windCount) !== 1) return false;\r\n        break;\r\n    }\r\n\r\n    switch (this._cliptype) {\r\n      case ClipType.Intersection:\r\n        switch (this._fillrule) {\r\n          case FillRule.Positive: return ae.windCount2 > 0;\r\n          case FillRule.Negative: return ae.windCount2 < 0;\r\n          default: return ae.windCount2 !== 0;\r\n        }\r\n      case ClipType.Union:\r\n        switch (this._fillrule) {\r\n          case FillRule.Positive: return ae.windCount2 <= 0;\r\n          case FillRule.Negative: return ae.windCount2 >= 0;\r\n          default: return ae.windCount2 === 0;\r\n        }\r\n      case ClipType.Difference:\r\n        const result = this._fillrule === FillRule.Positive ? (ae.windCount2 <= 0) :\r\n          this._fillrule === FillRule.Negative ? (ae.windCount2 >= 0) :\r\n            (ae.windCount2 === 0);\r\n        return ClipperBase.getPolyType(ae) === PathType.Subject ? result : !result;\r\n\r\n      case ClipType.Xor:\r\n        return true;\r\n\r\n      default:\r\n        return false;\r\n    }\r\n  }\r\n\r\n  private isContributingOpen(ae: Active): boolean {\r\n    let isInClip: boolean, isInSubj: boolean;\r\n    switch (this._fillrule) {\r\n      case FillRule.Positive:\r\n        isInSubj = ae.windCount > 0;\r\n        isInClip = ae.windCount2 > 0;\r\n        break;\r\n      case FillRule.Negative:\r\n        isInSubj = ae.windCount < 0;\r\n        isInClip = ae.windCount2 < 0;\r\n        break;\r\n      default:\r\n        isInSubj = ae.windCount !== 0;\r\n        isInClip = ae.windCount2 !== 0;\r\n        break;\r\n    }\r\n\r\n    switch (this._cliptype) {\r\n      case ClipType.Intersection:\r\n        return isInClip;\r\n      case ClipType.Union:\r\n        return !isInSubj && !isInClip;\r\n      default:\r\n        return !isInClip;\r\n    }\r\n  }\r\n\r\n  private setWindCountForClosedPathEdge(ae: Active): void {\r\n    let ae2: Active | undefined = ae.prevInAEL;\r\n    const pt: PathType = ClipperBase.getPolyType(ae);\r\n\r\n    while (ae2 !== undefined && (ClipperBase.getPolyType(ae2) !== pt || ClipperBase.isOpen(ae2))) {\r\n      ae2 = ae2.prevInAEL;\r\n    }\r\n\r\n    if (ae2 === undefined) {\r\n      ae.windCount = ae.windDx;\r\n      ae2 = this._actives;\r\n    } else if (this._fillrule === FillRule.EvenOdd) {\r\n      ae.windCount = ae.windDx;\r\n      ae.windCount2 = ae2.windCount2;\r\n      ae2 = ae2.nextInAEL;\r\n    } else {\r\n      // NonZero, positive, or negative filling here ...\r\n      // when e2's WindCnt is in the SAME direction as its WindDx,\r\n      // then polygon will fill on the right of 'e2' (and 'e' will be inside)\r\n      // nb: neither e2.WindCnt nor e2.WindDx should ever be 0.\r\n      if (ae2.windCount * ae2.windDx < 0) {\r\n        // opposite directions so 'ae' is outside 'ae2' ...\r\n        if (Math.abs(ae2.windCount) > 1) {\r\n          // outside prev poly but still inside another.\r\n          if (ae2.windDx * ae.windDx < 0)\r\n            // reversing direction so use the same WC\r\n            ae.windCount = ae2.windCount;\r\n          else\r\n            // otherwise keep 'reducing' the WC by 1 (i.e. towards 0) ...\r\n            ae.windCount = ae2.windCount + ae.windDx;\r\n        } else {\r\n          // now outside all polys of same polytype so set own WC ...\r\n          ae.windCount = (ClipperBase.isOpen(ae) ? 1 : ae.windDx);\r\n        }\r\n      } else {\r\n        // 'ae' must be inside 'ae2'\r\n        if (ae2.windDx * ae.windDx < 0)\r\n          // reversing direction so use the same WC\r\n          ae.windCount = ae2.windCount;\r\n        else\r\n          // otherwise keep 'increasing' the WC by 1 (i.e. away from 0) ...\r\n          ae.windCount = ae2.windCount + ae.windDx;\r\n      }\r\n\r\n      ae.windCount2 = ae2.windCount2;\r\n      ae2 = ae2.nextInAEL;  // i.e. get ready to calc WindCnt2\r\n\r\n    }\r\n\r\n    if (this._fillrule === FillRule.EvenOdd) {\r\n      while (ae2 !== ae) {\r\n        if (ClipperBase.getPolyType(ae2!) !== pt && !ClipperBase.isOpen(ae2!)) {\r\n          ae.windCount2 = (ae.windCount2 === 0 ? 1 : 0);\r\n        }\r\n        ae2 = ae2!.nextInAEL;\r\n      }\r\n    } else {\r\n      while (ae2 !== ae) {\r\n        if (ClipperBase.getPolyType(ae2!) !== pt && !ClipperBase.isOpen(ae2!)) {\r\n          ae.windCount2 += ae2!.windDx;\r\n        }\r\n        ae2 = ae2!.nextInAEL;\r\n      }\r\n    }\r\n  }\r\n\r\n  private setWindCountForOpenPathEdge(ae: Active) {\r\n    let ae2: Active | undefined = this._actives;\r\n    if (this._fillrule === FillRule.EvenOdd) {\r\n      let cnt1 = 0, cnt2 = 0;\r\n      while (ae2 !== ae) {\r\n        if (ClipperBase.getPolyType(ae2!) === PathType.Clip)\r\n          cnt2++;\r\n        else if (!ClipperBase.isOpen(ae2!))\r\n          cnt1++;\r\n        ae2 = ae2!.nextInAEL;\r\n      }\r\n\r\n      ae.windCount = (ClipperBase.isOdd(cnt1) ? 1 : 0);\r\n      ae.windCount2 = (ClipperBase.isOdd(cnt2) ? 1 : 0);\r\n    }\r\n    else {\r\n      while (ae2 !== ae) {\r\n        if (ClipperBase.getPolyType(ae2!) === PathType.Clip)\r\n          ae.windCount2 += ae2!.windDx;\r\n        else if (!ClipperBase.isOpen(ae2!))\r\n          ae.windCount += ae2!.windDx;\r\n        ae2 = ae2!.nextInAEL;\r\n      }\r\n    }\r\n  }\r\n\r\n  private static isValidAelOrder(resident: Active, newcomer: Active): boolean {\r\n    if (newcomer.curX !== resident.curX)\r\n      return newcomer.curX > resident.curX;\r\n\r\n    // get the turning direction  a1.top, a2.bot, a2.top\r\n    const d: number = InternalClipper.crossProduct(resident.top, newcomer.bot, newcomer.top);\r\n    if (d !== 0.0) return (d < 0);\r\n\r\n    // edges must be collinear to get here\r\n\r\n    // for starting open paths, place them according to\r\n    // the direction they're about to turn\r\n    if (!this.isMaximaActive(resident) && (resident.top.y > newcomer.top.y)) {\r\n      return InternalClipper.crossProduct(newcomer.bot,\r\n        resident.top, this.nextVertex(resident).pt) <= 0;\r\n    }\r\n\r\n    if (!this.isMaximaActive(newcomer) && (newcomer.top.y > resident.top.y)) {\r\n      return InternalClipper.crossProduct(newcomer.bot,\r\n        newcomer.top, this.nextVertex(newcomer).pt) >= 0;\r\n    }\r\n\r\n    const y: number = newcomer.bot.y;\r\n    const newcomerIsLeft: boolean = newcomer.isLeftBound;\r\n\r\n    if (resident.bot.y !== y || resident.localMin.vertex.pt.y !== y)\r\n      return newcomer.isLeftBound;\r\n    // resident must also have just been inserted\r\n    if (resident.isLeftBound !== newcomerIsLeft)\r\n      return newcomerIsLeft;\r\n    if (InternalClipper.crossProduct(this.prevPrevVertex(resident).pt,\r\n      resident.bot, resident.top) === 0) return true;\r\n    // compare turning direction of the alternate bound\r\n    return (InternalClipper.crossProduct(this.prevPrevVertex(resident).pt,\r\n      newcomer.bot, this.prevPrevVertex(newcomer).pt) > 0) === newcomerIsLeft;\r\n  }\r\n\r\n  private insertLeftEdge(ae: Active): void {\r\n    let ae2: Active;\r\n\r\n    if (!this._actives) {\r\n      ae.prevInAEL = undefined;\r\n      ae.nextInAEL = undefined;\r\n      this._actives = ae;\r\n    } else if (!ClipperBase.isValidAelOrder(this._actives, ae)) {\r\n      ae.prevInAEL = undefined;\r\n      ae.nextInAEL = this._actives;\r\n      this._actives.prevInAEL = ae;\r\n      this._actives = ae;\r\n    } else {\r\n      ae2 = this._actives;\r\n      while (ae2.nextInAEL && ClipperBase.isValidAelOrder(ae2.nextInAEL, ae))\r\n        ae2 = ae2.nextInAEL;\r\n      //don't separate joined edges\r\n      if (ae2.joinWith === JoinWith.Right) ae2 = ae2.nextInAEL!;\r\n      ae.nextInAEL = ae2.nextInAEL;\r\n      if (ae2.nextInAEL) ae2.nextInAEL.prevInAEL = ae;\r\n      ae.prevInAEL = ae2;\r\n      ae2.nextInAEL = ae;\r\n    }\r\n  }\r\n\r\n  private static insertRightEdge(ae: Active, ae2: Active): void {\r\n    ae2.nextInAEL = ae.nextInAEL;\r\n    if (ae.nextInAEL) ae.nextInAEL.prevInAEL = ae2;\r\n    ae2.prevInAEL = ae;\r\n    ae.nextInAEL = ae2;\r\n  }\r\n\r\n  private insertLocalMinimaIntoAEL(botY: number): void {\r\n    let localMinima: LocalMinima;\r\n    let leftBound: Active | undefined;\r\n    let rightBound: Active | undefined;\r\n\r\n    // Add any local minima (if any) at BotY ...\r\n    // NB horizontal local minima edges should contain locMin.vertex.prev\r\n    while (this.hasLocMinAtY(botY)) {\r\n      localMinima = this.popLocalMinima();\r\n\r\n      if ((localMinima.vertex.flags & VertexFlags.OpenStart) !== VertexFlags.None) {\r\n        leftBound = undefined;\r\n      } else {\r\n        leftBound = new Active()\r\n        leftBound.bot = localMinima.vertex.pt\r\n        leftBound.curX = localMinima.vertex.pt.x\r\n        leftBound.windDx = -1\r\n        leftBound.vertexTop = localMinima.vertex.prev\r\n        leftBound.top = localMinima.vertex.prev!.pt\r\n        leftBound.outrec = undefined\r\n        leftBound.localMin = localMinima\r\n\r\n        ClipperBase.setDx(leftBound);\r\n      }\r\n\r\n      if ((localMinima.vertex.flags & VertexFlags.OpenEnd) !== VertexFlags.None) {\r\n        rightBound = undefined;\r\n      } else {\r\n        rightBound = new Active()\r\n        rightBound.bot = localMinima.vertex.pt\r\n        rightBound.curX = localMinima.vertex.pt.x\r\n        rightBound.windDx = 1\r\n        rightBound.vertexTop = localMinima.vertex.next\r\n        rightBound.top = localMinima.vertex.next!.pt\r\n        rightBound.outrec = undefined\r\n        rightBound.localMin = localMinima\r\n\r\n        ClipperBase.setDx(rightBound);\r\n      }\r\n\r\n      if (leftBound && rightBound) {\r\n        if (ClipperBase.isHorizontal(leftBound)) {\r\n          if (ClipperBase.isHeadingRightHorz(leftBound)) {\r\n            [rightBound, leftBound] = [leftBound, rightBound]\r\n          }\r\n        } else if (ClipperBase.isHorizontal(rightBound)) {\r\n          if (ClipperBase.isHeadingLeftHorz(rightBound)) {\r\n            [rightBound, leftBound] = [leftBound, rightBound]\r\n          }\r\n        } else if (leftBound.dx < rightBound.dx) {\r\n          [rightBound, leftBound] = [leftBound, rightBound]\r\n        }\r\n        //so when leftBound has windDx == 1, the polygon will be oriented\r\n        //counter-clockwise in Cartesian coords (clockwise with inverted Y).\r\n      } else if (leftBound === undefined) {\r\n        leftBound = rightBound;\r\n        rightBound = undefined;\r\n      }\r\n\r\n      let contributing = false\r\n      leftBound!.isLeftBound = true;\r\n      this.insertLeftEdge(leftBound!);\r\n\r\n      if (ClipperBase.isOpen(leftBound!)) {\r\n        this.setWindCountForOpenPathEdge(leftBound!);\r\n        contributing = this.isContributingOpen(leftBound!);\r\n      } else {\r\n        this.setWindCountForClosedPathEdge(leftBound!);\r\n        contributing = this.isContributingClosed(leftBound!);\r\n      }\r\n\r\n      if (rightBound) {\r\n        rightBound.windCount = leftBound!.windCount;\r\n        rightBound.windCount2 = leftBound!.windCount2;\r\n        ClipperBase.insertRightEdge(leftBound!, rightBound);\r\n\r\n        if (contributing) {\r\n          this.addLocalMinPoly(leftBound!, rightBound, leftBound!.bot, true);\r\n          if (!ClipperBase.isHorizontal(leftBound!)) {\r\n            this.checkJoinLeft(leftBound!, leftBound!.bot);\r\n          }\r\n        }\r\n\r\n        while (rightBound.nextInAEL &&\r\n          ClipperBase.isValidAelOrder(rightBound.nextInAEL, rightBound)) {\r\n          this.intersectEdges(rightBound, rightBound.nextInAEL, rightBound.bot);\r\n          this.swapPositionsInAEL(rightBound, rightBound.nextInAEL);\r\n        }\r\n\r\n        if (ClipperBase.isHorizontal(rightBound)) {\r\n          this.pushHorz(rightBound);\r\n        } else {\r\n          this.checkJoinRight(rightBound, rightBound.bot);\r\n          this.insertScanline(rightBound.top.y);\r\n        }\r\n\r\n      } else if (contributing) {\r\n        this.startOpenPath(leftBound!, leftBound!.bot);\r\n      }\r\n\r\n      if (ClipperBase.isHorizontal(leftBound!)) {\r\n        this.pushHorz(leftBound!);\r\n      } else {\r\n        this.insertScanline(leftBound!.top.y);\r\n      }\r\n    }\r\n  }\r\n\r\n  private pushHorz(ae: Active): void {\r\n    ae.nextInSEL = this._sel;\r\n    this._sel = ae;\r\n  }\r\n\r\n  private popHorz(): Active | undefined {\r\n    const ae = this._sel;\r\n    if (this._sel === undefined) return undefined;\r\n    this._sel = this._sel.nextInSEL;\r\n    return ae;\r\n  }\r\n\r\n  private addLocalMinPoly(ae1: Active, ae2: Active, pt: IPoint64, isNew: boolean = false): OutPt {\r\n    const outrec: OutRec = this.newOutRec();\r\n    ae1.outrec = outrec;\r\n    ae2.outrec = outrec;\r\n\r\n    if (ClipperBase.isOpen(ae1)) {\r\n      outrec.owner = undefined;\r\n      outrec.isOpen = true;\r\n      if (ae1.windDx > 0)\r\n        ClipperBase.setSides(outrec, ae1, ae2);\r\n      else\r\n        ClipperBase.setSides(outrec, ae2, ae1);\r\n    } else {\r\n      outrec.isOpen = false;\r\n      const prevHotEdge = ClipperBase.getPrevHotEdge(ae1);\r\n\r\n      // e.windDx is the winding direction of the **input** paths\r\n      // and unrelated to the winding direction of output polygons.\r\n      // Output orientation is determined by e.outrec.frontE which is\r\n      // the ascending edge (see AddLocalMinPoly).\r\n      if (prevHotEdge) {\r\n        if (this._using_polytree)\r\n          ClipperBase.setOwner(outrec, prevHotEdge.outrec!);\r\n        outrec.owner = prevHotEdge.outrec;\r\n\r\n        if (ClipperBase.outrecIsAscending(prevHotEdge) === isNew)\r\n          ClipperBase.setSides(outrec, ae2, ae1);\r\n        else\r\n          ClipperBase.setSides(outrec, ae1, ae2);\r\n      } else {\r\n        outrec.owner = undefined;\r\n        if (isNew)\r\n          ClipperBase.setSides(outrec, ae1, ae2);\r\n        else\r\n          ClipperBase.setSides(outrec, ae2, ae1);\r\n      }\r\n    }\r\n\r\n    const op = new OutPt(pt, outrec);\r\n    outrec.pts = op;\r\n    return op;\r\n  }\r\n\r\n  private addLocalMaxPoly(ae1: Active, ae2: Active, pt: IPoint64): OutPt | undefined {\r\n    if (ClipperBase.isJoined(ae1)) this.split(ae1, pt);\r\n    if (ClipperBase.isJoined(ae2)) this.split(ae2, pt);\r\n\r\n    if (ClipperBase.isFront(ae1) === ClipperBase.isFront(ae2)) {\r\n      if (ClipperBase.isOpenEndActive(ae1))\r\n        ClipperBase.swapFrontBackSides(ae1.outrec!);\r\n      else if (ClipperBase.isOpenEndActive(ae2))\r\n        ClipperBase.swapFrontBackSides(ae2.outrec!);\r\n      else {\r\n        this._succeeded = false;\r\n        return undefined;\r\n      }\r\n    }\r\n\r\n    const result = ClipperBase.addOutPt(ae1, pt);\r\n    if (ae1.outrec === ae2.outrec) {\r\n      const outrec = ae1.outrec!;\r\n      outrec.pts = result;\r\n\r\n      if (this._using_polytree) {\r\n        const e = ClipperBase.getPrevHotEdge(ae1);\r\n        if (e === undefined)\r\n          outrec.owner = undefined;\r\n        else\r\n          ClipperBase.setOwner(outrec, e.outrec!);\r\n      }\r\n      ClipperBase.uncoupleOutRec(ae1);\r\n    } else if (ClipperBase.isOpen(ae1)) {\r\n      if (ae1.windDx < 0)\r\n        ClipperBase.joinOutrecPaths(ae1, ae2);\r\n      else\r\n        ClipperBase.joinOutrecPaths(ae2, ae1);\r\n    } else if (ae1.outrec!.idx < ae2.outrec!.idx)\r\n      ClipperBase.joinOutrecPaths(ae1, ae2);\r\n    else\r\n      ClipperBase.joinOutrecPaths(ae2, ae1);\r\n    return result;\r\n  }\r\n\r\n  private static joinOutrecPaths(ae1: Active, ae2: Active): void {\r\n    // join ae2 outrec path onto ae1 outrec path and then delete ae2 outrec path\r\n    // pointers. (NB Only very rarely do the joining ends share the same coords.)\r\n    const p1Start: OutPt = ae1.outrec!.pts!;\r\n    const p2Start: OutPt = ae2.outrec!.pts!;\r\n    const p1End: OutPt = p1Start.next!;\r\n    const p2End: OutPt = p2Start.next!;\r\n\r\n    if (ClipperBase.isFront(ae1)) {\r\n      p2End.prev = p1Start;\r\n      p1Start.next = p2End;\r\n      p2Start.next = p1End;\r\n      p1End.prev = p2Start;\r\n\r\n      ae1.outrec!.pts = p2Start;\r\n      // nb: if IsOpen(e1) then e1 & e2 must be a 'maximaPair'\r\n      ae1.outrec!.frontEdge = ae2.outrec!.frontEdge;\r\n      if (ae1.outrec!.frontEdge)\r\n        ae1.outrec!.frontEdge!.outrec = ae1.outrec;\r\n    } else {\r\n      p1End.prev = p2Start;\r\n      p2Start.next = p1End;\r\n      p1Start.next = p2End;\r\n      p2End.prev = p1Start;\r\n\r\n      ae1.outrec!.backEdge = ae2.outrec!.backEdge;\r\n      if (ae1.outrec!.backEdge)\r\n        ae1.outrec!.backEdge!.outrec = ae1.outrec;\r\n    }\r\n\r\n    // after joining, the ae2.OutRec must contains no vertices ...\r\n    ae2.outrec!.frontEdge = undefined;\r\n    ae2.outrec!.backEdge = undefined;\r\n    ae2.outrec!.pts = undefined;\r\n    ClipperBase.setOwner(ae2.outrec!, ae1.outrec!);\r\n\r\n    if (ClipperBase.isOpenEndActive(ae1)) {\r\n      ae2.outrec!.pts = ae1.outrec!.pts;\r\n      ae1.outrec!.pts = undefined;\r\n    }\r\n\r\n    // and ae1 and ae2 are maxima and are about to be dropped from the Actives list.\r\n    ae1.outrec = undefined;\r\n    ae2.outrec = undefined;\r\n  }\r\n\r\n  private static addOutPt(ae: Active, pt: IPoint64): OutPt {\r\n    const outrec: OutRec = ae.outrec!;\r\n    const toFront: boolean = ClipperBase.isFront(ae);\r\n    const opFront: OutPt = outrec.pts!;\r\n    const opBack: OutPt = opFront.next!;\r\n\r\n    if (toFront && (pt == opFront.pt)) return opFront;\r\n    else if (!toFront && (pt == opBack.pt)) return opBack;\r\n\r\n    const newOp = new OutPt(pt, outrec);\r\n    opBack.prev = newOp;\r\n    newOp.prev = opFront;\r\n    newOp.next = opBack;\r\n    opFront.next = newOp;\r\n\r\n    if (toFront) outrec.pts = newOp;\r\n\r\n    return newOp;\r\n  }\r\n\r\n  private newOutRec(): OutRec {\r\n    const result = new OutRec(this._outrecList.length);\r\n    this._outrecList.push(result);\r\n    return result;\r\n  }\r\n\r\n  private startOpenPath(ae: Active, pt: IPoint64): OutPt {\r\n    const outrec = this.newOutRec();\r\n    outrec.isOpen = true;\r\n    if (ae.windDx > 0) {\r\n      outrec.frontEdge = ae;\r\n      outrec.backEdge = undefined;\r\n    } else {\r\n      outrec.frontEdge = undefined;\r\n      outrec.backEdge = ae;\r\n    }\r\n\r\n    ae.outrec = outrec;\r\n    const op = new OutPt(pt, outrec);\r\n    outrec.pts = op;\r\n    return op;\r\n  }\r\n\r\n  private updateEdgeIntoAEL(ae: Active): void {\r\n    ae.bot = ae.top!;\r\n    ae.vertexTop = ClipperBase.nextVertex(ae);\r\n    ae.top = ae.vertexTop!.pt;\r\n    ae.curX = ae.bot.x;\r\n    ClipperBase.setDx(ae);\r\n\r\n    if (ClipperBase.isJoined(ae)) this.split(ae, ae.bot);\r\n\r\n    if (ClipperBase.isHorizontal(ae)) return;\r\n    this.insertScanline(ae.top.y);\r\n\r\n    this.checkJoinLeft(ae, ae.bot);\r\n    this.checkJoinRight(ae, ae.bot, true);\r\n  }\r\n\r\n  private static findEdgeWithMatchingLocMin(e: Active): Active | undefined {\r\n    let result: Active | undefined = e.nextInAEL;\r\n    while (result) {\r\n      if (result.localMin === e.localMin) return result;\r\n      if (!ClipperBase.isHorizontal(result) && e.bot !== result.bot) result = undefined;\r\n      else result = result.nextInAEL;\r\n    }\r\n\r\n    result = e.prevInAEL;\r\n    while (result) {\r\n      if (result.localMin === e.localMin) return result;\r\n      if (!ClipperBase.isHorizontal(result) && e.bot !== result.bot) return undefined;\r\n      result = result.prevInAEL;\r\n    }\r\n\r\n    return result;\r\n  }\r\n\r\n  private intersectEdges(ae1: Active, ae2: Active, pt: IPoint64): OutPt | undefined {\r\n    let resultOp: OutPt | undefined = undefined;\r\n\r\n    // MANAGE OPEN PATH INTERSECTIONS SEPARATELY ...\r\n    if (this._hasOpenPaths && (ClipperBase.isOpen(ae1) || ClipperBase.isOpen(ae2))) {\r\n      if (ClipperBase.isOpen(ae1) && ClipperBase.isOpen(ae2)) return undefined;\r\n      // the following line avoids duplicating quite a bit of code\r\n      if (ClipperBase.isOpen(ae2)) ClipperBase.swapActives(ae1, ae2);\r\n      if (ClipperBase.isJoined(ae2)) this.split(ae2, pt);\r\n\r\n      if (this._cliptype === ClipType.Union) {\r\n        if (!ClipperBase.isHotEdgeActive(ae2)) return undefined;\r\n      } else if (ae2.localMin.polytype === PathType.Subject)\r\n        return undefined;\r\n\r\n      switch (this._fillrule) {\r\n        case FillRule.Positive:\r\n          if (ae2.windCount !== 1) return undefined;\r\n          break;\r\n        case FillRule.Negative:\r\n          if (ae2.windCount !== -1) return undefined;\r\n          break;\r\n        default:\r\n          if (Math.abs(ae2.windCount) !== 1) return undefined;\r\n          break;\r\n      }\r\n\r\n      // toggle contribution ...\r\n      if (ClipperBase.isHotEdgeActive(ae1)) {\r\n        resultOp = ClipperBase.addOutPt(ae1, pt);\r\n        if (ClipperBase.isFront(ae1)) {\r\n          ae1.outrec!.frontEdge = undefined;\r\n        } else {\r\n          ae1.outrec!.backEdge = undefined;\r\n        }\r\n        ae1.outrec = undefined;\r\n\r\n        // horizontal edges can pass under open paths at a LocMins\r\n      } else if (pt === ae1.localMin.vertex.pt && !ClipperBase.isOpenEnd(ae1.localMin.vertex)) {\r\n        // find the other side of the LocMin and\r\n        // if it's 'hot' join up with it ...\r\n        const ae3: Active | undefined = ClipperBase.findEdgeWithMatchingLocMin(ae1);\r\n        if (ae3 && ClipperBase.isHotEdgeActive(ae3)) {\r\n          ae1.outrec = ae3.outrec;\r\n          if (ae1.windDx > 0) {\r\n            ClipperBase.setSides(ae3.outrec!, ae1, ae3);\r\n          } else {\r\n            ClipperBase.setSides(ae3.outrec!, ae3, ae1);\r\n          }\r\n          return ae3.outrec!.pts;\r\n        }\r\n        resultOp = this.startOpenPath(ae1, pt);\r\n      } else {\r\n        resultOp = this.startOpenPath(ae1, pt);\r\n      }\r\n\r\n      return resultOp;\r\n    }\r\n\r\n    // MANAGING CLOSED PATHS FROM HERE ON\r\n    if (ClipperBase.isJoined(ae1)) this.split(ae1, pt);\r\n    if (ClipperBase.isJoined(ae2)) this.split(ae2, pt);\r\n\r\n    // UPDATE WINDING COUNTS...\r\n    let oldE1WindCount: number;\r\n    let oldE2WindCount: number;\r\n\r\n    if (ae1.localMin.polytype === ae2.localMin.polytype) {\r\n      if (this._fillrule === FillRule.EvenOdd) {\r\n        oldE1WindCount = ae1.windCount;\r\n        ae1.windCount = ae2.windCount;\r\n        ae2.windCount = oldE1WindCount;\r\n      } else {\r\n        if (ae1.windCount + ae2.windDx === 0)\r\n          ae1.windCount = -ae1.windCount;\r\n        else\r\n          ae1.windCount += ae2.windDx;\r\n        if (ae2.windCount - ae1.windDx === 0)\r\n          ae2.windCount = -ae2.windCount;\r\n        else\r\n          ae2.windCount -= ae1.windDx;\r\n      }\r\n    } else {\r\n      if (this._fillrule !== FillRule.EvenOdd)\r\n        ae1.windCount2 += ae2.windDx;\r\n      else\r\n        ae1.windCount2 = (ae1.windCount2 === 0 ? 1 : 0);\r\n      if (this._fillrule !== FillRule.EvenOdd)\r\n        ae2.windCount2 -= ae1.windDx;\r\n      else\r\n        ae2.windCount2 = (ae2.windCount2 === 0 ? 1 : 0);\r\n    }\r\n\r\n    switch (this._fillrule) {\r\n      case FillRule.Positive:\r\n        oldE1WindCount = ae1.windCount;\r\n        oldE2WindCount = ae2.windCount;\r\n        break;\r\n      case FillRule.Negative:\r\n        oldE1WindCount = -ae1.windCount;\r\n        oldE2WindCount = -ae2.windCount;\r\n        break;\r\n      default:\r\n        oldE1WindCount = Math.abs(ae1.windCount);\r\n        oldE2WindCount = Math.abs(ae2.windCount);\r\n        break;\r\n    }\r\n\r\n    const e1WindCountIs0or1: boolean = oldE1WindCount === 0 || oldE1WindCount === 1;\r\n    const e2WindCountIs0or1: boolean = oldE2WindCount === 0 || oldE2WindCount === 1;\r\n\r\n    if ((!ClipperBase.isHotEdgeActive(ae1) && !e1WindCountIs0or1) || (!ClipperBase.isHotEdgeActive(ae2) && !e2WindCountIs0or1)) return undefined;\r\n\r\n    // NOW PROCESS THE INTERSECTION ...\r\n\r\n    // if both edges are 'hot' ...\r\n    if (ClipperBase.isHotEdgeActive(ae1) && ClipperBase.isHotEdgeActive(ae2)) {\r\n      if ((oldE1WindCount !== 0 && oldE1WindCount !== 1) ||\r\n        (oldE2WindCount !== 0 && oldE2WindCount !== 1) ||\r\n        (ae1.localMin.polytype !== ae2.localMin.polytype &&\r\n          this._cliptype !== ClipType.Xor)) {\r\n        resultOp = this.addLocalMaxPoly(ae1, ae2, pt);\r\n      } else if (ClipperBase.isFront(ae1) || (ae1.outrec === ae2.outrec)) {\r\n        // this 'else if' condition isn't strictly needed but\r\n        // it's sensible to split polygons that only touch at\r\n        // a common vertex (not at common edges).\r\n        resultOp = this.addLocalMaxPoly(ae1, ae2, pt);\r\n        this.addLocalMinPoly(ae1, ae2, pt);\r\n      } else {\r\n        // can't treat as maxima & minima\r\n        resultOp = ClipperBase.addOutPt(ae1, pt);\r\n        ClipperBase.addOutPt(ae2, pt);\r\n        ClipperBase.swapOutrecs(ae1, ae2);\r\n      }\r\n    }\r\n    // if one or the other edge is 'hot' ...\r\n    else if (ClipperBase.isHotEdgeActive(ae1)) {\r\n      resultOp = ClipperBase.addOutPt(ae1, pt);\r\n      ClipperBase.swapOutrecs(ae1, ae2);\r\n    } else if (ClipperBase.isHotEdgeActive(ae2)) {\r\n      resultOp = ClipperBase.addOutPt(ae2, pt);\r\n      ClipperBase.swapOutrecs(ae1, ae2);\r\n    }\r\n\r\n    // neither edge is 'hot'\r\n    else {\r\n      let e1Wc2: number;\r\n      let e2Wc2: number;\r\n\r\n      switch (this._fillrule) {\r\n        case FillRule.Positive:\r\n          e1Wc2 = ae1.windCount2;\r\n          e2Wc2 = ae2.windCount2;\r\n          break;\r\n        case FillRule.Negative:\r\n          e1Wc2 = -ae1.windCount2;\r\n          e2Wc2 = -ae2.windCount2;\r\n          break;\r\n        default:\r\n          e1Wc2 = Math.abs(ae1.windCount2);\r\n          e2Wc2 = Math.abs(ae2.windCount2);\r\n          break;\r\n      }\r\n\r\n      if (!ClipperBase.isSamePolyType(ae1, ae2)) {\r\n        resultOp = this.addLocalMinPoly(ae1, ae2, pt);\r\n      } else if (oldE1WindCount === 1 && oldE2WindCount === 1) {\r\n        resultOp = undefined;\r\n\r\n        switch (this._cliptype) {\r\n          case ClipType.Union:\r\n            if (e1Wc2 > 0 && e2Wc2 > 0) return undefined;\r\n            resultOp = this.addLocalMinPoly(ae1, ae2, pt);\r\n            break;\r\n\r\n          case ClipType.Difference:\r\n            if (((ClipperBase.getPolyType(ae1) === PathType.Clip) && (e1Wc2 > 0) && (e2Wc2 > 0)) ||\r\n              ((ClipperBase.getPolyType(ae1) === PathType.Subject) && (e1Wc2 <= 0) && (e2Wc2 <= 0))) {\r\n              resultOp = this.addLocalMinPoly(ae1, ae2, pt);\r\n            }\r\n            break;\r\n\r\n          case ClipType.Xor:\r\n            resultOp = this.addLocalMinPoly(ae1, ae2, pt);\r\n            break;\r\n\r\n          default: // ClipType.Intersection:\r\n            if (e1Wc2 <= 0 || e2Wc2 <= 0) return undefined;\r\n            resultOp = this.addLocalMinPoly(ae1, ae2, pt);\r\n            break;\r\n        }\r\n      }\r\n    }\r\n\r\n    return resultOp;\r\n  }\r\n\r\n\r\n  private deleteFromAEL(ae: Active): void {\r\n    const prev: Active | undefined = ae.prevInAEL;\r\n    const next: Active | undefined = ae.nextInAEL;\r\n    if (!prev && !next && ae !== this._actives) return;  // already deleted\r\n\r\n    if (prev)\r\n      prev.nextInAEL = next;\r\n    else\r\n      this._actives = next;\r\n\r\n    if (next)\r\n      next.prevInAEL = prev;\r\n  }\r\n\r\n  private adjustCurrXAndCopyToSEL(topY: number): void {\r\n    let ae: Active | undefined = this._actives;\r\n    this._sel = ae;\r\n    while (ae) {\r\n      ae.prevInSEL = ae.prevInAEL;\r\n      ae.nextInSEL = ae.nextInAEL;\r\n      ae.jump = ae.nextInSEL;\r\n      if (ae.joinWith === JoinWith.Left)\r\n        ae.curX = ae.prevInAEL!.curX;  // This also avoids complications\r\n      else\r\n        ae.curX = ClipperBase.topX(ae, topY);\r\n      // NB don't update ae.curr.Y yet (see AddNewIntersectNode)\r\n      ae = ae.nextInAEL;\r\n    }\r\n  }\r\n\r\n  protected executeInternal(ct: ClipType, fillRule: FillRule): void {\r\n    if (ct === ClipType.None) return;\r\n    this._fillrule = fillRule;\r\n    this._cliptype = ct;\r\n    this.reset();\r\n\r\n    let y = this.popScanline()\r\n    if (y === undefined) return\r\n\r\n    while (this._succeeded) {\r\n      this.insertLocalMinimaIntoAEL(y)\r\n      let ae = this.popHorz()\r\n      while (ae) {\r\n        this.doHorizontal(ae)\r\n        ae = this.popHorz()\r\n      }\r\n\r\n      if (this._horzSegList.length > 0) {\r\n        this.convertHorzSegsToJoins();\r\n        this._horzSegList.length = 0\r\n      }\r\n      this._currentBotY = y;  // bottom of scanbeam\r\n\r\n      y = this.popScanline()\r\n      if (y === undefined) break;  // y new top of scanbeam\r\n\r\n      this.doIntersections(y);\r\n      this.doTopOfScanbeam(y);\r\n\r\n      ae = this.popHorz()\r\n      while (ae) {\r\n        this.doHorizontal(ae)\r\n        ae = this.popHorz()\r\n      }\r\n    }\r\n    if (this._succeeded) this.processHorzJoins();\r\n  }\r\n\r\n  private doIntersections(topY: number): void {\r\n    if (this.buildIntersectList(topY)) {\r\n      this.processIntersectList();\r\n      this.disposeIntersectNodes();\r\n    }\r\n  }\r\n\r\n  private disposeIntersectNodes(): void {\r\n    this._intersectList.length = 0\r\n  }\r\n\r\n  private addNewIntersectNode(ae1: Active, ae2: Active, topY: number): void {\r\n    const result = InternalClipper.getIntersectPoint(ae1.bot, ae1.top, ae2.bot, ae2.top)\r\n    let ip: IPoint64 = result.ip\r\n    if (!result.success) {\r\n      ip = new Point64(ae1.curX, topY);\r\n    }\r\n\r\n    if (ip.y > this._currentBotY || ip.y < topY) {\r\n      const absDx1: number = Math.abs(ae1.dx);\r\n      const absDx2: number = Math.abs(ae2.dx);\r\n      if (absDx1 > 100 && absDx2 > 100) {\r\n        if (absDx1 > absDx2) {\r\n          ip = InternalClipper.getClosestPtOnSegment(ip, ae1.bot, ae1.top);\r\n        } else {\r\n          ip = InternalClipper.getClosestPtOnSegment(ip, ae2.bot, ae2.top);\r\n        }\r\n      } else if (absDx1 > 100) {\r\n        ip = InternalClipper.getClosestPtOnSegment(ip, ae1.bot, ae1.top);\r\n      } else if (absDx2 > 100) {\r\n        ip = InternalClipper.getClosestPtOnSegment(ip, ae2.bot, ae2.top);\r\n      } else {\r\n        if (ip.y < topY) {\r\n          ip.y = topY;\r\n        } else {\r\n          ip.y = this._currentBotY;\r\n        }\r\n        if (absDx1 < absDx2) {\r\n          ip.x = ClipperBase.topX(ae1, ip.y);\r\n        } else {\r\n          ip.x = ClipperBase.topX(ae2, ip.y);\r\n        }\r\n      }\r\n    }\r\n    const node: IntersectNode = new IntersectNode(ip, ae1, ae2);\r\n    this._intersectList.push(node);\r\n  }\r\n\r\n  private static extractFromSEL(ae: Active): Active | undefined {\r\n    const res: Active | undefined = ae.nextInSEL;\r\n    if (res) {\r\n      res.prevInSEL = ae.prevInSEL;\r\n    }\r\n    ae.prevInSEL!.nextInSEL = res;\r\n    return res;\r\n  }\r\n\r\n  private static insert1Before2InSEL(ae1: Active, ae2: Active): void {\r\n    ae1.prevInSEL = ae2.prevInSEL;\r\n    if (ae1.prevInSEL) {\r\n      ae1.prevInSEL.nextInSEL = ae1;\r\n    }\r\n    ae1.nextInSEL = ae2;\r\n    ae2.prevInSEL = ae1;\r\n  }\r\n\r\n  private buildIntersectList(topY: number): boolean {\r\n    if (!this._actives || !this._actives.nextInAEL) return false;\r\n\r\n    // Calculate edge positions at the top of the current scanbeam, and from this\r\n    // we will determine the intersections required to reach these new positions.\r\n    this.adjustCurrXAndCopyToSEL(topY);\r\n\r\n    // Find all edge intersections in the current scanbeam using a stable merge\r\n    // sort that ensures only adjacent edges are intersecting. Intersect info is\r\n    // stored in FIntersectList ready to be processed in ProcessIntersectList.\r\n    // Re merge sorts see https://stackoverflow.com/a/46319131/359538\r\n\r\n    let left: Active | undefined = this._sel,\r\n      right: Active | undefined,\r\n      lEnd: Active | undefined,\r\n      rEnd: Active | undefined,\r\n      currBase: Active | undefined,\r\n      prevBase: Active | undefined,\r\n      tmp: Active | undefined;\r\n\r\n    while (left!.jump) {\r\n      prevBase = undefined;\r\n      while (left && left.jump) {\r\n        currBase = left;\r\n        right = left.jump;\r\n        lEnd = right;\r\n        rEnd = right!.jump;\r\n        left.jump = rEnd;\r\n        while (left !== lEnd && right !== rEnd) {\r\n          if (right!.curX < left!.curX) {\r\n            tmp = right!.prevInSEL!;\r\n            for (; ;) {\r\n              this.addNewIntersectNode(tmp, right!, topY);\r\n              if (tmp === left) break;\r\n              tmp = tmp.prevInSEL!;\r\n            }\r\n\r\n            tmp = right;\r\n            right = ClipperBase.extractFromSEL(tmp!);\r\n            lEnd = right;\r\n            ClipperBase.insert1Before2InSEL(tmp!, left!);\r\n            if (left === currBase) {\r\n              currBase = tmp;\r\n              currBase!.jump = rEnd;\r\n              if (prevBase === undefined) this._sel = currBase;\r\n              else prevBase.jump = currBase;\r\n            }\r\n          } else {\r\n            left = left!.nextInSEL;\r\n          }\r\n        }\r\n\r\n        prevBase = currBase;\r\n        left = rEnd;\r\n      }\r\n      left = this._sel;\r\n    }\r\n\r\n    return this._intersectList.length > 0;\r\n  }\r\n\r\n  private processIntersectList(): void {\r\n    // We now have a list of intersections required so that edges will be\r\n    // correctly positioned at the top of the scanbeam. However, it's important\r\n    // that edge intersections are processed from the bottom up, but it's also\r\n    // crucial that intersections only occur between adjacent edges.\r\n\r\n    // First we do a quicksort so intersections proceed in a bottom up order ...\r\n    this._intersectList.sort((a, b) => {\r\n      if (a.pt.y === b.pt.y) {\r\n        if (a.pt.x === b.pt.x) return 0;\r\n        return (a.pt.x < b.pt.x) ? -1 : 1;\r\n      }\r\n      return (a.pt.y > b.pt.y) ? -1 : 1;\r\n    });\r\n\r\n    // Now as we process these intersections, we must sometimes adjust the order\r\n    // to ensure that intersecting edges are always adjacent ...\r\n    for (let i = 0; i < this._intersectList.length; ++i) {\r\n      if (!ClipperBase.edgesAdjacentInAEL(this._intersectList[i])) {\r\n        let j = i + 1;\r\n        while (!ClipperBase.edgesAdjacentInAEL(this._intersectList[j])) j++;\r\n        // swap\r\n        [this._intersectList[j], this._intersectList[i]] =\r\n          [this._intersectList[i], this._intersectList[j]];\r\n      }\r\n\r\n      const node = this._intersectList[i];\r\n      this.intersectEdges(node.edge1, node.edge2, node.pt);\r\n      this.swapPositionsInAEL(node.edge1, node.edge2);\r\n\r\n      node.edge1.curX = node.pt.x;\r\n      node.edge2.curX = node.pt.x;\r\n      this.checkJoinLeft(node.edge2, node.pt, true);\r\n      this.checkJoinRight(node.edge1, node.pt, true);\r\n    }\r\n  }\r\n\r\n  private swapPositionsInAEL(ae1: Active, ae2: Active): void {\r\n    // preconditon: ae1 must be immediately to the left of ae2\r\n    const next: Active | undefined = ae2.nextInAEL;\r\n    if (next) next.prevInAEL = ae1;\r\n    const prev: Active | undefined = ae1.prevInAEL;\r\n    if (prev) prev.nextInAEL = ae2;\r\n    ae2.prevInAEL = prev;\r\n    ae2.nextInAEL = ae1;\r\n    ae1.prevInAEL = ae2;\r\n    ae1.nextInAEL = next;\r\n    if (!ae2.prevInAEL) this._actives = ae2;\r\n  }\r\n\r\n  private static resetHorzDirection(horz: Active, vertexMax: Vertex | undefined): { isLeftToRight: boolean, leftX: number, rightX: number } {\r\n    let leftX, rightX\r\n\r\n    if (horz.bot.x === horz.top.x) {\r\n      // the horizontal edge is going nowhere ...\r\n      leftX = horz.curX;\r\n      rightX = horz.curX;\r\n      let ae: Active | undefined = horz.nextInAEL;\r\n      while (ae && ae.vertexTop !== vertexMax)\r\n        ae = ae.nextInAEL;\r\n      return { isLeftToRight: ae !== undefined, leftX, rightX }\r\n    }\r\n\r\n    if (horz.curX < horz.top.x) {\r\n      leftX = horz.curX;\r\n      rightX = horz.top.x;\r\n      return { isLeftToRight: true, leftX, rightX }\r\n    }\r\n    leftX = horz.top.x;\r\n    rightX = horz.curX;\r\n    return { isLeftToRight: false, leftX, rightX } // right to left\r\n  }\r\n\r\n  private static horzIsSpike(horz: Active): boolean {\r\n    const nextPt: IPoint64 = ClipperBase.nextVertex(horz).pt;\r\n    return (horz.bot.x < horz.top.x) !== (horz.top.x < nextPt.x);\r\n  }\r\n\r\n  private static trimHorz(horzEdge: Active, preserveCollinear: boolean): void {\r\n    let wasTrimmed = false;\r\n    let pt: IPoint64 = ClipperBase.nextVertex(horzEdge).pt;\r\n\r\n    while (pt.y === horzEdge.top.y) {\r\n      // always trim 180 deg. spikes (in closed paths)\r\n      // but otherwise break if preserveCollinear = true\r\n      if (preserveCollinear &&\r\n        (pt.x < horzEdge.top.x) !== (horzEdge.bot.x < horzEdge.top.x)) {\r\n        break;\r\n      }\r\n\r\n      horzEdge.vertexTop = ClipperBase.nextVertex(horzEdge);\r\n      horzEdge.top = pt;\r\n      wasTrimmed = true;\r\n      if (ClipperBase.isMaximaActive(horzEdge)) break;\r\n      pt = ClipperBase.nextVertex(horzEdge).pt;\r\n    }\r\n    if (wasTrimmed) ClipperBase.setDx(horzEdge); // +/-infinity\r\n  }\r\n\r\n  private addToHorzSegList(op: OutPt): void {\r\n    if (op.outrec.isOpen) return;\r\n    this._horzSegList.push(new HorzSegment(op));\r\n  }\r\n\r\n  private getLastOp(hotEdge: Active): OutPt {\r\n    const outrec: OutRec = hotEdge.outrec!;\r\n    return (hotEdge === outrec.frontEdge) ?\r\n      outrec.pts! : outrec.pts!.next!;\r\n  }\r\n\r\n  /*******************************************************************************\r\n  * Notes: Horizontal edges (HEs) at scanline intersections (i.e. at the top or    *\r\n  * bottom of a scanbeam) are processed as if layered.The order in which HEs     *\r\n  * are processed doesn't matter. HEs intersect with the bottom vertices of      *\r\n  * other HEs[#] and with non-horizontal edges [*]. Once these intersections     *\r\n  * are completed, intermediate HEs are 'promoted' to the next edge in their     *\r\n  * bounds, and they in turn may be intersected[%] by other HEs.                 *\r\n  *                                                                              *\r\n  * eg: 3 horizontals at a scanline:    /   |                     /           /  *\r\n  *              |                     /    |     (HE3)o ========%========== o   *\r\n  *              o ======= o(HE2)     /     |         /         /                *\r\n  *          o ============#=========*======*========#=========o (HE1)           *\r\n  *         /              |        /       |       /                            *\r\n  *******************************************************************************/\r\n  private doHorizontal(horz: Active): void {\r\n    let pt: IPoint64;\r\n    const horzIsOpen = ClipperBase.isOpen(horz);\r\n    const Y = horz.bot.y;\r\n\r\n    const vertex_max: Vertex | undefined = horzIsOpen ?\r\n      ClipperBase.getCurrYMaximaVertex_Open(horz) :\r\n      ClipperBase.getCurrYMaximaVertex(horz);\r\n\r\n    // remove 180 deg.spikes and also simplify\r\n    // consecutive horizontals when PreserveCollinear = true\r\n    if (vertex_max && !horzIsOpen && vertex_max !== horz.vertexTop)\r\n      ClipperBase.trimHorz(horz, this.preserveCollinear);\r\n\r\n    let { isLeftToRight, leftX, rightX } =\r\n      ClipperBase.resetHorzDirection(horz, vertex_max);\r\n\r\n    if (ClipperBase.isHotEdgeActive(horz)) {\r\n      const op = ClipperBase.addOutPt(horz, new Point64(horz.curX, Y));\r\n      this.addToHorzSegList(op);\r\n    }\r\n\r\n    for (; ;) {\r\n      // loops through consec. horizontal edges (if open)\r\n      let ae: Active | undefined = isLeftToRight ? horz.nextInAEL : horz.prevInAEL;\r\n\r\n      while (ae) {\r\n        if (ae.vertexTop === vertex_max) {\r\n          // do this first!!\r\n          if (ClipperBase.isHotEdgeActive(horz) && ClipperBase.isJoined(ae)) this.split(ae, ae.top);\r\n\r\n          if (ClipperBase.isHotEdgeActive(horz)) {\r\n            while (horz.vertexTop !== vertex_max) {\r\n              ClipperBase.addOutPt(horz, horz.top);\r\n              this.updateEdgeIntoAEL(horz);\r\n            }\r\n            if (isLeftToRight)\r\n              this.addLocalMaxPoly(horz, ae, horz.top);\r\n            else\r\n              this.addLocalMaxPoly(ae, horz, horz.top);\r\n          }\r\n          this.deleteFromAEL(ae);\r\n          this.deleteFromAEL(horz);\r\n          return;\r\n        }\r\n\r\n        // if horzEdge is a maxima, keep going until we reach\r\n        // its maxima pair, otherwise check for break conditions\r\n        if (vertex_max !== horz.vertexTop || ClipperBase.isOpenEndActive(horz)) {\r\n          // otherwise stop when 'ae' is beyond the end of the horizontal line\r\n          if ((isLeftToRight && ae.curX > rightX) || (!isLeftToRight && ae.curX < leftX)) break;\r\n\r\n          if (ae.curX === horz.top.x && !ClipperBase.isHorizontal(ae)) {\r\n            pt = ClipperBase.nextVertex(horz).pt;\r\n\r\n            // to maximize the possibility of putting open edges into\r\n            // solutions, we'll only break if it's past HorzEdge's end\r\n            if (ClipperBase.isOpen(ae) && !ClipperBase.isSamePolyType(ae, horz) && !ClipperBase.isHotEdgeActive(ae)) {\r\n              if ((isLeftToRight && (ClipperBase.topX(ae, pt.y) > pt.x)) || (!isLeftToRight && (ClipperBase.topX(ae, pt.y) < pt.x))) break;\r\n            }\r\n            // otherwise for edges at horzEdge's end, only stop when horzEdge's\r\n            // outslope is greater than e's slope when heading right or when\r\n            // horzEdge's outslope is less than e's slope when heading left.\r\n            else if ((isLeftToRight && (ClipperBase.topX(ae, pt.y) >= pt.x)) || (!isLeftToRight && (ClipperBase.topX(ae, pt.y) <= pt.x))) break;\r\n          }\r\n        }\r\n\r\n        pt = new Point64(ae.curX, Y);\r\n\r\n        if (isLeftToRight) {\r\n          this.intersectEdges(horz, ae, pt);\r\n          this.swapPositionsInAEL(horz, ae);\r\n          horz.curX = ae.curX;\r\n          ae = horz.nextInAEL;\r\n        } else {\r\n          this.intersectEdges(ae, horz, pt);\r\n          this.swapPositionsInAEL(ae, horz);\r\n          horz.curX = ae.curX;\r\n          ae = horz.prevInAEL;\r\n        }\r\n\r\n        if (ClipperBase.isHotEdgeActive(horz))\r\n          this.addToHorzSegList(this.getLastOp(horz));\r\n      } // we've reached the end of this horizontal\r\n\r\n      // check if we've finished looping\r\n      // through consecutive horizontals\r\n      if (horzIsOpen && ClipperBase.isOpenEndActive(horz)) { // ie open at top\r\n        if (ClipperBase.isHotEdgeActive(horz)) {\r\n          ClipperBase.addOutPt(horz, horz.top);\r\n          if (ClipperBase.isFront(horz))\r\n            horz.outrec!.frontEdge = undefined;\r\n          else\r\n            horz.outrec!.backEdge = undefined;\r\n          horz.outrec = undefined;\r\n        }\r\n        this.deleteFromAEL(horz);\r\n        return;\r\n      } else if (ClipperBase.nextVertex(horz).pt.y !== horz.top.y)\r\n        break;\r\n\r\n      // still more horizontals in bound to process ...\r\n      if (ClipperBase.isHotEdgeActive(horz)) {\r\n        ClipperBase.addOutPt(horz, horz.top);\r\n      }\r\n\r\n      this.updateEdgeIntoAEL(horz);\r\n\r\n      if (this.preserveCollinear && !horzIsOpen && ClipperBase.horzIsSpike(horz)) {\r\n        ClipperBase.trimHorz(horz, true);\r\n      }\r\n\r\n      const result = ClipperBase.resetHorzDirection(horz, vertex_max);\r\n      isLeftToRight = result.isLeftToRight\r\n      leftX = result.leftX\r\n      rightX = result.rightX\r\n    }\r\n\r\n    if (ClipperBase.isHotEdgeActive(horz)) {\r\n      const op = ClipperBase.addOutPt(horz, horz.top);\r\n      this.addToHorzSegList(op);\r\n    }\r\n\r\n    this.updateEdgeIntoAEL(horz);\r\n  }\r\n\r\n  private doTopOfScanbeam(y: number): void {\r\n    this._sel = undefined; // _sel is reused to flag horizontals (see pushHorz below)\r\n    let ae: Active | undefined = this._actives;\r\n\r\n    while (ae) {\r\n      // NB 'ae' will never be horizontal here\r\n      if (ae.top.y === y) {\r\n        ae.curX = ae.top.x;\r\n\r\n        if (ClipperBase.isMaximaActive(ae)) {\r\n          ae = this.doMaxima(ae); // TOP OF BOUND (MAXIMA)\r\n          continue;\r\n        }\r\n\r\n        // INTERMEDIATE VERTEX ...\r\n        if (ClipperBase.isHotEdgeActive(ae))\r\n          ClipperBase.addOutPt(ae, ae.top);\r\n\r\n        this.updateEdgeIntoAEL(ae);\r\n\r\n        if (ClipperBase.isHorizontal(ae))\r\n          this.pushHorz(ae); // horizontals are processed later\r\n      } else { // i.e. not the top of the edge\r\n        ae.curX = ClipperBase.topX(ae, y);\r\n      }\r\n\r\n      ae = ae.nextInAEL;\r\n    }\r\n  }\r\n\r\n  private doMaxima(ae: Active): Active | undefined {\r\n    const prevE: Active | undefined = ae.prevInAEL\r\n    let nextE: Active | undefined = ae.nextInAEL\r\n\r\n    if (ClipperBase.isOpenEndActive(ae)) {\r\n      if (ClipperBase.isHotEdgeActive(ae)) ClipperBase.addOutPt(ae, ae.top);\r\n      if (!ClipperBase.isHorizontal(ae)) {\r\n        if (ClipperBase.isHotEdgeActive(ae)) {\r\n          if (ClipperBase.isFront(ae))\r\n            ae.outrec!.frontEdge = undefined;\r\n          else\r\n            ae.outrec!.backEdge = undefined;\r\n          ae.outrec = undefined;\r\n        }\r\n        this.deleteFromAEL(ae);\r\n      }\r\n      return nextE;\r\n    }\r\n\r\n    const maxPair: Active | undefined = ClipperBase.getMaximaPair(ae);\r\n    if (!maxPair) return nextE; // eMaxPair is horizontal\r\n\r\n    if (ClipperBase.isJoined(ae)) this.split(ae, ae.top);\r\n    if (ClipperBase.isJoined(maxPair)) this.split(maxPair, maxPair.top);\r\n\r\n    // only non-horizontal maxima here.\r\n    // process any edges between maxima pair ...\r\n    while (nextE !== maxPair) {\r\n      this.intersectEdges(ae, nextE!, ae.top);\r\n      this.swapPositionsInAEL(ae, nextE!);\r\n      nextE = ae.nextInAEL\r\n    }\r\n\r\n    if (ClipperBase.isOpen(ae)) {\r\n      if (ClipperBase.isHotEdgeActive(ae))\r\n        this.addLocalMaxPoly(ae, maxPair, ae.top);\r\n      this.deleteFromAEL(maxPair);\r\n      this.deleteFromAEL(ae);\r\n      return (prevE ? prevE.nextInAEL : this._actives);\r\n    }\r\n\r\n    // here ae.nextInAel == ENext == EMaxPair ...\r\n    if (ClipperBase.isHotEdgeActive(ae))\r\n      this.addLocalMaxPoly(ae, maxPair, ae.top);\r\n\r\n    this.deleteFromAEL(ae);\r\n    this.deleteFromAEL(maxPair);\r\n    return (prevE ? prevE.nextInAEL : this._actives);\r\n  }\r\n\r\n  private static isJoined(e: Active): boolean {\r\n    return e.joinWith !== JoinWith.None;\r\n  }\r\n\r\n  private split(e: Active, currPt: IPoint64): void {\r\n    if (e.joinWith === JoinWith.Right) {\r\n      e.joinWith = JoinWith.None;\r\n      e.nextInAEL!.joinWith = JoinWith.None;\r\n      this.addLocalMinPoly(e, e.nextInAEL!, currPt, true);\r\n    } else {\r\n      e.joinWith = JoinWith.None;\r\n      e.prevInAEL!.joinWith = JoinWith.None;\r\n      this.addLocalMinPoly(e.prevInAEL!, e, currPt, true);\r\n    }\r\n  }\r\n\r\n  private checkJoinLeft(e: Active, pt: IPoint64, checkCurrX: boolean = false): void {\r\n    const prev = e.prevInAEL;\r\n    if (!prev || ClipperBase.isOpen(e) || ClipperBase.isOpen(prev) ||\r\n      !ClipperBase.isHotEdgeActive(e) || !ClipperBase.isHotEdgeActive(prev)) return;\r\n\r\n    if ((pt.y < e.top.y + 2 || pt.y < prev.top.y + 2) && // avoid trivial joins\r\n      ((e.bot.y > pt.y) || (prev.bot.y > pt.y))) return; // (#490)\r\n\r\n    if (checkCurrX) {\r\n      if (Clipper.perpendicDistFromLineSqrd(pt, prev.bot, prev.top) > 0.25) return;\r\n    } else if (e.curX !== prev.curX) return;\r\n    if (InternalClipper.crossProduct(e.top, pt, prev.top) !== 0) return;\r\n\r\n    if (e.outrec!.idx === prev.outrec!.idx)\r\n      this.addLocalMaxPoly(prev, e, pt);\r\n    else if (e.outrec!.idx < prev.outrec!.idx)\r\n      ClipperBase.joinOutrecPaths(e, prev);\r\n    else\r\n      ClipperBase.joinOutrecPaths(prev, e);\r\n    prev.joinWith = JoinWith.Right;\r\n    e.joinWith = JoinWith.Left;\r\n  }\r\n\r\n  private checkJoinRight(e: Active, pt: IPoint64, checkCurrX: boolean = false): void {\r\n    const next = e.nextInAEL;\r\n    if (ClipperBase.isOpen(e) || !ClipperBase.isHotEdgeActive(e) || ClipperBase.isJoined(e) ||\r\n      !next || ClipperBase.isOpen(next) || !ClipperBase.isHotEdgeActive(next)) return;\r\n\r\n    if ((pt.y < e.top.y + 2 || pt.y < next.top.y + 2) && // avoid trivial joins\r\n      ((e.bot.y > pt.y) || (next.bot.y > pt.y))) return; // (#490)\r\n\r\n    if (checkCurrX) {\r\n      if (Clipper.perpendicDistFromLineSqrd(pt, next.bot, next.top) > 0.25) return;\r\n    } else if (e.curX !== next.curX) return;\r\n    if (InternalClipper.crossProduct(e.top, pt, next.top) !== 0) return;\r\n\r\n    if (e.outrec!.idx === next.outrec!.idx)\r\n      this.addLocalMaxPoly(e, next, pt);\r\n    else if (e.outrec!.idx < next.outrec!.idx)\r\n      ClipperBase.joinOutrecPaths(e, next);\r\n    else\r\n      ClipperBase.joinOutrecPaths(next, e);\r\n    e.joinWith = JoinWith.Right;\r\n    next.joinWith = JoinWith.Left;\r\n  }\r\n\r\n  private static fixOutRecPts(outrec: OutRec): void {\r\n    let op = outrec.pts!;\r\n    do {\r\n      op!.outrec = outrec;\r\n      op = op.next!;\r\n    } while (op !== outrec.pts);\r\n  }\r\n\r\n  private static setHorzSegHeadingForward(hs: HorzSegment, opP: OutPt, opN: OutPt): boolean {\r\n    if (opP.pt.x === opN.pt.x) return false;\r\n    if (opP.pt.x < opN.pt.x) {\r\n      hs.leftOp = opP;\r\n      hs.rightOp = opN;\r\n      hs.leftToRight = true;\r\n    } else {\r\n      hs.leftOp = opN;\r\n      hs.rightOp = opP;\r\n      hs.leftToRight = false;\r\n    }\r\n    return true;\r\n  }\r\n\r\n  private static updateHorzSegment(hs: HorzSegment): boolean {\r\n    const op = hs.leftOp;\r\n    const outrec = this.getRealOutRec(op.outrec)!;\r\n    const outrecHasEdges = outrec.frontEdge !== undefined;\r\n    const curr_y = op.pt.y;\r\n    let opP = op, opN = op;\r\n\r\n    if (outrecHasEdges) {\r\n      const opA = outrec.pts!, opZ = opA.next!;\r\n      while (opP !== opZ && opP.prev.pt.y === curr_y)\r\n        opP = opP.prev;\r\n      while (opN !== opA && opN.next!.pt.y === curr_y)\r\n        opN = opN.next!;\r\n    } else {\r\n      while (opP.prev !== opN && opP.prev.pt.y === curr_y)\r\n        opP = opP.prev;\r\n      while (opN.next !== opP && opN.next!.pt.y === curr_y)\r\n        opN = opN.next!;\r\n    }\r\n\r\n    const result = this.setHorzSegHeadingForward(hs, opP, opN) && hs.leftOp!.horz === undefined;\r\n\r\n    if (result)\r\n      hs.leftOp!.horz = hs;\r\n    else\r\n      hs.rightOp = undefined; // (for sorting)\r\n\r\n    return result;\r\n  }\r\n\r\n  private static duplicateOp(op: OutPt, insert_after: boolean): OutPt {\r\n    const result = new OutPt(op.pt, op.outrec);\r\n    if (insert_after) {\r\n      result.next = op.next;\r\n      result.next!.prev = result;\r\n      result.prev = op;\r\n      op.next = result;\r\n    } else {\r\n      result.prev = op.prev;\r\n      result.prev.next = result;\r\n      result.next = op;\r\n      op.prev = result;\r\n    }\r\n    return result;\r\n  }\r\n\r\n  private convertHorzSegsToJoins(): void {\r\n    let k = 0;\r\n    for (const hs of this._horzSegList) {\r\n      if (ClipperBase.updateHorzSegment(hs)) k++;\r\n    }\r\n    if (k < 2) return;\r\n    this._horzSegList.sort((hs1, hs2) => {\r\n      if (!hs1 || !hs2) return 0;\r\n      if (!hs1.rightOp) {\r\n        return !hs2.rightOp ? 0 : 1;\r\n      } else if (!hs2.rightOp)\r\n        return -1;\r\n      else\r\n        return hs1.leftOp!.pt.x - hs2.leftOp!.pt.x;\r\n    });\r\n\r\n    for (let i = 0; i < k - 1; i++) {\r\n      const hs1 = this._horzSegList[i];\r\n      // for each HorzSegment, find others that overlap\r\n      for (let j = i + 1; j < k; j++) {\r\n        const hs2 = this._horzSegList[j];\r\n        if (hs2.leftOp!.pt.x >= hs1.rightOp!.pt.x ||\r\n          hs2.leftToRight === hs1.leftToRight ||\r\n          hs2.rightOp!.pt.x <= hs1.leftOp!.pt.x) continue;\r\n\r\n        const curr_y = hs1.leftOp.pt.y;\r\n\r\n        if (hs1.leftToRight) {\r\n          while (hs1.leftOp.next!.pt.y === curr_y &&\r\n            hs1.leftOp.next!.pt.x <= hs2.leftOp.pt.x) {\r\n            hs1.leftOp = hs1.leftOp.next!;\r\n          }\r\n          while (hs2.leftOp.prev.pt.y === curr_y &&\r\n            hs2.leftOp.prev.pt.x <= hs1.leftOp.pt.x) {\r\n            hs2.leftOp = hs2.leftOp.prev;\r\n          }\r\n          const join = new HorzJoin(\r\n            ClipperBase.duplicateOp(hs1.leftOp, true),\r\n            ClipperBase.duplicateOp(hs2.leftOp, false)\r\n          );\r\n          this._horzJoinList.push(join);\r\n        } else {\r\n          while (hs1.leftOp.prev.pt.y === curr_y &&\r\n            hs1.leftOp.prev.pt.x <= hs2.leftOp.pt.x) {\r\n            hs1.leftOp = hs1.leftOp.prev;\r\n          }\r\n          while (hs2.leftOp.next!.pt.y === curr_y &&\r\n            hs2.leftOp.next!.pt.x <= hs1.leftOp.pt.x) {\r\n            hs2.leftOp = hs2.leftOp.next!;\r\n          }\r\n          const join = new HorzJoin(\r\n            ClipperBase.duplicateOp(hs2.leftOp, true),\r\n            ClipperBase.duplicateOp(hs1.leftOp, false)\r\n          );\r\n          this._horzJoinList.push(join);\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  private static getCleanPath(op: OutPt): Path64 {\r\n    const result = new Path64();\r\n    let op2 = op;\r\n    while (op2.next !== op &&\r\n      ((op2.pt.x === op2.next!.pt.x && op2.pt.x === op2.prev.pt.x) ||\r\n        (op2.pt.y === op2.next!.pt.y && op2.pt.y === op2.prev.pt.y))) {\r\n      op2 = op2.next!;\r\n    }\r\n    result.push(op2.pt);\r\n    let prevOp = op2;\r\n    op2 = op2.next!;\r\n\r\n    while (op2 !== op) {\r\n      if ((op2.pt.x !== op2.next!.pt.x || op2.pt.x !== prevOp.pt.x) &&\r\n        (op2.pt.y !== op2.next!.pt.y || op2.pt.y !== prevOp.pt.y)) {\r\n        result.push(op2.pt);\r\n        prevOp = op2;\r\n      }\r\n      op2 = op2.next!;\r\n    }\r\n    return result;\r\n  }\r\n\r\n  private static pointInOpPolygon(pt: IPoint64, op: OutPt): PointInPolygonResult {\r\n    if (op === op.next || op.prev === op.next)\r\n      return PointInPolygonResult.IsOutside;\r\n\r\n    let op2 = op;\r\n    do {\r\n      if (op.pt.y !== pt.y) break;\r\n      op = op.next!;\r\n    } while (op !== op2);\r\n    if (op.pt.y === pt.y)  // not a proper polygon\r\n      return PointInPolygonResult.IsOutside;\r\n\r\n    let isAbove = op.pt.y < pt.y\r\n    const startingAbove = isAbove;\r\n    let val = 0;\r\n\r\n    op2 = op.next!;\r\n    while (op2 !== op) {\r\n      if (isAbove)\r\n        while (op2 !== op && op2.pt.y < pt.y) op2 = op2.next!;\r\n      else\r\n        while (op2 !== op && op2.pt.y > pt.y) op2 = op2.next!;\r\n      if (op2 === op) break;\r\n\r\n      if (op2.pt.y === pt.y) {\r\n        if (op2.pt.x === pt.x || (op2.pt.y === op2.prev.pt.y &&\r\n          (pt.x < op2.prev.pt.x) !== (pt.x < op2.pt.x)))\r\n          return PointInPolygonResult.IsOn;\r\n        op2 = op2.next!;\r\n        if (op2 === op) break;\r\n        continue;\r\n      }\r\n\r\n      if (op2.pt.x <= pt.x || op2.prev.pt.x <= pt.x) {\r\n        if (op2.prev.pt.x < pt.x && op2.pt.x < pt.x)\r\n          val = 1 - val;\r\n        else {\r\n          const d = InternalClipper.crossProduct(op2.prev.pt, op2.pt, pt);\r\n          if (d === 0) return PointInPolygonResult.IsOn;\r\n          if ((d < 0) === isAbove) val = 1 - val;\r\n        }\r\n      }\r\n      isAbove = !isAbove;\r\n      op2 = op2.next!;\r\n    }\r\n\r\n    if (isAbove !== startingAbove) {\r\n      const d = InternalClipper.crossProduct(op2.prev.pt, op2.pt, pt);\r\n      if (d === 0) return PointInPolygonResult.IsOn;\r\n      if ((d < 0) === isAbove) val = 1 - val;\r\n    }\r\n\r\n    if (val === 0) return PointInPolygonResult.IsOutside;\r\n    else return PointInPolygonResult.IsInside;\r\n  }\r\n\r\n  private static path1InsidePath2(op1: OutPt, op2: OutPt): boolean {\r\n    let result: PointInPolygonResult;\r\n    let outside_cnt = 0;\r\n    let op = op1;\r\n    do {\r\n      result = this.pointInOpPolygon(op.pt, op2);\r\n      if (result === PointInPolygonResult.IsOutside) ++outside_cnt;\r\n      else if (result === PointInPolygonResult.IsInside) --outside_cnt;\r\n      op = op.next!;\r\n    } while (op !== op1 && Math.abs(outside_cnt) < 2);\r\n    if (Math.abs(outside_cnt) > 1) return (outside_cnt < 0);\r\n\r\n    const mp = ClipperBase.getBoundsPath(this.getCleanPath(op1)).midPoint();\r\n    const path2 = this.getCleanPath(op2);\r\n    return InternalClipper.pointInPolygon(mp, path2) !== PointInPolygonResult.IsOutside;\r\n  }\r\n\r\n  private moveSplits(fromOr: OutRec, toOr: OutRec): void {\r\n    if (!fromOr.splits) return;\r\n    toOr.splits = toOr.splits || [];\r\n    for (const i of fromOr.splits) {\r\n      toOr.splits.push(i);\r\n    }\r\n    fromOr.splits = undefined;\r\n  }\r\n\r\n  private processHorzJoins(): void {\r\n    for (const j of this._horzJoinList) {\r\n      const or1 = ClipperBase.getRealOutRec(j.op1!.outrec)!;\r\n      let or2 = ClipperBase.getRealOutRec(j.op2!.outrec)!;\r\n\r\n      const op1b = j.op1!.next!;\r\n      const op2b = j.op2!.prev!;\r\n      j.op1!.next = j.op2!;\r\n      j.op2!.prev = j.op1!;\r\n      op1b.prev = op2b;\r\n      op2b.next = op1b;\r\n\r\n      if (or1 === or2) {\r\n        or2 = this.newOutRec();\r\n        or2.pts = op1b;\r\n        ClipperBase.fixOutRecPts(or2);\r\n\r\n        if (or1.pts!.outrec === or2) {\r\n          or1.pts = j.op1;\r\n          or1.pts!.outrec = or1;\r\n        }\r\n\r\n        if (this._using_polytree) {\r\n          if (ClipperBase.path1InsidePath2(or1.pts!, or2.pts)) {\r\n            const tmp = or1.pts;\r\n            or1.pts = or2.pts;\r\n            or2.pts = tmp;\r\n            ClipperBase.fixOutRecPts(or1);\r\n            ClipperBase.fixOutRecPts(or2);\r\n            or2.owner = or1;\r\n          } else if (ClipperBase.path1InsidePath2(or2.pts, or1.pts!)) {\r\n            or2.owner = or1;\r\n          } else {\r\n            or2.owner = or1.owner;\r\n          }\r\n\r\n          or1.splits = or1.splits || [];\r\n          or1.splits.push(or2.idx);\r\n        } else {\r\n          or2.owner = or1;\r\n        }\r\n      } else {\r\n        or2.pts = undefined;\r\n        if (this._using_polytree) {\r\n          ClipperBase.setOwner(or2, or1);\r\n          this.moveSplits(or2, or1);\r\n        } else {\r\n          or2.owner = or1;\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  private static ptsReallyClose(pt1: IPoint64, pt2: IPoint64): boolean {\r\n    return (Math.abs(pt1.x - pt2.x) < 2) && (Math.abs(pt1.y - pt2.y) < 2);\r\n  }\r\n\r\n  private static isVerySmallTriangle(op: OutPt): boolean {\r\n    return op.next!.next === op.prev &&\r\n      (this.ptsReallyClose(op.prev.pt, op.next!.pt) ||\r\n        this.ptsReallyClose(op.pt, op.next!.pt) ||\r\n        this.ptsReallyClose(op.pt, op.prev.pt));\r\n  }\r\n\r\n\r\n  private static isValidClosedPath(op: OutPt | undefined): boolean {\r\n    return op !== undefined && op.next !== op &&\r\n      (op.next !== op.prev || !this.isVerySmallTriangle(op));\r\n  }\r\n\r\n  private static disposeOutPt(op: OutPt): OutPt | undefined {\r\n    const result = op.next === op ? undefined : op.next;\r\n    op.prev.next = op.next;\r\n    op.next!.prev = op.prev;\r\n    return result;\r\n  }\r\n\r\n  private cleanCollinear(outrec: OutRec | undefined): void {\r\n    outrec = ClipperBase.getRealOutRec(outrec);\r\n\r\n    if (outrec === undefined || outrec.isOpen) return;\r\n\r\n    if (!ClipperBase.isValidClosedPath(outrec.pts)) {\r\n      outrec.pts = undefined;\r\n      return;\r\n    }\r\n\r\n    let startOp: OutPt = outrec.pts!;\r\n    let op2: OutPt | undefined = startOp;\r\n    for (; ;) {\r\n      // NB if preserveCollinear == true, then only remove 180 deg. spikes\r\n      if (InternalClipper.crossProduct(op2!.prev.pt, op2!.pt, op2!.next!.pt) === 0 &&\r\n        (op2!.pt === op2!.prev.pt || op2!.pt === op2!.next!.pt || !this.preserveCollinear ||\r\n          InternalClipper.dotProduct(op2!.prev.pt, op2!.pt, op2!.next!.pt) < 0)) {\r\n\r\n        if (op2 === outrec.pts) {\r\n          outrec.pts = op2!.prev;\r\n        }\r\n\r\n        op2 = ClipperBase.disposeOutPt(op2!);\r\n        if (!ClipperBase.isValidClosedPath(op2)) {\r\n          outrec.pts = undefined;\r\n          return;\r\n        }\r\n        startOp = op2!;\r\n        continue;\r\n      }\r\n      op2 = op2!.next;\r\n      if (op2 === startOp) break;\r\n    }\r\n    this.fixSelfIntersects(outrec);\r\n  }\r\n\r\n  private doSplitOp(outrec: OutRec, splitOp: OutPt): void {\r\n    // splitOp.prev <=> splitOp &&\r\n    // splitOp.next <=> splitOp.next.next are intersecting\r\n    const prevOp: OutPt = splitOp.prev;\r\n    const nextNextOp: OutPt = splitOp.next!.next!;\r\n    outrec.pts = prevOp;\r\n\r\n    const ip: IPoint64 = InternalClipper.getIntersectPoint(\r\n      prevOp.pt, splitOp.pt, splitOp.next!.pt, nextNextOp.pt).ip;\r\n\r\n    const area1: number = ClipperBase.area(prevOp);\r\n    const absArea1: number = Math.abs(area1);\r\n\r\n    if (absArea1 < 2) {\r\n      outrec.pts = undefined;\r\n      return;\r\n    }\r\n\r\n    const area2: number = ClipperBase.areaTriangle(ip, splitOp.pt, splitOp.next!.pt);\r\n    const absArea2: number = Math.abs(area2);\r\n\r\n    // de-link splitOp and splitOp.next from the path\r\n    // while inserting the intersection point\r\n    if (ip === prevOp.pt || ip === nextNextOp.pt) {\r\n      nextNextOp.prev = prevOp;\r\n      prevOp.next = nextNextOp;\r\n    } else {\r\n      const newOp2 = new OutPt(ip, outrec);\r\n      newOp2.prev = prevOp;\r\n      newOp2.next = nextNextOp;\r\n      nextNextOp.prev = newOp2;\r\n      prevOp.next = newOp2;\r\n    }\r\n\r\n    // nb: area1 is the path's area *before* splitting, whereas area2 is\r\n    // the area of the triangle containing splitOp & splitOp.next.\r\n    // So the only way for these areas to have the same sign is if\r\n    // the split triangle is larger than the path containing prevOp or\r\n    // if there's more than one self=intersection.\r\n    if (absArea2 > 1 &&\r\n      (absArea2 > absArea1 || (area2 > 0) === (area1 > 0))) {\r\n\r\n      const newOutRec: OutRec = this.newOutRec();\r\n      newOutRec.owner = outrec.owner;\r\n      splitOp.outrec = newOutRec;\r\n      splitOp.next!.outrec = newOutRec;\r\n\r\n      const newOp: OutPt = new OutPt(ip, newOutRec);\r\n      newOp.prev = splitOp.next!;\r\n      newOp.next = splitOp;\r\n      newOutRec.pts = newOp;\r\n      splitOp.prev = newOp;\r\n      splitOp.next!.next = newOp;\r\n\r\n      if (this._using_polytree) {\r\n        if (ClipperBase.path1InsidePath2(prevOp, newOp)) {\r\n          newOutRec.splits = newOutRec.splits || [];\r\n          newOutRec.splits.push(outrec.idx);\r\n        } else {\r\n          outrec.splits = outrec.splits || [];\r\n          outrec.splits.push(newOutRec.idx);\r\n        }\r\n      }\r\n    }\r\n    // else { splitOp = undefined; splitOp.next = undefined; }\r\n  }\r\n\r\n  private fixSelfIntersects(outrec: OutRec): void {\r\n    let op2: OutPt = outrec.pts!;\r\n    for (; ;) {\r\n      if (op2.prev === op2.next!.next) break;\r\n      if (InternalClipper.segsIntersect(op2.prev.pt, op2.pt, op2.next!.pt, op2.next!.next!.pt)) {\r\n        this.doSplitOp(outrec, op2);\r\n        if (!outrec.pts) return;\r\n        op2 = outrec.pts;\r\n        continue;\r\n      } else {\r\n        op2 = op2.next!;\r\n      }\r\n      if (op2 === outrec.pts) break;\r\n    }\r\n  }\r\n\r\n  static buildPath(op: OutPt | undefined, reverse: boolean, isOpen: boolean, path: Path64): boolean {\r\n    if (op === undefined || op.next === op || (!isOpen && op.next === op.prev)) return false;\r\n    path.length = 0\r\n\r\n    let lastPt: IPoint64;\r\n    let op2: OutPt;\r\n    if (reverse) {\r\n      lastPt = op.pt;\r\n      op2 = op.prev;\r\n    } else {\r\n      op = op.next!;\r\n      lastPt = op.pt;\r\n      op2 = op.next!;\r\n    }\r\n    path.push(lastPt);\r\n\r\n    while (op2 !== op) {\r\n      if (op2.pt !== lastPt) {\r\n        lastPt = op2.pt;\r\n        path.push(lastPt);\r\n      }\r\n      if (reverse) {\r\n        op2 = op2.prev;\r\n      } else {\r\n        op2 = op2.next!;\r\n      }\r\n    }\r\n\r\n    if (path.length === 3 && this.isVerySmallTriangle(op2)) return false;\r\n    else return true;\r\n  }\r\n\r\n  protected buildPaths(solutionClosed: Paths64, solutionOpen: Paths64): boolean {\r\n    solutionClosed.length = 0\r\n    solutionOpen.length = 0\r\n\r\n    let i = 0;\r\n    while (i < this._outrecList.length) {\r\n      const outrec = this._outrecList[i++];\r\n      if (!outrec.pts) continue;\r\n\r\n      const path = new Path64();\r\n      if (outrec.isOpen) {\r\n        if (ClipperBase.buildPath(outrec.pts, this.reverseSolution, true, path)) {\r\n          solutionOpen.push(path);\r\n        }\r\n      } else {\r\n        this.cleanCollinear(outrec);\r\n        // closed paths should always return a Positive orientation\r\n        // except when reverseSolution == true\r\n        if (ClipperBase.buildPath(outrec.pts, this.reverseSolution, false, path)) {\r\n          solutionClosed.push(path);\r\n        }\r\n      }\r\n    }\r\n    return true;\r\n  }\r\n\r\n  private static getBoundsPath(path: Path64): Rect64 {\r\n    if (path.length === 0) return new Rect64();\r\n    const result = Clipper.InvalidRect64;\r\n    for (const pt of path) {\r\n      if (pt.x < result.left) result.left = pt.x;\r\n      if (pt.x > result.right) result.right = pt.x;\r\n      if (pt.y < result.top) result.top = pt.y;\r\n      if (pt.y > result.bottom) result.bottom = pt.y;\r\n    }\r\n    return result;\r\n  }\r\n\r\n  private checkBounds(outrec: OutRec): boolean {\r\n    if (outrec.pts === undefined) return false;\r\n    if (!outrec.bounds.isEmpty()) return true;\r\n    this.cleanCollinear(outrec);\r\n    if (outrec.pts === undefined || !ClipperBase.buildPath(outrec.pts, this.reverseSolution, false, outrec.path))\r\n      return false;\r\n    outrec.bounds = ClipperBase.getBoundsPath(outrec.path);\r\n    return true;\r\n  }\r\n\r\n  private checkSplitOwner(outrec: OutRec, splits: number[] | undefined): boolean {\r\n    for (const i of splits!) {\r\n      const split: OutRec | undefined = ClipperBase.getRealOutRec(this._outrecList[i]);\r\n      if (split === undefined || split === outrec || split.recursiveSplit === outrec) continue;\r\n      split.recursiveSplit = outrec; //#599\r\n      if (split!.splits !== undefined && this.checkSplitOwner(outrec, split.splits)) return true;\r\n      if (ClipperBase.isValidOwner(outrec, split) &&\r\n        this.checkBounds(split) &&\r\n        split.bounds.containsRect(outrec.bounds) &&\r\n        ClipperBase.path1InsidePath2(outrec.pts!, split.pts!)) {\r\n        outrec.owner = split; //found in split\r\n        return true;\r\n      }\r\n    }\r\n    return false;\r\n  }\r\n\r\n  private recursiveCheckOwners(outrec: OutRec, polypath: PolyPathBase): void {\r\n    // pre-condition: outrec will have valid bounds\r\n    // post-condition: if a valid path, outrec will have a polypath\r\n\r\n    if (outrec.polypath !== undefined || outrec.bounds.isEmpty()) return;\r\n\r\n    while (outrec.owner !== undefined) {\r\n      if (outrec.owner.splits !== undefined &&\r\n        this.checkSplitOwner(outrec, outrec.owner.splits)) break;\r\n      else if (outrec.owner.pts !== undefined && this.checkBounds(outrec.owner) &&\r\n        ClipperBase.path1InsidePath2(outrec.pts!, outrec.owner.pts!)) break;\r\n      outrec.owner = outrec.owner.owner;\r\n    }\r\n\r\n    if (outrec.owner !== undefined) {\r\n      if (outrec.owner.polypath === undefined)\r\n        this.recursiveCheckOwners(outrec.owner, polypath);\r\n      outrec.polypath = outrec.owner.polypath!.addChild(outrec.path);\r\n    } else {\r\n      outrec.polypath = polypath.addChild(outrec.path);\r\n    }\r\n  }\r\n\r\n  protected buildTree(polytree: PolyPathBase, solutionOpen: Paths64): void {\r\n    polytree.clear();\r\n    solutionOpen.length = 0\r\n\r\n    let i = 0;\r\n    while (i < this._outrecList.length) {\r\n      const outrec: OutRec = this._outrecList[i++];\r\n      if (outrec.pts === undefined) continue;\r\n\r\n      if (outrec.isOpen) {\r\n        const open_path = new Path64();\r\n        if (ClipperBase.buildPath(outrec.pts, this.reverseSolution, true, open_path))\r\n          solutionOpen.push(open_path);\r\n        continue;\r\n      }\r\n      if (this.checkBounds(outrec))\r\n        this.recursiveCheckOwners(outrec, polytree);\r\n    }\r\n  }\r\n\r\n  public getBounds(): Rect64 {\r\n    const bounds = Clipper.InvalidRect64;\r\n    for (const t of this._vertexList) {\r\n      let v = t;\r\n      do {\r\n        if (v.pt.x < bounds.left) bounds.left = v.pt.x;\r\n        if (v.pt.x > bounds.right) bounds.right = v.pt.x;\r\n        if (v.pt.y < bounds.top) bounds.top = v.pt.y;\r\n        if (v.pt.y > bounds.bottom) bounds.bottom = v.pt.y;\r\n        v = v.next!;\r\n      } while (v !== t);\r\n    }\r\n    return bounds.isEmpty() ? new Rect64(0, 0, 0, 0) : bounds;\r\n  }\r\n\r\n}\r\n\r\n\r\nexport class Clipper64 extends ClipperBase {\r\n\r\n  override addPath(path: Path64, polytype: PathType, isOpen: boolean = false): void {\r\n    super.addPath(path, polytype, isOpen);\r\n  }\r\n\r\n  addReusableData(reusableData: ReuseableDataContainer64): void {\r\n    super.addReuseableData(reusableData);\r\n  }\r\n\r\n  override addPaths(paths: Paths64, polytype: PathType, isOpen: boolean = false): void {\r\n    super.addPaths(paths, polytype, isOpen);\r\n  }\r\n\r\n  addSubjectPaths(paths: Paths64): void {\r\n    this.addPaths(paths, PathType.Subject);\r\n  }\r\n\r\n  addOpenSubjectPaths(paths: Paths64): void {\r\n    this.addPaths(paths, PathType.Subject, true);\r\n  }\r\n\r\n  addClipPaths(paths: Paths64): void {\r\n    this.addPaths(paths, PathType.Clip);\r\n  }\r\n\r\n  execute(clipType: ClipType, fillRule: FillRule, solutionClosed: Paths64, solutionOpen = new Paths64()): boolean {\r\n    solutionClosed.length = 0\r\n    solutionOpen.length = 0\r\n    try {\r\n      this.executeInternal(clipType, fillRule);\r\n      this.buildPaths(solutionClosed, solutionOpen);\r\n    } catch (error) {\r\n      this._succeeded = false;\r\n    }\r\n\r\n    this.clearSolutionOnly();\r\n    return this._succeeded;\r\n  }\r\n\r\n\r\n  executePolyTree(clipType: ClipType, fillRule: FillRule, polytree: PolyTree64, openPaths = new Paths64()): boolean {\r\n    polytree.clear();\r\n    openPaths.length = 0\r\n    this._using_polytree = true;\r\n    try {\r\n      this.executeInternal(clipType, fillRule);\r\n      this.buildTree(polytree, openPaths);\r\n    } catch (error) {\r\n      this._succeeded = false;\r\n    }\r\n\r\n    this.clearSolutionOnly();\r\n    return this._succeeded;\r\n  }\r\n\r\n}\r\n\r\nexport abstract class PolyPathBase {\r\n  protected _parent?: PolyPathBase;\r\n  children: Array<PolyPathBase> = [];\r\n  public polygon?: Path64;\r\n\r\n  get isHole(): boolean {\r\n    return this.getIsHole();\r\n  }\r\n\r\n  constructor(parent?: PolyPathBase) {\r\n    this._parent = parent;\r\n  }\r\n\r\n  private getLevel(): number {\r\n    let result = 0;\r\n    let pp: PolyPathBase | undefined = this._parent;\r\n    while (pp !== undefined) {\r\n      ++result;\r\n      pp = pp._parent;\r\n    }\r\n    return result;\r\n  }\r\n\r\n  get level(): number {\r\n    return this.getLevel();\r\n  }\r\n\r\n  private getIsHole(): boolean {\r\n    const lvl = this.getLevel();\r\n    return lvl !== 0 && (lvl & 1) === 0;\r\n  }\r\n\r\n  get count(): number {\r\n    return this.children.length;\r\n  }\r\n\r\n  abstract addChild(p: Path64): PolyPathBase;\r\n\r\n  clear(): void {\r\n    this.children.length = 0\r\n  }\r\n\r\n  forEach = this.children.forEach\r\n\r\n  private toStringInternal(idx: number, level: number): string {\r\n    let result = \"\", padding = \"\", plural = \"s\";\r\n    if (this.children.length === 1) plural = \"\";\r\n    padding = padding.padStart(level * 2);\r\n    if ((level & 1) === 0)\r\n      result += `${padding}+- hole (${idx}) contains ${this.children.length} nested polygon${plural}.\\n`;\r\n    else\r\n      result += `${padding}+- polygon (${idx}) contains ${this.children.length} hole${plural}.\\n`;\r\n\r\n    for (let i = 0; i < this.children.length; i++)\r\n      if (this.children[i].children.length > 0)\r\n        result += this.children[i].toStringInternal(i, level + 1);\r\n    return result;\r\n  }\r\n\r\n  toString(): string {\r\n    if (this.level > 0) return \"\"; //only accept tree root \r\n    let plural = \"s\";\r\n    if (this.children.length === 1) plural = \"\";\r\n    let result = `Polytree with ${this.children.length} polygon${plural}.\\n`;\r\n    for (let i = 0; i < this.children.length; i++)\r\n      if (this.children[i].children.length > 0)\r\n        result += this.children[i].toStringInternal(i, 1);\r\n    return result + '\\n';\r\n  }\r\n\r\n} // end of PolyPathBase class\r\n\r\nexport class PolyPath64 extends PolyPathBase {\r\n\r\n  constructor(parent?: PolyPathBase) {\r\n    super(parent);\r\n  }\r\n\r\n  addChild(p: Path64): PolyPathBase {\r\n    const newChild = new PolyPath64(this);\r\n    (newChild as PolyPath64).polygon = p;\r\n    this.children.push(newChild);\r\n    return newChild;\r\n  }\r\n\r\n  get(index: number): PolyPath64 {\r\n    if (index < 0 || index >= this.children.length) {\r\n      throw new Error(\"InvalidOperationException\");\r\n    }\r\n    return this.children[index] as PolyPath64;\r\n  }\r\n\r\n  child(index: number): PolyPath64 {\r\n    if (index < 0 || index >= this.children.length) {\r\n      throw new Error(\"InvalidOperationException\");\r\n    }\r\n    return this.children[index] as PolyPath64;\r\n  }\r\n\r\n  area(): number {\r\n    let result = this.polygon ? Clipper.area(this.polygon) : 0;\r\n    for (const polyPathBase of this.children) {\r\n      const child = polyPathBase as PolyPath64;\r\n      result += child.area();\r\n    }\r\n    return result;\r\n  }\r\n}\r\n\r\n\r\nexport class PolyTree64 extends PolyPath64 { }\r\n\r\n\r\nexport class ClipperLibException extends Error {\r\n  constructor(description: string) {\r\n    super(description);\r\n  }\r\n}\r\n","/*******************************************************************************\r\n* Author    :  Angus Johnson                                                   *\r\n* Date      :  19 September 2023                                               *\r\n* Website   :  http://www.angusj.com                                           *\r\n* Copyright :  Angus Johnson 2010-2023                                         *\r\n* Purpose   :  Core structures and functions for the Clipper Library           *\r\n* License   :  http://www.boost.org/LICENSE_1_0.txt                            *\r\n*******************************************************************************/\r\n\r\nimport { PointInPolygonResult } from \"./engine\";\r\n\r\n//\r\n// Converted from C# implemention https://github.com/AngusJohnson/Clipper2/blob/main/CSharp/Clipper2Lib/Clipper.Core.cs\r\n// Removed support for USINGZ\r\n//\r\n// Converted by ChatGPT 4 August 3 version https://help.openai.com/en/articles/6825453-chatgpt-release-notes\r\n//\r\n\r\n// Note: all clipping operations except for Difference are commutative.\r\nexport enum ClipType {\r\n  None,\r\n  Intersection,\r\n  Union,\r\n  Difference,\r\n  Xor\r\n}\r\n\r\nexport enum PathType {\r\n  Subject,\r\n  Clip\r\n}\r\n\r\n// By far the most widely used filling rules for polygons are EvenOdd\r\n// and NonZero, sometimes called Alternate and Winding respectively.\r\n// https://en.wikipedia.org/wiki/Nonzero-rule\r\nexport enum FillRule {\r\n  EvenOdd,\r\n  NonZero,\r\n  Positive,\r\n  Negative\r\n}\r\n\r\n// PointInPolygon\r\nexport enum PipResult {\r\n  Inside,\r\n  Outside,\r\n  OnEdge\r\n}\r\n\r\nexport interface IPoint64 {\r\n  x: number;\r\n  y: number;\r\n}\r\n\r\nexport class Path64 extends Array<IPoint64> { }\r\n\r\nexport class Paths64 extends Array<Path64> { }\r\n\r\n\r\n\r\nexport class Rect64 {\r\n  public left: number;\r\n  public top: number;\r\n  public right: number;\r\n  public bottom: number;\r\n\r\n  constructor(lOrIsValidOrRec?: number | boolean | Rect64, t?: number, r?: number, b?: number) {\r\n    if (typeof lOrIsValidOrRec === 'boolean') {\r\n      if (lOrIsValidOrRec) {\r\n        this.left = 0;\r\n        this.top = 0;\r\n        this.right = 0;\r\n        this.bottom = 0;\r\n      } else {\r\n        this.left = Number.MAX_SAFE_INTEGER;\r\n        this.top = Number.MAX_SAFE_INTEGER;\r\n        this.right = Number.MIN_SAFE_INTEGER;\r\n        this.bottom = Number.MIN_SAFE_INTEGER;\r\n      }\r\n    } else if (typeof lOrIsValidOrRec === 'number') {\r\n      this.left = lOrIsValidOrRec;\r\n      this.top = t as number;\r\n      this.right = r as number;\r\n      this.bottom = b as number;\r\n    } else {\r\n      this.left = lOrIsValidOrRec!.left;\r\n      this.top = lOrIsValidOrRec!.top;\r\n      this.right = lOrIsValidOrRec!.right;\r\n      this.bottom = lOrIsValidOrRec!.bottom;\r\n    }\r\n  }\r\n\r\n  public get width(): number {\r\n    return this.right - this.left;\r\n  }\r\n\r\n  public set width(value: number) {\r\n    this.right = this.left + value;\r\n  }\r\n\r\n  public get height(): number {\r\n    return this.bottom - this.top;\r\n  }\r\n\r\n  public set height(value: number) {\r\n    this.bottom = this.top + value;\r\n  }\r\n\r\n  public isEmpty(): boolean {\r\n    return this.bottom <= this.top || this.right <= this.left;\r\n  }\r\n\r\n  public midPoint(): Point64 {\r\n    return new Point64((this.left + this.right) / 2, (this.top + this.bottom) / 2);\r\n  }\r\n\r\n  public contains(pt: IPoint64): boolean {\r\n    return pt.x > this.left && pt.x < this.right && pt.y > this.top && pt.y < this.bottom;\r\n  }\r\n\r\n  public containsRect(rec: Rect64): boolean {\r\n    return rec.left >= this.left && rec.right <= this.right && rec.top >= this.top && rec.bottom <= this.bottom;\r\n  }\r\n\r\n  public intersects(rec: Rect64): boolean {\r\n    return (Math.max(this.left, rec.left) <= Math.min(this.right, rec.right)) &&\r\n      (Math.max(this.top, rec.top) <= Math.min(this.bottom, rec.bottom));\r\n  }\r\n\r\n  public asPath(): Path64 {\r\n    const result = new Path64();\r\n    result.push(new Point64(this.left, this.top));\r\n    result.push(new Point64(this.right, this.top));\r\n    result.push(new Point64(this.right, this.bottom));\r\n    result.push(new Point64(this.left, this.bottom));\r\n    return result;\r\n  }\r\n}\r\n\r\nexport enum MidpointRounding {\r\n  ToEven,\r\n  AwayFromZero\r\n}\r\n\r\nexport function midPointRound(value: number, mode: MidpointRounding = MidpointRounding.ToEven): number {\r\n  const factor = Math.pow(10, 0);\r\n  value *= factor;\r\n\r\n  let rounded: number;\r\n  if (mode === MidpointRounding.AwayFromZero) {\r\n    rounded = (value > 0) ? Math.floor(value + 0.5) : Math.ceil(value - 0.5);\r\n  } else {\r\n    // For MidpointRounding.ToEven, use the default JavaScript rounding\r\n    rounded = Math.round(value);\r\n  }\r\n\r\n  return rounded / factor;\r\n}\r\n\r\n\r\nexport class Point64 implements IPoint64 {\r\n  public x: number;\r\n  public y: number;\r\n\r\n  constructor(xOrPt?: number | Point64, yOrScale?: number) {\r\n    if (typeof xOrPt === 'number' && typeof yOrScale === 'number') {\r\n      this.x = midPointRound(xOrPt,MidpointRounding.AwayFromZero);\r\n      this.y = midPointRound(yOrScale, MidpointRounding.AwayFromZero);\r\n    } else  {\r\n      const pt = xOrPt as Point64\r\n      if (yOrScale !== undefined) {\r\n        this.x = midPointRound(pt.x * yOrScale, MidpointRounding.AwayFromZero);\r\n        this.y = midPointRound(pt.y * yOrScale, MidpointRounding.AwayFromZero);\r\n      } else {\r\n        this.x = pt.x;\r\n        this.y = pt.y;\r\n      }\r\n    }\r\n  }\r\n\r\n  public static equals(lhs: Point64, rhs: Point64): boolean {\r\n    return lhs.x === rhs.x && lhs.y === rhs.y;\r\n  }\r\n\r\n  public static notEquals(lhs: Point64, rhs: Point64): boolean {\r\n    return lhs.x !== rhs.x || lhs.y !== rhs.y;\r\n  }\r\n\r\n  public static add(lhs: Point64, rhs: Point64): Point64 {\r\n    return new Point64(lhs.x + rhs.x, lhs.y + rhs.y);\r\n  }\r\n\r\n  public static subtract(lhs: Point64, rhs: Point64): Point64 {\r\n    return new Point64(lhs.x - rhs.x, lhs.y - rhs.y);\r\n  }\r\n\r\n  public toString(): string {\r\n    return `${this.x},${this.y} `;\r\n  }\r\n\r\n  public equals(obj: Point64): boolean {\r\n    if (obj instanceof Point64) {\r\n      return Point64.equals(this, obj);\r\n    }\r\n    return false;\r\n  }\r\n\r\n  //  public getHashCode(): number {\r\n  //    return this.X ^ this.Y;  // Simple XOR-based hash combination. Adjust if needed.\r\n  //  }\r\n}\r\n\r\nexport class InternalClipper {\r\n  static readonly MaxInt64: number = 9223372036854775807;\r\n  static readonly MaxCoord: number = InternalClipper.MaxInt64 / 4;\r\n  static readonly max_coord: number = InternalClipper.MaxCoord;\r\n  static readonly min_coord: number = -InternalClipper.MaxCoord;\r\n  static readonly Invalid64: number = InternalClipper.MaxInt64;\r\n\r\n  static readonly defaultArcTolerance: number = 0.25;\r\n  static readonly floatingPointTolerance: number = 1E-12;\r\n  static readonly defaultMinimumEdgeLength: number = 0.1;\r\n\r\n  private static readonly precision_range_error: string = \"Error: Precision is out of range.\";\r\n\r\n  static checkPrecision(precision: number): void {\r\n    if (precision < -8 || precision > 8)\r\n      throw new Error(this.precision_range_error);\r\n  }\r\n\r\n  static isAlmostZero(value: number): boolean {\r\n    return (Math.abs(value) <= this.floatingPointTolerance);\r\n  }\r\n\r\n  static crossProduct(pt1: IPoint64, pt2: IPoint64, pt3: IPoint64): number {\r\n    return ((pt2.x - pt1.x) * (pt3.y - pt2.y) - (pt2.y - pt1.y) * (pt3.x - pt2.x));\r\n  }\r\n\r\n  static dotProduct(pt1: IPoint64, pt2: IPoint64, pt3: IPoint64): number {\r\n    return ((pt2.x - pt1.x) * (pt3.x - pt2.x) + (pt2.y - pt1.y) * (pt3.y - pt2.y));\r\n  }\r\n\r\n  static checkCastInt64(val: number): number {\r\n    if ((val >= this.max_coord) || (val <= this.min_coord)) return this.Invalid64;\r\n    return midPointRound(val, MidpointRounding.AwayFromZero);\r\n  }\r\n\r\n\r\n  public static getIntersectPoint(ln1a: IPoint64, ln1b: IPoint64, ln2a: IPoint64, ln2b: IPoint64): { ip: IPoint64, success: boolean } {\r\n    const dy1 = ln1b.y - ln1a.y;\r\n    const dx1 = ln1b.x - ln1a.x;\r\n    const dy2 = ln2b.y - ln2a.y;\r\n    const dx2 = ln2b.x - ln2a.x;\r\n    const det = dy1 * dx2 - dy2 * dx1;\r\n\r\n    let ip: IPoint64;\r\n\r\n    if (det === 0.0) {\r\n      ip = new Point64(0, 0);\r\n      return { ip, success: false };\r\n    }\r\n\r\n    const t = ((ln1a.x - ln2a.x) * dy2 - (ln1a.y - ln2a.y) * dx2) / det;\r\n    if (t <= 0.0) ip = ln1a;\r\n    else if (t >= 1.0) ip = ln1b;\r\n    // NB: truncate the result instead of rounding it, to make the C# version work similarly to the C++ and Delphi versions\r\n    else ip = new Point64(Math.trunc(ln1a.x + t * dx1), Math.trunc(ln1a.y + t * dy1));\r\n    return { ip, success: true };\r\n  }\r\n\r\n\r\n  public static segsIntersect(seg1a: IPoint64, seg1b: IPoint64, seg2a: IPoint64, seg2b: IPoint64, inclusive: boolean = false): boolean {\r\n    if (inclusive) {\r\n      const res1 = InternalClipper.crossProduct(seg1a, seg2a, seg2b);\r\n      const res2 = InternalClipper.crossProduct(seg1b, seg2a, seg2b);\r\n      if (res1 * res2 > 0) return false;\r\n      const res3 = InternalClipper.crossProduct(seg2a, seg1a, seg1b);\r\n      const res4 = InternalClipper.crossProduct(seg2b, seg1a, seg1b);\r\n      if (res3 * res4 > 0) return false;\r\n      return (res1 !== 0 || res2 !== 0 || res3 !== 0 || res4 !== 0);\r\n    } else {\r\n      return (InternalClipper.crossProduct(seg1a, seg2a, seg2b) * InternalClipper.crossProduct(seg1b, seg2a, seg2b) < 0) &&\r\n        (InternalClipper.crossProduct(seg2a, seg1a, seg1b) * InternalClipper.crossProduct(seg2b, seg1a, seg1b) < 0);\r\n    }\r\n  }\r\n\r\n  public static getClosestPtOnSegment(offPt: IPoint64, seg1: IPoint64, seg2: IPoint64): IPoint64 {\r\n    if (seg1.x === seg2.x && seg1.y === seg2.y) return seg1;\r\n    const dx = seg2.x - seg1.x;\r\n    const dy = seg2.y - seg1.y;\r\n    let q = ((offPt.x - seg1.x) * dx + (offPt.y - seg1.y) * dy) / ((dx * dx) + (dy * dy));\r\n    if (q < 0) q = 0; else if (q > 1) q = 1;\r\n    // use MidpointRounding.ToEven in order to explicitly match the nearbyint behaviour on the C++ side\r\n    return new Point64(\r\n      seg1.x + midPointRound(q * dx, MidpointRounding.ToEven),\r\n      seg1.y + midPointRound(q * dy, MidpointRounding.ToEven)\r\n    );\r\n  }\r\n\r\n  public static pointInPolygon(pt: IPoint64, polygon: Path64): PointInPolygonResult {\r\n    const len = polygon.length;\r\n    let start = 0;\r\n\r\n    if (len < 3) return PointInPolygonResult.IsOutside;\r\n\r\n    while (start < len && polygon[start].y === pt.y) start++;\r\n    if (start === len) return PointInPolygonResult.IsOutside;\r\n\r\n    let d: number = 0;\r\n    let isAbove = polygon[start].y < pt.y;\r\n    const startingAbove = isAbove;\r\n    let val = 0;\r\n    let i = start + 1;\r\n    let end = len;\r\n\r\n    for (; ;) {\r\n      if (i === end) {\r\n        if (end === 0 || start === 0) break;\r\n        end = start;\r\n        i = 0;\r\n      }\r\n\r\n      if (isAbove) {\r\n        while (i < end && polygon[i].y < pt.y) i++;\r\n        if (i === end) continue;\r\n      } else {\r\n        while (i < end && polygon[i].y > pt.y) i++;\r\n        if (i === end) continue;\r\n      }\r\n\r\n      const curr = polygon[i];\r\n      const prev = i > 0 ? polygon[i - 1] : polygon[len - 1];\r\n\r\n      if (curr.y === pt.y) {\r\n        if (curr.x === pt.x || (curr.y === prev.y && (pt.x < prev.x !== pt.x < curr.x))) return PointInPolygonResult.IsOn;\r\n        i++;\r\n        if (i === start) break;\r\n        continue;\r\n      }\r\n\r\n      if (pt.x < curr.x && pt.x < prev.x) {\r\n        // we're only interested in edges crossing on the left\r\n      } else if (pt.x > prev.x && pt.x > curr.x) {\r\n        val = 1 - val; // toggle val\r\n      } else {\r\n        d = InternalClipper.crossProduct(prev, curr, pt);\r\n        if (d === 0) return PointInPolygonResult.IsOn;\r\n        if ((d < 0) === isAbove) val = 1 - val;\r\n      }\r\n      isAbove = !isAbove;\r\n      i++;\r\n    }\r\n\r\n    if (isAbove !== startingAbove) {\r\n      if (i === len) i = 0;\r\n      else d = InternalClipper.crossProduct(polygon[i - 1], polygon[i], pt);\r\n      if (d === 0) return PointInPolygonResult.IsOn;\r\n      if ((d < 0) === isAbove) val = 1 - val;\r\n    }\r\n\r\n    if (val === 0) return PointInPolygonResult.IsOutside;\r\n    return PointInPolygonResult.IsInside;\r\n  }\r\n}\r\n","/*\n * Public API Surface of clipper2-js\n */\n\nexport * from './lib/core';\nexport * from './lib/clipper';\nexport * from './lib/engine';\nexport * from './lib/minkowski';\nexport * from './lib/offset';\nexport * from './lib/rectclip';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}